var menuIdString = '';
var menuTimer;
var menuDelay = 2000;
var menuSegmentActive = null;;
var menuElementActive = null;;

function MenuPosition(x, y) {
  this.x=x;
  this.y=y;
}

function MenuAttribute(name, value) {
  this.name=name;
  this.value=value;
}

function MenuMenu() {
  this.anchor=null;
  this.x=null;
  this.y=null;
}
  
function MenuSegment(menu, element) {
  this.template=null;
  this.anchor=null;
  this.x=null;
  this.y=null;
  this.offsetX=null;
  this.offsetY=null;
  this.absOffsetX=null;
  this.absOffsetY=null;
  this.width=null;
  this.height=null;
  this.title=null;
  this.menu=menu;
  this.element=element;
}

function MenuElement(segment) {
  this.idString=null;
  this.template=null;
  this.width=null;
  this.height=null;
  this.href=null;
  this.target=null;
  this.image=null;
  this.label=null;
  this.title=null;
  this.segment=segment;
}

function menuBuild(sd, d) {
  var sTpl, eTpl;
  var e, sel, img;
  var ah = false;
  if(d != undefined)
    menuDelay = d;
  menuMenu = new Array();
  menuSegment = new Array();
  menuElement = new Array();
  menuDataGetObject(0, -1, 0, -1, 0, true);
  for(var is = 0; is < menuSegment.length; is++) {
    e = '';
    for(var ie = 0; ie < menuElement.length; ie++) {
      if(menuElement[ie].segment == is) {
        if(menuElementCheckSelected(ie, sd)) {
          eval('eTpl = '+menuElement[ie].template+(menuElement[ie].label==null&&menuElement[ie].image==null?'Sep':'Sel')+';');
//          img = menuNVL(menuElement[ie].href, menuNVL(menuElement[ie].image, ''), menuNVL(menuElement[ie].image, '').replace(".", "_click_out."));
          img = menuNVL(menuElement[ie].image, '').replace(".", "_click_out.");
        } else {
          eval('eTpl = '+menuElement[ie].template+(menuElement[ie].label==null&&menuElement[ie].image==null?'Sep':'Uns')+';');
//          img = menuNVL(menuElement[ie].href, menuNVL(menuElement[ie].image, ''), menuNVL(menuElement[ie].image, '').replace(".", "_out."));
          img = menuNVL(menuElement[ie].image, '').replace(".", "_out.");
        }
        eTpl = eTpl.replace(/<WIDTH \/>/gi, menuNVL(menuElement[ie].width, ''));
        eTpl = eTpl.replace(/<HEIGHT \/>/gi, menuNVL(menuElement[ie].height, ''));
        eTpl = eTpl.replace(/<HREF \/>/gi, menuNVL(menuElement[ie].href, '').replace(/'/g, "\\'"));
        eTpl = eTpl.replace(/<TARGET \/>/gi, menuNVL(menuElement[ie].target, ''));
        eTpl = eTpl.replace(/<IMAGE \/>/gi, img);
        eTpl = eTpl.replace(/<LABEL \/>/gi, menuNVL(menuElement[ie].label, ''));
        eTpl = eTpl.replace(/<TITLE \/>/gi, menuNVL(menuElement[ie].title, ''));
        eTpl = eTpl.replace(/<ACTIVE \/>/gi, menuNVL(menuElement[ie].href, '_i', ''));
        eTpl = eTpl.replace(/<ID \/>/gi, 'menuElement_'+ie);
        eTpl = eTpl.replace(/<IMAGEID \/>/gi, 'menuElementImage_'+ie);
        e += eTpl;
      }
    }
    eval('sTpl = '+menuSegment[is].template+(menuSegmentCheckSelected(is, sd)?'Sel':'Uns')+';');
    sTpl = sTpl.replace(/<ELEMENTS \/>/gi, e);
    sTpl = sTpl.replace(/<WIDTH \/>/gi, menuNVL(menuSegment[is].width, ''));
    sTpl = sTpl.replace(/<HEIGHT \/>/gi, menuNVL(menuSegment[is].height, ''));
    sTpl = sTpl.replace(/<TITLE \/>/gi, menuNVL(menuSegment[is].title, ''));
    if(menuSegment[is].element == null && menuMenu[menuSegment[is].menu].anchor == null && menuMenu[menuSegment[is].menu].x == null && menuMenu[menuSegment[is].menu].y == null) {
      document.write(sTpl);
    } else {
      if(menuSegment[is].element == null && menuMenu[menuSegment[is].menu].anchor != null) {
        if(!ah) {
          ah = true;
          var currentHook = window.onload==undefined?null:window.onload.toString();
          if(currentHook == undefined) {
            window.onload = menuAnchorHook;
          } else {
            if(currentHook.lastIndexOf("}") != -1)
              window.onload = new Function("event", currentHook.substring(currentHook.indexOf("{")+1, currentHook.lastIndexOf("}")-1)+"\nmenuAnchorHook();\n");
            else
              window.onload = menuAnchorHook;
          }
          var currentHook = window.onresize==undefined?null:window.onresize.toString();
          if(currentHook == undefined) {
            window.onresize = menuAnchorHook;
          } else {
            if(currentHook.lastIndexOf("}") != -1)
              window.onresize = new Function("event", currentHook.substring(currentHook.indexOf("{")+1, currentHook.lastIndexOf("}")-1)+"\nmenuAnchorHook();\n");
            else
              window.onresize = menuAnchorHook;
          }
        }
        var p = menuObjectPositionById(menuMenu[menuSegment[is].menu].anchor);
        document.write('<div id="menuSegment_'+is+'" style="'+
          'position: absolute;'+
          (p != null ? ' visibility: visible;' : ' visibility: hidden;')+
          (p != null ? ' left: '+p.x+'px;' : '')+
          (p != null ? ' top: '+p.y+'px;' : '')+
          '" onMouseOver="try {menuSegOver(this);} catch(ex) {}" onMouseOut="try {menuSegOut(this);} catch(ex) {}">'+
          sTpl+
          '</div>');
      } else {
        document.write('<div id="menuSegment_'+is+'" style="'+
          'position: absolute;'+
          ' visibility:'+
          (menuSegment[is].element == null ?
            ' visible;'+
            (menuMenu[menuSegment[is].menu].x != null ? ' left: '+menuMenu[menuSegment[is].menu].x+'px;' : '')+
            (menuMenu[menuSegment[is].menu].y != null ? ' top: '+menuMenu[menuSegment[is].menu].y+'px;' : '')
          :
            ' hidden;'
          )+
          '" onMouseOver="try {menuSegOver(this);} catch(ex) {}" onMouseOut="try {menuSegOut(this);} catch(ex) {}">'+
          sTpl+
          '</div>');
      }
    }
  }
}

function menuElementCheckSelected(ie, sd) {
  switch(sd) {
    case 0 :
      if(menuIdString != '' && menuElement[ie].idString == menuIdString)
        return true;
      break;
    case 1 :
      if(menuElement[ie].idString == window.location.href)
        return true;
      break;
    case 2 :
      if(window.location.href.indexOf(menuElement[ie].idString) != -1)
        return true;
      break;
  }
  var is = 0;
  while(is < menuSegment.length) {
    if(menuSegment[is].element == ie)
      if(menuSegmentCheckSelected(is, sd))
        return true;
    is++;
  }
  return false;
}

function menuSegmentCheckSelected(is, sd) {
  var ie = 0;
  while(ie < menuElement.length) {
    if(menuElement[ie].segment == is)
      if(menuElementCheckSelected(ie, sd))
        return true;
    ie++;
  }
  return false;
}

function menuDataGetObject(xo, im, imo, is, iso, root) {
  var xo = menuData.indexOf("<", xo);
  var a, ai;
  if(xo == -1) {
  } else if(menuData.substr(xo, 5) == "<data") {
    menuDataGetObject(xo+1, im, imo, is, iso, true);
  } else if(menuData.substr(xo, 6) == "</data") {
    menuDataGetObject(xo+1, im, imo, is, iso, true);
  } else if(menuData.substr(xo, 5) == "<menu") {
    ai = menuMenu.length;
    menuMenu[ai] = new MenuMenu();
    a = menuDataGetAttributes(xo);
    for(var i=0; i < a.length; i++)
      eval('menuMenu['+ai+'].'+a[i].name+' = "'+a[i].value+'";');
    menuDataGetObject(xo+1, ai, im, is, iso, true);
  } else if(menuData.substr(xo, 6) == "</menu") {
    menuDataGetObject(xo+1, imo, imo, is, iso, true);
  } else if(menuData.substr(xo, 8) == "<segment") {
    ai = menuSegment.length;
    menuSegment[ai] = new MenuSegment(im, root?null:menuElement.length-1);
    a = menuDataGetAttributes(xo);
    for(var i=0; i < a.length; i++)
      eval('menuSegment['+ai+'].'+a[i].name+' = "'+a[i].value+'";');
    menuDataGetObject(xo+1, im, imo, ai, is, false);
  } else if(menuData.substr(xo, 9) == "</segment") {
    menuDataGetObject(xo+1, im, imo, iso, iso, root);
  } else if(menuData.substr(xo, 8) == "<element") {
    ai = menuElement.length;
    menuElement[ai] = new MenuElement(is);
    a = menuDataGetAttributes(xo);
    for(var i=0; i < a.length; i++)
      eval('menuElement['+ai+'].'+a[i].name+' = "'+a[i].value+'";');
    menuDataGetObject(xo+1, im ,imo, is, iso, root);
  } else if(menuData.substr(xo, 9) == "</element") {
    menuDataGetObject(xo+1, im ,imo, is, iso, root);
  }
}

function menuDataGetValue(xo) {
  var ao = menuData.indexOf(">", xo);
  if(menuData[ao-1] == "/")
    return null;
  return menuData.substring(ao+1, menuData.indexOf("</", ao));
}

function menuDataGetAttributes(xo) {
  var co = menuData.indexOf(">", xo);
  var ao = menuData.indexOf(" ", xo);
  var a = new Array();
  while(ao != -1 && ao < co && co-ao > 2) {
    ao++;
    co = menuData.indexOf("=", ao);
    xo = menuData.indexOf("\"", co+2);
    a[a.length] = new MenuAttribute(menuData.substring(ao, co), menuData.substring(co+2, xo));
    co = menuData.indexOf(">", xo);
    ao = menuData.indexOf(" ", xo);
  }
  return a;
}

function menuObjectPositionById(i) {
  try {
    return menuObjectPosition(document.getElementById(i));
  } catch(ex) {
    return null;
  }
}

function menuObjectPosition(o) {
  var p = new MenuPosition(o.offsetLeft, o.offsetTop);
  while(o.offsetParent) {
    o = o.offsetParent;
    p.x += o.offsetLeft;
    p.y += o.offsetTop;
  }
  return p;
}

function menuElClick(o, h, t) {
  try {
    if(h != '') {
      menuKeep();
      menuSegmentActive = null;
      menuElementActive = null;
      menuHide(0);
      if(t != '')
        newwindow=window.open(h, t);
      else
        window.location=h;
    }
  } catch(ex) {}
}

function menuElOver(o) {
  try {
    menuKeep();
    var ps;
    var p = menuObjectPosition(o);
    var img = document.getElementById(o.id.replace('_', 'Image_'));
    if(img != undefined)
      img.src = img.src.replace('_out.', '_over.');
    var e = o.id.replace('menuElement_', '');
    o.className = o.className.replace('_out', '_over');
    menuElementActive = e;
    for(var is = 0; is < menuSegment.length; is++)
      if(menuSegment[is].element == e) {
        var x=0, y=0;
        if(menuSegment[is].anchor != null) {
          ps = menuObjectPositionById(menuSegment[is].anchor);
          x = ps.x;
          y = ps.y;
        } else {
          if(menuSegment[is].x != null) {
            x = menuSegment[is].x;
          } else if(menuSegment[is].offsetX != null) {
            if(menuSegment[is].offsetX == "+")
              x = p.x + o.offsetWidth;
            else if(menuSegment[is].offsetX == "-")
              x = p.x - document.getElementById('menuSegment_'+is).offsetWidth;
            else if(menuSegment[is].offsetX > 0)
              x = p.x + o.offsetWidth + parseInt(menuSegment[is].offsetX);
            else if(menuSegment[is].offsetX < 0)
              x = p.x - document.getElementById('menuSegment_'+is).offsetWidth + parseInt(menuSegment[is].offsetX);
            else
              x = p.x;
          } else if(menuSegment[is].absOffsetX != null) {
            x = p.x + parseInt(menuSegment[is].absOffsetX);
          }
          if(menuSegment[is].y != null) {
            y = menuSegment[is].y;
          } else if(menuSegment[is].offsetY != null) {
            if(menuSegment[is].offsetY == "+")
              y = p.y + o.offsetHeight;
            else if(menuSegment[is].offsetY == "-")
              y = p.y - document.getElementById('menuSegment_'+is).offsetHeight;
            else if(menuSegment[is].offsetY > 0)
              y = p.y + o.offsetHeight + parseInt(menuSegment[is].offsetY);
            else if(menuSegment[is].offsetY < 0)
              y = p.y - document.getElementById('menuSegment_'+is).offsetHeight + parseInt(menuSegment[is].offsetY);
            else
              y = p.y;
          } else if(menuSegment[is].absOffsetY != null) {
            y = p.y + parseInt(menuSegment[is].absOffsetY);
          }
        }
        document.getElementById('menuSegment_'+is).style.left = x+"px";
        document.getElementById('menuSegment_'+is).style.top = y+"px";
        document.getElementById('menuSegment_'+is).style.zIndex = 100;
        document.getElementById('menuSegment_'+is).style.visibility = "visible";
      }
    menuHide(0);
  } catch(ex) {}
}

function menuElOut(o) {
  try {
    var img = document.getElementById(o.id.replace('_', 'Image_'));
    if(img != undefined)
      img.src = img.src.replace('_over.', '_out.');
    o.className = o.className.replace('_over', '_out');
    menuElementActive = null;
    menuHide(menuDelay);
  } catch(ex) {}
}

function menuSegOver(o) {
  try {
    menuKeep();
    menuSegmentActive = o.id.replace('menuSegment_', '');
  } catch(ex) {}
}

function menuSegOut(o) {
  try {
    if(menuSegmentActive != null) {
      menuSegmentActive = null;
      menuHide(menuDelay);
    }
  } catch(ex) {}
}

function menuHide(f) {
  menuKeep();
  if(f==0) {
    for(var is = 0; is < menuSegment.length; is++)
      if(!menuSegmentCheckChild(is))
        document.getElementById('menuSegment_'+is).style.visibility = "hidden";
  } else {
    menuTimer = setTimeout("try {menuHide(0);} catch(ex) {}", f);
  }
}

function menuKeep() {
  try {
    clearTimeout(menuTimer);
    menuTimer = null;
  } catch(ex) {}
}

function menuSegmentCheckChild(is) {
  if(menuSegmentActive == is || menuSegment[is].element == null || menuSegment[is].element == menuElementActive)
    return true;
  if(document.getElementById('menuSegment_'+is).style.visibility == "visible") {
    var ie = 0;
    while(ie < menuElement.length) {
      if(menuElement[ie].segment == is)
        if(menuElementCheckChild(ie))
          return true;
      ie++;
    }
  }
  return false;
}

function menuElementCheckChild(ie) {
  if(menuElementActive == ie)
    return true;
  var is = 0;
  while(is < menuSegment.length) {
    if(menuSegment[is].element == ie)
      if(menuSegmentCheckChild(is))
        return true;
    is++;
  }
  return false;
}

function menuNVL(t, nv, v) {
  return (t == null?nv:(v == undefined?t:v));
}

function menuAnchorHook(e) {
  for(var i = 0; i < menuMenu.length; i++)
    if(menuMenu[i].anchor != null)
      for(var j = 0; j < menuSegment.length; j++)
        if(menuSegment[j].element == null && menuSegment[j].menu == i) {
          var p = menuObjectPositionById(menuMenu[i].anchor);
          if(p != null) {
            document.getElementById('menuSegment_'+j).style.visibility = "visible";
            document.getElementById('menuSegment_'+j).style.left = p.x+"px";
            document.getElementById('menuSegment_'+j).style.top = p.y+"px";
          }
       }
}
