﻿var iHideSubMenusTimer, objFrame, iframeCount = 0;

function fnCentreObjects(obj) {
  // let css deal with centering unless parent is too small,
  // otherwise top and left areas disappear and no way to scroll to them if too small
  // vars used to collect data, and only set objects if data changed (otherwise unwanted events)
  if ((obj == undefined) || (obj.nodeType != 1)) return; // only process actual elements that are defined
  var sClassName = obj.className, iWidth = obj.offsetWidth, iHeight = obj.offsetHeight, objStyle = obj.style;
  { // work through objects, centre them and get their bottom right positions
    var objs = obj.childNodes;
    for (var i = 0; i < objs.length; i++) {
      var aBottomRight = fnCentreObjects(objs[i]);
      if (aBottomRight != undefined) {
        var iPos = aBottomRight[0];
        if (iPos > iWidth) iWidth = iPos;
        iPos = aBottomRight[1];
        if (iPos > iHeight) iHeight = iPos;
      }
    }
  }
  if ((sClassName != undefined) && (sClassName.indexOf('AcerCentred') != -1)) {
    var objParent = obj.parentNode, objBackgroundStyle, iParentPos;
    // find parent's background image to set it's margins off screen if object being centred hits the edge
    {
      var objs = objParent.childNodes;
      for (var i = 0; i < objs.length; i++) {
        var objSibling = objs[i], sClassName = objSibling.className;
        if ((sClassName != undefined) && (sClassName.indexOf('AcerBackground') != -1)) {
          objBackgroundStyle = objSibling.style;
          break;
        }
      }
    }
    // set left position
    if (obj.offsetWidth != iWidth) objStyle.width = iWidth + 'px';
    iParentPos = objParent.offsetWidth;
    if (iParentPos > iWidth) { // use css
      if (objBackgroundStyle != undefined) {
        if (objBackgroundStyle.marginLeft != '0px') objBackgroundStyle.marginLeft = '0px';
        if (objBackgroundStyle.left != '0px') objBackgroundStyle.left = '0px';
        if (objBackgroundStyle.width != '100%') objBackgroundStyle.width = '100%';
      }
      if (objStyle.left != '50%') objStyle.left = '50%';
      var iPos = Math.ceil(iWidth / -2) + 'px';
      if (objStyle.marginLeft != iPos) objStyle.marginLeft = iPos;
    } else { // fixed left position if bigger than container
      if (objBackgroundStyle != undefined) {
        var iPos = Math.ceil((iParentPos - iWidth) / -2), sPos = iPos + 'px';
        if (objBackgroundStyle.marginLeft != sPos) objBackgroundStyle.marginLeft = sPos;
        sPos = '-' + sPos;
        if (objBackgroundStyle.left != sPos) objBackgroundStyle.left = sPos;
        sPos = 2 * iPos + iParentPos + 'px';
        if (objBackgroundStyle.width != sPos) objBackgroundStyle.width = sPos;
      }
      if (objStyle.left != '0px') objStyle.left = '0px';
      if (objStyle.marginLeft != '0px') objStyle.marginLeft = '0px';
    }
    // set top position
    if (obj.offsetHeight != iHeight) objStyle.height = iHeight + 'px';
    iParentPos = objParent.offsetHeight;
    if (iParentPos > iHeight) { // use css
      if (objBackgroundStyle != undefined) {
        if (objBackgroundStyle.marginTop != '0px') objBackgroundStyle.marginTop = '0px';
        if (objBackgroundStyle.top != '0px') objBackgroundStyle.top = '0px';
        if (objBackgroundStyle.height != '100%') objBackgroundStyle.height = '100%';
      }
      if (objStyle.top != '50%') objStyle.top = '50%';
      var iPos = Math.ceil(iHeight / -2) + 'px';
      if (objStyle.marginTop != iPos) objStyle.marginTop = iPos;
    } else { // fixed top position if bigger than container
      if (objBackgroundStyle != undefined) {
        var iPos = Math.ceil((iParentPos - iHeight) / -2), sPos = iPos + 'px';
        if (objBackgroundStyle.marginTop != sPos) objBackgroundStyle.marginTop = sPos;
        sPos = '-' + sPos;
        if (objBackgroundStyle.top != sPos) objBackgroundStyle.top = sPos;
        sPos = 2 * iPos + iParentPos + 'px';
        if (objBackgroundStyle.height != sPos) objBackgroundStyle.height = sPos;
      }
      if (objStyle.top != '0px') objStyle.top = '0px';
      if (objStyle.marginTop != '0px') objStyle.marginTop = '0px';
    }
  }
  if (obj.nodeName != 'A') { // <a> have completely meaningless offest top and left positions
    iWidth += obj.offsetLeft;
    iHeight += obj.offsetTop;
  }
  if (obj == document.body) { // fail safe to ensure sizing every second when doc not doing anything
    setTimeout(
      function fnCentreDoc() {
        if (document.readyState == 'complete') fnCentreObjects(document.body); else setTimeout(fnCentreDoc);
      }, 1000
    )
  }
  return [iWidth, iHeight];
}

