// MSDropDown - jquery.dd.js
// author: Marghoob Suleman - Search me on google
// Date: 12th Aug, 2009
// Version: 2.2 {date: 12 June 2010}
// Revision: 27
// web: www.giftlelo.com | www.marghoobsuleman.com
/*
 // msDropDown is free jQuery Plugin: you can redistribute it and/or modify
 // it under the terms of the either the MIT License or the Gnu General Public License (GPL) Version 2
 */
;(function($) {
    var msOldDiv = ""; 
    var dd = function(element, options)
    {
        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,
            onInit:'',
            style:''
        }, options);
        this.ddProp = new Object();//storing propeties;
        var selectedValue = "";
        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:.30, ddOutOfVision:'ddOutOfVision'};
        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).attr("id");
        var inlineCSS = $(sElement).attr("style");
        options.style += (inlineCSS==undefined) ? "" : inlineCSS;
        var allOptions = $(sElement).children();
        ddList = ($(sElement).attr("size")>0 || $(sElement).attr("multiple")==true) ? true : false;
        if(ddList) {options.visibleRows = $(sElement).attr("size");};
        var a_array = {};//stores id, html & value etc

        var getPostID = function (id) {
            return elementid+config[id];
        };
        var getOptionsProperties = function (option) {
            var currentOption = option;
            var styles = $(currentOption).attr("style");
            return styles;
        };
        var matchIndex = function (index) {
            var selectedIndex = $("#"+elementid+" option:selected");
            if(selectedIndex.length>1) {
                for(var i=0;i<selectedIndex.length;i++) {
                    if(index == selectedIndex[i].index) {
                        return true;
                    };
                };
            } else if(selectedIndex.length==1) {
                if(selectedIndex[0].index==index) {
                    return true;
                };
            };
            return false;
        };
        var createA = function(currentOptOption, current, currentopt, tp) {
            var aTag = "";
            //var aidfix = getPostID("postAID");
            var aidoptfix = (tp=="opt") ? getPostID("postOPTAID") : getPostID("postAID");        
            var aid = (tp=="opt") ? aidoptfix+"_"+(current)+"_"+(currentopt) : aidoptfix+"_"+(current);
            var arrow = "";
            var clsName = "";
            if(options.useSprite!=false) {
                clsName = ' '+options.useSprite+' '+currentOptOption.className;
            } else {
                arrow = $(currentOptOption).attr("title");
                arrow = (arrow.length==0) ? "" : '<img src="'+arrow+'" align="absmiddle" /> ';                                                                 
            };
            //console.debug("clsName "+clsName);
            var sText = $(currentOptOption).text();
            var sValue = $(currentOptOption).val();
            var sEnabledClass = ($(currentOptOption).attr("disabled")==true) ? "disabled" : "enabled";
            a_array[aid] = {html:arrow + sText, value:sValue, text:sText, index:currentOptOption.index, id:aid};
            var innerStyle = getOptionsProperties(currentOptOption);
            if(matchIndex(currentOptOption.index)==true) {
                aTag += '<a href="javascript:void(0);" class="selected '+sEnabledClass+clsName+'"';
            } else {
                aTag += '<a  href="javascript:void(0);" class="'+sEnabledClass+clsName+'"';
            };
            if(innerStyle!==false && innerStyle!==undefined) {
                aTag +=  " style='"+innerStyle+"'";
            };
            aTag +=  ' id="'+aid+'">';
            aTag += arrow + '<span class="'+styles.ddTitleText+'">' +sText+'</span></a>';
            return aTag;
        };
        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 += "<div class='opta'>";
                    aTag += "<span style='font-weight:bold;font-style:italic; clear:both;'>"+$(currentOption).attr("label")+"</span>";
                    var optChild = $(currentOption).children();
                    optChild.each(function(currentopt){
                        var currentOptOption = optChild[currentopt];
                        aTag += createA(currentOptOption, current, currentopt, "opt");
                    });
                    aTag += "</div>";

                } else {
                    aTag += createA(currentOption, current, "", "");
                };
            });
            return aTag;
        };
        var createChildDiv = function () {
            var id = getPostID("postID");
            var childid = getPostID("postChildID");
            var sStyle = options.style;
            sDiv = "";
            sDiv += '<div id="'+childid+'" class="'+styles.ddChild+'"';
            if(!ddList) {
                sDiv += (sStyle!="") ? ' style="'+sStyle+'"' : ''; 
            } else {
                sDiv += (sStyle!="") ? ' style="border-top:1px solid #c3c3c3;display:block;position:relative;'+sStyle+'"' : ''; 
            }
            sDiv += '>';        
            return sDiv;
        };

        var createTitleDiv = function () {
            var titleid = getPostID("postTitleID");
            var arrowid = getPostID("postArrowID");
            var titletextid = getPostID("postTitleTextID");
            var inputhidden = getPostID("postInputhidden");
            var sText = "";
            var arrow = "";
            if(document.getElementById(elementid).options.length>0) {
                sText = $("#"+elementid+" option:selected").text();
                arrow = $("#"+elementid+" option:selected").attr("title");
            };
            //console.debug("sObj     "+sObj.length);
            arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false || options.useSprite!=false) ? "" : '<img src="'+arrow+'" align="absmiddle" /> ';
            var sDiv = '<div id="'+titleid+'" class="'+styles.ddTitle+'"';
            sDiv += '>';
            sDiv += '<span id="'+arrowid+'" class="'+styles.arrow+'"></span><span class="'+styles.ddTitleText+'" id="'+titletextid+'">'+arrow + '<span class="'+styles.ddTitleText+'">'+sText+'</span></span></div>';
            return sDiv;
        };
        var applyEventsOnA = function() {
            var childid = getPostID("postChildID");
            $("#"+childid+ " a.enabled").bind("click", function(event) {
                event.preventDefault();
                manageSelection(this);
                if(!ddList) {
                    $("#"+childid).unbind("mouseover");
                    setInsideWindow(false);                                                             
                    var sText = (options.showIcon==false) ? $(this).text() : $(this).html();
                    //alert("sText "+sText);
                    setTitleText(sText);
                    //$this.data("dd").close();
                    $this.close();
                };
                setValue();
                //actionSettings.oldIndex = a_array[$($this).attr("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 = '<div id="'+id+'" class="'+styles.dd+'"';
            sDiv += (sStyle!="") ? ' style="'+sStyle+'"' : '';
            sDiv += '>';
            //create title bar
            sDiv += createTitleDiv();
            //create child
            sDiv += createChildDiv();
            sDiv += createATags();
            sDiv += "</div>";
            sDiv += "</div>";
            if(changeInsertionPoint==true) {
                var sid =getPostID("postElementHolder");
                $("#"+sid).after(sDiv);
            } else {
                $("#"+elementid).after(sDiv);
            };
            if(ddList) {
                var titleid = getPostID("postTitleID");    
                $("#"+titleid).hide();
            };

            $("#"+id).css("width", iWidth+"px");
            $("#"+childid).css("width", (iWidth-2)+"px");
            if(allOptions.length>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).attr("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);
            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(!ddList) {
                $("#"+childid+ " a.selected").removeClass("selected");
            }; 
            var selectedA = $("#"+childid + " a.selected").attr("id");
            if(selectedA!=undefined) {
                var oldIndex = (actionSettings.oldIndex==undefined || actionSettings.oldIndex==null) ? a_array[selectedA].index : actionSettings.oldIndex;
            };
            if(obj && !ddList) {
                $(obj).addClass("selected");
            };    
            if(ddList) {
                var keyCode = actionSettings.currentKey;
                if($("#"+elementid).attr("multiple")==true) {
                    if(keyCode == 17) {
                        //control
                        actionSettings.oldIndex = a_array[$(obj).attr("id")].index;
                        $(obj).toggleClass("selected");
                        //multiple
                        } else if(keyCode==16) {
                            $("#"+childid+ " a.selected").removeClass("selected");
                            $(obj).addClass("selected");
                            //shift
                            var currentSelected = $(obj).attr("id");
                            var currentIndex = a_array[currentSelected].index;
                            for(var i=Math.min(oldIndex, currentIndex);i<=Math.max(oldIndex, currentIndex);i++) {
                                $("#"+getByIndex(i).id).addClass("selected");
                            }
                            } else {
                                $("#"+childid+ " a.selected").removeClass("selected");
                                $(obj).addClass("selected");
                                actionSettings.oldIndex = a_array[$(obj).attr("id")].index;
                            };
                        } else {
                            $("#"+childid+ " a.selected").removeClass("selected");
                            $(obj).addClass("selected");
                            actionSettings.oldIndex = a_array[$(obj).attr("id")].index;                
                        };
                        //isSingle
                    };        
                };
                var addRefreshMethods = function (id) {
                    //deprecated
                    var objid = id;
                    document.getElementById(objid).refresh = function(e) {
                        $("#"+objid).msDropDown(options);
                    };
                };
                var setInsideWindow = function (val) {
                    actionSettings.insideWindow = val;
                };
                var getInsideWindow = function () {
                    return actionSettings.insideWindow;
                };
                var applyEvents = function () {
                    var mainid = getPostID("postID");
                    var actions_array = attributes.actions.split(",");
                    for(var iCount=0;iCount<actions_array.length;iCount++) {
                        var action = actions_array[iCount];
                        //var actionFound = $("#"+elementid).attr(action);
                        var actionFound = has_handler(action);//$("#"+elementid).attr(action);
                        //console.debug(elementid +" action " + action , "actionFound "+actionFound);
                        if(actionFound==true) {
                            switch(action) {
                                case "focus": 
                                $("#"+mainid).bind("mouseenter", function(event) {
                                    document.getElementById(elementid).focus();
                                    //$("#"+elementid).focus();
                                });
                                break;
                                case "click": 
                                $("#"+mainid).bind("click", function(event) {
                                    //document.getElementById(elementid).onclick();
                                    $("#"+elementid).trigger("click");
                                });
                                break;
                                case "dblclick": 
                                $("#"+mainid).bind("dblclick", function(event) {
                                    //document.getElementById(elementid).ondblclick();
                                    $("#"+elementid).trigger("dblclick");
                                });
                                break;
                                case "mousedown": 
                                $("#"+mainid).bind("mousedown", function(event) {
                                    //document.getElementById(elementid).onmousedown();
                                    $("#"+elementid).trigger("mousedown");
                                });
                                break;
                                case "mouseup": 
                                //has in close mthod
                                $("#"+mainid).bind("mouseup", function(event) {
                                    //document.getElementById(elementid).onmouseup();
                                    $("#"+elementid).trigger("mouseup");
                                    //setValue();
                                });
                                break;
                                case "mouseover": 
                                $("#"+mainid).bind("mouseover", function(event) {
                                    //document.getElementById(elementid).onmouseover();                                                       
                                    $("#"+elementid).trigger("mouseover");
                                });
                                break;
                                case "mousemove": 
                                $("#"+mainid).bind("mousemove", function(event) {
                                    //document.getElementById(elementid).onmousemove();
                                    $("#"+elementid).trigger("mousemove");
                                });
                                break;
                                case "mouseout": 
                                $("#"+mainid).bind("mouseout", function(event) {
                                    //document.getElementById(elementid).onmouseout();
                                    $("#"+elementid).trigger("mouseout");
                                });
                                break;                    
                            };
                        };
                    };

                };
                var setOutOfVision = function () {
                    var sId = getPostID("postElementHolder");
                    $("#"+elementid).after("<div class='"+styles.ddOutOfVision+"' style='height:0px;overflow:hidden;position:absolute;' id='"+sId+"'></div>");
                    $("#"+elementid).appendTo($("#"+sId));
                };
                var setTitleText = function (sText) {
                    var titletextid = getPostID("postTitleTextID");
                    $("#"+titletextid).html(sText);        
                };
                var next = function () {
                    var titletextid = getPostID("postTitleTextID");
                    var childid = getPostID("postChildID");
                    var allAs = $("#"+childid + " a.enabled");
                    for(var current=0;current<allAs.length;current++) {
                        var currentA = allAs[current];
                        var id = $(currentA).attr("id");
                        if($(currentA).hasClass("selected") && current<allAs.length-1) {
                            $("#"+childid + " a.selected").removeClass("selected");
                            $(allAs[current+1]).addClass("selected");
                            //manageSelection(allAs[current+1]);
                            var selectedA = $("#"+childid + " a.selected").attr("id");
                            if(!ddList) {
                                var sText = (options.showIcon==false) ? a_array[selectedA].text : a_array[selectedA].html;
                                setTitleText(sText);
                            };
                            if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height()))>=parseInt($("#"+childid).height())) {
                                $("#"+childid).scrollTop(($("#"+childid).scrollTop())+$("#"+selectedA).height()+$("#"+selectedA).height());
                            };
                            break;
                        };
                    };
                };
                var previous = function () {
                    var titletextid = getPostID("postTitleTextID");
                    var childid = getPostID("postChildID");
                    var allAs = $("#"+childid + " a.enabled");
                    for(var current=0;current<allAs.length;current++) {
                        var currentA = allAs[current];
                        var id = $(currentA).attr("id");
                        if($(currentA).hasClass("selected") && current!=0) {
                            $("#"+childid + " a.selected").removeClass("selected");
                            $(allAs[current-1]).addClass("selected");                
                            //manageSelection(allAs[current-1]);
                            var selectedA = $("#"+childid + " a.selected").attr("id");
                            if(!ddList) {
                                var sText = (options.showIcon==false) ? a_array[selectedA].text : a_array[selectedA].html;
                                setTitleText(sText);
                            };
                            if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height())) <=0) {
                                $("#"+childid).scrollTop(($("#"+childid).scrollTop()-$("#"+childid).height())-$("#"+selectedA).height());
                            };
                            break;
                        };
                    };
                };
                var setTitleImageSprite = function() {
                    if(options.useSprite!=false) {
                        var titletextid = getPostID("postTitleTextID");
                        var sClassName = document.getElementById(elementid).options[document.getElementById(elementid).selectedIndex].className;
                        if(sClassName.length>0) {
                            //alert(sClassName);    
                            var sStyle1 = getImageFromClassName("."+sClassName); //background Position
                            //alert(sStyle1);
                            var sStyle2 = getImageFromClassName("."+options.useSprite); //main
                            //alert(sStyle2.backgroundImage + sStyle1.backgroundPosition);
                            if(sStyle1 != null && sStyle2 != null) {
                                var bgimage = sStyle2.backgroundImage.replace(/"/gi, "");
                                bgimage = bgimage.replace(/..\//,"");
                            }
                            $("#"+titletextid).find("."+styles.ddTitleText).css('background-image', bgimage);
                            if(sStyle1.backgroundPosition!=undefined){
                                $("#"+titletextid).find("."+styles.ddTitleText).css('background-position', sStyle1.backgroundPosition);
                            };
                            $("#"+titletextid).find("."+styles.ddTitleText).css('background-repeat', 'no-repeat');
                            if(sStyle2.paddingLeft!=undefined){
                                $("#"+titletextid).find("."+styles.ddTitleText).css('padding-left', sStyle2.paddingLeft);
                            };
                            $("#"+titletextid).find("."+styles.ddTitleText).css('padding-bottom', '2px');
                        };
                    };        
                };
                var setValue = function () {
                    //alert("setValue "+elementid);
                    var childid = getPostID("postChildID");
                    var allSelected = $("#"+childid + " a.selected");
                    if(allSelected.length==1) {
                        var sText = $("#"+childid + " a.selected").text();
                        var selectedA = $("#"+childid + " a.selected").attr("id");
                        if(selectedA!=undefined) {
                            var sValue = a_array[selectedA].value;
                            document.getElementById(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").removeAttr("selected");
                        for(var i=0;i<allSelected.length;i++) {
                            var selectedA = $(allSelected[i]).attr("id");
                            var index = a_array[selectedA].index;
                            document.getElementById(elementid).options[index].selected = "selected";
                        };
                    };
                    //alert(document.getElementById(elementid).selectedIndex);
                    var sIndex = document.getElementById(elementid).selectedIndex;
                    $this.ddProp["selectedIndex"]= sIndex;
                    //alert("selectedIndex "+ $this.ddProp["selectedIndex"] + " sIndex "+sIndex);
                };
                var has_handler = function (name) {
                    // True if a handler has been added in the html.
                    if ($("#"+elementid).attr("on" + name) != undefined) {
                        return true;
                    };
                    // True if a handler has been added using jQuery.
                    var evs = $("#"+elementid).data("events");
                    if (evs && evs[name]) {
                        return true;
                    };
                    return false;
                };
                var checkMethodAndApply = function () {
                    var childid = getPostID("postChildID");
                    if(has_handler('change')==true) {
                        //alert(1);
                        var currentSelectedValue = a_array[$("#"+childid +" a.selected").attr("id")].text;
                        if(selectedValue!=currentSelectedValue){
                            $("#"+elementid).trigger("change");
                        };
                    };
                    if(has_handler('mouseup')==true) {
                        $("#"+elementid).trigger("mouseup");
                    };
                    if(has_handler('blur')==true) { 
                        $(document).bind("mouseup", function(evt) {
                            $("#"+elementid).focus();
                            $("#"+elementid)[0].blur();
                            setValue();
                            $(document).unbind("mouseup");
                        });
                    };
                };
                var hightlightArrow = function(ison) {
                    var arrowid = getPostID("postArrowID");
                    if(ison==1)
                    $("#"+arrowid).css({backgroundPosition:'0 100%'});
                    else 
                    $("#"+arrowid).css({backgroundPosition:'0 0'});
                };
                var setOriginalProperties = function() {
                    //properties = {};
                    //alert($this.data("dd"));
                    for(var i in document.getElementById(elementid)) {
                        if(typeof(document.getElementById(elementid)[i])!='function' && document.getElementById(elementid)[i]!==undefined && document.getElementById(elementid)[i]!==null) {
                            $this.set(i, document.getElementById(elementid)[i], true);//true = setting local properties
                        };
                    };
                };
                var getImageFromClassName = function(selectorText) {
                    if (document.styleSheets) {
                        for (var i = document.styleSheets.length - 1; i >= 0; i--) {
                            var styleSheet = document.styleSheets[i];
                            var rules;
                            var isCSSRules = false;
                            if (styleSheet.cssRules) {
                                rules = styleSheet.cssRules;
                                isCSSRules = true;

                            } else if (styleSheet.rules) {
                                rules = styleSheet.rules;
                            };
                            if (rules) {
                                var fullText2 = ('.'+options.mainCSS+' .ddChild a'+selectorText).toLowerCase(); //works in ie
                                var fullText = ('.'+options.mainCSS+' .ddChild a'+selectorText+', .'+options.mainCSS+' .ddChild a'+selectorText+':visited').toLowerCase();
                                for (var j = rules.length - 1; j >= 0; j--) {
                                    //console.debug(rules[j].selectorText);
                                    //    alert(rules[j].selectorText);
                                    if ((rules[j].selectorText).toLowerCase() == fullText || (rules[j].selectorText).toLowerCase() == fullText2) {
                                        var myStyle = new Object();
                                        for(var s in rules[j].style) {
                                            if(typeof(rules[j].style[s]) == "string" && rules[j].style[s].length>0) {
                                                //alert(s + " : " +rules[j].style[s])
                                            //console.debug(s +" : "+rules[j].style[s]);
                                            myStyle[s] = rules[j].style[s];
                                        };
                                    };
                                    //return rules[j].style;
                                    return myStyle;
                                };
                            };
                        };
                    };
                    return null;
                } else {
                    return null;
                };
            };
            var setValueByIndex = function(prop, val) {
                if(getByIndex(val) != -1) {
                    document.getElementById(elementid)[prop] = val;
                    var childid = getPostID("postChildID");
                    $("#"+childid+ " a.selected").removeClass("selected");
                    $("#"+getByIndex(val).id).addClass("selected");
                    var sText = getByIndex(document.getElementById(elementid).selectedIndex).html;
                    setTitleText(sText);                
                };
            };
            var addRemoveFromIndex = function(i, action) {
                if(action=='d') {
                    for(var key in a_array) {
                        if(a_array[key].index == i) {
                            delete a_array[key];
                            break;
                        };
                    };
                };
                //update index
                var count = 0;
                for(var key in a_array) {
                    a_array[key].index = count;
                    count++;
                };
            };
            /************* public methods *********************/
            this.open = function() {
                if(($this.get("disabled", true) == true) || ($this.get("options", true).length==0)) return;
                var childid = getPostID("postChildID");
                if(msOldDiv!="" && childid!=msOldDiv) { 
                    $("#"+msOldDiv).fadeOut("fast");
                    $("#"+msOldDiv).css({zIndex:'0'});
                };
                if($("#"+childid).css("display")=="none") {
                    //selectedValue = a_array[$("#"+childid +" a.selected").attr("id")].text;
                    $(document).bind("keydown", function(event) {
                        var keyCode = event.keyCode;                                            
                        if(keyCode==39 || keyCode==40) {
                            //move to next
                            event.preventDefault(); event.stopPropagation();
                            next();
                        };
                        if(keyCode==37 || keyCode==38) {
                            event.preventDefault(); event.stopPropagation();
                            //move to previous
                            previous();
                        };
                        if(keyCode==27 || keyCode==13) {
                            //$this.data("dd").close();
                            $this.close();
                            setValue();
                        };
                        if($("#"+elementid).attr("onkeydown")!=undefined) {
                            document.getElementById(elementid).onkeydown();
                        };                                                        
                    });
                    $(document).bind("keyup", function(event) {
                        if($("#"+elementid).attr("onkeyup")!=undefined) {
                            //$("#"+elementid).keyup();
                            document.getElementById(elementid).onkeyup();
                        };                                                 
                    });

                    $(document).bind("mouseup", function(evt){
                        if(getInsideWindow()==false) {
                            //alert("evt.target: "+evt.target);
                            //$this.data("dd").close();
                            $this.close();
                        };
                    });                                                      
                    $("#"+childid).css({zIndex:options.zIndex});
                    $("#"+childid).fadeIn("fast", function() {
                        if($this.onActions["onOpen"]!=null) {
                            eval($this.onActions["onOpen"])($this);
                        };
                    });
                    if(childid!=msOldDiv) {
                        msOldDiv = childid;
                    };
                };
            };
            this.close = function() {
                var childid = getPostID("postChildID");
                $(document).unbind("keydown");
                $(document).unbind("keyup");
                $(document).unbind("mouseup");
                $("#"+childid).fadeOut("fast", function(event) {
                    checkMethodAndApply();
                    $("#"+childid).css({zIndex:'0'});
                    if($this.onActions["onClose"]!=null) {
                        eval($this.onActions["onClose"])($this);
                    };
                });

            };
            this.selectedIndex = function(i) {
                $this.set("selectedIndex", i);
            };
            //update properties
            this.set = function(prop, val, isLocal) {
                //alert("- set " + prop + " : "+val);
                if(prop==undefined || val==undefined) throw {message:"set to what?"}; 
                $this.ddProp[prop] = val;
                if(isLocal!=true) { 
                    switch(prop) {
                        case "selectedIndex":
                        setValueByIndex(prop, val);
                        break;
                        case "disabled":
                        $this.disabled(val, true);
                        break;
                        case "multiple":
                        document.getElementById(elementid)[prop] = val;
                        ddList = ($(sElement).attr("size")>0 || $(sElement).attr("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":
                        document.getElementById(elementid)[prop] = val;
                        if(val==0) {
                            document.getElementById(elementid).multiple = false;
                        };
                        ddList = ($(sElement).attr("size")>0 || $(sElement).attr("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(document.getElementById(elementid).selectedIndex>=0) {
                                var aObj = getByIndex(document.getElementById(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
                            document.getElementById(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 : " +document.getElementById(elementid)[prop]);
            return document.getElementById(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) ? document.getElementById(elementid).options.length : index;
        document.getElementById(elementid).options[i] = new Option(sText, sValue);
        if(img!='') document.getElementById(elementid).options[i].title = img;
        //check if exist
        var ifA = getByIndex(i);
        if(ifA != -1) {
            //replace
            var aTag = createA(document.getElementById(elementid).options[i], i, "", "");
            $("#"+ifA.id).html(aTag);
            //a_array[key]
            } else {
                var aTag = createA(document.getElementById(elementid).options[i], i, "", "");
                //add
                var childid = getPostID("postChildID");
                $("#"+childid).append(aTag);
                applyEventsOnA();
            };
        };    
        this.remove = function(i) {
            document.getElementById(elementid).remove(i);
            if((getByIndex(i))!= -1) { $("#"+getByIndex(i).id).remove();addRemoveFromIndex(i, 'd');};
            //alert("a" +a);
            if(document.getElementById(elementid).length==0) {
                setTitleText("");
            } else {
                var sText = getByIndex(document.getElementById(elementid).selectedIndex).html;
                setTitleText(sText);
            };
            $this.set("selectedIndex", document.getElementById(elementid).selectedIndex);
        };
        this.disabled = function(dis, isLocal) {
            document.getElementById(elementid).disabled = dis;
            //alert(document.getElementById(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 (document.getElementById(elementid).form == undefined) ? null : document.getElementById(elementid).form;
        };
        this.item = function() {
            //index, subindex - use arguments.length
            if(arguments.length==1) {
            return document.getElementById(elementid).item(arguments[0]);
        } else if(arguments.length==2) {
        return document.getElementById(elementid).item(arguments[0], arguments[1]);
    } else {
    throw {message:"An index is required!"};
};
    };
    this.namedItem = function(nm) {
        return document.getElementById(elementid).namedItem(nm);
    };
    this.multiple = function(is) {
        if(is==undefined) {
            return $this.get("multiple");
        } else {
            $this.set("multiple", is);
        };

    };
    this.size = function(sz) {
        if(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.2,
    author: "Marghoob Suleman",
    create: function(id, opt) {
        return $(id).msDropDown(opt).data("dd");
    }
};
$.fn.extend({
    msDropDown: function(options)
    {
        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);
            $(this).data('dd', mydropdown);
        });
    }
});

})(jQuery);

