/*jshint eqeqeq:false, eqnull:true, devel:true */ /*global jQuery, jqGridUtils, define */ (function( factory ) { "use strict"; if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define([ "jquery", "./grid.utils", "./grid.base" ], factory ); } else { // Browser globals factory( jQuery ); } }(function( $ ) { "use strict"; //module begin $.jgrid = $.jgrid || {}; $.extend($.jgrid,{ saveState : function ( jqGridId, o ) { o = $.extend({ useStorage : true, storageType : "localStorage", // localStorage or sessionStorage beforeSetItem : null, compression: false, compressionModule : 'LZString', // object by example gzip, LZString compressionMethod : 'compressToUTF16' // string by example zip, compressToUTF16 }, o || {}); if(!jqGridId) { return; } var gridstate = "", data = "", ret, $t = $("#"+jqGridId)[0], tmp; // to use navigator set storeNavOptions to true in grid options if(!$t.grid) { return;} tmp = $($t).data('inlineNav'); if(tmp && $t.p.inlineNav) { $($t).jqGrid('setGridParam',{_iN: tmp}); } tmp = $($t).data('filterToolbar'); if(tmp && $t.p.filterToolbar) { $($t).jqGrid('setGridParam',{_fT: tmp}); } gridstate = $($t).jqGrid('jqGridExport', { exptype : "jsonstring", ident:"", root:"" }); $($t.grid.bDiv).find(".ui-jqgrid-btable tr:gt(0)").each(function(i,d){ data += d.outerHTML; }); if($.isFunction(o.beforeSetItem)) { ret = o.beforeSetItem.call($t, gridstate); if(ret != null) { gridstate = ret; } } if(o.compression) { if(o.compressionModule) { try { ret = window[o.compressionModule][o.compressionMethod](gridstate); if(ret != null) { gridstate = ret; data = window[o.compressionModule][o.compressionMethod](data); } } catch (e) { // can not execute a compression. } } } if(o.useStorage && $.jgrid.isLocalStorage()) { try { window[o.storageType].setItem("jqGrid"+$t.p.id, gridstate); window[o.storageType].setItem("jqGrid"+$t.p.id+"_data", data); } catch (e) { if(e.code === 22) { // chrome is 21 // just for now. we should make some additionla changes and eventually clear some local items alert("Local storage limit is over!"); } } } return gridstate; }, loadState : function (jqGridId, gridstring, o) { o = $.extend({ useStorage : true, storageType : "localStorage", clearAfterLoad: false, // clears the jqGrid localStorage items aftre load beforeSetGrid : null, afterSetGrid : null, decompression: false, decompressionModule : 'LZString', // object by example gzip, LZString decompressionMethod : 'decompressFromUTF16' // string by example unzip, decompressFromUTF16 }, o || {}); if(!jqGridId) { return; } var ret, tmp, $t = $("#"+jqGridId)[0], data, iN, fT; if(o.useStorage) { try { gridstring = window[o.storageType].getItem("jqGrid"+$t.id); data = window[o.storageType].getItem("jqGrid"+$t.id+"_data"); } catch (e) { // can not get data } } if(!gridstring) { return; } if(o.decompression) { if(o.decompressionModule) { try { ret = window[o.decompressionModule][o.decompressionMethod]( gridstring ); if(ret != null ) { gridstring = ret; data = window[o.decompressionModule][o.decompressionMethod]( data ); } } catch (e) { // decompression can not be done } } } ret = jqGridUtils.parse( gridstring ); if( ret && $.type(ret) === 'object') { if($t.grid) { $.jgrid.gridUnload( jqGridId ); } if($.isFunction(o.beforeSetGrid)) { tmp = o.beforeSetGrid( ret ); if(tmp && $.type(tmp) === 'object') { ret = tmp; } } // some preparings var retfunc = function( param ) { var p; p = param; return p;}, prm = { "reccount" : ret.reccount, "records" : ret.records, "lastpage" : ret.lastpage, "shrinkToFit" : retfunc( ret.shrinkToFit), "data": retfunc(ret.data), "datatype" : retfunc(ret.datatype), "grouping" : retfunc(ret.grouping) }; ret.shrinkToFit = false; ret.data = []; ret.datatype = 'local'; ret.grouping = false; //ret.navGrid = false; if(ret.inlineNav) { iN = retfunc( ret._iN ); ret._iN = null; delete ret._iN; } if(ret.filterToolbar) { fT = retfunc( ret._fT ); ret._fT = null; delete ret._fT; } var grid = $("#"+jqGridId).jqGrid( ret ); grid.append( data ); grid.jqGrid( 'setGridParam', prm); if(ret.storeNavOptions && ret.navGrid) { // set to false so that nav grid can be run grid[0].p.navGrid = false; grid.jqGrid('navGrid', ret.pager, ret.navOptions, ret.editOptions, ret.addOptions, ret.delOptions, ret.searchOptions, ret.viewOptions); if(ret.navButtons && ret.navButtons.length) { for(var b = 0; b < ret.navButtons.length; b++) { if( 'sepclass' in ret.navButtons[b][1]) { grid.jqGrid('navSeparatorAdd', ret.navButtons[b][0], ret.navButtons[b][1]); } else { grid.jqGrid('navButtonAdd', ret.navButtons[b][0], ret.navButtons[b][1]); } } } } if(ret.inlineNav && iN) { grid.jqGrid('setGridParam', { inlineNav:false }); grid.jqGrid('inlineNav', ret.pager, iN); } if(ret.filterToolbar && fT) { grid.jqGrid('setGridParam', { filterToolbar:false }); fT.restoreFromFilters = true; grid.jqGrid('filterToolbar', fT); } // finally frozenColums if( ret.frozenColumns ) { grid.jqGrid('setFrozenColumns'); } grid[0].updatepager(true, true); if($.isFunction(o.afterSetGrid)) { o.afterSetGrid( grid ); } if(o.clearAfterLoad) { window[o.storageType].removeItem("jqGrid"+$t.id); window[o.storageType].removeItem("jqGrid"+$t.id + "_data"); } } else { alert("can not convert to object"); } }, isGridInStorage : function ( jqGridId, options ) { var o = { storageType: "localStorage" }; o = $.extend(o , options || {}); var ret, gridstring, data; try { gridstring = window[o.storageType].getItem("jqGrid"+jqGridId); data = window[o.storageType].getItem("jqGrid" + jqGridId + "_data"); ret = gridstring != null && data != null && typeof gridstring === "string" && typeof data === "string" ; } catch (e) { ret = false; } return ret; }, setRegional : function( jqGridId , options) { var o = { storageType: "sessionStorage" }; o = $.extend(o , options || {}); if( !o.regional ) { return; } $.jgrid.saveState( jqGridId, o ); o.beforeSetGrid = function(params) { params.regional = o.regional; params.force_regional = true; return params; }; $.jgrid.loadState( jqGridId, null, o); // check for formatter actions var grid = $("#"+jqGridId)[0], model = $(grid).jqGrid('getGridParam','colModel'), i=-1, nav = $.jgrid.getRegional(grid, 'nav'); $.each(model,function(k){ if(this.formatter && this.formatter === 'actions') { i = k; return false; } }); if(i !== -1 && nav) { $("#"+jqGridId + " tbody tr").each(function(){ var td = this.cells[i]; $(td).find(".ui-inline-edit").attr("title",nav.edittitle); $(td).find(".ui-inline-del").attr("title",nav.deltitle); $(td).find(".ui-inline-save").attr("title",nav.savetitle); $(td).find(".ui-inline-cancel").attr("title",nav.canceltitle); }); } try { window[o.storageType].removeItem("jqGrid"+grid.id); window[o.storageType].removeItem("jqGrid"+grid.id+"_data"); } catch (e) {} }, jqGridImport : function(jqGridId, o) { o = $.extend({ imptype : "xml", // xml, json, xmlstring, jsonstring impstring: "", impurl: "", mtype: "GET", impData : {}, xmlGrid :{ config : "root>grid", data: "root>rows" }, jsonGrid :{ config : "grid", data: "data" }, ajaxOptions :{} }, o || {}); var $t = (jqGridId.indexOf("#") === 0 ? "": "#") + $.jgrid.jqID(jqGridId); var xmlConvert = function (xml,o) { var cnfg = $(o.xmlGrid.config,xml)[0]; var xmldata = $(o.xmlGrid.data,xml)[0], jstr, jstr1, key; if(jqGridUtils.xmlToJSON ) { jstr = jqGridUtils.xmlToJSON( cnfg ); //jstr = $.jgrid.parse(jstr); for(key in jstr) { if(jstr.hasOwnProperty(key)) { jstr1=jstr[key]; } } if(xmldata) { // save the datatype var svdatatype = jstr.grid.datatype; jstr.grid.datatype = 'xmlstring'; jstr.grid.datastr = xml; $($t).jqGrid( jstr1 ).jqGrid("setGridParam",{datatype:svdatatype}); } else { setTimeout(function() { $($t).jqGrid( jstr1 ); },0); } } else { alert("xml2json or parse are not present"); } }; var jsonConvert = function (jsonstr,o){ if (jsonstr && typeof jsonstr === 'string') { var json = jqGridUtils.parse(jsonstr); var gprm = json[o.jsonGrid.config]; var jdata = json[o.jsonGrid.data]; if(jdata) { var svdatatype = gprm.datatype; gprm.datatype = 'jsonstring'; gprm.datastr = jdata; $($t).jqGrid( gprm ).jqGrid("setGridParam",{datatype:svdatatype}); } else { $($t).jqGrid( gprm ); } } }; switch (o.imptype){ case 'xml': $.ajax($.extend({ url:o.impurl, type:o.mtype, data: o.impData, dataType:"xml", complete: function(xml,stat) { if(stat === 'success') { xmlConvert(xml.responseXML,o); $($t).triggerHandler("jqGridImportComplete", [xml, o]); if($.isFunction(o.importComplete)) { o.importComplete(xml); } } xml=null; } }, o.ajaxOptions)); break; case 'xmlstring' : // we need to make just the conversion and use the same code as xml if(o.impstring && typeof o.impstring === 'string') { var xmld = $.parseXML(o.impstring); if(xmld) { xmlConvert(xmld,o); $($t).triggerHandler("jqGridImportComplete", [xmld, o]); if($.isFunction(o.importComplete)) { o.importComplete(xmld); } } } break; case 'json': $.ajax($.extend({ url:o.impurl, type:o.mtype, data: o.impData, dataType:"json", complete: function(json) { try { jsonConvert(json.responseText,o ); $($t).triggerHandler("jqGridImportComplete", [json, o]); if($.isFunction(o.importComplete)) { o.importComplete(json); } } catch (ee){} json=null; } }, o.ajaxOptions )); break; case 'jsonstring' : if(o.impstring && typeof o.impstring === 'string') { jsonConvert(o.impstring,o ); $($t).triggerHandler("jqGridImportComplete", [o.impstring, o]); if($.isFunction(o.importComplete)) { o.importComplete(o.impstring); } } break; } } }); $.jgrid.extend({ jqGridExport : function(o) { o = $.extend({ exptype : "xmlstring", root: "grid", ident: "\t", addOptions : {} }, o || {}); var ret = null; this.each(function () { if(!this.grid) { return;} var key, gprm = $.extend(true, {}, $(this).jqGrid("getGridParam"), o.addOptions); // we need to check for: // 1.multiselect, 2.subgrid 3. treegrid and remove the unneded columns from colNames if(gprm.rownumbers) { gprm.colNames.splice(0,1); gprm.colModel.splice(0,1); } if(gprm.multiselect) { gprm.colNames.splice(0,1); gprm.colModel.splice(0,1); } if(gprm.subGrid) { gprm.colNames.splice(0,1); gprm.colModel.splice(0,1); } gprm.knv = null; if(gprm.treeGrid) { for (key in gprm.treeReader) { if(gprm.treeReader.hasOwnProperty(key)) { gprm.colNames.splice(gprm.colNames.length-1); gprm.colModel.splice(gprm.colModel.length-1); } } } switch (o.exptype) { case 'xmlstring' : ret = "<"+o.root+">"+ jqGridUtils.jsonToXML( gprm, {xmlDecl:""} )+""; break; case 'jsonstring' : ret = jqGridUtils.stringify( gprm ); if(o.root) { ret = "{"+ o.root +":"+ret+"}"; } break; } }); return ret; }, excelExport : function(o) { o = $.extend({ exptype : "remote", url : null, oper: "oper", tag: "excel", beforeExport : null, exporthidden : false, exportgrouping: false, exportOptions : {} }, o || {}); return this.each(function(){ if(!this.grid) { return;} var url; if(o.exptype === "remote") { var pdata = $.extend({},this.p.postData), expg; pdata[o.oper] = o.tag; if($.isFunction(o.beforeExport)) { var result = o.beforeExport.call(this, pdata ); if( $.isPlainObject( result ) ) { pdata = result; } } if(o.exporthidden) { var cm = this.p.colModel, i, len = cm.length, newm=[]; for(i=0; i< len; i++) { if(cm[i].hidden === undefined) { cm[i].hidden = false; } newm.push({name:cm[i].name, hidden:cm[i].hidden}); } var newm1 = JSON.stringify( newm ); if(typeof newm1 === 'string' ) { pdata['colModel'] = newm1; } } if(o.exportgrouping) { expg = JSON.stringify( this.p.groupingView ) if(typeof expg === 'string' ) { pdata['groupingView'] = expg; } } var params = jQuery.param(pdata); if(o.url.indexOf("?") !== -1) { url = o.url+"&"+params; } else { url = o.url+"?"+params; } window.location = url; } }); } }); //module end }));