function fnRemoveClassFromObjects(obj, sClass) { // work through objects and clear selected class
  {
    var objs = obj.childNodes;
    for (var i = 0; i < objs.length; i++) fnRemoveClassFromObjects(objs[i], sClass);
  }
  var sClassName = obj.className;
  if ((sClassName != undefined) && (sClassName.indexOf(sClass) != -1))
    obj.className = sClassName.replace(RegExp('\\b' + sClass + '\\b'), '')
  ;
}

function fnShowFrame() {
  var objFrameState = objFrame.contentWindow.document.readyState;
  if ((objFrameState != undefined) && (objFrameState != 'uninitialized') && (objFrame.style.visibility == 'hidden')) {
    var objFrameToHide = document.getElementById('iframeOldContent');
    objFrame.style.visibility = 'visible';
    if (objFrameToHide != undefined) objFrameToHide.parentNode.removeChild(objFrameToHide);
    objFrame.id = 'iframeOldContent';
    var objOldFrame = objFrame;
    objFrame = document.createElement('iframe');
    var objStyle = objFrame.style, objOldStyle = objOldFrame.style;
    //clone old frame without src
    objStyle.position = objOldStyle.position;
    objStyle.top = objOldStyle.top;
    objStyle.left = objOldStyle.left;
    objStyle.width = objOldStyle.width;
    objStyle.height = objOldStyle.height;
    objFrame.allowTransparency = objOldFrame.allowTransparency;
    objFrame.scrolling = objOldFrame.scrolling;
    objFrame.frameBorder = objOldFrame.frameBorder;
    objFrame.name = 'iframeAcerContent' + iframeCount;
    objFrame.id = objFrame.name;
    objFrame.style.visibility = 'hidden';
    objOldFrame.parentNode.appendChild(objFrame);
    // retarget links to new frame
    window.frames[window.frames.length - 1].name = objFrame.name;
    (function fnRetarget(obj) {
      var objs = obj.childNodes;
      for (var i = 0; i < objs.length; i++) {
        fnRetarget(objs[i]);
      }
      if ((obj.target != undefined) && (obj.target.indexOf('iframeAcerContent') != -1)) obj.target = objFrame.name;
    })(document.body);
    iframeCount++;
  } else setTimeout(fnShowFrame)
}

