var m_bUnloading = false;
var m_tvClosefolder="../images/plus.gif"; //set image path to "closed" folder image
var m_tvOpenfolder="../images/minus.gif"; //set image path to "open" folder image

// Modified from Dynamic Drive DHTML code library (www.dynamicdrive.com)
var m_aTree = new Array();

function bt_create_tree(appid, treeid, enablepersist, persistdays)
{
  var oTree = document.getElementById(treeid);
  
  oTree.appid = appid;
  oTree.treeid = treeid;
  
// Fix jumping tree problem
    var atags=oTree.getElementsByTagName("a");
    for (var i=0; i< atags.length; i++){
        atags[i].onclick=function(e)
        {
         m_bUnloading=true;
        }
    }

  oTree.AppTreeKey = appid + treeid;
  
  var ultags=oTree.getElementsByTagName("ul");
  
   if (enablepersist==true)
   {
    var sState = fn_getCookie(oTree.AppTreeKey);
    if (sState != null)
       oTree.persisteduls = sState.split(",");
   }
  
    for (var i=0; i<ultags.length; i++)
      fn_buildSubTree(treeid, ultags[i], i);
      
    if (enablepersist==true){ //if enable persist feature
      oTree.enablepersist=enablepersist;
      var durationdays=(typeof persistdays=="undefined")? 1 : parseInt(persistdays);
      oTree.durationdays=durationdays;
      
//    this.dotask(window, function(){this.rememberstate(treeid, durationdays)}, "unload"); //save opened UL indexes on body unload
    }
    
 var nIndex = m_aTree.length;
 m_aTree[nIndex] = oTree;

 return oTree;
}


function fn_buildSubTree(treeid, ulelement, index)
{
    var oTree = document.getElementById(treeid);

    ulelement.parentNode.className="submenu";
    
    if (ulelement.getAttribute("rel")=="open")
       fn_expandSubTree(treeid, ulelement);  //expand this UL plus all parent ULs (so the most inner UL is revealed!)
    else
    {
     if (typeof oTree.persisteduls=="object"){ //if cookie exists (persisteduls[treeid] is an array versus "" string)
       if (fn_searcharray(oTree.persisteduls, index)){
         ulelement.setAttribute("rel", "open");
         ulelement.style.display="block";
         ulelement.parentNode.style.backgroundImage="url("+m_tvOpenfolder+")";
       }
       else
         ulelement.setAttribute("rel", "closed");
        
     } //end cookie persist code
     else
         ulelement.setAttribute("rel", "closed");
    }     
      
    ulelement.parentNode.onclick=function(e){

    if (m_bUnloading)
        return;
    
      var submenu=this.getElementsByTagName("ul")[0];
            
      if (submenu.getAttribute("rel")=="closed"){
        submenu.style.display="block";
        submenu.setAttribute("rel", "open");
        ulelement.parentNode.style.backgroundImage="url("+m_tvOpenfolder+")";
        
        var nTreeId = submenu.getAttribute("flag");
        if (nTreeId != null) {
           fn_expand_all_children (submenu);  //expand this UL plus all parent ULs (so the most inner UL is revealed!)
        }

      }
      else if (submenu.getAttribute("rel")=="open"){
        submenu.style.display="none";
        submenu.setAttribute("rel", "closed");
        ulelement.parentNode.style.backgroundImage="url("+m_tvClosefolder+")";
      }
      
      fn_preventpropagate(e);
      
      
    }
    
    ulelement.onclick=function(e){
      fn_preventpropagate(e);
    }
  }
  
 function fn_expandSubTree(treeid, ulelement)
 { //expand a UL element and any of its parent ULs
    var rootnode=document.getElementById(treeid);
    var currentnode=ulelement;
    
    currentnode.style.display="block";
    currentnode.parentNode.style.backgroundImage="url("+m_tvOpenfolder+")";
    
    while (currentnode!=rootnode){
      if (currentnode.tagName=="UL"){ //if parent node is a UL, expand it too
        currentnode.style.display="block";
        currentnode.setAttribute("rel", "open"); //indicate it's open
        currentnode.parentNode.style.backgroundImage="url("+m_tvOpenfolder+")";
      }
      
      currentnode=currentnode.parentNode;
    }
}

