//Array of the menu tabs statuses (0 - minimised, 1 - maximised)
var MenuPartsStatus 	= new Array();
//Array of the menu tabs heights
var MenuPartsHeights 	= new Array();
//Array of IDs of the menu tabs
var MenuPartsIds 		= new Array();
//Menu tab ID
var _MTID = '';
//Step for the visual resizing of the menu content
var resize_step = 1;
//End height of the element needed
var end_height = 0;
//Resize tomeout
var resize_timeout = 50;


function xbDetectBrowser(){
  var oldOnError = window.onerror;
  var element = null;

  window.onerror = null;

  // work around bug in xpcdom Mozilla 0.9.1
  window.saveNavigator = window.navigator;

  navigator.OS    = '';
  navigator.version  = parseFloat(navigator.appVersion);
  navigator.org    = '';
  navigator.family  = '';

  var platform;
  if (typeof(window.navigator.platform) != 'undefined')
  {
    platform = window.navigator.platform.toLowerCase();
    if (platform.indexOf('win') != -1)
      navigator.OS = 'win';
    else if (platform.indexOf('mac') != -1)
      navigator.OS = 'mac';
    else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)
      navigator.OS = 'nix';
  }

  var i = 0;
  var ua = window.navigator.userAgent.toLowerCase();

  if (ua.indexOf('safari') != -1)
  {
    i = ua.indexOf('safari');
    navigator.family = 'safari';
    navigator.org = 'safari';
    navigator.version = parseFloat('0' + ua.substr(i+7), 10);
  }
  else if (ua.indexOf('opera') != -1)
  {
    i = ua.indexOf('opera');
    navigator.family  = 'opera';
    navigator.org    = 'opera';
    navigator.version  = parseFloat('0' + ua.substr(i+6), 10);
  }
  else if ((i = ua.indexOf('msie')) != -1)
  {
    navigator.org    = 'microsoft';
    navigator.version  = parseFloat('0' + ua.substr(i+5), 10);

    if (navigator.version < 4)
      navigator.family = 'ie3';
    else
      navigator.family = 'ie4'
  }
  else if (ua.indexOf('gecko') != -1)
  {
    navigator.family = 'gecko';
    var rvStart = ua.indexOf('rv:');
    var rvEnd   = ua.indexOf(')', rvStart);
    var rv      = ua.substring(rvStart+3, rvEnd);
    var rvParts = rv.split('.');
    var rvValue = 0;
    var exp     = 1;

    for (var i = 0; i < rvParts.length; i++)
    {
      var val = parseInt(rvParts[i]);
      rvValue += val / exp;
      exp *= 100;
    }
    navigator.version = rvValue;

    if (ua.indexOf('netscape') != -1)
      navigator.org = 'netscape';
    else if (ua.indexOf('compuserve') != -1)
      navigator.org = 'compuserve';
    else
      navigator.org = 'mozilla';
  }
  else if ((ua.indexOf('mozilla') !=-1) && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera')==-1)&& (ua.indexOf('webtv')==-1) && (ua.indexOf('hotjava')==-1))
  {
    var is_major = parseFloat(navigator.appVersion);

    if (is_major < 4)
      navigator.version = is_major;
    else
    {
      i = ua.lastIndexOf('/')
      navigator.version = parseFloat('0' + ua.substr(i+1), 10);
    }
    navigator.org = 'netscape';
    navigator.family = 'nn' + parseInt(navigator.appVersion);
  }
  else if ((i = ua.indexOf('aol')) != -1 )
  {
    // aol
    navigator.family  = 'aol';
    navigator.org    = 'aol';
    navigator.version  = parseFloat('0' + ua.substr(i+4), 10);
  }
  else if ((i = ua.indexOf('hotjava')) != -1 )
  {
    // hotjava
    navigator.family  = 'hotjava';
    navigator.org    = 'sun';
    navigator.version  = parseFloat(navigator.appVersion);
  }

  window.onerror = oldOnError;
}

xbDetectBrowser();

