jquery.combobox.js 10.0 KB

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