Implemented sorting, both click-able and programmatic

ADDED: applySort() and wrappers to allow programmatic sorting
ADDED: sortRowsFlipOrder() as per DynaTable
ADDED: sortrows() as per DynaTable, amended for table structure
ADDED: makeKeysSortable() in table build routine
ADDED: getRowName() helper to build row name from components
ADDED: getDataIndexFromRowName() to get index from row name
ADDED: isKeyNumeric() to check if key-value pair is numeric
ADDED: getDataIndexFromTable() to get the data index for a table from row
ADDED: getIndexByKeyName() to convert key/col name to row index
ADDED: getTableIndexFromIndexCurrentRow() to get table name of current
CHANGED: itemsDelete() now uses relative position to delete tables
CHANGED: itemsDelete() uses the data index from row name to delete data
CHANGED: itemsDelete() now rebuilds tables if data changes
CHANGED: addRow() now takes a row index parameter to use in row.id
CHANGED: getSelectedIndices() returns either relative pos or data index
ADDED: ApplySort button and hookups
FIXED: greyRows() was incorrectly greying out the native header
FIXED: getTableIdFromControlId() had wrong logging prefix