function ChangeStyle(Obj,CID)
{
    clickToItem(CID,0);
    var coll = document.getElementsByTagName('A');
    if (coll!=null){
        for (i=0; i<coll.length; i++){
          if(coll[i] != Obj)
              coll[i].className = "menuText";
        }
    }
    Obj.className = "menuTextB";
    if(CPID = getElementById("CBParentID"))
        if(CPID.tagName == 'INPUT' && CPID.type == 'hidden')
        {
            CPID.value = CID;
            return false;
        }
}

function arrayFind(arr,val) {
    for (var i=0;i<arr.length;i++) {
        if (arr[i] == val)
            return i;
    }
    return -1;
}

function trim(text,p)
{
    var r, str, re;
    str = new String(text)

    if(p == undefined)
        p = "\s";

    eval("re = /(^"+ p +"+)|("+ p +"+$)/g;");
    r = str.replace(re, "");
    return(r);
}

function rtrim(text,p)
{
    var r, str, re;
    str = new String(text)

    if(p == undefined)
        p = "\s";

    eval("re = /("+ p +"+$)/g;");
    r = str.replace(re, "");
    return(r);
}

function setCookie(cookieName, cookieValue, time){
    var expires = new Date();
    expires.setTime(time);
    document.cookie = cookieName + "=" + escape(cookieValue) + "; expires=" + expires.toGMTString();
}

function getCookie(cookieName) {
    var search = cookieName + "=";
    if (document.cookie.length > 0) {
        offset = document.cookie.indexOf(search);
        if (offset != -1) {
            offset += search.length;
            end = document.cookie.indexOf(";", offset);
            if (end == -1)
                end = document.cookie.length;
            return unescape(document.cookie.substring(offset, end));
        }
    }
    return false;
}

function find(text,p)
{
   var r, str, re;
   str = new String(text)

   eval("re = /"+ p +"/g;");
   r = str.search(re);
   return(r);
}

function getElementById(CID)
{
  if (document.getElementById != null)
    return document.getElementById(CID)
  if (document.all != null)
    return document.all[CID]
  return false;
}

var browserVersion,imgPath,imgsTree;
imgsTree = new Array();
imgsTree[0] = "menu_new_root.gif";
imgsTree[1] = "menu_new_root.gif";
imgsTree[2] = "menu_tee_plus.png";
imgsTree[3] = "menu_tee_minus.png";
imgsTree[4] = "menu_tee_plus.png";
imgsTree[5] = "menu_tee_minus.png";

//imgPath = "./imgs/tree/";

function preLoadImgs()
{
    var img;
    img = new Image();
    for(i=0;i<imgsTree.length;i++)
    {
      img.src = imgPath+imgsTree[i];
    }
}
preLoadImgs();

switch(navigator.family)
{
  case 'ie4':
    browserVersion = 1 //Simply means IE > 3.x
    break;
  case 'opera':
    browserVersion = (navigator.version > 6 ? 1 : 0); //opera7 has a good DOM
    break;
  case 'nn4':
    browserVersion = 2 //NS4.x
    break;
  case 'gecko':
    browserVersion = 3 //NS6.x
    break;
  case 'safari':
    browserVersion = 1 //Safari Beta 3 seems to behave like IE in spite of being based on Konkeror
    break;
  default:
    browserVersion = 0 //other, possibly without DHTML
    break;
}

function tree(CID,CPID,s,name,href,other,iconLink,addQueryString)
{
    this.CID = CID;
    this.CPID = CPID;
    this.s = (s != null)?s:'0';
    this.name = name;
    this.href = (href != null)?href:'';
    this.other = (other != null)?other:'';
	this.iconLink = (iconLink != '')?iconLink:'';
//	this.addQueryString = (typeof(addQueryString) == "undefined" || addQueryString == null || addQueryString == "")?1:addQueryString;
	this.addQueryString = addQueryString;
    this.isLastItem = true;
    this.items = new Array();
}