function fn_flatten (treeid, action){ //expand or contract all UL elements
    var ultags=document.getElementById(treeid).getElementsByTagName("ul");
    
    for (var i=0; i<ultags.length; i++){
      ultags[i].style.display=(action=="expand")? "block" : "none";
      var relvalue=(action=="expand")? "open" : "closed";
      ultags[i].setAttribute("rel", relvalue);
      ultags[i].parentNode.style.backgroundImage=(action=="expand")? "url("+m_tvOpenfolder+")" : "url("+m_tvClosefolder+")";
    }
}

function fn_preventpropagate(e){ //prevent action from bubbling upwards
    if (typeof e!="undefined")
      e.stopPropagation();
    else
      event.cancelBubble=true;
}


function fn_save_tree_state ()
{
 var nIndex;
 var oTree;
 
 for (nIndex = 0; nIndex < m_aTree.length; nIndex++)
 {
  oTree = m_aTree[nIndex];
  if (oTree.enablepersist)
     fn_rememberstate (oTree.appid, oTree.treeid, oTree.durationdays);
 }
}

function fn_rememberstate (appid, treeid, durationdays){ //store index of opened ULs relative to other ULs in Tree into cookie
    var ultags=document.getElementById(treeid).getElementsByTagName("ul");
    var openuls=new Array();
    for (var i=0; i<ultags.length; i++){
      if (ultags[i].getAttribute("rel")=="open")
        openuls[openuls.length]=i; //save the index of the opened UL (relative to the entire list of ULs) as an array element
    }
    if (openuls.length==0) //if there are no opened ULs to save/persist
      openuls[0]="none open"; //set array value to string to simply indicate all ULs should persist with state being closed
    
    var AppTreeKey = appid + treeid;
    fn_setCookie(AppTreeKey, openuls.join(","), durationdays); //populate cookie with value treeid=1,2,3 etc (where 1,2... are the indexes of the opened ULs)
  }

function fn_dotask(target, functionref, tasktype){ //assign a function to execute to an event handler (ie: onunload)
    var tasktype=(window.addEventListener)? tasktype : "on"+tasktype;
    if (target.addEventListener)
      target.addEventListener(tasktype, functionref, false);
    else if (target.attachEvent)
      target.attachEvent(tasktype, functionref);
  }


// Utility functions
function fn_searcharray(thearray, value){ //searches an array for the entered value. If found, delete value from array
    var isfound=false;
    for (var i=0; i<thearray.length; i++){
      if (thearray[i]==value){
        isfound=true;
        thearray.shift(); //delete this element from array for efficiency sake
        break;
      }
    }
    
    return isfound;
}


function fn_getCookie(Name){ //get cookie value
    var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair
    if (document.cookie.match(re)) //if cookie found
      return document.cookie.match(re)[0].split("=")[1]; //return its value
    return "";
  }
  
function fn_setCookie(name, value, days){ //set cookie value
//    var dt = new Date();
//    //set "expireDate" to either future or past date, to set or delete cookie, respectively
//    var expireDate = dt.setDate(dt.getDate()+parseInt(days));
//    document.cookie = name+"="+value+"; expires="+expireDate.toGMTString()+"; path=/";;

    document.cookie = name+"="+value+"; path=/";;
}

function toggleMore(idMore) {
  var more = document.getElementById(idMore);
  var morebtn = document.getElementById("btn" + idMore);
  
  if (more.style.display == "none") {
    more.style.display="block";
    morebtn.src="../images/minus.gif";  
//    more.scrollIntoView(true);
  }
  else
  {
    more.style.display="none";
    morebtn.src="../images/plus.gif";  
  }
}

function fn_expand_all_children (piNode){ //expand all UL child elements
    var ultags=piNode.getElementsByTagName("ul");

    for (var i=0; i<ultags.length; i++){
      ultags[i].style.display="block";
      ultags[i].setAttribute("rel", "open");
      ultags[i].parentNode.style.backgroundImage="url("+m_tvOpenfolder+")";
    }
}