function fnFormatDocument(sPageSet, iThisPage) {
  //  document.body.onresize = function () { fnCentreObjects(this) }
  //stop white flash when frame documents load
  objFrame = document.getElementById('iframeAcerContent');
  if (objFrame != undefined) objFrame.style.visibility = 'hidden';
  // label links;
  var iRunningCount, iFullCount, iLastPage;
  function fnCountLinks(obj) {
    var iResult = 0;
    {
      var objs = obj.childNodes;
      for (var i = 0; i < objs.length; i++) iResult += fnCountLinks(objs[i]);
    }
    if (obj.href != undefined) {
      iResult += 1;
      if (iFullCount) {
        iRunningCount += iResult;
        if (iRunningCount == 1) i = 1; else i = iRunningCount - 1; // top level menu labelled as 1
        obj.title += ' (Page ' + i + ' of ' + iFullCount + ')';
      }
    }
    return iResult;
  }
  obj = document.getElementById('AcerMenus');
  if (obj != undefined) { // doc has menus
    fnRemoveClassFromObjects(obj, 'AcerMenuNoScript');
    var objs = obj.childNodes;
    for (var i = 0; i < objs.length; i++) {
      var objChild = objs[i];
      if ((objChild.className != undefined) && (objChild.className.indexOf('AcerMenu') != -1)) {
        iFullCount = fnCountLinks(objChild) - 1; // ignore top level menu
        if (iFullCount != 1) {
          iRunningCount = 0;
          fnCountLinks(objChild);
        }
        iRunningCount = undefined;
        iFullCount = undefined;
      }
    }
  }
  //  fnCentreObjects(document.body); // done by pure css now, but if cannot be done by css, reinstate this (and size event above)
  if ((sPageSet == undefined) || (frameElement == undefined)) return;
  var objParentDoc = frameElement.ownerDocument;
  obj = objParentDoc.getElementById('AcerMenus');
  if (obj == undefined) return; // nothing more to do, cos owning document has no acer menus
  fnRemoveClassFromObjects(obj, 'focused');
  if (iHideSubMenusTimer == undefined) parent.fnShowSubMenu(); // hide menus if none currently fading
  var objFocus = objParentDoc.getElementById('a' + sPageSet), sClassName;
  objFocus.className += ' focused';
  if (objFocus.className.indexOf('visited') == -1) objFocus.className += ' visited';
  while ((sClassName == undefined) || sClassName.indexOf('AcerMenu') == -1) { //find owning menu
    objFocus = objFocus.parentNode;
    sClassName = objFocus.className;
  }
  iLastPage = fnCountLinks(objFocus) - 1; // ignore top level menu
  //set submenu class
  var objStyle;
  obj = objParentDoc.getElementById('a' + sPageSet + '.' + iThisPage)
  if (obj != undefined) {
    // get focus off the menu
    objStyle = obj.style;
    objStyle.visibility = 'hidden';
    objStyle.visibility = ''; // back to what css has defined
    obj.className += ' focused';
    if (obj.className.indexOf('visited') == -1) obj.className += ' visited';
  }
  // set back button text and visibility
  obj = objParentDoc.getElementById('aBack');
  objStyle = obj.style;
  objStyle.visibility = 'hidden'; //so it removes focus
  objStyle.left = objFocus.offsetLeft + 'px';
  objStyle.top = objFocus.offsetTop + 'px';
  if (iThisPage == 1) {
    obj.href = sPageSet + '/' + iLastPage;
    if (iLastPage > 1) obj.title = objParentDoc.getElementById('a' + sPageSet + '.' + iLastPage).title;
  } else {
    if (iThisPage == 2) {
      obj.href = sPageSet;
    } else {
      obj.href = sPageSet + '/' + (iThisPage - 1);
    }
    if (iLastPage > 1) obj.title = objParentDoc.getElementById('a' + sPageSet + '.' + (iThisPage - 1)).title;
  }
  if ((iLastPage > 1) && ((iLastPage > 2) || (iThisPage == 2))) objStyle.visibility = 'visible';
  // set next button text and visibility
  obj = objParentDoc.getElementById('aNext');
  objStyle = obj.style;
  objStyle.visibility = 'hidden'; //so it removes focus
  objStyle.left = objFocus.offsetLeft + objFocus.offsetWidth - obj.offsetWidth + 'px';
  objStyle.top = objFocus.offsetTop + objFocus.offsetHeight - obj.offsetHeight + 'px';
  if (iThisPage == iLastPage) {
    obj.href = sPageSet;
    if (iLastPage > 1) obj.title = objParentDoc.getElementById('a' + sPageSet + '.1').title;
  } else {
    obj.href = sPageSet + '/' + (iThisPage + 1);
    if (iLastPage > 1) obj.title = objParentDoc.getElementById('a' + sPageSet + '.' + (iThisPage + 1)).title;
  }
  if ((iLastPage > 1) && ((iLastPage > 2) || (iThisPage == 1))) objStyle.visibility = 'visible';
  if (parent.fnShowFrame != undefined) setTimeout(parent.fnShowFrame);
}

