PluginProbe
WPIDE – File Manager & Code Editor / 2.0.15
WPIDE – File Manager & Code Editor v2.0.15
3.5.8 3.5.7 2.0.14 2.0.15 2.0.16 2.0.2 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1 2.2 2.3 2.3.1 2.3.2 2.4.0 2.5 2.6 3.0 3.1 3.2 3.3 3.4 All 54 releases
wpide / js / jquery.dd.js

jquery.dd.js in WPIDE – File Manager & Code Editor 2.0.15, at js/jquery.dd.js

1,044 lines 35.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 // MSDropDown - jquery.dd.js
2 // author: Marghoob Suleman - Search me on google
3 // Date: 12th Aug, 2009, {18 Dec, 2010 (2.36)}
4 // Version: 2.37 {date: 17 June, 2011}
5 // Revision: 33
6 // web: www.giftlelo.com | www.marghoobsuleman.com
7 /*
8 // msDropDown is free jQuery Plugin: you can redistribute it and/or modify
9 // it under the terms of the either the MIT License or the Gnu General Public License (GPL) Version 2
10 */
11 ;(function($) {
12
13 var msOldDiv = "";
14 var dd = function(element, options)
15 {
16 var sElement = element;
17 var $this = this; //parent this
18 var options = $.extend({
19 height:120,
20 visibleRows:7,
21 rowHeight:23,
22 showIcon:true,
23 zIndex:9999,
24 mainCSS:'dd',
25 useSprite:false,
26 animStyle:'slideDown',
27 onInit:'',
28 style:''
29 }, options);
30 this.ddProp = new Object();//storing propeties;
31 var oldSelectedValue = "";
32 var actionSettings ={};
33 actionSettings.insideWindow = true;
34 actionSettings.keyboardAction = false;
35 actionSettings.currentKey = null;
36 var ddList = false;
37 var config = {postElementHolder:'_msddHolder', postID:'_msdd', postTitleID:'_title',postTitleTextID:'_titletext',postChildID:'_child',postAID:'_msa',postOPTAID:'_msopta',postInputID:'_msinput', postArrowID:'_arrow', postInputhidden:'_inp'};
38 var styles = {dd:options.mainCSS, ddTitle:'ddTitle', arrow:'arrow', ddChild:'ddChild', ddTitleText:'ddTitleText', disabled:.30, ddOutOfVision:'ddOutOfVision', borderTop:'borderTop', noBorderTop:'noBorderTop', selected:'selected'};
39 var attributes = {actions:"focus,blur,change,click,dblclick,mousedown,mouseup,mouseover,mousemove,mouseout,keypress,keydown,keyup", prop:"size,multiple,disabled,tabindex"};
40 this.onActions = new Object();
41 var elementid = $(sElement).prop("id");
42 if(typeof(elementid)=="undefined" || elementid.length<=0) {
43 //assign and id;
44 elementid = "msdrpdd"+$.msDropDown.counter++;//I guess it makes unique for the page.
45 $(sElement).attr("id", elementid);
46 };
47 var inlineCSS = $(sElement).prop("style");
48 options.style += (inlineCSS==undefined) ? "" : inlineCSS;
49 var allOptions = $(sElement).children();
50 ddList = ($(sElement).prop("size")>1 || $(sElement).prop("multiple")==true) ? true : false;
51 if(ddList) {options.visibleRows = $(sElement).prop("size");};
52 var a_array = {};//stores id, html & value etc
53 var currentP = 0;
54 var isFilter = false;
55 var oldHeight;
56 var cacheElement = {};
57
58 var getElement = function(ele) {
59 if(typeof(cacheElement[ele])=="undefined") {
60 cacheElement[ele] = document.getElementById(ele);
61 }
62 return cacheElement[ele];
63 };
64 var getPostID = function (id) {
65 return elementid+config[id];
66 };
67 var getOptionsProperties = function (option) {
68 var currentOption = option;
69 var styles = $(currentOption).prop("style");
70 return styles;
71 };
72 var matchIndex = function (index) {
73 var selectedIndex = $("#"+elementid+" option:selected");
74 if(selectedIndex.length>1) {
75 for(var i=0;i<selectedIndex.length;i++) {
76 if(index == selectedIndex[i].index) {
77 return true;
78 };
79 };
80 } else if(selectedIndex.length==1) {
81 if(selectedIndex[0].index==index) {
82 return true;
83 };
84 };
85 return false;
86 };
87 var createA = function(currentOptOption, current, currentopt, tp) {
88 var aTag = "";
89 //var aidfix = getPostID("postAID");
90 var aidoptfix = (tp=="opt") ? getPostID("postOPTAID") : getPostID("postAID");
91 var aid = (tp=="opt") ? aidoptfix+"_"+(current)+"_"+(currentopt) : aidoptfix+"_"+(current);
92 var arrow = "";
93 var clsName = "";
94 if(options.useSprite!=false) {
95 clsName = ' '+options.useSprite+' '+currentOptOption.className;
96
97 } else {
98 arrow = $(currentOptOption).prop("title");
99 arrow = (arrow.length==0) ? "" : '<img src="'+arrow+'" align="absmiddle" /> ';
100 };
101 var sText = $(currentOptOption).text();
102 var sValue = $(currentOptOption).val();
103 var sEnabledClass = ($(currentOptOption).prop("disabled")==true) ? "disabled" : "enabled";
104 a_array[aid] = {html:arrow + sText, value:sValue, text:sText, index:currentOptOption.index, id:aid};
105 var innerStyle = getOptionsProperties(currentOptOption);
106 if(matchIndex(currentOptOption.index)==true) {
107 aTag += '<a href="javascript:void(0);" class="'+styles.selected+' '+sEnabledClass+clsName+'"';
108 } else {
109 aTag += '<a href="javascript:void(0);" class="'+sEnabledClass+clsName+'"';
110 };
111 if(innerStyle!==false && innerStyle!==undefined) {
112 aTag += " style='"+innerStyle+"'";
113 };
114 aTag += ' id="'+aid+'">';
115 aTag += arrow + '<span class="'+styles.ddTitleText+'">' +sText+'</span></a>';
116 return aTag;
117 };
118 var in_array = function(t) {
119 var sText = t.toLowerCase();
120 if(sText.length==0) return -1;
121 var a = "";
122 for(var i in a_array) {
123 var a_text = a_array[i].text.toLowerCase();
124 if(a_text.substr(0, sText.length) == sText) {
125 a += "#"+a_array[i].id+ ", ";
126 };
127 };
128 return (a=="") ? -1 : a;
129 };
130 var createATags = function () {
131 var childnodes = allOptions;
132 if(childnodes.length==0) return "";
133 var aTag = "";
134 var aidfix = getPostID("postAID");
135 var aidoptfix = getPostID("postOPTAID");
136 childnodes.each(function(current){
137 var currentOption = childnodes[current];
138 //OPTGROUP
139 if(currentOption.nodeName == "OPTGROUP") {
140 aTag += "<div class='opta'>";
141 aTag += "<span style='font-weight:bold;font-style:italic; clear:both;'>"+$(currentOption).prop("label")+"</span>";
142 var optChild = $(currentOption).children();
143 optChild.each(function(currentopt){
144 var currentOptOption = optChild[currentopt];
145 aTag += createA(currentOptOption, current, currentopt, "opt");
146 });
147 aTag += "</div>";
148
149 } else {
150 aTag += createA(currentOption, current, "", "");
151 };
152 });
153 return aTag;
154 };
155 var createChildDiv = function () {
156 var id = getPostID("postID");
157 var childid = getPostID("postChildID");
158 var sStyle = options.style;
159 sDiv = "";
160 sDiv += '<div id="'+childid+'" class="'+styles.ddChild+'"';
161 if(!ddList) {
162 sDiv += (sStyle!="") ? ' style="'+sStyle+'"' : '';
163 } else {
164 sDiv += (sStyle!="") ? ' style="border-top:1px solid #c3c3c3;display:block;position:relative;'+sStyle+'"' : '';
165 };
166 sDiv += '>';
167 return sDiv;
168 };
169
170 var createTitleDiv = function () {
171 var titleid = getPostID("postTitleID");
172 var arrowid = getPostID("postArrowID");
173 var titletextid = getPostID("postTitleTextID");
174 var inputhidden = getPostID("postInputhidden");
175 var sText = "";
176 var arrow = "";
177 if(getElement(elementid).options.length>0) {
178 sText = $("#"+elementid+" option:selected").text();
179 arrow = $("#"+elementid+" option:selected").prop("title");
180 };
181 arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false || options.useSprite!=false) ? "" : '<img src="'+arrow+'" align="absmiddle" /> ';
182 var sDiv = '<div id="'+titleid+'" class="'+styles.ddTitle+'"';
183 sDiv += '>';
184 sDiv += '<span id="'+arrowid+'" class="'+styles.arrow+'"></span><span class="'+styles.ddTitleText+'" id="'+titletextid+'">'+arrow + '<span class="'+styles.ddTitleText+'">'+sText+'</span></span></div>';
185 return sDiv;
186 };
187 var applyEventsOnA = function() {
188 var childid = getPostID("postChildID");
189 $("#"+childid+ " a.enabled").unbind("click"); //remove old one
190 $("#"+childid+ " a.enabled").bind("click", function(event) {
191 event.preventDefault();
192 manageSelection(this);
193 setValue();
194 if(!ddList) {
195 $("#"+childid).unbind("mouseover");
196 setInsideWindow(false);
197 var sText = (options.showIcon==false) ? $(this).text() : $(this).html();
198 setTitleText(sText);
199 //$this.data("dd").close();
200 $this.close();
201 };
202 //actionSettings.oldIndex = a_array[$($this).prop("id")].index;
203 });
204 };
205 var createDropDown = function () {
206 var changeInsertionPoint = false;
207 var id = getPostID("postID");
208 var titleid = getPostID("postTitleID");
209 var titletextid = getPostID("postTitleTextID");
210 var childid = getPostID("postChildID");
211 var arrowid = getPostID("postArrowID");
212 var iWidth = $("#"+elementid).width();
213 iWidth = iWidth+2;//it always give -2 width; i dont know why
214 var sStyle = options.style;
215 if($("#"+id).length>0) {
216 $("#"+id).remove();
217 changeInsertionPoint = true;
218 };
219 var sDiv = '<div id="'+id+'" class="'+styles.dd+'"';
220 sDiv += (sStyle!="") ? ' style="'+sStyle+'"' : '';
221 sDiv += '>';
222 //create title bar
223 sDiv += createTitleDiv();
224 //create child
225 sDiv += createChildDiv();
226 sDiv += createATags();
227 sDiv += "</div>";
228 sDiv += "</div>";
229 if(changeInsertionPoint==true) {
230 var sid =getPostID("postElementHolder");
231 $("#"+sid).after(sDiv);
232 } else {
233 $("#"+elementid).after(sDiv);
234 };
235 if(ddList) {
236 var titleid = getPostID("postTitleID");
237 $("#"+titleid).hide();
238 };
239
240 $("#"+id).css("width", iWidth+"px");
241 $("#"+childid).css("width", (iWidth-2)+"px");
242 if(allOptions.length>options.visibleRows) {
243 var margin = parseInt($("#"+childid+" a:first").css("padding-bottom")) + parseInt($("#"+childid+" a:first").css("padding-top"));
244 var iHeight = ((options.rowHeight)*options.visibleRows) - margin;
245 $("#"+childid).css("height", iHeight+"px");
246 } else if(ddList) {
247 var iHeight = $("#"+elementid).height();
248 $("#"+childid).css("height", iHeight+"px");
249 };
250 //set out of vision
251 if(changeInsertionPoint==false) {
252 setOutOfVision();
253 addRefreshMethods(elementid);
254 };
255 if($("#"+elementid).prop("disabled")==true) {
256 $("#"+id).css("opacity", styles.disabled);
257 };
258 applyEvents();
259 //add events
260 //arrow hightlight
261 $("#"+titleid).bind("mouseover", function(event) {
262 hightlightArrow(1);
263 });
264 $("#"+titleid).bind("mouseout", function(event) {
265 hightlightArrow(0);
266 });
267 //open close events
268 applyEventsOnA();
269 $("#"+childid+ " a.disabled").css("opacity", styles.disabled);
270 //alert("ddList "+ddList)
271 if(ddList) {
272 $("#"+childid).bind("mouseover", function(event) {if(!actionSettings.keyboardAction) {
273 actionSettings.keyboardAction = true;
274 $(document).bind("keydown", function(event) {
275 var keyCode = event.keyCode;
276 actionSettings.currentKey = keyCode;
277 if(keyCode==39 || keyCode==40) {
278 //move to next
279 event.preventDefault(); event.stopPropagation();
280 next();
281 setValue();
282 };
283 if(keyCode==37 || keyCode==38) {
284 event.preventDefault(); event.stopPropagation();
285 //move to previous
286 previous();
287 setValue();
288 };
289 });
290
291 }});
292 };
293 $("#"+childid).bind("mouseout", function(event) {setInsideWindow(false);$(document).unbind("keydown");actionSettings.keyboardAction = false;actionSettings.currentKey=null;});
294 $("#"+titleid).bind("click", function(event) {
295 setInsideWindow(false);
296 if($("#"+childid+":visible").length==1) {
297 $("#"+childid).unbind("mouseover");
298 } else {
299 $("#"+childid).bind("mouseover", function(event) {setInsideWindow(true);});
300 //alert("open "+elementid + $this);
301 //$this.data("dd").openMe();
302 $this.open();
303 };
304 });
305 $("#"+titleid).bind("mouseout", function(evt) {
306 setInsideWindow(false);
307 });
308 if(options.showIcon && options.useSprite!=false) {
309 setTitleImageSprite();
310 };
311 };
312 var getByIndex = function (index) {
313 for(var i in a_array) {
314 if(a_array[i].index==index) {
315 return a_array[i];
316 };
317 };
318 return -1;
319 };
320 var manageSelection = function (obj) {
321 var childid = getPostID("postChildID");
322 if($("#"+childid+ " a."+styles.selected).length==1) { //check if there is any selected
323 oldSelectedValue = $("#"+childid+ " a."+styles.selected).text(); //i should have value here. but sometime value is missing
324 //alert("oldSelectedValue "+oldSelectedValue);
325 };
326 if(!ddList) {
327 $("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
328 };
329 var selectedA = $("#"+childid + " a."+styles.selected).prop("id");
330 if(selectedA!=undefined) {
331 var oldIndex = (actionSettings.oldIndex==undefined || actionSettings.oldIndex==null) ? a_array[selectedA].index : actionSettings.oldIndex;
332 };
333 if(obj && !ddList) {
334 $(obj).addClass(styles.selected);
335 };
336 if(ddList) {
337 var keyCode = actionSettings.currentKey;
338 if($("#"+elementid).prop("multiple")==true) {
339 if(keyCode == 17) {
340 //control
341 actionSettings.oldIndex = a_array[$(obj).prop("id")].index;
342 $(obj).toggleClass(styles.selected);
343 //multiple
344 } else if(keyCode==16) {
345 $("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
346 $(obj).addClass(styles.selected);
347 //shift
348 var currentSelected = $(obj).prop("id");
349 var currentIndex = a_array[currentSelected].index;
350 for(var i=Math.min(oldIndex, currentIndex);i<=Math.max(oldIndex, currentIndex);i++) {
351 $("#"+getByIndex(i).id).addClass(styles.selected);
352 };
353 } else {
354 $("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
355 $(obj).addClass(styles.selected);
356 actionSettings.oldIndex = a_array[$(obj).prop("id")].index;
357 };
358 } else {
359 $("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
360 $(obj).addClass(styles.selected);
361 actionSettings.oldIndex = a_array[$(obj).prop("id")].index;
362 };
363 //isSingle
364 };
365 };
366 var addRefreshMethods = function (id) {
367 //deprecated
368 var objid = id;
369 getElement(objid).refresh = function(e) {
370 $("#"+objid).msDropDown(options);
371 };
372 };
373 var setInsideWindow = function (val) {
374 actionSettings.insideWindow = val;
375 };
376 var getInsideWindow = function () {
377 return actionSettings.insideWindow;
378 //will work on this
379 /*
380 var childid = getPostID("postChildID");
381 return ($("#"+childid + ":visible").length == 0) ? false : true;
382 */
383 };
384 var applyEvents = function () {
385 var mainid = getPostID("postID");
386 var actions_array = attributes.actions.split(",");
387 for(var iCount=0;iCount<actions_array.length;iCount++) {
388 var action = actions_array[iCount];
389 //var actionFound = $("#"+elementid).prop(action);
390 var actionFound = has_handler(action);
391 if(actionFound==true) {
392 switch(action) {
393 case "focus":
394 $("#"+mainid).bind("mouseenter", function(event) {
395 getElement(elementid).focus();
396 //$("#"+elementid).focus();
397 });
398 break;
399 case "click":
400 $("#"+mainid).bind("click", function(event) {
401 //getElement(elementid).onclick();
402 $("#"+elementid).trigger("click");
403 });
404 break;
405 case "dblclick":
406 $("#"+mainid).bind("dblclick", function(event) {
407 //getElement(elementid).ondblclick();
408 $("#"+elementid).trigger("dblclick");
409 });
410 break;
411 case "mousedown":
412 $("#"+mainid).bind("mousedown", function(event) {
413 //getElement(elementid).onmousedown();
414 $("#"+elementid).trigger("mousedown");
415 });
416 break;
417 case "mouseup":
418 //has in close mthod
419 $("#"+mainid).bind("mouseup", function(event) {
420 //getElement(elementid).onmouseup();
421 $("#"+elementid).trigger("mouseup");
422 //setValue();
423 });
424 break;
425 case "mouseover":
426 $("#"+mainid).bind("mouseover", function(event) {
427 //getElement(elementid).onmouseover();
428 $("#"+elementid).trigger("mouseover");
429 });
430 break;
431 case "mousemove":
432 $("#"+mainid).bind("mousemove", function(event) {
433 //getElement(elementid).onmousemove();
434 $("#"+elementid).trigger("mousemove");
435 });
436 break;
437 case "mouseout":
438 $("#"+mainid).bind("mouseout", function(event) {
439 //getElement(elementid).onmouseout();
440 $("#"+elementid).trigger("mouseout");
441 });
442 break;
443 };
444 };
445 };
446
447 };
448 var setOutOfVision = function () {
449 var sId = getPostID("postElementHolder");
450 $("#"+elementid).after("<div class='"+styles.ddOutOfVision+"' style='height:0px;overflow:hidden;position:absolute;' id='"+sId+"'></div>");
451 $("#"+elementid).appendTo($("#"+sId));
452 };
453 var setTitleText = function (sText) {
454 var titletextid = getPostID("postTitleTextID");
455 $("#"+titletextid).html(sText);
456 };
457 var navigateA = function(w) {
458 var where = w;
459 var childid = getPostID("postChildID");
460 var visibleA = $("#"+childid + " a:visible");
461 var totalA = visibleA.length;
462 var currentP = $("#"+childid +" a:visible").index($("#"+childid +" a.selected:visible"));
463 var nextA;
464 switch(where) {
465 case "next":
466 if(currentP < totalA-1) {
467 currentP++;
468 nextA = visibleA[currentP];
469 };
470 break;
471 case "previous":
472 if(currentP < totalA && currentP>0) {
473 currentP--;
474 nextA = visibleA[currentP];
475 };
476 break;
477 };
478 if(typeof(nextA)=="undefined") {
479 return false;
480 };
481 $("#"+childid + " a."+styles.selected).removeClass(styles.selected);
482 $(nextA).addClass(styles.selected);
483 var selectedA = nextA.id;
484 if(!ddList) {
485 var sText = (options.showIcon==false) ? a_array[selectedA].text : $("#"+selectedA).html();
486 setTitleText(sText);
487 setTitleImageSprite(a_array[selectedA].index);
488 };
489 if(where=="next") {
490 if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height()))>=parseInt($("#"+childid).height())) {
491 $("#"+childid).scrollTop(($("#"+childid).scrollTop())+$("#"+selectedA).height()+$("#"+selectedA).height());
492 };
493 } else {
494 if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height())) <=0) {
495 $("#"+childid).scrollTop(($("#"+childid).scrollTop()-$("#"+childid).height())-$("#"+selectedA).height());
496 };
497 };
498 };
499
500 var setTitleImageSprite = function(i) {
501 if(options.useSprite!=false) {
502 var titletextid = getPostID("postTitleTextID");
503 var index = (typeof(i)=="undefined") ? getElement(elementid).selectedIndex : i;
504 var sClassName = getElement(elementid).options[index].className;
505 if(sClassName.length>0) {
506 var childid = getPostID("postChildID");
507 var id = $("#"+childid + " a."+sClassName).prop("id");
508 var backgroundImg = $("#"+id).css("background-image");
509 var backgroundPosition = $("#"+id).css("background-position");
510 var paddingLeft = $("#"+id).css("padding-left");
511 if(backgroundImg!=undefined) {
512 $("#"+titletextid).find("."+styles.ddTitleText).attr('style', "background:"+backgroundImg);
513 };
514 if(backgroundPosition!=undefined) {
515 $("#"+titletextid).find("."+styles.ddTitleText).css('background-position', backgroundPosition);
516 };
517 if(paddingLeft!=undefined) {
518 $("#"+titletextid).find("."+styles.ddTitleText).css('padding-left', paddingLeft);
519 };
520 $("#"+titletextid).find("."+styles.ddTitleText).css('background-repeat', 'no-repeat');
521 $("#"+titletextid).find("."+styles.ddTitleText).css('padding-bottom', '2px');
522 };
523 };
524 };
525 var setValue = function () {
526 //alert("setValue "+elementid);
527 var childid = getPostID("postChildID");
528 var allSelected = $("#"+childid + " a."+styles.selected);
529 if(allSelected.length==1) {
530 var sText = $("#"+childid + " a."+styles.selected).text();
531 var selectedA = $("#"+childid + " a."+styles.selected).prop("id");
532 if(selectedA!=undefined) {
533 var sValue = a_array[selectedA].value;
534 getElement(elementid).selectedIndex = a_array[selectedA].index;
535 };
536 //set image on title if using sprite
537
538 if(options.showIcon && options.useSprite!=false)
539 setTitleImageSprite();
540 } else if(allSelected.length>1) {
541 //var alls = $("#"+elementid +" > option:selected").removeprop("selected");
542 for(var i=0;i<allSelected.length;i++) {
543 var selectedA = $(allSelected[i]).prop("id");
544 var index = a_array[selectedA].index;
545 getElement(elementid).options[index].selected = "selected";
546 };
547 };
548 //alert(getElement(elementid).selectedIndex);
549 var sIndex = getElement(elementid).selectedIndex;
550 $this.ddProp["selectedIndex"]= sIndex;
551 //alert("selectedIndex "+ $this.ddProp["selectedIndex"] + " sIndex "+sIndex);
552 };
553 var has_handler = function (name) {
554 // True if a handler has been added in the html.
555 if ($("#"+elementid).prop("on" + name) != undefined) {
556 return true;
557 };
558 // True if a handler has been added using jQuery.
559 var evs = $("#"+elementid).data("events");
560 if (evs && evs[name]) {
561 return true;
562 };
563 return false;
564 };
565 var checkMethodAndApply = function () {
566 var childid = getPostID("postChildID");
567 if(has_handler('change')==true) {
568 //alert(1);
569 var currentSelectedValue = a_array[$("#"+childid +" a.selected").prop("id")].text;
570 if($.trim(oldSelectedValue) !== $.trim(currentSelectedValue) && oldSelectedValue!==""){
571 $("#"+elementid).trigger("change");
572 };
573 };
574 if(has_handler('mouseup')==true) {
575 $("#"+elementid).trigger("mouseup");
576 };
577 if(has_handler('blur')==true) {
578 $(document).bind("mouseup", function(evt) {
579 $("#"+elementid).focus();
580 $("#"+elementid)[0].blur();
581 setValue();
582 $(document).unbind("mouseup");
583 });
584 };
585 };
586 var hightlightArrow = function(ison) {
587 var arrowid = getPostID("postArrowID");
588 if(ison==1)
589 $("#"+arrowid).css({backgroundPosition:'0 100%'});
590 else
591 $("#"+arrowid).css({backgroundPosition:'0 0'});
592 };
593 var setOriginalProperties = function() {
594 //properties = {};
595 //alert($this.data("dd"));
596 for(var i in getElement(elementid)) {
597 if(typeof(getElement(elementid)[i])!='function' && getElement(elementid)[i]!==undefined && getElement(elementid)[i]!==null) {
598 $this.set(i, getElement(elementid)[i], true);//true = setting local properties
599 };
600 };
601 };
602 var setValueByIndex = function(prop, val) {
603 if(getByIndex(val) != -1) {
604 getElement(elementid)[prop] = val;
605 var childid = getPostID("postChildID");
606 $("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
607 $("#"+getByIndex(val).id).addClass(styles.selected);
608 var sText = getByIndex(getElement(elementid).selectedIndex).html;
609 setTitleText(sText);
610 };
611 };
612 var addRemoveFromIndex = function(i, action) {
613 if(action=='d') {
614 for(var key in a_array) {
615 if(a_array[key].index == i) {
616 delete a_array[key];
617 break;
618 };
619 };
620 };
621 //update index
622 var count = 0;
623 for(var key in a_array) {
624 a_array[key].index = count;
625 count++;
626 };
627 };
628 var shouldOpenOpposite = function() {
629 var childid = getPostID("postChildID");
630 var main = getPostID("postID");
631 var pos = $("#"+main).position();
632 var mH = $("#"+main).height();
633 var wH = $(window).height();
634 var st = $(window).scrollTop();
635 var cH = $("#"+childid).height();
636 var css = {zIndex:options.zIndex, top:(pos.top+mH)+"px", display:"none"};
637 var ani = options.animStyle;
638 var opp = false;
639 var borderTop = styles.noBorderTop;
640 $("#"+childid).removeClass(styles.noBorderTop);
641 $("#"+childid).removeClass(styles.borderTop);
642 if( (wH+st) < Math.floor(cH+mH+pos.top) ) {
643 var tp = pos.top-cH;
644 if((pos.top-cH)<0) {
645 tp = 10;
646 };
647 css = {zIndex:options.zIndex, top:tp+"px", display:"none"};
648 ani = "show";
649 opp = true;
650 borderTop = styles.borderTop;
651 };
652 return {opp:opp, ani:ani, css:css, border:borderTop};
653 };
654 var fireOpenEvent = function() {
655 if($this.onActions["onOpen"]!=null) {
656 eval($this.onActions["onOpen"])($this);
657 };
658 };
659 var fireCloseEvent = function() {
660 checkMethodAndApply();
661 if($this.onActions["onClose"]!=null) {
662 eval($this.onActions["onClose"])($this);
663 };
664 };
665 /************* public methods *********************/
666
667 this.next = function () {
668 navigateA("next");
669 };
670 this.previous = function () {
671 navigateA("previous");
672 };
673
674 this.open = function() {
675 if(($this.get("disabled", true) == true) || ($this.get("options", true).length==0)) return;
676 var childid = getPostID("postChildID");
677 if(msOldDiv!="" && childid!=msOldDiv) {
678 $("#"+msOldDiv).slideUp("fast");
679 $("#"+msOldDiv).css({zIndex:'0'});
680 };
681
682 $(".dd").css("display", "block");
683
684 if($("#"+childid).css("display")=="none") {
685 oldSelectedValue = a_array[$("#"+childid +" a.selected").prop("id")].text;
686 //keyboard action
687 var sText ="";
688 oldHeight = $("#"+childid).height();
689 $("#"+childid +" a").show();
690 $(document).bind("keydown", function(event) {
691 var keyCode = event.keyCode;
692 //alert("keyCode "+keyCode);
693
694 if(keyCode==8) {
695 event.preventDefault(); event.stopPropagation();
696 //remove char
697 sText = (sText.length==0) ? "" : sText.substr(0, sText.length-1);
698 };
699 switch(keyCode) {
700 case 39:
701 case 40:
702 //move to next
703 event.preventDefault(); event.stopPropagation();
704 next();
705 break;
706 case 37:
707 case 38:
708 //move to previous
709 event.preventDefault(); event.stopPropagation();
710 previous();
711 break;
712 case 27:
713 case 13:
714 $this.close();
715 setValue();
716 break;
717 default:
718 if(keyCode>46) {
719 sText += String.fromCharCode(keyCode);
720 };
721 var ind = in_array(sText);
722 if(ind != -1) {
723 $("#"+childid).css({height:'auto'});
724 $("#"+childid +" a").hide();
725 $(ind).show();
726 var wf = shouldOpenOpposite();
727 $("#"+childid).css(wf.css);
728 $("#"+childid).css({display:'block'});
729 } else {
730 $("#"+childid +" a").show();
731 $("#"+childid).css({height:oldHeight+'px'});
732 };
733 break;
734 };
735 if(has_handler("keydown")==true) {
736 getElement(elementid).onkeydown();
737 };
738 });
739
740 $(document).bind("keyup", function(event) {
741 if($("#"+elementid).prop("onkeyup")!=undefined) {
742 //$("#"+elementid).keyup();
743 getElement(elementid).onkeyup();
744 };
745 });
746 //end keyboard action
747
748 //close onmouseup
749 $(document).bind("mouseup", function(evt){
750 if(getInsideWindow()==false) {
751 //alert("evt.target: "+evt.target);
752 //$this.data("dd").close();
753 $this.close();
754 };
755 });
756
757 //check open
758 var wf = shouldOpenOpposite();
759 $("#"+childid).css(wf.css);
760 if(wf.opp==true) {
761 $("#"+childid).css({display:'block'});
762 $("#"+childid).addClass(wf.border);
763 fireOpenEvent();
764 } else {
765 $("#"+childid)[wf.ani]("fast", function() {
766 $("#"+childid).addClass(wf.border);
767 fireOpenEvent();
768 });
769 };
770 if(childid != msOldDiv) {
771 msOldDiv = childid;
772 };
773 };
774 };
775 this.close = function() {
776 var childid = getPostID("postChildID");
777 var top = $("#"+getPostID("postTitleID")).position().top;
778 var wf = shouldOpenOpposite();
779 //var oldHeight = $("#"+childid).height();
780 isFilter = false;
781 if(wf.opp==true) {
782 $("#"+childid).animate({
783 height:0,
784 top: top,
785 }, function() {
786 $("#"+childid).css({height:oldHeight+'px', display:'none'});
787 fireCloseEvent();
788 });
789 }
790 else {
791 $("#"+childid).slideUp("fast", function(event) {
792 fireCloseEvent();
793 $("#"+childid).css({zIndex:'0'});
794 $("#"+childid).css({height:oldHeight+'px'});
795 });
796 };
797 setTitleImageSprite();
798 $(document).unbind("keydown");
799 $(document).unbind("keyup");
800 $(document).unbind("mouseup");
801
802 $(".dd").css("display", "none");
803
804 };
805 this.selectedIndex = function(i) {
806 if(typeof(i)=="undefined") {
807 return $this.get("selectedIndex");
808 } else {
809 $this.set("selectedIndex", i);
810 };
811 };
812 this.debug = function(is) {
813 if(typeof(is)=="undefined" || is==true) {
814 $("."+styles.ddOutOfVision).removeAttr("style");
815 } else {
816 $("."+styles.ddOutOfVision).attr("style", "height:0px;overflow:hidden;position:absolute");
817 };
818 };
819 //update properties
820 this.set = function(prop, val, isLocal) {
821 //alert("- set " + prop + " : "+val);
822 if(prop==undefined || val==undefined) throw {message:"set to what?"};
823 $this.ddProp[prop] = val;
824 if(isLocal!=true) {
825 switch(prop) {
826 case "selectedIndex":
827 setValueByIndex(prop, val);
828 break;
829 case "disabled":
830 $this.disabled(val, true);
831 break;
832 case "multiple":
833 getElement(elementid)[prop] = val;
834 ddList = ($(sElement).prop("size")>0 || $(sElement).prop("multiple")==true) ? true : false;
835 if(ddList) {
836 //do something
837 var iHeight = $("#"+elementid).height();
838 var childid = getPostID("postChildID");
839 $("#"+childid).css("height", iHeight+"px");
840 //hide titlebar
841 var titleid = getPostID("postTitleID");
842 $("#"+titleid).hide();
843 var childid = getPostID("postChildID");
844 $("#"+childid).css({display:'block',position:'relative'});
845 applyEventsOnA();
846 };
847 break;
848 case "size":
849 getElement(elementid)[prop] = val;
850 if(val==0) {
851 getElement(elementid).multiple = false;
852 };
853 ddList = ($(sElement).prop("size")>0 || $(sElement).prop("multiple")==true) ? true : false;
854 if(val==0) {
855 //show titlebar
856 var titleid = getPostID("postTitleID");
857 $("#"+titleid).show();
858 var childid = getPostID("postChildID");
859 $("#"+childid).css({display:'none',position:'absolute'});
860 var sText = "";
861 if(getElement(elementid).selectedIndex>=0) {
862 var aObj = getByIndex(getElement(elementid).selectedIndex);
863 sText = aObj.html;
864 manageSelection($("#"+aObj.id));
865 };
866 setTitleText(sText);
867 } else {
868 //hide titlebar
869 var titleid = getPostID("postTitleID");
870 $("#"+titleid).hide();
871 var childid = getPostID("postChildID");
872 $("#"+childid).css({display:'block',position:'relative'});
873 };
874 break;
875 default:
876 try{
877 //check if this is not a readonly properties
878 getElement(elementid)[prop] = val;
879 } catch(e) {
880 //silent
881 };
882 break;
883 };
884 };
885 //alert("get " + prop + " : "+$this.ddProp[prop]);
886 //$this.set("selectedIndex", 0);
887 };
888 this.get = function(prop, forceRefresh) {
889 if(prop==undefined && forceRefresh==undefined) {
890 //alert("c1 : " +$this.ddProp);
891 return $this.ddProp;
892 };
893 if(prop!=undefined && forceRefresh==undefined) {
894 //alert("c2 : " +$this.ddProp[prop]);
895 return ($this.ddProp[prop]!=undefined) ? $this.ddProp[prop] : null;
896 };
897 if(prop!=undefined && forceRefresh!=undefined) {
898 //alert("c3 : " +getElement(elementid)[prop]);
899 return getElement(elementid)[prop];
900 };
901 };
902 this.visible = function(val) {
903 var id = getPostID("postID");
904 if(val==true) {
905 $("#"+id).show();
906 } else if(val==false) {
907 $("#"+id).hide();
908 } else {
909 return $("#"+id).css("display");
910 };
911 };
912 this.add = function(opt, index) {
913 var objOpt = opt;
914 var sText = objOpt.text;
915 var sValue = (objOpt.value==undefined || objOpt.value==null) ? sText : objOpt.value;
916 var img = (objOpt["title"]==undefined || objOpt["title"]==null) ? '' : objOpt["title"];
917 var i = (index==undefined || index==null) ? getElement(elementid).options.length : index;
918 getElement(elementid).options[i] = new Option(sText, sValue);
919 if(img!='') getElement(elementid).options[i]["title"] = img;
920 //check if exist
921 var ifA = getByIndex(i);
922 if(ifA != -1) {
923 //replace
924 var aTag = createA(getElement(elementid).options[i], i, "", "");
925 $("#"+ifA.id).html(aTag);
926 //a_array[key]
927 } else {
928 var aTag = createA(getElement(elementid).options[i], i, "", "");
929 //add
930 var childid = getPostID("postChildID");
931 $("#"+childid).append(aTag);
932 applyEventsOnA();
933 };
934 };
935 this.remove = function(i) {
936 getElement(elementid).remove(i);
937 if((getByIndex(i))!= -1) { $("#"+getByIndex(i).id).remove();addRemoveFromIndex(i, 'd');};
938 //alert("a" +a);
939 if(getElement(elementid).length==0) {
940 setTitleText("");
941 } else {
942 var sText = getByIndex(getElement(elementid).selectedIndex).html;
943 setTitleText(sText);
944 };
945 $this.set("selectedIndex", getElement(elementid).selectedIndex);
946 };
947 this.disabled = function(dis, isLocal) {
948 getElement(elementid).disabled = dis;
949 //alert(getElement(elementid).disabled);
950 var id = getPostID("postID");
951 if(dis==true) {
952 $("#"+id).css("opacity", styles.disabled);
953 $this.close();
954 } else if(dis==false) {
955 $("#"+id).css("opacity", 1);
956 };
957 if(isLocal!=true) {
958 $this.set("disabled", dis);
959 };
960 };
961 //return form element
962 this.form = function() {
963 return (getElement(elementid).form == undefined) ? null : getElement(elementid).form;
964 };
965 this.item = function() {
966 //index, subindex - use arguments.length
967 if(arguments.length==1) {
968 return getElement(elementid).item(arguments[0]);
969 } else if(arguments.length==2) {
970 return getElement(elementid).item(arguments[0], arguments[1]);
971 } else {
972 throw {message:"An index is required!"};
973 };
974 };
975 this.namedItem = function(nm) {
976 return getElement(elementid).namedItem(nm);
977 };
978 this.multiple = function(is) {
979 if(typeof(is)=="undefined") {
980 return $this.get("multiple");
981 } else {
982 $this.set("multiple", is);
983 };
984
985 };
986 this.size = function(sz) {
987 if(typeof(sz)=="undefined") {
988 return $this.get("size");
989 } else {
990 $this.set("size", sz);
991 };
992 };
993 this.addMyEvent = function(nm, fn) {
994 $this.onActions[nm] = fn;
995 };
996 this.fireEvent = function(nm) {
997 eval($this.onActions[nm])($this);
998 };
999 //end
1000 var updateCommonVars = function() {
1001 $this.set("version", $.msDropDown.version);
1002 $this.set("author", $.msDropDown.author);
1003 };
1004 var init = function() {
1005 //create wrapper
1006 createDropDown();
1007 //update propties
1008 //alert("init");
1009 setOriginalProperties();
1010 updateCommonVars();
1011 if(options.onInit!='') {
1012 eval(options.onInit)($this);
1013 };
1014 };
1015 init();
1016 };
1017 //static
1018 $.msDropDown = {
1019 version: 2.37,
1020 author: "Marghoob Suleman",
1021 counter:20,
1022 create: function(id, opt) {
1023 return $(id).msDropDown(opt).data("dd");
1024 }
1025 };
1026 $.fn.extend({
1027 msDropDown: function(options)
1028 {
1029 return this.each(function()
1030 {
1031 //if ($(this).data('dd')) return; // need to comment when using refresh method - will remove in next version
1032 var mydropdown = new dd(this, options);
1033 $(this).data('dd', mydropdown);
1034 });
1035 }
1036 });
1037 //fixed for prop
1038 if(typeof($.fn.prop)=='undefined') {
1039 $.fn.prop = function(w) {
1040 return $(this).attr(w);
1041 };
1042 };
1043
1044 })(jQuery);