jquery.combobox.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. /**
  2. * jQuery EasyUI 1.3.6
  3. *
  4. * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
  5. *
  6. * Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
  7. * To use it on other terms please contact us at info@jeasyui.com
  8. *
  9. */
  10. (function($){
  11. var _1=0;
  12. function _2(_3,_4){
  13. var _5=$.data(_3,"combobox");
  14. var _6=_5.options;
  15. var _7=_5.data;
  16. for(var i=0;i<_7.length;i++){
  17. if(_7[i][_6.valueField]==_4){
  18. return i;
  19. }
  20. }
  21. return -1;
  22. };
  23. function _8(_9,_a){
  24. var _b=$.data(_9,"combobox").options;
  25. var _c=$(_9).combo("panel");
  26. var _d=_b.finder.getEl(_9,_a);
  27. if(_d.length){
  28. if(_d.position().top<=0){
  29. var h=_c.scrollTop()+_d.position().top;
  30. _c.scrollTop(h);
  31. }else{
  32. if(_d.position().top+_d.outerHeight()>_c.height()){
  33. var h=_c.scrollTop()+_d.position().top+_d.outerHeight()-_c.height();
  34. _c.scrollTop(h);
  35. }
  36. }
  37. }
  38. };
  39. function _e(_f,dir){
  40. var _10=$.data(_f,"combobox").options;
  41. var _11=$(_f).combobox("panel");
  42. var _12=_11.children("div.combobox-item-hover");
  43. if(!_12.length){
  44. _12=_11.children("div.combobox-item-selected");
  45. }
  46. _12.removeClass("combobox-item-hover");
  47. var _13="div.combobox-item:visible:not(.combobox-item-disabled):first";
  48. var _14="div.combobox-item:visible:not(.combobox-item-disabled):last";
  49. if(!_12.length){
  50. _12=_11.children(dir=="next"?_13:_14);
  51. }else{
  52. if(dir=="next"){
  53. _12=_12.nextAll(_13);
  54. if(!_12.length){
  55. _12=_11.children(_13);
  56. }
  57. }else{
  58. _12=_12.prevAll(_13);
  59. if(!_12.length){
  60. _12=_11.children(_14);
  61. }
  62. }
  63. }
  64. if(_12.length){
  65. _12.addClass("combobox-item-hover");
  66. var row=_10.finder.getRow(_f,_12);
  67. if(row){
  68. _8(_f,row[_10.valueField]);
  69. if(_10.selectOnNavigation){
  70. _15(_f,row[_10.valueField]);
  71. }
  72. }
  73. }
  74. };
  75. function _15(_16,_17){
  76. var _18=$.data(_16,"combobox").options;
  77. var _19=$(_16).combo("getValues");
  78. if($.inArray(_17+"",_19)==-1){
  79. if(_18.multiple){
  80. _19.push(_17);
  81. }else{
  82. _19=[_17];
  83. }
  84. _1a(_16,_19);
  85. _18.onSelect.call(_16,_18.finder.getRow(_16,_17));
  86. }
  87. };
  88. function _1b(_1c,_1d){
  89. var _1e=$.data(_1c,"combobox").options;
  90. var _1f=$(_1c).combo("getValues");
  91. var _20=$.inArray(_1d+"",_1f);
  92. if(_20>=0){
  93. _1f.splice(_20,1);
  94. _1a(_1c,_1f);
  95. _1e.onUnselect.call(_1c,_1e.finder.getRow(_1c,_1d));
  96. }
  97. };
  98. function _1a(_21,_22,_23){
  99. var _24=$.data(_21,"combobox").options;
  100. var _25=$(_21).combo("panel");
  101. _25.find("div.combobox-item-selected").removeClass("combobox-item-selected");
  102. var vv=[],ss=[];
  103. for(var i=0;i<_22.length;i++){
  104. var v=_22[i];
  105. var s=v;
  106. _24.finder.getEl(_21,v).addClass("combobox-item-selected");
  107. var row=_24.finder.getRow(_21,v);
  108. if(row){
  109. s=row[_24.textField];
  110. }
  111. vv.push(v);
  112. ss.push(s);
  113. }
  114. $(_21).combo("setValues",vv);
  115. if(!_23){
  116. $(_21).combo("setText",ss.join(_24.separator));
  117. }
  118. };
  119. function _26(_27,_28,_29){
  120. var _2a=$.data(_27,"combobox");
  121. var _2b=_2a.options;
  122. _2a.data=_2b.loadFilter.call(_27,_28);
  123. _2a.groups=[];
  124. _28=_2a.data;
  125. var _2c=$(_27).combobox("getValues");
  126. var dd=[];
  127. var _2d=undefined;
  128. for(var i=0;i<_28.length;i++){
  129. var row=_28[i];
  130. var v=row[_2b.valueField]+"";
  131. var s=row[_2b.textField];
  132. var g=row[_2b.groupField];
  133. if(g){
  134. if(_2d!=g){
  135. _2d=g;
  136. _2a.groups.push(g);
  137. dd.push("<div id=\""+(_2a.groupIdPrefix+"_"+(_2a.groups.length-1))+"\" class=\"combobox-group\">");
  138. dd.push(_2b.groupFormatter?_2b.groupFormatter.call(_27,g):g);
  139. dd.push("</div>");
  140. }
  141. }else{
  142. _2d=undefined;
  143. }
  144. var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":"");
  145. dd.push("<div id=\""+(_2a.itemIdPrefix+"_"+i)+"\" class=\""+cls+"\">");
  146. dd.push(_2b.formatter?_2b.formatter.call(_27,row):s);
  147. dd.push("</div>");
  148. if(row["selected"]&&$.inArray(v,_2c)==-1){
  149. _2c.push(v);
  150. }
  151. }
  152. $(_27).combo("panel").html(dd.join(""));
  153. if(_2b.multiple){
  154. _1a(_27,_2c,_29);
  155. }else{
  156. _1a(_27,_2c.length?[_2c[_2c.length-1]]:[],_29);
  157. }
  158. _2b.onLoadSuccess.call(_27,_28);
  159. };
  160. function _2e(_2f,url,_30,_31){
  161. var _32=$.data(_2f,"combobox").options;
  162. if(url){
  163. _32.url=url;
  164. }
  165. _30=_30||{};
  166. if(_32.onBeforeLoad.call(_2f,_30)==false){
  167. return;
  168. }
  169. _32.loader.call(_2f,_30,function(_33){
  170. _26(_2f,_33,_31);
  171. },function(){
  172. _32.onLoadError.apply(this,arguments);
  173. });
  174. };
  175. function _34(_35,q){
  176. var _36=$.data(_35,"combobox");
  177. var _37=_36.options;
  178. if(_37.multiple&&!q){
  179. _1a(_35,[],true);
  180. }else{
  181. _1a(_35,[q],true);
  182. }
  183. if(_37.mode=="remote"){
  184. _2e(_35,null,{q:q},true);
  185. }else{
  186. var _38=$(_35).combo("panel");
  187. _38.find("div.combobox-item-selected,div.combobox-item-hover").removeClass("combobox-item-selected combobox-item-hover");
  188. _38.find("div.combobox-item,div.combobox-group").hide();
  189. var _39=_36.data;
  190. var vv=[];
  191. var qq=_37.multiple?q.split(_37.separator):[q];
  192. $.map(qq,function(q){
  193. q=$.trim(q);
  194. var _3a=undefined;
  195. for(var i=0;i<_39.length;i++){
  196. var row=_39[i];
  197. if(_37.filter.call(_35,q,row)){
  198. var v=row[_37.valueField];
  199. var s=row[_37.textField];
  200. var g=row[_37.groupField];
  201. var _3b=_37.finder.getEl(_35,v).show();
  202. if(s.toLowerCase()==q.toLowerCase()){
  203. vv.push(v);
  204. _3b.addClass("combobox-item-selected");
  205. }
  206. if(_37.groupField&&_3a!=g){
  207. $("#"+_36.groupIdPrefix+"_"+$.inArray(g,_36.groups)).show();
  208. _3a=g;
  209. }
  210. }
  211. }
  212. });
  213. _1a(_35,vv,true);
  214. }
  215. };
  216. function _3c(_3d){
  217. var t=$(_3d);
  218. var _3e=t.combobox("options");
  219. var _3f=t.combobox("panel");
  220. var _40=_3f.children("div.combobox-item-hover");
  221. if(_40.length){
  222. var row=_3e.finder.getRow(_3d,_40);
  223. var _41=row[_3e.valueField];
  224. if(_3e.multiple){
  225. if(_40.hasClass("combobox-item-selected")){
  226. t.combobox("unselect",_41);
  227. }else{
  228. t.combobox("select",_41);
  229. }
  230. }else{
  231. t.combobox("select",_41);
  232. }
  233. }
  234. var vv=[];
  235. $.map(t.combobox("getValues"),function(v){
  236. if(_2(_3d,v)>=0){
  237. vv.push(v);
  238. }
  239. });
  240. t.combobox("setValues",vv);
  241. if(!_3e.multiple){
  242. t.combobox("hidePanel");
  243. }
  244. };
  245. function _42(_43){
  246. var _44=$.data(_43,"combobox");
  247. var _45=_44.options;
  248. _1++;
  249. _44.itemIdPrefix="_easyui_combobox_i"+_1;
  250. _44.groupIdPrefix="_easyui_combobox_g"+_1;
  251. $(_43).addClass("combobox-f");
  252. $(_43).combo($.extend({},_45,{onShowPanel:function(){
  253. $(_43).combo("panel").find("div.combobox-item,div.combobox-group").show();
  254. _8(_43,$(_43).combobox("getValue"));
  255. _45.onShowPanel.call(_43);
  256. }}));
  257. $(_43).combo("panel").unbind().bind("mouseover",function(e){
  258. $(this).children("div.combobox-item-hover").removeClass("combobox-item-hover");
  259. var _46=$(e.target).closest("div.combobox-item");
  260. if(!_46.hasClass("combobox-item-disabled")){
  261. _46.addClass("combobox-item-hover");
  262. }
  263. e.stopPropagation();
  264. }).bind("mouseout",function(e){
  265. $(e.target).closest("div.combobox-item").removeClass("combobox-item-hover");
  266. e.stopPropagation();
  267. }).bind("click",function(e){
  268. var _47=$(e.target).closest("div.combobox-item");
  269. if(!_47.length||_47.hasClass("combobox-item-disabled")){
  270. return;
  271. }
  272. var row=_45.finder.getRow(_43,_47);
  273. if(!row){
  274. return;
  275. }
  276. var _48=row[_45.valueField];
  277. if(_45.multiple){
  278. if(_47.hasClass("combobox-item-selected")){
  279. _1b(_43,_48);
  280. }else{
  281. _15(_43,_48);
  282. }
  283. }else{
  284. _15(_43,_48);
  285. $(_43).combo("hidePanel");
  286. }
  287. e.stopPropagation();
  288. });
  289. };
  290. $.fn.combobox=function(_49,_4a){
  291. if(typeof _49=="string"){
  292. var _4b=$.fn.combobox.methods[_49];
  293. if(_4b){
  294. return _4b(this,_4a);
  295. }else{
  296. return this.combo(_49,_4a);
  297. }
  298. }
  299. _49=_49||{};
  300. return this.each(function(){
  301. var _4c=$.data(this,"combobox");
  302. if(_4c){
  303. $.extend(_4c.options,_49);
  304. _42(this);
  305. }else{
  306. _4c=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_49),data:[]});
  307. _42(this);
  308. var _4d=$.fn.combobox.parseData(this);
  309. if(_4d.length){
  310. _26(this,_4d);
  311. }
  312. }
  313. if(_4c.options.data){
  314. _26(this,_4c.options.data);
  315. }
  316. _2e(this);
  317. });
  318. };
  319. $.fn.combobox.methods={options:function(jq){
  320. var _4e=jq.combo("options");
  321. return $.extend($.data(jq[0],"combobox").options,{originalValue:_4e.originalValue,disabled:_4e.disabled,readonly:_4e.readonly});
  322. },getData:function(jq){
  323. return $.data(jq[0],"combobox").data;
  324. },setValues:function(jq,_4f){
  325. return jq.each(function(){
  326. _1a(this,_4f);
  327. });
  328. },setValue:function(jq,_50){
  329. return jq.each(function(){
  330. _1a(this,[_50]);
  331. });
  332. },clear:function(jq){
  333. return jq.each(function(){
  334. $(this).combo("clear");
  335. var _51=$(this).combo("panel");
  336. _51.find("div.combobox-item-selected").removeClass("combobox-item-selected");
  337. });
  338. },reset:function(jq){
  339. return jq.each(function(){
  340. var _52=$(this).combobox("options");
  341. if(_52.multiple){
  342. $(this).combobox("setValues",_52.originalValue);
  343. }else{
  344. $(this).combobox("setValue",_52.originalValue);
  345. }
  346. });
  347. },loadData:function(jq,_53){
  348. return jq.each(function(){
  349. _26(this,_53);
  350. });
  351. },reload:function(jq,url){
  352. return jq.each(function(){
  353. _2e(this,url);
  354. });
  355. },select:function(jq,_54){
  356. return jq.each(function(){
  357. _15(this,_54);
  358. });
  359. },unselect:function(jq,_55){
  360. return jq.each(function(){
  361. _1b(this,_55);
  362. });
  363. }};
  364. $.fn.combobox.parseOptions=function(_56){
  365. var t=$(_56);
  366. return $.extend({},$.fn.combo.parseOptions(_56),$.parser.parseOptions(_56,["valueField","textField","groupField","mode","method","url"]));
  367. };
  368. $.fn.combobox.parseData=function(_57){
  369. var _58=[];
  370. var _59=$(_57).combobox("options");
  371. $(_57).children().each(function(){
  372. if(this.tagName.toLowerCase()=="optgroup"){
  373. var _5a=$(this).attr("label");
  374. $(this).children().each(function(){
  375. _5b(this,_5a);
  376. });
  377. }else{
  378. _5b(this);
  379. }
  380. });
  381. return _58;
  382. function _5b(el,_5c){
  383. var t=$(el);
  384. var row={};
  385. row[_59.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text();
  386. row[_59.textField]=t.text();
  387. row["selected"]=t.is(":selected");
  388. row["disabled"]=t.is(":disabled");
  389. if(_5c){
  390. _59.groupField=_59.groupField||"group";
  391. row[_59.groupField]=_5c;
  392. }
  393. _58.push(row);
  394. };
  395. };
  396. $.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupField:null,groupFormatter:function(_5d){
  397. return _5d;
  398. },mode:"local",method:"post",url:null,data:null,keyHandler:{up:function(e){
  399. _e(this,"prev");
  400. e.preventDefault();
  401. },down:function(e){
  402. _e(this,"next");
  403. e.preventDefault();
  404. },left:function(e){
  405. },right:function(e){
  406. },enter:function(e){
  407. _3c(this);
  408. },query:function(q,e){
  409. _34(this,q);
  410. }},filter:function(q,row){
  411. var _5e=$(this).combobox("options");
  412. return row[_5e.textField].toLowerCase().indexOf(q.toLowerCase())==0;
  413. },formatter:function(row){
  414. var _5f=$(this).combobox("options");
  415. return row[_5f.textField];
  416. },loader:function(_60,_61,_62){
  417. var _63=$(this).combobox("options");
  418. if(!_63.url){
  419. return false;
  420. }
  421. $.ajax({type:_63.method,url:_63.url,data:_60,dataType:"json",success:function(_64){
  422. _61(_64);
  423. },error:function(){
  424. _62.apply(this,arguments);
  425. }});
  426. },loadFilter:function(_65){
  427. return _65;
  428. },finder:{getEl:function(_66,_67){
  429. var _68=_2(_66,_67);
  430. var id=$.data(_66,"combobox").itemIdPrefix+"_"+_68;
  431. return $("#"+id);
  432. },getRow:function(_69,p){
  433. var _6a=$.data(_69,"combobox");
  434. var _6b=(p instanceof jQuery)?p.attr("id").substr(_6a.itemIdPrefix.length+1):_2(_69,p);
  435. return _6a.data[parseInt(_6b)];
  436. }},onBeforeLoad:function(_6c){
  437. },onLoadSuccess:function(){
  438. },onLoadError:function(){
  439. },onSelect:function(_6d){
  440. },onUnselect:function(_6e){
  441. }});
  442. })(jQuery);