
/************************************************************************
Author: Digby Eade
Web Address: http://www.changingvisions.org.uk
Date: 06/03/2009
Version: 1.0

License: There are no entitlements for any person/persons to use this code for any purpose without previously contacting an officer
of Changing Visions and obtaining written permission on company letter headed documentation. Any breach of this copyright will be
responded with legal proceedings against the transgressor.

NB: If a menu is to be open initially set the style display to
"inline" in the subMenu class div like this:
<div class="subMenu" style="display:inline;">

The fading effect can be disabled by setting the doFading var to false.

***********************************************************************/

var menuObjArray = new Array();
menuObjArray[0] = new Array();
menuObjArray[1] = new Array();
menuObjArray[2] = new Array();
menuObjArray[3] = new Array();
menuObjArray[4] = new Array();
menuObjArray[5] = new Array();
menuObjArray[6] = new Array();
menuObjArray[7] = new Array();

var timerSlide = null;
var numMenuItem = 0;
var slideDelay = 15;
var divHeight = 21;
var moveSlidePix = 5;
var isLocked = false;
var doFading = true;

InitAll();

function InitAll() {
  var divs = document.getElementsByTagName("DIV");
  menuStateAry = GetUserCookie("cvMenuCookv2").split(",");

  aryNum = 0;
  for(dn=0; dn < divs.length;dn++) {
    if(String(divs.item(dn).className).substring(0,7) == "topItem") {
      mainMenuDiv = divs.item(dn).parentNode;
      menuContainerDiv= mainMenuDiv.getElementsByTagName("DIV").item(1);
      itemContainerDiv= menuContainerDiv.getElementsByTagName("DIV").item(0);
      if(menuStateAry != 0)
        itemContainerDiv.style.height = parseInt(menuStateAry[aryNum]) + "px";
      if(!doFading) {
        if (menuContainerDiv.filters)
          menuContainerDiv.filters.alpha.opacity = 100;
        else
          menuContainerDiv.opacity = 1;
      }
      if(menuStateAry != 0 ) {
        if( parseInt(menuStateAry[aryNum]) == 0)
          itemContainerDiv.style.display = 'none';
        else
          itemContainerDiv.style.display = 'inline';
      }
      Init(divs.item(dn));
      aryNum++;
    }
  }
}

function Init(objDiv) {
  if (isLocked)
    return;
  var mainMenuDiv, subMenuDiv, menuContainerDiv, itemContainerDiv,styleRules;
    for(r=0;r < document.styleSheets.length; r++) {
      if( -1 != String(document.styleSheets[r].href).indexOf("cvMenu.css") )
        break;
    }
    if(!document.styleSheets[r].rules)
      styleRules = document.styleSheets[r].cssRules;
    else
      styleRules = document.styleSheets[r].rules;

  numMenuItem = 0;
  mainMenuDiv = objDiv.parentNode;
  subMenuDiv =  mainMenuDiv.getElementsByTagName("DIV").item(0);

  menuContainerDiv= mainMenuDiv.getElementsByTagName("DIV").item(1);
  itemContainerDiv= menuContainerDiv.getElementsByTagName("DIV").item(0);

  aLen = menuObjArray[0].length;
  for (i=0 ;i < aLen ; i++) {
    if (menuObjArray[0][i] == menuContainerDiv) {
      break;
    }
  }

  if (i == aLen) {
    menuObjArray[0][i]  = menuContainerDiv;
    menuObjArray[1][i] = itemContainerDiv;
    menuObjArray[7][i] = subMenuDiv;
    subMenuDiv.onclick = SetSlide;
      lastmenuNum = -1;
    for (b=0;b<itemContainerDiv.childNodes.length;b++) {
      if (itemContainerDiv.childNodes.item(b).tagName == "SPAN") {
        numMenuItem ++;
        itemContainerDiv.childNodes.item(b).onmouseover= ChangeStyle;
        itemContainerDiv.childNodes.item(b).onmouseout= ChangeStyle;
        lastmenuNum = b;
      }
    }
      for(r=0;r < styleRules.length; r++) {
        tmpStr1 = String(styleRules[r].selectorText);
        tmpStr2 = String("." + itemContainerDiv.childNodes.item(lastmenuNum).className);
        if(tmpStr1 == tmpStr2) {
          if(NaN != parseInt(styleRules[r].style.height)) {
            divHeight = parseInt(styleRules[r].style.height);
            break;
          }
        }
      }

    menuObjArray[2][i] = numMenuItem;
    menuObjArray[3][i] = mainMenuDiv;

    if (itemContainerDiv.style.display == "inline") {
      menuObjArray[4][i] = numMenuItem * divHeight;
      menuObjArray[0][i].style.height = numMenuItem * divHeight + "px";
      menuObjArray[6][i] = true;
      if(doFading) {
         if (menuObjArray[0][i].filters)
           menuObjArray[0][i].filters.alpha.opacity = 100;
         else
           menuObjArray[0][i].style.opacity = 1;
       }
      } else {
        menuObjArray[7][i].className = menuObjArray[7][i].className+"Over";
        menuObjArray[4][i] = 0;
        menuObjArray[0][i].style.height = 0 + "px";
        menuObjArray[6][i] = false;
        if(doFading) {
          if (menuObjArray[0][i].filters)
            menuObjArray[0][i].filters.alpha.opacity = 0;
          else
            menuObjArray[0][i].style.opacity = .0;
      }
    }

  }//end if

  mainMenuDiv = null;
  subMenuDiv =  null;
  menuContainerDiv= null;
  itemContainerDiv= null;
}

