jquery.combo.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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. function _1(_2,_3){
  12. var _4=$.data(_2,"combo");
  13. var _5=_4.options;
  14. var _6=_4.combo;
  15. var _7=_4.panel;
  16. if(_3){
  17. _5.width=_3;
  18. }
  19. if(isNaN(_5.width)){
  20. var c=$(_2).clone();
  21. c.css("visibility","hidden");
  22. c.appendTo("body");
  23. _5.width=c.outerWidth();
  24. c.remove();
  25. }
  26. _6.appendTo("body");
  27. var _8=_6.find("input.combo-text");
  28. var _9=_6.find(".combo-arrow");
  29. var _a=_5.hasDownArrow?_9._outerWidth():0;
  30. _6._outerWidth(_5.width)._outerHeight(_5.height);
  31. _8._outerWidth(_6.width()-_a);
  32. _8.css({height:_6.height()+"px",lineHeight:_6.height()+"px"});
  33. _9._outerHeight(_6.height());
  34. _7.panel("resize",{width:(_5.panelWidth?_5.panelWidth:_6.outerWidth()),height:_5.panelHeight});
  35. _6.insertAfter(_2);
  36. };
  37. function _b(_c){
  38. $(_c).addClass("combo-f").hide();
  39. var _d=$("<span class=\"combo\">"+"<input type=\"text\" class=\"combo-text\" autocomplete=\"off\">"+"<span><span class=\"combo-arrow\"></span></span>"+"<input type=\"hidden\" class=\"combo-value\">"+"</span>").insertAfter(_c);
  40. var _e=$("<div class=\"combo-panel\"></div>").appendTo("body");
  41. _e.panel({doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){
  42. var p=$(this).panel("panel");
  43. if($.fn.menu){
  44. p.css("z-index",$.fn.menu.defaults.zIndex++);
  45. }else{
  46. if($.fn.window){
  47. p.css("z-index",$.fn.window.defaults.zIndex++);
  48. }
  49. }
  50. $(this).panel("resize");
  51. },onBeforeClose:function(){
  52. _1c(this);
  53. },onClose:function(){
  54. var _f=$.data(_c,"combo");
  55. if(_f){
  56. _f.options.onHidePanel.call(_c);
  57. }
  58. }});
  59. var _10=$(_c).attr("name");
  60. if(_10){
  61. _d.find("input.combo-value").attr("name",_10);
  62. $(_c).removeAttr("name").attr("comboName",_10);
  63. }
  64. return {combo:_d,panel:_e};
  65. };
  66. function _11(_12){
  67. var _13=$.data(_12,"combo");
  68. var _14=_13.options;
  69. var _15=_13.combo;
  70. if(_14.hasDownArrow){
  71. _15.find(".combo-arrow").show();
  72. }else{
  73. _15.find(".combo-arrow").hide();
  74. }
  75. _16(_12,_14.disabled);
  76. _17(_12,_14.readonly);
  77. };
  78. function _18(_19){
  79. var _1a=$.data(_19,"combo");
  80. var _1b=_1a.combo.find("input.combo-text");
  81. _1b.validatebox("destroy");
  82. _1a.panel.panel("destroy");
  83. _1a.combo.remove();
  84. $(_19).remove();
  85. };
  86. function _1c(_1d){
  87. $(_1d).find(".combo-f").each(function(){
  88. var p=$(this).combo("panel");
  89. if(p.is(":visible")){
  90. p.panel("close");
  91. }
  92. });
  93. };
  94. function _1e(_1f){
  95. var _20=$.data(_1f,"combo");
  96. var _21=_20.options;
  97. var _22=_20.panel;
  98. var _23=_20.combo;
  99. var _24=_23.find(".combo-text");
  100. var _25=_23.find(".combo-arrow");
  101. $(document).unbind(".combo").bind("mousedown.combo",function(e){
  102. var p=$(e.target).closest("span.combo,div.combo-p");
  103. if(p.length){
  104. _1c(p);
  105. return;
  106. }
  107. $("body>div.combo-p>div.combo-panel:visible").panel("close");
  108. });
  109. _24.unbind(".combo");
  110. _25.unbind(".combo");
  111. if(!_21.disabled&&!_21.readonly){
  112. _24.bind("click.combo",function(e){
  113. if(!_21.editable){
  114. _26.call(this);
  115. }else{
  116. var p=$(this).closest("div.combo-panel");
  117. $("div.combo-panel:visible").not(_22).not(p).panel("close");
  118. }
  119. }).bind("keydown.combo paste.combo drop.combo",function(e){
  120. switch(e.keyCode){
  121. case 38:
  122. _21.keyHandler.up.call(_1f,e);
  123. break;
  124. case 40:
  125. _21.keyHandler.down.call(_1f,e);
  126. break;
  127. case 37:
  128. _21.keyHandler.left.call(_1f,e);
  129. break;
  130. case 39:
  131. _21.keyHandler.right.call(_1f,e);
  132. break;
  133. case 13:
  134. e.preventDefault();
  135. _21.keyHandler.enter.call(_1f,e);
  136. return false;
  137. case 9:
  138. case 27:
  139. _27(_1f);
  140. break;
  141. default:
  142. if(_21.editable){
  143. if(_20.timer){
  144. clearTimeout(_20.timer);
  145. }
  146. _20.timer=setTimeout(function(){
  147. var q=_24.val();
  148. if(_20.previousValue!=q){
  149. _20.previousValue=q;
  150. $(_1f).combo("showPanel");
  151. _21.keyHandler.query.call(_1f,_24.val(),e);
  152. $(_1f).combo("validate");
  153. }
  154. },_21.delay);
  155. }
  156. }
  157. });
  158. _25.bind("click.combo",function(){
  159. _26.call(this);
  160. }).bind("mouseenter.combo",function(){
  161. $(this).addClass("combo-arrow-hover");
  162. }).bind("mouseleave.combo",function(){
  163. $(this).removeClass("combo-arrow-hover");
  164. });
  165. }
  166. function _26(){
  167. if(_22.is(":visible")){
  168. _27(_1f);
  169. }else{
  170. var p=$(this).closest("div.combo-panel");
  171. $("div.combo-panel:visible").not(_22).not(p).panel("close");
  172. $(_1f).combo("showPanel");
  173. }
  174. _24.focus();
  175. };
  176. };
  177. function _28(_29){
  178. var _2a=$.data(_29,"combo");
  179. var _2b=_2a.options;
  180. var _2c=_2a.combo;
  181. var _2d=_2a.panel;
  182. _2d.panel("move",{left:_2e(),top:_2f()});
  183. if(_2d.panel("options").closed){
  184. _2d.panel("open");
  185. _2b.onShowPanel.call(_29);
  186. }
  187. (function(){
  188. if(_2d.is(":visible")){
  189. _2d.panel("move",{left:_2e(),top:_2f()});
  190. setTimeout(arguments.callee,200);
  191. }
  192. })();
  193. function _2e(){
  194. var _30=_2c.offset().left;
  195. if(_2b.panelAlign=="right"){
  196. _30+=_2c._outerWidth()-_2d._outerWidth();
  197. }
  198. if(_30+_2d._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){
  199. _30=$(window)._outerWidth()+$(document).scrollLeft()-_2d._outerWidth();
  200. }
  201. if(_30<0){
  202. _30=0;
  203. }
  204. return _30;
  205. };
  206. function _2f(){
  207. var top=_2c.offset().top+_2c._outerHeight();
  208. if(top+_2d._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
  209. top=_2c.offset().top-_2d._outerHeight();
  210. }
  211. if(top<$(document).scrollTop()){
  212. top=_2c.offset().top+_2c._outerHeight();
  213. }
  214. return top;
  215. };
  216. };
  217. function _27(_31){
  218. var _32=$.data(_31,"combo").panel;
  219. _32.panel("close");
  220. };
  221. function _33(_34){
  222. var _35=$.data(_34,"combo").options;
  223. var _36=$(_34).combo("textbox");
  224. _36.validatebox($.extend({},_35,{deltaX:(_35.hasDownArrow?_35.deltaX:(_35.deltaX>0?1:-1))}));
  225. };
  226. function _16(_37,_38){
  227. var _39=$.data(_37,"combo");
  228. var _3a=_39.options;
  229. var _3b=_39.combo;
  230. if(_38){
  231. _3a.disabled=true;
  232. $(_37).attr("disabled",true);
  233. _3b.find(".combo-value").attr("disabled",true);
  234. _3b.find(".combo-text").attr("disabled",true);
  235. }else{
  236. _3a.disabled=false;
  237. $(_37).removeAttr("disabled");
  238. _3b.find(".combo-value").removeAttr("disabled");
  239. _3b.find(".combo-text").removeAttr("disabled");
  240. }
  241. };
  242. function _17(_3c,_3d){
  243. var _3e=$.data(_3c,"combo");
  244. var _3f=_3e.options;
  245. _3f.readonly=_3d==undefined?true:_3d;
  246. var _40=_3f.readonly?true:(!_3f.editable);
  247. _3e.combo.find(".combo-text").attr("readonly",_40).css("cursor",_40?"pointer":"");
  248. };
  249. function _41(_42){
  250. var _43=$.data(_42,"combo");
  251. var _44=_43.options;
  252. var _45=_43.combo;
  253. if(_44.multiple){
  254. _45.find("input.combo-value").remove();
  255. }else{
  256. _45.find("input.combo-value").val("");
  257. }
  258. _45.find("input.combo-text").val("");
  259. };
  260. function _46(_47){
  261. var _48=$.data(_47,"combo").combo;
  262. return _48.find("input.combo-text").val();
  263. };
  264. function _49(_4a,_4b){
  265. var _4c=$.data(_4a,"combo");
  266. var _4d=_4c.combo.find("input.combo-text");
  267. if(_4d.val()!=_4b){
  268. _4d.val(_4b);
  269. $(_4a).combo("validate");
  270. _4c.previousValue=_4b;
  271. }
  272. };
  273. function _4e(_4f){
  274. var _50=[];
  275. var _51=$.data(_4f,"combo").combo;
  276. _51.find("input.combo-value").each(function(){
  277. _50.push($(this).val());
  278. });
  279. return _50;
  280. };
  281. function _52(_53,_54){
  282. var _55=$.data(_53,"combo").options;
  283. var _56=_4e(_53);
  284. var _57=$.data(_53,"combo").combo;
  285. _57.find("input.combo-value").remove();
  286. var _58=$(_53).attr("comboName");
  287. for(var i=0;i<_54.length;i++){
  288. var _59=$("<input type=\"hidden\" class=\"combo-value\">").appendTo(_57);
  289. if(_58){
  290. _59.attr("name",_58);
  291. }
  292. _59.val(_54[i]);
  293. }
  294. var tmp=[];
  295. for(var i=0;i<_56.length;i++){
  296. tmp[i]=_56[i];
  297. }
  298. var aa=[];
  299. for(var i=0;i<_54.length;i++){
  300. for(var j=0;j<tmp.length;j++){
  301. if(_54[i]==tmp[j]){
  302. aa.push(_54[i]);
  303. tmp.splice(j,1);
  304. break;
  305. }
  306. }
  307. }
  308. if(aa.length!=_54.length||_54.length!=_56.length){
  309. if(_55.multiple){
  310. _55.onChange.call(_53,_54,_56);
  311. }else{
  312. _55.onChange.call(_53,_54[0],_56[0]);
  313. }
  314. }
  315. };
  316. function _5a(_5b){
  317. var _5c=_4e(_5b);
  318. return _5c[0];
  319. };
  320. function _5d(_5e,_5f){
  321. _52(_5e,[_5f]);
  322. };
  323. function _60(_61){
  324. var _62=$.data(_61,"combo").options;
  325. var fn=_62.onChange;
  326. _62.onChange=function(){
  327. };
  328. if(_62.multiple){
  329. if(_62.value){
  330. if(typeof _62.value=="object"){
  331. _52(_61,_62.value);
  332. }else{
  333. _5d(_61,_62.value);
  334. }
  335. }else{
  336. _52(_61,[]);
  337. }
  338. _62.originalValue=_4e(_61);
  339. }else{
  340. _5d(_61,_62.value);
  341. _62.originalValue=_62.value;
  342. }
  343. _62.onChange=fn;
  344. };
  345. $.fn.combo=function(_63,_64){
  346. if(typeof _63=="string"){
  347. var _65=$.fn.combo.methods[_63];
  348. if(_65){
  349. return _65(this,_64);
  350. }else{
  351. return this.each(function(){
  352. var _66=$(this).combo("textbox");
  353. _66.validatebox(_63,_64);
  354. });
  355. }
  356. }
  357. _63=_63||{};
  358. return this.each(function(){
  359. var _67=$.data(this,"combo");
  360. if(_67){
  361. $.extend(_67.options,_63);
  362. }else{
  363. var r=_b(this);
  364. _67=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_63),combo:r.combo,panel:r.panel,previousValue:null});
  365. $(this).removeAttr("disabled");
  366. }
  367. _11(this);
  368. _1(this);
  369. _1e(this);
  370. _33(this);
  371. _60(this);
  372. });
  373. };
  374. $.fn.combo.methods={options:function(jq){
  375. return $.data(jq[0],"combo").options;
  376. },panel:function(jq){
  377. return $.data(jq[0],"combo").panel;
  378. },textbox:function(jq){
  379. return $.data(jq[0],"combo").combo.find("input.combo-text");
  380. },destroy:function(jq){
  381. return jq.each(function(){
  382. _18(this);
  383. });
  384. },resize:function(jq,_68){
  385. return jq.each(function(){
  386. _1(this,_68);
  387. });
  388. },showPanel:function(jq){
  389. return jq.each(function(){
  390. _28(this);
  391. });
  392. },hidePanel:function(jq){
  393. return jq.each(function(){
  394. _27(this);
  395. });
  396. },disable:function(jq){
  397. return jq.each(function(){
  398. _16(this,true);
  399. _1e(this);
  400. });
  401. },enable:function(jq){
  402. return jq.each(function(){
  403. _16(this,false);
  404. _1e(this);
  405. });
  406. },readonly:function(jq,_69){
  407. return jq.each(function(){
  408. _17(this,_69);
  409. _1e(this);
  410. });
  411. },isValid:function(jq){
  412. var _6a=$.data(jq[0],"combo").combo.find("input.combo-text");
  413. return _6a.validatebox("isValid");
  414. },clear:function(jq){
  415. return jq.each(function(){
  416. _41(this);
  417. });
  418. },reset:function(jq){
  419. return jq.each(function(){
  420. var _6b=$.data(this,"combo").options;
  421. if(_6b.multiple){
  422. $(this).combo("setValues",_6b.originalValue);
  423. }else{
  424. $(this).combo("setValue",_6b.originalValue);
  425. }
  426. });
  427. },getText:function(jq){
  428. return _46(jq[0]);
  429. },setText:function(jq,_6c){
  430. return jq.each(function(){
  431. _49(this,_6c);
  432. });
  433. },getValues:function(jq){
  434. return _4e(jq[0]);
  435. },setValues:function(jq,_6d){
  436. return jq.each(function(){
  437. _52(this,_6d);
  438. });
  439. },getValue:function(jq){
  440. return _5a(jq[0]);
  441. },setValue:function(jq,_6e){
  442. return jq.each(function(){
  443. _5d(this,_6e);
  444. });
  445. }};
  446. $.fn.combo.parseOptions=function(_6f){
  447. var t=$(_6f);
  448. return $.extend({},$.fn.validatebox.parseOptions(_6f),$.parser.parseOptions(_6f,["width","height","separator","panelAlign",{panelWidth:"number",editable:"boolean",hasDownArrow:"boolean",delay:"number",selectOnNavigation:"boolean"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined),value:(t.val()||undefined)});
  449. };
  450. $.fn.combo.defaults=$.extend({},$.fn.validatebox.defaults,{width:"auto",height:22,panelWidth:null,panelHeight:200,panelAlign:"left",multiple:false,selectOnNavigation:true,separator:",",editable:true,disabled:false,readonly:false,hasDownArrow:true,value:"",delay:200,deltaX:19,keyHandler:{up:function(e){
  451. },down:function(e){
  452. },left:function(e){
  453. },right:function(e){
  454. },enter:function(e){
  455. },query:function(q,e){
  456. }},onShowPanel:function(){
  457. },onHidePanel:function(){
  458. },onChange:function(_70,_71){
  459. }});
  460. })(jQuery);