// MSDropDown - jquery.dd.js
// author: Marghoob Suleman
// Date: 12th Aug, 2009
// Version: 2.1 {date: 3rd Sep 2009}
// Revision: 25
// web: www.giftlelo.com | www.marghoobsuleman.com
;(function($) {
        var oldDiv = "";
        $.fn.dd = function(options) {
                $this =  this;
                options = $.extend({
                        height:120,
                        visibleRows:7,
                        rowHeight:23,
                        showIcon:true,
                        zIndex:9999,
                        style:''
                }, options);
                var selectedValue = "";
                var actionSettings ={};
                actionSettings.insideWindow = true;
                actionSettings.keyboardAction = false;
                actionSettings.currentKey = null;
                var ddList = false;
                config = {postElementHolder:'_msddHolder', postID:'_msdd', postTitleID:'_title',postTitleTextID:'_titletext',postChildID:'_child',postAID:'_msa',postOPTAID:'_msopta',postInputID:'_msinput', postArrowID:'_arrow', postInputhidden:'_inp'};
                styles = {dd:'dd', ddTitle:'ddTitle', arrow:'arrow', ddChild:'ddChild', disbaled:.30};
                attributes = {actions:"onfocus,onblur,onchange,onclick,ondblclick,onmousedown,onmouseup,onmouseover,onmousemove,onmouseout,onkeypress,onkeydown,onkeyup", prop:"size,multiple,disabled,tabindex"};
                var elementid = $(this).attr("id");
                var inlineCSS = $(this).attr("style");
                options.style += (inlineCSS==undefined) ? "" : inlineCSS;
                var allOptions = $(this).children();
                ddList = ($(this).attr("size")>0 || $(this).attr("multiple")==true) ? true : false;
                if(ddList) {options.visibleRows = $(this).attr("size");};
                var a_array = {};//stores id, html & value etc
                //create wrapper
                createDropDown();
        
        function getPostID(id) {
                return elementid+config[id];
        };
        function getOptionsProperties(option) {
                var currentOption = option;
                var styles = $(currentOption).attr("style");
                return styles;
        };
        function matchIndex(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;
        }
        function createATags() {
                var childnodes = allOptions;
                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];
                                                                                                                         var aid = aidoptfix+"_"+(current)+"_"+(currentopt);
                                                                                                                         var arrow = $(currentOptOption).attr("title");
                                                                                                                         arrow = (arrow.length==0) ? "" : '<img  src="'+arrow+'" align="left" /> ';
                                                                                                                         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+'"';
                                                                                                                         } else {
                                                                                                                                aTag += '<a  href="javascript:void(0);" class="'+sEnabledClass+'"';
                                                                                                                         };
                                                                                                                         if(innerStyle!=false)
                                                                                                                         aTag +=  ' style="'+innerStyle+'"';
                                                                                                                         aTag +=  ' id="'+aid+'">';
                                                                                                                         aTag += arrow + sText+'</a>';                                                                                                                   
                                                                                                                        });
                                                                         aTag += "</div>";
                                                                         
                                                                 } else {
                                                                         var aid = aidfix+"_"+(current);
                                                                         var arrow = $(currentOption).attr("title");
                                                                         arrow = (arrow.length==0) ? "" : '<img  src="'+arrow+'" align="left" /> ';                                                                   
                                                                         var sText = $(currentOption).text();
                                                                         var sValue = $(currentOption).val();
                                                                         var sEnabledClass = ($(currentOption).attr("disabled")==true) ? "disabled" : "enabled";
                                                                         a_array[aid] = {html:arrow + sText, value:sValue, text:sText, index:currentOption.index, id:aid};
                                                                         var innerStyle = getOptionsProperties(currentOption);
                                                                         if(matchIndex(currentOption.index)==true) {
                                                                                 aTag += '<a href="javascript:void(0);" class="selected '+sEnabledClass+'"';
                                                                         } else {
                                                                                aTag += '<a  href="javascript:void(0);" class="'+sEnabledClass+'"';
                                                                         };
                                                                         if(innerStyle!=false)
                                                                         aTag +=  ' style="'+innerStyle+'"';
                                                                         aTag +=  ' id="'+aid+'">';
                                                                         aTag += arrow + sText+'</a>';                                                                                                                   
                                                                 };
                                                                 });
                return aTag;
        };
        function createChildDiv() {
                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;
        };

        function createTitleDiv() {
                var titleid = getPostID("postTitleID");
                var arrowid = getPostID("postArrowID");
                var titletextid = getPostID("postTitleTextID");
                var inputhidden = getPostID("postInputhidden");
                var sText = $("#"+elementid+" option:selected").text();
                var arrow = $("#"+elementid+" option:selected").attr("title");
                arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false) ? "" : '<img  src="'+arrow+'" align="left" /> ';
                var sDiv = '<div id="'+titleid+'" class="'+styles.ddTitle+'"';
                sDiv += '>';
                sDiv += '<span id="'+arrowid+'" class="'+styles.arrow+'"></span><span class="textTitle" id="'+titletextid+'">'+arrow + sText+'</span></div>';
                return sDiv;
        };
        function createDropDown() {
                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();
                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
                if(!ddList)
                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);
                }
                $("#"+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");
                }
                //set out of vision
                if(changeInsertionPoint==false) {
                        setOutOfVision();
                        addNewEvents(elementid);
                }
                if($("#"+elementid).attr("disabled")==true) {
                        $("#"+id).css("opacity", styles.disbaled);
                } else {
                        applyEvents();
                        //add events
                        //arrow hightlight
                        if(!ddList) {
                                $("#"+titleid).bind("mouseover", function(event) {
                                                                                                                  hightlightArrow(1);
                                                                                                                  });
                                $("#"+titleid).bind("mouseout", function(event) {
                                                                                                                  hightlightArrow(0);
                                                                                                                  });
                        };
                        //open close events
                        $("#"+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();
                                                                                                                          setTitleText(sText);
                                                                                                                          closeMe();
                                                                                                                 };
                                                                                                                 setValue();
                                                                                                                 //actionSettings.oldIndex = a_array[$(this).attr("id")].index;
                                                                                                                 });
                        $("#"+childid+ " a.disabled").css("opacity", styles.disbaled);
                        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;});
                        if(!ddList) {
                                $("#"+titleid).bind("click", function(event) {
                                                                                                          setInsideWindow(false);
                                                                                                                if($("#"+childid+":visible").length==1) {
                                                                                                                        $("#"+childid).unbind("mouseover");
                                                                                                                } else {
                                                                                                                        $("#"+childid).bind("mouseover", function(event) {setInsideWindow(true);});
                                                                                                                        openMe();
                                                                                                                };
                                                                                                          });
                        };
                        $("#"+titleid).bind("mouseout", function(evt) {
                                                                                                         setInsideWindow(false);
                                                                                                         })
                };
        };
        function getByIndex(index) {
                for(var i in a_array) {
                        if(a_array[i].index==index) {
                                return a_array[i];
                        }
                }
        }
        function manageSelection(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;                             
                        };
                };              
        };
        function addNewEvents(id) {
                document.getElementById(id).refresh = function(e) {
                        $("#"+this.id).dd(options);
                };
        };
        function setInsideWindow(val) {
                actionSettings.insideWindow = val;
        };
        function getInsideWindow() {
                return actionSettings.insideWindow;
        };
        function applyEvents() {
                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);
                        if(actionFound!=undefined) {
                                switch(action) {
                                        case "onfocus": 
                                        $("#"+mainid).bind("mouseenter", function(event) {
                                                                                                           document.getElementById(elementid).focus();
                                                                                                           });
                                        break;
                                        case "onclick": 
                                        $("#"+mainid).bind("click", function(event) {
                                                                                                           document.getElementById(elementid).onclick();
                                                                                                           });
                                        break;
                                        case "ondblclick": 
                                        $("#"+mainid).bind("dblclick", function(event) {
                                                                                                           document.getElementById(elementid).ondblclick();
                                                                                                           });
                                        break;
                                        case "onmousedown": 
                                        $("#"+mainid).bind("mousedown", function(event) {
                                                                                                           document.getElementById(elementid).onmousedown();
                                                                                                           });
                                        break;
                                        case "onmouseup": 
                                        //has in closeMe mthod
                                        $("#"+mainid).bind("mouseup", function(event) {
                                                                                                           document.getElementById(elementid).onmouseup();
                                                                                                           //setValue();
                                                                                                           });
                                        break;
                                        case "onmouseover": 
                                        $("#"+mainid).bind("mouseover", function(event) {
                                                                                                           document.getElementById(elementid).onmouseover();
                                                                                                           });
                                        break;
                                        case "onmousemove": 
                                        $("#"+mainid).bind("mousemove", function(event) {
                                                                                                           document.getElementById(elementid).onmousemove();
                                                                                                           });
                                        break;
                                        case "onmouseout": 
                                        $("#"+mainid).bind("mouseout", function(event) {
                                                                                                           document.getElementById(elementid).onmouseout();
                                                                                                           });
                                        break;
                                };
                        };
                };
                
        };
        function setOutOfVision() {
                var sId = getPostID("postElementHolder");
                $("#"+elementid).after("<div style='height:0px;overflow:hidden;position:absolute;' id='"+sId+"'></div>");
                $("#"+elementid).appendTo($("#"+sId));
        };
        function setTitleText(sText) {
                var titletextid = getPostID("postTitleTextID");
                $("#"+titletextid).html(sText);
        };
        function next() {
                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;
                        };
                };
        };
        function previous() {
                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;
                        };
                };
        };
        function setValue() {
                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;
                        };
                } 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";
                        };
                };
        };
        function openMe() {
                var childid = getPostID("postChildID");
                if(oldDiv!="" && childid!=oldDiv) { 
                        $("#"+oldDiv).slideUp("fast");
                        $("#"+oldDiv).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) {
                                                                                                                closeMe();
                                                                                                                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) {
                                                                                                                         closeMe();
                                                                                                                        }
                                                                                                                 });                                                                                                      
                        $("#"+childid).css({zIndex:options.zIndex});
                        $("#"+childid).slideDown("fast");
                if(childid!=oldDiv) {
                        oldDiv = childid;
                }
                };
        };
        function closeMe() {
                                var childid = getPostID("postChildID");
                                $(document).unbind("keydown");
                                $(document).unbind("keyup");
                                $(document).unbind("mouseup");
                                $("#"+childid).slideUp("fast", function(event) {
                                                                                                                        checkMethodAndApply();
                                                                                                                        $("#"+childid).css({zIndex:'0'});
                                                                                                                        });
                
        };
        function checkMethodAndApply() {
                var childid = getPostID("postChildID");
                if($("#"+elementid).attr("onchange")!=undefined) {
                        var currentSelectedValue = a_array[$("#"+childid +" a.selected").attr("id")].text;
                        if(selectedValue!=currentSelectedValue){document.getElementById(elementid).onchange();};
                }
                if($("#"+elementid).attr("onmouseup")!=undefined) {
                        document.getElementById(elementid).onmouseup();
                }
                if($("#"+elementid).attr("onblur")!=undefined) { 
                        $(document).bind("mouseup", function(evt) {
                                                                                                   $("#"+elementid).focus();
                                                                                                   $("#"+elementid)[0].blur();
                                                                                                   setValue();
                                                                                                   $(document).unbind("mouseup");
                                                                                                });
                };
        };
        function hightlightArrow(ison) {
                var arrowid = getPostID("postArrowID");
                if(ison==1)
                        $("#"+arrowid).css({backgroundPosition:'0 100%'});
                else 
                        $("#"+arrowid).css({backgroundPosition:'0 0'});
        };
        };
        $.fn.msDropDown = function(properties) {
                var dds = $(this);
                for(var iCount=0;iCount<dds.length;iCount++) {
                        var id = $(dds[iCount]).attr("id");
                        if(properties==undefined) {
                                $("#"+id).dd();
                        } else {
                                $("#"+id).dd(properties);
                        };
                };              
        };
})(jQuery);