function SetSlide() {
  if (isLocked)
    return;
  else
    isLocked = true;
  for (i=0 ;i < menuObjArray[0].length; i++) {
    if (menuObjArray[3][i] == this.parentNode) {
      if (menuObjArray[5][i] == null)
        menuObjArray[5][i] = setInterval("RunSlide(" + i + ")", slideDelay);
      break;
    }
  }
}



function UpdateUserCookie(aryIndex) {
  date = new Date();
  date.setTime(date.getTime() + (1000 * 60 * 60 * 24 * 30));
  document.cookie = "cvMenuCookv2" + "=" + escape(menuObjArray[4].toString()) + "; ecvires=" + date.toGMTString();
}

function GetUserCookie(crumbName) {
  colCookie = document.cookie.split("; ");
  for (a=0; a < colCookie.length; a++) {
      colCrumb = colCookie[a].split("=");
      if(colCrumb[0] == crumbName)
          return unescape(colCrumb[1]);
  }
  return "";
}


function RunSlide(objIndex) {
  if (menuObjArray[6][objIndex]) {
    if(doFading) {
      if(menuObjArray[0][objIndex].filters)
        menuObjArray[0][objIndex].filters.alpha.opacity -= 100/ ( ( (menuObjArray[2][i] * divHeight) / moveSlidePix) +1);
      else
        menuObjArray[0][objIndex].style.opacity -= .9/(((menuObjArray[2][i] * divHeight) / moveSlidePix)+1);
    }
    menuObjArray[1][objIndex].style.display = 'none';
    menuObjArray[4][objIndex] -=  moveSlidePix;
    if (menuObjArray[4][objIndex] > 0)
      menuObjArray[0][objIndex].style.height = menuObjArray[4][i] + "px";
    else {
        if(doFading) {
          if(menuObjArray[0][objIndex].filters)
            menuObjArray[0][objIndex].filters.alpha.opacity = 0;
          else
            menuObjArray[0][objIndex].style.opacity = 0;
          }
        menuObjArray[7][objIndex].className = menuObjArray[7][objIndex].className+"Over";
        menuObjArray[4][objIndex] = 0;
        menuObjArray[0][objIndex].style.height = 0 + "px";
        clearInterval(menuObjArray[5][objIndex]);
        menuObjArray[5][objIndex] = null;
        menuObjArray[6][objIndex] = false;
        isLocked = false;
        UpdateUserCookie(objIndex);
        return 0;
    }
    return 0;
  }
  if (!menuObjArray[6][objIndex]) {
    if(doFading) {
      if(menuObjArray[0][objIndex].filters)
        menuObjArray[0][objIndex].filters.alpha.opacity += 100/ ( ( (menuObjArray[2][i] * divHeight) / moveSlidePix) +1);
      else {
        opcVal = parseFloat(menuObjArray[0][objIndex].style.opacity);
        opcVal += .9/((menuObjArray[2][i] * divHeight) / moveSlidePix);
        menuObjArray[0][objIndex].style.opacity = opcVal;
      }
    }
      menuObjArray[4][objIndex] +=  moveSlidePix;
      if (menuObjArray[4][objIndex] < (menuObjArray[2][objIndex] * divHeight))
        menuObjArray[0][objIndex].style.height = menuObjArray[4][i] + "px";
      else {
        if(doFading) {
          if(menuObjArray[0][objIndex].filters)
            menuObjArray[0][objIndex].filters.alpha.opacity = 100;
          else
            menuObjArray[0][objIndex].style.opacity = 1;
        }
        strClassName = String(menuObjArray[7][objIndex].className);
        menuObjArray[7][objIndex].className = strClassName.substring(0,strClassName.length - 4);
        menuObjArray[4][objIndex] = (menuObjArray[2][objIndex] * divHeight);
        menuObjArray[0][objIndex].style.height = (menuObjArray[2][objIndex] * divHeight)+ "px";
        menuObjArray[1][objIndex].style.display = 'inline';
        clearInterval(menuObjArray[5][objIndex]);
        menuObjArray[5][objIndex] = null;
        menuObjArray[6][objIndex] = true;
        isLocked = false;
        UpdateUserCookie(objIndex);
        return 0;
      }
    return 0;
  }
}

function ChangeStyle() {
  className = String(this.className);
  if (className.substring(className.length - 4, className.length) == "Over")
    this.className = className.substring(0,className.length - 4);
  else
    this.className = this.className + "Over";
}