tree.prototype.getItemByID = function (CID)
{
    var i,tmpItem;
    tmpItem = false;
    if(this.CID == CID)
    {
        tmpItem = this;
    }
    else
    {
        for(i=0;i<this.items.length;i++)
        {
            if(tmpItem = this.items[i].getItemByID(CID))
                break;
        }
    }
    return tmpItem;
}

tree.prototype.addItem = function (CID,CPID,s,name,href,other,iconLink,addQueryString)
{
    tmpItem = this.getItemByID(CPID);
    if(tmpItem != false)
    {
        index = tmpItem.items.length;
        if(index != 0)
        {
            tmpItem.items[index-1].isLastItem = false;
        }
        tmpItem.items[index] = new tree(CID,CPID,s,name,href,other,iconLink,addQueryString);
    }
    return false;
}

tree.prototype.viewNode = function (CID,openListID,deep,CID_name,CPID_name)
{
    var i, display,link_p,title,empty_space,deep_tmp,arr,OnClick,img2,img3;
    var treeStr = "";
    if(deep == undefined)deep = "";

    display = 'none';
    if(this.CID != '0' && this.CPID != '0' && this.CPID != CID && openListID != undefined && openListID != ""){
        if(arrayFind(openListID,this.CID) != -1)
            display = 'block';
    }else if(this.CID == '0' || this.CPID == '0' || this.CPID == CID || this.CID == CID){
        display = 'block';
    }
    if(this.CID == CID)
    {
        display = 'block';
    }

    if (browserVersion == 2)
        treeStr += "<layer id='id_"+ this.CID + "' top=" + document.yPos + " visibility=show>";
    else if (browserVersion != 0)
        treeStr += "<div id='id_"+ this.CID + "' style='display:"+display+"; position:block;' noWrap>";

    link_p = "";

    if(this.addQueryString == 1)
    {
	    link_p += "s="+this.s;
    	link_p += "&"+((CID_name == undefined)?"CID":CID_name)+"="+this.CID;
	    link_p += "&"+((CPID_name == undefined)?"CPID":CPID_name)+"="+this.CPID;
    	link_p += (this.other != "")?"&"+trim(this.other,"&"):"";
	}

    if(this.href != "")
        title = '<a class="menuText" href="'+this.href+((link_p != "")?'?'+rtrim(link_p,'&'):'')+'" OnClick="return ChangeStyle(this,\''+this.CID+'\')"><nobr>'+this.name+'</nobr></a><br>';
    else
        title = '<font class="menuText"><nobr>'+this.name+'</nobr></font><br>';

    empty_space = "";
    if(deep != "")
    {
        arr = deep.split(",");
        for(i=1;i<arr.length;i++)
        {
            empty_space += '<td><img src="'+ imgPath +((arr[i] == "false")?"menu_bar.gif":"menu_pixel.gif")+'" class="menu_img" hspace="0" vspace="0" width="18"><br></td>';
        }
    }

    img2 = imgsTree[0];
    if(!this.isLastItem && this.items.length == 0)
    {
        img2 = imgsTree[1];
    }
    if(!this.isLastItem && this.items.length != 0)
    {
        img2 = imgsTree[2];
        if(this.CID == CID)
        {
            img2 = imgsTree[3];
        }
        else
        {
            for(i=0;i<this.items.length;i++)
            {
                if(find(openListID,this.items[i].CID) != -1)
                {
                    img2 = imgsTree[3];
                    break;
                }
            }
        }
    }
    if(this.isLastItem && this.items.length != 0)
    {
        img2 = imgsTree[4];
        if(this.CID == CID)
        {
            img2 = imgsTree[5];
        }
        else
        {
            for(i=0;i<this.items.length;i++)
            {
                if(find(openListID,this.items[i].CID) != -1)
                {
                    img2 = imgsTree[5];
                    break;
                }
            }
        }
    }

    img3 = (this.items.length != 0)?"menu_folder_closed.gif":"menu_link_local.gif";
    OnClick = '';
    if(img2 != imgsTree[0] && img2 != imgsTree[1])
    {
        OnClick = ' OnClick="clickToItem(\''+this.CID+'\',1)"';
    }

    treeStr += '<table cellpadding="0" cellspacing="0" border="0">';
    treeStr += '<tr>';

    if(deep != 0 )
    {
        treeStr += '  <td>';
        treeStr += '    <table width="100%" cellpadding="0" cellspacing="0" border="0">';
        treeStr += '    <tr>';
        treeStr += empty_space;
        treeStr += '      <td><img id="img_'+this.CID+'" src="'+ imgPath + img2+'" class="menu_img" hspace="0" vspace="0"'+OnClick+'><br></td>';
        treeStr += '      <td><img src="'+ imgPath + img3+'" class="menu_img" hspace="0" vspace="0"><br></td>';
        treeStr += '    </tr>';
        treeStr += '    </table>';
        treeStr += '  </td>';
    }
    else
    {
        treeStr += '  <td>';
        treeStr += '    <img src="'+ imgPath +'menu_new_root.gif" class="menu_img" hspace="0" vspace="0"><br>';
        treeStr += '  </td>';
    }

    treeStr += '  <td width="100%" valign="top">'+title+'</td>';
    treeStr += '</tr>';
    treeStr += '</table>';


    deep_tmp = (deep != "")?deep+","+this.isLastItem:""+this.isLastItem;

    for(i=0;i<this.items.length;i++)
    {
        treeStr += this.items[i].viewNode(CID,openListID,deep_tmp,CID_name,CPID_name);
    }

    if (browserVersion == 2)
        treeStr += "</layer>"
    else if (browserVersion != 0)
        treeStr += "</div>"
    return treeStr;
}

