;(function ($) { /* * jqGrid 3.6.3 - jQuery Grid * Copyright (c) 2008, Tony Tomov, tony@trirand.com * Dual licensed under the MIT and GPL licenses * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * Date: 2010-02-07 */ $.jgrid = $.jgrid || {}; $.extend($.jgrid,{ htmlDecode : function(value){ if(value==' ' || value==' ' || (value.length==1 && value.charCodeAt(0)==160)) { return "";} return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, '"'); }, htmlEncode : function (value){ return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/\"/g, """); }, format : function(format){ //jqgformat var args = $.makeArray(arguments).slice(1); if(format===undefined) format = ""; return format.replace(/\{(\d+)\}/g, function(m, i){ return args[i]; }); }, getCellIndex : function (cell) { cell = $(cell); cell = (!cell.is('td') && !cell.is('th') ? cell.closest("td,th") : cell)[0]; if ($.browser.msie) return $.inArray(cell, cell.parentNode.cells); return cell.cellIndex; }, stripHtml : function(v) { v = v+""; var regexp = /<("[^"]*"|'[^']*'|[^'">])*>/gi; if (v) { v = v.replace(regexp,""); return (v && v !== ' ' && v !== ' ') ? v : ""; } else { return v; } }, stringToDoc : function (xmlString) { var xmlDoc; if(typeof xmlString !== 'string') return xmlString; try { var parser = new DOMParser(); xmlDoc = parser.parseFromString(xmlString,"text/xml"); } catch(e) { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async=false; xmlDoc["loadXM"+"L"](xmlString); } return (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.tagName != 'parsererror') ? xmlDoc : null; }, parse : function(jsonString) { var js = jsonString, msg; if (js.substr(0,9) == "while(1);") { js = js.substr(9); } if (js.substr(0,2) == "/*") { js = js.substr(2,js.length-4); } if(!js) { js = "{}"; } msg = ($.jgrid.useJSON===true && typeof (JSON) === 'object' && typeof (JSON.parse) === 'function') ? JSON.parse(js) : eval('(' + js + ')'); return msg.hasOwnProperty('d') ? msg.d : msg; }, empty : function () { while ( this.firstChild ) this.removeChild( this.firstChild ); }, jqID : function(sid){ sid = sid + ""; return sid.replace(/([\.\:\[\]])/g,"\\$1"); }, ajaxOptions: {}, extend : function(methods) { $.extend($.fn.jqGrid,methods); if (!this.no_legacy_api) { $.fn.extend(methods); } } }); $.fn.jqGrid = function( pin ) { if (typeof pin == 'string') { var fn = $.fn.jqGrid[pin]; if (!fn) { throw ("jqGrid - No such method: " + pin); } var args = $.makeArray(arguments).slice(1); return fn.apply(this,args); } return this.each( function() { if(this.grid) {return;} var p = $.extend(true,{ url: "", height: 150, page: 1, rowNum: 20, records: 0, pager: "", pgbuttons: true, pginput: true, colModel: [], rowList: [], colNames: [], sortorder: "asc", sortname: "", datatype: "xml", mtype: "GET", altRows: false, selarrrow: [], savedRow: [], shrinkToFit: true, xmlReader: {}, jsonReader: {}, subGrid: false, subGridModel :[], reccount: 0, lastpage: 0, lastsort: 0, selrow: null, beforeSelectRow: null, onSelectRow: null, onSortCol: null, ondblClickRow: null, onRightClickRow: null, onPaging: null, onSelectAll: null, loadComplete: null, gridComplete: null, loadError: null, loadBeforeSend: null, afterInsertRow: null, beforeRequest: null, onHeaderClick: null, viewrecords: false, loadonce: false, multiselect: false, multikey: false, editurl: null, search: false, caption: "", hidegrid: true, hiddengrid: false, postData: {}, userData: {}, treeGrid : false, treeGridModel : 'nested', treeReader : {}, treeANode : -1, ExpandColumn: null, tree_root_level : 0, prmNames: {page:"page",rows:"rows", sort: "sidx",order: "sord", search:"_search", nd:"nd", id:"id",oper:"oper",editoper:"edit",addoper:"add",deloper:"del"}, forceFit : false, gridstate : "visible", cellEdit: false, cellsubmit: "remote", nv:0, loadui: "enable", toolbar: [false,""], scroll: false, multiboxonly : false, deselectAfterSort : true, scrollrows : false, autowidth: false, scrollOffset :18, cellLayout: 5, subGridWidth: 20, multiselectWidth: 20, gridview: false, rownumWidth: 25, rownumbers : false, pagerpos: 'center', recordpos: 'right', footerrow : false, userDataOnFooter : false, hoverrows : true, altclass : 'ui-priority-secondary', viewsortcols : [false,'vertical',true], resizeclass : '', autoencode : false, remapColumns : [], ajaxGridOptions :{}, direction : "ltr", toppager: false }, $.jgrid.defaults, pin || {}); var grid={ headers:[], cols:[], footers: [], dragStart: function(i,x,y) { this.resizing = { idx: i, startX: x.clientX, sOL : y[0]}; this.hDiv.style.cursor = "col-resize"; this.curGbox = $("#rs_m"+p.id,"#gbox_"+p.id); this.curGbox.css({display:"block",left:y[0],top:y[1],height:y[2]}); if($.isFunction(p.resizeStart)) p.resizeStart.call(this,x,i); document.onselectstart=new Function ("return false"); }, dragMove: function(x) { if(this.resizing) { var diff = x.clientX-this.resizing.startX, h = this.headers[this.resizing.idx], newWidth = p.direction === "ltr" ? h.width + diff : h.width - diff, hn, nWn; if(newWidth > 33) { this.curGbox.css({left:this.resizing.sOL+diff}); if(p.forceFit===true ){ hn = this.headers[this.resizing.idx+p.nv]; nWn = p.direction === "ltr" ? hn.width - diff : hn.width + diff; if(nWn >33) { h.newWidth = newWidth; hn.newWidth = nWn; } } else { this.newWidth = p.direction === "ltr" ? p.tblwidth+diff : p.tblwidth-diff; h.newWidth = newWidth; } } } }, dragEnd: function() { this.hDiv.style.cursor = "default"; if(this.resizing) { var idx = this.resizing.idx, nw = this.headers[idx].newWidth || this.headers[idx].width; nw = parseInt(nw,10); this.resizing = false; $("#rs_m"+p.id).css("display","none"); p.colModel[idx].width = nw; this.headers[idx].width = nw; this.headers[idx].el.style.width = nw + "px"; if(this.cols.length>0) {this.cols[idx].style.width = nw+"px";} if(this.footers.length>0) {this.footers[idx].style.width = nw+"px";} if(p.forceFit===true){ nw = this.headers[idx+p.nv].newWidth || this.headers[idx+p.nv].width; this.headers[idx+p.nv].width = nw; this.headers[idx+p.nv].el.style.width = nw + "px"; if(this.cols.length>0) this.cols[idx+p.nv].style.width = nw+"px"; if(this.footers.length>0) {this.footers[idx+p.nv].style.width = nw+"px";} p.colModel[idx+p.nv].width = nw; } else { p.tblwidth = this.newWidth || p.tblwidth; $('table:first',this.bDiv).css("width",p.tblwidth+"px"); $('table:first',this.hDiv).css("width",p.tblwidth+"px"); this.hDiv.scrollLeft = this.bDiv.scrollLeft; if(p.footerrow) { $('table:first',this.sDiv).css("width",p.tblwidth+"px"); this.sDiv.scrollLeft = this.bDiv.scrollLeft; } } if($.isFunction(p.resizeStop)) p.resizeStop.call(this,nw,idx); } this.curGbox=null; document.onselectstart=new Function ("return true"); }, populateVisible: function() { if (grid.timer) clearTimeout(grid.timer); grid.timer = null; var dh = $(grid.bDiv).height(); if (!dh) return; var table = $("table:first", grid.bDiv); var rows = $("> tbody > tr:visible:first", table); var rh = rows.outerHeight() || grid.prevRowHeight; if (!rh) return; grid.prevRowHeight = rh; var rn = p.rowNum; var scrollTop = grid.scrollTop = grid.bDiv.scrollTop; var ttop = Math.round(table.position().top) - scrollTop; var tbot = ttop + table.height(); var div = rh * rn; var page, npage, empty; if (ttop <= 0 && tbot < dh && (p.lastpage==null||parseInt((tbot + scrollTop + div - 1) / div,10) < p.lastpage)) { npage = parseInt((dh - tbot + div - 1) / div,10); if (tbot >= 0 || npage < 2 || p.scroll === true) { page = Math.round((tbot + scrollTop) / div) + 1; ttop = -1; } else { ttop = 1; } } if (ttop > 0) { page = parseInt(scrollTop / div,10) + 1; npage = parseInt((scrollTop + dh) / div,10) + 2 - page; empty = true; } if (npage) { if (p.lastpage && page > p.lastpage) { return; } if (grid.hDiv.loading) { grid.timer = setTimeout(grid.populateVisible, 200); } else { p.page = page; if (empty) { grid.selectionPreserver(table[0]); grid.emptyRows(grid.bDiv); } grid.populate(npage); } } }, scrollGrid: function() { if(p.scroll) { var scrollTop = grid.bDiv.scrollTop; if (scrollTop != grid.scrollTop) { grid.scrollTop = scrollTop; if (grid.timer) clearTimeout(grid.timer); grid.timer = setTimeout(grid.populateVisible, 200); } } grid.hDiv.scrollLeft = grid.bDiv.scrollLeft; if(p.footerrow) { grid.sDiv.scrollLeft = grid.bDiv.scrollLeft; } }, selectionPreserver : function(ts) { var p = ts.p; var sr = p.selrow, sra = p.selarrrow ? $.makeArray(p.selarrrow) : null; var left = ts.grid.bDiv.scrollLeft; var complete = p.gridComplete; p.gridComplete = function() { p.selrow = null; p.selarrrow = []; if(p.multiselect && sra && sra.length>0) { for(var i=0;i<sra.length;i++){ if (sra[i] != sr) $(ts).jqGrid("setSelection",sra[i],false); } } if (sr) { $(ts).jqGrid("setSelection",sr,false); } ts.grid.bDiv.scrollLeft = left; if (p.gridComplete = complete) { complete(); } } } }; this.p = p ; var i, dir,ts; if(this.p.colNames.length === 0) { for (i=0;i<this.p.colModel.length;i++){ this.p.colNames[i] = this.p.colModel[i].label || this.p.colModel[i].name; } } if( this.p.colNames.length !== this.p.colModel.length ) { alert($.jgrid.errors.model); return; } var gv = $("<div class='ui-jqgrid-view'></div>"), ii, isMSIE = $.browser.msie ? true:false, isSafari = $.browser.safari ? true : false; ts = this; ts.p.direction = $.trim(ts.p.direction.toLowerCase()); if($.inArray(ts.p.direction,["ltr","rtl"]) == -1) ts.p.direction = "ltr"; dir = ts.p.direction; $(gv).insertBefore(this); $(this).appendTo(gv).removeClass("scroll"); var eg = $("<div class='ui-jqgrid ui-widget ui-widget-content ui-corner-all'></div>"); $(eg).insertBefore(gv).attr({"id" : "gbox_"+this.id,"dir":dir}); $(gv).appendTo(eg).attr("id","gview_"+this.id); if (isMSIE && $.browser.version <= 6) { ii = '<iframe style="display:block;position:absolute;z-index:-1;filter:Alpha(Opacity=\'0\');" src="javascript:false;"></iframe>'; } else { ii="";} $("<div class='ui-widget-overlay jqgrid-overlay' id='lui_"+this.id+"'></div>").append(ii).insertBefore(gv); $("<div class='loading ui-state-default ui-state-active' id='load_"+this.id+"'>"+this.p.loadtext+"</div>").insertBefore(gv); $(this).attr({cellSpacing:"0",cellPadding:"0",border:"0","role":"grid","aria-multiselectable":!!this.p.multiselect,"aria-labelledby":"gbox_"+this.id}); var sortkeys = ["shiftKey","altKey","ctrlKey"], IntNum = function(val,defval) { val = parseInt(val,10); if (isNaN(val)) { return defval ? defval : 0;} else {return val;} }, formatCol = function (pos, rowInd){ var ral = ts.p.colModel[pos].align, result="style=\"", clas = ts.p.colModel[pos].classes; if(ral) result += "text-align:"+ral+";"; if(ts.p.colModel[pos].hidden===true) result += "display:none;"; if(rowInd===0) { result += "width: "+grid.headers[pos].width+"px;" } return result+"\"" + (clas !== undefined ? (" class=\""+clas+"\"") :""); }, addCell = function(rowId,cell,pos,irow, srvr) { var v,prp; v = formatter(rowId,cell,pos,srvr,'add'); prp = formatCol( pos,irow); return "<td role=\"gridcell\" "+prp+" title=\""+$.jgrid.stripHtml(v)+"\">"+v+"</td>"; }, formatter = function (rowId, cellval , colpos, rwdat, _act){ var cm = ts.p.colModel[colpos],v; if(typeof cm.formatter !== 'undefined') { var opts= {rowId: rowId, colModel:cm, gid:ts.p.id }; if($.isFunction( cm.formatter ) ) { v = cm.formatter.call(ts,cellval,opts,rwdat,_act); } else if($.fmatter){ v = $.fn.fmatter(cm.formatter, cellval,opts, rwdat, _act); } else { v = cellVal(cellval); } } else { v = cellVal(cellval); } return v; }, cellVal = function (val) { return val === undefined || val === null || val === "" ? " " : (ts.p.autoencode ? $.jgrid.htmlEncode(val) : val+""); }, addMulti = function(rowid,pos,irow){ var v = "<input type=\"checkbox\""+" id=\"jqg_"+rowid+"\" class=\"cbox\" name=\"jqg_"+rowid+"\"/>", prp = formatCol(pos,irow); return "<td role='gridcell' "+prp+">"+v+"</td>"; }, addRowNum = function (pos,irow,pG,rN) { var v = (parseInt(pG,10)-1)*parseInt(rN,10)+1+irow, prp = formatCol(pos,irow); return "<td role=\"gridcell\" class=\"ui-state-default jqgrid-rownum\" "+prp+">"+v+"</td>"; }, reader = function (datatype) { var field, f=[], j=0, i; for(i =0; i<ts.p.colModel.length; i++){ field = ts.p.colModel[i]; if (field.name !== 'cb' && field.name !=='subgrid' && field.name !=='rn') { f[j] = (datatype=="xml") ? field.xmlmap || field.name : field.jsonmap || field.name; j++; } } return f; }, orderedCols = function (offset) { var order = ts.p.remapColumns; if (!order || !order.length) order = $.map(ts.p.colModel, function(v,i) { return i; }); if (offset) order = $.map(order, function(v) { return v<offset?null:v-offset }); return order; }, emptyRows = function (parent, scroll) { var tBody = $("tbody:first", parent); if(!ts.p.gridview || ts.p.jqgdnd) $("*",tBody).children().unbind(); if(isMSIE) $.jgrid.empty.apply(tBody[0]); else tBody[0].innerHTML=""; if (scroll && ts.p.scroll) { $(">div:first", parent).css({height:"auto"}).children("div:first").css({height:0,display:"none"}); parent.scrollTop = 0; } tBody = null; }, getAccessor = function(obj, expr) { var ret,p,prm; ret = obj[expr]; if(ret===undefined) { if ( typeof expr === 'string' ) { prm = expr.split('.'); } try { if(prm.length) { ret = obj; while (ret && prm.length) { p = prm.shift(); ret = ret[p]; } } } catch (e) {} } return ret; }, addXmlData = function (xml,t, rcnt, more, adjust) { var startReq = new Date(); ts.p.reccount = 0; if($.isXMLDoc(xml)) { if(ts.p.treeANode===-1 && !ts.p.scroll) { emptyRows(t); rcnt=0; } else { rcnt = rcnt > 0 ? rcnt :0; } } else { return; } var i,fpos,ir=0,v,row,gi=0,si=0,ni=0,idn, getId,f=[],F,rd ={}, rl= ts.rows.length, xmlr,rid, rowData=[],ari=0, cn=(ts.p.altRows === true) ? " "+ts.p.altclass:"",cn1; if(!ts.p.xmlReader.repeatitems) {f = reader("xml");} if( ts.p.keyIndex===false) { idn = ts.p.xmlReader.id; } else { idn = ts.p.keyIndex; } if(f.length>0 && !isNaN(idn)) { if (ts.p.remapColumns && ts.p.remapColumns.length) { idn = $.inArray(idn, ts.p.remapColumns); } idn=f[idn]; } if( (idn+"").indexOf("[") === -1 ) { if (f.length) { getId = function( trow, k) {return $(idn,trow).text() || k;}; } else { getId = function( trow, k) {return $(ts.p.xmlReader.cell,trow).eq(idn).text() || k;}; } } else { getId = function( trow, k) {return trow.getAttribute(idn.replace(/[\[\]]/g,"")) || k;}; } $(ts.p.xmlReader.page,xml).each(function() {ts.p.page = this.textContent || this.text || 1; }); $(ts.p.xmlReader.total,xml).each(function() {ts.p.lastpage = this.textContent || this.text; if(ts.p.lastpage===undefined) ts.p.lastpage=1; } ); $(ts.p.xmlReader.records,xml).each(function() {ts.p.records = this.textContent || this.text || 0; } ); $(ts.p.xmlReader.userdata,xml).each(function() {ts.p.userData[this.getAttribute("name")]=this.textContent || this.text;}); var gxml = $(ts.p.xmlReader.root+" "+ts.p.xmlReader.row,xml),gl = gxml.length, j=0; if(gxml && gl){ var rn = parseInt(ts.p.rowNum,10),br=ts.p.scroll?(parseInt(ts.p.page,10)-1)*rn+1:1,altr; if (adjust) rn *= adjust+1; var afterInsRow = $.isFunction(ts.p.afterInsertRow); while (j<gl) { xmlr = gxml[j]; rid = getId(xmlr,br+j); altr = rcnt == 0 ? 0 : rcnt+1; cn1 = (altr+j)%2 == 1 ? cn : ''; rowData[ari++] = "<tr id=\""+rid+"\" role=\"row\" class =\"ui-widget-content jqgrow ui-row-"+ts.p.direction+""+cn1+"\">"; if(ts.p.rownumbers===true) { rowData[ari++] = addRowNum(0,j,ts.p.page,ts.p.rowNum); ni=1; } if(ts.p.multiselect===true) { rowData[ari++] = addMulti(rid,ni,j); gi=1; } if (ts.p.subGrid===true) { rowData[ari++]= $(ts).jqGrid("addSubGridCell",gi+ni,j+rcnt); si= 1; } if(ts.p.xmlReader.repeatitems){ if (!F) F=orderedCols(gi+si+ni); var cells = $(ts.p.xmlReader.cell,xmlr); $.each(F, function (k) { var cell = cells[this]; if (!cell) return false; v = cell.textContent || cell.text; rd[ts.p.colModel[k+gi+si+ni].name] = v; rowData[ari++] = addCell(rid,v,k+gi+si+ni,j+rcnt,xmlr); }); } else { for(i = 0; i < f.length;i++) { v = $(f[i],xmlr).text(); rd[ts.p.colModel[i+gi+si+ni].name] = v; rowData[ari++] = addCell(rid, v, i+gi+si+ni, j+rcnt, xmlr); } } rowData[ari++] = "</tr>"; if(ts.p.gridview === false ) { if( ts.p.treeGrid === true) { fpos = ts.p.treeANode >= -1 ? ts.p.treeANode: 0; row = $(rowData.join(''))[0]; // speed overhead try {$(ts).jqGrid("setTreeNode",rd,row);} catch (e) {} rl === 0 ? $("tbody:first",t).append(row) : $(ts.rows[j+fpos+rcnt]).after(row); } else { $("tbody:first",t).append(rowData.join('')); } if (ts.p.subGrid===true) { try {$(ts).jqGrid("addSubGrid",ts.rows[ts.rows.length-1],gi+ni);} catch (e){} } if(afterInsRow) {ts.p.afterInsertRow.call(ts,rid,rd,xmlr);} rowData=[];ari=0; } rd={}; ir++; j++; if(ir==rn) {break;} } } if(ts.p.gridview === true) { $("tbody:first",t).append(rowData.join('')); } ts.p.totaltime = new Date() - startReq; if(ir>0) {ts.grid.cols = ts.rows[0].cells;if(ts.p.records===0)ts.p.records=gl;} rowData =null; if(!ts.p.treeGrid && !ts.p.scroll) {ts.grid.bDiv.scrollTop = 0;} ts.p.reccount=ir; ts.p.treeANode = -1; if(ts.p.userDataOnFooter) $(ts).jqGrid("footerData","set",ts.p.userData,true); if (!more) updatepager(false,true); }, addJSONData = function(data,t, rcnt, more, adjust) { var startReq = new Date(); ts.p.reccount = 0; if(data) { if(ts.p.treeANode === -1 && !ts.p.scroll) { emptyRows(t); rcnt=0; } else { rcnt = rcnt > 0 ? rcnt :0; } } else { return; } var ir=0,v,i,j,row,f=[],F,cur,gi=0,si=0,ni=0,len,drows,idn,rd={}, fpos,rl = ts.rows.length,idr,rowData=[],ari=0,cn=(ts.p.altRows === true) ? " "+ts.p.altclass:"",cn1,lp; ts.p.page = getAccessor(data,ts.p.jsonReader.page) || 1; lp = getAccessor(data,ts.p.jsonReader.total); ts.p.lastpage= lp === undefined ? 1 : lp; ts.p.records= getAccessor(data,ts.p.jsonReader.records) || 0; ts.p.userData = getAccessor(data,ts.p.jsonReader.userdata) || {}; if(!ts.p.jsonReader.repeatitems) { F = f = reader("json"); } if( ts.p.keyIndex===false ) { idn = ts.p.jsonReader.id; } else { idn = ts.p.keyIndex; } if(f.length>0 && !isNaN(idn)) { if (ts.p.remapColumns && ts.p.remapColumns.length) { idn = $.inArray(idn, ts.p.remapColumns); } idn=f[idn]; } drows = getAccessor(data,ts.p.jsonReader.root); if (drows) { len = drows.length, i=0; var rn = parseInt(ts.p.rowNum,10),br=ts.p.scroll?(parseInt(ts.p.page,10)-1)*rn+1:1, altr; if (adjust) rn *= adjust+1; var afterInsRow = $.isFunction(ts.p.afterInsertRow); while (i<len) { cur = drows[i]; idr = cur[idn]; if(idr === undefined) { idr = br+i; if(f.length===0){ if(ts.p.jsonReader.cell){ var ccur = cur[ts.p.jsonReader.cell]; idr = ccur[idn] || idr; ccur=null; } } } altr = rcnt == 0 ? 0 : rcnt+1; cn1 = (altr+i)%2 == 1 ? cn : ''; rowData[ari++] = "<tr id=\""+ idr +"\" role=\"row\" class= \"ui-widget-content jqgrow ui-row-"+ts.p.direction+""+cn1+"\">"; if(ts.p.rownumbers===true) { rowData[ari++] = addRowNum(0,i,ts.p.page,ts.p.rowNum); ni=1; } if(ts.p.multiselect){ rowData[ari++] = addMulti(idr,ni,i); gi = 1; } if (ts.p.subGrid) { rowData[ari++]= $(ts).jqGrid("addSubGridCell",gi+ni,i+rcnt); si= 1; } if (ts.p.jsonReader.repeatitems) { if(ts.p.jsonReader.cell) {cur = getAccessor(cur,ts.p.jsonReader.cell);} if (!F) F=orderedCols(gi+si+ni); } for (j=0;j<F.length;j++) { v = getAccessor(cur,F[j]); rowData[ari++] = addCell(idr,v,j+gi+si+ni,i+rcnt,cur); rd[ts.p.colModel[j+gi+si+ni].name] = v; } rowData[ari++] = "</tr>"; if(ts.p.gridview === false ) { if( ts.p.treeGrid === true) { fpos = ts.p.treeANode >= -1 ? ts.p.treeANode: 0; row = $(rowData.join(''))[0]; try {$(ts).jqGrid("setTreeNode",rd,row);} catch (e) {} rl === 0 ? $("tbody:first",t).append(row) : $(ts.rows[i+fpos+rcnt]).after(row); } else { $("tbody:first",t).append(rowData.join('')); } if(ts.p.subGrid === true ) { try { $(ts).jqGrid("addSubGrid",ts.rows[ts.rows.length-1],gi+ni);} catch (e){} } if(afterInsRow) {ts.p.afterInsertRow.call(ts,idr,rd,cur);} rowData=[];ari=0; } rd={}; ir++; i++; if(ir==rn) break; } if(ts.p.gridview === true ) { $("tbody:first",t).append(rowData.join('')); } ts.p.totaltime = new Date() - startReq; if(ir>0) {ts.grid.cols = ts.rows[0].cells;if(ts.p.records===0)ts.p.records=len;} } if(!ts.p.treeGrid && !ts.p.scroll) {ts.grid.bDiv.scrollTop = 0;} ts.p.reccount=ir; ts.p.treeANode = -1; if(ts.p.userDataOnFooter) $(ts).jqGrid("footerData","set",ts.p.userData,true); if (!more) updatepager(false,true); }, updatepager = function(rn, dnd) { var cp, last, base,bs, from,to,tot,fmt, pgboxes = ""; base = (parseInt(ts.p.page,10)-1)*parseInt(ts.p.rowNum,10); to = base + ts.p.reccount; if (ts.p.scroll) { var rows = $("tbody:first > tr", ts.grid.bDiv); base = to - rows.length var rh = rows.outerHeight(); if (rh) { var top = base * rh; var height = parseInt(ts.p.records,10) * rh; $(">div:first",ts.grid.bDiv).css({height : height}).children("div:first").css({height:top,display:top?"":"none"}); } } pgboxes = ts.p.pager ? ts.p.pager : ""; pgboxes += ts.p.toppager ? (pgboxes ? "," + ts.p.toppager : ts.p.toppager) : ""; if(pgboxes) { fmt = $.jgrid.formatter.integer || {}; if (ts.p.loadonce) { cp = last = 1; ts.p.lastpage = ts.page =1; $(".selbox",pgboxes).attr("disabled",true); } else { cp = IntNum(ts.p.page,1); last = IntNum(ts.p.lastpage,1); $(".selbox",pgboxes).attr("disabled",false); } if(ts.p.pginput===true) { $('.ui-pg-input',pgboxes).val(ts.p.page); $('#sp_1',pgboxes).html($.fmatter ? $.fmatter.util.NumberFormat(ts.p.lastpage,fmt):ts.p.lastpage); } if (ts.p.viewrecords){ if(ts.p.reccount === 0) $(".ui-paging-info",pgboxes).html(ts.p.emptyrecords); else { from = base+1; tot=ts.p.records; if($.fmatter) { from = $.fmatter.util.NumberFormat(from,fmt); to = $.fmatter.util.NumberFormat(to,fmt); tot = $.fmatter.util.NumberFormat(tot,fmt); } $(".ui-paging-info",pgboxes).html($.jgrid.format(ts.p.recordtext,from,to,tot)); } } if(ts.p.pgbuttons===true) { if(cp<=0) {cp = last = 1;} if(cp==1) { $("#first, #prev",ts.p.pager).addClass('ui-state-disabled').removeClass('ui-state-hover'); if(ts.p.toppager) $("#first_t, #prev_t",ts.p.toppager).addClass('ui-state-disabled').removeClass('ui-state-hover'); } else { $("#first, #prev",ts.p.pager).removeClass('ui-state-disabled'); if(ts.p.toppager) $("#first_t, #prev_t",ts.p.toppager).removeClass('ui-state-disabled'); } if(cp==last) { $("#next, #last",ts.p.pager).addClass('ui-state-disabled').removeClass('ui-state-hover'); if(ts.p.toppager) $("#next_t, #last_t",ts.p.toppager).addClass('ui-state-disabled').removeClass('ui-state-hover'); } else { $("#next, #last",ts.p.pager).removeClass('ui-state-disabled'); if(ts.p.toppager) $("#next_t, #last_t",ts.p.toppager).removeClass('ui-state-disabled'); } } } if(rn===true && ts.p.rownumbers === true) { $("td.jqgrid-rownum",ts.rows).each(function(i){ $(this).html(base+1+i); }); } if(dnd && ts.p.jqgdnd) { $(ts).jqGrid('gridDnD','updateDnD');} if($.isFunction(ts.p.gridComplete)) {ts.p.gridComplete.call(ts);} }, populate = function (npage) { if(!ts.grid.hDiv.loading) { var pvis = ts.p.scroll && npage == false; var prm = {}, dt, dstr, pN=ts.p.prmNames; if(pN.search !== null) prm[pN.search] = ts.p.search; if(pN.nd != null) prm[pN.nd] = new Date().getTime(); if(pN.rows !== null) prm[pN.rows]= ts.p.rowNum; if(pN.page !== null) prm[pN.page]= ts.p.page; if(pN.sort !== null) prm[pN.sort]= ts.p.sortname; if(pN.order !== null) prm[pN.order]= ts.p.sortorder; var lc = ts.p.loadComplete; var lcf = $.isFunction(lc); if (!lcf) lc = null; var adjust = 0; npage = npage || 1; if (npage > 1) { if(pN.npage != null) { prm[pN.npage] = npage; adjust = npage - 1; npage = 1; } else { lc = function(req) { if (lcf) { ts.p.loadComplete.call(ts,req); } ts.grid.hDiv.loading = false; ts.p.page++; populate(npage-1); } } } else if (pN.npage != null) { delete ts.p.postData[pN.npage]; } $.extend(ts.p.postData,prm); var rcnt = !ts.p.scroll ? 0 : ts.rows.length-1; if ($.isFunction(ts.p.datatype)) { ts.p.datatype.call(ts,ts.p.postData,"load_"+ts.p.id); return;} else if($.isFunction(ts.p.beforeRequest)) {ts.p.beforeRequest.call(ts);} dt = ts.p.datatype.toLowerCase(); switch(dt) { case "json": case "jsonp": case "xml": case "script": $.ajax($.extend({ url:ts.p.url, type:ts.p.mtype, dataType: dt , data: $.isFunction(ts.p.serializeGridData)? ts.p.serializeGridData.call(ts,ts.p.postData) : ts.p.postData, complete:function(req,st) { if(st=="success" || (req.statusText == "OK" && req.status == "200")) { if(dt === "xml") addXmlData(req.responseXML,ts.grid.bDiv,rcnt,npage>1,adjust); else addJSONData($.jgrid.parse(req.responseText),ts.grid.bDiv,rcnt,npage>1,adjust); if(lc) lc.call(ts,req); if (pvis) ts.grid.populateVisible(); } req=null; endReq(); }, error:function(xhr,st,err){ if($.isFunction(ts.p.loadError)) ts.p.loadError.call(ts,xhr,st,err); endReq(); xhr=null; }, beforeSend: function(xhr){ beginReq(); if($.isFunction(ts.p.loadBeforeSend)) ts.p.loadBeforeSend.call(ts,xhr); } },$.jgrid.ajaxOptions, ts.p.ajaxGridOptions)); if( ts.p.loadonce || ts.p.treeGrid) {ts.p.datatype = "local";} break; case "xmlstring": beginReq(); dstr = $.jgrid.stringToDoc(ts.p.datastr) if(lcf) {ts.p.loadComplete.call(ts,dstr);} addXmlData(dstr,ts.grid.bDiv); ts.p.datatype = "local"; ts.p.datastr = null; endReq(); break; case "jsonstring": beginReq(); if(typeof ts.p.datastr == 'string') dstr = $.jgrid.parse(ts.p.datastr); else dstr = ts.p.datastr; if(lcf) {ts.p.loadComplete.call(ts,dstr);} addJSONData(dstr,ts.grid.bDiv); ts.p.datatype = "local"; ts.p.datastr = null; endReq(); break; case "local": case "clientside": beginReq(); ts.p.datatype = "local"; if(lcf) {ts.p.loadComplete.call(ts,"");} sortArrayData(); updatepager(true,true); endReq(); break; } } }, beginReq = function() { ts.grid.hDiv.loading = true; if(ts.p.hiddengrid) { return;} switch(ts.p.loadui) { case "disable": break; case "enable": $("#load_"+ts.p.id).show(); break; case "block": $("#lui_"+ts.p.id).show(); $("#load_"+ts.p.id).show(); break; } }, endReq = function() { ts.grid.hDiv.loading = false; switch(ts.p.loadui) { case "disable": break; case "enable": $("#load_"+ts.p.id).hide(); break; case "block": $("#lui_"+ts.p.id).hide(); $("#load_"+ts.p.id).hide(); break; } }, sortArrayData = function() { var stripNum = /[\$,%]/g; var rows=[], col=0, st, sv, findSortKey,newDir = (ts.p.sortorder == "asc") ? 1 :-1; $.each(ts.p.colModel,function(i,v){ if(this.index == ts.p.sortname || this.name == ts.p.sortname){ col = ts.p.lastsort= i; st = this.sorttype; return false; } }); if (st == 'float' || st== 'number' || st== 'currency') { findSortKey = function($cell) { var key = parseFloat($cell.replace(stripNum, '')); return isNaN(key) ? 0 : key; }; } else if (st=='int' || st=='integer') { findSortKey = function($cell) { return IntNum($cell.replace(stripNum, ''),0); }; } else if(st == 'date' || st == 'datetime') { findSortKey = function($cell) { var fd = ts.p.colModel[col].datefmt || "Y-m-d"; return parseDate(fd,$cell).getTime(); }; } else { findSortKey = function($cell) { return $.trim($cell.toUpperCase()); }; } $.each(ts.rows, function(index, row) { try { sv = $.unformat($(row).children('td').eq(col),{rowId:row.id, colModel:ts.p.colModel[col]},col,true);} catch (_) { sv = $(row).children('td').eq(col).text(); } row.sortKey = findSortKey(sv); rows[index] = this; }); if(ts.p.treeGrid) { $(ts).jqGrid("SortTree",newDir); } else { rows.sort(function(a, b) { if (a.sortKey < b.sortKey) {return -newDir;} if (a.sortKey > b.sortKey) {return newDir;} return 0; }); if(rows[0]){ $("td",rows[0]).each( function( k ) { $(this).css("width",grid.headers[k].width+"px"); }); ts.grid.cols = rows[0].cells; } var cn = ""; if(ts.p.altRows) cn = ts.p.altclass; $.each(rows, function(i, row) { if(cn) { if(i%2 ==1) $(row).addClass(cn); else $(row).removeClass(cn); } $('tbody',ts.grid.bDiv).append(row); row.sortKey = null; }); } ts.grid.bDiv.scrollTop = 0; }, parseDate = function(format, date) { var tsp = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0},k,hl,dM; date = date.split(/[\\\/:_;.\t\T\s-]/); format = format.split(/[\\\/:_;.\t\T\s-]/); var dfmt = $.jgrid.formatter.date.monthNames; for(k=0,hl=format.length;k<hl;k++){ if(format[k] == 'M') { dM = $.inArray(date[k],dfmt); if(dM !== -1 && dM < 12){date[k] = dM+1;} } if(format[k] == 'F') { dM = $.inArray(date[k],dfmt); if(dM !== -1 && dM > 11){date[k] = dM+1-12;} } tsp[format[k].toLowerCase()] = parseInt(date[k],10); } tsp.m = parseInt(tsp.m,10)-1; var ty = tsp.y; if (ty >= 70 && ty <= 99) {tsp.y = 1900+tsp.y;} else if (ty >=0 && ty <=69) {tsp.y= 2000+tsp.y;} return new Date(tsp.y, tsp.m, tsp.d, tsp.h, tsp.i, tsp.s,0); }, setPager = function (pgid, tp){ var sep = "<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='ui-separator'></span></td>", pginp = "", pgl="<table cellspacing='0' cellpadding='0' border='0' style='table-layout:auto;' class='ui-pg-table'><tbody><tr>", str="", pgcnt, lft, cent, rgt, twd, tdw, i, clearVals = function(onpaging){ ts.p.selrow = null; if(ts.p.multiselect) {ts.p.selarrrow =[];$('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.hDiv).attr("checked",false);} ts.p.savedRow = []; if ($.isFunction(ts.p.onPaging) ) {if(ts.p.onPaging.call(ts,onpaging)=='stop') return false;} return true; }; //pgid= $(ts.p.pager).attr("id") || 'pager', pgid = pgid.substr(1); pgcnt = "pg_"+pgid; lft = pgid+"_left"; cent = pgid+"_center"; rgt = pgid+"_right"; $("#"+pgid) .append("<div id='"+pgcnt+"' class='ui-pager-control' role='group'><table cellspacing='0' cellpadding='0' border='0' class='ui-pg-table' style='width:100%;table-layout:fixed;' role='row'><tbody><tr><td id='"+lft+"' align='left'></td><td id='"+cent+"' align='center' style='white-space:pre;'></td><td id='"+rgt+"' align='right'></td></tr></tbody></table></div>") .attr("dir","ltr"); //explicit setting if(ts.p.rowList.length >0){ str = "<td dir='"+dir+"'>"; str +="<select class='ui-pg-selbox' role='listbox'>"; for(i=0;i<ts.p.rowList.length;i++){ str +="<option role='option' value='"+ts.p.rowList[i]+"'"+((ts.p.rowNum == ts.p.rowList[i])?' selected':'')+">"+ts.p.rowList[i]+"</option>"; } str +="</select></td>"; } if(dir=="rtl") pgl += str; if(ts.p.pginput===true) pginp= "<td dir='"+dir+"'>"+$.jgrid.format(ts.p.pgtext || "","<input class='ui-pg-input' type='text' size='2' maxlength='7' value='0' role='textbox'/>","<span id='sp_1'></span>")+"</td>"; if(ts.p.pgbuttons===true) { var po=["first"+tp,"prev"+tp, "next"+tp,"last"+tp]; if(dir=="rtl") po.reverse(); pgl += "<td id='"+po[0]+"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-first'></span></td>"; pgl += "<td id='"+po[1]+"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-prev'></span></td>"; pgl += pginp !="" ? sep+pginp+sep:""; pgl += "<td id='"+po[2]+"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-next'></span></td>"; pgl += "<td id='"+po[3]+"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-end'></span></td>"; } else if (pginp !="") { pgl += pginp; } if(dir=="ltr") pgl += str; pgl += "</tr></tbody></table>"; if(ts.p.viewrecords===true) {$("td#"+pgid+"_"+ts.p.recordpos,"#"+pgcnt).append("<div dir='"+dir+"' style='text-align:"+ts.p.recordpos+"' class='ui-paging-info'></div>");} $("td#"+pgid+"_"+ts.p.pagerpos,"#"+pgcnt).append(pgl); tdw = $(".ui-jqgrid").css("font-size") || "11px"; $('body').append("<div id='testpg' class='ui-jqgrid ui-widget ui-widget-content' style='font-size:"+tdw+";visibility:hidden;' ></div>"); twd = $(pgl).clone().appendTo("#testpg").width(); $("#testpg").remove(); if(twd > 0) { if(pginp !="") twd += 50; //should be param $("td#"+pgid+"_"+ts.p.pagerpos,"#"+pgcnt).width(twd); } ts.p._nvtd = []; ts.p._nvtd[0] = twd ? Math.floor((ts.p.width - twd)/2) : Math.floor(ts.p.width/3); ts.p._nvtd[1] = 0; pgl=null; $('.ui-pg-selbox',"#"+pgcnt).bind('change',function() { ts.p.page = Math.round(ts.p.rowNum*(ts.p.page-1)/this.value-0.5)+1; ts.p.rowNum = this.value; if(tp) $('.ui-pg-selbox',ts.p.pager).val(this.value); else if(ts.p.toppager) $('.ui-pg-selbox',ts.p.toppager).val(this.value); if(!clearVals('records')) return false; populate(); return false; }); if(ts.p.pgbuttons===true) { $(".ui-pg-button","#"+pgcnt).hover(function(e){ if($(this).hasClass('ui-state-disabled')) { this.style.cursor='default'; } else { $(this).addClass('ui-state-hover'); this.style.cursor='pointer'; } },function(e) { if($(this).hasClass('ui-state-disabled')) { } else { $(this).removeClass('ui-state-hover'); this.style.cursor= "default"; } }); $("#first"+tp+", #prev"+tp+", #next"+tp+", #last"+tp,"#"+pgid).click( function(e) { var cp = IntNum(ts.p.page,1), last = IntNum(ts.p.lastpage,1), selclick = false, fp=true, pp=true, np=true,lp=true; if(last ===0 || last===1) {fp=false;pp=false;np=false;lp=false; } else if( last>1 && cp >=1) { if( cp === 1) { fp=false; pp=false; } else if( cp>1 && cp <last){ } else if( cp===last){ np=false;lp=false; } } else if( last>1 && cp===0 ) { np=false;lp=false; cp=last-1;} if( this.id === 'first'+tp && fp ) { ts.p.page=1; selclick=true;} if( this.id === 'prev'+tp && pp) { ts.p.page=(cp-1); selclick=true;} if( this.id === 'next'+tp && np) { ts.p.page=(cp+1); selclick=true;} if( this.id === 'last'+tp && lp) { ts.p.page=last; selclick=true;} if(selclick) { if(!clearVals(this.id)) return false; populate(); } return false; }); } if(ts.p.pginput===true) { $('input.ui-pg-input',"#"+pgcnt).keypress( function(e) { var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; if(key == 13) { ts.p.page = ($(this).val()>0) ? $(this).val():ts.p.page; if(!clearVals('user')) return false; populate(); return false; } return this; }); } }, sortData = function (index, idxcol,reload,sor){ if(!ts.p.colModel[idxcol].sortable) return; var imgs, so; if(ts.p.savedRow.length > 0) {return;} if(!reload) { if( ts.p.lastsort == idxcol ) { if( ts.p.sortorder == 'asc') { ts.p.sortorder = 'desc'; } else if(ts.p.sortorder == 'desc') { ts.p.sortorder = 'asc';} } else { ts.p.sortorder = 'asc';} ts.p.page = 1; } if(sor) { if(ts.p.lastsort == idxcol && ts.p.sortorder == sor) return; else ts.p.sortorder = sor; } var thd= $("thead:first",ts.grid.hDiv).get(0); $("tr th:eq("+ts.p.lastsort+") span.ui-grid-ico-sort",thd).addClass('ui-state-disabled'); $("tr th:eq("+ts.p.lastsort+")",thd).attr("aria-selected","false"); $("tr th:eq("+idxcol+") span.ui-icon-"+ts.p.sortorder,thd).removeClass('ui-state-disabled'); $("tr th:eq("+idxcol+")",thd).attr("aria-selected","true"); if(!ts.p.viewsortcols[0]) { if(ts.p.lastsort != idxcol) { $("tr th:eq("+ts.p.lastsort+") span.s-ico",thd).hide(); $("tr th:eq("+idxcol+") span.s-ico",thd).show(); } } ts.p.lastsort = idxcol; index = index.substring(5); ts.p.sortname = ts.p.colModel[idxcol].index || index; so = ts.p.sortorder; if($.isFunction(ts.p.onSortCol)) {if (ts.p.onSortCol.call(ts,index,idxcol,so)=='stop') {return;}} if(ts.p.datatype == "local") { if(ts.p.deselectAfterSort) {$(ts).jqGrid("resetSelection");} } else { ts.p.selrow = null; if(ts.p.multiselect){$("#cb_"+$.jgrid.jqID(ts.p.id),ts.grid.hDiv).attr("checked",false);} ts.p.selarrrow =[]; ts.p.savedRow =[]; if(ts.p.scroll) {emptyRows(ts.grid.bDiv,true);} } if(ts.p.subGrid && ts.p.datatype=='local') { $("td.sgexpanded","#"+ts.p.id).each(function(){ $(this).trigger("click"); }); } populate(); if(ts.p.sortname != index && idxcol) {ts.p.lastsort = idxcol;} }, setColWidth = function () { var initwidth = 0, brd=ts.p.cellLayout, vc=0, lvc, scw=ts.p.scrollOffset,cw,hs=false,aw,tw=0,gw=0, cl = 0, cr; if (isSafari) { brd=0; } $.each(ts.p.colModel, function(i) { if(typeof this.hidden === 'undefined') {this.hidden=false;} if(this.hidden===false){ initwidth += IntNum(this.width,0); if(this.fixed) { tw += this.width; gw += this.width+brd; } else { vc++; } cl++; } }); if(isNaN(ts.p.width)) {ts.p.width = grid.width = initwidth;} else { grid.width = ts.p.width} ts.p.tblwidth = initwidth; if(ts.p.shrinkToFit ===false && ts.p.forceFit === true) {ts.p.forceFit=false;} if(ts.p.shrinkToFit===true && vc > 0) { aw = grid.width-brd*vc-gw; if(isNaN(ts.p.height)) { } else { aw -= scw; hs = true; } initwidth =0; $.each(ts.p.colModel, function(i) { if(this.hidden === false && !this.fixed){ cw = Math.floor(aw/(ts.p.tblwidth-tw)*this.width); this.width =cw; initwidth += cw; lvc = i; } }); cr =0; if (hs) { if(grid.width-gw-(initwidth+brd*vc) !== scw) cr = grid.width-gw-(initwidth+brd*vc)-scw; } else if(!hs && Math.abs(grid.width-gw-(initwidth+brd*vc)) !== 1) { cr = grid.width-gw-(initwidth+brd*vc); } ts.p.colModel[lvc].width += cr; ts.p.tblwidth = initwidth+cr+tw+cl*brd; } }, nextVisible= function(iCol) { var ret = iCol, j=iCol, i; for (i = iCol+1;i<ts.p.colModel.length;i++){ if(ts.p.colModel[i].hidden !== true ) { j=i; break; } } return j-ret; }, getOffset = function (iCol) { var i, ret = {}, brd1 = isSafari ? 0 : ts.p.cellLayout; ret[0] = ret[1] = ret[2] = 0; for(i=0;i<=iCol;i++){ if(ts.p.colModel[i].hidden === false ) { ret[0] += ts.p.colModel[i].width+brd1; } } if(ts.p.direction=="rtl") ret[0] = ts.p.width - ret[0]; ret[0] = ret[0] - ts.grid.bDiv.scrollLeft; if($(ts.grid.cDiv).is(":visible")) {ret[1] += $(ts.grid.cDiv).height() +parseInt($(ts.grid.cDiv).css("padding-top"),10)+parseInt($(ts.grid.cDiv).css("padding-bottom"),10);} if(ts.p.toolbar[0]==true && (ts.p.toolbar[1]=='top' || ts.p.toolbar[1]=='both')) {ret[1] += $(ts.grid.uDiv).height()+parseInt($(ts.grid.uDiv).css("border-top-width"),10)+parseInt($(ts.grid.uDiv).css("border-bottom-width"),10);} if(ts.p.toppager) {ret[1] += $(ts.grid.topDiv).height()+parseInt($(ts.grid.topDiv).css("border-bottom-width"),10);} ret[2] += $(ts.grid.bDiv).height() + $(ts.grid.hDiv).height(); return ret; }; this.p.id = this.id; if ($.inArray(ts.p.multikey,sortkeys) == -1 ) {ts.p.multikey = false;} ts.p.keyIndex=false; for (i=0; i<ts.p.colModel.length;i++) { if (ts.p.colModel[i].key===true) { ts.p.keyIndex = i; break; } } ts.p.sortorder = ts.p.sortorder.toLowerCase(); if(this.p.treeGrid === true) { try { $(this).jqGrid("setTreeGrid");} catch (_) {} } if(this.p.subGrid) { try { $(ts).jqGrid("setSubGrid");} catch (_){} } if(this.p.multiselect) { this.p.colNames.unshift("<input id='cb_"+this.p.id+"' class='cbox' type='checkbox'/>"); this.p.colModel.unshift({name:'cb',width:isSafari ? ts.p.multiselectWidth+ts.p.cellLayout : ts.p.multiselectWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true}); } if(this.p.rownumbers) { this.p.colNames.unshift(""); this.p.colModel.unshift({name:'rn',width:ts.p.rownumWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true}); } ts.p.xmlReader = $.extend(true,{ root: "rows", row: "row", page: "rows>page", total: "rows>total", records : "rows>records", repeatitems: true, cell: "cell", id: "[id]", userdata: "userdata", subgrid: {root:"rows", row: "row", repeatitems: true, cell:"cell"} }, ts.p.xmlReader); ts.p.jsonReader = $.extend(true,{ root: "rows", page: "page", total: "total", records: "records", repeatitems: true, cell: "cell", id: "id", userdata: "userdata", subgrid: {root:"rows", repeatitems: true, cell:"cell"} },ts.p.jsonReader); if(ts.p.scroll){ ts.p.pgbuttons = false; ts.p.pginput=false; ts.p.rowList=[]; } var thead = "<thead><tr class='ui-jqgrid-labels' role='rowheader'>", tdc, idn, w, res, sort, td, ptr, tbody, imgs,iac="",idc=""; if(ts.p.shrinkToFit===true && ts.p.forceFit===true) { for (i=ts.p.colModel.length-1;i>=0;i--){ if(!ts.p.colModel[i].hidden) { ts.p.colModel[i].resizable=false; break; } } } if(ts.p.viewsortcols[1] == 'horizontal') {iac=" ui-i-asc";idc=" ui-i-desc";} tdc = isMSIE ? "class='ui-th-div-ie'" :""; imgs = "<span class='s-ico' style='display:none'><span sort='asc' class='ui-grid-ico-sort ui-icon-asc"+iac+" ui-state-disabled ui-icon ui-icon-triangle-1-n ui-sort-"+dir+"'></span>"; imgs += "<span sort='desc' class='ui-grid-ico-sort ui-icon-desc"+idc+" ui-state-disabled ui-icon ui-icon-triangle-1-s ui-sort-"+dir+"'></span></span>"; for(i=0;i<this.p.colNames.length;i++){ thead += "<th role='columnheader' class='ui-state-default ui-th-column ui-th-"+dir+"'>"; idn = ts.p.colModel[i].index || ts.p.colModel[i].name; thead += "<div id='jqgh_"+ts.p.colModel[i].name+"' "+tdc+">"+ts.p.colNames[i]; if (idn == ts.p.sortname) { ts.p.lastsort = i; } thead += imgs+"</div></th>"; } thead += "</tr></thead>"; $(this).append(thead); $("thead tr:first th",this).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');}); if(this.p.multiselect) { var onSA = true, emp=[], chk; if(typeof ts.p.onSelectAll !== 'function') {onSA=false;} $('#cb_'+$.jgrid.jqID(ts.p.id),this).bind('click',function(){ if (this.checked) { $("[id^=jqg_]",ts.rows).attr("checked",true); $(ts.rows).each(function(i) { if(!$(this).hasClass("subgrid")){ $(this).addClass("ui-state-highlight").attr("aria-selected","true"); ts.p.selarrrow[i]= ts.p.selrow = this.id; } }); chk=true; emp=[]; } else { $("[id^=jqg_]",ts.rows).attr("checked",false); $(ts.rows).each(function(i) { if(!$(this).hasClass("subgrid")){ $(this).removeClass("ui-state-highlight").attr("aria-selected","false"); emp[i] = this.id; } }); ts.p.selarrrow = []; ts.p.selrow = null; chk=false; } if(onSA) {ts.p.onSelectAll.call(ts, chk ? ts.p.selarrrow : emp,chk);} }); } $.each(ts.p.colModel, function(i){if(!this.width) {this.width=150;} this.width = parseInt(this.width,10);}); if(ts.p.autowidth===true) { var pw = $(eg).innerWidth(); ts.p.width = pw > 0? pw: 'nw'; } setColWidth(); $(eg).css("width",grid.width+"px").append("<div class='ui-jqgrid-resize-mark' id='rs_m"+ts.p.id+"'> </div>"); $(gv).css("width",grid.width+"px"); thead = $("thead:first",ts).get(0); var tfoot = "<table role='grid' style='width:"+ts.p.tblwidth+"px' class='ui-jqgrid-ftable' cellspacing='0' cellpadding='0' border='0'><tbody><tr role='row' class='ui-widget-content footrow footrow-"+dir+"'>"; var thr = $("tr:first",thead); ts.p.disableClick=false; $("th",thr).each(function ( j ) { var ht = $('div',this)[0]; w = ts.p.colModel[j].width; if(typeof ts.p.colModel[j].resizable === 'undefined') {ts.p.colModel[j].resizable = true;} if(ts.p.colModel[j].resizable){ res = document.createElement("span"); $(res).html(" ").addClass('ui-jqgrid-resize ui-jqgrid-resize-'+dir); !$.browser.opera ? $(res).css("cursor","col-resize") : ""; $(this).addClass(ts.p.resizeclass); } else { res = ""; } $(this).css("width",w+"px").prepend(res); if( ts.p.colModel[j].hidden ) $(this).css("display","none"); grid.headers[j] = { width: w, el: this }; sort = ts.p.colModel[j].sortable; if( typeof sort !== 'boolean') {ts.p.colModel[j].sortable = true; sort=true;} var nm = ts.p.colModel[j].name; if( !(nm == 'cb' || nm=='subgrid' || nm=='rn') ) { if(ts.p.viewsortcols[2]) $("div",this).addClass('ui-jqgrid-sortable'); } if(sort) { if(ts.p.viewsortcols[0]) {$("div span.s-ico",this).show(); if(j==ts.p.lastsort){ $("div span.ui-icon-"+ts.p.sortorder,this).removeClass("ui-state-disabled");}} else if( j == ts.p.lastsort) {$("div span.s-ico",this).show();$("div span.ui-icon-"+ts.p.sortorder,this).removeClass("ui-state-disabled");} } tfoot += "<td role='gridcell' "+formatCol(j,0)+"> </td>"; }).mousedown(function(e) { if ($(e.target).closest("th>span.ui-jqgrid-resize").length != 1) return; var ci = $.jgrid.getCellIndex(this); if(ts.p.forceFit===true) {ts.p.nv= nextVisible(ci);} grid.dragStart(ci, e, getOffset(ci)); return false; }).click(function(e) { if (ts.p.disableClick) { ts.p.disableClick = false; return false; } var s = "th>div.ui-jqgrid-sortable",r,d; if (!ts.p.viewsortcols[2]) { s = "th>div>span>span.ui-grid-ico-sort" } var t = $(e.target).closest(s); if (t.length != 1) return; var ci = $.jgrid.getCellIndex(this); if (!ts.p.viewsortcols[2]) { r=true,d=t.attr("sort") } sortData($('div',this)[0].id,ci,r,d); return false; }); if (ts.p.sortable && $.fn.sortable) { try { $(ts).jqGrid("sortableColumns", thr); } catch (e){} } tfoot += "</tr></tbody></table>"; tbody = document.createElement("tbody"); this.appendChild(tbody); $(this).addClass('ui-jqgrid-btable'); var hTable = $("<table class='ui-jqgrid-htable' style='width:"+ts.p.tblwidth+"px' role='grid' aria-labelledby='gbox_"+this.id+"' cellspacing='0' cellpadding='0' border='0'></table>").append(thead), hg = (ts.p.caption && ts.p.hiddengrid===true) ? true : false, hb = $("<div class='ui-jqgrid-hbox" + (dir=="rtl" ? "-rtl" : "" )+"'></div>"); grid.hDiv = document.createElement("div"); $(grid.hDiv) .css({ width: grid.width+"px"}) .addClass("ui-state-default ui-jqgrid-hdiv") .append(hb); $(hb).append(hTable); if(hg) $(grid.hDiv).hide(); if(ts.p.pager){ if(typeof ts.p.pager == "string") {if(ts.p.pager.substr(0,1) !="#") ts.p.pager = "#"+ts.p.pager;} else { ts.p.pager = "#"+ $(ts.p.pager).attr("id");} $(ts.p.pager).css({width: grid.width+"px"}).appendTo(eg).addClass('ui-state-default ui-jqgrid-pager ui-corner-bottom'); if(hg) {$(ts.p.pager).hide();} setPager(ts.p.pager,''); } if( ts.p.cellEdit === false && ts.p.hoverrows === true) { $(ts).bind('mouseover',function(e) { ptr = $(e.target).closest("tr.jqgrow"); if($(ptr).attr("class") !== "subgrid") { $(ptr).addClass("ui-state-hover"); } return false; }).bind('mouseout',function(e) { ptr = $(e.target).closest("tr.jqgrow"); $(ptr).removeClass("ui-state-hover"); return false; }); } var ri,ci; $(ts).before(grid.hDiv).click(function(e) { td = e.target; var scb = $(td).hasClass("cbox"); ptr = $(td,ts.rows).closest("tr.jqgrow"); if($(ptr).length === 0 ) { return this; } var cSel = true; if($.isFunction(ts.p.beforeSelectRow)) cSel = ts.p.beforeSelectRow.call(ts,ptr[0].id, e); if (td.tagName == 'A' || ((td.tagName == 'INPUT' || td.tagName == 'TEXTAREA' || td.tagName == 'OPTION' || td.tagName == 'SELECT' ) && !scb) ) { return true; } if(cSel === true) { if(ts.p.cellEdit === true) { if(ts.p.multiselect && scb){ $(ts).jqGrid("setSelection",ptr[0].id,true); } else { ri = ptr[0].rowIndex; ci = $.jgrid.getCellIndex(td); try {$(ts).jqGrid("editCell",ri,ci,true);} catch (_) {} } } else if ( !ts.p.multikey ) { if(ts.p.multiselect && ts.p.multiboxonly) { if(scb){$(ts).jqGrid("setSelection",ptr[0].id,true);} else { $(ts.p.selarrrow).each(function(i,n){ var ind = ts.rows.namedItem(n); $(ind).removeClass("ui-state-highlight"); $("#jqg_"+$.jgrid.jqID(n),ind).attr("checked",false); }); ts.p.selarrrow = []; $("#cb_"+$.jgrid.jqID(ts.p.id),ts.grid.hDiv).attr("checked",false); $(ts).jqGrid("setSelection",ptr[0].id,true); } } else { $(ts).jqGrid("setSelection",ptr[0].id,true); } } else { if(e[ts.p.multikey]) { $(ts).jqGrid("setSelection",ptr[0].id,true); } else if(ts.p.multiselect && scb) { scb = $("[id^=jqg_]",ptr).attr("checked"); $("[id^=jqg_]",ptr).attr("checked",!scb); } } if($.isFunction(ts.p.onCellSelect)) { ri = ptr[0].id; ci = $.jgrid.getCellIndex(td); ts.p.onCellSelect.call(ts,ri,ci,$(td).html(),e); } } e.stopPropagation(); }).bind('reloadGrid', function(e,opts) { if(ts.p.treeGrid ===true) { ts.p.datatype = ts.p.treedatatype;} if (opts && opts.current) { ts.grid.selectionPreserver(ts); } if(ts.p.datatype=="local"){ $(ts).jqGrid("resetSelection");} else if(!ts.p.treeGrid) { ts.p.selrow=null; if(ts.p.multiselect) {ts.p.selarrrow =[];$('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.hDiv).attr("checked",false);} ts.p.savedRow = []; if(ts.p.scroll) {emptyRows(ts.grid.bDiv);} } if (opts && opts.page) { var page = opts.page; if (page > ts.p.lastpage) page = ts.p.lastpage; if (page < 1) page = 1; ts.p.page = page; if (ts.grid.prevRowHeight) { ts.grid.bDiv.scrollTop = (page - 1) * ts.grid.prevRowHeight * ts.p.rowNum; } else { ts.grid.bDiv.scrollTop = 0; } } if (ts.grid.prevRowHeight && ts.p.scroll) { delete ts.p.lastpage; ts.grid.populateVisible(); } else ts.grid.populate(); return false; }); if( $.isFunction(this.p.ondblClickRow) ) { $(this).dblclick(function(e) { td = e.target; ptr = $(td,ts.rows).closest("tr.jqgrow"); if($(ptr).length === 0 ){return false;} ri = ptr[0].rowIndex; ci = $.jgrid.getCellIndex(td); ts.p.ondblClickRow.call(ts,$(ptr).attr("id"),ri,ci, e); return false; }); } if ($.isFunction(this.p.onRightClickRow)) { $(this).bind('contextmenu', function(e) { td = e.target; ptr = $(td,ts.rows).closest("tr.jqgrow"); if($(ptr).length === 0 ){return false;} if(!ts.p.multiselect) { $(ts).jqGrid("setSelection",ptr[0].id,true); } ri = ptr[0].rowIndex; ci = $.jgrid.getCellIndex(td); ts.p.onRightClickRow.call(ts,$(ptr).attr("id"),ri,ci, e); return false; }); } grid.bDiv = document.createElement("div"); $(grid.bDiv) .append($('<div style="position:relative;'+(isMSIE && $.browser.version < 8 ? "height:0.01%;" : "")+'"></div>').append('<div></div>').append(this)) .addClass("ui-jqgrid-bdiv") .css({ height: ts.p.height+(isNaN(ts.p.height)?"":"px"), width: (grid.width)+"px"}) .scroll(grid.scrollGrid); $("table:first",grid.bDiv).css({width:ts.p.tblwidth+"px"}); if( isMSIE ) { if( $("tbody",this).size() == 2 ) { $("tbody:first",this).remove();} if( ts.p.multikey) {$(grid.bDiv).bind("selectstart",function(){return false;});} } else { if( ts.p.multikey) {$(grid.bDiv).bind("mousedown",function(){return false;});} } if(hg) {$(grid.bDiv).hide();} grid.cDiv = document.createElement("div"); var arf = ts.p.hidegrid===true ? $("<a role='link' href='javascript:void(0)'/>").addClass('ui-jqgrid-titlebar-close HeaderButton').hover( function(){ arf.addClass('ui-state-hover');}, function() {arf.removeClass('ui-state-hover');}) .append("<span class='ui-icon ui-icon-circle-triangle-n'></span>").css((dir=="rtl"?"left":"right"),"0px") : ""; $(grid.cDiv).append(arf).append("<span class='ui-jqgrid-title"+(dir=="rtl" ? "-rtl" :"" )+"'>"+ts.p.caption+"</span>") .addClass("ui-jqgrid-titlebar ui-widget-header ui-corner-top ui-helper-clearfix"); $(grid.cDiv).insertBefore(grid.hDiv); if( ts.p.toolbar[0] ) { grid.uDiv = document.createElement("div"); if(ts.p.toolbar[1] == "top") {$(grid.uDiv).insertBefore(grid.hDiv);} else if (ts.p.toolbar[1]=="bottom" ) {$(grid.uDiv).insertAfter(grid.hDiv);} if(ts.p.toolbar[1]=="both") { grid.ubDiv = document.createElement("div"); $(grid.uDiv).insertBefore(grid.hDiv).addClass("ui-userdata ui-state-default").attr("id","t_"+this.id); $(grid.ubDiv).insertAfter(grid.hDiv).addClass("ui-userdata ui-state-default").attr("id","tb_"+this.id); if(hg) {$(grid.ubDiv).hide();} } else { $(grid.uDiv).width(grid.width).addClass("ui-userdata ui-state-default").attr("id","t_"+this.id); } if(hg) {$(grid.uDiv).hide();} } if(ts.p.toppager) { ts.p.toppager = ts.p.id+"_toppager"; grid.topDiv = $("<div id='"+ts.p.toppager+"'></div>")[0]; ts.p.toppager = "#"+ts.p.toppager; $(grid.topDiv).insertBefore(grid.hDiv).addClass('ui-state-default ui-jqgrid-toppager').width(grid.width); setPager(ts.p.toppager,'_t'); } if(ts.p.footerrow) { grid.sDiv = $("<div class='ui-jqgrid-sdiv'></div>")[0]; hb = $("<div class='ui-jqgrid-hbox"+(dir=="rtl"?"-rtl":"")+"'></div>"); $(grid.sDiv).append(hb).insertAfter(grid.hDiv).width(grid.width); $(hb).append(tfoot); grid.footers = $(".ui-jqgrid-ftable",grid.sDiv)[0].rows[0].cells; if(ts.p.rownumbers) grid.footers[0].className = 'ui-state-default jqgrid-rownum'; if(hg) {$(grid.sDiv).hide();} } if(ts.p.caption) { var tdt = ts.p.datatype; if(ts.p.hidegrid===true) { $(".ui-jqgrid-titlebar-close",grid.cDiv).click( function(e){ var onHdCl = $.isFunction(ts.p.onHeaderClick); if(ts.p.gridstate == 'visible') { $(".ui-jqgrid-bdiv, .ui-jqgrid-hdiv","#gview_"+ts.p.id).slideUp("fast"); if(ts.p.pager) {$(ts.p.pager).slideUp("fast");} if(ts.p.toppager) {$(ts.p.toppager).slideUp("fast");} if(ts.p.toolbar[0]===true) { if( ts.p.toolbar[1]=='both') { $(grid.ubDiv).slideUp("fast"); } $(grid.uDiv).slideUp("fast"); } if(ts.p.footerrow) $(".ui-jqgrid-sdiv","#gbox_"+ts.p.id).slideUp("fast"); $("span",this).removeClass("ui-icon-circle-triangle-n").addClass("ui-icon-circle-triangle-s"); ts.p.gridstate = 'hidden'; if(onHdCl) {if(!hg) {ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}} } else if(ts.p.gridstate == 'hidden'){ $(".ui-jqgrid-hdiv, .ui-jqgrid-bdiv","#gview_"+ts.p.id).slideDown("fast"); if(ts.p.pager) {$(ts.p.pager).slideDown("fast");} if(ts.p.toppager) {$(ts.p.toppager).slideDown("fast");} if(ts.p.toolbar[0]===true) { if( ts.p.toolbar[1]=='both') { $(grid.ubDiv).slideDown("fast"); } $(grid.uDiv).slideDown("fast"); } if(ts.p.footerrow) $(".ui-jqgrid-sdiv","#gbox_"+ts.p.id).slideDown("fast"); $("span",this).removeClass("ui-icon-circle-triangle-s").addClass("ui-icon-circle-triangle-n"); if(hg) {ts.p.datatype = tdt;populate();hg=false;} ts.p.gridstate = 'visible'; if(onHdCl) {ts.p.onHeaderClick.call(ts,ts.p.gridstate,e)} } return false; }); if(hg) {ts.p.datatype="local"; $(".ui-jqgrid-titlebar-close",grid.cDiv).trigger("click");} } } else {$(grid.cDiv).hide();} $(grid.hDiv).after(grid.bDiv) .mousemove(function (e) { if(grid.resizing){grid.dragMove(e);return false;} }); $(".ui-jqgrid-labels",grid.hDiv).bind("selectstart", function () { return false; }); $(document).mouseup(function (e) { if(grid.resizing) { grid.dragEnd(); return false;} return true; }); this.updateColumns = function () { var r = this.rows[0], self =this; if(r) { $("td",r).each( function( k ) { $(this).css("width",self.grid.headers[k].width+"px"); }); this.grid.cols = r.cells; } return this; } ts.formatCol = formatCol; ts.sortData = sortData; ts.updatepager = updatepager; ts.formatter = function ( rowId, cellval , colpos, rwdat, act){return formatter(rowId, cellval , colpos, rwdat, act);}; $.extend(grid,{populate : populate, emptyRows: emptyRows}); this.grid = grid; ts.addXmlData = function(d) {addXmlData(d,ts.grid.bDiv);}; ts.addJSONData = function(d) {addJSONData(d,ts.grid.bDiv);}; populate();ts.p.hiddengrid=false; $(window).unload(function () { $(this).empty(); this.grid = null; this.p = null; }); }); }; $.jgrid.extend({ getGridParam : function(pName) { var $t = this[0]; if (!$t.grid) {return;} if (!pName) { return $t.p; } else {return typeof($t.p[pName]) != "undefined" ? $t.p[pName] : null;} }, setGridParam : function (newParams){ return this.each(function(){ if (this.grid && typeof(newParams) === 'object') {$.extend(true,this.p,newParams);} }); }, getDataIDs : function () { var ids=[], i=0, len; this.each(function(){ len = this.rows.length; if(len && len>0){ while(i<len) { ids[i] = this.rows[i].id; i++; } } }); return ids; }, setSelection : function(selection,onsr) { return this.each(function(){ var $t = this, stat,pt, olr, ner, ia, tpsr; if(selection === undefined) return; onsr = onsr === false ? false : true; pt=$t.rows.namedItem(selection+""); if(pt===null) return; if($t.p.selrow && $t.p.scrollrows===true) { olr = $t.rows.namedItem($t.p.selrow).rowIndex; ner = $t.rows.namedItem(selection).rowIndex; if(ner >=0 ){ if(ner > olr ) { scrGrid(ner,'d'); } else { scrGrid(ner,'u'); } } } if(!$t.p.multiselect) { if(pt.className !== "ui-subgrid") { if( $t.p.selrow ) {$("tr#"+$.jgrid.jqID($t.p.selrow),$t.grid.bDiv).removeClass("ui-state-highlight").attr("aria-selected","false") ;} $t.p.selrow = pt.id; $(pt).addClass("ui-state-highlight").attr("aria-selected","true"); if( $t.p.onSelectRow && onsr) { $t.p.onSelectRow.call($t,$t.p.selrow, true); } } } else { $t.p.selrow = pt.id; ia = $.inArray($t.p.selrow,$t.p.selarrrow); if ( ia === -1 ){ if(pt.className !== "ui-subgrid") { $(pt).addClass("ui-state-highlight").attr("aria-selected","true");} stat = true; $("#jqg_"+$.jgrid.jqID($t.p.selrow),$t.rows[pt.rowIndex]).attr("checked",stat); $t.p.selarrrow.push($t.p.selrow); if( $t.p.onSelectRow && onsr) { $t.p.onSelectRow.call($t,$t.p.selrow, stat); } } else { if(pt.className !== "ui-subgrid") { $(pt).removeClass("ui-state-highlight").attr("aria-selected","false");} stat = false; $("#jqg_"+$.jgrid.jqID($t.p.selrow),$t.rows[pt.rowIndex]).attr("checked",stat); $t.p.selarrrow.splice(ia,1); if( $t.p.onSelectRow && onsr) { $t.p.onSelectRow.call($t,$t.p.selrow, stat); } tpsr = $t.p.selarrrow[0]; $t.p.selrow = (tpsr === undefined) ? null : tpsr; } } function scrGrid(iR,tp){ var ch = $($t.grid.bDiv)[0].clientHeight, st = $($t.grid.bDiv)[0].scrollTop, nROT = $t.rows[iR].offsetTop+$t.rows[iR].clientHeight, pROT = $t.rows[iR].offsetTop; if(tp == 'd') { if(nROT >= ch) { $($t.grid.bDiv)[0].scrollTop = st + nROT-pROT; } } if(tp == 'u'){ if (pROT < st) { $($t.grid.bDiv)[0].scrollTop = st - nROT+pROT; } } } }); }, resetSelection : function(){ return this.each(function(){ var t = this, ind; if(!t.p.multiselect) { if(t.p.selrow) { $("tr#"+$.jgrid.jqID(t.p.selrow),t.grid.bDiv).removeClass("ui-state-highlight").attr("aria-selected","false"); t.p.selrow = null; } } else { $(t.p.selarrrow).each(function(i,n){ ind = t.rows.namedItem(n); $(ind).removeClass("ui-state-highlight").attr("aria-selected","false"); $("#jqg_"+$.jgrid.jqID(n),ind).attr("checked",false); }); $("#cb_"+$.jgrid.jqID(t.p.id),t.grid.hDiv).attr("checked",false); t.p.selarrrow = []; } t.p.savedRow = []; }); }, getRowData : function( rowid ) { var res = {}, resall, getall=false, len, j=0; this.each(function(){ var $t = this,nm,ind; if(typeof(rowid) == 'undefined') { getall = true; resall = []; len = $t.rows.length; } else { ind = $t.rows.namedItem(rowid); if(!ind) return res; len = 1; } while(j<len){ if(getall) ind = $t.rows[j]; $('td',ind).each( function(i) { nm = $t.p.colModel[i].name; if ( nm !== 'cb' && nm !== 'subgrid') { if($t.p.treeGrid===true && nm == $t.p.ExpandColumn) { res[nm] = $.jgrid.htmlDecode($("span:first",this).html()); } else { try { res[nm] = $.unformat(this,{rowId:ind.id, colModel:$t.p.colModel[i]},i); } catch (e){ res[nm] = $.jgrid.htmlDecode($(this).html()); } } } }); j++; if(getall) { resall.push(res); res={}; } } }); return resall ? resall: res; }, delRowData : function(rowid) { var success = false, rowInd, ia, ri; this.each(function() { var $t = this; rowInd = $t.rows.namedItem(rowid); if(!rowInd) {return false;} else { ri = rowInd.rowIndex; $(rowInd).remove(); $t.p.records--; $t.p.reccount--; $t.updatepager(true,false); success=true; if($t.p.multiselect) { ia = $.inArray(rowid,$t.p.selarrrow); if(ia != -1) { $t.p.selarrrow.splice(ia,1);} } if(rowid == $t.p.selrow) {$t.p.selrow=null;} } if( ri == 0 && success ) { $t.updateColumns(); } if( $t.p.altRows === true && success ) { var cn = $t.p.altclass; $($t.rows).each(function(i){ if(i % 2 ==1) $(this).addClass(cn); else $(this).removeClass(cn); }); } }); return success; }, setRowData : function(rowid, data, cssp) { var nm, success=false; this.each(function(){ var t = this, vl, ind, cp = typeof cssp;; if(!t.grid) {return false;} ind = t.rows.namedItem(rowid); if(!ind) return false; if( data ) { $(this.p.colModel).each(function(i){ nm = this.name; if( data[nm] != undefined) { vl = t.formatter( rowid, data[nm], i, data, 'edit'); if(t.p.treeGrid===true && nm == t.p.ExpandColumn) { $("td:eq("+i+") > span:first",ind).html(vl).attr("title",$.jgrid.stripHtml(vl)); } else { $("td:eq("+i+")",ind).html(vl).attr("title",$.jgrid.stripHtml(vl)); } success = true; } }); } if(cp === 'string') {$(ind).addClass(cssp);} else if(cp === 'object') {$(ind).css(cssp);} }); return success; }, addRowData : function(rowid,rdata,pos,src) { if(!pos) {pos = "last";} var success = false, nm, row, gi, si, ni,sind, i, v, prp="", aradd, cnm, cn; if(rdata) { if($.isArray(rdata)) { aradd=true; pos = "last"; cnm = rowid; } else { rdata = [rdata]; aradd = false; } this.each(function() { var t = this, rowslen = t.rows.length || 0, datalen = rdata.length; ni = t.p.rownumbers===true ? 1 :0; gi = t.p.multiselect ===true ? 1 :0; si = t.p.subGrid===true ? 1 :0; if(!aradd) { if(typeof(rowid) != 'undefined') rowid = rowid+""; else { rowid = (t.p.records+1)+""; if(t.p.keyIndex !== false) { cmn = t.p.colModel[t.p.keyIndex+gi+si+ni].name; if(typeof rdata[0][cmn] != "undefined") rowid = rdata[0][cmn]; } } } cn = t.p.altclass; var k = 0; var air = $.isFunction(t.p.afterInsertRow) ? true : false; while(k < datalen) { data = rdata[k]; row=""; if(aradd) { try {rowid = data[cnm];} catch (e) {rowid = t.p.records+1;} var cna = t.p.altRows === true ? (t.rows.length-1)%2 == 0 ? cn : "" : ""; } if(ni){ prp = t.formatCol(ni,1); row += "<td role=\"gridcell\" class=\"ui-state-default jqgrid-rownum\" "+prp+">0</td>"; } if(gi) { v = "<input type=\"checkbox\""+" id=\"jqg_"+rowid+"\" class=\"cbox\"/>"; prp = t.formatCol(ni,1); row += "<td role=\"gridcell\" "+prp+">"+v+"</td>"; } if(si) { row += $(t).jqGrid("addSubGridCell",gi+ni,1); } for(i = gi+si+ni; i < this.p.colModel.length;i++){ nm = this.p.colModel[i].name; v = t.formatter( rowid, data[nm], i, data, 'add'); prp = t.formatCol(i,1); row += "<td role=\"gridcell\" "+prp+" title=\""+$.jgrid.stripHtml(v)+"\">"+v+"</td>"; } row = "<tr id=\""+rowid+"\" role=\"row\" class=\"ui-widget-content jqgrow ui-row-"+t.p.direction+" "+cna+"\">" + row+"</tr>"; if(t.p.subGrid===true) { row = $(row)[0]; $(t).jqGrid("addSubGrid",row,gi+ni); } if(t.rows.length === 0){ $("table:first",t.grid.bDiv).append(row); } else { switch (pos) { case 'last': $(t.rows[t.rows.length-1]).after(row); break; case 'first': $(t.rows[0]).before(row); break; case 'after': sind = t.rows.namedItem(src); if (sind) {$(t.rows[sind.rowIndex+1]).hasClass("ui-subgrid") ? $(t.rows[sind.rowIndex+1]).after(row) : $(sind).after(row);} break; case 'before': sind = t.rows.namedItem(src); if(sind) {$(sind).before(row);sind=sind.rowIndex;} break; } } t.p.records++; t.p.reccount++; if(!t.grid.cols || !t.grid.cols.length) t.grid.cols = t.rows[0].cells; if(pos==='first' || (pos==='before' && sind <= 1) || t.rows.length === 1 ){ t.updateColumns(); } if(air) t.p.afterInsertRow(t,rowid,data); k++; } if( t.p.altRows === true && !aradd) { if (pos == "last") { if ((t.rows.length-1)%2 == 1) {$(t.rows[t.rows.length-1]).addClass(cn);} } else { $(t.rows).each(function(i){ if(i % 2 ==1) $(this).addClass(cn); else $(this).removeClass(cn); }); } } t.updatepager(true,true); success = true; }); } return success; }, footerData : function(action,data, format) { var nm, success=false, res={}; function isEmpty(obj) { for(var i in obj) { return false; } return true; } if(typeof(action) == "undefined") action = "get"; if(typeof(format) != "boolean") format = true; action = action.toLowerCase(); this.each(function(){ var t = this, vl, ind; if(!t.grid || !t.p.footerrow) {return false;} if(action == "set") { if(isEmpty(data)) return false; } success=true; $(this.p.colModel).each(function(i){ nm = this.name; if(action == "set") { if( data[nm] != undefined) { vl = format ? t.formatter( "", data[nm], i, data, 'edit') : data[nm]; $("tr.footrow td:eq("+i+")",t.grid.sDiv).html(vl).attr("title",$.jgrid.stripHtml(vl)); success = true; } } else if(action == "get") { res[nm] = $("tr.footrow td:eq("+i+")",t.grid.sDiv).html(); } }); }); return action == "get" ? res : success; }, ShowHideCol : function(colname,show) { return this.each(function() { var $t = this, fndh=false; if (!$t.grid ) {return;} if( typeof colname === 'string') {colname=[colname];} show = show !="none" ? "" : "none"; var sw = show == "" ? true :false; $(this.p.colModel).each(function(i) { if ($.inArray(this.name,colname) !== -1 && this.hidden === sw) { $("tr",$t.grid.hDiv).each(function(){ $("th:eq("+i+")",this).css("display",show); }); $($t.rows).each(function(j){ $("td:eq("+i+")",$t.rows[j]).css("display",show); }); if($t.p.footerrow) $("td:eq("+i+")",$t.grid.sDiv).css("display", show); if(show == "none") $t.p.tblwidth -= this.width; else $t.p.tblwidth += this.width; this.hidden = !sw; fndh=true; } }); if(fndh===true) { $("table:first",$t.grid.hDiv).width($t.p.tblwidth); $("table:first",$t.grid.bDiv).width($t.p.tblwidth); $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft; if($t.p.footerrow) { $("table:first",$t.grid.sDiv).width($t.p.tblwidth); $t.grid.sDiv.scrollLeft = $t.grid.bDiv.scrollLeft; } } }); }, hideCol : function (colname) { return this.each(function(){$(this).jqGrid("ShowHideCol",colname,"none");}); }, showCol : function(colname) { return this.each(function(){$(this).jqGrid("ShowHideCol",colname,"");}); }, remapColumns : function(permutation, updateCells, keepHeader) { function resortArray(a) { var ac; if (a.length) { ac = $.makeArray(a); } else { ac = $.extend({}, a); } $.each(permutation, function(i) { a[i] = ac[this]; }); } var ts = this.get(0); function resortRows(parent, clobj) { $(">tr"+(clobj||""), parent).each(function() { var row = this; var elems = $.makeArray(row.cells); $.each(permutation, function() { var e = elems[this]; if (e) { row.appendChild(e); } }); }); } resortArray(ts.p.colModel); resortArray(ts.p.colNames); resortArray(ts.grid.headers); resortRows($("thead:first", ts.grid.hDiv), keepHeader && ":not(.ui-jqgrid-labels)"); if (updateCells) { resortRows($("tbody:first", ts.grid.bDiv), ".jqgrow"); } if (ts.p.footerrow) { resortRows($("tbody:first", ts.grid.sDiv)); } if (ts.p.remapColumns) { if (!ts.p.remapColumns.length) ts.p.remapColumns = $.makeArray(permutation); else resortArray(ts.p.remapColumns); } ts.p.lastsort = $.inArray(ts.p.lastsort, permutation); if(ts.p.treeGrid) ts.p.expColInd = $.inArray(ts.p.expColInd, permutation); }, setGridWidth : function(nwidth, shrink) { return this.each(function(){ var $t = this, cw, initwidth = 0, brd=$t.p.cellLayout, lvc, vc=0, hs=false, scw=$t.p.scrollOffset, aw, gw=0, tw=0, cl = 0,cr; if (!$t.grid ) {return;} if(typeof shrink != 'boolean') { shrink=$t.p.shrinkToFit; } if(isNaN(nwidth)) {return;} else { nwidth = parseInt(nwidth,10); $t.grid.width = $t.p.width = nwidth;} $("#gbox_"+$t.p.id).css("width",nwidth+"px"); $("#gview_"+$t.p.id).css("width",nwidth+"px"); $($t.grid.bDiv).css("width",nwidth+"px"); $($t.grid.hDiv).css("width",nwidth+"px"); if($t.p.pager ) {$($t.p.pager).css("width",nwidth+"px");} if($t.p.toolbar[0] === true){ $($t.grid.uDiv).css("width",nwidth+"px"); if($t.p.toolbar[1]=="both") {$($t.grid.ubDiv).css("width",nwidth+"px");} } if($t.p.footerrow) $($t.grid.sDiv).css("width",nwidth+"px"); if(shrink ===false && $t.p.forceFit == true) {$t.p.forceFit=false;} if(shrink===true) { if ($.browser.safari) { brd=0;} $.each($t.p.colModel, function(i) { if(this.hidden===false){ initwidth += parseInt(this.width,10); if(this.fixed) { tw += this.width; gw += this.width+brd; } else { vc++; } cl++; } }); if(vc == 0) return; $t.p.tblwidth = initwidth; aw = nwidth-brd*vc-gw; if(!isNaN($t.p.height)) { if($($t.grid.bDiv)[0].clientHeight < $($t.grid.bDiv)[0].scrollHeight){ hs = true; aw -= scw; } } initwidth =0; var cle = $t.grid.cols.length >0; $.each($t.p.colModel, function(i) { var tn = this.name; if(this.hidden === false && !this.fixed){ cw = Math.floor((aw)/($t.p.tblwidth-tw)*this.width); this.width =cw; initwidth += cw; $t.grid.headers[i].width=cw; $t.grid.headers[i].el.style.width=cw+"px"; if($t.p.footerrow) $t.grid.footers[i].style.width = cw+"px"; if(cle) $t.grid.cols[i].style.width = cw+"px"; lvc = i; } }); cr =0; if (hs) { if(nwidth-gw-(initwidth+brd*vc) !== scw) cr = nwidth-gw-(initwidth+brd*vc)-scw; } else if( Math.abs(nwidth-gw-(initwidth+brd*vc)) !== 1) { cr = nwidth-gw-(initwidth+brd*vc); } $t.p.colModel[lvc].width += cr; cw= $t.p.colModel[lvc].width; $t.grid.headers[lvc].width = cw; $t.grid.headers[lvc].el.style.width=cw+"px"; if(cle) $t.grid.cols[lvc].style.width = cw+"px"; $t.p.tblwidth = initwidth+cr+tw+brd*cl; $('table:first',$t.grid.bDiv).css("width",$t.p.tblwidth+"px"); $('table:first',$t.grid.hDiv).css("width",$t.p.tblwidth+"px"); $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft; if($t.p.footerrow) { $t.grid.footers[lvc].style.width = cw+"px"; $('table:first',$t.grid.sDiv).css("width",$t.p.tblwidth+"px"); } } }); }, setGridHeight : function (nh) { return this.each(function (){ var $t = this; if(!$t.grid) {return;} $($t.grid.bDiv).css({height: nh+(isNaN(nh)?"":"px")}); $t.p.height = nh; if ($t.p.scroll) $t.grid.populateVisible(); }); }, setCaption : function (newcap){ return this.each(function(){ this.p.caption=newcap; $("span.ui-jqgrid-title",this.grid.cDiv).html(newcap); $(this.grid.cDiv).show(); }); }, setLabel : function(colname, nData, prop, attrp ){ return this.each(function(){ var $t = this, pos=-1; if(!$t.grid) {return;} if(isNaN(colname)) { $($t.p.colModel).each(function(i){ if (this.name == colname) { pos = i;return false; } }); } else {pos = parseInt(colname,10);} if(pos>=0) { var thecol = $("tr.ui-jqgrid-labels th:eq("+pos+")",$t.grid.hDiv); if (nData){ var ico = $(".s-ico",thecol); $("[id^=jqgh_]",thecol).empty().html(nData).append(ico); $t.p.colNames[pos] = nData; } if (prop) { if(typeof prop === 'string') {$(thecol).addClass(prop);} else {$(thecol).css(prop);} } if(typeof attrp === 'object') {$(thecol).attr(attrp);} } }); }, setCell : function(rowid,colname,nData,cssp,attrp) { return this.each(function(){ var $t = this, pos =-1,v; if(!$t.grid) {return;} if(isNaN(colname)) { $($t.p.colModel).each(function(i){ if (this.name == colname) { pos = i;return false; } }); } else {pos = parseInt(colname,10);} if(pos>=0) { var ind = $t.rows.namedItem(rowid); if (ind){ var tcell = $("td:eq("+pos+")",ind); if(nData !== "") { v = $t.formatter(rowid, nData, pos,ind,'edit'); if($t.p.treeGrid && $(".tree-wrap",$(tcell)).length>0) $("span",$(tcell)).html(v).attr("title",$.jgrid.stripHtml(v)); else $(tcell).html(v).attr("title",$.jgrid.stripHtml(v)); } if(typeof cssp === 'string'){ if(cssp) {$(tcell).addClass(cssp);} else {$(tcell).removeClass();} } else if(cssp) { $(tcell).css(cssp); } if(typeof attrp === 'object') {$(tcell).attr(attrp);} } } }); }, getCell : function(rowid,col) { var ret = false; this.each(function(){ var $t=this, pos=-1; if(!$t.grid) {return;} if(isNaN(col)) { $($t.p.colModel).each(function(i){ if (this.name === col) { pos = i;return false; } }); } else {pos = parseInt(col,10);} if(pos>=0) { var ind = $t.rows.namedItem(rowid); if(ind) { try { ret = $.unformat($("td:eq("+pos+")",ind),{rowId:ind.id, colModel:$t.p.colModel[pos]},pos); } catch (e){ ret = $.jgrid.htmlDecode($("td:eq("+pos+")",ind).html()); } } } }); return ret; }, getCol : function (col, obj, mathopr) { var ret = [], val, sum=0; obj = typeof (obj) != 'boolean' ? false : obj; if(typeof mathopr == 'undefined') mathopr = false; this.each(function(){ var $t=this, pos=-1; if(!$t.grid) {return;} if(isNaN(col)) { $($t.p.colModel).each(function(i){ if (this.name === col) { pos = i;return false; } }); } else {pos = parseInt(col,10);} if(pos>=0) { var ln = $t.rows.length, i =0; if (ln && ln>0){ while(i<ln){ try { val = $.unformat($($t.rows[i].cells[pos]),{rowId:$t.rows[i].id, colModel:$t.p.colModel[pos]},pos); } catch (e) { val = $.jgrid.htmlDecode($t.rows[i].cells[pos].innerHTML); } mathopr ? sum += parseFloat(val) : obj ? ret.push({id:$t.rows[i].id,value:val}) : ret[i]=val; i++; } if(mathopr) { switch(mathopr.toLowerCase()){ case 'sum': ret =sum; break; case 'avg': ret = sum/ln; break; case 'count': ret = ln; break; } } } } }); return ret; }, clearGridData : function(clearfooter) { return this.each(function(){ var $t = this; if(!$t.grid) {return;} if(typeof clearfooter != 'boolean') clearfooter = false; $("tbody:first tr", $t.grid.bDiv).remove(); if($t.p.footerrow && clearfooter) $(".ui-jqgrid-ftable td",$t.grid.sDiv).html(" "); $t.p.selrow = null; $t.p.selarrrow= []; $t.p.savedRow = []; $t.p.records = 0;$t.p.page='0';$t.p.lastpage='0';$t.p.reccount=0; $t.updatepager(true,false); }); }, getInd : function(rowid,rc){ var ret =false,rw; this.each(function(){ rw = this.rows.namedItem(rowid); if(rw) { ret = rc===true ? rw: rw.rowIndex; } }); return ret; } }); })(jQuery); ;(function($){ /* ** * jqGrid extension for cellediting Grid Data * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ /** * all events and options here are aded anonynous and not in the base grid * since the array is to big. Here is the order of execution. * From this point we use jQuery isFunction * formatCell * beforeEditCell, * onSelectCell (used only for noneditable cels) * afterEditCell, * beforeSaveCell, (called before validation of values if any) * beforeSubmitCell (if cellsubmit remote (ajax)) * afterSubmitCell(if cellsubmit remote (ajax)), * afterSaveCell, * errorCell, * serializeCellData - new * Options * cellsubmit (remote,clientArray) (added in grid options) * cellurl * ajaxCellOptions * */ $.jgrid.extend({ editCell : function (iRow,iCol, ed){ return this.each(function (){ var $t = this, nm, tmp,cc; if (!$t.grid || $t.p.cellEdit !== true) {return;} iCol = parseInt(iCol,10); // select the row that can be used for other methods $t.p.selrow = $t.rows[iRow].id; if (!$t.p.knv) {$($t).jqGrid("GridNav");} // check to see if we have already edited cell if ($t.p.savedRow.length>0) { // prevent second click on that field and enable selects if (ed===true ) { if(iRow == $t.p.iRow && iCol == $t.p.iCol){ return; } } // save the cell $($t).jqGrid("saveCell",$t.p.savedRow[0].id,$t.p.savedRow[0].ic) } else { window.setTimeout(function () { $("#"+$t.p.knv).attr("tabindex","-1").focus();},0); } nm = $t.p.colModel[iCol].name; if (nm=='subgrid' || nm=='cb' || nm=='rn') {return;} cc = $("td:eq("+iCol+")",$t.rows[iRow]); if ($t.p.colModel[iCol].editable===true && ed===true && !cc.hasClass("not-editable-cell")) { if(parseInt($t.p.iCol)>=0 && parseInt($t.p.iRow)>=0) { $("td:eq("+$t.p.iCol+")",$t.rows[$t.p.iRow]).removeClass("edit-cell ui-state-highlight"); $($t.rows[$t.p.iRow]).removeClass("selected-row ui-state-hover"); } $(cc).addClass("edit-cell ui-state-highlight"); $($t.rows[iRow]).addClass("selected-row ui-state-hover"); try { tmp = $.unformat(cc,{rowId: $t.rows[iRow].id, colModel:$t.p.colModel[iCol]},iCol); } catch (_) { tmp = $(cc).html(); } if($t.p.autoencode) tmp = $.jgrid.htmlDecode(tmp); if (!$t.p.colModel[iCol].edittype) {$t.p.colModel[iCol].edittype = "text";} $t.p.savedRow.push({id:iRow,ic:iCol,name:nm,v:tmp}); if($.isFunction($t.p.formatCell)) { var tmp2 = $t.p.formatCell($t.rows[iRow].id,nm,tmp,iRow,iCol); if(tmp2 != undefined ) {tmp = tmp2;} } var opt = $.extend({}, $t.p.colModel[iCol].editoptions || {} ,{id:iRow+"_"+nm,name:nm}); var elc = createEl($t.p.colModel[iCol].edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {})); if ($.isFunction($t.p.beforeEditCell)) { $t.p.beforeEditCell($t.rows[iRow].id,nm,tmp,iRow,iCol); } $(cc).html("").append(elc).attr("tabindex","0"); window.setTimeout(function () { $(elc).focus();},0); $("input, select, textarea",cc).bind("keydown",function(e) { if (e.keyCode === 27) { if($("input.hasDatepicker",cc).length >0) { if( $(".ui-datepicker").is(":hidden") ) $($t).jqGrid("restoreCell",iRow,iCol); else $("input.hasDatepicker",cc).datepicker('hide'); } else $($t).jqGrid("restoreCell",iRow,iCol); } //ESC if (e.keyCode === 13) {$($t).jqGrid("saveCell",iRow,iCol);}//Enter if (e.keyCode == 9) { if(!$t.grid.hDiv.loading ) { if (e.shiftKey) {$($t).jqGrid("prevCell",iRow,iCol);} //Shift TAb else {$($t).jqGrid("nextCell",iRow,iCol);} //Tab } else { return false; } } e.stopPropagation(); }); if ($.isFunction($t.p.afterEditCell)) { $t.p.afterEditCell($t.rows[iRow].id,nm,tmp,iRow,iCol); } } else { if (parseInt($t.p.iCol)>=0 && parseInt($t.p.iRow)>=0) { $("td:eq("+$t.p.iCol+")",$t.rows[$t.p.iRow]).removeClass("edit-cell ui-state-highlight"); $($t.rows[$t.p.iRow]).removeClass("selected-row ui-state-hover"); } cc.addClass("edit-cell ui-state-highlight"); $($t.rows[iRow]).addClass("selected-row ui-state-hover"); if ($.isFunction($t.p.onSelectCell)) { tmp = cc.html().replace(/\ \;/ig,''); $t.p.onSelectCell($t.rows[iRow].id,nm,tmp,iRow,iCol); } } $t.p.iCol = iCol; $t.p.iRow = iRow; }); }, saveCell : function (iRow, iCol){ return this.each(function(){ var $t= this, fr; if (!$t.grid || $t.p.cellEdit !== true) {return;} if ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;} if(fr != null) { var cc = $("td:eq("+iCol+")",$t.rows[iRow]),v,v2, cm = $t.p.colModel[iCol], nm = cm.name, nmjq = $.jgrid.jqID(nm) ; switch (cm.edittype) { case "select": if(!cm.editoptions.multiple) { v = $("#"+iRow+"_"+nmjq+">option:selected",$t.rows[iRow]).val(); v2 = $("#"+iRow+"_"+nmjq+">option:selected",$t.rows[iRow]).text(); } else { var sel = $("#"+iRow+"_"+nmjq,$t.rows[iRow]), selectedText = []; v = $(sel).val(); if(v) v.join(","); else v=""; $("option:selected",sel).each( function(i,selected){ selectedText[i] = $(selected).text(); } ); v2 = selectedText.join(","); } if(cm.formatter) v2 = v; break; case "checkbox": var cbv = ["Yes","No"]; if(cm.editoptions){ cbv = cm.editoptions.value.split(":"); } v = $("#"+iRow+"_"+nmjq,$t.rows[iRow]).attr("checked") ? cbv[0] : cbv[1]; v2=v; break; case "password": case "text": case "textarea": case "button" : v = $("#"+iRow+"_"+nmjq,$t.rows[iRow]).val(); v2=v; break; case 'custom' : try { if(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) { v = cm.editoptions.custom_value($(".customelement",cc),'get'); if (v===undefined) throw "e2"; else v2=v; } else throw "e1"; } catch (e) { if (e=="e1") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.nodefined,jQuery.jgrid.edit.bClose); if (e=="e2") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.novalue,jQuery.jgrid.edit.bClose); else info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose); } break; } // The common approach is if nothing changed do not do anything if (v2 != $t.p.savedRow[fr].v){ if ($.isFunction($t.p.beforeSaveCell)) { var vv = $t.p.beforeSaveCell($t.rows[iRow].id,nm, v, iRow,iCol); if (vv) {v = vv;} } var cv = checkValues(v,iCol,$t); if(cv[0] === true) { var addpost = {}; if ($.isFunction($t.p.beforeSubmitCell)) { addpost = $t.p.beforeSubmitCell($t.rows[iRow].id,nm, v, iRow,iCol); if (!addpost) {addpost={};} } if(v2=="") v2=" "; if( $("input.hasDatepicker",cc).length >0) $("input.hasDatepicker",cc).datepicker('hide'); if ($t.p.cellsubmit == 'remote') { if ($t.p.cellurl) { var postdata = {}; if($t.p.autoencode) v = $.jgrid.htmlEncode(v); postdata[nm] = v; var idname,oper, opers; opers = $t.p.prmNames; idname = opers.id; oper = opers.oper; postdata[idname] = $t.rows[iRow].id; postdata[oper] = opers.editoper; postdata = $.extend(addpost,postdata); $("#lui_"+$t.p.id).show(); $t.grid.hDiv.loading = true; $.ajax( $.extend( { url: $t.p.cellurl, data :$.isFunction($t.p.serializeCellData) ? $t.p.serializeCellData(postdata) : postdata, type: "POST", complete: function (result, stat) { $("#lui_"+$t.p.id).hide(); $t.grid.hDiv.loading = false; if (stat == 'success') { if ($.isFunction($t.p.afterSubmitCell)) { var ret = $t.p.afterSubmitCell(result,postdata.id,nm,v,iRow,iCol); if(ret[0] === true) { $(cc).empty(); $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, v2); $(cc).addClass("dirty-cell"); $($t.rows[iRow]).addClass("edited"); if ($.isFunction($t.p.afterSaveCell)) { $t.p.afterSaveCell($t.rows[iRow].id,nm, v, iRow,iCol); } $t.p.savedRow.splice(0,1); } else { info_dialog($.jgrid.errors.errcap,ret[1],$.jgrid.edit.bClose); $($t).jqGrid("restoreCell",iRow,iCol); } } else { $(cc).empty(); $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, v2); $(cc).addClass("dirty-cell"); $($t.rows[iRow]).addClass("edited"); if ($.isFunction($t.p.afterSaveCell)) { $t.p.afterSaveCell($t.rows[iRow].id,nm, v, iRow,iCol); } $t.p.savedRow.splice(0,1); } } }, error:function(res,stat) { $("#lui_"+$t.p.id).hide(); $t.grid.hDiv.loading = false; if ($.isFunction($t.p.errorCell)) { $t.p.errorCell(res,stat); $($t).jqGrid("restoreCell",iRow,iCol); } else { info_dialog($.jgrid.errors.errcap,res.status+" : "+res.statusText+"<br/>"+stat,$.jgrid.edit.bClose); $($t).jqGrid("restoreCell",iRow,iCol); } } }, $.jgrid.ajaxOptions, $t.p.ajaxCellOptions || {})); } else { try { info_dialog($.jgrid.errors.errcap,$.jgrid.errors.nourl,$.jgrid.edit.bClose); $($t).jqGrid("restoreCell",iRow,iCol); } catch (e) {} } } if ($t.p.cellsubmit == 'clientArray') { $(cc).empty(); $($t).jqGrid("setCell",$t.rows[iRow].id,iCol, v2); $(cc).addClass("dirty-cell"); $($t.rows[iRow]).addClass("edited"); if ($.isFunction($t.p.afterSaveCell)) { $t.p.afterSaveCell($t.rows[iRow].id,nm, v, iRow,iCol); } $t.p.savedRow.splice(0,1); } } else { try { window.setTimeout(function(){info_dialog($.jgrid.errors.errcap,v+" "+cv[1],$.jgrid.edit.bClose)},100); $($t).jqGrid("restoreCell",iRow,iCol); } catch (e) {} } } else { $($t).jqGrid("restoreCell",iRow,iCol); } } if ($.browser.opera) { $("#"+$t.p.knv).attr("tabindex","-1").focus(); } else { window.setTimeout(function () { $("#"+$t.p.knv).attr("tabindex","-1").focus();},0); } }); }, restoreCell : function(iRow, iCol) { return this.each(function(){ var $t= this, fr; if (!$t.grid || $t.p.cellEdit !== true ) {return;} if ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;} if(fr != null) { var cc = $("td:eq("+iCol+")",$t.rows[iRow]); // datepicker fix if($.isFunction($.fn['datepicker'])) { try { $("input.hasDatepicker",cc).datepicker('hide'); } catch (e) {} } $(cc).empty().attr("tabindex","-1"); $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, $t.p.savedRow[fr].v); $t.p.savedRow.splice(0,1); } window.setTimeout(function () { $("#"+$t.p.knv).attr("tabindex","-1").focus();},0); }); }, nextCell : function (iRow,iCol) { return this.each(function (){ var $t = this, nCol=false; if (!$t.grid || $t.p.cellEdit !== true) {return;} // try to find next editable cell for (var i=iCol+1; i<$t.p.colModel.length; i++) { if ( $t.p.colModel[i].editable ===true) { nCol = i; break; } } if(nCol !== false) { $($t).jqGrid("editCell",iRow,nCol,true); } else { if ($t.p.savedRow.length >0) { $($t).jqGrid("saveCell",iRow,iCol); } } }); }, prevCell : function (iRow,iCol) { return this.each(function (){ var $t = this, nCol=false; if (!$t.grid || $t.p.cellEdit !== true) {return;} // try to find next editable cell for (var i=iCol-1; i>=0; i--) { if ( $t.p.colModel[i].editable ===true) { nCol = i; break; } } if(nCol !== false) { $($t).jqGrid("editCell",iRow,nCol,true); } else { if ($t.p.savedRow.length >0) { $($t).jqGrid("saveCell",iRow,iCol); } } }); }, GridNav : function() { return this.each(function () { var $t = this; if (!$t.grid || $t.p.cellEdit !== true ) {return;} // trick to process keydown on non input elements $t.p.knv = $t.p.id + "_kn"; var selection = $("<span style='width:0px;height:0px;background-color:black;' tabindex='0'><span tabindex='-1' style='width:0px;height:0px;background-color:grey' id='"+$t.p.knv+"'></span></span>"), i, kdir; $(selection).insertBefore($t.grid.cDiv); $("#"+$t.p.knv) .focus() .keydown(function (e){ kdir = e.keyCode; if($t.p.direction == "rtl") { if(kdir==37) kdir = 39; else if (kdir==39) kdir = 37; } switch (kdir) { case 38: if ($t.p.iRow-1 >=0 ) { scrollGrid($t.p.iRow-1,$t.p.iCol,'vu'); $($t).jqGrid("editCell",$t.p.iRow-1,$t.p.iCol,false); } break; case 40 : if ($t.p.iRow+1 <= $t.rows.length-1) { scrollGrid($t.p.iRow+1,$t.p.iCol,'vd'); $($t).jqGrid("editCell",$t.p.iRow+1,$t.p.iCol,false); } break; case 37 : if ($t.p.iCol -1 >= 0) { i = findNextVisible($t.p.iCol-1,'lft'); scrollGrid($t.p.iRow, i,'h'); $($t).jqGrid("editCell",$t.p.iRow, i,false); } break; case 39 : if ($t.p.iCol +1 <= $t.p.colModel.length-1) { i = findNextVisible($t.p.iCol+1,'rgt'); scrollGrid($t.p.iRow,i,'h'); $($t).jqGrid("editCell",$t.p.iRow,i,false); } break; case 13: if (parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) { $($t).jqGrid("editCell",$t.p.iRow,$t.p.iCol,true); } break; } return false; }); function scrollGrid(iR, iC, tp){ if (tp.substr(0,1)=='v') { var ch = $($t.grid.bDiv)[0].clientHeight, st = $($t.grid.bDiv)[0].scrollTop, nROT = $t.rows[iR].offsetTop+$t.rows[iR].clientHeight, pROT = $t.rows[iR].offsetTop; if(tp == 'vd') { if(nROT >= ch) { $($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop + $t.rows[iR].clientHeight; } } if(tp == 'vu'){ if (pROT < st) { $($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop - $t.rows[iR].clientHeight; } } } if(tp=='h') { var cw = $($t.grid.bDiv)[0].clientWidth, sl = $($t.grid.bDiv)[0].scrollLeft, nCOL = $t.rows[iR].cells[iC].offsetLeft+$t.rows[iR].cells[iC].clientWidth, pCOL = $t.rows[iR].cells[iC].offsetLeft; if(nCOL >= cw+parseInt(sl)) { $($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft + $t.rows[iR].cells[iC].clientWidth; } else if (pCOL < sl) { $($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft - $t.rows[iR].cells[iC].clientWidth; } } }; function findNextVisible(iC,act){ var ind, i; if(act == 'lft') { ind = iC+1; for (i=iC;i>=0;i--){ if ($t.p.colModel[i].hidden !== true) { ind = i; break; } } } if(act == 'rgt') { ind = iC-1; for (i=iC; i<$t.p.colModel.length;i++){ if ($t.p.colModel[i].hidden !== true) { ind = i; break; } } } return ind; }; }); }, getChangedCells : function (mthd) { var ret=[]; if (!mthd) {mthd='all';} this.each(function(){ var $t= this,nm; if (!$t.grid || $t.p.cellEdit !== true ) {return;} $($t.rows).each(function(j){ var res = {}; if ($(this).hasClass("edited")) { $('td',this).each( function(i) { nm = $t.p.colModel[i].name; if ( nm !== 'cb' && nm !== 'subgrid') { if (mthd=='dirty') { if ($(this).hasClass('dirty-cell')) { try { res[nm] = $.unformat(this,{rowId:$t.rows[j].id, colModel:$t.p.colModel[i]},i); } catch (e){ res[nm] = $.jgrid.htmlDecode($(this).html()); } } } else { try { res[nm] = $.unformat(this,{rowId:$t.rows[j].id,colModel:$t.p.colModel[i]},i); } catch (e) { res[nm] = $.jgrid.htmlDecode($(this).html()); } } } }); res["id"] = this.id; ret.push(res); } }); }); return ret; } /// end cell editing }); })(jQuery); /* * jqGrid common function * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html */ // Modal functions var showModal = function(h) { h.w.show(); }; var closeModal = function(h) { h.w.hide().attr("aria-hidden","true"); if(h.o) { h.o.remove(); } }; var createModal = function(aIDs, content, p, insertSelector, posSelector, appendsel) { var mw = document.createElement('div'), rtlsup; rtlsup = jQuery(p.gbox).attr("dir") == "rtl" ? true : false; mw.className= "ui-widget ui-widget-content ui-corner-all ui-jqdialog"; mw.id = aIDs.themodal; var mh = document.createElement('div'); mh.className = "ui-jqdialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix"; mh.id = aIDs.modalhead; jQuery(mh).append("<span class='ui-jqdialog-title'>"+p.caption+"</span>"); var ahr= jQuery("<a href='javascript:void(0)' class='ui-jqdialog-titlebar-close ui-corner-all'></a>") .hover(function(){ahr.addClass('ui-state-hover');}, function(){ahr.removeClass('ui-state-hover');}) .append("<span class='ui-icon ui-icon-closethick'></span>"); jQuery(mh).append(ahr); if(rtlsup) { mw.dir = "rtl"; jQuery(".ui-jqdialog-title",mh).css("float","right"); jQuery(".ui-jqdialog-titlebar-close",mh).css("left",0.3+"em"); } else { mw.dir = "ltr"; jQuery(".ui-jqdialog-title",mh).css("float","left"); jQuery(".ui-jqdialog-titlebar-close",mh).css("right",0.3+"em"); } var mc = document.createElement('div'); jQuery(mc).addClass("ui-jqdialog-content ui-widget-content").attr("id",aIDs.modalcontent); jQuery(mc).append(content); mw.appendChild(mc); jQuery(mw).prepend(mh); if(appendsel===true) { jQuery('body').append(mw); } //append as first child in body -for alert dialog else {jQuery(mw).insertBefore(insertSelector);} if(typeof p.jqModal === 'undefined') {p.jqModal = true;} // internal use var coord = {}; if ( jQuery.fn.jqm && p.jqModal === true) { if(p.left ==0 && p.top==0) { var pos = []; pos = findPos(posSelector); p.left = pos[0] + 4; p.top = pos[1] + 4; } coord.top = p.top+"px"; coord.left = p.left; } else if(p.left !=0 || p.top!=0) { coord.left = p.left; coord.top = p.top+"px"; } jQuery("a.ui-jqdialog-titlebar-close",mh).click(function(e){ var oncm = jQuery("#"+aIDs.themodal).data("onClose") || p.onClose; var gboxclose = jQuery("#"+aIDs.themodal).data("gbox") || p.gbox; hideModal("#"+aIDs.themodal,{gb:gboxclose,jqm:p.jqModal,onClose:oncm}); return false; }); if (p.width == 0 || !p.width) {p.width = 300;} if(p.height==0 || !p.height) {p.height =200;} if(!p.zIndex) {p.zIndex = 950;} var rtlt = 0; if( rtlsup && coord.left && !appendsel) { rtlt = jQuery(p.gbox).width()- (!isNaN(p.width) ? parseInt(p.width) :0) - 8; // to do // just in case coord.left = parseInt(coord.left) + parseInt(rtlt); } if(coord.left) coord.left += "px"; jQuery(mw).css(jQuery.extend({ width: isNaN(p.width) ? "auto": p.width+"px", height:isNaN(p.height) ? "auto" : p.height + "px", zIndex:p.zIndex, overflow: 'hidden' },coord)) .attr({tabIndex: "-1","role":"dialog","aria-labelledby":aIDs.modalhead,"aria-hidden":"true"}); if(typeof p.drag == 'undefined') { p.drag=true;} if(typeof p.resize == 'undefined') {p.resize=true;} if (p.drag) { jQuery(mh).css('cursor','move'); if(jQuery.fn.jqDrag) { jQuery(mw).jqDrag(mh); } else { try { jQuery(mw).draggable({handle: jQuery("#"+mh.id)}); } catch (e) {} } } if(p.resize) { if(jQuery.fn.jqResize) { jQuery(mw).append("<div class='jqResize ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se ui-icon-grip-diagonal-se'></div>"); jQuery("#"+aIDs.themodal).jqResize(".jqResize",aIDs.scrollelm ? "#"+aIDs.scrollelm : false); } else { try { jQuery(mw).resizable({handles: 'se, sw',alsoResize: aIDs.scrollelm ? "#"+aIDs.scrollelm : false}); } catch (e) {} } } if(p.closeOnEscape === true){ jQuery(mw).keydown( function( e ) { if( e.which == 27 ) { var cone = jQuery("#"+aIDs.themodal).data("onClose") || p.onClose; hideModal(this,{gb:p.gbox,jqm:p.jqModal,onClose: cone}); } }); } }; var viewModal = function (selector,o){ o = jQuery.extend({ toTop: true, overlay: 10, modal: false, onShow: showModal, onHide: closeModal, gbox: '', jqm : true, jqM : true }, o || {}); if (jQuery.fn.jqm && o.jqm == true) { if(o.jqM) jQuery(selector).attr("aria-hidden","false").jqm(o).jqmShow(); else jQuery(selector).attr("aria-hidden","false").jqmShow(); } else { if(o.gbox != '') { jQuery(".jqgrid-overlay:first",o.gbox).show(); jQuery(selector).data("gbox",o.gbox); } jQuery(selector).show().attr("aria-hidden","false"); try{jQuery(':input:visible',selector)[0].focus();}catch(_){} } }; var hideModal = function (selector,o) { o = jQuery.extend({jqm : true, gb :''}, o || {}); if(o.onClose) { var oncret = o.onClose(selector); if (typeof oncret == 'boolean' && !oncret ) return; } if (jQuery.fn.jqm && o.jqm === true) { jQuery(selector).attr("aria-hidden","true").jqmHide(); } else { if(o.gb != '') { try {jQuery(".jqgrid-overlay:first",o.gb).hide();} catch (e){} } jQuery(selector).hide().attr("aria-hidden","true"); } }; function info_dialog(caption, content,c_b, modalopt) { var mopt = { width:290, height:'auto', dataheight: 'auto', drag: true, resize: false, caption:"<b>"+caption+"</b>", left:250, top:170, zIndex : 1000, jqModal : true, modal : false, closeOnEscape : true, align: 'center', buttonalign : 'center', buttons : [] // {text:'textbutt', id:"buttid", onClick : function(){...}} // if the id is not provided we set it like info_button_+ the index in the array - i.e info_button_0,info_button_1... }; jQuery.extend(mopt,modalopt || {}); var jm = mopt.jqModal; if(jQuery.fn.jqm && !jm) jm = false; // in case there is no jqModal var buttstr =""; if(mopt.buttons.length > 0) { for(var i=0;i<mopt.buttons.length;i++) { if(typeof mopt.buttons[i].id == "undefined") mopt.buttons[i].id = "info_button_"+i; buttstr += "<a href='javascript:void(0)' id='"+mopt.buttons[i].id+"' class='fm-button ui-state-default ui-corner-all'>"+mopt.buttons[i].text+"</a>"; } } var dh = isNaN(mopt.dataheight) ? mopt.dataheight : mopt.dataheight+"px", cn = "text-align:"+mopt.align+";"; var cnt = "<div id='info_id'>"; cnt += "<div id='infocnt' style='margin:0px;padding-bottom:1em;width:100%;overflow:auto;position:relative;height:"+dh+";"+cn+"'>"+content+"</div>"; cnt += c_b ? "<div class='ui-widget-content ui-helper-clearfix' style='text-align:"+mopt.buttonalign+";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'><a href='javascript:void(0)' id='closedialog' class='fm-button ui-state-default ui-corner-all'>"+c_b+"</a>"+buttstr+"</div>" : ""; cnt += "</div>"; try { if(jQuery("#info_dialog").attr("aria-hidden") == "false") hideModal("#info_dialog",{jqm:jm}); jQuery("#info_dialog").remove(); } catch (e){} createModal({ themodal:'info_dialog', modalhead:'info_head', modalcontent:'info_content', scrollelm: 'infocnt'}, cnt, mopt, '','',true ); // attach onclick after inserting into the dom if(buttstr) { jQuery.each(mopt.buttons,function(i){ jQuery("#"+this.id,"#info_id").bind('click',function(){mopt.buttons[i].onClick.call(jQuery("#info_dialog")); return false;}); }); } jQuery("#closedialog", "#info_id").click(function(e){ hideModal("#info_dialog",{jqm:jm}); return false; }); jQuery(".fm-button","#info_dialog").hover( function(){jQuery(this).addClass('ui-state-hover');}, function(){jQuery(this).removeClass('ui-state-hover');} ); viewModal("#info_dialog",{ onHide: function(h) { h.w.hide().remove(); if(h.o) { h.o.remove(); } }, modal :mopt.modal, jqm:jm }); try{$("#info_dialog").focus();} catch (e){} } //Helper functions function findPos(obj) { var curleft = curtop = 0; if (obj.offsetParent) { do { curleft += obj.offsetLeft; curtop += obj.offsetTop; } while (obj = obj.offsetParent); //do not change obj == obj.offsetParent } return [curleft,curtop]; } function isArray(obj) { if (obj.constructor.toString().indexOf("Array") == -1) { return false; } else { return true; } } // Form Functions function createEl(eltype,options,vl,autowidth, ajaxso) { var elem = ""; if(options.defaultValue) delete options['defaultValue']; function bindEv (el, opt) { if(jQuery.isFunction(opt.dataInit)) { // datepicker fix el.id = opt.id; opt.dataInit(el); delete opt['id']; delete opt['dataInit']; } if(opt.dataEvents) { jQuery.each(opt.dataEvents, function() { if (this.data != null) jQuery(el).bind(this.type, this.data, this.fn); else jQuery(el).bind(this.type, this.fn); }); delete opt['dataEvents']; } return opt; } switch (eltype) { case "textarea" : elem = document.createElement("textarea"); if(autowidth) { if(!options.cols) jQuery(elem).css({width:"98%"}); } else if (!options.cols) options.cols = 20; if(!options.rows) options.rows = 2; if(vl==' ' || vl==' ' || (vl.length==1 && vl.charCodeAt(0)==160)) {vl="";} elem.value = vl; options = bindEv(elem,options); jQuery(elem).attr(options); break; case "checkbox" : //what code for simple checkbox elem = document.createElement("input"); elem.type = "checkbox"; if( !options.value ) { var vl1 = vl.toLowerCase(); if(vl1.search(/(false|0|no|off|undefined)/i)<0 && vl1!=="") { elem.checked=true; elem.defaultChecked=true; elem.value = vl; } else { elem.value = "on"; } jQuery(elem).attr("offval","off"); } else { var cbval = options.value.split(":"); if(vl === cbval[0]) { elem.checked=true; elem.defaultChecked=true; } elem.value = cbval[0]; jQuery(elem).attr("offval",cbval[1]); try {delete options['value'];} catch (e){} } options = bindEv(elem,options); jQuery(elem).attr(options); break; case "select" : elem = document.createElement("select"); var msl, ovm = []; if(options.multiple===true) { msl = true; elem.multiple="multiple"; } else msl = false; if(options.dataUrl != null) { jQuery.ajax(jQuery.extend({ url: options.dataUrl, type : "GET", complete: function(data,status){ try {delete options['dataUrl'];delete options['value'];} catch (e){} var a; if(options.buildSelect != null) { var b = options.buildSelect(data); a = jQuery(b).html(); delete options['buildSelect']; } else a = jQuery(data.responseText).html(); if(a) { jQuery(elem).append(a); options = bindEv(elem,options); if(typeof options.size === 'undefined') { options.size = msl ? 3 : 1;} if(msl) { ovm = vl.split(","); ovm = jQuery.map(ovm,function(n){return jQuery.trim(n)}); } else { ovm[0] = vl; } jQuery(elem).attr(options); setTimeout(function(){ jQuery("option",elem).each(function(i){ if(i==0) this.selected = ""; if(jQuery.inArray(jQuery(this).text(),ovm) > -1 || jQuery.inArray(jQuery(this).val(),ovm)>-1) { this.selected= "selected"; if(!msl) return false; } }); },0); } } },ajaxso || {})); } else if(options.value) { var i; if(msl) { ovm = vl.split(","); ovm = jQuery.map(ovm,function(n){return jQuery.trim(n)}); if(typeof options.size === 'undefined') {options.size = 3;} } else { options.size = 1; } if(typeof options.value === 'function') options.value = options.value(); if(typeof options.value === 'string') { var so = options.value.split(";"),sv, ov; for(i=0; i<so.length;i++){ sv = so[i].split(":"); if(sv.length > 2 ) { sv[1] = jQuery.map(sv,function(n,i){if(i>0)return n;}).join(":"); } ov = document.createElement("option"); ov.value = sv[0]; ov.innerHTML = sv[1]; if (!msl && (sv[0] == vl || sv[1]==vl)) ov.selected ="selected"; if (msl && (jQuery.inArray(sv[1], ovm)>-1 || jQuery.inArray(sv[0], ovm)>-1)) {ov.selected ="selected";} elem.appendChild(ov); } } else if (typeof options.value === 'object') { var oSv = options.value; for ( var key in oSv) { ov = document.createElement("option"); ov.value = key; ov.innerHTML = oSv[key]; if (!msl && (key == vl ||oSv[key]==vl) ) ov.selected ="selected"; if (msl && (jQuery.inArray(oSv[key],ovm)>-1 || jQuery.inArray(key,ovm)>-1)) ov.selected ="selected"; elem.appendChild(ov); } } options = bindEv(elem,options); try {delete options['value'];} catch (e){} jQuery(elem).attr(options); } break; case "text" : case "password" : case "button" : elem = document.createElement("input"); elem.type = eltype; elem.value = vl; options = bindEv(elem,options); if(eltype != "button"){ if(autowidth) { if(!options.size) jQuery(elem).css({width:"98%"}); } else if (!options.size) options.size = 20; } jQuery(elem).attr(options); break; case "image" : case "file" : elem = document.createElement("input"); elem.type = eltype; options = bindEv(elem,options); jQuery(elem).attr(options); break; case "custom" : elem = document.createElement("span"); try { if(jQuery.isFunction(options.custom_element)) { var celm = options.custom_element.call(this,vl,options); if(celm) { celm = jQuery(celm).addClass("customelement").attr({id:options.id,name:options.name}); jQuery(elem).empty().append(celm); } else throw "e2"; } else throw "e1"; } catch (e) { if (e=="e1") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_element' "+jQuery.jgrid.edit.msg.nodefined, jQuery.jgrid.edit.bClose); if (e=="e2") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_element' "+jQuery.jgrid.edit.msg.novalue,jQuery.jgrid.edit.bClose); else info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose); } break; } return elem; } function checkValues(val, valref,g) { var edtrul,i, nm; if(typeof(valref)=='string'){ for( i =0, len=g.p.colModel.length;i<len; i++){ if(g.p.colModel[i].name==valref) { edtrul = g.p.colModel[i].editrules; valref = i; try { nm = g.p.colModel[i].formoptions.label; } catch (e) {} break; } } } else if(valref >=0) { edtrul = g.p.colModel[valref].editrules; } if(edtrul) { if(!nm) nm = g.p.colNames[valref]; if(edtrul.required === true) { if( val.match(/^s+$/) || val == "" ) return [false,nm+": "+jQuery.jgrid.edit.msg.required,""]; } // force required var rqfield = edtrul.required === false ? false : true; if(edtrul.number === true) { if( !(rqfield === false && isEmpty(val)) ) { if(isNaN(val)) return [false,nm+": "+jQuery.jgrid.edit.msg.number,""]; } } if(typeof edtrul.minValue != 'undefined' && !isNaN(edtrul.minValue)) { if (parseFloat(val) < parseFloat(edtrul.minValue) ) return [false,nm+": "+jQuery.jgrid.edit.msg.minValue+" "+edtrul.minValue,""]; } if(typeof edtrul.maxValue != 'undefined' && !isNaN(edtrul.maxValue)) { if (parseFloat(val) > parseFloat(edtrul.maxValue) ) return [false,nm+": "+jQuery.jgrid.edit.msg.maxValue+" "+edtrul.maxValue,""]; } var filter; if(edtrul.email === true) { if( !(rqfield === false && isEmpty(val)) ) { // taken from jquery Validate plugin filter = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i; if(!filter.test(val)) {return [false,nm+": "+jQuery.jgrid.edit.msg.email,""];} } } if(edtrul.integer === true) { if( !(rqfield === false && isEmpty(val)) ) { if(isNaN(val)) return [false,nm+": "+jQuery.jgrid.edit.msg.integer,""]; if ((val % 1 != 0) || (val.indexOf('.') != -1)) return [false,nm+": "+jQuery.jgrid.edit.msg.integer,""]; } } if(edtrul.date === true) { if( !(rqfield === false && isEmpty(val)) ) { var dft = g.p.colModel[valref].datefmt || "Y-m-d"; if(!checkDate (dft, val)) return [false,nm+": "+jQuery.jgrid.edit.msg.date+" - "+dft,""]; } } if(edtrul.time === true) { if( !(rqfield === false && isEmpty(val)) ) { if(!checkTime (val)) return [false,nm+": "+jQuery.jgrid.edit.msg.date+" - hh:mm (am/pm)",""]; } } if(edtrul.url === true) { if( !(rqfield === false && isEmpty(val)) ) { filter = /^(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i; if(!filter.test(val)) {return [false,nm+": "+jQuery.jgrid.edit.msg.url,""];} } } if(edtrul.custom === true) { if( !(rqfield === false && isEmpty(val)) ) { if(jQuery.isFunction(edtrul.custom_func)) { var ret = edtrul.custom_func.call(g,val,nm); if(jQuery.isArray(ret)) { return ret; } else { return [false,jQuery.jgrid.edit.msg.customarray,""]; } } else { return [false,jQuery.jgrid.edit.msg.customfcheck,""]; } } } } return [true,"",""]; } // Date Validation Javascript function checkDate (format, date) { var tsp = {}, sep; format = format.toLowerCase(); //we search for /,-,. for the date separator if(format.indexOf("/") != -1) { sep = "/"; } else if(format.indexOf("-") != -1) { sep = "-"; } else if(format.indexOf(".") != -1) { sep = "."; } else { sep = "/"; } format = format.split(sep); date = date.split(sep); if (date.length != 3) return false; var j=-1,yln, dln=-1, mln=-1; for(var i=0;i<format.length;i++){ var dv = isNaN(date[i]) ? 0 : parseInt(date[i],10); tsp[format[i]] = dv; yln = format[i]; if(yln.indexOf("y") != -1) { j=i; } if(yln.indexOf("m") != -1) {mln=i} if(yln.indexOf("d") != -1) {dln=i} } if (format[j] == "y" || format[j] == "yyyy") { yln=4; } else if(format[j] =="yy"){ yln = 2; } else { yln = -1; } var daysInMonth = DaysArray(12); var strDate; if (j === -1) { return false; } else { strDate = tsp[format[j]].toString(); if(yln == 2 && strDate.length == 1) {yln = 1;} if (strDate.length != yln || (tsp[format[j]]==0 && date[j]!="00")){ return false; } } if(mln === -1) { return false; } else { strDate = tsp[format[mln]].toString(); if (strDate.length<1 || tsp[format[mln]]<1 || tsp[format[mln]]>12){ return false; } } if(dln === -1) { return false; } else { strDate = tsp[format[dln]].toString(); if (strDate.length<1 || tsp[format[dln]]<1 || tsp[format[dln]]>31 || (tsp[format[mln]]==2 && tsp[format[dln]]>daysInFebruary(tsp[format[j]])) || tsp[format[dln]] > daysInMonth[tsp[format[mln]]]){ return false; } } return true; } function daysInFebruary (year){ // February has 29 days in any year evenly divisible by four, // EXCEPT for centurial years which are not also divisible by 400. return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 ); } function DaysArray(n) { for (var i = 1; i <= n; i++) { this[i] = 31; if (i==4 || i==6 || i==9 || i==11) {this[i] = 30;} if (i==2) {this[i] = 29;} } return this; } function isEmpty(val) { if (val.match(/^s+$/) || val == "") { return true; } else { return false; } } function checkTime(time){ // checks only hh:ss (and optional am/pm) var re = /^(\d{1,2}):(\d{2})([ap]m)?$/,regs; if(!isEmpty(time)) { regs = time.match(re); if(regs) { if(regs[3]) { if(regs[1] < 1 || regs[1] > 12) return false; } else { if(regs[1] > 23) return false; } if(regs[2] > 59) { return false; } } else { return false; } } return true; } ;(function($){ /** * jqGrid extension for custom methods * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ getColProp : function(colname){ var ret ={}, $t = this[0]; if ( !$t.grid ) { return; } var cM = $t.p.colModel; for ( var i =0;i<cM.length;i++ ) { if ( cM[i].name == colname ) { ret = cM[i]; break; } } return ret; }, setColProp : function(colname, obj){ //do not set width will not work return this.each(function(){ if ( this.grid ) { if ( obj ) { var cM = this.p.colModel; for ( var i =0;i<cM.length;i++ ) { if ( cM[i].name == colname ) { $.extend(this.p.colModel[i],obj); break; } } } } }); }, sortGrid : function(colname,reload, sor){ return this.each(function(){ var $t=this,idx=-1; if ( !$t.grid ) { return;} if ( !colname ) { colname = $t.p.sortname; } for ( var i=0;i<$t.p.colModel.length;i++ ) { if ( $t.p.colModel[i].index == colname || $t.p.colModel[i].name==colname ) { idx = i; break; } } if ( idx!=-1 ){ var sort = $t.p.colModel[idx].sortable; if ( typeof sort !== 'boolean' ) { sort = true; } if ( typeof reload !=='boolean' ) { reload = false; } if ( sort ) { $t.sortData("jqgh_"+colname, idx, reload, sor); } } }); }, GridDestroy : function () { return this.each(function(){ if ( this.grid ) { if ( this.p.pager ) { // if not part of grid $(this.p.pager).remove(); } var gid = this.id; try { $("#gbox_"+gid).remove(); } catch (_) {} } }); }, GridUnload : function(){ return this.each(function(){ if ( !this.grid ) {return;} var defgrid = {id: $(this).attr('id'),cl: $(this).attr('class')}; if (this.p.pager) { $(this.p.pager).empty().removeClass("ui-state-default ui-jqgrid-pager corner-bottom"); } var newtable = document.createElement('table'); $(newtable).attr({id:defgrid['id']}); newtable.className = defgrid['cl']; var gid = this.id; $(newtable).removeClass("ui-jqgrid-btable"); if( $(this.p.pager).parents("#gbox_"+gid).length === 1 ) { $(newtable).insertBefore("#gbox_"+gid).show(); $(this.p.pager).insertBefore("#gbox_"+gid); } else { $(newtable).insertBefore("#gbox_"+gid).show(); } $("#gbox_"+gid).remove(); }); }, setGridState : function(state) { return this.each(function(){ if ( !this.grid ) {return;} $t = this; if(state == 'hidden'){ $(".ui-jqgrid-bdiv, .ui-jqgrid-hdiv","#gview_"+$t.p.id).slideUp("fast"); if($t.p.pager) {$($t.p.pager).slideUp("fast");} if($t.p.toolbar[0]===true) { if( $t.p.toolbar[1]=='both') { $($t.grid.ubDiv).slideUp("fast"); } $($t.grid.uDiv).slideUp("fast"); } if($t.p.footerrow) $(".ui-jqgrid-sdiv","#gbox_"+$s.p.id).slideUp("fast"); $(".ui-jqgrid-titlebar-close span",$t.grid.cDiv).removeClass("ui-icon-circle-triangle-n").addClass("ui-icon-circle-triangle-s"); $t.p.gridstate = 'hidden'; } else if(state=='visible') { $(".ui-jqgrid-hdiv, .ui-jqgrid-bdiv","#gview_"+$t.p.id).slideDown("fast"); if($t.p.pager) {$($t.p.pager).slideDown("fast");} if($t.p.toolbar[0]===true) { if( $t.p.toolbar[1]=='both') { $($t.grid.ubDiv).slideDown("fast"); } $($t.grid.uDiv).slideDown("fast"); } if($t.p.footerrow) $(".ui-jqgrid-sdiv","#gbox_"+$t.p.id).slideDown("fast"); $(".ui-jqgrid-titlebar-close span",$t.grid.cDiv).removeClass("ui-icon-circle-triangle-s").addClass("ui-icon-circle-triangle-n"); $t.p.gridstate = 'visible'; } }); }, updateGridRows : function (data, rowidname, jsonreader) { var nm, success=false; this.each(function(){ var t = this, vl, ind, srow, sid; if(!t.grid) {return false;} if(!rowidname) rowidname = "id"; if( data && data.length >0 ) { $(data).each(function(j){ srow = this; ind = t.rows.namedItem(srow[rowidname]); if(ind) { sid = srow[rowidname]; if(jsonreader === true){ if(t.p.jsonReader.repeatitems === true) { if(t.p.jsonReader.cell) {srow = srow[t.p.jsonReader.cell];} for (var k=0;k<srow.length;k++) { vl = t.formatter( sid, srow[k], k, srow, 'edit'); if(t.p.treeGrid===true && nm == t.p.ExpandColumn) { $("td:eq("+k+") > span:first",ind).html(vl).attr("title",$.jgrid.stripHtml(vl)); } else { $("td:eq("+k+")",ind).html(vl).attr("title",$.jgrid.stripHtml(vl)); } } success = true; return true; } } $(t.p.colModel).each(function(i){ nm = jsonreader===true ? this.jsonmap || this.name :this.name; if( srow[nm] != undefined) { vl = t.formatter( sid, srow[nm], i, srow, 'edit'); if(t.p.treeGrid===true && nm == t.p.ExpandColumn) { $("td:eq("+i+") > span:first",ind).html(vl).attr("title",$.jgrid.stripHtml(vl)); } else { $("td:eq("+i+")",ind).html(vl).attr("title",$.jgrid.stripHtml(vl)); } success = true; } }); } }); } }); return success; }, filterGrid : function(gridid,p){ p = $.extend({ gridModel : false, gridNames : false, gridToolbar : false, filterModel: [], // label/name/stype/defval/surl/sopt formtype : "horizontal", // horizontal/vertical autosearch: true, // if set to false a serch button should be enabled. formclass: "filterform", tableclass: "filtertable", buttonclass: "filterbutton", searchButton: "Search", clearButton: "Clear", enableSearch : false, enableClear: false, beforeSearch: null, afterSearch: null, beforeClear: null, afterClear: null, url : '', marksearched: true },p || {}); return this.each(function(){ var self = this; this.p = p; if(this.p.filterModel.length == 0 && this.p.gridModel===false) { alert("No filter is set"); return;} if( !gridid) {alert("No target grid is set!"); return;} this.p.gridid = gridid.indexOf("#") != -1 ? gridid : "#"+gridid; var gcolMod = $(this.p.gridid).jqGrid("getGridParam",'colModel'); if(gcolMod) { if( this.p.gridModel === true) { var thegrid = $(this.p.gridid)[0]; var sh; // we should use the options search, edittype, editoptions // additionally surl and defval can be added in grid colModel $.each(gcolMod, function (i,n) { var tmpFil = []; this.search = this.search === false ? false : true; if(this.editrules && this.editrules.searchhidden === true) { sh = true; } else { if(this.hidden === true ) { sh = false; } else { sh = true; } } if( this.search === true && sh === true) { if(self.p.gridNames===true) { tmpFil.label = thegrid.p.colNames[i]; } else { tmpFil.label = ''; } tmpFil.name = this.name; tmpFil.index = this.index || this.name; // we support only text and selects, so all other to text tmpFil.stype = this.edittype || 'text'; if(tmpFil.stype != 'select' ) { tmpFil.stype = 'text'; } tmpFil.defval = this.defval || ''; tmpFil.surl = this.surl || ''; tmpFil.sopt = this.editoptions || {}; tmpFil.width = this.width; self.p.filterModel.push(tmpFil); } }); } else { $.each(self.p.filterModel,function(i,n) { for(var j=0;j<gcolMod.length;j++) { if(this.name == gcolMod[j].name) { this.index = gcolMod[j].index || this.name; break; } } if(!this.index) { this.index = this.name; } }); } } else { alert("Could not get grid colModel"); return; } var triggerSearch = function() { var sdata={}, j=0, v; var gr = $(self.p.gridid)[0], nm; gr.p.searchdata = {}; if($.isFunction(self.p.beforeSearch)){self.p.beforeSearch();} $.each(self.p.filterModel,function(i,n){ nm = this.index; switch (this.stype) { case 'select' : v = $("select[name="+nm+"]",self).val(); if(v) { sdata[nm] = v; if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell"); } j++; } else { if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell"); } try { delete gr.p.postData[this.index]; } catch (e) {} } break; default: v = $("input[name="+nm+"]",self).val(); if(v) { sdata[nm] = v; if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell"); } j++; } else { if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell"); } try { delete gr.p.postData[this.index]; } catch(e) {} } } }); var sd = j>0 ? true : false; $.extend(gr.p.postData,sdata); var saveurl; if(self.p.url) { saveurl = $(gr).jqGrid("getGridParam",'url'); $(gr).jqGrid("setGridParam",{url:self.p.url}); } $(gr).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]); if(saveurl) {$(gr).jqGrid("setGridParam",{url:saveurl});} if($.isFunction(self.p.afterSearch)){self.p.afterSearch();} }; var clearSearch = function(){ var sdata={}, v, j=0; var gr = $(self.p.gridid)[0], nm; if($.isFunction(self.p.beforeClear)){self.p.beforeClear();} $.each(self.p.filterModel,function(i,n){ nm = this.index; v = (this.defval) ? this.defval : ""; if(!this.stype){this.stype='text';} switch (this.stype) { case 'select' : var v1; $("select[name="+nm+"] option",self).each(function (i){ if(i==0) this.selected = true; if ($(this).text() == v) { this.selected = true; v1 = $(this).val(); return false; } }); if(v1) { // post the key and not the text sdata[nm] = v1; if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell"); } j++; } else { if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell"); } try { delete gr.p.postData[this.index]; } catch (e) {} } break; case 'text': $("input[name="+nm+"]",self).val(v); if(v) { sdata[nm] = v; if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell"); } j++; } else { if(self.p.marksearched){ $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell"); } try { delete gr.p.postData[this.index]; } catch (e) {} } break; } }); var sd = j>0 ? true : false; $.extend(gr.p.postData,sdata); var saveurl; if(self.p.url) { saveurl = $(gr).jqGrid("getGridParam",'url'); $(gr).jqGrid("setGridParam",{url:self.p.url}); } $(gr).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]); if(saveurl) {$(gr).jqGrid("setGridParam",{url:saveurl});} if($.isFunction(self.p.afterClear)){self.p.afterClear();} }; var formFill = function(){ var tr = document.createElement("tr"); var tr1, sb, cb,tl,td, td1; if(self.p.formtype=='horizontal'){ $(tbl).append(tr); } $.each(self.p.filterModel,function(i,n){ tl = document.createElement("td"); $(tl).append("<label for='"+this.name+"'>"+this.label+"</label>"); td = document.createElement("td"); var $t=this; if(!this.stype) { this.stype='text';} switch (this.stype) { case "select": if(this.surl) { // data returned should have already constructed html select $(td).load(this.surl,function(){ if($t.defval) $("select",this).val($t.defval); $("select",this).attr({name:$t.index || $t.name, id: "sg_"+$t.name}); if($t.sopt) $("select",this).attr($t.sopt); if(self.p.gridToolbar===true && $t.width) { $("select",this).width($t.width); } if(self.p.autosearch===true){ $("select",this).change(function(e){ triggerSearch(); return false; }); } }); } else { // sopt to construct the values if($t.sopt.value) { var oSv = $t.sopt.value; var elem = document.createElement("select"); $(elem).attr({name:$t.index || $t.name, id: "sg_"+$t.name}).attr($t.sopt); if(typeof oSv === "string") { var so = oSv.split(";"), sv, ov; for(var k=0; k<so.length;k++){ sv = so[k].split(":"); ov = document.createElement("option"); ov.value = sv[0]; ov.innerHTML = sv[1]; if (sv[1]==$t.defval) ov.selected ="selected"; elem.appendChild(ov); } } else if(typeof oSv === "object" ) { for ( var key in oSv) { i++; ov = document.createElement("option"); ov.value = key; ov.innerHTML = oSv[key]; if (oSv[key]==$t.defval) ov.selected ="selected"; elem.appendChild(ov); } } if(self.p.gridToolbar===true && $t.width) { $(elem).width($t.width); } $(td).append(elem); if(self.p.autosearch===true){ $(elem).change(function(e){ triggerSearch(); return false; }); } } } break; case 'text': var df = this.defval ? this.defval: ""; $(td).append("<input type='text' name='"+(this.index || this.name)+"' id='sg_"+this.name+"' value='"+df+"'/>"); if($t.sopt) $("input",td).attr($t.sopt); if(self.p.gridToolbar===true && $t.width) { if($.browser.msie) { $("input",td).width($t.width-4); } else { $("input",td).width($t.width-2); } } if(self.p.autosearch===true){ $("input",td).keypress(function(e){ var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; if(key == 13){ triggerSearch(); return false; } return this; }); } break; } if(self.p.formtype=='horizontal'){ if(self.p.gridToolbar===true && self.p.gridNames===false) { $(tr).append(td); } else { $(tr).append(tl).append(td); } $(tr).append(td); } else { tr1 = document.createElement("tr"); $(tr1).append(tl).append(td); $(tbl).append(tr1); } }); td = document.createElement("td"); if(self.p.enableSearch === true){ sb = "<input type='button' id='sButton' class='"+self.p.buttonclass+"' value='"+self.p.searchButton+"'/>"; $(td).append(sb); $("input#sButton",td).click(function(){ triggerSearch(); return false; }); } if(self.p.enableClear === true) { cb = "<input type='button' id='cButton' class='"+self.p.buttonclass+"' value='"+self.p.clearButton+"'/>"; $(td).append(cb); $("input#cButton",td).click(function(){ clearSearch(); return false; }); } if(self.p.enableClear === true || self.p.enableSearch === true) { if(self.p.formtype=='horizontal') { $(tr).append(td); } else { tr1 = document.createElement("tr"); $(tr1).append("<td> </td>").append(td); $(tbl).append(tr1); } } }; var frm = $("<form name='SearchForm' style=display:inline;' class='"+this.p.formclass+"'></form>"); var tbl =$("<table class='"+this.p.tableclass+"' cellspacing='0' cellpading='0' border='0'><tbody></tbody></table>"); $(frm).append(tbl); formFill(); $(this).append(frm); this.triggerSearch = triggerSearch; this.clearSearch = clearSearch; }); }, filterToolbar : function(p){ p = $.extend({ autosearch: true, searchOnEnter : true, beforeSearch: null, afterSearch: null, beforeClear: null, afterClear: null, searchurl : '', stringResult: false, groupOp: 'AND' },p || {}); return this.each(function(){ var $t = this; var triggerToolbar = function() { var sdata={}, j=0, v, nm, sopt={}; $.each($t.p.colModel,function(i,n){ nm = this.index || this.name; var so = (this.searchoptions && this.searchoptions.sopt) ? this.searchoptions.sopt[0] : "bw"; switch (this.stype) { case 'select' : v = $("select[name="+nm+"]",$t.grid.hDiv).val(); if(v) { sdata[nm] = v; sopt[nm] = so; j++; } else { try { delete $t.p.postData[nm]; } catch (e) {} } break; case 'text': v = $("input[name="+nm+"]",$t.grid.hDiv).val(); if(v) { sdata[nm] = v; sopt[nm] = so; j++; } else { try { delete $t.p.postData[nm]; } catch (e) {} } break; } }); var sd = j>0 ? true : false; if(!p.stringResult) { $.extend($t.p.postData,sdata); } else { var ruleGroup = "{\"groupOp\":\"" + p.groupOp + "\",\"rules\":["; var gi=0; $.each(sdata,function(i,n){ if (gi > 0) ruleGroup += ","; ruleGroup += "{\"field\":\"" + i + "\","; ruleGroup += "\"op\":\"" + sopt[i] + "\","; ruleGroup += "\"data\":\"" + n + "\"}"; gi++; }); ruleGroup += "]}"; $.extend($t.p.postData,{filters:ruleGroup}); } var saveurl; if($t.p.searchurl) { saveurl = $t.p.url; $($t).jqGrid("setGridParam",{url:$t.p.searchurl}); } var bsr = false; if($.isFunction(p.beforeSearch)){bsr = p.beforeSearch.call($t);} if(!bsr) $($t).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]); if(saveurl) {$($t).jqGrid("setGridParam",{url:saveurl});} if($.isFunction(p.afterSearch)){p.afterSearch();} }; var clearToolbar = function(trigger){ var sdata={}, v, j=0, nm; trigger = (typeof trigger != 'boolean') ? true : trigger; $.each($t.p.colModel,function(i,n){ v = (this.searchoptions && this.searchoptions.defaultValue) ? this.searchoptions.defaultValue : ""; nm = this.index || this.name; switch (this.stype) { case 'select' : var v1; $("select[name="+nm+"] option",$t.grid.hDiv).each(function (i){ if(i==0) this.selected = true; if ($(this).text() == v) { this.selected = true; v1 = $(this).val(); return false; } }); if (v1) { // post the key and not the text sdata[nm] = v1; j++; } else { try { delete $t.p.postData[nm]; } catch(e) {} } break; case 'text': $("input[name="+nm+"]",$t.grid.hDiv).val(v); if(v) { sdata[nm] = v; j++; } else { try { delete $t.p.postData[nm]; } catch (e){} } break; } }); var sd = j>0 ? true : false; if(!p.stringResult) { $.extend($t.p.postData,sdata); } else { var ruleGroup = "{\"groupOp\":\"" + p.groupOp + "\",\"rules\":["; var gi=0; $.each(sdata,function(i,n){ if (gi > 0) ruleGroup += ","; ruleGroup += "{\"field\":\"" + i + "\","; ruleGroup += "\"op\":\"" + "eq" + "\","; ruleGroup += "\"data\":\"" + n + "\"}"; gi++; }); ruleGroup += "]}"; $.extend($t.p.postData,{filters:ruleGroup}); } var saveurl; if($t.p.searchurl) { saveurl = $t.p.url; $($t).jqGrid("setGridParam",{url:$t.p.searchurl}); } var bcv = false; if($.isFunction(p.beforeClear)){bcv = p.beforeClear.call($t);} if(!bcv) { if(trigger) $($t).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]); } if(saveurl) {$($t).jqGrid("setGridParam",{url:saveurl});} if($.isFunction(p.afterClear)){p.afterClear();} }; var toggleToolbar = function(){ var trow = $("tr.ui-search-toolbar",$t.grid.hDiv); if(trow.css("display")=='none') trow.show(); else trow.hide(); }; // create the row function bindEvents(selector, events) { var jElem = $(selector); if (jElem[0] != null) { jQuery.each(events, function() { if (this.data != null) jElem.bind(this.type, this.data, this.fn); else jElem.bind(this.type, this.fn); }); } } var tr = $("<tr class='ui-search-toolbar' role='rowheader'></tr>"), th,thd, soptions; var timeoutHnd; $.each($t.p.colModel,function(i,n){ var cm=this; th = $("<th role='columnheader' class='ui-state-default ui-th-column ui-th-"+$t.p.direction+"'></th>"); thd = $("<div style='width:100%;position:relative;height:100%;padding-right:0.3em;'></div>"); if(this.hidden===true) { $(th).css("display","none");} this.search = this.search === false ? false : true; if(typeof this.stype == 'undefined' ) {this.stype='text';} soptions = $.extend({},this.searchoptions || {}); if(this.search){ switch (this.stype) { case "select": var surl = this.surl || soptions.dataUrl; if(surl) { // data returned should have already constructed html select // primitive jQuery load var self = thd; $.ajax($.extend({ url: surl, dataType: "html", complete: function(res,status) { if(soptions.buildSelect != null) { var d = soptions.buildSelect(res); if (d) $(self).append(d); } else $(self).append(res.responseText); if(soptions.defaultValue) $("select",self).val(soptions.defaultValue); $("select",self).attr({name:cm.index || cm.name, id: "gs_"+cm.name}); if(soptions.attr) {$("select",self).attr(soptions.attr);} $("select",self).css({width: "100%"}); // preserve autoserch if(soptions.dataInit != null) soptions.dataInit($("select",self)[0]); if(soptions.dataEvents != null) bindEvents($("select",self)[0],soptions.dataEvents); if(p.autosearch===true){ $("select",self).change(function(e){ triggerToolbar(); return false; }); } } }, $.jgrid.ajaxOptions, $t.p.ajaxSelectOptions || {} )); } else { var oSv; if(cm.searchoptions && cm.searchoptions.value) oSv = cm.searchoptions.value; else if(cm.editoptions && cm.editoptions.value) { oSv = cm.editoptions.value; } if (oSv) { var elem = document.createElement("select"); elem.style.width = "100%"; $(elem).attr({name:cm.index || cm.name, id: "gs_"+cm.name}); if(typeof oSv === "string") { var so = oSv.split(";"), sv, ov; for(var k=0; k<so.length;k++){ sv = so[k].split(":"); ov = document.createElement("option"); ov.value = sv[0]; ov.innerHTML = sv[1]; elem.appendChild(ov); } } else if(typeof oSv === "object" ) { for ( var key in oSv) { ov = document.createElement("option"); ov.value = key; ov.innerHTML = oSv[key]; elem.appendChild(ov); } } if(soptions.defaultValue) $(elem).val(soptions.defaultValue); if(soptions.attr) {$(elem).attr(soptions.attr);} if(soptions.dataInit != null) soptions.dataInit(elem); if(soptions.dataEvents != null) bindEvents(elem, soptions.dataEvents); $(thd).append(elem); if(p.autosearch===true){ $(elem).change(function(e){ triggerToolbar(); return false; }); } } } break; case 'text': var df = soptions.defaultValue ? soptions.defaultValue: ""; $(thd).append("<input type='text' style='width:95%;padding:0px;' name='"+(cm.index || cm.name)+"' id='gs_"+cm.name+"' value='"+df+"'/>"); if(soptions.attr) {$("input",thd).attr(soptions.attr);} if(soptions.dataInit != null) soptions.dataInit($("input",thd)[0]); if(soptions.dataEvents != null) bindEvents($("input",thd)[0], soptions.dataEvents); if(p.autosearch===true){ if(p.searchOnEnter) { $("input",thd).keypress(function(e){ var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; if(key == 13){ triggerToolbar(); return false; } return this; }); } else { $("input",thd).keydown(function(e){ var key = e.which; switch (key) { case 9 : case 16: case 37: case 38: case 39: case 40: case 27: break; default : if(timeoutHnd) clearTimeout(timeoutHnd); timeoutHnd = setTimeout(function(){triggerToolbar();},500); } }); } } break; } } $(th).append(thd); $(tr).append(th); }); $("table thead",$t.grid.hDiv).append(tr); this.triggerToolbar = triggerToolbar; this.clearToolbar = clearToolbar; this.toggleToolbar = toggleToolbar; }); } }); })(jQuery); ;(function($){ /** * jqGrid extension for form editing Grid Data * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ var rp_ge = null; $.jgrid.extend({ searchGrid : function (p) { p = $.extend({ recreateFilter: false, drag: true, sField:'searchField', sValue:'searchString', sOper: 'searchOper', sFilter: 'filters', beforeShowSearch: null, afterShowSearch : null, onInitializeSearch: null, closeAfterSearch : false, closeOnEscape : false, multipleSearch : false, // translation // if you want to change or remove the order change it in sopt // ['bw','eq','ne','lt','le','gt','ge','ew','cn'] sopt: null, onClose : null // these are common options }, $.jgrid.search, p || {}); return this.each(function() { var $t = this; if(!$t.grid) {return;} if($.fn.searchFilter) { var fid = "fbox_"+$t.p.id; if(p.recreateFilter===true) {$("#"+fid).remove();} if( $("#"+fid).html() != null ) { if ( $.isFunction(p.beforeShowSearch) ) { p.beforeShowSearch($("#"+fid)); }; showFilter(); if( $.isFunction(p.afterShowSearch) ) { p.afterShowSearch($("#"+fid)); } } else { var fields = [], colNames = $("#"+$t.p.id).jqGrid("getGridParam","colNames"), colModel = $("#"+$t.p.id).jqGrid("getGridParam","colModel"), stempl = ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'], j,pos,k,oprtr; oprtr = jQuery.fn.searchFilter.defaults.operators; if (p.sopt !=null) { oprtr = []; k=0; for(j=0;j<p.sopt.length;j++) { if( (pos= $.inArray(p.sopt[j],stempl)) != -1 ){ oprtr[k] = {op:p.sopt[j],text: p.odata[pos]}; k++; } } } var searchable; $.each(colModel, function(i, v) { searchable = (typeof v.search === 'undefined') ? true: v.search , hidden = (v.hidden === true), soptions = $.extend({}, {text: colNames[i], itemval: v.index || v.name}, this.searchoptions), ignoreHiding = (soptions.searchhidden === true); if(typeof soptions.sopt == 'undefined') soptions.sopt = p.sopt || stempl; k=0; soptions.ops =[]; if(soptions.sopt.length>0) { for(j=0;j<soptions.sopt.length;j++) { if( (pos= $.inArray(soptions.sopt[j],stempl)) != -1 ){ soptions.ops[k] = {op:soptions.sopt[j],text: p.odata[pos]}; k++; } } } if(typeof(this.stype) === 'undefined') this.stype='text'; if(this.stype == 'select') { if ( soptions.dataUrl != null) {} else { var eov; if(soptions.value) eov = soptions.value; else if(this.editoptions) eov = this.editoptions.value; if(eov) { soptions.dataValues =[]; if(typeof(eov) === 'string') { var so = eov.split(";"),sv; for(j=0;j<so.length;j++) { sv = so[j].split(":"); soptions.dataValues[j] ={value:sv[0],text:sv[1]}; } } else if (typeof(eov) === 'object') { j=0; for (var key in eov) { soptions.dataValues[j] ={value:key,text:eov[key]}; j++; } } } } } if ((ignoreHiding && searchable) || (searchable && !hidden)) { fields.push(soptions); } }); if(fields.length>0){ $("<div id='"+fid+"' role='dialog' tabindex='-1'></div>").insertBefore("#gview_"+$t.p.id); $("#"+fid).searchFilter(fields, { groupOps: p.groupOps, operators: oprtr, onClose:hideFilter, resetText: p.Reset, searchText: p.Find, windowTitle: p.caption, rulesText:p.rulesText, matchText:p.matchText, onSearch: searchFilters, onReset: resetFilters,stringResult:p.multipleSearch, ajaxSelectOptions: $.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions ||{}) }); $(".ui-widget-overlay","#"+fid).remove(); if($t.p.direction=="rtl") $(".ui-closer","#"+fid).css("float","left"); if (p.drag===true) { $("#"+fid+" table thead tr:first td:first").css('cursor','move'); if(jQuery.fn.jqDrag) { $("#"+fid).jqDrag($("#"+fid+" table thead tr:first td:first")); } else { try { $("#"+fid).draggable({handle: $("#"+fid+" table thead tr:first td:first")}); } catch (e) {} } } if(p.multipleSearch === false) { $(".ui-del, .ui-add, .ui-del, .ui-add-last, .matchText, .rulesText", "#"+fid).hide(); $("select[name='groupOp']","#"+fid).hide(); } if ( $.isFunction(p.onInitializeSearch) ) { p.onInitializeSearch( $("#"+fid) ); }; if ( $.isFunction(p.beforeShowSearch) ) { p.beforeShowSearch($("#"+fid)); }; showFilter(); if( $.isFunction(p.afterShowSearch) ) { p.afterShowSearch($("#"+fid)); } if(p.closeOnEscape===true){ $("#"+fid).keydown( function( e ) { if( e.which == 27 ) { hideFilter($("#"+fid)); } }); } } } } function searchFilters(filters) { var hasFilters = (filters !== undefined), grid = $("#"+$t.p.id), sdata={}; if(p.multipleSearch===false) { sdata[p.sField] = filters.rules[0].field; sdata[p.sValue] = filters.rules[0].data; sdata[p.sOper] = filters.rules[0].op; } else { sdata[p.sFilter] = filters; } grid[0].p.search = hasFilters; $.extend(grid[0].p.postData,sdata); grid.trigger("reloadGrid",[{page:1}]); if(p.closeAfterSearch) hideFilter($("#"+fid)); } function resetFilters(filters) { var hasFilters = (filters !== undefined), grid = $("#"+$t.p.id), sdata=[]; grid[0].p.search = hasFilters; if(p.multipleSearch===false) { sdata[p.sField] = sdata[p.sValue] = sdata[p.sOper] = ""; } else { sdata[p.sFilter] = ""; } $.extend(grid[0].p.postData,sdata); grid.trigger("reloadGrid",[{page:1}]); } function hideFilter(selector) { if(p.onClose){ var fclm = p.onClose(selector); if(typeof fclm == 'boolean' && !fclm) return; } selector.hide(); $(".jqgrid-overlay:first","#gbox_"+$t.p.id).hide(); } function showFilter(){ var fl = $(".ui-searchFilter").length; if(fl > 1) { var zI = $("#"+fid).css("zIndex"); $("#"+fid).css({zIndex:parseInt(zI)+fl}); } $("#"+fid).show(); $(".jqgrid-overlay:first","#gbox_"+$t.p.id).show(); try{$(':input:visible',"#"+fid)[0].focus();}catch(_){} } }); }, editGridRow : function(rowid, p){ p = $.extend({ top : 0, left: 0, width: 300, height: 'auto', dataheight: 'auto', modal: false, drag: true, resize: true, url: null, mtype : "POST", clearAfterAdd :true, closeAfterEdit : false, reloadAfterSubmit : true, onInitializeForm: null, beforeInitData: null, beforeShowForm: null, afterShowForm: null, beforeSubmit: null, afterSubmit: null, onclickSubmit: null, afterComplete: null, onclickPgButtons : null, afterclickPgButtons: null, editData : {}, recreateForm : false, jqModal : true, closeOnEscape : false, addedrow : "first", topinfo : '', bottominfo: '', saveicon : [], closeicon : [], savekey: [false,13], navkeys: [false,38,40], checkOnSubmit : false, checkOnUpdate : false, _savedData : {}, processing : false, onClose : null, ajaxEditOptions : {}, serializeEditData : null, viewPagerButtons : true }, $.jgrid.edit, p || {}); rp_ge = p; return this.each(function(){ var $t = this; if (!$t.grid || !rowid) { return; } var gID = $t.p.id, frmgr = "FrmGrid_"+gID,frmtb = "TblGrid_"+gID, IDs = {themodal:'editmod'+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID, scrollelm : frmgr}, onBeforeShow = $.isFunction(rp_ge.beforeShowForm) ? rp_ge.beforeShowForm : false, onAfterShow = $.isFunction(rp_ge.afterShowForm) ? rp_ge.afterShowForm : false, onBeforeInit = $.isFunction(rp_ge.beforeInitData) ? rp_ge.beforeInitData : false, onInitializeForm = $.isFunction(rp_ge.onInitializeForm) ? rp_ge.onInitializeForm : false, copydata = null, maxCols = 1, maxRows=0, gurl, postdata, ret, extpost, newData, diff; if (rowid=="new") { rowid = "_empty"; p.caption=p.addCaption; } else { p.caption=p.editCaption; }; if(p.recreateForm===true && $("#"+IDs.themodal).html() != null) { $("#"+IDs.themodal).remove(); } var closeovrl = true; if(p.checkOnUpdate && p.jqModal && !p.modal) { closeovrl = false; } if ( $("#"+IDs.themodal).html() != null ) { $(".ui-jqdialog-title","#"+IDs.modalhead).html(p.caption); $("#FormError","#"+frmtb).hide(); if(rp_ge.topinfo) { $(".topinfo","#"+frmtb+"_2").html(rp_ge.topinfo); $(".tinfo","#"+frmtb+"_2").show(); } else $(".tinfo","#"+frmtb+"_2").hide(); if(rp_ge.bottominfo) { $(".bottominfo","#"+frmtb+"_2").html(rp_ge.bottominfo); $(".binfo","#"+frmtb+"_2").show(); } else $(".binfo","#"+frmtb+"_2").hide(); if(onBeforeInit) { onBeforeInit($("#"+frmgr)); } // filldata fillData(rowid,$t,frmgr); /// if(rowid=="_empty" || !rp_ge.viewPagerButtons) { $("#pData, #nData","#"+frmtb+"_2").hide(); } else { $("#pData, #nData","#"+frmtb+"_2").show(); } if(rp_ge.processing===true) { rp_ge.processing=false; $("#sData", "#"+frmtb+"_2").removeClass('ui-state-active'); } if($("#"+frmgr).data("disabled")===true) { $(".confirm","#"+IDs.themodal).hide(); $("#"+frmgr).data("disabled",false); } if(onBeforeShow) { onBeforeShow($("#"+frmgr)); } $("#"+IDs.themodal).data("onClose",rp_ge.onClose); viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, jqM: false, closeoverlay: closeovrl, modal:p.modal}); if(!closeovrl) { $(".jqmOverlay").click(function(){ if(!checkUpdates()) return false; hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: rp_ge.onClose}); return false; }); } if(onAfterShow) { onAfterShow($("#"+frmgr)); } } else { $($t.p.colModel).each( function(i) { var fmto = this.formoptions; maxCols = Math.max(maxCols, fmto ? fmto.colpos || 0 : 0 ); maxRows = Math.max(maxRows, fmto ? fmto.rowpos || 0 : 0 ); }); var dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+"px"; var flr, frm = $("<form name='FormPost' id='"+frmgr+"' class='FormGrid' style='width:100%;overflow:auto;position:relative;height:"+dh+";'></form>").data("disabled",false), tbl =$("<table id='"+frmtb+"' class='EditTable' cellspacing='0' cellpading='0' border='0'><tbody></tbody></table>"); $(frm).append(tbl); flr = $("<tr id='FormError' style='display:none'><td class='ui-state-error' colspan='"+(maxCols*2)+"'></td></tr>"); flr[0].rp = 0; $(tbl).append(flr); //topinfo flr = $("<tr style='display:none' class='tinfo'><td class='topinfo' colspan='"+(maxCols*2)+"'>"+rp_ge.topinfo+"</td></tr>"); flr[0].rp = 0; $(tbl).append(flr); // set the id. // use carefull only to change here colproperties. if(onBeforeInit) { onBeforeInit($("#"+frmgr)); } // create data var rtlb = $t.p.direction == "rtl" ? true :false, bp = rtlb ? "nData" : "pData", bn = rtlb ? "pData" : "nData", valref = createData(rowid,$t,tbl,maxCols), // buttons at footer bP = "<a href='javascript:void(0)' id='"+bp+"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></div>", bN = "<a href='javascript:void(0)' id='"+bn+"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></div>", bS ="<a href='javascript:void(0)' id='sData' class='fm-button ui-state-default ui-corner-all'>"+p.bSubmit+"</a>", bC ="<a href='javascript:void(0)' id='cData' class='fm-button ui-state-default ui-corner-all'>"+p.bCancel+"</a>"; var bt = "<table border='0' class='EditTable' id='"+frmtb+"_2'><tbody><tr id='Act_Buttons'><td class='navButton ui-widget-content'>"+(rtlb ? bN+bP : bP+bN)+"</td><td class='EditButton ui-widget-content'>"+bS+bC+"</td></tr>"; bt += "<tr style='display:none' class='binfo'><td class='bottominfo' colspan='2'>"+rp_ge.bottominfo+"</td></tr>"; bt += "</tbody></table>"; if(maxRows > 0) { var sd=[]; $.each($(tbl)[0].rows,function(i,r){ sd[i] = r; }); sd.sort(function(a,b){ if(a.rp > b.rp) {return 1;} if(a.rp < b.rp) {return -1;} return 0; }); $.each(sd, function(index, row) { $('tbody',tbl).append(row); }); } p.gbox = "#gbox_"+gID; var cle = false; if(p.closeOnEscape===true){ p.closeOnEscape = false; cle = true; } var tms = $("<span></span>").append(frm).append(bt); createModal(IDs,tms,p,"#gview_"+$t.p.id,$("#gview_"+$t.p.id)[0]); if(rtlb) { $("#pData, #nData","#"+frmtb+"_2").css("float","right"); $(".EditButton","#"+frmtb+"_2").css("text-align","left"); } if(rp_ge.topinfo) $(".tinfo","#"+frmtb+"_2").show(); if(rp_ge.bottominfo) $(".binfo","#"+frmtb+"_2").show(); tms = null; bt=null; $("#"+IDs.themodal).keydown( function( e ) { var wkey = e.target; if ($("#"+frmgr).data("disabled")===true ) return false; //?? if(rp_ge.savekey[0] === true && e.which == rp_ge.savekey[1]) { // save if(wkey.tagName != "TEXTAREA") { $("#sData", "#"+frmtb+"_2").trigger("click"); return false; } } if(e.which === 27) { if(!checkUpdates()) return false; if(cle) hideModal(this,{gb:p.gbox,jqm:p.jqModal, onClose: rp_ge.onClose}); return false; } if(rp_ge.navkeys[0]===true) { if($("#id_g","#"+frmtb).val() == "_empty") return true; if(e.which == rp_ge.navkeys[1]){ //up $("#pData", "#"+frmtb+"_2").trigger("click"); return false; } if(e.which == rp_ge.navkeys[2]){ //down $("#nData", "#"+frmtb+"_2").trigger("click"); return false; } } }); if(p.checkOnUpdate) { $("a.ui-jqdialog-titlebar-close span","#"+IDs.themodal).removeClass("jqmClose"); $("a.ui-jqdialog-titlebar-close","#"+IDs.themodal).unbind("click") .click(function(){ if(!checkUpdates()) return false; hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal,onClose: rp_ge.onClose}); return false; }); } p.saveicon = $.extend([true,"left","ui-icon-disk"],p.saveicon); p.closeicon = $.extend([true,"left","ui-icon-close"],p.closeicon); // beforeinitdata after creation of the form if(p.saveicon[0]==true) { $("#sData","#"+frmtb+"_2").addClass(p.saveicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.saveicon[2]+"'></span>"); } if(p.closeicon[0]==true) { $("#cData","#"+frmtb+"_2").addClass(p.closeicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.closeicon[2]+"'></span>"); } if(rp_ge.checkOnSubmit || rp_ge.checkOnUpdate) { bS ="<a href='javascript:void(0)' id='sNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>"+p.bYes+"</a>"; bN ="<a href='javascript:void(0)' id='nNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>"+p.bNo+"</a>"; bC ="<a href='javascript:void(0)' id='cNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>"+p.bExit+"</a>"; var ii, zI = p.zIndex || 999; zI ++; if ($.browser.msie && $.browser.version ==6) { ii = '<iframe style="display:block;position:absolute;z-index:-1;filter:Alpha(Opacity=\'0\');" src="javascript:false;"></iframe>'; } else { ii="";} $("<div class='ui-widget-overlay jqgrid-overlay confirm' style='z-index:"+zI+";display:none;'> "+ii+"</div><div class='confirm ui-widget-content ui-jqconfirm' style='z-index:"+(zI+1)+"'>"+p.saveData+"<br/><br/>"+bS+bN+bC+"</div>").insertAfter("#"+frmgr); $("#sNew","#"+IDs.themodal).click(function(){ postIt(); $("#"+frmgr).data("disabled",false); $(".confirm","#"+IDs.themodal).hide(); return false; }); $("#nNew","#"+IDs.themodal).click(function(){ $(".confirm","#"+IDs.themodal).hide(); $("#"+frmgr).data("disabled",false); setTimeout(function(){$(":input","#"+frmgr)[0].focus();},0); return false; }); $("#cNew","#"+IDs.themodal).click(function(){ $(".confirm","#"+IDs.themodal).hide(); $("#"+frmgr).data("disabled",false); hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal,onClose: rp_ge.onClose}); return false; }); } // here initform - only once if(onInitializeForm) { onInitializeForm($("#"+frmgr)); } if(rowid=="_empty" || !rp_ge.viewPagerButtons) { $("#pData,#nData","#"+frmtb+"_2").hide(); } else { $("#pData,#nData","#"+frmtb+"_2").show(); } if(onBeforeShow) { onBeforeShow($("#"+frmgr)); } $("#"+IDs.themodal).data("onClose",rp_ge.onClose); viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal,closeoverlay:closeovrl,modal:p.modal}); if(!closeovrl) { $(".jqmOverlay").click(function(){ if(!checkUpdates()) return false; hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: rp_ge.onClose}); return false; }); } if(onAfterShow) { onAfterShow($("#"+frmgr)); } $(".fm-button","#"+IDs.themodal).hover( function(){$(this).addClass('ui-state-hover');}, function(){$(this).removeClass('ui-state-hover');} ); $("#sData", "#"+frmtb+"_2").click(function(e){ postdata = {}; extpost={}; $("#FormError","#"+frmtb).hide(); // all depend on ret array //ret[0] - succes //ret[1] - msg if not succes //ret[2] - the id that will be set if reload after submit false getFormData(); if(postdata[$t.p.id+"_id"] == "_empty") postIt(); else if(p.checkOnSubmit===true ) { newData = $.extend({},postdata,extpost); diff = compareData(newData,rp_ge._savedData); if(diff) { $("#"+frmgr).data("disabled",true); $(".confirm","#"+IDs.themodal).show(); } else { postIt(); } } else { postIt(); } return false; }); $("#cData", "#"+frmtb+"_2").click(function(e){ if(!checkUpdates()) return false; hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal,onClose: rp_ge.onClose}); return false; }); $("#nData", "#"+frmtb+"_2").click(function(e){ if(!checkUpdates()) return false; $("#FormError","#"+frmtb).hide(); var npos = getCurrPos(); npos[0] = parseInt(npos[0]); if(npos[0] != -1 && npos[1][npos[0]+1]) { if($.isFunction(p.onclickPgButtons)) { p.onclickPgButtons('next',$("#"+frmgr),npos[1][npos[0]]); } fillData(npos[1][npos[0]+1],$t,frmgr); $($t).jqGrid("setSelection",npos[1][npos[0]+1]); if($.isFunction(p.afterclickPgButtons)) { p.afterclickPgButtons('next',$("#"+frmgr),npos[1][npos[0]+1]); } updateNav(npos[0]+1,npos[1].length-1); }; return false; }); $("#pData", "#"+frmtb+"_2").click(function(e){ if(!checkUpdates()) return false; $("#FormError","#"+frmtb).hide(); var ppos = getCurrPos(); if(ppos[0] != -1 && ppos[1][ppos[0]-1]) { if($.isFunction(p.onclickPgButtons)) { p.onclickPgButtons('prev',$("#"+frmgr),ppos[1][ppos[0]]); } fillData(ppos[1][ppos[0]-1],$t,frmgr); $($t).jqGrid("setSelection",ppos[1][ppos[0]-1]); if($.isFunction(p.afterclickPgButtons)) { p.afterclickPgButtons('prev',$("#"+frmgr),ppos[1][ppos[0]-1]); } updateNav(ppos[0]-1,ppos[1].length-1); }; return false; }); } var posInit =getCurrPos(); updateNav(posInit[0],posInit[1].length-1); function updateNav(cr,totr,rid){ if (cr==0) { $("#pData","#"+frmtb+"_2").addClass('ui-state-disabled'); } else { $("#pData","#"+frmtb+"_2").removeClass('ui-state-disabled'); } if (cr==totr) { $("#nData","#"+frmtb+"_2").addClass('ui-state-disabled'); } else { $("#nData","#"+frmtb+"_2").removeClass('ui-state-disabled'); } } function getCurrPos() { var rowsInGrid = $($t).jqGrid("getDataIDs"), selrow = $("#id_g","#"+frmtb).val(), pos = $.inArray(selrow,rowsInGrid); return [pos,rowsInGrid]; } function checkUpdates () { var stat = true; $("#FormError","#"+frmtb).hide(); if(rp_ge.checkOnUpdate) { postdata = {}; extpost={}; getFormData(); newData = $.extend({},postdata,extpost); diff = compareData(newData,rp_ge._savedData); if(diff) { $("#"+frmgr).data("disabled",true); $(".confirm","#"+IDs.themodal).show(); stat = false; } } return stat; } function getFormData(){ $(".FormElement", "#"+frmtb).each(function(i) { var celm = $(".customelement", this); if (celm.length) { var elem = celm[0], nm = elem.name; $.each($t.p.colModel, function(i,n){ if(this.name == nm && this.editoptions && $.isFunction(this.editoptions.custom_value)) { try { postdata[nm] = this.editoptions.custom_value($("#"+nm,"#"+frmtb),'get'); if (postdata[nm] === undefined) throw "e1"; } catch (e) { if (e=="e1") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.novalue,jQuery.jgrid.edit.bClose); else info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose); } return true; } }); } else { switch ($(this).get(0).type) { case "checkbox": if($(this).attr("checked")) { postdata[this.name]= $(this).val(); }else { var ofv = $(this).attr("offval"); postdata[this.name]= ofv; } break; case "select-one": postdata[this.name]= $("option:selected",this).val(); extpost[this.name]= $("option:selected",this).text(); break; case "select-multiple": postdata[this.name]= $(this).val(); if(postdata[this.name]) postdata[this.name] = postdata[this.name].join(","); else postdata[this.name] =""; var selectedText = []; $("option:selected",this).each( function(i,selected){ selectedText[i] = $(selected).text(); } ); extpost[this.name]= selectedText.join(","); break; case "password": case "text": case "textarea": case "button": postdata[this.name] = $(this).val(); break; } if($t.p.autoencode) postdata[this.name] = $.jgrid.htmlEncode(postdata[this.name]); } }); return true; } function createData(rowid,obj,tb,maxcols){ var nm, hc,trdata, cnt=0,tmp, dc,elc, retpos=[], ind=false, rp,cp, tdtmpl = "<td class='CaptionTD ui-widget-content'> </td><td class='DataTD ui-widget-content' style='white-space:pre'> </td>", tmpl=""; //*2 for (var i =1;i<=maxcols;i++) { tmpl += tdtmpl; } if(rowid != '_empty') { ind = $(obj).jqGrid("getInd",rowid); } $(obj.p.colModel).each( function(i) { nm = this.name; // hidden fields are included in the form if(this.editrules && this.editrules.edithidden == true) { hc = false; } else { hc = this.hidden === true ? true : false; } dc = hc ? "style='display:none'" : ""; if ( nm !== 'cb' && nm !== 'subgrid' && this.editable===true && nm !== 'rn') { if(ind === false) { tmp = ""; } else { if(nm == obj.p.ExpandColumn && obj.p.treeGrid === true) { tmp = $("td:eq("+i+")",obj.rows[ind]).text(); } else { try { tmp = $.unformat($("td:eq("+i+")",obj.rows[ind]),{rowId:rowid, colModel:this},i); } catch (_) { tmp = $("td:eq("+i+")",obj.rows[ind]).html(); } } } var opt = $.extend({}, this.editoptions || {} ,{id:nm,name:nm}); frmopt = $.extend({}, {elmprefix:'',elmsuffix:'',rowabove:false,rowcontent:''}, this.formoptions || {}), rp = parseInt(frmopt.rowpos) || cnt+1, cp = parseInt((parseInt(frmopt.colpos) || 1)*2); if(rowid == "_empty" && opt.defaultValue ) { tmp = $.isFunction(opt.defaultValue) ? opt.defaultValue() : opt.defaultValue; } if(!this.edittype) this.edittype = "text"; if($t.p.autoencode) tmp = $.jgrid.htmlDecode(tmp); elc = createEl(this.edittype,opt,tmp,false,$.extend({},$.jgrid.ajaxOptions,obj.p.ajaxSelectOptions || {})); if(tmp == "" && this.edittype == "checkbox") {tmp = $(elc).attr("offval");} if(rp_ge.checkOnSubmit || rp_ge.checkOnUpdate) rp_ge._savedData[nm] = tmp; $(elc).addClass("FormElement"); trdata = $(tb).find("tr[rowpos="+rp+"]"); if(frmopt.rowabove) { var newdata = $("<tr><td class='contentinfo' colspan='"+(maxcols*2)+"'>"+frmopt.rowcontent+"</td></tr>"); $(tb).append(newdata); newdata[0].rp = rp; } if ( trdata.length==0 ) { trdata = $("<tr "+dc+" rowpos='"+rp+"'></tr>").addClass("FormData").attr("id","tr_"+nm); $(trdata).append(tmpl); $(tb).append(trdata); trdata[0].rp = rp; } $("td:eq("+(cp-2)+")",trdata[0]).html( typeof frmopt.label === 'undefined' ? obj.p.colNames[i]: frmopt.label); $("td:eq("+(cp-1)+")",trdata[0]).append(frmopt.elmprefix).append(elc).append(frmopt.elmsuffix); retpos[cnt] = i; cnt++; }; }); if( cnt > 0) { var idrow = $("<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='"+ (maxcols*2-1)+"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='"+obj.p.id+"_id' value='"+rowid+"'/></td></tr>"); idrow[0].rp = cnt+999; $(tb).append(idrow); if(rp_ge.checkOnSubmit || rp_ge.checkOnUpdate) rp_ge._savedData.id = rowid; } return retpos; } function fillData(rowid,obj,fmid){ var nm, hc,cnt=0,tmp, fld,opt,vl,vlc; if(rp_ge.checkOnSubmit || rp_ge.checkOnUpdate) {rp_ge._savedData = {};rp_ge._savedData.id=rowid;} var cm = obj.p.colModel; if(rowid == '_empty') { $(cm).each(function(i){ nm = this.name; opt = $.extend({}, this.editoptions || {} ); fld = $("#"+$.jgrid.jqID(nm),"#"+fmid); if(fld[0] != null) { vl = ""; if(opt.defaultValue ) { vl = $.isFunction(opt.defaultValue) ? opt.defaultValue() : opt.defaultValue; if(fld[0].type=='checkbox') { vlc = vl.toLowerCase(); if(vlc.search(/(false|0|no|off|undefined)/i)<0 && vlc!=="") { fld[0].checked = true; fld[0].defaultChecked = true; fld[0].value = vl; } else { fld.attr({checked:"",defaultChecked:""}); } } else {fld.val(vl); } } else { if( fld[0].type=='checkbox' ) { fld[0].checked = false; fld[0].defaultChecked = false; vl = $(fld).attr("offval"); } else if (fld[0].type.substr(0,6)=='select') { fld[0].selectedIndex = 0; } else { fld.val(vl); } } if(rp_ge.checkOnSubmit===true || rp_ge.checkOnUpdate) rp_ge._savedData[nm] = vl; } }); $("#id_g","#"+fmid).val(rowid); return; } var tre = $(obj).jqGrid("getInd",rowid,true); if(!tre) return; $('td',tre).each( function(i) { nm = cm[i].name; // hidden fields are included in the form if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn' && cm[i].editable===true) { if(nm == obj.p.ExpandColumn && obj.p.treeGrid === true) { tmp = $(this).text(); } else { try { tmp = $.unformat(this,{rowId:rowid, colModel:cm[i]},i); } catch (_) { tmp = $(this).html(); } } if($t.p.autoencode) tmp = $.jgrid.htmlDecode(tmp); if(rp_ge.checkOnSubmit===true || rp_ge.checkOnUpdate) rp_ge._savedData[nm] = tmp; nm = $.jgrid.jqID(nm); switch (cm[i].edittype) { case "password": case "text": case "button" : case "image": $("#"+nm,"#"+fmid).val(tmp); break; case "textarea": if(tmp == " " || tmp == " " || (tmp.length==1 && tmp.charCodeAt(0)==160) ) {tmp='';} $("#"+nm,"#"+fmid).val(tmp); break; case "select": var opv = tmp.split(","); opv = $.map(opv,function(n){return $.trim(n)}); $("#"+nm+" option","#"+fmid).each(function(j){ if (!cm[i].editoptions.multiple && (opv[0] == $(this).text() || opv[0] == $(this).val()) ){ this.selected= true; } else if (cm[i].editoptions.multiple){ if( $.inArray($(this).text(), opv ) > -1 || $.inArray($(this).val(), opv ) > -1 ){ this.selected = true; }else{ this.selected = false; } } else { this.selected = false; } }); break; case "checkbox": tmp = tmp+""; tmp = tmp.toLowerCase(); if(tmp.search(/(false|0|no|off|undefined)/i)<0 && tmp!=="") { $("#"+nm,"#"+fmid).attr("checked",true); $("#"+nm,"#"+fmid).attr("defaultChecked",true); //ie } else { $("#"+nm,"#"+fmid).attr("checked",false); $("#"+nm,"#"+fmid).attr("defaultChecked",""); //ie } break; case 'custom' : try { if(cm[i].editoptions && $.isFunction(cm[i].editoptions.custom_value)) { var dummy = cm[i].editoptions.custom_value($("#"+nm,"#"+fmid),'set',tmp); } else throw "e1"; } catch (e) { if (e=="e1") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.nodefined,jQuery.jgrid.edit.bClose); else info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose); } break; } cnt++; } }); if(cnt>0) { $("#id_g","#"+frmtb).val(rowid); } } function postIt() { var copydata, ret=[true,"",""], onCS = {}, opers = $t.p.prmNames, idname, oper; if($.isFunction(rp_ge.beforeCheckValues)) { var retvals = rp_ge.beforeCheckValues(postdata,$("#"+frmgr),postdata[$t.p.id+"_id"] == "_empty" ? opers.addoper : opers.editoper); if(retvals && typeof(retvals) === 'object') postdata = retvals; } for( var key in postdata ){ ret = checkValues(postdata[key],key,$t); if(ret[0] == false) break; } if(ret[0]) { if( $.isFunction( rp_ge.onclickSubmit)) { onCS = rp_ge.onclickSubmit(rp_ge,postdata) || {}; } if( $.isFunction(rp_ge.beforeSubmit)) { ret = rp_ge.beforeSubmit(postdata,$("#"+frmgr)); } } gurl = rp_ge.url ? rp_ge.url : $($t).jqGrid('getGridParam','editurl'); if(ret[0]) { if(!gurl) { ret[0]=false; ret[1] += " "+$.jgrid.errors.nourl; } } if(ret[0] === false) { $("#FormError>td","#"+frmtb).html(ret[1]); $("#FormError","#"+frmtb).show(); return; } if(!rp_ge.processing) { rp_ge.processing = true; $("#sData", "#"+frmtb+"_2").addClass('ui-state-active'); oper = opers.oper; idname = opers.id; // we add to pos data array the action - the name is oper postdata[oper] = ($.trim(postdata[$t.p.id+"_id"]) == "_empty") ? opers.addoper : opers.editoper; if(postdata[oper] != opers.addoper) postdata[idname] = postdata[$t.p.id+"_id"]; else { // check to see if we have allredy this field in the form and if yes lieve it if( postdata[idname] === undefined ) postdata[idname] = postdata[$t.p.id+"_id"]; } delete postdata[$t.p.id+"_id"]; postdata = $.extend(postdata,rp_ge.editData,onCS); $.ajax( $.extend({ url:gurl, type: rp_ge.mtype, data: $.isFunction(rp_ge.serializeEditData) ? rp_ge.serializeEditData(postdata) : postdata, complete:function(data,Status){ if(Status != "success") { ret[0] = false; if ($.isFunction(rp_ge.errorTextFormat)) { ret[1] = rp_ge.errorTextFormat(data); } else { ret[1] = Status + " Status: '" + data.statusText + "'. Error code: " + data.status; } } else { // data is posted successful // execute aftersubmit with the returned data from server if( $.isFunction(rp_ge.afterSubmit) ) { ret = rp_ge.afterSubmit(data,postdata); } } if(ret[0] === false) { $("#FormError>td","#"+frmtb).html(ret[1]); $("#FormError","#"+frmtb).show(); } else { // remove some values if formattaer select or checkbox $.each($t.p.colModel, function(i,n){ if(extpost[this.name] && this.formatter && this.formatter=='select') { try {delete extpost[this.name];} catch (e) {} } }); postdata = $.extend(postdata,extpost); if($t.p.autoencode) { $.each(postdata,function(n,v){ postdata[n] = $.jgrid.htmlDecode(v); }); } // the action is add if(postdata[oper] == opers.addoper ) { //id processing // user not set the id ret[2] if(!ret[2]) { ret[2] = parseInt($t.p.records)+1; } postdata[idname] = ret[2]; if(rp_ge.closeAfterAdd) { if(rp_ge.reloadAfterSubmit) { $($t).trigger("reloadGrid"); } else { $($t).jqGrid("addRowData",ret[2],postdata,p.addedrow); $($t).jqGrid("setSelection",ret[2]); } hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal,onClose: rp_ge.onClose}); } else if (rp_ge.clearAfterAdd) { if(rp_ge.reloadAfterSubmit) { $($t).trigger("reloadGrid"); } else { $($t).jqGrid("addRowData",ret[2],postdata,p.addedrow); } fillData("_empty",$t,frmgr); } else { if(rp_ge.reloadAfterSubmit) { $($t).trigger("reloadGrid"); } else { $($t).jqGrid("addRowData",ret[2],postdata,p.addedrow); } } } else { // the action is update if(rp_ge.reloadAfterSubmit) { $($t).trigger("reloadGrid"); if( !rp_ge.closeAfterEdit ) { setTimeout(function(){$($t).jqGrid("setSelection",postdata[idname]);},1000); } } else { if($t.p.treeGrid === true) { $($t).jqGrid("setTreeRow",postdata[idname],postdata); } else { $($t).jqGrid("setRowData",postdata[idname],postdata); } } if(rp_ge.closeAfterEdit) { hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal,onClose: rp_ge.onClose}); } } if($.isFunction(rp_ge.afterComplete)) { copydata = data; setTimeout(function(){rp_ge.afterComplete(copydata,postdata,$("#"+frmgr));copydata=null;},500); } } rp_ge.processing=false; if(rp_ge.checkOnSubmit || rp_ge.checkOnUpdate) { $("#"+frmgr).data("disabled",false); if(rp_ge._savedData.id !="_empty") rp_ge._savedData = postdata; } $("#sData", "#"+frmtb+"_2").removeClass('ui-state-active'); try{$(':input:visible',"#"+frmgr)[0].focus();} catch (e){} }, error:function(xhr,st,err){ $("#FormError>td","#"+frmtb).html(st+ " : "+err); $("#FormError","#"+frmtb).show(); rp_ge.processing=false; $("#"+frmgr).data("disabled",false); $("#sData", "#"+frmtb+"_2").removeClass('ui-state-active'); } }, $.jgrid.ajaxOptions, rp_ge.ajaxEditOptions )); } } function compareData(nObj, oObj ) { var ret = false,key; for (key in nObj) { if(nObj[key] != oObj[key]) { ret = true; break; } } return ret; } }); }, viewGridRow : function(rowid, p){ p = $.extend({ top : 0, left: 0, width: 0, height: 'auto', dataheight: 'auto', modal: false, drag: true, resize: true, jqModal: true, closeOnEscape : false, labelswidth: '30%', closeicon: [], navkeys: [false,38,40], onClose: null, beforeShowForm : null, viewPagerButtons : true }, $.jgrid.view, p || {}); return this.each(function(){ var $t = this; if (!$t.grid || !rowid) { return; } if(!p.imgpath) { p.imgpath= $t.p.imgpath; } // I hate to rewrite code, but ... var gID = $t.p.id, frmgr = "ViewGrid_"+gID , frmtb = "ViewTbl_"+gID, IDs = {themodal:'viewmod'+gID,modalhead:'viewhd'+gID,modalcontent:'viewcnt'+gID, scrollelm : frmgr}, maxCols = 1, maxRows=0; if ( $("#"+IDs.themodal).html() != null ) { $(".ui-jqdialog-title","#"+IDs.modalhead).html(p.caption); $("#FormError","#"+frmtb).hide(); fillData(rowid,$t); if($.isFunction(p.beforeShowForm)) p.beforeShowForm($("#"+frmgr)); viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, jqM: false, modal:p.modal}); focusaref(); } else { $($t.p.colModel).each( function(i) { var fmto = this.formoptions; maxCols = Math.max(maxCols, fmto ? fmto.colpos || 0 : 0 ); maxRows = Math.max(maxRows, fmto ? fmto.rowpos || 0 : 0 ); }); var dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+"px"; var flr, frm = $("<form name='FormPost' id='"+frmgr+"' class='FormGrid' style='width:100%;overflow:auto;position:relative;height:"+dh+";'></form>"), tbl =$("<table id='"+frmtb+"' class='EditTable' cellspacing='1' cellpading='2' border='0' style='table-layout:fixed'><tbody></tbody></table>"); // set the id. $(frm).append(tbl); var valref = createData(rowid, $t, tbl, maxCols), rtlb = $t.p.direction == "rtl" ? true :false, bp = rtlb ? "nData" : "pData", bn = rtlb ? "pData" : "nData", // buttons at footer bP = "<a href='javascript:void(0)' id='"+bp+"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></div>", bN = "<a href='javascript:void(0)' id='"+bn+"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></div>", bC ="<a href='javascript:void(0)' id='cData' class='fm-button ui-state-default ui-corner-all'>"+p.bClose+"</a>"; if(maxRows > 0) { var sd=[]; $.each($(tbl)[0].rows,function(i,r){ sd[i] = r; }); sd.sort(function(a,b){ if(a.rp > b.rp) {return 1;} if(a.rp < b.rp) {return -1;} return 0; }); $.each(sd, function(index, row) { $('tbody',tbl).append(row); }); } p.gbox = "#gbox_"+gID; var cle = false; if(p.closeOnEscape===true){ p.closeOnEscape = false; cle = true; } var bt = $("<span></span>").append(frm).append("<table border='0' class='EditTable' id='"+frmtb+"_2'><tbody><tr id='Act_Buttons'><td class='navButton ui-widget-content' width='"+p.labelswidth+"'>"+(rtlb ? bN+bP : bP+bN)+"</td><td class='EditButton ui-widget-content'>"+bC+"</td></tr></tbody></table>"); createModal(IDs,bt,p,"#gview_"+$t.p.id,$("#gview_"+$t.p.id)[0]); if(rtlb) { $("#pData, #nData","#"+frmtb+"_2").css("float","right"); $(".EditButton","#"+frmtb+"_2").css("text-align","left"); } if(!p.viewPagerButtons) $("#pData, #nData","#"+frmtb+"_2").hide(); bt = null; $("#"+IDs.themodal).keydown( function( e ) { if(e.which === 27) { if(cle) hideModal(this,{gb:p.gbox,jqm:p.jqModal, onClose: p.onClose}); return false; } if(p.navkeys[0]===true) { if(e.which === p.navkeys[1]){ //up $("#pData", "#"+frmtb+"_2").trigger("click"); return false; } if(e.which === p.navkeys[2]){ //down $("#nData", "#"+frmtb+"_2").trigger("click"); return false; } } }); p.closeicon = $.extend([true,"left","ui-icon-close"],p.closeicon); if(p.closeicon[0]==true) { $("#cData","#"+frmtb+"_2").addClass(p.closeicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.closeicon[2]+"'></span>"); } if($.isFunction(p.beforeShowForm)) p.beforeShowForm($("#"+frmgr)); viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, modal:p.modal}); $(".fm-button:not(.ui-state-disabled)","#"+frmtb+"_2").hover( function(){$(this).addClass('ui-state-hover');}, function(){$(this).removeClass('ui-state-hover');} ); focusaref(); $("#cData", "#"+frmtb+"_2").click(function(e){ hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: p.onClose}); return false; }); $("#nData", "#"+frmtb+"_2").click(function(e){ $("#FormError","#"+frmtb).hide(); var npos = getCurrPos(); npos[0] = parseInt(npos[0]); if(npos[0] != -1 && npos[1][npos[0]+1]) { if($.isFunction(p.onclickPgButtons)) { p.onclickPgButtons('next',$("#"+frmgr),npos[1][npos[0]]); } fillData(npos[1][npos[0]+1],$t); $($t).jqGrid("setSelection",npos[1][npos[0]+1]); if($.isFunction(p.afterclickPgButtons)) { p.afterclickPgButtons('next',$("#"+frmgr),npos[1][npos[0]+1]); } updateNav(npos[0]+1,npos[1].length-1); }; focusaref(); return false; }); $("#pData", "#"+frmtb+"_2").click(function(e){ $("#FormError","#"+frmtb).hide(); var ppos = getCurrPos(); if(ppos[0] != -1 && ppos[1][ppos[0]-1]) { if($.isFunction(p.onclickPgButtons)) { p.onclickPgButtons('prev',$("#"+frmgr),ppos[1][ppos[0]]); } fillData(ppos[1][ppos[0]-1],$t); $($t).jqGrid("setSelection",ppos[1][ppos[0]-1]); if($.isFunction(p.afterclickPgButtons)) { p.afterclickPgButtons('prev',$("#"+frmgr),ppos[1][ppos[0]-1]); } updateNav(ppos[0]-1,ppos[1].length-1); }; focusaref(); return false; }); }; function focusaref(){ //Sfari 3 issues if(p.closeOnEscape===true || p.navkeys[0]===true) { setTimeout(function(){$(".ui-jqdialog-titlebar-close","#"+IDs.modalhead).focus()},0); } } var posInit =getCurrPos(); updateNav(posInit[0],posInit[1].length-1); function updateNav(cr,totr,rid){ if (cr==0) { $("#pData","#"+frmtb+"_2").addClass('ui-state-disabled'); } else { $("#pData","#"+frmtb+"_2").removeClass('ui-state-disabled'); } if (cr==totr) { $("#nData","#"+frmtb+"_2").addClass('ui-state-disabled'); } else { $("#nData","#"+frmtb+"_2").removeClass('ui-state-disabled'); } } function getCurrPos() { var rowsInGrid = $($t).jqGrid("getDataIDs"), selrow = $("#id_g","#"+frmtb).val(), pos = $.inArray(selrow,rowsInGrid); return [pos,rowsInGrid]; } function createData(rowid,obj,tb,maxcols){ var nm, hc,trdata, tdl, tde, cnt=0,tmp, dc, retpos=[], ind=false, tdtmpl = "<td class='CaptionTD form-view-label ui-widget-content' width='"+p.labelswidth+"'> </td><td class='DataTD form-view-data ui-helper-reset ui-widget-content'> </td>", tmpl="", tdtmpl2 = "<td class='CaptionTD form-view-label ui-widget-content'> </td><td class='DataTD form-view-data ui-widget-content'> </td>", fmtnum = ['integer','number','currency'],max1 =0, max2=0 ,maxw,setme, viewfld; for (var i =1;i<=maxcols;i++) { tmpl += i == 1 ? tdtmpl : tdtmpl2; } // find max number align rigth with property formatter $(obj.p.colModel).each( function(i) { if(this.editrules && this.editrules.edithidden === true) { hc = false; } else { hc = this.hidden === true ? true : false; } if(!hc && this.align==='right') { if(this.formatter && $.inArray(this.formatter,fmtnum) !== -1 ) { max1 = Math.max(max1,parseInt(this.width,10)); } else { max2 = Math.max(max2,parseInt(this.width,10)); } } }); maxw = max1 !==0 ? max1 : max2 !==0 ? max2 : 0; ind = $(obj).jqGrid("getInd",rowid); $(obj.p.colModel).each( function(i) { nm = this.name; setme = false; // hidden fields are included in the form if(this.editrules && this.editrules.edithidden === true) { hc = false; } else { hc = this.hidden === true ? true : false; } dc = hc ? "style='display:none'" : ""; viewfld = (typeof this.viewable != 'boolean') ? true : this.viewable; if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn' && viewfld) { if(ind === false) { tmp = ""; } else { if(nm == obj.p.ExpandColumn && obj.p.treeGrid === true) { tmp = $("td:eq("+i+")",obj.rows[ind]).text(); } else { tmp = $("td:eq("+i+")",obj.rows[ind]).html(); } } setme = this.align === 'right' && maxw !==0 ? true : false; var opt = $.extend({}, this.editoptions || {} ,{id:nm,name:nm}), frmopt = $.extend({},{rowabove:false,rowcontent:''}, this.formoptions || {}), rp = parseInt(frmopt.rowpos) || cnt+1, cp = parseInt((parseInt(frmopt.colpos) || 1)*2); if(frmopt.rowabove) { var newdata = $("<tr><td class='contentinfo' colspan='"+(maxcols*2)+"'>"+frmopt.rowcontent+"</td></tr>"); $(tb).append(newdata); newdata[0].rp = rp; } trdata = $(tb).find("tr[rowpos="+rp+"]"); if ( trdata.length==0 ) { trdata = $("<tr "+dc+" rowpos='"+rp+"'></tr>").addClass("FormData").attr("id","trv_"+nm); $(trdata).append(tmpl); $(tb).append(trdata); trdata[0].rp = rp; } $("td:eq("+(cp-2)+")",trdata[0]).html('<b>'+ (typeof frmopt.label === 'undefined' ? obj.p.colNames[i]: frmopt.label)+'</b>'); $("td:eq("+(cp-1)+")",trdata[0]).append("<span>"+tmp+"</span>").attr("id","v_"+nm); if(setme){ $("td:eq("+(cp-1)+") span",trdata[0]).css({'text-align':'right',width:maxw+"px"}); } retpos[cnt] = i; cnt++; }; }); if( cnt > 0) { var idrow = $("<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='"+ (maxcols*2-1)+"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='id' value='"+rowid+"'/></td></tr>"); idrow[0].rp = cnt+99; $(tb).append(idrow); } return retpos; }; function fillData(rowid,obj){ var nm, hc,cnt=0,tmp, opt,trv; trv = $(obj).jqGrid("getInd",rowid,true); if(!trv) return; $('td',trv).each( function(i) { nm = obj.p.colModel[i].name; // hidden fields are included in the form if(obj.p.colModel[i].editrules && obj.p.colModel[i].editrules.edithidden === true) { hc = false; } else { hc = obj.p.colModel[i].hidden === true ? true : false; } if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') { if(nm == obj.p.ExpandColumn && obj.p.treeGrid === true) { tmp = $(this).text(); } else { tmp = $(this).html(); } opt = $.extend({},obj.p.colModel[i].editoptions || {}); nm = $.jgrid.jqID("v_"+nm); $("#"+nm+" span","#"+frmtb).html(tmp); if (hc) { $("#"+nm,"#"+frmtb).parents("tr:first").hide(); } cnt++; } }); if(cnt>0) { $("#id_g","#"+frmtb).val(rowid); } }; }); }, delGridRow : function(rowids,p) { p = $.extend({ top : 0, left: 0, width: 240, height: 'auto', dataheight : 'auto', modal: false, drag: true, resize: true, url : '', mtype : "POST", reloadAfterSubmit: true, beforeShowForm: null, afterShowForm: null, beforeSubmit: null, onclickSubmit: null, afterSubmit: null, jqModal : true, closeOnEscape : false, delData: {}, delicon : [], cancelicon : [], onClose : null, ajaxDelOptions : {}, processing : false, serializeDelData : null }, $.jgrid.del, p ||{}); rp_ge = p; return this.each(function(){ var $t = this; if (!$t.grid ) { return; } if(!rowids) { return; } var onBeforeShow = typeof p.beforeShowForm === 'function' ? true: false, onAfterShow = typeof p.afterShowForm === 'function' ? true: false, gID = $t.p.id, onCS = {}, dtbl = "DelTbl_"+gID,postd, idname, opers, oper, IDs = {themodal:'delmod'+gID,modalhead:'delhd'+gID,modalcontent:'delcnt'+gID, scrollelm: dtbl}; if (isArray(rowids)) { rowids = rowids.join(); } if ( $("#"+IDs.themodal).html() != null ) { $("#DelData>td","#"+dtbl).text(rowids); $("#DelError","#"+dtbl).hide(); if( rp_ge.processing === true) { rp_ge.processing=false; $("#dData", "#"+dtbl).removeClass('ui-state-active'); } if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); } viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal,jqM: false, modal:p.modal}); if(onAfterShow) { p.afterShowForm($("#"+dtbl)); } } else { var dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+"px"; var tbl = "<div id='"+dtbl+"' class='formdata' style='width:100%;overflow:auto;position:relative;height:"+dh+";'>"; tbl += "<table class='DelTable'><tbody>"; // error data tbl += "<tr id='DelError' style='display:none'><td class='ui-state-error'></td></tr>"; tbl += "<tr id='DelData' style='display:none'><td >"+rowids+"</td></tr>"; tbl += "<tr><td class=\"delmsg\" style=\"white-space:pre;\">"+p.msg+"</td></tr><tr><td > </td></tr>"; // buttons at footer tbl += "</tbody></table></div>" var bS = "<a href='javascript:void(0)' id='dData' class='fm-button ui-state-default ui-corner-all'>"+p.bSubmit+"</a>", bC = "<a href='javascript:void(0)' id='eData' class='fm-button ui-state-default ui-corner-all'>"+p.bCancel+"</a>"; tbl += "<table cellspacing='0' cellpadding='0' border='0' class='EditTable' id='"+dtbl+"_2'><tbody><tr><td class='DataTD ui-widget-content'></td></tr><tr style='display:block;height:3px;'><td></td></tr><tr><td class='DelButton EditButton'>"+bS+" "+bC+"</td></tr></tbody></table>"; p.gbox = "#gbox_"+gID; createModal(IDs,tbl,p,"#gview_"+$t.p.id,$("#gview_"+$t.p.id)[0]); $(".fm-button","#"+dtbl+"_2").hover( function(){$(this).addClass('ui-state-hover');}, function(){$(this).removeClass('ui-state-hover');} ); p.delicon = $.extend([true,"left","ui-icon-scissors"],p.delicon); p.cancelicon = $.extend([true,"left","ui-icon-cancel"],p.cancelicon); if(p.delicon[0]==true) { $("#dData","#"+dtbl+"_2").addClass(p.delicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.delicon[2]+"'></span>"); } if(p.cancelicon[0]==true) { $("#eData","#"+dtbl+"_2").addClass(p.cancelicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.cancelicon[2]+"'></span>"); } $("#dData","#"+dtbl+"_2").click(function(e){ var ret=[true,""]; onCS = {}; var postdata = $("#DelData>td","#"+dtbl).text(); //the pair is name=val1,val2,... if( typeof p.onclickSubmit === 'function' ) { onCS = p.onclickSubmit(rp_ge) || {}; } if( typeof p.beforeSubmit === 'function' ) { ret = p.beforeSubmit(postdata); } if(ret[0]){ var gurl = rp_ge.url ? rp_ge.url : $($t).jqGrid('getGridParam','editurl'); if(!gurl) { ret[0]=false;ret[1] += " "+$.jgrid.errors.nourl;} } if(ret[0] === false) { $("#DelError>td","#"+dtbl).html(ret[1]); $("#DelError","#"+dtbl).show(); } else { if(!rp_ge.processing) { rp_ge.processing = true; $(this).addClass('ui-state-active'); opers = $t.p.prmNames; postd = $.extend({},rp_ge.delData, onCS); oper = opers.oper; postd[oper] = opers.deloper; idname = opers.id; postd[idname] = postdata; $.ajax( $.extend({ url:gurl, type: p.mtype, data: $.isFunction(p.serializeDelData) ? p.serializeDelData(postd) : postd, complete:function(data,Status){ if(Status != "success") { ret[0] = false; if ($.isFunction(rp_ge.errorTextFormat)) { ret[1] = rp_ge.errorTextFormat(data); } else { ret[1] = Status + " Status: '" + data.statusText + "'. Error code: " + data.status; } } else { // data is posted successful // execute aftersubmit with the returned data from server if( typeof rp_ge.afterSubmit === 'function' ) { ret = rp_ge.afterSubmit(data,postd); } } if(ret[0] === false) { $("#DelError>td","#"+dtbl).html(ret[1]); $("#DelError","#"+dtbl).show(); } else { if(rp_ge.reloadAfterSubmit) { $($t).trigger("reloadGrid"); } else { var toarr = []; toarr = postdata.split(","); if($t.p.treeGrid===true){ try {$($t).jqGrid("delTreeNode",toarr[0])} catch(e){} } else { for(var i=0;i<toarr.length;i++) { $($t).jqGrid("delRowData",toarr[i]); } } $t.p.selrow = null; $t.p.selarrrow = []; } if($.isFunction(rp_ge.afterComplete)) { setTimeout(function(){rp_ge.afterComplete(data,postdata);},500); } } rp_ge.processing=false; $("#dData", "#"+dtbl+"_2").removeClass('ui-state-active'); if(ret[0]) { hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: rp_ge.onClose}); } }, error:function(xhr,st,err){ $("#DelError>td","#"+dtbl).html(st+ " : "+err); $("#DelError","#"+dtbl).show(); rp_ge.processing=false; $("#dData", "#"+dtbl+"_2").removeClass('ui-state-active');; } }, $.jgrid.ajaxOptions, p.ajaxDelOptions)); } } return false; }); $("#eData", "#"+dtbl+"_2").click(function(e){ hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: rp_ge.onClose}); return false; }); if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); } viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal,modal:p.modal}); if(onAfterShow) { p.afterShowForm($("#"+dtbl)); } } if(p.closeOnEscape===true) { setTimeout(function(){$(".ui-jqdialog-titlebar-close","#"+IDs.modalhead).focus()},0); } }); }, navGrid : function (elem, o, pEdit,pAdd,pDel,pSearch, pView) { o = $.extend({ edit: true, editicon: "ui-icon-pencil", add: true, addicon:"ui-icon-plus", del: true, delicon:"ui-icon-trash", search: true, searchicon:"ui-icon-search", refresh: true, refreshicon:"ui-icon-refresh", refreshstate: 'firstpage', view: false, viewicon : "ui-icon-document", position : "left", closeOnEscape : true, beforeRefresh : null, afterRefresh : null, cloneToTop : false }, $.jgrid.nav, o ||{}); return this.each(function() { var alertIDs = {themodal:'alertmod',modalhead:'alerthd',modalcontent:'alertcnt'}, $t = this, vwidth, vheight, twd, tdw; if(!$t.grid || typeof elem != 'string') { return; } if ($("#"+alertIDs.themodal).html() == null) { if (typeof window.innerWidth != 'undefined') { vwidth = window.innerWidth, vheight = window.innerHeight } else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) { vwidth = document.documentElement.clientWidth, vheight = document.documentElement.clientHeight } else { vwidth=1024; vheight=768; } createModal(alertIDs,"<div>"+o.alerttext+"</div><span tabindex='0'><span tabindex='-1' id='jqg_alrt'></span></span>",{gbox:"#gbox_"+$t.p.id,jqModal:true,drag:true,resize:true,caption:o.alertcap,top:vheight/2-25,left:vwidth/2-100,width:200,height:'auto',closeOnEscape:o.closeOnEscape},"","",true); } var clone = 1; if(o.cloneToTop && $t.p.toppager) clone = 2; for(var i = 0; i<clone; i++) { var tbd, navtbl = $("<table cellspacing='0' cellpadding='0' border='0' class='ui-pg-table navtable' style='float:left;table-layout:auto;'><tbody><tr></tr></tbody></table>"), sep = "<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='ui-separator'></span></td>", pgid, elemids; if(i==0) { pgid = elem; elemids = $t.p.id; if(pgid == $t.p.toppager) { elemids += "_top"; clone = 1; } } else { pgid = $t.p.toppager; elemids = $t.p.id+"_top"; } if($t.p.direction == "rtl") $(navtbl).attr("dir","rtl").css("float","right"); if (o.add) { pAdd = pAdd || {}; tbd = $("<td class='ui-pg-button ui-corner-all'></td>"); $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.addicon+"'></span>"+o.addtext+"</div>"); $("tr",navtbl).append(tbd); $(tbd,navtbl) .attr({"title":o.addtitle || "",id : pAdd.id || "add_"+elemids}) .click(function(){ if (typeof o.addfunc == 'function') { o.addfunc(); } else { $($t).jqGrid("editGridRow","new",pAdd); } return false; }).hover(function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ); tbd = null; } if (o.edit) { tbd = $("<td class='ui-pg-button ui-corner-all'></td>"); pEdit = pEdit || {}; $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.editicon+"'></span>"+o.edittext+"</div>"); $("tr",navtbl).append(tbd); $(tbd,navtbl) .attr({"title":o.edittitle || "",id: pEdit.id || "edit_"+elemids}) .click(function(){ var sr = $t.p.selrow; if (sr) { if(typeof o.editfunc == 'function') { o.editfunc(sr); } else { $($t).jqGrid("editGridRow",sr,pEdit); } } else { viewModal("#"+alertIDs.themodal,{gbox:"#gbox_"+$t.p.id,jqm:true}); $("#jqg_alrt").focus(); } return false; }).hover( function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ); tbd = null; } if (o.view) { tbd = $("<td class='ui-pg-button ui-corner-all'></td>"); pView = pView || {}; $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.viewicon+"'></span>"+o.viewtext+"</div>"); $("tr",navtbl).append(tbd); $(tbd,navtbl) .attr({"title":o.viewtitle || "",id: pView.id || "view_"+elemids}) .click(function(){ var sr = $t.p.selrow; if (sr) { $($t).jqGrid("viewGridRow",sr,pView); } else { viewModal("#"+alertIDs.themodal,{gbox:"#gbox_"+$t.p.id,jqm:true}); $("#jqg_alrt").focus(); } return false; }).hover( function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ); tbd = null; } if (o.del) { tbd = $("<td class='ui-pg-button ui-corner-all'></td>"); pDel = pDel || {}; $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.delicon+"'></span>"+o.deltext+"</div>"); $("tr",navtbl).append(tbd); $(tbd,navtbl) .attr({"title":o.deltitle || "",id: pDel.id || "del_"+elemids}) .click(function(){ var dr; if($t.p.multiselect) { dr = $t.p.selarrrow; if(dr.length==0) { dr = null; } } else { dr = $t.p.selrow; } if (dr) { $($t).jqGrid("delGridRow",dr,pDel); } else {viewModal("#"+alertIDs.themodal,{gbox:"#gbox_"+$t.p.id,jqm:true}); $("#jqg_alrt").focus(); } return false; }).hover(function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ); tbd = null; } if(o.add || o.edit || o.del || o.view) { $("tr",navtbl).append(sep); } if (o.search) { tbd = $("<td class='ui-pg-button ui-corner-all'></td>"); pSearch = pSearch || {}; $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.searchicon+"'></span>"+o.searchtext+"</div>"); $("tr",navtbl).append(tbd); $(tbd,navtbl) .attr({"title":o.searchtitle || "",id:pSearch.id || "search_"+elemids}) .click(function(){ $($t).jqGrid("searchGrid",pSearch); return false; }).hover(function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ); tbd = null; } if (o.refresh) { tbd = $("<td class='ui-pg-button ui-corner-all'></td>"); $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.refreshicon+"'></span>"+o.refreshtext+"</div>"); $("tr",navtbl).append(tbd); $(tbd,navtbl) .attr({"title":o.refreshtitle || "",id: "refresh_"+elemids}) .click(function(){ if($.isFunction(o.beforeRefresh)) o.beforeRefresh(); $t.p.search = false; try { var gID = $t.p.id; $("#fbox_"+gID).searchFilter().reset(); $t.clearToolbar(false); } catch (e) {} switch (o.refreshstate) { case 'firstpage': $($t).trigger("reloadGrid", [{page:1}]); break; case 'current': $($t).trigger("reloadGrid", [{current:true}]); break; } if($.isFunction(o.afterRefresh)) o.afterRefresh(); return false; }).hover(function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ); tbd = null; } tdw = $(".ui-jqgrid").css("font-size") || "11px"; $('body').append("<div id='testpg2' class='ui-jqgrid ui-widget ui-widget-content' style='font-size:"+tdw+";visibility:hidden;' ></div>"); twd = $(navtbl).clone().appendTo("#testpg2").width(); $("#testpg2").remove(); $(pgid+"_"+o.position,pgid).append(navtbl); if($t.p._nvtd) { if(twd > $t.p._nvtd[0] ) { $(pgid+"_"+o.position,pgid).width(twd); $t.p._nvtd[0] = twd; } $t.p._nvtd[1] = twd; } tdw =null; twd=null; navtbl =null; } }); }, navButtonAdd : function (elem, p) { p = $.extend({ caption : "newButton", title: '', buttonicon : 'ui-icon-newwin', onClickButton: null, position : "last", cursor : 'pointer' }, p ||{}); return this.each(function() { if( !this.grid) { return; } if( elem.indexOf("#") != 0) { elem = "#"+elem; } var findnav = $(".navtable",elem)[0], $t = this; if (findnav) { var tbd = $("<td></td>"); $(tbd).addClass('ui-pg-button ui-corner-all').append("<div class='ui-pg-div'><span class='ui-icon "+p.buttonicon+"'></span>"+p.caption+"</div>"); if(p.id) {$(tbd).attr("id",p.id);} if(p.position=='first'){ if(findnav.rows[0].cells.length ===0 ) { $("tr",findnav).append(tbd); } else { $("tr td:eq(0)",findnav).before(tbd); } } else { $("tr",findnav).append(tbd); } $(tbd,findnav) .attr("title",p.title || "") .click(function(e){ if ($.isFunction(p.onClickButton) ) { p.onClickButton.call($t,e); } return false; }) .hover( function () {$(this).addClass("ui-state-hover");}, function () {$(this).removeClass("ui-state-hover");} ) .css("cursor",p.cursor ? p.cursor : "normal"); } }); }, navSeparatorAdd:function (elem,p) { p = $.extend({ sepclass : "ui-separator", sepcontent: '' }, p ||{}); return this.each(function() { if( !this.grid) { return; } if( elem.indexOf("#") != 0) { elem = "#"+elem; } var findnav = $(".navtable",elem)[0]; if(findnav) { var sep = "<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='"+p.sepclass+"'></span>"+p.sepcontent+"</td>"; $("tr",findnav).append(sep); } }); }, GridToForm : function( rowid, formid ) { return this.each(function(){ var $t = this; if (!$t.grid) { return; } var rowdata = $($t).jqGrid("getRowData",rowid); if (rowdata) { for(var i in rowdata) { if ( $("[name="+i+"]",formid).is("input:radio") || $("[name="+i+"]",formid).is("input:checkbox")) { $("[name="+i+"]",formid).each( function() { if( $(this).val() == rowdata[i] ) { $(this).attr("checked","checked"); } else { $(this).attr("checked",""); } }); } else { // this is very slow on big table and form. $("[name="+i+"]",formid).val(rowdata[i]); } } } }); }, FormToGrid : function(rowid, formid, mode, position){ return this.each(function() { var $t = this; if(!$t.grid) { return; } if(!mode) mode = 'set'; if(!position) position = 'first'; var fields = $(formid).serializeArray(); var griddata = {}; $.each(fields, function(i, field){ griddata[field.name] = field.value; }); if(mode=='add') $($t).jqGrid("addRowData",rowid,griddata, position); else if(mode=='set') $($t).jqGrid("setRowData",rowid,griddata); }); } }); })(jQuery); ;(function($){ /* * jqGrid extension for constructing Grid Data from external file * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ jqGridImport : function(o) { o = $.extend({ imptype : "xml", // xml, json, xmlstring, jsonstring impstring: "", impurl: "", mtype: "GET", impData : {}, xmlGrid :{ config : "roots>grid", data: "roots>rows" }, jsonGrid :{ config : "grid", data: "data" }, ajaxOptions :{} }, o || {}); return this.each(function(){ var $t = this; var XmlConvert = function (xml,o) { var cnfg = $(o.xmlGrid.config,xml)[0]; var xmldata = $(o.xmlGrid.data,xml)[0]; if(xmlJsonClass.xml2json && $.jgrid.parse) { var jstr = xmlJsonClass.xml2json(cnfg," "); var jstr = $.jgrid.parse(jstr); for(var key in jstr) { var 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 { $($t).jqGrid( jstr1 ); } jstr = null;jstr1=null; } else { alert("xml2json or parse are not present"); } }; var JsonConvert = function (jsonstr,o){ if (jsonstr && typeof jsonstr == 'string') { var json = $.jgrid.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); 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 = $.jgrid.stringToDoc(o.impstring); if(xmld) { XmlConvert(xmld,o); if($.isFunction(o.importComplete)) { o.importComplete(xmld); } o.impstring = null; } xmld = null; } break; case 'json': $.ajax($.extend({ url:o.impurl, type:o.mtype, data: o.impData, dataType:"json", complete: function(json,stat) { if(stat == 'success') { JsonConvert(json.responseText,o ); if($.isFunction(o.importComplete)) { o.importComplete(json); } } json=null; } }, o.ajaxOptions )); break; case 'jsonstring' : if(o.impstring && typeof o.impstring == 'string') { JsonConvert(o.impstring,o ); if($.isFunction(o.importComplete)) { o.importComplete(o.impstring); } o.impstring = null; } break; } }); }, jqGridExport : function(o) { o = $.extend({ exptype : "xmlstring", root: "grid", ident: "\t" }, o || {}); var ret = null; this.each(function () { if(!this.grid) { return;} var gprm = $.extend({},$(this).jqGrid("getGridParam")); // 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); } if(gprm.treeGrid) { for (var key in gprm.treeReader) { gprm.colNames.splice(gprm.colNames.length-1); gprm.colModel.splice(gprm.colModel.length-1); } } switch (o.exptype) { case 'xmlstring' : ret = "<"+o.root+">"+xmlJsonClass.json2xml(gprm,o.ident)+"</"+o.root+">"; break; case 'jsonstring' : ret = "{"+ xmlJsonClass.toJson(gprm,o.root,o.ident)+"}"; break; } }); return ret; }, excelExport : function(o) { o = $.extend({ exptype : "remote", url : null, oper: "oper", tag: "excel", exportOptions : {} }, o || {}); return this.each(function(){ $t = this; if(!this.grid) { return;} if(o.exptype == "remote") { var pdata = $.extend({},this.p.postData); pdata[o.oper] = o.tag; var params = jQuery.param(pdata); window.location = o.url+"?"+params; } }); } }); })(jQuery); ;(function($){ /** * jqGrid extension for manipulating Grid Data * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ //Editing editRow : function(rowid,keys,oneditfunc,succesfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc) { return this.each(function(){ var $t = this, nm, tmp, editable, cnt=0, focus=null, svr={}, ind,cm; if (!$t.grid ) { return; } ind = $($t).jqGrid("getInd",rowid,true); if( ind == false ) {return;} editable = $(ind).attr("editable") || "0"; if (editable == "0" && !$(ind).hasClass("not-editable-row")) { cm = $t.p.colModel; $('td',ind).each( function(i) { nm = cm[i].name; var treeg = $t.p.treeGrid===true && nm == $t.p.ExpandColumn; if(treeg) tmp = $("span:first",this).html(); else { try { tmp = $.unformat(this,{rowId:rowid, colModel:cm[i]},i); } catch (_) { tmp = $(this).html(); } } if ( nm != 'cb' && nm != 'subgrid' && nm != 'rn') { if($t.p.autoencode) tmp = $.jgrid.htmlDecode(tmp); svr[nm]=tmp; if(cm[i].editable===true) { if(focus===null) { focus = i; } if (treeg) $("span:first",this).html(""); else $(this).html(""); var opt = $.extend({},cm[i].editoptions || {},{id:rowid+"_"+nm,name:nm}); if(!cm[i].edittype) { cm[i].edittype = "text"; } var elc = createEl(cm[i].edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {})); $(elc).addClass("editable"); if(treeg) $("span:first",this).append(elc); else $(this).append(elc); //Again IE if(cm[i].edittype == "select" && cm[i].editoptions.multiple===true && $.browser.msie) { $(elc).width($(elc).width()); } cnt++; } } }); if(cnt > 0) { svr['id'] = rowid; $t.p.savedRow.push(svr); $(ind).attr("editable","1"); $("td:eq("+focus+") input",ind).focus(); if(keys===true) { $(ind).bind("keydown",function(e) { if (e.keyCode === 27) {$($t).jqGrid("restoreRow",rowid, afterrestorefunc);} if (e.keyCode === 13) { var ta = e.target; if(ta.tagName == 'TEXTAREA') return true; $($t).jqGrid("saveRow",rowid,succesfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc ); return false; } e.stopPropagation(); }); } if( $.isFunction(oneditfunc)) { oneditfunc(rowid); } } } }); }, saveRow : function(rowid, succesfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc) { return this.each(function(){ var $t = this, nm, tmp={}, tmp2={}, editable, fr, cv, ind; if (!$t.grid ) { return; } ind = $($t).jqGrid("getInd",rowid,true); if(ind == false) {return;} editable = $(ind).attr("editable"); url = url ? url : $t.p.editurl; if (editable==="1" && url) { var cm; $("td",ind).each(function(i) { cm = $t.p.colModel[i]; nm = cm.name; if ( nm != 'cb' && nm != 'subgrid' && cm.editable===true && nm != 'rn') { switch (cm.edittype) { case "checkbox": var cbv = ["Yes","No"]; if(cm.editoptions ) { cbv = cm.editoptions.value.split(":"); } tmp[nm]= $("input",this).attr("checked") ? cbv[0] : cbv[1]; break; case 'text': case 'password': case 'textarea': case "button" : tmp[nm]=$("input, textarea",this).val(); break; case 'select': if(!cm.editoptions.multiple) { tmp[nm] = $("select>option:selected",this).val(); tmp2[nm] = $("select>option:selected", this).text(); } else { var sel = $("select",this), selectedText = []; tmp[nm] = $(sel).val(); if(tmp[nm]) tmp[nm]= tmp[nm].join(","); else tmp[nm] =""; $("select > option:selected",this).each( function(i,selected){ selectedText[i] = $(selected).text(); } ); tmp2[nm] = selectedText.join(","); } if(cm.formatter && cm.formatter == 'select') tmp2={}; break; case 'custom' : try { if(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) { tmp[nm] = cm.editoptions.custom_value($(".customelement",this),'get'); if (tmp[nm] === undefined) throw "e2"; } else throw "e1"; } catch (e) { if (e=="e1") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.nodefined,jQuery.jgrid.edit.bClose); if (e=="e2") info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.novalue,jQuery.jgrid.edit.bClose); else info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose); } break; } cv = checkValues(tmp[nm],i,$t); if(cv[0] === false) { cv[1] = tmp[nm] + " " + cv[1]; return false; } if($t.p.autoencode) tmp[nm] = $.jgrid.htmlEncode(tmp[nm]); } }); if (cv[0] === false){ try { var positions = findPos($("#"+rowid)[0]); info_dialog($.jgrid.errors.errcap,cv[1],$.jgrid.edit.bClose,{left:positions[0],top:positions[1]}); } catch (e) { alert(cv[1]); } return; } if(tmp) { var idname, opers, oper; opers = $t.p.prmNames; oper = opers.oper; idname = opers.id; tmp[oper] = opers.editoper; tmp[idname] = rowid; if(extraparam) { tmp = $.extend({},tmp,extraparam);} } if (url == 'clientArray') { tmp = $.extend({},tmp, tmp2); if($t.p.autoencode) { $.each(tmp,function(n,v){ tmp[n] = $.jgrid.htmlDecode(v); }); } var resp = $($t).jqGrid("setRowData",rowid,tmp); $(ind).attr("editable","0"); for( var k=0;k<$t.p.savedRow.length;k++) { if( $t.p.savedRow[k].id == rowid) {fr = k; break;} } if(fr >= 0) { $t.p.savedRow.splice(fr,1); } if( $.isFunction(aftersavefunc) ) { aftersavefunc(rowid,resp); } } else { $("#lui_"+$t.p.id).show(); $.ajax($.extend({ url:url, data: $.isFunction($t.p.serializeRowData) ? $t.p.serializeRowData(tmp) : tmp, type: "POST", complete: function(res,stat){ $("#lui_"+$t.p.id).hide(); if (stat === "success"){ var ret; if( $.isFunction(succesfunc)) { ret = succesfunc(res);} else ret = true; if (ret===true) { if($t.p.autoencode) { $.each(tmp,function(n,v){ tmp[n] = $.jgrid.htmlDecode(v); }); } tmp = $.extend({},tmp, tmp2); $($t).jqGrid("setRowData",rowid,tmp); $(ind).attr("editable","0"); for( var k=0;k<$t.p.savedRow.length;k++) { if( $t.p.savedRow[k].id == rowid) {fr = k; break;} }; if(fr >= 0) { $t.p.savedRow.splice(fr,1); } if( $.isFunction(aftersavefunc) ) { aftersavefunc(rowid,res); } } else { $($t).jqGrid("restoreRow",rowid, afterrestorefunc); } } }, error:function(res,stat){ $("#lui_"+$t.p.id).hide(); if($.isFunction(errorfunc) ) { errorfunc(rowid, res, stat); } else { alert("Error Row: "+rowid+" Result: " +res.status+":"+res.statusText+" Status: "+stat); } } }, $.jgrid.ajaxOptions, $t.p.ajaxRowOptions || {})); } $(ind).unbind("keydown"); } }); }, restoreRow : function(rowid, afterrestorefunc) { return this.each(function(){ var $t= this, fr, ind, ares={}; if (!$t.grid ) { return; } ind = $($t).jqGrid("getInd",rowid,true); if(ind == false) {return;} for( var k=0;k<$t.p.savedRow.length;k++) { if( $t.p.savedRow[k].id == rowid) {fr = k; break;} } if(fr >= 0) { if($.isFunction($.fn['datepicker'])) { try { $("input.hasDatepicker","#"+ind.id).datepicker('hide'); } catch (e) {} } $.each($t.p.colModel, function(i,n){ if(this.editable == true && this.name in $t.p.savedRow[fr]) { ares[this.name] = $t.p.savedRow[fr][this.name]; } }); $($t).jqGrid("setRowData",rowid,ares); $(ind).attr("editable","0").unbind("keydown"); $t.p.savedRow.splice(fr,1); } if ($.isFunction(afterrestorefunc)) { afterrestorefunc(rowid); } }); } //end inline edit }); })(jQuery); ;(function($){ /* ** * jqGrid addons using jQuery UI * Author: Mark Williams * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * depends on jQuery UI sortable **/ if ($.browser.msie && $.browser.version==8) { $.expr[":"].hidden = function(elem) { return elem.offsetWidth === 0 || elem.offsetHeight === 0 || elem.style.display == "none"; } } if ($.ui && $.ui.multiselect && $.ui.multiselect.prototype._setSelected) { var setSelected = $.ui.multiselect.prototype._setSelected; $.ui.multiselect.prototype._setSelected = function(item,selected) { var ret = setSelected.call(this,item,selected); if (selected && this.selectedList) { var elt = this.element; this.selectedList.find('li').each(function() { if ($(this).data('optionLink')) $(this).data('optionLink').remove().appendTo(elt); }); } return ret; } } $.jgrid.extend({ sortableColumns : function (tblrow) { return this.each(function (){ var ts = this; function start() {ts.p.disableClick = true;}; var sortable_opts = { "tolerance" : "pointer", "axis" : "x", "items": '>th:not(:has(#jqgh_cb,#jqgh_rn,#jqgh_subgrid),:hidden)', "placeholder": { element: function(item) { var el = $(document.createElement(item[0].nodeName)) .addClass(item[0].className+" ui-sortable-placeholder ui-state-highlight") .removeClass("ui-sortable-helper")[0]; return el; }, update: function(self, p) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); } }, "update": function(event, ui) { var p = $(ui.item).parent(); var th = $(">th", p); var colModel = ts.p.colModel; var cmMap = {}; $.each(colModel, function(i) { cmMap[this.name]=i }); var permutation = []; th.each(function(i) { var id = $(">div", this).get(0).id.replace(/^jqgh_/, ""); if (id in cmMap) { permutation.push(cmMap[id]); } }); $(ts).jqGrid("remapColumns",permutation, true, true); if ($.isFunction(ts.p.sortable.update)) { ts.p.sortable.update(permutation); } setTimeout(function(){ts.p.disableClick=false}, 50); } }; if (ts.p.sortable.options) { $.extend(sortable_opts, ts.p.sortable.options); } else if ($.isFunction(ts.p.sortable)) { ts.p.sortable = { "update" : ts.p.sortable }; } if (sortable_opts.start) { var s = sortable_opts.start; sortable_opts.start = function(e,ui) { start(); s.call(this,e,ui); } } else { sortable_opts.start = start; } if (ts.p.sortable.exclude) { sortable_opts.items += ":not("+ts.p.sortable.exclude+")"; } tblrow.sortable(sortable_opts).data("sortable").floating = true; }); }, columnChooser : function(opts) { var self = this; if($("#colchooser_"+self[0].p.id).length ) return; var selector = $('<div id="colchooser_'+self[0].p.id+'" style="position:relative;overflow:hidden"><div><select multiple="multiple"></select></div></div>'); var select = $('select', selector); opts = $.extend({ "width" : 420, "height" : 240, "classname" : null, "done" : function(perm) { if (perm) self.jqGrid("remapColumns", perm, true) }, /* msel is either the name of a ui widget class that extends a multiselect, or a function that supports creating a multiselect object (with no argument, or when passed an object), and destroying it (when passed the string "destroy"). */ "msel" : "multiselect", /* "msel_opts" : {}, */ /* dlog is either the name of a ui widget class that behaves in a dialog-like way, or a function, that supports creating a dialog (when passed dlog_opts) or destroying a dialog (when passed the string "destroy") */ "dlog" : "dialog", /* dlog_opts is either an option object to be passed to "dlog", or (more likely) a function that creates the options object. The default produces a suitable options object for ui.dialog */ "dlog_opts" : function(opts) { var buttons = {}; buttons[opts.bSubmit] = function() { opts.apply_perm(); opts.cleanup(false); }; buttons[opts.bCancel] = function() { opts.cleanup(true); }; return { "buttons": buttons, "close": function() { opts.cleanup(true); }, "modal" : false, "resizable": false, "width": opts.width+20 }; }, /* Function to get the permutation array, and pass it to the "done" function */ "apply_perm" : function() { $('option',select).each(function(i) { if (this.selected) { self.jqGrid("showCol", colModel[this.value].name); } else { self.jqGrid("hideCol", colModel[this.value].name); } }); var perm = []; //fixedCols.slice(0); $('option[selected]',select).each(function() { perm.push(parseInt(this.value)) }); $.each(perm, function() { delete colMap[colModel[parseInt(this)].name] }); $.each(colMap, function() { var ti = parseInt(this); perm = insert(perm,ti,ti); }); if (opts.done) { opts.done.call(self, perm); } }, /* Function to cleanup the dialog, and select. Also calls the done function with no permutation (to indicate that the columnChooser was aborted */ "cleanup" : function(calldone) { call(opts.dlog, selector, 'destroy'); call(opts.msel, select, 'destroy'); selector.remove(); if (calldone && opts.done) { opts.done.call(self); } }, "msel_opts" : {} }, $.jgrid.col, opts || {}); if (opts.caption) { selector.attr("title", opts.caption); } if (opts.classname) { selector.addClass(classname); select.addClass(classname); } if (opts.width) { $(">div",selector).css({"width": opts.width,"margin":"0 auto"}); select.css("width", opts.width); } if (opts.height) { $(">div",selector).css("height", opts.height); select.css("height", opts.height - 10); } var colModel = self.jqGrid("getGridParam", "colModel"); var colNames = self.jqGrid("getGridParam", "colNames"); var colMap = {}, fixedCols = []; select.empty(); $.each(colModel, function(i) { colMap[this.name] = i; if (this.hidedlg) { if (!this.hidden) { fixedCols.push(i); } return; } select.append("<option value='"+i+"' "+ (this.hidden?"":"selected='selected'")+">"+colNames[i]+"</option>"); }); function insert(perm,i,v) { if(i>=0){ var a = perm.slice(); var b = a.splice(i); if(i>perm.length) i = perm.length; a[i] = v; return a.concat(b); } } function call(fn, obj) { if (!fn) return; if (typeof fn == 'string') { if ($.fn[fn]) { $.fn[fn].apply(obj, $.makeArray(arguments).slice(2)); } } else if ($.isFunction(fn)) { fn.apply(obj, $.makeArray(arguments).slice(2)); } } var dopts = $.isFunction(opts.dlog_opts) ? opts.dlog_opts.call(self, opts) : opts.dlog_opts; call(opts.dlog, selector, dopts); var mopts = $.isFunction(opts.msel_opts) ? opts.msel_opts.call(self, opts) : opts.msel_opts; call(opts.msel, select, mopts); }, sortableRows : function (opts) { // Can accept all sortable options and events return this.each(function(){ var $t = this; if(!$t.grid) return; // Currently we disable a treeGrid sortable if($t.p.treeGrid) return; if($.fn['sortable']) { opts = $.extend({ "cursor":"move", "axis" : "y", "items": ".jqgrow" }, opts || {}); if(opts.start && $.isFunction(opts.start)) { opts._start_ = opts.start; delete opts.start; } else {opts._start_=false;} if(opts.update && $.isFunction(opts.update)) { opts._update_ = opts.update; delete opts.update; } else {opts._update_ = false;} opts.start = function(ev,ui) { $(ui.item).css("border-width","0px"); $("td",ui.item).each(function(i){ this.style.width = $t.grid.cols[i].style.width; }); if($t.p.subGrid) { var subgid = $(ui.item).attr("id"); try { $($t).jqGrid('collapseSubGridRow',subgid); } catch (e) {} } if(opts._start_) { opts._start_.apply(this,[ev,ui]); } } opts.update = function (ev,ui) { $(ui.item).css("border-width",""); $t.updateColumns(); if($t.p.rownumbers === true) { $("td.jqgrid-rownum",$t.rows).each(function(i){ $(this).html(i+1); }); } if(opts._update_) { opts._update_.apply(this,[ev,ui]); } } $("tbody:first",$t).sortable(opts); } }); }, gridDnD : function(opts) { return this.each(function(){ var $t = this; if(!$t.grid) return; // Currently we disable a treeGrid drag and drop if($t.p.treeGrid) return; if(!$.fn['draggable'] || !$.fn['droppable']) return; function updateDnD () { var datadnd = $.data($t,"dnd"); $("tr.jqgrow:not(.ui-draggable)",$t).draggable($.isFunction(datadnd.drag) ? datadnd.drag.call($($t),datadnd) : datadnd.drag); } var appender = "<table id='jqgrid_dnd' class='ui-jqgrid-dnd'></table>"; if($("#jqgrid_dnd").html() == null) { $('body').append(appender); } if(typeof opts == 'string' && opts == 'updateDnD' && $t.p.jqgdnd==true) { updateDnD(); return; } opts = $.extend({ "drag" : function (opts) { return $.extend({ start : function (ev, ui) { // if we are in subgrid mode try to collapse the node if($t.p.subGrid) { var subgid = $(ui.helper).attr("id"); try { $($t).jqGrid('collapseSubGridRow',subgid); } catch (e) {} } // hack // drag and drop does not insert tr in table, when the table has no rows // we try to insert new empty row on the target(s) for (var i=0;i<$.data($t,"dnd").connectWith.length;i++){ if($($.data($t,"dnd").connectWith[i]).jqGrid('getGridParam','reccount') == "0" ){ $($.data($t,"dnd").connectWith[i]).jqGrid('addRowData','jqg_empty_row',{}); } } ui.helper.addClass("ui-state-highlight"); $("td",ui.helper).each(function(i) { this.style.width = $t.grid.headers[i].width+"px"; }); if(opts.onstart && $.isFunction(opts.onstart) ) opts.onstart.call($($t),ev,ui); }, stop :function(ev,ui) { if(ui.helper.dropped) { var ids = $(ui.helper).attr("id"); $($t).jqGrid('delRowData',ids ); } // if we have a empty row inserted from start event try to delete it for (var i=0;i<$.data($t,"dnd").connectWith.length;i++){ $($.data($t,"dnd").connectWith[i]).jqGrid('delRowData','jqg_empty_row'); } if(opts.onstop && $.isFunction(opts.onstop) ) opts.onstop.call($($t),ev,ui); } },opts.drag_opts || {}); }, "drop" : function (opts) { return $.extend({ accept: function(d) { var tid = $(d).closest("table.ui-jqgrid-btable"); if($.data(tid[0],"dnd") != undefined) { var cn = $.data(tid[0],"dnd").connectWith; return $.inArray('#'+this.id,cn) != -1 ? true : false; } return d; }, drop: function(ev, ui) { var accept = $(ui.draggable).attr("id"); var getdata = $('#'+$t.id).jqGrid('getRowData',accept); if(!opts.dropbyname) { var j =0, tmpdata = {}, dropname; var dropmodel = $("#"+this.id).jqGrid('getGridParam','colModel'); try { for (key in getdata) { if(dropmodel[j]) { dropname = dropmodel[j].name; tmpdata[dropname] = getdata[key]; } j++; } getdata = tmpdata; } catch (e) {} } ui.helper.dropped = true; if(opts.beforedrop && $.isFunction(opts.beforedrop) ) { //parameters to this callback - event, element, data to be inserted, sender, reciever // should return object which will be inserted into the reciever var datatoinsert = opts.beforedrop.call(this,ev,ui,getdata,$('#'+$t.id),$(this)); if (typeof datatoinsert != "undefined" && datatoinsert !== null && typeof datatoinsert == "object") getdata = datatoinsert; } if(ui.helper.dropped) { var grid; if(opts.autoid) { if($.isFunction(opts.autoid)) { grid = opts.autoid.call(this,getdata); } else { grid = Math.ceil(Math.random()*1000); grid = opts.autoidprefix+grid; } } // NULL is interpreted as undefined while null as object $("#"+this.id).jqGrid('addRowData',grid,getdata,opts.droppos); } if(opts.ondrop && $.isFunction(opts.ondrop) ) opts.ondrop.call(this,ev,ui, getdata); }}, opts.drop_opts || {}); }, "onstart" : null, "onstop" : null, "beforedrop": null, "ondrop" : null, "drop_opts" : { "activeClass": "ui-state-active", "hoverClass": "ui-state-hover" }, "drag_opts" : { "revert": "invalid", "helper": "clone", "cursor": "move", "appendTo" : "#jqgrid_dnd", "zIndex": 5000 }, "dropbyname" : false, "droppos" : "first", "autoid" : true, "autoidprefix" : "dnd_" }, opts || {}); if(!opts.connectWith) return; opts.connectWith = opts.connectWith.split(","); opts.connectWith = $.map(opts.connectWith,function(n){return $.trim(n);}); $.data($t,"dnd",opts); if($t.p.reccount != "0" && !$t.p.jqgdnd) { updateDnD(); } $t.p.jqgdnd = true; for (var i=0;i<opts.connectWith.length;i++){ var cn =opts.connectWith[i] $(cn).droppable($.isFunction(opts.drop) ? opts.drop.call($($t),opts) : opts.drop); }; }); }, gridResize : function(opts) { return this.each(function(){ var $t = this; if(!$t.grid || !$.fn['resizable']) return; opts = $.extend({}, opts || {}); if(opts.alsoResize ) { opts._alsoResize_ = opts.alsoResize; delete opts.alsoResize; } else { opts._alsoResize_ = false; } if(opts.stop && $.isFunction(opts.stop)) { opts._stop_ = opts.stop; delete opts.stop; } else { opts._stop_ = false; } opts.stop = function (ev, ui) { $($t).jqGrid('setGridParam',{height:$("#gview_"+$t.p.id+" .ui-jqgrid-bdiv").height()}); $($t).jqGrid('setGridWidth',ui.size.width,opts.shrinkToFit); if(opts._stop_) opts._stop_.call($t,ev,ui); }; if(opts._alsoResize_) { var optstest = "{'\#gview_"+$t.p.id+" .ui-jqgrid-bdiv\':true,'" +opts._alsoResize_+"':true}"; opts.alsoResize = eval('('+optstest+')'); // the only way that I found to do this } else { opts.alsoResize = $(".ui-jqgrid-bdiv","#gview_"+$t.p.id); } delete opts._alsoResize_; $("#gbox_"+$t.p.id).resizable(opts); }); } }); })(jQuery); ;(function($){ /** * jqGrid extension * Paul Tiseo ptiseo@wasteconsultants.com * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ getPostData : function(){ var $t = this[0]; if(!$t.grid) { return; } return $t.p.postData; }, setPostData : function( newdata ) { var $t = this[0]; if(!$t.grid) { return; } // check if newdata is correct type if ( typeof(newdata) === 'object' ) { $t.p.postData = newdata; } else { alert("Error: cannot add a non-object postData value. postData unchanged."); } }, appendPostData : function( newdata ) { var $t = this[0]; if(!$t.grid) { return; } // check if newdata is correct type if ( typeof(newdata) === 'object' ) { $.extend($t.p.postData, newdata); } else { alert("Error: cannot append a non-object postData value. postData unchanged."); } }, setPostDataItem : function( key, val ) { var $t = this[0]; if(!$t.grid) { return; } $t.p.postData[key] = val; }, getPostDataItem : function( key ) { var $t = this[0]; if(!$t.grid) { return; } return $t.p.postData[key]; }, removePostDataItem : function( key ) { var $t = this[0]; if(!$t.grid) { return; } delete $t.p.postData[key]; }, getUserData : function(){ var $t = this[0]; if(!$t.grid) { return; } return $t.p.userData; }, getUserDataItem : function( key ) { var $t = this[0]; if(!$t.grid) { return; } return $t.p.userData[key]; } }); })(jQuery); ;(function($){ /** * jqGrid extension for manipulating columns properties * Piotr Roznicki roznicki@o2.pl * http://www.roznicki.prv.pl * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ setColumns : function(p) { p = $.extend({ top : 0, left: 0, width: 200, height: 'auto', dataheight: 'auto', modal: false, drag: true, beforeShowForm: null, afterShowForm: null, afterSubmitForm: null, closeOnEscape : true, ShrinkToFit : false, jqModal : false, saveicon: [true,"left","ui-icon-disk"], closeicon: [true,"left","ui-icon-close"], onClose : null, colnameview : true, closeAfterSubmit : true, updateAfterCheck : false, recreateForm : false }, $.jgrid.col, p ||{}); return this.each(function(){ var $t = this; if (!$t.grid ) { return; } var onBeforeShow = typeof p.beforeShowForm === 'function' ? true: false; var onAfterShow = typeof p.afterShowForm === 'function' ? true: false; var onAfterSubmit = typeof p.afterSubmitForm === 'function' ? true: false; var gID = $t.p.id, dtbl = "ColTbl_"+gID, IDs = {themodal:'colmod'+gID,modalhead:'colhd'+gID,modalcontent:'colcnt'+gID, scrollelm: dtbl}; if(p.recreateForm===true && $("#"+IDs.themodal).html() != null) { $("#"+IDs.themodal).remove(); } if ( $("#"+IDs.themodal).html() != null ) { if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); } viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, jqM:false, modal:p.modal}); if(onAfterShow) { p.afterShowForm($("#"+dtbl)); } } else { var dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+"px"; var formdata = "<div id='"+dtbl+"' class='formdata' style='width:100%;overflow:auto;position:relative;height:"+dh+";'>"; formdata += "<table class='ColTable' cellspacing='1' cellpading='2' border='0'><tbody>"; for(i=0;i<this.p.colNames.length;i++){ if(!$t.p.colModel[i].hidedlg) { // added from T. Tomov formdata += "<tr><td style='white-space: pre;'><input type='checkbox' style='margin-right:5px;' id='col_" + this.p.colModel[i].name + "' class='cbox' value='T' " + ((this.p.colModel[i].hidden===false)?"checked":"") + "/>" + "<label for='col_" + this.p.colModel[i].name + "'>" + this.p.colNames[i] + ((p.colnameview) ? " (" + this.p.colModel[i].name + ")" : "" )+ "</label></td></tr>"; } } formdata += "</tbody></table></div>" var bS = !p.updateAfterCheck ? "<a href='javascript:void(0)' id='dData' class='fm-button ui-state-default ui-corner-all'>"+p.bSubmit+"</a>" : "", bC ="<a href='javascript:void(0)' id='eData' class='fm-button ui-state-default ui-corner-all'>"+p.bCancel+"</a>"; formdata += "<table border='0' class='EditTable' id='"+dtbl+"_2'><tbody><tr style='display:block;height:3px;'><td></td></tr><tr><td class='DataTD ui-widget-content'></td></tr><tr><td class='ColButton EditButton'>"+bS+" "+bC+"</td></tr></tbody></table>"; p.gbox = "#gbox_"+gID; createModal(IDs,formdata,p,"#gview_"+$t.p.id,$("#gview_"+$t.p.id)[0]); if(p.saveicon[0]==true) { $("#dData","#"+dtbl+"_2").addClass(p.saveicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.saveicon[2]+"'></span>"); } if(p.closeicon[0]==true) { $("#eData","#"+dtbl+"_2").addClass(p.closeicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left') .append("<span class='ui-icon "+p.closeicon[2]+"'></span>"); } if(!p.updateAfterCheck) { $("#dData","#"+dtbl+"_2").click(function(e){ for(i=0;i<$t.p.colModel.length;i++){ if(!$t.p.colModel[i].hidedlg) { // added from T. Tomov var nm = $t.p.colModel[i].name.replace(".", "\\."); if($("#col_" + nm,"#"+dtbl).attr("checked")) { $($t).jqGrid("showCol",$t.p.colModel[i].name); $("#col_" + nm,"#"+dtbl).attr("defaultChecked",true); // Added from T. Tomov IE BUG } else { $($t).jqGrid("hideCol",$t.p.colModel[i].name); $("#col_" + nm,"#"+dtbl).attr("defaultChecked",""); // Added from T. Tomov IE BUG } } } if(p.ShrinkToFit===true) { $($t).jqGrid("setGridWidth",$t.grid.width-0.001,true); } if(p.closeAfterSubmit) hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: p.onClose}); if (onAfterSubmit) { p.afterSubmitForm($("#"+dtbl)); } return false; }); } else { $(":input","#"+dtbl).click(function(e){ var cn = this.id.substr(4); if(cn){ if(this.checked) { $($t).jqGrid("showCol",cn); } else { $($t).jqGrid("hideCol",cn); } if(p.ShrinkToFit===true) { $($t).jqGrid("setGridWidth",$t.grid.width-0.001,true); } } return this; }); } $("#eData", "#"+dtbl+"_2").click(function(e){ hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: p.onClose}); return false; }); $("#dData, #eData","#"+dtbl+"_2").hover( function(){$(this).addClass('ui-state-hover');}, function(){$(this).removeClass('ui-state-hover');} ); if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); } viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, jqM: true, modal:p.modal}); if(onAfterShow) { p.afterShowForm($("#"+dtbl)); } } }); } }); })(jQuery); ;(function($){ /** * jqGrid extension for SubGrid Data * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ setSubGrid : function () { return this.each(function (){ var $t = this, cm; $t.p.colNames.unshift(""); $t.p.colModel.unshift({name:'subgrid',width: $.browser.safari ? $t.p.subGridWidth+$t.p.cellLayout : $t.p.subGridWidth,sortable: false,resizable:false,hidedlg:true,search:false,fixed:true}); cm = $t.p.subGridModel; if(cm[0]) { cm[0].align = $.extend([],cm[0].align || []); for(i=0;i<cm[0].name.length;i++) { cm[0].align[i] = cm[0].align[i] || 'left';} } }); }, addSubGridCell :function (pos,iRow) { var prp='',gv; this.each(function(){ prp = this.formatCol(pos,iRow); gv = this.p.gridview; }); if( gv === false ){ return "<td role='grid' class='ui-sgcollapsed sgcollapsed' "+prp+"><a href='javascript:void(0);'><span class='ui-icon ui-icon-plus'></span></a></td>"; } else { return "<td role='grid' " +prp +"></td>"; } }, addSubGrid : function(t,pos) { return this.each(function(){ var ts = this; if (!ts.grid ) { return; } var res,_id, pID,atd, nhc, subdata, bfsc; $("td:eq("+pos+")",t).click( function(e) { if($(this).hasClass("sgcollapsed")) { pID = ts.p.id; res = $(this).parent(); atd = pos >=1 ? "<td colspan='"+pos+"'> </td>":""; _id = $(res).attr("id"); bfsc =true; if($.isFunction(ts.p.subGridBeforeExpand)) { bfsc = ts.p.subGridBeforeExpand(pID+"_"+_id,_id); } if(bfsc === false) {return false;} nhc = 0; $.each(ts.p.colModel,function(i,v){ if(this.hidden === true || this.name == 'rn' || this.name == 'cb') {nhc++;} }); subdata = "<tr role='row' class='ui-subgrid'>"+atd+"<td class='ui-widget-content subgrid-cell'><span class='ui-icon ui-icon-carat-1-sw'/></td><td colspan='"+parseInt(ts.p.colNames.length-1-nhc)+"' class='ui-widget-content subgrid-data'><div id="+pID+"_"+_id+" class='tablediv'>"; $(this).parent().after( subdata+ "</div></td></tr>" ); if( $.isFunction(ts.p.subGridRowExpanded)) { ts.p.subGridRowExpanded(pID+"_"+ _id,_id); } else { populatesubgrid(res); } $(this).html("<a href='javascript:void(0);'><span class='ui-icon ui-icon-minus'></span></a>").removeClass("sgcollapsed").addClass("sgexpanded"); } else if($(this).hasClass("sgexpanded")) { bfsc = true; if( $.isFunction(ts.p.subGridRowColapsed)) { res = $(this).parent(); _id = $(res).attr("id"); bfsc = ts.p.subGridRowColapsed(pID+"_"+_id,_id ); }; if(bfsc===false) {return false;} $(this).parent().next().remove(".ui-subgrid"); $(this).html("<a href='javascript:void(0);'><span class='ui-icon ui-icon-plus'></span></a>").removeClass("sgexpanded").addClass("sgcollapsed"); } return false; }); //------------------------- var populatesubgrid = function( rd ) { var res,sid,dp, i, j; sid = $(rd).attr("id"); dp = {nd_: (new Date().getTime())}; dp[ts.p.idName]=sid; if(!ts.p.subGridModel[0]) { return false; } if(ts.p.subGridModel[0].params) { for(j=0; j < ts.p.subGridModel[0].params.length; j++) { for(i=0; i<ts.p.colModel.length; i++) { if(ts.p.colModel[i].name == ts.p.subGridModel[0].params[j]) { dp[ts.p.colModel[i].name]= $("td:eq("+i+")",rd).text().replace(/\ \;/ig,''); } } } } if(!ts.grid.hDiv.loading) { ts.grid.hDiv.loading = true; $("#load_"+ts.p.id).show(); if(!ts.p.subgridtype) ts.p.subgridtype = ts.p.datatype; if($.isFunction(ts.p.subgridtype)) { ts.p.subgridtype(dp); } else { ts.p.subgridtype = ts.p.subgridtype.toLowerCase(); } switch(ts.p.subgridtype) { case "xml": case "json": $.ajax($.extend({ type:ts.p.mtype, url: ts.p.subGridUrl, dataType:ts.p.subgridtype, data: $.isFunction(ts.p.serializeSubGridData)? ts.p.serializeSubGridData(dp) : dp, complete: function(sxml) { if(ts.p.subgridtype == "xml") subGridXml(sxml.responseXML, sid); else { subGridJson($.jgrid.parse(sxml.responseText),sid); } sxml=null; } }, $.jgrid.ajaxOptions, ts.p.ajaxSubgridOptions || {})); break; } } return false; }; var subGridCell = function(trdiv,cell,pos){ var tddiv = $("<td align='"+ts.p.subGridModel[0].align[pos]+"'></td>").html(cell); $(trdiv).append(tddiv); }; var subGridXml = function(sjxml, sbid){ var tddiv, i, cur, sgmap, dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"), trdiv = $("<tr></tr>"); for (i = 0; i<ts.p.subGridModel[0].name.length; i++) { tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>"); $(tddiv).html(ts.p.subGridModel[0].name[i]); $(tddiv).width( ts.p.subGridModel[0].width[i]); $(trdiv).append(tddiv); } $(dummy).append(trdiv); if (sjxml){ sgmap = ts.p.xmlReader.subgrid; $(sgmap.root+" "+sgmap.row, sjxml).each( function(){ trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>"); if(sgmap.repeatitems === true) { $(sgmap.cell,this).each( function(i) { subGridCell(trdiv, $(this).text() || ' ',i); }); } else { var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name; if (f) { for (i=0;i<f.length;i++) { subGridCell(trdiv, $(f[i],this).text() || ' ',i); } } } $(dummy).append(trdiv); }); } var pID = $("table:first",ts.grid.bDiv).attr("id")+"_"; $("#"+pID+sbid).append(dummy); ts.grid.hDiv.loading = false; $("#load_"+ts.p.id).hide(); return false; }; var subGridJson = function(sjxml, sbid){ var tddiv,result , i,cur, sgmap, dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"), trdiv = $("<tr></tr>"); for (i = 0; i<ts.p.subGridModel[0].name.length; i++) { tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>"); $(tddiv).html(ts.p.subGridModel[0].name[i]); $(tddiv).width( ts.p.subGridModel[0].width[i]); $(trdiv).append(tddiv); } $(dummy).append(trdiv); if (sjxml){ sgmap = ts.p.jsonReader.subgrid; result = sjxml[sgmap.root]; if ( typeof result !== 'undefined' ) { for (i=0;i<result.length;i++) { cur = result[i]; trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>"); if(sgmap.repeatitems === true) { if(sgmap.cell) { cur=cur[sgmap.cell]; } for (var j=0;j<cur.length;j++) { subGridCell(trdiv, cur[j] || ' ',j); } } else { var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name; if(f.length) { for (var j=0;j<f.length;j++) { subGridCell(trdiv, cur[f[j]] || ' ',j); } } } $(dummy).append(trdiv); } } } var pID = $("table:first",ts.grid.bDiv).attr("id")+"_"; $("#"+pID+sbid).append(dummy); ts.grid.hDiv.loading = false; $("#load_"+ts.p.id).hide(); return false; }; ts.subGridXml = function(xml,sid) {subGridXml(xml,sid);}; ts.subGridJson = function(json,sid) {subGridJson(json,sid);}; }); }, expandSubGridRow : function(rowid) { return this.each(function () { var $t = this; if(!$t.grid && !rowid) {return;} if($t.p.subGrid===true) { var rc = $(this).jqGrid("getInd",rowid,true); if(rc) { var sgc = $("td.sgcollapsed",rc)[0]; if(sgc) { $(sgc).trigger("click"); } } } }); }, collapseSubGridRow : function(rowid) { return this.each(function () { var $t = this; if(!$t.grid && !rowid) {return;} if($t.p.subGrid===true) { var rc = $(this).jqGrid("getInd",rowid,true); if(rc) { var sgc = $("td.sgexpanded",rc)[0]; if(sgc) { $(sgc).trigger("click"); } } } }); }, toggleSubGridRow : function(rowid) { return this.each(function () { var $t = this; if(!$t.grid && !rowid) {return;} if($t.p.subGrid===true) { var rc = $(this).jqGrid("getInd",rowid,true); if(rc) { var sgc = $("td.sgcollapsed",rc)[0]; if(sgc) { $(sgc).trigger("click"); } else { sgc = $("td.sgexpanded",rc)[0]; if(sgc) { $(sgc).trigger("click"); } } } } }); } }); })(jQuery); /* Transform a table to a jqGrid. Peter Romianowski <peter.romianowski@optivo.de> If the first column of the table contains checkboxes or radiobuttons then the jqGrid is made selectable. */ // Addition - selector can be a class or id function tableToGrid(selector, options) { jQuery(selector).each(function() { if(this.grid) {return;} //Adedd from Tony Tomov // This is a small "hack" to make the width of the jqGrid 100% jQuery(this).width("99%"); var w = jQuery(this).width(); // Text whether we have single or multi select var inputCheckbox = jQuery('input[type=checkbox]:first', jQuery(this)); var inputRadio = jQuery('input[type=radio]:first', jQuery(this)); var selectMultiple = inputCheckbox.length > 0; var selectSingle = !selectMultiple && inputRadio.length > 0; var selectable = selectMultiple || selectSingle; var inputName = inputCheckbox.attr("name") || inputRadio.attr("name"); // Build up the columnModel and the data var colModel = []; var colNames = []; jQuery('th', jQuery(this)).each(function() { if (colModel.length == 0 && selectable) { colModel.push({ name: '__selection__', index: '__selection__', width: 0, hidden: true }); colNames.push('__selection__'); } else { colModel.push({ name: jQuery(this).attr("id") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'), index: jQuery(this).attr("id") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'), width: jQuery(this).width() || 150 }); colNames.push(jQuery(this).html()); } }); var data = []; var rowIds = []; var rowChecked = []; jQuery('tbody > tr', jQuery(this)).each(function() { var row = {}; var rowPos = 0; jQuery('td', jQuery(this)).each(function() { if (rowPos == 0 && selectable) { var input = jQuery('input', jQuery(this)); var rowId = input.attr("value"); rowIds.push(rowId || data.length); if (input.attr("checked")) { rowChecked.push(rowId); } row[colModel[rowPos].name] = input.attr("value"); } else { row[colModel[rowPos].name] = jQuery(this).html(); } rowPos++; }); if(rowPos >0) data.push(row); }); // Clear the original HTML table jQuery(this).empty(); // Mark it as jqGrid jQuery(this).addClass("scroll"); jQuery(this).jqGrid($.extend({ datatype: "local", width: w, colNames: colNames, colModel: colModel, multiselect: selectMultiple //inputName: inputName, //inputValueCol: imputName != null ? "__selection__" : null }, options || {})); // Add data for (var a = 0; a < data.length; a++) { var id = null; if (rowIds.length > 0) { id = rowIds[a]; if (id && id.replace) { // We have to do this since the value of a checkbox // or radio button can be anything id = encodeURIComponent(id).replace(/[.\-%]/g, "_"); } } if (id == null) { id = a + 1; } jQuery(this).jqGrid("addRowData",id, data[a]); } // Set the selection for (var a = 0; a < rowChecked.length; a++) { jQuery(this).jqGrid("setSelection",rowChecked[a]); } }); }; ;(function($) { /* ** * jqGrid extension - Tree Grid * Tony Tomov tony@trirand.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ $.jgrid.extend({ setTreeNode : function(rd, row){ return this.each(function(){ var $t = this; if( !$t.grid || !$t.p.treeGrid ) { return; } var expCol = $t.p.expColInd; var expanded = $t.p.treeReader.expanded_field; var isLeaf = $t.p.treeReader.leaf_field; var level = $t.p.treeReader.level_field; row.level = rd[level]; if($t.p.treeGridModel == 'nested') { row.lft = rd[$t.p.treeReader.left_field]; row.rgt = rd[$t.p.treeReader.right_field]; if(!rd[isLeaf]) { // NS Model rd[isLeaf] = (parseInt(row.rgt,10) === parseInt(row.lft,10)+1) ? 'true' : 'false'; } } else { row.parent_id = rd[$t.p.treeReader.parent_id_field]; } var curLevel = parseInt(row.level,10), ident,lftpos; if($t.p.tree_root_level === 0) { ident = curLevel+1; lftpos = curLevel; } else { ident = curLevel; lftpos = curLevel -1; } var twrap = "<div class='tree-wrap tree-wrap-"+$t.p.direction+"' style='width:"+(ident*18)+"px;'>"; twrap += "<div style='"+($t.p.direction=="rtl" ? "right:" : "left:")+(lftpos*18)+"px;' class='ui-icon "; if(rd[isLeaf] == "true" || rd[isLeaf] ==true) { twrap += $t.p.treeIcons.leaf+" tree-leaf'"; row.isLeaf = true; } else { if(rd[expanded] == "true" || rd[expanded] == true) { twrap += $t.p.treeIcons.minus+" tree-minus treeclick'"; row.expanded = true; } else { twrap += $t.p.treeIcons.plus+" tree-plus treeclick'"; row.expanded = false; } row.isLeaf = false; } twrap += "</div></div>"; if(parseInt(rd[level],10) !== parseInt($t.p.tree_root_level,10)) { if(!$($t).jqGrid("isVisibleNode",row)){ $(row).css("display","none"); } } $("td:eq("+expCol+")",row).wrapInner("<span></span>").prepend(twrap); $(".treeclick",row).bind("click",function(e){ var target = e.target || e.srcElement; var ind =$(target,$t.rows).parents("tr.jqgrow")[0].rowIndex; if(!$t.rows[ind].isLeaf){ if($t.rows[ind].expanded){ $($t).jqGrid("collapseRow",$t.rows[ind]); $($t).jqGrid("collapseNode",$t.rows[ind]); } else { $($t).jqGrid("expandRow",$t.rows[ind]); $($t).jqGrid("expandNode",$t.rows[ind]); } } return false; }); if($t.p.ExpandColClick === true) { $("span", row).css("cursor","pointer").bind("click",function(e){ var target = e.target || e.srcElement; var ind =$(target,$t.rows).parents("tr.jqgrow")[0].rowIndex; if(!$t.rows[ind].isLeaf){ if($t.rows[ind].expanded){ $($t).jqGrid("collapseRow",$t.rows[ind]); $($t).jqGrid("collapseNode",$t.rows[ind]); } else { $($t).jqGrid("expandRow",$t.rows[ind]); $($t).jqGrid("expandNode",$t.rows[ind]); } } $($t).jqGrid("setSelection",$t.rows[ind].id); return false; }); } }); }, setTreeGrid : function() { return this.each(function (){ var $t = this, i=0, pico; if(!$t.p.treeGrid) { return; } if(!$t.p.treedatatype ) $.extend($t.p,{treedatatype: $t.p.datatype}); $t.p.subGrid = false; $t.p.altRows =false; $t.p.pgbuttons = false; $t.p.pginput = false; $t.p.multiselect = false; $t.p.rowList = []; pico = 'ui-icon-triangle-1-' + ($t.p.direction=="rtl" ? 'w' : 'e'); $t.p.treeIcons = $.extend({plus:pico,minus:'ui-icon-triangle-1-s',leaf:'ui-icon-radio-off'},$t.p.treeIcons || {}); if($t.p.treeGridModel == 'nested') { $t.p.treeReader = $.extend({ level_field: "level", left_field:"lft", right_field: "rgt", leaf_field: "isLeaf", expanded_field: "expanded" },$t.p.treeReader); } else if($t.p.treeGridModel == 'adjacency') { $t.p.treeReader = $.extend({ level_field: "level", parent_id_field: "parent", leaf_field: "isLeaf", expanded_field: "expanded" },$t.p.treeReader ); } for (var key in $t.p.colModel){ if($t.p.colModel[key].name == $t.p.ExpandColumn) { $t.p.expColInd = i; break; } i++; } if(!$t.p.expColInd) $t.p.expColInd =0; $.each($t.p.treeReader,function(i,n){ if(n){ $t.p.colNames.push(n); $t.p.colModel.push({name:n,width:1,hidden:true,sortable:false,resizable:false,hidedlg:true,editable:true,search:false}); } }); }); }, expandRow: function (record){ this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } var childern = $($t).jqGrid("getNodeChildren",record); //if ($($t).jqGrid("isVisibleNode",record)) { $(childern).each(function(i){ $(this).css("display",""); if(this.expanded) { $($t).jqGrid("expandRow",this); } }); //} }); }, collapseRow : function (record) { this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } var childern = $($t).jqGrid("getNodeChildren",record); $(childern).each(function(i){ $(this).css("display","none"); if(this.expanded) $($t).jqGrid("collapseRow",this); }); }); }, // NS ,adjacency models getRootNodes : function() { var result = []; this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } switch ($t.p.treeGridModel) { case 'nested' : var level = $t.p.treeReader.level_field; $($t.rows).each(function(i){ if(parseInt(this[level],10) === parseInt($t.p.tree_root_level,10)) { result.push(this); } }); break; case 'adjacency' : $($t.rows).each(function(i){ if(this.parent_id == null || this.parent_id.toLowerCase() == "null") { result.push(this); } }); break; } }); return result; }, getNodeDepth : function(rc) { var ret = null; this.each(function(){ var $t = this; if(!this.grid || !this.p.treeGrid) { return; } switch ($t.p.treeGridModel) { case 'nested' : ret = parseInt(rc.level,10) - parseInt(this.p.tree_root_level,10); break; case 'adjacency' : ret = $($t).jqGrid("getNodeAncestors",rc).length; break; } }); return ret; }, getNodeParent : function(rc) { var result = null; this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } switch ($t.p.treeGridModel) { case 'nested' : var lft = parseInt(rc.lft,10), rgt = parseInt(rc.rgt,10), level = parseInt(rc.level,10); $(this.rows).each(function(){ if(parseInt(this.level,10) === level-1 && parseInt(this.lft) < lft && parseInt(this.rgt) > rgt) { result = this; return false; } }); break; case 'adjacency' : $(this.rows).each(function(){ if(this.id == rc.parent_id ) { result = this; return false; } }); break; } }); return result; }, getNodeChildren : function(rc) { var result = []; this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } switch ($t.p.treeGridModel) { case 'nested' : var lft = parseInt(rc.lft,10), rgt = parseInt(rc.rgt,10), level = parseInt(rc.level,10); $(this.rows).each(function(i){ if(parseInt(this.level,10) === level+1 && parseInt(this.lft,10) > lft && parseInt(this.rgt,10) < rgt) { result.push(this); } }); break; case 'adjacency' : $(this.rows).each(function(i){ if(this.parent_id == rc.id) { result.push(this); } }); break; } }); return result; }, getFullTreeNode : function(rc) { var result = []; this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } switch ($t.p.treeGridModel) { case 'nested' : var lft = parseInt(rc.lft,10), rgt = parseInt(rc.rgt,10), level = parseInt(rc.level,10); $(this.rows).each(function(i){ if(parseInt(this.level,10) >= level && parseInt(this.lft,10) >= lft && parseInt(this.lft,10) <= rgt) { result.push(this); } }); break; case 'adjacency' : result.push(rc); $(this.rows).each(function(i){ len = result.length; for (i = 0; i < len; i++) { if (result[i].id == this.parent_id) { result.push(this); break; } } }); break; } }); return result; }, // End NS, adjacency Model getNodeAncestors : function(rc) { var ancestors = []; this.each(function(){ if(!this.grid || !this.p.treeGrid) { return; } var parent = $(this).jqGrid("getNodeParent",rc); while (parent) { ancestors.push(parent); parent = $(this).jqGrid("getNodeParent",parent); } }); return ancestors; }, isVisibleNode : function(rc) { var result = true; this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } var ancestors = $($t).jqGrid("getNodeAncestors",rc); $(ancestors).each(function(){ result = result && this.expanded; if(!result) {return false;} }); }); return result; }, isNodeLoaded : function(rc) { var result; this.each(function(){ var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } if(rc.loaded !== undefined) { result = rc.loaded; } else if( rc.isLeaf || $($t).jqGrid("getNodeChildren",rc).length > 0){ result = true; } else { result = false; } }); return result; }, expandNode : function(rc) { return this.each(function(){ if(!this.grid || !this.p.treeGrid) { return; } if(!rc.expanded) { if( $(this).jqGrid("isNodeLoaded",rc) ) { rc.expanded = true; $("div.treeclick",rc).removeClass(this.p.treeIcons.plus+" tree-plus").addClass(this.p.treeIcons.minus+" tree-minus"); } else { rc.expanded = true; $("div.treeclick",rc).removeClass(this.p.treeIcons.plus+" tree-plus").addClass(this.p.treeIcons.minus+" tree-minus"); this.p.treeANode = rc.rowIndex; this.p.datatype = this.p.treedatatype; if(this.p.treeGridModel == 'nested') { $(this).jqGrid("setGridParam",{postData:{nodeid:rc.id,n_left:rc.lft,n_right:rc.rgt,n_level:rc.level}}); } else { $(this).jqGrid("setGridParam",{postData:{nodeid:rc.id,parentid:rc.parent_id,n_level:rc.level}}); } $(this).trigger("reloadGrid"); if(this.p.treeGridModel == 'nested') { $(this).jqGrid("setGridParam",{postData:{nodeid:'',n_left:'',n_right:'',n_level:''}}); } else { $(this).jqGrid("setGridParam",{postData:{nodeid:'',parentid:'',n_level:''}}); } } } }); }, collapseNode : function(rc) { return this.each(function(){ if(!this.grid || !this.p.treeGrid) { return; } if(rc.expanded) { rc.expanded = false; $("div.treeclick",rc).removeClass(this.p.treeIcons.minus+" tree-minus").addClass(this.p.treeIcons.plus+" tree-plus"); } }); }, SortTree : function( newDir) { return this.each(function(){ if(!this.grid || !this.p.treeGrid) { return; } var i, len, rec, records = [], $t = this, roots = $(this).jqGrid("getRootNodes"); // Sorting roots roots.sort(function(a, b) { if (a.sortKey < b.sortKey) {return -newDir;} if (a.sortKey > b.sortKey) {return newDir;} return 0; }); if(roots[0]){ $("td",roots[0]).each( function( k ) { $(this).css("width",$t.grid.headers[k].width+"px"); }); $t.grid.cols = roots[0].cells; } // Sorting children for (i = 0, len = roots.length; i < len; i++) { rec = roots[i]; records.push(rec); $(this).jqGrid("collectChildrenSortTree",records, rec, newDir); } $.each(records, function(index, row) { $('tbody',$t.grid.bDiv).append(row); row.sortKey = null; }); }); }, collectChildrenSortTree : function(records, rec, newDir) { return this.each(function(){ if(!this.grid || !this.p.treeGrid) { return; } var i, len, child, children = $(this).jqGrid("getNodeChildren",rec); children.sort(function(a, b) { if (a.sortKey < b.sortKey) {return -newDir;} if (a.sortKey > b.sortKey) {return newDir;} return 0; }); for (i = 0, len = children.length; i < len; i++) { child = children[i]; records.push(child); $(this).jqGrid("collectChildrenSortTree",records, child,newDir); } }); }, // experimental setTreeRow : function(rowid, data) { var nm, success=false; this.each(function(){ var t = this; if(!t.grid || !t.p.treeGrid) { return; } success = $(t).jqGrid("setRowData",rowid,data); }); return success; }, delTreeNode : function (rowid) { return this.each(function () { var $t = this; if(!$t.grid || !$t.p.treeGrid) { return; } var rc = $($t).jqGrid("getInd",rowid,true); if (rc) { var dr = $($t).jqGrid("getNodeChildren",rc); if(dr.length>0){ for (var i=0;i<dr.length;i++){ $($t).jqGrid("delRowData",dr[i].id); } } $($t).jqGrid("delRowData",rc.id); } }); } }); })(jQuery); /* * jqDnR - Minimalistic Drag'n'Resize for jQuery. * * Copyright (c) 2007 Brice Burgess <bhb@iceburg.net>, http://www.iceburg.net * Licensed under the MIT License: * http://www.opensource.org/licenses/mit-license.php * * $Version: 2007.08.19 +r2 */ (function($){ $.fn.jqDrag=function(h){return i(this,h,'d');}; $.fn.jqResize=function(h,ar){return i(this,h,'r',ar);}; $.jqDnR={ dnr:{}, e:0, drag:function(v){ if(M.k == 'd')E.css({left:M.X+v.pageX-M.pX,top:M.Y+v.pageY-M.pY}); else { E.css({width:Math.max(v.pageX-M.pX+M.W,0),height:Math.max(v.pageY-M.pY+M.H,0)}); if(M1){E1.css({width:Math.max(v.pageX-M1.pX+M1.W,0),height:Math.max(v.pageY-M1.pY+M1.H,0)});} } return false; }, stop:function(){ //E.css('opacity',M.o); $(document).unbind('mousemove',J.drag).unbind('mouseup',J.stop); } }; var J=$.jqDnR,M=J.dnr,E=J.e,E1, i=function(e,h,k,aR){ return e.each(function(){ h=(h)?$(h,e):e; h.bind('mousedown',{e:e,k:k},function(v){ var d=v.data,p={};E=d.e;E1 = aR ? $(aR) : false; // attempt utilization of dimensions plugin to fix IE issues if(E.css('position') != 'relative'){try{E.position(p);}catch(e){}} M={ X:p.left||f('left')||0, Y:p.top||f('top')||0, W:f('width')||E[0].scrollWidth||0, H:f('height')||E[0].scrollHeight||0, pX:v.pageX, pY:v.pageY, k:d.k //o:E.css('opacity') }; // also resize if(E1 && d.k != 'd'){ M1={ X:p.left||f1('left')||0, Y:p.top||f1('top')||0, W:E1[0].offsetWidth||f1('width')||0, H:E1[0].offsetHeight||f1('height')||0, pX:v.pageX, pY:v.pageY, k:d.k }; } else {M1 = false;} //E.css({opacity:0.8}); $(document).mousemove($.jqDnR.drag).mouseup($.jqDnR.stop); return false; }); }); }, f=function(k){return parseInt(E.css(k))||false;}; f1=function(k){ return parseInt(E1.css(k))||false;}; })(jQuery); /* * jqModal - Minimalist Modaling with jQuery * (http://dev.iceburg.net/jquery/jqmodal/) * * Copyright (c) 2007,2008 Brice Burgess <bhb@iceburg.net> * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * $Version: 07/06/2008 +r13 */ (function($) { $.fn.jqm=function(o){ var p={ overlay: 50, closeoverlay : true, overlayClass: 'jqmOverlay', closeClass: 'jqmClose', trigger: '.jqModal', ajax: F, ajaxText: '', target: F, modal: F, toTop: F, onShow: F, onHide: F, onLoad: F }; return this.each(function(){if(this._jqm)return H[this._jqm].c=$.extend({},H[this._jqm].c,o);s++;this._jqm=s; H[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s}; if(p.trigger)$(this).jqmAddTrigger(p.trigger); });}; $.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide');}; $.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow');}; $.fn.jqmShow=function(t){return this.each(function(){$.jqm.open(this._jqm,t);});}; $.fn.jqmHide=function(t){return this.each(function(){$.jqm.close(this._jqm,t)});}; $.jqm = { hash:{}, open:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=(parseInt(h.w.css('z-index')));z=(z>0)?z:3000;var o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});if(h.a)return F;h.t=t;h.a=true;h.w.css('z-index',z); if(c.modal) {if(!A[0])setTimeout(function(){L('bind');},1);A.push(s);} else if(c.overlay > 0) {if(c.closeoverlay) h.w.jqmAddClose(o);} else o=F; h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):F; if(ie6){$('html,body').css({height:'100%',width:'100%'});if(o){o=o.css({position:'absolute'})[0];for(var y in {Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'");}} if(c.ajax) {var r=c.target||h.w,u=c.ajax;r=(typeof r == 'string')?$(r,h.w):$(r);u=(u.substr(0,1) == '@')?$(t).attr(u.substring(1)):u; r.html(c.ajaxText).load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h);});} else if(cc)h.w.jqmAddClose($(cc,h.w)); if(c.toTop&&h.o)h.w.before('<span id="jqmP'+h.w[0]._jqm+'"></span>').insertAfter(h.o); (c.onShow)?c.onShow(h):h.w.show();e(h);return F; }, close:function(s){var h=H[s];if(!h.a)return F;h.a=F; if(A[0]){A.pop();if(!A[0])L('unbind');} if(h.c.toTop&&h.o)$('#jqmP'+h.w[0]._jqm).after(h.w).remove(); if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove();} return F; }, params:{}}; var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&($.browser.version == "6.0"),F=false, e=function(h){var i=$('<iframe src="javascript:false;document.write(\'\');" class="jqm"></iframe>').css({opacity:0});if(ie6)if(h.o)h.o.html('<p style="width:100%;height:100%"/>').prepend(i);else if(!$('iframe.jqm',h.w)[0])h.w.prepend(i); f(h);}, f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(_){}}, L=function(t){$(document)[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m);}, m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r)f(h);return !r;}, hs=function(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function() { if(!this[c]){this[c]=[];$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return F;});}this[c].push(s);});});}; })(jQuery); /* ** * formatter for values but most of the values if for jqGrid * Some of this was inspired and based on how YUI does the table datagrid but in jQuery fashion * we are trying to keep it as light as possible * Joshua Burnett josh@9ci.com * http://www.greenbill.com * * Changes from Tony Tomov tony@trirand.com * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * **/ ;(function($) { $.fmatter = {}; //opts can be id:row id for the row, rowdata:the data for the row, colmodel:the column model for this column //example {id:1234,} $.fn.fmatter = function(formatType, cellval, opts, rwd, act) { //debug(this); //debug(cellval); // build main options before element iteration opts = $.extend({}, $.jgrid.formatter, opts); return fireFormatter(formatType,cellval, opts, rwd, act); }; $.fmatter.util = { // Taken from YAHOO utils NumberFormat : function(nData,opts) { if(!isNumber(nData)) { nData *= 1; } if(isNumber(nData)) { var bNegative = (nData < 0); var sOutput = nData + ""; var sDecimalSeparator = (opts.decimalSeparator) ? opts.decimalSeparator : "."; var nDotIndex; if(isNumber(opts.decimalPlaces)) { // Round to the correct decimal place var nDecimalPlaces = opts.decimalPlaces; var nDecimal = Math.pow(10, nDecimalPlaces); sOutput = Math.round(nData*nDecimal)/nDecimal + ""; nDotIndex = sOutput.lastIndexOf("."); if(nDecimalPlaces > 0) { // Add the decimal separator if(nDotIndex < 0) { sOutput += sDecimalSeparator; nDotIndex = sOutput.length-1; } // Replace the "." else if(sDecimalSeparator !== "."){ sOutput = sOutput.replace(".",sDecimalSeparator); } // Add missing zeros while((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) { sOutput += "0"; } } } if(opts.thousandsSeparator) { var sThousandsSeparator = opts.thousandsSeparator; nDotIndex = sOutput.lastIndexOf(sDecimalSeparator); nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length; var sNewOutput = sOutput.substring(nDotIndex); var nCount = -1; for (var i=nDotIndex; i>0; i--) { nCount++; if ((nCount%3 === 0) && (i !== nDotIndex) && (!bNegative || (i > 1))) { sNewOutput = sThousandsSeparator + sNewOutput; } sNewOutput = sOutput.charAt(i-1) + sNewOutput; } sOutput = sNewOutput; } // Prepend prefix sOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput; // Append suffix sOutput = (opts.suffix) ? sOutput + opts.suffix : sOutput; return sOutput; } else { return nData; } }, // Tony Tomov // PHP implementation. Sorry not all options are supported. // Feel free to add them if you want DateFormat : function (format, date, newformat, opts) { var token = /\\.|[dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU]/g, timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, timezoneClip = /[^-+\dA-Z]/g, pad = function (value, length) { value = String(value); length = parseInt(length) || 2; while (value.length < length) value = '0' + value; return value; }, ts = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0}, timestamp=0, dM, k,hl, dateFormat=["i18n"]; // Internationalization strings dateFormat["i18n"] = { dayNames: opts.dayNames, monthNames: opts.monthNames }; if( format in opts.masks ) format = opts.masks[format]; date = date.split(/[\\\/:_;.\t\T\s-]/); format = format.split(/[\\\/:_;.\t\T\s-]/); // parsing for month names for(k=0,hl=format.length;k<hl;k++){ if(format[k] == 'M') { dM = $.inArray(date[k],dateFormat.i18n.monthNames); if(dM !== -1 && dM < 12){date[k] = dM+1;} } if(format[k] == 'F') { dM = $.inArray(date[k],dateFormat.i18n.monthNames); if(dM !== -1 && dM > 11){date[k] = dM+1-12;} } ts[format[k].toLowerCase()] = parseInt(date[k],10); } ts.m = parseInt(ts.m)-1; var ty = ts.y; if (ty >= 70 && ty <= 99) ts.y = 1900+ts.y; else if (ty >=0 && ty <=69) ts.y= 2000+ts.y; timestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s,0); if( newformat in opts.masks ) { newformat = opts.masks[newformat]; } else if ( !newformat ) { newformat = 'Y-m-d'; } var G = timestamp.getHours(), i = timestamp.getMinutes(), j = timestamp.getDate(), n = timestamp.getMonth() + 1, o = timestamp.getTimezoneOffset(), s = timestamp.getSeconds(), u = timestamp.getMilliseconds(), w = timestamp.getDay(), Y = timestamp.getFullYear(), N = (w + 6) % 7 + 1, z = (new Date(Y, n - 1, j) - new Date(Y, 0, 1)) / 86400000, flags = { // Day d: pad(j), D: dateFormat.i18n.dayNames[w], j: j, l: dateFormat.i18n.dayNames[w + 7], N: N, S: opts.S(j), //j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th', w: w, z: z, // Week W: N < 5 ? Math.floor((z + N - 1) / 7) + 1 : Math.floor((z + N - 1) / 7) || ((new Date(Y - 1, 0, 1).getDay() + 6) % 7 < 4 ? 53 : 52), // Month F: dateFormat.i18n.monthNames[n - 1 + 12], m: pad(n), M: dateFormat.i18n.monthNames[n - 1], n: n, t: '?', // Year L: '?', o: '?', Y: Y, y: String(Y).substring(2), // Time a: G < 12 ? opts.AmPm[0] : opts.AmPm[1], A: G < 12 ? opts.AmPm[2] : opts.AmPm[3], B: '?', g: G % 12 || 12, G: G, h: pad(G % 12 || 12), H: pad(G), i: pad(i), s: pad(s), u: u, // Timezone e: '?', I: '?', O: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), P: '?', T: (String(timestamp).match(timezone) || [""]).pop().replace(timezoneClip, ""), Z: '?', // Full Date/Time c: '?', r: '?', U: Math.floor(timestamp / 1000) }; return newformat.replace(token, function ($0) { return $0 in flags ? flags[$0] : $0.substring(1); }); } }; $.fn.fmatter.defaultFormat = function(cellval, opts) { return (isValue(cellval) && cellval!=="" ) ? cellval : opts.defaultValue ? opts.defaultValue : " "; }; $.fn.fmatter.email = function(cellval, opts) { if(!isEmpty(cellval)) { return "<a href=\"mailto:" + cellval + "\">" + cellval + "</a>"; }else { return $.fn.fmatter.defaultFormat(cellval,opts ); } }; $.fn.fmatter.checkbox =function(cval, opts) { var op = $.extend({},opts.checkbox), ds; if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(op.disabled===true) {ds = "disabled";} else {ds="";} if(isEmpty(cval) || isUndefined(cval) ) cval = $.fn.fmatter.defaultFormat(cval,op); cval=cval+""; cval=cval.toLowerCase(); var bchk = cval.search(/(false|0|no|off)/i)<0 ? " checked='checked' " : ""; return "<input type=\"checkbox\" " + bchk + " value=\""+ cval+"\" offval=\"no\" "+ds+ "/>"; }, $.fn.fmatter.link = function(cellval, opts) { var op = {target:opts.target }; var target = ""; if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(op.target) {target = 'target=' + op.target;} if(!isEmpty(cellval)) { return "<a "+target+" href=\"" + cellval + "\">" + cellval + "</a>"; }else { return $.fn.fmatter.defaultFormat(cellval,opts); } }; $.fn.fmatter.showlink = function(cellval, opts) { var op = {baseLinkUrl: opts.baseLinkUrl,showAction:opts.showAction, addParam: opts.addParam || "", target: opts.target, idName: opts.idName }, target = ""; if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(op.target) {target = 'target=' + op.target;} idUrl = op.baseLinkUrl+op.showAction + '?'+ op.idName+'='+opts.rowId+op.addParam; if(isString(cellval)) { //add this one even if its blank string return "<a "+target+" href=\"" + idUrl + "\">" + cellval + "</a>"; }else { return $.fn.fmatter.defaultFormat(cellval,opts); } }; $.fn.fmatter.integer = function(cellval, opts) { var op = $.extend({},opts.integer); if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(isEmpty(cellval)) { return op.defaultValue; } return $.fmatter.util.NumberFormat(cellval,op); }; $.fn.fmatter.number = function (cellval, opts) { var op = $.extend({},opts.number); if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(isEmpty(cellval)) { return op.defaultValue; } return $.fmatter.util.NumberFormat(cellval,op); }; $.fn.fmatter.currency = function (cellval, opts) { var op = $.extend({},opts.currency); if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(isEmpty(cellval)) { return op.defaultValue; } return $.fmatter.util.NumberFormat(cellval,op); }; $.fn.fmatter.date = function (cellval, opts, rwd, act) { var op = $.extend({},opts.date); if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend({},op,opts.colModel.formatoptions); } if(!op.reformatAfterEdit && act=='edit'){ return $.fn.fmatter.defaultFormat(cellval, opts); } else if(!isEmpty(cellval)) { return $.fmatter.util.DateFormat(op.srcformat,cellval,op.newformat,op); } else { return $.fn.fmatter.defaultFormat(cellval, opts); } }; $.fn.fmatter.select = function (cellval,opts, rwd, act) { // jqGrid specific cellval = cellval + ""; var oSelect = false, ret=[]; if(!isUndefined(opts.colModel.editoptions)){ oSelect= opts.colModel.editoptions.value; } if (oSelect) { var msl = opts.colModel.editoptions.multiple === true ? true : false, scell = [], sv; if(msl) { scell = cellval.split(","); scell = $.map(scell,function(n){return $.trim(n);})} if (isString(oSelect)) { // mybe here we can use some caching with care ???? var so = oSelect.split(";"), j=0; for(var i=0; i<so.length;i++){ sv = so[i].split(":"); if(sv.length > 2 ) { sv[1] = jQuery.map(sv,function(n,i){if(i>0)return n;}).join(":"); } if(msl) { if(jQuery.inArray(sv[0],scell)>-1) { ret[j] = sv[1]; j++; } } else if($.trim(sv[0])==$.trim(cellval)) { ret[0] = sv[1]; break; } } } else if(isObject(oSelect)) { // this is quicker if(msl) { ret = jQuery.map(scell, function(n, i){ return oSelect[n]; }); } else { ret[0] = oSelect[cellval] || ""; } } } cellval = ret.join(", "); return cellval == "" ? $.fn.fmatter.defaultFormat(cellval,opts) : cellval; }; $.fn.fmatter.rowactions = function(rid,gid,act,keys) { switch(act) { case 'edit': var restorerow = function() { $(".ui-inline-edit, .ui-inline-del","#"+rid).show(); $(".ui-inline-save, .ui-inline-cancel","#"+rid).hide(); } $('#'+gid).jqGrid('editRow',rid,keys,null,null,null,{oper:'edit'},restorerow,null,restorerow); $(".ui-inline-edit, .ui-inline-del","#"+rid).hide(); $(".ui-inline-save, .ui-inline-cancel","#"+rid).show(); break; case 'save': $('#'+gid).jqGrid('saveRow',rid,null,null,{oper:'edit'}); $(".ui-inline-edit, .ui-inline-del","#"+rid).show(); $(".ui-inline-save, .ui-inline-cancel","#"+rid).hide(); break; case 'cancel' : $('#'+gid).jqGrid('restoreRow',rid); $(".ui-inline-edit, .ui-inline-del","#"+rid).show(); $(".ui-inline-save, .ui-inline-cancel","#"+rid).hide(); break; } }; $.fn.fmatter.actions = function(cellval,opts, rwd) { var op ={keys:false}; if(!isUndefined(opts.colModel.formatoptions)) { op = $.extend(op,opts.colModel.formatoptions); } var rowid = opts.rowId; if(typeof(rowid) =='undefined' || isEmpty(rowid)) return ""; var ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','edit',"+op.keys+");" var str = "<div style='margin-left:8px;'><div title='"+$.jgrid.nav.edittitle+"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' "+ocl+"><span class='ui-icon ui-icon-pencil'></span></div>"; ocl = "onclick=jQuery('#"+opts.gid+"').jqGrid('delGridRow','"+rowid+"');" str = str+"<div title='"+$.jgrid.nav.deltitle+"' style='float:left;margin-left:5px;' class='ui-pg-div ui-inline-del' "+ocl+"><span class='ui-icon ui-icon-trash'></span></div>"; ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','save',false);" str = str+"<div title='"+$.jgrid.edit.bSubmit+"' style='float:left;display:none' class='ui-pg-div ui-inline-save'><span class='ui-icon ui-icon-disk' "+ocl+"></span></div>"; ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','cancel',false);" str = str+"<div title='"+$.jgrid.edit.bCancel+"' style='float:left;display:none;margin-left:5px;' class='ui-pg-div ui-inline-cancel'><span class='ui-icon ui-icon-cancel' "+ocl+"></span></div></div>"; return str; }; $.unformat = function (cellval,options,pos,cnt) { // specific for jqGrid only var ret, formatType = options.colModel.formatter, op =options.colModel.formatoptions || {}, sep, re = /([\.\*\_\'\(\)\{\}\+\?\\])/g; unformatFunc = options.colModel.unformat||($.fn.fmatter[formatType] && $.fn.fmatter[formatType].unformat); if(typeof unformatFunc !== 'undefined' && isFunction(unformatFunc) ) { ret = unformatFunc($(cellval).text(), options, cellval); } else if(typeof formatType !== 'undefined' && isString(formatType) ) { var opts = $.jgrid.formatter || {}, stripTag; switch(formatType) { case 'integer' : op = $.extend({},opts.integer,op); sep = op.thousandsSeparator.replace(re,"\\$1"); stripTag = new RegExp(sep, "g"); ret = $(cellval).text().replace(stripTag,''); break; case 'number' : op = $.extend({},opts.number,op); sep = op.thousandsSeparator.replace(re,"\\$1"); stripTag = new RegExp(sep, "g"); ret = $(cellval).text().replace(stripTag,"").replace(op.decimalSeparator,'.'); break; case 'currency': op = $.extend({},opts.currency,op); sep = op.thousandsSeparator.replace(re,"\\$1"); stripTag = new RegExp(sep, "g"); ret = $(cellval).text().replace(stripTag,'').replace(op.decimalSeparator,'.').replace(op.prefix,'').replace(op.suffix,''); break; case 'checkbox': var cbv = (options.colModel.editoptions) ? options.colModel.editoptions.value.split(":") : ["Yes","No"]; ret = $('input',cellval).attr("checked") ? cbv[0] : cbv[1]; break; case 'select' : ret = $.unformat.select(cellval,options,pos,cnt); break; case 'actions': return ""; default: ret= $(cellval).text(); } } return ret ? ret : cnt===true ? $(cellval).text() : $.jgrid.htmlDecode($(cellval).html()); }; $.unformat.select = function (cellval,options,pos,cnt) { // Spacial case when we have local data and perform a sort // cnt is set to true only in sortDataArray var ret = []; var cell = $(cellval).text(); if(cnt==true) return cell; var op = $.extend({},options.colModel.editoptions); if(op.value){ var oSelect = op.value, msl = op.multiple === true ? true : false, scell = [], sv; if(msl) { scell = cell.split(","); scell = $.map(scell,function(n){return $.trim(n);})} if (isString(oSelect)) { var so = oSelect.split(";"), j=0; for(var i=0; i<so.length;i++){ sv = so[i].split(":"); if(msl) { if(jQuery.inArray(sv[1],scell)>-1) { ret[j] = sv[0]; j++; } } else if($.trim(sv[1])==$.trim(cell)) { ret[0] = sv[0]; break; } } } else if(isObject(oSelect)) { if(!msl) scell[0] = cell; ret = jQuery.map(scell, function(n){ var rv; $.each(oSelect, function(i,val){ if (val == n) { rv = i; return false; } }); if( rv) return rv; }); } return ret.join(", "); } else { return cell || ""; } }; function fireFormatter(formatType,cellval, opts, rwd, act) { var v=cellval; if ($.fn.fmatter[formatType]){ v = $.fn.fmatter[formatType](cellval, opts, rwd, act); } return v; }; //private methods and data function debug($obj) { if (window.console && window.console.log) window.console.log($obj); }; /** * A convenience method for detecting a legitimate non-null value. * Returns false for null/undefined/NaN, true for other values, * including 0/false/'' * --taken from the yui.lang */ isValue= function(o) { return (isObject(o) || isString(o) || isNumber(o) || isBoolean(o)); }; isBoolean= function(o) { return typeof o === 'boolean'; }; isNull= function(o) { return o === null; }; isNumber= function(o) { return typeof o === 'number' && isFinite(o); }; isString= function(o) { return typeof o === 'string'; }; /** * check if its empty trim it and replace \  and \  with '' and check if its empty ==="" * if its is not a string but has a value then it returns false, Returns true for null/undefined/NaN essentailly this provdes a way to see if it has any value to format for things like links */ isEmpty= function(o) { if(!isString(o) && isValue(o)) { return false; }else if (!isValue(o)){ return true; } o = $.trim(o).replace(/\ \;/ig,'').replace(/\ \;/ig,''); return o===""; }; isUndefined= function(o) { return typeof o === 'undefined'; }; isObject= function(o) { return (o && (typeof o === 'object' || isFunction(o))) || false; }; isFunction= function(o) { return typeof o === 'function'; }; })(jQuery); /* Plugin: searchFilter v1.2.9 * Author: Kasey Speakman (kasey@cornerspeed.com) * License: Dual Licensed, MIT and GPL v2 (http://www.gnu.org/copyleft/gpl.html) * * REQUIREMENTS: * jQuery 1.3+ (http://jquery.com/) * A Themeroller Theme (http://jqueryui.com/themeroller/) * * SECURITY WARNING * You should always implement server-side checking to ensure that * the query will fail when forged/invalid data is received. * Clever users can send any value they want through JavaScript and HTTP POST/GET. * * THEMES * Simply include the CSS file for your Themeroller theme. * * DESCRIPTION * This plugin creates a new searchFilter object in the specified container * * INPUT TYPE * fields: an array of field objects. each object has the following properties: * text: a string containing the display name of the field (e.g. "Field 1") * itemval: a string containing the actual field name (e.g. "field1") * optional properties: * ops: an array of operators in the same format as jQuery.fn.searchFilter.defaults.operators * that is: [ { op: 'gt', text: 'greater than'}, { op:'lt', text: 'less than'}, ... ] * if not specified, the passed-in options used, and failting that, jQuery.fn.searchFilter.defaults.operators will be used * *** NOTE *** * Specifying a dataUrl or dataValues property means that a <select ...> (drop-down-list) will be generated * instead of a text input <input type='text'.../> where the user would normally type in their search data * ************ * dataUrl: a url that will return the html select for this field, this url will only be called once for this field * dataValues: the possible values for this field in the form [ { text: 'Data Display Text', value: 'data_actual_value' }, { ... } ] * dataInit: a function that you can use to initialize the data field. this function is passed the jQuery-fied data element * dataEvents: list of events to apply to the data element. uses $("#id").bind(type, [data], fn) to bind events to data element * *** JSON of this object could look like this: *** * var fields = [ * { * text: 'Field Display Name', * itemval: 'field_actual_name', * // below this are optional values * ops: [ // this format is the same as jQuery.fn.searchFilter.defaults.operators * { op: 'gt', text: 'greater than' }, * { op: 'lt', text: 'less than' } * ], * dataUrl: 'http://server/path/script.php?propName=propValue', // using this creates a select for the data input instead of an input type='text' * dataValues: [ // using this creates a select for the data input instead of an input type='text' * { text: 'Data Value Display Name', value: 'data_actual_value' }, * { ... } * ], * dataInit: function(jElem) { jElem.datepicker(options); }, * dataEvents: [ // these are the same options that you pass to $("#id").bind(type, [data], fn) * { type: 'click', data: { i: 7 }, fn: function(e) { console.log(e.data.i); } }, * { type: 'keypress', fn: function(e) { console.log('keypress'); } } * ] * }, * { ... } * ] * options: name:value properties containing various creation options * see jQuery.fn.searchFilter.defaults for the overridable options * * RETURN TYPE: This plugin returns a SearchFilter object, which has additional SearchFilter methods: * Methods * add: Adds a filter. added to the end of the list unless a jQuery event object or valid row number is passed. * del: Removes a filter. removed from the end of the list unless a jQuery event object or valid row number is passed. * reset: resets filters back to original state (only one blank filter), and calls onReset * search: puts the search rules into an object and calls onSearch with it * close: calls the onClose event handler * * USAGE * HTML * <head> * ... * <script src="path/to/jquery.min.js" type="text/javascript"></script> * <link href="path/to/themeroller.css" rel="Stylesheet" type="text/css" /> * <script src="path/to/jquery.searchFilter.js" type="text/javascript"></script> * <link href="path/to/jquery.searchFilter.css" rel="Stylesheet" type="text/css" /> * ... * </head> * <body> * ... * <div id='mySearch'></div> * ... * </body> * JQUERY * Methods * initializing: $("#mySearch").searchFilter([{text: "Field 1", value: "field1"},{text: "Field 2", value: "field2"}], {onSearch: myFilterRuleReceiverFn, onReset: myFilterResetFn }); * Manual Methods (there's no need to call these methods unless you are trying to manipulate searchFilter with script) * add: $("#mySearch").searchFilter().add(); // appends a blank filter * $("#mySearch").searchFilter().add(0); // copies the first filter as second * del: $("#mySearch").searchFilter().del(); // removes the bottom filter * $("#mySearch").searchFilter().del(1); // removes the second filter * search: $("#mySearch").searchFilter().search(); // invokes onSearch, passing it a ruleGroup object * reset: $("#mySearch").searchFilter().reset(); // resets rules and invokes onReset * close: $("#mySearch").searchFilter().close(); // without an onClose handler, equivalent to $("#mySearch").hide(); * * NOTE: You can get the jQuery object back from the SearchFilter object by chaining .$ * Example * $("#mySearch").searchFilter().add().add().reset().$.hide(); * Verbose Example * $("#mySearch") // gets jQuery object for the HTML element with id="mySearch" * .searchFilter() // gets the SearchFilter object for an existing search filter * .add() // adds a new filter to the end of the list * .add() // adds another new filter to the end of the list * .reset() // resets filters back to original state, triggers onReset * .$ // returns jQuery object for $("#mySearch") * .hide(); // equivalent to $("#mySearch").hide(); */ jQuery.fn.searchFilter = function(fields, options) { function SearchFilter(jQ, fields, options) { //--------------------------------------------------------------- // PUBLIC VARS //--------------------------------------------------------------- this.$ = jQ; // makes the jQuery object available as .$ from the return value //--------------------------------------------------------------- // PUBLIC FUNCTIONS //--------------------------------------------------------------- this.add = function(i) { if (i == null) jQ.find(".ui-add-last").click(); else jQ.find(".sf:eq(" + i + ") .ui-add").click(); return this; }; this.del = function(i) { if (i == null) jQ.find(".sf:last .ui-del").click(); else jQ.find(".sf:eq(" + i + ") .ui-del").click(); return this; }; this.search = function(e) { jQ.find(".ui-search").click(); return this; }; this.reset = function(e) { jQ.find(".ui-reset").click(); return this; }; this.close = function() { jQ.find(".ui-closer").click(); return this; }; //--------------------------------------------------------------- // "CONSTRUCTOR" (in air quotes) //--------------------------------------------------------------- if (fields != null) { // type coercion matches undefined as well as null //--------------------------------------------------------------- // UTILITY FUNCTIONS //--------------------------------------------------------------- function hover() { jQuery(this).toggleClass("ui-state-hover"); return false; } function active(e) { jQuery(this).toggleClass("ui-state-active", (e.type == "mousedown")); return false; } function buildOpt(value, text) { return "<option value='" + value + "'>" + text + "</option>"; } function buildSel(className, options, isHidden) { return "<select class='" + className + "'" + (isHidden ? " style='display:none;'" : "") + ">" + options + "</select>"; } function initData(selector, fn) { var jElem = jQ.find("tr.sf td.data " + selector); if (jElem[0] != null) fn(jElem); } function bindDataEvents(selector, events) { var jElem = jQ.find("tr.sf td.data " + selector); if (jElem[0] != null) { jQuery.each(events, function() { if (this.data != null) jElem.bind(this.type, this.data, this.fn); else jElem.bind(this.type, this.fn); }); } } //--------------------------------------------------------------- // SUPER IMPORTANT PRIVATE VARS //--------------------------------------------------------------- // copies jQuery.fn.searchFilter.defaults.options properties onto an empty object, then options onto that var opts = jQuery.extend({}, jQuery.fn.searchFilter.defaults, options); // this is keeps track of the last asynchronous setup var highest_late_setup = -1; //--------------------------------------------------------------- // CREATION PROCESS STARTS //--------------------------------------------------------------- // generate the global ops var gOps_html = ""; jQuery.each(opts.groupOps, function() { gOps_html += buildOpt(this.op, this.text); }); gOps_html = "<select name='groupOp'>" + gOps_html + "</select>"; /* original content - doesn't minify very well jQ .html("") // clear any old content .addClass("ui-searchFilter") // add classes .append( // add content "\ <div class='ui-widget-overlay' style='z-index: -1'> </div>\ <table class='ui-widget-content ui-corner-all'>\ <thead>\ <tr>\ <td colspan='5' class='ui-widget-header ui-corner-all' style='line-height: 18px;'>\ <div class='ui-closer ui-state-default ui-corner-all ui-helper-clearfix' style='float: right;'>\ <span class='ui-icon ui-icon-close'></span>\ </div>\ " + opts.windowTitle + "\ </td>\ </tr>\ </thead>\ <tbody>\ <tr class='sf'>\ <td class='fields'></td>\ <td class='ops'></td>\ <td class='data'></td>\ <td><div class='ui-del ui-state-default ui-corner-all'><span class='ui-icon ui-icon-minus'></span></div></td>\ <td><div class='ui-add ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plus'></span></div></td>\ </tr>\ <tr>\ <td colspan='5' class='divider'><div> </div></td>\ </tr>\ </tbody>\ <tfoot>\ <tr>\ <td colspan='3'>\ <span class='ui-reset ui-state-default ui-corner-all' style='display: inline-block; float: left;'><span class='ui-icon ui-icon-arrowreturnthick-1-w' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.resetText + "</span></span>\ <span class='ui-search ui-state-default ui-corner-all' style='display: inline-block; float: right;'><span class='ui-icon ui-icon-search' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.searchText + "</span></span>\ <span class='matchText'>" + opts.matchText + "</span> \ " + gOps_html + " \ <span class='rulesText'>" + opts.rulesText + "</span>\ </td>\ <td> </td>\ <td><div class='ui-add-last ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plusthick'></span></div></td>\ </tr>\ </tfoot>\ </table>\ "); /* end hard-to-minify code */ /* begin easier to minify code */ jQ.html("").addClass("ui-searchFilter").append("<div class='ui-widget-overlay' style='z-index: -1'> </div><table class='ui-widget-content ui-corner-all'><thead><tr><td colspan='5' class='ui-widget-header ui-corner-all' style='line-height: 18px;'><div class='ui-closer ui-state-default ui-corner-all ui-helper-clearfix' style='float: right;'><span class='ui-icon ui-icon-close'></span></div>" + opts.windowTitle + "</td></tr></thead><tbody><tr class='sf'><td class='fields'></td><td class='ops'></td><td class='data'></td><td><div class='ui-del ui-state-default ui-corner-all'><span class='ui-icon ui-icon-minus'></span></div></td><td><div class='ui-add ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plus'></span></div></td></tr><tr><td colspan='5' class='divider'><div> </div></td></tr></tbody><tfoot><tr><td colspan='3'><span class='ui-reset ui-state-default ui-corner-all' style='display: inline-block; float: left;'><span class='ui-icon ui-icon-arrowreturnthick-1-w' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.resetText + "</span></span><span class='ui-search ui-state-default ui-corner-all' style='display: inline-block; float: right;'><span class='ui-icon ui-icon-search' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.searchText + "</span></span><span class='matchText'>" + opts.matchText + "</span> " + gOps_html + " <span class='rulesText'>" + opts.rulesText + "</span></td><td> </td><td><div class='ui-add-last ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plusthick'></span></div></td></tr></tfoot></table>"); /* end easier-to-minify code */ var jRow = jQ.find("tr.sf"); var jFields = jRow.find("td.fields"); var jOps = jRow.find("td.ops"); var jData = jRow.find("td.data"); // generate the defaults var default_ops_html = ""; jQuery.each(opts.operators, function() { default_ops_html += buildOpt(this.op, this.text); }); default_ops_html = buildSel("default", default_ops_html, true); jOps.append(default_ops_html); var default_data_html = "<input type='text' class='default' style='display:none;' />"; jData.append(default_data_html); // generate the field list as a string var fields_html = ""; var has_custom_ops = false; var has_custom_data = false; jQuery.each(fields, function(i) { var field_num = i; fields_html += buildOpt(this.itemval, this.text); // add custom ops if they exist if (this.ops != null) { has_custom_ops = true; var custom_ops = ""; jQuery.each(this.ops, function() { custom_ops += buildOpt(this.op, this.text); }); custom_ops = buildSel("field" + field_num, custom_ops, true); jOps.append(custom_ops); } // add custom data if it is given if (this.dataUrl != null) { if (i > highest_late_setup) highest_late_setup = i; has_custom_data = true; var dEvents = this.dataEvents; var iEvent = this.dataInit; var bs = this.buildSelect; jQuery.ajax(jQuery.extend({ url : this.dataUrl, complete: function(data) { var $d; if(bs != null) $d =jQuery("<div />").append(bs(data)); else $d = jQuery("<div />").append(data.responseText); $d.find("select").addClass("field" + field_num).hide(); jData.append($d.html()); if (iEvent) initData(".field" + i, iEvent); if (dEvents) bindDataEvents(".field" + i, dEvents); if (i == highest_late_setup) { // change should get called no more than twice when this searchFilter is constructed jQ.find("tr.sf td.fields select[name='field']").change(); } } },opts.ajaxSelectOptions)); } else if (this.dataValues != null) { has_custom_data = true; var custom_data = ""; jQuery.each(this.dataValues, function() { custom_data += buildOpt(this.value, this.text); }); custom_data = buildSel("field" + field_num, custom_data, true); jData.append(custom_data); } else if (this.dataEvents != null || this.dataInit != null) { has_custom_data = true; var custom_data = "<input type='text' class='field" + field_num + "' />"; jData.append(custom_data); } // attach events to data if they exist if (this.dataInit != null && i != highest_late_setup) initData(".field" + i, this.dataInit); if (this.dataEvents != null && i != highest_late_setup) bindDataEvents(".field" + i, this.dataEvents); }); fields_html = "<select name='field'>" + fields_html + "</select>"; jFields.append(fields_html); // setup the field select with an on-change event if there are custom ops or data var jFSelect = jFields.find("select[name='field']"); if (has_custom_ops) jFSelect.change(function(e) { var index = e.target.selectedIndex; var td = jQuery(e.target).parents("tr.sf").find("td.ops"); td.find("select").removeAttr("name").hide(); // disown and hide all elements var jElem = td.find(".field" + index); if (jElem[0] == null) jElem = td.find(".default"); // if there's not an element for that field, use the default one jElem.attr("name", "op").show(); }); else jOps.find(".default").attr("name", "op").show(); if (has_custom_data) jFSelect.change(function(e) { var index = e.target.selectedIndex; var td = jQuery(e.target).parents("tr.sf").find("td.data"); td.find("select,input").removeClass("vdata").hide(); // disown and hide all elements var jElem = td.find(".field" + index); if (jElem[0] == null) jElem = td.find(".default"); // if there's not an element for that field, use the default one jElem.show().addClass("vdata"); }); else jData.find(".default").show().addClass("vdata"); // go ahead and call the change event and setup the ops and data values if (has_custom_ops || has_custom_data) jFSelect.change(); // bind events jQ.find(".ui-state-default").hover(hover, hover).mousedown(active).mouseup(active); // add hover/active effects to all buttons jQ.find(".ui-closer").click(function(e) { opts.onClose(jQuery(jQ.selector)); return false; }); jQ.find(".ui-del").click(function(e) { var row = jQuery(e.target).parents(".sf"); if (row.siblings(".sf").length > 0) { // doesn't remove if there's only one filter left if (opts.datepickerFix === true && jQuery.fn.datepicker !== undefined) row.find(".hasDatepicker").datepicker("destroy"); // clean up datepicker's $.data mess row.remove(); // also unbinds } else { // resets the filter if it's the last one row.find("select[name='field']")[0].selectedIndex = 0; row.find("select[name='op']")[0].selectedIndex = 0; row.find(".data input").val(""); // blank all input values row.find(".data select").each(function() { this.selectedIndex = 0; }); // select first option on all selects row.find("select[name='field']").change(); // trigger any change events } return false; }); jQ.find(".ui-add").click(function(e) { var row = jQuery(e.target).parents(".sf"); var newRow = row.clone(true).insertAfter(row); newRow.find(".ui-state-default").removeClass("ui-state-hover ui-state-active"); if (opts.clone) { newRow.find("select[name='field']")[0].selectedIndex = row.find("select[name='field']")[0].selectedIndex; var stupid_browser = (newRow.find("select[name='op']")[0] == null); // true for IE6 if (!stupid_browser) newRow.find("select[name='op']").focus()[0].selectedIndex = row.find("select[name='op']")[0].selectedIndex; var jElem = newRow.find("select.vdata"); if (jElem[0] != null) // select doesn't copy it's selected index when cloned jElem[0].selectedIndex = row.find("select.vdata")[0].selectedIndex; } else { newRow.find(".data input").val(""); // blank all input values newRow.find("select[name='field']").focus(); } if (opts.datepickerFix === true && jQuery.fn.datepicker !== undefined) { // using $.data to associate data with document elements is Not Good row.find(".hasDatepicker").each(function() { var settings = jQuery.data(this, "datepicker").settings; newRow.find("#" + this.id).unbind().removeAttr("id").removeClass("hasDatepicker").datepicker(settings); }); } newRow.find("select[name='field']").change(); return false; }); jQ.find(".ui-search").click(function(e) { var ui = jQuery(jQ.selector); var ruleGroup; var group_op = ui.find("select[name='groupOp'] :selected").val(); if (!opts.stringResult) { ruleGroup = { groupOp: group_op, rules: [] }; } else { ruleGroup = "{\"groupOp\":\"" + group_op + "\",\"rules\":["; } ui.find(".sf").each(function(i) { var tField = jQuery(this).find("select[name='field'] :selected").val(); var tOp = jQuery(this).find("select[name='op'] :selected").val(); var tData = jQuery(this).find("input.vdata,select.vdata :selected").val(); tData += ""; tData = tData.replace(/\\/g,'\\\\').replace(/\"/g,'\\"'); if (!opts.stringResult) { ruleGroup.rules.push({ field: tField, op: tOp, data: tData }); } else { if (i > 0) ruleGroup += ","; ruleGroup += "{\"field\":\"" + tField + "\","; ruleGroup += "\"op\":\"" + tOp + "\","; ruleGroup += "\"data\":\"" + tData + "\"}"; } }); if (opts.stringResult) ruleGroup += "]}"; opts.onSearch(ruleGroup); return false; }); jQ.find(".ui-reset").click(function(e) { var ui = jQuery(jQ.selector); ui.find(".ui-del").click(); // removes all filters, resets the last one ui.find("select[name='groupOp']")[0].selectedIndex = 0; // changes the op back to the default one opts.onReset(); return false; }); jQ.find(".ui-add-last").click(function() { var row = jQuery(jQ.selector + " .sf:last"); var newRow = row.clone(true).insertAfter(row); newRow.find(".ui-state-default").removeClass("ui-state-hover ui-state-active"); newRow.find(".data input").val(""); // blank all input values newRow.find("select[name='field']").focus(); if (opts.datepickerFix === true && jQuery.fn.datepicker !== undefined) { // using $.data to associate data with document elements is Not Good row.find(".hasDatepicker").each(function() { var settings = jQuery.data(this, "datepicker").settings; newRow.find("#" + this.id).unbind().removeAttr("id").removeClass("hasDatepicker").datepicker(settings); }); } newRow.find("select[name='field']").change(); return false; }); } } return new SearchFilter(this, fields, options); }; jQuery.fn.searchFilter.version = '1.2.9'; /* This property contains the default options */ jQuery.fn.searchFilter.defaults = { /* * PROPERTY * TYPE: boolean * DESCRIPTION: clone a row if it is added from an existing row * when false, any new added rows will be blank. */ clone: true, /* * PROPERTY * TYPE: boolean * DESCRIPTION: current version of datepicker uses a data store, * which is incompatible with $().clone(true) */ datepickerFix: true, /* * FUNCTION * DESCRIPTION: the function that will be called when the user clicks Reset * INPUT TYPE: JS object if stringResult is false, otherwise is JSON string */ onReset: function(data) { alert("Reset Clicked. Data Returned: " + data) }, /* * FUNCTION * DESCRIPTION: the function that will be called when the user clicks Search * INPUT TYPE: JS object if stringResult is false, otherwise is JSON string */ onSearch: function(data) { alert("Search Clicked. Data Returned: " + data) }, /* * FUNCTION * DESCRIPTION: the function that will be called when the user clicks the Closer icon * or the close() function is called * if left null, it simply does a .hide() on the searchFilter * INPUT TYPE: a jQuery object for the searchFilter */ onClose: function(jElem) { jElem.hide(); }, /* * PROPERTY * TYPE: array of objects, each object has the properties op and text * DESCRIPTION: the selectable operators that are applied between rules * e.g. for {op:"AND", text:"all"} * the search filter box will say: match all rules * the server should interpret this as putting the AND op between each rule: * rule1 AND rule2 AND rule3 * text will be the option text, and op will be the option value */ groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ], /* * PROPERTY * TYPE: array of objects, each object has the properties op and text * DESCRIPTION: the operators that will appear as drop-down options * text will be the option text, and op will be the option value */ operators: [ { op: "eq", text: "is equal to" }, { op: "ne", text: "is not equal to" }, { op: "lt", text: "is less than" }, { op: "le", text: "is less or equal to" }, { op: "gt", text: "is greater than" }, { op: "ge", text: "is greater or equal to" }, { op: "in", text: "is in" }, { op: "ni", text: "is not in" }, { op: "bw", text: "begins with" }, { op: "bn", text: "does not begin with" }, { op: "ew", text: "ends with" }, { op: "en", text: "does not end with" }, { op: "cn", text: "contains" }, { op: "nc", text: "does not contain" } ], /* * PROPERTY * TYPE: string * DESCRIPTION: part of the phrase: _match_ ANY/ALL rules */ matchText: "match", /* * PROPERTY * TYPE: string * DESCRIPTION: part of the phrase: match ANY/ALL _rules_ */ rulesText: "rules", /* * PROPERTY * TYPE: string * DESCRIPTION: the text that will be displayed in the reset button */ resetText: "Reset", /* * PROPERTY * TYPE: string * DESCRIPTION: the text that will be displayed in the search button */ searchText: "Search", /* * PROPERTY * TYPE: boolean * DESCRIPTION: a flag that, when set, will make the onSearch and onReset return strings instead of objects */ stringResult: true, /* * PROPERTY * TYPE: string * DESCRIPTION: the title of the searchFilter window */ windowTitle: "Search Rules", /* * PROPERTY * TYPE: object * DESCRIPTION: options to extend the ajax request */ ajaxSelectOptions : {} }; /* end of searchFilter */ /* The below work is licensed under Creative Commons GNU LGPL License. Original work: License: http://creativecommons.org/licenses/LGPL/2.1/ Author: Stefan Goessner/2006 Web: http://goessner.net/ Modifications made: Version: 0.9-p5 Description: Restructured code, JSLint validated (no strict whitespaces), added handling of empty arrays, empty strings, and int/floats values. Author: Michael Schøler/2008-01-29 Web: http://michael.hinnerup.net/blog/2008/01/26/converting-json-to-xml-and-xml-to-json/ Description: json2xml added support to convert functions as CDATA so it will be easy to write characters that cause some problems when convert Author: Tony Tomov */ /*global alert */ var xmlJsonClass = { // Param "xml": Element or document DOM node. // Param "tab": Tab or indent string for pretty output formatting omit or use empty string "" to supress. // Returns: JSON string xml2json: function(xml, tab) { if (xml.nodeType === 9) { // document node xml = xml.documentElement; } var nws = this.removeWhite(xml); var obj = this.toObj(nws); var json = this.toJson(obj, xml.nodeName, "\t"); return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}"; }, // Param "o": JavaScript object // Param "tab": tab or indent string for pretty output formatting omit or use empty string "" to supress. // Returns: XML string json2xml: function(o, tab) { var toXml = function(v, name, ind) { var xml = ""; var i, n; if (v instanceof Array) { if (v.length === 0) { xml += ind + "<"+name+">__EMPTY_ARRAY_</"+name+">\n"; } else { for (i = 0, n = v.length; i < n; i += 1) { var sXml = ind + toXml(v[i], name, ind+"\t") + "\n"; xml += sXml; } } } else if (typeof(v) === "object") { var hasChild = false; xml += ind + "<" + name; var m; for (m in v) if (v.hasOwnProperty(m)) { if (m.charAt(0) === "@") { xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\""; } else { hasChild = true; } } xml += hasChild ? ">" : "/>"; if (hasChild) { for (m in v) if (v.hasOwnProperty(m)) { if (m === "#text") { xml += v[m]; } else if (m === "#cdata") { xml += "<![CDATA[" + v[m] + "]]>"; } else if (m.charAt(0) !== "@") { xml += toXml(v[m], m, ind+"\t"); } } xml += (xml.charAt(xml.length - 1) === "\n" ? ind : "") + "</" + name + ">"; } } else if (typeof(v) === "function") { xml += ind + "<" + name + ">" + "<![CDATA[" + v + "]]>" + "</" + name + ">"; } else { if (v.toString() === "\"\"" || v.toString().length === 0) { xml += ind + "<" + name + ">__EMPTY_STRING_</" + name + ">"; } else { xml += ind + "<" + name + ">" + v.toString() + "</" + name + ">"; } } return xml; }; var xml = ""; var m; for (m in o) if (o.hasOwnProperty(m)) { xml += toXml(o[m], m, ""); } return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, ""); }, // Internal methods toObj: function(xml) { var o = {}; var FuncTest = /function/i; if (xml.nodeType === 1) { // element node .. if (xml.attributes.length) { // element with attributes .. var i; for (i = 0; i < xml.attributes.length; i += 1) { o["@" + xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue || "").toString(); } } if (xml.firstChild) { // element has child nodes .. var textChild = 0, cdataChild = 0, hasElementChild = false; var n; for (n = xml.firstChild; n; n = n.nextSibling) { if (n.nodeType === 1) { hasElementChild = true; } else if (n.nodeType === 3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // non-whitespace text textChild += 1; } else if (n.nodeType === 4) { // cdata section node cdataChild += 1; } } if (hasElementChild) { if (textChild < 2 && cdataChild < 2) { // structured element with evtl. a single text or/and cdata node .. this.removeWhite(xml); for (n = xml.firstChild; n; n = n.nextSibling) { if (n.nodeType === 3) { // text node o["#text"] = this.escape(n.nodeValue); } else if (n.nodeType === 4) { // cdata node if (FuncTest.test(n.nodeValue)) { o[n.nodeName] = [o[n.nodeName], n.nodeValue]; } else { o["#cdata"] = this.escape(n.nodeValue); } } else if (o[n.nodeName]) { // multiple occurence of element .. if (o[n.nodeName] instanceof Array) { o[n.nodeName][o[n.nodeName].length] = this.toObj(n); } else { o[n.nodeName] = [o[n.nodeName], this.toObj(n)]; } } else { // first occurence of element .. o[n.nodeName] = this.toObj(n); } } } else { // mixed content if (!xml.attributes.length) { o = this.escape(this.innerXml(xml)); } else { o["#text"] = this.escape(this.innerXml(xml)); } } } else if (textChild) { // pure text if (!xml.attributes.length) { o = this.escape(this.innerXml(xml)); if (o === "__EMPTY_ARRAY_") { o = "[]"; } else if (o === "__EMPTY_STRING_") { o = ""; } } else { o["#text"] = this.escape(this.innerXml(xml)); } } else if (cdataChild) { // cdata if (cdataChild > 1) { o = this.escape(this.innerXml(xml)); } else { for (n = xml.firstChild; n; n = n.nextSibling) { if(FuncTest.test(xml.firstChild.nodeValue)) { o = xml.firstChild.nodeValue; break; } else { o["#cdata"] = this.escape(n.nodeValue); } } } } } if (!xml.attributes.length && !xml.firstChild) { o = null; } } else if (xml.nodeType === 9) { // document.node o = this.toObj(xml.documentElement); } else { alert("unhandled node type: " + xml.nodeType); } return o; }, toJson: function(o, name, ind) { var json = name ? ("\"" + name + "\"") : ""; if (o === "[]") { json += (name ? ":[]" : "[]"); } else if (o instanceof Array) { var n, i, ar=[]; for (i = 0, n = o.length; i < n; i += 1) { ar[i] = this.toJson(o[i], "", ind + "\t"); } json += (name ? ":[" : "[") + (ar.length > 1 ? ("\n" + ind + "\t" + ar.join(",\n" + ind + "\t") + "\n" + ind) : ar.join("")) + "]"; } else if (o === null) { json += (name && ":") + "null"; } else if (typeof(o) === "object") { var arr = []; var m; for (m in o) if (o.hasOwnProperty(m)) { arr[arr.length] = this.toJson(o[m], m, ind + "\t"); } json += (name ? ":{" : "{") + (arr.length > 1 ? ("\n" + ind + "\t" + arr.join(",\n" + ind + "\t") + "\n" + ind) : arr.join("")) + "}"; } else if (typeof(o) === "string") { var objRegExp = /(^-?\d+\.?\d*$)/; var FuncTest = /function/i; var os = o.toString(); if (objRegExp.test(os) || FuncTest.test(os) || os==="false" || os==="true") { // int or float json += (name && ":") + os; } else { json += (name && ":") + "\"" + o + "\""; } } else { json += (name && ":") + o.toString(); } return json; }, innerXml: function(node) { var s = ""; if ("innerHTML" in node) { s = node.innerHTML; } else { var asXml = function(n) { var s = "", i; if (n.nodeType === 1) { s += "<" + n.nodeName; for (i = 0; i < n.attributes.length; i += 1) { s += " " + n.attributes[i].nodeName + "=\"" + (n.attributes[i].nodeValue || "").toString() + "\""; } if (n.firstChild) { s += ">"; for (var c = n.firstChild; c; c = c.nextSibling) { s += asXml(c); } s += "</" + n.nodeName + ">"; } else { s += "/>"; } } else if (n.nodeType === 3) { s += n.nodeValue; } else if (n.nodeType === 4) { s += "<![CDATA[" + n.nodeValue + "]]>"; } return s; }; for (var c = node.firstChild; c; c = c.nextSibling) { s += asXml(c); } } return s; }, escape: function(txt) { return txt.replace(/[\\]/g, "\\\\").replace(/[\"]/g, '\\"').replace(/[\n]/g, '\\n').replace(/[\r]/g, '\\r'); }, removeWhite: function(e) { e.normalize(); var n; for (n = e.firstChild; n; ) { if (n.nodeType === 3) { // text node if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node var nxt = n.nextSibling; e.removeChild(n); n = nxt; } else { n = n.nextSibling; } } else if (n.nodeType === 1) { // element node this.removeWhite(n); n = n.nextSibling; } else { // any other node n = n.nextSibling; } } return e; } }; /* * ContextMenu - jQuery plugin for right-click context menus * * Author: Chris Domigan * Contributors: Dan G. Switzer, II * Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Version: r2 * Date: 16 July 2007 * * For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/ * */ (function($) { var menu, shadow, trigger, content, hash, currentTarget; var defaults = { menuStyle: { listStyle: 'none', padding: '1px', margin: '0px', backgroundColor: '#fff', border: '1px solid #999', width: '100px' }, itemStyle: { margin: '0px', color: '#000', display: 'block', cursor: 'default', padding: '3px', border: '1px solid #fff', backgroundColor: 'transparent' }, itemHoverStyle: { border: '1px solid #0a246a', backgroundColor: '#b6bdd2' }, eventPosX: 'pageX', eventPosY: 'pageY', shadow : true, onContextMenu: null, onShowMenu: null }; $.fn.contextMenu = function(id, options) { if (!menu) { // Create singleton menu menu = $('<div id="jqContextMenu"></div>') .hide() .css({position:'absolute', zIndex:'500'}) .appendTo('body') .bind('click', function(e) { e.stopPropagation(); }); } if (!shadow) { shadow = $('<div></div>') .css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499}) .appendTo('body') .hide(); } hash = hash || []; hash.push({ id : id, menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}), itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}), itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}), bindings: options.bindings || {}, shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow, onContextMenu: options.onContextMenu || defaults.onContextMenu, onShowMenu: options.onShowMenu || defaults.onShowMenu, eventPosX: options.eventPosX || defaults.eventPosX, eventPosY: options.eventPosY || defaults.eventPosY }); var index = hash.length - 1; $(this).bind('contextmenu', function(e) { // Check if onContextMenu() defined var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true; if (bShowContext) display(index, this, e, options); return false; }); return this; }; function display(index, trigger, e, options) { var cur = hash[index]; content = $('#'+cur.id).find('ul:first').clone(true); content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover( function() { $(this).css(cur.itemHoverStyle); }, function(){ $(this).css(cur.itemStyle); } ).find('img').css({verticalAlign:'middle',paddingRight:'2px'}); // Send the content to the menu menu.html(content); // if there's an onShowMenu, run it now -- must run after content has been added // if you try to alter the content variable before the menu.html(), IE6 has issues // updating the content if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu); $.each(cur.bindings, function(id, func) { $('#'+id, menu).bind('click', function(e) { hide(); func(trigger, currentTarget); }); }); menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]}).show(); if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2}).show(); $(document).one('click', hide); } function hide() { menu.hide(); shadow.hide(); } // Apply defaults $.contextMenu = { defaults : function(userDefaults) { $.each(userDefaults, function(i, val) { if (typeof val == 'object' && defaults[i]) { $.extend(defaults[i], val); } else defaults[i] = val; }); } }; })(jQuery); $(function() { $('div.contextMenu').hide(); }); /** * TableDnD plug-in for JQuery, allows you to drag and drop table rows * You can set up various options to control how the system will work * Copyright (c) Denis Howlett <denish@isocra.com> * Licensed like jQuery, see http://docs.jquery.com/License. * * Configuration options: * * onDragStyle * This is the style that is assigned to the row during drag. There are limitations to the styles that can be * associated with a row (such as you can't assign a border--well you can, but it won't be * displayed). (So instead consider using onDragClass.) The CSS style to apply is specified as * a map (as used in the jQuery css(...) function). * onDropStyle * This is the style that is assigned to the row when it is dropped. As for onDragStyle, there are limitations * to what you can do. Also this replaces the original style, so again consider using onDragClass which * is simply added and then removed on drop. * onDragClass * This class is added for the duration of the drag and then removed when the row is dropped. It is more * flexible than using onDragStyle since it can be inherited by the row cells and other content. The default * is class is tDnD_whileDrag. So to use the default, simply customise this CSS class in your * stylesheet. * onDrop * Pass a function that will be called when the row is dropped. The function takes 2 parameters: the table * and the row that was dropped. You can work out the new order of the rows by using * table.rows. * onDragStart * Pass a function that will be called when the user starts dragging. The function takes 2 parameters: the * table and the row which the user has started to drag. * onAllowDrop * Pass a function that will be called as a row is over another row. If the function returns true, allow * dropping on that row, otherwise not. The function takes 2 parameters: the dragged row and the row under * the cursor. It returns a boolean: true allows the drop, false doesn't allow it. * scrollAmount * This is the number of pixels to scroll if the user moves the mouse cursor to the top or bottom of the * window. The page should automatically scroll up or down as appropriate (tested in IE6, IE7, Safari, FF2, * FF3 beta * dragHandle * This is the name of a class that you assign to one or more cells in each row that is draggable. If you * specify this class, then you are responsible for setting cursor: move in the CSS and only these cells * will have the drag behaviour. If you do not specify a dragHandle, then you get the old behaviour where * the whole row is draggable. * * Other ways to control behaviour: * * Add class="nodrop" to any rows for which you don't want to allow dropping, and class="nodrag" to any rows * that you don't want to be draggable. * * Inside the onDrop method you can also call $.tableDnD.serialize() this returns a string of the form * <tableID>[]=<rowID1>&<tableID>[]=<rowID2> so that you can send this back to the server. The table must have * an ID as must all the rows. * * Other methods: * * $("...").tableDnDUpdate() * Will update all the matching tables, that is it will reapply the mousedown method to the rows (or handle cells). * This is useful if you have updated the table rows using Ajax and you want to make the table draggable again. * The table maintains the original configuration (so you don't have to specify it again). * * $("...").tableDnDSerialize() * Will serialize and return the serialized string as above, but for each of the matching tables--so it can be * called from anywhere and isn't dependent on the currentTable being set up correctly before calling * * Known problems: * - Auto-scoll has some problems with IE7 (it scrolls even when it shouldn't), work-around: set scrollAmount to 0 * * Version 0.2: 2008-02-20 First public version * Version 0.3: 2008-02-07 Added onDragStart option * Made the scroll amount configurable (default is 5 as before) * Version 0.4: 2008-03-15 Changed the noDrag/noDrop attributes to nodrag/nodrop classes * Added onAllowDrop to control dropping * Fixed a bug which meant that you couldn't set the scroll amount in both directions * Added serialize method * Version 0.5: 2008-05-16 Changed so that if you specify a dragHandle class it doesn't make the whole row * draggable * Improved the serialize method to use a default (and settable) regular expression. * Added tableDnDupate() and tableDnDSerialize() to be called when you are outside the table */ jQuery.tableDnD = { /** Keep hold of the current table being dragged */ currentTable : null, /** Keep hold of the current drag object if any */ dragObject: null, /** The current mouse offset */ mouseOffset: null, /** Remember the old value of Y so that we don't do too much processing */ oldY: 0, /** Actually build the structure */ build: function(options) { // Set up the defaults if any this.each(function() { // This is bound to each matching table, set up the defaults and override with user options this.tableDnDConfig = jQuery.extend({ onDragStyle: null, onDropStyle: null, // Add in the default class for whileDragging onDragClass: "tDnD_whileDrag", onDrop: null, onDragStart: null, scrollAmount: 5, serializeRegexp: /[^\-]*$/, // The regular expression to use to trim row IDs serializeParamName: null, // If you want to specify another parameter name instead of the table ID dragHandle: null // If you give the name of a class here, then only Cells with this class will be draggable }, options || {}); // Now make the rows draggable jQuery.tableDnD.makeDraggable(this); }); // Now we need to capture the mouse up and mouse move event // We can use bind so that we don't interfere with other event handlers jQuery(document) .bind('mousemove', jQuery.tableDnD.mousemove) .bind('mouseup', jQuery.tableDnD.mouseup); // Don't break the chain return this; }, /** This function makes all the rows on the table draggable apart from those marked as "NoDrag" */ makeDraggable: function(table) { var config = table.tableDnDConfig; if (table.tableDnDConfig.dragHandle) { // We only need to add the event to the specified cells var cells = jQuery("td."+table.tableDnDConfig.dragHandle, table); cells.each(function() { // The cell is bound to "this" jQuery(this).mousedown(function(ev) { jQuery.tableDnD.dragObject = this.parentNode; jQuery.tableDnD.currentTable = table; jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev); if (config.onDragStart) { // Call the onDrop method if there is one config.onDragStart(table, this); } return false; }); }) } else { // For backwards compatibility, we add the event to the whole row var rows = jQuery("tr", table); // get all the rows as a wrapped set rows.each(function() { // Iterate through each row, the row is bound to "this" var row = jQuery(this); if (! row.hasClass("nodrag")) { row.mousedown(function(ev) { if (ev.target.tagName == "TD") { jQuery.tableDnD.dragObject = this; jQuery.tableDnD.currentTable = table; jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev); if (config.onDragStart) { // Call the onDrop method if there is one config.onDragStart(table, this); } return false; } }).css("cursor", "move"); // Store the tableDnD object } }); } }, updateTables: function() { this.each(function() { // this is now bound to each matching table if (this.tableDnDConfig) { jQuery.tableDnD.makeDraggable(this); } }) }, /** Get the mouse coordinates from the event (allowing for browser differences) */ mouseCoords: function(ev){ if(ev.pageX || ev.pageY){ return {x:ev.pageX, y:ev.pageY}; } return { x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, y:ev.clientY + document.body.scrollTop - document.body.clientTop }; }, /** Given a target element and a mouse event, get the mouse offset from that element. To do this we need the element's position and the mouse position */ getMouseOffset: function(target, ev) { ev = ev || window.event; var docPos = this.getPosition(target); var mousePos = this.mouseCoords(ev); return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y}; }, /** Get the position of an element by going up the DOM tree and adding up all the offsets */ getPosition: function(e){ var left = 0; var top = 0; /** Safari fix -- thanks to Luis Chato for this! */ if (e.offsetHeight == 0) { /** Safari 2 doesn't correctly grab the offsetTop of a table row this is detailed here: http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/ the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild. note that firefox will return a text node as a first child, so designing a more thorough solution may need to take that into account, for now this seems to work in firefox, safari, ie */ e = e.firstChild; // a table cell } if (e && e.offsetParent) { while (e.offsetParent){ left += e.offsetLeft; top += e.offsetTop; e = e.offsetParent; } left += e.offsetLeft; top += e.offsetTop; } return {x:left, y:top}; }, mousemove: function(ev) { if (jQuery.tableDnD.dragObject == null) { return; } var dragObj = jQuery(jQuery.tableDnD.dragObject); var config = jQuery.tableDnD.currentTable.tableDnDConfig; var mousePos = jQuery.tableDnD.mouseCoords(ev); var y = mousePos.y - jQuery.tableDnD.mouseOffset.y; //auto scroll the window var yOffset = window.pageYOffset; if (document.all) { // Windows version //yOffset=document.body.scrollTop; if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') { yOffset = document.documentElement.scrollTop; } else if (typeof document.body != 'undefined') { yOffset=document.body.scrollTop; } } if (mousePos.y-yOffset < config.scrollAmount) { window.scrollBy(0, -config.scrollAmount); } else { var windowHeight = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight; if (windowHeight-(mousePos.y-yOffset) < config.scrollAmount) { window.scrollBy(0, config.scrollAmount); } } if (y != jQuery.tableDnD.oldY) { // work out if we're going up or down... var movingDown = y > jQuery.tableDnD.oldY; // update the old value jQuery.tableDnD.oldY = y; // update the style to show we're dragging if (config.onDragClass) { dragObj.addClass(config.onDragClass); } else { dragObj.css(config.onDragStyle); } // If we're over a row then move the dragged row to there so that the user sees the // effect dynamically var currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y); if (currentRow) { // TODO worry about what happens when there are multiple TBODIES if (movingDown && jQuery.tableDnD.dragObject != currentRow) { jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow.nextSibling); } else if (! movingDown && jQuery.tableDnD.dragObject != currentRow) { jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow); } } } return false; }, /** We're only worried about the y position really, because we can only move rows up and down */ findDropTargetRow: function(draggedRow, y) { var rows = jQuery.tableDnD.currentTable.rows; for (var i=0; i<rows.length; i++) { var row = rows[i]; var rowY = this.getPosition(row).y; var rowHeight = parseInt(row.offsetHeight)/2; if (row.offsetHeight == 0) { rowY = this.getPosition(row.firstChild).y; rowHeight = parseInt(row.firstChild.offsetHeight)/2; } // Because we always have to insert before, we need to offset the height a bit if ((y > rowY - rowHeight) && (y < (rowY + rowHeight))) { // that's the row we're over // If it's the same as the current row, ignore it if (row == draggedRow) {return null;} var config = jQuery.tableDnD.currentTable.tableDnDConfig; if (config.onAllowDrop) { if (config.onAllowDrop(draggedRow, row)) { return row; } else { return null; } } else { // If a row has nodrop class, then don't allow dropping (inspired by John Tarr and Famic) var nodrop = jQuery(row).hasClass("nodrop"); if (! nodrop) { return row; } else { return null; } } return row; } } return null; }, mouseup: function(e) { if (jQuery.tableDnD.currentTable && jQuery.tableDnD.dragObject) { var droppedRow = jQuery.tableDnD.dragObject; var config = jQuery.tableDnD.currentTable.tableDnDConfig; // If we have a dragObject, then we need to release it, // The row will already have been moved to the right place so we just reset stuff if (config.onDragClass) { jQuery(droppedRow).removeClass(config.onDragClass); } else { jQuery(droppedRow).css(config.onDropStyle); } jQuery.tableDnD.dragObject = null; if (config.onDrop) { // Call the onDrop method if there is one config.onDrop(jQuery.tableDnD.currentTable, droppedRow); } jQuery.tableDnD.currentTable = null; // let go of the table too } }, serialize: function() { if (jQuery.tableDnD.currentTable) { return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable); } else { return "Error: No Table id set, you need to set an id on your table and every row"; } }, serializeTable: function(table) { var result = ""; var tableId = table.id; var rows = table.rows; for (var i=0; i<rows.length; i++) { if (result.length > 0) result += "&"; var rowId = rows[i].id; if (rowId && rowId && table.tableDnDConfig && table.tableDnDConfig.serializeRegexp) { rowId = rowId.match(table.tableDnDConfig.serializeRegexp)[0]; } result += tableId + '[]=' + rowId; } return result; }, serializeTables: function() { var result = ""; this.each(function() { // this is now bound to each matching table result += jQuery.tableDnD.serializeTable(this); }); return result; } } jQuery.fn.extend( { tableDnD : jQuery.tableDnD.build, tableDnDUpdate : jQuery.tableDnD.updateTables, tableDnDSerialize: jQuery.tableDnD.serializeTables } ); /* * jQuery UI Multiselect * * Authors: * Michael Aufreiter (quasipartikel.at) * Yanick Rochon (yanick.rochon[at]gmail[dot]com) * * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://www.quasipartikel.at/multiselect/ * * * Depends: * ui.core.js * ui.sortable.js * * Optional: * localization (http://plugins.jquery.com/project/localisation) * scrollTo (http://plugins.jquery.com/project/ScrollTo) * * Todo: * Make batch actions faster * Implement dynamic insertion through remote calls */ (function($) { $.widget("ui.multiselect", { _init: function() { this.element.hide(); this.id = this.element.attr("id"); this.container = $('<div class="ui-multiselect ui-helper-clearfix ui-widget"></div>').insertAfter(this.element); this.count = 0; // number of currently selected options this.selectedContainer = $('<div class="selected"></div>').appendTo(this.container); this.availableContainer = $('<div class="available"></div>').appendTo(this.container); this.selectedActions = $('<div class="actions ui-widget-header ui-helper-clearfix"><span class="count">0 '+$.ui.multiselect.locale.itemsCount+'</span><a href="#" class="remove-all">'+$.ui.multiselect.locale.removeAll+'</a></div>').appendTo(this.selectedContainer); this.availableActions = $('<div class="actions ui-widget-header ui-helper-clearfix"><input type="text" class="search empty ui-widget-content ui-corner-all"/><a href="#" class="add-all">'+$.ui.multiselect.locale.addAll+'</a></div>').appendTo(this.availableContainer); this.selectedList = $('<ul class="selected connected-list"><li class="ui-helper-hidden-accessible"></li></ul>').bind('selectstart', function(){return false;}).appendTo(this.selectedContainer); this.availableList = $('<ul class="available connected-list"><li class="ui-helper-hidden-accessible"></li></ul>').bind('selectstart', function(){return false;}).appendTo(this.availableContainer); var that = this; // set dimensions this.container.width(this.element.width()+1); this.selectedContainer.width(Math.floor(this.element.width()*this.options.dividerLocation)); this.availableContainer.width(Math.floor(this.element.width()*(1-this.options.dividerLocation))); // fix list height to match <option> depending on their individual header's heights this.selectedList.height(Math.max(this.element.height()-this.selectedActions.height(),1)); this.availableList.height(Math.max(this.element.height()-this.availableActions.height(),1)); if ( !this.options.animated ) { this.options.show = 'show'; this.options.hide = 'hide'; } // init lists this._populateLists(this.element.find('option')); // make selection sortable if (this.options.sortable) { $("ul.selected").sortable({ placeholder: 'ui-state-highlight', axis: 'y', update: function(event, ui) { // apply the new sort order to the original selectbox that.selectedList.find('li').each(function() { if ($(this).data('optionLink')) $(this).data('optionLink').remove().appendTo(that.element); }); }, receive: function(event, ui) { ui.item.data('optionLink').attr('selected', true); // increment count that.count += 1; that._updateCount(); // workaround, because there's no way to reference // the new element, see http://dev.jqueryui.com/ticket/4303 that.selectedList.children('.ui-draggable').each(function() { $(this).removeClass('ui-draggable'); $(this).data('optionLink', ui.item.data('optionLink')); $(this).data('idx', ui.item.data('idx')); that._applyItemState($(this), true); }); // workaround according to http://dev.jqueryui.com/ticket/4088 setTimeout(function() { ui.item.remove(); }, 1); } }); } // set up livesearch if (this.options.searchable) { this._registerSearchEvents(this.availableContainer.find('input.search')); } else { $('.search').hide(); } // batch actions $(".remove-all").click(function() { that._populateLists(that.element.find('option').removeAttr('selected')); return false; }); $(".add-all").click(function() { that._populateLists(that.element.find('option').attr('selected', 'selected')); return false; }); }, destroy: function() { this.element.show(); this.container.remove(); $.widget.prototype.destroy.apply(this, arguments); }, _populateLists: function(options) { this.selectedList.children('.ui-element').remove(); this.availableList.children('.ui-element').remove(); this.count = 0; var that = this; var items = $(options.map(function(i) { var item = that._getOptionNode(this).appendTo(this.selected ? that.selectedList : that.availableList).show(); if (this.selected) that.count += 1; that._applyItemState(item, this.selected); item.data('idx', i); return item[0]; })); // update count this._updateCount(); }, _updateCount: function() { this.selectedContainer.find('span.count').text(this.count+" "+$.ui.multiselect.locale.itemsCount); }, _getOptionNode: function(option) { option = $(option); var node = $('<li class="ui-state-default ui-element" title="'+option.text()+'"><span class="ui-icon"/>'+option.text()+'<a href="#" class="action"><span class="ui-corner-all ui-icon"/></a></li>').hide(); node.data('optionLink', option); return node; }, // clones an item with associated data // didn't find a smarter away around this _cloneWithData: function(clonee) { var clone = clonee.clone(); clone.data('optionLink', clonee.data('optionLink')); clone.data('idx', clonee.data('idx')); return clone; }, _setSelected: function(item, selected) { item.data('optionLink').attr('selected', selected); if (selected) { var selectedItem = this._cloneWithData(item); item[this.options.hide](this.options.animated, function() { $(this).remove(); }); selectedItem.appendTo(this.selectedList).hide()[this.options.show](this.options.animated); this._applyItemState(selectedItem, true); return selectedItem; } else { // look for successor based on initial option index var items = this.availableList.find('li'), comparator = this.options.nodeComparator; var succ = null, i = item.data('idx'), direction = comparator(item, $(items[i])); // TODO: test needed for dynamic list populating if ( direction ) { while (i>=0 && i<items.length) { direction > 0 ? i++ : i--; if ( direction != comparator(item, $(items[i])) ) { // going up, go back one item down, otherwise leave as is succ = items[direction > 0 ? i : i+1]; break; } } } else { succ = items[i]; } var availableItem = this._cloneWithData(item); succ ? availableItem.insertBefore($(succ)) : availableItem.appendTo(this.availableList); item[this.options.hide](this.options.animated, function() { $(this).remove(); }); availableItem.hide()[this.options.show](this.options.animated); this._applyItemState(availableItem, false); return availableItem; } }, _applyItemState: function(item, selected) { if (selected) { if (this.options.sortable) item.children('span').addClass('ui-icon-arrowthick-2-n-s').removeClass('ui-helper-hidden').addClass('ui-icon'); else item.children('span').removeClass('ui-icon-arrowthick-2-n-s').addClass('ui-helper-hidden').removeClass('ui-icon'); item.find('a.action span').addClass('ui-icon-minus').removeClass('ui-icon-plus'); this._registerRemoveEvents(item.find('a.action')); } else { item.children('span').removeClass('ui-icon-arrowthick-2-n-s').addClass('ui-helper-hidden').removeClass('ui-icon'); item.find('a.action span').addClass('ui-icon-plus').removeClass('ui-icon-minus'); this._registerAddEvents(item.find('a.action')); } this._registerHoverEvents(item); }, // taken from John Resig's liveUpdate script _filter: function(list) { var input = $(this); var rows = list.children('li'), cache = rows.map(function(){ return $(this).text().toLowerCase(); }); var term = $.trim(input.val().toLowerCase()), scores = []; if (!term) { rows.show(); } else { rows.hide(); cache.each(function(i) { if (this.indexOf(term)>-1) { scores.push(i); } }); $.each(scores, function() { $(rows[this]).show(); }); } }, _registerHoverEvents: function(elements) { elements.removeClass('ui-state-hover'); elements.mouseover(function() { $(this).addClass('ui-state-hover'); }); elements.mouseout(function() { $(this).removeClass('ui-state-hover'); }); }, _registerAddEvents: function(elements) { var that = this; elements.click(function() { var item = that._setSelected($(this).parent(), true); that.count += 1; that._updateCount(); return false; }) // make draggable .each(function() { $(this).parent().draggable({ connectToSortable: 'ul.selected', helper: function() { var selectedItem = that._cloneWithData($(this)).width($(this).width() - 50); selectedItem.width($(this).width()); return selectedItem; }, appendTo: '.ui-multiselect', containment: '.ui-multiselect', revert: 'invalid' }); }); }, _registerRemoveEvents: function(elements) { var that = this; elements.click(function() { that._setSelected($(this).parent(), false); that.count -= 1; that._updateCount(); return false; }); }, _registerSearchEvents: function(input) { var that = this; input.focus(function() { $(this).addClass('ui-state-active'); }) .blur(function() { $(this).removeClass('ui-state-active'); }) .keypress(function(e) { if (e.keyCode == 13) return false; }) .keyup(function() { that._filter.apply(this, [that.availableList]); }); } }); $.extend($.ui.multiselect, { defaults: { sortable: true, searchable: true, animated: 'fast', show: 'slideDown', hide: 'slideUp', dividerLocation: 0.6, nodeComparator: function(node1,node2) { var text1 = node1.text(), text2 = node2.text(); return text1 == text2 ? 0 : (text1 < text2 ? -1 : 1); } }, locale: { addAll:'Add all', removeAll:'Remove all', itemsCount:'items selected' } }); })(jQuery);