function fnShowSubMenu(obj, bKeepVisible) {
  if (obj != undefined) {
    var e = window.event || fnShowSubMenu.caller.arguments[0];
    if (e != undefined) e.cancelBubble = true; // only do once
  }
  var objMenuParent = document.getElementById('AcerMenus'), iSubMenusLifetime = 3000
  if (objMenuParent == undefined) return;
  function fnSetOpacityForClassChildren(obj, sClass, dOpacity) {
    { // work through objects and set opacity on selected class
      var objs = obj.childNodes;
      for (var i = 0; i < objs.length; i++) fnSetOpacityForClassChildren(objs[i], sClass, dOpacity);
    }
    var sClassName = obj.className;
    if ((sClassName != undefined) && (sClassName.indexOf(sClass) != -1)) (
      function fnSetOpacityForChildren(obj, bSet, dOpacity) {
        { // work through objects and set opacity
          var objs = obj.childNodes;
          for (var i = 0; i < objs.length; i++) {
            var objChild = objs[i];
            fnSetOpacityForChildren(
              objChild,
              ((bSet) || ((bSet == undefined) && (objChild.nodeName == 'SPAN'))), // same as css obj > span *
              dOpacity
            );
          }
        }
        var objStyle = obj.style;
        if ((bSet) && (objStyle != undefined) && (obj.offsetWidth) && (obj.offsetHeight)) { // old browsers can't set if no size
          objStyle.opacity = dOpacity;
          objStyle.filter = 'alpha(opacity=' + (dOpacity * 100) + ')';
          if (dOpacity == 1) {
            objStyle.opacity = undefined; // gets ignored by safari and firefox - crap
            objStyle.filter = undefined; // -- "" --
          }
        }
      }
    )(obj, undefined, dOpacity);
  }
  iHideSubMenusTimer = new Date().valueOf();
  if (obj != undefined) { // undefined means 'no menu to be shown - hide all now
    var sClassName = obj.className;
    while ((sClassName == undefined) || (sClassName.indexOf('AcerMenu') == -1)) { // find top of menu
      obj = obj.parentNode;
      sClassName = obj.className
    }
    fnRemoveClassFromObjects(objMenuParent, 'AcerMenuShowing');
    obj.className += ' AcerMenuShowing'
    fnSetOpacityForClassChildren(objMenuParent, 'AcerMenuShowing', 1); // set new opacity
    if (bKeepVisible) iHideSubMenusTimer = undefined; else iHideSubMenusTimer += iSubMenusLifetime; // fade out with timer
  }
  setTimeout(
    function fnHideSubMenus() { // fade menu until timer undefined
      var iDate = new Date().valueOf();
      if (iHideSubMenusTimer) {
        if (iDate >= iHideSubMenusTimer) {
          iHideSubMenusTimer = undefined;
          fnRemoveClassFromObjects(objMenuParent, 'AcerMenuShowing');
          fnSetOpacityForClassChildren(objMenuParent, 'AcerMenu', 1); // reset opacity now hidden
        } else {
          fnSetOpacityForClassChildren(objMenuParent, 'AcerMenuShowing', (iHideSubMenusTimer - iDate) / iSubMenusLifetime);
          setTimeout(fnHideSubMenus);
        }
      }
    }
  );
}