tree.prototype.openListID = function (CID,obj,list_id)
{
    var tmpItem;
    if(obj == undefined)
    {
        obj = this;
    }

    tmpItem = obj.getItemByID(CID);

    if(tmpItem != false && tmpItem.CPID != '0')
    {
        if(arrayFind(list_id,this.CID) == -1)
            list_id[list_id.length] = tmpItem.CPID;

        siblingItem = obj.getItemByID(tmpItem.CPID); //find items sibling
        if(siblingItem != false)
        {
            for(i=0;i<siblingItem.items.length;i++)
            {
                if(arrayFind(list_id,siblingItem.items[i].CID) == -1)
                    list_id[list_id.length] = siblingItem.items[i].CID;
            }
        }
        tmpItem.openListID(tmpItem.CPID,obj,list_id);
    }
}

tree.prototype.viewTree = function (CID,CID_name,CPID_name)
{
    var treeStr,openListID;
    openListID = "";
    if(CID == undefined || CID == 0)
       CID = this.CID;

    openListID = new Array();
    this.openListID(CID,this,openListID);

    treeStr = this.viewNode(CID,openListID,0,CID_name,CPID_name);
    document.write("<div id=menu noWrap>"+treeStr+"</div>");
}

function createMenuFromXML(obj,objMenu)
{
    var oNodeList,tmpItem,href,other,iconLink,s;
    s = (obj.getAttribute("s") == null)?"":obj.getAttribute("s");
    href = (obj.getAttribute("href") == null)?"":obj.getAttribute("href");
    other = (obj.getAttribute("other") == null)?"":obj.getAttribute("other");
    iconLink = (obj.getAttribute("iconLink") == null)?"":obj.getAttribute("iconLink");

    objMenu.addItem(obj.getAttribute("CID"),obj.getAttribute("CPID"),s,obj.getAttribute("name"),href,other,iconLink);
    if(obj.childNodes.length != 0)
    {
        oNodeList = obj.childNodes;
        for (var i=0; i<oNodeList.length; i++)
        {
            createMenuFromXML(oNodeList.item(i),objMenu);
        }
    }
}

