// MSDropDown - jquery.dd.js
// author: Marghoob Suleman - Search me on google
// Date: 12th Aug, 2009
// Version: 2.3 {date: 12 June 2010}
// Revision: 28
// 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) {
          var childid = getPostID("postChildID");
          var id = $("#" + childid + " a." + sClassName).attr("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.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 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).slideUp("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).slideDown("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).slideUp("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.3,
    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);

