jquery.combo.js 11 KB

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