3 * jqGrid 3.3 - jQuery Grid
\r
4 * Copyright (c) 2008, Tony Tomov, tony@trirand.com
\r
5 * Dual licensed under the MIT and GPL licenses
\r
6 * http://www.opensource.org/licenses/mit-license.php
\r
7 * http://www.gnu.org/licenses/gpl.html
\r
8 * Date: 2008-10-14 rev 64
\r
10 $.fn.jqGrid = function( p ) {
\r
28 sortascimg: "sort_asc.gif",
\r
29 sortdescimg: "sort_desc.gif",
\r
30 firstimg: "first.gif",
\r
31 previmg: "prev.gif",
\r
32 nextimg: "next.gif",
\r
33 lastimg: "last.gif",
\r
47 ondblClickRow: null,
\r
48 onRightClickRow: null,
\r
54 loadBeforeSend: null,
\r
55 afterInsertRow: null,
\r
56 beforeRequest: null,
\r
57 onHeaderClick: null,
\r
73 treeReader: {level_field: "level",
\r
76 leaf_field: "isLeaf",
\r
77 expanded_field: "expanded"
\r
81 sortclass: "grid_sort",
\r
82 resizeclass: "grid_resize",
\r
84 gridstate : 'visible',
\r
86 cellsubmit: 'remote',
\r
90 }, $.jgrid.defaults, p || {});
\r
94 dragStart: function(i,x) {
\r
95 this.resizing = { idx: i, startX: x};
\r
96 this.hDiv.style.cursor = "e-resize";
\r
98 dragMove: function(x) {
\r
100 var diff = x-this.resizing.startX;
\r
101 var h = this.headers[this.resizing.idx];
\r
102 var newWidth = h.width + diff;
\r
103 var msie = $.browser.msie;
\r
104 if(newWidth > 25) {
\r
105 if(p.forceFit===true ){
\r
106 var hn = this.headers[this.resizing.idx+p.nv];
\r
107 var nWn = hn.width - diff;
\r
109 h.el.style.width = newWidth+"px";
\r
110 h.newWidth = newWidth;
\r
111 this.cols[this.resizing.idx].style.width = newWidth+"px";
\r
112 hn.el.style.width = nWn +"px";
\r
114 this.cols[this.resizing.idx+p.nv].style.width = nWn+"px";
\r
115 this.newWidth = this.width;
\r
118 h.el.style.width = newWidth+"px";
\r
119 h.newWidth = newWidth;
\r
120 this.cols[this.resizing.idx].style.width = newWidth+"px";
\r
121 this.newWidth = this.width+diff;
\r
122 $('table:first',this.bDiv).css("width",this.newWidth +"px");
\r
123 $('table:first',this.hDiv).css("width",this.newWidth +"px");
\r
124 var scrLeft = this.bDiv.scrollLeft;
\r
125 this.hDiv.scrollLeft = this.bDiv.scrollLeft;
\r
127 if(scrLeft - this.hDiv.scrollLeft >= 5) {this.bDiv.scrollLeft = this.bDiv.scrollLeft - 17;}
\r
133 dragEnd: function() {
\r
134 this.hDiv.style.cursor = "default";
\r
135 if(this.resizing) {
\r
136 var idx = this.resizing.idx;
\r
137 this.headers[idx].width = this.headers[idx].newWidth || this.headers[idx].width;
\r
138 this.cols[idx].style.width = this.headers[idx].newWidth || this.headers[idx].width;
\r
139 if(p.forceFit===true){
\r
140 this.headers[idx+p.nv].width = this.headers[idx+p.nv].newWidth || this.headers[idx+p.nv].width;
\r
141 this.cols[idx+p.nv].style.width = this.headers[idx+p.nv].newWidth || this.headers[idx+p.nv].width;
\r
143 if(this.newWidth) {this.width = this.newWidth;}
\r
144 this.resizing = false;
\r
147 scrollGrid: function() {
\r
148 var scrollLeft = this.bDiv.scrollLeft;
\r
149 this.hDiv.scrollLeft = this.bDiv.scrollLeft;
\r
150 if(scrollLeft - this.hDiv.scrollLeft > 5) {this.bDiv.scrollLeft = this.bDiv.scrollLeft - 17;}
\r
153 $.fn.getGridParam = function(pName) {
\r
155 if (!$t.grid) {return;}
\r
156 if (!pName) { return $t.p; }
\r
157 else {return $t.p[pName] ? $t.p[pName] : null;}
\r
159 $.fn.setGridParam = function (newParams){
\r
160 return this.each(function(){
\r
161 if (this.grid && typeof(newParams) === 'object') {$.extend(true,this.p,newParams);}
\r
164 $.fn.getDataIDs = function () {
\r
166 this.each(function(){
\r
167 $(this.rows).slice(1).each(function(i){
\r
173 $.fn.setSortName = function (newsort) {
\r
174 return this.each(function(){
\r
176 for(var i=0;i< $t.p.colModel.length;i++){
\r
177 if($t.p.colModel[i].name===newsort || $t.p.colModel[i].index===newsort){
\r
178 $("tr th:eq("+$t.p.lastsort+") div img",$t.grid.hDiv).remove();
\r
180 $t.p.sortname=newsort;
\r
186 $.fn.setSelection = function(selection,sd) {
\r
187 return this.each(function(){
\r
188 var $t = this, stat,pt;
\r
189 if(selection===false) {pt = sd;}
\r
190 else { var ind = $($t).getInd($t.rows,selection); pt=$($t.rows[ind]);}
\r
191 selection = $(pt).attr("id");
\r
192 if (!pt.html()) {return;}
\r
193 if(!$t.p.multiselect) {
\r
194 if($(pt).attr("class") !== "subgrid") {
\r
195 if( $t.p.selrow ) {$("tr#"+$t.p.selrow+":first",$t.grid.bDiv).removeClass("selected");}
\r
196 $t.p.selrow = selection;
\r
197 $(pt).addClass("selected");
\r
198 if( $t.p.onSelectRow ) { $t.p.onSelectRow($t.p.selrow, true); }
\r
201 $t.p.selrow = selection;
\r
202 var ia = $.inArray($t.p.selrow,$t.p.selarrrow);
\r
204 if($(pt).attr("class") !== "subgrid") { $(pt).addClass("selected");}
\r
206 $("#jqg_"+$t.p.selrow,$t.rows).attr("checked",stat);
\r
207 $t.p.selarrrow.push($t.p.selrow);
\r
208 if( $t.p.onSelectRow ) { $t.p.onSelectRow($t.p.selrow, stat); }
\r
210 if($(pt).attr("class") !== "subgrid") { $(pt).removeClass("selected");}
\r
212 $("#jqg_"+$t.p.selrow,$t.rows).attr("checked",stat);
\r
213 $t.p.selarrrow.splice(ia,1);
\r
214 if( $t.p.onSelectRow ) { $t.p.onSelectRow($t.p.selrow, stat); }
\r
215 var tpsr = $t.p.selarrrow[0];
\r
216 $t.p.selrow = (tpsr=='undefined') ? null : tpsr;
\r
221 $.fn.resetSelection = function(){
\r
222 return this.each(function(){
\r
224 if(!t.p.multiselect) {
\r
226 $("tr#"+t.p.selrow+":first",t.grid.bDiv).removeClass("selected");
\r
230 $(t.p.selarrrow).each(function(i,n){
\r
231 var ind = $(t).getInd(t.rows,n);
\r
232 $(t.rows[ind]).removeClass("selected");
\r
233 $("#jqg_"+n,t.rows[ind]).attr("checked",false);
\r
235 $("#cb_jqg",t.grid.hDiv).attr("checked",false);
\r
236 t.p.selarrrow = [];
\r
240 $.fn.getRowData = function( rowid ) {
\r
243 this.each(function(){
\r
244 var $t = this,nm,ind;
\r
245 ind = $($t).getInd($t.rows,rowid);
\r
246 if (!ind) {return res;}
\r
247 $('td:nth-child',$t.rows[ind]).each( function(i) {
\r
248 nm = $t.p.colModel[i].name;
\r
249 if ( nm !== 'cb' && nm !== 'subgrid') {
\r
250 res[nm] = $(this).html().replace(/\ \;/ig,'');
\r
257 $.fn.delRowData = function(rowid) {
\r
258 var success = false, rowInd;
\r
260 this.each(function() {
\r
262 rowInd = $($t).getInd($t.rows,rowid);
\r
263 if(!rowInd) {return success;}
\r
265 $($t.rows[rowInd]).remove();
\r
270 if(rowInd == 1 && success && ($.browser.opera || $.browser.safari)) {
\r
271 $($t.rows[1]).each( function( k ) {
\r
272 $(this).css("width",$t.grid.headers[k].width+"px");
\r
273 $t.grid.cols[k] = this;
\r
276 if( $t.p.altRows === true && success) {
\r
277 $($t.rows).slice(1).each(function(i){
\r
278 if(i % 2 ==1) {$(this).addClass('alt');}
\r
279 else {$(this).removeClass('alt');}
\r
286 $.fn.setRowData = function(rowid, data) {
\r
287 var nm, success=false;
\r
288 this.each(function(){
\r
290 if(!t.grid) {return false;}
\r
292 var ind = $(t).getInd(t.rows,rowid);
\r
293 if(!ind) {return success;}
\r
295 $(this.p.colModel).each(function(i){
\r
297 if(data[nm] !== 'undefined') {
\r
298 $("td:eq("+i+")",t.rows[ind]).html(data[nm]);
\r
306 $.fn.addRowData = function(rowid,data,pos,src) {
\r
307 if(!pos) {pos = "last";}
\r
308 var success = false;
\r
309 var nm, row, td, gi=0, si=0,sind;
\r
311 this.each(function() {
\r
313 row = document.createElement("tr");
\r
314 row.id = rowid || t.p.records+1;
\r
315 $(row).addClass("jqgrow");
\r
316 if(t.p.multiselect) {
\r
317 td = $('<td></td>');
\r
318 $(td[0],t.grid.bDiv).html("<input type='checkbox'"+" id='jqg_"+rowid+"' class='cbox'/>");
\r
319 row.appendChild(td[0]);
\r
322 if(t.p.subGrid ) { try {$(t).addSubGrid(t.grid.bDiv,row,gi);} catch(e){} si=1;}
\r
323 for(var i = gi+si; i < this.p.colModel.length;i++){
\r
324 nm = this.p.colModel[i].name;
\r
325 td = $('<td></td>');
\r
326 $(td[0]).html(' ');
\r
327 if(data[nm] !== 'undefined') {
\r
328 $(td[0]).html(data[nm] || ' ');
\r
330 t.formatCol($(td[0],t.grid.bDiv),i);
\r
331 row.appendChild(td[0]);
\r
335 $(t.rows[t.rows.length-1]).after(row);
\r
338 $(t.rows[0]).after(row);
\r
341 sind = $(t).getInd(t.rows,src);
\r
342 sind >= 0 ? $(t.rows[sind]).after(row): "";
\r
345 sind = $(t).getInd(t.rows,src);
\r
346 sind > 0 ? $(t.rows[sind-1]).after(row): "";
\r
350 if($.browser.safari || $.browser.opera) {
\r
351 t.scrollLeft = t.scrollLeft;
\r
352 $("td",t.rows[1]).each( function( k ) {
\r
353 $(this).css("width",t.grid.headers[k].width+"px");
\r
354 t.grid.cols[k] = this;
\r
357 if( t.p.altRows === true ) {
\r
358 if (pos == "last") {
\r
359 if (t.rows.length % 2 == 1) {$(row).addClass('alt');}
\r
361 $(t.rows).slice(1).each(function(i){
\r
362 if(i % 2 ==1) {$(this).addClass('alt');}
\r
363 else {$(this).removeClass('alt');}
\r
367 try {t.p.afterInsertRow(row.id,data); } catch(e){}
\r
374 $.fn.hideCol = function(colname) {
\r
375 return this.each(function() {
\r
376 var $t = this,w=0, fndh=false;
\r
377 if (!$t.grid ) {return;}
\r
378 if( typeof colname == 'string') {colname=[colname];}
\r
379 $(this.p.colModel).each(function(i) {
\r
380 if ($.inArray(this.name,colname) != -1 && !this.hidden) {
\r
381 var w = parseInt($("tr th:eq("+i+")",$t.grid.hDiv).css("width"),10);
\r
382 $("tr th:eq("+i+")",$t.grid.hDiv).css({display:"none"});
\r
383 $($t.rows).each(function(j){
\r
384 $("td:eq("+i+")",$t.rows[j]).css({display:"none"});
\r
386 $t.grid.cols[i].style.width = 0;
\r
387 $t.grid.headers[i].width = 0;
\r
388 $t.grid.width -= w;
\r
394 var gtw = Math.min($t.p.width,$t.grid.width);
\r
395 $("table:first",$t.grid.hDiv).width(gtw);
\r
396 $("table:first",$t.grid.bDiv).width(gtw);
\r
397 $($t.grid.hDiv).width(gtw);
\r
398 $($t.grid.bDiv).width(gtw);
\r
399 if($t.p.pager && $($t.p.pager).hasClass("scroll") ) {
\r
400 $($t.p.pager).width(gtw);
\r
402 if($t.p.caption) {$($t.grid.cDiv).width(gtw);}
\r
403 if($t.p.toolbar[0]) {$($t.grid.uDiv).width(gtw);}
\r
404 $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;
\r
408 $.fn.showCol = function(colname) {
\r
409 return this.each(function() {
\r
410 var $t = this; var w = 0, fdns=false;
\r
411 if (!$t.grid ) {return;}
\r
412 if( typeof colname == 'string') {colname=[colname];}
\r
413 $($t.p.colModel).each(function(i) {
\r
414 if ($.inArray(this.name,colname) != -1 && this.hidden) {
\r
415 var w = parseInt($("tr th:eq("+i+")",$t.grid.hDiv).css("width"),10);
\r
416 $("tr th:eq("+i+")",$t.grid.hDiv).css("display","");
\r
417 $($t.rows).each(function(j){
\r
418 $("td:eq("+i+")",$t.rows[j]).css("display","").width(w);
\r
421 $t.grid.cols[i].style.width = w;
\r
422 $t.grid.headers[i].width = w;
\r
423 $t.grid.width += w;
\r
428 var gtw = Math.min($t.p.width,$t.grid.width);
\r
429 var ofl = ($t.grid.width <= $t.p.width) ? "hidden" : "auto";
\r
430 $("table:first",$t.grid.hDiv).width(gtw);
\r
431 $("table:first",$t.grid.bDiv).width(gtw);
\r
432 $($t.grid.hDiv).width(gtw);
\r
433 $($t.grid.bDiv).width(gtw).css("overflow-x",ofl);
\r
434 if($t.p.pager && $($t.p.pager).hasClass("scroll") ) {
\r
435 $($t.p.pager).width(gtw);
\r
437 if($t.p.caption) {$($t.grid.cDiv).width(gtw);}
\r
438 if($t.p.toolbar[0]) {$($t.grid.uDiv).width(gtw);}
\r
439 $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;
\r
443 $.fn.setGridWidth = function(nwidth, shrink) {
\r
444 return this.each(function(){
\r
445 var $t = this, chw=0,w,cw,ofl;
\r
446 if (!$t.grid ) {return;}
\r
447 if(typeof shrink != 'boolean') {shrink=true;}
\r
448 var testdata = getScale();
\r
449 if(shrink !== true) {testdata[0] = Math.min($t.p.width,$t.grid.width); testdata[2]=0;}
\r
450 else {testdata[2]= testdata[1]}
\r
451 $.each($t.p.colModel,function(i,v){
\r
452 if(!this.hidden && this.name != 'cb' && this.name!='subgrid') {
\r
453 cw = shrink !== true ? $("tr:first th:eq("+i+")",$t.grid.hDiv).css("width") : this.width;
\r
454 w = Math.round((IENum(nwidth)-IENum(testdata[2]))/IENum(testdata[0])*IENum(cw));
\r
456 $("table thead tr:first th:eq("+i+")",$t.grid.hDiv).css("width",w+"px");
\r
457 $("table:first tbody tr:first td:eq("+i+")",$t.grid.bDiv).css("width",w+"px");
\r
458 $t.grid.cols[i].style.width = w;
\r
459 $t.grid.headers[i].width = w;
\r
461 if(this.name=='cb' || this.name == 'subgrid'){chw += IENum(this.width);}
\r
463 if(chw + testdata[1] <= nwidth || $t.p.forceFit === true){ ofl = "hidden"; tw = nwidth;}
\r
464 else { ofl= "auto"; tw = chw + testdata[1];}
\r
465 $("table:first",$t.grid.hDiv).width(tw);
\r
466 $("table:first",$t.grid.bDiv).width(tw);
\r
467 $($t.grid.hDiv).width(nwidth);
\r
468 $($t.grid.bDiv).width(nwidth).css("overflow-x",ofl);
\r
469 if($t.p.pager && $($t.p.pager).hasClass("scroll") ) {
\r
470 $($t.p.pager).width(nwidth);
\r
472 if($t.p.caption) {$($t.grid.cDiv).width(nwidth);}
\r
473 if($t.p.toolbar[0]) {$($t.grid.uDiv).width(nwidth);}
\r
474 $t.p.width = nwidth; $t.grid.width = tw;
\r
475 if($.browser.safari || $.browser.opera ) {
\r
476 $("table tbody tr:eq(1) td",$t.grid.bDiv).each( function( k ) {
\r
477 $(this).css("width",$t.grid.headers[k].width+"px");
\r
478 $t.grid.cols[k] = this;
\r
481 $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;
\r
482 function IENum(val) {
\r
483 val = parseInt(val,10);
\r
484 return isNaN(val) ? 0 : val;
\r
486 function getScale(){
\r
487 var testcell = $("table tr:first th:eq(1)", $t.grid.hDiv);
\r
488 var addpix = IENum($(testcell).css("padding-left")) +
\r
489 IENum($(testcell).css("padding-right"))+
\r
490 IENum($(testcell).css("border-left-width"))+
\r
491 IENum($(testcell).css("border-right-width"));
\r
493 $.each($t.p.colModel,function(i,v){
\r
495 w += parseInt(this.width);
\r
503 $.fn.setGridHeight = function (nh) {
\r
504 return this.each(function (){
\r
505 var ovfl, ovfl2, $t = this;
\r
506 if(!$t.grid) {return;}
\r
507 if($t.p.forceFit === true) { ovfl2='hidden'; } else {ovfl2=$($t.grid.bDiv).css("overflow-x");}
\r
508 ovfl = (isNaN(nh) && $.browser.mozilla && (nh.indexOf("%")!=-1 || nh=="auto")) ? "hidden" : "auto";
\r
509 $($t.grid.bDiv).css({height: nh+(isNaN(nh)?"":"px"),"overflow-y":ovfl,"overflow-x": ovfl2});
\r
513 $.fn.setCaption = function (newcap){
\r
514 return this.each(function(){
\r
515 this.p.caption=newcap;
\r
516 $("table:first th",this.grid.cDiv).text(newcap);
\r
517 $(this.grid.cDiv).show();
\r
520 $.fn.setLabel = function(colname, nData, prop ){
\r
521 return this.each(function(){
\r
522 var $t = this, pos=-1;
\r
523 if(!$t.grid) {return;}
\r
524 if(isNaN(colname)) {
\r
525 $($t.p.colModel).each(function(i){
\r
526 if (this.name == colname) {
\r
527 pos = i;return false;
\r
530 } else {pos = parseInt(colname,10);}
\r
532 var thecol = $("table:first th:eq("+pos+")",$t.grid.hDiv);
\r
534 $("div",thecol).html(nData);
\r
537 if(typeof prop == 'string') {$(thecol).addClass(prop);} else {$(thecol).css(prop);}
\r
542 $.fn.setCell = function(rowid,colname,nData,prop) {
\r
543 return this.each(function(){
\r
544 var $t = this, pos =-1;
\r
545 if(!$t.grid) {return;}
\r
546 if(isNaN(colname)) {
\r
547 $($t.p.colModel).each(function(i){
\r
548 if (this.name == colname) {
\r
549 pos = i;return false;
\r
552 } else {pos = parseInt(colname,10);}
\r
554 var ind = $($t).getInd($t.rows,rowid);
\r
556 var tcell = $("td:eq("+pos+")",$t.rows[ind]);
\r
557 if(nData) {$(tcell).html(nData);}
\r
559 if(typeof prop == 'string') {$(tcell).addClass(prop);} else {$(tcell).css(prop);}
\r
565 $.fn.getCell = function(rowid,iCol) {
\r
567 this.each(function(){
\r
569 if(!$t.grid) {return;}
\r
570 if(rowid && iCol>=0) {
\r
571 var ind = $($t).getInd($t.rows,rowid);
\r
573 ret = $("td:eq("+iCol+")",$t.rows[ind]).html().replace(/\ \;/ig,'');
\r
579 $.fn.clearGridData = function() {
\r
580 return this.each(function(){
\r
582 if(!$t.grid) {return;}
\r
583 $("tbody tr:gt(0)", $t.grid.bDiv).remove();
\r
584 $t.p.selrow = null; $t.p.selarrrow= [];
\r
585 $t.p.records = 0;$t.p.page=0;$t.p.lastpage=0;
\r
589 $.fn.getInd = function(obj,rowid,rc){
\r
591 $(obj).each(function(i){
\r
592 if(this.id==rowid) {
\r
593 ret = rc===true ? this : i;
\r
599 return this.each( function() {
\r
600 if(this.grid) {return;}
\r
602 if( this.p.colNames.length === 0 || this.p.colNames.length !== this.p.colModel.length ) {
\r
603 alert("Length of colNames <> colModel or 0!");
\r
606 if(this.p.imgpath !== "" ) {this.p.imgpath += "/";}
\r
608 $("<div class='loadingui' id=lui_"+this.id+"/>").insertBefore(this);
\r
609 $(this).attr({cellSpacing:"0",cellPadding:"0",border:"0"});
\r
610 var onSelectRow = $.isFunction(this.p.onSelectRow) ? this.p.onSelectRow :false;
\r
611 var ondblClickRow = $.isFunction(this.p.ondblClickRow) ? this.p.ondblClickRow :false;
\r
612 var onSortCol = $.isFunction(this.p.onSortCol) ? this.p.onSortCol : false;
\r
613 var loadComplete = $.isFunction(this.p.loadComplete) ? this.p.loadComplete : false;
\r
614 var loadError = $.isFunction(this.p.loadError) ? this.p.loadError : false;
\r
615 var loadBeforeSend = $.isFunction(this.p.loadBeforeSend) ? this.p.loadBeforeSend : false;
\r
616 var onRightClickRow = $.isFunction(this.p.onRightClickRow) ? this.p.onRightClickRow : false;
\r
617 var afterInsRow = $.isFunction(this.p.afterInsertRow) ? this.p.afterInsertRow : false;
\r
618 var onHdCl = $.isFunction(this.p.onHeaderClick) ? this.p.onHeaderClick : false;
\r
619 var beReq = $.isFunction(this.p.beforeRequest) ? this.p.beforeRequest : false;
\r
620 var onSC = $.isFunction(this.p.onCellSelect) ? this.p.onCellSelect : false;
\r
621 var sortkeys = ["shiftKey","altKey","ctrlKey"];
\r
622 if ($.inArray(ts.p.multikey,sortkeys) == -1 ) {ts.p.multikey = false;}
\r
623 var IntNum = function(val,defval) {
\r
624 val = parseInt(val,10);
\r
625 if (isNaN(val)) { return (defval) ? defval : 0;}
\r
628 var formatCol = function (elem, pos){
\r
629 var rowalign1 = ts.p.colModel[pos].align || "left";
\r
630 $(elem).css("text-align",rowalign1);
\r
631 if(ts.p.colModel[pos].hidden) {$(elem).css("display","none");}
\r
633 var resizeFirstRow = function (t,er){
\r
634 $("tbody tr:eq("+er+") td",t).each( function( k ) {
\r
635 $(this).css("width",grid.headers[k].width+"px");
\r
636 grid.cols[k] = this;
\r
639 var addCell = function(t,row,cell,pos) {
\r
641 td = document.createElement("td");
\r
643 row.appendChild(td);
\r
644 formatCol($(td,t), pos);
\r
646 var addMulti = function(t,row){
\r
648 td = document.createElement("td");
\r
649 cbid = "jqg_"+row.id;
\r
650 $(td,t).html("<input type='checkbox'"+" id='"+cbid+"' class='cbox'/>");
\r
651 formatCol($(td,t), 0);
\r
652 row.appendChild(td);
\r
654 var reader = function (datatype) {
\r
655 var field, f=[], j=0;
\r
656 for(var i =0; i<ts.p.colModel.length; i++){
\r
657 field = ts.p.colModel[i];
\r
658 if (field.name !== 'cb' && field.name !=='subgrid') {
\r
659 f[j] = (datatype=="xml") ? field.xmlmap || field.name : field.jsonmap || field.name;
\r
665 var addXmlData = function addXmlData (xml,t) {
\r
666 if(xml) { var fpos = ts.p.treeANode; if(fpos===0) {$("tbody tr:gt(0)", t).remove();} } else { return; }
\r
667 var row,gi=0,si=0,cbid,idn, getId,f=[],rd =[],cn=(ts.p.altRows === true) ? 'alt':'';
\r
668 if(!ts.p.xmlReader.repeatitems) {f = reader("xml");}
\r
669 if( ts.p.keyIndex===false) {
\r
670 idn = ts.p.xmlReader.id;
\r
671 if( idn.indexOf("[") === -1 ) {
\r
672 getId = function( trow, k) {return $(idn,trow).text() || k;};
\r
675 getId = function( trow, k) {return trow.getAttribute(idn.replace(/[\[\]]/g,"")) || k;};
\r
678 getId = function(trow) { return (f.length - 1 >= ts.p.keyIndex) ? $(f[ts.p.keyIndex],trow).text() : $(ts.p.xmlReader.cell+":eq("+ts.p.keyIndex+")",trow).text(); };
\r
680 $(ts.p.xmlReader.page,xml).each(function() {ts.p.page = this.textContent || this.text ; });
\r
681 $(ts.p.xmlReader.total,xml).each(function() {ts.p.lastpage = this.textContent || this.text ; } );
\r
682 $(ts.p.xmlReader.records,xml).each(function() {ts.p.records = this.textContent || this.text ; } );
\r
683 $(ts.p.xmlReader.userdata,xml).each(function() {ts.p.userData[this.getAttribute("name")]=this.textContent || this.text;});
\r
684 $(ts.p.xmlReader.root+" "+ts.p.xmlReader.row,xml).each( function( j ) {
\r
685 row = document.createElement("tr");
\r
686 row.id = getId(this,j+1);
\r
687 if(ts.p.multiselect) {
\r
691 if (ts.p.subGrid) {
\r
692 try {$(ts).addSubGrid(t,row,gi,this);} catch (e){}
\r
696 if(ts.p.xmlReader.repeatitems===true){
\r
697 $(ts.p.xmlReader.cell,this).each( function (i) {
\r
698 v = this.textContent || this.text;
\r
699 addCell(t,row,v || ' ',i+gi+si);
\r
700 rd[ts.p.colModel[i+gi+si].name] = v;
\r
703 for(var i = 0; i < f.length;i++) {
\r
704 v = $(f[i],this).text();
\r
705 addCell(t, row, v || ' ', i+gi+si);
\r
706 rd[ts.p.colModel[i+gi+si].name] = v;
\r
709 if(j%2 == 1) {row.className = cn;} $(row).addClass("jqgrow");
\r
710 if( ts.p.treeGrid === true) {
\r
711 try {$(ts).setTreeNode(rd,row);} catch (e) {}
\r
713 $(ts.rows[j+fpos]).after(row);
\r
714 if(afterInsRow) {ts.p.afterInsertRow(row.id,rd,this);}
\r
718 if(isSafari || isOpera) {resizeFirstRow(t,1);}
\r
719 if(!ts.p.treeGrid) {ts.grid.bDiv.scrollTop = 0;}
\r
723 var addJSONData = function(data,t) {
\r
724 if(data) { var fpos = ts.p.treeANode; if(fpos===0) {$("tbody tr:gt(0)", t).remove();} } else { return; }
\r
725 var row,f=[],cur,gi=0,si=0,drows,idn,rd=[],cn=(ts.p.altRows===true) ? 'alt':'';
\r
726 ts.p.page = data[ts.p.jsonReader.page];
\r
727 ts.p.lastpage= data[ts.p.jsonReader.total];
\r
728 ts.p.records= data[ts.p.jsonReader.records];
\r
729 ts.p.userData = data[ts.p.jsonReader.userdata] || {};
\r
730 if(!ts.p.jsonReader.repeatitems) {f = reader("json");}
\r
731 if( ts.p.keyIndex===false ) {
\r
732 idn = ts.p.jsonReader.id;
\r
733 if(f.length>0 && !isNaN(idn)) {idn=f[idn];}
\r
735 idn = f.length>0 ? f[ts.p.keyIndex] : ts.p.keyIndex;
\r
737 drows = data[ts.p.jsonReader.root];
\r
739 for (var i=0;i<drows.length;i++) {
\r
741 row = document.createElement("tr");
\r
742 row.id = cur[idn] || "";
\r
743 if(row.id === "") {
\r
745 if(ts.p.jsonReader.cell){
\r
746 var ccur = cur[ts.p.jsonReader.cell];
\r
747 row.id = ccur[idn] || i+1;
\r
749 } else {row.id=i+1;}
\r
754 if(ts.p.multiselect){
\r
758 if (ts.p.subGrid) {
\r
759 try { $(ts).addSubGrid(t,row,gi,drows[i]);} catch (e){}
\r
762 if (ts.p.jsonReader.repeatitems === true) {
\r
763 if(ts.p.jsonReader.cell) {cur = cur[ts.p.jsonReader.cell];}
\r
764 for (var j=0;j<cur.length;j++) {
\r
765 addCell(t,row,cur[j] || ' ',j+gi+si);
\r
766 rd[ts.p.colModel[j+gi+si].name] = cur[j];
\r
769 for (var j=0;j<f.length;j++) {
\r
770 addCell(t,row,cur[f[j]] || ' ',j+gi+si);
\r
771 rd[ts.p.colModel[j+gi+si].name] = cur[f[j]];
\r
774 if(i%2 == 1) {row.className = cn;} $(row).addClass("jqgrow");
\r
775 if( ts.p.treeGrid === true) {
\r
776 try {$(ts).setTreeNode(rd,row);} catch (e) {}
\r
778 $(ts.rows[i+fpos]).after(row);
\r
779 if(afterInsRow) {ts.p.afterInsertRow(row.id,rd,drows[i]);}
\r
784 if(isSafari || isOpera) {resizeFirstRow(t,1);}
\r
785 if(!ts.p.treeGrid) {ts.grid.bDiv.scrollTop = 0;}
\r
789 var updatepager = function() {
\r
791 var cp, last,imp = ts.p.imgpath;
\r
792 if (ts.p.loadonce) {
\r
794 ts.p.lastpage = ts.page =1;
\r
795 $(".selbox",ts.p.pager).attr("disabled",true);
\r
797 cp = IntNum(ts.p.page);
\r
798 last = IntNum(ts.p.lastpage);
\r
799 $(".selbox",ts.p.pager).attr("disabled",false);
\r
801 if(ts.p.pginput===true) {
\r
802 $('input.selbox',ts.p.pager).val(ts.p.page);
\r
804 if (ts.p.viewrecords){
\r
805 $('#sp_1',ts.p.pager).html(ts.p.pgtext+" "+ts.p.lastpage );
\r
806 $('#sp_2',ts.p.pager).html(ts.p.records+" "+ts.p.recordtext+" ");
\r
808 if(ts.p.pgbuttons===true) {
\r
809 if(cp<=0) {cp = last = 1;}
\r
810 if(cp==1) {$("#first",ts.p.pager).attr({src:imp+"off-"+ts.p.firstimg,disabled:true});} else {$("#first",ts.p.pager).attr({src:imp+ts.p.firstimg,disabled:false});}
\r
811 if(cp==1) {$("#prev",ts.p.pager).attr({src:imp+"off-"+ts.p.previmg,disabled:true});} else {$("#prev",ts.p.pager).attr({src:imp+ts.p.previmg,disabled:false});}
\r
812 if(cp==last) {$("#next",ts.p.pager).attr({src:imp+"off-"+ts.p.nextimg,disabled:true});} else {$("#next",ts.p.pager).attr({src:imp+ts.p.nextimg,disabled:false});}
\r
813 if(cp==last) {$("#last",ts.p.pager).attr({src:imp+"off-"+ts.p.lastimg,disabled:true});} else {$("#last",ts.p.pager).attr({src:imp+ts.p.lastimg,disabled:false});}
\r
816 if($.isFunction(ts.p.gridComplete)) {ts.p.gridComplete();}
\r
818 var populate = function () {
\r
819 if(!grid.hDiv.loading) {
\r
821 var gdata = $.extend(ts.p.postData,{page: ts.p.page, rows: ts.p.rowNum, sidx: ts.p.sortname, sord:ts.p.sortorder, nd: (new Date().getTime()), _search:ts.p.search});
\r
822 if (ts.p.search ===true) {gdata =$.extend(gdata,ts.p.searchdata);}
\r
823 if ($.isFunction(ts.p.datatype)) {ts.p.datatype(gdata);endReq();}
\r
824 switch(ts.p.datatype)
\r
827 $.ajax({url:ts.p.url,type:ts.p.mtype,dataType:"json",data: gdata, complete:function(JSON,st) { if(st=="success") {addJSONData(eval("("+JSON.responseText+")"),ts.grid.bDiv); if(loadComplete) {loadComplete();}}}, error:function(xhr,st,err){if(loadError) {loadError(xhr,st,err);}endReq();}, beforeSend: function(xhr){if(loadBeforeSend) {loadBeforeSend(xhr);}}});
\r
828 if( ts.p.loadonce || ts.p.treeGrid) {ts.p.datatype = "local";}
\r
831 $.ajax({url:ts.p.url,type:ts.p.mtype,dataType:"xml",data: gdata , complete:function(xml,st) {if(st=="success") {addXmlData(xml.responseXML,ts.grid.bDiv); if(loadComplete) {loadComplete();}}}, error:function(xhr,st,err){if(loadError) {loadError(xhr,st,err);}endReq();}, beforeSend: function(xhr){if(loadBeforeSend) {loadBeforeSend(xhr);}}});
\r
832 if( ts.p.loadonce || ts.p.treeGrid) {ts.p.datatype = "local";}
\r
835 addXmlData(stringToDoc(ts.p.datastr),ts.grid.bDiv);
\r
836 ts.p.datastr = null;
\r
837 ts.p.datatype = "local";
\r
838 if(loadComplete) {loadComplete();}
\r
841 addJSONData(eval("("+ts.p.datastr+")"),ts.grid.bDiv);
\r
842 ts.p.datastr = null;
\r
843 ts.p.datatype = "local";
\r
844 if(loadComplete) {loadComplete();}
\r
853 var beginReq = function() {
\r
854 if(beReq) {ts.p.beforeRequest();}
\r
855 grid.hDiv.loading = true;
\r
856 switch(ts.p.loadui) {
\r
860 $("div.loading",grid.hDiv).fadeIn("fast");
\r
863 $("div.loading",grid.hDiv).fadeIn("fast");
\r
864 $("#lui_"+ts.id).width($(grid.bDiv).width()).height(IntNum($(grid.bDiv).height())+IntNum(ts.p._height)).show();
\r
868 var endReq = function() {
\r
869 grid.hDiv.loading = false;
\r
870 switch(ts.p.loadui) {
\r
874 $("div.loading",grid.hDiv).fadeOut("fast");
\r
877 $("div.loading",grid.hDiv).fadeOut("fast");
\r
878 $("#lui_"+ts.id).hide();
\r
882 var stringToDoc = function (xmlString) {
\r
885 var parser = new DOMParser();
\r
886 xmlDoc = parser.parseFromString(xmlString,"text/xml");
\r
889 xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
\r
890 xmlDoc.async=false;
\r
891 xmlDoc["loadXM"+"L"](xmlString);
\r
893 return (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.tagName != 'parsererror') ? xmlDoc : null;
\r
895 var sortArrayData = function() {
\r
896 var stripNum = /[\$,%]/g;
\r
897 var col=0,st,findSortKey,newDir = (ts.p.sortorder == "asc") ? 1 :-1;
\r
898 $.each(ts.p.colModel,function(i,v){
\r
899 if(this.index == ts.p.sortname || this.name == ts.p.sortname){
\r
900 col = ts.p.lastsort= i;
\r
901 st = this.sorttype;
\r
905 if (st == 'float') {
\r
906 findSortKey = function($cell) {
\r
907 var key = parseFloat($cell.text().replace(stripNum, ''));
\r
908 return isNaN(key) ? 0 : key;
\r
910 } else if (st=='int') {
\r
911 findSortKey = function($cell) {
\r
912 return IntNum($cell.text().replace(stripNum, ''));
\r
914 } else if(st == 'date') {
\r
915 findSortKey = function($cell) {
\r
916 var fd = ts.p.colModel[col].datefmt || "Y-m-d";
\r
917 return parseDate(fd,$cell.text()).getTime();
\r
920 findSortKey = function($cell) {
\r
921 return $cell.text().toUpperCase();
\r
925 $.each(ts.rows, function(index, row) {
\r
927 row.sortKey = findSortKey($(row).children('td').eq(col));
\r
928 rows[index-1] = this;
\r
931 if(ts.p.treeGrid) {
\r
932 $(ts).SortTree( newDir);
\r
934 rows.sort(function(a, b) {
\r
935 if (a.sortKey < b.sortKey) {return -newDir;}
\r
936 if (a.sortKey > b.sortKey) {return newDir;}
\r
939 $.each(rows, function(index, row) {
\r
940 $('tbody',ts.grid.bDiv).append(row);
\r
941 row.sortKey = null;
\r
944 if(isSafari || isOpera) {resizeFirstRow(ts.grid.bDiv,1);}
\r
945 if(ts.p.multiselect) {
\r
946 $("tbody tr:gt(0)", ts.grid.bDiv).removeClass("selected");
\r
947 $("[@id^=jqg_]",ts.rows).attr("checked",false);
\r
948 $("#cb_jqg",ts.grid.hDiv).attr("checked",false);
\r
949 ts.p.selarrrow = [];
\r
951 if( ts.p.altRows === true ) {
\r
952 $("tbody tr:gt(0)", ts.grid.bDiv).removeClass("alt");
\r
953 $("tbody tr:odd", ts.grid.bDiv).addClass("alt");
\r
955 ts.grid.bDiv.scrollTop = 0;
\r
958 var parseDate = function(format, date) {
\r
959 var tsp = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0};
\r
960 format = format.toLowerCase();
\r
961 date = date.split(/[\\\/:_;.\s-]/);
\r
962 format = format.split(/[\\\/:_;.\s-]/);
\r
963 for(var i=0;i<format.length;i++){
\r
964 tsp[format[i]] = IntNum(date[i],tsp[format[i]]);
\r
966 tsp.m = parseInt(tsp.m,10)-1;
\r
968 if (ty >= 70 && ty <= 99) {tsp.y = 1900+tsp.y;}
\r
969 else if (ty >=0 && ty <=69) {tsp.y= 2000+tsp.y;}
\r
970 return new Date(tsp.y, tsp.m, tsp.d, tsp.h, tsp.i, tsp.s,0);
\r
972 var setPager = function (){
\r
973 var inpt = "<img class='pgbuttons' src='"+ts.p.imgpath+"spacer.gif'";
\r
974 var pginp = (ts.p.pginput===true) ? "<input class='selbox' type='text' size='3' maxlength='5' value='0'/>" : "";
\r
975 if(ts.p.viewrecords===true) {pginp += "<span id='sp_1'></span> ";}
\r
976 var pgl="", pgr="";
\r
977 if(ts.p.pgbuttons===true) {
\r
978 pgl = inpt+" id='first'/>  "+inpt+" id='prev'/> ";
\r
979 pgr = inpt+" id='next' />  "+inpt+" id='last'/>";
\r
981 $(ts.p.pager).append(pgl+pginp+pgr);
\r
982 if(ts.p.rowList.length >0){
\r
983 var str="<SELECT class='selbox'>";
\r
984 for(var i=0;i<ts.p.rowList.length;i++){
\r
985 str +="<OPTION value="+ts.p.rowList[i]+((ts.p.rowNum == ts.p.rowList[i])?' selected':'')+">"+ts.p.rowList[i];
\r
988 $(ts.p.pager).append(" "+str+" <span id='sp_2'></span>");
\r
989 $(ts.p.pager).find("select").bind('change',function() {
\r
990 ts.p.rowNum = (this.value>0) ? this.value : ts.p.rowNum;
\r
991 if (typeof ts.p.onPaging =='function') {ts.p.onPaging('records');}
\r
993 ts.p.selrow = null;
\r
995 } else { $(ts.p.pager).append(" <span id='sp_2'></span>");}
\r
996 if(ts.p.pgbuttons===true) {
\r
997 $(".pgbuttons",ts.p.pager).mouseover(function(e){
\r
998 this.style.cursor= "pointer";
\r
1000 }).mouseout(function(e) {
\r
1001 this.style.cursor= "normal";
\r
1004 $("#first, #prev, #next, #last",ts.p.pager).click( function(e) {
\r
1005 var cp = IntNum(ts.p.page);
\r
1006 var last = IntNum(ts.p.lastpage), selclick = false;
\r
1007 var fp=true; var pp=true; var np=true; var lp=true;
\r
1008 if(last ===0 || last===1) {fp=false;pp=false;np=false;lp=false; }
\r
1009 else if( last>1 && cp >=1) {
\r
1010 if( cp === 1) { fp=false; pp=false; }
\r
1011 else if( cp>1 && cp <last){ }
\r
1012 else if( cp===last){ np=false;lp=false; }
\r
1013 } else if( last>1 && cp===0 ) { np=false;lp=false; cp=last-1;}
\r
1014 if( this.id === 'first' && fp ) { ts.p.page=1; selclick=true;}
\r
1015 if( this.id === 'prev' && pp) { ts.p.page=(cp-1); selclick=true;}
\r
1016 if( this.id === 'next' && np) { ts.p.page=(cp+1); selclick=true;}
\r
1017 if( this.id === 'last' && lp) { ts.p.page=last; selclick=true;}
\r
1019 if (typeof ts.p.onPaging =='function') {ts.p.onPaging(this.id);}
\r
1021 ts.p.selrow = null;
\r
1022 if(ts.p.multiselect) {ts.p.selarrrow =[];$('#cb_jqg',ts.grid.hDiv).attr("checked",false);}
\r
1023 ts.p.savedRow = [];
\r
1025 e.stopPropagation();
\r
1029 if(ts.p.pginput===true) {
\r
1030 $('input.selbox',ts.p.pager).keypress( function(e) {
\r
1031 var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
\r
1033 ts.p.page = ($(this).val()>0) ? $(this).val():ts.p.page;
\r
1034 if (typeof ts.p.onPaging =='function') {ts.p.onPaging( 'user');}
\r
1036 ts.p.selrow = null;
\r
1043 var sortData = function (index, idxcol,reload){
\r
1045 if( ts.p.lastsort === idxcol ) {
\r
1046 if( ts.p.sortorder === 'asc') {
\r
1047 ts.p.sortorder = 'desc';
\r
1048 } else if(ts.p.sortorder === 'desc') { ts.p.sortorder='asc';}
\r
1049 } else { ts.p.sortorder='asc';}
\r
1052 var imgs = (ts.p.sortorder==='asc') ? ts.p.sortascimg : ts.p.sortdescimg;
\r
1053 imgs = "<img src='"+ts.p.imgpath+imgs+"'>";
\r
1054 var thd= $("thead:first",grid.hDiv).get(0);
\r
1055 $("tr th div#jqgh_"+ts.p.colModel[ts.p.lastsort].name+" img",thd).remove();
\r
1056 $("tr th div#jqgh_"+ts.p.colModel[ts.p.lastsort].name,thd).parent().removeClass(ts.p.sortclass);
\r
1057 $("tr th div#"+index,thd).append(imgs).parent().addClass(ts.p.sortclass);
\r
1058 ts.p.lastsort = idxcol;
\r
1059 index = index.substring(5);
\r
1060 ts.p.sortname = ts.p.colModel[idxcol].index || index;
\r
1061 var so = ts.p.sortorder;
\r
1062 if(onSortCol) {onSortCol(index,idxcol,so);}
\r
1063 if(ts.p.selrow && ts.p.datatype == "local" && !ts.p.multiselect){ $('#'+ts.p.selrow,grid.bDiv).removeClass("selected");}
\r
1064 ts.p.selrow = null;
\r
1065 if(ts.p.multiselect && ts.p.datatype !== "local"){ts.p.selarrrow =[]; $("#cb_jqg",ts.grid.hDiv).attr("checked",false);}
\r
1066 ts.p.savedRow =[];
\r
1068 if(ts.p.sortname != index) {ts.p.sortname = index; ts.p.lastsort = idxcol;}
\r
1070 var setColWidth = function () {
\r
1071 var initwidth = 0;
\r
1072 for(var l=0;l<ts.p.colModel.length;l++){
\r
1073 if(!ts.p.colModel[l].hidden){
\r
1074 initwidth += IntNum(ts.p.colModel[l].width);
\r
1077 var tblwidth = ts.p.width ? ts.p.width : initwidth;
\r
1078 for(l=0;l<ts.p.colModel.length;l++) {
\r
1079 if(!ts.p.shrinkToFit){
\r
1080 ts.p.colModel[l].owidth = ts.p.colModel[l].width;
\r
1082 ts.p.colModel[l].width = Math.round(tblwidth/initwidth*ts.p.colModel[l].width);
\r
1085 var nextVisible= function(iCol) {
\r
1086 var ret = iCol, j=iCol;
\r
1087 for (var i = iCol+1;i<ts.p.colModel.length;i++){
\r
1088 if(ts.p.colModel[i].hidden !== true ) {
\r
1094 if(this.p.treeGrid === true) {
\r
1095 this.p.subGrid = false; this.p.altRows =false;
\r
1096 this.p.pgbuttons = false; this.p.pginput = false;
\r
1097 this.p.multiselect = false; this.p.rowList = [];
\r
1098 this.p.treedatatype = this.p.datatype;
\r
1099 $.each(this.p.treeReader,function(i,n){
\r
1101 ts.p.colNames.push(n);
\r
1102 ts.p.colModel.push({name:n,width:1,hidden:true,sortable:false,resizable:false,hidedlg:true,editable:true,search:false});
\r
1106 if(this.p.subGrid) {
\r
1107 this.p.colNames.unshift("");
\r
1108 this.p.colModel.unshift({name:'subgrid',width:25,sortable: false,resizable:false,hidedlg:true,search:false});
\r
1110 if(this.p.multiselect) {
\r
1111 this.p.colNames.unshift("<input id='cb_jqg' class='cbox' type='checkbox'/>");
\r
1112 this.p.colModel.unshift({name:'cb',width:27,sortable:false,resizable:false,hidedlg:true,search:false});
\r
1117 page: "rows>page",
\r
1118 total: "rows>total",
\r
1119 records : "rows>records",
\r
1120 repeatitems: true,
\r
1123 userdata: "userdata",
\r
1124 subgrid: {root:"rows", row: "row", repeatitems: true, cell:"cell"}
\r
1130 records: "records",
\r
1131 repeatitems: true,
\r
1134 userdata: "userdata",
\r
1135 subgrid: {root:"rows", repeatitems: true, cell:"cell"}
\r
1137 ts.p.xmlReader = $.extend(xReader, ts.p.xmlReader);
\r
1138 ts.p.jsonReader = $.extend(jReader, ts.p.jsonReader);
\r
1139 $.each(ts.p.colModel, function(i){if(!this.width) {this.width=150;}});
\r
1140 if (ts.p.width) {setColWidth();}
\r
1141 var thead = document.createElement("thead");
\r
1142 var trow = document.createElement("tr");
\r
1143 thead.appendChild(trow);
\r
1144 var i=0, th, idn, thdiv;
\r
1145 ts.p.keyIndex=false;
\r
1146 for (var i=0; i<ts.p.colModel.length;i++) {
\r
1147 if (ts.p.colModel[i].key===true) {
\r
1148 ts.p.keyIndex = i;
\r
1152 if(ts.p.shrinkToFit===true && ts.p.forceFit===true) {
\r
1153 for (i=ts.p.colModel.length-1;i>=0;i--){
\r
1154 if(!ts.p.colModel[i].hidden) {
\r
1155 ts.p.colModel[i].resizable=false;
\r
1160 for(i=0;i<this.p.colNames.length;i++){
\r
1161 th = document.createElement("th");
\r
1162 idn = ts.p.colModel[i].name;
\r
1163 thdiv = document.createElement("div");
\r
1164 $(thdiv).html(ts.p.colNames[i]+" ");
\r
1165 if (idn == ts.p.sortname) {
\r
1166 var imgs = (ts.p.sortorder==='asc') ? ts.p.sortascimg : ts.p.sortdescimg;
\r
1167 imgs = "<img src='"+ts.p.imgpath+imgs+"'>";
\r
1168 $(thdiv).append(imgs);
\r
1169 ts.p.lastsort = i;
\r
1170 $(th).addClass(ts.p.sortclass);
\r
1172 thdiv.id = "jqgh_"+idn;
\r
1173 th.appendChild(thdiv);
\r
1174 trow.appendChild(th);
\r
1176 if(this.p.multiselect) {
\r
1178 if(typeof ts.p.onSelectAll !== 'function') {onSA=false;}
\r
1179 $('#cb_jqg',trow).click(function(){
\r
1181 if (this.checked) {
\r
1182 $("[@id^=jqg_]",ts.rows).attr("checked",true);
\r
1183 $(ts.rows).slice(1).each(function(i) {
\r
1184 if(!$(this).hasClass("subgrid")){
\r
1185 $(this).addClass("selected");
\r
1186 ts.p.selarrrow[i]= ts.p.selrow = this.id;
\r
1192 $("[@id^=jqg_]",ts.rows).attr("checked",false);
\r
1193 $(ts.rows).slice(1).each(function(i) {
\r
1194 if(!$(this).hasClass("subgrid")){
\r
1195 $(this).removeClass("selected");
\r
1198 ts.p.selarrrow = []; ts.p.selrow = null;
\r
1201 if(onSA) {ts.p.onSelectAll(ts.p.selarrrow,chk);}
\r
1204 this.appendChild(thead);
\r
1205 thead = $("thead:first",ts).get(0);
\r
1207 $("tr:first th",thead).each(function ( j ) {
\r
1208 w = ts.p.colModel[j].width;
\r
1209 if(typeof ts.p.colModel[j].resizable === 'undefined') {ts.p.colModel[j].resizable = true;}
\r
1210 res = document.createElement("span");
\r
1211 $(res).html(" ");
\r
1212 if(ts.p.colModel[j].resizable){
\r
1213 $(this).addClass(ts.p.resizeclass);
\r
1214 $(res).mousedown(function (e) {
\r
1215 if(ts.p.forceFit===true) {ts.p.nv= nextVisible(j);}
\r
1216 grid.dragStart( j ,e.clientX);
\r
1217 e.preventDefault();
\r
1220 } else {$(res).css("cursor","default");}
\r
1221 $(this).css("width",w+"px").prepend(res);
\r
1222 if( ts.p.colModel[j].hidden) {$(this).css("display","none");}
\r
1223 grid.headers[j] = { width: w, el: this };
\r
1224 sort = ts.p.colModel[j].sortable;
\r
1225 if( typeof sort !== 'boolean') {sort = true;}
\r
1227 $("div",this).css("cursor","pointer")
\r
1228 .click(function(){sortData(this.id,j);return false;});
\r
1231 var isMSIE = $.browser.msie ? true:false;
\r
1232 var isMoz = $.browser.mozilla ? true:false;
\r
1233 var isOpera = $.browser.opera ? true:false;
\r
1234 var isSafari = $.browser.safari ? true : false;
\r
1235 var tbody = document.createElement("tbody");
\r
1236 trow = document.createElement("tr");
\r
1237 trow.id = "_empty";
\r
1238 tbody.appendChild(trow);
\r
1240 for(i=0;i<ts.p.colNames.length;i++){
\r
1241 td = document.createElement("td");
\r
1242 trow.appendChild(td);
\r
1244 this.appendChild(tbody);
\r
1246 $("tbody tr:first td",ts).each(function(ii) {
\r
1247 w = ts.p.colModel[ii].width;
\r
1248 $(this).css({width:w+"px",height:"0px"});
\r
1249 w += IntNum($(this).css("padding-left")) +
\r
1250 IntNum($(this).css("padding-right"))+
\r
1251 IntNum($(this).css("border-left-width"))+
\r
1252 IntNum($(this).css("border-right-width"));
\r
1253 if( ts.p.colModel[ii].hidden===true) {
\r
1254 $(this).css("display","none");
\r
1257 grid.cols[ii] = this;
\r
1260 if(isMoz) {$(trow).css({visibility:"collapse"});}
\r
1261 else if( isSafari || isOpera ) {$(trow).css({display:"none"});}
\r
1262 grid.width = IntNum(gw)-IntNum(hdc);
\r
1263 ts.p.width = grid.width;
\r
1264 grid.hTable = document.createElement("table");
\r
1265 grid.hTable.appendChild(thead);
\r
1266 $(grid.hTable).addClass("scroll")
\r
1267 .attr({cellSpacing:"0",cellPadding:"0",border:"0"})
\r
1268 .css({width:grid.width+"px"});
\r
1269 grid.hDiv = document.createElement("div");
\r
1270 var hg = (ts.p.caption && ts.p.hiddengrid===true) ? true : false;
\r
1272 .css({ width: grid.width+"px", overflow: "hidden"})
\r
1273 .prepend('<div class="loading">'+ts.p.loadtext+'</div>')
\r
1274 .append(grid.hTable)
\r
1275 .bind("selectstart", function () { return false; });
\r
1276 if(hg) {$(grid.hDiv).hide(); ts.p.gridstate = 'hidden'}
\r
1278 if(typeof ts.p.pager == "string") {ts.p.pager = $("#"+ts.p.pager);}
\r
1279 if( $(ts.p.pager).hasClass("scroll")) { $(ts.p.pager).css({ width: grid.width+"px", overflow: "hidden"}).show(); ts.p._height= parseInt($(ts.p.pager).height(),10); if(hg) {$(ts.p.pager).hide();}}
\r
1282 if( ts.p.cellEdit === false) {
\r
1283 $(ts).mouseover(function(e) {
\r
1284 td = (e.target || e.srcElement);
\r
1285 ptr = $(td,ts.rows).parents("tr:first");
\r
1286 if($(ptr).hasClass("jqgrow")) {
\r
1287 $(ptr).addClass("over");
\r
1288 if(!$(td).hasClass("editable")){
\r
1289 td.title = $(td).text();
\r
1293 }).mouseout(function(e) {
\r
1294 td = (e.target || e.srcElement);
\r
1295 ptr = $(td,ts.rows).parents("tr:first");
\r
1296 $(ptr).removeClass("over");
\r
1297 if(!$(td).hasClass("editable")){
\r
1304 $(ts).before(grid.hDiv).css("width", grid.width+"px").click(function(e) {
\r
1305 td = (e.target || e.srcElement);
\r
1306 var scb = $(td).hasClass("cbox");
\r
1307 ptr = $(td,ts.rows).parent("tr");
\r
1308 if($(ptr).length === 0 ){
\r
1309 ptr = $(td,ts.rows).parents("tr:first");
\r
1310 td = $(td).parents("td:first")[0];
\r
1312 if(ts.p.cellEdit === true) {
\r
1313 ri = ptr[0].rowIndex;
\r
1314 ci = td.cellIndex;
\r
1315 try {$(ts).editCell(ri,ci,true,true);} catch (e) {}
\r
1317 if ( !ts.p.multikey ) {
\r
1318 $(ts).setSelection(false,ptr);
\r
1321 ci = td.cellIndex;
\r
1322 onSC(ri,ci,$(td).html());
\r
1325 if(e[ts.p.multikey]) {
\r
1326 $(ts).setSelection(false,ptr);
\r
1327 } else if(ts.p.multiselect) {
\r
1328 if(scb) { scb = $("[@id^=jqg_]",ptr).attr("checked");
\r
1329 $("[@id^=jqg_]",ptr).attr("checked",!scb);
\r
1333 e.stopPropagation();
\r
1334 }).bind('reloadGrid', function(e) {
\r
1335 if(!ts.p.treeGrid) {ts.p.selrow=null;}
\r
1336 if(ts.p.multiselect) {ts.p.selarrrow =[];$('#cb_jqg',ts.grid.hDiv).attr("checked",false);}
\r
1339 if( ondblClickRow ) {
\r
1340 $(this).dblclick(function(e) {
\r
1341 td = (e.target || e.srcElement);
\r
1342 ptr = $(td,ts.rows).parent("tr");
\r
1343 if($(ptr).length === 0 ){
\r
1344 ptr = $(td,ts.rows).parents("tr:first");
\r
1346 ts.p.ondblClickRow($(ptr).attr("id"));
\r
1350 if (onRightClickRow) {
\r
1351 $(this).bind('contextmenu', function(e) {
\r
1352 td = (e.target || e.srcElement);
\r
1353 ptr = $(td,ts).parents("tr:first");
\r
1354 if($(ptr).length === 0 ){
\r
1355 ptr = $(td,ts.rows).parents("tr:first");
\r
1357 $(ts).setSelection(false,ptr);
\r
1358 ts.p.onRightClickRow($(ptr).attr("id"));
\r
1362 grid.bDiv = document.createElement("div");
\r
1363 var ofl2 = (isNaN(ts.p.height) && isMoz && (ts.p.height.indexOf("%")!=-1 || ts.p.height=="auto")) ? "hidden" : "auto";
\r
1365 .scroll(function (e) {grid.scrollGrid();})
\r
1366 .css({ height: ts.p.height+(isNaN(ts.p.height)?"":"px"), padding: "0px", margin: "0px", overflow: ofl2,width: (grid.width)+"px"} ).css("overflow-x","hidden")
\r
1368 $("table:first",grid.bDiv).css({width:grid.width+"px",marginRight:"20px"});
\r
1370 if( $("tbody",this).size() === 2 ) { $("tbody:first",this).remove();}
\r
1371 if( ts.p.multikey) {$(grid.bDiv).bind("selectstart",function(){return false;});}
\r
1372 if(ts.p.treeGrid) {$(grid.bDiv).css("position","relative");}
\r
1374 if( ts.p.multikey) {$(grid.bDiv).bind("mousedown",function(){return false;});}
\r
1376 if(hg) {$(grid.bDiv).hide();}
\r
1377 grid.cDiv = document.createElement("div");
\r
1378 $(grid.cDiv).append("<table class='Header' cellspacing='0' cellpadding='0' border='0'><tr><td class='HeaderLeft'><img src='"+ts.p.imgpath+"spacer.gif' border='0' /></td><th>"+ts.p.caption+"</th>"+ ((ts.p.hidegrid===true) ? "<td class='HeaderButton'><img src='"+ts.p.imgpath+"up.gif' border='0'/></td>" :"") +"<td class='HeaderRight'><img src='"+ts.p.imgpath+"spacer.gif' border='0' /></td></tr></table>").addClass("GridHeader");
\r
1379 $(grid.cDiv).insertBefore(grid.hDiv);
\r
1380 if( ts.p.toolbar[0] ) {
\r
1381 grid.uDiv = document.createElement("div");
\r
1382 if(ts.p.toolbar[1] == "top") {$(grid.uDiv).insertBefore(grid.hDiv);}
\r
1383 else {$(grid.uDiv).insertAfter(grid.hDiv);}
\r
1384 $(grid.uDiv,ts).width(grid.width).addClass("userdata").attr("id","t_"+this.id);
\r
1385 ts.p._height += parseInt($(grid.uDiv,ts).height(),10);
\r
1386 if(hg) {$(grid.uDiv,ts).hide();}
\r
1388 if(ts.p.caption) {
\r
1389 $(grid.cDiv,ts).width(grid.width).css("text-align","center").show("fast");
\r
1390 ts.p._height += parseInt($(grid.cDiv,ts).height(),10);
\r
1391 var tdt = ts.p.datatype;
\r
1392 if(ts.p.hidegrid===true) {
\r
1393 $(".HeaderButton",grid.cDiv).toggle( function(){
\r
1394 if(ts.p.pager) {$(ts.p.pager).fadeOut("slow");}
\r
1395 if(ts.p.toolbar[0]) {$(grid.uDiv,ts).fadeOut("slow");}
\r
1396 $(grid.bDiv,ts).fadeOut("slow");
\r
1397 $(grid.hDiv,ts).fadeOut("slow");
\r
1398 $("img",this).attr("src",ts.p.imgpath+"down.gif");
\r
1399 ts.p.gridstate = 'hidden';
\r
1400 if(onHdCl) {if(!hg) {ts.p.onHeaderClick(ts.p.gridstate);}}
\r
1403 $(grid.hDiv ,ts).fadeIn("slow");
\r
1404 $(grid.bDiv,ts).fadeIn("slow");
\r
1405 if(ts.p.pager) {$(ts.p.pager,ts).fadeIn("slow");}
\r
1406 if(ts.p.toolbar[0]) {$(grid.uDiv).fadeIn("slow");}
\r
1407 $("img",this).attr("src",ts.p.imgpath+"up.gif");
\r
1408 if(hg) {ts.p.datatype = tdt;populate();hg=false;}
\r
1409 ts.p.gridstate = 'visible';
\r
1410 if(onHdCl) {ts.p.onHeaderClick(ts.p.gridstate)}
\r
1413 if(hg) { $(".HeaderButton",grid.cDiv).trigger("click"); ts.p.datatype="local";}
\r
1416 ts.p._height += parseInt($(grid.hDiv,ts).height(),10);
\r
1417 $(grid.hDiv).mousemove(function (e) {grid.dragMove(e.clientX); return false;}).after(grid.bDiv);
\r
1418 $(document).mouseup(function (e) {
\r
1419 if(grid.resizing) {
\r
1421 if(grid.newWidth && ts.p.forceFit===false){
\r
1422 var gwdt = (grid.width <= ts.p.width) ? grid.width : ts.p.width;
\r
1423 var overfl = (grid.width <= ts.p.width) ? "hidden" : "auto";
\r
1424 if(ts.p.pager && $(ts.p.pager).hasClass("scroll") ) {
\r
1425 $(ts.p.pager).width(gwdt);
\r
1427 if(ts.p.caption) {$(grid.cDiv).width(gwdt);}
\r
1428 if(ts.p.toolbar[0]) {$(grid.uDiv).width(gwdt);}
\r
1429 $(grid.bDiv).width(gwdt).css("overflow-x",overfl);
\r
1430 $(grid.hDiv).width(gwdt);
\r
1435 ts.formatCol = function(a,b) {formatCol(a,b);};
\r
1436 ts.sortData = function(a,b,c){sortData(a,b,c);};
\r
1437 ts.updatepager = function(){updatepager();};
\r
1439 ts.addXmlData = function(d) {addXmlData(d,ts.grid.bDiv);};
\r
1440 ts.addJSONData = function(d) {addJSONData(d,ts.grid.bDiv);};
\r
1442 if (!ts.p.shrinkToFit) {
\r
1443 ts.p.forceFit = false;
\r
1444 $("tr:first th", thead).each(function(j){
\r
1445 var w = ts.p.colModel[j].owidth;
\r
1446 var diff = w - ts.p.colModel[j].width;
\r
1447 if (diff > 0 && !ts.p.colModel[j].hidden) {
\r
1448 grid.headers[j].width = w;
\r
1449 $(this).add(grid.cols[j]).width(w);
\r
1450 $('table:first',grid.bDiv).add(grid.hTable).width(ts.grid.width);
\r
1451 ts.grid.width += diff;
\r
1452 grid.hDiv.scrollLeft = grid.bDiv.scrollLeft;
\r
1455 ofl2 = (grid.width <= ts.p.width) ? "hidden" : "auto";
\r
1456 $(grid.bDiv).css({"overflow-x":ofl2});
\r
1458 $(window).unload(function () {
\r
1459 $(this).unbind("*");
\r