PageRenderTime 170ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 3ms

/script/jquery.jqGrid.src.js

https://gitlab.com/yellowrangler/leah
JavaScript | 13540 lines | 7316 code | 173 blank | 6051 comment | 2046 complexity | 0730e1e62e5660f98d075018b7f27c03 MD5 | raw file
  1. /**
  2. *
  3. * @license Guriddo jqGrid JS - v4.8.2 - 2015-03-24
  4. * Copyright(c) 2008, Tony Tomov, tony@trirand.com
  5. *
  6. * License: http://guriddo.net/?page_id=103334
  7. */
  8. (function( factory ) {
  9. "use strict";
  10. if ( typeof define === "function" && define.amd ) {
  11. // AMD. Register as an anonymous module.
  12. define([
  13. "jquery"
  14. ], factory );
  15. } else {
  16. // Browser globals
  17. factory( jQuery );
  18. }
  19. }(function( $ ) {
  20. "use strict";
  21. //module begin
  22. $.jgrid = $.jgrid || {};
  23. if(!$.jgrid.hasOwnProperty("defaults")) {
  24. $.jgrid.defaults = {};
  25. }
  26. $.extend($.jgrid,{
  27. version : "4.8.2",
  28. htmlDecode : function(value){
  29. if(value && (value===' ' || value===' ' || (value.length===1 && value.charCodeAt(0)===160))) { return "";}
  30. return !value ? value : String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&amp;/g, "&");
  31. },
  32. htmlEncode : function (value){
  33. return !value ? value : String(value).replace(/&/g, "&amp;").replace(/\"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
  34. },
  35. template : function(format){ //jqgformat
  36. var args = $.makeArray(arguments).slice(1), j, al = args.length;
  37. if(format==null) { format = ""; }
  38. return format.replace(/\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, function(m,i){
  39. if(!isNaN(parseInt(i,10))) {
  40. return args[parseInt(i,10)];
  41. }
  42. for(j=0; j < al;j++) {
  43. if($.isArray(args[j])) {
  44. var nmarr = args[ j ],
  45. k = nmarr.length;
  46. while(k--) {
  47. if(i===nmarr[k].nm) {
  48. return nmarr[k].v;
  49. }
  50. }
  51. }
  52. }
  53. });
  54. },
  55. msie : navigator.appName === 'Microsoft Internet Explorer',
  56. msiever : function () {
  57. var rv = -1;
  58. var ua = navigator.userAgent;
  59. var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
  60. if (re.exec(ua) != null) {
  61. rv = parseFloat( RegExp.$1 );
  62. }
  63. return rv;
  64. },
  65. getCellIndex : function (cell) {
  66. var c = $(cell);
  67. if (c.is('tr')) { return -1; }
  68. c = (!c.is('td') && !c.is('th') ? c.closest("td,th") : c)[0];
  69. if ($.jgrid.msie) { return $.inArray(c, c.parentNode.cells); }
  70. return c.cellIndex;
  71. },
  72. stripHtml : function(v) {
  73. v = String(v);
  74. var regexp = /<("[^"]*"|'[^']*'|[^'">])*>/gi;
  75. if (v) {
  76. v = v.replace(regexp,"");
  77. return (v && v !== '&nbsp;' && v !== '&#160;') ? v.replace(/\"/g,"'") : "";
  78. }
  79. return v;
  80. },
  81. stripPref : function (pref, id) {
  82. var obj = $.type( pref );
  83. if( obj === "string" || obj === "number") {
  84. pref = String(pref);
  85. id = pref !== "" ? String(id).replace(String(pref), "") : id;
  86. }
  87. return id;
  88. },
  89. parse : function(jsonString) {
  90. var js = jsonString;
  91. if (js.substr(0,9) === "while(1);") { js = js.substr(9); }
  92. if (js.substr(0,2) === "/*") { js = js.substr(2,js.length-4); }
  93. if(!js) { js = "{}"; }
  94. return ($.jgrid.useJSON===true && typeof JSON === 'object' && typeof JSON.parse === 'function') ?
  95. JSON.parse(js) :
  96. eval('(' + js + ')');
  97. },
  98. parseDate : function(format, date, newformat, opts) {
  99. var token = /\\.|[dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU]/g,
  100. timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
  101. timezoneClip = /[^-+\dA-Z]/g,
  102. msDateRegExp = new RegExp("^\/Date\\((([-+])?[0-9]+)(([-+])([0-9]{2})([0-9]{2}))?\\)\/$"),
  103. msMatch = ((typeof date === 'string') ? date.match(msDateRegExp): null),
  104. pad = function (value, length) {
  105. value = String(value);
  106. length = parseInt(length,10) || 2;
  107. while (value.length < length) { value = '0' + value; }
  108. return value;
  109. },
  110. ts = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0, u:0},
  111. timestamp=0, dM, k,hl,
  112. h12to24 = function(ampm, h){
  113. if (ampm === 0){ if (h === 12) { h = 0;} }
  114. else { if (h !== 12) { h += 12; } }
  115. return h;
  116. },
  117. offset =0;
  118. if(opts === undefined) {
  119. opts = $.jgrid.getRegional(this, "formatter.date");//$.jgrid.formatter.date;
  120. }
  121. // old lang files
  122. if(opts.parseRe === undefined ) {
  123. opts.parseRe = /[#%\\\/:_;.,\t\s-]/;
  124. }
  125. if( opts.masks.hasOwnProperty(format) ) { format = opts.masks[format]; }
  126. if(date && date != null) {
  127. if( !isNaN( date - 0 ) && String(format).toLowerCase() === "u") {
  128. //Unix timestamp
  129. timestamp = new Date( parseFloat(date)*1000 );
  130. } else if(date.constructor === Date) {
  131. timestamp = date;
  132. // Microsoft date format support
  133. } else if( msMatch !== null ) {
  134. timestamp = new Date(parseInt(msMatch[1], 10));
  135. if (msMatch[3]) {
  136. offset = Number(msMatch[5]) * 60 + Number(msMatch[6]);
  137. offset *= ((msMatch[4] === '-') ? 1 : -1);
  138. offset -= timestamp.getTimezoneOffset();
  139. timestamp.setTime(Number(Number(timestamp) + (offset * 60 * 1000)));
  140. }
  141. } else {
  142. //Support ISO8601Long that have Z at the end to indicate UTC timezone
  143. if(opts.srcformat === 'ISO8601Long' && date.charAt(date.length - 1) === 'Z') {
  144. offset -= (new Date()).getTimezoneOffset();
  145. }
  146. date = String(date).replace(/\T/g,"#").replace(/\t/,"%").split(opts.parseRe);
  147. format = format.replace(/\T/g,"#").replace(/\t/,"%").split(opts.parseRe);
  148. // parsing for month names
  149. for(k=0,hl=format.length;k<hl;k++){
  150. switch ( format[k] ) {
  151. case 'M':
  152. dM = $.inArray(date[k],opts.monthNames);
  153. if(dM !== -1 && dM < 12){date[k] = dM+1; ts.m = date[k];}
  154. break;
  155. case 'F':
  156. dM = $.inArray(date[k],opts.monthNames,12);
  157. if(dM !== -1 && dM > 11){date[k] = dM+1-12; ts.m = date[k];}
  158. break;
  159. case 'n':
  160. format[k] = 'm';
  161. break;
  162. case 'j':
  163. format[k] = 'd';
  164. break;
  165. case 'a':
  166. dM = $.inArray(date[k],opts.AmPm);
  167. if(dM !== -1 && dM < 2 && date[k] === opts.AmPm[dM]){
  168. date[k] = dM;
  169. ts.h = h12to24(date[k], ts.h);
  170. }
  171. break;
  172. case 'A':
  173. dM = $.inArray(date[k],opts.AmPm);
  174. if(dM !== -1 && dM > 1 && date[k] === opts.AmPm[dM]){
  175. date[k] = dM-2;
  176. ts.h = h12to24(date[k], ts.h);
  177. }
  178. break;
  179. case 'g':
  180. ts.h = parseInt(date[k], 10);
  181. break;
  182. }
  183. if(date[k] !== undefined) {
  184. ts[format[k].toLowerCase()] = parseInt(date[k],10);
  185. }
  186. }
  187. if(ts.f) {ts.m = ts.f;}
  188. if( ts.m === 0 && ts.y === 0 && ts.d === 0) {
  189. return "&#160;" ;
  190. }
  191. ts.m = parseInt(ts.m,10)-1;
  192. var ty = ts.y;
  193. if (ty >= 70 && ty <= 99) {ts.y = 1900+ts.y;}
  194. else if (ty >=0 && ty <=69) {ts.y= 2000+ts.y;}
  195. timestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s, ts.u);
  196. //Apply offset to show date as local time.
  197. if(offset > 0) {
  198. timestamp.setTime(Number(Number(timestamp) + (offset * 60 * 1000)));
  199. }
  200. }
  201. } else {
  202. timestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s, ts.u);
  203. }
  204. if(opts.userLocalTime && offset === 0) {
  205. offset -= (new Date()).getTimezoneOffset();
  206. if( offset > 0 ) {
  207. timestamp.setTime(Number(Number(timestamp) + (offset * 60 * 1000)));
  208. }
  209. }
  210. if( newformat === undefined ) {
  211. return timestamp;
  212. }
  213. if( opts.masks.hasOwnProperty(newformat) ) {
  214. newformat = opts.masks[newformat];
  215. } else if ( !newformat ) {
  216. newformat = 'Y-m-d';
  217. }
  218. var
  219. G = timestamp.getHours(),
  220. i = timestamp.getMinutes(),
  221. j = timestamp.getDate(),
  222. n = timestamp.getMonth() + 1,
  223. o = timestamp.getTimezoneOffset(),
  224. s = timestamp.getSeconds(),
  225. u = timestamp.getMilliseconds(),
  226. w = timestamp.getDay(),
  227. Y = timestamp.getFullYear(),
  228. N = (w + 6) % 7 + 1,
  229. z = (new Date(Y, n - 1, j) - new Date(Y, 0, 1)) / 86400000,
  230. flags = {
  231. // Day
  232. d: pad(j),
  233. D: opts.dayNames[w],
  234. j: j,
  235. l: opts.dayNames[w + 7],
  236. N: N,
  237. S: opts.S(j),
  238. //j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th',
  239. w: w,
  240. z: z,
  241. // Week
  242. 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),
  243. // Month
  244. F: opts.monthNames[n - 1 + 12],
  245. m: pad(n),
  246. M: opts.monthNames[n - 1],
  247. n: n,
  248. t: '?',
  249. // Year
  250. L: '?',
  251. o: '?',
  252. Y: Y,
  253. y: String(Y).substring(2),
  254. // Time
  255. a: G < 12 ? opts.AmPm[0] : opts.AmPm[1],
  256. A: G < 12 ? opts.AmPm[2] : opts.AmPm[3],
  257. B: '?',
  258. g: G % 12 || 12,
  259. G: G,
  260. h: pad(G % 12 || 12),
  261. H: pad(G),
  262. i: pad(i),
  263. s: pad(s),
  264. u: u,
  265. // Timezone
  266. e: '?',
  267. I: '?',
  268. O: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
  269. P: '?',
  270. T: (String(timestamp).match(timezone) || [""]).pop().replace(timezoneClip, ""),
  271. Z: '?',
  272. // Full Date/Time
  273. c: '?',
  274. r: '?',
  275. U: Math.floor(timestamp / 1000)
  276. };
  277. return newformat.replace(token, function ($0) {
  278. return flags.hasOwnProperty($0) ? flags[$0] : $0.substring(1);
  279. });
  280. },
  281. jqID : function(sid){
  282. return String(sid).replace(/[!"#$%&'()*+,.\/:; <=>?@\[\\\]\^`{|}~]/g,"\\$&");
  283. },
  284. guid : 1,
  285. uidPref: 'jqg',
  286. randId : function( prefix ) {
  287. return (prefix || $.jgrid.uidPref) + ($.jgrid.guid++);
  288. },
  289. getAccessor : function(obj, expr) {
  290. var ret,p,prm = [], i;
  291. if( typeof expr === 'function') { return expr(obj); }
  292. ret = obj[expr];
  293. if(ret===undefined) {
  294. try {
  295. if ( typeof expr === 'string' ) {
  296. prm = expr.split('.');
  297. }
  298. i = prm.length;
  299. if( i ) {
  300. ret = obj;
  301. while (ret && i--) {
  302. p = prm.shift();
  303. ret = ret[p];
  304. }
  305. }
  306. } catch (e) {}
  307. }
  308. return ret;
  309. },
  310. getXmlData: function (obj, expr, returnObj) {
  311. var ret, m = typeof expr === 'string' ? expr.match(/^(.*)\[(\w+)\]$/) : null;
  312. if (typeof expr === 'function') { return expr(obj); }
  313. if (m && m[2]) {
  314. // m[2] is the attribute selector
  315. // m[1] is an optional element selector
  316. // examples: "[id]", "rows[page]"
  317. return m[1] ? $(m[1], obj).attr(m[2]) : $(obj).attr(m[2]);
  318. }
  319. ret = $(expr, obj);
  320. if (returnObj) { return ret; }
  321. //$(expr, obj).filter(':last'); // we use ':last' to be more compatible with old version of jqGrid
  322. return ret.length > 0 ? $(ret).text() : undefined;
  323. },
  324. cellWidth : function () {
  325. var $testDiv = $("<div class='ui-jqgrid' style='left:10000px'><table class='ui-jqgrid-btable' style='width:5px;'><tr class='jqgrow'><td style='width:5px;display:block;'></td></tr></table></div>"),
  326. testCell = $testDiv.appendTo("body")
  327. .find("td")
  328. .width();
  329. $testDiv.remove();
  330. return Math.abs(testCell-5) > 0.1;
  331. },
  332. isLocalStorage : function () {
  333. try {
  334. return 'localStorage' in window && window.localStorage !== null;
  335. } catch (e) {
  336. return false;
  337. }
  338. },
  339. getRegional : function(inst, param, def_val) {
  340. var ret;
  341. if(def_val !== undefined) {
  342. return def_val;
  343. }
  344. if(inst.p && inst.p.regional && $.jgrid.regional) {
  345. ret = $.jgrid.getAccessor( $.jgrid.regional[inst.p.regional] || {}, param);
  346. }
  347. if(ret === undefined ) {
  348. ret = $.jgrid.getAccessor( $.jgrid, param);
  349. }
  350. return ret;
  351. },
  352. cell_width : true,
  353. ajaxOptions: {},
  354. from : function(source){
  355. // Original Author Hugo Bonacci
  356. // License MIT http://jlinq.codeplex.com/license
  357. var $t = this,
  358. QueryObject=function(d,q){
  359. if(typeof d==="string"){
  360. d=$.data(d);
  361. }
  362. var self=this,
  363. _data=d,
  364. _usecase=true,
  365. _trim=false,
  366. _query=q,
  367. _stripNum = /[\$,%]/g,
  368. _lastCommand=null,
  369. _lastField=null,
  370. _orDepth=0,
  371. _negate=false,
  372. _queuedOperator="",
  373. _sorting=[],
  374. _useProperties=true;
  375. if(typeof d==="object"&&d.push) {
  376. if(d.length>0){
  377. if(typeof d[0]!=="object"){
  378. _useProperties=false;
  379. }else{
  380. _useProperties=true;
  381. }
  382. }
  383. }else{
  384. throw "data provides is not an array";
  385. }
  386. this._hasData=function(){
  387. return _data===null?false:_data.length===0?false:true;
  388. };
  389. this._getStr=function(s){
  390. var phrase=[];
  391. if(_trim){
  392. phrase.push("jQuery.trim(");
  393. }
  394. phrase.push("String("+s+")");
  395. if(_trim){
  396. phrase.push(")");
  397. }
  398. if(!_usecase){
  399. phrase.push(".toLowerCase()");
  400. }
  401. return phrase.join("");
  402. };
  403. this._strComp=function(val){
  404. if(typeof val==="string"){
  405. return".toString()";
  406. }
  407. return"";
  408. };
  409. this._group=function(f,u){
  410. return({field:f.toString(),unique:u,items:[]});
  411. };
  412. this._toStr=function(phrase){
  413. if(_trim){
  414. phrase=$.trim(phrase);
  415. }
  416. phrase=phrase.toString().replace(/\\/g,'\\\\').replace(/\"/g,'\\"');
  417. return _usecase ? phrase : phrase.toLowerCase();
  418. };
  419. this._funcLoop=function(func){
  420. var results=[];
  421. $.each(_data,function(i,v){
  422. results.push(func(v));
  423. });
  424. return results;
  425. };
  426. this._append=function(s){
  427. var i;
  428. if(_query===null){
  429. _query="";
  430. } else {
  431. _query+=_queuedOperator === "" ? " && " :_queuedOperator;
  432. }
  433. for (i=0;i<_orDepth;i++){
  434. _query+="(";
  435. }
  436. if(_negate){
  437. _query+="!";
  438. }
  439. _query+="("+s+")";
  440. _negate=false;
  441. _queuedOperator="";
  442. _orDepth=0;
  443. };
  444. this._setCommand=function(f,c){
  445. _lastCommand=f;
  446. _lastField=c;
  447. };
  448. this._resetNegate=function(){
  449. _negate=false;
  450. };
  451. this._repeatCommand=function(f,v){
  452. if(_lastCommand===null){
  453. return self;
  454. }
  455. if(f!==null&&v!==null){
  456. return _lastCommand(f,v);
  457. }
  458. if(_lastField===null){
  459. return _lastCommand(f);
  460. }
  461. if(!_useProperties){
  462. return _lastCommand(f);
  463. }
  464. return _lastCommand(_lastField,f);
  465. };
  466. this._equals=function(a,b){
  467. return(self._compare(a,b,1)===0);
  468. };
  469. this._compare=function(a,b,d){
  470. var toString = Object.prototype.toString;
  471. if( d === undefined) { d = 1; }
  472. if(a===undefined) { a = null; }
  473. if(b===undefined) { b = null; }
  474. if(a===null && b===null){
  475. return 0;
  476. }
  477. if(a===null&&b!==null){
  478. return 1;
  479. }
  480. if(a!==null&&b===null){
  481. return -1;
  482. }
  483. if (toString.call(a) === '[object Date]' && toString.call(b) === '[object Date]') {
  484. if (a < b) { return -d; }
  485. if (a > b) { return d; }
  486. return 0;
  487. }
  488. if(!_usecase && typeof a !== "number" && typeof b !== "number" ) {
  489. a=String(a);
  490. b=String(b);
  491. }
  492. if(a<b){return -d;}
  493. if(a>b){return d;}
  494. return 0;
  495. };
  496. this._performSort=function(){
  497. if(_sorting.length===0){return;}
  498. _data=self._doSort(_data,0);
  499. };
  500. this._doSort=function(d,q){
  501. var by=_sorting[q].by,
  502. dir=_sorting[q].dir,
  503. type = _sorting[q].type,
  504. dfmt = _sorting[q].datefmt,
  505. sfunc = _sorting[q].sfunc;
  506. if(q===_sorting.length-1){
  507. return self._getOrder(d, by, dir, type, dfmt, sfunc);
  508. }
  509. q++;
  510. var values=self._getGroup(d,by,dir,type,dfmt), results=[], i, j, sorted;
  511. for(i=0;i<values.length;i++){
  512. sorted=self._doSort(values[i].items,q);
  513. for(j=0;j<sorted.length;j++){
  514. results.push(sorted[j]);
  515. }
  516. }
  517. return results;
  518. };
  519. this._getOrder=function(data,by,dir,type, dfmt, sfunc){
  520. var sortData=[],_sortData=[], newDir = dir==="a" ? 1 : -1, i,ab,j,
  521. findSortKey;
  522. if(type === undefined ) { type = "text"; }
  523. if (type === 'float' || type=== 'number' || type=== 'currency' || type=== 'numeric') {
  524. findSortKey = function($cell) {
  525. var key = parseFloat( String($cell).replace(_stripNum, ''));
  526. return isNaN(key) ? Number.NEGATIVE_INFINITY : key;
  527. };
  528. } else if (type==='int' || type==='integer') {
  529. findSortKey = function($cell) {
  530. return $cell ? parseFloat(String($cell).replace(_stripNum, '')) : Number.NEGATIVE_INFINITY;
  531. };
  532. } else if(type === 'date' || type === 'datetime') {
  533. findSortKey = function($cell) {
  534. return $.jgrid.parseDate.call($t, dfmt, $cell).getTime();
  535. };
  536. } else if($.isFunction(type)) {
  537. findSortKey = type;
  538. } else {
  539. findSortKey = function($cell) {
  540. $cell = $cell ? $.trim(String($cell)) : "";
  541. return _usecase ? $cell : $cell.toLowerCase();
  542. };
  543. }
  544. $.each(data,function(i,v){
  545. ab = by!=="" ? $.jgrid.getAccessor(v,by) : v;
  546. if(ab === undefined) { ab = ""; }
  547. ab = findSortKey(ab, v);
  548. _sortData.push({ 'vSort': ab,'index':i});
  549. });
  550. if($.isFunction(sfunc)) {
  551. _sortData.sort(function(a,b){
  552. a = a.vSort;
  553. b = b.vSort;
  554. return sfunc.call(this,a,b,newDir);
  555. });
  556. } else {
  557. _sortData.sort(function(a,b){
  558. a = a.vSort;
  559. b = b.vSort;
  560. return self._compare(a,b,newDir);
  561. });
  562. }
  563. j=0;
  564. var nrec= data.length;
  565. // overhead, but we do not change the original data.
  566. while(j<nrec) {
  567. i = _sortData[j].index;
  568. sortData.push(data[i]);
  569. j++;
  570. }
  571. return sortData;
  572. };
  573. this._getGroup=function(data,by,dir,type, dfmt){
  574. var results=[],
  575. group=null,
  576. last=null, val;
  577. $.each(self._getOrder(data,by,dir,type, dfmt),function(i,v){
  578. val = $.jgrid.getAccessor(v, by);
  579. if(val == null) { val = ""; }
  580. if(!self._equals(last,val)){
  581. last=val;
  582. if(group !== null){
  583. results.push(group);
  584. }
  585. group=self._group(by,val);
  586. }
  587. group.items.push(v);
  588. });
  589. if(group !== null){
  590. results.push(group);
  591. }
  592. return results;
  593. };
  594. this.ignoreCase=function(){
  595. _usecase=false;
  596. return self;
  597. };
  598. this.useCase=function(){
  599. _usecase=true;
  600. return self;
  601. };
  602. this.trim=function(){
  603. _trim=true;
  604. return self;
  605. };
  606. this.noTrim=function(){
  607. _trim=false;
  608. return self;
  609. };
  610. this.execute=function(){
  611. var match=_query, results=[];
  612. if(match === null){
  613. return self;
  614. }
  615. $.each(_data,function(){
  616. if(eval(match)){results.push(this);}
  617. });
  618. _data=results;
  619. return self;
  620. };
  621. this.data=function(){
  622. return _data;
  623. };
  624. this.select=function(f){
  625. self._performSort();
  626. if(!self._hasData()){ return[]; }
  627. self.execute();
  628. if($.isFunction(f)){
  629. var results=[];
  630. $.each(_data,function(i,v){
  631. results.push(f(v));
  632. });
  633. return results;
  634. }
  635. return _data;
  636. };
  637. this.hasMatch=function(){
  638. if(!self._hasData()) { return false; }
  639. self.execute();
  640. return _data.length>0;
  641. };
  642. this.andNot=function(f,v,x){
  643. _negate=!_negate;
  644. return self.and(f,v,x);
  645. };
  646. this.orNot=function(f,v,x){
  647. _negate=!_negate;
  648. return self.or(f,v,x);
  649. };
  650. this.not=function(f,v,x){
  651. return self.andNot(f,v,x);
  652. };
  653. this.and=function(f,v,x){
  654. _queuedOperator=" && ";
  655. if(f===undefined){
  656. return self;
  657. }
  658. return self._repeatCommand(f,v,x);
  659. };
  660. this.or=function(f,v,x){
  661. _queuedOperator=" || ";
  662. if(f===undefined) { return self; }
  663. return self._repeatCommand(f,v,x);
  664. };
  665. this.orBegin=function(){
  666. _orDepth++;
  667. return self;
  668. };
  669. this.orEnd=function(){
  670. if (_query !== null){
  671. _query+=")";
  672. }
  673. return self;
  674. };
  675. this.isNot=function(f){
  676. _negate=!_negate;
  677. return self.is(f);
  678. };
  679. this.is=function(f){
  680. self._append('this.'+f);
  681. self._resetNegate();
  682. return self;
  683. };
  684. this._compareValues=function(func,f,v,how,t){
  685. var fld;
  686. if(_useProperties){
  687. fld='jQuery.jgrid.getAccessor(this,\''+f+'\')';
  688. }else{
  689. fld='this';
  690. }
  691. if(v===undefined) { v = null; }
  692. //var val=v===null?f:v,
  693. var val =v,
  694. swst = t.stype === undefined ? "text" : t.stype;
  695. if(v !== null) {
  696. switch(swst) {
  697. case 'int':
  698. case 'integer':
  699. val = (isNaN(Number(val)) || val==="") ? '0' : val; // To be fixed with more inteligent code
  700. fld = 'parseInt('+fld+',10)';
  701. val = 'parseInt('+val+',10)';
  702. break;
  703. case 'float':
  704. case 'number':
  705. case 'numeric':
  706. val = String(val).replace(_stripNum, '');
  707. val = (isNaN(Number(val)) || val==="") ? '0' : val; // To be fixed with more inteligent code
  708. fld = 'parseFloat('+fld+')';
  709. val = 'parseFloat('+val+')';
  710. break;
  711. case 'date':
  712. case 'datetime':
  713. val = String($.jgrid.parseDate.call($t, t.srcfmt || 'Y-m-d',val).getTime());
  714. fld = 'jQuery.jgrid.parseDate.call(jQuery("#'+$.jgrid.jqID($t.p.id)+'")[0],"'+t.srcfmt+'",'+fld+').getTime()';
  715. break;
  716. default :
  717. fld=self._getStr(fld);
  718. val=self._getStr('"'+self._toStr(val)+'"');
  719. }
  720. }
  721. self._append(fld+' '+how+' '+val);
  722. self._setCommand(func,f);
  723. self._resetNegate();
  724. return self;
  725. };
  726. this.equals=function(f,v,t){
  727. return self._compareValues(self.equals,f,v,"==",t);
  728. };
  729. this.notEquals=function(f,v,t){
  730. return self._compareValues(self.equals,f,v,"!==",t);
  731. };
  732. this.isNull = function(f,v,t){
  733. return self._compareValues(self.equals,f,null,"===",t);
  734. };
  735. this.greater=function(f,v,t){
  736. return self._compareValues(self.greater,f,v,">",t);
  737. };
  738. this.less=function(f,v,t){
  739. return self._compareValues(self.less,f,v,"<",t);
  740. };
  741. this.greaterOrEquals=function(f,v,t){
  742. return self._compareValues(self.greaterOrEquals,f,v,">=",t);
  743. };
  744. this.lessOrEquals=function(f,v,t){
  745. return self._compareValues(self.lessOrEquals,f,v,"<=",t);
  746. };
  747. this.startsWith=function(f,v){
  748. var val = (v==null) ? f: v,
  749. length=_trim ? $.trim(val.toString()).length : val.toString().length;
  750. if(_useProperties){
  751. self._append(self._getStr('jQuery.jgrid.getAccessor(this,\''+f+'\')')+'.substr(0,'+length+') == '+self._getStr('"'+self._toStr(v)+'"'));
  752. }else{
  753. if (v!=null) { length=_trim?$.trim(v.toString()).length:v.toString().length; }
  754. self._append(self._getStr('this')+'.substr(0,'+length+') == '+self._getStr('"'+self._toStr(f)+'"'));
  755. }
  756. self._setCommand(self.startsWith,f);
  757. self._resetNegate();
  758. return self;
  759. };
  760. this.endsWith=function(f,v){
  761. var val = (v==null) ? f: v,
  762. length=_trim ? $.trim(val.toString()).length:val.toString().length;
  763. if(_useProperties){
  764. self._append(self._getStr('jQuery.jgrid.getAccessor(this,\''+f+'\')')+'.substr('+self._getStr('jQuery.jgrid.getAccessor(this,\''+f+'\')')+'.length-'+length+','+length+') == "'+self._toStr(v)+'"');
  765. } else {
  766. self._append(self._getStr('this')+'.substr('+self._getStr('this')+'.length-"'+self._toStr(f)+'".length,"'+self._toStr(f)+'".length) == "'+self._toStr(f)+'"');
  767. }
  768. self._setCommand(self.endsWith,f);self._resetNegate();
  769. return self;
  770. };
  771. this.contains=function(f,v){
  772. if(_useProperties){
  773. self._append(self._getStr('jQuery.jgrid.getAccessor(this,\''+f+'\')')+'.indexOf("'+self._toStr(v)+'",0) > -1');
  774. }else{
  775. self._append(self._getStr('this')+'.indexOf("'+self._toStr(f)+'",0) > -1');
  776. }
  777. self._setCommand(self.contains,f);
  778. self._resetNegate();
  779. return self;
  780. };
  781. this.groupBy=function(by,dir,type, datefmt){
  782. if(!self._hasData()){
  783. return null;
  784. }
  785. return self._getGroup(_data,by,dir,type, datefmt);
  786. };
  787. this.orderBy=function(by,dir,stype, dfmt, sfunc){
  788. dir = dir == null ? "a" :$.trim(dir.toString().toLowerCase());
  789. if(stype == null) { stype = "text"; }
  790. if(dfmt == null) { dfmt = "Y-m-d"; }
  791. if(sfunc == null) { sfunc = false; }
  792. if(dir==="desc"||dir==="descending"){dir="d";}
  793. if(dir==="asc"||dir==="ascending"){dir="a";}
  794. _sorting.push({by:by,dir:dir,type:stype, datefmt: dfmt, sfunc: sfunc});
  795. return self;
  796. };
  797. return self;
  798. };
  799. return new QueryObject(source,null);
  800. },
  801. getMethod: function (name) {
  802. return this.getAccessor($.fn.jqGrid, name);
  803. },
  804. extend : function(methods) {
  805. $.extend($.fn.jqGrid,methods);
  806. if (!this.no_legacy_api) {
  807. $.fn.extend(methods);
  808. }
  809. },
  810. clearBeforeUnload : function( jqGridId ) {
  811. var $t = $("#"+$.jgrid.jqID( jqGridId ))[0], grid;
  812. if(!$t.grid) { return;}
  813. grid = $t.grid;
  814. if ($.isFunction(grid.emptyRows)) {
  815. grid.emptyRows.call($t, true, true); // this work quick enough and reduce the size of memory leaks if we have someone
  816. }
  817. $(document).unbind("mouseup.jqGrid" + $t.p.id );
  818. $(grid.hDiv).unbind("mousemove"); // TODO add namespace
  819. $($t).unbind();
  820. var i, l = grid.headers.length,
  821. removevents = ['formatCol','sortData','updatepager','refreshIndex','setHeadCheckBox','constructTr','formatter','addXmlData','addJSONData','grid','p'];
  822. for (i = 0; i < l; i++) {
  823. grid.headers[i].el = null;
  824. }
  825. for( i in grid) {
  826. if( grid.hasOwnProperty(i)) {
  827. grid[i] = null;
  828. }
  829. }
  830. // experimental
  831. for( i in $t.p) {
  832. if($t.p.hasOwnProperty(i)) {
  833. $t.p[i] = $.isArray($t.p[i]) ? [] : null;
  834. }
  835. }
  836. l = removevents.length;
  837. for(i = 0; i < l; i++) {
  838. if($t.hasOwnProperty(removevents[i])) {
  839. $t[removevents[i]] = null;
  840. delete($t[removevents[i]]);
  841. }
  842. }
  843. },
  844. gridUnload : function ( jqGridId ) {
  845. if(!jqGridId) { return; }
  846. jqGridId = $.trim(jqGridId);
  847. if(jqGridId.indexOf("#") === 0) {
  848. jqGridId = jqGridId.substring(1);
  849. }
  850. var $t = $("#"+ $.jgrid.jqID(jqGridId))[0];
  851. if ( !$t.grid ) {return;}
  852. var defgrid = {id: $($t).attr('id'),cl: $($t).attr('class')};
  853. if ($t.p.pager) {
  854. $($t.p.pager).unbind().empty().removeClass("ui-state-default ui-jqgrid-pager ui-corner-bottom");
  855. }
  856. var newtable = document.createElement('table');
  857. newtable.className = defgrid.cl;
  858. var gid = $.jgrid.jqID($t.id);
  859. $(newtable).removeClass("ui-jqgrid-btable").insertBefore("#gbox_"+gid);
  860. if( $($t.p.pager).parents("#gbox_"+gid).length === 1 ) {
  861. $($t.p.pager).insertBefore("#gbox_"+gid);
  862. }
  863. $.jgrid.clearBeforeUnload( jqGridId );
  864. $("#gbox_"+gid).remove();
  865. $(newtable).attr({id:defgrid.id});
  866. $("#alertmod_"+$.jgrid.jqID(jqGridId)).remove();
  867. },
  868. gridDestroy : function ( jqGridId ) {
  869. if(!jqGridId) { return; }
  870. jqGridId = $.trim(jqGridId);
  871. if(jqGridId.indexOf("#") === 0) {
  872. jqGridId = jqGridId.substring(1);
  873. }
  874. var $t = $("#"+ $.jgrid.jqID(jqGridId))[0];
  875. if ( !$t.grid ) {return;}
  876. if ( $t.p.pager ) { // if not part of grid
  877. $($t.p.pager).remove();
  878. }
  879. try {
  880. $.jgrid.clearBeforeUnload( jqGridId );
  881. $("#gbox_"+$.jgrid.jqID(jqGridId)).remove();
  882. } catch (_) {}
  883. }
  884. });
  885. $.fn.jqGrid = function( pin ) {
  886. if (typeof pin === 'string') {
  887. var fn = $.jgrid.getMethod(pin);
  888. if (!fn) {
  889. throw ("jqGrid - No such method: " + pin);
  890. }
  891. var args = $.makeArray(arguments).slice(1);
  892. return fn.apply(this,args);
  893. }
  894. return this.each( function() {
  895. if(this.grid) {return;}
  896. var localData;
  897. if (pin != null && pin.data !== undefined) {
  898. localData = pin.data;
  899. pin.data = [];
  900. }
  901. var p = $.extend(true,{
  902. url: "",
  903. height: 150,
  904. page: 1,
  905. rowNum: 20,
  906. rowTotal : null,
  907. records: 0,
  908. pager: "",
  909. pgbuttons: true,
  910. pginput: true,
  911. colModel: [],
  912. rowList: [],
  913. colNames: [],
  914. sortorder: "asc",
  915. sortname: "",
  916. datatype: "xml",
  917. mtype: "GET",
  918. altRows: false,
  919. selarrrow: [],
  920. savedRow: [],
  921. shrinkToFit: true,
  922. xmlReader: {},
  923. jsonReader: {},
  924. subGrid: false,
  925. subGridModel :[],
  926. reccount: 0,
  927. lastpage: 0,
  928. lastsort: 0,
  929. selrow: null,
  930. beforeSelectRow: null,
  931. onSelectRow: null,
  932. onSortCol: null,
  933. ondblClickRow: null,
  934. onRightClickRow: null,
  935. onPaging: null,
  936. onSelectAll: null,
  937. onInitGrid : null,
  938. loadComplete: null,
  939. gridComplete: null,
  940. loadError: null,
  941. loadBeforeSend: null,
  942. afterInsertRow: null,
  943. beforeRequest: null,
  944. beforeProcessing : null,
  945. onHeaderClick: null,
  946. viewrecords: false,
  947. loadonce: false,
  948. multiselect: false,
  949. multikey: false,
  950. editurl: null,
  951. search: false,
  952. caption: "",
  953. hidegrid: true,
  954. hiddengrid: false,
  955. postData: {},
  956. userData: {},
  957. treeGrid : false,
  958. treeGridModel : 'nested',
  959. treeReader : {},
  960. treeANode : -1,
  961. ExpandColumn: null,
  962. tree_root_level : 0,
  963. prmNames: {page:"page",rows:"rows", sort: "sidx",order: "sord", search:"_search", nd:"nd", id:"id",oper:"oper",editoper:"edit",addoper:"add",deloper:"del", subgridid:"id", npage: null, totalrows:"totalrows"},
  964. forceFit : false,
  965. gridstate : "visible",
  966. cellEdit: false,
  967. cellsubmit: "remote",
  968. nv:0,
  969. loadui: "enable",
  970. toolbar: [false,""],
  971. scroll: false,
  972. multiboxonly : false,
  973. deselectAfterSort : true,
  974. scrollrows : false,
  975. autowidth: false,
  976. scrollOffset :18,
  977. cellLayout: 5,
  978. subGridWidth: 20,
  979. multiselectWidth: 20,
  980. gridview: true,
  981. rownumWidth: 25,
  982. rownumbers : false,
  983. pagerpos: 'center',
  984. recordpos: 'right',
  985. footerrow : false,
  986. userDataOnFooter : false,
  987. hoverrows : true,
  988. altclass : 'ui-priority-secondary',
  989. viewsortcols : [false,'vertical',true],
  990. resizeclass : '',
  991. autoencode : false,
  992. remapColumns : [],
  993. ajaxGridOptions :{},
  994. direction : "ltr",
  995. toppager: false,
  996. headertitles: false,
  997. scrollTimeout: 40,
  998. data : [],
  999. _index : {},
  1000. grouping : false,
  1001. groupingView : {groupField:[],groupOrder:[], groupText:[],groupColumnShow:[],groupSummary:[], showSummaryOnHide: false, sortitems:[], sortnames:[], summary:[],summaryval:[], plusicon: 'ui-icon-circlesmall-plus', minusicon: 'ui-icon-circlesmall-minus', displayField: [], groupSummaryPos:[], formatDisplayField : [], _locgr : false},
  1002. ignoreCase : true,
  1003. cmTemplate : {},
  1004. idPrefix : "",
  1005. multiSort : false,
  1006. minColWidth : 33,
  1007. scrollPopUp : false,
  1008. scrollTopOffset: 0, // pixel
  1009. scrollLeftOffset : "100%", //percent
  1010. storeNavOptions: false,
  1011. regional : "en"
  1012. }, $.jgrid.defaults , pin );
  1013. if (localData !== undefined) {
  1014. p.data = localData;
  1015. pin.data = localData;
  1016. }
  1017. var ts= this, grid={
  1018. headers:[],
  1019. cols:[],
  1020. footers: [],
  1021. dragStart: function(i,x,y) {
  1022. var gridLeftPos = $(this.bDiv).offset().left;
  1023. this.resizing = { idx: i, startX: x.pageX, sOL : x.pageX - gridLeftPos };
  1024. this.hDiv.style.cursor = "col-resize";
  1025. this.curGbox = $("#rs_m"+$.jgrid.jqID(p.id),"#gbox_"+$.jgrid.jqID(p.id));
  1026. this.curGbox.css({display:"block",left:x.pageX-gridLeftPos,top:y[1],height:y[2]});
  1027. $(ts).triggerHandler("jqGridResizeStart", [x, i]);
  1028. if($.isFunction(p.resizeStart)) { p.resizeStart.call(ts,x,i); }
  1029. document.onselectstart=function(){return false;};
  1030. },
  1031. dragMove: function(x) {
  1032. if(this.resizing) {
  1033. var diff = x.pageX-this.resizing.startX,
  1034. h = this.headers[this.resizing.idx],
  1035. newWidth = p.direction === "ltr" ? h.width + diff : h.width - diff, hn, nWn;
  1036. if(newWidth > 33) {
  1037. this.curGbox.css({left:this.resizing.sOL+diff});
  1038. if(p.forceFit===true ){
  1039. hn = this.headers[this.resizing.idx+p.nv];
  1040. nWn = p.direction === "ltr" ? hn.width - diff : hn.width + diff;
  1041. if(nWn > p.minColWidth ) {
  1042. h.newWidth = newWidth;
  1043. hn.newWidth = nWn;
  1044. }
  1045. } else {
  1046. this.newWidth = p.direction === "ltr" ? p.tblwidth+diff : p.tblwidth-diff;
  1047. h.newWidth = newWidth;
  1048. }
  1049. }
  1050. }
  1051. },
  1052. dragEnd: function() {
  1053. this.hDiv.style.cursor = "default";
  1054. if(this.resizing) {
  1055. var idx = this.resizing.idx,
  1056. nw = this.headers[idx].newWidth || this.headers[idx].width;
  1057. nw = parseInt(nw,10);
  1058. this.resizing = false;
  1059. $("#rs_m"+$.jgrid.jqID(p.id)).css("display","none");
  1060. p.colModel[idx].width = nw;
  1061. this.headers[idx].width = nw;
  1062. this.headers[idx].el.style.width = nw + "px";
  1063. this.cols[idx].style.width = nw+"px";
  1064. if(this.footers.length>0) {this.footers[idx].style.width = nw+"px";}
  1065. if(p.forceFit===true){
  1066. nw = this.headers[idx+p.nv].newWidth || this.headers[idx+p.nv].width;
  1067. this.headers[idx+p.nv].width = nw;
  1068. this.headers[idx+p.nv].el.style.width = nw + "px";
  1069. this.cols[idx+p.nv].style.width = nw+"px";
  1070. if(this.footers.length>0) {this.footers[idx+p.nv].style.width = nw+"px";}
  1071. p.colModel[idx+p.nv].width = nw;
  1072. } else {
  1073. p.tblwidth = this.newWidth || p.tblwidth;
  1074. $('table:first',this.bDiv).css("width",p.tblwidth+"px");
  1075. $('table:first',this.hDiv).css("width",p.tblwidth+"px");
  1076. this.hDiv.scrollLeft = this.bDiv.scrollLeft;
  1077. if(p.footerrow) {
  1078. $('table:first',this.sDiv).css("width",p.tblwidth+"px");
  1079. this.sDiv.scrollLeft = this.bDiv.scrollLeft;
  1080. }
  1081. }
  1082. $(ts).triggerHandler("jqGridResizeStop", [nw, idx]);
  1083. if($.isFunction(p.resizeStop)) { p.resizeStop.call(ts,nw,idx); }
  1084. }
  1085. this.curGbox = null;
  1086. document.onselectstart=function(){return true;};
  1087. },
  1088. populateVisible: function() {
  1089. if (grid.timer) { clearTimeout(grid.timer); }
  1090. grid.timer = null;
  1091. var dh = $(grid.bDiv).height();
  1092. if (!dh) { return; }
  1093. var table = $("table:first", grid.bDiv);
  1094. var rows, rh;
  1095. if(table[0].rows.length) {
  1096. try {
  1097. rows = table[0].rows[1];
  1098. rh = rows ? $(rows).outerHeight() || grid.prevRowHeight : grid.prevRowHeight;
  1099. } catch (pv) {
  1100. rh = grid.prevRowHeight;
  1101. }
  1102. }
  1103. if (!rh) { return; }
  1104. grid.prevRowHeight = rh;
  1105. var rn = p.rowNum;
  1106. var scrollTop = grid.scrollTop = grid.bDiv.scrollTop;
  1107. var ttop = Math.round(table.position().top) - scrollTop;
  1108. var tbot = ttop + table.height();
  1109. var div = rh * rn;
  1110. var page, npage, empty;
  1111. if ( tbot < dh && ttop <= 0 &&
  1112. (p.lastpage===undefined||(parseInt((tbot + scrollTop + div - 1) / div,10) || 0) <= p.lastpage))
  1113. {
  1114. npage = parseInt((dh - tbot + div - 1) / div,10) || 1;
  1115. if (tbot >= 0 || npage < 2 || p.scroll === true) {
  1116. page = ( Math.round((tbot + scrollTop) / div) || 0) + 1;
  1117. ttop = -1;
  1118. } else {
  1119. ttop = 1;
  1120. }
  1121. }
  1122. if (ttop > 0) {
  1123. page = ( parseInt(scrollTop / div,10) || 0 ) + 1;
  1124. npage = (parseInt((scrollTop + dh) / div,10) || 0) + 2 - page;
  1125. empty = true;
  1126. }
  1127. if (npage) {
  1128. if (p.lastpage && (page > p.lastpage || p.lastpage===1 || (page === p.page && page===p.lastpage)) ) {
  1129. return;
  1130. }
  1131. if (grid.hDiv.loading) {
  1132. grid.timer = setTimeout(grid.populateVisible, p.scrollTimeout);
  1133. } else {
  1134. p.page = page;
  1135. if (empty) {
  1136. grid.selectionPreserver(table[0]);
  1137. grid.emptyRows.call(table[0], false, false);
  1138. }
  1139. grid.populate(npage);
  1140. }
  1141. if(p.scrollPopUp && p.lastpage != null) {
  1142. $("#scroll_g"+p.id).show().html( $.jgrid.template( $.jgrid.getRegional(ts, "defaults.pgtext", p.pgtext) , p.page, p.lastpage)).css({ "top": p.scrollTopOffset+scrollTop*((parseInt(p.height,10) - 45)/ (parseInt(rh,10)*parseInt(p.records,10))) +"px", "left" : p.scrollLeftOffset});
  1143. $(this).mouseout(function(){
  1144. $("#scroll_g"+p.id).hide();
  1145. });
  1146. }
  1147. }
  1148. },
  1149. scrollGrid: function( e ) {
  1150. if(p.scroll) {
  1151. var scrollTop = grid.bDiv.scrollTop;
  1152. if(grid.scrollTop === undefined) { grid.scrollTop = 0; }
  1153. if (scrollTop !== grid.scrollTop) {
  1154. grid.scrollTop = scrollTop;
  1155. if (grid.timer) { clearTimeout(grid.timer); }
  1156. grid.timer = setTimeout(grid.populateVisible, p.scrollTimeout);
  1157. }
  1158. }
  1159. grid.hDiv.scrollLeft = grid.bDiv.scrollLeft;
  1160. if(p.footerrow) {
  1161. grid.sDiv.scrollLeft = grid.bDiv.scrollLeft;
  1162. }
  1163. if( e ) { e.stopPropagation(); }
  1164. },
  1165. selectionPreserver : function(ts) {
  1166. var p = ts.p,
  1167. sr = p.selrow, sra = p.selarrrow ? $.makeArray(p.selarrrow) : null,
  1168. left = ts.grid.bDiv.scrollLeft,
  1169. restoreSelection = function() {
  1170. var i;
  1171. p.selrow = null;
  1172. p.selarrrow = [];
  1173. if(p.multiselect && sra && sra.length>0) {
  1174. for(i=0;i<sra.length;i++){
  1175. if (sra[i] !== sr) {
  1176. $(ts).jqGrid("setSelection",sra[i],false, null);
  1177. }
  1178. }
  1179. }
  1180. if (sr) {
  1181. $(ts).jqGrid("setSelection",sr,false,null);
  1182. }
  1183. ts.grid.bDiv.scrollLeft = left;
  1184. $(ts).unbind('.selectionPreserver', restoreSelection);
  1185. };
  1186. $(ts).bind('jqGridGridComplete.selectionPreserver', restoreSelection);
  1187. }
  1188. };
  1189. if(this.tagName.toUpperCase() !== 'TABLE' || this.id == null) {
  1190. alert("Element is not a table or has no id!");
  1191. return;
  1192. }
  1193. if(document.documentMode !== undefined ) { // IE only
  1194. if(document.documentMode <= 5) {
  1195. alert("Grid can not be used in this ('quirks') mode!");
  1196. return;
  1197. }
  1198. }
  1199. $(this).empty().attr("tabindex","0");
  1200. this.p = p ;
  1201. this.p.useProp = !!$.fn.prop;
  1202. var i, dir;
  1203. if(this.p.colNames.length === 0) {
  1204. for (i=0;i<this.p.colModel.length;i++){
  1205. this.p.colNames[i] = this.p.colModel[i].label || this.p.colModel[i].name;
  1206. }
  1207. }
  1208. if( this.p.colNames.length !== this.p.colModel.length ) {
  1209. alert($.jgrid.getRegional(this,"errors.model"));
  1210. return;
  1211. }
  1212. var gv = $("<div class='ui-jqgrid-view' role='grid'></div>"),
  1213. isMSIE = $.jgrid.msie;
  1214. ts.p.direction = $.trim(ts.p.direction.toLowerCase());
  1215. ts.p._ald = false;
  1216. if($.inArray(ts.p.direction,["ltr","rtl"]) === -1) { ts.p.direction = "ltr"; }
  1217. dir = ts.p.direction;
  1218. $(gv).insertBefore(this);
  1219. $(this).removeClass("scroll").appendTo(gv);
  1220. var eg = $("<div class='ui-jqgrid ui-widget ui-widget-content ui-corner-all'></div>");
  1221. $(eg).attr({"id" : "gbox_"+this.id,"dir":dir}).insertBefore(gv);
  1222. $(gv).attr("id","gview_"+this.id).appendTo(eg);
  1223. $("<div class='ui-widget-overlay jqgrid-overlay' id='lui_"+this.id+"'></div>").insertBefore(gv);
  1224. $("<div class='loading ui-state-default ui-state-active' id='load_"+this.id+"'>"+$.jgrid.getRegional(ts, "defaults.loadtext", this.p.loadtext)+"</div>").insertBefore(gv);
  1225. $(this).attr({cellspacing:"0",cellpadding:"0",border:"0","role":"presentation","aria-multiselectable":!!this.p.multiselect,"aria-labelledby":"gbox_"+this.id});
  1226. var sortkeys = ["shiftKey","altKey","ctrlKey"],
  1227. intNum = function(val,defval) {
  1228. val = parseInt(val,10);
  1229. if (isNaN(val)) { return defval || 0;}
  1230. return val;
  1231. },
  1232. formatCol = function (pos, rowInd, tv, rawObject, rowId, rdata){
  1233. var cm = ts.p.colModel[pos], cellAttrFunc,
  1234. ral = cm.align, result="style=\"", clas = cm.classes, nm = cm.name, celp, acp=[];
  1235. if(ral) { result += "text-align:"+ral+";"; }
  1236. if(cm.hidden===true) { result += "display:none;"; }
  1237. if(rowInd===0) {
  1238. result += "width: "+grid.headers[pos].width+"px;";
  1239. } else if ($.isFunction(cm.cellattr) || (typeof cm.cellattr === "string" && $.jgrid.cellattr != null && $.isFunction($.jgrid.cellattr[cm.cellattr]))) {
  1240. cellAttrFunc = $.isFunction(cm.cellattr) ? cm.cellattr : $.jgrid.cellattr[cm.cellattr];
  1241. celp = cellAttrFunc.call(ts, rowId, tv, rawObject, cm, rdata);
  1242. if(celp && typeof celp === "string") {
  1243. celp = celp.replace(/style/i,'style').replace(/title/i,'title');
  1244. if(celp.indexOf('title') > -1) { cm.title=false;}
  1245. if(celp.indexOf('class') > -1) { clas = undefined;}
  1246. acp = celp.replace(/\-style/g,'-sti').split(/style/);
  1247. if(acp.length === 2 ) {
  1248. acp[1] = $.trim(acp[1].replace(/\-sti/g,'-style').replace("=",""));
  1249. if(acp[1].indexOf("'") === 0 || acp[1].indexOf('"') === 0) {
  1250. acp[1] = acp[1].substring(1);
  1251. }
  1252. result += acp[1].replace(/'/gi,'"');
  1253. } else {
  1254. result += "\"";
  1255. }
  1256. }
  1257. }
  1258. if(!acp.length) { acp[0] = ""; result += "\"";}
  1259. result += (clas !== undefined ? (" class=\""+clas+"\"") :"") + ((cm.title && tv) ? (" title=\""+$.jgrid.stripHtml(tv)+"\"") :"");
  1260. result += " aria-describedby=\""+ts.p.id+"_"+nm+"\"";
  1261. return result + acp[0];
  1262. },
  1263. cellVal = function (val) {
  1264. return val == null || val === "" ? "&#160;" : (ts.p.autoencode ? $.jgrid.htmlEncode(val) : String(val));
  1265. },
  1266. formatter = function (rowId, cellval , colpos, rwdat, _act){
  1267. var cm = ts.p.colModel[colpos],v;
  1268. if(cm.formatter !== undefined) {
  1269. rowId = String(ts.p.idPrefix) !== "" ? $.jgrid.stripPref(ts.p.idPrefix, rowId) : rowId;
  1270. var opts= {rowId: rowId, colModel:cm, gid:ts.p.id, pos:colpos };
  1271. if($.isFunction( cm.formatter ) ) {
  1272. v = cm.formatter.call(ts,cellval,opts,rwdat,_act);
  1273. } else if($.fmatter){
  1274. v = $.fn.fmatter.call(ts,cm.formatter,cellval,opts,rwdat,_act);
  1275. } else {
  1276. v = cellVal(cellval);
  1277. }
  1278. } else {
  1279. v = cellVal(cellval);
  1280. }
  1281. return v;
  1282. },
  1283. addCell = function(rowId,cell,pos,irow, srvr, rdata) {
  1284. var v,prp;
  1285. v = formatter(rowId,cell,pos,srvr,'add');
  1286. prp = formatCol( pos,irow, v, srvr, rowId, rdata);
  1287. return "<td role=\"gridcell\" "+prp+">"+v+"</td>";
  1288. },
  1289. addMulti = function(rowid,pos,irow,checked){
  1290. var v = "<input role=\"checkbox\" type=\"checkbox\""+" id=\"jqg_"+ts.p.id+"_"+rowid+"\" class=\"cbox\" name=\"jqg_"+ts.p.id+"_"+rowid+"\"" + (checked ? "checked=\"checked\"" : "")+"/>",
  1291. prp = formatCol( pos,irow,'',null, rowid, true);
  1292. return "<td role=\"gridcell\" "+prp+">"+v+"</td>";
  1293. },
  1294. addRowNum = function (pos,irow,pG,rN) {
  1295. var v = (parseInt(pG,10)-1)*parseInt(rN,10)+1+irow,
  1296. prp = formatCol( pos,irow,v, null, irow, true);
  1297. return "<td role=\"gridcell\" class=\"ui-state-default jqgrid-rownum\" "+prp+">"+v+"</td>";
  1298. },
  1299. reader = function (datatype) {
  1300. var field, f=[], j=0, i;
  1301. for(i =0; i<ts.p.colModel.length; i++){
  1302. field = ts.p.colModel[i];
  1303. if (field.name !== 'cb' && field.name !=='subgrid' && field.name !=='rn') {
  1304. f[j]= datatype === "local" ?
  1305. field.name :
  1306. ( (datatype==="xml" || datatype === "xmlstring") ? field.xmlmap || field.name : field.jsonmap || field.name );
  1307. if(ts.p.keyName !== false && field.key===true ) {
  1308. ts.p.keyName = f[j];
  1309. }
  1310. j++;
  1311. }
  1312. }
  1313. return f;
  1314. },
  1315. orderedCols = function (offset) {
  1316. var order = ts.p.remapColumns;
  1317. if (!order || !order.length) {
  1318. order = $.map(ts.p.colModel, function(v,i) { return i; });
  1319. }
  1320. if (offset) {
  1321. order = $.map(order, function(v) { return v<offset?null:v-offset; });
  1322. }
  1323. return order;
  1324. },
  1325. emptyRows = function (scroll, locdata) {
  1326. var firstrow;
  1327. if (this.p.deepempty) {
  1328. $(this.rows).slice(1).remove();
  1329. } else {
  1330. firstrow = this.rows.length > 0 ? this.rows[0] : null;
  1331. $(this.firstChild).empty().append(firstrow);
  1332. }
  1333. if (scroll && this.p.scroll) {
  1334. $(this.grid.bDiv.firstChild).css({height: "auto"});
  1335. $(this.grid.bDiv.firstChild.firstChild).css({height: 0, display: "none"});
  1336. if (this.grid.bDiv.scrollTop !== 0) {
  1337. this.grid.bDiv.scrollTop = 0;
  1338. }
  1339. }
  1340. if(locdata === true && this.p.treeGrid && !this.p.loadonce ) {
  1341. this.p.data = []; this.p._index = {};
  1342. }
  1343. },
  1344. normalizeData = function() {
  1345. var p = ts.p, data = p.data, dataLength = data.length, i, j, cur, idn, idr, ccur, v, rd,
  1346. localReader = p.localReader,
  1347. colModel = p.colModel,
  1348. cellName = localReader.cell,
  1349. iOffset = (p.multiselect === true ? 1 : 0) + (p.subGrid === true ? 1 : 0) + (p.rownumbers === true ? 1 : 0),
  1350. br = p.scroll ? $.jgrid.randId() : 1,
  1351. arrayReader, objectReader, rowReader;
  1352. if (p.datatype !== "local" || localReader.repeatitems !== true) {
  1353. return; // nothing to do
  1354. }
  1355. arrayReader = orderedCols(iOffset);
  1356. objectReader = reader("local");
  1357. // read ALL input items and convert items to be read by
  1358. // $.jgrid.getAccessor with column name as the second parameter
  1359. idn = p.keyIndex === false ?
  1360. ($.isFunction(localReader.id) ? localReader.id.call(ts, data) : localReader.id) :
  1361. p.keyIndex;
  1362. for (i = 0; i < dataLength; i++) {
  1363. cur = data[i];
  1364. // read id in the same way like addJSONData do
  1365. // probably it would be better to start with "if (cellName) {...}"
  1366. // but the goal of the current implementation was just have THE SAME
  1367. // id values like in addJSONData ...
  1368. idr = $.jgrid.getAccessor(cur, idn);
  1369. if (idr === undefined) {
  1370. if (typeof idn === "number" && colModel[idn + iOffset] != null) {
  1371. // reread id by name
  1372. idr = $.jgrid.getAccessor(cur, colModel[idn + iOffset].name);
  1373. }
  1374. if (idr === undefined) {
  1375. idr = br + i;
  1376. if (cellName) {
  1377. ccur = $.jgrid.getAccessor(cur, cellName) || cur;
  1378. idr = ccur != null && ccur[idn] !== undefined ? ccur[idn] : idr;
  1379. ccur = null;
  1380. }
  1381. }
  1382. }
  1383. rd = { };
  1384. rd[localReader.id] = idr;
  1385. if (cellName) {
  1386. cur = $.jgrid.getAccessor(cur, cellName) || cur;
  1387. }
  1388. rowReader = $.isArray(cur) ? arrayReader : objectReader;
  1389. for (j = 0; j < rowReader.length; j++) {
  1390. v = $.jgrid.getAccessor(cur, rowReader[j]);
  1391. rd[colModel[j + iOffset].name] = v;
  1392. }
  1393. $.extend(true, data[i], rd);
  1394. }
  1395. },
  1396. refreshIndex = function() {
  1397. var datalen = ts.p.data.length, idname, i, val;
  1398. if(ts.p.keyName === false || ts.p.loadonce === true) {
  1399. idname = ts.p.localReader.id;
  1400. } else {
  1401. idname = ts.p.keyName;
  1402. }
  1403. ts.p._index = [];
  1404. for(i =0;i < datalen; i++) {
  1405. val = $.jgrid.getAccessor(ts.p.data[i],idname);
  1406. if (val === undefined) { val=String(i+1); }
  1407. ts.p._index[val] = i;
  1408. }
  1409. },
  1410. constructTr = function(id, hide, altClass, rd, cur, selected) {
  1411. var tabindex = '-1', restAttr = '', attrName, style = hide ? 'display:none;' : '',
  1412. classes = 'ui-widget-content jqgrow ui-row-' + ts.p.direction + (altClass ? ' ' + altClass : '') + (selected ? ' ui-state-highlight' : ''),
  1413. rowAttrObj = $(ts).triggerHandler("jqGridRowAttr", [rd, cur, id]);
  1414. if( typeof rowAttrObj !== "object" ) {
  1415. rowAttrObj = $.isFunction(ts.p.rowattr) ? ts.p.rowattr.call(ts, rd, cur, id) :
  1416. (typeof ts.p.rowattr === "string" && $.jgrid.rowattr != null && $.isFunction($.jgrid.rowattr[ts.p.rowattr]) ?
  1417. $.jgrid.rowattr[ts.p.rowattr].call(ts, rd, cur, id) : {});
  1418. }
  1419. if(!$.isEmptyObject( rowAttrObj )) {
  1420. if (rowAttrObj.hasOwnProperty("id")) {
  1421. id = rowAttrObj.id;
  1422. delete rowAttrObj.id;
  1423. }
  1424. if (rowAttrObj.hasOwnProperty("tabindex")) {
  1425. tabindex = rowAttrObj.tabindex;
  1426. delete rowAttrObj.tabindex;
  1427. }
  1428. if (rowAttrObj.hasOwnProperty("style")) {
  1429. style += rowAttrObj.style;
  1430. delete rowAttrObj.style;
  1431. }
  1432. if (rowAttrObj.hasOwnProperty("class")) {
  1433. classes += ' ' + rowAttrObj['class'];
  1434. delete rowAttrObj['class'];
  1435. }
  1436. // dot't allow to change role attribute
  1437. try { delete rowAttrObj.role; } catch(ra){}
  1438. for (attrName in rowAttrObj) {
  1439. if (rowAttrObj.hasOwnProperty(attrName)) {
  1440. restAttr += ' ' + attrName + '=' + rowAttrObj[attrName];
  1441. }
  1442. }
  1443. }
  1444. return '<tr role="row" id="' + id + '" tabindex="' + tabindex + '" class="' + classes + '"' +
  1445. (style === '' ? '' : ' style="' + style + '"') + restAttr + '>';
  1446. },
  1447. addXmlData = function (xml, rcnt, more, adjust) {
  1448. var startReq = new Date(),
  1449. locdata = (ts.p.datatype !== "local" && ts.p.loadonce) || ts.p.datatype === "xmlstring",
  1450. xmlid = "_id_", xmlRd = ts.p.xmlReader,
  1451. frd = ts.p.datatype === "local" ? "local" : "xml";
  1452. if(locdata) {
  1453. ts.p.data = [];
  1454. ts.p._index = {};
  1455. ts.p.localReader.id = xmlid;
  1456. }
  1457. ts.p.reccount = 0;
  1458. if($.isXMLDoc(xml)) {
  1459. if(ts.p.treeANode===-1 && !ts.p.scroll) {
  1460. emptyRows.call(ts, false, true);
  1461. rcnt=1;
  1462. } else { rcnt = rcnt > 1 ? rcnt :1; }
  1463. } else { return; }
  1464. var self= $(ts), i,fpos,ir=0,v,gi=ts.p.multiselect===true?1:0,si=0,addSubGridCell,ni=ts.p.rownumbers===true?1:0,idn, getId,f=[],F,rd ={}, xmlr,rid, rowData=[], cn=(ts.p.altRows === true) ? ts.p.altclass:"",cn1;
  1465. if(ts.p.subGrid===true) {
  1466. si = 1;
  1467. addSubGridCell = $.jgrid.getMethod("addSubGridCell");
  1468. }
  1469. if(!xmlRd.repeatitems) {f = reader(frd);}
  1470. if( ts.p.keyName===false) {
  1471. idn = $.isFunction( xmlRd.id ) ? xmlRd.id.call(ts, xml) : xmlRd.id;
  1472. } else {
  1473. idn = ts.p.keyName;
  1474. }
  1475. if( String(idn).indexOf("[") === -1 ) {
  1476. if (f.length) {
  1477. getId = function( trow, k) {return $(idn,trow).text() || k;};
  1478. } else {
  1479. getId = function( trow, k) {return $(xmlRd.cell,trow).eq(idn).text() || k;};
  1480. }
  1481. }
  1482. else {
  1483. getId = function( trow, k) {return trow.getAttribute(idn.replace(/[\[\]]/g,"")) || k;};
  1484. }
  1485. ts.p.userData = {};
  1486. ts.p.page = intNum($.jgrid.getXmlData(xml, xmlRd.page), ts.p.page);
  1487. ts.p.lastpage = intNum($.jgrid.getXmlData(xml, xmlRd.total), 1);
  1488. ts.p.records = intNum($.jgrid.getXmlData(xml, xmlRd.records));
  1489. if($.isFunction(xmlRd.userdata)) {
  1490. ts.p.userData = xmlRd.userdata.call(ts, xml) || {};
  1491. } else {
  1492. $.jgrid.getXmlData(xml, xmlRd.userdata, true).each(function() {ts.p.userData[this.getAttribute("name")]= $(this).text();});
  1493. }
  1494. var gxml = $.jgrid.getXmlData( xml, xmlRd.root, true);
  1495. gxml = $.jgrid.getXmlData( gxml, xmlRd.row, true);
  1496. if (!gxml) { gxml = []; }
  1497. var gl = gxml.length, j=0, grpdata=[], rn = parseInt(ts.p.rowNum,10), br=ts.p.scroll?$.jgrid.randId():1, altr;
  1498. if (gl > 0 && ts.p.page <= 0) { ts.p.page = 1; }
  1499. if(gxml && gl){
  1500. if (adjust) { rn *= adjust+1; }
  1501. var afterInsRow = $.isFunction(ts.p.afterInsertRow), hiderow=false, groupingPrepare;
  1502. if(ts.p.grouping) {
  1503. hiderow = ts.p.groupingView.groupCollapse === true;
  1504. groupingPrepare = $.jgrid.getMethod("groupingPrepare");
  1505. }
  1506. while (j<gl) {
  1507. xmlr = gxml[j];
  1508. rid = getId(xmlr,br+j);
  1509. rid = ts.p.idPrefix + rid;
  1510. altr = rcnt === 0 ? 0 : rcnt+1;
  1511. cn1 = (altr+j)%2 === 1 ? cn : '';
  1512. var iStartTrTag = rowData.length;
  1513. rowData.push("");
  1514. if( ni ) {
  1515. rowData.push( addRowNum(0,j,ts.p.page,ts.p.rowNum) );
  1516. }
  1517. if( gi ) {
  1518. rowData.push( addMulti(rid,ni,j, false) );
  1519. }
  1520. if( si ) {
  1521. rowData.push( addSubGridCell.call(self, gi+ni, j+rcnt) );
  1522. }
  1523. if(xmlRd.repeatitems){
  1524. if (!F) { F=orderedCols(gi+si+ni); }
  1525. var cells = $.jgrid.getXmlData( xmlr, xmlRd.cell, true);
  1526. $.each(F, function (k) {
  1527. var cell = cells[this];
  1528. if (!cell) { return false; }
  1529. v = cell.textContent || cell.text;
  1530. rd[ts.p.colModel[k+gi+si+ni].name] = v;
  1531. rowData.push( addCell(rid,v,k+gi+si+ni,j+rcnt,xmlr, rd) );
  1532. });
  1533. } else {
  1534. for(i = 0; i < f.length;i++) {
  1535. v = $.jgrid.getXmlData( xmlr, f[i]);
  1536. rd[ts.p.colModel[i+gi+si+ni].name] = v;
  1537. rowData.push( addCell(rid, v, i+gi+si+ni, j+rcnt, xmlr, rd) );
  1538. }
  1539. }
  1540. rowData[iStartTrTag] = constructTr(rid, hiderow, cn1, rd, xmlr, false);
  1541. rowData.push("</tr>");
  1542. if(ts.p.grouping) {
  1543. grpdata.push( rowData );
  1544. if(!ts.p.groupingView._locgr) {
  1545. groupingPrepare.call(self , rd, j );
  1546. }
  1547. rowData = [];
  1548. }
  1549. if(locdata || (ts.p.treeGrid === true && !(ts.p._ald)) ) {
  1550. rd[xmlid] = $.jgrid.stripPref(ts.p.idPrefix, rid);
  1551. ts.p.data.push(rd);
  1552. ts.p._index[rd[xmlid]] = ts.p.data.length-1;
  1553. }
  1554. if(ts.p.gridview === false ) {
  1555. $("tbody:first", ts.grid.bDiv).append(rowData.join(''));
  1556. self.triggerHandler("jqGridAfterInsertRow", [rid, rd, xmlr]);
  1557. if(afterInsRow) {ts.p.afterInsertRow.call(ts,rid,rd,xmlr);}
  1558. rowData=[];
  1559. }
  1560. rd={};
  1561. ir++;
  1562. j++;
  1563. if(ir===rn) {break;}
  1564. }
  1565. }
  1566. if(ts.p.gridview === true) {
  1567. fpos = ts.p.treeANode > -1 ? ts.p.treeANode: 0;
  1568. if(ts.p.grouping) {
  1569. if(!locdata) {
  1570. self.jqGrid('groupingRender',grpdata,ts.p.colModel.length, ts.p.page, rn);
  1571. grpdata = null;
  1572. }
  1573. } else if(ts.p.treeGrid === true && fpos > 0) {
  1574. $(ts.rows[fpos]).after(rowData.join(''));
  1575. } else {
  1576. //$("tbody:first",t).append(rowData.join(''));
  1577. if (ts.firstElementChild) {
  1578. ts.firstElementChild.innerHTML += rowData.join(''); // append to innerHTML of tbody which contains the first row (.jqgfirstrow)
  1579. } else {
  1580. $("#"+$.jgrid.jqID(ts.p.id)+" tbody:first").append(rowData.join(''));
  1581. }
  1582. ts.grid.cols = ts.rows[0].cells; // update cached first row
  1583. }
  1584. }
  1585. if(ts.p.subGrid === true ) {
  1586. try {self.jqGrid("addSubGrid",gi+ni);} catch (_){}
  1587. }
  1588. ts.p.totaltime = new Date() - startReq;
  1589. if(ir>0) { if(ts.p.records===0) { ts.p.records=gl;} }
  1590. rowData =null;
  1591. if( ts.p.treeGrid === true) {
  1592. try {self.jqGrid("setTreeNode", fpos+1, ir+fpos+1);} catch (e) {}
  1593. }
  1594. //if(!ts.p.treeGrid && !ts.p.scroll) {ts.grid.bDiv.scrollTop = 0;}
  1595. ts.p.reccount=ir;
  1596. ts.p.treeANode = -1;
  1597. if(ts.p.userDataOnFooter) { self.jqGrid("footerData","set",ts.p.userData,true); }
  1598. if(locdata) {
  1599. ts.p.records = gl;
  1600. ts.p.lastpage = Math.ceil(gl/ rn);
  1601. }
  1602. if (!more) { ts.updatepager(false,true); }
  1603. if(locdata) {
  1604. while (ir<gl) {
  1605. xmlr = gxml[ir];
  1606. rid = getId(xmlr,ir+br);
  1607. rid = ts.p.idPrefix + rid;
  1608. if(xmlRd.repeatitems){
  1609. if (!F) { F=orderedCols(gi+si+ni); }
  1610. var cells2 = $.jgrid.getXmlData( xmlr, xmlRd.cell, true);
  1611. $.each(F, function (k) {
  1612. var cell = cells2[this];
  1613. if (!cell) { return false; }
  1614. v = cell.textContent || cell.text;
  1615. rd[ts.p.colModel[k+gi+si+ni].name] = v;
  1616. });
  1617. } else {
  1618. for(i = 0; i < f.length;i++) {
  1619. v = $.jgrid.getXmlData( xmlr, f[i]);
  1620. rd[ts.p.colModel[i+gi+si+ni].name] = v;
  1621. }
  1622. }
  1623. rd[xmlid] = $.jgrid.stripPref(ts.p.idPrefix, rid);
  1624. if( ts.p.grouping ) {
  1625. groupingPrepare.call(self, rd, ir );
  1626. }
  1627. ts.p.data.push(rd);
  1628. ts.p._index[rd[xmlid]] = ts.p.data.length-1;
  1629. rd = {};
  1630. ir++;
  1631. }
  1632. if(ts.p.grouping) {
  1633. ts.p.groupingView._locgr = true;
  1634. self.jqGrid('groupingRender', grpdata, ts.p.colModel.length, ts.p.page, rn);
  1635. grpdata = null;
  1636. }
  1637. }
  1638. },
  1639. addJSONData = function(data, rcnt, more, adjust) {
  1640. var startReq = new Date();
  1641. if(data) {
  1642. if(ts.p.treeANode === -1 && !ts.p.scroll) {
  1643. emptyRows.call(ts, false, true);
  1644. rcnt=1;
  1645. } else { rcnt = rcnt > 1 ? rcnt :1; }
  1646. } else { return; }
  1647. var dReader, locid = "_id_", frd,
  1648. locdata = (ts.p.datatype !== "local" && ts.p.loadonce) || ts.p.datatype === "jsonstring";
  1649. if(locdata) { ts.p.data = []; ts.p._index = {}; ts.p.localReader.id = locid;}
  1650. ts.p.reccount = 0;
  1651. if(ts.p.datatype === "local") {
  1652. dReader = ts.p.localReader;
  1653. frd= 'local';
  1654. } else {
  1655. dReader = ts.p.jsonReader;
  1656. frd='json';
  1657. }
  1658. var self = $(ts), ir=0,v,i,j,f=[],cur,gi=ts.p.multiselect?1:0,si=ts.p.subGrid===true?1:0,addSubGridCell,ni=ts.p.rownumbers===true?1:0,arrayReader=orderedCols(gi+si+ni),objectReader=reader(frd),rowReader,len,drows,idn,rd={}, fpos, idr,rowData=[],cn=(ts.p.altRows === true) ? ts.p.altclass:"",cn1;
  1659. ts.p.page = intNum($.jgrid.getAccessor(data,dReader.page), ts.p.page);
  1660. ts.p.lastpage = intNum($.jgrid.getAccessor(data,dReader.total), 1);
  1661. ts.p.records = intNum($.jgrid.getAccessor(data,dReader.records));
  1662. ts.p.userData = $.jgrid.getAccessor(data,dReader.userdata) || {};
  1663. if(si) {
  1664. addSubGridCell = $.jgrid.getMethod("addSubGridCell");
  1665. }
  1666. if( ts.p.keyName===false ) {
  1667. idn = $.isFunction(dReader.id) ? dReader.id.call(ts, data) : dReader.id;
  1668. } else {
  1669. idn = ts.p.keyName;
  1670. }
  1671. drows = $.jgrid.getAccessor(data,dReader.root);
  1672. if (drows == null && $.isArray(data)) { drows = data; }
  1673. if (!drows) { drows = []; }
  1674. len = drows.length; i=0;
  1675. if (len > 0 && ts.p.page <= 0) { ts.p.page = 1; }
  1676. var rn = parseInt(ts.p.rowNum,10),br=ts.p.scroll?$.jgrid.randId():1, altr, selected=false, selr;
  1677. if (adjust) { rn *= adjust+1; }
  1678. if(ts.p.datatype === "local" && !ts.p.deselectAfterSort) {
  1679. selected = true;
  1680. }
  1681. var afterInsRow = $.isFunction(ts.p.afterInsertRow), grpdata=[],hiderow=false, groupingPrepare;
  1682. if(ts.p.grouping) {
  1683. hiderow = ts.p.groupingView.groupCollapse === true;
  1684. groupingPrepare = $.jgrid.getMethod("groupingPrepare");
  1685. }
  1686. while (i<len) {
  1687. cur = drows[i];
  1688. idr = $.jgrid.getAccessor(cur,idn);
  1689. if(idr === undefined) {
  1690. if (typeof idn === "number" && ts.p.colModel[idn+gi+si+ni] != null) {
  1691. // reread id by name
  1692. idr = $.jgrid.getAccessor(cur,ts.p.colModel[idn+gi+si+ni].name);
  1693. }
  1694. if(idr === undefined) {
  1695. idr = br+i;
  1696. if(f.length===0){
  1697. if(dReader.cell){
  1698. var ccur = $.jgrid.getAccessor(cur,dReader.cell) || cur;
  1699. idr = ccur != null && ccur[idn] !== undefined ? ccur[idn] : idr;
  1700. ccur=null;
  1701. }
  1702. }
  1703. }
  1704. }
  1705. idr = ts.p.idPrefix + idr;
  1706. altr = rcnt === 1 ? 0 : rcnt;
  1707. cn1 = (altr+i)%2 === 1 ? cn : '';
  1708. if( selected) {
  1709. if( ts.p.multiselect) {
  1710. selr = ($.inArray(idr, ts.p.selarrrow) !== -1);
  1711. } else {
  1712. selr = (idr === ts.p.selrow);
  1713. }
  1714. }
  1715. var iStartTrTag = rowData.length;
  1716. rowData.push("");
  1717. if( ni ) {
  1718. rowData.push( addRowNum(0,i,ts.p.page,ts.p.rowNum) );
  1719. }
  1720. if( gi ){
  1721. rowData.push( addMulti(idr,ni,i,selr) );
  1722. }
  1723. if( si ) {
  1724. rowData.push( addSubGridCell.call(self ,gi+ni,i+rcnt) );
  1725. }
  1726. rowReader=objectReader;
  1727. if (dReader.repeatitems) {
  1728. if(dReader.cell) {cur = $.jgrid.getAccessor(cur,dReader.cell) || cur;}
  1729. if ($.isArray(cur)) { rowReader=arrayReader; }
  1730. }
  1731. for (j=0;j<rowReader.length;j++) {
  1732. v = $.jgrid.getAccessor(cur,rowReader[j]);
  1733. rd[ts.p.colModel[j+gi+si+ni].name] = v;
  1734. rowData.push( addCell(idr,v,j+gi+si+ni,i+rcnt,cur, rd) );
  1735. }
  1736. rowData[iStartTrTag] = constructTr(idr, hiderow, cn1, rd, cur, selr);
  1737. rowData.push( "</tr>" );
  1738. if(ts.p.grouping) {
  1739. grpdata.push( rowData );
  1740. if(!ts.p.groupingView._locgr) {
  1741. groupingPrepare.call(self , rd, i);
  1742. }
  1743. rowData = [];
  1744. }
  1745. if(locdata || (ts.p.treeGrid===true && !(ts.p._ald))) {
  1746. rd[locid] = $.jgrid.stripPref(ts.p.idPrefix, idr);
  1747. ts.p.data.push(rd);
  1748. ts.p._index[rd[locid]] = ts.p.data.length-1;
  1749. }
  1750. if(ts.p.gridview === false ) {
  1751. $("#"+$.jgrid.jqID(ts.p.id)+" tbody:first").append(rowData.join(''));
  1752. self.triggerHandler("jqGridAfterInsertRow", [idr, rd, cur]);
  1753. if(afterInsRow) {ts.p.afterInsertRow.call(ts,idr,rd,cur);}
  1754. rowData=[];//ari=0;
  1755. }
  1756. rd={};
  1757. ir++;
  1758. i++;
  1759. if(ir===rn) { break; }
  1760. }
  1761. if(ts.p.gridview === true ) {
  1762. fpos = ts.p.treeANode > -1 ? ts.p.treeANode: 0;
  1763. if(ts.p.grouping) {
  1764. if(!locdata) {
  1765. self.jqGrid('groupingRender', grpdata, ts.p.colModel.length, ts.p.page, rn);
  1766. grpdata = null;
  1767. }
  1768. } else if(ts.p.treeGrid === true && fpos > 0) {
  1769. $(ts.rows[fpos]).after(rowData.join(''));
  1770. } else {
  1771. if (ts.firstElementChild) {
  1772. ts.firstElementChild.innerHTML += rowData.join(''); // append to innerHTML of tbody which contains the first row (.jqgfirstrow)
  1773. } else {
  1774. $("#"+$.jgrid.jqID(ts.p.id)+" tbody:first").append(rowData.join(''));
  1775. }
  1776. ts.grid.cols = ts.rows[0].cells;
  1777. }
  1778. }
  1779. if(ts.p.subGrid === true ) {
  1780. try { self.jqGrid("addSubGrid",gi+ni);} catch (_){}
  1781. }
  1782. ts.p.totaltime = new Date() - startReq;
  1783. if(ir>0) {
  1784. if(ts.p.records===0) { ts.p.records=len; }
  1785. }
  1786. rowData = null;
  1787. if( ts.p.treeGrid === true) {
  1788. try {self.jqGrid("setTreeNode", fpos+1, ir+fpos+1);} catch (e) {}
  1789. }
  1790. //if(!ts.p.treeGrid && !ts.p.scroll) {ts.grid.bDiv.scrollTop = 0;}
  1791. ts.p.reccount=ir;
  1792. ts.p.treeANode = -1;
  1793. if(ts.p.userDataOnFooter) { self.jqGrid("footerData","set",ts.p.userData,true); }
  1794. if(locdata) {
  1795. ts.p.records = len;
  1796. ts.p.lastpage = Math.ceil(len/ rn);
  1797. }
  1798. if (!more) { ts.updatepager(false,true); }
  1799. if(locdata) {
  1800. while (ir<len && drows[ir]) {
  1801. cur = drows[ir];
  1802. idr = $.jgrid.getAccessor(cur,idn);
  1803. if(idr === undefined) {
  1804. if (typeof idn === "number" && ts.p.colModel[idn+gi+si+ni] != null) {
  1805. // reread id by name
  1806. idr = $.jgrid.getAccessor(cur,ts.p.colModel[idn+gi+si+ni].name);
  1807. }
  1808. if(idr === undefined) {
  1809. idr = br+ir;
  1810. if(f.length===0){
  1811. if(dReader.cell){
  1812. var ccur2 = $.jgrid.getAccessor(cur,dReader.cell) || cur;
  1813. idr = ccur2 != null && ccur2[idn] !== undefined ? ccur2[idn] : idr;
  1814. ccur2=null;
  1815. }
  1816. }
  1817. }
  1818. }
  1819. if(cur) {
  1820. idr = ts.p.idPrefix + idr;
  1821. rowReader=objectReader;
  1822. if (dReader.repeatitems) {
  1823. if(dReader.cell) {cur = $.jgrid.getAccessor(cur,dReader.cell) || cur;}
  1824. if ($.isArray(cur)) { rowReader=arrayReader; }
  1825. }
  1826. for (j=0;j<rowReader.length;j++) {
  1827. rd[ts.p.colModel[j+gi+si+ni].name] = $.jgrid.getAccessor(cur,rowReader[j]);
  1828. }
  1829. rd[locid] = $.jgrid.stripPref(ts.p.idPrefix, idr);
  1830. if(ts.p.grouping) {
  1831. groupingPrepare.call(self, rd, ir );
  1832. }
  1833. ts.p.data.push(rd);
  1834. ts.p._index[rd[locid]] = ts.p.data.length-1;
  1835. rd = {};
  1836. }
  1837. ir++;
  1838. }
  1839. if(ts.p.grouping) {
  1840. ts.p.groupingView._locgr = true;
  1841. self.jqGrid('groupingRender', grpdata, ts.p.colModel.length, ts.p.page, rn);
  1842. grpdata = null;
  1843. }
  1844. }
  1845. },
  1846. addLocalData = function() {
  1847. var st = ts.p.multiSort ? [] : "", sto=[], fndsort=false, cmtypes={}, grtypes=[], grindexes=[], srcformat, sorttype, newformat, sfld;
  1848. if(!$.isArray(ts.p.data)) {
  1849. return;
  1850. }
  1851. var grpview = ts.p.grouping ? ts.p.groupingView : false, lengrp, gin;
  1852. $.each(ts.p.colModel,function(){
  1853. sorttype = this.sorttype || "text";
  1854. if(sorttype === "date" || sorttype === "datetime") {
  1855. if(this.formatter && typeof this.formatter === 'string' && this.formatter === 'date') {
  1856. if(this.formatoptions && this.formatoptions.srcformat) {
  1857. srcformat = this.formatoptions.srcformat;
  1858. } else {
  1859. srcformat = $.jgrid.getRegional(ts, "formatter.date.srcformat");
  1860. }
  1861. if(this.formatoptions && this.formatoptions.newformat) {
  1862. newformat = this.formatoptions.newformat;
  1863. } else {
  1864. newformat = $.jgrid.getRegional(ts, "formatter.date.newformat");
  1865. }
  1866. } else {
  1867. srcformat = newformat = this.datefmt || "Y-m-d";
  1868. }
  1869. cmtypes[this.name] = {"stype": sorttype, "srcfmt": srcformat,"newfmt":newformat, "sfunc": this.sortfunc || null};
  1870. } else {
  1871. cmtypes[this.name] = {"stype": sorttype, "srcfmt":'',"newfmt":'', "sfunc": this.sortfunc || null};
  1872. }
  1873. if(ts.p.grouping ) {
  1874. for(gin =0, lengrp = grpview.groupField.length; gin< lengrp; gin++) {
  1875. if( this.name === grpview.groupField[gin]) {
  1876. var grindex = this.name;
  1877. if (this.index) {
  1878. grindex = this.index;
  1879. }
  1880. grtypes[gin] = cmtypes[grindex];
  1881. grindexes[gin]= grindex;
  1882. }
  1883. }
  1884. }
  1885. if(ts.p.multiSort) {
  1886. if(this.lso) {
  1887. st.push(this.name);
  1888. var tmplso= this.lso.split("-");
  1889. sto.push( tmplso[tmplso.length-1] );
  1890. }
  1891. } else {
  1892. if(!fndsort && (this.index === ts.p.sortname || this.name === ts.p.sortname)){
  1893. st = this.name; // ???
  1894. fndsort = true;
  1895. }
  1896. }
  1897. });
  1898. if(ts.p.treeGrid && ts.p._sort) {
  1899. $(ts).jqGrid("SortTree", st, ts.p.sortorder, cmtypes[st].stype || 'text', cmtypes[st].srcfmt || '');
  1900. return;
  1901. }
  1902. var compareFnMap = {
  1903. 'eq':function(queryObj) {return queryObj.equals;},
  1904. 'ne':function(queryObj) {return queryObj.notEquals;},
  1905. 'lt':function(queryObj) {return queryObj.less;},
  1906. 'le':function(queryObj) {return queryObj.lessOrEquals;},
  1907. 'gt':function(queryObj) {return queryObj.greater;},
  1908. 'ge':function(queryObj) {return queryObj.greaterOrEquals;},
  1909. 'cn':function(queryObj) {return queryObj.contains;},
  1910. 'nc':function(queryObj,op) {return op === "OR" ? queryObj.orNot().contains : queryObj.andNot().contains;},
  1911. 'bw':function(queryObj) {return queryObj.startsWith;},
  1912. 'bn':function(queryObj,op) {return op === "OR" ? queryObj.orNot().startsWith : queryObj.andNot().startsWith;},
  1913. 'en':function(queryObj,op) {return op === "OR" ? queryObj.orNot().endsWith : queryObj.andNot().endsWith;},
  1914. 'ew':function(queryObj) {return queryObj.endsWith;},
  1915. 'ni':function(queryObj,op) {return op === "OR" ? queryObj.orNot().equals : queryObj.andNot().equals;},
  1916. 'in':function(queryObj) {return queryObj.equals;},
  1917. 'nu':function(queryObj) {return queryObj.isNull;},
  1918. 'nn':function(queryObj,op) {return op === "OR" ? queryObj.orNot().isNull : queryObj.andNot().isNull;}
  1919. },
  1920. query = $.jgrid.from.call(ts, ts.p.data);
  1921. if (ts.p.ignoreCase) { query = query.ignoreCase(); }
  1922. function tojLinq ( group ) {
  1923. var s = 0, index, gor, ror, opr, rule, fld;
  1924. if (group.groups != null) {
  1925. gor = group.groups.length && group.groupOp.toString().toUpperCase() === "OR";
  1926. if (gor) {
  1927. query.orBegin();
  1928. }
  1929. for (index = 0; index < group.groups.length; index++) {
  1930. if (s > 0 && gor) {
  1931. query.or();
  1932. }
  1933. try {
  1934. tojLinq(group.groups[index]);
  1935. } catch (e) {alert(e);}
  1936. s++;
  1937. }
  1938. if (gor) {
  1939. query.orEnd();
  1940. }
  1941. }
  1942. if (group.rules != null) {
  1943. //if(s>0) {
  1944. // var result = query.select();
  1945. // query = $.jgrid.from( result);
  1946. // if (ts.p.ignoreCase) { query = query.ignoreCase(); }
  1947. //}
  1948. try{
  1949. ror = group.rules.length && group.groupOp.toString().toUpperCase() === "OR";
  1950. if (ror) {
  1951. query.orBegin();
  1952. }
  1953. for (index = 0; index < group.rules.length; index++) {
  1954. rule = group.rules[index];
  1955. opr = group.groupOp.toString().toUpperCase();
  1956. if (compareFnMap[rule.op] && rule.field ) {
  1957. if(s > 0 && opr && opr === "OR") {
  1958. query = query.or();
  1959. }
  1960. fld = cmtypes[rule.field];
  1961. if(fld.stype === 'date') {
  1962. if(fld.srcfmt && fld.newfmt && fld.srcfmt !== fld.newfmt ) {
  1963. rule.data = $.jgrid.parseDate.call(ts, fld.newfmt, rule.data, fld.srcfmt);
  1964. }
  1965. }
  1966. query = compareFnMap[rule.op](query, opr)(rule.field, rule.data, cmtypes[rule.field]);
  1967. }
  1968. s++;
  1969. }
  1970. if (ror) {
  1971. query.orEnd();
  1972. }
  1973. } catch (g) {alert(g);}
  1974. }
  1975. }
  1976. if (ts.p.search === true) {
  1977. var srules = ts.p.postData.filters;
  1978. if(srules) {
  1979. if(typeof srules === "string") { srules = $.jgrid.parse(srules);}
  1980. tojLinq( srules );
  1981. } else {
  1982. try {
  1983. sfld = cmtypes[ts.p.postData.searchField];
  1984. if(sfld.stype === 'date') {
  1985. if(sfld.srcfmt && sfld.newfmt && sfld.srcfmt !== sfld.newfmt ) {
  1986. ts.p.postData.searchString = $.jgrid.parseDate.call(ts, sfld.newfmt, ts.p.postData.searchString, sfld.srcfmt);
  1987. }
  1988. }
  1989. query = compareFnMap[ts.p.postData.searchOper](query)(ts.p.postData.searchField, ts.p.postData.searchString,cmtypes[ts.p.postData.searchField]);
  1990. } catch (se){}
  1991. }
  1992. } else {
  1993. if(ts.p.treeGrid && ts.p.treeGridModel === "nested") {
  1994. query.orderBy(ts.p.treeReader.left_field, 'asc', 'integer', '', null);
  1995. }
  1996. }
  1997. if(ts.p.treeGrid && ts.p.treeGridModel === "adjacency") {
  1998. lengrp =0;
  1999. st = null;
  2000. }
  2001. if(ts.p.grouping) {
  2002. for(gin=0; gin<lengrp;gin++) {
  2003. query.orderBy(grindexes[gin],grpview.groupOrder[gin],grtypes[gin].stype, grtypes[gin].srcfmt);
  2004. }
  2005. }
  2006. if(ts.p.multiSort) {
  2007. $.each(st,function(i){
  2008. query.orderBy(this, sto[i], cmtypes[this].stype, cmtypes[this].srcfmt, cmtypes[this].sfunc);
  2009. });
  2010. } else {
  2011. if (st && ts.p.sortorder && fndsort) {
  2012. if(ts.p.sortorder.toUpperCase() === "DESC") {
  2013. query.orderBy(ts.p.sortname, "d", cmtypes[st].stype, cmtypes[st].srcfmt, cmtypes[st].sfunc);
  2014. } else {
  2015. query.orderBy(ts.p.sortname, "a", cmtypes[st].stype, cmtypes[st].srcfmt, cmtypes[st].sfunc);
  2016. }
  2017. }
  2018. }
  2019. var queryResults = query.select(),
  2020. recordsperpage = parseInt(ts.p.rowNum,10),
  2021. total = queryResults.length,
  2022. page = parseInt(ts.p.page,10),
  2023. totalpages = Math.ceil(total / recordsperpage),
  2024. retresult = {};
  2025. if((ts.p.search || ts.p.resetsearch) && ts.p.grouping && ts.p.groupingView._locgr) {
  2026. ts.p.groupingView.groups =[];
  2027. var j, grPrepare = $.jgrid.getMethod("groupingPrepare"), key, udc;
  2028. if(ts.p.footerrow && ts.p.userDataOnFooter) {
  2029. for (key in ts.p.userData) {
  2030. if(ts.p.userData.hasOwnProperty(key)) {
  2031. ts.p.userData[key] = 0;
  2032. }
  2033. }
  2034. udc = true;
  2035. }
  2036. for(j=0; j<total; j++) {
  2037. if(udc) {
  2038. for(key in ts.p.userData){
  2039. if( ts.p.userData.hasOwnProperty( key ) ) {
  2040. ts.p.userData[key] += parseFloat(queryResults[j][key] || 0);
  2041. }
  2042. }
  2043. }
  2044. grPrepare.call($(ts),queryResults[j],j, recordsperpage );
  2045. }
  2046. }
  2047. if(ts.p.treeGrid && ts.p.search) {
  2048. queryResults = $(ts).jqGrid("searchTree", queryResults);
  2049. } else {
  2050. queryResults = queryResults.slice( (page-1)*recordsperpage , page*recordsperpage );
  2051. }
  2052. query = null;
  2053. cmtypes = null;
  2054. retresult[ts.p.localReader.total] = totalpages;
  2055. retresult[ts.p.localReader.page] = page;
  2056. retresult[ts.p.localReader.records] = total;
  2057. retresult[ts.p.localReader.root] = queryResults;
  2058. retresult[ts.p.localReader.userdata] = ts.p.userData;
  2059. queryResults = null;
  2060. return retresult;
  2061. },
  2062. updatepager = function(rn, dnd) {
  2063. var cp, last, base, from,to,tot,fmt, pgboxes = "", sppg,
  2064. pgid = ts.p.pager ? $.jgrid.jqID(ts.p.pager.substr(1)) : "",
  2065. tspg = pgid ? "_"+pgid : "",
  2066. tspg_t = ts.p.toppager ? "_"+ts.p.toppager.substr(1) : "";
  2067. base = parseInt(ts.p.page,10)-1;
  2068. if(base < 0) { base = 0; }
  2069. base = base*parseInt(ts.p.rowNum,10);
  2070. to = base + ts.p.reccount;
  2071. if (ts.p.scroll) {
  2072. var rows = $("tbody:first > tr:gt(0)", ts.grid.bDiv);
  2073. base = to - rows.length;
  2074. ts.p.reccount = rows.length;
  2075. var rh = rows.outerHeight() || ts.grid.prevRowHeight;
  2076. if (rh) {
  2077. var top = base * rh;
  2078. var height = parseInt(ts.p.records,10) * rh;
  2079. $(">div:first",ts.grid.bDiv).css({height : height}).children("div:first").css({height:top,display:top?"":"none"});
  2080. if (ts.grid.bDiv.scrollTop === 0 && ts.p.page > 1) {
  2081. ts.grid.bDiv.scrollTop = ts.p.rowNum * (ts.p.page - 1) * rh;
  2082. }
  2083. }
  2084. ts.grid.bDiv.scrollLeft = ts.grid.hDiv.scrollLeft;
  2085. }
  2086. pgboxes = ts.p.pager || "";
  2087. pgboxes += ts.p.toppager ? (pgboxes ? "," + ts.p.toppager : ts.p.toppager) : "";
  2088. if(pgboxes) {
  2089. fmt = $.jgrid.getRegional(ts, "formatter.integer");
  2090. cp = intNum(ts.p.page);
  2091. last = intNum(ts.p.lastpage);
  2092. $(".selbox",pgboxes)[ this.p.useProp ? 'prop' : 'attr' ]("disabled",false);
  2093. if(ts.p.pginput===true) {
  2094. $("#input"+tspg).html($.jgrid.template($.jgrid.getRegional(ts, "defaults.pgtext", ts.p.pgtext) || "","<input class='ui-pg-input ui-corner-all' type='text' size='2' maxlength='7' value='0' role='textbox'/>","<span id='sp_1_"+$.jgrid.jqID(pgid)+"'></span>"));
  2095. if(ts.p.toppager) {
  2096. $("#input_t"+tspg_t).html($.jgrid.template($.jgrid.getRegional(ts, "defaults.pgtext", ts.p.pgtext) || "","<input class='ui-pg-input' type='text' size='2' maxlength='7' value='0' role='textbox'/>","<span id='sp_1_"+$.jgrid.jqID(pgid)+"_toppager'></span>"));
  2097. }
  2098. $('.ui-pg-input',pgboxes).val(ts.p.page);
  2099. sppg = ts.p.toppager ? '#sp_1'+tspg+",#sp_1"+tspg_t : '#sp_1'+tspg;
  2100. $(sppg).html($.fmatter ? $.fmatter.util.NumberFormat(ts.p.lastpage,fmt):ts.p.lastpage);
  2101. }
  2102. if (ts.p.viewrecords){
  2103. if(ts.p.reccount === 0) {
  2104. $(".ui-paging-info",pgboxes).html($.jgrid.getRegional(ts, "defaults.emptyrecords", ts.p.emptyrecords ));
  2105. } else {
  2106. from = base+1;
  2107. tot=ts.p.records;
  2108. if($.fmatter) {
  2109. from = $.fmatter.util.NumberFormat(from,fmt);
  2110. to = $.fmatter.util.NumberFormat(to,fmt);
  2111. tot = $.fmatter.util.NumberFormat(tot,fmt);
  2112. }
  2113. var rt = $.jgrid.getRegional(ts, "defaults.recordtext", ts.p.recordtext);
  2114. $(".ui-paging-info",pgboxes).html($.jgrid.template( rt ,from,to,tot));
  2115. }
  2116. }
  2117. if(ts.p.pgbuttons===true) {
  2118. if(cp<=0) {cp = last = 0;}
  2119. if(cp===1 || cp === 0) {
  2120. $("#first"+tspg+", #prev"+tspg).addClass('ui-state-disabled').removeClass('ui-state-hover');
  2121. if(ts.p.toppager) { $("#first_t"+tspg_t+", #prev_t"+tspg_t).addClass('ui-state-disabled').removeClass('ui-state-hover'); }
  2122. } else {
  2123. $("#first"+tspg+", #prev"+tspg).removeClass('ui-state-disabled');
  2124. if(ts.p.toppager) { $("#first_t"+tspg_t+", #prev_t"+tspg_t).removeClass('ui-state-disabled'); }
  2125. }
  2126. if(cp===last || cp === 0) {
  2127. $("#next"+tspg+", #last"+tspg).addClass('ui-state-disabled').removeClass('ui-state-hover');
  2128. if(ts.p.toppager) { $("#next_t"+tspg_t+", #last_t"+tspg_t).addClass('ui-state-disabled').removeClass('ui-state-hover'); }
  2129. } else {
  2130. $("#next"+tspg+", #last"+tspg).removeClass('ui-state-disabled');
  2131. if(ts.p.toppager) { $("#next_t"+tspg_t+", #last_t"+tspg_t).removeClass('ui-state-disabled'); }
  2132. }
  2133. }
  2134. }
  2135. if(rn===true && ts.p.rownumbers === true) {
  2136. $(">td.jqgrid-rownum",ts.rows).each(function(i){
  2137. $(this).html(base+1+i);
  2138. });
  2139. }
  2140. if(dnd && ts.p.jqgdnd) { $(ts).jqGrid('gridDnD','updateDnD');}
  2141. $(ts).triggerHandler("jqGridGridComplete");
  2142. if($.isFunction(ts.p.gridComplete)) {ts.p.gridComplete.call(ts);}
  2143. $(ts).triggerHandler("jqGridAfterGridComplete");
  2144. },
  2145. beginReq = function() {
  2146. ts.grid.hDiv.loading = true;
  2147. if(ts.p.hiddengrid) { return;}
  2148. $(ts).jqGrid("progressBar", {method:"show", loadtype : ts.p.loadui, htmlcontent: $.jgrid.getRegional(ts, "defaults.loadtext", ts.p.loadtext) });
  2149. },
  2150. endReq = function() {
  2151. ts.grid.hDiv.loading = false;
  2152. $(ts).jqGrid("progressBar", {method:"hide", loadtype : ts.p.loadui });
  2153. },
  2154. populate = function (npage) {
  2155. if(!ts.grid.hDiv.loading) {
  2156. var pvis = ts.p.scroll && npage === false,
  2157. prm = {}, dt, dstr, pN=ts.p.prmNames;
  2158. if(ts.p.page <=0) { ts.p.page = Math.min(1,ts.p.lastpage); }
  2159. if(pN.search !== null) {prm[pN.search] = ts.p.search;} if(pN.nd !== null) {prm[pN.nd] = new Date().getTime();}
  2160. if(pN.rows !== null) {prm[pN.rows]= ts.p.rowNum;} if(pN.page !== null) {prm[pN.page]= ts.p.page;}
  2161. if(pN.sort !== null) {prm[pN.sort]= ts.p.sortname;} if(pN.order !== null) {prm[pN.order]= ts.p.sortorder;}
  2162. if(ts.p.rowTotal !== null && pN.totalrows !== null) { prm[pN.totalrows]= ts.p.rowTotal; }
  2163. var lcf = $.isFunction(ts.p.loadComplete), lc = lcf ? ts.p.loadComplete : null;
  2164. var adjust = 0;
  2165. npage = npage || 1;
  2166. if (npage > 1) {
  2167. if(pN.npage !== null) {
  2168. prm[pN.npage] = npage;
  2169. adjust = npage - 1;
  2170. npage = 1;
  2171. } else {
  2172. lc = function(req) {
  2173. ts.p.page++;
  2174. ts.grid.hDiv.loading = false;
  2175. if (lcf) {
  2176. ts.p.loadComplete.call(ts,req);
  2177. }
  2178. populate(npage-1);
  2179. };
  2180. }
  2181. } else if (pN.npage !== null) {
  2182. delete ts.p.postData[pN.npage];
  2183. }
  2184. if(ts.p.grouping) {
  2185. $(ts).jqGrid('groupingSetup');
  2186. var grp = ts.p.groupingView, gi, gs="";
  2187. for(gi=0;gi<grp.groupField.length;gi++) {
  2188. var index = grp.groupField[gi];
  2189. $.each(ts.p.colModel, function(cmIndex, cmValue) {
  2190. if (cmValue.name === index && cmValue.index){
  2191. index = cmValue.index;
  2192. }
  2193. } );
  2194. gs += index +" "+grp.groupOrder[gi]+", ";
  2195. }
  2196. prm[pN.sort] = gs + prm[pN.sort];
  2197. }
  2198. $.extend(ts.p.postData,prm);
  2199. var rcnt = !ts.p.scroll ? 1 : ts.rows.length-1;
  2200. var bfr = $(ts).triggerHandler("jqGridBeforeRequest");
  2201. if (bfr === false || bfr === 'stop') { return; }
  2202. if ($.isFunction(ts.p.datatype)) { ts.p.datatype.call(ts,ts.p.postData,"load_"+ts.p.id, rcnt, npage, adjust); return;}
  2203. if ($.isFunction(ts.p.beforeRequest)) {
  2204. bfr = ts.p.beforeRequest.call(ts);
  2205. if(bfr === undefined) { bfr = true; }
  2206. if ( bfr === false ) { return; }
  2207. }
  2208. dt = ts.p.datatype.toLowerCase();
  2209. switch(dt)
  2210. {
  2211. case "json":
  2212. case "jsonp":
  2213. case "xml":
  2214. case "script":
  2215. $.ajax($.extend({
  2216. url:ts.p.url,
  2217. type:ts.p.mtype,
  2218. dataType: dt ,
  2219. data: $.isFunction(ts.p.serializeGridData)? ts.p.serializeGridData.call(ts,ts.p.postData) : ts.p.postData,
  2220. success:function(data,st, xhr) {
  2221. if ($.isFunction(ts.p.beforeProcessing)) {
  2222. if (ts.p.beforeProcessing.call(ts, data, st, xhr) === false) {
  2223. endReq();
  2224. return;
  2225. }
  2226. }
  2227. if(dt === "xml") { addXmlData(data, rcnt,npage>1,adjust); }
  2228. else { addJSONData(data, rcnt, npage>1, adjust); }
  2229. $(ts).triggerHandler("jqGridLoadComplete", [data]);
  2230. if(lc) { lc.call(ts,data); }
  2231. $(ts).triggerHandler("jqGridAfterLoadComplete", [data]);
  2232. if (pvis) { ts.grid.populateVisible(); }
  2233. if( ts.p.loadonce || ts.p.treeGrid) {ts.p.datatype = "local";}
  2234. data=null;
  2235. if (npage === 1) { endReq(); }
  2236. },
  2237. error:function(xhr,st,err){
  2238. if($.isFunction(ts.p.loadError)) { ts.p.loadError.call(ts,xhr,st,err); }
  2239. if (npage === 1) { endReq(); }
  2240. xhr=null;
  2241. },
  2242. beforeSend: function(xhr, settings ){
  2243. var gotoreq = true;
  2244. if($.isFunction(ts.p.loadBeforeSend)) {
  2245. gotoreq = ts.p.loadBeforeSend.call(ts,xhr, settings);
  2246. }
  2247. if(gotoreq === undefined) { gotoreq = true; }
  2248. if(gotoreq === false) {
  2249. return false;
  2250. }
  2251. beginReq();
  2252. }
  2253. },$.jgrid.ajaxOptions, ts.p.ajaxGridOptions));
  2254. break;
  2255. case "xmlstring":
  2256. beginReq();
  2257. dstr = typeof ts.p.datastr !== 'string' ? ts.p.datastr : $.parseXML(ts.p.datastr);
  2258. addXmlData(dstr);
  2259. $(ts).triggerHandler("jqGridLoadComplete", [dstr]);
  2260. if(lcf) {ts.p.loadComplete.call(ts,dstr);}
  2261. $(ts).triggerHandler("jqGridAfterLoadComplete", [dstr]);
  2262. ts.p.datatype = "local";
  2263. ts.p.datastr = null;
  2264. endReq();
  2265. break;
  2266. case "jsonstring":
  2267. beginReq();
  2268. if(typeof ts.p.datastr === 'string') { dstr = $.jgrid.parse(ts.p.datastr); }
  2269. else { dstr = ts.p.datastr; }
  2270. addJSONData(dstr);
  2271. $(ts).triggerHandler("jqGridLoadComplete", [dstr]);
  2272. if(lcf) {ts.p.loadComplete.call(ts,dstr);}
  2273. $(ts).triggerHandler("jqGridAfterLoadComplete", [dstr]);
  2274. ts.p.datatype = "local";
  2275. ts.p.datastr = null;
  2276. endReq();
  2277. break;
  2278. case "local":
  2279. case "clientside":
  2280. beginReq();
  2281. ts.p.datatype = "local";
  2282. ts.p._ald = true;
  2283. var req = addLocalData();
  2284. addJSONData(req,rcnt,npage>1,adjust);
  2285. $(ts).triggerHandler("jqGridLoadComplete", [req]);
  2286. if(lc) { lc.call(ts,req); }
  2287. $(ts).triggerHandler("jqGridAfterLoadComplete", [req]);
  2288. if (pvis) { ts.grid.populateVisible(); }
  2289. endReq();
  2290. ts.p._ald = false;
  2291. break;
  2292. }
  2293. ts.p._sort = false;
  2294. }
  2295. },
  2296. setHeadCheckBox = function ( checked ) {
  2297. $('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.hDiv)[ts.p.useProp ? 'prop': 'attr']("checked", checked);
  2298. var fid = ts.p.frozenColumns ? ts.p.id+"_frozen" : "";
  2299. if(fid) {
  2300. $('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.fhDiv)[ts.p.useProp ? 'prop': 'attr']("checked", checked);
  2301. }
  2302. },
  2303. setPager = function (pgid, tp){
  2304. // TBD - consider escaping pgid with pgid = $.jgrid.jqID(pgid);
  2305. var sep = "<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='ui-separator'></span></td>",
  2306. pginp = "",
  2307. pgl="<table cellspacing='0' cellpadding='0' border='0' style='table-layout:auto;' class='ui-pg-table'><tbody><tr>",
  2308. str="", pgcnt, lft, cent, rgt, twd, tdw, i,
  2309. clearVals = function(onpaging){
  2310. var ret;
  2311. if ($.isFunction(ts.p.onPaging) ) { ret = ts.p.onPaging.call(ts,onpaging); }
  2312. if(ret==='stop') {return false;}
  2313. ts.p.selrow = null;
  2314. if(ts.p.multiselect) {ts.p.selarrrow =[]; setHeadCheckBox( false );}
  2315. ts.p.savedRow = [];
  2316. return true;
  2317. };
  2318. pgid = pgid.substr(1);
  2319. tp += "_" + pgid;
  2320. pgcnt = "pg_"+pgid;
  2321. lft = pgid+"_left"; cent = pgid+"_center"; rgt = pgid+"_right";
  2322. $("#"+$.jgrid.jqID(pgid) )
  2323. .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;height:100%;'><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>")
  2324. .attr("dir","ltr"); //explicit setting
  2325. if(ts.p.rowList.length >0){
  2326. str = "<td dir=\""+dir+"\">";
  2327. str +="<select class=\"ui-pg-selbox ui-widget-content ui-corner-all\" role=\"listbox\" title=\""+($.jgrid.getRegional(ts,"defaults.pgrecs",ts.p.pgrecs) || "")+ "\">";
  2328. var strnm;
  2329. for(i=0;i<ts.p.rowList.length;i++){
  2330. strnm = ts.p.rowList[i].toString().split(":");
  2331. if(strnm.length === 1) {
  2332. strnm[1] = strnm[0];
  2333. }
  2334. str +="<option role=\"option\" value=\""+strnm[0]+"\""+(( intNum(ts.p.rowNum,0) === intNum(strnm[0],0))?" selected=\"selected\"":"")+">"+strnm[1]+"</option>";
  2335. }
  2336. str +="</select></td>";
  2337. }
  2338. if(dir==="rtl") { pgl += str; }
  2339. if(ts.p.pginput===true) {
  2340. pginp= "<td id='input"+tp+"' dir='"+dir+"'>"+$.jgrid.template( $.jgrid.getRegional(ts, "defaults.pgtext", ts.p.pgtext) || "","<input class='ui-pg-input' type='text' size='2' maxlength='7' value='0' role='textbox'/>","<span id='sp_1_"+$.jgrid.jqID(pgid)+"'></span>")+"</td>";
  2341. }
  2342. if(ts.p.pgbuttons===true) {
  2343. var po=["first"+tp,"prev"+tp, "next"+tp,"last"+tp];
  2344. if(dir==="rtl") { po.reverse(); }
  2345. pgl += "<td id='"+po[0]+"' class='ui-pg-button ui-corner-all' title='"+($.jgrid.getRegional(ts,"defaults.pgfirst",ts.p.pgfirst) || "") +"'" + "><span class='ui-icon ui-icon-seek-first'></span></td>";
  2346. pgl += "<td id='"+po[1]+"' class='ui-pg-button ui-corner-all' title='"+($.jgrid.getRegional(ts,"defaults.pgprev",ts.p.pgprev) || "") +"'" +"><span class='ui-icon ui-icon-seek-prev'></span></td>";
  2347. pgl += pginp !== "" ? sep+pginp+sep:"";
  2348. pgl += "<td id='"+po[2]+"' class='ui-pg-button ui-corner-all' title='"+($.jgrid.getRegional(ts,"defaults.pgnext",ts.p.pgnext) || "") +"'" +"><span class='ui-icon ui-icon-seek-next'></span></td>";
  2349. pgl += "<td id='"+po[3]+"' class='ui-pg-button ui-corner-all' title='"+($.jgrid.getRegional(ts,"defaults.pglast",ts.p.pglast) || "") +"'" +"><span class='ui-icon ui-icon-seek-end'></span></td>";
  2350. } else if (pginp !== "") {
  2351. pgl += pginp;
  2352. }
  2353. if(dir==="ltr") {
  2354. pgl += str;
  2355. }
  2356. pgl += "</tr></tbody></table>";
  2357. if(ts.p.viewrecords===true) {
  2358. $("td#"+pgid+"_"+ts.p.recordpos,"#"+pgcnt).append("<div dir='"+dir+"' style='text-align:"+ts.p.recordpos+"' class='ui-paging-info'></div>");
  2359. }
  2360. $("td#"+pgid+"_"+ts.p.pagerpos,"#"+pgcnt).append(pgl);
  2361. tdw = $(".ui-jqgrid").css("font-size") || "11px";
  2362. $(document.body).append("<div id='testpg' class='ui-jqgrid ui-widget ui-widget-content' style='font-size:"+tdw+";visibility:hidden;' ></div>");
  2363. twd = $(pgl).clone().appendTo("#testpg").width();
  2364. $("#testpg").remove();
  2365. if(twd > 0) {
  2366. if(pginp !== "") { twd += 50; } //should be param
  2367. $("td#"+pgid+"_"+ts.p.pagerpos,"#"+pgcnt).width(twd);
  2368. }
  2369. ts.p._nvtd = [];
  2370. ts.p._nvtd[0] = twd ? Math.floor((ts.p.width - twd)/2) : Math.floor(ts.p.width/3);
  2371. ts.p._nvtd[1] = 0;
  2372. pgl=null;
  2373. $('.ui-pg-selbox',"#"+pgcnt).bind('change',function() {
  2374. if(!clearVals('records')) { return false; }
  2375. ts.p.page = Math.round(ts.p.rowNum*(ts.p.page-1)/this.value-0.5)+1;
  2376. ts.p.rowNum = this.value;
  2377. if(ts.p.pager) { $('.ui-pg-selbox',ts.p.pager).val(this.value); }
  2378. if(ts.p.toppager) { $('.ui-pg-selbox',ts.p.toppager).val(this.value); }
  2379. populate();
  2380. return false;
  2381. });
  2382. if(ts.p.pgbuttons===true) {
  2383. $(".ui-pg-button","#"+pgcnt).hover(function(){
  2384. if($(this).hasClass('ui-state-disabled')) {
  2385. this.style.cursor='default';
  2386. } else {
  2387. $(this).addClass('ui-state-hover');
  2388. this.style.cursor='pointer';
  2389. }
  2390. },function() {
  2391. if(!$(this).hasClass('ui-state-disabled')) {
  2392. $(this).removeClass('ui-state-hover');
  2393. this.style.cursor= "default";
  2394. }
  2395. });
  2396. $("#first"+$.jgrid.jqID(tp)+", #prev"+$.jgrid.jqID(tp)+", #next"+$.jgrid.jqID(tp)+", #last"+$.jgrid.jqID(tp)).click( function() {
  2397. if ($(this).hasClass("ui-state-disabled")) {
  2398. return false;
  2399. }
  2400. var cp = intNum(ts.p.page,1),
  2401. last = intNum(ts.p.lastpage,1), selclick = false,
  2402. fp=true, pp=true, np=true,lp=true;
  2403. if(last ===0 || last===1) {
  2404. fp=false;
  2405. pp=false;
  2406. np=false;
  2407. lp=false;
  2408. } else if( last>1 && cp >=1) {
  2409. if( cp === 1) {
  2410. fp=false;
  2411. pp=false;
  2412. } else if( cp===last){
  2413. np=false;
  2414. lp=false;
  2415. }
  2416. } else if( last>1 && cp===0 ) {
  2417. np=false;
  2418. lp=false;
  2419. cp=last-1;
  2420. }
  2421. if(!clearVals(this.id.split("_")[0])) { return false; }
  2422. if( this.id === 'first'+tp && fp ) { ts.p.page=1; selclick=true;}
  2423. if( this.id === 'prev'+tp && pp) { ts.p.page=(cp-1); selclick=true;}
  2424. if( this.id === 'next'+tp && np) { ts.p.page=(cp+1); selclick=true;}
  2425. if( this.id === 'last'+tp && lp) { ts.p.page=last; selclick=true;}
  2426. if(selclick) {
  2427. populate();
  2428. }
  2429. return false;
  2430. });
  2431. }
  2432. if(ts.p.pginput===true) {
  2433. $("#"+pgcnt).on('keypress','input.ui-pg-input', function(e) {
  2434. var key = e.charCode || e.keyCode || 0;
  2435. if(key === 13) {
  2436. if(!clearVals('user')) { return false; }
  2437. $(this).val( intNum( $(this).val(), 1));
  2438. ts.p.page = ($(this).val()>0) ? $(this).val():ts.p.page;
  2439. populate();
  2440. return false;
  2441. }
  2442. return this;
  2443. });
  2444. }
  2445. },
  2446. multiSort = function(iCol, obj ) {
  2447. var splas, sort="", cm = ts.p.colModel, fs=false, ls,
  2448. selTh = ts.p.frozenColumns ? obj : ts.grid.headers[iCol].el, so="";
  2449. $("span.ui-grid-ico-sort",selTh).addClass('ui-state-disabled');
  2450. $(selTh).attr("aria-selected","false");
  2451. if(cm[iCol].lso) {
  2452. if(cm[iCol].lso==="asc") {
  2453. cm[iCol].lso += "-desc";
  2454. so = "desc";
  2455. } else if(cm[iCol].lso==="desc") {
  2456. cm[iCol].lso += "-asc";
  2457. so = "asc";
  2458. } else if(cm[iCol].lso==="asc-desc" || cm[iCol].lso==="desc-asc") {
  2459. cm[iCol].lso="";
  2460. }
  2461. } else {
  2462. cm[iCol].lso = so = cm[iCol].firstsortorder || 'asc';
  2463. }
  2464. if( so ) {
  2465. $("span.s-ico",selTh).show();
  2466. $("span.ui-icon-"+so,selTh).removeClass('ui-state-disabled');
  2467. $(selTh).attr("aria-selected","true");
  2468. } else {
  2469. if(!ts.p.viewsortcols[0]) {
  2470. $("span.s-ico",selTh).hide();
  2471. }
  2472. }
  2473. ts.p.sortorder = "";
  2474. $.each(cm, function(i){
  2475. if(this.lso) {
  2476. if(i>0 && fs) {
  2477. sort += ", ";
  2478. }
  2479. splas = this.lso.split("-");
  2480. sort += cm[i].index || cm[i].name;
  2481. sort += " "+splas[splas.length-1];
  2482. fs = true;
  2483. ts.p.sortorder = splas[splas.length-1];
  2484. }
  2485. });
  2486. ls = sort.lastIndexOf(ts.p.sortorder);
  2487. sort = sort.substring(0, ls);
  2488. ts.p.sortname = sort;
  2489. },
  2490. sortData = function (index, idxcol,reload,sor, obj){
  2491. if(!ts.p.colModel[idxcol].sortable) { return; }
  2492. if(ts.p.savedRow.length > 0) {return;}
  2493. if(!reload) {
  2494. if( ts.p.lastsort === idxcol && ts.p.sortname !== "" ) {
  2495. if( ts.p.sortorder === 'asc') {
  2496. ts.p.sortorder = 'desc';
  2497. } else if(ts.p.sortorder === 'desc') { ts.p.sortorder = 'asc';}
  2498. } else { ts.p.sortorder = ts.p.colModel[idxcol].firstsortorder || 'asc'; }
  2499. ts.p.page = 1;
  2500. }
  2501. if(ts.p.multiSort) {
  2502. multiSort( idxcol, obj);
  2503. } else {
  2504. if(sor) {
  2505. if(ts.p.lastsort === idxcol && ts.p.sortorder === sor && !reload) { return; }
  2506. ts.p.sortorder = sor;
  2507. }
  2508. var previousSelectedTh = ts.grid.headers[ts.p.lastsort] ? ts.grid.headers[ts.p.lastsort].el : null, newSelectedTh = ts.p.frozenColumns ? obj : ts.grid.headers[idxcol].el;
  2509. $("span.ui-grid-ico-sort",previousSelectedTh).addClass('ui-state-disabled');
  2510. $(previousSelectedTh).attr("aria-selected","false");
  2511. if(ts.p.frozenColumns) {
  2512. ts.grid.fhDiv.find("span.ui-grid-ico-sort").addClass('ui-state-disabled');
  2513. ts.grid.fhDiv.find("th").attr("aria-selected","false");
  2514. }
  2515. $("span.ui-icon-"+ts.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');
  2516. $(newSelectedTh).attr("aria-selected","true");
  2517. if(!ts.p.viewsortcols[0]) {
  2518. if(ts.p.lastsort !== idxcol) {
  2519. if(ts.p.frozenColumns){
  2520. ts.grid.fhDiv.find("span.s-ico").hide();
  2521. }
  2522. $("span.s-ico",previousSelectedTh).hide();
  2523. $("span.s-ico",newSelectedTh).show();
  2524. } else if (ts.p.sortname === "") { // if ts.p.lastsort === idxcol but ts.p.sortname === ""
  2525. $("span.s-ico",newSelectedTh).show();
  2526. }
  2527. }
  2528. index = index.substring(5 + ts.p.id.length + 1); // bad to be changed!?!
  2529. ts.p.sortname = ts.p.colModel[idxcol].index || index;
  2530. }
  2531. if ($(ts).triggerHandler("jqGridSortCol", [ts.p.sortname, idxcol, ts.p.sortorder]) === 'stop') {
  2532. ts.p.lastsort = idxcol;
  2533. return;
  2534. }
  2535. if($.isFunction(ts.p.onSortCol)) {if (ts.p.onSortCol.call(ts, ts.p.sortname, idxcol, ts.p.sortorder)==='stop') {ts.p.lastsort = idxcol; return;}}
  2536. if(ts.p.datatype === "local") {
  2537. if(ts.p.deselectAfterSort) {$(ts).jqGrid("resetSelection");}
  2538. } else {
  2539. ts.p.selrow = null;
  2540. if(ts.p.multiselect){setHeadCheckBox( false );}
  2541. ts.p.selarrrow =[];
  2542. ts.p.savedRow =[];
  2543. }
  2544. if(ts.p.scroll) {
  2545. var sscroll = ts.grid.bDiv.scrollLeft;
  2546. emptyRows.call(ts, true, false);
  2547. ts.grid.hDiv.scrollLeft = sscroll;
  2548. }
  2549. if(ts.p.subGrid && ts.p.datatype === 'local') {
  2550. $("td.sgexpanded","#"+$.jgrid.jqID(ts.p.id)).each(function(){
  2551. $(this).trigger("click");
  2552. });
  2553. }
  2554. ts.p._sort = true;
  2555. populate();
  2556. ts.p.lastsort = idxcol;
  2557. if(ts.p.sortname !== index && idxcol) {ts.p.lastsort = idxcol;}
  2558. },
  2559. setColWidth = function () {
  2560. var initwidth = 0, brd=$.jgrid.cell_width? 0: intNum(ts.p.cellLayout,0), vc=0, lvc, scw=intNum(ts.p.scrollOffset,0),cw,hs=false,aw,gw=0,cr;
  2561. $.each(ts.p.colModel, function() {
  2562. if(this.hidden === undefined) {this.hidden=false;}
  2563. if(ts.p.grouping && ts.p.autowidth) {
  2564. var ind = $.inArray(this.name, ts.p.groupingView.groupField);
  2565. if(ind >= 0 && ts.p.groupingView.groupColumnShow.length > ind) {
  2566. this.hidden = !ts.p.groupingView.groupColumnShow[ind];
  2567. }
  2568. }
  2569. this.widthOrg = cw = intNum(this.width,0);
  2570. if(this.hidden===false){
  2571. initwidth += cw+brd;
  2572. if(this.fixed) {
  2573. gw += cw+brd;
  2574. } else {
  2575. vc++;
  2576. }
  2577. }
  2578. });
  2579. if(isNaN(ts.p.width)) {
  2580. ts.p.width = initwidth + ((ts.p.shrinkToFit ===false && !isNaN(ts.p.height)) ? scw : 0);
  2581. }
  2582. grid.width = ts.p.width;
  2583. ts.p.tblwidth = initwidth;
  2584. if(ts.p.shrinkToFit ===false && ts.p.forceFit === true) {ts.p.forceFit=false;}
  2585. if(ts.p.shrinkToFit===true && vc > 0) {
  2586. aw = grid.width-brd*vc-gw;
  2587. if(!isNaN(ts.p.height)) {
  2588. aw -= scw;
  2589. hs = true;
  2590. }
  2591. initwidth =0;
  2592. $.each(ts.p.colModel, function(i) {
  2593. if(this.hidden === false && !this.fixed){
  2594. cw = Math.round(aw*this.width/(ts.p.tblwidth-brd*vc-gw));
  2595. this.width =cw;
  2596. initwidth += cw;
  2597. lvc = i;
  2598. }
  2599. });
  2600. cr =0;
  2601. if (hs) {
  2602. if(grid.width-gw-(initwidth+brd*vc) !== scw){
  2603. cr = grid.width-gw-(initwidth+brd*vc)-scw;
  2604. }
  2605. } else if(!hs && Math.abs(grid.width-gw-(initwidth+brd*vc)) !== 1) {
  2606. cr = grid.width-gw-(initwidth+brd*vc);
  2607. }
  2608. ts.p.colModel[lvc].width += cr;
  2609. ts.p.tblwidth = initwidth+cr+brd*vc+gw;
  2610. if(ts.p.tblwidth > ts.p.width) {
  2611. ts.p.colModel[lvc].width -= (ts.p.tblwidth - parseInt(ts.p.width,10));
  2612. ts.p.tblwidth = ts.p.width;
  2613. }
  2614. }
  2615. },
  2616. nextVisible= function(iCol) {
  2617. var ret = iCol, j=iCol, i;
  2618. for (i = iCol+1;i<ts.p.colModel.length;i++){
  2619. if(ts.p.colModel[i].hidden !== true ) {
  2620. j=i; break;
  2621. }
  2622. }
  2623. return j-ret;
  2624. },
  2625. getOffset = function (iCol) {
  2626. var $th = $(ts.grid.headers[iCol].el), ret = [$th.position().left + $th.outerWidth()];
  2627. if(ts.p.direction==="rtl") { ret[0] = ts.p.width - ret[0]; }
  2628. ret[0] -= ts.grid.bDiv.scrollLeft;
  2629. ret.push($(ts.grid.hDiv).position().top);
  2630. ret.push($(ts.grid.bDiv).offset().top - $(ts.grid.hDiv).offset().top + $(ts.grid.bDiv).height());
  2631. return ret;
  2632. },
  2633. getColumnHeaderIndex = function (th) {
  2634. var i, headers = ts.grid.headers, ci = $.jgrid.getCellIndex(th);
  2635. for (i = 0; i < headers.length; i++) {
  2636. if (th === headers[i].el) {
  2637. ci = i;
  2638. break;
  2639. }
  2640. }
  2641. return ci;
  2642. },
  2643. colTemplate;
  2644. this.p.id = this.id;
  2645. if ($.inArray(ts.p.multikey,sortkeys) === -1 ) {ts.p.multikey = false;}
  2646. ts.p.keyName=false;
  2647. for (i=0; i<ts.p.colModel.length;i++) {
  2648. colTemplate = typeof ts.p.colModel[i].template === "string" ?
  2649. ($.jgrid.cmTemplate != null && typeof $.jgrid.cmTemplate[ts.p.colModel[i].template] === "object" ? $.jgrid.cmTemplate[ts.p.colModel[i].template]: {}) :
  2650. ts.p.colModel[i].template;
  2651. ts.p.colModel[i] = $.extend(true, {}, ts.p.cmTemplate, colTemplate || {}, ts.p.colModel[i]);
  2652. if (ts.p.keyName === false && ts.p.colModel[i].key===true) {
  2653. ts.p.keyName = ts.p.colModel[i].name;
  2654. }
  2655. }
  2656. ts.p.sortorder = ts.p.sortorder.toLowerCase();
  2657. $.jgrid.cell_width = $.jgrid.cellWidth();
  2658. if(ts.p.grouping===true) {
  2659. ts.p.scroll = false;
  2660. ts.p.rownumbers = false;
  2661. //ts.p.subGrid = false; expiremental
  2662. ts.p.treeGrid = false;
  2663. ts.p.gridview = true;
  2664. }
  2665. if(this.p.treeGrid === true) {
  2666. try { $(this).jqGrid("setTreeGrid");} catch (_) {}
  2667. if(ts.p.datatype !== "local") { ts.p.localReader = {id: "_id_"}; }
  2668. }
  2669. if(this.p.subGrid) {
  2670. try { $(ts).jqGrid("setSubGrid");} catch (s){}
  2671. }
  2672. if(this.p.multiselect) {
  2673. this.p.colNames.unshift("<input role='checkbox' id='cb_"+this.p.id+"' class='cbox' type='checkbox'/>");
  2674. this.p.colModel.unshift({name:'cb',width:$.jgrid.cell_width ? ts.p.multiselectWidth+ts.p.cellLayout : ts.p.multiselectWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true});
  2675. }
  2676. if(this.p.rownumbers) {
  2677. this.p.colNames.unshift("");
  2678. this.p.colModel.unshift({name:'rn',width:ts.p.rownumWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true});
  2679. }
  2680. ts.p.xmlReader = $.extend(true,{
  2681. root: "rows",
  2682. row: "row",
  2683. page: "rows>page",
  2684. total: "rows>total",
  2685. records : "rows>records",
  2686. repeatitems: true,
  2687. cell: "cell",
  2688. id: "[id]",
  2689. userdata: "userdata",
  2690. subgrid: {root:"rows", row: "row", repeatitems: true, cell:"cell"}
  2691. }, ts.p.xmlReader);
  2692. ts.p.jsonReader = $.extend(true,{
  2693. root: "rows",
  2694. page: "page",
  2695. total: "total",
  2696. records: "records",
  2697. repeatitems: true,
  2698. cell: "cell",
  2699. id: "id",
  2700. userdata: "userdata",
  2701. subgrid: {root:"rows", repeatitems: true, cell:"cell"}
  2702. },ts.p.jsonReader);
  2703. ts.p.localReader = $.extend(true,{
  2704. root: "rows",
  2705. page: "page",
  2706. total: "total",
  2707. records: "records",
  2708. repeatitems: false,
  2709. cell: "cell",
  2710. id: "id",
  2711. userdata: "userdata",
  2712. subgrid: {root:"rows", repeatitems: true, cell:"cell"}
  2713. },ts.p.localReader);
  2714. if(ts.p.scroll){
  2715. ts.p.pgbuttons = false; ts.p.pginput=false; ts.p.rowList=[];
  2716. }
  2717. if(ts.p.data.length) { normalizeData(); refreshIndex(); }
  2718. var thead = "<thead><tr class='ui-jqgrid-labels' role='row'>",
  2719. tdc, idn, w, res, sort,
  2720. td, ptr, tbody, imgs,iac="",idc="",sortarr=[], sortord=[], sotmp=[];
  2721. if(ts.p.shrinkToFit===true && ts.p.forceFit===true) {
  2722. for (i=ts.p.colModel.length-1;i>=0;i--){
  2723. if(!ts.p.colModel[i].hidden) {
  2724. ts.p.colModel[i].resizable=false;
  2725. break;
  2726. }
  2727. }
  2728. }
  2729. if(ts.p.viewsortcols[1] === 'horizontal') {iac=" ui-i-asc";idc=" ui-i-desc";}
  2730. tdc = isMSIE ? "class='ui-th-div-ie'" :"";
  2731. 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>";
  2732. 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>";
  2733. if(ts.p.multiSort) {
  2734. sortarr = ts.p.sortname.split(",");
  2735. for (i=0; i<sortarr.length; i++) {
  2736. sotmp = $.trim(sortarr[i]).split(" ");
  2737. sortarr[i] = $.trim(sotmp[0]);
  2738. sortord[i] = sotmp[1] ? $.trim(sotmp[1]) : ts.p.sortorder || "asc";
  2739. }
  2740. }
  2741. for(i=0;i<this.p.colNames.length;i++){
  2742. var tooltip = ts.p.headertitles ? (" title=\""+$.jgrid.stripHtml(ts.p.colNames[i])+"\"") :"";
  2743. thead += "<th id='"+ts.p.id+"_"+ts.p.colModel[i].name+"' role='columnheader' class='ui-state-default ui-th-column ui-th-"+dir+"'"+ tooltip+">";
  2744. idn = ts.p.colModel[i].index || ts.p.colModel[i].name;
  2745. thead += "<div id='jqgh_"+ts.p.id+"_"+ts.p.colModel[i].name+"' "+tdc+">"+ts.p.colNames[i];
  2746. if(!ts.p.colModel[i].width) { ts.p.colModel[i].width = 150; }
  2747. else { ts.p.colModel[i].width = parseInt(ts.p.colModel[i].width,10); }
  2748. if(typeof ts.p.colModel[i].title !== "boolean") { ts.p.colModel[i].title = true; }
  2749. ts.p.colModel[i].lso = "";
  2750. if (idn === ts.p.sortname) {
  2751. ts.p.lastsort = i;
  2752. }
  2753. if(ts.p.multiSort) {
  2754. sotmp = $.inArray(idn,sortarr);
  2755. if( sotmp !== -1 ) {
  2756. ts.p.colModel[i].lso = sortord[sotmp];
  2757. }
  2758. }
  2759. thead += imgs+"</div></th>";
  2760. }
  2761. thead += "</tr></thead>";
  2762. imgs = null;
  2763. $(this).append(thead);
  2764. $("thead tr:first th",this).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});
  2765. if(this.p.multiselect) {
  2766. var emp=[], chk;
  2767. $('#cb_'+$.jgrid.jqID(ts.p.id),this).bind('click',function(){
  2768. ts.p.selarrrow = [];
  2769. var froz = ts.p.frozenColumns === true ? ts.p.id + "_frozen" : "";
  2770. if (this.checked) {
  2771. $(ts.rows).each(function(i) {
  2772. if (i>0) {
  2773. if(!$(this).hasClass("ui-subgrid") && !$(this).hasClass("jqgroup") && !$(this).hasClass('ui-state-disabled') && !$(this).hasClass("jqfoot")){
  2774. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+$.jgrid.jqID(this.id) )[ts.p.useProp ? 'prop': 'attr']("checked",true);
  2775. $(this).addClass("ui-state-highlight").attr("aria-selected","true");
  2776. ts.p.selarrrow.push(this.id);
  2777. ts.p.selrow = this.id;
  2778. if(froz) {
  2779. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+$.jgrid.jqID(this.id), ts.grid.fbDiv )[ts.p.useProp ? 'prop': 'attr']("checked",true);
  2780. $("#"+$.jgrid.jqID(this.id), ts.grid.fbDiv).addClass("ui-state-highlight");
  2781. }
  2782. }
  2783. }
  2784. });
  2785. chk=true;
  2786. emp=[];
  2787. }
  2788. else {
  2789. $(ts.rows).each(function(i) {
  2790. if(i>0) {
  2791. if(!$(this).hasClass("ui-subgrid") && !$(this).hasClass("jqgroup") && !$(this).hasClass('ui-state-disabled') && !$(this).hasClass("jqfoot")){
  2792. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+$.jgrid.jqID(this.id) )[ts.p.useProp ? 'prop': 'attr']("checked", false);
  2793. $(this).removeClass("ui-state-highlight").attr("aria-selected","false");
  2794. emp.push(this.id);
  2795. if(froz) {
  2796. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+$.jgrid.jqID(this.id), ts.grid.fbDiv )[ts.p.useProp ? 'prop': 'attr']("checked",false);
  2797. $("#"+$.jgrid.jqID(this.id), ts.grid.fbDiv).removeClass("ui-state-highlight");
  2798. }
  2799. }
  2800. }
  2801. });
  2802. ts.p.selrow = null;
  2803. chk=false;
  2804. }
  2805. $(ts).triggerHandler("jqGridSelectAll", [chk ? ts.p.selarrrow : emp, chk]);
  2806. if($.isFunction(ts.p.onSelectAll)) {ts.p.onSelectAll.call(ts, chk ? ts.p.selarrrow : emp,chk);}
  2807. });
  2808. }
  2809. if(ts.p.autowidth===true) {
  2810. var pw = $(eg).innerWidth();
  2811. ts.p.width = pw > 0? pw: 'nw';
  2812. }
  2813. setColWidth();
  2814. $(eg).css("width",grid.width+"px").append("<div class='ui-jqgrid-resize-mark' id='rs_m"+ts.p.id+"'>&#160;</div>");
  2815. if(ts.p.scrollPopUp) {
  2816. $(eg).append("<div class='loading ui-scroll-popup ui-widget-content' id='scroll_g"+ts.p.id+"'></div>");
  2817. }
  2818. $(gv).css("width",grid.width+"px");
  2819. thead = $("thead:first",ts).get(0);
  2820. var tfoot = "";
  2821. if(ts.p.footerrow) { tfoot += "<table role='presentation' 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+"'>"; }
  2822. var thr = $("tr:first",thead),
  2823. firstr = "<tr class='jqgfirstrow' role='row' style='height:auto'>";
  2824. ts.p.disableClick=false;
  2825. $("th",thr).each(function ( j ) {
  2826. w = ts.p.colModel[j].width;
  2827. if(ts.p.colModel[j].resizable === undefined) {ts.p.colModel[j].resizable = true;}
  2828. if(ts.p.colModel[j].resizable){
  2829. res = document.createElement("span");
  2830. $(res).html("&#160;").addClass('ui-jqgrid-resize ui-jqgrid-resize-'+dir)
  2831. .css("cursor","col-resize");
  2832. $(this).addClass(ts.p.resizeclass);
  2833. } else {
  2834. res = "";
  2835. }
  2836. $(this).css("width",w+"px").prepend(res);
  2837. res = null;
  2838. var hdcol = "";
  2839. if( ts.p.colModel[j].hidden ) {
  2840. $(this).css("display","none");
  2841. hdcol = "display:none;";
  2842. }
  2843. firstr += "<td role='gridcell' style='height:0px;width:"+w+"px;"+hdcol+"'></td>";
  2844. grid.headers[j] = { width: w, el: this };
  2845. sort = ts.p.colModel[j].sortable;
  2846. if( typeof sort !== 'boolean') {ts.p.colModel[j].sortable = true; sort=true;}
  2847. var nm = ts.p.colModel[j].name;
  2848. if( !(nm === 'cb' || nm==='subgrid' || nm==='rn') ) {
  2849. if(ts.p.viewsortcols[2]){
  2850. $(">div",this).addClass('ui-jqgrid-sortable');
  2851. }
  2852. }
  2853. if(sort) {
  2854. if(ts.p.multiSort) {
  2855. if(ts.p.viewsortcols[0]) {
  2856. $("div span.s-ico",this).show();
  2857. if(ts.p.colModel[j].lso){
  2858. $("div span.ui-icon-"+ts.p.colModel[j].lso,this).removeClass("ui-state-disabled");
  2859. }
  2860. } else if( ts.p.colModel[j].lso) {
  2861. $("div span.s-ico",this).show();
  2862. $("div span.ui-icon-"+ts.p.colModel[j].lso,this).removeClass("ui-state-disabled");
  2863. }
  2864. } else {
  2865. 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");}}
  2866. else if(j === ts.p.lastsort && ts.p.sortname !== "") {$("div span.s-ico",this).show();$("div span.ui-icon-"+ts.p.sortorder,this).removeClass("ui-state-disabled");}
  2867. }
  2868. }
  2869. if(ts.p.footerrow) { tfoot += "<td role='gridcell' "+formatCol(j,0,'', null, '', false)+">&#160;</td>"; }
  2870. }).mousedown(function(e) {
  2871. if ($(e.target).closest("th>span.ui-jqgrid-resize").length !== 1) { return; }
  2872. var ci = getColumnHeaderIndex(this);
  2873. if(ts.p.forceFit===true) {ts.p.nv= nextVisible(ci);}
  2874. grid.dragStart(ci, e, getOffset(ci));
  2875. return false;
  2876. }).click(function(e) {
  2877. if (ts.p.disableClick) {
  2878. ts.p.disableClick = false;
  2879. return false;
  2880. }
  2881. var s = "th>div.ui-jqgrid-sortable",r,d;
  2882. if (!ts.p.viewsortcols[2]) { s = "th>div>span>span.ui-grid-ico-sort"; }
  2883. var t = $(e.target).closest(s);
  2884. if (t.length !== 1) { return; }
  2885. var ci;
  2886. if(ts.p.frozenColumns) {
  2887. var tid = $(this)[0].id.substring( ts.p.id.length + 1 );
  2888. $(ts.p.colModel).each(function(i){
  2889. if (this.name === tid) {
  2890. ci = i;return false;
  2891. }
  2892. });
  2893. } else {
  2894. ci = getColumnHeaderIndex(this);
  2895. }
  2896. if (!ts.p.viewsortcols[2]) { r=true;d=t.attr("sort"); }
  2897. if(ci != null){
  2898. sortData( $('div',this)[0].id, ci, r, d, this);
  2899. }
  2900. return false;
  2901. });
  2902. if (ts.p.sortable && $.fn.sortable) {
  2903. try {
  2904. $(ts).jqGrid("sortableColumns", thr);
  2905. } catch (e){}
  2906. }
  2907. if(ts.p.footerrow) { tfoot += "</tr></tbody></table>"; }
  2908. firstr += "</tr>";
  2909. tbody = document.createElement("tbody");
  2910. this.appendChild(tbody);
  2911. $(this).addClass('ui-jqgrid-btable').append(firstr);
  2912. firstr = null;
  2913. var hTable = $("<table class='ui-jqgrid-htable' style='width:"+ts.p.tblwidth+"px' role='presentation' aria-labelledby='gbox_"+this.id+"' cellspacing='0' cellpadding='0' border='0'></table>").append(thead),
  2914. hg = (ts.p.caption && ts.p.hiddengrid===true) ? true : false,
  2915. hb = $("<div class='ui-jqgrid-hbox" + (dir==="rtl" ? "-rtl" : "" )+"'></div>");
  2916. thead = null;
  2917. grid.hDiv = document.createElement("div");
  2918. $(grid.hDiv)
  2919. .css({ width: grid.width+"px"})
  2920. .addClass("ui-state-default ui-jqgrid-hdiv")
  2921. .append(hb);
  2922. $(hb).append(hTable);
  2923. hTable = null;
  2924. if(hg) { $(grid.hDiv).hide(); }
  2925. if(ts.p.pager){
  2926. // TBD -- escape ts.p.pager here?
  2927. if(typeof ts.p.pager === "string") {if(ts.p.pager.substr(0,1) !== "#") { ts.p.pager = "#"+ts.p.pager;} }
  2928. else { ts.p.pager = "#"+ $(ts.p.pager).attr("id");}
  2929. $(ts.p.pager).css({width: grid.width+"px"}).addClass('ui-state-default ui-jqgrid-pager ui-corner-bottom').appendTo(eg);
  2930. if(hg) {$(ts.p.pager).hide();}
  2931. setPager(ts.p.pager,'');
  2932. }
  2933. if( ts.p.cellEdit === false && ts.p.hoverrows === true) {
  2934. $(ts).bind('mouseover',function(e) {
  2935. ptr = $(e.target).closest("tr.jqgrow");
  2936. if($(ptr).attr("class") !== "ui-subgrid") {
  2937. $(ptr).addClass("ui-state-hover");
  2938. }
  2939. }).bind('mouseout',function(e) {
  2940. ptr = $(e.target).closest("tr.jqgrow");
  2941. $(ptr).removeClass("ui-state-hover");
  2942. });
  2943. }
  2944. var ri,ci, tdHtml;
  2945. $(ts).before(grid.hDiv).click(function(e) {
  2946. td = e.target;
  2947. ptr = $(td,ts.rows).closest("tr.jqgrow");
  2948. if($(ptr).length === 0 || ptr[0].className.indexOf( 'ui-state-disabled' ) > -1 || ($(td,ts).closest("table.ui-jqgrid-btable").attr('id') || '').replace("_frozen","") !== ts.id ) {
  2949. return this;
  2950. }
  2951. var scb = $(td).hasClass("cbox"),
  2952. cSel = $(ts).triggerHandler("jqGridBeforeSelectRow", [ptr[0].id, e]);
  2953. cSel = (cSel === false || cSel === 'stop') ? false : true;
  2954. if ($.isFunction(ts.p.beforeSelectRow)) {
  2955. var allowRowSelect = ts.p.beforeSelectRow.call(ts, ptr[0].id, e);
  2956. if (allowRowSelect === false || allowRowSelect === 'stop') {
  2957. cSel = false;
  2958. }
  2959. }
  2960. if (td.tagName === 'A' || ((td.tagName === 'INPUT' || td.tagName === 'TEXTAREA' || td.tagName === 'OPTION' || td.tagName === 'SELECT' ) && !scb) ) { return; }
  2961. ri = ptr[0].id;
  2962. td = $(td).closest("tr.jqgrow>td");
  2963. if (td.length > 0) {
  2964. ci = $.jgrid.getCellIndex(td);
  2965. tdHtml = $(td).closest("td,th").html();
  2966. $(ts).triggerHandler("jqGridCellSelect", [ri,ci,tdHtml,e]);
  2967. if($.isFunction(ts.p.onCellSelect)) {
  2968. ts.p.onCellSelect.call(ts,ri,ci,tdHtml,e);
  2969. }
  2970. }
  2971. if(ts.p.cellEdit === true) {
  2972. if(ts.p.multiselect && scb && cSel){
  2973. $(ts).jqGrid("setSelection", ri ,true,e);
  2974. } else if (td.length > 0) {
  2975. ri = ptr[0].rowIndex;
  2976. try {$(ts).jqGrid("editCell",ri,ci,true);} catch (_) {}
  2977. }
  2978. }
  2979. if (!cSel) {
  2980. return;
  2981. }
  2982. if ( !ts.p.multikey ) {
  2983. if(ts.p.multiselect && ts.p.multiboxonly) {
  2984. if(scb){$(ts).jqGrid("setSelection",ri,true,e);}
  2985. else {
  2986. var frz = ts.p.frozenColumns ? ts.p.id+"_frozen" : "";
  2987. $(ts.p.selarrrow).each(function(i,n){
  2988. var trid = $(ts).jqGrid('getGridRowById',n);
  2989. if(trid) { $( trid ).removeClass("ui-state-highlight"); }
  2990. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+$.jgrid.jqID(n))[ts.p.useProp ? 'prop': 'attr']("checked", false);
  2991. if(frz) {
  2992. $("#"+$.jgrid.jqID(n), "#"+$.jgrid.jqID(frz)).removeClass("ui-state-highlight");
  2993. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+$.jgrid.jqID(n), "#"+$.jgrid.jqID(frz))[ts.p.useProp ? 'prop': 'attr']("checked", false);
  2994. }
  2995. });
  2996. ts.p.selarrrow = [];
  2997. $(ts).jqGrid("setSelection",ri,true,e);
  2998. }
  2999. } else {
  3000. $(ts).jqGrid("setSelection",ri,true,e);
  3001. }
  3002. } else {
  3003. if(e[ts.p.multikey]) {
  3004. $(ts).jqGrid("setSelection",ri,true,e);
  3005. } else if(ts.p.multiselect && scb) {
  3006. scb = $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+ri).is(":checked");
  3007. $("#jqg_"+$.jgrid.jqID(ts.p.id)+"_"+ri)[ts.p.useProp ? 'prop' : 'attr']("checked", scb);
  3008. }
  3009. }
  3010. }).bind('reloadGrid', function(e,opts) {
  3011. if(ts.p.treeGrid ===true) { ts.p.datatype = ts.p.treedatatype;}
  3012. if (opts && opts.current) {
  3013. ts.grid.selectionPreserver(ts);
  3014. }
  3015. if(ts.p.datatype==="local"){ $(ts).jqGrid("resetSelection"); if(ts.p.data.length) { normalizeData(); refreshIndex();} }
  3016. else if(!ts.p.treeGrid) {
  3017. ts.p.selrow=null;
  3018. if(ts.p.multiselect) {ts.p.selarrrow =[];setHeadCheckBox(false);}
  3019. ts.p.savedRow = [];
  3020. }
  3021. if(ts.p.scroll) {emptyRows.call(ts, true, false);}
  3022. if (opts && opts.page) {
  3023. var page = opts.page;
  3024. if (page > ts.p.lastpage) { page = ts.p.lastpage; }
  3025. if (page < 1) { page = 1; }
  3026. ts.p.page = page;
  3027. if (ts.grid.prevRowHeight) {
  3028. ts.grid.bDiv.scrollTop = (page - 1) * ts.grid.prevRowHeight * ts.p.rowNum;
  3029. } else {
  3030. ts.grid.bDiv.scrollTop = 0;
  3031. }
  3032. }
  3033. if (ts.grid.prevRowHeight && ts.p.scroll) {
  3034. delete ts.p.lastpage;
  3035. ts.grid.populateVisible();
  3036. } else {
  3037. ts.grid.populate();
  3038. }
  3039. if(ts.p.inlineNav===true) {$(ts).jqGrid('showAddEditButtons');}
  3040. return false;
  3041. })
  3042. .dblclick(function(e) {
  3043. td = e.target;
  3044. ptr = $(td,ts.rows).closest("tr.jqgrow");
  3045. if($(ptr).length === 0 ){return;}
  3046. ri = ptr[0].rowIndex;
  3047. ci = $.jgrid.getCellIndex(td);
  3048. var dbcr = $(ts).triggerHandler("jqGridDblClickRow", [$(ptr).attr("id"),ri,ci,e]);
  3049. if( dbcr != null) { return dbcr; }
  3050. if ($.isFunction(ts.p.ondblClickRow)) {
  3051. dbcr = ts.p.ondblClickRow.call(ts,$(ptr).attr("id"),ri,ci, e);
  3052. if( dbcr != null) { return dbcr; }
  3053. }
  3054. })
  3055. .bind('contextmenu', function(e) {
  3056. td = e.target;
  3057. ptr = $(td,ts.rows).closest("tr.jqgrow");
  3058. if($(ptr).length === 0 ){return;}
  3059. if(!ts.p.multiselect) { $(ts).jqGrid("setSelection",ptr[0].id,true,e); }
  3060. ri = ptr[0].rowIndex;
  3061. ci = $.jgrid.getCellIndex(td);
  3062. var rcr = $(ts).triggerHandler("jqGridRightClickRow", [$(ptr).attr("id"),ri,ci,e]);
  3063. if( rcr != null) { return rcr; }
  3064. if ($.isFunction(ts.p.onRightClickRow)) {
  3065. rcr = ts.p.onRightClickRow.call(ts,$(ptr).attr("id"),ri,ci, e);
  3066. if( rcr != null) { return rcr; }
  3067. }
  3068. });
  3069. grid.bDiv = document.createElement("div");
  3070. if(isMSIE) { if(String(ts.p.height).toLowerCase() === "auto") { ts.p.height = "100%"; } }
  3071. $(grid.bDiv)
  3072. .append($('<div style="position:relative;"></div>').append('<div></div>').append(this))
  3073. .addClass("ui-jqgrid-bdiv")
  3074. .css({ height: ts.p.height+(isNaN(ts.p.height)?"":"px"), width: (grid.width)+"px"})
  3075. .scroll(grid.scrollGrid);
  3076. $("table:first",grid.bDiv).css({width:ts.p.tblwidth+"px"});
  3077. if( !$.support.tbody ) { //IE
  3078. if( $("tbody",this).length === 2 ) { $("tbody:gt(0)",this).remove();}
  3079. }
  3080. if(ts.p.multikey){
  3081. if( $.jgrid.msie) {
  3082. $(grid.bDiv).bind("selectstart",function(){return false;});
  3083. } else {
  3084. $(grid.bDiv).bind("mousedown",function(){return false;});
  3085. }
  3086. }
  3087. if(hg) {$(grid.bDiv).hide();}
  3088. grid.cDiv = document.createElement("div");
  3089. var arf = ts.p.hidegrid===true ? $("<a role='link' class='ui-jqgrid-titlebar-close ui-corner-all HeaderButton' title='"+($.jgrid.getRegional(ts, "defaults.showhide", ts.p.showhide) || "")+"'" + " />").hover(
  3090. function(){ arf.addClass('ui-state-hover');},
  3091. function() {arf.removeClass('ui-state-hover');})
  3092. .append("<span class='ui-icon ui-icon-circle-triangle-n'></span>").css((dir==="rtl"?"left":"right"),"0px") : "";
  3093. $(grid.cDiv).append(arf).append("<span class='ui-jqgrid-title'>"+ts.p.caption+"</span>")
  3094. .addClass("ui-jqgrid-titlebar ui-jqgrid-caption"+(dir==="rtl" ? "-rtl" :"" )+" ui-widget-header ui-corner-top ui-helper-clearfix");
  3095. $(grid.cDiv).insertBefore(grid.hDiv);
  3096. if( ts.p.toolbar[0] ) {
  3097. grid.uDiv = document.createElement("div");
  3098. if(ts.p.toolbar[1] === "top") {$(grid.uDiv).insertBefore(grid.hDiv);}
  3099. else if (ts.p.toolbar[1]==="bottom" ) {$(grid.uDiv).insertAfter(grid.hDiv);}
  3100. if(ts.p.toolbar[1]==="both") {
  3101. grid.ubDiv = document.createElement("div");
  3102. $(grid.uDiv).addClass("ui-userdata ui-state-default").attr("id","t_"+this.id).insertBefore(grid.hDiv);
  3103. $(grid.ubDiv).addClass("ui-userdata ui-state-default").attr("id","tb_"+this.id).insertAfter(grid.hDiv);
  3104. if(hg) {$(grid.ubDiv).hide();}
  3105. } else {
  3106. $(grid.uDiv).width(grid.width).addClass("ui-userdata ui-state-default").attr("id","t_"+this.id);
  3107. }
  3108. if(hg) {$(grid.uDiv).hide();}
  3109. }
  3110. if(ts.p.toppager) {
  3111. ts.p.toppager = $.jgrid.jqID(ts.p.id)+"_toppager";
  3112. grid.topDiv = $("<div id='"+ts.p.toppager+"'></div>")[0];
  3113. ts.p.toppager = "#"+ts.p.toppager;
  3114. $(grid.topDiv).addClass('ui-state-default ui-jqgrid-toppager').width(grid.width).insertBefore(grid.hDiv);
  3115. setPager(ts.p.toppager,'_t');
  3116. }
  3117. if(ts.p.footerrow) {
  3118. grid.sDiv = $("<div class='ui-jqgrid-sdiv'></div>")[0];
  3119. hb = $("<div class='ui-jqgrid-hbox"+(dir==="rtl"?"-rtl":"")+"'></div>");
  3120. $(grid.sDiv).append(hb).width(grid.width).insertAfter(grid.hDiv);
  3121. $(hb).append(tfoot);
  3122. grid.footers = $(".ui-jqgrid-ftable",grid.sDiv)[0].rows[0].cells;
  3123. if(ts.p.rownumbers) { grid.footers[0].className = 'ui-state-default jqgrid-rownum'; }
  3124. if(hg) {$(grid.sDiv).hide();}
  3125. }
  3126. hb = null;
  3127. if(ts.p.caption) {
  3128. var tdt = ts.p.datatype;
  3129. if(ts.p.hidegrid===true) {
  3130. $(".ui-jqgrid-titlebar-close",grid.cDiv).click( function(e){
  3131. var onHdCl = $.isFunction(ts.p.onHeaderClick),
  3132. elems = ".ui-jqgrid-bdiv, .ui-jqgrid-hdiv, .ui-jqgrid-pager, .ui-jqgrid-sdiv",
  3133. counter, self = this;
  3134. if(ts.p.toolbar[0]===true) {
  3135. if( ts.p.toolbar[1]==='both') {
  3136. elems += ', #' + $(grid.ubDiv).attr('id');
  3137. }
  3138. elems += ', #' + $(grid.uDiv).attr('id');
  3139. }
  3140. counter = $(elems,"#gview_"+$.jgrid.jqID(ts.p.id)).length;
  3141. if(ts.p.gridstate === 'visible') {
  3142. $(elems,"#gbox_"+$.jgrid.jqID(ts.p.id)).slideUp("fast", function() {
  3143. counter--;
  3144. if (counter === 0) {
  3145. $("span",self).removeClass("ui-icon-circle-triangle-n").addClass("ui-icon-circle-triangle-s");
  3146. ts.p.gridstate = 'hidden';
  3147. if($("#gbox_"+$.jgrid.jqID(ts.p.id)).hasClass("ui-resizable")) { $(".ui-resizable-handle","#gbox_"+$.jgrid.jqID(ts.p.id)).hide(); }
  3148. $(ts).triggerHandler("jqGridHeaderClick", [ts.p.gridstate,e]);
  3149. if(onHdCl) {if(!hg) {ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}}
  3150. }
  3151. });
  3152. } else if(ts.p.gridstate === 'hidden'){
  3153. $(elems,"#gbox_"+$.jgrid.jqID(ts.p.id)).slideDown("fast", function() {
  3154. counter--;
  3155. if (counter === 0) {
  3156. $("span",self).removeClass("ui-icon-circle-triangle-s").addClass("ui-icon-circle-triangle-n");
  3157. if(hg) {ts.p.datatype = tdt;populate();hg=false;}
  3158. ts.p.gridstate = 'visible';
  3159. if($("#gbox_"+$.jgrid.jqID(ts.p.id)).hasClass("ui-resizable")) { $(".ui-resizable-handle","#gbox_"+$.jgrid.jqID(ts.p.id)).show(); }
  3160. $(ts).triggerHandler("jqGridHeaderClick", [ts.p.gridstate,e]);
  3161. if(onHdCl) {if(!hg) {ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}}
  3162. }
  3163. });
  3164. }
  3165. return false;
  3166. });
  3167. if(hg) {ts.p.datatype="local"; $(".ui-jqgrid-titlebar-close",grid.cDiv).trigger("click");}
  3168. }
  3169. } else {
  3170. $(grid.cDiv).hide();
  3171. if(!ts.p.toppager) {
  3172. $(grid.hDiv).addClass('ui-corner-top');
  3173. }
  3174. }
  3175. $(grid.hDiv).after(grid.bDiv)
  3176. .mousemove(function (e) {
  3177. if(grid.resizing){grid.dragMove(e);return false;}
  3178. });
  3179. $(".ui-jqgrid-labels",grid.hDiv).bind("selectstart", function () { return false; });
  3180. $(document).bind( "mouseup.jqGrid" + ts.p.id, function () {
  3181. if(grid.resizing) { grid.dragEnd(); return false;}
  3182. return true;
  3183. });
  3184. ts.formatCol = formatCol;
  3185. ts.sortData = sortData;
  3186. ts.updatepager = updatepager;
  3187. ts.refreshIndex = refreshIndex;
  3188. ts.setHeadCheckBox = setHeadCheckBox;
  3189. ts.constructTr = constructTr;
  3190. ts.formatter = function ( rowId, cellval , colpos, rwdat, act){return formatter(rowId, cellval , colpos, rwdat, act);};
  3191. $.extend(grid,{populate : populate, emptyRows: emptyRows, beginReq: beginReq, endReq: endReq});
  3192. this.grid = grid;
  3193. ts.addXmlData = function(d) {addXmlData( d );};
  3194. ts.addJSONData = function(d) {addJSONData( d );};
  3195. this.grid.cols = this.rows[0].cells;
  3196. $(ts).triggerHandler("jqGridInitGrid");
  3197. if ($.isFunction( ts.p.onInitGrid )) { ts.p.onInitGrid.call(ts); }
  3198. populate();ts.p.hiddengrid=false;
  3199. });
  3200. };
  3201. $.jgrid.extend({
  3202. getGridParam : function(name, module) {
  3203. var $t = this[0], ret;
  3204. if (!$t || !$t.grid) {return;}
  3205. if(module === undefined && typeof module !== 'string') {
  3206. module = 'jqGrid'; //$t.p
  3207. }
  3208. ret = $t.p;
  3209. if(module !== 'jqGrid') {
  3210. try {
  3211. ret = $($t).data( module );
  3212. } catch (e) {
  3213. ret = $t.p;
  3214. }
  3215. }
  3216. if (!name) { return ret; }
  3217. return ret[name] !== undefined ? ret[name] : null;
  3218. },
  3219. setGridParam : function (newParams, overwrite){
  3220. return this.each(function(){
  3221. if(overwrite == null) {
  3222. overwrite = false;
  3223. }
  3224. if (this.grid && typeof newParams === 'object') {
  3225. if(overwrite === true) {
  3226. var params = $.extend({}, this.p, newParams);
  3227. this.p = params;
  3228. } else {
  3229. $.extend(true,this.p,newParams);
  3230. }
  3231. }
  3232. });
  3233. },
  3234. getGridRowById: function ( rowid ) {
  3235. var row;
  3236. this.each( function(){
  3237. try {
  3238. //row = this.rows.namedItem( rowid );
  3239. var i = this.rows.length;
  3240. while(i--) {
  3241. if( rowid.toString() === this.rows[i].id) {
  3242. row = this.rows[i];
  3243. break;
  3244. }
  3245. }
  3246. } catch ( e ) {
  3247. row = $(this.grid.bDiv).find( "#" + $.jgrid.jqID( rowid ));
  3248. }
  3249. });
  3250. return row;
  3251. },
  3252. getDataIDs : function () {
  3253. var ids=[], i=0, len, j=0;
  3254. this.each(function(){
  3255. len = this.rows.length;
  3256. if(len && len>0){
  3257. while(i<len) {
  3258. if($(this.rows[i]).hasClass('jqgrow')) {
  3259. ids[j] = this.rows[i].id;
  3260. j++;
  3261. }
  3262. i++;
  3263. }
  3264. }
  3265. });
  3266. return ids;
  3267. },
  3268. setSelection : function(selection,onsr, e) {
  3269. return this.each(function(){
  3270. var $t = this, stat,pt, ner, ia, tpsr, fid, csr;
  3271. if(selection === undefined) { return; }
  3272. onsr = onsr === false ? false : true;
  3273. pt=$($t).jqGrid('getGridRowById', selection);
  3274. if(!pt || !pt.className || pt.className.indexOf( 'ui-state-disabled' ) > -1 ) { return; }
  3275. function scrGrid(iR){
  3276. var ch = $($t.grid.bDiv)[0].clientHeight,
  3277. st = $($t.grid.bDiv)[0].scrollTop,
  3278. rpos = $($t.rows[iR]).position().top,
  3279. rh = $t.rows[iR].clientHeight;
  3280. if(rpos+rh >= ch+st) { $($t.grid.bDiv)[0].scrollTop = rpos-(ch+st)+rh+st; }
  3281. else if(rpos < ch+st) {
  3282. if(rpos < st) {
  3283. $($t.grid.bDiv)[0].scrollTop = rpos;
  3284. }
  3285. }
  3286. }
  3287. if($t.p.scrollrows===true) {
  3288. ner = $($t).jqGrid('getGridRowById',selection).rowIndex;
  3289. if(ner >=0 ){
  3290. scrGrid(ner);
  3291. }
  3292. }
  3293. if($t.p.frozenColumns === true ) {
  3294. fid = $t.p.id+"_frozen";
  3295. }
  3296. if(!$t.p.multiselect) {
  3297. if(pt.className !== "ui-subgrid") {
  3298. if( $t.p.selrow !== pt.id ) {
  3299. csr = $($t).jqGrid('getGridRowById', $t.p.selrow);
  3300. if( csr ) {
  3301. $( csr ).removeClass("ui-state-highlight").attr({"aria-selected":"false", "tabindex" : "-1"});
  3302. }
  3303. $(pt).addClass("ui-state-highlight").attr({"aria-selected":"true", "tabindex" : "0"});//.focus();
  3304. if(fid) {
  3305. $("#"+$.jgrid.jqID($t.p.selrow), "#"+$.jgrid.jqID(fid)).removeClass("ui-state-highlight");
  3306. $("#"+$.jgrid.jqID(selection), "#"+$.jgrid.jqID(fid)).addClass("ui-state-highlight");
  3307. }
  3308. stat = true;
  3309. } else {
  3310. stat = false;
  3311. }
  3312. $t.p.selrow = pt.id;
  3313. if( onsr ) {
  3314. $($t).triggerHandler("jqGridSelectRow", [pt.id, stat, e]);
  3315. if( $t.p.onSelectRow) { $t.p.onSelectRow.call($t, pt.id, stat, e); }
  3316. }
  3317. }
  3318. } else {
  3319. //unselect selectall checkbox when deselecting a specific row
  3320. $t.setHeadCheckBox( false );
  3321. $t.p.selrow = pt.id;
  3322. ia = $.inArray($t.p.selrow,$t.p.selarrrow);
  3323. if ( ia === -1 ){
  3324. if(pt.className !== "ui-subgrid") { $(pt).addClass("ui-state-highlight").attr("aria-selected","true");}
  3325. stat = true;
  3326. $t.p.selarrrow.push($t.p.selrow);
  3327. } else {
  3328. if(pt.className !== "ui-subgrid") { $(pt).removeClass("ui-state-highlight").attr("aria-selected","false");}
  3329. stat = false;
  3330. $t.p.selarrrow.splice(ia,1);
  3331. tpsr = $t.p.selarrrow[0];
  3332. $t.p.selrow = (tpsr === undefined) ? null : tpsr;
  3333. }
  3334. $("#jqg_"+$.jgrid.jqID($t.p.id)+"_"+$.jgrid.jqID(pt.id))[$t.p.useProp ? 'prop': 'attr']("checked",stat);
  3335. if(fid) {
  3336. if(ia === -1) {
  3337. $("#"+$.jgrid.jqID(selection), "#"+$.jgrid.jqID(fid)).addClass("ui-state-highlight");
  3338. } else {
  3339. $("#"+$.jgrid.jqID(selection), "#"+$.jgrid.jqID(fid)).removeClass("ui-state-highlight");
  3340. }
  3341. $("#jqg_"+$.jgrid.jqID($t.p.id)+"_"+$.jgrid.jqID(selection), "#"+$.jgrid.jqID(fid))[$t.p.useProp ? 'prop': 'attr']("checked",stat);
  3342. }
  3343. if( onsr ) {
  3344. $($t).triggerHandler("jqGridSelectRow", [pt.id, stat, e]);
  3345. if( $t.p.onSelectRow) { $t.p.onSelectRow.call($t, pt.id , stat, e); }
  3346. }
  3347. }
  3348. });
  3349. },
  3350. resetSelection : function( rowid ){
  3351. return this.each(function(){
  3352. var t = this, sr, fid;
  3353. if( t.p.frozenColumns === true ) {
  3354. fid = t.p.id+"_frozen";
  3355. }
  3356. if(rowid !== undefined ) {
  3357. sr = rowid === t.p.selrow ? t.p.selrow : rowid;
  3358. $("#"+$.jgrid.jqID(t.p.id)+" tbody:first tr#"+$.jgrid.jqID(sr)).removeClass("ui-state-highlight").attr("aria-selected","false");
  3359. if (fid) { $("#"+$.jgrid.jqID(sr), "#"+$.jgrid.jqID(fid)).removeClass("ui-state-highlight"); }
  3360. if(t.p.multiselect) {
  3361. $("#jqg_"+$.jgrid.jqID(t.p.id)+"_"+$.jgrid.jqID(sr), "#"+$.jgrid.jqID(t.p.id))[t.p.useProp ? 'prop': 'attr']("checked",false);
  3362. if(fid) { $("#jqg_"+$.jgrid.jqID(t.p.id)+"_"+$.jgrid.jqID(sr), "#"+$.jgrid.jqID(fid))[t.p.useProp ? 'prop': 'attr']("checked",false); }
  3363. t.setHeadCheckBox( false);
  3364. var ia = $.inArray($.jgrid.jqID(sr), t.p.selarrrow);
  3365. if ( ia !== -1 ){
  3366. t.p.selarrrow.splice(ia,1);
  3367. }
  3368. }
  3369. sr = null;
  3370. } else if(!t.p.multiselect) {
  3371. if(t.p.selrow) {
  3372. $("#"+$.jgrid.jqID(t.p.id)+" tbody:first tr#"+$.jgrid.jqID(t.p.selrow)).removeClass("ui-state-highlight").attr("aria-selected","false");
  3373. if(fid) { $("#"+$.jgrid.jqID(t.p.selrow), "#"+$.jgrid.jqID(fid)).removeClass("ui-state-highlight"); }
  3374. t.p.selrow = null;
  3375. }
  3376. } else {
  3377. $(t.p.selarrrow).each(function(i,n){
  3378. $( $(t).jqGrid('getGridRowById',n) ).removeClass("ui-state-highlight").attr("aria-selected","false");
  3379. $("#jqg_"+$.jgrid.jqID(t.p.id)+"_"+$.jgrid.jqID(n))[t.p.useProp ? 'prop': 'attr']("checked",false);
  3380. if(fid) {
  3381. $("#"+$.jgrid.jqID(n), "#"+$.jgrid.jqID(fid)).removeClass("ui-state-highlight");
  3382. $("#jqg_"+$.jgrid.jqID(t.p.id)+"_"+$.jgrid.jqID(n), "#"+$.jgrid.jqID(fid))[t.p.useProp ? 'prop': 'attr']("checked",false);
  3383. }
  3384. });
  3385. t.setHeadCheckBox( false );
  3386. t.p.selarrrow = [];
  3387. t.p.selrow = null;
  3388. }
  3389. if(t.p.cellEdit === true) {
  3390. if(parseInt(t.p.iCol,10)>=0 && parseInt(t.p.iRow,10)>=0) {
  3391. $("td:eq("+t.p.iCol+")",t.rows[t.p.iRow]).removeClass("edit-cell ui-state-highlight");
  3392. $(t.rows[t.p.iRow]).removeClass("selected-row ui-state-hover");
  3393. }
  3394. }
  3395. t.p.savedRow = [];
  3396. });
  3397. },
  3398. getRowData : function( rowid, usedata ) {
  3399. var res = {}, resall, getall=false, len, j=0;
  3400. this.each(function(){
  3401. var $t = this,nm,ind;
  3402. if(rowid == null) {
  3403. getall = true;
  3404. resall = [];
  3405. len = $t.rows.length;
  3406. } else {
  3407. ind = $($t).jqGrid('getGridRowById', rowid);
  3408. if(!ind) { return res; }
  3409. len = 2;
  3410. }
  3411. if( !(usedata && usedata === true && $t.p.data.length > 0) ) {
  3412. usedata = false;
  3413. }
  3414. while(j<len){
  3415. if(getall) { ind = $t.rows[j]; }
  3416. if( $(ind).hasClass('jqgrow') ) {
  3417. if(usedata) {
  3418. res = $t.p.data[$t.p._index[ind.id]];
  3419. } else {
  3420. $('td[role="gridcell"]',ind).each( function(i) {
  3421. nm = $t.p.colModel[i].name;
  3422. if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') {
  3423. if($t.p.treeGrid===true && nm === $t.p.ExpandColumn) {
  3424. res[nm] = $.jgrid.htmlDecode($("span:first",this).html());
  3425. } else {
  3426. try {
  3427. res[nm] = $.unformat.call($t,this,{rowId:ind.id, colModel:$t.p.colModel[i]},i);
  3428. } catch (e){
  3429. res[nm] = $.jgrid.htmlDecode($(this).html());
  3430. }
  3431. }
  3432. }
  3433. });
  3434. }
  3435. if(getall) { resall.push(res); res={}; }
  3436. }
  3437. j++;
  3438. }
  3439. });
  3440. return resall || res;
  3441. },
  3442. delRowData : function(rowid) {
  3443. var success = false, rowInd, ia, nextRow;
  3444. this.each(function() {
  3445. var $t = this;
  3446. rowInd = $($t).jqGrid('getGridRowById', rowid);
  3447. if(!rowInd) {return false;}
  3448. if($t.p.subGrid) {
  3449. nextRow = $(rowInd).next();
  3450. if(nextRow.hasClass('ui-subgrid')) {
  3451. nextRow.remove();
  3452. }
  3453. }
  3454. $(rowInd).remove();
  3455. $t.p.records--;
  3456. $t.p.reccount--;
  3457. $t.updatepager(true,false);
  3458. success=true;
  3459. if($t.p.multiselect) {
  3460. ia = $.inArray(rowid,$t.p.selarrrow);
  3461. if(ia !== -1) { $t.p.selarrrow.splice(ia,1);}
  3462. }
  3463. if ($t.p.multiselect && $t.p.selarrrow.length > 0) {
  3464. $t.p.selrow = $t.p.selarrrow[$t.p.selarrrow.length-1];
  3465. } else {
  3466. $t.p.selrow = null;
  3467. }
  3468. if($t.p.datatype === 'local') {
  3469. var id = $.jgrid.stripPref($t.p.idPrefix, rowid),
  3470. pos = $t.p._index[id];
  3471. if(pos !== undefined) {
  3472. $t.p.data.splice(pos,1);
  3473. $t.refreshIndex();
  3474. }
  3475. }
  3476. if( $t.p.altRows === true && success ) {
  3477. var cn = $t.p.altclass;
  3478. $($t.rows).each(function(i){
  3479. if(i % 2 === 1) { $(this).addClass(cn); }
  3480. else { $(this).removeClass(cn); }
  3481. });
  3482. }
  3483. });
  3484. return success;
  3485. },
  3486. setRowData : function(rowid, data, cssp) {
  3487. var nm, success=true, title;
  3488. this.each(function(){
  3489. if(!this.grid) {return false;}
  3490. var t = this, vl, ind, cp = typeof cssp, lcdata={};
  3491. ind = $(this).jqGrid('getGridRowById', rowid);
  3492. if(!ind) { return false; }
  3493. if( data ) {
  3494. try {
  3495. $(this.p.colModel).each(function(i){
  3496. nm = this.name;
  3497. var dval =$.jgrid.getAccessor(data,nm);
  3498. if( dval !== undefined) {
  3499. lcdata[nm] = this.formatter && typeof this.formatter === 'string' && this.formatter === 'date' ? $.unformat.date.call(t,dval,this) : dval;
  3500. vl = t.formatter( rowid, lcdata[nm], i, data, 'edit');
  3501. title = this.title ? {"title":$.jgrid.stripHtml(vl)} : {};
  3502. if(t.p.treeGrid===true && nm === t.p.ExpandColumn) {
  3503. $("td[role='gridcell']:eq("+i+") > span:first",ind).html(vl).attr(title);
  3504. } else {
  3505. $("td[role='gridcell']:eq("+i+")",ind).html(vl).attr(title);
  3506. }
  3507. }
  3508. });
  3509. if(t.p.datatype === 'local') {
  3510. var id = $.jgrid.stripPref(t.p.idPrefix, rowid),
  3511. pos = t.p._index[id], key;
  3512. if(t.p.treeGrid) {
  3513. for(key in t.p.treeReader){
  3514. if(t.p.treeReader.hasOwnProperty(key)) {
  3515. delete lcdata[t.p.treeReader[key]];
  3516. }
  3517. }
  3518. }
  3519. if(pos !== undefined) {
  3520. t.p.data[pos] = $.extend(true, t.p.data[pos], lcdata);
  3521. }
  3522. lcdata = null;
  3523. }
  3524. } catch (e) {
  3525. success = false;
  3526. }
  3527. }
  3528. if(success) {
  3529. if(cp === 'string') {$(ind).addClass(cssp);} else if(cssp !== null && cp === 'object') {$(ind).css(cssp);}
  3530. $(t).triggerHandler("jqGridAfterGridComplete");
  3531. }
  3532. });
  3533. return success;
  3534. },
  3535. addRowData : function(rowid,rdata,pos,src) {
  3536. if(["first", "last", "before", "after"].indexOf(pos) == -1) {pos = "last";}
  3537. var success = false, nm, row, gi, si, ni,sind, i, v, prp="", aradd, cnm, cn, data, cm, id;
  3538. if(rdata) {
  3539. if($.isArray(rdata)) {
  3540. aradd=true;
  3541. //pos = "last";
  3542. cnm = rowid;
  3543. } else {
  3544. rdata = [rdata];
  3545. aradd = false;
  3546. }
  3547. this.each(function() {
  3548. var t = this, datalen = rdata.length;
  3549. ni = t.p.rownumbers===true ? 1 :0;
  3550. gi = t.p.multiselect ===true ? 1 :0;
  3551. si = t.p.subGrid===true ? 1 :0;
  3552. if(!aradd) {
  3553. if(rowid !== undefined) { rowid = String(rowid);}
  3554. else {
  3555. rowid = $.jgrid.randId();
  3556. if(t.p.keyName !== false) {
  3557. cnm = t.p.keyName;
  3558. if(rdata[0][cnm] !== undefined) { rowid = rdata[0][cnm]; }
  3559. }
  3560. }
  3561. }
  3562. cn = t.p.altclass;
  3563. var k = 0, cna ="", lcdata = {},
  3564. air = $.isFunction(t.p.afterInsertRow) ? true : false;
  3565. while(k < datalen) {
  3566. data = rdata[k];
  3567. row=[];
  3568. if(aradd) {
  3569. try {
  3570. rowid = data[cnm];
  3571. if(rowid===undefined) {
  3572. rowid = $.jgrid.randId();
  3573. }
  3574. }
  3575. catch (e) {rowid = $.jgrid.randId();}
  3576. cna = t.p.altRows === true ? (t.rows.length-1)%2 === 0 ? cn : "" : "";
  3577. }
  3578. id = rowid;
  3579. rowid = t.p.idPrefix + rowid;
  3580. if(ni){
  3581. prp = t.formatCol(0,1,'',null,rowid, true);
  3582. row[row.length] = "<td role=\"gridcell\" class=\"ui-state-default jqgrid-rownum\" "+prp+">0</td>";
  3583. }
  3584. if(gi) {
  3585. v = "<input role=\"checkbox\" type=\"checkbox\""+" id=\"jqg_"+t.p.id+"_"+rowid+"\" class=\"cbox\"/>";
  3586. prp = t.formatCol(ni,1,'', null, rowid, true);
  3587. row[row.length] = "<td role=\"gridcell\" "+prp+">"+v+"</td>";
  3588. }
  3589. if(si) {
  3590. row[row.length] = $(t).jqGrid("addSubGridCell",gi+ni,1);
  3591. }
  3592. for(i = gi+si+ni; i < t.p.colModel.length;i++){
  3593. cm = t.p.colModel[i];
  3594. nm = cm.name;
  3595. lcdata[nm] = data[nm];
  3596. v = t.formatter( rowid, $.jgrid.getAccessor(data,nm), i, data );
  3597. prp = t.formatCol(i,1,v, data, rowid, lcdata);
  3598. row[row.length] = "<td role=\"gridcell\" "+prp+">"+v+"</td>";
  3599. }
  3600. row.unshift( t.constructTr(rowid, false, cna, lcdata, data, false ) );
  3601. row[row.length] = "</tr>";
  3602. if(t.rows.length === 0){
  3603. $("table:first",t.grid.bDiv).append(row.join(''));
  3604. } else {
  3605. switch (pos) {
  3606. case 'last':
  3607. $(t.rows[t.rows.length-1]).after(row.join(''));
  3608. sind = t.rows.length-1;
  3609. break;
  3610. case 'first':
  3611. $(t.rows[0]).after(row.join(''));
  3612. sind = 1;
  3613. break;
  3614. case 'after':
  3615. sind = $(t).jqGrid('getGridRowById', src);
  3616. if (sind) {
  3617. if($(t.rows[sind.rowIndex+1]).hasClass("ui-subgrid")) { $(t.rows[sind.rowIndex+1]).after(row); }
  3618. else { $(sind).after(row.join('')); }
  3619. sind=sind.rowIndex + 1;
  3620. }
  3621. break;
  3622. case 'before':
  3623. sind = $(t).jqGrid('getGridRowById', src);
  3624. if(sind) {
  3625. $(sind).before(row.join(''));
  3626. sind=sind.rowIndex - 1;
  3627. }
  3628. break;
  3629. }
  3630. }
  3631. if(t.p.subGrid===true) {
  3632. $(t).jqGrid("addSubGrid",gi+ni, sind);
  3633. }
  3634. t.p.records++;
  3635. t.p.reccount++;
  3636. $(t).triggerHandler("jqGridAfterInsertRow", [rowid,data,data]);
  3637. if(air) { t.p.afterInsertRow.call(t,rowid,data,data); }
  3638. k++;
  3639. if(t.p.datatype === 'local') {
  3640. lcdata[t.p.localReader.id] = id;
  3641. t.p._index[id] = t.p.data.length;
  3642. t.p.data.push(lcdata);
  3643. lcdata = {};
  3644. }
  3645. }
  3646. if( t.p.altRows === true && !aradd) {
  3647. if (pos === "last") {
  3648. if ((t.rows.length-1)%2 === 1) {$(t.rows[t.rows.length-1]).addClass(cn);}
  3649. } else {
  3650. $(t.rows).each(function(i){
  3651. if(i % 2 ===1) { $(this).addClass(cn); }
  3652. else { $(this).removeClass(cn); }
  3653. });
  3654. }
  3655. }
  3656. t.updatepager(true,true);
  3657. success = true;
  3658. });
  3659. }
  3660. return success;
  3661. },
  3662. footerData : function(action,data, format) {
  3663. var nm, success=false, res={}, title;
  3664. function isEmpty(obj) {
  3665. var i;
  3666. for(i in obj) {
  3667. if (obj.hasOwnProperty(i)) { return false; }
  3668. }
  3669. return true;
  3670. }
  3671. if(action === undefined) { action = "get"; }
  3672. if(typeof format !== "boolean") { format = true; }
  3673. action = action.toLowerCase();
  3674. this.each(function(){
  3675. var t = this, vl;
  3676. if(!t.grid || !t.p.footerrow) {return false;}
  3677. if(action === "set") { if(isEmpty(data)) { return false; } }
  3678. success=true;
  3679. $(this.p.colModel).each(function(i){
  3680. nm = this.name;
  3681. if(action === "set") {
  3682. if( data[nm] !== undefined) {
  3683. vl = format ? t.formatter( "", data[nm], i, data, 'edit') : data[nm];
  3684. title = this.title ? {"title":$.jgrid.stripHtml(vl)} : {};
  3685. $("tr.footrow td:eq("+i+")",t.grid.sDiv).html(vl).attr(title);
  3686. success = true;
  3687. }
  3688. } else if(action === "get") {
  3689. res[nm] = $("tr.footrow td:eq("+i+")",t.grid.sDiv).html();
  3690. }
  3691. });
  3692. });
  3693. return action === "get" ? res : success;
  3694. },
  3695. showHideCol : function(colname,show) {
  3696. return this.each(function() {
  3697. var $t = this, fndh=false, brd=$.jgrid.cell_width ? 0: $t.p.cellLayout, cw;
  3698. if (!$t.grid ) {return;}
  3699. if( typeof colname === 'string') {colname=[colname];}
  3700. show = show !== "none" ? "" : "none";
  3701. var sw = show === "" ? true :false,
  3702. gh = $t.p.groupHeader && (typeof $t.p.groupHeader === 'object' || $.isFunction($t.p.groupHeader) );
  3703. if(gh) { $($t).jqGrid('destroyGroupHeader', false); }
  3704. $(this.p.colModel).each(function(i) {
  3705. if ($.inArray(this.name,colname) !== -1 && this.hidden === sw) {
  3706. if($t.p.frozenColumns === true && this.frozen === true) {
  3707. return true;
  3708. }
  3709. $("tr[role=row]",$t.grid.hDiv).each(function(){
  3710. $(this.cells[i]).css("display", show);
  3711. });
  3712. $($t.rows).each(function(){
  3713. if (!$(this).hasClass("jqgroup")) {
  3714. $(this.cells[i]).css("display", show);
  3715. }
  3716. });
  3717. if($t.p.footerrow) { $("tr.footrow td:eq("+i+")", $t.grid.sDiv).css("display", show); }
  3718. cw = parseInt(this.width,10);
  3719. if(show === "none") {
  3720. $t.p.tblwidth -= cw+brd;
  3721. } else {
  3722. $t.p.tblwidth += cw+brd;
  3723. }
  3724. this.hidden = !sw;
  3725. fndh=true;
  3726. $($t).triggerHandler("jqGridShowHideCol", [sw,this.name,i]);
  3727. }
  3728. });
  3729. if(fndh===true) {
  3730. if($t.p.shrinkToFit === true && !isNaN($t.p.height)) { $t.p.tblwidth += parseInt($t.p.scrollOffset,10);}
  3731. $($t).jqGrid("setGridWidth",$t.p.shrinkToFit === true ? $t.p.tblwidth : $t.p.width );
  3732. }
  3733. if( gh ) {
  3734. $($t).jqGrid('setGroupHeaders',$t.p.groupHeader);
  3735. }
  3736. });
  3737. },
  3738. hideCol : function (colname) {
  3739. return this.each(function(){$(this).jqGrid("showHideCol",colname,"none");});
  3740. },
  3741. showCol : function(colname) {
  3742. return this.each(function(){$(this).jqGrid("showHideCol",colname,"");});
  3743. },
  3744. remapColumns : function(permutation, updateCells, keepHeader) {
  3745. function resortArray(a) {
  3746. var ac;
  3747. if (a.length) {
  3748. ac = $.makeArray(a);
  3749. } else {
  3750. ac = $.extend({}, a);
  3751. }
  3752. $.each(permutation, function(i) {
  3753. a[i] = ac[this];
  3754. });
  3755. }
  3756. var ts = this.get(0);
  3757. function resortRows(parent, clobj) {
  3758. $(">tr"+(clobj||""), parent).each(function() {
  3759. var row = this;
  3760. var elems = $.makeArray(row.cells);
  3761. $.each(permutation, function() {
  3762. var e = elems[this];
  3763. if (e) {
  3764. row.appendChild(e);
  3765. }
  3766. });
  3767. });
  3768. }
  3769. resortArray(ts.p.colModel);
  3770. resortArray(ts.p.colNames);
  3771. resortArray(ts.grid.headers);
  3772. resortRows($("thead:first", ts.grid.hDiv), keepHeader && ":not(.ui-jqgrid-labels)");
  3773. if (updateCells) {
  3774. resortRows($("#"+$.jgrid.jqID(ts.p.id)+" tbody:first"), ".jqgfirstrow, tr.jqgrow, tr.jqfoot");
  3775. }
  3776. if (ts.p.footerrow) {
  3777. resortRows($("tbody:first", ts.grid.sDiv));
  3778. }
  3779. if (ts.p.remapColumns) {
  3780. if (!ts.p.remapColumns.length){
  3781. ts.p.remapColumns = $.makeArray(permutation);
  3782. } else {
  3783. resortArray(ts.p.remapColumns);
  3784. }
  3785. }
  3786. ts.p.lastsort = $.inArray(ts.p.lastsort, permutation);
  3787. if(ts.p.treeGrid) { ts.p.expColInd = $.inArray(ts.p.expColInd, permutation); }
  3788. $(ts).triggerHandler("jqGridRemapColumns", [permutation, updateCells, keepHeader]);
  3789. },
  3790. setGridWidth : function(nwidth, shrink) {
  3791. return this.each(function(){
  3792. if (!this.grid ) {return;}
  3793. var $t = this, cw,
  3794. initwidth = 0, brd=$.jgrid.cell_width ? 0: $t.p.cellLayout, lvc, vc=0, hs=false, scw=$t.p.scrollOffset, aw, gw=0, cr;
  3795. if(typeof shrink !== 'boolean') {
  3796. shrink=$t.p.shrinkToFit;
  3797. }
  3798. if(isNaN(nwidth)) {return;}
  3799. nwidth = parseInt(nwidth,10);
  3800. $t.grid.width = $t.p.width = nwidth;
  3801. $("#gbox_"+$.jgrid.jqID($t.p.id)).css("width",nwidth+"px");
  3802. $("#gview_"+$.jgrid.jqID($t.p.id)).css("width",nwidth+"px");
  3803. $($t.grid.bDiv).css("width",nwidth+"px");
  3804. $($t.grid.hDiv).css("width",nwidth+"px");
  3805. if($t.p.pager ) {$($t.p.pager).css("width",nwidth+"px");}
  3806. if($t.p.toppager ) {$($t.p.toppager).css("width",nwidth+"px");}
  3807. if($t.p.toolbar[0] === true){
  3808. $($t.grid.uDiv).css("width",nwidth+"px");
  3809. if($t.p.toolbar[1]==="both") {$($t.grid.ubDiv).css("width",nwidth+"px");}
  3810. }
  3811. if($t.p.footerrow) { $($t.grid.sDiv).css("width",nwidth+"px"); }
  3812. if(shrink ===false && $t.p.forceFit === true) {$t.p.forceFit=false;}
  3813. if(shrink===true) {
  3814. $.each($t.p.colModel, function() {
  3815. if(this.hidden===false){
  3816. cw = this.widthOrg;
  3817. initwidth += cw+brd;
  3818. if(this.fixed) {
  3819. gw += cw+brd;
  3820. } else {
  3821. vc++;
  3822. }
  3823. }
  3824. });
  3825. if(vc === 0) { return; }
  3826. $t.p.tblwidth = initwidth;
  3827. aw = nwidth-brd*vc-gw;
  3828. if(!isNaN($t.p.height)) {
  3829. if($($t.grid.bDiv)[0].clientHeight < $($t.grid.bDiv)[0].scrollHeight || $t.rows.length === 1){
  3830. hs = true;
  3831. aw -= scw;
  3832. }
  3833. }
  3834. initwidth =0;
  3835. var cle = $t.grid.cols.length >0;
  3836. $.each($t.p.colModel, function(i) {
  3837. if(this.hidden === false && !this.fixed){
  3838. cw = this.widthOrg;
  3839. cw = Math.round(aw*cw/($t.p.tblwidth-brd*vc-gw));
  3840. if (cw < 0) { return; }
  3841. this.width =cw;
  3842. initwidth += cw;
  3843. $t.grid.headers[i].width=cw;
  3844. $t.grid.headers[i].el.style.width=cw+"px";
  3845. if($t.p.footerrow) { $t.grid.footers[i].style.width = cw+"px"; }
  3846. if(cle) { $t.grid.cols[i].style.width = cw+"px"; }
  3847. lvc = i;
  3848. }
  3849. });
  3850. if (!lvc) { return; }
  3851. cr =0;
  3852. if (hs) {
  3853. if(nwidth-gw-(initwidth+brd*vc) !== scw){
  3854. cr = nwidth-gw-(initwidth+brd*vc)-scw;
  3855. }
  3856. } else if( Math.abs(nwidth-gw-(initwidth+brd*vc)) !== 1) {
  3857. cr = nwidth-gw-(initwidth+brd*vc);
  3858. }
  3859. $t.p.colModel[lvc].width += cr;
  3860. $t.p.tblwidth = initwidth+cr+brd*vc+gw;
  3861. if($t.p.tblwidth > nwidth) {
  3862. var delta = $t.p.tblwidth - parseInt(nwidth,10);
  3863. $t.p.tblwidth = nwidth;
  3864. cw = $t.p.colModel[lvc].width = $t.p.colModel[lvc].width-delta;
  3865. } else {
  3866. cw= $t.p.colModel[lvc].width;
  3867. }
  3868. $t.grid.headers[lvc].width = cw;
  3869. $t.grid.headers[lvc].el.style.width=cw+"px";
  3870. if(cle) { $t.grid.cols[lvc].style.width = cw+"px"; }
  3871. if($t.p.footerrow) {
  3872. $t.grid.footers[lvc].style.width = cw+"px";
  3873. }
  3874. }
  3875. if($t.p.tblwidth) {
  3876. $('table:first',$t.grid.bDiv).css("width",$t.p.tblwidth+"px");
  3877. $('table:first',$t.grid.hDiv).css("width",$t.p.tblwidth+"px");
  3878. $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;
  3879. if($t.p.footerrow) {
  3880. $('table:first',$t.grid.sDiv).css("width",$t.p.tblwidth+"px");
  3881. }
  3882. }
  3883. });
  3884. },
  3885. setGridHeight : function (nh) {
  3886. return this.each(function (){
  3887. var $t = this;
  3888. if(!$t.grid) {return;}
  3889. var bDiv = $($t.grid.bDiv);
  3890. bDiv.css({height: nh+(isNaN(nh)?"":"px")});
  3891. if($t.p.frozenColumns === true){
  3892. //follow the original set height to use 16, better scrollbar width detection
  3893. $('#'+$.jgrid.jqID($t.p.id)+"_frozen").parent().height(bDiv.height() - 16);
  3894. }
  3895. $t.p.height = nh;
  3896. if ($t.p.scroll) { $t.grid.populateVisible(); }
  3897. });
  3898. },
  3899. setCaption : function (newcap){
  3900. return this.each(function(){
  3901. this.p.caption=newcap;
  3902. $("span.ui-jqgrid-title, span.ui-jqgrid-title-rtl",this.grid.cDiv).html(newcap);
  3903. $(this.grid.cDiv).show();
  3904. $(this.grid.hDiv).removeClass('ui-corner-top');
  3905. });
  3906. },
  3907. setLabel : function(colname, nData, prop, attrp ){
  3908. return this.each(function(){
  3909. var $t = this, pos=-1;
  3910. if(!$t.grid) {return;}
  3911. if(colname !== undefined) {
  3912. $($t.p.colModel).each(function(i){
  3913. if (this.name === colname) {
  3914. pos = i;return false;
  3915. }
  3916. });
  3917. } else { return; }
  3918. if(pos>=0) {
  3919. var thecol = $("tr.ui-jqgrid-labels th:eq("+pos+")",$t.grid.hDiv);
  3920. if (nData){
  3921. var ico = $(".s-ico",thecol);
  3922. $("[id^=jqgh_]",thecol).empty().html(nData).append(ico);
  3923. $t.p.colNames[pos] = nData;
  3924. }
  3925. if (prop) {
  3926. if(typeof prop === 'string') {$(thecol).addClass(prop);} else {$(thecol).css(prop);}
  3927. }
  3928. if(typeof attrp === 'object') {$(thecol).attr(attrp);}
  3929. }
  3930. });
  3931. },
  3932. setCell : function(rowid,colname,nData,cssp,attrp, forceupd) {
  3933. return this.each(function(){
  3934. var $t = this, pos =-1,v, title;
  3935. if(!$t.grid) {return;}
  3936. if(isNaN(colname)) {
  3937. $($t.p.colModel).each(function(i){
  3938. if (this.name === colname) {
  3939. pos = i;return false;
  3940. }
  3941. });
  3942. } else {pos = parseInt(colname,10);}
  3943. if(pos>=0) {
  3944. var ind = $($t).jqGrid('getGridRowById', rowid);
  3945. if (ind){
  3946. var tcell = $("td:eq("+pos+")",ind), cl=0, rawdat=[];
  3947. if(nData !== "" || forceupd === true ) {
  3948. if(ind.cells !== undefined) {
  3949. while(cl<ind.cells.length) {
  3950. // slow down speed
  3951. rawdat.push(ind.cells[cl].innerHTML);
  3952. cl++;
  3953. }
  3954. }
  3955. v = $t.formatter(rowid, nData, pos, rawdat, 'edit');
  3956. title = $t.p.colModel[pos].title ? {"title":$.jgrid.stripHtml(v)} : {};
  3957. if($t.p.treeGrid && $(".tree-wrap",$(tcell)).length>0) {
  3958. $("span",$(tcell)).html(v).attr(title);
  3959. } else {
  3960. $(tcell).html(v).attr(title);
  3961. }
  3962. if($t.p.datatype === "local") {
  3963. var cm = $t.p.colModel[pos], index;
  3964. nData = cm.formatter && typeof cm.formatter === 'string' && cm.formatter === 'date' ? $.unformat.date.call($t,nData,cm) : nData;
  3965. index = $t.p._index[$.jgrid.stripPref($t.p.idPrefix, rowid)];
  3966. if(index !== undefined) {
  3967. $t.p.data[index][cm.name] = nData;
  3968. }
  3969. }
  3970. }
  3971. if(typeof cssp === 'string'){
  3972. $(tcell).addClass(cssp);
  3973. } else if(cssp) {
  3974. $(tcell).css(cssp);
  3975. }
  3976. if(typeof attrp === 'object') {$(tcell).attr(attrp);}
  3977. }
  3978. }
  3979. });
  3980. },
  3981. getCell : function(rowid,col) {
  3982. var ret = false;
  3983. this.each(function(){
  3984. var $t=this, pos=-1;
  3985. if(!$t.grid) {return;}
  3986. if(isNaN(col)) {
  3987. $($t.p.colModel).each(function(i){
  3988. if (this.name === col) {
  3989. pos = i;return false;
  3990. }
  3991. });
  3992. } else {pos = parseInt(col,10);}
  3993. if(pos>=0) {
  3994. var ind = $($t).jqGrid('getGridRowById', rowid);
  3995. if(ind) {
  3996. try {
  3997. ret = $.unformat.call($t,$("td:eq("+pos+")",ind),{rowId:ind.id, colModel:$t.p.colModel[pos]},pos);
  3998. } catch (e){
  3999. ret = $.jgrid.htmlDecode($("td:eq("+pos+")",ind).html());
  4000. }
  4001. }
  4002. }
  4003. });
  4004. return ret;
  4005. },
  4006. getCol : function (col, obj, mathopr) {
  4007. var ret = [], val, sum=0, min, max, v;
  4008. obj = typeof obj !== 'boolean' ? false : obj;
  4009. if(mathopr === undefined) { mathopr = false; }
  4010. this.each(function(){
  4011. var $t=this, pos=-1;
  4012. if(!$t.grid) {return;}
  4013. if(isNaN(col)) {
  4014. $($t.p.colModel).each(function(i){
  4015. if (this.name === col) {
  4016. pos = i;return false;
  4017. }
  4018. });
  4019. } else {pos = parseInt(col,10);}
  4020. if(pos>=0) {
  4021. var ln = $t.rows.length, i =0, dlen=0;
  4022. if (ln && ln>0){
  4023. while(i<ln){
  4024. if($($t.rows[i]).hasClass('jqgrow')) {
  4025. try {
  4026. val = $.unformat.call($t,$($t.rows[i].cells[pos]),{rowId:$t.rows[i].id, colModel:$t.p.colModel[pos]},pos);
  4027. } catch (e) {
  4028. val = $.jgrid.htmlDecode($t.rows[i].cells[pos].innerHTML);
  4029. }
  4030. if(mathopr) {
  4031. v = parseFloat(val);
  4032. if(!isNaN(v)) {
  4033. sum += v;
  4034. if (max === undefined) {max = min = v;}
  4035. min = Math.min(min, v);
  4036. max = Math.max(max, v);
  4037. dlen++;
  4038. }
  4039. }
  4040. else if(obj) { ret.push( {id:$t.rows[i].id,value:val} ); }
  4041. else { ret.push( val ); }
  4042. }
  4043. i++;
  4044. }
  4045. if(mathopr) {
  4046. switch(mathopr.toLowerCase()){
  4047. case 'sum': ret =sum; break;
  4048. case 'avg': ret = sum/dlen; break;
  4049. case 'count': ret = (ln-1); break;
  4050. case 'min': ret = min; break;
  4051. case 'max': ret = max; break;
  4052. }
  4053. }
  4054. }
  4055. }
  4056. });
  4057. return ret;
  4058. },
  4059. clearGridData : function(clearfooter) {
  4060. return this.each(function(){
  4061. var $t = this;
  4062. if(!$t.grid) {return;}
  4063. if(typeof clearfooter !== 'boolean') { clearfooter = false; }
  4064. if($t.p.deepempty) {$("#"+$.jgrid.jqID($t.p.id)+" tbody:first tr:gt(0)").remove();}
  4065. else {
  4066. var trf = $("#"+$.jgrid.jqID($t.p.id)+" tbody:first tr:first")[0];
  4067. $("#"+$.jgrid.jqID($t.p.id)+" tbody:first").empty().append(trf);
  4068. }
  4069. if($t.p.footerrow && clearfooter) { $(".ui-jqgrid-ftable td",$t.grid.sDiv).html("&#160;"); }
  4070. $t.p.selrow = null; $t.p.selarrrow= []; $t.p.savedRow = [];
  4071. $t.p.records = 0;$t.p.page=1;$t.p.lastpage=0;$t.p.reccount=0;
  4072. $t.p.data = []; $t.p._index = {};
  4073. $t.updatepager(true,false);
  4074. });
  4075. },
  4076. getInd : function(rowid,rc){
  4077. var ret =false,rw;
  4078. this.each(function(){
  4079. rw = $(this).jqGrid('getGridRowById', rowid);
  4080. if(rw) {
  4081. ret = rc===true ? rw: rw.rowIndex;
  4082. }
  4083. });
  4084. return ret;
  4085. },
  4086. bindKeys : function( settings ){
  4087. var o = $.extend({
  4088. onEnter: null,
  4089. onSpace: null,
  4090. onLeftKey: null,
  4091. onRightKey: null,
  4092. scrollingRows : true
  4093. },settings || {});
  4094. return this.each(function(){
  4095. var $t = this;
  4096. if( !$('body').is('[role]') ){$('body').attr('role','application');}
  4097. $t.p.scrollrows = o.scrollingRows;
  4098. $($t).keydown(function(event){
  4099. var target = $($t).find('tr[tabindex=0]')[0], id, r, mind,
  4100. expanded = $t.p.treeReader.expanded_field;
  4101. //check for arrow keys
  4102. if(target) {
  4103. mind = $t.p._index[$.jgrid.stripPref($t.p.idPrefix, target.id)];
  4104. if(event.keyCode === 37 || event.keyCode === 38 || event.keyCode === 39 || event.keyCode === 40){
  4105. // up key
  4106. if(event.keyCode === 38 ){
  4107. r = target.previousSibling;
  4108. id = "";
  4109. if(r) {
  4110. if($(r).is(":hidden")) {
  4111. while(r) {
  4112. r = r.previousSibling;
  4113. if(!$(r).is(":hidden") && $(r).hasClass('jqgrow')) {id = r.id;break;}
  4114. }
  4115. } else {
  4116. id = r.id;
  4117. }
  4118. }
  4119. $($t).jqGrid('setSelection', id, true, event);
  4120. event.preventDefault();
  4121. }
  4122. //if key is down arrow
  4123. if(event.keyCode === 40){
  4124. r = target.nextSibling;
  4125. id ="";
  4126. if(r) {
  4127. if($(r).is(":hidden")) {
  4128. while(r) {
  4129. r = r.nextSibling;
  4130. if(!$(r).is(":hidden") && $(r).hasClass('jqgrow') ) {id = r.id;break;}
  4131. }
  4132. } else {
  4133. id = r.id;
  4134. }
  4135. }
  4136. $($t).jqGrid('setSelection', id, true, event);
  4137. event.preventDefault();
  4138. }
  4139. // left
  4140. if(event.keyCode === 37 ){
  4141. if($t.p.treeGrid && $t.p.data[mind][expanded]) {
  4142. $(target).find("div.treeclick").trigger('click');
  4143. }
  4144. $($t).triggerHandler("jqGridKeyLeft", [$t.p.selrow]);
  4145. if($.isFunction(o.onLeftKey)) {
  4146. o.onLeftKey.call($t, $t.p.selrow);
  4147. }
  4148. }
  4149. // right
  4150. if(event.keyCode === 39 ){
  4151. if($t.p.treeGrid && !$t.p.data[mind][expanded]) {
  4152. $(target).find("div.treeclick").trigger('click');
  4153. }
  4154. $($t).triggerHandler("jqGridKeyRight", [$t.p.selrow]);
  4155. if($.isFunction(o.onRightKey)) {
  4156. o.onRightKey.call($t, $t.p.selrow);
  4157. }
  4158. }
  4159. }
  4160. //check if enter was pressed on a grid or treegrid node
  4161. else if( event.keyCode === 13 ){
  4162. $($t).triggerHandler("jqGridKeyEnter", [$t.p.selrow]);
  4163. if($.isFunction(o.onEnter)) {
  4164. o.onEnter.call($t, $t.p.selrow);
  4165. }
  4166. } else if(event.keyCode === 32) {
  4167. $($t).triggerHandler("jqGridKeySpace", [$t.p.selrow]);
  4168. if($.isFunction(o.onSpace)) {
  4169. o.onSpace.call($t, $t.p.selrow);
  4170. }
  4171. }
  4172. }
  4173. });
  4174. });
  4175. },
  4176. unbindKeys : function(){
  4177. return this.each(function(){
  4178. $(this).unbind('keydown');
  4179. });
  4180. },
  4181. getLocalRow : function (rowid) {
  4182. var ret = false, ind;
  4183. this.each(function(){
  4184. if(rowid !== undefined) {
  4185. ind = this.p._index[$.jgrid.stripPref(this.p.idPrefix, rowid)];
  4186. if(ind >= 0 ) {
  4187. ret = this.p.data[ind];
  4188. }
  4189. }
  4190. });
  4191. return ret;
  4192. },
  4193. progressBar : function ( p ) {
  4194. p = $.extend({
  4195. htmlcontent : "",
  4196. method : "hide",
  4197. loadtype : "disable"
  4198. }, p || {});
  4199. return this.each(function(){
  4200. var sh = p.method==="show" ? true : false;
  4201. if(p.htmlcontent !== "") {
  4202. $("#load_"+$.jgrid.jqID(this.p.id)).html( p.htmlcontent );
  4203. }
  4204. switch(p.loadtype) {
  4205. case "disable":
  4206. break;
  4207. case "enable":
  4208. $("#load_"+$.jgrid.jqID(this.p.id)).toggle( sh );
  4209. break;
  4210. case "block":
  4211. $("#lui_"+$.jgrid.jqID(this.p.id)).toggle( sh );
  4212. $("#load_"+$.jgrid.jqID(this.p.id)).toggle( sh );
  4213. break;
  4214. }
  4215. });
  4216. },
  4217. getColProp : function(colname){
  4218. var ret ={}, $t = this[0];
  4219. if ( !$t.grid ) { return false; }
  4220. var cM = $t.p.colModel, i;
  4221. for ( i=0;i<cM.length;i++ ) {
  4222. if ( cM[i].name === colname ) {
  4223. ret = cM[i];
  4224. break;
  4225. }
  4226. }
  4227. return ret;
  4228. },
  4229. setColProp : function(colname, obj){
  4230. //do not set width will not work
  4231. return this.each(function(){
  4232. if ( this.grid ) {
  4233. if ( obj ) {
  4234. var cM = this.p.colModel, i;
  4235. for ( i=0;i<cM.length;i++ ) {
  4236. if ( cM[i].name === colname ) {
  4237. $.extend(true, this.p.colModel[i],obj);
  4238. break;
  4239. }
  4240. }
  4241. }
  4242. }
  4243. });
  4244. },
  4245. sortGrid : function(colname,reload, sor){
  4246. return this.each(function(){
  4247. var $t=this,idx=-1,i, sobj=false;
  4248. if ( !$t.grid ) { return;}
  4249. if ( !colname ) { colname = $t.p.sortname; }
  4250. for ( i=0;i<$t.p.colModel.length;i++ ) {
  4251. if ( $t.p.colModel[i].index === colname || $t.p.colModel[i].name === colname ) {
  4252. idx = i;
  4253. if($t.p.frozenColumns === true && $t.p.colModel[i].frozen === true) {
  4254. sobj = $t.grid.fhDiv.find("#" + $t.p.id + "_" + colname);
  4255. }
  4256. break;
  4257. }
  4258. }
  4259. if ( idx !== -1 ){
  4260. var sort = $t.p.colModel[idx].sortable;
  4261. if(!sobj) {
  4262. sobj = $t.grid.headers[idx].el;
  4263. }
  4264. if ( typeof sort !== 'boolean' ) { sort = true; }
  4265. if ( typeof reload !=='boolean' ) { reload = false; }
  4266. if ( sort ) { $t.sortData("jqgh_"+$t.p.id+"_" + colname, idx, reload, sor, sobj); }
  4267. }
  4268. });
  4269. },
  4270. setGridState : function(state) {
  4271. return this.each(function(){
  4272. if ( !this.grid ) {return;}
  4273. var $t = this;
  4274. if(state === 'hidden'){
  4275. $(".ui-jqgrid-bdiv, .ui-jqgrid-hdiv","#gview_"+$.jgrid.jqID($t.p.id)).slideUp("fast");
  4276. if($t.p.pager) {$($t.p.pager).slideUp("fast");}
  4277. if($t.p.toppager) {$($t.p.toppager).slideUp("fast");}
  4278. if($t.p.toolbar[0]===true) {
  4279. if( $t.p.toolbar[1] === 'both') {
  4280. $($t.grid.ubDiv).slideUp("fast");
  4281. }
  4282. $($t.grid.uDiv).slideUp("fast");
  4283. }
  4284. if($t.p.footerrow) { $(".ui-jqgrid-sdiv","#gbox_"+$.jgrid.jqID($t.p.id)).slideUp("fast"); }
  4285. $(".ui-jqgrid-titlebar-close span",$t.grid.cDiv).removeClass("ui-icon-circle-triangle-n").addClass("ui-icon-circle-triangle-s");
  4286. $t.p.gridstate = 'hidden';
  4287. } else if(state === 'visible') {
  4288. $(".ui-jqgrid-hdiv, .ui-jqgrid-bdiv","#gview_"+$.jgrid.jqID($t.p.id)).slideDown("fast");
  4289. if($t.p.pager) {$($t.p.pager).slideDown("fast");}
  4290. if($t.p.toppager) {$($t.p.toppager).slideDown("fast");}
  4291. if($t.p.toolbar[0]===true) {
  4292. if( $t.p.toolbar[1] === 'both') {
  4293. $($t.grid.ubDiv).slideDown("fast");
  4294. }
  4295. $($t.grid.uDiv).slideDown("fast");
  4296. }
  4297. if($t.p.footerrow) { $(".ui-jqgrid-sdiv","#gbox_"+$.jgrid.jqID($t.p.id)).slideDown("fast"); }
  4298. $(".ui-jqgrid-titlebar-close span",$t.grid.cDiv).removeClass("ui-icon-circle-triangle-s").addClass("ui-icon-circle-triangle-n");
  4299. $t.p.gridstate = 'visible';
  4300. }
  4301. });
  4302. },
  4303. setFrozenColumns : function () {
  4304. return this.each(function() {
  4305. if ( !this.grid ) {return;}
  4306. var $t = this, cm = $t.p.colModel,i=0, len = cm.length, maxfrozen = -1, frozen= false;
  4307. // TODO treeGrid and grouping Support
  4308. if($t.p.subGrid === true || $t.p.treeGrid === true || $t.p.cellEdit === true || $t.p.sortable || $t.p.scroll )
  4309. {
  4310. return;
  4311. }
  4312. if($t.p.rownumbers) { i++; }
  4313. if($t.p.multiselect) { i++; }
  4314. // get the max index of frozen col
  4315. while(i<len)
  4316. {
  4317. // from left, no breaking frozen
  4318. if(cm[i].frozen === true)
  4319. {
  4320. frozen = true;
  4321. maxfrozen = i;
  4322. } else {
  4323. break;
  4324. }
  4325. i++;
  4326. }
  4327. if( maxfrozen>=0 && frozen) {
  4328. var top = $t.p.caption ? $($t.grid.cDiv).outerHeight() : 0,
  4329. hth = $(".ui-jqgrid-htable","#gview_"+$.jgrid.jqID($t.p.id)).height();
  4330. //headers
  4331. if($t.p.toppager) {
  4332. top = top + $($t.grid.topDiv).outerHeight();
  4333. }
  4334. if($t.p.toolbar[0] === true) {
  4335. if($t.p.toolbar[1] !== "bottom") {
  4336. top = top + $($t.grid.uDiv).outerHeight();
  4337. }
  4338. }
  4339. $t.grid.fhDiv = $('<div style="position:absolute;left:0px;top:'+top+'px;height:'+hth+'px;" class="frozen-div ui-state-default ui-jqgrid-hdiv"></div>');
  4340. $t.grid.fbDiv = $('<div style="position:absolute;left:0px;top:'+(parseInt(top,10)+parseInt(hth,10) + 1)+'px;overflow-y:hidden" class="frozen-bdiv ui-jqgrid-bdiv"></div>');
  4341. $("#gview_"+$.jgrid.jqID($t.p.id)).append($t.grid.fhDiv);
  4342. var htbl = $(".ui-jqgrid-htable","#gview_"+$.jgrid.jqID($t.p.id)).clone(true);
  4343. // groupheader support - only if useColSpanstyle is false
  4344. if($t.p.groupHeader) {
  4345. $("tr.jqg-first-row-header, tr.jqg-third-row-header", htbl).each(function(){
  4346. $("th:gt("+maxfrozen+")",this).remove();
  4347. });
  4348. var swapfroz = -1, fdel = -1, cs, rs;
  4349. $("tr.jqg-second-row-header th", htbl).each(function(){
  4350. cs= parseInt($(this).attr("colspan"),10);
  4351. rs= parseInt($(this).attr("rowspan"),10);
  4352. if(rs) {
  4353. swapfroz++;
  4354. fdel++;
  4355. }
  4356. if(cs) {
  4357. swapfroz = swapfroz+cs;
  4358. fdel++;
  4359. }
  4360. if(swapfroz === maxfrozen) {
  4361. return false;
  4362. }
  4363. });
  4364. if(swapfroz !== maxfrozen) {
  4365. fdel = maxfrozen;
  4366. }
  4367. $("tr.jqg-second-row-header", htbl).each(function(){
  4368. $("th:gt("+fdel+")",this).remove();
  4369. });
  4370. } else {
  4371. $("tr",htbl).each(function(){
  4372. $("th:gt("+maxfrozen+")",this).remove();
  4373. });
  4374. }
  4375. $(htbl).width(1);
  4376. // resizing stuff
  4377. $($t.grid.fhDiv).append(htbl)
  4378. .mousemove(function (e) {
  4379. if($t.grid.resizing){ $t.grid.dragMove(e);return false; }
  4380. });
  4381. if($t.p.footerrow) {
  4382. var hbd = $(".ui-jqgrid-bdiv","#gview_"+$.jgrid.jqID($t.p.id)).height();
  4383. $t.grid.fsDiv = $('<div style="position:absolute;left:0px;top:'+(parseInt(top,10)+parseInt(hth,10) + parseInt(hbd,10)+1)+'px;" class="frozen-sdiv ui-jqgrid-sdiv"></div>');
  4384. $("#gview_"+$.jgrid.jqID($t.p.id)).append($t.grid.fsDiv);
  4385. var ftbl = $(".ui-jqgrid-ftable","#gview_"+$.jgrid.jqID($t.p.id)).clone(true);
  4386. $("tr",ftbl).each(function(){
  4387. $("td:gt("+maxfrozen+")",this).remove();
  4388. });
  4389. $(ftbl).width(1);
  4390. $($t.grid.fsDiv).append(ftbl);
  4391. }
  4392. $($t).bind('jqGridResizeStop.setFrozenColumns', function (e, w, index) {
  4393. var rhth = $(".ui-jqgrid-htable",$t.grid.fhDiv);
  4394. $("th:eq("+index+")",rhth).width( w );
  4395. var btd = $(".ui-jqgrid-btable",$t.grid.fbDiv);
  4396. $("tr:first td:eq("+index+")",btd).width( w );
  4397. if($t.p.footerrow) {
  4398. var ftd = $(".ui-jqgrid-ftable",$t.grid.fsDiv);
  4399. $("tr:first td:eq("+index+")",ftd).width( w );
  4400. }
  4401. });
  4402. // sorting stuff
  4403. $($t).bind('jqGridSortCol.setFrozenColumns', function (e, index, idxcol) {
  4404. var previousSelectedTh = $("tr.ui-jqgrid-labels:last th:eq("+$t.p.lastsort+")",$t.grid.fhDiv), newSelectedTh = $("tr.ui-jqgrid-labels:last th:eq("+idxcol+")",$t.grid.fhDiv);
  4405. $("span.ui-grid-ico-sort",previousSelectedTh).addClass('ui-state-disabled');
  4406. $(previousSelectedTh).attr("aria-selected","false");
  4407. $("span.ui-icon-"+$t.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');
  4408. $(newSelectedTh).attr("aria-selected","true");
  4409. if(!$t.p.viewsortcols[0]) {
  4410. if($t.p.lastsort !== idxcol) {
  4411. $("span.s-ico",previousSelectedTh).hide();
  4412. $("span.s-ico",newSelectedTh).show();
  4413. }
  4414. }
  4415. });
  4416. // data stuff
  4417. //TODO support for setRowData
  4418. $("#gview_"+$.jgrid.jqID($t.p.id)).append($t.grid.fbDiv);
  4419. $($t.grid.bDiv).scroll(function () {
  4420. $($t.grid.fbDiv).scrollTop($(this).scrollTop());
  4421. });
  4422. if($t.p.hoverrows === true) {
  4423. $("#"+$.jgrid.jqID($t.p.id)).unbind('mouseover').unbind('mouseout');
  4424. }
  4425. $($t).bind('jqGridAfterGridComplete.setFrozenColumns', function () {
  4426. $("#"+$.jgrid.jqID($t.p.id)+"_frozen").remove();
  4427. $($t.grid.fbDiv).height($($t.grid.bDiv).height()-16);
  4428. var btbl = $("#"+$.jgrid.jqID($t.p.id)).clone(true);
  4429. $("tr[role=row]",btbl).each(function(){
  4430. $("td[role=gridcell]:gt("+maxfrozen+")",this).remove();
  4431. });
  4432. $(btbl).width(1).attr("id",$t.p.id+"_frozen");
  4433. $($t.grid.fbDiv).append(btbl);
  4434. if($t.p.hoverrows === true) {
  4435. $("tr.jqgrow", btbl).hover(
  4436. function(){ $(this).addClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)).addClass("ui-state-hover"); },
  4437. function(){ $(this).removeClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)).removeClass("ui-state-hover"); }
  4438. );
  4439. $("tr.jqgrow", "#"+$.jgrid.jqID($t.p.id)).hover(
  4440. function(){ $(this).addClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)+"_frozen").addClass("ui-state-hover");},
  4441. function(){ $(this).removeClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)+"_frozen").removeClass("ui-state-hover"); }
  4442. );
  4443. }
  4444. btbl=null;
  4445. });
  4446. if(!$t.grid.hDiv.loading) {
  4447. $($t).triggerHandler("jqGridAfterGridComplete");
  4448. }
  4449. $t.p.frozenColumns = true;
  4450. }
  4451. });
  4452. },
  4453. destroyFrozenColumns : function() {
  4454. return this.each(function() {
  4455. if ( !this.grid ) {return;}
  4456. if(this.p.frozenColumns === true) {
  4457. var $t = this;
  4458. $($t.grid.fhDiv).remove();
  4459. $($t.grid.fbDiv).remove();
  4460. $t.grid.fhDiv = null; $t.grid.fbDiv=null;
  4461. if($t.p.footerrow) {
  4462. $($t.grid.fsDiv).remove();
  4463. $t.grid.fsDiv = null;
  4464. }
  4465. $(this).unbind('.setFrozenColumns');
  4466. if($t.p.hoverrows === true) {
  4467. var ptr;
  4468. $("#"+$.jgrid.jqID($t.p.id)).bind('mouseover',function(e) {
  4469. ptr = $(e.target).closest("tr.jqgrow");
  4470. if($(ptr).attr("class") !== "ui-subgrid") {
  4471. $(ptr).addClass("ui-state-hover");
  4472. }
  4473. }).bind('mouseout',function(e) {
  4474. ptr = $(e.target).closest("tr.jqgrow");
  4475. $(ptr).removeClass("ui-state-hover");
  4476. });
  4477. }
  4478. this.p.frozenColumns = false;
  4479. }
  4480. });
  4481. }
  4482. });
  4483. //module begin
  4484. $.jgrid.extend({
  4485. editCell : function (iRow,iCol, ed){
  4486. return this.each(function (){
  4487. var $t = this, nm, tmp,cc, cm;
  4488. if (!$t.grid || $t.p.cellEdit !== true) {return;}
  4489. iCol = parseInt(iCol,10);
  4490. // select the row that can be used for other methods
  4491. $t.p.selrow = $t.rows[iRow].id;
  4492. if (!$t.p.knv) {$($t).jqGrid("GridNav");}
  4493. // check to see if we have already edited cell
  4494. if ($t.p.savedRow.length>0) {
  4495. // prevent second click on that field and enable selects
  4496. if (ed===true ) {
  4497. if(iRow == $t.p.iRow && iCol == $t.p.iCol){
  4498. return;
  4499. }
  4500. }
  4501. // save the cell
  4502. $($t).jqGrid("saveCell",$t.p.savedRow[0].id,$t.p.savedRow[0].ic);
  4503. } else {
  4504. window.setTimeout(function () { $("#"+$.jgrid.jqID($t.p.knv)).attr("tabindex","-1").focus();},1);
  4505. }
  4506. cm = $t.p.colModel[iCol];
  4507. nm = cm.name;
  4508. if (nm==='subgrid' || nm==='cb' || nm==='rn') {return;}
  4509. cc = $("td:eq("+iCol+")",$t.rows[iRow]);
  4510. if (cm.editable===true && ed===true && !cc.hasClass("not-editable-cell") && (!$.isFunction($t.p.isCellEditable) || $t.p.isCellEditable.call($t,nm,iRow,iCol))) {
  4511. if(parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {
  4512. $("td:eq("+$t.p.iCol+")",$t.rows[$t.p.iRow]).removeClass("edit-cell ui-state-highlight");
  4513. $($t.rows[$t.p.iRow]).removeClass("selected-row ui-state-hover");
  4514. }
  4515. $(cc).addClass("edit-cell ui-state-highlight");
  4516. $($t.rows[iRow]).addClass("selected-row ui-state-hover");
  4517. try {
  4518. tmp = $.unformat.call($t,cc,{rowId: $t.rows[iRow].id, colModel:cm},iCol);
  4519. } catch (_) {
  4520. tmp = ( cm.edittype && cm.edittype === 'textarea' ) ? $(cc).text() : $(cc).html();
  4521. }
  4522. if($t.p.autoencode) { tmp = $.jgrid.htmlDecode(tmp); }
  4523. if (!cm.edittype) {cm.edittype = "text";}
  4524. $t.p.savedRow.push({id:iRow,ic:iCol,name:nm,v:tmp});
  4525. if(tmp === "&nbsp;" || tmp === "&#160;" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}
  4526. if($.isFunction($t.p.formatCell)) {
  4527. var tmp2 = $t.p.formatCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
  4528. if(tmp2 !== undefined ) {tmp = tmp2;}
  4529. }
  4530. $($t).triggerHandler("jqGridBeforeEditCell", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);
  4531. if ($.isFunction($t.p.beforeEditCell)) {
  4532. $t.p.beforeEditCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
  4533. }
  4534. var opt = $.extend({}, cm.editoptions || {} ,{id:iRow+"_"+nm,name:nm,rowId: $t.rows[iRow].id, oper:'edit'});
  4535. var elc = $.jgrid.createEl.call($t,cm.edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {}));
  4536. $(cc).html("").append(elc).attr("tabindex","0");
  4537. $.jgrid.bindEv.call($t, elc, opt);
  4538. window.setTimeout(function () { $(elc).focus();},1);
  4539. $("input, select, textarea",cc).bind("keydown",function(e) {
  4540. if (e.keyCode === 27) {
  4541. if($("input.hasDatepicker",cc).length >0) {
  4542. if( $(".ui-datepicker").is(":hidden") ) { $($t).jqGrid("restoreCell",iRow,iCol); }
  4543. else { $("input.hasDatepicker",cc).datepicker('hide'); }
  4544. } else {
  4545. $($t).jqGrid("restoreCell",iRow,iCol);
  4546. }
  4547. } //ESC
  4548. if (e.keyCode === 13 && !e.shiftKey) {
  4549. $($t).jqGrid("saveCell",iRow,iCol);
  4550. // Prevent default action
  4551. return false;
  4552. } //Enter
  4553. if (e.keyCode === 9) {
  4554. if(!$t.grid.hDiv.loading ) {
  4555. if (e.shiftKey) {$($t).jqGrid("prevCell",iRow,iCol);} //Shift TAb
  4556. else {$($t).jqGrid("nextCell",iRow,iCol);} //Tab
  4557. } else {
  4558. return false;
  4559. }
  4560. }
  4561. e.stopPropagation();
  4562. });
  4563. $($t).triggerHandler("jqGridAfterEditCell", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);
  4564. if ($.isFunction($t.p.afterEditCell)) {
  4565. $t.p.afterEditCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
  4566. }
  4567. } else {
  4568. if (parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {
  4569. $("td:eq("+$t.p.iCol+")",$t.rows[$t.p.iRow]).removeClass("edit-cell ui-state-highlight");
  4570. $($t.rows[$t.p.iRow]).removeClass("selected-row ui-state-hover");
  4571. }
  4572. cc.addClass("edit-cell ui-state-highlight");
  4573. $($t.rows[iRow]).addClass("selected-row ui-state-hover");
  4574. tmp = cc.html().replace(/\&#160\;/ig,'');
  4575. $($t).triggerHandler("jqGridSelectCell", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);
  4576. if ($.isFunction($t.p.onSelectCell)) {
  4577. $t.p.onSelectCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
  4578. }
  4579. }
  4580. $t.p.iCol = iCol; $t.p.iRow = iRow;
  4581. });
  4582. },
  4583. saveCell : function (iRow, iCol){
  4584. return this.each(function(){
  4585. var $t= this, fr,
  4586. errors = $.jgrid.getRegional(this, 'errors'),
  4587. edit =$.jgrid.getRegional(this, 'edit');
  4588. if (!$t.grid || $t.p.cellEdit !== true) {return;}
  4589. if ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;}
  4590. if(fr !== null) {
  4591. var cc = $("td:eq("+iCol+")",$t.rows[iRow]),v,v2,
  4592. cm = $t.p.colModel[iCol], nm = cm.name, nmjq = $.jgrid.jqID(nm) ;
  4593. switch (cm.edittype) {
  4594. case "select":
  4595. if(!cm.editoptions.multiple) {
  4596. v = $("#"+iRow+"_"+nmjq+" option:selected",$t.rows[iRow]).val();
  4597. v2 = $("#"+iRow+"_"+nmjq+" option:selected",$t.rows[iRow]).text();
  4598. } else {
  4599. var sel = $("#"+iRow+"_"+nmjq,$t.rows[iRow]), selectedText = [];
  4600. v = $(sel).val();
  4601. if(v) { v.join(",");} else { v=""; }
  4602. $("option:selected",sel).each(
  4603. function(i,selected){
  4604. selectedText[i] = $(selected).text();
  4605. }
  4606. );
  4607. v2 = selectedText.join(",");
  4608. }
  4609. if(cm.formatter) { v2 = v; }
  4610. break;
  4611. case "checkbox":
  4612. var cbv = ["Yes","No"];
  4613. if(cm.editoptions){
  4614. cbv = cm.editoptions.value.split(":");
  4615. }
  4616. v = $("#"+iRow+"_"+nmjq,$t.rows[iRow]).is(":checked") ? cbv[0] : cbv[1];
  4617. v2=v;
  4618. break;
  4619. case "password":
  4620. case "text":
  4621. case "textarea":
  4622. case "button" :
  4623. v = $("#"+iRow+"_"+nmjq,$t.rows[iRow]).val();
  4624. v2=v;
  4625. break;
  4626. case 'custom' :
  4627. try {
  4628. if(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) {
  4629. v = cm.editoptions.custom_value.call($t, $(".customelement",cc),'get');
  4630. if (v===undefined) { throw "e2";} else { v2=v; }
  4631. } else { throw "e1"; }
  4632. } catch (e) {
  4633. if (e==="e1") { $.jgrid.info_dialog(errors.errcap, "function 'custom_value' " + edit.msg.nodefined, edit.bClose); }
  4634. if (e==="e2") { $.jgrid.info_dialog(errors.errcap, "function 'custom_value' " + edit.msg.novalue, edit.bClose); }
  4635. else {$.jgrid.info_dialog(errors.errcap, e.message, edit.bClose); }
  4636. }
  4637. break;
  4638. }
  4639. // The common approach is if nothing changed do not do anything
  4640. if (v2 !== $t.p.savedRow[fr].v){
  4641. var vvv = $($t).triggerHandler("jqGridBeforeSaveCell", [$t.rows[iRow].id, nm, v, iRow, iCol]);
  4642. if (vvv) {v = vvv; v2=vvv;}
  4643. if ($.isFunction($t.p.beforeSaveCell)) {
  4644. var vv = $t.p.beforeSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
  4645. if (vv) {v = vv; v2=vv;}
  4646. }
  4647. var cv = $.jgrid.checkValues.call($t,v,iCol);
  4648. if(cv[0] === true) {
  4649. var addpost = $($t).triggerHandler("jqGridBeforeSubmitCell", [$t.rows[iRow].id, nm, v, iRow, iCol]) || {};
  4650. if ($.isFunction($t.p.beforeSubmitCell)) {
  4651. addpost = $t.p.beforeSubmitCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
  4652. if (!addpost) {addpost={};}
  4653. }
  4654. if( $("input.hasDatepicker",cc).length >0) { $("input.hasDatepicker",cc).datepicker('hide'); }
  4655. if ($t.p.cellsubmit === 'remote') {
  4656. if ($t.p.cellurl) {
  4657. var postdata = {};
  4658. if($t.p.autoencode) { v = $.jgrid.htmlEncode(v); }
  4659. postdata[nm] = v;
  4660. var idname,oper, opers;
  4661. opers = $t.p.prmNames;
  4662. idname = opers.id;
  4663. oper = opers.oper;
  4664. postdata[idname] = $.jgrid.stripPref($t.p.idPrefix, $t.rows[iRow].id);
  4665. postdata[oper] = opers.editoper;
  4666. postdata = $.extend(addpost,postdata);
  4667. $($t).jqGrid("progressBar", {method:"show", loadtype : $t.p.loadui, htmlcontent: $.jgrid.getRegional($t,'defaults.savetext') });
  4668. $t.grid.hDiv.loading = true;
  4669. $.ajax( $.extend( {
  4670. url: $t.p.cellurl,
  4671. data :$.isFunction($t.p.serializeCellData) ? $t.p.serializeCellData.call($t, postdata) : postdata,
  4672. type: "POST",
  4673. complete: function (result, stat) {
  4674. $($t).jqGrid("progressBar", {method:"hide", loadtype : $t.p.loadui });
  4675. $t.grid.hDiv.loading = false;
  4676. if (stat === 'success') {
  4677. var ret = $($t).triggerHandler("jqGridAfterSubmitCell", [$t, result, postdata.id, nm, v, iRow, iCol]) || [true, ''];
  4678. if (ret[0] === true && $.isFunction($t.p.afterSubmitCell)) {
  4679. ret = $t.p.afterSubmitCell.call($t, result,postdata.id,nm,v,iRow,iCol);
  4680. }
  4681. if(ret[0] === true){
  4682. $(cc).empty();
  4683. $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, v2, false, false, true);
  4684. $(cc).addClass("dirty-cell");
  4685. $($t.rows[iRow]).addClass("edited");
  4686. $($t).triggerHandler("jqGridAfterSaveCell", [$t.rows[iRow].id, nm, v, iRow, iCol]);
  4687. if ($.isFunction($t.p.afterSaveCell)) {
  4688. $t.p.afterSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
  4689. }
  4690. $t.p.savedRow.splice(0,1);
  4691. } else {
  4692. $.jgrid.info_dialog(errors.errcap,ret[1],edit.bClose);
  4693. $($t).jqGrid("restoreCell",iRow,iCol);
  4694. }
  4695. }
  4696. },
  4697. error:function(res,stat,err) {
  4698. $("#lui_"+$.jgrid.jqID($t.p.id)).hide();
  4699. $t.grid.hDiv.loading = false;
  4700. $($t).triggerHandler("jqGridErrorCell", [res, stat, err]);
  4701. if ($.isFunction($t.p.errorCell)) {
  4702. $t.p.errorCell.call($t, res,stat,err);
  4703. $($t).jqGrid("restoreCell",iRow,iCol);
  4704. } else {
  4705. $.jgrid.info_dialog(errors.errcap,res.status+" : "+res.statusText+"<br/>"+stat, edit.bClose);
  4706. $($t).jqGrid("restoreCell",iRow,iCol);
  4707. }
  4708. }
  4709. }, $.jgrid.ajaxOptions, $t.p.ajaxCellOptions || {}));
  4710. } else {
  4711. try {
  4712. $.jgrid.info_dialog(errors.errcap,errors.nourl, edit.bClose);
  4713. $($t).jqGrid("restoreCell",iRow,iCol);
  4714. } catch (e) {}
  4715. }
  4716. }
  4717. if ($t.p.cellsubmit === 'clientArray') {
  4718. $(cc).empty();
  4719. $($t).jqGrid("setCell",$t.rows[iRow].id,iCol, v2, false, false, true);
  4720. $(cc).addClass("dirty-cell");
  4721. $($t.rows[iRow]).addClass("edited");
  4722. $($t).triggerHandler("jqGridAfterSaveCell", [$t.rows[iRow].id, nm, v, iRow, iCol]);
  4723. if ($.isFunction($t.p.afterSaveCell)) {
  4724. $t.p.afterSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
  4725. }
  4726. $t.p.savedRow.splice(0,1);
  4727. }
  4728. } else {
  4729. try {
  4730. window.setTimeout(function(){$.jgrid.info_dialog(errors.errcap,v+ " " + cv[1], edit.bClose);},100);
  4731. $($t).jqGrid("restoreCell",iRow,iCol);
  4732. } catch (e) {}
  4733. }
  4734. } else {
  4735. $($t).jqGrid("restoreCell",iRow,iCol);
  4736. }
  4737. }
  4738. window.setTimeout(function () { $("#"+$.jgrid.jqID($t.p.knv)).attr("tabindex","-1").focus();},0);
  4739. });
  4740. },
  4741. restoreCell : function(iRow, iCol) {
  4742. return this.each(function(){
  4743. var $t= this, fr;
  4744. if (!$t.grid || $t.p.cellEdit !== true ) {return;}
  4745. if ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;}
  4746. if(fr !== null) {
  4747. var cc = $("td:eq("+iCol+")",$t.rows[iRow]);
  4748. // datepicker fix
  4749. if($.isFunction($.fn.datepicker)) {
  4750. try {
  4751. $("input.hasDatepicker",cc).datepicker('hide');
  4752. } catch (e) {}
  4753. }
  4754. $(cc).empty().attr("tabindex","-1");
  4755. $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, $t.p.savedRow[fr].v, false, false, true);
  4756. $($t).triggerHandler("jqGridAfterRestoreCell", [$t.rows[iRow].id, $t.p.savedRow[fr].v, iRow, iCol]);
  4757. if ($.isFunction($t.p.afterRestoreCell)) {
  4758. $t.p.afterRestoreCell.call($t, $t.rows[iRow].id, $t.p.savedRow[fr].v, iRow, iCol);
  4759. }
  4760. $t.p.savedRow.splice(0,1);
  4761. }
  4762. window.setTimeout(function () { $("#"+$t.p.knv).attr("tabindex","-1").focus();},0);
  4763. });
  4764. },
  4765. nextCell : function (iRow,iCol) {
  4766. return this.each(function (){
  4767. var $t = this, nCol=false, i;
  4768. if (!$t.grid || $t.p.cellEdit !== true) {return;}
  4769. // try to find next editable cell
  4770. for (i=iCol+1; i<$t.p.colModel.length; i++) {
  4771. if ( $t.p.colModel[i].editable ===true && (!$.isFunction($t.p.isCellEditable) || $t.p.isCellEditable.call($t, $t.p.colModel[i].name,iRow,i))) {
  4772. nCol = i; break;
  4773. }
  4774. }
  4775. if(nCol !== false) {
  4776. $($t).jqGrid("editCell",iRow,nCol,true);
  4777. } else {
  4778. if ($t.p.savedRow.length >0) {
  4779. $($t).jqGrid("saveCell",iRow,iCol);
  4780. }
  4781. }
  4782. });
  4783. },
  4784. prevCell : function (iRow,iCol) {
  4785. return this.each(function (){
  4786. var $t = this, nCol=false, i;
  4787. if (!$t.grid || $t.p.cellEdit !== true) {return;}
  4788. // try to find next editable cell
  4789. for (i=iCol-1; i>=0; i--) {
  4790. if ( $t.p.colModel[i].editable ===true && (!$.isFunction($t.p.isCellEditable) || $t.p.isCellEditable.call($t, $t.p.colModel[i].name, iRow,i))) {
  4791. nCol = i; break;
  4792. }
  4793. }
  4794. if(nCol !== false) {
  4795. $($t).jqGrid("editCell",iRow,nCol,true);
  4796. } else {
  4797. if ($t.p.savedRow.length >0) {
  4798. $($t).jqGrid("saveCell",iRow,iCol);
  4799. }
  4800. }
  4801. });
  4802. },
  4803. GridNav : function() {
  4804. return this.each(function () {
  4805. var $t = this;
  4806. if (!$t.grid || $t.p.cellEdit !== true ) {return;}
  4807. // trick to process keydown on non input elements
  4808. $t.p.knv = $t.p.id + "_kn";
  4809. var selection = $("<div style='position:fixed;top:0px;width:1px;height:1px;' tabindex='0'><div tabindex='-1' style='width:1px;height:1px;' id='"+$t.p.knv+"'></div></div>"),
  4810. i, kdir;
  4811. function scrollGrid(iR, iC, tp){
  4812. if (tp.substr(0,1)==='v') {
  4813. var ch = $($t.grid.bDiv)[0].clientHeight,
  4814. st = $($t.grid.bDiv)[0].scrollTop,
  4815. nROT = $t.rows[iR].offsetTop+$t.rows[iR].clientHeight,
  4816. pROT = $t.rows[iR].offsetTop;
  4817. if(tp === 'vd') {
  4818. if(nROT >= ch) {
  4819. $($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop + $t.rows[iR].clientHeight;
  4820. }
  4821. }
  4822. if(tp === 'vu'){
  4823. if (pROT < st ) {
  4824. $($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop - $t.rows[iR].clientHeight;
  4825. }
  4826. }
  4827. }
  4828. if(tp==='h') {
  4829. var cw = $($t.grid.bDiv)[0].clientWidth,
  4830. sl = $($t.grid.bDiv)[0].scrollLeft,
  4831. nCOL = $t.rows[iR].cells[iC].offsetLeft+$t.rows[iR].cells[iC].clientWidth,
  4832. pCOL = $t.rows[iR].cells[iC].offsetLeft;
  4833. if(nCOL >= cw+parseInt(sl,10)) {
  4834. $($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft + $t.rows[iR].cells[iC].clientWidth;
  4835. } else if (pCOL < sl) {
  4836. $($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft - $t.rows[iR].cells[iC].clientWidth;
  4837. }
  4838. }
  4839. }
  4840. function findNextVisible(iC,act){
  4841. var ind, i;
  4842. if(act === 'lft') {
  4843. ind = iC+1;
  4844. for (i=iC;i>=0;i--){
  4845. if ($t.p.colModel[i].hidden !== true) {
  4846. ind = i;
  4847. break;
  4848. }
  4849. }
  4850. }
  4851. if(act === 'rgt') {
  4852. ind = iC-1;
  4853. for (i=iC; i<$t.p.colModel.length;i++){
  4854. if ($t.p.colModel[i].hidden !== true) {
  4855. ind = i;
  4856. break;
  4857. }
  4858. }
  4859. }
  4860. return ind;
  4861. }
  4862. $(selection).insertBefore($t.grid.cDiv);
  4863. $("#"+$t.p.knv)
  4864. .focus()
  4865. .keydown(function (e){
  4866. kdir = e.keyCode;
  4867. if($t.p.direction === "rtl") {
  4868. if(kdir===37) { kdir = 39;}
  4869. else if (kdir===39) { kdir = 37; }
  4870. }
  4871. switch (kdir) {
  4872. case 38:
  4873. if ($t.p.iRow-1 >0 ) {
  4874. scrollGrid($t.p.iRow-1,$t.p.iCol,'vu');
  4875. $($t).jqGrid("editCell",$t.p.iRow-1,$t.p.iCol,false);
  4876. }
  4877. break;
  4878. case 40 :
  4879. if ($t.p.iRow+1 <= $t.rows.length-1) {
  4880. scrollGrid($t.p.iRow+1,$t.p.iCol,'vd');
  4881. $($t).jqGrid("editCell",$t.p.iRow+1,$t.p.iCol,false);
  4882. }
  4883. break;
  4884. case 37 :
  4885. if ($t.p.iCol -1 >= 0) {
  4886. i = findNextVisible($t.p.iCol-1,'lft');
  4887. scrollGrid($t.p.iRow, i,'h');
  4888. $($t).jqGrid("editCell",$t.p.iRow, i,false);
  4889. }
  4890. break;
  4891. case 39 :
  4892. if ($t.p.iCol +1 <= $t.p.colModel.length-1) {
  4893. i = findNextVisible($t.p.iCol+1,'rgt');
  4894. scrollGrid($t.p.iRow,i,'h');
  4895. $($t).jqGrid("editCell",$t.p.iRow,i,false);
  4896. }
  4897. break;
  4898. case 13:
  4899. if (parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {
  4900. $($t).jqGrid("editCell",$t.p.iRow,$t.p.iCol,true);
  4901. }
  4902. break;
  4903. default :
  4904. return true;
  4905. }
  4906. return false;
  4907. });
  4908. });
  4909. },
  4910. getChangedCells : function (mthd) {
  4911. var ret=[];
  4912. if (!mthd) {mthd='all';}
  4913. this.each(function(){
  4914. var $t= this,nm;
  4915. if (!$t.grid || $t.p.cellEdit !== true ) {return;}
  4916. $($t.rows).each(function(j){
  4917. var res = {};
  4918. if ($(this).hasClass("edited")) {
  4919. $('td',this).each( function(i) {
  4920. nm = $t.p.colModel[i].name;
  4921. if ( nm !== 'cb' && nm !== 'subgrid') {
  4922. if (mthd==='dirty') {
  4923. if ($(this).hasClass('dirty-cell')) {
  4924. try {
  4925. res[nm] = $.unformat.call($t,this,{rowId:$t.rows[j].id, colModel:$t.p.colModel[i]},i);
  4926. } catch (e){
  4927. res[nm] = $.jgrid.htmlDecode($(this).html());
  4928. }
  4929. }
  4930. } else {
  4931. try {
  4932. res[nm] = $.unformat.call($t,this,{rowId:$t.rows[j].id,colModel:$t.p.colModel[i]},i);
  4933. } catch (e) {
  4934. res[nm] = $.jgrid.htmlDecode($(this).html());
  4935. }
  4936. }
  4937. }
  4938. });
  4939. res.id = this.id;
  4940. ret.push(res);
  4941. }
  4942. });
  4943. });
  4944. return ret;
  4945. }
  4946. /// end cell editing
  4947. });
  4948. //module begin
  4949. $.extend($.jgrid,{
  4950. // Modal functions
  4951. showModal : function(h) {
  4952. h.w.show();
  4953. },
  4954. closeModal : function(h) {
  4955. h.w.hide().attr("aria-hidden","true");
  4956. if(h.o) {h.o.remove();}
  4957. },
  4958. hideModal : function (selector,o) {
  4959. o = $.extend({jqm : true, gb :'', removemodal: false, formprop: false, form : ''}, o || {});
  4960. var thisgrid = o.gb && typeof o.gb === "string" && o.gb.substr(0,6) === "#gbox_" ? $("#" + o.gb.substr(6))[0] : false;
  4961. if(o.onClose) {
  4962. var oncret = thisgrid ? o.onClose.call(thisgrid, selector) : o.onClose(selector);
  4963. if (typeof oncret === 'boolean' && !oncret ) { return; }
  4964. }
  4965. if( o.formprop && thisgrid && o.form) {
  4966. var fh = $(selector)[0].style.height;
  4967. if(fh.indexOf("px") > -1 ) {
  4968. fh = parseFloat(fh);
  4969. }
  4970. var frmgr, frmdata;
  4971. if(o.form==='edit'){
  4972. frmgr = '#' +$.jgrid.jqID("FrmGrid_"+ o.gb.substr(6));
  4973. frmdata = "formProp";
  4974. } else if( o.form === 'view') {
  4975. frmgr = '#' +$.jgrid.jqID("ViewGrid_"+ o.gb.substr(6));
  4976. frmdata = "viewProp";
  4977. }
  4978. $(thisgrid).data(frmdata, {
  4979. top:parseFloat($(selector).css("top")),
  4980. left : parseFloat($(selector).css("left")),
  4981. width : $(selector).width(),
  4982. height : fh,
  4983. dataheight : $(frmgr).height(),
  4984. datawidth: $(frmgr).width()
  4985. });
  4986. }
  4987. if ($.fn.jqm && o.jqm === true) {
  4988. $(selector).attr("aria-hidden","true").jqmHide();
  4989. } else {
  4990. if(o.gb !== '') {
  4991. try {$(".jqgrid-overlay:first",o.gb).hide();} catch (e){}
  4992. }
  4993. $(selector).hide().attr("aria-hidden","true");
  4994. }
  4995. if( o.removemodal ) {
  4996. $(selector).remove();
  4997. }
  4998. },
  4999. //Helper functions
  5000. findPos : function(obj) {
  5001. var curleft = 0, curtop = 0;
  5002. if (obj.offsetParent) {
  5003. do {
  5004. curleft += obj.offsetLeft;
  5005. curtop += obj.offsetTop;
  5006. } while (obj = obj.offsetParent);
  5007. //do not change obj == obj.offsetParent
  5008. }
  5009. return [curleft,curtop];
  5010. },
  5011. createModal : function(aIDs, content, p, insertSelector, posSelector, appendsel, css) {
  5012. p = $.extend(true, {}, $.jgrid.jqModal || {}, p);
  5013. var mw = document.createElement('div'), rtlsup, self = this;
  5014. css = $.extend({}, css || {});
  5015. rtlsup = $(p.gbox).attr("dir") === "rtl" ? true : false;
  5016. mw.className= "ui-widget ui-widget-content ui-corner-all ui-jqdialog";
  5017. mw.id = aIDs.themodal;
  5018. var mh = document.createElement('div');
  5019. mh.className = "ui-jqdialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix";
  5020. mh.id = aIDs.modalhead;
  5021. $(mh).append("<span class='ui-jqdialog-title'>"+p.caption+"</span>");
  5022. var ahr= $("<a class='ui-jqdialog-titlebar-close ui-corner-all'></a>")
  5023. .hover(function(){ahr.addClass('ui-state-hover');},
  5024. function(){ahr.removeClass('ui-state-hover');})
  5025. .append("<span class='ui-icon ui-icon-closethick'></span>");
  5026. $(mh).append(ahr);
  5027. if(rtlsup) {
  5028. mw.dir = "rtl";
  5029. $(".ui-jqdialog-title",mh).css("float","right");
  5030. $(".ui-jqdialog-titlebar-close",mh).css("left",0.3+"em");
  5031. } else {
  5032. mw.dir = "ltr";
  5033. $(".ui-jqdialog-title",mh).css("float","left");
  5034. $(".ui-jqdialog-titlebar-close",mh).css("right",0.3+"em");
  5035. }
  5036. var mc = document.createElement('div');
  5037. $(mc).addClass("ui-jqdialog-content ui-widget-content").attr("id",aIDs.modalcontent);
  5038. $(mc).append(content);
  5039. mw.appendChild(mc);
  5040. $(mw).prepend(mh);
  5041. if(appendsel===true) { $('body').append(mw); } //append as first child in body -for alert dialog
  5042. else if (typeof appendsel === "string") {
  5043. $(appendsel).append(mw);
  5044. } else {$(mw).insertBefore(insertSelector);}
  5045. $(mw).css(css);
  5046. if(p.jqModal === undefined) {p.jqModal = true;} // internal use
  5047. var coord = {};
  5048. if ( $.fn.jqm && p.jqModal === true) {
  5049. if(p.left ===0 && p.top===0 && p.overlay) {
  5050. var pos = [];
  5051. pos = $.jgrid.findPos(posSelector);
  5052. p.left = pos[0] + 4;
  5053. p.top = pos[1] + 4;
  5054. }
  5055. coord.top = p.top+"px";
  5056. coord.left = p.left;
  5057. } else if(p.left !==0 || p.top!==0) {
  5058. coord.left = p.left;
  5059. coord.top = p.top+"px";
  5060. }
  5061. $("a.ui-jqdialog-titlebar-close",mh).click(function(){
  5062. var oncm = $("#"+$.jgrid.jqID(aIDs.themodal)).data("onClose") || p.onClose;
  5063. var gboxclose = $("#"+$.jgrid.jqID(aIDs.themodal)).data("gbox") || p.gbox;
  5064. self.hideModal("#"+$.jgrid.jqID(aIDs.themodal),{gb:gboxclose,jqm:p.jqModal,onClose:oncm, removemodal: p.removemodal || false, formprop : !p.recreateForm || false, form: p.form || ''});
  5065. return false;
  5066. });
  5067. if (p.width === 0 || !p.width) {p.width = 300;}
  5068. if(p.height === 0 || !p.height) {p.height =200;}
  5069. if(!p.zIndex) {
  5070. var parentZ = $(insertSelector).parents("*[role=dialog]").filter(':first').css("z-index");
  5071. if(parentZ) {
  5072. p.zIndex = parseInt(parentZ,10)+2;
  5073. } else {
  5074. p.zIndex = 950;
  5075. }
  5076. }
  5077. var rtlt = 0;
  5078. if( rtlsup && coord.left && !appendsel) {
  5079. rtlt = $(p.gbox).width()- (!isNaN(p.width) ? parseInt(p.width,10) :0) - 8; // to do
  5080. // just in case
  5081. coord.left = parseInt(coord.left,10) + parseInt(rtlt,10);
  5082. }
  5083. if(coord.left) { coord.left += "px"; }
  5084. $(mw).css($.extend({
  5085. width: isNaN(p.width) ? "auto": p.width+"px",
  5086. height:isNaN(p.height) ? "auto" : p.height + "px",
  5087. zIndex:p.zIndex,
  5088. overflow: 'hidden'
  5089. },coord))
  5090. .attr({tabIndex: "-1","role":"dialog","aria-labelledby":aIDs.modalhead,"aria-hidden":"true"});
  5091. if(p.drag === undefined) { p.drag=true;}
  5092. if(p.resize === undefined) {p.resize=true;}
  5093. if (p.drag) {
  5094. $(mh).css('cursor','move');
  5095. if($.fn.jqDrag) {
  5096. $(mw).jqDrag(mh);
  5097. } else {
  5098. try {
  5099. $(mw).draggable({handle: $("#"+$.jgrid.jqID(mh.id))});
  5100. } catch (e) {}
  5101. }
  5102. }
  5103. if(p.resize) {
  5104. if($.fn.jqResize) {
  5105. $(mw).append("<div class='jqResize ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se'></div>");
  5106. $("#"+$.jgrid.jqID(aIDs.themodal)).jqResize(".jqResize",aIDs.scrollelm ? "#"+$.jgrid.jqID(aIDs.scrollelm) : false);
  5107. } else {
  5108. try {
  5109. $(mw).resizable({handles: 'se, sw',alsoResize: aIDs.scrollelm ? "#"+$.jgrid.jqID(aIDs.scrollelm) : false});
  5110. } catch (r) {}
  5111. }
  5112. }
  5113. if(p.closeOnEscape === true){
  5114. $(mw).keydown( function( e ) {
  5115. if( e.which === 27 ) {
  5116. var cone = $("#"+$.jgrid.jqID(aIDs.themodal)).data("onClose") || p.onClose;
  5117. self.hideModal("#"+$.jgrid.jqID(aIDs.themodal),{gb:p.gbox,jqm:p.jqModal,onClose: cone, removemodal: p.removemodal || false, formprop : !p.recreateForm || false, form: p.form || ''});
  5118. }
  5119. });
  5120. }
  5121. },
  5122. viewModal : function (selector,o){
  5123. o = $.extend({
  5124. toTop: true,
  5125. overlay: 10,
  5126. modal: false,
  5127. overlayClass : 'ui-widget-overlay',
  5128. onShow: $.jgrid.showModal,
  5129. onHide: $.jgrid.closeModal,
  5130. gbox: '',
  5131. jqm : true,
  5132. jqM : true
  5133. }, o || {});
  5134. if ($.fn.jqm && o.jqm === true) {
  5135. if(o.jqM) { $(selector).attr("aria-hidden","false").jqm(o).jqmShow(); }
  5136. else {$(selector).attr("aria-hidden","false").jqmShow();}
  5137. } else {
  5138. if(o.gbox !== '') {
  5139. $(".jqgrid-overlay:first",o.gbox).show();
  5140. $(selector).data("gbox",o.gbox);
  5141. }
  5142. $(selector).show().attr("aria-hidden","false");
  5143. try{$(':input:visible',selector)[0].focus();}catch(_){}
  5144. }
  5145. },
  5146. info_dialog : function(caption, content,c_b, modalopt) {
  5147. var mopt = {
  5148. width:290,
  5149. height:'auto',
  5150. dataheight: 'auto',
  5151. drag: true,
  5152. resize: false,
  5153. left:250,
  5154. top:170,
  5155. zIndex : 1000,
  5156. jqModal : true,
  5157. modal : false,
  5158. closeOnEscape : true,
  5159. align: 'center',
  5160. buttonalign : 'center',
  5161. buttons : []
  5162. // {text:'textbutt', id:"buttid", onClick : function(){...}}
  5163. // 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...
  5164. };
  5165. $.extend(true, mopt, $.jgrid.jqModal || {}, {caption:"<b>"+caption+"</b>"}, modalopt || {});
  5166. var jm = mopt.jqModal, self = this;
  5167. if($.fn.jqm && !jm) { jm = false; }
  5168. // in case there is no jqModal
  5169. var buttstr ="", i;
  5170. if(mopt.buttons.length > 0) {
  5171. for(i=0;i<mopt.buttons.length;i++) {
  5172. if(mopt.buttons[i].id === undefined) { mopt.buttons[i].id = "info_button_"+i; }
  5173. buttstr += "<a id='"+mopt.buttons[i].id+"' class='fm-button ui-state-default ui-corner-all'>"+mopt.buttons[i].text+"</a>";
  5174. }
  5175. }
  5176. var dh = isNaN(mopt.dataheight) ? mopt.dataheight : mopt.dataheight+"px",
  5177. cn = "text-align:"+mopt.align+";";
  5178. var cnt = "<div id='info_id'>";
  5179. cnt += "<div id='infocnt' style='margin:0px;padding-bottom:1em;width:100%;overflow:auto;position:relative;height:"+dh+";"+cn+"'>"+content+"</div>";
  5180. 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 id='closedialog' class='fm-button ui-state-default ui-corner-all'>"+c_b+"</a>"+buttstr+"</div>" :
  5181. buttstr !== "" ? "<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;'>"+buttstr+"</div>" : "";
  5182. cnt += "</div>";
  5183. try {
  5184. if($("#info_dialog").attr("aria-hidden") === "false") {
  5185. $.jgrid.hideModal("#info_dialog",{jqm:jm});
  5186. }
  5187. $("#info_dialog").remove();
  5188. } catch (e){}
  5189. $.jgrid.createModal({
  5190. themodal:'info_dialog',
  5191. modalhead:'info_head',
  5192. modalcontent:'info_content',
  5193. scrollelm: 'infocnt'},
  5194. cnt,
  5195. mopt,
  5196. '','',true
  5197. );
  5198. // attach onclick after inserting into the dom
  5199. if(buttstr) {
  5200. $.each(mopt.buttons,function(i){
  5201. $("#"+$.jgrid.jqID(this.id),"#info_id").bind('click',function(){mopt.buttons[i].onClick.call($("#info_dialog")); return false;});
  5202. });
  5203. }
  5204. $("#closedialog", "#info_id").click(function(){
  5205. self.hideModal("#info_dialog",{
  5206. jqm:jm,
  5207. onClose: $("#info_dialog").data("onClose") || mopt.onClose,
  5208. gb: $("#info_dialog").data("gbox") || mopt.gbox
  5209. });
  5210. return false;
  5211. });
  5212. $(".fm-button","#info_dialog").hover(
  5213. function(){$(this).addClass('ui-state-hover');},
  5214. function(){$(this).removeClass('ui-state-hover');}
  5215. );
  5216. if($.isFunction(mopt.beforeOpen) ) { mopt.beforeOpen(); }
  5217. $.jgrid.viewModal("#info_dialog",{
  5218. onHide: function(h) {
  5219. h.w.hide().remove();
  5220. if(h.o) { h.o.remove(); }
  5221. },
  5222. modal :mopt.modal,
  5223. jqm:jm
  5224. });
  5225. if($.isFunction(mopt.afterOpen) ) { mopt.afterOpen(); }
  5226. try{ $("#info_dialog").focus();} catch (m){}
  5227. },
  5228. bindEv: function (el, opt) {
  5229. var $t = this;
  5230. if($.isFunction(opt.dataInit)) {
  5231. opt.dataInit.call($t,el,opt);
  5232. }
  5233. if(opt.dataEvents) {
  5234. $.each(opt.dataEvents, function() {
  5235. if (this.data !== undefined) {
  5236. $(el).bind(this.type, this.data, this.fn);
  5237. } else {
  5238. $(el).bind(this.type, this.fn);
  5239. }
  5240. });
  5241. }
  5242. },
  5243. // Form Functions
  5244. createEl : function(eltype,options,vl,autowidth, ajaxso) {
  5245. var elem = "", $t = this;
  5246. function setAttributes(elm, atr, exl ) {
  5247. var exclude = ['dataInit','dataEvents','dataUrl', 'buildSelect','sopt', 'searchhidden', 'defaultValue', 'attr', 'custom_element', 'custom_value', 'oper'];
  5248. if(exl !== undefined && $.isArray(exl)) {
  5249. $.merge(exclude, exl);
  5250. }
  5251. $.each(atr, function(key, value){
  5252. if($.inArray(key, exclude) === -1) {
  5253. $(elm).attr(key,value);
  5254. }
  5255. });
  5256. if(!atr.hasOwnProperty('id')) {
  5257. $(elm).attr('id', $.jgrid.randId());
  5258. }
  5259. }
  5260. switch (eltype)
  5261. {
  5262. case "textarea" :
  5263. elem = document.createElement("textarea");
  5264. if(autowidth) {
  5265. if(!options.cols) { $(elem).css({width:"98%"});}
  5266. } else if (!options.cols) { options.cols = 20; }
  5267. if(!options.rows) { options.rows = 2; }
  5268. if(vl==='&nbsp;' || vl==='&#160;' || (vl.length===1 && vl.charCodeAt(0)===160)) {vl="";}
  5269. elem.value = vl;
  5270. setAttributes(elem, options);
  5271. $(elem).attr({"role":"textbox","multiline":"true"});
  5272. break;
  5273. case "checkbox" : //what code for simple checkbox
  5274. elem = document.createElement("input");
  5275. elem.type = "checkbox";
  5276. if( !options.value ) {
  5277. var vl1 = (vl+"").toLowerCase();
  5278. if(vl1.search(/(false|f|0|no|n|off|undefined)/i)<0 && vl1!=="") {
  5279. elem.checked=true;
  5280. elem.defaultChecked=true;
  5281. elem.value = vl;
  5282. } else {
  5283. elem.value = "on";
  5284. }
  5285. $(elem).attr("offval","off");
  5286. } else {
  5287. var cbval = options.value.split(":");
  5288. if(vl === cbval[0]) {
  5289. elem.checked=true;
  5290. elem.defaultChecked=true;
  5291. }
  5292. elem.value = cbval[0];
  5293. $(elem).attr("offval",cbval[1]);
  5294. }
  5295. setAttributes(elem, options, ['value']);
  5296. $(elem).attr("role","checkbox");
  5297. break;
  5298. case "select" :
  5299. elem = document.createElement("select");
  5300. elem.setAttribute("role","select");
  5301. var msl, ovm = [];
  5302. if(options.multiple===true) {
  5303. msl = true;
  5304. elem.multiple="multiple";
  5305. $(elem).attr("aria-multiselectable","true");
  5306. } else { msl = false; }
  5307. if(options.dataUrl != null) {
  5308. var rowid = null, postData = options.postData || ajaxso.postData;
  5309. try {
  5310. rowid = options.rowId;
  5311. } catch(e) {}
  5312. if ($t.p && $t.p.idPrefix) {
  5313. rowid = $.jgrid.stripPref($t.p.idPrefix, rowid);
  5314. }
  5315. $.ajax($.extend({
  5316. url: $.isFunction(options.dataUrl) ? options.dataUrl.call($t, rowid, vl, String(options.name)) : options.dataUrl,
  5317. type : "GET",
  5318. dataType: "html",
  5319. data: $.isFunction(postData) ? postData.call($t, rowid, vl, String(options.name)) : postData,
  5320. context: {elem:elem, options:options, vl:vl},
  5321. success: function(data){
  5322. var ovm = [], elem = this.elem, vl = this.vl,
  5323. options = $.extend({},this.options),
  5324. msl = options.multiple===true,
  5325. cU = options.cacheUrlData === true,
  5326. oV ='', txt, vl,
  5327. a = $.isFunction(options.buildSelect) ? options.buildSelect.call($t,data) : data;
  5328. if(typeof a === 'string') {
  5329. a = $( $.trim( a ) ).html();
  5330. }
  5331. if(a) {
  5332. $(elem).append(a);
  5333. setAttributes(elem, options, postData ? ['postData'] : undefined );
  5334. if(options.size === undefined) { options.size = msl ? 3 : 1;}
  5335. if(msl) {
  5336. ovm = vl.split(",");
  5337. ovm = $.map(ovm,function(n){return $.trim(n);});
  5338. } else {
  5339. ovm[0] = $.trim(vl);
  5340. }
  5341. //$(elem).attr(options);
  5342. setTimeout(function(){
  5343. $("option",elem).each(function(i){
  5344. txt = $(this).text();
  5345. vl = $(this).val() || txt;
  5346. if(cU) {
  5347. oV += (i!== 0 ? ";": "")+ vl+":"+txt;
  5348. }
  5349. //if(i===0) { this.selected = ""; }
  5350. // fix IE8/IE7 problem with selecting of the first item on multiple=true
  5351. if (i === 0 && elem.multiple) { this.selected = false; }
  5352. $(this).attr("role","option");
  5353. if($.inArray($.trim(txt),ovm) > -1 || $.inArray($.trim(vl),ovm) > -1 ) {
  5354. this.selected= "selected";
  5355. }
  5356. });
  5357. if(cU) {
  5358. if(options.oper === 'edit') {
  5359. $($t).jqGrid('setColProp',options.name,{ editoptions: {buildSelect: null, dataUrl : null, value : oV} });
  5360. } else if(options.oper === 'search') {
  5361. $($t).jqGrid('setColProp',options.name,{ searchoptions: {dataUrl : null, value : oV} });
  5362. } else if(options.oper ==='filter') {
  5363. if($("#fbox_"+$t.p.id)[0].p) {
  5364. var cols = $("#fbox_"+$t.p.id)[0].p.columns, nm;
  5365. $.each(cols,function(i) {
  5366. nm = this.index || this.name;
  5367. if(options.name === nm) {
  5368. this.searchoptions.dataUrl = null;
  5369. this.searchoptions.value = oV;
  5370. return false;
  5371. }
  5372. });
  5373. }
  5374. }
  5375. }
  5376. },0);
  5377. }
  5378. }
  5379. },ajaxso || {}));
  5380. } else if(options.value) {
  5381. var i;
  5382. if(options.size === undefined) {
  5383. options.size = msl ? 3 : 1;
  5384. }
  5385. if(msl) {
  5386. ovm = vl.split(",");
  5387. ovm = $.map(ovm,function(n){return $.trim(n);});
  5388. }
  5389. if(typeof options.value === 'function') { options.value = options.value(); }
  5390. var so,sv, ov,
  5391. sep = options.separator === undefined ? ":" : options.separator,
  5392. delim = options.delimiter === undefined ? ";" : options.delimiter;
  5393. if(typeof options.value === 'string') {
  5394. so = options.value.split(delim);
  5395. for(i=0; i<so.length;i++){
  5396. sv = so[i].split(sep);
  5397. if(sv.length > 2 ) {
  5398. sv[1] = $.map(sv,function(n,ii){if(ii>0) { return n;} }).join(sep);
  5399. }
  5400. ov = document.createElement("option");
  5401. ov.setAttribute("role","option");
  5402. ov.value = sv[0]; ov.innerHTML = sv[1];
  5403. elem.appendChild(ov);
  5404. if (!msl && ($.trim(sv[0]) === $.trim(vl) || $.trim(sv[1]) === $.trim(vl))) { ov.selected ="selected"; }
  5405. if (msl && ($.inArray($.trim(sv[1]), ovm)>-1 || $.inArray($.trim(sv[0]), ovm)>-1)) {ov.selected ="selected";}
  5406. }
  5407. } else if (Object.prototype.toString.call(options.value) === "[object Array]") {
  5408. var oSv = options.value;
  5409. // array of arrays [[Key, Value], [Key, Value], ...]
  5410. for (var i=0; i<oSv.length; i++) {
  5411. if(oSv[i].length === 2) {
  5412. var key = oSv[i][0], value = oSv[i][1];
  5413. ov = document.createElement("option");
  5414. ov.setAttribute("role","option");
  5415. ov.value = key; ov.innerHTML = value;
  5416. elem.appendChild(ov);
  5417. if (!msl && ( $.trim(key) === $.trim(vl) || $.trim(value) === $.trim(vl)) ) { ov.selected ="selected"; }
  5418. if (msl && ($.inArray($.trim(value),ovm)>-1 || $.inArray($.trim(key),ovm)>-1)) { ov.selected ="selected"; }
  5419. }
  5420. }
  5421. } else if (typeof options.value === 'object') {
  5422. var oSv = options.value, key;
  5423. for (key in oSv) {
  5424. if (oSv.hasOwnProperty(key ) ){
  5425. ov = document.createElement("option");
  5426. ov.setAttribute("role","option");
  5427. ov.value = key; ov.innerHTML = oSv[key];
  5428. elem.appendChild(ov);
  5429. if (!msl && ( $.trim(key) === $.trim(vl) || $.trim(oSv[key]) === $.trim(vl)) ) { ov.selected ="selected"; }
  5430. if (msl && ($.inArray($.trim(oSv[key]),ovm)>-1 || $.inArray($.trim(key),ovm)>-1)) { ov.selected ="selected"; }
  5431. }
  5432. }
  5433. }
  5434. setAttributes(elem, options, ['value']);
  5435. }
  5436. break;
  5437. case "text" :
  5438. case "password" :
  5439. case "button" :
  5440. var role;
  5441. if(eltype==="button") { role = "button"; }
  5442. else { role = "textbox"; }
  5443. elem = document.createElement("input");
  5444. elem.type = eltype;
  5445. elem.value = vl;
  5446. setAttributes(elem, options);
  5447. if(eltype !== "button"){
  5448. if(autowidth) {
  5449. if(!options.size) { $(elem).css({width:"98%"}); }
  5450. } else if (!options.size) { options.size = 20; }
  5451. }
  5452. $(elem).attr("role",role);
  5453. break;
  5454. case "image" :
  5455. case "file" :
  5456. elem = document.createElement("input");
  5457. elem.type = eltype;
  5458. setAttributes(elem, options);
  5459. break;
  5460. case "custom" :
  5461. elem = document.createElement("span");
  5462. try {
  5463. if($.isFunction(options.custom_element)) {
  5464. var celm = options.custom_element.call($t,vl,options);
  5465. if(celm) {
  5466. celm = $(celm).addClass("customelement").attr({id:options.id,name:options.name});
  5467. $(elem).empty().append(celm);
  5468. } else {
  5469. throw "e2";
  5470. }
  5471. } else {
  5472. throw "e1";
  5473. }
  5474. } catch (e) {
  5475. var errors = $.jgrid.getRegional($t, 'errors'),
  5476. edit =$.jgrid.getRegional($t, 'edit');
  5477. if (e==="e1") { $.jgrid.info_dialog(errors.errcap,"function 'custom_element' "+edit.msg.nodefined, edit.bClose);}
  5478. if (e==="e2") { $.jgrid.info_dialog(errors.errcap,"function 'custom_element' "+edit.msg.novalue,edit.bClose);}
  5479. else { $.jgrid.info_dialog(errors.errcap,typeof e==="string"?e:e.message,edit.bClose); }
  5480. }
  5481. break;
  5482. }
  5483. return elem;
  5484. },
  5485. // Date Validation Javascript
  5486. checkDate : function (format, date) {
  5487. var daysInFebruary = function(year){
  5488. // February has 29 days in any year evenly divisible by four,
  5489. // EXCEPT for centurial years which are not also divisible by 400.
  5490. return (((year % 4 === 0) && ( year % 100 !== 0 || (year % 400 === 0))) ? 29 : 28 );
  5491. },
  5492. tsp = {}, sep;
  5493. format = format.toLowerCase();
  5494. //we search for /,-,. for the date separator
  5495. if(format.indexOf("/") !== -1) {
  5496. sep = "/";
  5497. } else if(format.indexOf("-") !== -1) {
  5498. sep = "-";
  5499. } else if(format.indexOf(".") !== -1) {
  5500. sep = ".";
  5501. } else {
  5502. sep = "/";
  5503. }
  5504. format = format.split(sep);
  5505. date = date.split(sep);
  5506. if (date.length !== 3) { return false; }
  5507. var j=-1,yln, dln=-1, mln=-1, i;
  5508. for(i=0;i<format.length;i++){
  5509. var dv = isNaN(date[i]) ? 0 : parseInt(date[i],10);
  5510. tsp[format[i]] = dv;
  5511. yln = format[i];
  5512. if(yln.indexOf("y") !== -1) { j=i; }
  5513. if(yln.indexOf("m") !== -1) { mln=i; }
  5514. if(yln.indexOf("d") !== -1) { dln=i; }
  5515. }
  5516. if (format[j] === "y" || format[j] === "yyyy") {
  5517. yln=4;
  5518. } else if(format[j] ==="yy"){
  5519. yln = 2;
  5520. } else {
  5521. yln = -1;
  5522. }
  5523. var daysInMonth = [0,31,29,31,30,31,30,31,31,30,31,30,31],
  5524. strDate;
  5525. if (j === -1) {
  5526. return false;
  5527. }
  5528. strDate = tsp[format[j]].toString();
  5529. if(yln === 2 && strDate.length === 1) {yln = 1;}
  5530. if (strDate.length !== yln || (tsp[format[j]]===0 && date[j]!=="00")){
  5531. return false;
  5532. }
  5533. if(mln === -1) {
  5534. return false;
  5535. }
  5536. strDate = tsp[format[mln]].toString();
  5537. if (strDate.length<1 || tsp[format[mln]]<1 || tsp[format[mln]]>12){
  5538. return false;
  5539. }
  5540. if(dln === -1) {
  5541. return false;
  5542. }
  5543. strDate = tsp[format[dln]].toString();
  5544. 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]]]){
  5545. return false;
  5546. }
  5547. return true;
  5548. },
  5549. isEmpty : function(val)
  5550. {
  5551. if (val.match(/^\s+$/) || val === "") {
  5552. return true;
  5553. }
  5554. return false;
  5555. },
  5556. checkTime : function(time){
  5557. // checks only hh:ss (and optional am/pm)
  5558. var re = /^(\d{1,2}):(\d{2})([apAP][Mm])?$/,regs;
  5559. if(!$.jgrid.isEmpty(time))
  5560. {
  5561. regs = time.match(re);
  5562. if(regs) {
  5563. if(regs[3]) {
  5564. if(regs[1] < 1 || regs[1] > 12) { return false; }
  5565. } else {
  5566. if(regs[1] > 23) { return false; }
  5567. }
  5568. if(regs[2] > 59) {
  5569. return false;
  5570. }
  5571. } else {
  5572. return false;
  5573. }
  5574. }
  5575. return true;
  5576. },
  5577. checkValues : function(val, valref, customobject, nam) {
  5578. var edtrul,i, nm, dft, len, g = this, cm = g.p.colModel,
  5579. msg = $.jgrid.getRegional(this, 'edit.msg'), fmtdate;
  5580. if(customobject === undefined) {
  5581. if(typeof valref==='string'){
  5582. for( i =0, len=cm.length;i<len; i++){
  5583. if(cm[i].name===valref) {
  5584. edtrul = cm[i].editrules;
  5585. valref = i;
  5586. if(cm[i].formoptions != null) { nm = cm[i].formoptions.label; }
  5587. break;
  5588. }
  5589. }
  5590. } else if(valref >=0) {
  5591. edtrul = cm[valref].editrules;
  5592. }
  5593. } else {
  5594. edtrul = customobject;
  5595. nm = nam===undefined ? "_" : nam;
  5596. }
  5597. if(edtrul) {
  5598. if(!nm) { nm = g.p.colNames != null ? g.p.colNames[valref] : cm[valref].label; }
  5599. if(edtrul.required === true) {
  5600. if( $.jgrid.isEmpty(val) ) { return [false,nm+": "+msg.required,""]; }
  5601. }
  5602. // force required
  5603. var rqfield = edtrul.required === false ? false : true;
  5604. if(edtrul.number === true) {
  5605. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5606. if(isNaN(val)) { return [false,nm+": "+msg.number,""]; }
  5607. }
  5608. }
  5609. if(edtrul.minValue !== undefined && !isNaN(edtrul.minValue)) {
  5610. if (parseFloat(val) < parseFloat(edtrul.minValue) ) { return [false,nm+": "+msg.minValue+" "+edtrul.minValue,""];}
  5611. }
  5612. if(edtrul.maxValue !== undefined && !isNaN(edtrul.maxValue)) {
  5613. if (parseFloat(val) > parseFloat(edtrul.maxValue) ) { return [false,nm+": "+msg.maxValue+" "+edtrul.maxValue,""];}
  5614. }
  5615. var filter;
  5616. if(edtrul.email === true) {
  5617. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5618. // taken from $ Validate plugin
  5619. 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;
  5620. if(!filter.test(val)) {return [false,nm+": "+msg.email,""];}
  5621. }
  5622. }
  5623. if(edtrul.integer === true) {
  5624. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5625. if(isNaN(val)) { return [false,nm+": "+msg.integer,""]; }
  5626. if ((val % 1 !== 0) || (val.indexOf('.') !== -1)) { return [false,nm+": "+msg.integer,""];}
  5627. }
  5628. }
  5629. if(edtrul.date === true) {
  5630. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5631. if(cm[valref].formatoptions && cm[valref].formatoptions.newformat) {
  5632. dft = cm[valref].formatoptions.newformat;
  5633. fmtdate = $.jgrid.getRegional(g, 'formatter.date.masks');
  5634. if(fmtdate && fmtdate.hasOwnProperty(dft) ) {
  5635. dft = fmtdate[dft];
  5636. }
  5637. } else {
  5638. dft = cm[valref].datefmt || "Y-m-d";
  5639. }
  5640. if(!$.jgrid.checkDate (dft, val)) { return [false,nm+": "+msg.date+" - "+dft,""]; }
  5641. }
  5642. }
  5643. if(edtrul.time === true) {
  5644. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5645. if(!$.jgrid.checkTime (val)) { return [false,nm+": "+msg.date+" - hh:mm (am/pm)",""]; }
  5646. }
  5647. }
  5648. if(edtrul.url === true) {
  5649. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5650. filter = /^(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
  5651. if(!filter.test(val)) {return [false,nm+": "+msg.url,""];}
  5652. }
  5653. }
  5654. if(edtrul.custom === true) {
  5655. if( !(rqfield === false && $.jgrid.isEmpty(val)) ) {
  5656. if($.isFunction(edtrul.custom_func)) {
  5657. var ret = edtrul.custom_func.call(g,val,nm,valref);
  5658. return $.isArray(ret) ? ret : [false,msg.customarray,""];
  5659. }
  5660. return [false,msg.customfcheck,""];
  5661. }
  5662. }
  5663. }
  5664. return [true,"",""];
  5665. }
  5666. });
  5667. //module begin
  5668. $.fn.jqFilter = function( arg ) {
  5669. if (typeof arg === 'string') {
  5670. var fn = $.fn.jqFilter[arg];
  5671. if (!fn) {
  5672. throw ("jqFilter - No such method: " + arg);
  5673. }
  5674. var args = $.makeArray(arguments).slice(1);
  5675. return fn.apply(this,args);
  5676. }
  5677. var p = $.extend(true,{
  5678. filter: null,
  5679. columns: [],
  5680. onChange : null,
  5681. afterRedraw : null,
  5682. checkValues : null,
  5683. error: false,
  5684. errmsg : "",
  5685. errorcheck : true,
  5686. showQuery : true,
  5687. sopt : null,
  5688. ops : [],
  5689. operands : null,
  5690. numopts : ['eq','ne', 'lt', 'le', 'gt', 'ge', 'nu', 'nn', 'in', 'ni'],
  5691. stropts : ['eq', 'ne', 'bw', 'bn', 'ew', 'en', 'cn', 'nc', 'nu', 'nn', 'in', 'ni'],
  5692. strarr : ['text', 'string', 'blob'],
  5693. groupOps : [{ op: "AND", text: "AND" }, { op: "OR", text: "OR" }],
  5694. groupButton : true,
  5695. ruleButtons : true,
  5696. direction : "ltr"
  5697. }, $.jgrid.filter, arg || {});
  5698. return this.each( function() {
  5699. if (this.filter) {return;}
  5700. this.p = p;
  5701. // setup filter in case if they is not defined
  5702. if (this.p.filter === null || this.p.filter === undefined) {
  5703. this.p.filter = {
  5704. groupOp: this.p.groupOps[0].op,
  5705. rules: [],
  5706. groups: []
  5707. };
  5708. }
  5709. var i, len = this.p.columns.length, cl,
  5710. isIE = /msie/i.test(navigator.userAgent) && !window.opera;
  5711. // translating the options
  5712. this.p.initFilter = $.extend(true,{},this.p.filter);
  5713. // set default values for the columns if they are not set
  5714. if( !len ) {return;}
  5715. for(i=0; i < len; i++) {
  5716. cl = this.p.columns[i];
  5717. if( cl.stype ) {
  5718. // grid compatibility
  5719. cl.inputtype = cl.stype;
  5720. } else if(!cl.inputtype) {
  5721. cl.inputtype = 'text';
  5722. }
  5723. if( cl.sorttype ) {
  5724. // grid compatibility
  5725. cl.searchtype = cl.sorttype;
  5726. } else if (!cl.searchtype) {
  5727. cl.searchtype = 'string';
  5728. }
  5729. if(cl.hidden === undefined) {
  5730. // jqGrid compatibility
  5731. cl.hidden = false;
  5732. }
  5733. if(!cl.label) {
  5734. cl.label = cl.name;
  5735. }
  5736. if(cl.index) {
  5737. cl.name = cl.index;
  5738. }
  5739. if(!cl.hasOwnProperty('searchoptions')) {
  5740. cl.searchoptions = {};
  5741. }
  5742. if(!cl.hasOwnProperty('searchrules')) {
  5743. cl.searchrules = {};
  5744. }
  5745. }
  5746. if(this.p.showQuery) {
  5747. $(this).append("<table class='queryresult ui-widget ui-widget-content' style='display:block;max-width:440px;border:0px none;' dir='"+this.p.direction+"'><tbody><tr><td class='query'></td></tr></tbody></table>");
  5748. }
  5749. var getGrid = function () {
  5750. return $("#" + $.jgrid.jqID(p.id))[0] || null;
  5751. };
  5752. /*
  5753. *Perform checking.
  5754. *
  5755. */
  5756. var checkData = function(val, colModelItem) {
  5757. var ret = [true,""], $t = getGrid();
  5758. if($.isFunction(colModelItem.searchrules)) {
  5759. ret = colModelItem.searchrules.call($t, val, colModelItem);
  5760. } else if($.jgrid && $.jgrid.checkValues) {
  5761. try {
  5762. ret = $.jgrid.checkValues.call($t, val, -1, colModelItem.searchrules, colModelItem.label);
  5763. } catch (e) {}
  5764. }
  5765. if(ret && ret.length && ret[0] === false) {
  5766. p.error = !ret[0];
  5767. p.errmsg = ret[1];
  5768. }
  5769. };
  5770. /* moving to common
  5771. randId = function() {
  5772. return Math.floor(Math.random()*10000).toString();
  5773. };
  5774. */
  5775. this.onchange = function ( ){
  5776. // clear any error
  5777. this.p.error = false;
  5778. this.p.errmsg="";
  5779. return $.isFunction(this.p.onChange) ? this.p.onChange.call( this, this.p ) : false;
  5780. };
  5781. /*
  5782. * Redraw the filter every time when new field is added/deleted
  5783. * and field is changed
  5784. */
  5785. this.reDraw = function() {
  5786. $("table.group:first",this).remove();
  5787. var t = this.createTableForGroup(p.filter, null);
  5788. $(this).append(t);
  5789. if($.isFunction(this.p.afterRedraw) ) {
  5790. this.p.afterRedraw.call(this, this.p);
  5791. }
  5792. };
  5793. /*
  5794. * Creates a grouping data for the filter
  5795. * @param group - object
  5796. * @param parentgroup - object
  5797. */
  5798. this.createTableForGroup = function(group, parentgroup) {
  5799. var that = this, i;
  5800. // this table will hold all the group (tables) and rules (rows)
  5801. var table = $("<table class='group ui-widget ui-widget-content ui-search-table' style='border:0px none;'><tbody></tbody></table>"),
  5802. // create error message row
  5803. align = "left";
  5804. if(this.p.direction === "rtl") {
  5805. align = "right";
  5806. table.attr("dir","rtl");
  5807. }
  5808. if(parentgroup === null) {
  5809. table.append("<tr class='error' style='display:none;'><th colspan='5' class='ui-state-error' align='"+align+"'></th></tr>");
  5810. }
  5811. var tr = $("<tr></tr>");
  5812. table.append(tr);
  5813. // this header will hold the group operator type and group action buttons for
  5814. // creating subgroup "+ {}", creating rule "+" or deleting the group "-"
  5815. var th = $("<th colspan='5' align='"+align+"'></th>");
  5816. tr.append(th);
  5817. if(this.p.ruleButtons === true) {
  5818. // dropdown for: choosing group operator type
  5819. var groupOpSelect = $("<select class='opsel ui-widget-content ui-corner-all'></select>");
  5820. th.append(groupOpSelect);
  5821. // populate dropdown with all posible group operators: or, and
  5822. var str= "", selected;
  5823. for (i = 0; i < p.groupOps.length; i++) {
  5824. selected = group.groupOp === that.p.groupOps[i].op ? " selected='selected'" :"";
  5825. str += "<option value='"+that.p.groupOps[i].op+"'" + selected+">"+that.p.groupOps[i].text+"</option>";
  5826. }
  5827. groupOpSelect
  5828. .append(str)
  5829. .bind('change',function() {
  5830. group.groupOp = $(groupOpSelect).val();
  5831. that.onchange(); // signals that the filter has changed
  5832. });
  5833. }
  5834. // button for adding a new subgroup
  5835. var inputAddSubgroup ="<span></span>";
  5836. if(this.p.groupButton) {
  5837. inputAddSubgroup = $("<input type='button' value='+ {}' title='Add subgroup' class='add-group ui-widget-content ui-corner-all'/>");
  5838. inputAddSubgroup.bind('click',function() {
  5839. if (group.groups === undefined ) {
  5840. group.groups = [];
  5841. }
  5842. group.groups.push({
  5843. groupOp: p.groupOps[0].op,
  5844. rules: [],
  5845. groups: []
  5846. }); // adding a new group
  5847. that.reDraw(); // the html has changed, force reDraw
  5848. that.onchange(); // signals that the filter has changed
  5849. return false;
  5850. });
  5851. }
  5852. th.append(inputAddSubgroup);
  5853. if(this.p.ruleButtons === true) {
  5854. // button for adding a new rule
  5855. var inputAddRule = $("<input type='button' value='+' title='Add rule' class='add-rule ui-add ui-widget-content ui-corner-all'/>"), cm;
  5856. inputAddRule.bind('click',function() {
  5857. //if(!group) { group = {};}
  5858. if (group.rules === undefined) {
  5859. group.rules = [];
  5860. }
  5861. for (i = 0; i < that.p.columns.length; i++) {
  5862. // but show only serchable and serchhidden = true fields
  5863. var searchable = (that.p.columns[i].search === undefined) ? true: that.p.columns[i].search,
  5864. hidden = (that.p.columns[i].hidden === true),
  5865. ignoreHiding = (that.p.columns[i].searchoptions.searchhidden === true);
  5866. if ((ignoreHiding && searchable) || (searchable && !hidden)) {
  5867. cm = that.p.columns[i];
  5868. break;
  5869. }
  5870. }
  5871. var opr;
  5872. if( cm.searchoptions.sopt ) {opr = cm.searchoptions.sopt;}
  5873. else if(that.p.sopt) { opr= that.p.sopt; }
  5874. else if ( $.inArray(cm.searchtype, that.p.strarr) !== -1 ) {opr = that.p.stropts;}
  5875. else {opr = that.p.numopts;}
  5876. group.rules.push({
  5877. field: cm.name,
  5878. op: opr[0],
  5879. data: ""
  5880. }); // adding a new rule
  5881. that.reDraw(); // the html has changed, force reDraw
  5882. // for the moment no change have been made to the rule, so
  5883. // this will not trigger onchange event
  5884. return false;
  5885. });
  5886. th.append(inputAddRule);
  5887. }
  5888. // button for delete the group
  5889. if (parentgroup !== null) { // ignore the first group
  5890. var inputDeleteGroup = $("<input type='button' value='-' title='Delete group' class='delete-group ui-widget-content ui-corner-all'/>");
  5891. th.append(inputDeleteGroup);
  5892. inputDeleteGroup.bind('click',function() {
  5893. // remove group from parent
  5894. for (i = 0; i < parentgroup.groups.length; i++) {
  5895. if (parentgroup.groups[i] === group) {
  5896. parentgroup.groups.splice(i, 1);
  5897. break;
  5898. }
  5899. }
  5900. that.reDraw(); // the html has changed, force reDraw
  5901. that.onchange(); // signals that the filter has changed
  5902. return false;
  5903. });
  5904. }
  5905. // append subgroup rows
  5906. if (group.groups !== undefined) {
  5907. for (i = 0; i < group.groups.length; i++) {
  5908. var trHolderForSubgroup = $("<tr></tr>");
  5909. table.append(trHolderForSubgroup);
  5910. var tdFirstHolderForSubgroup = $("<td class='first'></td>");
  5911. trHolderForSubgroup.append(tdFirstHolderForSubgroup);
  5912. var tdMainHolderForSubgroup = $("<td colspan='4'></td>");
  5913. tdMainHolderForSubgroup.append(this.createTableForGroup(group.groups[i], group));
  5914. trHolderForSubgroup.append(tdMainHolderForSubgroup);
  5915. }
  5916. }
  5917. if(group.groupOp === undefined) {
  5918. group.groupOp = that.p.groupOps[0].op;
  5919. }
  5920. // append rules rows
  5921. if (group.rules !== undefined) {
  5922. for (i = 0; i < group.rules.length; i++) {
  5923. table.append(
  5924. this.createTableRowForRule(group.rules[i], group)
  5925. );
  5926. }
  5927. }
  5928. return table;
  5929. };
  5930. /*
  5931. * Create the rule data for the filter
  5932. */
  5933. this.createTableRowForRule = function(rule, group ) {
  5934. // save current entity in a variable so that it could
  5935. // be referenced in anonimous method calls
  5936. var that=this, $t = getGrid(), tr = $("<tr></tr>"),
  5937. //document.createElement("tr"),
  5938. // first column used for padding
  5939. //tdFirstHolderForRule = document.createElement("td"),
  5940. i, op, trpar, cm, str="", selected;
  5941. //tdFirstHolderForRule.setAttribute("class", "first");
  5942. tr.append("<td class='first'></td>");
  5943. // create field container
  5944. var ruleFieldTd = $("<td class='columns'></td>");
  5945. tr.append(ruleFieldTd);
  5946. // dropdown for: choosing field
  5947. var ruleFieldSelect = $("<select class='ui-widget-content ui-corner-all'></select>"), ina, aoprs = [];
  5948. ruleFieldTd.append(ruleFieldSelect);
  5949. ruleFieldSelect.bind('change',function() {
  5950. rule.field = $(ruleFieldSelect).val();
  5951. trpar = $(this).parents("tr:first");
  5952. for (i=0;i<that.p.columns.length;i++) {
  5953. if(that.p.columns[i].name === rule.field) {
  5954. cm = that.p.columns[i];
  5955. break;
  5956. }
  5957. }
  5958. if(!cm) {return;}
  5959. cm.searchoptions.id = $.jgrid.randId();
  5960. cm.searchoptions.name = rule.field;
  5961. cm.searchoptions.oper = 'filter';
  5962. if(isIE && cm.inputtype === "text") {
  5963. if(!cm.searchoptions.size) {
  5964. cm.searchoptions.size = 10;
  5965. }
  5966. }
  5967. var elm = $.jgrid.createEl.call($t, cm.inputtype,cm.searchoptions, "", true, that.p.ajaxSelectOptions || {}, true);
  5968. $(elm).addClass("input-elm ui-widget-content ui-corner-all");
  5969. //that.createElement(rule, "");
  5970. if( cm.searchoptions.sopt ) {op = cm.searchoptions.sopt;}
  5971. else if(that.p.sopt) { op= that.p.sopt; }
  5972. else if ($.inArray(cm.searchtype, that.p.strarr) !== -1) {op = that.p.stropts;}
  5973. else {op = that.p.numopts;}
  5974. // operators
  5975. var s ="", so = 0;
  5976. aoprs = [];
  5977. $.each(that.p.ops, function() { aoprs.push(this.oper); });
  5978. for ( i = 0 ; i < op.length; i++) {
  5979. ina = $.inArray(op[i],aoprs);
  5980. if(ina !== -1) {
  5981. if(so===0) {
  5982. rule.op = that.p.ops[ina].oper;
  5983. }
  5984. s += "<option value='"+that.p.ops[ina].oper+"'>"+that.p.ops[ina].text+"</option>";
  5985. so++;
  5986. }
  5987. }
  5988. $(".selectopts",trpar).empty().append( s );
  5989. $(".selectopts",trpar)[0].selectedIndex = 0;
  5990. if( $.jgrid.msie && $.jgrid.msiever() < 9) {
  5991. var sw = parseInt($("select.selectopts",trpar)[0].offsetWidth, 10) + 1;
  5992. $(".selectopts",trpar).width( sw );
  5993. $(".selectopts",trpar).css("width","auto");
  5994. }
  5995. // data
  5996. $(".data",trpar).empty().append( elm );
  5997. $.jgrid.bindEv.call($t, elm, cm.searchoptions);
  5998. $(".input-elm",trpar).bind('change',function( e ) {
  5999. var elem = e.target;
  6000. rule.data = elem.nodeName.toUpperCase() === "SPAN" && cm.searchoptions && $.isFunction(cm.searchoptions.custom_value) ?
  6001. cm.searchoptions.custom_value.call($t, $(elem).children(".customelement:first"), 'get') : elem.value;
  6002. that.onchange(); // signals that the filter has changed
  6003. });
  6004. setTimeout(function(){ //IE, Opera, Chrome
  6005. rule.data = $(elm).val();
  6006. that.onchange(); // signals that the filter has changed
  6007. }, 0);
  6008. });
  6009. // populate drop down with user provided column definitions
  6010. var j=0;
  6011. for (i = 0; i < that.p.columns.length; i++) {
  6012. // but show only serchable and serchhidden = true fields
  6013. var searchable = (that.p.columns[i].search === undefined) ? true: that.p.columns[i].search,
  6014. hidden = (that.p.columns[i].hidden === true),
  6015. ignoreHiding = (that.p.columns[i].searchoptions.searchhidden === true);
  6016. if ((ignoreHiding && searchable) || (searchable && !hidden)) {
  6017. selected = "";
  6018. if(rule.field === that.p.columns[i].name) {
  6019. selected = " selected='selected'";
  6020. j=i;
  6021. }
  6022. str += "<option value='"+that.p.columns[i].name+"'" +selected+">"+that.p.columns[i].label+"</option>";
  6023. }
  6024. }
  6025. ruleFieldSelect.append( str );
  6026. // create operator container
  6027. var ruleOperatorTd = $("<td class='operators'></td>");
  6028. tr.append(ruleOperatorTd);
  6029. cm = p.columns[j];
  6030. // create it here so it can be referentiated in the onchange event
  6031. //var RD = that.createElement(rule, rule.data);
  6032. cm.searchoptions.id = $.jgrid.randId();
  6033. if(isIE && cm.inputtype === "text") {
  6034. if(!cm.searchoptions.size) {
  6035. cm.searchoptions.size = 10;
  6036. }
  6037. }
  6038. cm.searchoptions.name = rule.field;
  6039. cm.searchoptions.oper = 'filter';
  6040. var ruleDataInput = $.jgrid.createEl.call($t, cm.inputtype,cm.searchoptions, rule.data, true, that.p.ajaxSelectOptions || {}, true);
  6041. if(rule.op === 'nu' || rule.op === 'nn') {
  6042. $(ruleDataInput).attr('readonly','true');
  6043. $(ruleDataInput).attr('disabled','true');
  6044. } //retain the state of disabled text fields in case of null ops
  6045. // dropdown for: choosing operator
  6046. var ruleOperatorSelect = $("<select class='selectopts ui-widget-content ui-corner-all'></select>");
  6047. ruleOperatorTd.append(ruleOperatorSelect);
  6048. ruleOperatorSelect.bind('change',function() {
  6049. rule.op = $(ruleOperatorSelect).val();
  6050. trpar = $(this).parents("tr:first");
  6051. var rd = $(".input-elm",trpar)[0];
  6052. if (rule.op === "nu" || rule.op === "nn") { // disable for operator "is null" and "is not null"
  6053. rule.data = "";
  6054. if(rd.tagName.toUpperCase() !== 'SELECT') { rd.value = ""; }
  6055. rd.setAttribute("readonly", "true");
  6056. rd.setAttribute("disabled", "true");
  6057. } else {
  6058. if(rd.tagName.toUpperCase() === 'SELECT') { rule.data = rd.value; }
  6059. rd.removeAttribute("readonly");
  6060. rd.removeAttribute("disabled");
  6061. }
  6062. that.onchange(); // signals that the filter has changed
  6063. });
  6064. // populate drop down with all available operators
  6065. if( cm.searchoptions.sopt ) {op = cm.searchoptions.sopt;}
  6066. else if(that.p.sopt) { op= that.p.sopt; }
  6067. else if ($.inArray(cm.searchtype, that.p.strarr) !== -1) {op = that.p.stropts;}
  6068. else {op = that.p.numopts;}
  6069. str="";
  6070. $.each(that.p.ops, function() { aoprs.push(this.oper); });
  6071. for ( i = 0; i < op.length; i++) {
  6072. ina = $.inArray(op[i],aoprs);
  6073. if(ina !== -1) {
  6074. selected = rule.op === that.p.ops[ina].oper ? " selected='selected'" : "";
  6075. str += "<option value='"+that.p.ops[ina].oper+"'"+selected+">"+that.p.ops[ina].text+"</option>";
  6076. }
  6077. }
  6078. ruleOperatorSelect.append( str );
  6079. // create data container
  6080. var ruleDataTd = $("<td class='data'></td>");
  6081. tr.append(ruleDataTd);
  6082. // textbox for: data
  6083. // is created previously
  6084. //ruleDataInput.setAttribute("type", "text");
  6085. ruleDataTd.append(ruleDataInput);
  6086. $.jgrid.bindEv.call($t, ruleDataInput, cm.searchoptions);
  6087. $(ruleDataInput)
  6088. .addClass("input-elm ui-widget-content ui-corner-all")
  6089. .bind('change', function() {
  6090. rule.data = cm.inputtype === 'custom' ? cm.searchoptions.custom_value.call($t, $(this).children(".customelement:first"),'get') : $(this).val();
  6091. that.onchange(); // signals that the filter has changed
  6092. });
  6093. // create action container
  6094. var ruleDeleteTd = $("<td></td>");
  6095. tr.append(ruleDeleteTd);
  6096. // create button for: delete rule
  6097. if(this.p.ruleButtons === true) {
  6098. var ruleDeleteInput = $("<input type='button' value='-' title='Delete rule' class='delete-rule ui-del ui-widget-content ui-corner-all'/>");
  6099. ruleDeleteTd.append(ruleDeleteInput);
  6100. //$(ruleDeleteInput).html("").height(20).width(30).button({icons: { primary: "ui-icon-minus", text:false}});
  6101. ruleDeleteInput.bind('click',function() {
  6102. // remove rule from group
  6103. for (i = 0; i < group.rules.length; i++) {
  6104. if (group.rules[i] === rule) {
  6105. group.rules.splice(i, 1);
  6106. break;
  6107. }
  6108. }
  6109. that.reDraw(); // the html has changed, force reDraw
  6110. that.onchange(); // signals that the filter has changed
  6111. return false;
  6112. });
  6113. }
  6114. return tr;
  6115. };
  6116. this.getStringForGroup = function(group) {
  6117. var s = "(", index;
  6118. if (group.groups !== undefined) {
  6119. for (index = 0; index < group.groups.length; index++) {
  6120. if (s.length > 1) {
  6121. s += " " + group.groupOp + " ";
  6122. }
  6123. try {
  6124. s += this.getStringForGroup(group.groups[index]);
  6125. } catch (eg) {alert(eg);}
  6126. }
  6127. }
  6128. if (group.rules !== undefined) {
  6129. try{
  6130. for (index = 0; index < group.rules.length; index++) {
  6131. if (s.length > 1) {
  6132. s += " " + group.groupOp + " ";
  6133. }
  6134. s += this.getStringForRule(group.rules[index]);
  6135. }
  6136. } catch (e) {alert(e);}
  6137. }
  6138. s += ")";
  6139. if (s === "()") {
  6140. return ""; // ignore groups that don't have rules
  6141. }
  6142. return s;
  6143. };
  6144. this.getStringForRule = function(rule) {
  6145. var opUF = "",opC="", i, cm, ret, val,
  6146. numtypes = ['int', 'integer', 'float', 'number', 'currency']; // jqGrid
  6147. for (i = 0; i < this.p.ops.length; i++) {
  6148. if (this.p.ops[i].oper === rule.op) {
  6149. opUF = this.p.operands.hasOwnProperty(rule.op) ? this.p.operands[rule.op] : "";
  6150. opC = this.p.ops[i].oper;
  6151. break;
  6152. }
  6153. }
  6154. for (i=0; i<this.p.columns.length; i++) {
  6155. if(this.p.columns[i].name === rule.field) {
  6156. cm = this.p.columns[i];
  6157. break;
  6158. }
  6159. }
  6160. if (cm === undefined) { return ""; }
  6161. val = rule.data;
  6162. if(opC === 'bw' || opC === 'bn') { val = val+"%"; }
  6163. if(opC === 'ew' || opC === 'en') { val = "%"+val; }
  6164. if(opC === 'cn' || opC === 'nc') { val = "%"+val+"%"; }
  6165. if(opC === 'in' || opC === 'ni') { val = " ("+val+")"; }
  6166. if(p.errorcheck) { checkData(rule.data, cm); }
  6167. if($.inArray(cm.searchtype, numtypes) !== -1 || opC === 'nn' || opC === 'nu') { ret = rule.field + " " + opUF + " " + val; }
  6168. else { ret = rule.field + " " + opUF + " \"" + val + "\""; }
  6169. return ret;
  6170. };
  6171. this.resetFilter = function () {
  6172. this.p.filter = $.extend(true,{},this.p.initFilter);
  6173. this.reDraw();
  6174. this.onchange();
  6175. };
  6176. this.hideError = function() {
  6177. $("th.ui-state-error", this).html("");
  6178. $("tr.error", this).hide();
  6179. };
  6180. this.showError = function() {
  6181. $("th.ui-state-error", this).html(this.p.errmsg);
  6182. $("tr.error", this).show();
  6183. };
  6184. this.toUserFriendlyString = function() {
  6185. return this.getStringForGroup(p.filter);
  6186. };
  6187. this.toString = function() {
  6188. // this will obtain a string that can be used to match an item.
  6189. var that = this;
  6190. function getStringRule(rule) {
  6191. if(that.p.errorcheck) {
  6192. var i, cm;
  6193. for (i=0; i<that.p.columns.length; i++) {
  6194. if(that.p.columns[i].name === rule.field) {
  6195. cm = that.p.columns[i];
  6196. break;
  6197. }
  6198. }
  6199. if(cm) {checkData(rule.data, cm);}
  6200. }
  6201. return rule.op + "(item." + rule.field + ",'" + rule.data + "')";
  6202. }
  6203. function getStringForGroup(group) {
  6204. var s = "(", index;
  6205. if (group.groups !== undefined) {
  6206. for (index = 0; index < group.groups.length; index++) {
  6207. if (s.length > 1) {
  6208. if (group.groupOp === "OR") {
  6209. s += " || ";
  6210. }
  6211. else {
  6212. s += " && ";
  6213. }
  6214. }
  6215. s += getStringForGroup(group.groups[index]);
  6216. }
  6217. }
  6218. if (group.rules !== undefined) {
  6219. for (index = 0; index < group.rules.length; index++) {
  6220. if (s.length > 1) {
  6221. if (group.groupOp === "OR") {
  6222. s += " || ";
  6223. }
  6224. else {
  6225. s += " && ";
  6226. }
  6227. }
  6228. s += getStringRule(group.rules[index]);
  6229. }
  6230. }
  6231. s += ")";
  6232. if (s === "()") {
  6233. return ""; // ignore groups that don't have rules
  6234. }
  6235. return s;
  6236. }
  6237. return getStringForGroup(this.p.filter);
  6238. };
  6239. // Here we init the filter
  6240. this.reDraw();
  6241. if(this.p.showQuery) {
  6242. this.onchange();
  6243. }
  6244. // mark is as created so that it will not be created twice on this element
  6245. this.filter = true;
  6246. });
  6247. };
  6248. $.extend($.fn.jqFilter,{
  6249. /*
  6250. * Return SQL like string. Can be used directly
  6251. */
  6252. toSQLString : function()
  6253. {
  6254. var s ="";
  6255. this.each(function(){
  6256. s = this.toUserFriendlyString();
  6257. });
  6258. return s;
  6259. },
  6260. /*
  6261. * Return filter data as object.
  6262. */
  6263. filterData : function()
  6264. {
  6265. var s;
  6266. this.each(function(){
  6267. s = this.p.filter;
  6268. });
  6269. return s;
  6270. },
  6271. getParameter : function (param) {
  6272. if(param !== undefined) {
  6273. if (this.p.hasOwnProperty(param) ) {
  6274. return this.p[param];
  6275. }
  6276. }
  6277. return this.p;
  6278. },
  6279. resetFilter: function() {
  6280. return this.each(function(){
  6281. this.resetFilter();
  6282. });
  6283. },
  6284. addFilter: function (pfilter) {
  6285. if (typeof pfilter === "string") {
  6286. pfilter = $.jgrid.parse( pfilter );
  6287. }
  6288. this.each(function(){
  6289. this.p.filter = pfilter;
  6290. this.reDraw();
  6291. this.onchange();
  6292. });
  6293. }
  6294. });
  6295. $.jgrid.extend({
  6296. filterToolbar : function(p){
  6297. var regional = $.jgrid.getRegional(this[0], 'search');
  6298. p = $.extend({
  6299. autosearch: true,
  6300. autosearchDelay: 500,
  6301. searchOnEnter : true,
  6302. beforeSearch: null,
  6303. afterSearch: null,
  6304. beforeClear: null,
  6305. afterClear: null,
  6306. searchurl : '',
  6307. stringResult: false,
  6308. groupOp: 'AND',
  6309. defaultSearch : "bw",
  6310. searchOperators : false,
  6311. resetIcon : "x",
  6312. operands : { "eq" :"==", "ne":"!","lt":"<","le":"<=","gt":">","ge":">=","bw":"^","bn":"!^","in":"=","ni":"!=","ew":"|","en":"!@","cn":"~","nc":"!~","nu":"#","nn":"!#"}
  6313. }, regional , p || {});
  6314. return this.each(function(){
  6315. var $t = this;
  6316. if($t.p.filterToolbar) { return; }
  6317. if(!$($t).data('filterToolbar')) {
  6318. $($t).data('filterToolbar', p);
  6319. }
  6320. if($t.p.force_regional) {
  6321. p = $.extend(p, regional);
  6322. }
  6323. var triggerToolbar = function() {
  6324. var sdata={}, j=0, v, nm, sopt={},so;
  6325. $.each($t.p.colModel,function(){
  6326. var $elem = $("#gs_"+ $t.p.idPrefix + $.jgrid.jqID(this.name), (this.frozen===true && $t.p.frozenColumns === true) ? $t.grid.fhDiv : $t.grid.hDiv);
  6327. nm = this.index || this.name;
  6328. if(p.searchOperators ) {
  6329. so = $elem.parent().prev().children("a").attr("soper") || p.defaultSearch;
  6330. } else {
  6331. so = (this.searchoptions && this.searchoptions.sopt) ? this.searchoptions.sopt[0] : this.stype==='select'? 'eq' : p.defaultSearch;
  6332. }
  6333. v = this.stype === "custom" && $.isFunction(this.searchoptions.custom_value) && $elem.length > 0 && $elem[0].nodeName.toUpperCase() === "SPAN" ?
  6334. this.searchoptions.custom_value.call($t, $elem.children(".customelement:first"), "get") :
  6335. $elem.val();
  6336. if(v || so==="nu" || so==="nn") {
  6337. sdata[nm] = v;
  6338. sopt[nm] = so;
  6339. j++;
  6340. } else {
  6341. try {
  6342. delete $t.p.postData[nm];
  6343. } catch (z) {}
  6344. }
  6345. });
  6346. var sd = j>0 ? true : false;
  6347. if(p.stringResult === true || $t.p.datatype === "local" || p.searchOperators === true) {
  6348. var ruleGroup = "{\"groupOp\":\"" + p.groupOp + "\",\"rules\":[";
  6349. var gi=0;
  6350. $.each(sdata,function(i,n){
  6351. if (gi > 0) {ruleGroup += ",";}
  6352. ruleGroup += "{\"field\":\"" + i + "\",";
  6353. ruleGroup += "\"op\":\"" + sopt[i] + "\",";
  6354. n+="";
  6355. ruleGroup += "\"data\":\"" + n.replace(/\\/g,'\\\\').replace(/\"/g,'\\"') + "\"}";
  6356. gi++;
  6357. });
  6358. ruleGroup += "]}";
  6359. $.extend($t.p.postData,{filters:ruleGroup});
  6360. $.each(['searchField', 'searchString', 'searchOper'], function(i, n){
  6361. if($t.p.postData.hasOwnProperty(n)) { delete $t.p.postData[n];}
  6362. });
  6363. } else {
  6364. $.extend($t.p.postData,sdata);
  6365. }
  6366. var saveurl;
  6367. if($t.p.searchurl) {
  6368. saveurl = $t.p.url;
  6369. $($t).jqGrid("setGridParam",{url:$t.p.searchurl});
  6370. }
  6371. var bsr = $($t).triggerHandler("jqGridToolbarBeforeSearch") === 'stop' ? true : false;
  6372. if(!bsr && $.isFunction(p.beforeSearch)){bsr = p.beforeSearch.call($t);}
  6373. if(!bsr) { $($t).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]); }
  6374. if(saveurl) {$($t).jqGrid("setGridParam",{url:saveurl});}
  6375. $($t).triggerHandler("jqGridToolbarAfterSearch");
  6376. if($.isFunction(p.afterSearch)){p.afterSearch.call($t);}
  6377. },
  6378. clearToolbar = function(trigger){
  6379. var sdata={}, j=0, nm;
  6380. trigger = (typeof trigger !== 'boolean') ? true : trigger;
  6381. $.each($t.p.colModel,function(){
  6382. var v, $elem = $("#gs_"+$t.p.idPrefix+$.jgrid.jqID(this.name),(this.frozen===true && $t.p.frozenColumns === true) ? $t.grid.fhDiv : $t.grid.hDiv);
  6383. if(this.searchoptions && this.searchoptions.defaultValue !== undefined) { v = this.searchoptions.defaultValue; }
  6384. nm = this.index || this.name;
  6385. switch (this.stype) {
  6386. case 'select' :
  6387. $elem.find("option").each(function (i){
  6388. if(i===0) { this.selected = true; }
  6389. if ($(this).val() === v) {
  6390. this.selected = true;
  6391. return false;
  6392. }
  6393. });
  6394. if ( v !== undefined ) {
  6395. // post the key and not the text
  6396. sdata[nm] = v;
  6397. j++;
  6398. } else {
  6399. try {
  6400. delete $t.p.postData[nm];
  6401. } catch(e) {}
  6402. }
  6403. break;
  6404. case 'text':
  6405. $elem.val(v || "");
  6406. if(v !== undefined) {
  6407. sdata[nm] = v;
  6408. j++;
  6409. } else {
  6410. try {
  6411. delete $t.p.postData[nm];
  6412. } catch (y){}
  6413. }
  6414. break;
  6415. case 'custom':
  6416. if ($.isFunction(this.searchoptions.custom_value) && $elem.length > 0 && $elem[0].nodeName.toUpperCase() === "SPAN") {
  6417. this.searchoptions.custom_value.call($t, $elem.children(".customelement:first"), "set", v || "");
  6418. }
  6419. break;
  6420. }
  6421. });
  6422. var sd = j>0 ? true : false;
  6423. $t.p.resetsearch = true;
  6424. if(p.stringResult === true || $t.p.datatype === "local") {
  6425. var ruleGroup = "{\"groupOp\":\"" + p.groupOp + "\",\"rules\":[";
  6426. var gi=0;
  6427. $.each(sdata,function(i,n){
  6428. if (gi > 0) {ruleGroup += ",";}
  6429. ruleGroup += "{\"field\":\"" + i + "\",";
  6430. ruleGroup += "\"op\":\"" + "eq" + "\",";
  6431. n+="";
  6432. ruleGroup += "\"data\":\"" + n.replace(/\\/g,'\\\\').replace(/\"/g,'\\"') + "\"}";
  6433. gi++;
  6434. });
  6435. ruleGroup += "]}";
  6436. $.extend($t.p.postData,{filters:ruleGroup});
  6437. $.each(['searchField', 'searchString', 'searchOper'], function(i, n){
  6438. if($t.p.postData.hasOwnProperty(n)) { delete $t.p.postData[n];}
  6439. });
  6440. } else {
  6441. $.extend($t.p.postData,sdata);
  6442. }
  6443. var saveurl;
  6444. if($t.p.searchurl) {
  6445. saveurl = $t.p.url;
  6446. $($t).jqGrid("setGridParam",{url:$t.p.searchurl});
  6447. }
  6448. var bcv = $($t).triggerHandler("jqGridToolbarBeforeClear") === 'stop' ? true : false;
  6449. if(!bcv && $.isFunction(p.beforeClear)){bcv = p.beforeClear.call($t);}
  6450. if(!bcv) {
  6451. if(trigger) {
  6452. $($t).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]);
  6453. }
  6454. }
  6455. if(saveurl) {$($t).jqGrid("setGridParam",{url:saveurl});}
  6456. $($t).triggerHandler("jqGridToolbarAfterClear");
  6457. if($.isFunction(p.afterClear)){p.afterClear();}
  6458. },
  6459. toggleToolbar = function(){
  6460. var trow = $("tr.ui-search-toolbar",$t.grid.hDiv),
  6461. trow2 = $t.p.frozenColumns === true ? $("tr.ui-search-toolbar",$t.grid.fhDiv) : false;
  6462. if(trow.css("display") === 'none') {
  6463. trow.show();
  6464. if(trow2) {
  6465. trow2.show();
  6466. }
  6467. } else {
  6468. trow.hide();
  6469. if(trow2) {
  6470. trow2.hide();
  6471. }
  6472. }
  6473. },
  6474. buildRuleMenu = function( elem, left, top ){
  6475. $("#sopt_menu").remove();
  6476. left=parseInt(left,10);
  6477. top=parseInt(top,10) + 18;
  6478. var fs = $('.ui-jqgrid-view').css('font-size') || '11px';
  6479. var str = '<ul id="sopt_menu" class="ui-search-menu" role="menu" tabindex="0" style="font-size:'+fs+';left:'+left+'px;top:'+top+'px;">',
  6480. selected = $(elem).attr("soper"), selclass,
  6481. aoprs = [], ina;
  6482. var i=0, nm =$(elem).attr("colname"),len = $t.p.colModel.length;
  6483. while(i<len) {
  6484. if($t.p.colModel[i].name === nm) {
  6485. break;
  6486. }
  6487. i++;
  6488. }
  6489. var cm = $t.p.colModel[i], options = $.extend({}, cm.searchoptions);
  6490. if(!options.sopt) {
  6491. options.sopt = [];
  6492. options.sopt[0]= cm.stype==='select' ? 'eq' : p.defaultSearch;
  6493. }
  6494. $.each(p.odata, function() { aoprs.push(this.oper); });
  6495. for ( i = 0 ; i < options.sopt.length; i++) {
  6496. ina = $.inArray(options.sopt[i],aoprs);
  6497. if(ina !== -1) {
  6498. selclass = selected === p.odata[ina].oper ? "ui-state-highlight" : "";
  6499. str += '<li class="ui-menu-item '+selclass+'" role="presentation"><a class="ui-corner-all g-menu-item" tabindex="0" role="menuitem" value="'+p.odata[ina].oper+'" oper="'+p.operands[p.odata[ina].oper]+'"><table cellspacing="0" cellpadding="0" border="0"><tr><td width="25px">'+p.operands[p.odata[ina].oper]+'</td><td>'+ p.odata[ina].text+'</td></tr></table></a></li>';
  6500. }
  6501. }
  6502. str += "</ul>";
  6503. $('body').append(str);
  6504. $("#sopt_menu").addClass("ui-menu ui-widget ui-widget-content ui-corner-all");
  6505. $("#sopt_menu > li > a").hover(
  6506. function(){ $(this).addClass("ui-state-hover"); },
  6507. function(){ $(this).removeClass("ui-state-hover"); }
  6508. ).click(function() {
  6509. var v = $(this).attr("value"),
  6510. oper = $(this).attr("oper");
  6511. $($t).triggerHandler("jqGridToolbarSelectOper", [v, oper, elem]);
  6512. $("#sopt_menu").hide();
  6513. $(elem).text(oper).attr("soper",v);
  6514. if(p.autosearch===true){
  6515. var inpelm = $(elem).parent().next().children()[0];
  6516. if( $(inpelm).val() || v==="nu" || v ==="nn") {
  6517. triggerToolbar();
  6518. }
  6519. }
  6520. });
  6521. };
  6522. // create the row
  6523. var tr = $("<tr class='ui-search-toolbar' role='row'></tr>");
  6524. var timeoutHnd;
  6525. $.each($t.p.colModel,function(ci){
  6526. var cm=this, soptions, select = "", sot="=", so, i, st, csv, df, elem,
  6527. th = $("<th role='columnheader' class='ui-state-default ui-th-"+$t.p.direction+"' id='gsh_" + $t.p.id + "_" + cm.name + "' ></th>"),
  6528. thd = $("<div></div>"),
  6529. stbl = $("<table class='ui-search-table' cellspacing='0'><tr><td class='ui-search-oper' headers=''></td><td class='ui-search-input' headers=''></td><td class='ui-search-clear' headers=''></td></tr></table>");
  6530. if(this.hidden===true) { $(th).css("display","none");}
  6531. this.search = this.search === false ? false : true;
  6532. if(this.stype === undefined) {this.stype='text';}
  6533. soptions = $.extend({},this.searchoptions || {}, {name:cm.index || cm.name, id: "gs_"+$t.p.idPrefix+cm.name, oper:'search'});
  6534. if(this.search){
  6535. if(p.searchOperators) {
  6536. so = (soptions.sopt) ? soptions.sopt[0] : cm.stype==='select' ? 'eq' : p.defaultSearch;
  6537. for(i = 0;i<p.odata.length;i++) {
  6538. if(p.odata[i].oper === so) {
  6539. sot = p.operands[so] || "";
  6540. break;
  6541. }
  6542. }
  6543. st = soptions.searchtitle != null ? soptions.searchtitle : p.operandTitle;
  6544. select = "<a title='"+st+"' style='padding-right: 0.5em;' soper='"+so+"' class='soptclass' colname='"+this.name+"'>"+sot+"</a>";
  6545. }
  6546. $("td:eq(0)",stbl).attr("colindex",ci).append(select);
  6547. if(soptions.clearSearch === undefined) {
  6548. soptions.clearSearch = true;
  6549. }
  6550. if(soptions.clearSearch) {
  6551. csv = p.resetTitle || 'Clear Search Value';
  6552. $("td:eq(2)",stbl).append("<a title='"+csv+"' style='padding-right: 0.3em;padding-left: 0.3em;' class='clearsearchclass'>"+p.resetIcon+"</a>");
  6553. } else {
  6554. $("td:eq(2)", stbl).hide();
  6555. }
  6556. if(this.surl) {
  6557. soptions.dataUrl = this.surl;
  6558. }
  6559. df="";
  6560. if(soptions.defaultValue ) {
  6561. df = $.isFunction(soptions.defaultValue) ? soptions.defaultValue.call($t) : soptions.defaultValue;
  6562. }
  6563. elem = $.jgrid.createEl.call($t, this.stype, soptions , df, false, $.extend({},$.jgrid.ajaxOptions, $t.p.ajaxSelectOptions || {}));
  6564. $(elem).css({width: "100%"}).addClass("ui-widget-content ui-corner-all");
  6565. $("td:eq(1)",stbl).append(elem);
  6566. $(thd).append(stbl);
  6567. switch (this.stype)
  6568. {
  6569. case "select":
  6570. if(p.autosearch === true) {
  6571. soptions.dataEvents = [ {
  6572. type : "change",
  6573. fn : function() {
  6574. triggerToolbar();
  6575. return false;
  6576. }
  6577. }];
  6578. }
  6579. break;
  6580. case "text":
  6581. if(p.autosearch===true){
  6582. if(p.searchOnEnter) {
  6583. soptions.dataEvents = [{
  6584. type: "keypress",
  6585. fn : function(e) {
  6586. var key = e.charCode || e.keyCode || 0;
  6587. if(key === 13){
  6588. triggerToolbar();
  6589. return false;
  6590. }
  6591. return this;
  6592. }
  6593. }];
  6594. } else {
  6595. soptions.dataEvents = [{
  6596. type: "keydown",
  6597. fn : function(e) {
  6598. var key = e.which;
  6599. switch (key) {
  6600. case 13:
  6601. return false;
  6602. case 9 :
  6603. case 16:
  6604. case 37:
  6605. case 38:
  6606. case 39:
  6607. case 40:
  6608. case 27:
  6609. break;
  6610. default :
  6611. if(timeoutHnd) { clearTimeout(timeoutHnd); }
  6612. timeoutHnd = setTimeout(function(){triggerToolbar();}, p.autosearchDelay);
  6613. }
  6614. }
  6615. }];
  6616. }
  6617. }
  6618. break;
  6619. }
  6620. $.jgrid.bindEv.call($t, elem , soptions);
  6621. }
  6622. $(th).append(thd);
  6623. $(tr).append(th);
  6624. if(!p.searchOperators) {
  6625. $("td:eq(0)",stbl).hide();
  6626. }
  6627. });
  6628. $("table thead",$t.grid.hDiv).append(tr);
  6629. if(p.searchOperators) {
  6630. $(".soptclass",tr).click(function(e){
  6631. var offset = $(this).offset(),
  6632. left = ( offset.left ),
  6633. top = ( offset.top);
  6634. buildRuleMenu(this, left, top );
  6635. e.stopPropagation();
  6636. });
  6637. $("body").on('click', function(e){
  6638. if(e.target.className !== "soptclass") {
  6639. $("#sopt_menu").hide();
  6640. }
  6641. });
  6642. }
  6643. $(".clearsearchclass",tr).click(function() {
  6644. var ptr = $(this).parents("tr:first"),
  6645. coli = parseInt($("td.ui-search-oper", ptr).attr('colindex'),10),
  6646. sval = $.extend({},$t.p.colModel[coli].searchoptions || {}),
  6647. dval = sval.defaultValue ? sval.defaultValue : "";
  6648. if($t.p.colModel[coli].stype === "select") {
  6649. if(dval) {
  6650. $("td.ui-search-input select", ptr).val( dval );
  6651. } else {
  6652. $("td.ui-search-input select", ptr)[0].selectedIndex = 0;
  6653. }
  6654. } else {
  6655. $("td.ui-search-input input", ptr).val( dval );
  6656. }
  6657. // ToDo custom search type
  6658. if(p.autosearch===true){
  6659. triggerToolbar();
  6660. }
  6661. });
  6662. this.p.filterToolbar = true;
  6663. this.triggerToolbar = triggerToolbar;
  6664. this.clearToolbar = clearToolbar;
  6665. this.toggleToolbar = toggleToolbar;
  6666. });
  6667. },
  6668. destroyFilterToolbar: function () {
  6669. return this.each(function () {
  6670. if (!this.p.filterToolbar) {
  6671. return;
  6672. }
  6673. this.triggerToolbar = null;
  6674. this.clearToolbar = null;
  6675. this.toggleToolbar = null;
  6676. this.p.filterToolbar = false;
  6677. $(this.grid.hDiv).find("table thead tr.ui-search-toolbar").remove();
  6678. });
  6679. },
  6680. searchGrid : function (p) {
  6681. var regional = $.jgrid.getRegional(this[0], 'search');
  6682. p = $.extend(true, {
  6683. recreateFilter: false,
  6684. drag: true,
  6685. sField:'searchField',
  6686. sValue:'searchString',
  6687. sOper: 'searchOper',
  6688. sFilter: 'filters',
  6689. loadDefaults: true, // this options activates loading of default filters from grid's postData for Multipe Search only.
  6690. beforeShowSearch: null,
  6691. afterShowSearch : null,
  6692. onInitializeSearch: null,
  6693. afterRedraw : null,
  6694. afterChange: null,
  6695. closeAfterSearch : false,
  6696. closeAfterReset: false,
  6697. closeOnEscape : false,
  6698. searchOnEnter : false,
  6699. multipleSearch : false,
  6700. multipleGroup : false,
  6701. //cloneSearchRowOnAdd: true,
  6702. top : 0,
  6703. left: 0,
  6704. jqModal : true,
  6705. modal: false,
  6706. resize : true,
  6707. width: 450,
  6708. height: 'auto',
  6709. dataheight: 'auto',
  6710. showQuery: false,
  6711. errorcheck : true,
  6712. sopt: null,
  6713. stringResult: undefined,
  6714. onClose : null,
  6715. onSearch : null,
  6716. onReset : null,
  6717. toTop : true,
  6718. overlay : 30,
  6719. columns : [],
  6720. tmplNames : null,
  6721. tmplFilters : null,
  6722. tmplLabel : ' Template: ',
  6723. showOnLoad: false,
  6724. layer: null,
  6725. operands : { "eq" :"=", "ne":"<>","lt":"<","le":"<=","gt":">","ge":">=","bw":"LIKE","bn":"NOT LIKE","in":"IN","ni":"NOT IN","ew":"LIKE","en":"NOT LIKE","cn":"LIKE","nc":"NOT LIKE","nu":"IS NULL","nn":"ISNOT NULL"}
  6726. }, regional, p || {});
  6727. return this.each(function() {
  6728. var $t = this;
  6729. if(!$t.grid) {return;}
  6730. var fid = "fbox_"+$t.p.id,
  6731. showFrm = true,
  6732. mustReload = true,
  6733. IDs = {themodal:'searchmod'+fid,modalhead:'searchhd'+fid,modalcontent:'searchcnt'+fid, scrollelm : fid},
  6734. defaultFilters = $t.p.postData[p.sFilter],
  6735. fl;
  6736. if(typeof defaultFilters === "string") {
  6737. defaultFilters = $.jgrid.parse( defaultFilters );
  6738. }
  6739. if(p.recreateFilter === true) {
  6740. $("#"+$.jgrid.jqID(IDs.themodal)).remove();
  6741. }
  6742. function showFilter(_filter) {
  6743. showFrm = $($t).triggerHandler("jqGridFilterBeforeShow", [_filter]);
  6744. if(showFrm === undefined) {
  6745. showFrm = true;
  6746. }
  6747. if(showFrm && $.isFunction(p.beforeShowSearch)) {
  6748. showFrm = p.beforeShowSearch.call($t,_filter);
  6749. }
  6750. if(showFrm) {
  6751. $.jgrid.viewModal("#"+$.jgrid.jqID(IDs.themodal),{gbox:"#gbox_"+$.jgrid.jqID(fid),jqm:p.jqModal, modal:p.modal, overlay: p.overlay, toTop: p.toTop});
  6752. $($t).triggerHandler("jqGridFilterAfterShow", [_filter]);
  6753. if($.isFunction(p.afterShowSearch)) {
  6754. p.afterShowSearch.call($t, _filter);
  6755. }
  6756. }
  6757. }
  6758. if ( $("#"+$.jgrid.jqID(IDs.themodal))[0] !== undefined ) {
  6759. showFilter($("#fbox_"+$.jgrid.jqID( $t.p.id )));
  6760. } else {
  6761. var fil = $("<div><div id='"+fid+"' class='searchFilter' style='overflow:auto'></div></div>").insertBefore("#gview_"+$.jgrid.jqID($t.p.id)),
  6762. align = "left", butleft ="";
  6763. if($t.p.direction === "rtl") {
  6764. align = "right";
  6765. butleft = " style='text-align:left'";
  6766. fil.attr("dir","rtl");
  6767. }
  6768. var columns = $.extend([],$t.p.colModel),
  6769. bS ="<a id='"+fid+"_search' class='fm-button ui-state-default ui-corner-all fm-button-icon-right ui-reset'><span class='ui-icon ui-icon-search'></span>"+p.Find+"</a>",
  6770. bC ="<a id='"+fid+"_reset' class='fm-button ui-state-default ui-corner-all fm-button-icon-left ui-search'><span class='ui-icon ui-icon-arrowreturnthick-1-w'></span>"+p.Reset+"</a>",
  6771. bQ = "", tmpl="", colnm, found = false, bt, cmi=-1;
  6772. if(p.showQuery) {
  6773. bQ ="<a id='"+fid+"_query' class='fm-button ui-state-default ui-corner-all fm-button-icon-left'><span class='ui-icon ui-icon-comment'></span>Query</a>";
  6774. }
  6775. if(!p.columns.length) {
  6776. $.each(columns, function(i,n){
  6777. if(!n.label) {
  6778. n.label = $t.p.colNames[i];
  6779. }
  6780. // find first searchable column and set it if no default filter
  6781. if(!found) {
  6782. var searchable = (n.search === undefined) ? true: n.search ,
  6783. hidden = (n.hidden === true),
  6784. ignoreHiding = (n.searchoptions && n.searchoptions.searchhidden === true);
  6785. if ((ignoreHiding && searchable) || (searchable && !hidden)) {
  6786. found = true;
  6787. colnm = n.index || n.name;
  6788. cmi =i;
  6789. }
  6790. }
  6791. });
  6792. } else {
  6793. columns = p.columns;
  6794. cmi = 0;
  6795. colnm = columns[0].index || columns[0].name;
  6796. }
  6797. // old behaviour
  6798. if( (!defaultFilters && colnm) || p.multipleSearch === false ) {
  6799. var cmop = "eq";
  6800. if(cmi >=0 && columns[cmi].searchoptions && columns[cmi].searchoptions.sopt) {
  6801. cmop = columns[cmi].searchoptions.sopt[0];
  6802. } else if(p.sopt && p.sopt.length) {
  6803. cmop = p.sopt[0];
  6804. }
  6805. defaultFilters = {groupOp: "AND", rules: [{field: colnm, op: cmop, data: ""}]};
  6806. }
  6807. found = false;
  6808. if(p.tmplNames && p.tmplNames.length) {
  6809. found = true;
  6810. tmpl = p.tmplLabel;
  6811. tmpl += "<select class='ui-template'>";
  6812. tmpl += "<option value='default'>Default</option>";
  6813. $.each(p.tmplNames, function(i,n){
  6814. tmpl += "<option value='"+i+"'>"+n+"</option>";
  6815. });
  6816. tmpl += "</select>";
  6817. }
  6818. bt = "<table class='EditTable' style='border:0px none;margin-top:5px' id='"+fid+"_2'><tbody><tr><td colspan='2'><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr><td class='EditButton' style='text-align:"+align+"'>"+bC+tmpl+"</td><td class='EditButton' "+butleft+">"+bQ+bS+"</td></tr></tbody></table>";
  6819. fid = $.jgrid.jqID( fid);
  6820. $("#"+fid).jqFilter({
  6821. columns : columns,
  6822. filter: p.loadDefaults ? defaultFilters : null,
  6823. showQuery: p.showQuery,
  6824. errorcheck : p.errorcheck,
  6825. sopt: p.sopt,
  6826. groupButton : p.multipleGroup,
  6827. ruleButtons : p.multipleSearch,
  6828. afterRedraw : p.afterRedraw,
  6829. ops : p.odata,
  6830. operands : p.operands,
  6831. ajaxSelectOptions: $t.p.ajaxSelectOptions,
  6832. groupOps: p.groupOps,
  6833. onChange : function() {
  6834. if(this.p.showQuery) {
  6835. $('.query',this).html(this.toUserFriendlyString());
  6836. }
  6837. if ($.isFunction(p.afterChange)) {
  6838. p.afterChange.call($t, $("#"+fid), p);
  6839. }
  6840. },
  6841. direction : $t.p.direction,
  6842. id: $t.p.id
  6843. });
  6844. fil.append( bt );
  6845. if(found && p.tmplFilters && p.tmplFilters.length) {
  6846. $(".ui-template", fil).bind('change', function(){
  6847. var curtempl = $(this).val();
  6848. if(curtempl==="default") {
  6849. $("#"+fid).jqFilter('addFilter', defaultFilters);
  6850. } else {
  6851. $("#"+fid).jqFilter('addFilter', p.tmplFilters[parseInt(curtempl,10)]);
  6852. }
  6853. return false;
  6854. });
  6855. }
  6856. if(p.multipleGroup === true) {p.multipleSearch = true;}
  6857. $($t).triggerHandler("jqGridFilterInitialize", [$("#"+fid)]);
  6858. if($.isFunction(p.onInitializeSearch) ) {
  6859. p.onInitializeSearch.call($t, $("#"+fid));
  6860. }
  6861. p.gbox = "#gbox_"+fid;
  6862. if (p.layer) {
  6863. $.jgrid.createModal(IDs ,fil,p,"#gview_"+$.jgrid.jqID($t.p.id),$("#gbox_"+$.jgrid.jqID($t.p.id))[0], "#"+$.jgrid.jqID(p.layer), {position: "relative"});
  6864. } else {
  6865. $.jgrid.createModal(IDs ,fil,p,"#gview_"+$.jgrid.jqID($t.p.id),$("#gbox_"+$.jgrid.jqID($t.p.id))[0]);
  6866. }
  6867. if (p.searchOnEnter || p.closeOnEscape) {
  6868. $("#"+$.jgrid.jqID(IDs.themodal)).keydown(function (e) {
  6869. var $target = $(e.target);
  6870. if (p.searchOnEnter && e.which === 13 && // 13 === $.ui.keyCode.ENTER
  6871. !$target.hasClass('add-group') && !$target.hasClass('add-rule') &&
  6872. !$target.hasClass('delete-group') && !$target.hasClass('delete-rule') &&
  6873. (!$target.hasClass("fm-button") || !$target.is("[id$=_query]"))) {
  6874. $("#"+fid+"_search").click();
  6875. return false;
  6876. }
  6877. if (p.closeOnEscape && e.which === 27) { // 27 === $.ui.keyCode.ESCAPE
  6878. $("#"+$.jgrid.jqID(IDs.modalhead)).find(".ui-jqdialog-titlebar-close").click();
  6879. return false;
  6880. }
  6881. });
  6882. }
  6883. if(bQ) {
  6884. $("#"+fid+"_query").bind('click', function(){
  6885. $(".queryresult", fil).toggle();
  6886. return false;
  6887. });
  6888. }
  6889. if (p.stringResult===undefined) {
  6890. // to provide backward compatibility, inferring stringResult value from multipleSearch
  6891. p.stringResult = p.multipleSearch;
  6892. }
  6893. $("#"+fid+"_search").bind('click', function(){
  6894. var sdata={}, res, filters;
  6895. fl = $("#"+fid);
  6896. fl.find(".input-elm:focus").change();
  6897. filters = fl.jqFilter('filterData');
  6898. if(p.errorcheck) {
  6899. fl[0].hideError();
  6900. if(!p.showQuery) {fl.jqFilter('toSQLString');}
  6901. if(fl[0].p.error) {
  6902. fl[0].showError();
  6903. return false;
  6904. }
  6905. }
  6906. if(p.stringResult) {
  6907. try {
  6908. res = JSON.stringify(filters);
  6909. } catch (e2) { }
  6910. if(typeof res==="string") {
  6911. sdata[p.sFilter] = res;
  6912. $.each([p.sField,p.sValue, p.sOper], function() {sdata[this] = "";});
  6913. }
  6914. } else {
  6915. if(p.multipleSearch) {
  6916. sdata[p.sFilter] = filters;
  6917. $.each([p.sField,p.sValue, p.sOper], function() {sdata[this] = "";});
  6918. } else {
  6919. sdata[p.sField] = filters.rules[0].field;
  6920. sdata[p.sValue] = filters.rules[0].data;
  6921. sdata[p.sOper] = filters.rules[0].op;
  6922. sdata[p.sFilter] = "";
  6923. }
  6924. }
  6925. $t.p.search = true;
  6926. $.extend($t.p.postData,sdata);
  6927. mustReload = $($t).triggerHandler("jqGridFilterSearch");
  6928. if( mustReload === undefined) {
  6929. mustReload = true;
  6930. }
  6931. if(mustReload && $.isFunction(p.onSearch) ) {
  6932. mustReload = p.onSearch.call($t, $t.p.filters);
  6933. }
  6934. if (mustReload !== false) {
  6935. $($t).trigger("reloadGrid",[{page:1}]);
  6936. }
  6937. if(p.closeAfterSearch) {
  6938. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID($t.p.id),jqm:p.jqModal,onClose: p.onClose});
  6939. }
  6940. return false;
  6941. });
  6942. $("#"+fid+"_reset").bind('click', function(){
  6943. var sdata={},
  6944. fl = $("#"+fid);
  6945. $t.p.search = false;
  6946. $t.p.resetsearch = true;
  6947. if(p.multipleSearch===false) {
  6948. sdata[p.sField] = sdata[p.sValue] = sdata[p.sOper] = "";
  6949. } else {
  6950. sdata[p.sFilter] = "";
  6951. }
  6952. fl[0].resetFilter();
  6953. if(found) {
  6954. $(".ui-template", fil).val("default");
  6955. }
  6956. $.extend($t.p.postData,sdata);
  6957. mustReload = $($t).triggerHandler("jqGridFilterReset");
  6958. if(mustReload === undefined) {
  6959. mustReload = true;
  6960. }
  6961. if(mustReload && $.isFunction(p.onReset) ) {
  6962. mustReload = p.onReset.call($t);
  6963. }
  6964. if(mustReload !== false) {
  6965. $($t).trigger("reloadGrid",[{page:1}]);
  6966. }
  6967. if (p.closeAfterReset) {
  6968. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID($t.p.id),jqm:p.jqModal,onClose: p.onClose});
  6969. }
  6970. return false;
  6971. });
  6972. showFilter($("#"+fid));
  6973. $(".fm-button:not(.ui-state-disabled)",fil).hover(
  6974. function(){$(this).addClass('ui-state-hover');},
  6975. function(){$(this).removeClass('ui-state-hover');}
  6976. );
  6977. }
  6978. });
  6979. }
  6980. });
  6981. //module begin
  6982. var rp_ge = {};
  6983. $.jgrid.extend({
  6984. editGridRow : function(rowid, p){
  6985. var regional = $.jgrid.getRegional(this[0], 'edit');
  6986. p = $.extend(true, {
  6987. top : 0,
  6988. left: 0,
  6989. width: 300,
  6990. datawidth: 'auto',
  6991. height: 'auto',
  6992. dataheight: 'auto',
  6993. modal: false,
  6994. overlay : 30,
  6995. drag: true,
  6996. resize: true,
  6997. url: null,
  6998. mtype : "POST",
  6999. clearAfterAdd :true,
  7000. closeAfterEdit : false,
  7001. reloadAfterSubmit : true,
  7002. onInitializeForm: null,
  7003. beforeInitData: null,
  7004. beforeShowForm: null,
  7005. afterShowForm: null,
  7006. beforeSubmit: null,
  7007. afterSubmit: null,
  7008. onclickSubmit: null,
  7009. afterComplete: null,
  7010. onclickPgButtons : null,
  7011. afterclickPgButtons: null,
  7012. editData : {},
  7013. recreateForm : false,
  7014. jqModal : true,
  7015. closeOnEscape : false,
  7016. addedrow : "first",
  7017. topinfo : '',
  7018. bottominfo: '',
  7019. saveicon : [],
  7020. closeicon : [],
  7021. savekey: [false,13],
  7022. navkeys: [false,38,40],
  7023. checkOnSubmit : false,
  7024. checkOnUpdate : false,
  7025. _savedData : {},
  7026. processing : false,
  7027. onClose : null,
  7028. ajaxEditOptions : {},
  7029. serializeEditData : null,
  7030. viewPagerButtons : true,
  7031. overlayClass : 'ui-widget-overlay',
  7032. removemodal : true,
  7033. form: 'edit',
  7034. template : null
  7035. }, regional, p || {});
  7036. rp_ge[$(this)[0].p.id] = p;
  7037. return this.each(function(){
  7038. var $t = this;
  7039. if (!$t.grid || !rowid) {return;}
  7040. var gID = $t.p.id,
  7041. frmgr = "FrmGrid_"+gID, frmtborg = "TblGrid_"+gID, frmtb = "#"+$.jgrid.jqID(frmtborg), frmtb2,
  7042. IDs = {themodal:'editmod'+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID, scrollelm : frmgr},
  7043. showFrm = true, maxCols = 1, maxRows=0, postdata, diff, frmoper,
  7044. templ = typeof rp_ge[$t.p.id].template === "string" && rp_ge[$t.p.id].template.length > 0,
  7045. errors =$.jgrid.getRegional(this, 'errors');
  7046. if (rowid === "new") {
  7047. rowid = "_empty";
  7048. frmoper = "add";
  7049. p.caption=rp_ge[$t.p.id].addCaption;
  7050. } else {
  7051. p.caption=rp_ge[$t.p.id].editCaption;
  7052. frmoper = "edit";
  7053. }
  7054. if(!p.recreateForm) {
  7055. if( $($t).data("formProp") ) {
  7056. $.extend(rp_ge[$(this)[0].p.id], $($t).data("formProp"));
  7057. }
  7058. }
  7059. var closeovrl = true;
  7060. if(p.checkOnUpdate && p.jqModal && !p.modal) {
  7061. closeovrl = false;
  7062. }
  7063. function getFormData(){
  7064. $(frmtb).find(".FormElement").each(function() {
  7065. var celm = $(".customelement", this);
  7066. if (celm.length) {
  7067. var elem = celm[0], nm = $(elem).attr('name');
  7068. $.each($t.p.colModel, function(){
  7069. if(this.name === nm && this.editoptions && $.isFunction(this.editoptions.custom_value)) {
  7070. try {
  7071. postdata[nm] = this.editoptions.custom_value.call($t, $("#"+$.jgrid.jqID(nm),frmtb),'get');
  7072. if (postdata[nm] === undefined) {throw "e1";}
  7073. } catch (e) {
  7074. if (e==="e1") {$.jgrid.info_dialog(errors.errcap,"function 'custom_value' "+rp_ge[$(this)[0]].p.msg.novalue,rp_ge[$(this)[0]].p.bClose);}
  7075. else {$.jgrid.info_dialog(errors.errcap,e.message,rp_ge[$(this)[0]].p.bClose);}
  7076. }
  7077. return true;
  7078. }
  7079. });
  7080. } else {
  7081. switch ($(this).get(0).type) {
  7082. case "checkbox":
  7083. if($(this).is(":checked")) {
  7084. postdata[this.name]= $(this).val();
  7085. }else {
  7086. var ofv = $(this).attr("offval");
  7087. postdata[this.name]= ofv;
  7088. }
  7089. break;
  7090. case "select-one":
  7091. postdata[this.name]= $("option:selected",this).val();
  7092. break;
  7093. case "select-multiple":
  7094. postdata[this.name]= $(this).val();
  7095. if(postdata[this.name]) {postdata[this.name] = postdata[this.name].join(",");}
  7096. else {postdata[this.name] ="";}
  7097. var selectedText = [];
  7098. $("option:selected",this).each(
  7099. function(i,selected){
  7100. selectedText[i] = $(selected).text();
  7101. }
  7102. );
  7103. break;
  7104. case "password":
  7105. case "text":
  7106. case "textarea":
  7107. case "button":
  7108. postdata[this.name] = $(this).val();
  7109. break;
  7110. }
  7111. if($t.p.autoencode) {postdata[this.name] = $.jgrid.htmlEncode(postdata[this.name]);}
  7112. }
  7113. });
  7114. return true;
  7115. }
  7116. function createData(rowid,obj,tb,maxcols){
  7117. var nm, hc,trdata, cnt=0,tmp, dc,elc, retpos=[], ind=false,
  7118. tdtmpl = "<td class='CaptionTD'>&#160;</td><td class='DataTD'>&#160;</td>", tmpl="", i; //*2
  7119. for (i =1; i<=maxcols;i++) {
  7120. tmpl += tdtmpl;
  7121. }
  7122. if(rowid !== '_empty') {
  7123. ind = $(obj).jqGrid("getInd",rowid);
  7124. }
  7125. $(obj.p.colModel).each( function(i) {
  7126. nm = this.name;
  7127. // hidden fields are included in the form
  7128. if(this.editrules && this.editrules.edithidden === true) {
  7129. hc = false;
  7130. } else {
  7131. hc = this.hidden === true ? true : false;
  7132. }
  7133. dc = hc ? "style='display:none'" : "";
  7134. if ( nm !== 'cb' && nm !== 'subgrid' && this.editable===true && nm !== 'rn') {
  7135. if(ind === false) {
  7136. tmp = "";
  7137. } else {
  7138. if(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {
  7139. tmp = $("td[role='gridcell']:eq("+i+")",obj.rows[ind]).text();
  7140. } else {
  7141. try {
  7142. tmp = $.unformat.call(obj, $("td[role='gridcell']:eq("+i+")",obj.rows[ind]),{rowId:rowid, colModel:this},i);
  7143. } catch (_) {
  7144. tmp = (this.edittype && this.edittype === "textarea") ? $("td[role='gridcell']:eq("+i+")",obj.rows[ind]).text() : $("td[role='gridcell']:eq("+i+")",obj.rows[ind]).html();
  7145. }
  7146. if(!tmp || tmp === "&nbsp;" || tmp === "&#160;" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}
  7147. }
  7148. }
  7149. var opt = $.extend({}, this.editoptions || {} ,{id:nm,name:nm, rowId: rowid, oper:'edit'}),
  7150. frmopt = $.extend({}, {elmprefix:'',elmsuffix:'',rowabove:false,rowcontent:''}, this.formoptions || {}),
  7151. rp = parseInt(frmopt.rowpos,10) || cnt+1,
  7152. cp = parseInt((parseInt(frmopt.colpos,10) || 1)*2,10);
  7153. if(rowid === "_empty" && opt.defaultValue ) {
  7154. tmp = $.isFunction(opt.defaultValue) ? opt.defaultValue.call($t) : opt.defaultValue;
  7155. }
  7156. if(!this.edittype) {this.edittype = "text";}
  7157. if($t.p.autoencode) {tmp = $.jgrid.htmlDecode(tmp);}
  7158. elc = $.jgrid.createEl.call($t,this.edittype,opt,tmp,false,$.extend({},$.jgrid.ajaxOptions,obj.p.ajaxSelectOptions || {}));
  7159. //if(tmp === "" && this.edittype == "checkbox") {tmp = $(elc).attr("offval");}
  7160. //if(tmp === "" && this.edittype == "select") {tmp = $("option:eq(0)",elc).text();}
  7161. if(this.edittype === "select") {
  7162. tmp = $(elc).val();
  7163. if($(elc).get(0).type === 'select-multiple') {
  7164. tmp = tmp.join(",");
  7165. }
  7166. }
  7167. if(this.edittype === 'checkbox') {
  7168. if($(elc).is(":checked")) {
  7169. tmp= $(elc).val();
  7170. } else {
  7171. tmp = $(elc).attr("offval");
  7172. }
  7173. }
  7174. if(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {
  7175. rp_ge[$t.p.id]._savedData[nm] = tmp;
  7176. }
  7177. $(elc).addClass("FormElement");
  7178. if( $.inArray(this.edittype, ['text','textarea','password','select']) > -1) {
  7179. $(elc).addClass("ui-widget-content ui-corner-all");
  7180. }
  7181. if(templ) {
  7182. $(frm).find("#"+nm).replaceWith( elc );
  7183. } else {
  7184. //--------------------
  7185. trdata = $(tb).find("tr[rowpos="+rp+"]");
  7186. if(frmopt.rowabove) {
  7187. var newdata = $("<tr><td class='contentinfo' colspan='"+(maxcols*2)+"'>"+frmopt.rowcontent+"</td></tr>");
  7188. $(tb).append(newdata);
  7189. newdata[0].rp = rp;
  7190. }
  7191. if ( trdata.length===0 ) {
  7192. trdata = $("<tr "+dc+" rowpos='"+rp+"'></tr>").addClass("FormData").attr("id","tr_"+nm);
  7193. $(trdata).append(tmpl);
  7194. $(tb).append(trdata);
  7195. trdata[0].rp = rp;
  7196. }
  7197. $("td:eq("+(cp-2)+")",trdata[0]).html(frmopt.label === undefined ? obj.p.colNames[i]: frmopt.label);
  7198. $("td:eq("+(cp-1)+")",trdata[0]).append(frmopt.elmprefix).append(elc).append(frmopt.elmsuffix);
  7199. //-------------------------
  7200. }
  7201. if(this.edittype==='custom' && $.isFunction(opt.custom_value) ) {
  7202. opt.custom_value.call($t, $("#"+nm, frmgr),'set',tmp);
  7203. }
  7204. $.jgrid.bindEv.call($t, elc, opt);
  7205. retpos[cnt] = i;
  7206. cnt++;
  7207. }
  7208. });
  7209. if( cnt > 0) {
  7210. var idrow;
  7211. if(templ) {
  7212. idrow = "<div class='FormData' style='display:none'><input class='FormElement' id='id_g' type='text' name='"+obj.p.id+"_id' value='"+rowid+"'/>";
  7213. $(frm).append(idrow);
  7214. } else {
  7215. 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>");
  7216. idrow[0].rp = cnt+999;
  7217. $(tb).append(idrow);
  7218. }
  7219. //$(tb).append(idrow);
  7220. if(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[obj.p.id+"_id"] = rowid;}
  7221. }
  7222. return retpos;
  7223. }
  7224. function fillData(rowid,obj,fmid){
  7225. var nm,cnt=0,tmp, fld,opt,vl,vlc;
  7226. if(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData = {};rp_ge[$t.p.id]._savedData[obj.p.id+"_id"]=rowid;}
  7227. var cm = obj.p.colModel;
  7228. if(rowid === '_empty') {
  7229. $(cm).each(function(){
  7230. nm = this.name;
  7231. opt = $.extend({}, this.editoptions || {} );
  7232. fld = $("#"+$.jgrid.jqID(nm),fmid);
  7233. if(fld && fld.length && fld[0] !== null) {
  7234. vl = "";
  7235. if(this.edittype === 'custom' && $.isFunction(opt.custom_value)) {
  7236. opt.custom_value.call($t, $("#"+nm,fmid),'set',vl);
  7237. } else if(opt.defaultValue ) {
  7238. vl = $.isFunction(opt.defaultValue) ? opt.defaultValue.call($t) : opt.defaultValue;
  7239. if(fld[0].type==='checkbox') {
  7240. vlc = vl.toLowerCase();
  7241. if(vlc.search(/(false|f|0|no|n|off|undefined)/i)<0 && vlc!=="") {
  7242. fld[0].checked = true;
  7243. fld[0].defaultChecked = true;
  7244. fld[0].value = vl;
  7245. } else {
  7246. fld[0].checked = false;
  7247. fld[0].defaultChecked = false;
  7248. }
  7249. } else {fld.val(vl);}
  7250. } else {
  7251. if( fld[0].type==='checkbox' ) {
  7252. fld[0].checked = false;
  7253. fld[0].defaultChecked = false;
  7254. vl = $(fld).attr("offval");
  7255. } else if (fld[0].type && fld[0].type.substr(0,6)==='select') {
  7256. fld[0].selectedIndex = 0;
  7257. } else {
  7258. fld.val(vl);
  7259. }
  7260. }
  7261. if(rp_ge[$t.p.id].checkOnSubmit===true || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[nm] = vl;}
  7262. }
  7263. });
  7264. $("#id_g",fmid).val(rowid);
  7265. return;
  7266. }
  7267. var tre = $(obj).jqGrid("getInd",rowid,true);
  7268. if(!tre) {return;}
  7269. $('td[role="gridcell"]',tre).each( function(i) {
  7270. nm = cm[i].name;
  7271. // hidden fields are included in the form
  7272. if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn' && cm[i].editable===true) {
  7273. if(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {
  7274. tmp = $(this).text();
  7275. } else {
  7276. try {
  7277. tmp = $.unformat.call(obj, $(this),{rowId:rowid, colModel:cm[i]},i);
  7278. } catch (_) {
  7279. tmp = cm[i].edittype==="textarea" ? $(this).text() : $(this).html();
  7280. }
  7281. }
  7282. if($t.p.autoencode) {tmp = $.jgrid.htmlDecode(tmp);}
  7283. if(rp_ge[$t.p.id].checkOnSubmit===true || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[nm] = tmp;}
  7284. nm = $.jgrid.jqID(nm);
  7285. switch (cm[i].edittype) {
  7286. case "password":
  7287. case "text":
  7288. case "button" :
  7289. case "image":
  7290. case "textarea":
  7291. if(tmp === "&nbsp;" || tmp === "&#160;" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}
  7292. $("#"+nm,fmid).val(tmp);
  7293. break;
  7294. case "select":
  7295. var opv = tmp.split(",");
  7296. opv = $.map(opv,function(n){return $.trim(n);});
  7297. $("#"+nm+" option",fmid).each(function(){
  7298. if (!cm[i].editoptions.multiple && ($.trim(tmp) === $.trim($(this).text()) || opv[0] === $.trim($(this).text()) || opv[0] === $.trim($(this).val())) ){
  7299. this.selected= true;
  7300. } else if (cm[i].editoptions.multiple){
  7301. if( $.inArray($.trim($(this).text()), opv ) > -1 || $.inArray($.trim($(this).val()), opv ) > -1 ){
  7302. this.selected = true;
  7303. }else{
  7304. this.selected = false;
  7305. }
  7306. } else {
  7307. this.selected = false;
  7308. }
  7309. });
  7310. if(rp_ge[$t.p.id].checkOnSubmit===true || rp_ge[$t.p.id].checkOnUpdate) {
  7311. tmp = $("#"+nm,fmid).val();
  7312. if(cm[i].editoptions.multiple) {
  7313. tmp = tmp.join(",");
  7314. }
  7315. rp_ge[$t.p.id]._savedData[nm] = tmp;
  7316. }
  7317. break;
  7318. case "checkbox":
  7319. tmp = String(tmp);
  7320. if(cm[i].editoptions && cm[i].editoptions.value) {
  7321. var cb = cm[i].editoptions.value.split(":");
  7322. if(cb[0] === tmp) {
  7323. $("#"+nm, fmid)[$t.p.useProp ? 'prop': 'attr']({"checked":true, "defaultChecked" : true});
  7324. } else {
  7325. $("#"+nm, fmid)[$t.p.useProp ? 'prop': 'attr']({"checked":false, "defaultChecked" : false});
  7326. }
  7327. } else {
  7328. tmp = tmp.toLowerCase();
  7329. if(tmp.search(/(false|f|0|no|n|off|undefined)/i)<0 && tmp!=="") {
  7330. $("#"+nm, fmid)[$t.p.useProp ? 'prop': 'attr']("checked",true);
  7331. $("#"+nm, fmid)[$t.p.useProp ? 'prop': 'attr']("defaultChecked",true); //ie
  7332. } else {
  7333. $("#"+nm, fmid)[$t.p.useProp ? 'prop': 'attr']("checked", false);
  7334. $("#"+nm, fmid)[$t.p.useProp ? 'prop': 'attr']("defaultChecked", false); //ie
  7335. }
  7336. }
  7337. if(rp_ge[$t.p.id].checkOnSubmit===true || rp_ge[$t.p.id].checkOnUpdate) {
  7338. if($("#"+nm, fmid).is(":checked")) {
  7339. tmp = $("#"+nm, fmid).val();
  7340. } else {
  7341. tmp = $("#"+nm, fmid).attr("offval");
  7342. }
  7343. }
  7344. break;
  7345. case 'custom' :
  7346. try {
  7347. if(cm[i].editoptions && $.isFunction(cm[i].editoptions.custom_value)) {
  7348. cm[i].editoptions.custom_value.call($t, $("#"+nm, fmid),'set',tmp);
  7349. } else {throw "e1";}
  7350. } catch (e) {
  7351. if (e==="e1") {$.jgrid.info_dialog(errors.errcap,"function 'custom_value' "+rp_ge[$(this)[0]].p.msg.nodefined,$.rp_ge[$(this)[0]].p.bClose);}
  7352. else {$.jgrid.info_dialog(errors.errcap,e.message,$.rp_ge[$(this)[0]].p.bClose);}
  7353. }
  7354. break;
  7355. }
  7356. cnt++;
  7357. }
  7358. });
  7359. if(cnt>0) {$("#id_g",frmtb).val(rowid);}
  7360. }
  7361. function setNulls() {
  7362. $.each($t.p.colModel, function(i,n){
  7363. if(n.editoptions && n.editoptions.NullIfEmpty === true) {
  7364. if(postdata.hasOwnProperty(n.name) && postdata[n.name] === "") {
  7365. postdata[n.name] = 'null';
  7366. }
  7367. }
  7368. });
  7369. }
  7370. function postIt() {
  7371. var copydata, ret=[true,"",""], onCS = {}, opers = $t.p.prmNames, idname, oper, key, selr, i, url;
  7372. var retvals = $($t).triggerHandler("jqGridAddEditBeforeCheckValues", [$(frmgr), frmoper]);
  7373. if(retvals && typeof retvals === 'object') {postdata = retvals;}
  7374. if($.isFunction(rp_ge[$t.p.id].beforeCheckValues)) {
  7375. retvals = rp_ge[$t.p.id].beforeCheckValues.call($t, postdata,$(frmgr),frmoper);
  7376. if(retvals && typeof retvals === 'object') {postdata = retvals;}
  7377. }
  7378. for( key in postdata ){
  7379. if(postdata.hasOwnProperty(key)) {
  7380. ret = $.jgrid.checkValues.call($t,postdata[key],key);
  7381. if(ret[0] === false) {break;}
  7382. }
  7383. }
  7384. setNulls();
  7385. if(ret[0]) {
  7386. onCS = $($t).triggerHandler("jqGridAddEditClickSubmit", [rp_ge[$t.p.id], postdata, frmoper]);
  7387. if( onCS === undefined && $.isFunction( rp_ge[$t.p.id].onclickSubmit)) {
  7388. onCS = rp_ge[$t.p.id].onclickSubmit.call($t, rp_ge[$t.p.id], postdata, frmoper) || {};
  7389. }
  7390. ret = $($t).triggerHandler("jqGridAddEditBeforeSubmit", [postdata, $(frmgr), frmoper]);
  7391. if(ret === undefined) {
  7392. ret = [true,"",""];
  7393. }
  7394. if( ret[0] && $.isFunction(rp_ge[$t.p.id].beforeSubmit)) {
  7395. ret = rp_ge[$t.p.id].beforeSubmit.call($t,postdata,$(frmgr), frmoper);
  7396. }
  7397. }
  7398. if(ret[0] && !rp_ge[$t.p.id].processing) {
  7399. rp_ge[$t.p.id].processing = true;
  7400. $("#sData", frmtb+"_2").addClass('ui-state-active');
  7401. url = rp_ge[$t.p.id].url || $($t).jqGrid('getGridParam','editurl');
  7402. oper = opers.oper;
  7403. idname = url === 'clientArray' ? $t.p.keyName : opers.id;
  7404. // we add to pos data array the action - the name is oper
  7405. postdata[oper] = ($.trim(postdata[$t.p.id+"_id"]) === "_empty") ? opers.addoper : opers.editoper;
  7406. if(postdata[oper] !== opers.addoper) {
  7407. postdata[idname] = postdata[$t.p.id+"_id"];
  7408. } else {
  7409. // check to see if we have allredy this field in the form and if yes lieve it
  7410. if( postdata[idname] === undefined ) {postdata[idname] = postdata[$t.p.id+"_id"];}
  7411. }
  7412. delete postdata[$t.p.id+"_id"];
  7413. postdata = $.extend(postdata,rp_ge[$t.p.id].editData,onCS);
  7414. if($t.p.treeGrid === true) {
  7415. if(postdata[oper] === opers.addoper) {
  7416. selr = $($t).jqGrid("getGridParam", 'selrow');
  7417. var tr_par_id = $t.p.treeGridModel === 'adjacency' ? $t.p.treeReader.parent_id_field : 'parent_id';
  7418. postdata[tr_par_id] = selr;
  7419. }
  7420. for(i in $t.p.treeReader){
  7421. if($t.p.treeReader.hasOwnProperty(i)) {
  7422. var itm = $t.p.treeReader[i];
  7423. if(postdata.hasOwnProperty(itm)) {
  7424. if(postdata[oper] === opers.addoper && i === 'parent_id_field') {continue;}
  7425. delete postdata[itm];
  7426. }
  7427. }
  7428. }
  7429. }
  7430. postdata[idname] = $.jgrid.stripPref($t.p.idPrefix, postdata[idname]);
  7431. var ajaxOptions = $.extend({
  7432. url: url,
  7433. type: rp_ge[$t.p.id].mtype,
  7434. data: $.isFunction(rp_ge[$t.p.id].serializeEditData) ? rp_ge[$t.p.id].serializeEditData.call($t,postdata) : postdata,
  7435. complete:function(data,status){
  7436. var key;
  7437. $("#sData", frmtb+"_2").removeClass('ui-state-active');
  7438. postdata[idname] = $t.p.idPrefix + postdata[idname];
  7439. if(data.status >= 300 && data.status !== 304) {
  7440. ret[0] = false;
  7441. ret[1] = $($t).triggerHandler("jqGridAddEditErrorTextFormat", [data, frmoper]);
  7442. if ($.isFunction(rp_ge[$t.p.id].errorTextFormat)) {
  7443. ret[1] = rp_ge[$t.p.id].errorTextFormat.call($t, data, frmoper);
  7444. } else {
  7445. ret[1] = status + " Status: '" + data.statusText + "'. Error code: " + data.status;
  7446. }
  7447. } else {
  7448. // data is posted successful
  7449. // execute aftersubmit with the returned data from server
  7450. ret = $($t).triggerHandler("jqGridAddEditAfterSubmit", [data, postdata, frmoper]);
  7451. if(ret === undefined) {
  7452. ret = [true,"",""];
  7453. }
  7454. if( ret[0] && $.isFunction(rp_ge[$t.p.id].afterSubmit) ) {
  7455. ret = rp_ge[$t.p.id].afterSubmit.call($t, data,postdata, frmoper);
  7456. }
  7457. }
  7458. if(ret[0] === false) {
  7459. $(".FormError",frmgr).html(ret[1]);
  7460. $(".FormError",frmgr).show();
  7461. } else {
  7462. if($t.p.autoencode) {
  7463. $.each(postdata,function(n,v){
  7464. postdata[n] = $.jgrid.htmlDecode(v);
  7465. });
  7466. }
  7467. //rp_ge[$t.p.id].reloadAfterSubmit = rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype != "local";
  7468. // the action is add
  7469. if(postdata[oper] === opers.addoper ) {
  7470. //id processing
  7471. // user not set the id ret[2]
  7472. if(!ret[2]) {ret[2] = $.jgrid.randId();}
  7473. if(postdata[idname] == null || postdata[idname] === "_empty"){
  7474. postdata[idname] = ret[2];
  7475. } else {
  7476. ret[2] = postdata[idname];
  7477. }
  7478. if(rp_ge[$t.p.id].reloadAfterSubmit) {
  7479. $($t).trigger("reloadGrid");
  7480. } else {
  7481. if($t.p.treeGrid === true){
  7482. $($t).jqGrid("addChildNode",ret[2],selr,postdata );
  7483. } else {
  7484. $($t).jqGrid("addRowData",ret[2],postdata,p.addedrow);
  7485. }
  7486. }
  7487. if(rp_ge[$t.p.id].closeAfterAdd) {
  7488. if($t.p.treeGrid !== true){
  7489. $($t).jqGrid("setSelection",ret[2]);
  7490. }
  7491. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7492. } else if (rp_ge[$t.p.id].clearAfterAdd) {
  7493. fillData("_empty", $t, frmgr);
  7494. }
  7495. } else {
  7496. // the action is update
  7497. if(rp_ge[$t.p.id].reloadAfterSubmit) {
  7498. $($t).trigger("reloadGrid");
  7499. if( !rp_ge[$t.p.id].closeAfterEdit ) {setTimeout(function(){$($t).jqGrid("setSelection",postdata[idname]);},1000);}
  7500. } else {
  7501. if($t.p.treeGrid === true) {
  7502. $($t).jqGrid("setTreeRow", postdata[idname],postdata);
  7503. } else {
  7504. $($t).jqGrid("setRowData", postdata[idname],postdata);
  7505. }
  7506. }
  7507. if(rp_ge[$t.p.id].closeAfterEdit) {$.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});}
  7508. }
  7509. if($.isFunction(rp_ge[$t.p.id].afterComplete)) {
  7510. copydata = data;
  7511. setTimeout(function(){
  7512. $($t).triggerHandler("jqGridAddEditAfterComplete", [copydata, postdata, $(frmgr), frmoper]);
  7513. rp_ge[$t.p.id].afterComplete.call($t, copydata, postdata, $(frmgr), frmoper);
  7514. copydata=null;
  7515. },500);
  7516. }
  7517. if(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {
  7518. $(frmgr).data("disabled",false);
  7519. if(rp_ge[$t.p.id]._savedData[$t.p.id+"_id"] !== "_empty"){
  7520. for(key in rp_ge[$t.p.id]._savedData) {
  7521. if(rp_ge[$t.p.id]._savedData.hasOwnProperty(key) && postdata[key]) {
  7522. rp_ge[$t.p.id]._savedData[key] = postdata[key];
  7523. }
  7524. }
  7525. }
  7526. }
  7527. }
  7528. rp_ge[$t.p.id].processing=false;
  7529. try{$(':input:visible',frmgr)[0].focus();} catch (e){}
  7530. }
  7531. }, $.jgrid.ajaxOptions, rp_ge[$t.p.id].ajaxEditOptions );
  7532. if (!ajaxOptions.url && !rp_ge[$t.p.id].useDataProxy) {
  7533. if ($.isFunction($t.p.dataProxy)) {
  7534. rp_ge[$t.p.id].useDataProxy = true;
  7535. } else {
  7536. ret[0]=false;ret[1] += " "+errors.nourl;
  7537. }
  7538. }
  7539. if (ret[0]) {
  7540. if (rp_ge[$t.p.id].useDataProxy) {
  7541. var dpret = $t.p.dataProxy.call($t, ajaxOptions, "set_"+$t.p.id);
  7542. if(dpret === undefined) {
  7543. dpret = [true, ""];
  7544. }
  7545. if(dpret[0] === false ) {
  7546. ret[0] = false;
  7547. ret[1] = dpret[1] || "Error deleting the selected row!" ;
  7548. } else {
  7549. if(ajaxOptions.data.oper === opers.addoper && rp_ge[$t.p.id].closeAfterAdd ) {
  7550. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7551. }
  7552. if(ajaxOptions.data.oper === opers.editoper && rp_ge[$t.p.id].closeAfterEdit ) {
  7553. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7554. }
  7555. }
  7556. } else {
  7557. if(ajaxOptions.url === "clientArray") {
  7558. rp_ge[$t.p.id].reloadAfterSubmit = false;
  7559. postdata = ajaxOptions.data;
  7560. ajaxOptions.complete({status:200, statusText:''},'');
  7561. } else {
  7562. $.ajax(ajaxOptions);
  7563. }
  7564. }
  7565. }
  7566. }
  7567. if(ret[0] === false) {
  7568. $(".FormError",frmgr).html(ret[1]);
  7569. $(".FormError",frmgr).show();
  7570. // return;
  7571. }
  7572. }
  7573. function compareData(nObj, oObj ) {
  7574. var ret = false,key;
  7575. for (key in nObj) {
  7576. if(nObj.hasOwnProperty(key) && nObj[key] != oObj[key]) {
  7577. ret = true;
  7578. break;
  7579. }
  7580. }
  7581. return ret;
  7582. }
  7583. function checkUpdates () {
  7584. var stat = true;
  7585. $(".FormError",frmgr).hide();
  7586. if(rp_ge[$t.p.id].checkOnUpdate) {
  7587. postdata = {};
  7588. getFormData();
  7589. diff = compareData(postdata,rp_ge[$t.p.id]._savedData);
  7590. if(diff) {
  7591. $(frmgr).data("disabled",true);
  7592. $(".confirm","#"+IDs.themodal).show();
  7593. stat = false;
  7594. }
  7595. }
  7596. return stat;
  7597. }
  7598. function restoreInline() {
  7599. var i;
  7600. if (rowid !== "_empty" && $t.p.savedRow !== undefined && $t.p.savedRow.length > 0 && $.isFunction($.fn.jqGrid.restoreRow)) {
  7601. for (i=0;i<$t.p.savedRow.length;i++) {
  7602. if ($t.p.savedRow[i].id === rowid) {
  7603. $($t).jqGrid('restoreRow',rowid);
  7604. break;
  7605. }
  7606. }
  7607. }
  7608. }
  7609. function updateNav(cr, posarr){
  7610. var totr = posarr[1].length-1;
  7611. if (cr===0) {
  7612. $("#pData",frmtb2).addClass('ui-state-disabled');
  7613. } else if( posarr[1][cr-1] !== undefined && $("#"+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')) {
  7614. $("#pData",frmtb2).addClass('ui-state-disabled');
  7615. } else {
  7616. $("#pData",frmtb2).removeClass('ui-state-disabled');
  7617. }
  7618. if (cr===totr) {
  7619. $("#nData",frmtb2).addClass('ui-state-disabled');
  7620. } else if( posarr[1][cr+1] !== undefined && $("#"+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')) {
  7621. $("#nData",frmtb2).addClass('ui-state-disabled');
  7622. } else {
  7623. $("#nData",frmtb2).removeClass('ui-state-disabled');
  7624. }
  7625. }
  7626. function getCurrPos() {
  7627. var rowsInGrid = $($t).jqGrid("getDataIDs"),
  7628. selrow = $("#id_g",frmtb).val(),
  7629. pos = $.inArray(selrow,rowsInGrid);
  7630. return [pos,rowsInGrid];
  7631. }
  7632. function parseTemplate ( template ){
  7633. var tmpl ="";
  7634. if(typeof template === "string") {
  7635. tmpl = template.replace(/\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, function(m,i){
  7636. return '<span id="'+ i+ '" ></span>';
  7637. });
  7638. }
  7639. return tmpl;
  7640. }
  7641. var dh = isNaN(rp_ge[$(this)[0].p.id].dataheight) ? rp_ge[$(this)[0].p.id].dataheight : rp_ge[$(this)[0].p.id].dataheight+"px",
  7642. dw = isNaN(rp_ge[$(this)[0].p.id].datawidth) ? rp_ge[$(this)[0].p.id].datawidth : rp_ge[$(this)[0].p.id].datawidth+"px",
  7643. frm = $("<form name='FormPost' id='"+frmgr+"' class='FormGrid' onSubmit='return false;' style='width:"+dw+";overflow:auto;position:relative;height:"+dh+";'></form>").data("disabled",false),
  7644. tbl;
  7645. if(templ) {
  7646. tbl = parseTemplate( rp_ge[$(this)[0].p.id].template );
  7647. frmtb2 = frmtb;
  7648. } else {
  7649. tbl = $("<table id='"+frmtborg+"' class='EditTable' cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>");
  7650. frmtb2 = frmtb+"_2";
  7651. }
  7652. frmgr = "#"+ $.jgrid.jqID(frmgr);
  7653. // errors
  7654. $(frm).append("<div class='FormError ui-state-error' style='display:none;'></div>" );
  7655. // topinfo
  7656. $(frm).append("<div class='tinfo topinfo'>"+rp_ge[$t.p.id].topinfo+"</div>");
  7657. $($t.p.colModel).each( function() {
  7658. var fmto = this.formoptions;
  7659. maxCols = Math.max(maxCols, fmto ? fmto.colpos || 0 : 0 );
  7660. maxRows = Math.max(maxRows, fmto ? fmto.rowpos || 0 : 0 );
  7661. });
  7662. $(frm).append(tbl);
  7663. showFrm = $($t).triggerHandler("jqGridAddEditBeforeInitData", [frm, frmoper]);
  7664. if(showFrm === undefined) {
  7665. showFrm = true;
  7666. }
  7667. if(showFrm && $.isFunction(rp_ge[$t.p.id].beforeInitData)) {
  7668. showFrm = rp_ge[$t.p.id].beforeInitData.call($t,frm, frmoper);
  7669. }
  7670. if(showFrm === false) {return;}
  7671. restoreInline();
  7672. // set the id.
  7673. // use carefull only to change here colproperties.
  7674. // create data
  7675. createData(rowid,$t,tbl,maxCols);
  7676. // buttons at footer
  7677. var rtlb = $t.p.direction === "rtl" ? true :false,
  7678. bp = rtlb ? "nData" : "pData",
  7679. bn = rtlb ? "pData" : "nData";
  7680. var bP = "<a id='"+bp+"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></a>",
  7681. bN = "<a id='"+bn+"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></a>",
  7682. bS ="<a id='sData' class='fm-button ui-state-default ui-corner-all'>"+p.bSubmit+"</a>",
  7683. bC ="<a id='cData' class='fm-button ui-state-default ui-corner-all'>"+p.bCancel+"</a>";
  7684. var bt = "<table border='0' cellspacing='0' cellpadding='0' class='EditTable' id='"+frmtborg+"_2'><tbody><tr><td colspan='2'><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr id='Act_Buttons'><td class='navButton'>"+(rtlb ? bN+bP : bP+bN)+"</td><td class='EditButton'>"+bS+bC+"</td></tr>";
  7685. //bt += "<tr style='display:none' class='binfo'><td class='bottominfo' colspan='2'>"+rp_ge[$t.p.id].bottominfo+"</td></tr>";
  7686. bt += "</tbody></table>";
  7687. if(maxRows > 0) {
  7688. var sd=[];
  7689. $.each($(tbl)[0].rows,function(i,r){
  7690. sd[i] = r;
  7691. });
  7692. sd.sort(function(a,b){
  7693. if(a.rp > b.rp) {return 1;}
  7694. if(a.rp < b.rp) {return -1;}
  7695. return 0;
  7696. });
  7697. $.each(sd, function(index, row) {
  7698. $('tbody',tbl).append(row);
  7699. });
  7700. }
  7701. p.gbox = "#gbox_"+$.jgrid.jqID(gID);
  7702. var cle = false;
  7703. if(p.closeOnEscape===true){
  7704. p.closeOnEscape = false;
  7705. cle = true;
  7706. }
  7707. var tms;
  7708. if(templ) {
  7709. $(frm).find("#pData").replaceWith( bP );
  7710. $(frm).find("#nData").replaceWith( bN );
  7711. $(frm).find("#sData").replaceWith( bS );
  7712. $(frm).find("#cData").replaceWith( bC );
  7713. tms = $("<div id="+frmtborg+"></div>").append(frm);
  7714. } else {
  7715. tms = $("<div></div>").append(frm).append(bt);
  7716. }
  7717. $(frm).append("<div class='binfo topinfo bottominfo'>"+rp_ge[$t.p.id].bottominfo+"</div>");
  7718. $.jgrid.createModal(IDs,tms, rp_ge[$(this)[0].p.id] ,"#gview_"+$.jgrid.jqID($t.p.id),$("#gbox_"+$.jgrid.jqID($t.p.id))[0]);
  7719. if(rtlb) {
  7720. $("#pData, #nData",frmtb+"_2").css("float","right");
  7721. $(".EditButton",frmtb+"_2").css("text-align","left");
  7722. }
  7723. if(rp_ge[$t.p.id].topinfo) {$(".tinfo", frmgr).show();}
  7724. if(rp_ge[$t.p.id].bottominfo) {$(".binfo",frmgr).show();}
  7725. tms = null;bt=null;
  7726. $("#"+$.jgrid.jqID(IDs.themodal)).keydown( function( e ) {
  7727. var wkey = e.target;
  7728. if ($(frmgr).data("disabled")===true ) {return false;}//??
  7729. if(rp_ge[$t.p.id].savekey[0] === true && e.which === rp_ge[$t.p.id].savekey[1]) { // save
  7730. if(wkey.tagName !== "TEXTAREA") {
  7731. $("#sData", frmtb+"_2").trigger("click");
  7732. return false;
  7733. }
  7734. }
  7735. if(e.which === 27) {
  7736. if(!checkUpdates()) {return false;}
  7737. if(cle) {$.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});}
  7738. return false;
  7739. }
  7740. if(rp_ge[$t.p.id].navkeys[0]===true) {
  7741. if($("#id_g",frmtb).val() === "_empty") {return true;}
  7742. if(e.which === rp_ge[$t.p.id].navkeys[1]){ //up
  7743. $("#pData", frmtb2).trigger("click");
  7744. return false;
  7745. }
  7746. if(e.which === rp_ge[$t.p.id].navkeys[2]){ //down
  7747. $("#nData", frmtb2).trigger("click");
  7748. return false;
  7749. }
  7750. }
  7751. });
  7752. if(p.checkOnUpdate) {
  7753. $("a.ui-jqdialog-titlebar-close span","#"+$.jgrid.jqID(IDs.themodal)).removeClass("jqmClose");
  7754. $("a.ui-jqdialog-titlebar-close","#"+$.jgrid.jqID(IDs.themodal)).unbind("click")
  7755. .click(function(){
  7756. if(!checkUpdates()) {return false;}
  7757. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7758. return false;
  7759. });
  7760. }
  7761. p.saveicon = $.extend([true,"left","ui-icon-disk"],p.saveicon);
  7762. p.closeicon = $.extend([true,"left","ui-icon-close"],p.closeicon);
  7763. // beforeinitdata after creation of the form
  7764. if(p.saveicon[0]===true) {
  7765. $("#sData",frmtb2).addClass(p.saveicon[1] === "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
  7766. .append("<span class='ui-icon "+p.saveicon[2]+"'></span>");
  7767. }
  7768. if(p.closeicon[0]===true) {
  7769. $("#cData",frmtb2).addClass(p.closeicon[1] === "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
  7770. .append("<span class='ui-icon "+p.closeicon[2]+"'></span>");
  7771. }
  7772. if(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {
  7773. bS ="<a id='sNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>"+p.bYes+"</a>";
  7774. bN ="<a id='nNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>"+p.bNo+"</a>";
  7775. bC ="<a id='cNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>"+p.bExit+"</a>";
  7776. var zI = p.zIndex || 999;zI ++;
  7777. $("<div class='"+ p.overlayClass+" jqgrid-overlay confirm' style='z-index:"+zI+";display:none;'>&#160;"+"</div><div class='confirm ui-widget-content ui-jqconfirm' style='z-index:"+(zI+1)+"'>"+p.saveData+"<br/><br/>"+bS+bN+bC+"</div>").insertAfter(frmgr);
  7778. $("#sNew","#"+$.jgrid.jqID(IDs.themodal)).click(function(){
  7779. postIt();
  7780. $(frmgr).data("disabled",false);
  7781. $(".confirm","#"+$.jgrid.jqID(IDs.themodal)).hide();
  7782. return false;
  7783. });
  7784. $("#nNew","#"+$.jgrid.jqID(IDs.themodal)).click(function(){
  7785. $(".confirm","#"+$.jgrid.jqID(IDs.themodal)).hide();
  7786. $(frmgr).data("disabled",false);
  7787. setTimeout(function(){$(":input:visible",frmgr)[0].focus();},0);
  7788. return false;
  7789. });
  7790. $("#cNew","#"+$.jgrid.jqID(IDs.themodal)).click(function(){
  7791. $(".confirm","#"+$.jgrid.jqID(IDs.themodal)).hide();
  7792. $(frmgr).data("disabled",false);
  7793. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7794. return false;
  7795. });
  7796. }
  7797. // here initform - only once
  7798. $($t).triggerHandler("jqGridAddEditInitializeForm", [$(frmgr), frmoper]);
  7799. if($.isFunction(rp_ge[$t.p.id].onInitializeForm)) { rp_ge[$t.p.id].onInitializeForm.call($t,$(frmgr), frmoper);}
  7800. if(rowid==="_empty" || !rp_ge[$t.p.id].viewPagerButtons) {$("#pData,#nData",frmtb2).hide();} else {$("#pData,#nData",frmtb2).show();}
  7801. $($t).triggerHandler("jqGridAddEditBeforeShowForm", [$(frmgr), frmoper]);
  7802. if($.isFunction(rp_ge[$t.p.id].beforeShowForm)) { rp_ge[$t.p.id].beforeShowForm.call($t, $(frmgr), frmoper);}
  7803. $("#"+$.jgrid.jqID(IDs.themodal)).data("onClose",rp_ge[$t.p.id].onClose);
  7804. $.jgrid.viewModal("#"+$.jgrid.jqID(IDs.themodal),{
  7805. gbox:"#gbox_"+$.jgrid.jqID(gID),
  7806. jqm:p.jqModal,
  7807. overlay: p.overlay,
  7808. modal:p.modal,
  7809. overlayClass: p.overlayClass,
  7810. onHide : function(h) {
  7811. var fh = $('#editmod'+gID)[0].style.height;
  7812. if(fh.indexOf("px") > -1 ) {
  7813. fh = parseFloat(fh);
  7814. }
  7815. $($t).data("formProp", {
  7816. top:parseFloat($(h.w).css("top")),
  7817. left : parseFloat($(h.w).css("left")),
  7818. width : $(h.w).width(),
  7819. height : fh,
  7820. dataheight : $(frmgr).height(),
  7821. datawidth: $(frmgr).width()
  7822. });
  7823. h.w.remove();
  7824. if(h.o) {h.o.remove();}
  7825. }
  7826. });
  7827. if(!closeovrl) {
  7828. $("." + $.jgrid.jqID(p.overlayClass)).click(function(){
  7829. if(!checkUpdates()) {return false;}
  7830. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7831. return false;
  7832. });
  7833. }
  7834. $(".fm-button","#"+$.jgrid.jqID(IDs.themodal)).hover(
  7835. function(){$(this).addClass('ui-state-hover');},
  7836. function(){$(this).removeClass('ui-state-hover');}
  7837. );
  7838. $("#sData", frmtb2).click(function(){
  7839. postdata = {};
  7840. $(".FormError",frmgr).hide();
  7841. // all depend on ret array
  7842. //ret[0] - succes
  7843. //ret[1] - msg if not succes
  7844. //ret[2] - the id that will be set if reload after submit false
  7845. getFormData();
  7846. if(postdata[$t.p.id+"_id"] === "_empty") {postIt();}
  7847. else if(p.checkOnSubmit===true ) {
  7848. diff = compareData(postdata,rp_ge[$t.p.id]._savedData);
  7849. if(diff) {
  7850. $(frmgr).data("disabled",true);
  7851. $(".confirm","#"+$.jgrid.jqID(IDs.themodal)).show();
  7852. } else {
  7853. postIt();
  7854. }
  7855. } else {
  7856. postIt();
  7857. }
  7858. return false;
  7859. });
  7860. $("#cData", frmtb2).click(function(){
  7861. if(!checkUpdates()) {return false;}
  7862. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  7863. return false;
  7864. });
  7865. $("#nData", frmtb2).click(function(){
  7866. if(!checkUpdates()) {return false;}
  7867. $(".FormError",frmgr).hide();
  7868. var npos = getCurrPos();
  7869. npos[0] = parseInt(npos[0],10);
  7870. if(npos[0] !== -1 && npos[1][npos[0]+1]) {
  7871. $($t).triggerHandler("jqGridAddEditClickPgButtons", ['next',$(frmgr),npos[1][npos[0]]]);
  7872. var nposret;
  7873. if($.isFunction(p.onclickPgButtons)) {
  7874. nposret = p.onclickPgButtons.call($t, 'next',$(frmgr),npos[1][npos[0]]);
  7875. if( nposret !== undefined && nposret === false ) {return false;}
  7876. }
  7877. if( $("#"+$.jgrid.jqID(npos[1][npos[0]+1])).hasClass('ui-state-disabled')) {return false;}
  7878. fillData(npos[1][npos[0]+1],$t,frmgr);
  7879. $($t).jqGrid("setSelection",npos[1][npos[0]+1]);
  7880. $($t).triggerHandler("jqGridAddEditAfterClickPgButtons", ['next',$(frmgr),npos[1][npos[0]]]);
  7881. if($.isFunction(p.afterclickPgButtons)) {
  7882. p.afterclickPgButtons.call($t, 'next',$(frmgr),npos[1][npos[0]+1]);
  7883. }
  7884. updateNav(npos[0]+1,npos);
  7885. }
  7886. return false;
  7887. });
  7888. $("#pData", frmtb2).click(function(){
  7889. if(!checkUpdates()) {return false;}
  7890. $(".FormError",frmgr).hide();
  7891. var ppos = getCurrPos();
  7892. if(ppos[0] !== -1 && ppos[1][ppos[0]-1]) {
  7893. $($t).triggerHandler("jqGridAddEditClickPgButtons", ['prev',$(frmgr),ppos[1][ppos[0]]]);
  7894. var pposret;
  7895. if($.isFunction(p.onclickPgButtons)) {
  7896. pposret = p.onclickPgButtons.call($t, 'prev',$(frmgr),ppos[1][ppos[0]]);
  7897. if( pposret !== undefined && pposret === false ) {return false;}
  7898. }
  7899. if( $("#"+$.jgrid.jqID(ppos[1][ppos[0]-1])).hasClass('ui-state-disabled')) {return false;}
  7900. fillData(ppos[1][ppos[0]-1],$t,frmgr);
  7901. $($t).jqGrid("setSelection",ppos[1][ppos[0]-1]);
  7902. $($t).triggerHandler("jqGridAddEditAfterClickPgButtons", ['prev',$(frmgr),ppos[1][ppos[0]]]);
  7903. if($.isFunction(p.afterclickPgButtons)) {
  7904. p.afterclickPgButtons.call($t, 'prev',$(frmgr),ppos[1][ppos[0]-1]);
  7905. }
  7906. updateNav(ppos[0]-1,ppos);
  7907. }
  7908. return false;
  7909. });
  7910. $($t).triggerHandler("jqGridAddEditAfterShowForm", [$(frmgr), frmoper]);
  7911. if($.isFunction(rp_ge[$t.p.id].afterShowForm)) { rp_ge[$t.p.id].afterShowForm.call($t, $(frmgr), frmoper); }
  7912. var posInit =getCurrPos();
  7913. updateNav(posInit[0],posInit);
  7914. });
  7915. },
  7916. viewGridRow : function(rowid, p){
  7917. var regional = $.jgrid.getRegional(this[0], 'view');
  7918. p = $.extend(true, {
  7919. top : 0,
  7920. left: 0,
  7921. width: 0,
  7922. datawidth: 'auto',
  7923. height: 'auto',
  7924. dataheight: 'auto',
  7925. modal: false,
  7926. overlay: 30,
  7927. drag: true,
  7928. resize: true,
  7929. jqModal: true,
  7930. closeOnEscape : false,
  7931. labelswidth: '30%',
  7932. closeicon: [],
  7933. navkeys: [false,38,40],
  7934. onClose: null,
  7935. beforeShowForm : null,
  7936. beforeInitData : null,
  7937. viewPagerButtons : true,
  7938. recreateForm : false,
  7939. removemodal: true,
  7940. form: 'view'
  7941. }, regional, p || {});
  7942. rp_ge[$(this)[0].p.id] = p;
  7943. return this.each(function(){
  7944. var $t = this;
  7945. if (!$t.grid || !rowid) {return;}
  7946. var gID = $t.p.id,
  7947. frmgr = "ViewGrid_"+$.jgrid.jqID( gID ), frmtb = "ViewTbl_" + $.jgrid.jqID( gID ),
  7948. frmgr_id = "ViewGrid_"+gID, frmtb_id = "ViewTbl_"+gID,
  7949. IDs = {themodal:'viewmod'+gID,modalhead:'viewhd'+gID,modalcontent:'viewcnt'+gID, scrollelm : frmgr},
  7950. onBeforeInit = $.isFunction(rp_ge[$t.p.id].beforeInitData) ? rp_ge[$t.p.id].beforeInitData : false,
  7951. showFrm = true,
  7952. maxCols = 1, maxRows=0;
  7953. if(!p.recreateForm) {
  7954. if( $($t).data("viewProp") ) {
  7955. $.extend(rp_ge[$(this)[0].p.id], $($t).data("viewProp"));
  7956. }
  7957. }
  7958. function focusaref(){ //Sfari 3 issues
  7959. if(rp_ge[$t.p.id].closeOnEscape===true || rp_ge[$t.p.id].navkeys[0]===true) {
  7960. setTimeout(function(){$(".ui-jqdialog-titlebar-close","#"+$.jgrid.jqID(IDs.modalhead)).attr("tabindex", "-1").focus();},0);
  7961. }
  7962. }
  7963. function createData(rowid,obj,tb,maxcols){
  7964. var nm, hc,trdata, cnt=0,tmp, dc, retpos=[], ind=false, i,
  7965. tdtmpl = "<td class='CaptionTD form-view-label ui-widget-content' width='"+p.labelswidth+"'>&#160;</td><td class='DataTD form-view-data ui-helper-reset ui-widget-content'>&#160;</td>", tmpl="",
  7966. tdtmpl2 = "<td class='CaptionTD form-view-label ui-widget-content'>&#160;</td><td class='DataTD form-view-data ui-widget-content'>&#160;</td>",
  7967. fmtnum = ['integer','number','currency'],max1 =0, max2=0 ,maxw,setme, viewfld;
  7968. for (i=1;i<=maxcols;i++) {
  7969. tmpl += i === 1 ? tdtmpl : tdtmpl2;
  7970. }
  7971. // find max number align rigth with property formatter
  7972. $(obj.p.colModel).each( function() {
  7973. if(this.editrules && this.editrules.edithidden === true) {
  7974. hc = false;
  7975. } else {
  7976. hc = this.hidden === true ? true : false;
  7977. }
  7978. if(!hc && this.align==='right') {
  7979. if(this.formatter && $.inArray(this.formatter,fmtnum) !== -1 ) {
  7980. max1 = Math.max(max1,parseInt(this.width,10));
  7981. } else {
  7982. max2 = Math.max(max2,parseInt(this.width,10));
  7983. }
  7984. }
  7985. });
  7986. maxw = max1 !==0 ? max1 : max2 !==0 ? max2 : 0;
  7987. ind = $(obj).jqGrid("getInd",rowid);
  7988. $(obj.p.colModel).each( function(i) {
  7989. nm = this.name;
  7990. setme = false;
  7991. // hidden fields are included in the form
  7992. if(this.editrules && this.editrules.edithidden === true) {
  7993. hc = false;
  7994. } else {
  7995. hc = this.hidden === true ? true : false;
  7996. }
  7997. dc = hc ? "style='display:none'" : "";
  7998. viewfld = (typeof this.viewable !== 'boolean') ? true : this.viewable;
  7999. if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn' && viewfld) {
  8000. if(ind === false) {
  8001. tmp = "";
  8002. } else {
  8003. if(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {
  8004. tmp = $("td:eq("+i+")",obj.rows[ind]).text();
  8005. } else {
  8006. tmp = $("td:eq("+i+")",obj.rows[ind]).html();
  8007. }
  8008. }
  8009. setme = this.align === 'right' && maxw !==0 ? true : false;
  8010. var frmopt = $.extend({},{rowabove:false,rowcontent:''}, this.formoptions || {}),
  8011. rp = parseInt(frmopt.rowpos,10) || cnt+1,
  8012. cp = parseInt((parseInt(frmopt.colpos,10) || 1)*2,10);
  8013. if(frmopt.rowabove) {
  8014. var newdata = $("<tr><td class='contentinfo' colspan='"+(maxcols*2)+"'>"+frmopt.rowcontent+"</td></tr>");
  8015. $(tb).append(newdata);
  8016. newdata[0].rp = rp;
  8017. }
  8018. trdata = $(tb).find("tr[rowpos="+rp+"]");
  8019. if ( trdata.length===0 ) {
  8020. trdata = $("<tr "+dc+" rowpos='"+rp+"'></tr>").addClass("FormData").attr("id","trv_"+nm);
  8021. $(trdata).append(tmpl);
  8022. $(tb).append(trdata);
  8023. trdata[0].rp = rp;
  8024. }
  8025. $("td:eq("+(cp-2)+")",trdata[0]).html('<b>'+ (frmopt.label === undefined ? obj.p.colNames[i]: frmopt.label)+'</b>');
  8026. $("td:eq("+(cp-1)+")",trdata[0]).append("<span>"+tmp+"</span>").attr("id","v_"+nm);
  8027. if(setme){
  8028. $("td:eq("+(cp-1)+") span",trdata[0]).css({'text-align':'right',width:maxw+"px"});
  8029. }
  8030. retpos[cnt] = i;
  8031. cnt++;
  8032. }
  8033. });
  8034. if( cnt > 0) {
  8035. 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>");
  8036. idrow[0].rp = cnt+99;
  8037. $(tb).append(idrow);
  8038. }
  8039. return retpos;
  8040. }
  8041. function fillData(rowid,obj){
  8042. var nm, hc,cnt=0,tmp,trv;
  8043. trv = $(obj).jqGrid("getInd",rowid,true);
  8044. if(!trv) {return;}
  8045. $('td',trv).each( function(i) {
  8046. nm = obj.p.colModel[i].name;
  8047. // hidden fields are included in the form
  8048. if(obj.p.colModel[i].editrules && obj.p.colModel[i].editrules.edithidden === true) {
  8049. hc = false;
  8050. } else {
  8051. hc = obj.p.colModel[i].hidden === true ? true : false;
  8052. }
  8053. if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') {
  8054. if(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {
  8055. tmp = $(this).text();
  8056. } else {
  8057. tmp = $(this).html();
  8058. }
  8059. nm = $.jgrid.jqID("v_"+nm);
  8060. $("#"+nm+" span","#"+frmtb).html(tmp);
  8061. if (hc) {$("#"+nm,"#"+frmtb).parents("tr:first").hide();}
  8062. cnt++;
  8063. }
  8064. });
  8065. if(cnt>0) {$("#id_g","#"+frmtb).val(rowid);}
  8066. }
  8067. function updateNav(cr,posarr){
  8068. var totr = posarr[1].length-1;
  8069. if (cr===0) {
  8070. $("#pData","#"+frmtb+"_2").addClass('ui-state-disabled');
  8071. } else if( posarr[1][cr-1] !== undefined && $("#"+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')) {
  8072. $("#pData",frmtb+"_2").addClass('ui-state-disabled');
  8073. } else {
  8074. $("#pData","#"+frmtb+"_2").removeClass('ui-state-disabled');
  8075. }
  8076. if (cr===totr) {
  8077. $("#nData","#"+frmtb+"_2").addClass('ui-state-disabled');
  8078. } else if( posarr[1][cr+1] !== undefined && $("#"+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')) {
  8079. $("#nData",frmtb+"_2").addClass('ui-state-disabled');
  8080. } else {
  8081. $("#nData","#"+frmtb+"_2").removeClass('ui-state-disabled');
  8082. }
  8083. }
  8084. function getCurrPos() {
  8085. var rowsInGrid = $($t).jqGrid("getDataIDs"),
  8086. selrow = $("#id_g","#"+frmtb).val(),
  8087. pos = $.inArray(selrow,rowsInGrid);
  8088. return [pos,rowsInGrid];
  8089. }
  8090. var dh = isNaN(rp_ge[$(this)[0].p.id].dataheight) ? rp_ge[$(this)[0].p.id].dataheight : rp_ge[$(this)[0].p.id].dataheight+"px",
  8091. dw = isNaN(rp_ge[$(this)[0].p.id].datawidth) ? rp_ge[$(this)[0].p.id].datawidth : rp_ge[$(this)[0].p.id].datawidth+"px",
  8092. frm = $("<form name='FormPost' id='"+frmgr_id+"' class='FormGrid' style='width:"+dw+";overflow:auto;position:relative;height:"+dh+";'></form>"),
  8093. tbl =$("<table id='"+frmtb_id+"' class='EditTable' cellspacing='1' cellpadding='2' border='0' style='table-layout:fixed'><tbody></tbody></table>");
  8094. $($t.p.colModel).each( function() {
  8095. var fmto = this.formoptions;
  8096. maxCols = Math.max(maxCols, fmto ? fmto.colpos || 0 : 0 );
  8097. maxRows = Math.max(maxRows, fmto ? fmto.rowpos || 0 : 0 );
  8098. });
  8099. // set the id.
  8100. $(frm).append(tbl);
  8101. if(onBeforeInit) {
  8102. showFrm = onBeforeInit.call($t, frm );
  8103. if(showFrm === undefined) {
  8104. showFrm = true;
  8105. }
  8106. }
  8107. if(showFrm === false) {return;}
  8108. createData(rowid, $t, tbl, maxCols);
  8109. var rtlb = $t.p.direction === "rtl" ? true :false,
  8110. bp = rtlb ? "nData" : "pData",
  8111. bn = rtlb ? "pData" : "nData",
  8112. // buttons at footer
  8113. bP = "<a id='"+bp+"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></a>",
  8114. bN = "<a id='"+bn+"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></a>",
  8115. bC ="<a id='cData' class='fm-button ui-state-default ui-corner-all'>"+p.bClose+"</a>";
  8116. if(maxRows > 0) {
  8117. var sd=[];
  8118. $.each($(tbl)[0].rows,function(i,r){
  8119. sd[i] = r;
  8120. });
  8121. sd.sort(function(a,b){
  8122. if(a.rp > b.rp) {return 1;}
  8123. if(a.rp < b.rp) {return -1;}
  8124. return 0;
  8125. });
  8126. $.each(sd, function(index, row) {
  8127. $('tbody',tbl).append(row);
  8128. });
  8129. }
  8130. p.gbox = "#gbox_"+$.jgrid.jqID(gID);
  8131. var bt = $("<div></div>").append(frm).append("<table border='0' class='EditTable' id='"+frmtb+"_2'><tbody><tr id='Act_Buttons'><td class='navButton' width='"+p.labelswidth+"'>"+(rtlb ? bN+bP : bP+bN)+"</td><td class='EditButton'>"+bC+"</td></tr></tbody></table>");
  8132. $.jgrid.createModal(IDs,bt,p,"#gview_"+$.jgrid.jqID($t.p.id),$("#gview_"+$.jgrid.jqID($t.p.id))[0]);
  8133. if(rtlb) {
  8134. $("#pData, #nData","#"+frmtb+"_2").css("float","right");
  8135. $(".EditButton","#"+frmtb+"_2").css("text-align","left");
  8136. }
  8137. if(!p.viewPagerButtons) {$("#pData, #nData","#"+frmtb+"_2").hide();}
  8138. bt = null;
  8139. $("#"+IDs.themodal).keydown( function( e ) {
  8140. if(e.which === 27) {
  8141. if(rp_ge[$t.p.id].closeOnEscape) {$.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal, onClose: p.onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});}
  8142. return false;
  8143. }
  8144. if(p.navkeys[0]===true) {
  8145. if(e.which === p.navkeys[1]){ //up
  8146. $("#pData", "#"+frmtb+"_2").trigger("click");
  8147. return false;
  8148. }
  8149. if(e.which === p.navkeys[2]){ //down
  8150. $("#nData", "#"+frmtb+"_2").trigger("click");
  8151. return false;
  8152. }
  8153. }
  8154. });
  8155. p.closeicon = $.extend([true,"left","ui-icon-close"],p.closeicon);
  8156. if(p.closeicon[0]===true) {
  8157. $("#cData","#"+frmtb+"_2").addClass(p.closeicon[1] === "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
  8158. .append("<span class='ui-icon "+p.closeicon[2]+"'></span>");
  8159. }
  8160. if($.isFunction(p.beforeShowForm)) {p.beforeShowForm.call($t,$("#"+frmgr));}
  8161. $.jgrid.viewModal("#"+$.jgrid.jqID(IDs.themodal),{
  8162. gbox:"#gbox_"+$.jgrid.jqID(gID),
  8163. jqm:p.jqModal,
  8164. overlay: p.overlay,
  8165. modal:p.modal,
  8166. onHide : function(h) {
  8167. $($t).data("viewProp", {
  8168. top:parseFloat($(h.w).css("top")),
  8169. left : parseFloat($(h.w).css("left")),
  8170. width : $(h.w).width(),
  8171. height : $(h.w).height(),
  8172. dataheight : $("#"+frmgr).height(),
  8173. datawidth: $("#"+frmgr).width()
  8174. });
  8175. h.w.remove();
  8176. if(h.o) {h.o.remove();}
  8177. }
  8178. });
  8179. $(".fm-button:not(.ui-state-disabled)","#"+frmtb+"_2").hover(
  8180. function(){$(this).addClass('ui-state-hover');},
  8181. function(){$(this).removeClass('ui-state-hover');}
  8182. );
  8183. focusaref();
  8184. $("#cData", "#"+frmtb+"_2").click(function(){
  8185. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: p.onClose, removemodal: rp_ge[$t.p.id].removemodal, formprop: !rp_ge[$t.p.id].recreateForm, form: rp_ge[$t.p.id].form});
  8186. return false;
  8187. });
  8188. $("#nData", "#"+frmtb+"_2").click(function(){
  8189. $("#FormError","#"+frmtb).hide();
  8190. var npos = getCurrPos();
  8191. npos[0] = parseInt(npos[0],10);
  8192. if(npos[0] !== -1 && npos[1][npos[0]+1]) {
  8193. if($.isFunction(p.onclickPgButtons)) {
  8194. p.onclickPgButtons.call($t,'next',$("#"+frmgr),npos[1][npos[0]]);
  8195. }
  8196. fillData(npos[1][npos[0]+1],$t);
  8197. $($t).jqGrid("setSelection",npos[1][npos[0]+1]);
  8198. if($.isFunction(p.afterclickPgButtons)) {
  8199. p.afterclickPgButtons.call($t,'next',$("#"+frmgr),npos[1][npos[0]+1]);
  8200. }
  8201. updateNav(npos[0]+1,npos);
  8202. }
  8203. focusaref();
  8204. return false;
  8205. });
  8206. $("#pData", "#"+frmtb+"_2").click(function(){
  8207. $("#FormError","#"+frmtb).hide();
  8208. var ppos = getCurrPos();
  8209. if(ppos[0] !== -1 && ppos[1][ppos[0]-1]) {
  8210. if($.isFunction(p.onclickPgButtons)) {
  8211. p.onclickPgButtons.call($t,'prev',$("#"+frmgr),ppos[1][ppos[0]]);
  8212. }
  8213. fillData(ppos[1][ppos[0]-1],$t);
  8214. $($t).jqGrid("setSelection",ppos[1][ppos[0]-1]);
  8215. if($.isFunction(p.afterclickPgButtons)) {
  8216. p.afterclickPgButtons.call($t,'prev',$("#"+frmgr),ppos[1][ppos[0]-1]);
  8217. }
  8218. updateNav(ppos[0]-1,ppos);
  8219. }
  8220. focusaref();
  8221. return false;
  8222. });
  8223. var posInit =getCurrPos();
  8224. updateNav(posInit[0],posInit);
  8225. });
  8226. },
  8227. delGridRow : function(rowids,p) {
  8228. var regional = $.jgrid.getRegional(this[0], 'del');
  8229. p = $.extend(true, {
  8230. top : 0,
  8231. left: 0,
  8232. width: 240,
  8233. height: 'auto',
  8234. dataheight : 'auto',
  8235. modal: false,
  8236. overlay: 30,
  8237. drag: true,
  8238. resize: true,
  8239. url : '',
  8240. mtype : "POST",
  8241. reloadAfterSubmit: true,
  8242. beforeShowForm: null,
  8243. beforeInitData : null,
  8244. afterShowForm: null,
  8245. beforeSubmit: null,
  8246. onclickSubmit: null,
  8247. afterSubmit: null,
  8248. jqModal : true,
  8249. closeOnEscape : false,
  8250. delData: {},
  8251. delicon : [],
  8252. cancelicon : [],
  8253. onClose : null,
  8254. ajaxDelOptions : {},
  8255. processing : false,
  8256. serializeDelData : null,
  8257. useDataProxy : false
  8258. }, regional, p ||{});
  8259. rp_ge[$(this)[0].p.id] = p;
  8260. return this.each(function(){
  8261. var $t = this;
  8262. if (!$t.grid ) {return;}
  8263. if(!rowids) {return;}
  8264. var onBeforeShow = $.isFunction( rp_ge[$t.p.id].beforeShowForm ),
  8265. onAfterShow = $.isFunction( rp_ge[$t.p.id].afterShowForm ),
  8266. onBeforeInit = $.isFunction(rp_ge[$t.p.id].beforeInitData) ? rp_ge[$t.p.id].beforeInitData : false,
  8267. gID = $t.p.id, onCS = {},
  8268. showFrm = true,
  8269. dtbl = "DelTbl_"+$.jgrid.jqID(gID),postd, idname, opers, oper,
  8270. dtbl_id = "DelTbl_" + gID,
  8271. IDs = {themodal:'delmod'+gID,modalhead:'delhd'+gID,modalcontent:'delcnt'+gID, scrollelm: dtbl};
  8272. if ($.isArray(rowids)) {rowids = rowids.join();}
  8273. if ( $("#"+$.jgrid.jqID(IDs.themodal))[0] !== undefined ) {
  8274. if(onBeforeInit) {
  8275. showFrm = onBeforeInit.call($t,$("#"+dtbl));
  8276. if(showFrm === undefined) {
  8277. showFrm = true;
  8278. }
  8279. }
  8280. if(showFrm === false) {return;}
  8281. $("#DelData>td","#"+dtbl).text(rowids);
  8282. $("#DelError","#"+dtbl).hide();
  8283. if( rp_ge[$t.p.id].processing === true) {
  8284. rp_ge[$t.p.id].processing=false;
  8285. $("#dData", "#"+dtbl).removeClass('ui-state-active');
  8286. }
  8287. if(onBeforeShow) {rp_ge[$t.p.id].beforeShowForm.call($t,$("#"+dtbl));}
  8288. $.jgrid.viewModal("#"+$.jgrid.jqID(IDs.themodal),{gbox:"#gbox_"+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,jqM: false, overlay: rp_ge[$t.p.id].overlay, modal:rp_ge[$t.p.id].modal});
  8289. if(onAfterShow) {rp_ge[$t.p.id].afterShowForm.call($t,$("#"+dtbl));}
  8290. } else {
  8291. var dh = isNaN(rp_ge[$t.p.id].dataheight) ? rp_ge[$t.p.id].dataheight : rp_ge[$t.p.id].dataheight+"px",
  8292. dw = isNaN(p.datawidth) ? p.datawidth : p.datawidth+"px",
  8293. tbl = "<div id='"+dtbl_id+"' class='formdata' style='width:"+dw+";overflow:auto;position:relative;height:"+dh+";'>";
  8294. tbl += "<table class='DelTable'><tbody>";
  8295. // error data
  8296. tbl += "<tr id='DelError' style='display:none'><td class='ui-state-error'></td></tr>";
  8297. tbl += "<tr id='DelData' style='display:none'><td >"+rowids+"</td></tr>";
  8298. tbl += "<tr><td class=\"delmsg\" style=\"white-space:pre;\">"+rp_ge[$t.p.id].msg+"</td></tr><tr><td >&#160;</td></tr>";
  8299. // buttons at footer
  8300. tbl += "</tbody></table></div>";
  8301. var bS = "<a id='dData' class='fm-button ui-state-default ui-corner-all'>"+p.bSubmit+"</a>",
  8302. bC = "<a id='eData' class='fm-button ui-state-default ui-corner-all'>"+p.bCancel+"</a>";
  8303. tbl += "<table cellspacing='0' cellpadding='0' border='0' class='EditTable' id='"+dtbl+"_2'><tbody><tr><td><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr><td class='DelButton EditButton'>"+bS+"&#160;"+bC+"</td></tr></tbody></table>";
  8304. p.gbox = "#gbox_"+$.jgrid.jqID(gID);
  8305. $.jgrid.createModal(IDs,tbl,p,"#gview_"+$.jgrid.jqID($t.p.id),$("#gview_"+$.jgrid.jqID($t.p.id))[0]);
  8306. if(onBeforeInit) {
  8307. showFrm = onBeforeInit.call($t,$(tbl));
  8308. if(showFrm === undefined) {
  8309. showFrm = true;
  8310. }
  8311. }
  8312. if(showFrm === false) {return;}
  8313. $(".fm-button","#"+dtbl+"_2").hover(
  8314. function(){$(this).addClass('ui-state-hover');},
  8315. function(){$(this).removeClass('ui-state-hover');}
  8316. );
  8317. p.delicon = $.extend([true,"left","ui-icon-scissors"],rp_ge[$t.p.id].delicon);
  8318. p.cancelicon = $.extend([true,"left","ui-icon-cancel"],rp_ge[$t.p.id].cancelicon);
  8319. if(p.delicon[0]===true) {
  8320. $("#dData","#"+dtbl+"_2").addClass(p.delicon[1] === "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
  8321. .append("<span class='ui-icon "+p.delicon[2]+"'></span>");
  8322. }
  8323. if(p.cancelicon[0]===true) {
  8324. $("#eData","#"+dtbl+"_2").addClass(p.cancelicon[1] === "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
  8325. .append("<span class='ui-icon "+p.cancelicon[2]+"'></span>");
  8326. }
  8327. $("#dData","#"+dtbl+"_2").click(function(){
  8328. var ret=[true,""], pk,
  8329. postdata = $("#DelData>td","#"+dtbl).text(); //the pair is name=val1,val2,...
  8330. onCS = {};
  8331. if( $.isFunction( rp_ge[$t.p.id].onclickSubmit ) ) {onCS = rp_ge[$t.p.id].onclickSubmit.call($t,rp_ge[$t.p.id], postdata) || {};}
  8332. if( $.isFunction( rp_ge[$t.p.id].beforeSubmit ) ) {ret = rp_ge[$t.p.id].beforeSubmit.call($t,postdata);}
  8333. if(ret[0] && !rp_ge[$t.p.id].processing) {
  8334. rp_ge[$t.p.id].processing = true;
  8335. opers = $t.p.prmNames;
  8336. postd = $.extend({},rp_ge[$t.p.id].delData, onCS);
  8337. oper = opers.oper;
  8338. postd[oper] = opers.deloper;
  8339. idname = opers.id;
  8340. postdata = String(postdata).split(",");
  8341. if(!postdata.length) { return false; }
  8342. for(pk in postdata) {
  8343. if(postdata.hasOwnProperty(pk)) {
  8344. postdata[pk] = $.jgrid.stripPref($t.p.idPrefix, postdata[pk]);
  8345. }
  8346. }
  8347. postd[idname] = postdata.join();
  8348. $(this).addClass('ui-state-active');
  8349. var ajaxOptions = $.extend({
  8350. url: rp_ge[$t.p.id].url || $($t).jqGrid('getGridParam','editurl'),
  8351. type: rp_ge[$t.p.id].mtype,
  8352. data: $.isFunction(rp_ge[$t.p.id].serializeDelData) ? rp_ge[$t.p.id].serializeDelData.call($t,postd) : postd,
  8353. complete:function(data,status){
  8354. var i;
  8355. $("#dData", "#"+dtbl+"_2").removeClass('ui-state-active');
  8356. if(data.status >= 300 && data.status !== 304) {
  8357. ret[0] = false;
  8358. if ($.isFunction(rp_ge[$t.p.id].errorTextFormat)) {
  8359. ret[1] = rp_ge[$t.p.id].errorTextFormat.call($t,data);
  8360. } else {
  8361. ret[1] = status + " Status: '" + data.statusText + "'. Error code: " + data.status;
  8362. }
  8363. } else {
  8364. // data is posted successful
  8365. // execute aftersubmit with the returned data from server
  8366. if( $.isFunction( rp_ge[$t.p.id].afterSubmit ) ) {
  8367. ret = rp_ge[$t.p.id].afterSubmit.call($t,data,postd);
  8368. }
  8369. }
  8370. if(ret[0] === false) {
  8371. $("#DelError>td","#"+dtbl).html(ret[1]);
  8372. $("#DelError","#"+dtbl).show();
  8373. } else {
  8374. if(rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype !== "local") {
  8375. $($t).trigger("reloadGrid");
  8376. } else {
  8377. if($t.p.treeGrid===true){
  8378. try {$($t).jqGrid("delTreeNode",$t.p.idPrefix+postdata[0]);} catch(e){}
  8379. } else {
  8380. for(i=0;i<postdata.length;i++) {
  8381. $($t).jqGrid("delRowData",$t.p.idPrefix+ postdata[i]);
  8382. }
  8383. }
  8384. $t.p.selrow = null;
  8385. $t.p.selarrrow = [];
  8386. }
  8387. if($.isFunction(rp_ge[$t.p.id].afterComplete)) {
  8388. setTimeout(function(){rp_ge[$t.p.id].afterComplete.call($t,data,postdata);},500);
  8389. }
  8390. }
  8391. rp_ge[$t.p.id].processing=false;
  8392. if(ret[0]) {$.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});}
  8393. }
  8394. }, $.jgrid.ajaxOptions, rp_ge[$t.p.id].ajaxDelOptions);
  8395. if (!ajaxOptions.url && !rp_ge[$t.p.id].useDataProxy) {
  8396. if ($.isFunction($t.p.dataProxy)) {
  8397. rp_ge[$t.p.id].useDataProxy = true;
  8398. } else {
  8399. ret[0]=false;ret[1] += " "+$.jgrid.getRegional($t, 'errors.nourl');
  8400. }
  8401. }
  8402. if (ret[0]) {
  8403. if (rp_ge[$t.p.id].useDataProxy) {
  8404. var dpret = $t.p.dataProxy.call($t, ajaxOptions, "del_"+$t.p.id);
  8405. if(dpret === undefined) {
  8406. dpret = [true, ""];
  8407. }
  8408. if(dpret[0] === false ) {
  8409. ret[0] = false;
  8410. ret[1] = dpret[1] || "Error deleting the selected row!" ;
  8411. } else {
  8412. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});
  8413. }
  8414. }
  8415. else {
  8416. if(ajaxOptions.url === "clientArray") {
  8417. postd = ajaxOptions.data;
  8418. ajaxOptions.complete({status:200, statusText:''},'');
  8419. } else {
  8420. $.ajax(ajaxOptions);
  8421. }
  8422. }
  8423. }
  8424. }
  8425. if(ret[0] === false) {
  8426. $("#DelError>td","#"+dtbl).html(ret[1]);
  8427. $("#DelError","#"+dtbl).show();
  8428. }
  8429. return false;
  8430. });
  8431. $("#eData", "#"+dtbl+"_2").click(function(){
  8432. $.jgrid.hideModal("#"+$.jgrid.jqID(IDs.themodal),{gb:"#gbox_"+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal, onClose: rp_ge[$t.p.id].onClose});
  8433. return false;
  8434. });
  8435. if(onBeforeShow) {rp_ge[$t.p.id].beforeShowForm.call($t,$("#"+dtbl));}
  8436. $.jgrid.viewModal("#"+$.jgrid.jqID(IDs.themodal),{gbox:"#gbox_"+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal, overlay: rp_ge[$t.p.id].overlay, modal:rp_ge[$t.p.id].modal});
  8437. if(onAfterShow) {rp_ge[$t.p.id].afterShowForm.call($t,$("#"+dtbl));}
  8438. }
  8439. if(rp_ge[$t.p.id].closeOnEscape===true) {
  8440. setTimeout(function(){$(".ui-jqdialog-titlebar-close","#"+$.jgrid.jqID(IDs.modalhead)).attr("tabindex","-1").focus();},0);
  8441. }
  8442. });
  8443. },
  8444. navGrid : function (elem, p, pEdit, pAdd, pDel, pSearch, pView) {
  8445. var regional = $.jgrid.getRegional(this[0], 'nav');
  8446. p = $.extend({
  8447. edit: true,
  8448. editicon: "ui-icon-pencil",
  8449. add: true,
  8450. addicon:"ui-icon-plus",
  8451. del: true,
  8452. delicon:"ui-icon-trash",
  8453. search: true,
  8454. searchicon:"ui-icon-search",
  8455. refresh: true,
  8456. refreshicon:"ui-icon-refresh",
  8457. refreshstate: 'firstpage',
  8458. view: false,
  8459. viewicon : "ui-icon-document",
  8460. position : "left",
  8461. closeOnEscape : true,
  8462. beforeRefresh : null,
  8463. afterRefresh : null,
  8464. cloneToTop : false,
  8465. alertwidth : 200,
  8466. alertheight : 'auto',
  8467. alerttop: null,
  8468. alertleft: null,
  8469. alertzIndex : null
  8470. }, regional, p ||{});
  8471. return this.each(function() {
  8472. if(this.p.navGrid) {return;}
  8473. var alertIDs = {themodal: 'alertmod_' + this.p.id, modalhead: 'alerthd_' + this.p.id,modalcontent: 'alertcnt_' + this.p.id},
  8474. $t = this, twd, tdw, o;
  8475. if(!$t.grid || typeof elem !== 'string') {return;}
  8476. if(!$($t).data('navGrid')) {
  8477. $($t).data('navGrid',p);
  8478. }
  8479. // speedoverhead, but usefull for future
  8480. o = $($t).data('navGrid');
  8481. if($t.p.force_regional) {
  8482. o = $.extend(o, regional);
  8483. }
  8484. if ($("#"+alertIDs.themodal)[0] === undefined) {
  8485. if(!o.alerttop && !o.alertleft) {
  8486. if (window.innerWidth !== undefined) {
  8487. o.alertleft = window.innerWidth;
  8488. o.alerttop = window.innerHeight;
  8489. } else if (document.documentElement !== undefined && document.documentElement.clientWidth !== undefined && document.documentElement.clientWidth !== 0) {
  8490. o.alertleft = document.documentElement.clientWidth;
  8491. o.alerttop = document.documentElement.clientHeight;
  8492. } else {
  8493. o.alertleft=1024;
  8494. o.alerttop=768;
  8495. }
  8496. o.alertleft = o.alertleft/2 - parseInt(o.alertwidth,10)/2;
  8497. o.alerttop = o.alerttop/2-25;
  8498. }
  8499. $.jgrid.createModal(alertIDs,
  8500. "<div>"+o.alerttext+"</div><span tabindex='0'><span tabindex='-1' id='jqg_alrt'></span></span>",
  8501. {
  8502. gbox:"#gbox_"+$.jgrid.jqID($t.p.id),
  8503. jqModal:true,
  8504. drag:true,
  8505. resize:true,
  8506. caption:o.alertcap,
  8507. top:o.alerttop,
  8508. left:o.alertleft,
  8509. width:o.alertwidth,
  8510. height: o.alertheight,
  8511. closeOnEscape:o.closeOnEscape,
  8512. zIndex: o.alertzIndex
  8513. },
  8514. "#gview_"+$.jgrid.jqID($t.p.id),
  8515. $("#gbox_"+$.jgrid.jqID($t.p.id))[0],
  8516. true
  8517. );
  8518. }
  8519. var clone = 1, i,
  8520. onHoverIn = function () {
  8521. if (!$(this).hasClass('ui-state-disabled')) {
  8522. $(this).addClass("ui-state-hover");
  8523. }
  8524. },
  8525. onHoverOut = function () {
  8526. $(this).removeClass("ui-state-hover");
  8527. };
  8528. if(o.cloneToTop && $t.p.toppager) {clone = 2;}
  8529. for(i = 0; i<clone; i++) {
  8530. var tbd,
  8531. navtbl = $("<table cellspacing='0' cellpadding='0' border='0' class='ui-pg-table navtable' style='float:left;table-layout:auto;'><tbody><tr></tr></tbody></table>"),
  8532. sep = "<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='ui-separator'></span></td>",
  8533. pgid, elemids;
  8534. if(i===0) {
  8535. pgid = elem;
  8536. elemids = $t.p.id;
  8537. if(pgid === $t.p.toppager) {
  8538. elemids += "_top";
  8539. clone = 1;
  8540. }
  8541. } else {
  8542. pgid = $t.p.toppager;
  8543. elemids = $t.p.id+"_top";
  8544. }
  8545. if($t.p.direction === "rtl") {$(navtbl).attr("dir","rtl").css("float","right");}
  8546. pAdd = pAdd || {};
  8547. if (o.add) {
  8548. tbd = $("<td class='ui-pg-button ui-corner-all'></td>");
  8549. $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.addicon+"'></span>"+o.addtext+"</div>");
  8550. $("tr",navtbl).append(tbd);
  8551. $(tbd,navtbl)
  8552. .attr({"title":o.addtitle || "",id : pAdd.id || "add_"+elemids})
  8553. .click(function(){
  8554. if (!$(this).hasClass('ui-state-disabled')) {
  8555. if ($.isFunction( o.addfunc )) {
  8556. o.addfunc.call($t);
  8557. } else {
  8558. $($t).jqGrid("editGridRow","new",pAdd);
  8559. }
  8560. }
  8561. return false;
  8562. }).hover(onHoverIn, onHoverOut);
  8563. tbd = null;
  8564. }
  8565. pEdit = pEdit || {};
  8566. if (o.edit) {
  8567. tbd = $("<td class='ui-pg-button ui-corner-all'></td>");
  8568. $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.editicon+"'></span>"+o.edittext+"</div>");
  8569. $("tr",navtbl).append(tbd);
  8570. $(tbd,navtbl)
  8571. .attr({"title":o.edittitle || "",id: pEdit.id || "edit_"+elemids})
  8572. .click(function(){
  8573. if (!$(this).hasClass('ui-state-disabled')) {
  8574. var sr = $t.p.selrow;
  8575. if (sr) {
  8576. if($.isFunction( o.editfunc ) ) {
  8577. o.editfunc.call($t, sr);
  8578. } else {
  8579. $($t).jqGrid("editGridRow",sr,pEdit);
  8580. }
  8581. } else {
  8582. $.jgrid.viewModal("#"+alertIDs.themodal,{gbox:"#gbox_"+$.jgrid.jqID($t.p.id),jqm:true});
  8583. $("#jqg_alrt").focus();
  8584. }
  8585. }
  8586. return false;
  8587. }).hover(onHoverIn, onHoverOut);
  8588. tbd = null;
  8589. }
  8590. pView = pView || {};
  8591. if (o.view) {
  8592. tbd = $("<td class='ui-pg-button ui-corner-all'></td>");
  8593. $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.viewicon+"'></span>"+o.viewtext+"</div>");
  8594. $("tr",navtbl).append(tbd);
  8595. $(tbd,navtbl)
  8596. .attr({"title":o.viewtitle || "",id: pView.id || "view_"+elemids})
  8597. .click(function(){
  8598. if (!$(this).hasClass('ui-state-disabled')) {
  8599. var sr = $t.p.selrow;
  8600. if (sr) {
  8601. if($.isFunction( o.viewfunc ) ) {
  8602. o.viewfunc.call($t, sr);
  8603. } else {
  8604. $($t).jqGrid("viewGridRow",sr,pView);
  8605. }
  8606. } else {
  8607. $.jgrid.viewModal("#"+alertIDs.themodal,{gbox:"#gbox_"+$.jgrid.jqID($t.p.id),jqm:true});
  8608. $("#jqg_alrt").focus();
  8609. }
  8610. }
  8611. return false;
  8612. }).hover(onHoverIn, onHoverOut);
  8613. tbd = null;
  8614. }
  8615. pDel = pDel || {};
  8616. if (o.del) {
  8617. tbd = $("<td class='ui-pg-button ui-corner-all'></td>");
  8618. $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.delicon+"'></span>"+o.deltext+"</div>");
  8619. $("tr",navtbl).append(tbd);
  8620. $(tbd,navtbl)
  8621. .attr({"title":o.deltitle || "",id: pDel.id || "del_"+elemids})
  8622. .click(function(){
  8623. if (!$(this).hasClass('ui-state-disabled')) {
  8624. var dr;
  8625. if($t.p.multiselect) {
  8626. dr = $t.p.selarrrow;
  8627. if(dr.length===0) {dr = null;}
  8628. } else {
  8629. dr = $t.p.selrow;
  8630. }
  8631. if(dr){
  8632. if($.isFunction( o.delfunc )){
  8633. o.delfunc.call($t, dr);
  8634. }else{
  8635. $($t).jqGrid("delGridRow",dr,pDel);
  8636. }
  8637. } else {
  8638. $.jgrid.viewModal("#"+alertIDs.themodal,{gbox:"#gbox_"+$.jgrid.jqID($t.p.id),jqm:true});$("#jqg_alrt").focus();
  8639. }
  8640. }
  8641. return false;
  8642. }).hover(onHoverIn, onHoverOut);
  8643. tbd = null;
  8644. }
  8645. if(o.add || o.edit || o.del || o.view) {$("tr",navtbl).append(sep);}
  8646. pSearch = pSearch || {};
  8647. if (o.search) {
  8648. tbd = $("<td class='ui-pg-button ui-corner-all'></td>");
  8649. $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.searchicon+"'></span>"+o.searchtext+"</div>");
  8650. $("tr",navtbl).append(tbd);
  8651. $(tbd,navtbl)
  8652. .attr({"title":o.searchtitle || "",id:pSearch.id || "search_"+elemids})
  8653. .click(function(){
  8654. if (!$(this).hasClass('ui-state-disabled')) {
  8655. if($.isFunction( o.searchfunc )) {
  8656. o.searchfunc.call($t, pSearch);
  8657. } else {
  8658. $($t).jqGrid("searchGrid",pSearch);
  8659. }
  8660. }
  8661. return false;
  8662. }).hover(onHoverIn, onHoverOut);
  8663. if (pSearch.showOnLoad && pSearch.showOnLoad === true) {
  8664. $(tbd,navtbl).click();
  8665. }
  8666. tbd = null;
  8667. }
  8668. if (o.refresh) {
  8669. tbd = $("<td class='ui-pg-button ui-corner-all'></td>");
  8670. $(tbd).append("<div class='ui-pg-div'><span class='ui-icon "+o.refreshicon+"'></span>"+o.refreshtext+"</div>");
  8671. $("tr",navtbl).append(tbd);
  8672. $(tbd,navtbl)
  8673. .attr({"title":o.refreshtitle || "",id: "refresh_"+elemids})
  8674. .click(function(){
  8675. if (!$(this).hasClass('ui-state-disabled')) {
  8676. if($.isFunction(o.beforeRefresh)) {o.beforeRefresh.call($t);}
  8677. $t.p.search = false;
  8678. $t.p.resetsearch = true;
  8679. try {
  8680. if( o.refreshstate !== 'currentfilter') {
  8681. var gID = $t.p.id;
  8682. $t.p.postData.filters ="";
  8683. try {
  8684. $("#fbox_"+$.jgrid.jqID(gID)).jqFilter('resetFilter');
  8685. } catch(ef) {}
  8686. if($.isFunction($t.clearToolbar)) {$t.clearToolbar.call($t,false);}
  8687. }
  8688. } catch (e) {}
  8689. switch (o.refreshstate) {
  8690. case 'firstpage':
  8691. $($t).trigger("reloadGrid", [{page:1}]);
  8692. break;
  8693. case 'current':
  8694. case 'currentfilter':
  8695. $($t).trigger("reloadGrid", [{current:true}]);
  8696. break;
  8697. }
  8698. if($.isFunction(o.afterRefresh)) {o.afterRefresh.call($t);}
  8699. }
  8700. return false;
  8701. }).hover(onHoverIn, onHoverOut);
  8702. tbd = null;
  8703. }
  8704. tdw = $(".ui-jqgrid").css("font-size") || "11px";
  8705. $('body').append("<div id='testpg2' class='ui-jqgrid ui-widget ui-widget-content' style='font-size:"+tdw+";visibility:hidden;' ></div>");
  8706. twd = $(navtbl).clone().appendTo("#testpg2").width();
  8707. $("#testpg2").remove();
  8708. $(pgid+"_"+o.position,pgid).append(navtbl);
  8709. if($t.p._nvtd) {
  8710. if(twd > $t.p._nvtd[0] ) {
  8711. $(pgid+"_"+o.position,pgid).width(twd);
  8712. $t.p._nvtd[0] = twd;
  8713. }
  8714. $t.p._nvtd[1] = twd;
  8715. }
  8716. tdw =null;twd=null;navtbl =null;
  8717. $t.p.navGrid = true;
  8718. }
  8719. if($t.p.storeNavOptions) {
  8720. $t.p.navOptions = o;
  8721. $t.p.editOptions = pEdit;
  8722. $t.p.addOptions = pAdd;
  8723. $t.p.delOptions = pDel;
  8724. $t.p.searchOptions = pSearch;
  8725. $t.p.viewOptions = pView;
  8726. }
  8727. });
  8728. },
  8729. navButtonAdd : function (elem, p) {
  8730. p = $.extend({
  8731. caption : "newButton",
  8732. title: '',
  8733. buttonicon : 'ui-icon-newwin',
  8734. onClickButton: null,
  8735. position : "last",
  8736. cursor : 'pointer'
  8737. }, p ||{});
  8738. return this.each(function() {
  8739. if( !this.grid) {return;}
  8740. if( typeof elem === "string" && elem.indexOf("#") !== 0) {elem = "#"+$.jgrid.jqID(elem);}
  8741. var findnav = $(".navtable",elem)[0], $t = this;
  8742. if (findnav) {
  8743. if( p.id && $("#"+$.jgrid.jqID(p.id), findnav)[0] !== undefined ) {return;}
  8744. var tbd = $("<td></td>");
  8745. if(p.buttonicon.toString().toUpperCase() === "NONE") {
  8746. $(tbd).addClass('ui-pg-button ui-corner-all').append("<div class='ui-pg-div'>"+p.caption+"</div>");
  8747. } else {
  8748. $(tbd).addClass('ui-pg-button ui-corner-all').append("<div class='ui-pg-div'><span class='ui-icon "+p.buttonicon+"'></span>"+p.caption+"</div>");
  8749. }
  8750. if(p.id) {$(tbd).attr("id",p.id);}
  8751. if(p.position==='first'){
  8752. if(findnav.rows[0].cells.length ===0 ) {
  8753. $("tr",findnav).append(tbd);
  8754. } else {
  8755. $("tr td:eq(0)",findnav).before(tbd);
  8756. }
  8757. } else {
  8758. $("tr",findnav).append(tbd);
  8759. }
  8760. $(tbd,findnav)
  8761. .attr("title",p.title || "")
  8762. .click(function(e){
  8763. if (!$(this).hasClass('ui-state-disabled')) {
  8764. if ($.isFunction(p.onClickButton) ) {p.onClickButton.call($t,e);}
  8765. }
  8766. return false;
  8767. })
  8768. .hover(
  8769. function () {
  8770. if (!$(this).hasClass('ui-state-disabled')) {
  8771. $(this).addClass('ui-state-hover');
  8772. }
  8773. },
  8774. function () {$(this).removeClass("ui-state-hover");}
  8775. );
  8776. }
  8777. });
  8778. },
  8779. navSeparatorAdd:function (elem,p) {
  8780. p = $.extend({
  8781. sepclass : "ui-separator",
  8782. sepcontent: '',
  8783. position : "last"
  8784. }, p ||{});
  8785. return this.each(function() {
  8786. if( !this.grid) {return;}
  8787. if( typeof elem === "string" && elem.indexOf("#") !== 0) {elem = "#"+$.jgrid.jqID(elem);}
  8788. var findnav = $(".navtable",elem)[0];
  8789. if(findnav) {
  8790. var sep = "<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='"+p.sepclass+"'></span>"+p.sepcontent+"</td>";
  8791. if (p.position === 'first') {
  8792. if (findnav.rows[0].cells.length === 0) {
  8793. $("tr", findnav).append(sep);
  8794. } else {
  8795. $("tr td:eq(0)", findnav).before(sep);
  8796. }
  8797. } else {
  8798. $("tr", findnav).append(sep);
  8799. }
  8800. }
  8801. });
  8802. },
  8803. GridToForm : function( rowid, formid ) {
  8804. return this.each(function(){
  8805. var $t = this, i;
  8806. if (!$t.grid) {return;}
  8807. var rowdata = $($t).jqGrid("getRowData",rowid);
  8808. if (rowdata) {
  8809. for(i in rowdata) {
  8810. if(rowdata.hasOwnProperty(i)) {
  8811. if ( $("[name="+$.jgrid.jqID(i)+"]",formid).is("input:radio") || $("[name="+$.jgrid.jqID(i)+"]",formid).is("input:checkbox")) {
  8812. $("[name="+$.jgrid.jqID(i)+"]",formid).each( function() {
  8813. if( $(this).val() == rowdata[i] ) {
  8814. $(this)[$t.p.useProp ? 'prop': 'attr']("checked",true);
  8815. } else {
  8816. $(this)[$t.p.useProp ? 'prop': 'attr']("checked", false);
  8817. }
  8818. });
  8819. } else {
  8820. // this is very slow on big table and form.
  8821. $("[name="+$.jgrid.jqID(i)+"]",formid).val(rowdata[i]);
  8822. }
  8823. }
  8824. }
  8825. }
  8826. });
  8827. },
  8828. FormToGrid : function(rowid, formid, mode, position){
  8829. return this.each(function() {
  8830. var $t = this;
  8831. if(!$t.grid) {return;}
  8832. if(!mode) {mode = 'set';}
  8833. if(!position) {position = 'first';}
  8834. var fields = $(formid).serializeArray();
  8835. var griddata = {};
  8836. $.each(fields, function(i, field){
  8837. griddata[field.name] = field.value;
  8838. });
  8839. if(mode==='add') {$($t).jqGrid("addRowData",rowid,griddata, position);}
  8840. else if(mode==='set') {$($t).jqGrid("setRowData",rowid,griddata);}
  8841. });
  8842. }
  8843. });
  8844. //module begin
  8845. $.jgrid.extend({
  8846. groupingSetup : function () {
  8847. return this.each(function (){
  8848. var $t = this, i, j, cml, cm = $t.p.colModel, grp = $t.p.groupingView;
  8849. if(grp !== null && ( (typeof grp === 'object') || $.isFunction(grp) ) ) {
  8850. if(!grp.groupField.length) {
  8851. $t.p.grouping = false;
  8852. } else {
  8853. if (grp.visibiltyOnNextGrouping === undefined) {
  8854. grp.visibiltyOnNextGrouping = [];
  8855. }
  8856. grp.lastvalues=[];
  8857. if(!grp._locgr) {
  8858. grp.groups =[];
  8859. }
  8860. grp.counters =[];
  8861. for(i=0;i<grp.groupField.length;i++) {
  8862. if(!grp.groupOrder[i]) {
  8863. grp.groupOrder[i] = 'asc';
  8864. }
  8865. if(!grp.groupText[i]) {
  8866. grp.groupText[i] = '{0}';
  8867. }
  8868. if( typeof grp.groupColumnShow[i] !== 'boolean') {
  8869. grp.groupColumnShow[i] = true;
  8870. }
  8871. if( typeof grp.groupSummary[i] !== 'boolean') {
  8872. grp.groupSummary[i] = false;
  8873. }
  8874. if( !grp.groupSummaryPos[i]) {
  8875. grp.groupSummaryPos[i] = 'footer';
  8876. }
  8877. if(grp.groupColumnShow[i] === true) {
  8878. grp.visibiltyOnNextGrouping[i] = true;
  8879. $($t).jqGrid('showCol',grp.groupField[i]);
  8880. } else {
  8881. grp.visibiltyOnNextGrouping[i] = $("#"+$.jgrid.jqID($t.p.id+"_"+grp.groupField[i])).is(":visible");
  8882. $($t).jqGrid('hideCol',grp.groupField[i]);
  8883. }
  8884. }
  8885. grp.summary =[];
  8886. if(grp.hideFirstGroupCol) {
  8887. grp.formatDisplayField[0] = function (v) { return v;};
  8888. }
  8889. for(j=0, cml = cm.length; j < cml; j++) {
  8890. if(grp.hideFirstGroupCol) {
  8891. if(!cm[j].hidden && grp.groupField[0] === cm[j].name) {
  8892. cm[j].formatter = function(){return '';};
  8893. }
  8894. }
  8895. if(cm[j].summaryType ) {
  8896. if(cm[j].summaryDivider) {
  8897. grp.summary.push({nm:cm[j].name,st:cm[j].summaryType, v: '', sd:cm[j].summaryDivider, vd:'', sr: cm[j].summaryRound, srt: cm[j].summaryRoundType || 'round'});
  8898. } else {
  8899. grp.summary.push({nm:cm[j].name,st:cm[j].summaryType, v: '', sr: cm[j].summaryRound, srt: cm[j].summaryRoundType || 'round'});
  8900. }
  8901. }
  8902. }
  8903. }
  8904. } else {
  8905. $t.p.grouping = false;
  8906. }
  8907. });
  8908. },
  8909. groupingPrepare : function ( record, irow ) {
  8910. this.each(function(){
  8911. var grp = this.p.groupingView, $t= this, i,
  8912. sumGroups = function() {
  8913. if ($.isFunction(this.st)) {
  8914. this.v = this.st.call($t, this.v, this.nm, record);
  8915. } else {
  8916. this.v = $($t).jqGrid('groupingCalculations.handler',this.st, this.v, this.nm, this.sr, this.srt, record);
  8917. if(this.st.toLowerCase() === 'avg' && this.sd) {
  8918. this.vd = $($t).jqGrid('groupingCalculations.handler',this.st, this.vd, this.sd, this.sr, this.srt, record);
  8919. }
  8920. }
  8921. },
  8922. grlen = grp.groupField.length,
  8923. fieldName,
  8924. v,
  8925. displayName,
  8926. displayValue,
  8927. changed = 0;
  8928. for(i=0;i<grlen;i++) {
  8929. fieldName = grp.groupField[i];
  8930. displayName = grp.displayField[i];
  8931. v = record[fieldName];
  8932. displayValue = displayName == null ? null : record[displayName];
  8933. if( displayValue == null ) {
  8934. displayValue = v;
  8935. }
  8936. if( v !== undefined ) {
  8937. if(irow === 0 ) {
  8938. // First record always starts a new group
  8939. grp.groups.push({idx:i,dataIndex:fieldName,value:v, displayValue: displayValue, startRow: irow, cnt:1, summary : [] } );
  8940. grp.lastvalues[i] = v;
  8941. grp.counters[i] = {cnt:1, pos:grp.groups.length-1, summary: $.extend(true,[],grp.summary)};
  8942. $.each(grp.counters[i].summary, sumGroups);
  8943. grp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;
  8944. } else {
  8945. if (typeof v !== "object" && ($.isArray(grp.isInTheSameGroup) && $.isFunction(grp.isInTheSameGroup[i]) ? ! grp.isInTheSameGroup[i].call($t, grp.lastvalues[i], v, i, grp): grp.lastvalues[i] !== v)) {
  8946. // This record is not in same group as previous one
  8947. grp.groups.push({idx:i,dataIndex:fieldName,value:v, displayValue: displayValue, startRow: irow, cnt:1, summary : [] } );
  8948. grp.lastvalues[i] = v;
  8949. changed = 1;
  8950. grp.counters[i] = {cnt:1, pos:grp.groups.length-1, summary: $.extend(true,[],grp.summary)};
  8951. $.each(grp.counters[i].summary, sumGroups);
  8952. grp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;
  8953. } else {
  8954. if (changed === 1) {
  8955. // This group has changed because an earlier group changed.
  8956. grp.groups.push({idx:i,dataIndex:fieldName,value:v, displayValue: displayValue, startRow: irow, cnt:1, summary : [] } );
  8957. grp.lastvalues[i] = v;
  8958. grp.counters[i] = {cnt:1, pos:grp.groups.length-1, summary: $.extend(true,[],grp.summary)};
  8959. $.each(grp.counters[i].summary, sumGroups);
  8960. grp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;
  8961. } else {
  8962. grp.counters[i].cnt += 1;
  8963. grp.groups[grp.counters[i].pos].cnt = grp.counters[i].cnt;
  8964. $.each(grp.counters[i].summary, sumGroups);
  8965. grp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;
  8966. }
  8967. }
  8968. }
  8969. }
  8970. }
  8971. //gdata.push( rData );
  8972. });
  8973. return this;
  8974. },
  8975. groupingToggle : function(hid){
  8976. this.each(function(){
  8977. var $t = this,
  8978. grp = $t.p.groupingView,
  8979. strpos = hid.split('_'),
  8980. num = parseInt(strpos[strpos.length-2], 10);
  8981. strpos.splice(strpos.length-2,2);
  8982. var uid = strpos.join("_"),
  8983. minus = grp.minusicon,
  8984. plus = grp.plusicon,
  8985. tar = $("#"+$.jgrid.jqID(hid)),
  8986. r = tar.length ? tar[0].nextSibling : null,
  8987. tarspan = $("#"+$.jgrid.jqID(hid)+" span."+"tree-wrap-"+$t.p.direction),
  8988. getGroupingLevelFromClass = function (className) {
  8989. var nums = $.map(className.split(" "), function (item) {
  8990. if (item.substring(0, uid.length + 1) === uid + "_") {
  8991. return parseInt(item.substring(uid.length + 1), 10);
  8992. }
  8993. });
  8994. return nums.length > 0 ? nums[0] : undefined;
  8995. },
  8996. itemGroupingLevel,
  8997. showData,
  8998. collapsed = false,
  8999. skip = false,
  9000. frz = $t.p.frozenColumns ? $t.p.id+"_frozen" : false,
  9001. tar2 = frz ? $("#"+$.jgrid.jqID(hid), "#"+$.jgrid.jqID(frz) ) : false,
  9002. r2 = (tar2 && tar2.length) ? tar2[0].nextSibling : null;
  9003. if( tarspan.hasClass(minus) ) {
  9004. if(grp.showSummaryOnHide) {
  9005. if(r){
  9006. while(r) {
  9007. itemGroupingLevel = getGroupingLevelFromClass(r.className);
  9008. if (itemGroupingLevel !== undefined && itemGroupingLevel <= num) {
  9009. break;
  9010. }
  9011. $(r).hide();
  9012. r = r.nextSibling;
  9013. if(frz) {
  9014. $(r2).hide();
  9015. r2 = r2.nextSibling;
  9016. }
  9017. }
  9018. }
  9019. } else {
  9020. if(r){
  9021. while(r) {
  9022. itemGroupingLevel = getGroupingLevelFromClass(r.className);
  9023. if (itemGroupingLevel !== undefined && itemGroupingLevel <= num) {
  9024. break;
  9025. }
  9026. $(r).hide();
  9027. r = r.nextSibling;
  9028. if(frz) {
  9029. $(r2).hide();
  9030. r2 = r2.nextSibling;
  9031. }
  9032. }
  9033. }
  9034. }
  9035. tarspan.removeClass(minus).addClass(plus);
  9036. collapsed = true;
  9037. } else {
  9038. if(r){
  9039. showData = undefined;
  9040. while(r) {
  9041. itemGroupingLevel = getGroupingLevelFromClass(r.className);
  9042. if (showData === undefined) {
  9043. showData = itemGroupingLevel === undefined; // if the first row after the opening group is data row then show the data rows
  9044. }
  9045. skip = $(r).hasClass("ui-subgrid") && $(r).hasClass("ui-sg-collapsed");
  9046. if (itemGroupingLevel !== undefined) {
  9047. if (itemGroupingLevel <= num) {
  9048. break;// next item of the same lever are found
  9049. }
  9050. if (itemGroupingLevel === num + 1) {
  9051. if(!skip) {
  9052. $(r).show().find(">td>span."+"tree-wrap-"+$t.p.direction).removeClass(minus).addClass(plus);
  9053. if(frz) {
  9054. $(r2).show().find(">td>span."+"tree-wrap-"+$t.p.direction).removeClass(minus).addClass(plus);
  9055. }
  9056. }
  9057. }
  9058. } else if (showData) {
  9059. if(!skip) {
  9060. $(r).show();
  9061. if(frz) {
  9062. $(r2).show();
  9063. }
  9064. }
  9065. }
  9066. r = r.nextSibling;
  9067. if(frz) {
  9068. r2 = r2.nextSibling;
  9069. }
  9070. }
  9071. }
  9072. tarspan.removeClass(plus).addClass(minus);
  9073. }
  9074. $($t).triggerHandler("jqGridGroupingClickGroup", [hid , collapsed]);
  9075. if( $.isFunction($t.p.onClickGroup)) { $t.p.onClickGroup.call($t, hid , collapsed); }
  9076. });
  9077. return false;
  9078. },
  9079. groupingRender : function (grdata, colspans, page, rn ) {
  9080. return this.each(function(){
  9081. var $t = this,
  9082. grp = $t.p.groupingView,
  9083. str = "", icon = "", hid, clid, pmrtl = grp.groupCollapse ? grp.plusicon : grp.minusicon, gv, cp=[], len =grp.groupField.length;
  9084. pmrtl += " tree-wrap-"+$t.p.direction;
  9085. $.each($t.p.colModel, function (i,n){
  9086. var ii;
  9087. for(ii=0;ii<len;ii++) {
  9088. if(grp.groupField[ii] === n.name ) {
  9089. cp[ii] = i;
  9090. break;
  9091. }
  9092. }
  9093. });
  9094. var toEnd = 0;
  9095. function findGroupIdx( ind , offset, grp) {
  9096. var ret = false, i;
  9097. if(offset===0) {
  9098. ret = grp[ind];
  9099. } else {
  9100. var id = grp[ind].idx;
  9101. if(id===0) {
  9102. ret = grp[ind];
  9103. } else {
  9104. for(i=ind;i >= 0; i--) {
  9105. if(grp[i].idx === id-offset) {
  9106. ret = grp[i];
  9107. break;
  9108. }
  9109. }
  9110. }
  9111. }
  9112. return ret;
  9113. }
  9114. function buildSummaryTd(i, ik, grp, foffset) {
  9115. var fdata = findGroupIdx(i, ik, grp),
  9116. cm = $t.p.colModel,
  9117. vv, grlen = fdata.cnt, str="", k;
  9118. for(k=foffset; k<colspans;k++) {
  9119. var tmpdata = "<td "+$t.formatCol(k,1,'')+">&#160;</td>",
  9120. tplfld = "{0}";
  9121. $.each(fdata.summary,function(){
  9122. if(this.nm === cm[k].name) {
  9123. if(cm[k].summaryTpl) {
  9124. tplfld = cm[k].summaryTpl;
  9125. }
  9126. if(typeof this.st === 'string' && this.st.toLowerCase() === 'avg') {
  9127. if(this.sd && this.vd) {
  9128. this.v = (this.v/this.vd);
  9129. } else if(this.v && grlen > 0) {
  9130. this.v = (this.v/grlen);
  9131. }
  9132. }
  9133. try {
  9134. this.groupCount = fdata.cnt;
  9135. this.groupIndex = fdata.dataIndex;
  9136. this.groupValue = fdata.value;
  9137. vv = $t.formatter('', this.v, k, this);
  9138. } catch (ef) {
  9139. vv = this.v;
  9140. }
  9141. tmpdata= "<td "+$t.formatCol(k,1,'')+">"+$.jgrid.template(tplfld,vv)+ "</td>";
  9142. return false;
  9143. }
  9144. });
  9145. str += tmpdata;
  9146. }
  9147. return str;
  9148. }
  9149. var sumreverse = $.makeArray(grp.groupSummary), mul;
  9150. sumreverse.reverse();
  9151. mul = $t.p.multiselect ? " colspan=\"2\"" : "";
  9152. $.each(grp.groups,function(i,n){
  9153. if(grp._locgr) {
  9154. if( !(n.startRow +n.cnt > (page-1)*rn && n.startRow < page*rn)) {
  9155. return true;
  9156. }
  9157. }
  9158. toEnd++;
  9159. clid = $t.p.id+"ghead_"+n.idx;
  9160. hid = clid+"_"+i;
  9161. icon = "<span style='cursor:pointer;' class='ui-icon "+pmrtl+"' onclick=\"jQuery('#"+$.jgrid.jqID($t.p.id)+"').jqGrid('groupingToggle','"+hid+"');return false;\"></span>";
  9162. try {
  9163. if ($.isArray(grp.formatDisplayField) && $.isFunction(grp.formatDisplayField[n.idx])) {
  9164. n.displayValue = grp.formatDisplayField[n.idx].call($t, n.displayValue, n.value, $t.p.colModel[cp[n.idx]], n.idx, grp);
  9165. gv = n.displayValue;
  9166. } else {
  9167. gv = $t.formatter(hid, n.displayValue, cp[n.idx], n.value );
  9168. }
  9169. } catch (egv) {
  9170. gv = n.displayValue;
  9171. }
  9172. var grpTextStr = '';
  9173. if($.isFunction(grp.groupText[n.idx])) {
  9174. grpTextStr = grp.groupText[n.idx].call($t, gv, n.cnt, n.summary);
  9175. } else {
  9176. grpTextStr = $.jgrid.template(grp.groupText[n.idx], gv, n.cnt, n.summary);
  9177. }
  9178. if( !(typeof grpTextStr ==='string' || typeof grpTextStr ==='number' ) ) {
  9179. grpTextStr = gv;
  9180. }
  9181. if(grp.groupSummaryPos[n.idx] === 'header') {
  9182. str += "<tr id=\""+hid+"\"" +(grp.groupCollapse && n.idx>0 ? " style=\"display:none;\" " : " ") + "role=\"row\" class= \"ui-widget-content jqgroup ui-row-"+$t.p.direction+" "+clid+"\"><td style=\"padding-left:"+(n.idx * 12) + "px;"+"\"" + mul +">" + icon+grpTextStr + "</td>";
  9183. str += buildSummaryTd(i, 0, grp.groups, grp.groupColumnShow[n.idx] === false ? (mul ==="" ? 2 : 3) : ((mul ==="") ? 1 : 2) );
  9184. str += "</tr>";
  9185. } else {
  9186. str += "<tr id=\""+hid+"\"" +(grp.groupCollapse && n.idx>0 ? " style=\"display:none;\" " : " ") + "role=\"row\" class= \"ui-widget-content jqgroup ui-row-"+$t.p.direction+" "+clid+"\"><td style=\"padding-left:"+(n.idx * 12) + "px;"+"\" colspan=\""+(grp.groupColumnShow[n.idx] === false ? colspans-1 : colspans)+"\">" + icon + grpTextStr + "</td></tr>";
  9187. }
  9188. var leaf = len-1 === n.idx;
  9189. if( leaf ) {
  9190. var gg = grp.groups[i+1], kk, ik, offset = 0, sgr = n.startRow,
  9191. end = gg !== undefined ? gg.startRow : grp.groups[i].startRow + grp.groups[i].cnt;
  9192. if(grp._locgr) {
  9193. offset = (page-1)*rn;
  9194. if(offset > n.startRow) {
  9195. sgr = offset;
  9196. }
  9197. }
  9198. for(kk=sgr;kk<end;kk++) {
  9199. if(!grdata[kk - offset]) { break; }
  9200. str += grdata[kk - offset].join('');
  9201. }
  9202. if(grp.groupSummaryPos[n.idx] !== 'header') {
  9203. var jj;
  9204. if (gg !== undefined) {
  9205. for (jj = 0; jj < grp.groupField.length; jj++) {
  9206. if (gg.dataIndex === grp.groupField[jj]) {
  9207. break;
  9208. }
  9209. }
  9210. toEnd = grp.groupField.length - jj;
  9211. }
  9212. for (ik = 0; ik < toEnd; ik++) {
  9213. if(!sumreverse[ik]) { continue; }
  9214. var hhdr = "";
  9215. if(grp.groupCollapse && !grp.showSummaryOnHide) {
  9216. hhdr = " style=\"display:none;\"";
  9217. }
  9218. str += "<tr"+hhdr+" jqfootlevel=\""+(n.idx-ik)+"\" role=\"row\" class=\"ui-widget-content jqfoot ui-row-"+$t.p.direction+"\">";
  9219. str += buildSummaryTd(i, ik, grp.groups, 0);
  9220. str += "</tr>";
  9221. }
  9222. toEnd = jj;
  9223. }
  9224. }
  9225. });
  9226. $("#"+$.jgrid.jqID($t.p.id)+" tbody:first").append(str);
  9227. // free up memory
  9228. str = null;
  9229. });
  9230. },
  9231. groupingGroupBy : function (name, options ) {
  9232. return this.each(function(){
  9233. var $t = this;
  9234. if(typeof name === "string") {
  9235. name = [name];
  9236. }
  9237. var grp = $t.p.groupingView;
  9238. $t.p.grouping = true;
  9239. grp._locgr = false;
  9240. //Set default, in case visibilityOnNextGrouping is undefined
  9241. if (grp.visibiltyOnNextGrouping === undefined) {
  9242. grp.visibiltyOnNextGrouping = [];
  9243. }
  9244. var i;
  9245. // show previous hidden groups if they are hidden and weren't removed yet
  9246. for(i=0;i<grp.groupField.length;i++) {
  9247. if(!grp.groupColumnShow[i] && grp.visibiltyOnNextGrouping[i]) {
  9248. $($t).jqGrid('showCol',grp.groupField[i]);
  9249. }
  9250. }
  9251. // set visibility status of current group columns on next grouping
  9252. for(i=0;i<name.length;i++) {
  9253. grp.visibiltyOnNextGrouping[i] = $("#"+$.jgrid.jqID($t.p.id)+"_"+$.jgrid.jqID(name[i])).is(":visible");
  9254. }
  9255. $t.p.groupingView = $.extend($t.p.groupingView, options || {});
  9256. grp.groupField = name;
  9257. $($t).trigger("reloadGrid");
  9258. });
  9259. },
  9260. groupingRemove : function (current) {
  9261. return this.each(function(){
  9262. var $t = this;
  9263. if(current === undefined) {
  9264. current = true;
  9265. }
  9266. $t.p.grouping = false;
  9267. if(current===true) {
  9268. var grp = $t.p.groupingView, i;
  9269. // show previous hidden groups if they are hidden and weren't removed yet
  9270. for(i=0;i<grp.groupField.length;i++) {
  9271. if (!grp.groupColumnShow[i] && grp.visibiltyOnNextGrouping[i]) {
  9272. $($t).jqGrid('showCol', grp.groupField);
  9273. }
  9274. }
  9275. $("tr.jqgroup, tr.jqfoot","#"+$.jgrid.jqID($t.p.id)+" tbody:first").remove();
  9276. $("tr.jqgrow:hidden","#"+$.jgrid.jqID($t.p.id)+" tbody:first").show();
  9277. } else {
  9278. $($t).trigger("reloadGrid");
  9279. }
  9280. });
  9281. },
  9282. groupingCalculations : {
  9283. handler: function(fn, v, field, round, roundType, rc) {
  9284. var funcs = {
  9285. sum: function() {
  9286. return parseFloat(v||0) + parseFloat((rc[field]||0));
  9287. },
  9288. min: function() {
  9289. if(v==="") {
  9290. return parseFloat(rc[field]||0);
  9291. }
  9292. return Math.min(parseFloat(v),parseFloat(rc[field]||0));
  9293. },
  9294. max: function() {
  9295. if(v==="") {
  9296. return parseFloat(rc[field]||0);
  9297. }
  9298. return Math.max(parseFloat(v),parseFloat(rc[field]||0));
  9299. },
  9300. count: function() {
  9301. if(v==="") {v=0;}
  9302. if(rc.hasOwnProperty(field)) {
  9303. return v+1;
  9304. }
  9305. return 0;
  9306. },
  9307. avg: function() {
  9308. // the same as sum, but at end we divide it
  9309. // so use sum instead of duplicating the code (?)
  9310. return funcs.sum();
  9311. }
  9312. };
  9313. if(!funcs[fn]) {
  9314. throw ("jqGrid Grouping No such method: " + fn);
  9315. }
  9316. var res = funcs[fn]();
  9317. if (round != null) {
  9318. if (roundType === 'fixed') {
  9319. res = res.toFixed(round);
  9320. } else {
  9321. var mul = Math.pow(10, round);
  9322. res = Math.round(res * mul) / mul;
  9323. }
  9324. }
  9325. return res;
  9326. }
  9327. },
  9328. setGroupHeaders : function ( o ) {
  9329. o = $.extend({
  9330. useColSpanStyle : false,
  9331. groupHeaders: []
  9332. },o || {});
  9333. return this.each(function(){
  9334. this.p.groupHeader = o;
  9335. var ts = this,
  9336. i, cmi, skip = 0, $tr, $colHeader, th, $th, thStyle,
  9337. iCol,
  9338. cghi,
  9339. //startColumnName,
  9340. numberOfColumns,
  9341. titleText,
  9342. cVisibleColumns,
  9343. colModel = ts.p.colModel,
  9344. cml = colModel.length,
  9345. ths = ts.grid.headers,
  9346. $htable = $("table.ui-jqgrid-htable", ts.grid.hDiv),
  9347. $trLabels = $htable.children("thead").children("tr.ui-jqgrid-labels:last").addClass("jqg-second-row-header"),
  9348. $thead = $htable.children("thead"),
  9349. $theadInTable,
  9350. $firstHeaderRow = $htable.find(".jqg-first-row-header");
  9351. if($firstHeaderRow[0] === undefined) {
  9352. $firstHeaderRow = $('<tr>', {role: "row", "aria-hidden": "true"}).addClass("jqg-first-row-header").css("height", "auto");
  9353. } else {
  9354. $firstHeaderRow.empty();
  9355. }
  9356. var $firstRow,
  9357. inColumnHeader = function (text, columnHeaders) {
  9358. var length = columnHeaders.length, i;
  9359. for (i = 0; i < length; i++) {
  9360. if (columnHeaders[i].startColumnName === text) {
  9361. return i;
  9362. }
  9363. }
  9364. return -1;
  9365. };
  9366. $(ts).prepend($thead);
  9367. $tr = $('<tr>', {role: "row"}).addClass("ui-jqgrid-labels jqg-third-row-header");
  9368. for (i = 0; i < cml; i++) {
  9369. th = ths[i].el;
  9370. $th = $(th);
  9371. cmi = colModel[i];
  9372. // build the next cell for the first header row
  9373. thStyle = { height: '0px', width: ths[i].width + 'px', display: (cmi.hidden ? 'none' : '')};
  9374. $("<th>", {role: 'gridcell'}).css(thStyle).addClass("ui-first-th-"+ts.p.direction).appendTo($firstHeaderRow);
  9375. th.style.width = ""; // remove unneeded style
  9376. iCol = inColumnHeader(cmi.name, o.groupHeaders);
  9377. if (iCol >= 0) {
  9378. cghi = o.groupHeaders[iCol];
  9379. numberOfColumns = cghi.numberOfColumns;
  9380. titleText = cghi.titleText;
  9381. // caclulate the number of visible columns from the next numberOfColumns columns
  9382. for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
  9383. if (!colModel[i + iCol].hidden) {
  9384. cVisibleColumns++;
  9385. }
  9386. }
  9387. // The next numberOfColumns headers will be moved in the next row
  9388. // in the current row will be placed the new column header with the titleText.
  9389. // The text will be over the cVisibleColumns columns
  9390. $colHeader = $('<th>').attr({role: "columnheader"})
  9391. .addClass("ui-state-default ui-th-column-header ui-th-"+ts.p.direction)
  9392. //.css({'height':'22px', 'border-top': '0 none'})
  9393. .html(titleText);
  9394. if(cVisibleColumns > 0) {
  9395. $colHeader.attr("colspan", String(cVisibleColumns));
  9396. }
  9397. if (ts.p.headertitles) {
  9398. $colHeader.attr("title", $colHeader.text());
  9399. }
  9400. // hide if not a visible cols
  9401. if( cVisibleColumns === 0) {
  9402. $colHeader.hide();
  9403. }
  9404. $th.before($colHeader); // insert new column header before the current
  9405. $tr.append(th); // move the current header in the next row
  9406. // set the coumter of headers which will be moved in the next row
  9407. skip = numberOfColumns - 1;
  9408. } else {
  9409. if (skip === 0) {
  9410. if (o.useColSpanStyle) {
  9411. // expand the header height to two rows
  9412. $th.attr("rowspan", "2");
  9413. } else {
  9414. $('<th>', {role: "columnheader"})
  9415. .addClass("ui-state-default ui-th-column-header ui-th-"+ts.p.direction)
  9416. .css({"display": cmi.hidden ? 'none' : ''})
  9417. .insertBefore($th);
  9418. $tr.append(th);
  9419. }
  9420. } else {
  9421. // move the header to the next row
  9422. //$th.css({"padding-top": "2px", height: "19px"});
  9423. $tr.append(th);
  9424. skip--;
  9425. }
  9426. }
  9427. }
  9428. $theadInTable = $(ts).children("thead");
  9429. $theadInTable.prepend($firstHeaderRow);
  9430. $tr.insertAfter($trLabels);
  9431. $htable.append($theadInTable);
  9432. if (o.useColSpanStyle) {
  9433. // Increase the height of resizing span of visible headers
  9434. $htable.find("span.ui-jqgrid-resize").each(function () {
  9435. var $parent = $(this).parent();
  9436. if ($parent.is(":visible")) {
  9437. this.style.cssText = 'height: ' + $parent.height() + 'px !important; cursor: col-resize;';
  9438. }
  9439. });
  9440. // Set position of the sortable div (the main lable)
  9441. // with the column header text to the middle of the cell.
  9442. // One should not do this for hidden headers.
  9443. $htable.find("div.ui-jqgrid-sortable").each(function () {
  9444. var $ts = $(this), $parent = $ts.parent();
  9445. if ($parent.is(":visible") && $parent.is(":has(span.ui-jqgrid-resize)")) {
  9446. // minus 4px from the margins of the resize markers
  9447. $ts.css('top', ($parent.height() - $ts.outerHeight()) / 2 - 4 + 'px');
  9448. }
  9449. });
  9450. }
  9451. $firstRow = $theadInTable.find("tr.jqg-first-row-header");
  9452. $(ts).bind('jqGridResizeStop.setGroupHeaders', function (e, nw, idx) {
  9453. $firstRow.find('th').eq(idx).width(nw);
  9454. });
  9455. });
  9456. },
  9457. destroyGroupHeader : function(nullHeader) {
  9458. if(nullHeader === undefined) {
  9459. nullHeader = true;
  9460. }
  9461. return this.each(function()
  9462. {
  9463. var $t = this, $tr, i, l, headers, $th, $resizing, grid = $t.grid,
  9464. thead = $("table.ui-jqgrid-htable thead", grid.hDiv), cm = $t.p.colModel, hc;
  9465. if(!grid) { return; }
  9466. $(this).unbind('.setGroupHeaders');
  9467. $tr = $("<tr>", {role: "row"}).addClass("ui-jqgrid-labels");
  9468. headers = grid.headers;
  9469. for (i = 0, l = headers.length; i < l; i++) {
  9470. hc = cm[i].hidden ? "none" : "";
  9471. $th = $(headers[i].el)
  9472. .width(headers[i].width)
  9473. .css('display',hc);
  9474. try {
  9475. $th.removeAttr("rowSpan");
  9476. } catch (rs) {
  9477. //IE 6/7
  9478. $th.attr("rowSpan",1);
  9479. }
  9480. $tr.append($th);
  9481. $resizing = $th.children("span.ui-jqgrid-resize");
  9482. if ($resizing.length>0) {// resizable column
  9483. $resizing[0].style.height = "";
  9484. }
  9485. $th.children("div")[0].style.top = "";
  9486. }
  9487. $(thead).children('tr.ui-jqgrid-labels').remove();
  9488. $(thead).prepend($tr);
  9489. if(nullHeader === true) {
  9490. $($t).jqGrid('setGridParam',{ 'groupHeader': null});
  9491. }
  9492. });
  9493. }
  9494. });
  9495. //module begin
  9496. $.jgrid = $.jgrid || {};
  9497. $.extend($.jgrid,{
  9498. saveState : function ( jqGridId, o ) {
  9499. o = $.extend({
  9500. useStorage : true,
  9501. storageType : "localStorage", // localStorage or sessionStorage
  9502. beforeSetItem : null,
  9503. compression: false,
  9504. compressionModule : 'LZString', // object by example gzip, LZString
  9505. compressionMethod : 'compressToUTF16' // string by example zip, compressToUTF16
  9506. }, o || {});
  9507. if(!jqGridId) { return; }
  9508. var gridstate = "", data = "", ret, $t = $("#"+jqGridId)[0], tmp;
  9509. // to use navigator set storeNavOptions to true in grid options
  9510. if(!$t.grid) { return;}
  9511. tmp = $($t).data('inlineNav');
  9512. if(tmp && $t.p.inlineNav) {
  9513. $($t).jqGrid('setGridParam',{_iN: tmp});
  9514. }
  9515. tmp = $($t).data('filterToolbar');
  9516. if(tmp && $t.p.filterToolbar) {
  9517. $($t).jqGrid('setGridParam',{_fT: tmp});
  9518. }
  9519. gridstate = $($t).jqGrid('jqGridExport', { exptype : "jsonstring", ident:"", root:"" });
  9520. $($t.grid.bDiv).find(".ui-jqgrid-btable tr:gt(0)").each(function(i,d){
  9521. data += d.outerHTML;
  9522. });
  9523. if($.isFunction(o.beforeSetItem)) {
  9524. ret = o.beforeSetItem.call($t, gridstate);
  9525. if(ret != null) {
  9526. gridstate = ret;
  9527. }
  9528. }
  9529. if(o.compression) {
  9530. if(o.compressionModule) {
  9531. try {
  9532. ret = window[o.compressionModule][o.compressionMethod](gridstate);
  9533. if(ret != null) {
  9534. gridstate = ret;
  9535. data = window[o.compressionModule][o.compressionMethod](data);
  9536. }
  9537. } catch (e) {
  9538. // can not execute a compression.
  9539. }
  9540. }
  9541. }
  9542. if(o.useStorage && $.jgrid.isLocalStorage()) {
  9543. try {
  9544. window[o.storageType].setItem("jqGrid"+$t.p.id, gridstate);
  9545. window[o.storageType].setItem("jqGrid"+$t.p.id+"_data", data);
  9546. } catch (e) {
  9547. if(e.code === 22) { // chrome is 21
  9548. // just for now. we should make some additionla changes and eventually clear some local items
  9549. alert("Local storage limit is over!");
  9550. }
  9551. }
  9552. }
  9553. return gridstate;
  9554. },
  9555. loadState : function (jqGridId, gridstring, o) {
  9556. o = $.extend({
  9557. useStorage : true,
  9558. storageType : "localStorage",
  9559. clearAfterLoad: false, // clears the jqGrid localStorage items aftre load
  9560. beforeSetGrid : null,
  9561. decompression: false,
  9562. decompressionModule : 'LZString', // object by example gzip, LZString
  9563. decompressionMethod : 'decompressFromUTF16' // string by example unzip, decompressFromUTF16
  9564. }, o || {});
  9565. if(!jqGridId) { return; }
  9566. var ret, tmp, $t = $("#"+jqGridId)[0], data, iN, fT;
  9567. if($t.grid) {
  9568. $.jgrid.gridUnload( jqGridId );
  9569. }
  9570. if(o.useStorage) {
  9571. try {
  9572. gridstring = window[o.storageType].getItem("jqGrid"+$t.id);
  9573. data = window[o.storageType].getItem("jqGrid"+$t.id+"_data");
  9574. } catch (e) {
  9575. // can not get data
  9576. }
  9577. }
  9578. if(!gridstring) { return; }
  9579. if(o.decompression) {
  9580. if(o.decompressionModule) {
  9581. try {
  9582. ret = window[o.decompressionModule][o.decompressionMethod]( gridstring );
  9583. if(ret != null ) {
  9584. gridstring = ret;
  9585. data = window[o.decompressionModule][o.decompressionMethod]( data );
  9586. }
  9587. } catch (e) {
  9588. // decompression can not be done
  9589. }
  9590. }
  9591. }
  9592. ret = jqGridUtils.parse( gridstring );
  9593. if( ret && $.type(ret) === 'object') {
  9594. if($.isFunction(o.beforeSetGrid)) {
  9595. tmp = o.beforeSetGrid( ret );
  9596. if(tmp && $.type(tmp) === 'object') {
  9597. ret = tmp;
  9598. }
  9599. }
  9600. // some preparings
  9601. var retfunc = function( param ) { var p; p = param; return p;},
  9602. prm = {
  9603. "reccount" : ret.reccount,
  9604. "records" : ret.records,
  9605. "lastpage" : ret.lastpage,
  9606. "shrinkToFit" : retfunc( ret.shrinkToFit),
  9607. "data": retfunc(ret.data),
  9608. "datatype" : retfunc(ret.datatype),
  9609. "grouping" : retfunc(ret.grouping)
  9610. };
  9611. ret.shrinkToFit = false;
  9612. ret.data = [];
  9613. ret.datatype = 'local';
  9614. ret.grouping = false;
  9615. ret.navGrid = false;
  9616. if(ret.inlineNav) {
  9617. iN = retfunc( ret._iN );
  9618. ret._iN = null; delete ret._iN;
  9619. }
  9620. if(ret.filterToolbar) {
  9621. fT = retfunc( ret._fT );
  9622. ret._fT = null; delete ret._fT;
  9623. }
  9624. var grid = $("#"+jqGridId).jqGrid( ret );
  9625. grid.append( data );
  9626. grid.jqGrid( 'setGridParam', prm);
  9627. if(ret.storeNavOptions) {
  9628. grid.jqGrid('navGrid', ret.pager, ret.navOptions, ret.editOptions, ret.addOptions, ret.delOptions, ret.searchOptions, ret.viewOptions);
  9629. }
  9630. if(ret.inlineNav && iN) {
  9631. grid.jqGrid('setGridParam', { inlineNav:false });
  9632. grid.jqGrid('inlineNav', ret.pager, iN);
  9633. }
  9634. if(ret.filterToolbar && fT) {
  9635. grid.jqGrid('setGridParam', { filterToolbar:false });
  9636. grid.jqGrid('filterToolbar', fT);
  9637. }
  9638. grid[0].updatepager(true, true);
  9639. if(o.clearAfterLoad) {
  9640. window[o.storageType].removeItem("jqGrid"+$t.id);
  9641. window[o.storageType].removeItem("jqGrid"+$t.id + "_data");
  9642. }
  9643. } else {
  9644. alert("can not convert to object");
  9645. }
  9646. },
  9647. setRegional : function( jqGridId , options) {
  9648. $.jgrid.saveState( jqGridId, {
  9649. storageType: "sessionStorage"
  9650. });
  9651. $.jgrid.loadState( jqGridId, null, {
  9652. storageType: "sessionStorage",
  9653. beforeSetGrid: function(params) {
  9654. params.regional = options.regional;
  9655. params.force_regional = true;
  9656. return params;
  9657. }
  9658. });
  9659. // check for formatter actions
  9660. var grid = $("#"+jqGridId)[0],
  9661. model = $(grid).jqGrid('getGridParam','colModel'), i=-1, nav = $.jgrid.getRegional(grid, 'nav');
  9662. $.each(model,function(k){
  9663. if(this.formatter && this.formatter === 'actions') {
  9664. i = k;
  9665. return false;
  9666. }
  9667. });
  9668. if(i !== -1 && nav) {
  9669. $("#"+jqGridId + " tbody tr").each(function(){
  9670. var td = this.cells[i];
  9671. $(td).find(".ui-inline-edit").attr("title",nav.edittitle);
  9672. $(td).find(".ui-inline-del").attr("title",nav.deltitle);
  9673. $(td).find(".ui-inline-save").attr("title",nav.savetitle);
  9674. $(td).find(".ui-inline-cancel").attr("title",nav.canceltitle);
  9675. });
  9676. }
  9677. try {
  9678. window['sessionStorage'].removeItem("jqGrid"+grid.id);
  9679. window['sessionStorage'].removeItem("jqGrid"+grid.id+"_data");
  9680. } catch (e) {}
  9681. },
  9682. jqGridImport : function(jqGridId, o) {
  9683. o = $.extend({
  9684. imptype : "xml", // xml, json, xmlstring, jsonstring
  9685. impstring: "",
  9686. impurl: "",
  9687. mtype: "GET",
  9688. impData : {},
  9689. xmlGrid :{
  9690. config : "root>grid",
  9691. data: "root>rows"
  9692. },
  9693. jsonGrid :{
  9694. config : "grid",
  9695. data: "data"
  9696. },
  9697. ajaxOptions :{}
  9698. }, o || {});
  9699. var $t = (jqGridId.indexOf("#") === 0 ? "": "#") + $.jgrid.jqID(jqGridId);
  9700. var xmlConvert = function (xml,o) {
  9701. var cnfg = $(o.xmlGrid.config,xml)[0];
  9702. var xmldata = $(o.xmlGrid.data,xml)[0], jstr, jstr1, key;
  9703. if(jqGridUtils.xmlToJSON ) {
  9704. jstr = jqGridUtils.xmlToJSON( cnfg );
  9705. //jstr = $.jgrid.parse(jstr);
  9706. for(key in jstr) {
  9707. if(jstr.hasOwnProperty(key)) {
  9708. jstr1=jstr[key];
  9709. }
  9710. }
  9711. if(xmldata) {
  9712. // save the datatype
  9713. var svdatatype = jstr.grid.datatype;
  9714. jstr.grid.datatype = 'xmlstring';
  9715. jstr.grid.datastr = xml;
  9716. $($t).jqGrid( jstr1 ).jqGrid("setGridParam",{datatype:svdatatype});
  9717. } else {
  9718. setTimeout(function() { $($t).jqGrid( jstr1 ); },0);
  9719. }
  9720. } else {
  9721. alert("xml2json or parse are not present");
  9722. }
  9723. };
  9724. var jsonConvert = function (jsonstr,o){
  9725. if (jsonstr && typeof jsonstr === 'string') {
  9726. var json = jqGridUtils.parse(jsonstr);
  9727. var gprm = json[o.jsonGrid.config];
  9728. var jdata = json[o.jsonGrid.data];
  9729. if(jdata) {
  9730. var svdatatype = gprm.datatype;
  9731. gprm.datatype = 'jsonstring';
  9732. gprm.datastr = jdata;
  9733. $($t).jqGrid( gprm ).jqGrid("setGridParam",{datatype:svdatatype});
  9734. } else {
  9735. $($t).jqGrid( gprm );
  9736. }
  9737. }
  9738. };
  9739. switch (o.imptype){
  9740. case 'xml':
  9741. $.ajax($.extend({
  9742. url:o.impurl,
  9743. type:o.mtype,
  9744. data: o.impData,
  9745. dataType:"xml",
  9746. complete: function(xml,stat) {
  9747. if(stat === 'success') {
  9748. xmlConvert(xml.responseXML,o);
  9749. $($t).triggerHandler("jqGridImportComplete", [xml, o]);
  9750. if($.isFunction(o.importComplete)) {
  9751. o.importComplete(xml);
  9752. }
  9753. }
  9754. xml=null;
  9755. }
  9756. }, o.ajaxOptions));
  9757. break;
  9758. case 'xmlstring' :
  9759. // we need to make just the conversion and use the same code as xml
  9760. if(o.impstring && typeof o.impstring === 'string') {
  9761. var xmld = $.parseXML(o.impstring);
  9762. if(xmld) {
  9763. xmlConvert(xmld,o);
  9764. $($t).triggerHandler("jqGridImportComplete", [xmld, o]);
  9765. if($.isFunction(o.importComplete)) {
  9766. o.importComplete(xmld);
  9767. }
  9768. }
  9769. }
  9770. break;
  9771. case 'json':
  9772. $.ajax($.extend({
  9773. url:o.impurl,
  9774. type:o.mtype,
  9775. data: o.impData,
  9776. dataType:"json",
  9777. complete: function(json) {
  9778. try {
  9779. jsonConvert(json.responseText,o );
  9780. $($t).triggerHandler("jqGridImportComplete", [json, o]);
  9781. if($.isFunction(o.importComplete)) {
  9782. o.importComplete(json);
  9783. }
  9784. } catch (ee){}
  9785. json=null;
  9786. }
  9787. }, o.ajaxOptions ));
  9788. break;
  9789. case 'jsonstring' :
  9790. if(o.impstring && typeof o.impstring === 'string') {
  9791. jsonConvert(o.impstring,o );
  9792. $($t).triggerHandler("jqGridImportComplete", [o.impstring, o]);
  9793. if($.isFunction(o.importComplete)) {
  9794. o.importComplete(o.impstring);
  9795. }
  9796. }
  9797. break;
  9798. }
  9799. }
  9800. });
  9801. $.jgrid.extend({
  9802. jqGridExport : function(o) {
  9803. o = $.extend({
  9804. exptype : "xmlstring",
  9805. root: "grid",
  9806. ident: "\t",
  9807. addOptions : {}
  9808. }, o || {});
  9809. var ret = null;
  9810. this.each(function () {
  9811. if(!this.grid) { return;}
  9812. var key, gprm = $.extend(true, {}, $(this).jqGrid("getGridParam"), o.addOptions);
  9813. // we need to check for:
  9814. // 1.multiselect, 2.subgrid 3. treegrid and remove the unneded columns from colNames
  9815. if(gprm.rownumbers) {
  9816. gprm.colNames.splice(0,1);
  9817. gprm.colModel.splice(0,1);
  9818. }
  9819. if(gprm.multiselect) {
  9820. gprm.colNames.splice(0,1);
  9821. gprm.colModel.splice(0,1);
  9822. }
  9823. if(gprm.subGrid) {
  9824. gprm.colNames.splice(0,1);
  9825. gprm.colModel.splice(0,1);
  9826. }
  9827. gprm.knv = null;
  9828. if(gprm.treeGrid) {
  9829. for (key in gprm.treeReader) {
  9830. if(gprm.treeReader.hasOwnProperty(key)) {
  9831. gprm.colNames.splice(gprm.colNames.length-1);
  9832. gprm.colModel.splice(gprm.colModel.length-1);
  9833. }
  9834. }
  9835. }
  9836. switch (o.exptype) {
  9837. case 'xmlstring' :
  9838. ret = "<"+o.root+">"+ jqGridUtils.jsonToXML( gprm, {xmlDecl:""} )+"</"+o.root+">";
  9839. break;
  9840. case 'jsonstring' :
  9841. ret = jqGridUtils.stringify( gprm );
  9842. if(o.root) { ret = "{"+ o.root +":"+ret+"}"; }
  9843. break;
  9844. }
  9845. });
  9846. return ret;
  9847. },
  9848. excelExport : function(o) {
  9849. o = $.extend({
  9850. exptype : "remote",
  9851. url : null,
  9852. oper: "oper",
  9853. tag: "excel",
  9854. exportOptions : {}
  9855. }, o || {});
  9856. return this.each(function(){
  9857. if(!this.grid) { return;}
  9858. var url;
  9859. if(o.exptype === "remote") {
  9860. var pdata = $.extend({},this.p.postData);
  9861. pdata[o.oper] = o.tag;
  9862. var params = jQuery.param(pdata);
  9863. if(o.url.indexOf("?") !== -1) { url = o.url+"&"+params; }
  9864. else { url = o.url+"?"+params; }
  9865. window.location = url;
  9866. }
  9867. });
  9868. }
  9869. });
  9870. //module begin
  9871. $.jgrid.inlineEdit = $.jgrid.inlineEdit || {};
  9872. $.jgrid.extend({
  9873. //Editing
  9874. editRow : function(rowid,keys,oneditfunc,successfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc) {
  9875. // Compatible mode old versions
  9876. var o={}, args = $.makeArray(arguments).slice(1);
  9877. if( $.type(args[0]) === "object" ) {
  9878. o = args[0];
  9879. } else {
  9880. if (keys !== undefined) { o.keys = keys; }
  9881. if ($.isFunction(oneditfunc)) { o.oneditfunc = oneditfunc; }
  9882. if ($.isFunction(successfunc)) { o.successfunc = successfunc; }
  9883. if (url !== undefined) { o.url = url; }
  9884. if (extraparam !== undefined) { o.extraparam = extraparam; }
  9885. if ($.isFunction(aftersavefunc)) { o.aftersavefunc = aftersavefunc; }
  9886. if ($.isFunction(errorfunc)) { o.errorfunc = errorfunc; }
  9887. if ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; }
  9888. // last two not as param, but as object (sorry)
  9889. //if (restoreAfterError !== undefined) { o.restoreAfterError = restoreAfterError; }
  9890. //if (mtype !== undefined) { o.mtype = mtype || "POST"; }
  9891. }
  9892. o = $.extend(true, {
  9893. keys : false,
  9894. oneditfunc: null,
  9895. successfunc: null,
  9896. url: null,
  9897. extraparam: {},
  9898. aftersavefunc: null,
  9899. errorfunc: null,
  9900. afterrestorefunc: null,
  9901. restoreAfterError: true,
  9902. mtype: "POST",
  9903. focusField : true
  9904. }, $.jgrid.inlineEdit, o );
  9905. // End compatible
  9906. return this.each(function(){
  9907. var $t = this, nm, tmp, editable, cnt=0, focus=null, svr={}, ind,cm, bfer;
  9908. if (!$t.grid ) { return; }
  9909. ind = $($t).jqGrid("getInd",rowid,true);
  9910. if( ind === false ) {return;}
  9911. bfer = $.isFunction( o.beforeEditRow ) ? o.beforeEditRow.call($t,o, rowid) : undefined;
  9912. if( bfer === undefined ) {
  9913. bfer = true;
  9914. }
  9915. if(!bfer) { return; }
  9916. editable = $(ind).attr("editable") || "0";
  9917. if (editable === "0" && !$(ind).hasClass("not-editable-row")) {
  9918. cm = $t.p.colModel;
  9919. $('td[role="gridcell"]',ind).each( function(i) {
  9920. nm = cm[i].name;
  9921. var treeg = $t.p.treeGrid===true && nm === $t.p.ExpandColumn;
  9922. if(treeg) { tmp = $("span:first",this).html();}
  9923. else {
  9924. try {
  9925. tmp = $.unformat.call($t,this,{rowId:rowid, colModel:cm[i]},i);
  9926. } catch (_) {
  9927. tmp = ( cm[i].edittype && cm[i].edittype === 'textarea' ) ? $(this).text() : $(this).html();
  9928. }
  9929. }
  9930. if ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') {
  9931. if($t.p.autoencode) { tmp = $.jgrid.htmlDecode(tmp); }
  9932. svr[nm]=tmp;
  9933. if(cm[i].editable===true) {
  9934. if(focus===null) { focus = i; }
  9935. if (treeg) { $("span:first",this).html(""); }
  9936. else { $(this).html(""); }
  9937. var opt = $.extend({},cm[i].editoptions || {},{id:rowid+"_"+nm,name:nm,rowId:rowid, oper:'edit'});
  9938. if(!cm[i].edittype) { cm[i].edittype = "text"; }
  9939. if(tmp === "&nbsp;" || tmp === "&#160;" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}
  9940. var elc = $.jgrid.createEl.call($t,cm[i].edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {}));
  9941. $(elc).addClass("editable");
  9942. if(treeg) { $("span:first",this).append(elc); }
  9943. else { $(this).append(elc); }
  9944. $.jgrid.bindEv.call($t, elc, opt);
  9945. //Again IE
  9946. if(cm[i].edittype === "select" && cm[i].editoptions!==undefined && cm[i].editoptions.multiple===true && cm[i].editoptions.dataUrl===undefined && $.jgrid.msie) {
  9947. $(elc).width($(elc).width());
  9948. }
  9949. cnt++;
  9950. }
  9951. }
  9952. });
  9953. if(cnt > 0) {
  9954. svr.id = rowid; $t.p.savedRow.push(svr);
  9955. $(ind).attr("editable","1");
  9956. if(o.focusField ) {
  9957. if(typeof o.focusField === 'number' && parseInt(o.focusField,10) <= cm.length) {
  9958. focus = o.focusField;
  9959. }
  9960. setTimeout(function(){
  9961. var fe = $("td:eq("+focus+") :input:visible",ind).not(":disabled");
  9962. if(fe.length > 0) {
  9963. fe.focus();
  9964. }
  9965. },0);
  9966. }
  9967. if(o.keys===true) {
  9968. $(ind).bind("keydown",function(e) {
  9969. if (e.keyCode === 27) {
  9970. $($t).jqGrid("restoreRow",rowid, o.afterrestorefunc);
  9971. if($t.p.inlineNav) {
  9972. try {
  9973. $($t).jqGrid('showAddEditButtons');
  9974. } catch (eer1) {}
  9975. }
  9976. return false;
  9977. }
  9978. if (e.keyCode === 13) {
  9979. var ta = e.target;
  9980. if(ta.tagName === 'TEXTAREA') { return true; }
  9981. if( $($t).jqGrid("saveRow", rowid, o ) ) {
  9982. if($t.p.inlineNav) {
  9983. try {
  9984. $($t).jqGrid('showAddEditButtons');
  9985. } catch (eer2) {}
  9986. }
  9987. }
  9988. return false;
  9989. }
  9990. });
  9991. }
  9992. $($t).triggerHandler("jqGridInlineEditRow", [rowid, o]);
  9993. if( $.isFunction(o.oneditfunc)) { o.oneditfunc.call($t, rowid); }
  9994. }
  9995. }
  9996. });
  9997. },
  9998. saveRow : function(rowid, successfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc) {
  9999. // Compatible mode old versions
  10000. var args = $.makeArray(arguments).slice(1), o = {}, $t = this[0];
  10001. if( $.type(args[0]) === "object" ) {
  10002. o = args[0];
  10003. } else {
  10004. if ($.isFunction(successfunc)) { o.successfunc = successfunc; }
  10005. if (url !== undefined) { o.url = url; }
  10006. if (extraparam !== undefined) { o.extraparam = extraparam; }
  10007. if ($.isFunction(aftersavefunc)) { o.aftersavefunc = aftersavefunc; }
  10008. if ($.isFunction(errorfunc)) { o.errorfunc = errorfunc; }
  10009. if ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; }
  10010. }
  10011. o = $.extend(true, {
  10012. successfunc: null,
  10013. url: null,
  10014. extraparam: {},
  10015. aftersavefunc: null,
  10016. errorfunc: null,
  10017. afterrestorefunc: null,
  10018. restoreAfterError: true,
  10019. mtype: "POST",
  10020. saveui : "enable",
  10021. savetext : $.jgrid.getRegional($t,'defaults.savetext')
  10022. }, $.jgrid.inlineEdit, o );
  10023. // End compatible
  10024. var success = false, nm, tmp={}, tmp2={}, tmp3= {}, editable, fr, cv, ind, nullIfEmpty=false;
  10025. if (!$t.grid ) { return success; }
  10026. ind = $($t).jqGrid("getInd",rowid,true);
  10027. if(ind === false) {return success;}
  10028. var errors = $.jgrid.getRegional(this, 'errors'),
  10029. edit =$.jgrid.getRegional(this, 'edit'),
  10030. bfsr = $.isFunction( o.beforeSaveRow ) ? o.beforeSaveRow.call($t,o, rowid) : undefined;
  10031. if( bfsr === undefined ) {
  10032. bfsr = true;
  10033. }
  10034. if(!bfsr) { return; }
  10035. editable = $(ind).attr("editable");
  10036. o.url = o.url || $t.p.editurl;
  10037. if (editable==="1") {
  10038. var cm;
  10039. $('td[role="gridcell"]',ind).each(function(i) {
  10040. cm = $t.p.colModel[i];
  10041. nm = cm.name;
  10042. if ( nm !== 'cb' && nm !== 'subgrid' && cm.editable===true && nm !== 'rn' && !$(this).hasClass('not-editable-cell')) {
  10043. switch (cm.edittype) {
  10044. case "checkbox":
  10045. var cbv = ["Yes","No"];
  10046. if(cm.editoptions ) {
  10047. cbv = cm.editoptions.value.split(":");
  10048. }
  10049. tmp[nm]= $("input",this).is(":checked") ? cbv[0] : cbv[1];
  10050. break;
  10051. case 'text':
  10052. case 'password':
  10053. case 'textarea':
  10054. case "button" :
  10055. tmp[nm]=$("input, textarea",this).val();
  10056. break;
  10057. case 'select':
  10058. if(!cm.editoptions.multiple) {
  10059. tmp[nm] = $("select option:selected",this).val();
  10060. tmp2[nm] = $("select option:selected", this).text();
  10061. } else {
  10062. var sel = $("select",this), selectedText = [];
  10063. tmp[nm] = $(sel).val();
  10064. if(tmp[nm]) { tmp[nm]= tmp[nm].join(","); } else { tmp[nm] =""; }
  10065. $("select option:selected",this).each(
  10066. function(i,selected){
  10067. selectedText[i] = $(selected).text();
  10068. }
  10069. );
  10070. tmp2[nm] = selectedText.join(",");
  10071. }
  10072. if(cm.formatter && cm.formatter === 'select') { tmp2={}; }
  10073. break;
  10074. case 'custom' :
  10075. try {
  10076. if(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) {
  10077. tmp[nm] = cm.editoptions.custom_value.call($t, $(".customelement",this),'get');
  10078. if (tmp[nm] === undefined) { throw "e2"; }
  10079. } else { throw "e1"; }
  10080. } catch (e) {
  10081. if (e==="e1") { $.jgrid.info_dialog(errors.errcap,"function 'custom_value' "+edit.msg.nodefined,edit.bClose); }
  10082. if (e==="e2") { $.jgrid.info_dialog(errors.errcap,"function 'custom_value' "+edit.msg.novalue,edit.bClose); }
  10083. else { $.jgrid.info_dialog(errors.errcap,e.message,edit.bClose); }
  10084. }
  10085. break;
  10086. }
  10087. cv = $.jgrid.checkValues.call($t,tmp[nm],i);
  10088. if(cv[0] === false) {
  10089. return false;
  10090. }
  10091. if($t.p.autoencode) { tmp[nm] = $.jgrid.htmlEncode(tmp[nm]); }
  10092. if(o.url !== 'clientArray' && cm.editoptions && cm.editoptions.NullIfEmpty === true) {
  10093. if(tmp[nm] === "") {
  10094. tmp3[nm] = 'null';
  10095. nullIfEmpty = true;
  10096. }
  10097. }
  10098. }
  10099. });
  10100. if (cv[0] === false){
  10101. try {
  10102. var tr = $($t).jqGrid('getGridRowById', rowid), positions = $.jgrid.findPos(tr);
  10103. $.jgrid.info_dialog(errors.errcap,cv[1],edit.bClose,{left:positions[0],top:positions[1]+$(tr).outerHeight()});
  10104. } catch (e) {
  10105. alert(cv[1]);
  10106. }
  10107. return success;
  10108. }
  10109. var idname, opers = $t.p.prmNames, oldRowId = rowid;
  10110. if ($t.p.keyName === false) {
  10111. idname = opers.id;
  10112. } else {
  10113. idname = $t.p.keyName;
  10114. }
  10115. if(tmp) {
  10116. tmp[opers.oper] = opers.editoper;
  10117. if (tmp[idname] === undefined || tmp[idname]==="") {
  10118. tmp[idname] = rowid;
  10119. } else if (ind.id !== $t.p.idPrefix + tmp[idname]) {
  10120. // rename rowid
  10121. var oldid = $.jgrid.stripPref($t.p.idPrefix, rowid);
  10122. if ($t.p._index[oldid] !== undefined) {
  10123. $t.p._index[tmp[idname]] = $t.p._index[oldid];
  10124. delete $t.p._index[oldid];
  10125. }
  10126. rowid = $t.p.idPrefix + tmp[idname];
  10127. $(ind).attr("id", rowid);
  10128. if ($t.p.selrow === oldRowId) {
  10129. $t.p.selrow = rowid;
  10130. }
  10131. if ($.isArray($t.p.selarrrow)) {
  10132. var i = $.inArray(oldRowId, $t.p.selarrrow);
  10133. if (i>=0) {
  10134. $t.p.selarrrow[i] = rowid;
  10135. }
  10136. }
  10137. if ($t.p.multiselect) {
  10138. var newCboxId = "jqg_" + $t.p.id + "_" + rowid;
  10139. $("input.cbox",ind)
  10140. .attr("id", newCboxId)
  10141. .attr("name", newCboxId);
  10142. }
  10143. // TODO: to test the case of frozen columns
  10144. }
  10145. if($t.p.inlineData === undefined) { $t.p.inlineData ={}; }
  10146. tmp = $.extend({},tmp,$t.p.inlineData,o.extraparam);
  10147. }
  10148. if (o.url === 'clientArray') {
  10149. tmp = $.extend({},tmp, tmp2);
  10150. if($t.p.autoencode) {
  10151. $.each(tmp,function(n,v){
  10152. tmp[n] = $.jgrid.htmlDecode(v);
  10153. });
  10154. }
  10155. var k, resp = $($t).jqGrid("setRowData",rowid,tmp);
  10156. $(ind).attr("editable","0");
  10157. for(k=0;k<$t.p.savedRow.length;k++) {
  10158. if( String($t.p.savedRow[k].id) === String(oldRowId)) {fr = k; break;}
  10159. }
  10160. if(fr >= 0) { $t.p.savedRow.splice(fr,1); }
  10161. $($t).triggerHandler("jqGridInlineAfterSaveRow", [rowid, resp, tmp, o]);
  10162. if( $.isFunction(o.aftersavefunc) ) { o.aftersavefunc.call($t, rowid, resp, tmp, o); }
  10163. success = true;
  10164. $(ind).removeClass("jqgrid-new-row").unbind("keydown");
  10165. } else {
  10166. $($t).jqGrid("progressBar", {method:"show", loadtype : o.saveui, htmlcontent: o.savetext });
  10167. tmp3 = $.extend({},tmp,tmp3);
  10168. tmp3[idname] = $.jgrid.stripPref($t.p.idPrefix, tmp3[idname]);
  10169. $.ajax($.extend({
  10170. url:o.url,
  10171. data: $.isFunction($t.p.serializeRowData) ? $t.p.serializeRowData.call($t, tmp3) : tmp3,
  10172. type: o.mtype,
  10173. async : false, //?!?
  10174. complete: function(res,stat){
  10175. $($t).jqGrid("progressBar", {method:"hide", loadtype : o.saveui, htmlcontent: o.savetext});
  10176. if (stat === "success"){
  10177. var ret = true, sucret, k;
  10178. sucret = $($t).triggerHandler("jqGridInlineSuccessSaveRow", [res, rowid, o]);
  10179. if (!$.isArray(sucret)) {sucret = [true, tmp3];}
  10180. if (sucret[0] && $.isFunction(o.successfunc)) {sucret = o.successfunc.call($t, res);}
  10181. if($.isArray(sucret)) {
  10182. // expect array - status, data, rowid
  10183. ret = sucret[0];
  10184. tmp = sucret[1] || tmp;
  10185. } else {
  10186. ret = sucret;
  10187. }
  10188. if (ret===true) {
  10189. if($t.p.autoencode) {
  10190. $.each(tmp,function(n,v){
  10191. tmp[n] = $.jgrid.htmlDecode(v);
  10192. });
  10193. }
  10194. if(nullIfEmpty) {
  10195. $.each(tmp,function( n ){
  10196. if(tmp[n] === 'null' ) {
  10197. tmp[n] = '';
  10198. }
  10199. });
  10200. }
  10201. tmp = $.extend({},tmp, tmp2);
  10202. $($t).jqGrid("setRowData",rowid,tmp);
  10203. $(ind).attr("editable","0");
  10204. for(k=0;k<$t.p.savedRow.length;k++) {
  10205. if( String($t.p.savedRow[k].id) === String(rowid)) {fr = k; break;}
  10206. }
  10207. if(fr >= 0) { $t.p.savedRow.splice(fr,1); }
  10208. $($t).triggerHandler("jqGridInlineAfterSaveRow", [rowid, res, tmp, o]);
  10209. if( $.isFunction(o.aftersavefunc) ) { o.aftersavefunc.call($t, rowid, res, tmp, o); }
  10210. success = true;
  10211. $(ind).removeClass("jqgrid-new-row").unbind("keydown");
  10212. } else {
  10213. $($t).triggerHandler("jqGridInlineErrorSaveRow", [rowid, res, stat, null, o]);
  10214. if($.isFunction(o.errorfunc) ) {
  10215. o.errorfunc.call($t, rowid, res, stat, null);
  10216. }
  10217. if(o.restoreAfterError === true) {
  10218. $($t).jqGrid("restoreRow",rowid, o.afterrestorefunc);
  10219. }
  10220. }
  10221. }
  10222. },
  10223. error:function(res,stat,err){
  10224. $("#lui_"+$.jgrid.jqID($t.p.id)).hide();
  10225. $($t).triggerHandler("jqGridInlineErrorSaveRow", [rowid, res, stat, err, o]);
  10226. if($.isFunction(o.errorfunc) ) {
  10227. o.errorfunc.call($t, rowid, res, stat, err);
  10228. } else {
  10229. var rT = res.responseText || res.statusText;
  10230. try {
  10231. $.jgrid.info_dialog(errors.errcap,'<div class="ui-state-error">'+ rT +'</div>', edit.bClose, {buttonalign:'right'});
  10232. } catch(e) {
  10233. alert(rT);
  10234. }
  10235. }
  10236. if(o.restoreAfterError === true) {
  10237. $($t).jqGrid("restoreRow",rowid, o.afterrestorefunc);
  10238. }
  10239. }
  10240. }, $.jgrid.ajaxOptions, $t.p.ajaxRowOptions || {}));
  10241. }
  10242. }
  10243. return success;
  10244. },
  10245. restoreRow : function(rowid, afterrestorefunc) {
  10246. // Compatible mode old versions
  10247. var args = $.makeArray(arguments).slice(1), o={};
  10248. if( $.type(args[0]) === "object" ) {
  10249. o = args[0];
  10250. } else {
  10251. if ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; }
  10252. }
  10253. o = $.extend(true, {}, $.jgrid.inlineEdit, o );
  10254. // End compatible
  10255. return this.each(function(){
  10256. var $t= this, fr=-1, ind, ares={}, k;
  10257. if (!$t.grid ) { return; }
  10258. ind = $($t).jqGrid("getInd",rowid,true);
  10259. if(ind === false) {return;}
  10260. var bfcr = $.isFunction( o.beforeCancelRow ) ? o.beforeCancelRow.call($t, o, rowid) : undefined;
  10261. if( bfcr === undefined ) {
  10262. bfcr = true;
  10263. }
  10264. if(!bfcr) { return; }
  10265. for(k=0;k<$t.p.savedRow.length;k++) {
  10266. if( String($t.p.savedRow[k].id) === String(rowid)) {fr = k; break;}
  10267. }
  10268. if(fr >= 0) {
  10269. if($.isFunction($.fn.datepicker)) {
  10270. try {
  10271. $("input.hasDatepicker","#"+$.jgrid.jqID(ind.id)).datepicker('hide');
  10272. } catch (e) {}
  10273. }
  10274. $.each($t.p.colModel, function(){
  10275. if(this.editable === true && $t.p.savedRow[fr].hasOwnProperty(this.name)) {
  10276. ares[this.name] = $t.p.savedRow[fr][this.name];
  10277. }
  10278. });
  10279. $($t).jqGrid("setRowData",rowid,ares);
  10280. $(ind).attr("editable","0").unbind("keydown");
  10281. $t.p.savedRow.splice(fr,1);
  10282. if($("#"+$.jgrid.jqID(rowid), "#"+$.jgrid.jqID($t.p.id)).hasClass("jqgrid-new-row")){
  10283. setTimeout(function(){
  10284. $($t).jqGrid("delRowData",rowid);
  10285. $($t).jqGrid('showAddEditButtons');
  10286. },0);
  10287. }
  10288. }
  10289. $($t).triggerHandler("jqGridInlineAfterRestoreRow", [rowid]);
  10290. if ($.isFunction(o.afterrestorefunc))
  10291. {
  10292. o.afterrestorefunc.call($t, rowid);
  10293. }
  10294. });
  10295. },
  10296. addRow : function ( p ) {
  10297. p = $.extend(true, {
  10298. rowID : null,
  10299. initdata : {},
  10300. position :"first",
  10301. useDefValues : true,
  10302. useFormatter : false,
  10303. addRowParams : {extraparam:{}}
  10304. },p || {});
  10305. return this.each(function(){
  10306. if (!this.grid ) { return; }
  10307. var $t = this;
  10308. var bfar = $.isFunction( p.beforeAddRow ) ? p.beforeAddRow.call($t,p.addRowParams) : undefined;
  10309. if( bfar === undefined ) {
  10310. bfar = true;
  10311. }
  10312. if(!bfar) { return; }
  10313. p.rowID = $.isFunction(p.rowID) ? p.rowID.call($t, p) : ( (p.rowID != null) ? p.rowID : $.jgrid.randId());
  10314. if(p.useDefValues === true) {
  10315. $($t.p.colModel).each(function(){
  10316. if( this.editoptions && this.editoptions.defaultValue ) {
  10317. var opt = this.editoptions.defaultValue,
  10318. tmp = $.isFunction(opt) ? opt.call($t) : opt;
  10319. p.initdata[this.name] = tmp;
  10320. }
  10321. });
  10322. }
  10323. $($t).jqGrid('addRowData', p.rowID, p.initdata, p.position);
  10324. p.rowID = $t.p.idPrefix + p.rowID;
  10325. $("#"+$.jgrid.jqID(p.rowID), "#"+$.jgrid.jqID($t.p.id)).addClass("jqgrid-new-row");
  10326. if(p.useFormatter) {
  10327. $("#"+$.jgrid.jqID(p.rowID)+" .ui-inline-edit", "#"+$.jgrid.jqID($t.p.id)).click();
  10328. } else {
  10329. var opers = $t.p.prmNames,
  10330. oper = opers.oper;
  10331. p.addRowParams.extraparam[oper] = opers.addoper;
  10332. $($t).jqGrid('editRow', p.rowID, p.addRowParams);
  10333. $($t).jqGrid('setSelection', p.rowID);
  10334. }
  10335. });
  10336. },
  10337. inlineNav : function (elem, o) {
  10338. var regional = $.jgrid.getRegional(this[0], 'nav');
  10339. o = $.extend(true,{
  10340. edit: true,
  10341. editicon: "ui-icon-pencil",
  10342. add: true,
  10343. addicon:"ui-icon-plus",
  10344. save: true,
  10345. saveicon:"ui-icon-disk",
  10346. cancel: true,
  10347. cancelicon:"ui-icon-cancel",
  10348. addParams : {addRowParams: {extraparam: {}}},
  10349. editParams : {},
  10350. restoreAfterSelect : true
  10351. }, regional, o ||{});
  10352. return this.each(function(){
  10353. if (!this.grid || this.p.inlineNav) { return; }
  10354. var $t = this, onSelect, gID = $.jgrid.jqID($t.p.id);
  10355. // check to see if navgrid is started, if not call it with all false parameters.
  10356. if(!$t.p.navGrid) {
  10357. $($t).jqGrid('navGrid',elem, {refresh:false, edit: false, add: false, del: false, search: false, view: false});
  10358. }
  10359. if(!$($t).data('inlineNav')) {
  10360. $($t).data('inlineNav',o);
  10361. }
  10362. if($t.p.force_regional) {
  10363. o = $.extend(o, regional);
  10364. }
  10365. $t.p.inlineNav = true;
  10366. // detect the formatactions column
  10367. if(o.addParams.useFormatter === true) {
  10368. var cm = $t.p.colModel,i;
  10369. for (i = 0; i<cm.length; i++) {
  10370. if(cm[i].formatter && cm[i].formatter === "actions" ) {
  10371. if(cm[i].formatoptions) {
  10372. var defaults = {
  10373. keys:false,
  10374. onEdit : null,
  10375. onSuccess: null,
  10376. afterSave:null,
  10377. onError: null,
  10378. afterRestore: null,
  10379. extraparam: {},
  10380. url: null
  10381. },
  10382. ap = $.extend( defaults, cm[i].formatoptions );
  10383. o.addParams.addRowParams = {
  10384. "keys" : ap.keys,
  10385. "oneditfunc" : ap.onEdit,
  10386. "successfunc" : ap.onSuccess,
  10387. "url" : ap.url,
  10388. "extraparam" : ap.extraparam,
  10389. "aftersavefunc" : ap.afterSave,
  10390. "errorfunc": ap.onError,
  10391. "afterrestorefunc" : ap.afterRestore
  10392. };
  10393. }
  10394. break;
  10395. }
  10396. }
  10397. }
  10398. if(o.add) {
  10399. $($t).jqGrid('navButtonAdd', elem,{
  10400. caption : o.addtext,
  10401. title : o.addtitle,
  10402. buttonicon : o.addicon,
  10403. id : $t.p.id+"_iladd",
  10404. onClickButton : function () {
  10405. $($t).jqGrid('addRow', o.addParams);
  10406. if(!o.addParams.useFormatter) {
  10407. $("#"+gID+"_ilsave").removeClass('ui-state-disabled');
  10408. $("#"+gID+"_ilcancel").removeClass('ui-state-disabled');
  10409. $("#"+gID+"_iladd").addClass('ui-state-disabled');
  10410. $("#"+gID+"_iledit").addClass('ui-state-disabled');
  10411. }
  10412. }
  10413. });
  10414. }
  10415. if(o.edit) {
  10416. $($t).jqGrid('navButtonAdd', elem,{
  10417. caption : o.edittext,
  10418. title : o.edittitle,
  10419. buttonicon : o.editicon,
  10420. id : $t.p.id+"_iledit",
  10421. onClickButton : function () {
  10422. var sr = $($t).jqGrid('getGridParam','selrow');
  10423. if(sr) {
  10424. $($t).jqGrid('editRow', sr, o.editParams);
  10425. $("#"+gID+"_ilsave").removeClass('ui-state-disabled');
  10426. $("#"+gID+"_ilcancel").removeClass('ui-state-disabled');
  10427. $("#"+gID+"_iladd").addClass('ui-state-disabled');
  10428. $("#"+gID+"_iledit").addClass('ui-state-disabled');
  10429. } else {
  10430. $.jgrid.viewModal("#alertmod_"+gID, {gbox:"#gbox_"+gID,jqm:true});$("#jqg_alrt").focus();
  10431. }
  10432. }
  10433. });
  10434. }
  10435. if(o.save) {
  10436. $($t).jqGrid('navButtonAdd', elem,{
  10437. caption : o.savetext || '',
  10438. title : o.savetitle || 'Save row',
  10439. buttonicon : o.saveicon,
  10440. id : $t.p.id+"_ilsave",
  10441. onClickButton : function () {
  10442. var sr = $t.p.savedRow[0].id;
  10443. if(sr) {
  10444. var opers = $t.p.prmNames,
  10445. oper = opers.oper, tmpParams = o.editParams;
  10446. if($("#"+$.jgrid.jqID(sr), "#"+gID ).hasClass("jqgrid-new-row")) {
  10447. o.addParams.addRowParams.extraparam[oper] = opers.addoper;
  10448. tmpParams = o.addParams.addRowParams;
  10449. } else {
  10450. if(!o.editParams.extraparam) {
  10451. o.editParams.extraparam = {};
  10452. }
  10453. o.editParams.extraparam[oper] = opers.editoper;
  10454. }
  10455. if( $($t).jqGrid('saveRow', sr, tmpParams) ) {
  10456. $($t).jqGrid('showAddEditButtons');
  10457. }
  10458. } else {
  10459. $.jgrid.viewModal("#alertmod_"+gID, {gbox:"#gbox_"+gID,jqm:true});$("#jqg_alrt").focus();
  10460. }
  10461. }
  10462. });
  10463. $("#"+gID+"_ilsave").addClass('ui-state-disabled');
  10464. }
  10465. if(o.cancel) {
  10466. $($t).jqGrid('navButtonAdd', elem,{
  10467. caption : o.canceltext || '',
  10468. title : o.canceltitle || 'Cancel row editing',
  10469. buttonicon : o.cancelicon,
  10470. id : $t.p.id+"_ilcancel",
  10471. onClickButton : function () {
  10472. var sr = $t.p.savedRow[0].id, cancelPrm = o.editParams;
  10473. if(sr) {
  10474. if($("#"+$.jgrid.jqID(sr), "#"+gID ).hasClass("jqgrid-new-row")) {
  10475. cancelPrm = o.addParams.addRowParams;
  10476. }
  10477. $($t).jqGrid('restoreRow', sr, cancelPrm);
  10478. $($t).jqGrid('showAddEditButtons');
  10479. } else {
  10480. $.jgrid.viewModal("#alertmod",{gbox:"#gbox_"+gID,jqm:true});$("#jqg_alrt").focus();
  10481. }
  10482. }
  10483. });
  10484. $("#"+gID+"_ilcancel").addClass('ui-state-disabled');
  10485. }
  10486. if(o.restoreAfterSelect === true) {
  10487. $($t).bind("jqGridBeforeSelectRow.inlineNav", function( event, id ) {
  10488. if($t.p.savedRow.length > 0 && $t.p.inlineNav===true && ( id !== $t.p.selrow && $t.p.selrow !==null) ) {
  10489. if($t.p.selrow === o.addParams.rowID ) {
  10490. $($t).jqGrid('delRowData', $t.p.selrow);
  10491. } else {
  10492. $($t).jqGrid('restoreRow', $t.p.selrow, o.editParams);
  10493. }
  10494. $($t).jqGrid('showAddEditButtons');
  10495. }
  10496. });
  10497. }
  10498. });
  10499. },
  10500. showAddEditButtons : function() {
  10501. return this.each(function(){
  10502. if (!this.grid ) { return; }
  10503. var gID = $.jgrid.jqID(this.p.id);
  10504. $("#"+gID+"_ilsave").addClass('ui-state-disabled');
  10505. $("#"+gID+"_ilcancel").addClass('ui-state-disabled');
  10506. $("#"+gID+"_iladd").removeClass('ui-state-disabled');
  10507. $("#"+gID+"_iledit").removeClass('ui-state-disabled');
  10508. });
  10509. }
  10510. //end inline edit
  10511. });
  10512. //module begin
  10513. if ($.jgrid.msie && $.jgrid.msiever()===8) {
  10514. $.expr[":"].hidden = function(elem) {
  10515. return elem.offsetWidth === 0 || elem.offsetHeight === 0 ||
  10516. elem.style.display === "none";
  10517. };
  10518. }
  10519. // requiere load multiselect before grid
  10520. $.jgrid._multiselect = false;
  10521. if($.ui) {
  10522. if ($.ui.multiselect ) {
  10523. if($.ui.multiselect.prototype._setSelected) {
  10524. var setSelected = $.ui.multiselect.prototype._setSelected;
  10525. $.ui.multiselect.prototype._setSelected = function(item,selected) {
  10526. var ret = setSelected.call(this,item,selected);
  10527. if (selected && this.selectedList) {
  10528. var elt = this.element;
  10529. this.selectedList.find('li').each(function() {
  10530. if ($(this).data('optionLink')) {
  10531. $(this).data('optionLink').remove().appendTo(elt);
  10532. }
  10533. });
  10534. }
  10535. return ret;
  10536. };
  10537. }
  10538. if($.ui.multiselect.prototype.destroy) {
  10539. $.ui.multiselect.prototype.destroy = function() {
  10540. this.element.show();
  10541. this.container.remove();
  10542. if ($.Widget === undefined) {
  10543. $.widget.prototype.destroy.apply(this, arguments);
  10544. } else {
  10545. $.Widget.prototype.destroy.apply(this, arguments);
  10546. }
  10547. };
  10548. }
  10549. $.jgrid._multiselect = true;
  10550. }
  10551. }
  10552. $.jgrid.extend({
  10553. sortableColumns : function (tblrow)
  10554. {
  10555. return this.each(function (){
  10556. var ts = this, tid= $.jgrid.jqID( ts.p.id );
  10557. function start() {ts.p.disableClick = true;}
  10558. var sortable_opts = {
  10559. "tolerance" : "pointer",
  10560. "axis" : "x",
  10561. "scrollSensitivity": "1",
  10562. "items": '>th:not(:has(#jqgh_'+tid+'_cb'+',#jqgh_'+tid+'_rn'+',#jqgh_'+tid+'_subgrid),:hidden)',
  10563. "placeholder": {
  10564. element: function(item) {
  10565. var el = $(document.createElement(item[0].nodeName))
  10566. .addClass(item[0].className+" ui-sortable-placeholder ui-state-highlight")
  10567. .removeClass("ui-sortable-helper")[0];
  10568. return el;
  10569. },
  10570. update: function(self, p) {
  10571. p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10));
  10572. p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10));
  10573. }
  10574. },
  10575. "update": function(event, ui) {
  10576. var p = $(ui.item).parent(),
  10577. th = $(">th", p),
  10578. colModel = ts.p.colModel,
  10579. cmMap = {}, tid= ts.p.id+"_";
  10580. $.each(colModel, function(i) { cmMap[this.name]=i; });
  10581. var permutation = [];
  10582. th.each(function() {
  10583. var id = $(">div", this).get(0).id.replace(/^jqgh_/, "").replace(tid,"");
  10584. if (cmMap.hasOwnProperty(id)) {
  10585. permutation.push(cmMap[id]);
  10586. }
  10587. });
  10588. $(ts).jqGrid("remapColumns",permutation, true, true);
  10589. if ($.isFunction(ts.p.sortable.update)) {
  10590. ts.p.sortable.update(permutation);
  10591. }
  10592. setTimeout(function(){ts.p.disableClick=false;}, 50);
  10593. }
  10594. };
  10595. if (ts.p.sortable.options) {
  10596. $.extend(sortable_opts, ts.p.sortable.options);
  10597. } else if ($.isFunction(ts.p.sortable)) {
  10598. ts.p.sortable = { "update" : ts.p.sortable };
  10599. }
  10600. if (sortable_opts.start) {
  10601. var s = sortable_opts.start;
  10602. sortable_opts.start = function(e,ui) {
  10603. start();
  10604. s.call(this,e,ui);
  10605. };
  10606. } else {
  10607. sortable_opts.start = start;
  10608. }
  10609. if (ts.p.sortable.exclude) {
  10610. sortable_opts.items += ":not("+ts.p.sortable.exclude+")";
  10611. }
  10612. var $e = tblrow.sortable(sortable_opts), dataObj = $e.data("sortable") || $e.data("uiSortable");
  10613. if (dataObj != null) {
  10614. dataObj.data("sortable").floating = true;
  10615. }
  10616. });
  10617. },
  10618. columnChooser : function(opts) {
  10619. var self = this, selector, select, colMap = {}, fixedCols = [], dopts, mopts, $dialogContent, multiselectData, listHeight,
  10620. colModel = self.jqGrid("getGridParam", "colModel"),
  10621. colNames = self.jqGrid("getGridParam", "colNames"),
  10622. getMultiselectWidgetData = function ($elem) {
  10623. return ($.ui.multiselect.prototype && $elem.data($.ui.multiselect.prototype.widgetFullName || $.ui.multiselect.prototype.widgetName)) ||
  10624. $elem.data("ui-multiselect") || $elem.data("multiselect");
  10625. },
  10626. regional = $.jgrid.getRegional(this[0], 'col');
  10627. if ($("#colchooser_" + $.jgrid.jqID(self[0].p.id)).length) { return; }
  10628. selector = $('<div id="colchooser_'+self[0].p.id+'" style="position:relative;overflow:hidden"><div><select multiple="multiple"></select></div></div>');
  10629. select = $('select', selector);
  10630. function insert(perm,i,v) {
  10631. var a, b;
  10632. if(i>=0){
  10633. a = perm.slice();
  10634. b = a.splice(i,Math.max(perm.length-i,i));
  10635. if(i>perm.length) { i = perm.length; }
  10636. a[i] = v;
  10637. return a.concat(b);
  10638. }
  10639. return perm;
  10640. }
  10641. function call(fn, obj) {
  10642. if (!fn) { return; }
  10643. if (typeof fn === 'string') {
  10644. if ($.fn[fn]) {
  10645. $.fn[fn].apply(obj, $.makeArray(arguments).slice(2));
  10646. }
  10647. } else if ($.isFunction(fn)) {
  10648. fn.apply(obj, $.makeArray(arguments).slice(2));
  10649. }
  10650. }
  10651. opts = $.extend({
  10652. width : 400,
  10653. height : 240,
  10654. classname : null,
  10655. done : function(perm) { if (perm) { self.jqGrid("remapColumns", perm, true); } },
  10656. /* msel is either the name of a ui widget class that
  10657. extends a multiselect, or a function that supports
  10658. creating a multiselect object (with no argument,
  10659. or when passed an object), and destroying it (when
  10660. passed the string "destroy"). */
  10661. msel : "multiselect",
  10662. /* "msel_opts" : {}, */
  10663. /* dlog is either the name of a ui widget class that
  10664. behaves in a dialog-like way, or a function, that
  10665. supports creating a dialog (when passed dlog_opts)
  10666. or destroying a dialog (when passed the string
  10667. "destroy")
  10668. */
  10669. dlog : "dialog",
  10670. dialog_opts : {
  10671. minWidth: 470,
  10672. dialogClass: "ui-jqdialog"
  10673. },
  10674. /* dlog_opts is either an option object to be passed
  10675. to "dlog", or (more likely) a function that creates
  10676. the options object.
  10677. The default produces a suitable options object for
  10678. ui.dialog */
  10679. dlog_opts : function(options) {
  10680. var buttons = {};
  10681. buttons[options.bSubmit] = function() {
  10682. options.apply_perm();
  10683. options.cleanup(false);
  10684. };
  10685. buttons[options.bCancel] = function() {
  10686. options.cleanup(true);
  10687. };
  10688. return $.extend(true, {
  10689. buttons: buttons,
  10690. close: function() {
  10691. options.cleanup(true);
  10692. },
  10693. modal: options.modal || false,
  10694. resizable: options.resizable || true,
  10695. width: options.width + 70,
  10696. resize: function () {
  10697. var widgetData = getMultiselectWidgetData(select),
  10698. $thisDialogContent = widgetData.container.closest(".ui-dialog-content");
  10699. if ($thisDialogContent.length > 0 && typeof $thisDialogContent[0].style === "object") {
  10700. $thisDialogContent[0].style.width = "";
  10701. } else {
  10702. $thisDialogContent.css("width", ""); // or just remove width style
  10703. }
  10704. widgetData.selectedList.height(Math.max(widgetData.selectedContainer.height() - widgetData.selectedActions.outerHeight() - 1, 1));
  10705. widgetData.availableList.height(Math.max(widgetData.availableContainer.height() - widgetData.availableActions.outerHeight() - 1, 1));
  10706. }
  10707. }, options.dialog_opts || {});
  10708. },
  10709. /* Function to get the permutation array, and pass it to the
  10710. "done" function */
  10711. apply_perm : function() {
  10712. var perm = [];
  10713. $('option',select).each(function() {
  10714. if ($(this).is("[selected]")) {
  10715. self.jqGrid("showCol", colModel[this.value].name);
  10716. } else {
  10717. self.jqGrid("hideCol", colModel[this.value].name);
  10718. }
  10719. });
  10720. //fixedCols.slice(0);
  10721. $('option[selected]',select).each(function() { perm.push(parseInt(this.value,10)); });
  10722. $.each(perm, function() { delete colMap[colModel[parseInt(this,10)].name]; });
  10723. $.each(colMap, function() {
  10724. var ti = parseInt(this,10);
  10725. perm = insert(perm,ti,ti);
  10726. });
  10727. if (opts.done) {
  10728. opts.done.call(self, perm);
  10729. }
  10730. self.jqGrid("setGridWidth", self[0].p.tblwidth, self[0].p.shrinkToFit);
  10731. },
  10732. /* Function to cleanup the dialog, and select. Also calls the
  10733. done function with no permutation (to indicate that the
  10734. columnChooser was aborted */
  10735. cleanup : function(calldone) {
  10736. call(opts.dlog, selector, 'destroy');
  10737. call(opts.msel, select, 'destroy');
  10738. selector.remove();
  10739. if (calldone && opts.done) {
  10740. opts.done.call(self);
  10741. }
  10742. },
  10743. msel_opts : {}
  10744. }, regional, opts || {} );
  10745. if($.ui) {
  10746. if ($.ui.multiselect && $.ui.multiselect.defaults) {
  10747. if (!$.jgrid._multiselect) {
  10748. // should be in language file
  10749. alert("Multiselect plugin loaded after jqGrid. Please load the plugin before the jqGrid!");
  10750. return;
  10751. }
  10752. // ??? the next line uses $.ui.multiselect.defaults which will be typically undefined
  10753. opts.msel_opts = $.extend($.ui.multiselect.defaults, opts.msel_opts);
  10754. }
  10755. }
  10756. if (opts.caption) {
  10757. selector.attr("title", opts.caption);
  10758. }
  10759. if (opts.classname) {
  10760. selector.addClass(opts.classname);
  10761. select.addClass(opts.classname);
  10762. }
  10763. if (opts.width) {
  10764. $(">div",selector).css({width: opts.width,margin:"0 auto"});
  10765. select.css("width", opts.width);
  10766. }
  10767. if (opts.height) {
  10768. $(">div",selector).css("height", opts.height);
  10769. select.css("height", opts.height - 10);
  10770. }
  10771. select.empty();
  10772. $.each(colModel, function(i) {
  10773. colMap[this.name] = i;
  10774. if (this.hidedlg) {
  10775. if (!this.hidden) {
  10776. fixedCols.push(i);
  10777. }
  10778. return;
  10779. }
  10780. select.append("<option value='"+i+"' "+
  10781. (this.hidden?"":"selected='selected'")+">"+$.jgrid.stripHtml(colNames[i])+"</option>");
  10782. });
  10783. dopts = $.isFunction(opts.dlog_opts) ? opts.dlog_opts.call(self, opts) : opts.dlog_opts;
  10784. call(opts.dlog, selector, dopts);
  10785. mopts = $.isFunction(opts.msel_opts) ? opts.msel_opts.call(self, opts) : opts.msel_opts;
  10786. call(opts.msel, select, mopts);
  10787. // fix height of elements of the multiselect widget
  10788. $dialogContent = $("#colchooser_" + $.jgrid.jqID(self[0].p.id));
  10789. $dialogContent.css({ margin: "auto" });
  10790. $dialogContent.find(">div").css({ width: "100%", height: "100%", margin: "auto" });
  10791. multiselectData = getMultiselectWidgetData(select);
  10792. multiselectData.container.css({ width: "100%", height: "100%", margin: "auto" });
  10793. multiselectData.selectedContainer.css({ width: multiselectData.options.dividerLocation * 100 + "%", height: "100%", margin: "auto", boxSizing: "border-box" });
  10794. multiselectData.availableContainer.css({ width: (100 - multiselectData.options.dividerLocation * 100) + "%", height: "100%", margin: "auto", boxSizing: "border-box" });
  10795. // set height for both selectedList and availableList
  10796. multiselectData.selectedList.css("height", "auto");
  10797. multiselectData.availableList.css("height", "auto");
  10798. listHeight = Math.max(multiselectData.selectedList.height(), multiselectData.availableList.height());
  10799. listHeight = Math.min(listHeight, $(window).height());
  10800. multiselectData.selectedList.css("height", listHeight);
  10801. multiselectData.availableList.css("height", listHeight);
  10802. },
  10803. sortableRows : function (opts) {
  10804. // Can accept all sortable options and events
  10805. return this.each(function(){
  10806. var $t = this;
  10807. if(!$t.grid) { return; }
  10808. // Currently we disable a treeGrid sortable
  10809. if($t.p.treeGrid) { return; }
  10810. if($.fn.sortable) {
  10811. opts = $.extend({
  10812. "cursor":"move",
  10813. "axis" : "y",
  10814. "items": " > .jqgrow"
  10815. },
  10816. opts || {});
  10817. if(opts.start && $.isFunction(opts.start)) {
  10818. opts._start_ = opts.start;
  10819. delete opts.start;
  10820. } else {opts._start_=false;}
  10821. if(opts.update && $.isFunction(opts.update)) {
  10822. opts._update_ = opts.update;
  10823. delete opts.update;
  10824. } else {opts._update_ = false;}
  10825. opts.start = function(ev,ui) {
  10826. $(ui.item).css("border-width","0");
  10827. $("td",ui.item).each(function(i){
  10828. this.style.width = $t.grid.cols[i].style.width;
  10829. });
  10830. if($t.p.subGrid) {
  10831. var subgid = $(ui.item).attr("id");
  10832. try {
  10833. $($t).jqGrid('collapseSubGridRow',subgid);
  10834. } catch (e) {}
  10835. }
  10836. if(opts._start_) {
  10837. opts._start_.apply(this,[ev,ui]);
  10838. }
  10839. };
  10840. opts.update = function (ev,ui) {
  10841. $(ui.item).css("border-width","");
  10842. if($t.p.rownumbers === true) {
  10843. $("td.jqgrid-rownum",$t.rows).each(function( i ){
  10844. $(this).html( i+1+(parseInt($t.p.page,10)-1)*parseInt($t.p.rowNum,10) );
  10845. });
  10846. }
  10847. if(opts._update_) {
  10848. opts._update_.apply(this,[ev,ui]);
  10849. }
  10850. };
  10851. $("tbody:first",$t).sortable(opts);
  10852. $("tbody:first > .jqgrow",$t).disableSelection();
  10853. }
  10854. });
  10855. },
  10856. gridDnD : function(opts) {
  10857. return this.each(function(){
  10858. var $t = this, i, cn;
  10859. if(!$t.grid) { return; }
  10860. // Currently we disable a treeGrid drag and drop
  10861. if($t.p.treeGrid) { return; }
  10862. if(!$.fn.draggable || !$.fn.droppable) { return; }
  10863. function updateDnD ()
  10864. {
  10865. var datadnd = $.data($t,"dnd");
  10866. $("tr.jqgrow:not(.ui-draggable)",$t).draggable($.isFunction(datadnd.drag) ? datadnd.drag.call($($t),datadnd) : datadnd.drag);
  10867. }
  10868. var appender = "<table id='jqgrid_dnd' class='ui-jqgrid-dnd'></table>";
  10869. if($("#jqgrid_dnd")[0] === undefined) {
  10870. $('body').append(appender);
  10871. }
  10872. if(typeof opts === 'string' && opts === 'updateDnD' && $t.p.jqgdnd===true) {
  10873. updateDnD();
  10874. return;
  10875. }
  10876. opts = $.extend({
  10877. "drag" : function (opts) {
  10878. return $.extend({
  10879. start : function (ev, ui) {
  10880. var i, subgid;
  10881. // if we are in subgrid mode try to collapse the node
  10882. if($t.p.subGrid) {
  10883. subgid = $(ui.helper).attr("id");
  10884. try {
  10885. $($t).jqGrid('collapseSubGridRow',subgid);
  10886. } catch (e) {}
  10887. }
  10888. // hack
  10889. // drag and drop does not insert tr in table, when the table has no rows
  10890. // we try to insert new empty row on the target(s)
  10891. for (i=0;i<$.data($t,"dnd").connectWith.length;i++){
  10892. if($($.data($t,"dnd").connectWith[i]).jqGrid('getGridParam','reccount') === 0 ){
  10893. $($.data($t,"dnd").connectWith[i]).jqGrid('addRowData','jqg_empty_row',{});
  10894. }
  10895. }
  10896. ui.helper.addClass("ui-state-highlight");
  10897. $("td",ui.helper).each(function(i) {
  10898. this.style.width = $t.grid.headers[i].width+"px";
  10899. });
  10900. if(opts.onstart && $.isFunction(opts.onstart) ) { opts.onstart.call($($t),ev,ui); }
  10901. },
  10902. stop :function(ev,ui) {
  10903. var i, ids;
  10904. if(ui.helper.dropped && !opts.dragcopy) {
  10905. ids = $(ui.helper).attr("id");
  10906. if(ids === undefined) { ids = $(this).attr("id"); }
  10907. $($t).jqGrid('delRowData',ids );
  10908. }
  10909. // if we have a empty row inserted from start event try to delete it
  10910. for (i=0;i<$.data($t,"dnd").connectWith.length;i++){
  10911. $($.data($t,"dnd").connectWith[i]).jqGrid('delRowData','jqg_empty_row');
  10912. }
  10913. if(opts.onstop && $.isFunction(opts.onstop) ) { opts.onstop.call($($t),ev,ui); }
  10914. }
  10915. },opts.drag_opts || {});
  10916. },
  10917. "drop" : function (opts) {
  10918. return $.extend({
  10919. accept: function(d) {
  10920. if (!$(d).hasClass('jqgrow')) { return d;}
  10921. var tid = $(d).closest("table.ui-jqgrid-btable");
  10922. if(tid.length > 0 && $.data(tid[0],"dnd") !== undefined) {
  10923. var cn = $.data(tid[0],"dnd").connectWith;
  10924. return $.inArray('#'+$.jgrid.jqID(this.id),cn) !== -1 ? true : false;
  10925. }
  10926. return false;
  10927. },
  10928. drop: function(ev, ui) {
  10929. if (!$(ui.draggable).hasClass('jqgrow')) { return; }
  10930. var accept = $(ui.draggable).attr("id");
  10931. var getdata = ui.draggable.parent().parent().jqGrid('getRowData',accept);
  10932. if(!opts.dropbyname) {
  10933. var j =0, tmpdata = {}, nm, key;
  10934. var dropmodel = $("#"+$.jgrid.jqID(this.id)).jqGrid('getGridParam','colModel');
  10935. try {
  10936. for (key in getdata) {
  10937. if (getdata.hasOwnProperty(key)) {
  10938. nm = dropmodel[j].name;
  10939. if( !(nm === 'cb' || nm === 'rn' || nm === 'subgrid' )) {
  10940. if(getdata.hasOwnProperty(key) && dropmodel[j]) {
  10941. tmpdata[nm] = getdata[key];
  10942. }
  10943. }
  10944. j++;
  10945. }
  10946. }
  10947. getdata = tmpdata;
  10948. } catch (e) {}
  10949. }
  10950. ui.helper.dropped = true;
  10951. if(opts.beforedrop && $.isFunction(opts.beforedrop) ) {
  10952. //parameters to this callback - event, element, data to be inserted, sender, reciever
  10953. // should return object which will be inserted into the reciever
  10954. var datatoinsert = opts.beforedrop.call(this,ev,ui,getdata,$('#'+$.jgrid.jqID($t.p.id)),$(this));
  10955. if (datatoinsert !== undefined && datatoinsert !== null && typeof datatoinsert === "object") { getdata = datatoinsert; }
  10956. }
  10957. if(ui.helper.dropped) {
  10958. var grid;
  10959. if(opts.autoid) {
  10960. if($.isFunction(opts.autoid)) {
  10961. grid = opts.autoid.call(this,getdata);
  10962. } else {
  10963. grid = Math.ceil(Math.random()*1000);
  10964. grid = opts.autoidprefix+grid;
  10965. }
  10966. }
  10967. // NULL is interpreted as undefined while null as object
  10968. $("#"+$.jgrid.jqID(this.id)).jqGrid('addRowData',grid,getdata,opts.droppos);
  10969. }
  10970. if(opts.ondrop && $.isFunction(opts.ondrop) ) { opts.ondrop.call(this,ev,ui, getdata); }
  10971. }}, opts.drop_opts || {});
  10972. },
  10973. "onstart" : null,
  10974. "onstop" : null,
  10975. "beforedrop": null,
  10976. "ondrop" : null,
  10977. "drop_opts" : {
  10978. "activeClass": "ui-state-active",
  10979. "hoverClass": "ui-state-hover"
  10980. },
  10981. "drag_opts" : {
  10982. "revert": "invalid",
  10983. "helper": "clone",
  10984. "cursor": "move",
  10985. "appendTo" : "#jqgrid_dnd",
  10986. "zIndex": 5000
  10987. },
  10988. "dragcopy": false,
  10989. "dropbyname" : false,
  10990. "droppos" : "first",
  10991. "autoid" : true,
  10992. "autoidprefix" : "dnd_"
  10993. }, opts || {});
  10994. if(!opts.connectWith) { return; }
  10995. opts.connectWith = opts.connectWith.split(",");
  10996. opts.connectWith = $.map(opts.connectWith,function(n){return $.trim(n);});
  10997. $.data($t,"dnd",opts);
  10998. if($t.p.reccount !== 0 && !$t.p.jqgdnd) {
  10999. updateDnD();
  11000. }
  11001. $t.p.jqgdnd = true;
  11002. for (i=0;i<opts.connectWith.length;i++){
  11003. cn =opts.connectWith[i];
  11004. $(cn).droppable($.isFunction(opts.drop) ? opts.drop.call($($t),opts) : opts.drop);
  11005. }
  11006. });
  11007. },
  11008. gridResize : function(opts) {
  11009. return this.each(function(){
  11010. var $t = this, gID = $.jgrid.jqID($t.p.id);
  11011. if(!$t.grid || !$.fn.resizable) { return; }
  11012. opts = $.extend({}, opts || {});
  11013. if(opts.alsoResize ) {
  11014. opts._alsoResize_ = opts.alsoResize;
  11015. delete opts.alsoResize;
  11016. } else {
  11017. opts._alsoResize_ = false;
  11018. }
  11019. if(opts.stop && $.isFunction(opts.stop)) {
  11020. opts._stop_ = opts.stop;
  11021. delete opts.stop;
  11022. } else {
  11023. opts._stop_ = false;
  11024. }
  11025. opts.stop = function (ev, ui) {
  11026. $($t).jqGrid('setGridParam',{height:$("#gview_"+gID+" .ui-jqgrid-bdiv").height()});
  11027. $($t).jqGrid('setGridWidth',ui.size.width,opts.shrinkToFit);
  11028. if(opts._stop_) { opts._stop_.call($t,ev,ui); }
  11029. };
  11030. if(opts._alsoResize_) {
  11031. var optstest = "{\'#gview_"+gID+" .ui-jqgrid-bdiv\':true,'" +opts._alsoResize_+"':true}";
  11032. opts.alsoResize = eval('('+optstest+')'); // the only way that I found to do this
  11033. } else {
  11034. opts.alsoResize = $(".ui-jqgrid-bdiv","#gview_"+gID);
  11035. }
  11036. delete opts._alsoResize_;
  11037. $("#gbox_"+gID).resizable(opts);
  11038. });
  11039. }
  11040. });
  11041. //module begin
  11042. function _pivotfilter (fn, context) {
  11043. /*jshint validthis: true */
  11044. var i,
  11045. value,
  11046. result = [],
  11047. length;
  11048. if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
  11049. throw new TypeError();
  11050. }
  11051. length = this.length;
  11052. for (i = 0; i < length; i++) {
  11053. if (this.hasOwnProperty(i)) {
  11054. value = this[i];
  11055. if (fn.call(context, value, i, this)) {
  11056. result.push(value);
  11057. // We need break in order to cancel loop
  11058. // in case the row is found
  11059. break;
  11060. }
  11061. }
  11062. }
  11063. return result;
  11064. }
  11065. $.assocArraySize = function(obj) {
  11066. // http://stackoverflow.com/a/6700/11236
  11067. var size = 0, key;
  11068. for (key in obj) {
  11069. if (obj.hasOwnProperty(key)) {
  11070. size++;
  11071. }
  11072. }
  11073. return size;
  11074. };
  11075. $.jgrid.extend({
  11076. pivotSetup : function( data, options ){
  11077. // data should come in json format
  11078. // The function return the new colModel and the transformed data
  11079. // again with group setup options which then will be passed to the grid
  11080. var columns =[],
  11081. pivotrows =[],
  11082. summaries = [],
  11083. member=[],
  11084. labels=[],
  11085. groupOptions = {
  11086. grouping : true,
  11087. groupingView : {
  11088. groupField : [],
  11089. groupSummary: [],
  11090. groupSummaryPos:[]
  11091. }
  11092. },
  11093. headers = [],
  11094. o = $.extend ( {
  11095. rowTotals : false,
  11096. rowTotalsText : 'Total',
  11097. // summary columns
  11098. colTotals : false,
  11099. groupSummary : true,
  11100. groupSummaryPos : 'header',
  11101. frozenStaticCols : false
  11102. }, options || {});
  11103. this.each(function(){
  11104. var
  11105. row,
  11106. rowindex,
  11107. i,
  11108. rowlen = data.length,
  11109. xlen, ylen, aggrlen,
  11110. tmp,
  11111. newObj,
  11112. r=0;
  11113. // utility funcs
  11114. /*
  11115. * Filter the data to a given criteria. Return the firt occurance
  11116. */
  11117. function find(ar, fun, extra) {
  11118. var res;
  11119. res = _pivotfilter.call(ar, fun, extra);
  11120. return res.length > 0 ? res[0] : null;
  11121. }
  11122. /*
  11123. * Check if the grouped row column exist (See find)
  11124. * If the row is not find in pivot rows retun null,
  11125. * otherviese the column
  11126. */
  11127. function findGroup(item, index) {
  11128. /*jshint validthis: true */
  11129. var j = 0, ret = true, i;
  11130. for(i in item) {
  11131. if( item.hasOwnProperty(i) ) {
  11132. if(item[i] != this[j]) {
  11133. ret = false;
  11134. break;
  11135. }
  11136. }
  11137. j++;
  11138. if(j>=this.length) {
  11139. break;
  11140. }
  11141. }
  11142. if(ret) {
  11143. rowindex = index;
  11144. }
  11145. return ret;
  11146. }
  11147. /*
  11148. * Perform calculations of the pivot values.
  11149. */
  11150. function calculation(oper, v, field, rc) {
  11151. var ret;
  11152. switch (oper) {
  11153. case "sum" :
  11154. ret = parseFloat(v||0) + parseFloat((rc[field]||0));
  11155. break;
  11156. case "count" :
  11157. if(v==="" || v == null) {
  11158. v=0;
  11159. }
  11160. if(rc.hasOwnProperty(field)) {
  11161. ret = v+1;
  11162. } else {
  11163. ret = 0;
  11164. }
  11165. break;
  11166. case "min" :
  11167. if(v==="" || v == null) {
  11168. ret = parseFloat(rc[field]||0);
  11169. } else {
  11170. ret =Math.min(parseFloat(v),parseFloat(rc[field]||0));
  11171. }
  11172. break;
  11173. case "max" :
  11174. if(v==="" || v == null) {
  11175. ret = parseFloat(rc[field]||0);
  11176. } else {
  11177. ret = Math.max(parseFloat(v),parseFloat(rc[field]||0));
  11178. }
  11179. break;
  11180. }
  11181. return ret;
  11182. }
  11183. /*
  11184. * The function agragates the values of the pivot grid.
  11185. * Return the current row with pivot summary values
  11186. */
  11187. function agregateFunc ( row, aggr, value, curr) {
  11188. // default is sum
  11189. var arrln = aggr.length, i, label, j, jv, mainval="",swapvals=[];
  11190. if($.isArray(value)) {
  11191. jv = value.length;
  11192. swapvals = value;
  11193. } else {
  11194. jv = 1;
  11195. swapvals[0]=value;
  11196. }
  11197. member = [];
  11198. labels = [];
  11199. member.root = 0;
  11200. for(j=0;j<jv;j++) {
  11201. var tmpmember = [], vl;
  11202. for(i=0; i < arrln; i++) {
  11203. if(value == null) {
  11204. label = $.trim(aggr[i].member)+"_"+aggr[i].aggregator;
  11205. vl = label;
  11206. swapvals[0]= vl;
  11207. } else {
  11208. vl = value[j].replace(/\s+/g, '');
  11209. try {
  11210. label = (arrln === 1 ? mainval + vl : mainval + vl+"_"+aggr[i].aggregator+"_" + String(i));
  11211. } catch(e) {}
  11212. }
  11213. label = !isNaN(parseInt(label,10)) ? label + " " : label;
  11214. curr[label] = tmpmember[label] = calculation( aggr[i].aggregator, curr[label], aggr[i].member, row);
  11215. if(j<=1 && vl !== '_r_Totals' && mainval === "") { // this does not fix full the problem
  11216. mainval = vl;
  11217. }
  11218. }
  11219. //vl = !isNaN(parseInt(vl,10)) ? vl + " " : vl;
  11220. member[label] = tmpmember;
  11221. labels[label] = swapvals[j];
  11222. }
  11223. return curr;
  11224. }
  11225. // Making the row totals without to add in yDimension
  11226. if(o.rowTotals && o.yDimension.length > 0) {
  11227. var dn = o.yDimension[0].dataName;
  11228. o.yDimension.splice(0,0,{dataName:dn});
  11229. o.yDimension[0].converter = function(){ return '_r_Totals'; };
  11230. }
  11231. // build initial columns (colModel) from xDimension
  11232. xlen = $.isArray(o.xDimension) ? o.xDimension.length : 0;
  11233. ylen = o.yDimension.length;
  11234. aggrlen = $.isArray(o.aggregates) ? o.aggregates.length : 0;
  11235. if(xlen === 0 || aggrlen === 0) {
  11236. throw("xDimension or aggregates optiona are not set!");
  11237. }
  11238. var colc;
  11239. for(i = 0; i< xlen; i++) {
  11240. colc = {name:o.xDimension[i].dataName, frozen: o.frozenStaticCols};
  11241. if(o.xDimension[i].isGroupField == null) {
  11242. o.xDimension[i].isGroupField = true;
  11243. }
  11244. colc = $.extend(true, colc, o.xDimension[i]);
  11245. columns.push( colc );
  11246. }
  11247. var groupfields = xlen - 1, tree={};
  11248. //tree = { text: 'root', leaf: false, children: [] };
  11249. //loop over alll the source data
  11250. while( r < rowlen ) {
  11251. row = data[r];
  11252. var xValue = [];
  11253. var yValue = [];
  11254. tmp = {};
  11255. i = 0;
  11256. // build the data from xDimension
  11257. do {
  11258. xValue[i] = $.trim(row[o.xDimension[i].dataName]);
  11259. tmp[o.xDimension[i].dataName] = xValue[i];
  11260. i++;
  11261. } while( i < xlen );
  11262. var k = 0;
  11263. rowindex = -1;
  11264. // check to see if the row is in our new pivotrow set
  11265. newObj = find(pivotrows, findGroup, xValue);
  11266. if(!newObj) {
  11267. // if the row is not in our set
  11268. k = 0;
  11269. // if yDimension is set
  11270. if(ylen>=1) {
  11271. // build the cols set in yDimension
  11272. for(k=0;k<ylen;k++) {
  11273. yValue[k] = $.trim(row[o.yDimension[k].dataName]);
  11274. // Check to see if we have user defined conditions
  11275. if(o.yDimension[k].converter && $.isFunction(o.yDimension[k].converter)) {
  11276. yValue[k] = o.yDimension[k].converter.call(this, yValue[k], xValue, yValue);
  11277. }
  11278. }
  11279. // make the colums based on aggregates definition
  11280. // and return the members for late calculation
  11281. tmp = agregateFunc( row, o.aggregates, yValue, tmp );
  11282. } else if( ylen === 0 ) {
  11283. // if not set use direct the aggregates
  11284. tmp = agregateFunc( row, o.aggregates, null, tmp );
  11285. }
  11286. // add the result in pivot rows
  11287. pivotrows.push( tmp );
  11288. } else {
  11289. // the pivot exists
  11290. if( rowindex >= 0) {
  11291. k = 0;
  11292. // make the recalculations
  11293. if(ylen>=1) {
  11294. for(k=0;k<ylen;k++) {
  11295. yValue[k] = $.trim(row[o.yDimension[k].dataName]);
  11296. if(o.yDimension[k].converter && $.isFunction(o.yDimension[k].converter)) {
  11297. yValue[k] = o.yDimension[k].converter.call(this, yValue[k], xValue, yValue);
  11298. }
  11299. }
  11300. newObj = agregateFunc( row, o.aggregates, yValue, newObj );
  11301. } else if( ylen === 0 ) {
  11302. newObj = agregateFunc( row, o.aggregates, null, newObj );
  11303. }
  11304. // update the row
  11305. pivotrows[rowindex] = newObj;
  11306. }
  11307. }
  11308. var kj=0, current = null,existing = null, kk;
  11309. // Build a JSON tree from the member (see aggregateFunc)
  11310. // to make later the columns
  11311. //
  11312. for (kk in member) {
  11313. if(member.hasOwnProperty( kk )) {
  11314. if(kj === 0) {
  11315. if (!tree.children||tree.children === undefined){
  11316. tree = { text: kk, level : 0, children: [], label: kk };
  11317. }
  11318. current = tree.children;
  11319. } else {
  11320. existing = null;
  11321. for (i=0; i < current.length; i++) {
  11322. if (current[i].text === kk) {
  11323. //current[i].fields=member[kk];
  11324. existing = current[i];
  11325. break;
  11326. }
  11327. }
  11328. if (existing) {
  11329. current = existing.children;
  11330. } else {
  11331. current.push({ children: [], text: kk, level: kj, fields: member[kk], label: labels[kk] });
  11332. current = current[current.length - 1].children;
  11333. }
  11334. }
  11335. kj++;
  11336. }
  11337. }
  11338. r++;
  11339. }
  11340. var lastval=[], initColLen = columns.length, swaplen = initColLen;
  11341. if(ylen>0) {
  11342. headers[ylen-1] = { useColSpanStyle: false, groupHeaders: []};
  11343. }
  11344. /*
  11345. * Recursive function which uses the tree to build the
  11346. * columns from the pivot values and set the group Headers
  11347. */
  11348. function list(items) {
  11349. var l, j, key, k, col;
  11350. for (key in items) { // iterate
  11351. if (items.hasOwnProperty(key)) {
  11352. // write amount of spaces according to level
  11353. // and write name and newline
  11354. if(typeof items[key] !== "object") {
  11355. // If not a object build the header of the appropriate level
  11356. if( key === 'level') {
  11357. if(lastval[items.level] === undefined) {
  11358. lastval[items.level] ='';
  11359. if(items.level>0 && items.text !== '_r_Totals') {
  11360. headers[items.level-1] = {
  11361. useColSpanStyle: false,
  11362. groupHeaders: []
  11363. };
  11364. }
  11365. }
  11366. if(lastval[items.level] !== items.text && items.children.length && items.text !== '_r_Totals') {
  11367. if(items.level>0) {
  11368. headers[items.level-1].groupHeaders.push({
  11369. titleText: items.label,
  11370. numberOfColumns : 0
  11371. });
  11372. var collen = headers[items.level-1].groupHeaders.length-1,
  11373. colpos = collen === 0 ? swaplen : initColLen+aggrlen;
  11374. if(items.level-1=== (o.rowTotals ? 1 : 0)) {
  11375. if(collen>0) {
  11376. var l1 = headers[items.level-1].groupHeaders[collen-1].numberOfColumns;
  11377. if(l1) {
  11378. colpos = l1 + 1 + o.aggregates.length;
  11379. }
  11380. }
  11381. }
  11382. headers[items.level-1].groupHeaders[collen].startColumnName = columns[colpos].name;
  11383. headers[items.level-1].groupHeaders[collen].numberOfColumns = columns.length - colpos;
  11384. initColLen = columns.length;
  11385. }
  11386. }
  11387. lastval[items.level] = items.text;
  11388. }
  11389. // This is in case when the member contain more than one summary item
  11390. if(items.level === ylen && key==='level' && ylen >0) {
  11391. if( aggrlen > 1){
  11392. var ll=1;
  11393. for( l in items.fields) {
  11394. if(items.fields.hasOwnProperty(l)) {
  11395. if(ll===1) {
  11396. headers[ylen-1].groupHeaders.push({startColumnName: l, numberOfColumns: 1, titleText: items.text});
  11397. }
  11398. }
  11399. ll++;
  11400. }
  11401. headers[ylen-1].groupHeaders[headers[ylen-1].groupHeaders.length-1].numberOfColumns = ll-1;
  11402. } else {
  11403. headers.splice(ylen-1,1);
  11404. }
  11405. }
  11406. }
  11407. // if object, call recursively
  11408. if (items[key] != null && typeof items[key] === "object") {
  11409. list(items[key]);
  11410. }
  11411. // Finally build the coulumns
  11412. if( key === 'level') {
  11413. if(items.level >0){
  11414. j=0;
  11415. for(l in items.fields) {
  11416. if(items.fields.hasOwnProperty( l )) {
  11417. col = {};
  11418. for(k in o.aggregates[j]) {
  11419. if(o.aggregates[j].hasOwnProperty(k)) {
  11420. switch( k ) {
  11421. case 'member':
  11422. case 'label':
  11423. case 'aggregator':
  11424. break;
  11425. default:
  11426. col[k] = o.aggregates[j][k];
  11427. }
  11428. }
  11429. }
  11430. if(aggrlen>1) {
  11431. col.name = l;
  11432. col.label = o.aggregates[j].label || items.label;
  11433. } else {
  11434. col.name = items.text;
  11435. col.label = items.text==='_r_Totals' ? o.rowTotalsText : items.label;
  11436. }
  11437. columns.push (col);
  11438. j++;
  11439. }
  11440. }
  11441. }
  11442. }
  11443. }
  11444. }
  11445. }
  11446. list( tree );
  11447. var nm;
  11448. // loop again trougth the pivot rows in order to build grand total
  11449. if(o.colTotals) {
  11450. var plen = pivotrows.length;
  11451. while(plen--) {
  11452. for(i=xlen;i<columns.length;i++) {
  11453. nm = columns[i].name;
  11454. if(!summaries[nm]) {
  11455. summaries[nm] = parseFloat(pivotrows[plen][nm] || 0);
  11456. } else {
  11457. summaries[nm] += parseFloat(pivotrows[plen][nm] || 0);
  11458. }
  11459. }
  11460. }
  11461. }
  11462. // based on xDimension levels build grouping
  11463. if( groupfields > 0) {
  11464. for(i=0;i<groupfields;i++) {
  11465. if(columns[i].isGroupField) {
  11466. groupOptions.groupingView.groupField.push(columns[i].name);
  11467. groupOptions.groupingView.groupSummary.push(o.groupSummary);
  11468. groupOptions.groupingView.groupSummaryPos.push(o.groupSummaryPos);
  11469. }
  11470. }
  11471. } else {
  11472. // no grouping is needed
  11473. groupOptions.grouping = false;
  11474. }
  11475. groupOptions.sortname = columns[groupfields].name;
  11476. groupOptions.groupingView.hideFirstGroupCol = true;
  11477. });
  11478. // return the final result.
  11479. return { "colModel" : columns, "rows": pivotrows, "groupOptions" : groupOptions, "groupHeaders" : headers, summary : summaries };
  11480. },
  11481. jqPivot : function( data, pivotOpt, gridOpt, ajaxOpt) {
  11482. return this.each(function(){
  11483. var $t = this;
  11484. function pivot( data) {
  11485. var pivotGrid = jQuery($t).jqGrid('pivotSetup',data, pivotOpt),
  11486. footerrow = $.assocArraySize(pivotGrid.summary) > 0 ? true : false,
  11487. query= $.jgrid.from.call($t, pivotGrid.rows), i;
  11488. for(i=0; i< pivotGrid.groupOptions.groupingView.groupField.length; i++) {
  11489. query.orderBy(pivotGrid.groupOptions.groupingView.groupField[i], "a", 'text', '');
  11490. }
  11491. jQuery($t).jqGrid($.extend(true, {
  11492. datastr: $.extend(query.select(),footerrow ? {userdata:pivotGrid.summary} : {}),
  11493. datatype: "jsonstring",
  11494. footerrow : footerrow,
  11495. userDataOnFooter: footerrow,
  11496. colModel: pivotGrid.colModel,
  11497. viewrecords: true,
  11498. sortname: pivotOpt.xDimension[0].dataName // ?????
  11499. }, pivotGrid.groupOptions, gridOpt || {}));
  11500. var gHead = pivotGrid.groupHeaders;
  11501. if(gHead.length) {
  11502. for( i = 0;i < gHead.length ; i++) {
  11503. if(gHead[i] && gHead[i].groupHeaders.length) {
  11504. jQuery($t).jqGrid('setGroupHeaders',gHead[i]);
  11505. }
  11506. }
  11507. }
  11508. if(pivotOpt.frozenStaticCols) {
  11509. jQuery($t).jqGrid("setFrozenColumns");
  11510. }
  11511. }
  11512. if(typeof data === "string") {
  11513. $.ajax($.extend({
  11514. url : data,
  11515. dataType: 'json',
  11516. success : function(response) {
  11517. pivot($.jgrid.getAccessor(response, ajaxOpt && ajaxOpt.reader ? ajaxOpt.reader: 'rows') );
  11518. }
  11519. }, ajaxOpt || {}) );
  11520. } else {
  11521. pivot( data );
  11522. }
  11523. });
  11524. }
  11525. });
  11526. //module begin
  11527. $.jgrid.extend({
  11528. setSubGrid : function () {
  11529. return this.each(function (){
  11530. var $t = this, cm, i,
  11531. suboptions = {
  11532. plusicon : "ui-icon-plus",
  11533. minusicon : "ui-icon-minus",
  11534. openicon: "ui-icon-carat-1-sw",
  11535. expandOnLoad: false,
  11536. delayOnLoad : 50,
  11537. selectOnExpand : false,
  11538. selectOnCollapse : false,
  11539. reloadOnExpand : true
  11540. };
  11541. $t.p.subGridOptions = $.extend(suboptions, $t.p.subGridOptions || {});
  11542. $t.p.colNames.unshift("");
  11543. $t.p.colModel.unshift({name:'subgrid',width: $.jgrid.cell_width ? $t.p.subGridWidth+$t.p.cellLayout : $t.p.subGridWidth,sortable: false,resizable:false,hidedlg:true,search:false,fixed:true});
  11544. cm = $t.p.subGridModel;
  11545. if(cm[0]) {
  11546. cm[0].align = $.extend([],cm[0].align || []);
  11547. for(i=0;i<cm[0].name.length;i++) { cm[0].align[i] = cm[0].align[i] || 'left';}
  11548. }
  11549. });
  11550. },
  11551. addSubGridCell :function (pos,iRow) {
  11552. var prp='',ic,sid;
  11553. this.each(function(){
  11554. prp = this.formatCol(pos,iRow);
  11555. sid= this.p.id;
  11556. ic = this.p.subGridOptions.plusicon;
  11557. });
  11558. return "<td role=\"gridcell\" aria-describedby=\""+sid+"_subgrid\" class=\"ui-sgcollapsed sgcollapsed\" "+prp+"><a style='cursor:pointer;'><span class='ui-icon "+ic+"'></span></a></td>";
  11559. },
  11560. addSubGrid : function( pos, sind ) {
  11561. return this.each(function(){
  11562. var ts = this;
  11563. if (!ts.grid ) { return; }
  11564. //-------------------------
  11565. var subGridCell = function(trdiv,cell,pos)
  11566. {
  11567. var tddiv = $("<td align='"+ts.p.subGridModel[0].align[pos]+"'></td>").html(cell);
  11568. $(trdiv).append(tddiv);
  11569. };
  11570. var subGridXml = function(sjxml, sbid){
  11571. var tddiv, i, sgmap,
  11572. dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
  11573. trdiv = $("<tr></tr>");
  11574. for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
  11575. tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
  11576. $(tddiv).html(ts.p.subGridModel[0].name[i]);
  11577. $(tddiv).width( ts.p.subGridModel[0].width[i]);
  11578. $(trdiv).append(tddiv);
  11579. }
  11580. $(dummy).append(trdiv);
  11581. if (sjxml){
  11582. sgmap = ts.p.xmlReader.subgrid;
  11583. $(sgmap.root+" "+sgmap.row, sjxml).each( function(){
  11584. trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>");
  11585. if(sgmap.repeatitems === true) {
  11586. $(sgmap.cell,this).each( function(i) {
  11587. subGridCell(trdiv, $(this).text() || '&#160;',i);
  11588. });
  11589. } else {
  11590. var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;
  11591. if (f) {
  11592. for (i=0;i<f.length;i++) {
  11593. subGridCell(trdiv, $(f[i],this).text() || '&#160;',i);
  11594. }
  11595. }
  11596. }
  11597. $(dummy).append(trdiv);
  11598. });
  11599. }
  11600. var pID = $("table:first",ts.grid.bDiv).attr("id")+"_";
  11601. $("#"+$.jgrid.jqID(pID+sbid)).append(dummy);
  11602. ts.grid.hDiv.loading = false;
  11603. $("#load_"+$.jgrid.jqID(ts.p.id)).hide();
  11604. return false;
  11605. };
  11606. var subGridJson = function(sjxml, sbid){
  11607. var tddiv,result,i,cur, sgmap,j,
  11608. dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
  11609. trdiv = $("<tr></tr>");
  11610. for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
  11611. tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
  11612. $(tddiv).html(ts.p.subGridModel[0].name[i]);
  11613. $(tddiv).width( ts.p.subGridModel[0].width[i]);
  11614. $(trdiv).append(tddiv);
  11615. }
  11616. $(dummy).append(trdiv);
  11617. if (sjxml){
  11618. sgmap = ts.p.jsonReader.subgrid;
  11619. result = $.jgrid.getAccessor(sjxml, sgmap.root);
  11620. if ( result !== undefined ) {
  11621. for (i=0;i<result.length;i++) {
  11622. cur = result[i];
  11623. trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>");
  11624. if(sgmap.repeatitems === true) {
  11625. if(sgmap.cell) { cur=cur[sgmap.cell]; }
  11626. for (j=0;j<cur.length;j++) {
  11627. subGridCell(trdiv, cur[j] || '&#160;',j);
  11628. }
  11629. } else {
  11630. var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;
  11631. if(f.length) {
  11632. for (j=0;j<f.length;j++) {
  11633. subGridCell(trdiv, cur[f[j]] || '&#160;',j);
  11634. }
  11635. }
  11636. }
  11637. $(dummy).append(trdiv);
  11638. }
  11639. }
  11640. }
  11641. var pID = $("table:first",ts.grid.bDiv).attr("id")+"_";
  11642. $("#"+$.jgrid.jqID(pID+sbid)).append(dummy);
  11643. ts.grid.hDiv.loading = false;
  11644. $("#load_"+$.jgrid.jqID(ts.p.id)).hide();
  11645. return false;
  11646. };
  11647. var populatesubgrid = function( rd )
  11648. {
  11649. var sid,dp, i, j;
  11650. sid = $(rd).attr("id");
  11651. dp = {nd_: (new Date().getTime())};
  11652. dp[ts.p.prmNames.subgridid]=sid;
  11653. if(!ts.p.subGridModel[0]) { return false; }
  11654. if(ts.p.subGridModel[0].params) {
  11655. for(j=0; j < ts.p.subGridModel[0].params.length; j++) {
  11656. for(i=0; i<ts.p.colModel.length; i++) {
  11657. if(ts.p.colModel[i].name === ts.p.subGridModel[0].params[j]) {
  11658. dp[ts.p.colModel[i].name]= $("td:eq("+i+")",rd).text().replace(/\&#160\;/ig,'');
  11659. }
  11660. }
  11661. }
  11662. }
  11663. if(!ts.grid.hDiv.loading) {
  11664. ts.grid.hDiv.loading = true;
  11665. $("#load_"+$.jgrid.jqID(ts.p.id)).show();
  11666. if(!ts.p.subgridtype) { ts.p.subgridtype = ts.p.datatype; }
  11667. if($.isFunction(ts.p.subgridtype)) {
  11668. ts.p.subgridtype.call(ts, dp);
  11669. } else {
  11670. ts.p.subgridtype = ts.p.subgridtype.toLowerCase();
  11671. }
  11672. switch(ts.p.subgridtype) {
  11673. case "xml":
  11674. case "json":
  11675. $.ajax($.extend({
  11676. type:ts.p.mtype,
  11677. url: $.isFunction(ts.p.subGridUrl) ? ts.p.subGridUrl.call(ts, dp) : ts.p.subGridUrl,
  11678. dataType:ts.p.subgridtype,
  11679. data: $.isFunction(ts.p.serializeSubGridData)? ts.p.serializeSubGridData.call(ts, dp) : dp,
  11680. complete: function(sxml) {
  11681. if(ts.p.subgridtype === "xml") {
  11682. subGridXml(sxml.responseXML, sid);
  11683. } else {
  11684. subGridJson($.jgrid.parse(sxml.responseText),sid);
  11685. }
  11686. sxml=null;
  11687. }
  11688. }, $.jgrid.ajaxOptions, ts.p.ajaxSubgridOptions || {}));
  11689. break;
  11690. }
  11691. }
  11692. return false;
  11693. };
  11694. var _id, pID,atd, nhc=0, bfsc, $r;
  11695. $.each(ts.p.colModel,function(){
  11696. if(this.hidden === true || this.name === 'rn' || this.name === 'cb') {
  11697. nhc++;
  11698. }
  11699. });
  11700. var len = ts.rows.length, i=1;
  11701. if( sind !== undefined && sind > 0) {
  11702. i = sind;
  11703. len = sind+1;
  11704. }
  11705. while(i < len) {
  11706. if($(ts.rows[i]).hasClass('jqgrow')) {
  11707. if(ts.p.scroll) {
  11708. $(ts.rows[i].cells[pos]).unbind('click');
  11709. }
  11710. $(ts.rows[i].cells[pos]).bind('click', function() {
  11711. var tr = $(this).parent("tr")[0];
  11712. pID = ts.p.id;
  11713. _id = tr.id;
  11714. $r = $("#" + pID + "_" + _id + "_expandedContent");
  11715. if($(this).hasClass("sgcollapsed")) {
  11716. bfsc = $(ts).triggerHandler("jqGridSubGridBeforeExpand", [pID + "_" + _id, _id]);
  11717. bfsc = (bfsc === false || bfsc === 'stop') ? false : true;
  11718. if(bfsc && $.isFunction(ts.p.subGridBeforeExpand)) {
  11719. bfsc = ts.p.subGridBeforeExpand.call(ts, pID+"_"+_id,_id);
  11720. }
  11721. if(bfsc === false) {return false;}
  11722. if(ts.p.subGridOptions.reloadOnExpand === true || ( ts.p.subGridOptions.reloadOnExpand === false && !$r.hasClass('ui-subgrid') ) ) {
  11723. atd = pos >=1 ? "<td colspan='"+pos+"'>&#160;</td>":"";
  11724. $(tr).after( "<tr role='row' id='" + pID + "_" + _id + "_expandedContent" + "' class='ui-subgrid ui-sg-expanded'>"+atd+"<td class='ui-widget-content subgrid-cell'><span class='ui-icon "+ts.p.subGridOptions.openicon+"'></span></td><td colspan='"+parseInt(ts.p.colNames.length-1-nhc,10)+"' class='ui-widget-content subgrid-data'><div id="+pID+"_"+_id+" class='tablediv'></div></td></tr>" );
  11725. $(ts).triggerHandler("jqGridSubGridRowExpanded", [pID + "_" + _id, _id]);
  11726. if( $.isFunction(ts.p.subGridRowExpanded)) {
  11727. ts.p.subGridRowExpanded.call(ts, pID+"_"+ _id,_id);
  11728. } else {
  11729. populatesubgrid(tr);
  11730. }
  11731. } else {
  11732. $r.show().removeClass("ui-sg-collapsed").addClass("ui-sg-expanded");
  11733. }
  11734. $(this).html("<a style='cursor:pointer;'><span class='ui-icon "+ts.p.subGridOptions.minusicon+"'></span></a>").removeClass("sgcollapsed").addClass("sgexpanded");
  11735. if(ts.p.subGridOptions.selectOnExpand) {
  11736. $(ts).jqGrid('setSelection',_id);
  11737. }
  11738. } else if($(this).hasClass("sgexpanded")) {
  11739. bfsc = $(ts).triggerHandler("jqGridSubGridRowColapsed", [pID + "_" + _id, _id]);
  11740. bfsc = (bfsc === false || bfsc === 'stop') ? false : true;
  11741. if( bfsc && $.isFunction(ts.p.subGridRowColapsed)) {
  11742. bfsc = ts.p.subGridRowColapsed.call(ts, pID+"_"+_id,_id );
  11743. }
  11744. if(bfsc===false) {return false;}
  11745. if(ts.p.subGridOptions.reloadOnExpand === true) {
  11746. $r.remove(".ui-subgrid");
  11747. } else if($r.hasClass('ui-subgrid')) { // incase of dynamic deleting
  11748. $r.hide().addClass("ui-sg-collapsed").removeClass("ui-sg-expanded");;
  11749. }
  11750. $(this).html("<a style='cursor:pointer;'><span class='ui-icon "+ts.p.subGridOptions.plusicon+"'></span></a>").removeClass("sgexpanded").addClass("sgcollapsed");
  11751. if(ts.p.subGridOptions.selectOnCollapse) {
  11752. $(ts).jqGrid('setSelection',_id);
  11753. }
  11754. }
  11755. return false;
  11756. });
  11757. }
  11758. i++;
  11759. }
  11760. if(ts.p.subGridOptions.expandOnLoad === true) {
  11761. $(ts.rows).filter('.jqgrow').each(function(index,row){
  11762. $(row.cells[0]).click();
  11763. });
  11764. }
  11765. ts.subGridXml = function(xml,sid) {subGridXml(xml,sid);};
  11766. ts.subGridJson = function(json,sid) {subGridJson(json,sid);};
  11767. });
  11768. },
  11769. expandSubGridRow : function(rowid) {
  11770. return this.each(function () {
  11771. var $t = this;
  11772. if(!$t.grid && !rowid) {return;}
  11773. if($t.p.subGrid===true) {
  11774. var rc = $(this).jqGrid("getInd",rowid,true);
  11775. if(rc) {
  11776. var sgc = $("td.sgcollapsed",rc)[0];
  11777. if(sgc) {
  11778. $(sgc).trigger("click");
  11779. }
  11780. }
  11781. }
  11782. });
  11783. },
  11784. collapseSubGridRow : function(rowid) {
  11785. return this.each(function () {
  11786. var $t = this;
  11787. if(!$t.grid && !rowid) {return;}
  11788. if($t.p.subGrid===true) {
  11789. var rc = $(this).jqGrid("getInd",rowid,true);
  11790. if(rc) {
  11791. var sgc = $("td.sgexpanded",rc)[0];
  11792. if(sgc) {
  11793. $(sgc).trigger("click");
  11794. }
  11795. }
  11796. }
  11797. });
  11798. },
  11799. toggleSubGridRow : function(rowid) {
  11800. return this.each(function () {
  11801. var $t = this;
  11802. if(!$t.grid && !rowid) {return;}
  11803. if($t.p.subGrid===true) {
  11804. var rc = $(this).jqGrid("getInd",rowid,true);
  11805. if(rc) {
  11806. var sgc = $("td.sgcollapsed",rc)[0];
  11807. if(sgc) {
  11808. $(sgc).trigger("click");
  11809. } else {
  11810. sgc = $("td.sgexpanded",rc)[0];
  11811. if(sgc) {
  11812. $(sgc).trigger("click");
  11813. }
  11814. }
  11815. }
  11816. }
  11817. });
  11818. }
  11819. });
  11820. //module begin
  11821. $.jgrid.extend({
  11822. setTreeNode : function(i, len){
  11823. return this.each(function(){
  11824. var $t = this;
  11825. if( !$t.grid || !$t.p.treeGrid ) {return;}
  11826. var expCol = $t.p.expColInd,
  11827. expanded = $t.p.treeReader.expanded_field,
  11828. isLeaf = $t.p.treeReader.leaf_field,
  11829. level = $t.p.treeReader.level_field,
  11830. icon = $t.p.treeReader.icon_field,
  11831. loaded = $t.p.treeReader.loaded, lft, rgt, curLevel, ident,lftpos, twrap,
  11832. ldat, lf;
  11833. while(i<len) {
  11834. var ind = $.jgrid.stripPref($t.p.idPrefix, $t.rows[i].id), dind = $t.p._index[ind], expan;
  11835. ldat = $t.p.data[dind];
  11836. //$t.rows[i].level = ldat[level];
  11837. if($t.p.treeGridModel === 'nested') {
  11838. if(!ldat[isLeaf]) {
  11839. lft = parseInt(ldat[$t.p.treeReader.left_field],10);
  11840. rgt = parseInt(ldat[$t.p.treeReader.right_field],10);
  11841. // NS Model
  11842. ldat[isLeaf] = (rgt === lft+1) ? 'true' : 'false';
  11843. $t.rows[i].cells[$t.p._treeleafpos].innerHTML = ldat[isLeaf];
  11844. }
  11845. }
  11846. //else {
  11847. //row.parent_id = rd[$t.p.treeReader.parent_id_field];
  11848. //}
  11849. curLevel = parseInt(ldat[level],10);
  11850. if($t.p.tree_root_level === 0) {
  11851. ident = curLevel+1;
  11852. lftpos = curLevel;
  11853. } else {
  11854. ident = curLevel;
  11855. lftpos = curLevel -1;
  11856. }
  11857. twrap = "<div class='tree-wrap tree-wrap-"+$t.p.direction+"' style='width:"+(ident*18)+"px;'>";
  11858. twrap += "<div style='"+($t.p.direction==="rtl" ? "right:" : "left:")+(lftpos*18)+"px;' class='ui-icon ";
  11859. if(ldat[loaded] !== undefined) {
  11860. if(ldat[loaded]==="true" || ldat[loaded]===true) {
  11861. ldat[loaded] = true;
  11862. } else {
  11863. ldat[loaded] = false;
  11864. }
  11865. }
  11866. if(ldat[isLeaf] === "true" || ldat[isLeaf] === true) {
  11867. twrap += ((ldat[icon] !== undefined && ldat[icon] !== "") ? ldat[icon] : $t.p.treeIcons.leaf)+" tree-leaf treeclick";
  11868. ldat[isLeaf] = true;
  11869. lf="leaf";
  11870. } else {
  11871. ldat[isLeaf] = false;
  11872. lf="";
  11873. }
  11874. ldat[expanded] = ((ldat[expanded] === "true" || ldat[expanded] === true) ? true : false) && (ldat[loaded] || ldat[loaded] === undefined);
  11875. if(ldat[expanded] === false) {
  11876. twrap += ((ldat[isLeaf] === true) ? "'" : $t.p.treeIcons.plus+" tree-plus treeclick'");
  11877. } else {
  11878. twrap += ((ldat[isLeaf] === true) ? "'" : $t.p.treeIcons.minus+" tree-minus treeclick'");
  11879. }
  11880. twrap += "></div></div>";
  11881. $($t.rows[i].cells[expCol]).wrapInner("<span class='cell-wrapper"+lf+"'></span>").prepend(twrap);
  11882. if(curLevel !== parseInt($t.p.tree_root_level,10)) {
  11883. //var pn = $($t).jqGrid('getNodeParent',ldat);
  11884. //expan = pn && pn.hasOwnProperty(expanded) ? pn[expanded] : true;
  11885. expan = $($t).jqGrid('isVisibleNode',ldat); // overhead
  11886. if( !expan ){
  11887. $($t.rows[i]).css("display","none");
  11888. }
  11889. }
  11890. $($t.rows[i].cells[expCol])
  11891. .find("div.treeclick")
  11892. .bind("click",function(e){
  11893. var target = e.target || e.srcElement,
  11894. ind2 =$.jgrid.stripPref($t.p.idPrefix,$(target,$t.rows).closest("tr.jqgrow")[0].id),
  11895. pos = $t.p._index[ind2];
  11896. if(!$t.p.data[pos][isLeaf]){
  11897. if($t.p.data[pos][expanded]){
  11898. $($t).jqGrid("collapseRow",$t.p.data[pos]);
  11899. $($t).jqGrid("collapseNode",$t.p.data[pos]);
  11900. } else {
  11901. $($t).jqGrid("expandRow",$t.p.data[pos]);
  11902. $($t).jqGrid("expandNode",$t.p.data[pos]);
  11903. }
  11904. }
  11905. return false;
  11906. });
  11907. if($t.p.ExpandColClick === true) {
  11908. $($t.rows[i].cells[expCol])
  11909. .find("span.cell-wrapper")
  11910. .css("cursor","pointer")
  11911. .bind("click",function(e) {
  11912. var target = e.target || e.srcElement,
  11913. ind2 =$.jgrid.stripPref($t.p.idPrefix,$(target,$t.rows).closest("tr.jqgrow")[0].id),
  11914. pos = $t.p._index[ind2];
  11915. if(!$t.p.data[pos][isLeaf]){
  11916. if($t.p.data[pos][expanded]){
  11917. $($t).jqGrid("collapseRow",$t.p.data[pos]);
  11918. $($t).jqGrid("collapseNode",$t.p.data[pos]);
  11919. } else {
  11920. $($t).jqGrid("expandRow",$t.p.data[pos]);
  11921. $($t).jqGrid("expandNode",$t.p.data[pos]);
  11922. }
  11923. }
  11924. $($t).jqGrid("setSelection",ind2);
  11925. return false;
  11926. });
  11927. }
  11928. i++;
  11929. }
  11930. });
  11931. },
  11932. setTreeGrid : function() {
  11933. return this.each(function (){
  11934. var $t = this, i=0, pico, ecol = false, nm, key, tkey, dupcols=[];
  11935. if(!$t.p.treeGrid) {return;}
  11936. if(!$t.p.treedatatype ) {$.extend($t.p,{treedatatype: $t.p.datatype});}
  11937. if($t.p.loadonce) { $t.p.treedatatype = 'local'; }
  11938. $t.p.subGrid = false;$t.p.altRows =false;
  11939. $t.p.pgbuttons = false;$t.p.pginput = false;
  11940. $t.p.gridview = true;
  11941. if($t.p.rowTotal === null ) { $t.p.rowNum = 10000; }
  11942. $t.p.multiselect = false;$t.p.rowList = [];
  11943. $t.p.expColInd = 0;
  11944. pico = 'ui-icon-triangle-1-' + ($t.p.direction==="rtl" ? 'w' : 'e');
  11945. $t.p.treeIcons = $.extend({plus:pico,minus:'ui-icon-triangle-1-s',leaf:'ui-icon-radio-off'},$t.p.treeIcons || {});
  11946. if($t.p.treeGridModel === 'nested') {
  11947. $t.p.treeReader = $.extend({
  11948. level_field: "level",
  11949. left_field:"lft",
  11950. right_field: "rgt",
  11951. leaf_field: "isLeaf",
  11952. expanded_field: "expanded",
  11953. loaded: "loaded",
  11954. icon_field: "icon"
  11955. },$t.p.treeReader);
  11956. } else if($t.p.treeGridModel === 'adjacency') {
  11957. $t.p.treeReader = $.extend({
  11958. level_field: "level",
  11959. parent_id_field: "parent",
  11960. leaf_field: "isLeaf",
  11961. expanded_field: "expanded",
  11962. loaded: "loaded",
  11963. icon_field: "icon"
  11964. },$t.p.treeReader );
  11965. }
  11966. for ( key in $t.p.colModel){
  11967. if($t.p.colModel.hasOwnProperty(key)) {
  11968. nm = $t.p.colModel[key].name;
  11969. if( nm === $t.p.ExpandColumn && !ecol ) {
  11970. ecol = true;
  11971. $t.p.expColInd = i;
  11972. }
  11973. i++;
  11974. //
  11975. for(tkey in $t.p.treeReader) {
  11976. if($t.p.treeReader.hasOwnProperty(tkey) && $t.p.treeReader[tkey] === nm) {
  11977. dupcols.push(nm);
  11978. }
  11979. }
  11980. }
  11981. }
  11982. $.each($t.p.treeReader,function(j,n){
  11983. if(n && $.inArray(n, dupcols) === -1){
  11984. if(j==='leaf_field') { $t.p._treeleafpos= i; }
  11985. i++;
  11986. $t.p.colNames.push(n);
  11987. $t.p.colModel.push({name:n,width:1,hidden:true,sortable:false,resizable:false,hidedlg:true,editable:true,search:false});
  11988. }
  11989. });
  11990. });
  11991. },
  11992. expandRow: function (record){
  11993. this.each(function(){
  11994. var $t = this;
  11995. if(!$t.grid || !$t.p.treeGrid) {return;}
  11996. var childern = $($t).jqGrid("getNodeChildren",record),
  11997. //if ($($t).jqGrid("isVisibleNode",record)) {
  11998. expanded = $t.p.treeReader.expanded_field;
  11999. $(childern).each(function(){
  12000. var id = $t.p.idPrefix + $.jgrid.getAccessor(this,$t.p.localReader.id);
  12001. $($($t).jqGrid('getGridRowById', id)).css("display","");
  12002. if(this[expanded]) {
  12003. $($t).jqGrid("expandRow",this);
  12004. }
  12005. });
  12006. //}
  12007. });
  12008. },
  12009. collapseRow : function (record) {
  12010. this.each(function(){
  12011. var $t = this;
  12012. if(!$t.grid || !$t.p.treeGrid) {return;}
  12013. var childern = $($t).jqGrid("getNodeChildren",record),
  12014. expanded = $t.p.treeReader.expanded_field;
  12015. $(childern).each(function(){
  12016. var id = $t.p.idPrefix + $.jgrid.getAccessor(this,$t.p.localReader.id);
  12017. $($($t).jqGrid('getGridRowById', id)).css("display","none");
  12018. if(this[expanded]){
  12019. $($t).jqGrid("collapseRow",this);
  12020. }
  12021. });
  12022. });
  12023. },
  12024. // NS ,adjacency models
  12025. getRootNodes : function(currentview) {
  12026. var result = [];
  12027. this.each(function(){
  12028. var $t = this, level, parent_id, view;
  12029. if(!$t.grid || !$t.p.treeGrid) {return;}
  12030. if( typeof currentview !== 'boolean') {
  12031. currentview = false;
  12032. }
  12033. if(currentview) {
  12034. view = $($t).jqGrid('getRowData', null, true);
  12035. } else {
  12036. view = $t.p.data;
  12037. }
  12038. switch ($t.p.treeGridModel) {
  12039. case 'nested' :
  12040. level = $t.p.treeReader.level_field;
  12041. $(view).each(function() {
  12042. if(parseInt(this[level],10) === parseInt($t.p.tree_root_level,10)) {
  12043. if(currentview){
  12044. result.push($t.p.data[$t.p._index[this[$t.p.keyName]]]);
  12045. } else {
  12046. result.push(this);
  12047. }
  12048. }
  12049. });
  12050. break;
  12051. case 'adjacency' :
  12052. parent_id = $t.p.treeReader.parent_id_field;
  12053. $(view).each(function(){
  12054. if(this[parent_id] === null || String(this[parent_id]).toLowerCase() === "null") {
  12055. if(currentview){
  12056. result.push($t.p.data[$t.p._index[this[$t.p.keyName]]]);
  12057. } else {
  12058. result.push(this);
  12059. }
  12060. }
  12061. });
  12062. break;
  12063. }
  12064. });
  12065. return result;
  12066. },
  12067. getNodeDepth : function(rc) {
  12068. var ret = null;
  12069. this.each(function(){
  12070. if(!this.grid || !this.p.treeGrid) {return;}
  12071. var $t = this;
  12072. switch ($t.p.treeGridModel) {
  12073. case 'nested' :
  12074. var level = $t.p.treeReader.level_field;
  12075. ret = parseInt(rc[level],10) - parseInt($t.p.tree_root_level,10);
  12076. break;
  12077. case 'adjacency' :
  12078. ret = $($t).jqGrid("getNodeAncestors",rc).length;
  12079. break;
  12080. }
  12081. });
  12082. return ret;
  12083. },
  12084. getNodeParent : function(rc) {
  12085. var result = null;
  12086. this.each(function(){
  12087. var $t = this;
  12088. if(!$t.grid || !$t.p.treeGrid) {return;}
  12089. switch ($t.p.treeGridModel) {
  12090. case 'nested' :
  12091. var lftc = $t.p.treeReader.left_field,
  12092. rgtc = $t.p.treeReader.right_field,
  12093. levelc = $t.p.treeReader.level_field,
  12094. lft = parseInt(rc[lftc],10), rgt = parseInt(rc[rgtc],10), level = parseInt(rc[levelc],10);
  12095. $(this.p.data).each(function(){
  12096. if(parseInt(this[levelc],10) === level-1 && parseInt(this[lftc],10) < lft && parseInt(this[rgtc],10) > rgt) {
  12097. result = this;
  12098. return false;
  12099. }
  12100. });
  12101. break;
  12102. case 'adjacency' :
  12103. var parent_id = $t.p.treeReader.parent_id_field,
  12104. dtid = $t.p.localReader.id,
  12105. ind = rc[dtid], pos = $t.p._index[ind];
  12106. while(pos--) {
  12107. if($t.p.data[pos][dtid] === $.jgrid.stripPref($t.p.idPrefix, rc[parent_id])) {
  12108. result = $t.p.data[pos];
  12109. break;
  12110. }
  12111. }
  12112. break;
  12113. }
  12114. });
  12115. return result;
  12116. },
  12117. getNodeChildren : function(rc) {
  12118. var result = [];
  12119. this.each(function(){
  12120. var $t = this;
  12121. if(!$t.grid || !$t.p.treeGrid) {return;}
  12122. switch ($t.p.treeGridModel) {
  12123. case 'nested' :
  12124. var lftc = $t.p.treeReader.left_field,
  12125. rgtc = $t.p.treeReader.right_field,
  12126. levelc = $t.p.treeReader.level_field,
  12127. lft = parseInt(rc[lftc],10), rgt = parseInt(rc[rgtc],10), level = parseInt(rc[levelc],10);
  12128. $(this.p.data).each(function(){
  12129. if(parseInt(this[levelc],10) === level+1 && parseInt(this[lftc],10) > lft && parseInt(this[rgtc],10) < rgt) {
  12130. result.push(this);
  12131. }
  12132. });
  12133. break;
  12134. case 'adjacency' :
  12135. var parent_id = $t.p.treeReader.parent_id_field,
  12136. dtid = $t.p.localReader.id;
  12137. $(this.p.data).each(function(){
  12138. if(this[parent_id] == $.jgrid.stripPref($t.p.idPrefix, rc[dtid])) {
  12139. result.push(this);
  12140. }
  12141. });
  12142. break;
  12143. }
  12144. });
  12145. return result;
  12146. },
  12147. getFullTreeNode : function(rc, expand) {
  12148. var result = [];
  12149. this.each(function(){
  12150. var $t = this, len,expanded = $t.p.treeReader.expanded_field;
  12151. if(!$t.grid || !$t.p.treeGrid) {return;}
  12152. if(expand == null || typeof expand !== 'boolean') {
  12153. expand = false;
  12154. }
  12155. switch ($t.p.treeGridModel) {
  12156. case 'nested' :
  12157. var lftc = $t.p.treeReader.left_field,
  12158. rgtc = $t.p.treeReader.right_field,
  12159. levelc = $t.p.treeReader.level_field,
  12160. lft = parseInt(rc[lftc],10), rgt = parseInt(rc[rgtc],10), level = parseInt(rc[levelc],10);
  12161. $(this.p.data).each(function(){
  12162. if(parseInt(this[levelc],10) >= level && parseInt(this[lftc],10) >= lft && parseInt(this[lftc],10) <= rgt) {
  12163. if(expand) { this[expanded] = true; }
  12164. result.push(this);
  12165. }
  12166. });
  12167. break;
  12168. case 'adjacency' :
  12169. if(rc) {
  12170. result.push(rc);
  12171. var parent_id = $t.p.treeReader.parent_id_field,
  12172. dtid = $t.p.localReader.id;
  12173. $(this.p.data).each(function(i){
  12174. len = result.length;
  12175. for (i = 0; i < len; i++) {
  12176. if ($.jgrid.stripPref($t.p.idPrefix, result[i][dtid]) === this[parent_id]) {
  12177. if(expand) { this[expanded] = true; }
  12178. result.push(this);
  12179. break;
  12180. }
  12181. }
  12182. });
  12183. }
  12184. break;
  12185. }
  12186. });
  12187. return result;
  12188. },
  12189. // End NS, adjacency Model
  12190. getNodeAncestors : function(rc) {
  12191. var ancestors = [];
  12192. this.each(function(){
  12193. if(!this.grid || !this.p.treeGrid) {return;}
  12194. var parent = $(this).jqGrid("getNodeParent",rc);
  12195. while (parent) {
  12196. ancestors.push(parent);
  12197. parent = $(this).jqGrid("getNodeParent",parent);
  12198. }
  12199. });
  12200. return ancestors;
  12201. },
  12202. isVisibleNode : function(rc) {
  12203. var result = true;
  12204. this.each(function(){
  12205. var $t = this;
  12206. if(!$t.grid || !$t.p.treeGrid) {return;}
  12207. var ancestors = $($t).jqGrid("getNodeAncestors",rc),
  12208. expanded = $t.p.treeReader.expanded_field;
  12209. $(ancestors).each(function(){
  12210. result = result && this[expanded];
  12211. if(!result) {return false;}
  12212. });
  12213. });
  12214. return result;
  12215. },
  12216. isNodeLoaded : function(rc) {
  12217. var result;
  12218. this.each(function(){
  12219. var $t = this;
  12220. if(!$t.grid || !$t.p.treeGrid) {return;}
  12221. var isLeaf = $t.p.treeReader.leaf_field,
  12222. loaded = $t.p.treeReader.loaded;
  12223. if(rc !== undefined ) {
  12224. if(rc[loaded] !== undefined) {
  12225. result = rc[loaded];
  12226. } else if( rc[isLeaf] || $($t).jqGrid("getNodeChildren",rc).length > 0){
  12227. result = true;
  12228. } else {
  12229. result = false;
  12230. }
  12231. } else {
  12232. result = false;
  12233. }
  12234. });
  12235. return result;
  12236. },
  12237. expandNode : function(rc) {
  12238. return this.each(function(){
  12239. if(!this.grid || !this.p.treeGrid) {return;}
  12240. var expanded = this.p.treeReader.expanded_field,
  12241. parent = this.p.treeReader.parent_id_field,
  12242. loaded = this.p.treeReader.loaded,
  12243. level = this.p.treeReader.level_field,
  12244. lft = this.p.treeReader.left_field,
  12245. rgt = this.p.treeReader.right_field;
  12246. if(!rc[expanded]) {
  12247. var id = $.jgrid.getAccessor(rc,this.p.localReader.id);
  12248. var rc1 = $("#" + this.p.idPrefix + $.jgrid.jqID(id),this.grid.bDiv)[0];
  12249. var position = this.p._index[id];
  12250. if( $(this).jqGrid("isNodeLoaded",this.p.data[position]) ) {
  12251. rc[expanded] = true;
  12252. $("div.treeclick",rc1).removeClass(this.p.treeIcons.plus+" tree-plus").addClass(this.p.treeIcons.minus+" tree-minus");
  12253. } else if (!this.grid.hDiv.loading) {
  12254. rc[expanded] = true;
  12255. $("div.treeclick",rc1).removeClass(this.p.treeIcons.plus+" tree-plus").addClass(this.p.treeIcons.minus+" tree-minus");
  12256. this.p.treeANode = rc1.rowIndex;
  12257. this.p.datatype = this.p.treedatatype;
  12258. if(this.p.treeGridModel === 'nested') {
  12259. $(this).jqGrid("setGridParam",{postData:{nodeid:id,n_left:rc[lft],n_right:rc[rgt],n_level:rc[level]}});
  12260. } else {
  12261. $(this).jqGrid("setGridParam",{postData:{nodeid:id,parentid:rc[parent],n_level:rc[level]}} );
  12262. }
  12263. $(this).trigger("reloadGrid");
  12264. rc[loaded] = true;
  12265. if(this.p.treeGridModel === 'nested') {
  12266. $(this).jqGrid("setGridParam",{postData:{nodeid:'',n_left:'',n_right:'',n_level:''}});
  12267. } else {
  12268. $(this).jqGrid("setGridParam",{postData:{nodeid:'',parentid:'',n_level:''}});
  12269. }
  12270. }
  12271. }
  12272. });
  12273. },
  12274. collapseNode : function(rc) {
  12275. return this.each(function(){
  12276. if(!this.grid || !this.p.treeGrid) {return;}
  12277. var expanded = this.p.treeReader.expanded_field;
  12278. if(rc[expanded]) {
  12279. rc[expanded] = false;
  12280. var id = $.jgrid.getAccessor(rc,this.p.localReader.id);
  12281. var rc1 = $("#" + this.p.idPrefix + $.jgrid.jqID(id),this.grid.bDiv)[0];
  12282. $("div.treeclick",rc1).removeClass(this.p.treeIcons.minus+" tree-minus").addClass(this.p.treeIcons.plus+" tree-plus");
  12283. }
  12284. });
  12285. },
  12286. SortTree : function( sortname, newDir, st, datefmt) {
  12287. return this.each(function(){
  12288. if(!this.grid || !this.p.treeGrid) {return;}
  12289. var i, len,
  12290. rec, records = [], $t = this, query, roots,
  12291. rt = $(this).jqGrid("getRootNodes", $t.p.search);
  12292. // Sorting roots
  12293. query = $.jgrid.from.call(this, rt);
  12294. query.orderBy(sortname,newDir,st, datefmt);
  12295. roots = query.select();
  12296. // Sorting children
  12297. for (i = 0, len = roots.length; i < len; i++) {
  12298. rec = roots[i];
  12299. records.push(rec);
  12300. $(this).jqGrid("collectChildrenSortTree",records, rec, sortname, newDir,st, datefmt);
  12301. }
  12302. $.each(records, function(index) {
  12303. var id = $.jgrid.getAccessor(this,$t.p.localReader.id);
  12304. $('#'+$.jgrid.jqID($t.p.id)+ ' tbody tr:eq('+index+')').after($('tr#'+$.jgrid.jqID(id),$t.grid.bDiv));
  12305. });
  12306. query = null;roots=null;records=null;
  12307. });
  12308. },
  12309. searchTree : function ( recs ) {
  12310. var i, len = recs.length || 0, res=[], lid, roots=[], result=[],tid;
  12311. this.each(function(){
  12312. if(!this.grid || !this.p.treeGrid) {return;}
  12313. if(len) {
  12314. lid = this.p.localReader.id;
  12315. for(i = 0; i < len ; i++) {
  12316. res = $(this).jqGrid('getNodeAncestors', recs[i]);
  12317. if(!res.length) { // is root or leaf root
  12318. res.push(recs[i]);
  12319. }
  12320. tid = res[res.length-1][lid]; // root node
  12321. if($.inArray(tid, roots ) !== -1) { // ignore repeated
  12322. continue;
  12323. } else {
  12324. roots.push( tid );
  12325. }
  12326. res = $(this).jqGrid('getFullTreeNode', res[res.length-1], true);
  12327. result = result.concat( res );
  12328. }
  12329. }
  12330. });
  12331. return result;
  12332. },
  12333. collectChildrenSortTree : function(records, rec, sortname, newDir,st, datefmt) {
  12334. return this.each(function(){
  12335. if(!this.grid || !this.p.treeGrid) {return;}
  12336. var i, len,
  12337. child, ch, query, children;
  12338. ch = $(this).jqGrid("getNodeChildren",rec);
  12339. query = $.jgrid.from.call(this, ch);
  12340. query.orderBy(sortname, newDir, st, datefmt);
  12341. children = query.select();
  12342. for (i = 0, len = children.length; i < len; i++) {
  12343. child = children[i];
  12344. records.push(child);
  12345. $(this).jqGrid("collectChildrenSortTree",records, child, sortname, newDir, st, datefmt);
  12346. }
  12347. });
  12348. },
  12349. // experimental
  12350. setTreeRow : function(rowid, data) {
  12351. var success=false;
  12352. this.each(function(){
  12353. var t = this;
  12354. if(!t.grid || !t.p.treeGrid) {return;}
  12355. success = $(t).jqGrid("setRowData",rowid,data);
  12356. });
  12357. return success;
  12358. },
  12359. delTreeNode : function (rowid) {
  12360. return this.each(function () {
  12361. var $t = this, rid = $t.p.localReader.id, i,
  12362. left = $t.p.treeReader.left_field,
  12363. right = $t.p.treeReader.right_field, myright, width, res, key;
  12364. if(!$t.grid || !$t.p.treeGrid) {return;}
  12365. var rc = $t.p._index[rowid];
  12366. if (rc !== undefined) {
  12367. // nested
  12368. myright = parseInt($t.p.data[rc][right],10);
  12369. width = myright - parseInt($t.p.data[rc][left],10) + 1;
  12370. var dr = $($t).jqGrid("getFullTreeNode",$t.p.data[rc]);
  12371. if(dr.length>0){
  12372. for (i=0;i<dr.length;i++){
  12373. $($t).jqGrid("delRowData",dr[i][rid]);
  12374. }
  12375. }
  12376. if( $t.p.treeGridModel === "nested") {
  12377. // ToDo - update grid data
  12378. res = $.jgrid.from.call($t, $t.p.data)
  12379. .greater(left,myright,{stype:'integer'})
  12380. .select();
  12381. if(res.length) {
  12382. for( key in res) {
  12383. if(res.hasOwnProperty(key)) {
  12384. res[key][left] = parseInt(res[key][left],10) - width ;
  12385. }
  12386. }
  12387. }
  12388. res = $.jgrid.from.call($t, $t.p.data)
  12389. .greater(right,myright,{stype:'integer'})
  12390. .select();
  12391. if(res.length) {
  12392. for( key in res) {
  12393. if(res.hasOwnProperty(key)) {
  12394. res[key][right] = parseInt(res[key][right],10) - width ;
  12395. }
  12396. }
  12397. }
  12398. }
  12399. }
  12400. });
  12401. },
  12402. addChildNode : function( nodeid, parentid, data, expandData ) {
  12403. //return this.each(function(){
  12404. var $t = this[0];
  12405. if(data) {
  12406. // we suppose tha the id is autoincremet and
  12407. var expanded = $t.p.treeReader.expanded_field,
  12408. isLeaf = $t.p.treeReader.leaf_field,
  12409. level = $t.p.treeReader.level_field,
  12410. //icon = $t.p.treeReader.icon_field,
  12411. parent = $t.p.treeReader.parent_id_field,
  12412. left = $t.p.treeReader.left_field,
  12413. right = $t.p.treeReader.right_field,
  12414. loaded = $t.p.treeReader.loaded,
  12415. method, parentindex, parentdata, parentlevel, i, len, max=0, rowind = parentid, leaf, maxright;
  12416. if(expandData===undefined) {expandData = false;}
  12417. if ( nodeid == null ) {
  12418. i = $t.p.data.length-1;
  12419. if( i>= 0 ) {
  12420. while(i>=0){max = Math.max(max, parseInt($t.p.data[i][$t.p.localReader.id],10)); i--;}
  12421. }
  12422. nodeid = max+1;
  12423. }
  12424. var prow = $($t).jqGrid('getInd', parentid);
  12425. leaf = false;
  12426. // if not a parent we assume root
  12427. if ( parentid === undefined || parentid === null || parentid==="") {
  12428. parentid = null;
  12429. rowind = null;
  12430. method = 'last';
  12431. parentlevel = $t.p.tree_root_level;
  12432. i = $t.p.data.length+1;
  12433. } else {
  12434. method = 'after';
  12435. parentindex = $t.p._index[parentid];
  12436. parentdata = $t.p.data[parentindex];
  12437. parentid = parentdata[$t.p.localReader.id];
  12438. parentlevel = parseInt(parentdata[level],10)+1;
  12439. var childs = $($t).jqGrid('getFullTreeNode', parentdata);
  12440. // if there are child nodes get the last index of it
  12441. if(childs.length) {
  12442. i = childs[childs.length-1][$t.p.localReader.id];
  12443. rowind = i;
  12444. i = $($t).jqGrid('getInd',rowind)+1;
  12445. } else {
  12446. i = $($t).jqGrid('getInd', parentid)+1;
  12447. }
  12448. // if the node is leaf
  12449. if(parentdata[isLeaf]) {
  12450. leaf = true;
  12451. parentdata[expanded] = true;
  12452. //var prow = $($t).jqGrid('getInd', parentid);
  12453. $($t.rows[prow])
  12454. .find("span.cell-wrapperleaf").removeClass("cell-wrapperleaf").addClass("cell-wrapper")
  12455. .end()
  12456. .find("div.tree-leaf").removeClass($t.p.treeIcons.leaf+" tree-leaf").addClass($t.p.treeIcons.minus+" tree-minus");
  12457. $t.p.data[parentindex][isLeaf] = false;
  12458. parentdata[loaded] = true;
  12459. }
  12460. }
  12461. len = i+1;
  12462. if( data[expanded]===undefined) {data[expanded]= false;}
  12463. if( data[loaded]===undefined ) { data[loaded] = false;}
  12464. data[level] = parentlevel;
  12465. if( data[isLeaf]===undefined) {data[isLeaf]= true;}
  12466. if( $t.p.treeGridModel === "adjacency") {
  12467. data[parent] = parentid;
  12468. }
  12469. if( $t.p.treeGridModel === "nested") {
  12470. // this method requiere more attention
  12471. var query, res, key;
  12472. //maxright = parseInt(maxright,10);
  12473. // ToDo - update grid data
  12474. if(parentid !== null) {
  12475. maxright = parseInt(parentdata[right],10);
  12476. query = $.jgrid.from.call($t, $t.p.data);
  12477. query = query.greaterOrEquals(right,maxright,{stype:'integer'});
  12478. res = query.select();
  12479. if(res.length) {
  12480. for( key in res) {
  12481. if(res.hasOwnProperty(key)) {
  12482. res[key][left] = res[key][left] > maxright ? parseInt(res[key][left],10) +2 : res[key][left];
  12483. res[key][right] = res[key][right] >= maxright ? parseInt(res[key][right],10) +2 : res[key][right];
  12484. }
  12485. }
  12486. }
  12487. data[left] = maxright;
  12488. data[right]= maxright+1;
  12489. } else {
  12490. maxright = parseInt( $($t).jqGrid('getCol', right, false, 'max'), 10);
  12491. res = $.jgrid.from.call($t, $t.p.data)
  12492. .greater(left,maxright,{stype:'integer'})
  12493. .select();
  12494. if(res.length) {
  12495. for( key in res) {
  12496. if(res.hasOwnProperty(key)) {
  12497. res[key][left] = parseInt(res[key][left],10) +2 ;
  12498. }
  12499. }
  12500. }
  12501. res = $.jgrid.from.call($t, $t.p.data)
  12502. .greater(right,maxright,{stype:'integer'})
  12503. .select();
  12504. if(res.length) {
  12505. for( key in res) {
  12506. if(res.hasOwnProperty(key)) {
  12507. res[key][right] = parseInt(res[key][right],10) +2 ;
  12508. }
  12509. }
  12510. }
  12511. data[left] = maxright+1;
  12512. data[right] = maxright + 2;
  12513. }
  12514. }
  12515. if( parentid === null || $($t).jqGrid("isNodeLoaded",parentdata) || leaf ) {
  12516. $($t).jqGrid('addRowData', nodeid, data, method, rowind);
  12517. $($t).jqGrid('setTreeNode', i, len);
  12518. }
  12519. if(parentdata && !parentdata[expanded] && expandData) {
  12520. $($t.rows[prow])
  12521. .find("div.treeclick")
  12522. .click();
  12523. }
  12524. }
  12525. //});
  12526. }
  12527. });
  12528. //module begin
  12529. $.fn.jqDrag=function(h){return i(this,h,'d');};
  12530. $.fn.jqResize=function(h,ar){return i(this,h,'r',ar);};
  12531. $.jqDnR={
  12532. dnr:{},
  12533. e:0,
  12534. drag:function(v){
  12535. if(M.k == 'd'){E.css({left:M.X+v.pageX-M.pX,top:M.Y+v.pageY-M.pY});}
  12536. else {
  12537. E.css({width:Math.max(v.pageX-M.pX+M.W,0),height:Math.max(v.pageY-M.pY+M.H,0)});
  12538. if(M1){E1.css({width:Math.max(v.pageX-M1.pX+M1.W,0),height:Math.max(v.pageY-M1.pY+M1.H,0)});}
  12539. }
  12540. return false;
  12541. },
  12542. stop:function(){
  12543. //E.css('opacity',M.o);
  12544. $(document).unbind('mousemove',J.drag).unbind('mouseup',J.stop);
  12545. }
  12546. };
  12547. var J=$.jqDnR,M=J.dnr,E=J.e,E1,M1,
  12548. i=function(e,h,k,aR){
  12549. return e.each(function(){
  12550. h=(h)?$(h,e):e;
  12551. h.bind('mousedown',{e:e,k:k},function(v){
  12552. var d=v.data,p={};E=d.e;E1 = aR ? $(aR) : false;
  12553. // attempt utilization of dimensions plugin to fix IE issues
  12554. if(E.css('position') != 'relative'){try{E.position(p);}catch(e){}}
  12555. M={
  12556. X:p.left||f('left')||0,
  12557. Y:p.top||f('top')||0,
  12558. W:f('width')||E[0].scrollWidth||0,
  12559. H:f('height')||E[0].scrollHeight||0,
  12560. pX:v.pageX,
  12561. pY:v.pageY,
  12562. k:d.k
  12563. //o:E.css('opacity')
  12564. };
  12565. // also resize
  12566. if(E1 && d.k != 'd'){
  12567. M1={
  12568. X:p.left||f1('left')||0,
  12569. Y:p.top||f1('top')||0,
  12570. W:E1[0].offsetWidth||f1('width')||0,
  12571. H:E1[0].offsetHeight||f1('height')||0,
  12572. pX:v.pageX,
  12573. pY:v.pageY,
  12574. k:d.k
  12575. };
  12576. } else {M1 = false;}
  12577. //E.css({opacity:0.8});
  12578. if($("input.hasDatepicker",E[0])[0]) {
  12579. try {$("input.hasDatepicker",E[0]).datepicker('hide');}catch (dpe){}
  12580. }
  12581. $(document).mousemove($.jqDnR.drag).mouseup($.jqDnR.stop);
  12582. return false;
  12583. });
  12584. });
  12585. },
  12586. f=function(k){return parseInt(E.css(k),10)||false;},
  12587. f1=function(k){return parseInt(E1.css(k),10)||false;};
  12588. //module begin
  12589. $.fn.jqm=function(o){
  12590. var p={
  12591. overlay: 50,
  12592. closeoverlay : true,
  12593. overlayClass: 'jqmOverlay',
  12594. closeClass: 'jqmClose',
  12595. trigger: '.jqModal',
  12596. ajax: F,
  12597. ajaxText: '',
  12598. target: F,
  12599. modal: F,
  12600. toTop: F,
  12601. onShow: F,
  12602. onHide: F,
  12603. onLoad: F
  12604. };
  12605. return this.each(function(){if(this._jqm){ return H[this._jqm].c=$.extend({},H[this._jqm].c,o);} s++;this._jqm=s;
  12606. H[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s};
  12607. if(p.trigger){$(this).jqmAddTrigger(p.trigger);}
  12608. });};
  12609. $.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide');};
  12610. $.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow');};
  12611. $.fn.jqmShow=function(t){return this.each(function(){$.jqm.open(this._jqm,t);});};
  12612. $.fn.jqmHide=function(t){return this.each(function(){$.jqm.close(this._jqm,t);});};
  12613. $.jqm = {
  12614. hash:{},
  12615. 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);
  12616. if(c.modal) {if(!A[0]){setTimeout(function(){ new L('bind');},1); }A.push(s);}
  12617. else if(c.overlay > 0) {if(c.closeoverlay) {h.w.jqmAddClose(o);}}
  12618. else {o=F;}
  12619. h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):F;
  12620. 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;
  12621. 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);});}
  12622. else if(cc){h.w.jqmAddClose($(cc,h.w));}
  12623. if(c.toTop&&h.o){h.w.before('<span id="jqmP'+h.w[0]._jqm+'"></span>').insertAfter(h.o);}
  12624. (c.onShow)?c.onShow(h):h.w.show();e(h);return F;
  12625. },
  12626. close:function(s){var h=H[s];if(!h.a){return F;}h.a=F;
  12627. if(A[0]){A.pop();if(!A[0]){new L('unbind');}}
  12628. if(h.c.toTop&&h.o){$('#jqmP'+h.w[0]._jqm).after(h.w).remove();}
  12629. if(h.c.onHide){h.c.onHide(h);}else{h.w.hide();if(h.o){h.o.remove();}} return F;
  12630. },
  12631. params:{}};
  12632. var s=0,H=$.jqm.hash,A=[],F=false,
  12633. e=function(h){f(h);},
  12634. f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(_){}},
  12635. L=function(t){$(document)[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m);},
  12636. m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r){$('.jqmID'+h.s).each(function(){var $self=$(this),offset=$self.offset();if(offset.top<=e.pageY && e.pageY<=offset.top+$self.height() && offset.left<=e.pageX && e.pageX<=offset.left+$self.width()){r=false;return false;}});f(h);}return !r;},
  12637. hs=function(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function() {
  12638. 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;});}
  12639. this[c].push(s);});});};
  12640. //module begin
  12641. $.fmatter = {};
  12642. //opts can be id:row id for the row, rowdata:the data for the row, colmodel:the column model for this column
  12643. //example {id:1234,}
  12644. $.extend($.fmatter,{
  12645. isBoolean : function(o) {
  12646. return typeof o === 'boolean';
  12647. },
  12648. isObject : function(o) {
  12649. return (o && (typeof o === 'object' || $.isFunction(o))) || false;
  12650. },
  12651. isString : function(o) {
  12652. return typeof o === 'string';
  12653. },
  12654. isNumber : function(o) {
  12655. return typeof o === 'number' && isFinite(o);
  12656. },
  12657. isValue : function (o) {
  12658. return (this.isObject(o) || this.isString(o) || this.isNumber(o) || this.isBoolean(o));
  12659. },
  12660. isEmpty : function(o) {
  12661. if(!this.isString(o) && this.isValue(o)) {
  12662. return false;
  12663. }
  12664. if (!this.isValue(o)){
  12665. return true;
  12666. }
  12667. o = $.trim(o).replace(/\&nbsp\;/ig,'').replace(/\&#160\;/ig,'');
  12668. return o==="";
  12669. }
  12670. });
  12671. $.fn.fmatter = function(formatType, cellval, opts, rwd, act) {
  12672. // build main options before element iteration
  12673. var v=cellval;
  12674. opts = $.extend({}, $.jgrid.getRegional(this, 'formatter') , opts);
  12675. try {
  12676. v = $.fn.fmatter[formatType].call(this, cellval, opts, rwd, act);
  12677. } catch(fe){}
  12678. return v;
  12679. };
  12680. $.fmatter.util = {
  12681. // Taken from YAHOO utils
  12682. NumberFormat : function(nData,opts) {
  12683. if(!$.fmatter.isNumber(nData)) {
  12684. nData *= 1;
  12685. }
  12686. if($.fmatter.isNumber(nData)) {
  12687. var bNegative = (nData < 0);
  12688. var sOutput = String(nData);
  12689. var sDecimalSeparator = opts.decimalSeparator || ".";
  12690. var nDotIndex;
  12691. if($.fmatter.isNumber(opts.decimalPlaces)) {
  12692. // Round to the correct decimal place
  12693. var nDecimalPlaces = opts.decimalPlaces;
  12694. var nDecimal = Math.pow(10, nDecimalPlaces);
  12695. sOutput = String(Math.round(nData*nDecimal)/nDecimal);
  12696. nDotIndex = sOutput.lastIndexOf(".");
  12697. if(nDecimalPlaces > 0) {
  12698. // Add the decimal separator
  12699. if(nDotIndex < 0) {
  12700. sOutput += sDecimalSeparator;
  12701. nDotIndex = sOutput.length-1;
  12702. }
  12703. // Replace the "."
  12704. else if(sDecimalSeparator !== "."){
  12705. sOutput = sOutput.replace(".",sDecimalSeparator);
  12706. }
  12707. // Add missing zeros
  12708. while((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) {
  12709. sOutput += "0";
  12710. }
  12711. }
  12712. }
  12713. if(opts.thousandsSeparator) {
  12714. var sThousandsSeparator = opts.thousandsSeparator;
  12715. nDotIndex = sOutput.lastIndexOf(sDecimalSeparator);
  12716. nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length;
  12717. var sNewOutput = sOutput.substring(nDotIndex);
  12718. var nCount = -1, i;
  12719. for (i=nDotIndex; i>0; i--) {
  12720. nCount++;
  12721. if ((nCount%3 === 0) && (i !== nDotIndex) && (!bNegative || (i > 1))) {
  12722. sNewOutput = sThousandsSeparator + sNewOutput;
  12723. }
  12724. sNewOutput = sOutput.charAt(i-1) + sNewOutput;
  12725. }
  12726. sOutput = sNewOutput;
  12727. }
  12728. // Prepend prefix
  12729. sOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput;
  12730. // Append suffix
  12731. sOutput = (opts.suffix) ? sOutput + opts.suffix : sOutput;
  12732. return sOutput;
  12733. }
  12734. return nData;
  12735. }
  12736. };
  12737. $.fn.fmatter.defaultFormat = function(cellval, opts) {
  12738. return ($.fmatter.isValue(cellval) && cellval!=="" ) ? cellval : opts.defaultValue || "&#160;";
  12739. };
  12740. $.fn.fmatter.email = function(cellval, opts) {
  12741. if(!$.fmatter.isEmpty(cellval)) {
  12742. return "<a href=\"mailto:" + cellval + "\">" + cellval + "</a>";
  12743. }
  12744. return $.fn.fmatter.defaultFormat(cellval,opts );
  12745. };
  12746. $.fn.fmatter.checkbox =function(cval, opts) {
  12747. var op = $.extend({},opts.checkbox), ds;
  12748. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12749. op = $.extend({},op,opts.colModel.formatoptions);
  12750. }
  12751. if(op.disabled===true) {ds = "disabled=\"disabled\"";} else {ds="";}
  12752. if($.fmatter.isEmpty(cval) || cval === undefined ) {cval = $.fn.fmatter.defaultFormat(cval,op);}
  12753. cval=String(cval);
  12754. cval=(cval+"").toLowerCase();
  12755. var bchk = cval.search(/(false|f|0|no|n|off|undefined)/i)<0 ? " checked='checked' " : "";
  12756. return "<input type=\"checkbox\" " + bchk + " value=\""+ cval+"\" offval=\"no\" "+ds+ "/>";
  12757. };
  12758. $.fn.fmatter.link = function(cellval, opts) {
  12759. var op = {target:opts.target};
  12760. var target = "";
  12761. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12762. op = $.extend({},op,opts.colModel.formatoptions);
  12763. }
  12764. if(op.target) {target = 'target=' + op.target;}
  12765. if(!$.fmatter.isEmpty(cellval)) {
  12766. return "<a "+target+" href=\"" + cellval + "\">" + cellval + "</a>";
  12767. }
  12768. return $.fn.fmatter.defaultFormat(cellval,opts);
  12769. };
  12770. $.fn.fmatter.showlink = function(cellval, opts) {
  12771. var op = {baseLinkUrl: opts.baseLinkUrl,showAction:opts.showAction, addParam: opts.addParam || "", target: opts.target, idName: opts.idName},
  12772. target = "", idUrl;
  12773. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12774. op = $.extend({},op,opts.colModel.formatoptions);
  12775. }
  12776. if(op.target) {target = 'target=' + op.target;}
  12777. idUrl = op.baseLinkUrl+op.showAction + '?'+ op.idName+'='+opts.rowId+op.addParam;
  12778. if($.fmatter.isString(cellval) || $.fmatter.isNumber(cellval)) { //add this one even if its blank string
  12779. return "<a "+target+" href=\"" + idUrl + "\">" + cellval + "</a>";
  12780. }
  12781. return $.fn.fmatter.defaultFormat(cellval,opts);
  12782. };
  12783. $.fn.fmatter.integer = function(cellval, opts) {
  12784. var op = $.extend({},opts.integer);
  12785. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12786. op = $.extend({},op,opts.colModel.formatoptions);
  12787. }
  12788. if($.fmatter.isEmpty(cellval)) {
  12789. return op.defaultValue;
  12790. }
  12791. return $.fmatter.util.NumberFormat(cellval,op);
  12792. };
  12793. $.fn.fmatter.number = function (cellval, opts) {
  12794. var op = $.extend({},opts.number);
  12795. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12796. op = $.extend({},op,opts.colModel.formatoptions);
  12797. }
  12798. if($.fmatter.isEmpty(cellval)) {
  12799. return op.defaultValue;
  12800. }
  12801. return $.fmatter.util.NumberFormat(cellval,op);
  12802. };
  12803. $.fn.fmatter.currency = function (cellval, opts) {
  12804. var op = $.extend({},opts.currency);
  12805. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12806. op = $.extend({},op,opts.colModel.formatoptions);
  12807. }
  12808. if($.fmatter.isEmpty(cellval)) {
  12809. return op.defaultValue;
  12810. }
  12811. return $.fmatter.util.NumberFormat(cellval,op);
  12812. };
  12813. $.fn.fmatter.date = function (cellval, opts, rwd, act) {
  12814. var op = $.extend({},opts.date);
  12815. if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
  12816. op = $.extend({},op,opts.colModel.formatoptions);
  12817. }
  12818. if(!op.reformatAfterEdit && act === 'edit'){
  12819. return $.fn.fmatter.defaultFormat(cellval, opts);
  12820. }
  12821. if(!$.fmatter.isEmpty(cellval)) {
  12822. return $.jgrid.parseDate.call(this, op.srcformat,cellval,op.newformat,op);
  12823. }
  12824. return $.fn.fmatter.defaultFormat(cellval, opts);
  12825. };
  12826. $.fn.fmatter.select = function (cellval,opts) {
  12827. // jqGrid specific
  12828. cellval = String(cellval);
  12829. var oSelect = false, ret=[], sep, delim;
  12830. if(opts.colModel.formatoptions !== undefined){
  12831. oSelect= opts.colModel.formatoptions.value;
  12832. sep = opts.colModel.formatoptions.separator === undefined ? ":" : opts.colModel.formatoptions.separator;
  12833. delim = opts.colModel.formatoptions.delimiter === undefined ? ";" : opts.colModel.formatoptions.delimiter;
  12834. } else if(opts.colModel.editoptions !== undefined){
  12835. oSelect= opts.colModel.editoptions.value;
  12836. sep = opts.colModel.editoptions.separator === undefined ? ":" : opts.colModel.editoptions.separator;
  12837. delim = opts.colModel.editoptions.delimiter === undefined ? ";" : opts.colModel.editoptions.delimiter;
  12838. }
  12839. if (oSelect) {
  12840. var msl = (opts.colModel.editoptions != null && opts.colModel.editoptions.multiple === true) === true ? true : false,
  12841. scell = [], sv;
  12842. if(msl) {scell = cellval.split(",");scell = $.map(scell,function(n){return $.trim(n);});}
  12843. if ($.fmatter.isString(oSelect)) {
  12844. // mybe here we can use some caching with care ????
  12845. var so = oSelect.split(delim), j=0, i;
  12846. for(i=0; i<so.length;i++){
  12847. sv = so[i].split(sep);
  12848. if(sv.length > 2 ) {
  12849. sv[1] = $.map(sv,function(n,i){if(i>0) {return n;}}).join(sep);
  12850. }
  12851. if(msl) {
  12852. if($.inArray(sv[0],scell)>-1) {
  12853. ret[j] = sv[1];
  12854. j++;
  12855. }
  12856. } else if($.trim(sv[0]) === $.trim(cellval)) {
  12857. ret[0] = sv[1];
  12858. break;
  12859. }
  12860. }
  12861. } else if($.fmatter.isObject(oSelect)) {
  12862. // this is quicker
  12863. if(msl) {
  12864. ret = $.map(scell, function(n){
  12865. return oSelect[n];
  12866. });
  12867. } else {
  12868. ret[0] = oSelect[cellval] || "";
  12869. }
  12870. }
  12871. }
  12872. cellval = ret.join(", ");
  12873. return cellval === "" ? $.fn.fmatter.defaultFormat(cellval,opts) : cellval;
  12874. };
  12875. $.fn.fmatter.rowactions = function(act) {
  12876. var $tr = $(this).closest("tr.jqgrow"),
  12877. rid = $tr.attr("id"),
  12878. $id = $(this).closest("table.ui-jqgrid-btable").attr('id').replace(/_frozen([^_]*)$/,'$1'),
  12879. $grid = $("#"+$id),
  12880. $t = $grid[0],
  12881. p = $t.p,
  12882. cm = p.colModel[$.jgrid.getCellIndex(this)],
  12883. $actionsDiv = cm.frozen ? $("tr#"+rid+" td:eq("+$.jgrid.getCellIndex(this)+") > div",$grid) :$(this).parent(),
  12884. op = {
  12885. extraparam: {}
  12886. },
  12887. saverow = function(rowid, res) {
  12888. if($.isFunction(op.afterSave)) { op.afterSave.call($t, rowid, res); }
  12889. $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
  12890. $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
  12891. },
  12892. restorerow = function(rowid) {
  12893. if($.isFunction(op.afterRestore)) { op.afterRestore.call($t, rowid); }
  12894. $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
  12895. $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
  12896. };
  12897. if (cm.formatoptions !== undefined) {
  12898. op = $.extend(op,cm.formatoptions);
  12899. }
  12900. if (p.editOptions !== undefined) {
  12901. op.editOptions = p.editOptions;
  12902. }
  12903. if (p.delOptions !== undefined) {
  12904. op.delOptions = p.delOptions;
  12905. }
  12906. if ($tr.hasClass("jqgrid-new-row")){
  12907. op.extraparam[p.prmNames.oper] = p.prmNames.addoper;
  12908. }
  12909. var actop = {
  12910. keys: op.keys,
  12911. oneditfunc: op.onEdit,
  12912. successfunc: op.onSuccess,
  12913. url: op.url,
  12914. extraparam: op.extraparam,
  12915. aftersavefunc: saverow,
  12916. errorfunc: op.onError,
  12917. afterrestorefunc: restorerow,
  12918. restoreAfterError: op.restoreAfterError,
  12919. mtype: op.mtype
  12920. };
  12921. switch(act)
  12922. {
  12923. case 'edit':
  12924. $grid.jqGrid('editRow', rid, actop);
  12925. $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").hide();
  12926. $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").show();
  12927. $grid.triggerHandler("jqGridAfterGridComplete");
  12928. break;
  12929. case 'save':
  12930. if ($grid.jqGrid('saveRow', rid, actop)) {
  12931. $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
  12932. $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
  12933. $grid.triggerHandler("jqGridAfterGridComplete");
  12934. }
  12935. break;
  12936. case 'cancel' :
  12937. $grid.jqGrid('restoreRow', rid, restorerow);
  12938. $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
  12939. $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
  12940. $grid.triggerHandler("jqGridAfterGridComplete");
  12941. break;
  12942. case 'del':
  12943. $grid.jqGrid('delGridRow', rid, op.delOptions);
  12944. break;
  12945. case 'formedit':
  12946. $grid.jqGrid('setSelection', rid);
  12947. $grid.jqGrid('editGridRow', rid, op.editOptions);
  12948. break;
  12949. }
  12950. };
  12951. $.fn.fmatter.actions = function(cellval,opts) {
  12952. var op={keys:false, editbutton:true, delbutton:true, editformbutton: false},
  12953. rowid=opts.rowId, str="",ocl,
  12954. nav = $.jgrid.getRegional(this, 'nav');
  12955. if(opts.colModel.formatoptions !== undefined) {
  12956. op = $.extend(op,opts.colModel.formatoptions);
  12957. }
  12958. if(rowid === undefined || $.fmatter.isEmpty(rowid)) {return "";}
  12959. if(op.editformbutton){
  12960. ocl = "id='jEditButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'formedit'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
  12961. str += "<div title='"+nav.edittitle+"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' "+ocl+"><span class='ui-icon ui-icon-pencil'></span></div>";
  12962. } else if(op.editbutton){
  12963. ocl = "id='jEditButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'edit'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
  12964. str += "<div title='"+nav.edittitle+"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' "+ocl+"><span class='ui-icon ui-icon-pencil'></span></div>";
  12965. }
  12966. if(op.delbutton) {
  12967. ocl = "id='jDeleteButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'del'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
  12968. str += "<div title='"+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>";
  12969. }
  12970. ocl = "id='jSaveButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'save'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
  12971. str += "<div title='"+nav.savetitle+"' style='float:left;display:none' class='ui-pg-div ui-inline-save' "+ocl+"><span class='ui-icon ui-icon-disk'></span></div>";
  12972. ocl = "id='jCancelButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'cancel'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
  12973. str += "<div title='"+nav.canceltitle+"' style='float:left;display:none;margin-left:5px;' class='ui-pg-div ui-inline-cancel' "+ocl+"><span class='ui-icon ui-icon-cancel'></span></div>";
  12974. return "<div style='margin-left:8px;'>" + str + "</div>";
  12975. };
  12976. $.unformat = function (cellval,options,pos,cnt) {
  12977. // specific for jqGrid only
  12978. var ret, formatType = options.colModel.formatter,
  12979. op =options.colModel.formatoptions || {}, sep,
  12980. re = /([\.\*\_\'\(\)\{\}\+\?\\])/g,
  12981. unformatFunc = options.colModel.unformat||($.fn.fmatter[formatType] && $.fn.fmatter[formatType].unformat);
  12982. if(unformatFunc !== undefined && $.isFunction(unformatFunc) ) {
  12983. ret = unformatFunc.call(this, $(cellval).text(), options, cellval);
  12984. } else if(formatType !== undefined && $.fmatter.isString(formatType) ) {
  12985. var opts = $.jgrid.getRegional(this, 'formatter') || {}, stripTag;
  12986. switch(formatType) {
  12987. case 'integer' :
  12988. op = $.extend({},opts.integer,op);
  12989. sep = op.thousandsSeparator.replace(re,"\\$1");
  12990. stripTag = new RegExp(sep, "g");
  12991. ret = $(cellval).text().replace(stripTag,'');
  12992. break;
  12993. case 'number' :
  12994. op = $.extend({},opts.number,op);
  12995. sep = op.thousandsSeparator.replace(re,"\\$1");
  12996. stripTag = new RegExp(sep, "g");
  12997. ret = $(cellval).text().replace(stripTag,"").replace(op.decimalSeparator,'.');
  12998. break;
  12999. case 'currency':
  13000. op = $.extend({},opts.currency,op);
  13001. sep = op.thousandsSeparator.replace(re,"\\$1");
  13002. stripTag = new RegExp(sep, "g");
  13003. ret = $(cellval).text();
  13004. if (op.prefix && op.prefix.length) {
  13005. ret = ret.substr(op.prefix.length);
  13006. }
  13007. if (op.suffix && op.suffix.length) {
  13008. ret = ret.substr(0, ret.length - op.suffix.length);
  13009. }
  13010. ret = ret.replace(stripTag,'').replace(op.decimalSeparator,'.');
  13011. break;
  13012. case 'checkbox':
  13013. var cbv = (options.colModel.editoptions) ? options.colModel.editoptions.value.split(":") : ["Yes","No"];
  13014. ret = $('input',cellval).is(":checked") ? cbv[0] : cbv[1];
  13015. break;
  13016. case 'select' :
  13017. ret = $.unformat.select(cellval,options,pos,cnt);
  13018. break;
  13019. case 'actions':
  13020. return "";
  13021. default:
  13022. ret= $(cellval).text();
  13023. }
  13024. }
  13025. return ret !== undefined ? ret : cnt===true ? $(cellval).text() : $.jgrid.htmlDecode($(cellval).html());
  13026. };
  13027. $.unformat.select = function (cellval,options,pos,cnt) {
  13028. // Spacial case when we have local data and perform a sort
  13029. // cnt is set to true only in sortDataArray
  13030. var ret = [];
  13031. var cell = $(cellval).text();
  13032. if(cnt===true) {return cell;}
  13033. var op = $.extend({}, options.colModel.formatoptions !== undefined ? options.colModel.formatoptions: options.colModel.editoptions),
  13034. sep = op.separator === undefined ? ":" : op.separator,
  13035. delim = op.delimiter === undefined ? ";" : op.delimiter;
  13036. if(op.value){
  13037. var oSelect = op.value,
  13038. msl = op.multiple === true ? true : false,
  13039. scell = [], sv;
  13040. if(msl) {scell = cell.split(",");scell = $.map(scell,function(n){return $.trim(n);});}
  13041. if ($.fmatter.isString(oSelect)) {
  13042. var so = oSelect.split(delim), j=0, i;
  13043. for(i=0; i<so.length;i++){
  13044. sv = so[i].split(sep);
  13045. if(sv.length > 2 ) {
  13046. sv[1] = $.map(sv,function(n,i){if(i>0) {return n;}}).join(sep);
  13047. }
  13048. if(msl) {
  13049. if($.inArray($.trim(sv[1]),scell)>-1) {
  13050. ret[j] = sv[0];
  13051. j++;
  13052. }
  13053. } else if($.trim(sv[1]) === $.trim(cell)) {
  13054. ret[0] = sv[0];
  13055. break;
  13056. }
  13057. }
  13058. } else if($.fmatter.isObject(oSelect) || $.isArray(oSelect) ){
  13059. if(!msl) {scell[0] = cell;}
  13060. ret = $.map(scell, function(n){
  13061. var rv;
  13062. $.each(oSelect, function(i,val){
  13063. if (val === n) {
  13064. rv = i;
  13065. return false;
  13066. }
  13067. });
  13068. if( rv !== undefined ) {return rv;}
  13069. });
  13070. }
  13071. return ret.join(", ");
  13072. }
  13073. return cell || "";
  13074. };
  13075. $.unformat.date = function (cellval, opts) {
  13076. var op = $.jgrid.getRegional(this, 'formatter.date') || {};
  13077. if(opts.formatoptions !== undefined) {
  13078. op = $.extend({},op,opts.formatoptions);
  13079. }
  13080. if(!$.fmatter.isEmpty(cellval)) {
  13081. return $.jgrid.parseDate.call(this, op.newformat,cellval,op.srcformat,op);
  13082. }
  13083. return $.fn.fmatter.defaultFormat(cellval, opts);
  13084. };
  13085. //module begin
  13086. window.jqGridUtils = {
  13087. stringify : function(obj) {
  13088. return JSON.stringify(obj,function(key, value){
  13089. return (typeof value === 'function' ) ? value.toString() : value;
  13090. });
  13091. },
  13092. parse : function(str) {
  13093. return JSON.parse(str,function(key, value){
  13094. if(typeof value === "string" && value.indexOf("function") !== -1) {
  13095. return eval('('+value+')');
  13096. }
  13097. return value;
  13098. });
  13099. },
  13100. encode : function ( text ) { // repeated, but should not depend on grid
  13101. return String(text).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
  13102. },
  13103. jsonToXML : function ( tree, options ) {
  13104. var o = $.extend( {
  13105. xmlDecl : '<?xml version="1.0" encoding="UTF-8" ?>\n',
  13106. attr_prefix : '-',
  13107. encode : true
  13108. }, options || {}),
  13109. that = this,
  13110. scalarToxml = function ( name, text ) {
  13111. if ( name === "#text" ) {
  13112. return (o.encode ? that.encode(text) : text);
  13113. } else if(typeof(text) ==='function') {
  13114. return "<"+name+"><![CDATA["+ text +"]]></"+name+">\n";
  13115. } if(text === "") {
  13116. return "<"+name+">__EMPTY_STRING_</"+name+">\n";
  13117. } else {
  13118. return "<"+name+">"+(o.encode ? that.encode(text) : text )+"</"+name+">\n";
  13119. }
  13120. },
  13121. arrayToxml = function ( name, array ) {
  13122. var out = [];
  13123. for( var i=0; i<array.length; i++ ) {
  13124. var val = array[i];
  13125. if ( typeof(val) === "undefined" || val == null ) {
  13126. out[out.length] = "<"+name+" />";
  13127. } else if ( typeof(val) === "object" && val.constructor == Array ) {
  13128. out[out.length] = arrayToxml( name, val );
  13129. } else if ( typeof(val) === "object" ) {
  13130. out[out.length] = hashToxml( name, val );
  13131. } else {
  13132. out[out.length] = scalarToxml( name, val );
  13133. }
  13134. }
  13135. if(!out.length) {
  13136. out[0] = "<"+ name+">__EMPTY_ARRAY_</"+name+">\n";
  13137. }
  13138. return out.join("");
  13139. },
  13140. hashToxml = function ( name, tree ) {
  13141. var elem = [];
  13142. var attr = [];
  13143. for( var key in tree ) {
  13144. if ( ! tree.hasOwnProperty(key) ) continue;
  13145. var val = tree[key];
  13146. if ( key.charAt(0) !== o.attr_prefix ) {
  13147. if ( val == null ) { // null or undefined
  13148. elem[elem.length] = "<"+key+" />";
  13149. } else if ( typeof(val) === "object" && val.constructor === Array ) {
  13150. elem[elem.length] = arrayToxml( key, val );
  13151. } else if ( typeof(val) === "object" ) {
  13152. elem[elem.length] = hashToxml( key, val );
  13153. } else {
  13154. elem[elem.length] = scalarToxml( key, val );
  13155. }
  13156. } else {
  13157. attr[attr.length] = " "+(key.substring(1))+'="'+(o.encode ? that.encode( val ) : val)+'"';
  13158. }
  13159. }
  13160. var jattr = attr.join("");
  13161. var jelem = elem.join("");
  13162. if ( name == null ) { // null or undefined
  13163. // no tag
  13164. } else if ( elem.length > 0 ) {
  13165. if ( jelem.match( /\n/ )) {
  13166. jelem = "<"+name+jattr+">\n"+jelem+"</"+name+">\n";
  13167. } else {
  13168. jelem = "<"+name+jattr+">" +jelem+"</"+name+">\n";
  13169. }
  13170. } else {
  13171. jelem = "<"+name+jattr+" />\n";
  13172. }
  13173. return jelem;
  13174. };
  13175. var xml = hashToxml( null, tree );
  13176. return o.xmlDecl + xml;
  13177. },
  13178. xmlToJSON : function ( root, options ) {
  13179. var o = $.extend ( {
  13180. force_array : [], //[ "rdf:li", "item", "-xmlns" ];
  13181. attr_prefix : '-'
  13182. }, options || {} );
  13183. if(!root) { return; }
  13184. var __force_array = {};
  13185. if ( o.force_array ) {
  13186. for( var i=0; i< o.force_array.length; i++ ) {
  13187. __force_array[o.force_array[i]] = 1;
  13188. }
  13189. }
  13190. if(typeof root === 'string') {
  13191. root = $.parseXML(root);
  13192. }
  13193. if(root.documentElement) {
  13194. root = root.documentElement;
  13195. }
  13196. var addNode = function ( hash, key, cnts, val ) {
  13197. if(typeof val === 'string') {
  13198. if( val.indexOf('function') !== -1) {
  13199. val = eval( '(' + val +')'); // we need this in our implement
  13200. } else {
  13201. switch(val) {
  13202. case '__EMPTY_ARRAY_' :
  13203. val = [];
  13204. break;
  13205. case '__EMPTY_STRING_':
  13206. val = "";
  13207. break;
  13208. case "false" :
  13209. val = false;
  13210. break;
  13211. case "true":
  13212. val = true;
  13213. break;
  13214. }
  13215. }
  13216. }
  13217. if ( __force_array[key] ) {
  13218. if ( cnts === 1 ) {
  13219. hash[key] = [];
  13220. }
  13221. hash[key][hash[key].length] = val; // push
  13222. } else if ( cnts === 1 ) { // 1st sibling
  13223. hash[key] = val;
  13224. } else if ( cnts === 2 ) { // 2nd sibling
  13225. hash[key] = [ hash[key], val ];
  13226. } else { // 3rd sibling and more
  13227. hash[key][hash[key].length] = val;
  13228. }
  13229. },
  13230. parseElement = function ( elem ) {
  13231. // COMMENT_NODE
  13232. if ( elem.nodeType === 7 ) {
  13233. return;
  13234. }
  13235. // TEXT_NODE CDATA_SECTION_NODE
  13236. if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
  13237. var bool = elem.nodeValue.match( /[^\x00-\x20]/ );
  13238. if ( bool == null ) return; // ignore white spaces
  13239. return elem.nodeValue;
  13240. }
  13241. var retval, cnt = {}, i, key, val;
  13242. // parse attributes
  13243. if ( elem.attributes && elem.attributes.length ) {
  13244. retval = {};
  13245. for ( i=0; i<elem.attributes.length; i++ ) {
  13246. key = elem.attributes[i].nodeName;
  13247. if ( typeof(key) !== "string" ) {
  13248. continue;
  13249. }
  13250. val = elem.attributes[i].nodeValue;
  13251. if ( ! val ) {
  13252. continue;
  13253. }
  13254. key = o.attr_prefix + key;
  13255. if ( typeof(cnt[key]) === "undefined" ) {
  13256. cnt[key] = 0;
  13257. }
  13258. cnt[key] ++;
  13259. addNode( retval, key, cnt[key], val );
  13260. }
  13261. }
  13262. // parse child nodes (recursive)
  13263. if ( elem.childNodes && elem.childNodes.length ) {
  13264. var textonly = true;
  13265. if ( retval ) {
  13266. textonly = false;
  13267. } // some attributes exists
  13268. for ( i=0; i<elem.childNodes.length && textonly; i++ ) {
  13269. var ntype = elem.childNodes[i].nodeType;
  13270. if ( ntype === 3 || ntype === 4 ) {
  13271. continue;
  13272. }
  13273. textonly = false;
  13274. }
  13275. if ( textonly ) {
  13276. if ( ! retval ) {
  13277. retval = "";
  13278. }
  13279. for ( i=0; i<elem.childNodes.length; i++ ) {
  13280. retval += elem.childNodes[i].nodeValue;
  13281. }
  13282. } else {
  13283. if ( ! retval ) {
  13284. retval = {};
  13285. }
  13286. for ( i=0; i<elem.childNodes.length; i++ ) {
  13287. key = elem.childNodes[i].nodeName;
  13288. if ( typeof(key) !== "string" ) {
  13289. continue;
  13290. }
  13291. val = parseElement( elem.childNodes[i] );
  13292. if ( !val ) {
  13293. continue;
  13294. }
  13295. if ( typeof(cnt[key]) === "undefined" ) {
  13296. cnt[key] = 0;
  13297. }
  13298. cnt[key] ++;
  13299. addNode( retval, key, cnt[key], val );
  13300. }
  13301. }
  13302. }
  13303. return retval;
  13304. };
  13305. var json = parseElement( root ); // parse root node
  13306. if ( __force_array[root.nodeName] ) {
  13307. json = [ json ];
  13308. }
  13309. if ( root.nodeType !== 11 ) { // DOCUMENT_FRAGMENT_NODE
  13310. var tmp = {};
  13311. tmp[root.nodeName] = json; // root nodeName
  13312. json = tmp;
  13313. }
  13314. return json;
  13315. }
  13316. };
  13317. }));