//Chrome Drop Down Menu v2.01- Author: Dynamic Drive (http://www.dynamicdrive.com)
//Last updated: November 14th 06- added iframe shim technique

function cssdropdown(ix,men_id){
  
  this.idx = ix;
  this.menu_id = men_id;
  this.disappeardelay = 250; //set delay in miliseconds before menu disappears onmouseout
  this.disablemenuclick = false; //when user clicks on a menu item with a drop down menu, disable menu item's link?
  this.enableswipe = 1; //enable swipe effect? 1 for yes, 0 for no
  this.enableiframeshim = 1; //enable "iframe shim" technique to get drop down menus to correctly appear on top of controls such as form objects in IE5.5/IE6? 1 for yes, 0 for no

  //No need to edit beyond here////////////////////////
  this.insub=undefined;
  this.dropmenuobj = null;
  this.ie = document.all;
  this.firefox = document.getElementById&&!document.all;
  this.swipetimer = undefined;
  this.bottomclip = 0;

  this.getposOffset = function(what, offsettype){
    var totaloffset=(offsettype=="left")?(what.offsetLeft-what.offsetWidth):what.offsetTop;
    var parentEl=what.offsetParent;
    while (parentEl!=null&&parentEl.id!='main'){
      totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
      parentEl=parentEl.offsetParent;
    }
    return totaloffset;
  }

  this.swipeeffect = function(){
    if (this.bottomclip<parseInt(this.dropmenuobj.offsetHeight)){
      this.bottomclip+=10+(this.bottomclip/10); //unclip drop down menu visibility gradually
      this.dropmenuobj.style.clip="rect(0 auto "+this.bottomclip+"px 0)";
    }else{
      return;
    }
    this.swipetimer=setTimeout("cssdds[" + this.idx + "].swipeeffect()", 10);
  }

  this.showhide = function(obj, e){
    if (this.ie || this.firefox){
      this.dropmenuobj.style.left=this.dropmenuobj.style.top="-500px";
    }
    if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover"){
      if (this.enableswipe==1){
        if (typeof this.swipetimer!="undefined"){
          clearTimeout(this.swipetimer);
        }
        obj.clip="rect(0 auto 0 0)"; //hide menu via clipping
        this.bottomclip=0;
        this.swipeeffect();
      }
      obj.visibility="visible";
    }else if (e.type=="click"){
      obj.visibility="hidden";
    }
  }

  this.iecompattest = function(){
    return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
  }

  this.clearbrowseredge = function(obj, whichedge){
    var edgeoffset=0;
    if (whichedge=="rightedge"){
      var windowedge=this.ie && !window.opera? this.iecompattest().scrollLeft+this.iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15;
      this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetWidth;
      if (windowedge-this.dropmenuobj.x < this.dropmenuobj.contentmeasure);  //move menu to the left?
      edgeoffset=this.dropmenuobj.contentmeasure-obj.offsetWidth;
    }else{
      var topedge=this.ie && !window.opera? this.iecompattest().scrollTop : window.pageYOffset;
      var windowedge=this.ie && !window.opera? this.iecompattest().scrollTop+this.iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18;
      this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetHeight;
      if (windowedge-this.dropmenuobj.y < this.dropmenuobj.contentmeasure){ //move up?
        edgeoffset=this.dropmenuobj.contentmeasure-26;//+obj.offsetHeight;
        if ((this.dropmenuobj.y-topedge)<this.dropmenuobj.contentmeasure){ //up no good either?
          edgeoffset=this.dropmenuobj.y+obj.offsetHeight-topedge;
        }
      }
    }
    return edgeoffset;
  }

  this.dropit = function(obj, e, dropmenuID){
    if (this.dropmenuobj!=null){ //hide previous menu 
      if (this.dropmenuobj!=document.getElementById(dropmenuID)){
        this.dropmenuobj.style.visibility="hidden"; //hide menu
      }else if(this.dropmenuobj.style.visibility!="hidden"){
        this.clearhidemenu();
        return;
      }
    }
    this.clearhidemenu()
    if (this.ie||this.firefox){
      var cssdd = this;
      obj.onmouseout=function(){cssdd.delayhidemenu()}
      obj.onclick=function(){return !cssdd.disablemenuclick} //disable main menu item link onclick?
      this.dropmenuobj=document.getElementById(dropmenuID);
      this.dropmenuobj.mainmenu=cssdd;
      this.dropmenuobj.onmouseover=function(){
        var insub = cssdd.insub;
        while(insub){
          insub.mainmenu.clearhidemenu();
          insub = insub.mainmenu.insub;
        }
        cssdd.clearhidemenu();
      }
      this.dropmenuobj.onmouseout=function(e){
        var insub = cssdd.insub;
        while(insub){
          insub.mainmenu.delayhidemenu();
          insub = insub.mainmenu.insub;
        }
        cssdd.dynamichide(e);
      }
      this.dropmenuobj.onclick=function(){cssdd.delayhidemenu()}
      this.showhide(this.dropmenuobj.style, e);
      this.dropmenuobj.x=this.getposOffset(obj, "left");
      this.dropmenuobj.y=this.getposOffset(obj, "top");
      this.dropmenuobj.style.left=this.dropmenuobj.offsetWidth+this.dropmenuobj.x-this.clearbrowseredge(obj, "rightedge")+"px";
      this.dropmenuobj.style.top=this.dropmenuobj.y-this.clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+"px";
      //this.positionshim(); //call iframe shim function
    }
  }

  this.positionshim = function(){ //display iframe shim function
    if (this.enableiframeshim && typeof this.shimobject!="undefined"){
      if (this.dropmenuobj.style.visibility=="visible"){
        this.shimobject.style.width=this.dropmenuobj.offsetWidth+"px";
        this.shimobject.style.height=this.dropmenuobj.offsetHeight+"px";
        this.shimobject.style.left=this.dropmenuobj.style.left;
        this.shimobject.style.top=this.dropmenuobj.style.top;
      }
      this.shimobject.style.display=(this.dropmenuobj.style.visibility=="visible")? "block" : "none";
    }
  }

  this.hideshim = function(){
    if (this.enableiframeshim && typeof this.shimobject!="undefined"){
      this.shimobject.style.display='none';
    }
  }

  this.contains_firefox = function(a, b) {
    while (b.parentNode)
      if ((b = b.parentNode) == a)
        return true;
    return false;
  }

  this.dynamichide = function(e){
    var evtobj=window.event? window.event : e;
    if (this.ie&&!this.dropmenuobj.contains(evtobj.toElement)){
      this.delayhidemenu();
    }else if (this.firefox&&e.currentTarget!= evtobj.relatedTarget&& !this.contains_firefox(evtobj.currentTarget, evtobj.relatedTarget)){
      this.delayhidemenu();
    }
  }

  this.delayhidemenu = function(){
    this.delayhide=setTimeout("cssdds[" + this.idx + "].dropmenuobj.style.visibility='hidden'; cssdds[" + this.idx + "].hideshim()",this.disappeardelay); //hide menu
  }

  this.clearhidemenu = function(){
    if (this.delayhide!="undefined"){
      clearTimeout(this.delayhide);
    }
  }

  this.startmenu = function(){
    var cssdd = this;
    var mainmenudiv=document.getElementById(this.menu_id);
    if(mainmenudiv.parentNode.className=='dropmenudiv')this.insub=mainmenudiv.parentNode;
    var menuitems=mainmenudiv.getElementsByTagName("a");
    for (var i=0; i<menuitems.length; i++){
      if (menuitems[i].getAttribute("rel")){
        var relvalue=menuitems[i].getAttribute("rel");
        menuitems[i].onmouseover=function(e){
          var event=typeof e!="undefined"? e : window.event;
          cssdd.dropit(this,event,this.getAttribute("rel"));
        }
      }
    }
    if (window.createPopup && !window.XmlHttpRequest){ //if IE5.5 to IE6, create iframe for iframe shim technique
      document.write('<IFRAME id="iframeshim_' + this.menu_id + '"  src="" style="display: none; left: 0; top: 0; z-index: 90; position: absolute; filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)" frameBorder="0" scrolling="no"></IFRAME>');
      this.shimobject=document.getElementById("iframeshim_" + this.menu_id); //reference iframe object
    }
  }
  
  cssdds[ix] = this;

} //eo cssdropdown

