// 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
/*
// 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,
            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:.30, 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<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).prop("title");
         arrow = (arrow.length==0) ? "" : '<img src="'+arrow+'" align="absmiddle" /> ';                                                              
        };
        var sText = $(currentOptOption).text();
        var sValue = $(currentOptOption).val();
        var sEnabledClass = ($(currentOptOption).prop("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="'+styles.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 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 += "<div class='opta'>";
                                     aTag += "<span style='font-weight:bold;font-style:italic; clear:both;'>"+$(currentOption).prop("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(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) ? "" : '<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").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 = '<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).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 childid = getPostID("postChildID");
        return ($("#"+childid + ":visible").length == 0) ? false : true;
        */
    };
    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).prop(action);
            var actionFound = has_handler(action);
            if(actionFound==true) {
                switch(action) {
                    case "focus": 
                    $("#"+mainid).bind("mouseenter", function(event) {
                                                       getElement(elementid).focus();
                                                       //$("#"+elementid).focus();
                                                       });
                    break;
                    case "click": 
                    $("#"+mainid).bind("click", function(event) {
                                                       //getElement(elementid).onclick();
                                                       $("#"+elementid).trigger("click");
                                                       });
                    break;
                    case "dblclick": 
                    $("#"+mainid).bind("dblclick", function(event) {
                                                       //getElement(elementid).ondblclick();
                                                       $("#"+elementid).trigger("dblclick");
                                                       });
                    break;
                    case "mousedown": 
                    $("#"+mainid).bind("mousedown", function(event) {
                                                       //getElement(elementid).onmousedown();
                                                       $("#"+elementid).trigger("mousedown");
                                                       });
                    break;
                    case "mouseup": 
                    //has in close mthod
                    $("#"+mainid).bind("mouseup", function(event) {
                                                       //getElement(elementid).onmouseup();
                                                       $("#"+elementid).trigger("mouseup");
                                                       //setValue();
                                                       });
                    break;
                    case "mouseover": 
                    $("#"+mainid).bind("mouseover", function(event) {
                                                       //getElement(elementid).onmouseover();                                                      
                                                       $("#"+elementid).trigger("mouseover");
                                                       });
                    break;
                    case "mousemove": 
                    $("#"+mainid).bind("mousemove", function(event) {
                                                       //getElement(elementid).onmousemove();
                                                       $("#"+elementid).trigger("mousemove");
                                                       });
                    break;
                    case "mouseout": 
                    $("#"+mainid).bind("mouseout", function(event) {
                                                       //getElement(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 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;i<allSelected.length;i++) {
                var selectedA = $(allSelected[i]).prop("id");
                var index = a_array[selectedA].index;
                getElement(elementid).options[index].selected = "selected";
            };
        };
        //alert(getElement(elementid).selectedIndex);
        var sIndex = getElement(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).prop("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").prop("id")].text;
            if($.trim(oldSelectedValue) !== $.trim(currentSelectedValue) && oldSelectedValue!==""){
                $("#"+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 getElement(elementid)) {
            if(typeof(getElement(elementid)[i])!='function' && getElement(elementid)[i]!==undefined && getElement(elementid)[i]!==null) {
                $this.set(i, getElement(elementid)[i], true);//true = setting local properties
            };
        };
    };
    var setValueByIndex = function(prop, val) {
            if(getByIndex(val) != -1) {
                getElement(elementid)[prop] = val;
                var childid = getPostID("postChildID");
                $("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
                $("#"+getByIndex(val).id).addClass(styles.selected);
                var sText = getByIndex(getElement(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++;
        };
    };
    var shouldOpenOpposite = function() {
        var childid = getPostID("postChildID");
        var main = getPostID("postID");
        var pos = $("#"+main).position();
        var mH = $("#"+main).height();
        var wH = $(window).height();
        var st = $(window).scrollTop();
        var cH = $("#"+childid).height();
        var css = {zIndex:options.zIndex, top:(pos.top+mH)+"px", display:"none"};
        var ani = options.animStyle;
        var opp = false;
        var borderTop = styles.noBorderTop;
        $("#"+childid).removeClass(styles.noBorderTop);
        $("#"+childid).removeClass(styles.borderTop);
        if( (wH+st) < Math.floor(cH+mH+pos.top) ) {
            var tp = pos.top-cH;
            if((pos.top-cH)<0) {
                tp = 10;
            };
            css = {zIndex:options.zIndex, top:tp+"px", display:"none"};
            ani = "show";
            opp = true;
            borderTop = styles.borderTop;
        };
        return {opp:opp, ani:ani, css:css, border:borderTop};
    };  
    var fireOpenEvent = function() {
          if($this.onActions["onOpen"]!=null) {
              eval($this.onActions["onOpen"])($this);
          };        
    };
    var fireCloseEvent = function() {
            checkMethodAndApply();
            if($this.onActions["onClose"]!=null) {
                eval($this.onActions["onClose"])($this);
            };      
    };
    /************* 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).slideUp("fast");
            $("#"+msOldDiv).css({zIndex:'0'});
        };
        if($("#"+childid).css("display")=="none") {
            oldSelectedValue = a_array[$("#"+childid +" a.selected").prop("id")].text;
            //keyboard action
            var sText ="";
            oldHeight = $("#"+childid).height();
            $("#"+childid +" a").show();
            $(document).bind("keydown", function(event) {
                                                    var keyCode = event.keyCode;
                                                    //alert("keyCode "+keyCode);

                                                    if(keyCode==8) {
                                                            event.preventDefault(); event.stopPropagation();
                                                            //remove char
                                                            sText = (sText.length==0) ? "" : sText.substr(0, sText.length-1);
                                                    };
                                                    switch(keyCode) {
                                                        case 39:
                                                        case 40:
                                                            //move to next
                                                            event.preventDefault(); event.stopPropagation();
                                                            next();                                                         
                                                        break;
                                                        case 37:
                                                        case 38:
                                                            //move to previous
                                                            event.preventDefault(); event.stopPropagation();
                                                            previous();
                                                        break;
                                                        case 27:
                                                        case 13:
                                                            $this.close();
                                                            setValue();
                                                        break;
                                                        default:
                                                            if(keyCode>46) {
                                                                sText += String.fromCharCode(keyCode);
                                                            };
                                                            var ind = in_array(sText);
                                                            if(ind != -1) {
                                                                $("#"+childid).css({height:'auto'});
                                                                $("#"+childid +" a").hide();
                                                                $(ind).show();                                                              
                                                                var wf = shouldOpenOpposite();
                                                                $("#"+childid).css(wf.css);
                                                                $("#"+childid).css({display:'block'});
                                                            } else {
                                                                $("#"+childid +" a").show();
                                                                $("#"+childid).css({height:oldHeight+'px'});
                                                            };
                                                        break;
                                                    };
                                                    if(has_handler("keydown")==true) {
                                                        getElement(elementid).onkeydown();
                                                    };              
                                                });

            $(document).bind("keyup", function(event) {
                if($("#"+elementid).prop("onkeyup")!=undefined) {
                    //$("#"+elementid).keyup();
                    getElement(elementid).onkeyup();
                };                                               
            });
            //end keyboard action

            //close onmouseup
            $(document).bind("mouseup", function(evt){
                                                    if(getInsideWindow()==false) {
                                                    //alert("evt.target: "+evt.target);
                                                     //$this.data("dd").close();
                                                     $this.close();
                                                    };
                                                 });                                                      

            //check open
            var wf = shouldOpenOpposite();
            $("#"+childid).css(wf.css);
            if(wf.opp==true) {
                $("#"+childid).css({display:'block'});
                $("#"+childid).addClass(wf.border);
                fireOpenEvent();
            } else {
                $("#"+childid)[wf.ani]("fast", function() {
                                                          $("#"+childid).addClass(wf.border);
                                                          fireOpenEvent();
                                                          });
            };
            if(childid != msOldDiv) {
                msOldDiv = childid;
            };
        };
    };
    this.close = function() {
                var childid = getPostID("postChildID");
                var top = $("#"+getPostID("postTitleID")).position().top;
                var wf = shouldOpenOpposite();
                //var oldHeight = $("#"+childid).height();
                isFilter = false;
                if(wf.opp==true) {
                    $("#"+childid).animate({
                                        height:0,
                                        top: top
                                        }, function() {
                                                $("#"+childid).css({height:oldHeight+'px', display:'none'});
                                                fireCloseEvent();
                                        });
                } 
                else {
                    $("#"+childid).slideUp("fast", function(event) {
                                                                fireCloseEvent();
                                                                $("#"+childid).css({zIndex:'0'});
                                                                $("#"+childid).css({height:oldHeight+'px'});
                                                                });
                };
                setTitleImageSprite();
                $(document).unbind("keydown");
                $(document).unbind("keyup");
                $(document).unbind("mouseup");              

    };
    this.selectedIndex = function(i) {
        if(typeof(i)=="undefined") {
            return $this.get("selectedIndex");
        } else {
            $this.set("selectedIndex", i);
        };
    };
    this.debug = function(is) {
        if(typeof(is)=="undefined" || is==true) {
            $("."+styles.ddOutOfVision).removeAttr("style");
        } else {
            $("."+styles.ddOutOfVision).attr("style", "height:0px;overflow:hidden;position:absolute");
        };
    };
    //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":
                    getElement(elementid)[prop] = val;
                    ddList = ($(sElement).prop("size")>0 || $(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)
            {
                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);
                });
            }
    });
    //fixed for prop
    if(typeof($.fn.prop)=='undefined') {
        $.fn.prop = function(w) {
            return $(this).attr(w);
        };
    };         

})(jQuery);