function clickToItem(CID,openParam)
{
    var coll,src,imgID;
    obj = getElementById("id_"+CID);

    coll = obj.childNodes;
    if (coll!=null)
    {
        var today = new Date();
        setCookie('OpenCID',CID,today.getTime() + 1000*60*60);
        objImg = getElementById("img_"+CID);
        imgID = 0;
        for(i=1;i<imgsTree.length;i++)
        {
            if(objImg != null && find(objImg.src,imgsTree[i]) != -1)
            {
                imgID = i;
                break;
            }
        }

        if(imgID > 1)
        {
            src = "";
            switch(imgID)
            {
                case 2:
                    src = imgsTree[3];
                break;
                case 3:
                    if(openParam != 0)src = imgsTree[2];
                break;
                case 4:
                    src = imgsTree[5];
                break;
                case 5:
                    if(openParam != 0)src = imgsTree[4];
                break;
            }
            if(src != "")
                objImg.src = imgPath + src;
        }

        for (i=0; i<coll.length; i++)
        {
            if(coll[i].tagName == 'DIV')
            {
                if((imgID == 2 || imgID == 4) || (openParam == 0))
                    coll[i].style.display = "block";
                else
                    coll[i].style.display = "none";
            }
        }
    }
}

function ChangeStyle(Obj){
    var coll = document.all.tags("A");
    if (coll!=null)
    {
        for (i=0; i<coll.length; i++)
        {
          if(coll[i] != Obj && coll[i].nomenulink ==undefined )
          	coll[i].className = "menuText";
        }
    }
    Obj.className = "menuTextB";
}



function ResizeMenuContent(){
	if (resize_step == 0  || _MTID=='')
		return false;

	_obj = document.getElementById(_MTID);

	objH = _obj.style.height;
	re = /%/g;
	if (re.test(objH))
		objH = _obj.scrollHeight;

	objH = ''+objH;
	re = /[^0-9]/g;
	objH = objH.replace(re,'');
	objH = Math.round(objH);

	if (Math.abs(end_height-objH) < Math.abs(resize_step)){
		objH = _obj.style.height = end_height+1;
	}else
		objH = _obj.style.height = objH + resize_step;

	if (objH<1)
		objH = _obj.style.height = 1;

	//
	if (resize_step < 0){
		if (objH==(end_height+1))
			return true;
	}
	else
		if (objH>=end_height){
			_obj.style.height = '';
			document.getElementById(_MTID).style.overflow = 'visible';
			return true;
		}

	window.setTimeout("ResizeMenuContent()", resize_timeout);
	return true;
}




function HideMenuContent(_objID){
	_objH = document.getElementById(_objID).scrollHeight;

	id_key = GetKeyByValue(MenuPartsIds, _objID);
	if (id_key==undefined){
		id_key = MenuPartsIds.length +1	;
		MenuPartsIds[id_key]	= _objID;
		MenuPartsHeights[id_key]= _objH;
	}

	_MTID 		= _objID;
	resize_step = -Math.round(_objH / 3);
	end_height	= 0;
//	alert(resize_step);
//	resize_timeout = 10;
	ResizeMenuContent();
	MenuPartsStatus[id_key] = 0;
}

function ShowMenuContent(_objID){
	id_key = GetKeyByValue(MenuPartsIds, _objID);
	if (id_key==undefined)
		return;
	_MTID 		= _objID;
	end_height	= MenuPartsHeights[id_key];
	resize_step = Math.round(end_height / 3);
	ResizeMenuContent();
	MenuPartsStatus[id_key] = 1;
}

function SHMenuTab(_refObj, _objID){
	id_key = GetKeyByValue(MenuPartsIds, _objID);
	if (id_key==undefined || MenuPartsStatus[id_key]==1){
		document.getElementById(_objID).style.overflow = 'hidden';
		HideMenuContent(_objID);
		re = /sh_hide/g;
		_refObj.src = _refObj.src.replace(re, 'sh_show');
		_refObj.alt = 'Show';
	}else{
		ShowMenuContent(_objID);
		re = /sh_show/g;
		_refObj.src = _refObj.src.replace(re, 'sh_hide');
		_refObj.alt = 'Hide';
	}
}

function GetKeyByValue(_array, _val){
	a_key = undefined;
	//Retriving menu tab height
	for(i=0;i<_array.length;i++)
		if (_array[i]==_val){
			a_key = i;
			break;
		}
	return a_key;
}
