if (!URI_BASE) throw "Missing URI_BASE"; // => Request::getPathUri() if (!global.jQuery) throw "Missing jQuery" var $ = global.jQuery var TableAjax = function() { var priv = {}; //private api var publ = {}; //public api priv.options = {}; var defaults = { namespace: '', url: '', //webservice url urlPost: false, //use POST instead of GET getCsvTheGeomAjaxUrl: '', removeTheGeomAjaxUrl: '', moreFunctionsCellAjaxUrl: '', editInlineSaveUrl: '', theGeomSaveUrl: '', pageSizeSave: '', hiddenColsSaveUrl: '', editInlineUrl: '', addUserTableFilterAjaxUrl: '', rmUserTableFilterAjaxUrl: '', hasAdditionalLayers: 0, labelHtml: '', debug: false, //prints debug info to console filter: false, //show filter row filterInit: false,// init filters data forceFilterInit: false, columnPicker: false, //show columnpicker checkboxes: false, //show body checkboxes actions: '', //holds action links pageSize: 10, //current pagesize pageSizes: [10, 20, 30, 40, 50, 'All'], //available pagesizes hidePagerOnEmpty: false, //removes pager if no rows types: { //type specific options string: {}, number: {}, bool: {}, date: {} }, rowFunctions: false, tblFunctions: false, specialFilterFunctions: false, filtersClean: false, router: false, longDesc: false, exportFields: [], mapEditor: false, // mapEditor visible or not mapEditorContainer: 'window' // 'window' or 'dock' }; var _uiNodeCont; // container holding table var _uiNode$Table; // the table node var _head; // table header var _headSort; // table header sorting row var _headFilter; // table header columns filter row var _headSpecialFilter; // table header special filter row var _bodyNode; // table body var _body; // TODO: table body need render? var _foot; // table footer var _inlineEditBox; // inline edit box with form var _popoverCell; // inline popover cell var _popoverCellCurrent; // inline popover cell var _popoverCellAjaxXhr; var _mapEditor; // map editor node var _mapEditorWrap; // map editor wrapper node var _mapEditorDialog; // map editor jquery ui dialog node var _state = {};// state - to replace variables below (date, ...) var _data; //columns and rows var _totalPages; // total pages var _currDpOp; // clicked datetimepicker operator var _filterFields = {}; // array with filter DOM elements var _filterTimeout; // timer for delayed filtering var _uniqueCols = {}; // array with checked rows /// TODO: mv to _state. var _checkToggleChecked = false; // check-all toggle state var _exportFieldsSelect = {}; var _tableWidth; var _fieldWidgets = {}; /* initialize the plugin. */ priv.init = function() { _uiNodeCont = priv.options.id; _state = {};// init state _state.page = 1; _state.specialFilters = {}; _state.filters = {}; _state.filters.currSortCol = ''; _state.filters.currSortFlip = false; _state.filters.filterCols = {}; { // init events jQuery(_uiNodeCont).on('TableAjax:render', priv.onRender); jQuery(window).on('resize', priv.onWindowResize) } priv.initialRender();// set up _uiNode$... priv.options.types.string = ((priv.options.types || {}).string || {}); priv.options.types.number = ((priv.options.types || {}).number || {}); priv.options.types.bool = ((priv.options.types || {}).bool || {}); priv.options.types.date = ((priv.options.types || {}).date || {}); if (priv.options.mapEditorContainer != 'dock' && priv.options.mapEditorContainer != 'window') { priv.options.mapEditorContainer = 'window'; } if (priv.options.filterInit) { priv.setStateFilters(priv.options.filterInit); } if (priv.options.exportFields) { $.each(priv.options.exportFields, function(ind, col) { _exportFieldsSelect[col] = true; }); } if (location.hash) { priv.options.router() } else { priv.update(priv.options.router) } if (typeof priv.options.router == "function") { $(window).bind('hashchange', function() { priv.options.router.apply(this); }); } }; priv.onRender = function(e) { if (priv.options.debug) console.log('onRender.arguments:', arguments.length, arguments, 'e:', e); // console.log("priv.onRender arguments:", arguments); // console.trace(); if (arguments.length > 1) { for (var i=1; i