// MSDropDown - jquery.dd.js // author: Marghoob Suleman - Search me on google // Date: 12th Aug, 2009, {18 Dec, 2010 (2.36)}, {date: 02 July, 2011} // Version: 2.37.5 // Revision: 34 // web: www.giftlelo.com | www.marghoobsuleman.com ;(function($) { var msOldDiv = ""; var dd = function(element, options, aDefaultTitleImgPath) { //CP specific function var cpDefaultTitleImageSrc = aDefaultTitleImgPath; var sElement = element; var $this = this; //parent this var options = $.extend({ height:120, visibleRows:7, rowHeight:23, showIcon:true, zIndex:9999, mainCSS:'dd', useSprite:false, animStyle:'slideDown', onInit:'', style:'' }, options); this.ddProp = new Object();//storing propeties; var oldSelectedValue = ""; var actionSettings ={}; actionSettings.insideWindow = true; actionSettings.keyboardAction = false; actionSettings.currentKey = null; var ddList = false; var config = {postElementHolder:'_msddHolder', postID:'_msdd', postTitleID:'_title',postTitleTextID:'_titletext',postChildID:'_child',postAID:'_msa',postOPTAID:'_msopta',postInputID:'_msinput', postArrowID:'_arrow', postInputhidden:'_inp'}; var styles = {dd:options.mainCSS, ddTitle:'ddTitle', arrow:'arrow', ddChild:'ddChild', ddTitleText:'ddTitleText', disabled:1, ddOutOfVision:'ddOutOfVision', borderTop:'borderTop', noBorderTop:'noBorderTop', selected:'selected'}; var attributes = {actions:"focus,blur,change,click,dblclick,mousedown,mouseup,mouseover,mousemove,mouseout,keypress,keydown,keyup", prop:"size,multiple,disabled,tabindex"}; this.onActions = new Object(); var elementid = $(sElement).prop("id"); if(typeof(elementid)=="undefined" || elementid.length<=0) { //assign and id; elementid = "msdrpdd"+$.msDropDown.counter++;//I guess it makes unique for the page. $(sElement).attr("id", elementid); }; var inlineCSS = $(sElement).prop("style"); options.style += (inlineCSS==undefined) ? "" : inlineCSS; var allOptions = $(sElement).children(); ddList = ($(sElement).prop("size")>1 || $(sElement).prop("multiple")==true) ? true : false; if(ddList) {options.visibleRows = $(sElement).prop("size");}; var a_array = {};//stores id, html & value etc var currentP = 0; var isFilter = false; var oldHeight; var cacheElement = {}; var getElement = function(ele) { if(typeof(cacheElement[ele])=="undefined") { cacheElement[ele] = document.getElementById(ele); } return cacheElement[ele]; }; var getPostID = function (id) { return elementid+config[id]; }; var getOptionsProperties = function (option) { var currentOption = option; var styles = $(currentOption).prop("style"); return styles; }; var matchIndex = function (index) { var selectedIndex = $("#"+elementid+" option:selected"); if(selectedIndex.length>1) { for(var i=0;i '; }; var sText = $(currentOptOption).text(); var sValue = $(currentOptOption).val(); var sEnabledClass = ($(currentOptOption).prop("disabled")==true) ? "disabled" : "enabled"; a_array[aid] = {html:arrow, value:sValue, text:sText, index:currentOptOption.index, id:aid}; var innerStyle = getOptionsProperties(currentOptOption); if(matchIndex(currentOptOption.index)==true) { aTag += ''; aTag += arrow;// + '' +sText+''; return aTag; }; var in_array = function(t) { var sText = t.toLowerCase(); if(sText.length==0) return -1; var a = ""; for(var i in a_array) { var a_text = a_array[i].text.toLowerCase(); if(a_text.substr(0, sText.length) == sText) { a += "#"+a_array[i].id+ ", "; }; }; return (a=="") ? -1 : a; }; var createATags = function () { var childnodes = allOptions; if(childnodes.length==0) return ""; var aTag = ""; var aidfix = getPostID("postAID"); var aidoptfix = getPostID("postOPTAID"); childnodes.each(function(current){ var currentOption = childnodes[current]; //OPTGROUP if(currentOption.nodeName == "OPTGROUP") { aTag += "
"; aTag += ""+$(currentOption).prop("label")+""; var optChild = $(currentOption).children(); optChild.each(function(currentopt){ var currentOptOption = optChild[currentopt]; aTag += createA(currentOptOption, current, currentopt, "opt"); }); aTag += "
"; } else { aTag += createA(currentOption, current, "", ""); }; }); return aTag; }; var createChildDiv = function () { var id = getPostID("postID"); var childid = getPostID("postChildID"); var sStyle = options.style; sDiv = ""; sDiv += '
0) { //sText = $("#"+elementid+" option:selected").text(); //arrow = $("#"+elementid+" option:selected").prop("title"); }; arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false || options.useSprite!=false) ? "" : ' '; var sDiv = '
'+arrow + '
'; return sDiv; }; var resetTitleDiv = function() { var titleid = getPostID("postTitleID"); var arrowid = getPostID("postArrowID"); var titletextid = getPostID("postTitleTextID"); var inputhidden = getPostID("postInputhidden"); var sText = ""; var arrow = cpDefaultTitleImageSrc; if(getElement(elementid).options.length>0) { //sText = $("#"+elementid+" option:selected").text(); //arrow = $("#"+elementid+" option:selected").prop("title"); }; arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false || options.useSprite!=false) ? "" : ' '; var lTitleInnerHTML = arrow;// + ""+sText+""; var lElem = document.getElementById(titletextid); if(lElem) lElem.innerHTML = lTitleInnerHTML; }; var applyEventsOnA = function() { var childid = getPostID("postChildID"); $("#"+childid+ " a.enabled").unbind("click"); //remove old one $("#"+childid+ " a.enabled").bind("click", function(event) { event.preventDefault(); manageSelection(this); setValue(); if(!ddList) { $("#"+childid).unbind("mouseover"); setInsideWindow(false); var sText = (options.showIcon==false) ? $(this).text() : $(this).html(); setTitleText(sText); //$this.data("dd").close(); $this.close(); }; //actionSettings.oldIndex = a_array[$($this).prop("id")].index; }); }; var createDropDown = function () { var changeInsertionPoint = false; var id = getPostID("postID"); var titleid = getPostID("postTitleID"); var titletextid = getPostID("postTitleTextID"); var childid = getPostID("postChildID"); var arrowid = getPostID("postArrowID"); var iWidth = $("#"+elementid).width(); iWidth = iWidth+2;//it always give -2 width; i dont know why var sStyle = options.style; if($("#"+id).length>0) { $("#"+id).remove(); changeInsertionPoint = true; }; var sDiv = '
options.visibleRows) { var margin = parseInt($("#"+childid+" a:first").css("padding-bottom")) + parseInt($("#"+childid+" a:first").css("padding-top")); var iHeight = ((options.rowHeight)*options.visibleRows) - margin; $("#"+childid).css("height", iHeight+"px"); } else if(ddList) { var iHeight = $("#"+elementid).height(); $("#"+childid).css("height", iHeight+"px"); }; //set out of vision if(changeInsertionPoint==false) { setOutOfVision(); addRefreshMethods(elementid); }; if($("#"+elementid).prop("disabled")==true) { $("#"+id).css("opacity", styles.disabled); }; applyEvents(); //add events //arrow hightlight $("#"+titleid).bind("mouseover", function(event) { hightlightArrow(1); }); $("#"+titleid).bind("mouseout", function(event) { hightlightArrow(0); }); //open close events applyEventsOnA(); $("#"+childid+ " a.disabled").css("opacity", styles.disabled); //alert("ddList "+ddList) if(ddList) { $("#"+childid).bind("mouseover", function(event) {if(!actionSettings.keyboardAction) { actionSettings.keyboardAction = true; $(document).bind("keydown", function(event) { var keyCode = event.keyCode; actionSettings.currentKey = keyCode; if(keyCode==39 || keyCode==40) { //move to next event.preventDefault(); event.stopPropagation(); next(); setValue(); }; if(keyCode==37 || keyCode==38) { event.preventDefault(); event.stopPropagation(); //move to previous previous(); setValue(); }; }); }}); }; $("#"+childid).bind("mouseout", function(event) {setInsideWindow(false);$(document).unbind("keydown");actionSettings.keyboardAction = false;actionSettings.currentKey=null;}); $("#"+titleid).bind("click", function(event) { setInsideWindow(false); if($("#"+childid+":visible").length==1) { $("#"+childid).unbind("mouseover"); } else { $("#"+childid).bind("mouseover", function(event) {setInsideWindow(true);}); //alert("open "+elementid + $this); //$this.data("dd").openMe(); $this.open(); }; }); $("#"+titleid).bind("mouseout", function(evt) { setInsideWindow(false); }); if(options.showIcon && options.useSprite!=false) { setTitleImageSprite(); }; }; var getByIndex = function (index) { for(var i in a_array) { if(a_array[i].index==index) { return a_array[i]; }; }; return -1; }; var manageSelection = function (obj) { var childid = getPostID("postChildID"); if($("#"+childid+ " a."+styles.selected).length==1) { //check if there is any selected oldSelectedValue = $("#"+childid+ " a."+styles.selected).text(); //i should have value here. but sometime value is missing //alert("oldSelectedValue "+oldSelectedValue); }; if(!ddList) { $("#"+childid+ " a."+styles.selected).removeClass(styles.selected); }; var selectedA = $("#"+childid + " a."+styles.selected).prop("id"); if(selectedA!=undefined) { var oldIndex = (actionSettings.oldIndex==undefined || actionSettings.oldIndex==null) ? a_array[selectedA].index : actionSettings.oldIndex; }; if(obj && !ddList) { $(obj).addClass(styles.selected); }; if(ddList) { var keyCode = actionSettings.currentKey; if($("#"+elementid).prop("multiple")==true) { if(keyCode == 17) { //control actionSettings.oldIndex = a_array[$(obj).prop("id")].index; $(obj).toggleClass(styles.selected); //multiple } else if(keyCode==16) { $("#"+childid+ " a."+styles.selected).removeClass(styles.selected); $(obj).addClass(styles.selected); //shift var currentSelected = $(obj).prop("id"); var currentIndex = a_array[currentSelected].index; for(var i=Math.min(oldIndex, currentIndex);i<=Math.max(oldIndex, currentIndex);i++) { $("#"+getByIndex(i).id).addClass(styles.selected); }; } else { $("#"+childid+ " a."+styles.selected).removeClass(styles.selected); $(obj).addClass(styles.selected); actionSettings.oldIndex = a_array[$(obj).prop("id")].index; }; } else { $("#"+childid+ " a."+styles.selected).removeClass(styles.selected); $(obj).addClass(styles.selected); actionSettings.oldIndex = a_array[$(obj).prop("id")].index; }; //isSingle }; }; var addRefreshMethods = function (id) { //deprecated var objid = id; getElement(objid).refresh = function(e) { $("#"+objid).msDropDown(options); }; }; var setInsideWindow = function (val) { actionSettings.insideWindow = val; }; var getInsideWindow = function () { return actionSettings.insideWindow; //will work on this }; var applyEvents = function () { var mainid = getPostID("postID"); var actions_array = attributes.actions.split(","); for(var iCount=0;iCount
"); $("#"+elementid).appendTo($("#"+sId)); }; var setTitleText = function (sText) { var titletextid = getPostID("postTitleTextID"); $("#"+titletextid).html(sText); }; var navigateA = function(w) { var where = w; var childid = getPostID("postChildID"); var visibleA = $("#"+childid + " a:visible"); var totalA = visibleA.length; var currentP = $("#"+childid +" a:visible").index($("#"+childid +" a.selected:visible")); var nextA; switch(where) { case "next": if(currentP < totalA-1) { currentP++; nextA = visibleA[currentP]; }; break; case "previous": if(currentP < totalA && currentP>0) { currentP--; nextA = visibleA[currentP]; }; break; }; if(typeof(nextA)=="undefined") { return false; }; $("#"+childid + " a."+styles.selected).removeClass(styles.selected); $(nextA).addClass(styles.selected); var selectedA = nextA.id; if(!ddList) { var sText = (options.showIcon==false) ? a_array[selectedA].text : $("#"+selectedA).html(); setTitleText(sText); setTitleImageSprite(a_array[selectedA].index); }; if(where=="next") { if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height()))>=parseInt($("#"+childid).height())) { $("#"+childid).scrollTop(($("#"+childid).scrollTop())+$("#"+selectedA).height()+$("#"+selectedA).height()); }; } else { if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height())) <=0) { $("#"+childid).scrollTop(($("#"+childid).scrollTop()-$("#"+childid).height())-$("#"+selectedA).height()); }; }; }; var next = function () { navigateA("next"); }; var previous = function () { navigateA("previous"); }; var setTitleImageSprite = function(i) { if(options.useSprite!=false) { var titletextid = getPostID("postTitleTextID"); var index = (typeof(i)=="undefined") ? getElement(elementid).selectedIndex : i; var sClassName = getElement(elementid).options[index].className; if(sClassName.length>0) { var childid = getPostID("postChildID"); var id = $("#"+childid + " a."+sClassName).prop("id"); var backgroundImg = $("#"+id).css("background-image"); var backgroundPosition = $("#"+id).css("background-position"); var paddingLeft = $("#"+id).css("padding-left"); if(backgroundImg!=undefined) { $("#"+titletextid).find("."+styles.ddTitleText).attr('style', "background:"+backgroundImg); }; if(backgroundPosition!=undefined) { $("#"+titletextid).find("."+styles.ddTitleText).css('background-position', backgroundPosition); }; if(paddingLeft!=undefined) { $("#"+titletextid).find("."+styles.ddTitleText).css('padding-left', paddingLeft); }; $("#"+titletextid).find("."+styles.ddTitleText).css('background-repeat', 'no-repeat'); $("#"+titletextid).find("."+styles.ddTitleText).css('padding-bottom', '2px'); }; }; }; var setValue = function () { //alert("setValue "+elementid); var childid = getPostID("postChildID"); var allSelected = $("#"+childid + " a."+styles.selected); if(allSelected.length==1) { var sText = $("#"+childid + " a."+styles.selected).text(); var selectedA = $("#"+childid + " a."+styles.selected).prop("id"); if(selectedA!=undefined) { var sValue = a_array[selectedA].value; getElement(elementid).selectedIndex = a_array[selectedA].index; }; //set image on title if using sprite if(options.showIcon && options.useSprite!=false) setTitleImageSprite(); } else if(allSelected.length>1) { //var alls = $("#"+elementid +" > option:selected").removeprop("selected"); for(var i=0;i0 || $(sElement).prop("multiple")==true) ? true : false; if(ddList) { //do something var iHeight = $("#"+elementid).height(); var childid = getPostID("postChildID"); $("#"+childid).css("height", iHeight+"px"); //hide titlebar var titleid = getPostID("postTitleID"); $("#"+titleid).hide(); var childid = getPostID("postChildID"); $("#"+childid).css({display:'block',position:'relative'}); applyEventsOnA(); }; break; case "size": getElement(elementid)[prop] = val; if(val==0) { getElement(elementid).multiple = false; }; ddList = ($(sElement).prop("size")>0 || $(sElement).prop("multiple")==true) ? true : false; if(val==0) { //show titlebar var titleid = getPostID("postTitleID"); $("#"+titleid).show(); var childid = getPostID("postChildID"); $("#"+childid).css({display:'none',position:'absolute'}); var sText = ""; if(getElement(elementid).selectedIndex>=0) { var aObj = getByIndex(getElement(elementid).selectedIndex); sText = aObj.html; manageSelection($("#"+aObj.id)); }; setTitleText(sText); } else { //hide titlebar var titleid = getPostID("postTitleID"); $("#"+titleid).hide(); var childid = getPostID("postChildID"); $("#"+childid).css({display:'block',position:'relative'}); }; break; default: try{ //check if this is not a readonly properties getElement(elementid)[prop] = val; } catch(e) { //silent }; break; }; }; //alert("get " + prop + " : "+$this.ddProp[prop]); //$this.set("selectedIndex", 0); }; this.get = function(prop, forceRefresh) { if(prop==undefined && forceRefresh==undefined) { //alert("c1 : " +$this.ddProp); return $this.ddProp; }; if(prop!=undefined && forceRefresh==undefined) { //alert("c2 : " +$this.ddProp[prop]); return ($this.ddProp[prop]!=undefined) ? $this.ddProp[prop] : null; }; if(prop!=undefined && forceRefresh!=undefined) { //alert("c3 : " +getElement(elementid)[prop]); return getElement(elementid)[prop]; }; }; this.visible = function(val) { var id = getPostID("postID"); if(val==true) { $("#"+id).show(); } else if(val==false) { $("#"+id).hide(); } else { return $("#"+id).css("display"); }; }; this.add = function(opt, index) { var objOpt = opt; var sText = objOpt.text; var sValue = (objOpt.value==undefined || objOpt.value==null) ? sText : objOpt.value; var img = (objOpt["title"]==undefined || objOpt["title"]==null) ? '' : objOpt["title"]; var i = (index==undefined || index==null) ? getElement(elementid).options.length : index; getElement(elementid).options[i] = new Option(sText, sValue); if(img!='') getElement(elementid).options[i]["title"] = img; //check if exist var ifA = getByIndex(i); if(ifA != -1) { //replace var aTag = createA(getElement(elementid).options[i], i, "", ""); $("#"+ifA.id).html(aTag); //a_array[key] } else { var aTag = createA(getElement(elementid).options[i], i, "", ""); //add var childid = getPostID("postChildID"); $("#"+childid).append(aTag); applyEventsOnA(); }; }; this.remove = function(i) { getElement(elementid).remove(i); if((getByIndex(i))!= -1) { $("#"+getByIndex(i).id).remove();addRemoveFromIndex(i, 'd');}; //alert("a" +a); if(getElement(elementid).length==0) { setTitleText(""); } else { var sText = getByIndex(getElement(elementid).selectedIndex).html; setTitleText(sText); }; $this.set("selectedIndex", getElement(elementid).selectedIndex); }; this.disabled = function(dis, isLocal) { getElement(elementid).disabled = dis; //alert(getElement(elementid).disabled); var id = getPostID("postID"); if(dis==true) { $("#"+id).css("opacity", styles.disabled); $this.close(); } else if(dis==false) { $("#"+id).css("opacity", 1); }; if(isLocal!=true) { $this.set("disabled", dis); }; }; //return form element this.form = function() { return (getElement(elementid).form == undefined) ? null : getElement(elementid).form; }; this.item = function() { //index, subindex - use arguments.length if(arguments.length==1) { return getElement(elementid).item(arguments[0]); } else if(arguments.length==2) { return getElement(elementid).item(arguments[0], arguments[1]); } else { throw {message:"An index is required!"}; }; }; this.namedItem = function(nm) { return getElement(elementid).namedItem(nm); }; this.multiple = function(is) { if(typeof(is)=="undefined") { return $this.get("multiple"); } else { $this.set("multiple", is); }; }; this.size = function(sz) { if(typeof(sz)=="undefined") { return $this.get("size"); } else { $this.set("size", sz); }; }; this.addMyEvent = function(nm, fn) { $this.onActions[nm] = fn; }; this.fireEvent = function(nm) { eval($this.onActions[nm])($this); }; //end var updateCommonVars = function() { $this.set("version", $.msDropDown.version); $this.set("author", $.msDropDown.author); }; var init = function() { //create wrapper createDropDown(); //update propties //alert("init"); setOriginalProperties(); updateCommonVars(); if(options.onInit!='') { eval(options.onInit)($this); }; }; init(); }; //static $.msDropDown = { version: 2.37, author: "Marghoob Suleman", counter:20, create: function(id, opt) { return $(id).msDropDown(opt).data("dd"); } }; $.fn.extend({ msDropDown: function(options, aDefaultTitleImgPath) { return this.each(function() { //if ($(this).data('dd')) return; // need to comment when using refresh method - will remove in next version var mydropdown = new dd(this, options, aDefaultTitleImgPath); $(this).data('dd', mydropdown); }); } }); //fixed for prop if(typeof($.fn.prop)=='undefined') { $.fn.prop = function(w) { return $(this).attr(w); }; }; })(jQuery);