ks-grid.js 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535
  1. /**
  2. * grid.
  3. * @param {Object} $
  4. * @memberOf {TypeName}
  5. * @return {TypeName}
  6. */
  7. (function($){
  8. $.addFlex = function(t,p)
  9. {
  10. if (t.grid) return false; //return if already exist
  11. // apply default properties
  12. p = $.extend({
  13. height: 300, //default height
  14. width: 'auto', //auto width
  15. striped: true, //apply odd even stripes
  16. novstripe: false,
  17. minwidth: 30, //min width of columns
  18. minheight: 80, //min height of columns
  19. resizable: false, //resizable table
  20. url: false, //ajax url
  21. method: 'POST', // data sending method
  22. dataType: 'json', // type of data loaded
  23. errormsg: 'Connection Error',
  24. usepager: false, //
  25. nowrap: true, //
  26. page: 1, //current page
  27. total: 1, //total rows
  28. useRp: true, //use the results per page select box
  29. rp: 15, // results per page
  30. rpOptions: [10,15,20,30,50,100],
  31. title: false,
  32. pagestat: '显示记录从 {from}—{to}, 总数 {total} 条',
  33. procmsg: '处理中, 请稍候 ...',
  34. query: '',
  35. qtype: '',
  36. nomsg: '没有符合条件的记录存在!',
  37. minColToggle: 1, //minimum allowed column to be hidden
  38. showToggleBtn: true, //show or hide column toggle popup
  39. hideOnSubmit: true,
  40. autoload: true,
  41. blockOpacity: 0.6,
  42. onToggleCol: false,
  43. onChangeSort: false,
  44. onSuccess: false,
  45. onSubmit: false, // using a custom populate function
  46. useAjax:true,
  47. pageName:'page',
  48. pageSizeName:'pageSize',
  49. realTime:false
  50. }, p);
  51. $(t)
  52. .show() //show if hidden
  53. .attr({cellPadding: 0, cellSpacing: 0, border: 0}) //remove padding and spacing
  54. .removeAttr('width') //remove width properties
  55. ;
  56. //create grid class
  57. var g = {
  58. hset : {},
  59. rePosDrag: function () {
  60. var cdleft = 0 - this.hDiv.scrollLeft;
  61. if (this.hDiv.scrollLeft>0) cdleft -= Math.floor(p.cgwidth/2);
  62. $(g.cDrag).css({top:g.hDiv.offsetTop+1});
  63. var cdpad = this.cdpad;
  64. $('div',g.cDrag).hide();
  65. $('thead tr:first th:visible',this.hDiv).each
  66. (
  67. function ()
  68. {
  69. var n = $('thead tr:first th:visible',g.hDiv).index(this);
  70. var cdpos = parseInt($('div',this).width());
  71. var ppos = cdpos;
  72. if (cdleft==0)
  73. cdleft -= Math.floor(p.cgwidth/2);
  74. cdpos = cdpos + cdleft + cdpad;
  75. $('div:eq('+n+')',g.cDrag).css({'left':cdpos+'px'}).show();
  76. cdleft = cdpos;
  77. }
  78. );
  79. },
  80. fixHeight: function (newH) {
  81. newH = false;
  82. if (!newH) newH = $(g.bDiv).height();
  83. var hdHeight = $(this.hDiv).height();
  84. $('div',this.cDrag).each(
  85. function ()
  86. {
  87. $(this).height(newH+hdHeight);
  88. }
  89. );
  90. var nd = parseInt($(g.nDiv).height());
  91. if (nd>newH)
  92. $(g.nDiv).height(newH).width(200);
  93. else
  94. $(g.nDiv).height('auto').width('auto');
  95. //$(g.block).css({height:newH,marginBottom:(newH * -1)});
  96. var hrH = g.bDiv.offsetTop + newH;
  97. if (p.height != 'auto' && p.resizable) hrH = g.vDiv.offsetTop;
  98. $(g.rDiv).css({height: hrH});
  99. },
  100. dragStart: function (dragtype,e,obj) { //default drag function start
  101. if (dragtype=='colresize') //column resize
  102. {
  103. $(g.nDiv).hide();$(g.nBtn).hide();
  104. var n = $('div',this.cDrag).index(obj);
  105. var ow = $('th:visible div:eq('+n+')',this.hDiv).width();
  106. $(obj).addClass('dragging').siblings().hide();
  107. $(obj).prev().addClass('dragging').show();
  108. this.colresize = {startX: e.pageX, ol: parseInt(obj.style.left), ow: ow, n : n };
  109. $('body').css('cursor','col-resize');
  110. }
  111. else if (dragtype=='vresize') //table resize
  112. {
  113. var hgo = false;
  114. $('body').css('cursor','row-resize');
  115. if (obj)
  116. {
  117. hgo = true;
  118. $('body').css('cursor','col-resize');
  119. }
  120. this.vresize = {h: p.height, sy: e.pageY, w: p.width, sx: e.pageX, hgo: hgo};
  121. }
  122. else if (dragtype=='colMove') //column header drag
  123. {
  124. $(g.nDiv).hide();$(g.nBtn).hide();
  125. this.hset = $(this.hDiv).offset();
  126. this.hset.right = this.hset.left + $('table',this.hDiv).width();
  127. this.hset.bottom = this.hset.top + $('table',this.hDiv).height();
  128. this.dcol = obj;
  129. this.dcoln = $('th',this.hDiv).index(obj);
  130. this.colCopy = document.createElement("div");
  131. this.colCopy.className = "colCopy";
  132. this.colCopy.innerHTML = obj.innerHTML;
  133. if ($.browser.msie)
  134. {
  135. this.colCopy.className = "colCopy ie";
  136. }
  137. $(this.colCopy).css({position:'absolute',styleFloat:'left',display:'none', textAlign: obj.align});
  138. $('body').append(this.colCopy);
  139. $(this.cDrag).hide();
  140. }
  141. $('body').noSelect();
  142. },
  143. dragMove: function (e) {
  144. if (this.colresize) //column resize
  145. {
  146. var n = this.colresize.n;
  147. var diff = e.pageX-this.colresize.startX;
  148. var nleft = this.colresize.ol + diff;
  149. var nw = this.colresize.ow + diff;
  150. if (nw > p.minwidth)
  151. {
  152. $('div:eq('+n+')',this.cDrag).css('left',nleft);
  153. this.colresize.nw = nw;
  154. }
  155. }
  156. else if (this.vresize) //table resize
  157. {
  158. var v = this.vresize;
  159. var y = e.pageY;
  160. var diff = y-v.sy;
  161. if (!p.defwidth) p.defwidth = p.width;
  162. if (p.width != 'auto' && !p.nohresize && v.hgo)
  163. {
  164. var x = e.pageX;
  165. var xdiff = x - v.sx;
  166. var newW = v.w + xdiff;
  167. if (newW > p.defwidth)
  168. {
  169. this.gDiv.style.width = newW + 'px';
  170. p.width = newW;
  171. }
  172. }
  173. var newH = v.h + diff;
  174. if ((newH > p.minheight || p.height < p.minheight) && !v.hgo)
  175. {
  176. this.bDiv.style.height = newH + 'px';
  177. p.height = newH;
  178. this.fixHeight(newH);
  179. }
  180. v = null;
  181. }
  182. else if (this.colCopy) {
  183. $(this.dcol).addClass('thMove').removeClass('thOver');
  184. if (e.pageX > this.hset.right || e.pageX < this.hset.left || e.pageY > this.hset.bottom || e.pageY < this.hset.top)
  185. {
  186. //this.dragEnd();
  187. $('body').css('cursor','move');
  188. }
  189. else
  190. $('body').css('cursor','pointer');
  191. $(this.colCopy).css({top:e.pageY + 10,left:e.pageX + 20, display: 'block'});
  192. }
  193. },
  194. dragEnd: function () {
  195. if (this.colresize)
  196. {
  197. var n = this.colresize.n;
  198. var nw = this.colresize.nw;
  199. $('th:visible div:eq('+n+')',this.hDiv).css('width',nw);
  200. $('tr',this.bDiv).each (
  201. function ()
  202. {
  203. $('td:visible div:eq('+n+')',this).css('width',nw);
  204. }
  205. );
  206. this.hDiv.scrollLeft = this.bDiv.scrollLeft;
  207. $('div:eq('+n+')',this.cDrag).siblings().show();
  208. $('.dragging',this.cDrag).removeClass('dragging');
  209. this.rePosDrag();
  210. this.fixHeight();
  211. this.colresize = false;
  212. }
  213. else if (this.vresize)
  214. {
  215. this.vresize = false;
  216. }
  217. else if (this.colCopy)
  218. {
  219. $(this.colCopy).remove();
  220. if (this.dcolt != null)
  221. {
  222. if (this.dcoln>this.dcolt)
  223. $('th:eq('+this.dcolt+')',this.hDiv).before(this.dcol);
  224. else
  225. $('th:eq('+this.dcolt+')',this.hDiv).after(this.dcol);
  226. this.switchCol(this.dcoln,this.dcolt);
  227. $(this.cdropleft).remove();
  228. $(this.cdropright).remove();
  229. this.rePosDrag();
  230. }
  231. this.dcol = null;
  232. this.hset = null;
  233. this.dcoln = null;
  234. this.dcolt = null;
  235. this.colCopy = null;
  236. $('.thMove',this.hDiv).removeClass('thMove');
  237. $(this.cDrag).show();
  238. }
  239. $('body').css('cursor','default');
  240. $('body').noSelect(false);
  241. },
  242. toggleCol: function(cid,visible) {
  243. var ncol = $("th[axis='col"+cid+"']",this.hDiv)[0];
  244. var n = $('thead th',g.hDiv).index(ncol);
  245. var cb = $('input[value='+cid+']',g.nDiv)[0];
  246. // alert(cb.checked);
  247. if (visible==null ) {
  248. visible = cb.checked;
  249. }
  250. if ($('input:checked',g.nDiv).length<p.minColToggle&&!visible) return false;
  251. // =======add by ls
  252. //var form = $(t).parents("form:first");
  253. // =======add by ls end
  254. if (visible)
  255. {
  256. ncol.hide = false;
  257. $(ncol).show();
  258. cb.checked = true;
  259. // =======add by ls
  260. //if (form && p.method.toLowerCase() == 'post') {
  261. //alert("可见");
  262. // $("#colHides"+parseInt(cid)).remove();
  263. //}
  264. // =======add by ls end
  265. }
  266. else {
  267. // =======add by ls
  268. //if (form && p.method.toLowerCase() == 'post') {
  269. // form.append($("<input type='hidden'>").attr({name:"colHides",value:cid,id:("colHides"+parseInt(cid))}));
  270. //alert("隐藏");
  271. //alert($("#colHides"+parseInt(cid)).attr("name"));
  272. //}
  273. // =======add by ls end
  274. ncol.hide = true;
  275. $(ncol).hide();
  276. cb.checked = false;
  277. }
  278. $('tbody tr',t).each(
  279. function ()
  280. {
  281. if (visible)
  282. $('td:eq('+n+')',this).show();
  283. else
  284. $('td:eq('+n+')',this).hide();
  285. }
  286. );
  287. this.rePosDrag();
  288. if (p.onToggleCol) p.onToggleCol(cid,visible);
  289. return visible;
  290. },
  291. switchCol: function(cdrag,cdrop) { //switch columns
  292. $('tbody tr',t).each
  293. (
  294. function ()
  295. {
  296. if (cdrag>cdrop)
  297. $('td:eq('+cdrop+')',this).before($('td:eq('+cdrag+')',this));
  298. else
  299. $('td:eq('+cdrop+')',this).after($('td:eq('+cdrag+')',this));
  300. }
  301. );
  302. //switch order in nDiv
  303. if (cdrag>cdrop)
  304. $('tr:eq('+cdrop+')',this.nDiv).before($('tr:eq('+cdrag+')',this.nDiv));
  305. else
  306. $('tr:eq('+cdrop+')',this.nDiv).after($('tr:eq('+cdrag+')',this.nDiv));
  307. if ($.browser.msie&&$.browser.version<7.0) $('tr:eq('+cdrop+') input',this.nDiv)[0].checked = true;
  308. this.hDiv.scrollLeft = this.bDiv.scrollLeft;
  309. },
  310. scroll: function() {
  311. this.hDiv.scrollLeft = this.bDiv.scrollLeft;
  312. this.rePosDrag();
  313. },
  314. addData: function (data) { //parse data
  315. if (p.preProcess)
  316. data = p.preProcess(data);
  317. if ($.isFunction(p.ajaxDataHandler)) {
  318. p.ajaxDataHandler.call(g, data, p);
  319. }
  320. $('.pReload',this.pDiv).removeClass('loading');
  321. this.loading = false;
  322. if (!data)
  323. {
  324. $('.pPageStat',this.pDiv).html(p.errormsg);
  325. return false;
  326. }
  327. if (p.dataType=='xml')
  328. p.total = +$('rows total',data).text();
  329. else
  330. p.total = data.total;
  331. if (p.total==0)
  332. {
  333. $('tr, a, td, div',t).unbind();
  334. $(t).empty();
  335. p.pages = 1;
  336. p.page = 1;
  337. this.buildpager();
  338. $('.pPageStat',this.pDiv).html(p.nomsg);
  339. return false;
  340. }
  341. p.pages = Math.ceil(p.total/p.rp);
  342. if (p.dataType=='xml')
  343. p.page = +$('rows page',data).text();
  344. else
  345. p.page = data.page;
  346. this.buildpager();
  347. //build new body
  348. var tbody = document.createElement('tbody');
  349. if (p.dataType=='json'){
  350. $.each(data.rows, function(i,row) {
  351. var tr = document.createElement('tr');
  352. if (i % 2 && p.striped) tr.className = 'erow';
  353. if (row.id) tr.id = 'row' + row.id;
  354. //add cell
  355. $('thead tr:first th',g.hDiv).each(function(i){
  356. var td = document.createElement('td');
  357. var field = $(this).attr('field');
  358. //add by ls
  359. var tdalign = this.getAttribute('tdalign');
  360. if (tdalign) td.align = tdalign;
  361. td.width = this.width;
  362. td.style.display = this.style.display;
  363. td.style.cssText = this.style.cssText;
  364. // var tempStyle = this.getAttribute('tempStyle');
  365. // if(tempStyle){
  366. // td.style.cssText += tempStyle;
  367. // }
  368. // td.align = this.align; //remove by ls
  369. if (typeof(field) != 'undefined') {
  370. var fieldData = row[field];
  371. if(String(fieldData) == 'true'){
  372. fieldData = '是';
  373. }else if(String(fieldData) == 'false'){
  374. fieldData = '否';
  375. }
  376. if (typeof(fieldData) != 'undefined') {
  377. td.innerHTML = fieldData == null ? "" : fieldData;
  378. } else {
  379. td.innerHTML = "&nbsp;";
  380. }
  381. fieldData = null;
  382. }
  383. $(tr).append(td);
  384. td = null;
  385. });
  386. if ($('thead',this.gDiv).length<1){ //handle if grid has no headers
  387. for (var field in row) {
  388. var td = document.createElement('td');
  389. td.innerHTML = row[field];
  390. $(tr).append(td);
  391. td = null;
  392. }
  393. }
  394. $(tbody).append(tr);
  395. tr = null;
  396. });
  397. // $('thead tr:first th',g.hDiv).each(function(){
  398. // var thisDisplay = this.style.display;
  399. // this.setAttribute("tempStyle",this.style.cssText);
  400. // this.style.cssText = "";
  401. // this.style.display = thisDisplay;
  402. // });
  403. } else if (p.dataType=='xml') {
  404. i = 1;
  405. $("rows row",data).each
  406. (
  407. function ()
  408. {
  409. i++;
  410. var tr = document.createElement('tr');
  411. if (i % 2 && p.striped) tr.className = 'erow';
  412. var nid =$(this).attr('id');
  413. if (nid) tr.id = 'row' + nid;
  414. nid = null;
  415. var robj = this;
  416. $('thead tr:first th',g.hDiv).each
  417. (
  418. function ()
  419. {
  420. var td = document.createElement('td');
  421. var idx = $(this).attr('axis').substr(3);
  422. td.align = this.align;
  423. td.innerHTML = $("cell:eq("+ idx +")",robj).text();
  424. $(tr).append(td);
  425. td = null;
  426. }
  427. );
  428. if ($('thead',this.gDiv).length<1) //handle if grid has no headers
  429. {
  430. $('cell',this).each
  431. (
  432. function ()
  433. {
  434. var td = document.createElement('td');
  435. td.innerHTML = $(this).text();
  436. $(tr).append(td);
  437. td = null;
  438. }
  439. );
  440. }
  441. $(tbody).append(tr);
  442. tr = null;
  443. robj = null;
  444. }
  445. );
  446. } else if (p.dataType=='xhtml') {
  447. i = 1;
  448. $("table[id=" + t.id + "] tbody tr", data).each
  449. (
  450. function ()
  451. {
  452. i++;
  453. var tr = document.createElement('tr');
  454. if (i % 2 && p.striped) tr.className = 'erow';
  455. var nid =$(this).attr('id');
  456. if (nid) tr.id = 'row' + nid;
  457. nid = null;
  458. var robj = this;
  459. $('thead tr:first th',g.hDiv).each
  460. (
  461. function ()
  462. {
  463. var td = document.createElement('td');
  464. var idx = $(this).attr('axis').substr(3);
  465. td.align = this.align;
  466. td.innerHTML = $("td:eq("+ idx +")",robj).text();
  467. $(tr).append(td);
  468. td = null;
  469. }
  470. );
  471. if ($('thead',this.gDiv).length<1) //handle if grid has no headers
  472. {
  473. $('td',this).each
  474. (
  475. function ()
  476. {
  477. var td = document.createElement('td');
  478. td.innerHTML = $(this).text();
  479. $(tr).append(td);
  480. td = null;
  481. }
  482. );
  483. }
  484. $(tbody).append(tr);
  485. tr = null;
  486. robj = null;
  487. }
  488. );
  489. }
  490. $('tr',t).unbind();
  491. $(t).empty();
  492. $(t).append(tbody);
  493. this.addCellProp();
  494. this.addRowProp();
  495. //this.fixHeight($(this.bDiv).height());
  496. this.rePosDrag();
  497. tbody = null; data = null; i = null;
  498. if (p.onSuccess) p.onSuccess();
  499. if (p.hideOnSubmit) $(g.block).remove();//$(t).show();
  500. this.hDiv.scrollLeft = this.bDiv.scrollLeft;
  501. if ($.browser.opera) $(t).css('visibility','visible');
  502. if ($.isFunction(p.loadSuccessHandler)) {
  503. p.loadSuccessHandler.call(g,p);
  504. }
  505. },
  506. changeSort: function(th) { //change sortorder
  507. if (this.loading) return true;
  508. $(g.nDiv).hide();$(g.nBtn).hide();
  509. p.sortname= $(th).attr('abbr');
  510. if (p.sortname == $(th).attr('abbr'))
  511. {
  512. if (p.sortorder=='asc') p.sortorder = 'desc';
  513. else p.sortorder = 'asc';
  514. }
  515. $(th).addClass('sorted').siblings().removeClass('sorted');
  516. $('.sdesc',this.hDiv).removeClass('sdesc');
  517. $('.sasc',this.hDiv).removeClass('sasc');
  518. // alert(p.sortorder);
  519. // alert(p.sortname);
  520. $('div',th).addClass('s'+p.sortorder);
  521. if (p.onChangeSort)
  522. p.onChangeSort(p.sortname,p.sortorder);
  523. else
  524. this.populate();
  525. },
  526. buildpager: function(){ //rebuild pager based on new properties
  527. $('.pcontrol input',this.pDiv).val(p.page);
  528. $('.pcontrol span',this.pDiv).html(p.pages + " 页");
  529. var r1 = (p.page-1) * p.rp + 1;
  530. var r2 = r1 + p.rp - 1;
  531. if (p.total<r2) r2 = p.total;
  532. var stat = p.pagestat;
  533. stat = stat.replace(/{from}/,r1);
  534. stat = stat.replace(/{to}/,r2);
  535. stat = stat.replace(/{total}/,p.total);
  536. $('.pPageStat',this.pDiv).html(stat);
  537. },
  538. populate: function () { //get latest data
  539. if (this.loading) return true;
  540. if (p.onSubmit)
  541. {
  542. var gh = p.onSubmit();
  543. if (!gh) return false;
  544. }
  545. if (p.page>p.pages) p.page = p.pages;
  546. if (!p.newp) p.newp = p.page;
  547. //by ls
  548. if (!p.useAjax) {
  549. var form = $(t).parents("form:first");
  550. if (form && p.method.toLowerCase() == 'post') {
  551. form.append($("<input type='hidden'>").attr({name:"grid",value:$(t).attr("id")}));
  552. form.append($("<input type='hidden'>").attr({name:p.pageName,value:p.newp}));
  553. form.append($("<input type='hidden'>").attr({name:p.pageSizeName,value:p.rp}));
  554. // $(':hidden[name=' + p.pageName + ']', form).val(p.newp);
  555. // $(':hidden[name=' + p.pageSizeName + ']', form).val(p.rp);
  556. if (p.sortname){
  557. form.append($("<input type='hidden'>").attr({name:"sortname",value:p.sortname}));
  558. }
  559. if (p.sortorder){
  560. // =======add by ls
  561. if(p.sortorder == "asc"){
  562. $("#orderId").remove();
  563. p.sortorder == "desc";
  564. }else{
  565. $("#orderId").remove();
  566. p.sortorder == "asc";
  567. }
  568. // =======add by ls end
  569. form.append($("<input type='hidden'>").attr({name:"sortorder",value:p.sortorder}));
  570. }
  571. var gh = true;
  572. if (form.onsubmit) gh = form.onsubmit();
  573. if (gh) {
  574. if (p.url) $(form).attr("action", p.url);
  575. $(form).submit();
  576. }
  577. } else {
  578. var url = p.url ? p.url : window.location.href;
  579. var qsPos = url.indexOf("?");
  580. var qsParser;
  581. if (qsPos != -1) {
  582. qsParser = $.querystring(url.substr(qsPos + 1));
  583. url = url.substr(0, qsPos);
  584. } else {
  585. qsParser = $.querystring('');
  586. }
  587. qsParser.set('grid', $(t).attr("id")).set(p.pageName, p.newp)
  588. .set('pageSize', p.rp);
  589. if (p.sortname && p.sortname.length > 0)
  590. qsParser.set('sortname', p.sortname).set('sortorder', p.sortorder);
  591. if (p.qtype && p.qtype.length > 0 && p.query.length > 0)
  592. qsParser.set('filterValue', p.query).set('filterField', p.qtype);
  593. window.location.href = url + "?" + qsParser.toString();
  594. }
  595. return true;
  596. }
  597. if (!p.url) return false;
  598. this.loading = true;
  599. $('.pPageStat',this.pDiv).html(p.procmsg);
  600. $('.pReload',this.pDiv).addClass('loading');
  601. //block to prevent to operate the grid.
  602. var hDivOffset = $(g.hDiv).offset();
  603. $(g.block).css({
  604. top:hDivOffset.top,
  605. left:hDivOffset.left,
  606. height:$(g.hDiv).height() + $(g.bDiv).height(),
  607. width:$(g.hDiv).width()
  608. });
  609. if (p.hideOnSubmit && !p.realTime) $("body").append(g.block); //$(t).hide();
  610. if ($.browser.opera) $(t).css('visibility','hidden');
  611. //--------------
  612. //var param = {page:p.newp, rp: p.rp, sortname: p.sortname, sortorder: p.sortorder, query: p.query, qtype: p.qtype};
  613. var param = [
  614. { name : p.pageName, value : p.newp }
  615. ,{ name : p.pageSizeName, value : p.rp }
  616. ,{ name : 'sortname', value : p.sortname}
  617. ,{ name : 'sortorder', value : p.sortorder }
  618. ,{ name : 'filterValue', value : p.query}
  619. ,{ name : 'filterField', value : p.qtype}
  620. ];
  621. //alert(p.query);
  622. //alert(p.qtype);
  623. if (p.params)
  624. {
  625. for (var pi = 0; pi < p.params.length; pi++) param[param.length] = p.params[pi];
  626. }
  627. $.ajax({
  628. type: p.method,
  629. url: p.url,
  630. data: param,
  631. timeout : 20000,
  632. cache : false,
  633. dataType: p.dataType == 'xhtml' ? 'xml' : p.dataType,
  634. success: function(data){
  635. /**
  636. * 获取数据成功后的操作
  637. * 1.设置加载状态为:false,
  638. * 2.向grid中加入数据
  639. * 3.关掉grid遮罩
  640. */
  641. g.addData(data);
  642. if (p.hideOnSubmit) {
  643. if(g.loading == true){
  644. g.loading = false;
  645. //setTimeout(function(){$(g.block).remove();},1000);
  646. $(g.block).remove();
  647. }
  648. }
  649. // g.addData(data);
  650. // if (p.hideOnSubmit) {
  651. // $(g.block).remove();
  652. // }
  653. },
  654. error: function(req, status, e) {
  655. try {
  656. if (p.onError)
  657. p.onError(data);
  658. else
  659. alert('获取列表数据失败!\n' + req.status + ":" + req.statusText);
  660. } catch (e) {}
  661. if (p.hideOnSubmit) $(g.block).remove();
  662. }
  663. });
  664. },
  665. doSearch: function () {
  666. p.query = $('input[name=filterValue]',g.sDiv).val();
  667. p.qtype = $('select[name=filterField]',g.sDiv).val();
  668. p.newp = 1;
  669. this.populate();
  670. },
  671. changePage: function (ctype){ //change page
  672. if (this.loading) return true;
  673. switch(ctype)
  674. {
  675. case 'first': p.newp = 1; break;
  676. case 'prev': if (p.page>1) p.newp = parseInt(p.page) - 1; break;
  677. case 'next': if (p.page<p.pages) p.newp = parseInt(p.page) + 1; break;
  678. case 'last': p.newp = p.pages; break;
  679. case 'input':
  680. var nv = parseInt($('.pcontrol input',this.pDiv).val());
  681. if (isNaN(nv)) nv = 1;
  682. if (nv<1) nv = 1;
  683. else if (nv > p.pages) nv = p.pages;
  684. $('.pcontrol input',this.pDiv).val(nv);
  685. p.newp =nv;
  686. break;
  687. }
  688. if (typeof(p.newp) != 'number' || p.newp==p.page) return false;
  689. if (p.onChangePage)
  690. p.onChangePage(p.newp);
  691. else
  692. this.populate();
  693. },
  694. addCellProp: function ()
  695. {
  696. $('tbody tr td',g.bDiv).each
  697. (
  698. function ()
  699. {
  700. var tdDiv = document.createElement('div');
  701. var n = $('td',$(this).parent()).index(this);
  702. var pth = $('th:eq('+n+')',g.hDiv).get(0);
  703. if (pth!=null)
  704. {
  705. if (p.sortname==$(pth).attr('abbr')&&p.sortname)
  706. {
  707. this.className = 'sorted';
  708. }
  709. $(tdDiv).css({
  710. textAlign:this.getAttribute("align") ? this.align : pth.align,
  711. width: this.width.length > 0 ? this.width : $('div:first',pth)[0].style.width
  712. });
  713. if (pth.hide) $(this).css('display','none');
  714. if (p.nowrap==false || pth.noWrap == false) $(tdDiv).css('white-space','normal');
  715. } else {
  716. $(tdDiv).css({
  717. textAlign : this.getAttribute("align"),
  718. width : this.width + "px"
  719. });
  720. if (this.noWrap == false) $(tdDiv).css('white-space','normal');
  721. }
  722. if (this.innerHTML=='') this.innerHTML = '&nbsp;';
  723. //tdDiv.value = this.innerHTML; //store preprocess value
  724. //tdDiv.innerHTML = this.innerHTML;
  725. $(tdDiv).append($(this).contents());
  726. var prnt = $(this).parent()[0];
  727. var pid = false;
  728. if (prnt.id) pid = prnt.id.substr(3);
  729. if (pth!=null)
  730. {
  731. if (pth.process) pth.process(tdDiv,pid);
  732. }
  733. $(this).empty().append(tdDiv).removeAttr('width'); //wrap content
  734. //add editable event here 'dblclick'
  735. }
  736. );
  737. },
  738. getCellDim: function (obj) // get cell prop for editable event
  739. {
  740. var ht = parseInt($(obj).height());
  741. var pht = parseInt($(obj).parent().height());
  742. var wt = parseInt(obj.style.width);
  743. var pwt = parseInt($(obj).parent().width());
  744. var top = obj.offsetParent.offsetTop;
  745. var left = obj.offsetParent.offsetLeft;
  746. var pdl = parseInt($(obj).css('paddingLeft'));
  747. var pdt = parseInt($(obj).css('paddingTop'));
  748. return {ht:ht,wt:wt,top:top,left:left,pdl:pdl, pdt:pdt, pht:pht, pwt: pwt};
  749. },
  750. addRowProp: function()
  751. {
  752. $('tbody tr',g.bDiv).each
  753. (
  754. function ()
  755. {
  756. $(this)
  757. .click(
  758. function (e)
  759. {
  760. var obj = (e.target || e.srcElement); if (obj.href || obj.type) return true;
  761. $(this).toggleClass('trSelected');
  762. if (p.singleSelect) $(this).siblings().removeClass('trSelected');
  763. }
  764. )
  765. .mousedown(
  766. function (e)
  767. {
  768. if (e.shiftKey)
  769. {
  770. $(this).toggleClass('trSelected');
  771. g.multisel = true;
  772. this.focus();
  773. $(g.gDiv).noSelect();
  774. }
  775. }
  776. )
  777. .mouseup(
  778. function ()
  779. {
  780. if (g.multisel)
  781. {
  782. g.multisel = false;
  783. $(g.gDiv).noSelect(false);
  784. }
  785. }
  786. )
  787. .hover(
  788. function (e)
  789. {
  790. if (g.multisel)
  791. {
  792. $(this).toggleClass('trSelected');
  793. }
  794. },
  795. function () {}
  796. )
  797. ;
  798. if ($.browser.msie&&$.browser.version<7.0)
  799. {
  800. $(this)
  801. .hover(
  802. function () { $(this).addClass('trOver'); },
  803. function () { $(this).removeClass('trOver'); }
  804. )
  805. ;
  806. }
  807. }
  808. );
  809. },
  810. pager: 0
  811. };
  812. //create model if any
  813. if (p.colModel)
  814. {
  815. thead = document.createElement('thead');
  816. tr = document.createElement('tr');
  817. for (i=0;i<p.colModel.length;i++)
  818. {
  819. var cm = p.colModel[i];
  820. var th = document.createElement('th');
  821. th.innerHTML = cm.display;
  822. if (cm.name&&cm.sortable)
  823. $(th).attr('abbr',cm.name);
  824. //th.idx = i;
  825. $(th).attr('axis','col'+i);
  826. if (cm.align)
  827. th.align = cm.align;
  828. if (cm.width)
  829. $(th).attr('width',cm.width);
  830. if (cm.hide)
  831. {
  832. th.hide = true;
  833. }
  834. if (cm.process)
  835. {
  836. th.process = cm.process;
  837. }
  838. $(tr).append(th);
  839. }
  840. $(thead).append(tr);
  841. $(t).prepend(thead);
  842. } // end if p.colmodel
  843. //init divs
  844. g.gDiv = document.createElement('div'); //create global container
  845. g.mDiv = document.createElement('div'); //create title container
  846. g.hDiv = document.createElement('div'); //create header container
  847. g.bDiv = document.createElement('div'); //create body container
  848. if (p.freezeColumn > 0) {
  849. g.fhDiv = document.createElement('div'); //create freeze header container
  850. g.fbDiv = document.createElement('div'); //create freeze body container
  851. }
  852. g.vDiv = document.createElement('div'); //create grip
  853. g.rDiv = document.createElement('div'); //create horizontal resizer
  854. g.cDrag = document.createElement('div'); //create column drag
  855. g.block = document.createElement('div'); //creat blocker
  856. g.nDiv = document.createElement('div'); //create column show/hide popup
  857. g.nBtn = document.createElement('div'); //create column show/hide button
  858. g.iDiv = document.createElement('div'); //create editable layer
  859. g.tDiv = document.createElement('div'); //create toolbar
  860. g.sDiv = document.createElement('div');
  861. if (p.usepager) g.pDiv = document.createElement('div'); //create pager container
  862. g.hTable = document.createElement('table');
  863. //set gDiv
  864. g.gDiv.className = 'flexigrid';
  865. if (!isNaN(p.width)) g.gDiv.style.width = p.width + 'px';
  866. //add conditional classes
  867. if ($.browser.msie)
  868. $(g.gDiv).addClass('ie');
  869. if (p.novstripe)
  870. $(g.gDiv).addClass('novstripe');
  871. // added by ls at 2009-7-6 15:25
  872. if (!isNaN(p.restHeight)) {
  873. var bch = document.documentElement.clientHeight;
  874. bch -= p.restHeight;
  875. if (p.usepager)
  876. bch -= 30;
  877. if (p.resizable)
  878. bch -= 5;
  879. if (p.title)
  880. bch -= 30;
  881. p.height = bch - 20;
  882. }
  883. // end
  884. $(t).before(g.gDiv);
  885. $(g.gDiv)
  886. .append(t)
  887. ;
  888. //set toolbar
  889. if (p.buttons)
  890. {
  891. g.tDiv.className = 'tDiv';
  892. var tDiv2 = document.createElement('div');
  893. tDiv2.className = 'tDiv2';
  894. for (i=0;i<p.buttons.length;i++)
  895. {
  896. var btn = p.buttons[i];
  897. if (!btn.separator)
  898. {
  899. var btnDiv = document.createElement('div');
  900. btnDiv.className = 'fbutton';
  901. btnDiv.innerHTML = "<div><span>"+btn.name+"</span></div>";
  902. if (btn.bclass)
  903. $('span',btnDiv)
  904. .addClass(btn.bclass)
  905. .css({paddingLeft:20})
  906. ;
  907. btnDiv.onpress = btn.onpress;
  908. btnDiv.name = btn.name;
  909. if (btn.onpress)
  910. {
  911. $(btnDiv).click
  912. (
  913. function ()
  914. {
  915. this.onpress(this.name,g.gDiv);
  916. }
  917. );
  918. }
  919. $(tDiv2).append(btnDiv);
  920. if ($.browser.msie&&$.browser.version<7.0)
  921. {
  922. $(btnDiv).hover(function(){$(this).addClass('fbOver');},function(){$(this).removeClass('fbOver');});
  923. }
  924. } else {
  925. $(tDiv2).append("<div class='btnseparator'></div>");
  926. }
  927. }
  928. $(g.tDiv).append(tDiv2);
  929. $(g.tDiv).append("<div style='clear:both'></div>");
  930. $(g.gDiv).prepend(g.tDiv);
  931. }
  932. //set hDiv
  933. g.hDiv.className = 'hDiv';
  934. $(t).before(g.hDiv);
  935. //set hTable
  936. g.hTable.cellPadding = 0;
  937. g.hTable.cellSpacing = 0;
  938. $(g.hDiv).append('<div class="hDivBox"></div>');
  939. $('div',g.hDiv).append(g.hTable);
  940. var thead = $("thead:first",t).get(0);
  941. if (thead) $(g.hTable).append(thead);
  942. thead = null;
  943. if (!p.colmodel) var ci = 0;
  944. //setup thead
  945. $('thead tr:first th',g.hDiv).each(function (){
  946. var thdiv = document.createElement('div');
  947. if ($(this).attr('abbr')) {
  948. $(this).click( function(e){
  949. if (!$(this).hasClass('thOver')) return false;
  950. var obj = (e.target || e.srcElement);
  951. if (obj.href || obj.type) return true;
  952. g.changeSort(this);
  953. });
  954. if ($(this).attr('abbr')==p.sortname){
  955. this.className = 'sorted';
  956. thdiv.className = 's'+p.sortorder;
  957. }
  958. }
  959. if (this.style.display) $(this).hide();
  960. if (!p.colmodel){
  961. $(this).attr('axis','col' + ci++);
  962. }
  963. $(thdiv).css({textAlign:this.align, width: this.width + 'px'});
  964. thdiv.innerHTML = this.innerHTML;
  965. $(this).empty().append(thdiv).removeAttr('width')
  966. .mousedown(function (e)
  967. {
  968. //by ls
  969. if ($(this).attr("movable")) g.dragStart('colMove',e,this);
  970. })
  971. .hover(
  972. function(){
  973. if (!g.colresize&&!$(this).hasClass('thMove')&&!g.colCopy && $(this).attr("movable") != undefined) {
  974. $(this).addClass('thOver');
  975. }
  976. if ($(this).attr('abbr')!=p.sortname&&!g.colCopy&&!g.colresize&&$(this).attr('abbr')) $('div',this).addClass('s'+p.sortorder);
  977. else if ($(this).attr('abbr')==p.sortname&&!g.colCopy&&!g.colresize&&$(this).attr('abbr'))
  978. {
  979. var no = '';
  980. if (p.sortorder=='asc') no = 'desc';
  981. else no = 'asc';
  982. $('div',this).removeClass('s'+p.sortorder).addClass('s'+no);
  983. }
  984. if (g.colCopy)
  985. {
  986. var n = $('th',g.hDiv).index(this);
  987. if (n==g.dcoln) return false;
  988. if (n<g.dcoln) $(this).append(g.cdropleft);
  989. else $(this).append(g.cdropright);
  990. g.dcolt = n;
  991. } else if (!g.colresize) {
  992. var nv = $('th:visible',g.hDiv).index(this);
  993. var onl = parseInt($('div:eq('+nv+')',g.cDrag).css('left'));
  994. var nw = parseInt($(g.nBtn).width()) + parseInt($(g.nBtn).css('borderLeftWidth'));
  995. nl = onl - (isNaN(nw) ? 0 : nw) + Math.floor(p.cgwidth/2);
  996. $(g.nDiv).hide();$(g.nBtn).hide();
  997. if (p.showToggleBtn && this.getAttribute("togglable") != "false") $(g.nBtn).css({'left':nl,top:g.hDiv.offsetTop}).show();
  998. var ndw = parseInt($(g.nDiv).width());
  999. $(g.nDiv).css({top:g.bDiv.offsetTop});
  1000. if ((nl+ndw)>$(g.gDiv).width()) {
  1001. $(g.nDiv).css('left',onl-ndw+1);
  1002. } else {
  1003. $(g.nDiv).css('left',nl);
  1004. }
  1005. if ($(this).hasClass('sorted'))
  1006. $(g.nBtn).addClass('srtd');
  1007. else
  1008. $(g.nBtn).removeClass('srtd');
  1009. }
  1010. },
  1011. function(){
  1012. $(this).removeClass('thOver');
  1013. if ($(this).attr('abbr')!=p.sortname) $('div',this).removeClass('s'+p.sortorder);
  1014. else if ($(this).attr('abbr')==p.sortname)
  1015. {
  1016. var no = '';
  1017. if (p.sortorder=='asc') no = 'desc';
  1018. else no = 'asc';
  1019. $('div',this).addClass('s'+p.sortorder).removeClass('s'+no);
  1020. }
  1021. if (g.colCopy)
  1022. {
  1023. $(g.cdropleft).remove();
  1024. $(g.cdropright).remove();
  1025. g.dcolt = null;
  1026. }
  1027. })
  1028. ; //wrap content
  1029. }
  1030. );
  1031. //set bDiv
  1032. g.bDiv.className = 'bDiv';
  1033. $(t).before(g.bDiv);
  1034. //替换下面注释
  1035. if ($.browser.msie){
  1036. if(p.height=='auto'){
  1037. $(g.bDiv).css({ height:'auto'}).scroll(function(e) {
  1038. g.scroll()
  1039. }).append(t);
  1040. }else{
  1041. if(p.height<0){
  1042. }else{
  1043. g.bDiv.style.height = p.height+"px";
  1044. $(g.bDiv).scroll(function(e) {
  1045. g.scroll()
  1046. }).append(t);
  1047. }
  1048. }
  1049. }else{
  1050. $(g.bDiv).css({ height: (p.height=='auto') ? 'auto' : p.height+"px"}).scroll(
  1051. function (e) {
  1052. g.scroll()
  1053. }) .append(t);
  1054. }
  1055. if (p.height == 'auto')
  1056. {
  1057. $('table',g.bDiv).addClass('autoht');
  1058. g.bDiv.style.overflowY = 'hidden';
  1059. }
  1060. // $(g.bDiv).css({ height: (p.height=='auto') ? 'auto' : p.height+"px"}) .scroll(function (e) {g.scroll()}).append(t) ;
  1061. //
  1062. // if (p.height == 'auto')
  1063. // {
  1064. // $('table',g.bDiv).addClass('autoht');
  1065. // g.bDiv.style.overflowY = 'hidden';
  1066. // }
  1067. //add td properties
  1068. g.addCellProp();
  1069. //add row properties
  1070. g.addRowProp();
  1071. //set cDrag
  1072. var cdcol = $('thead tr:first th:first',g.hDiv).get(0);
  1073. if (cdcol != null)
  1074. {
  1075. g.cDrag.className = 'cDrag';
  1076. g.cdpad = 0;
  1077. g.cdpad += (isNaN(parseInt($('div',cdcol).css('borderLeftWidth'))) ? 0 : parseInt($('div',cdcol).css('borderLeftWidth')));
  1078. g.cdpad += (isNaN(parseInt($('div',cdcol).css('borderRightWidth'))) ? 0 : parseInt($('div',cdcol).css('borderRightWidth')));
  1079. g.cdpad += (isNaN(parseInt($('div',cdcol).css('paddingLeft'))) ? 0 : parseInt($('div',cdcol).css('paddingLeft')));
  1080. g.cdpad += (isNaN(parseInt($('div',cdcol).css('paddingRight'))) ? 0 : parseInt($('div',cdcol).css('paddingRight')));
  1081. g.cdpad += (isNaN(parseInt($(cdcol).css('borderLeftWidth'))) ? 0 : parseInt($(cdcol).css('borderLeftWidth')));
  1082. g.cdpad += (isNaN(parseInt($(cdcol).css('borderRightWidth'))) ? 0 : parseInt($(cdcol).css('borderRightWidth')));
  1083. g.cdpad += (isNaN(parseInt($(cdcol).css('paddingLeft'))) ? 0 : parseInt($(cdcol).css('paddingLeft')));
  1084. g.cdpad += (isNaN(parseInt($(cdcol).css('paddingRight'))) ? 0 : parseInt($(cdcol).css('paddingRight')));
  1085. $(g.bDiv).before(g.cDrag);
  1086. var cdheight = $(g.bDiv).height();
  1087. var hdheight = $(g.hDiv).height();
  1088. $(g.cDrag).css({top: -hdheight + 'px'});
  1089. $('thead tr:first th',g.hDiv).each
  1090. (
  1091. function ()
  1092. {
  1093. var cgDiv = document.createElement('div');
  1094. $(g.cDrag).append(cgDiv);
  1095. if (!p.cgwidth) p.cgwidth = $(cgDiv).width();
  1096. $(cgDiv).css({height: cdheight + hdheight})
  1097. .mousedown(function(e){g.dragStart('colresize',e,this);})
  1098. ;
  1099. if ($.browser.msie&&$.browser.version<7.0)
  1100. {
  1101. g.fixHeight($(g.gDiv).height());
  1102. $(cgDiv).hover(
  1103. function ()
  1104. {
  1105. g.fixHeight();
  1106. $(this).addClass('dragging')
  1107. },
  1108. function () { if (!g.colresize) $(this).removeClass('dragging') }
  1109. );
  1110. }
  1111. }
  1112. );
  1113. //g.rePosDrag();
  1114. }
  1115. //add strip
  1116. if (p.striped)
  1117. $('tbody tr:odd',g.bDiv).addClass('erow');
  1118. if (p.resizable && p.height !='auto')
  1119. {
  1120. g.vDiv.className = 'vGrip';
  1121. $(g.vDiv)
  1122. .mousedown(function (e) { g.dragStart('vresize',e)})
  1123. .html('<span></span>');
  1124. $(g.bDiv).after(g.vDiv);
  1125. }
  1126. if (p.resizable && p.width !='auto' && !p.nohresize)
  1127. {
  1128. g.rDiv.className = 'hGrip';
  1129. $(g.rDiv)
  1130. .mousedown(function (e) {g.dragStart('vresize',e,true);})
  1131. .html('<span></span>')
  1132. .css('height',$(g.gDiv).height())
  1133. ;
  1134. if ($.browser.msie&&$.browser.version<7.0)
  1135. {
  1136. $(g.rDiv).hover(function(){$(this).addClass('hgOver');},function(){$(this).removeClass('hgOver');});
  1137. }
  1138. $(g.gDiv).append(g.rDiv);
  1139. }
  1140. // add pager
  1141. if (p.usepager)
  1142. {
  1143. g.pDiv.className = 'pDiv';
  1144. g.pDiv.innerHTML = '<div class="pDiv2"></div><div class="pDiv3"></div>';
  1145. $(g.bDiv).after(g.pDiv);
  1146. g.gDiv.appendChild(g.pDiv);
  1147. // $('.pDiv2', g.pDiv).html(html);
  1148. // var html3 = '<div class="rightGroup"><span class="pPageStat"></span></div>';
  1149. // $('.pDiv3', g.pDiv).html(html3);
  1150. if (typeof(p.pages) == 'undefined') p.pages = p.rp == 0 ? 0 : Math.ceil(p.total/p.rp);
  1151. // var html = ' <div class="pGroup"> <div class="pFirst pButton"><span></span></div><div class="pPrev pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"><span class="pcontrol">页码 <input type="text" size="1" value="' + p.page + '" /> 共 <span>' + p.pages + ' 页 </span></span></div> <div class="btnseparator"></div> <div class="pGroup"> <div class="pNext pButton"><span></span></div><div class="pLast pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"> <div class="pReload pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"><span class="pPageStat"></span></div>';
  1152. // $('div',g.pDiv).html(html);
  1153. var html = ' <div class="pGroup"> <div class="pFirst pButton"><span></span></div><div class="pPrev pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"><span class="pcontrol">页码 <input type="text" size="1" value="' + p.page + '" /> 共 <span>' + p.pages + ' 页 </span></span></div> <div class="btnseparator"></div> <div class="pGroup"> <div class="pNext pButton"><span></span></div><div class="pLast pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"> <div class="pReload pButton"><span></span></div> </div> <div class="btnseparator"></div> ';
  1154. $('.pDiv2', g.pDiv).html(html);
  1155. var html3 = '<div class="rightGroup"><span class="pPageStat"></span></div>';
  1156. $('.pDiv3', g.pDiv).html(html3);
  1157. $('.pReload',g.pDiv).click(function(){g.populate()});
  1158. $('.pFirst',g.pDiv).click(function(){g.changePage('first')});
  1159. $('.pPrev',g.pDiv).click(function(){g.changePage('prev')});
  1160. $('.pNext',g.pDiv).click(function(){g.changePage('next')});
  1161. $('.pLast',g.pDiv).click(function(){g.changePage('last')});
  1162. $('.pcontrol input',g.pDiv).keydown(function(e){if(e.keyCode==13) g.changePage('input')});
  1163. if ($.browser.msie&&$.browser.version<7) $('.pButton',g.pDiv).hover(function(){$(this).addClass('pBtnOver');},function(){$(this).removeClass('pBtnOver');});
  1164. g.buildpager();
  1165. if (p.useRp)
  1166. {
  1167. var opt = "";
  1168. for (var nx=0;nx<p.rpOptions.length;nx++)
  1169. {
  1170. if (p.rp == p.rpOptions[nx]) sel = 'selected="selected"'; else sel = '';
  1171. opt += "<option value='" + p.rpOptions[nx] + "' " + sel + " >" + p.rpOptions[nx] + "&nbsp;&nbsp;</option>";
  1172. };
  1173. $('.pDiv2',g.pDiv).prepend("<div class='pGroup'><select name='rp'>"+opt+"</select></div> <div class='btnseparator'></div>");
  1174. $('select',g.pDiv).change(
  1175. function ()
  1176. {
  1177. if (p.onRpChange)
  1178. p.onRpChange(+this.value);
  1179. else
  1180. {
  1181. p.newp = 1;
  1182. p.rp = +this.value;
  1183. g.populate();
  1184. }
  1185. }
  1186. );
  1187. }
  1188. //add search button
  1189. if (p.searchitems && p.searchitems.length > 0)
  1190. {
  1191. $('.pDiv2',g.pDiv).prepend("<div class='pGroup'> <div class='pSearch pButton'><span></span></div> </div> <div class='btnseparator'></div>");
  1192. $('.pSearch',g.pDiv).click(function(){
  1193. $(g.sDiv).slideToggle('fast',function(){
  1194. if($(this).is(':hidden')){
  1195. g.bDiv.style.height = p.height + "px";
  1196. }else{
  1197. g.bDiv.style.height = p.height-35 + "px";
  1198. }
  1199. $('.sDiv:visible input:first',g.gDiv).trigger('focus');
  1200. });
  1201. });
  1202. //add search box
  1203. g.sDiv.className = 'sDiv';
  1204. sitems = p.searchitems;
  1205. var sopt = "";
  1206. for (var s = 0; s < sitems.length; s++)
  1207. {
  1208. if (p.qtype=='' && sitems[s].isdefault==true)
  1209. {
  1210. p.qtype = sitems[s].name;
  1211. sel = 'selected="selected"';
  1212. } else sel = '';
  1213. sopt += "<option value='" + sitems[s].name + "' " + sel + " >" + sitems[s].display + "&nbsp;&nbsp;</option>";
  1214. }
  1215. if (p.qtype=='') p.qtype = sitems[0].name;
  1216. $(g.sDiv).append("<div class='sDiv2'>过滤条件 <select name='filterField'>"+sopt+"</select> <input type='text' size='30' name='filterValue' class='qsbox' /> <input type='button' value='确定' /> <input type='button' value='重置' /></div>");
  1217. $('input[name=filterField],select[name=filterValue]',g.sDiv).keydown( function(e){
  1218. alert("1");
  1219. if(e.keyCode==13)
  1220. g.doSearch()
  1221. });
  1222. $('input[value=重置]',g.sDiv).click(function(){
  1223. // alert($('input[name=filterValue]',g.sDiv).val());
  1224. $('input[name=filterValue]',g.sDiv).val('');
  1225. p.query = '';
  1226. g.doSearch();
  1227. });
  1228. $('input[value=确定]', g.sDiv).click(function(){g.doSearch()});
  1229. $(g.bDiv).after(g.sDiv);
  1230. }
  1231. }
  1232. $(g.pDiv,g.sDiv).append("<div style='clear:both'></div>");
  1233. // add title
  1234. if (p.title)
  1235. {
  1236. g.mDiv.className = 'mDiv';
  1237. g.mDiv.innerHTML = '<div class="ftitle">'+p.title+'</div>';
  1238. $(g.gDiv).prepend(g.mDiv);
  1239. if (p.showTableToggleBtn)
  1240. {
  1241. $(g.mDiv).append('<div class="ptogtitle" title="Minimize/Maximize Table"><span></span></div>');
  1242. $('div.ptogtitle',g.mDiv).click
  1243. (
  1244. function ()
  1245. {
  1246. $(g.gDiv).toggleClass('hideBody');
  1247. $(this).toggleClass('vsble');
  1248. }
  1249. );
  1250. }
  1251. //g.rePosDrag();
  1252. }
  1253. //setup cdrops
  1254. g.cdropleft = document.createElement('span');
  1255. g.cdropleft.className = 'cdropleft';
  1256. g.cdropright = document.createElement('span');
  1257. g.cdropright.className = 'cdropright';
  1258. //add block
  1259. g.block.className = 'gBlock';
  1260. // var loadingDiv = document.createElement('div');
  1261. // loadingDiv.className = 'l-grid-loading';
  1262. // $(g.block).append(loadingDiv);
  1263. var gh = $(g.bDiv).height();
  1264. var gtop = g.hDiv.offsetTop;
  1265. // $(g.block).css(
  1266. // {
  1267. // background: 'blue',
  1268. // position: 'absolute',
  1269. // zIndex:100
  1270. // });
  1271. //$(g.block).fadeTo(0,p.blockOpacity);
  1272. // add column control
  1273. if ($('th',g.hDiv).length)
  1274. {
  1275. g.nDiv.className = 'nDiv';
  1276. g.nDiv.innerHTML = "<table cellpadding='0' cellspacing='0'><tbody></tbody></table>";
  1277. $(g.nDiv).css(
  1278. {
  1279. marginBottom: (gh * -1),
  1280. display: 'none',
  1281. top: gtop
  1282. }
  1283. ).noSelect()
  1284. ;
  1285. var cn = 0;
  1286. $('th div',g.hDiv).each
  1287. (
  1288. function ()
  1289. {
  1290. //by ls
  1291. if ($(this).parent("th").attr("togglable") != "false") {
  1292. var kcol = $("th[axis='col" + cn + "']",g.hDiv)[0];
  1293. var chk = 'checked="checked"';
  1294. if (kcol.style.display=='none') chk = '';
  1295. $('tbody',g.nDiv).append('<tr><td class="ndcol1"><input type="checkbox" '+ chk +' class="togCol" value="'+ cn +'" /></td><td class="ndcol2">'+this.innerHTML+'</td></tr>');
  1296. }
  1297. cn++;
  1298. }
  1299. );
  1300. if ($.browser.msie&&$.browser.version<7.0)
  1301. $('tr',g.nDiv).hover
  1302. (
  1303. function () {$(this).addClass('ndcolover');},
  1304. function () {$(this).removeClass('ndcolover');}
  1305. );
  1306. $('td.ndcol2',g.nDiv).click ( function (){
  1307. if ($('input:checked',g.nDiv).length<=p.minColToggle&&$(this).prev().find('input')[0].checked) return false;
  1308. return g.toggleCol($(this).prev().find('input').val());
  1309. }
  1310. // function ()
  1311. // {
  1312. // if ($('input:checked',g.nDiv).length<=p.minColToggle&&$(this).prev().find('input')[0].checked) return false;
  1313. // // =======add by ls
  1314. // var visible;
  1315. // var cid = $(this).prev().find('input').val();
  1316. // if($("#colHides"+parseInt(cid)).length ==0){
  1317. // visible = false;
  1318. // }else{
  1319. // visible = true;
  1320. // }
  1321. // //alert(visible);
  1322. // // =======add by ls end
  1323. // return g.toggleCol($(this).prev().find('input').val(),visible);//=======add by ls 加了个visible的参数
  1324. // }
  1325. );
  1326. $('input.togCol',g.nDiv).click
  1327. (
  1328. function ()
  1329. {
  1330. if ($('input:checked',g.nDiv).length<p.minColToggle&&this.checked==false) return false;
  1331. $(this).parent().next().trigger('click');
  1332. //return false;
  1333. }
  1334. );
  1335. $(g.gDiv).prepend(g.nDiv);
  1336. $(g.nBtn).addClass('nBtn')
  1337. .html('<div></div>')
  1338. .attr('title','隐藏/显示 列')
  1339. .click
  1340. (
  1341. function ()
  1342. {
  1343. $(g.nDiv).toggle(); return true;
  1344. }
  1345. );
  1346. if (p.showToggleBtn) $(g.gDiv).prepend(g.nBtn);
  1347. }
  1348. // add date edit layer
  1349. $(g.iDiv)
  1350. .addClass('iDiv')
  1351. .css({display:'none'})
  1352. ;
  1353. $(g.bDiv).append(g.iDiv);
  1354. // add flexigrid events
  1355. $(g.bDiv)
  1356. .hover(function(){$(g.nDiv).hide();$(g.nBtn).hide();},function(){if (g.multisel) g.multisel = false;})
  1357. ;
  1358. $(g.gDiv)
  1359. .hover(function(){},function(){$(g.nDiv).hide();$(g.nBtn).hide();})
  1360. ;
  1361. //add document events
  1362. $(document)
  1363. .mousemove(function(e){g.dragMove(e)})
  1364. .mouseup(function(e){g.dragEnd()})
  1365. .hover(function(){},function (){g.dragEnd()})
  1366. ;
  1367. //browser adjustments
  1368. if ($.browser.msie&&$.browser.version<7.0)
  1369. {
  1370. $('.hDiv,.bDiv,.mDiv,.pDiv,.vGrip,.tDiv, .sDiv',g.gDiv)
  1371. .css({width: '100%'});
  1372. $(g.gDiv).addClass('ie6');
  1373. if (p.width!='auto') $(g.gDiv).addClass('ie6fullwidthbug');
  1374. }
  1375. g.rePosDrag();
  1376. g.fixHeight();
  1377. //make grid functions accessible
  1378. t.p = p;
  1379. t.grid = g;
  1380. // load data
  1381. if (p.url&&p.autoload&&p.useAjax)
  1382. {
  1383. g.populate();
  1384. }
  1385. return t;
  1386. };
  1387. //by ls at 2009-7-12 12:00
  1388. $.addPlainFlex = function(t,p)
  1389. {
  1390. if (t.grid) return false; //return if already exist
  1391. // apply default properties
  1392. p = $.extend({
  1393. height: 400, //default height
  1394. width: 'auto', //auto width
  1395. striped: true, //apply odd even stripes
  1396. novstripe: false,
  1397. minwidth: 30, //min width of columns
  1398. minheight: 80, //min height of columns
  1399. resizable: false, //resizable table
  1400. url: false, //ajax url
  1401. method: 'POST', // data sending method
  1402. dataType: 'json', // type of data loaded
  1403. errormsg: 'Connection Error',
  1404. usepager: false, //
  1405. nowrap: true, //
  1406. page: 1, //current page
  1407. total: 1, //total rows
  1408. useRp: true, //use the results per page select box
  1409. rp: 15, // results per page
  1410. rpOptions: [10,15,20,25,30,50,100],
  1411. title: false,
  1412. pagestat: '当前显示 {from}—{to}, 总计 {total}',
  1413. procmsg: '处理中, 请稍候 ...',
  1414. query: '',
  1415. qtype: '',
  1416. nomsg: '无记录显示',
  1417. minColToggle: 1, //minimum allowed column to be hidden
  1418. showToggleBtn: true, //show or hide column toggle popup
  1419. hideOnSubmit: true,
  1420. autoload: true,
  1421. blockOpacity: 0.5,
  1422. onToggleCol: false,
  1423. onChangeSort: false,
  1424. onSuccess: false,
  1425. onSubmit: false, // using a custom populate function
  1426. useAjax:false,
  1427. pageName:'page',
  1428. pageSizeName:'pageSize'
  1429. }, p);
  1430. var g = {
  1431. buildpager: function(){ //rebuild pager based on new properties
  1432. $('.pcontrol input', this.pDiv).val(p.page);
  1433. $('.pcontrol span', this.pDiv).html(p.pages);
  1434. var r1 = (p.page-1) * p.rp + 1;
  1435. var r2 = r1 + p.rp - 1;
  1436. if (p.total<r2) r2 = p.total;
  1437. var stat = p.pagestat;
  1438. stat = stat.replace(/{from}/,r1);
  1439. stat = stat.replace(/{to}/,r2);
  1440. stat = stat.replace(/{total}/,p.total);
  1441. $('.pPageStat', this.pDiv).html(stat);
  1442. },
  1443. populate: function () { //get latest data
  1444. if (this.loading) return true;
  1445. if (p.onSubmit)
  1446. {
  1447. var gh = p.onSubmit();
  1448. if (!gh) return false;
  1449. }
  1450. if (p.page>p.pages) p.page = p.pages;
  1451. if (!p.newp) p.newp = p.page;
  1452. //by ls
  1453. if (!p.useAjax) {
  1454. var form = $(t).parents("form:first");
  1455. if (form && p.method.toLowerCase() == 'post') {
  1456. form.append($("<input type='hidden'>").attr({name:"grid",value:$(t).attr("id")}));
  1457. form.append($("<input type='hidden'>").attr({name:p.pageName,value:p.newp}));
  1458. form.append($("<input type='hidden'>").attr({name:p.pageSizeName,value:p.rp}));
  1459. // $(':hidden[name=' + p.pageName + ']', form).val(p.newp);
  1460. // $(':hidden[name=' + p.pageSizeName + ']', form).val(p.rp);
  1461. if (p.sortname)
  1462. form.append($("<input type='hidden'>").attr({name:"sortname",value:p.sortname}));
  1463. if (p.sortorder)
  1464. form.append($("<input type='hidden'>").attr({name:"sortorder",value:p.sortorder}));
  1465. var gh = true;
  1466. if (form.onsubmit) gh = form.onsubmit();
  1467. if (gh) {
  1468. if (p.url) $(form).attr("action", p.url);
  1469. $(form).submit();
  1470. }
  1471. } else {
  1472. var url = p.url ? p.url : window.location.href;
  1473. var qsPos = url.indexOf("?");
  1474. var qsParser;
  1475. if (qsPos != -1) {
  1476. qsParser = $.querystring(url.substr(qsPos + 1));
  1477. url = url.substr(0, qsPos);
  1478. } else {
  1479. qsParser = $.querystring('');
  1480. }
  1481. qsParser.set('grid', $(t).attr("id")).set(p.pageName, p.newp)
  1482. .set(p.pageSizeName, p.rp);
  1483. if (p.sortname && p.sortname.length > 0)
  1484. qsParser.set('sortname', p.sortname).set('sortorder', p.sortorder);
  1485. if (p.qtype && p.qtype.length > 0 && p.query.length > 0)
  1486. qsParser.set('filterValue', p.query).set('filterField', p.qtype);
  1487. window.location.href = url + "?" + qsParser.toString();
  1488. }
  1489. return true;
  1490. }
  1491. if (!p.url) return false;
  1492. this.loading = true;
  1493. $('.pPageStat',this.pDiv).html(p.procmsg);
  1494. $('.pReload',this.pDiv).addClass('loading');
  1495. //block to prevent to operate the grid.
  1496. var hDivOffset = $(g.hDiv).offset();
  1497. $(g.block).css({
  1498. top:hDivOffset.top,
  1499. left:hDivOffset.left,
  1500. height:$(g.hDiv).height() + $(g.bDiv).height(),
  1501. width:$(g.hDiv).width()
  1502. });
  1503. if (p.hideOnSubmit) $("body").append(g.block); //$(t).hide();
  1504. if ($.browser.opera) $(t).css('visibility','hidden');
  1505. //--------------
  1506. //var param = {page:p.newp, rp: p.rp, sortname: p.sortname, sortorder: p.sortorder, query: p.query, qtype: p.qtype};
  1507. var param = [
  1508. { name : p.pageName, value : p.newp }
  1509. ,{ name : p.pageSizeName, value : p.rp }
  1510. ,{ name : 'sortname', value : p.sortname}
  1511. ,{ name : 'sortorder', value : p.sortorder }
  1512. ,{ name : 'filterValue', value : p.query}
  1513. ,{ name : 'filterField', value : p.qtype}
  1514. ];
  1515. if (p.params)
  1516. {
  1517. for (var pi = 0; pi < p.params.length; pi++) param[param.length] = p.params[pi];
  1518. }
  1519. $.ajax({
  1520. type: p.method,
  1521. url: p.url,
  1522. data: param,
  1523. timeout : 20000,
  1524. cache : false,
  1525. dataType: p.dataType == 'xhtml' ? 'xml' : p.dataType,
  1526. success: function(data){
  1527. g.loading = false;
  1528. g.addData(data);
  1529. if (p.hideOnSubmit) $(g.block).remove();
  1530. },
  1531. error: function(req, status, e) {
  1532. g.loading = false;
  1533. try {
  1534. if (p.onError)
  1535. p.onError(data);
  1536. else
  1537. alert('获取列表数据失败!\n' + req.status + ":" + req.statusText);
  1538. } catch (e) {}
  1539. if (p.hideOnSubmit) $(g.block).remove();
  1540. },
  1541. complete:function() {
  1542. g.loading = false;
  1543. }
  1544. });
  1545. },
  1546. doSearch: function () {
  1547. p.query = $('input[name=filterValue]',g.sDiv).val();
  1548. p.qtype = $('select[name=filterField]',g.sDiv).val();
  1549. p.newp = 1;
  1550. this.populate();
  1551. },
  1552. changePage: function (ctype){ //change page
  1553. if (this.loading) return true;
  1554. switch(ctype)
  1555. {
  1556. case 'first': p.newp = 1; break;
  1557. case 'prev': if (p.page>1) p.newp = parseInt(p.page) - 1; break;
  1558. case 'next': if (p.page<p.pages) p.newp = parseInt(p.page) + 1; break;
  1559. case 'last': p.newp = p.pages; break;
  1560. case 'input':
  1561. var nv = parseInt($('.pcontrol input',this.pDiv).val());
  1562. if (isNaN(nv)) nv = 1;
  1563. if (nv<1) nv = 1;
  1564. else if (nv > p.pages) nv = p.pages;
  1565. $('.pcontrol input',this.pDiv).val(nv);
  1566. p.newp =nv;
  1567. break;
  1568. }
  1569. if (typeof(p.newp) != 'number' || p.newp==p.page) return false;
  1570. if (p.onChangePage)
  1571. p.onChangePage(p.newp);
  1572. else
  1573. this.populate();
  1574. },
  1575. changeSort: function(th) { //change sortorder
  1576. if (this.loading) return true;
  1577. p.sortname = th.getAttribute('abbr');
  1578. if (p.sortorder=='asc') p.sortorder = 'desc';
  1579. else p.sortorder = 'asc';
  1580. //$(th).addClass('sorted').siblings().removeClass('sorted');
  1581. $('.sdesc', this.hDiv).removeClass('sdesc');
  1582. $('.sasc', this.hDiv).removeClass('sasc');
  1583. $(th).addClass('s' + p.sortorder);
  1584. if (p.onChangeSort)
  1585. p.onChangeSort(p.sortname,p.sortorder);
  1586. else
  1587. this.populate();
  1588. },
  1589. addRow:function(row) {
  1590. var tr = document.createElement('tr');
  1591. var tbody = g.bDiv.getElementsByTagName("TBODY")[0];
  1592. var rowc = $(tbody).children("tr").length + 1;
  1593. if (rowc % 2 && p.striped) tr.className = 'erow';
  1594. if (row.id) tr.id = 'row' + row.id;
  1595. //add cell
  1596. $('thead tr:first th',g.hDiv).each
  1597. (
  1598. function (i)
  1599. {
  1600. var td = document.createElement('td');
  1601. var field = this.getAttribute('field');
  1602. if (this.tdalign) td.align = this.tdalign;
  1603. td.width = this.width;
  1604. td.style.display = this.style.display;
  1605. var fieldData = "&nbsp;";
  1606. if (! field) {
  1607. field = "cell" + i;
  1608. }
  1609. if (typeof(row[field]) != 'undefined') {
  1610. fieldData = row[field];
  1611. }
  1612. if ($.browser.msie) {
  1613. td.innerHTML = fieldData;
  1614. } else {
  1615. var tdDiv = document.createElement("DIV");
  1616. tdDiv.innerHTML = fieldData;
  1617. tdDiv.style.width = this.width + "px";
  1618. if (this.noWrap == false) tdDiv.style.whiteSpace = "normal";
  1619. td.appendChild(tdDiv);
  1620. }
  1621. tr.appendChild(td);
  1622. td = null;
  1623. if (field == p.sortname && p.sortorder) {
  1624. this.className = 's' + p.sortorder;
  1625. } else {
  1626. this.className = "";
  1627. }
  1628. }
  1629. );
  1630. tbody.appendChild(tr);
  1631. tr.onclick = function(){
  1632. if (this == g.selectedRow) return;
  1633. if (g.selectedRow && p.striped)
  1634. g.selectedRow.className = (g.selectedRow.rowIndex % 2 == 1) ? "erow" : "";
  1635. this.className = "trSelected";
  1636. g.selectedRow = this;
  1637. };
  1638. if (p.dbclickHandler) {
  1639. tr.ondblclick=function() {
  1640. p.dbclickHandler.call(this, tr);
  1641. }
  1642. }
  1643. },
  1644. deleteRow:function(rowIndex) {
  1645. var tbody = g.bDiv.getElementsByTagName("TBODY")[0];
  1646. $(tbody).children("tr:eq(" + rowIndex + ")").remove();
  1647. },
  1648. getRowByKey:function(keys) {
  1649. if (typeof(keys) == "string") {
  1650. keys = [keys];
  1651. }
  1652. var thead = g.hDiv.getElementsByTagName("THEAD")[0];
  1653. var ths = $(thead).children("tr");
  1654. var keyindex = new Array();
  1655. ths.each (function(i) {
  1656. if (i == 0) {
  1657. $(this).children("th").each(function(c) {
  1658. if (this.getAttribute('key') == 'true') {
  1659. keyindex[keyindex.length] = c;
  1660. }
  1661. });
  1662. }
  1663. });
  1664. var result = null;
  1665. if (keyindex.length > 0) {
  1666. var tbody = g.bDiv.getElementsByTagName("TBODY")[0];
  1667. var trs = $(tbody).children("tr");
  1668. trs.each (function(i) {
  1669. if (keyindex.length == 0)
  1670. return;
  1671. var succcount = 0;
  1672. $(this).children("td").each (function(d) {
  1673. for (var j = 0; j < keyindex.length; j++) {
  1674. if (keyindex[j] == d && keys[j] == $.trim($(this).text())) {
  1675. succcount++;
  1676. }
  1677. }
  1678. });
  1679. if (succcount == keyindex.length) {
  1680. result = this;
  1681. return;
  1682. }
  1683. });
  1684. }
  1685. return result;
  1686. },
  1687. deleteRowByKey:function(keys) {
  1688. var tr = this.getRowByKey(keys);
  1689. if (tr != null) $(tr).remove();
  1690. },
  1691. getRowDataByKey:function(keys) {
  1692. var tr = this.getRowByKey(keys);
  1693. var rd = {};
  1694. if (tr == null) return rd;
  1695. tr = $(tr);
  1696. var tbody = g.bDiv.getElementsByTagName("TBODY")[0];
  1697. if (tr.length > 0) {
  1698. $('thead:eq(0) tr:first th',g.hDiv).each
  1699. (
  1700. function (i)
  1701. {
  1702. var field = this.getAttribute('field');
  1703. var cell = tr.children("td:eq(" + i + ")");
  1704. if (field != null && field.length > 0) {
  1705. rd[field] = cell.text().replace(/(^[\s\u00a0]+)|([\s\u00a0]+$)/g, '');
  1706. } else {
  1707. rd["cell" + i] = cell.text().replace(/(^[\s\u00a0]+)|([\s\u00a0]+$)/g, '');
  1708. }
  1709. }
  1710. );
  1711. return rd;
  1712. }
  1713. },
  1714. getRowData:function(rowIndex) {
  1715. var tbody = g.bDiv.getElementsByTagName("TBODY")[0];
  1716. var rd = {};
  1717. var tr = $(tbody).children("tr:eq(" + rowIndex + ")");
  1718. if (tr.length > 0) {
  1719. $('thead tr:first th',g.hDiv).each
  1720. (
  1721. function (i)
  1722. {
  1723. var field = this.getAttribute('field');
  1724. var cell = tr.children("td:eq(" + i + ")");
  1725. if (field != null && field.length > 0) {
  1726. rd[field] = cell.text();
  1727. } else {
  1728. rd["cell" + i] = cell.text();
  1729. }
  1730. }
  1731. );
  1732. return rd;
  1733. }
  1734. },
  1735. addData: function (data) { //parse data
  1736. if (p.preProcess)
  1737. data = p.preProcess(data);
  1738. if ($.isFunction(p.ajaxDataHandler)) {
  1739. p.ajaxDataHandler.call(g, data, p);
  1740. }
  1741. $('.pReload',this.pDiv).removeClass('loading');
  1742. this.loading = false;
  1743. if (!data)
  1744. {
  1745. $('.pPageStat',this.pDiv).html(p.errormsg);
  1746. return false;
  1747. }
  1748. p.total = data.total;
  1749. var tbody = g.bDiv.getElementsByTagName("TBODY")[0];
  1750. while(tbody.firstChild)
  1751. tbody.removeChild(tbody.firstChild);
  1752. if (p.total==0)
  1753. {
  1754. p.pages = 1;
  1755. p.page = 1;
  1756. this.buildpager();
  1757. $('.pPageStat',this.pDiv).html(p.nomsg);
  1758. return false;
  1759. }
  1760. p.pages = Math.ceil(p.total/p.rp);
  1761. p.page = data.page;
  1762. this.buildpager();
  1763. //build new body
  1764. if (p.dataType=='json')
  1765. {
  1766. $.each (data.rows,
  1767. function(i, row)
  1768. {
  1769. var tr = document.createElement('tr');
  1770. if (i % 2 && p.striped) tr.className = 'erow';
  1771. if (row.id) tr.id = 'row' + row.id;
  1772. //add cell
  1773. $('thead tr:first th',g.hDiv).each
  1774. (
  1775. function ()
  1776. {
  1777. var td = document.createElement('td');
  1778. var field = this.getAttribute('field');
  1779. if (this.tdalign) td.align = this.tdalign;
  1780. td.width = this.width;
  1781. td.style.display = this.style.display;
  1782. if (field) {
  1783. var fieldData = typeof(row[field]) != 'undefined' ? row[field] : "&nbsp;";
  1784. if ($.browser.msie) {
  1785. td.innerHTML = fieldData;
  1786. } else {
  1787. var tdDiv = document.createElement("DIV");
  1788. tdDiv.innerHTML = fieldData;
  1789. tdDiv.style.width = this.width + "px";
  1790. if (this.noWrap == false) tdDiv.style.whiteSpace = "normal";
  1791. td.appendChild(tdDiv);
  1792. }
  1793. }
  1794. tr.appendChild(td);
  1795. td = null;
  1796. if (field == p.sortname && p.sortorder) {
  1797. this.className = 's' + p.sortorder;
  1798. } else {
  1799. this.className = "";
  1800. }
  1801. }
  1802. );
  1803. tbody.appendChild(tr);
  1804. tr.onclick = function(){
  1805. if (this == g.selectedRow) return;
  1806. if (g.selectedRow && p.striped)
  1807. g.selectedRow.className = (g.selectedRow.rowIndex % 2 == 1) ? "erow" : "";
  1808. this.className = "trSelected";
  1809. g.selectedRow = this;
  1810. };
  1811. if (p.dbclickHandler) {
  1812. tr.ondblclick=function() {
  1813. p.dbclickHandler.call(this, tr);
  1814. }
  1815. }
  1816. }
  1817. );
  1818. }
  1819. tbody = null; data = null; i = null;
  1820. if (p.onSuccess) p.onSuccess();
  1821. if (p.hideOnSubmit) $(g.block).remove();//$(t).show();
  1822. this.hDiv.scrollLeft = this.bDiv.scrollLeft;
  1823. if ($.browser.opera) $(t).css('visibility','visible');
  1824. //fix the ie6 iframe horizontal scrollbars bug
  1825. if ($.browser.msie && $.browser.version < 7) {
  1826. document.body.style.width = document.documentElement.clientWidth - 2 + "px";
  1827. }
  1828. },
  1829. addContextMenu : function(text, handler) {
  1830. this.contextMenus[text] = handler;
  1831. }
  1832. };
  1833. var frameDiv = document.createElement("DIV");
  1834. frameDiv.className = "flexigrid plain";
  1835. g.gDiv = frameDiv;
  1836. if (p.title) {
  1837. var titleDiv = document.createElement("DIV");
  1838. titleDiv.className = "mDiv";
  1839. //titleDiv.innerHTML= p.title;
  1840. frameDiv.appendChild(titleDiv);
  1841. g.mDiv = titleDiv;
  1842. if (p.contextmenu) {
  1843. var ddBox = document.createElement("A");
  1844. ddBox.className = "ddbox";
  1845. ddBox.href = "javascript:void(0)";
  1846. titleDiv.appendChild(ddBox);
  1847. var contextmenudiv = document.createElement("DIV");
  1848. contextmenudiv.className = "contextmenu";
  1849. frameDiv.appendChild(contextmenudiv);
  1850. g.contextMenus = {};
  1851. $(ddBox).click(function(evt) {
  1852. $(contextmenudiv).empty();
  1853. for(var cmdText in g.contextMenus) {
  1854. var mi = document.createElement("A");
  1855. mi.className = "menuitem";
  1856. mi.innerHTML = cmdText;
  1857. mi.href = "javascript:void(0)";
  1858. $(mi).click(function(){
  1859. g.contextMenus[this.innerHTML].call(g, cmdText);
  1860. });
  1861. contextmenudiv.appendChild(mi);
  1862. }
  1863. $(contextmenudiv).css({
  1864. top:15,
  1865. left:evt.pageX - $(contextmenudiv).width()
  1866. }).show();
  1867. $(document).one("mouseup", function() {
  1868. $(contextmenudiv).hide();
  1869. });
  1870. });
  1871. }
  1872. var titleBox = document.createElement("DIV");
  1873. if (p.title.charAt(0) == '#') {
  1874. titleBox.appendChild($(p.title).remove().show().get(0));
  1875. } else {
  1876. titleBox.innerHTML = p.title;
  1877. }
  1878. titleDiv.appendChild(titleBox);
  1879. }
  1880. var thead = t.getElementsByTagName("THEAD")[0];
  1881. var tbody = t.getElementsByTagName("TBODY")[0];
  1882. var headerDiv = document.createElement("DIV");
  1883. headerDiv.className = "hDiv";
  1884. g.hDiv = headerDiv;
  1885. var headerTable = document.createElement("TABLE");
  1886. headerTable.style.tableLayout = "fixed";
  1887. headerTable.cellSpacing = 0;
  1888. headerTable.cellPadding = 0;
  1889. var nh = document.createElement("THEAD");
  1890. var nhr = document.createElement("TR");
  1891. nh.appendChild(nhr);
  1892. var headTHs = thead.getElementsByTagName("TR")[0].cells;
  1893. for (var i = 0; i < headTHs.length; i++) {
  1894. var th = headTHs[i].cloneNode($.browser.msie);
  1895. if (!$.browser.msie) {
  1896. var thDiv = document.createElement("DIV");
  1897. thDiv.innerHTML = headTHs[i].innerHTML;
  1898. thDiv.style.width = headTHs[i].width + "px";
  1899. th.appendChild(thDiv);
  1900. }
  1901. nhr.appendChild(th);
  1902. th.style.textAlign = th.align;
  1903. if (th.getAttribute("abbr")) {
  1904. $(th).click(function(){
  1905. g.changeSort(this);
  1906. });
  1907. if (p.sortname == th.getAttribute("abbr") && p.sortorder) {
  1908. th.className = "s" + p.sortorder;
  1909. }
  1910. }
  1911. }
  1912. g.selectedRow = null;
  1913. var rows = tbody.getElementsByTagName("TR");
  1914. for (var i = 0; i < rows.length; i++) {
  1915. if(p.striped){
  1916. if (i % 2 == 1) rows[i].className = "erow";
  1917. }
  1918. rows[i].onclick = function(){
  1919. if (this == g.selectedRow) return;
  1920. if (g.selectedRow && p.striped)
  1921. g.selectedRow.className = (g.selectedRow.rowIndex % 2 == 1) ? "erow" : "";
  1922. this.className = "trSelected";
  1923. g.selectedRow = this;
  1924. };
  1925. if (p.dbclickHandler) {
  1926. rows[i].ondblclick=function() {
  1927. p.dbclickHandler.call(this, rows[i]);
  1928. }
  1929. }
  1930. if (!$.browser.msie) {
  1931. for (var j = 0; j < rows[i].cells.length; j++) {
  1932. var td = rows[i].cells[j];
  1933. var tdDiv = document.createElement("DIV");
  1934. //tdDiv.innerHTML = td.innerHTML;
  1935. tdDiv.style.width = td.width + "px";
  1936. if (td.noWrap == false) tdDiv.style.whiteSpace = "normal";
  1937. while (td.firstChild)
  1938. tdDiv.appendChild(td.removeChild(td.firstChild));
  1939. td.appendChild(tdDiv);
  1940. }
  1941. }
  1942. }
  1943. while(thead.firstChild)
  1944. thead.removeChild(thead.firstChild);
  1945. headerTable.appendChild(nh);
  1946. headerDiv.appendChild(headerTable);
  1947. frameDiv.appendChild(headerDiv);
  1948. var bodyDiv = document.createElement("DIV");
  1949. bodyDiv.className = "bDiv";
  1950. g.bDiv = bodyDiv;
  1951. $(bodyDiv).scroll(function(){
  1952. headerDiv.scrollLeft = this.scrollLeft;
  1953. });
  1954. if (!isNaN(p.restHeight)) {
  1955. var bch = document.documentElement.clientHeight;
  1956. bch -= p.restHeight;
  1957. if (p.usepager)
  1958. bch -= 30;
  1959. if (p.title)
  1960. bch -= 30;
  1961. p.height = bch - 30;
  1962. }
  1963. if (p.height != 'auto') {
  1964. bodyDiv.style.height = p.height + "px";
  1965. } else {
  1966. bodyDiv.style.overflowY = "hidden";
  1967. bodyDiv.style.height = 'auto';
  1968. t.className = "autoht";
  1969. }
  1970. var pc = t.parentNode;
  1971. frameDiv.appendChild(bodyDiv);
  1972. // add pager
  1973. if (p.usepager){
  1974. var pDiv = document.createElement("DIV");
  1975. g.pDiv = pDiv;
  1976. pDiv.className = 'pDiv';
  1977. pDiv.innerHTML = '<div class="pDiv2"></div><div class="pDiv3"></div>';
  1978. frameDiv.appendChild(pDiv);
  1979. if (typeof(p.pages) == 'undefined') p.pages = p.rp == 0 ? 0 : Math.ceil(p.total/p.rp);
  1980. var html = ' <div class="pGroup"> <div class="pFirst pButton"><span></span></div><div class="pPrev pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"><span class="pcontrol">页码 <input type="text" size="1" value="' + p.page + '" /> 共 <span>' + p.pages + ' 页 </span></span></div> <div class="btnseparator"></div> <div class="pGroup"> <div class="pNext pButton"><span></span></div><div class="pLast pButton"><span></span></div> </div> <div class="btnseparator"></div> <div class="pGroup"> <div class="pReload pButton"><span></span></div> </div> <div class="btnseparator"></div>';
  1981. $('.pDiv2', pDiv).html(html);
  1982. var html3 = '<div class="rightGroup"><span class="pPageStat"></span></div>';
  1983. $('.pDiv3', pDiv).html(html3);
  1984. $('.pReload',g.pDiv).click(function(){g.populate()});
  1985. $('.pFirst',g.pDiv).click(function(){g.changePage('first')});
  1986. $('.pPrev',g.pDiv).click(function(){g.changePage('prev')});
  1987. $('.pNext',g.pDiv).click(function(){g.changePage('next')});
  1988. $('.pLast',g.pDiv).click(function(){g.changePage('last')});
  1989. $('.pcontrol input',g.pDiv).keydown(function(e){if(e.keyCode==13) g.changePage('input')});
  1990. if ($.browser.msie&&$.browser.version<7) $('.pButton',g.pDiv).hover(function(){$(this).addClass('pBtnOver');},function(){$(this).removeClass('pBtnOver');});
  1991. g.buildpager();
  1992. if (p.useRp)
  1993. {
  1994. var opt = "";
  1995. for (var nx=0;nx<p.rpOptions.length;nx++)
  1996. {
  1997. if (p.rp == p.rpOptions[nx]) sel = 'selected="selected"'; else sel = '';
  1998. opt += "<option value='" + p.rpOptions[nx] + "' " + sel + " >" + p.rpOptions[nx] + "&nbsp;&nbsp;</option>";
  1999. };
  2000. $('.pDiv2',g.pDiv).prepend("<div class='pGroup'><select name='rp'>"+opt+"</select></div> <div class='btnseparator'></div>");
  2001. $('select',g.pDiv).change(
  2002. function ()
  2003. {
  2004. if (p.onRpChange)
  2005. p.onRpChange(+this.value);
  2006. else
  2007. {
  2008. p.newp = 1;
  2009. p.rp = +this.value;
  2010. g.populate();
  2011. }
  2012. }
  2013. );
  2014. }
  2015. //add search button
  2016. if (p.searchitems && p.searchitems.length > 0)
  2017. {
  2018. g.sDiv = document.createElement("DIV");
  2019. frameDiv.insertBefore(g.sDiv, g.pDiv);
  2020. $('.pDiv2',g.pDiv).prepend("<div class='pGroup'> <div class='pSearch pButton'><span></span></div> </div> <div class='btnseparator'></div>");
  2021. $('.pSearch',g.pDiv).click(function(){$(g.sDiv).slideToggle('fast',function(){$('.sDiv:visible input:first',g.gDiv).trigger('focus');});});
  2022. //add search box
  2023. g.sDiv.className = 'sDiv';
  2024. sitems = p.searchitems;
  2025. var sopt = "";
  2026. for (var s = 0; s < sitems.length; s++)
  2027. {
  2028. if (p.qtype=='' && sitems[s].isdefault==true)
  2029. {
  2030. p.qtype = sitems[s].name;
  2031. sel = 'selected="selected"';
  2032. } else sel = '';
  2033. sopt += "<option value='" + sitems[s].name + "' " + sel + " >" + sitems[s].display + "&nbsp;&nbsp;</option>";
  2034. }
  2035. if (p.qtype=='') p.qtype = sitems[0].name;
  2036. $(g.sDiv).append("<div class='sDiv2'>过滤条件 <select name='filterField'>"+sopt+"</select> <input type='text' size='30' name='filterValue' class='qsbox' /> <input type='button' value='确定' /> <input type='button' value='重置' /></div>");
  2037. $('input[name=filterField],select[name=filterValue]',g.sDiv).keydown(function(e){if(e.keyCode==13) g.doSearch()});
  2038. $('input[value=重置]',g.sDiv).click(function(){$('input[name=q]',g.sDiv).val(''); p.query = ''; g.doSearch(); });
  2039. $('input[value=确定]', g.sDiv).click(function(){g.doSearch()});
  2040. $(g.bDiv).after(g.sDiv);
  2041. }
  2042. }
  2043. pc.insertBefore(frameDiv, t);
  2044. t.cellPadding = 0;
  2045. t.cellSpacing = 0;
  2046. bodyDiv.appendChild(pc.removeChild(t));
  2047. if ($.browser.msie&&$.browser.version<7.0)
  2048. {
  2049. if (g.mDiv)
  2050. g.mDiv.style.width = "100%";
  2051. g.bDiv.style.width = "100%";
  2052. g.hDiv.style.width = "100%";
  2053. if (g.pDiv)
  2054. g.pDiv.style.width = "100%";
  2055. if (g.sDiv)
  2056. g.sDiv.style.width = "100%";
  2057. g.gDiv.className = g.gDiv.className + " ie6";
  2058. if (p.width!='auto') g.gDiv.className = g.gDiv.className + ' ie6fullwidthbug';
  2059. }
  2060. t.style.display = "block";
  2061. g.block = document.createElement("DIV");
  2062. g.block.className = "gBlock";
  2063. t.p = p;
  2064. t.grid = g;
  2065. // load data
  2066. if (p.url&&p.autoload&&p.useAjax)
  2067. {
  2068. g.populate();
  2069. }
  2070. return g;
  2071. }
  2072. var docloaded = false;
  2073. $(document).ready(function () {docloaded = true} );
  2074. $.fn.hcksGrid = function(p) {
  2075. return this.each( function() {
  2076. var t = this;
  2077. if (!docloaded)
  2078. {
  2079. $(this).hide();
  2080. $(document).ready (function(){
  2081. if (p.plain) {
  2082. $.addPlainFlex(t, p);
  2083. } else {
  2084. $.addFlex(t,p);
  2085. }
  2086. });
  2087. } else {
  2088. if (p.plain) {
  2089. $.addPlainFlex(t, p);
  2090. } else {
  2091. $.addFlex(t,p);
  2092. }
  2093. }
  2094. });
  2095. }; //end grid
  2096. $.fn.gridReload = function(p) { // function to reload grid
  2097. return this.each( function() {
  2098. if (this.grid && this.p.url) this.grid.populate();
  2099. });
  2100. }; //end flexReload
  2101. $.fn.gridOptions = function(p) { //function to update general options
  2102. return this.each( function() {
  2103. if (this.grid) $.extend(this.p,p);
  2104. });
  2105. }; //end flexOptions
  2106. $.fn.gridToggleCol = function(cid,visible) { // function to reload grid
  2107. return this.each( function() {
  2108. if (this.grid) this.grid.toggleCol(cid,visible);
  2109. });
  2110. }; //end flexToggleCol
  2111. $.fn.gridAddData = function(data) { // function to add data to grid
  2112. return this.each( function() {
  2113. if (this.grid) this.grid.addData(data);
  2114. });
  2115. };
  2116. $.fn.noSelect = function(p) { //no select plugin by me :-)
  2117. if (p == null)
  2118. prevent = true;
  2119. else
  2120. prevent = p;
  2121. if (prevent) {
  2122. return this.each(function ()
  2123. {
  2124. if ($.browser.msie||$.browser.safari) $(this).bind('selectstart',function(){return false;});
  2125. else if ($.browser.mozilla)
  2126. {
  2127. $(this).css('MozUserSelect','none');
  2128. $('body').trigger('focus');
  2129. }
  2130. else if ($.browser.opera) $(this).bind('mousedown',function(){return false;});
  2131. else $(this).attr('unselectable','on');
  2132. });
  2133. } else {
  2134. return this.each(function ()
  2135. {
  2136. if ($.browser.msie||$.browser.safari) $(this).unbind('selectstart');
  2137. else if ($.browser.mozilla) $(this).css('MozUserSelect','inherit');
  2138. else if ($.browser.opera) $(this).unbind('mousedown');
  2139. else $(this).removeAttr('unselectable','on');
  2140. });
  2141. }
  2142. }; //end noSelect
  2143. })(jQuery);