jquery.combo.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. /**
  2. * jQuery EasyUI 1.4.1
  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(){
  12. $(document).unbind(".combo").bind("mousedown.combo mousewheel.combo",function(e){
  13. var p=$(e.target).closest("span.combo,div.combo-p");
  14. if(p.length){
  15. _1(p);
  16. return;
  17. }
  18. $("body>div.combo-p>div.combo-panel:visible").panel("close");
  19. });
  20. });
  21. function _2(_3){
  22. var _4=$.data(_3,"combo");
  23. var _5=_4.options;
  24. if(!_4.panel){
  25. _4.panel=$("<div class=\"combo-panel\"></div>").appendTo("body");
  26. _4.panel.panel({minWidth:_5.panelMinWidth,maxWidth:_5.panelMaxWidth,minHeight:_5.panelMinHeight,maxHeight:_5.panelMaxHeight,doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){
  27. var _6=$(this).panel("options").comboTarget;
  28. var _7=$.data(_6,"combo");
  29. if(_7){
  30. _7.options.onShowPanel.call(_6);
  31. }
  32. },onBeforeClose:function(){
  33. _1(this);
  34. },onClose:function(){
  35. var _8=$(this).panel("options").comboTarget;
  36. var _9=$.data(_8,"combo");
  37. if(_9){
  38. _9.options.onHidePanel.call(_8);
  39. }
  40. }});
  41. }
  42. var _a=$.extend(true,[],_5.icons);
  43. if(_5.hasDownArrow){
  44. _a.push({iconCls:"combo-arrow",handler:function(e){
  45. _f(e.data.target);
  46. }});
  47. }
  48. $(_3).addClass("combo-f").textbox($.extend({},_5,{icons:_a,onChange:function(){
  49. }}));
  50. $(_3).attr("comboName",$(_3).attr("textboxName"));
  51. _4.combo=$(_3).next();
  52. _4.combo.addClass("combo");
  53. };
  54. function _b(_c){
  55. var _d=$.data(_c,"combo");
  56. var _e=_d.options;
  57. var p=_d.panel;
  58. if(p.is(":visible")){
  59. p.panel("close");
  60. }
  61. if(!_e.cloned){
  62. p.panel("destroy");
  63. }
  64. $(_c).textbox("destroy");
  65. };
  66. function _f(_10){
  67. var _11=$.data(_10,"combo").panel;
  68. if(_11.is(":visible")){
  69. _12(_10);
  70. }else{
  71. var p=$(_10).closest("div.combo-panel");
  72. $("div.combo-panel:visible").not(_11).not(p).panel("close");
  73. $(_10).combo("showPanel");
  74. }
  75. $(_10).combo("textbox").focus();
  76. };
  77. function _1(_13){
  78. $(_13).find(".combo-f").each(function(){
  79. var p=$(this).combo("panel");
  80. if(p.is(":visible")){
  81. p.panel("close");
  82. }
  83. });
  84. };
  85. function _14(e){
  86. var _15=e.data.target;
  87. var _16=$.data(_15,"combo");
  88. var _17=_16.options;
  89. var _18=_16.panel;
  90. if(!_17.editable){
  91. _f(_15);
  92. }else{
  93. var p=$(_15).closest("div.combo-panel");
  94. $("div.combo-panel:visible").not(_18).not(p).panel("close");
  95. }
  96. };
  97. function _19(e){
  98. var _1a=e.data.target;
  99. var t=$(_1a);
  100. var _1b=t.data("combo");
  101. var _1c=t.combo("options");
  102. switch(e.keyCode){
  103. case 38:
  104. _1c.keyHandler.up.call(_1a,e);
  105. break;
  106. case 40:
  107. _1c.keyHandler.down.call(_1a,e);
  108. break;
  109. case 37:
  110. _1c.keyHandler.left.call(_1a,e);
  111. break;
  112. case 39:
  113. _1c.keyHandler.right.call(_1a,e);
  114. break;
  115. case 13:
  116. e.preventDefault();
  117. _1c.keyHandler.enter.call(_1a,e);
  118. return false;
  119. case 9:
  120. case 27:
  121. _12(_1a);
  122. break;
  123. default:
  124. if(_1c.editable){
  125. if(_1b.timer){
  126. clearTimeout(_1b.timer);
  127. }
  128. _1b.timer=setTimeout(function(){
  129. var q=t.combo("getText");
  130. if(_1b.previousText!=q){
  131. _1b.previousText=q;
  132. t.combo("showPanel");
  133. _1c.keyHandler.query.call(_1a,q,e);
  134. t.combo("validate");
  135. }
  136. },_1c.delay);
  137. }
  138. }
  139. };
  140. function _1d(_1e){
  141. var _1f=$.data(_1e,"combo");
  142. var _20=_1f.combo;
  143. var _21=_1f.panel;
  144. var _22=$(_1e).combo("options");
  145. var _23=_21.panel("options");
  146. _23.comboTarget=_1e;
  147. if(_23.closed){
  148. _21.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:$.fn.window.defaults.zIndex++),left:-999999});
  149. _21.panel("resize",{width:(_22.panelWidth?_22.panelWidth:_20._outerWidth()),height:_22.panelHeight});
  150. _21.panel("panel").hide();
  151. _21.panel("open");
  152. }
  153. (function(){
  154. if(_21.is(":visible")){
  155. _21.panel("move",{left:_24(),top:_25()});
  156. setTimeout(arguments.callee,200);
  157. }
  158. })();
  159. function _24(){
  160. var _26=_20.offset().left;
  161. if(_22.panelAlign=="right"){
  162. _26+=_20._outerWidth()-_21._outerWidth();
  163. }
  164. if(_26+_21._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){
  165. _26=$(window)._outerWidth()+$(document).scrollLeft()-_21._outerWidth();
  166. }
  167. if(_26<0){
  168. _26=0;
  169. }
  170. return _26;
  171. };
  172. function _25(){
  173. var top=_20.offset().top+_20._outerHeight();
  174. if(top+_21._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
  175. top=_20.offset().top-_21._outerHeight();
  176. }
  177. if(top<$(document).scrollTop()){
  178. top=_20.offset().top+_20._outerHeight();
  179. }
  180. return top;
  181. };
  182. };
  183. function _12(_27){
  184. var _28=$.data(_27,"combo").panel;
  185. _28.panel("close");
  186. };
  187. function _29(_2a){
  188. var _2b=$.data(_2a,"combo");
  189. var _2c=_2b.options;
  190. var _2d=_2b.combo;
  191. $(_2a).textbox("clear");
  192. if(_2c.multiple){
  193. _2d.find(".textbox-value").remove();
  194. }else{
  195. _2d.find(".textbox-value").val("");
  196. }
  197. };
  198. function _2e(_2f,_30){
  199. var _31=$.data(_2f,"combo");
  200. var _32=$(_2f).textbox("getText");
  201. if(_32!=_30){
  202. $(_2f).textbox("setText",_30);
  203. _31.previousText=_30;
  204. }
  205. };
  206. function _33(_34){
  207. var _35=[];
  208. var _36=$.data(_34,"combo").combo;
  209. _36.find(".textbox-value").each(function(){
  210. _35.push($(this).val());
  211. });
  212. return _35;
  213. };
  214. function _37(_38,_39){
  215. var _3a=$.data(_38,"combo");
  216. var _3b=_3a.options;
  217. var _3c=_3a.combo;
  218. if(!$.isArray(_39)){
  219. _39=_39.split(_3b.separator);
  220. }
  221. var _3d=_33(_38);
  222. _3c.find(".textbox-value").remove();
  223. var _3e=$(_38).attr("textboxName")||"";
  224. for(var i=0;i<_39.length;i++){
  225. var _3f=$("<input type=\"hidden\" class=\"textbox-value\">").appendTo(_3c);
  226. _3f.attr("name",_3e);
  227. if(_3b.disabled){
  228. _3f.attr("disabled","disabled");
  229. }
  230. _3f.val(_39[i]);
  231. }
  232. var _40=(function(){
  233. if(_3d.length!=_39.length){
  234. return true;
  235. }
  236. var a1=$.extend(true,[],_3d);
  237. var a2=$.extend(true,[],_39);
  238. a1.sort();
  239. a2.sort();
  240. for(var i=0;i<a1.length;i++){
  241. if(a1[i]!=a2[i]){
  242. return true;
  243. }
  244. }
  245. return false;
  246. })();
  247. if(_40){
  248. if(_3b.multiple){
  249. _3b.onChange.call(_38,_39,_3d);
  250. }else{
  251. _3b.onChange.call(_38,_39[0],_3d[0]);
  252. }
  253. }
  254. };
  255. function _41(_42){
  256. var _43=_33(_42);
  257. return _43[0];
  258. };
  259. function _44(_45,_46){
  260. _37(_45,[_46]);
  261. };
  262. function _47(_48){
  263. var _49=$.data(_48,"combo").options;
  264. var _4a=_49.onChange;
  265. _49.onChange=function(){
  266. };
  267. if(_49.multiple){
  268. _37(_48,_49.value?_49.value:[]);
  269. }else{
  270. _44(_48,_49.value);
  271. }
  272. _49.onChange=_4a;
  273. };
  274. $.fn.combo=function(_4b,_4c){
  275. if(typeof _4b=="string"){
  276. var _4d=$.fn.combo.methods[_4b];
  277. if(_4d){
  278. return _4d(this,_4c);
  279. }else{
  280. return this.textbox(_4b,_4c);
  281. }
  282. }
  283. _4b=_4b||{};
  284. return this.each(function(){
  285. var _4e=$.data(this,"combo");
  286. if(_4e){
  287. $.extend(_4e.options,_4b);
  288. if(_4b.value!=undefined){
  289. _4e.options.originalValue=_4b.value;
  290. }
  291. }else{
  292. _4e=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_4b),previousText:""});
  293. _4e.options.originalValue=_4e.options.value;
  294. }
  295. _2(this);
  296. _47(this);
  297. });
  298. };
  299. $.fn.combo.methods={options:function(jq){
  300. var _4f=jq.textbox("options");
  301. return $.extend($.data(jq[0],"combo").options,{width:_4f.width,height:_4f.height,disabled:_4f.disabled,readonly:_4f.readonly});
  302. },cloneFrom:function(jq,_50){
  303. return jq.each(function(){
  304. $(this).textbox("cloneFrom",_50);
  305. $.data(this,"combo",{options:$.extend(true,{cloned:true},$(_50).combo("options")),combo:$(this).next(),panel:$(_50).combo("panel")});
  306. $(this).addClass("combo-f").attr("comboName",$(this).attr("textboxName"));
  307. });
  308. },panel:function(jq){
  309. return $.data(jq[0],"combo").panel;
  310. },destroy:function(jq){
  311. return jq.each(function(){
  312. _b(this);
  313. });
  314. },showPanel:function(jq){
  315. return jq.each(function(){
  316. _1d(this);
  317. });
  318. },hidePanel:function(jq){
  319. return jq.each(function(){
  320. _12(this);
  321. });
  322. },clear:function(jq){
  323. return jq.each(function(){
  324. _29(this);
  325. });
  326. },reset:function(jq){
  327. return jq.each(function(){
  328. var _51=$.data(this,"combo").options;
  329. if(_51.multiple){
  330. $(this).combo("setValues",_51.originalValue);
  331. }else{
  332. $(this).combo("setValue",_51.originalValue);
  333. }
  334. });
  335. },setText:function(jq,_52){
  336. return jq.each(function(){
  337. _2e(this,_52);
  338. });
  339. },getValues:function(jq){
  340. return _33(jq[0]);
  341. },setValues:function(jq,_53){
  342. return jq.each(function(){
  343. _37(this,_53);
  344. });
  345. },getValue:function(jq){
  346. return _41(jq[0]);
  347. },setValue:function(jq,_54){
  348. return jq.each(function(){
  349. _44(this,_54);
  350. });
  351. }};
  352. $.fn.combo.parseOptions=function(_55){
  353. var t=$(_55);
  354. return $.extend({},$.fn.textbox.parseOptions(_55),$.parser.parseOptions(_55,["separator","panelAlign",{panelWidth:"number",hasDownArrow:"boolean",delay:"number",selectOnNavigation:"boolean"},{panelMinWidth:"number",panelMaxWidth:"number",panelMinHeight:"number",panelMaxHeight:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined)});
  355. };
  356. $.fn.combo.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{click:_14,keydown:_19,paste:_19,drop:_19},panelWidth:null,panelHeight:200,panelMinWidth:null,panelMaxWidth:null,panelMinHeight:null,panelMaxHeight:null,panelAlign:"left",multiple:false,selectOnNavigation:true,separator:",",hasDownArrow:true,delay:200,keyHandler:{up:function(e){
  357. },down:function(e){
  358. },left:function(e){
  359. },right:function(e){
  360. },enter:function(e){
  361. },query:function(q,e){
  362. }},onShowPanel:function(){
  363. },onHidePanel:function(){
  364. },onChange:function(_56,_57){
  365. }});
  366. })(jQuery);