/* PAGE INITIALIZATION FUNCTIONS */
var addEvent = function(obj, type, fn) { //http://www.ilfilosofo.com/blog/2008/04/14/addevent-preserving-this/
  if (obj.addEventListener) {
    obj.addEventListener(type, fn, false);
  } else if (obj.attachEvent) {
    obj.attachEvent('on' + type, function() { return fn.apply(obj, new Array(window.event));});
  }
}
addEvent(window, 'load', preProcessPage);

function preProcessPage() {
	if (!document.getElementsByTagName || (!document.getElementById || (!document.createElement || !document.createTextNode))) return false;
	processPage();
}

function processPage() {
  setHoverLinks();
  processLinks();
  processInputs();
  processDivs();
  processForms();
}

/* INDIVIDUAL ELEMENT INITIALIZATIONS */
function processForms() {
  var theForms = document.getElementsByTagName("form");
  var fixForm = function(theElement) {
    if (hasClassHook(theElement)) {
      if (/js_actionHover/.test(theElement.className)) {
        theElement.onmouseover = function() {
          addClass(this,'active');
        }
        theElement.onmouseout = function() {
          removeClass(this,'active');
        }
        theElement.onclick = function() {
          doActionClick(this);
          return false;
        }
      }
    }
  }
  forEach(theForms,fixForm);
}

function doActionClick(theElement) {
  var allLinks = theElement.getElementsByTagName('a');
  var linkFound = false;
  var fixLink = function(theLink) {
    if (theLink.className && /js_actionTrigger/.test(theLink.className)) {
      linkFound = theLink;
    }
  }
  forEach(allLinks,fixLink);
  if (linkFound != false) {
    document.location.href = linkFound.href;
  }
}

function processDivs() {
  var theDivs = document.getElementsByTagName("div");
  var fixDiv = function(theElement) {
    if (hasClassHook(theElement)) {
      if (/js_formSubmit/.test(theElement.className)) {
        theElement.onclick = function() {
          doDivSubmit(this);
        }
      }
      if (/js_hoverActive/.test(theElement.className)) {
        theElement.onmouseover = function() {
          addClass(this,'active');
        }
        theElement.onmouseout = function() {
          removeClass(this,'active');
        }
      }
      if (/js_doTagSort/.test(theElement.className)) {
        doTagSort(theElement);
      }
    }
  }
  forEach(theDivs,fixDiv);
}

function doTagSort(theTagCloud) {
  var tagLinks = theTagCloud.getElementsByTagName("a");
  var tagNums = new Array();
  var finalTags = new Array();
  for (var j=0; j<tagLinks.length; j++) {
    var thisLink = tagLinks[j];
    if (thisLink.className && /tag/.test(thisLink.className) && thisLink.getAttribute("title")) {
      thisLink.style.display = "none";
      var rankNum = thisLink.getAttribute("title").split(" ")[0];
      var numRankNum = parseInt(rankNum);
      if ((numRankNum != 'NaN') && (tagNums.indexOf(numRankNum) == -1)) {
        tagNums.push(numRankNum);
      }
    }
  }
  tagNums = tagNums.sort(sortNumber);
  tagNums = tagNums.reverse();
  tagNums = tagNums.slice(0,12);
  tagNums = tagNums.sort(randOrd);
  for (var j=0; j<tagNums.length; j++) {
    var thisNum = tagNums[j];
    var l = 0;
    for (var k=0; k<tagLinks.length; k++) {
      var thisLink = tagLinks[k];
      var rankNum = thisLink.getAttribute("title").split(" ")[0];
      var numRankNum = parseInt(rankNum);
      if ((numRankNum != 'NaN') && (numRankNum == thisNum)) {
        thisLink.style.display = "";
        theTagCloud.appendChild(thisLink);
        theTagCloud.appendChild(document.createTextNode(" "));
      }
    }
  }
}

function doDivSubmit(theElement) {
  if (theElement.getElementsByTagName("form").length > 0) {
    theElement.getElementsByTagName("form")[0].submit();
  }
}

function processInputs() {
  var theInputs = document.getElementsByTagName("input");
  var fixInput = function(theElement) {
    if (hasClassHook(theElement)) {
      if (/js_hoverButton/.test(theElement.className)) {
        theElement.onmouseover = function() {
          addClass(this,'hover_state');
        }
        theElement.onmouseout = function() {
          removeClass(this,'hover_state');
        }
      }
    }
  }
  forEach(theInputs,fixInput);
}

function setHoverLinks() {
  if (document.getElementById("topic_links")) {
    var primary_navigation = document.getElementById("topic_links");
    var navItems = primary_navigation.getElementsByTagName("li");
    var fixItem = function(theItem) {
      theItem.onmouseover = function() {
        addClass(this,'hover_child');
      }
      theItem.onmouseout = function() {
        removeClass(this,'hover_child');
      }
    }
    forEach(navItems,fixItem);
  }
}

function stopBubble(e) {
  if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function processLinks() {
  var allLinks = document.getElementsByTagName("a");
  var fixLink = function(theElement) {
    addEvent(theElement,'click',stopBubble);
    if (hasClassHook(theElement)) {
      if (/js_doPopup/.test(theElement.className)) {
        theElement.onclick = function() {
          var newWin = window.open(this.href);
          return false;
        }
      }
      if (/js_submitParent/.test(theElement.className)) {
        theElement.onclick = function() {
          doParentSubmit(this);
          return false;
        }
      }
      if (/js_rolloutTrigger/.test(theElement.className)) {
        theElement.onclick = function() {
          doRollout(this);
          return false;
        }
      }
      if (/js_link_holder/.test(theElement.className)) {
        var daddyP = getParentElement(theElement, 'p');
        if (daddyP) {
          daddyP.onclick = function() {
            document.location.href = theElement.href;
            return false;
          }
          daddyP.onmouseover = function() {
            addClass(this,'active');
          }
          daddyP.onmouseout = function() {
            removeClass(this,'active');
          }
        }
      }
      if (/js_more_holder/.test(theElement.className)) {
        var daddyD = getParentElement(theElement, 'div');
        if (daddyD) {
          daddyD.onclick = function() {
            document.location.href = theElement.href;
            return false;
          }
          daddyD.onmouseover = function() {
            addClass(this,'active');
          }
          daddyD.onmouseout = function() {
            removeClass(this,'active');
          }
        }
      }
      if (/js_doSlide/.test(theElement.className)) {
        theElement.onclick = function() {
          doSlide(this);
          return false;
        }
      }
    }
  }
  forEach(allLinks,fixLink);
}

function doParentSubmit(theElement) {
  var parentForm = getParentElement(theElement,'form');
  parentForm.submit();
}

function doSlide(theElement) {
  killLayovers();
  var bodyNode = document.getElementsByTagName('body')[0];
  var layoverBack = document.createElement('div');
  layoverBack.setAttribute('id','layover_back');
  layoverBack.onclick = function() {
    killLayovers();
    return false;
  }
  bodyNode.appendChild(layoverBack);
  var layoverFront = document.createElement('div');
  layoverFront.setAttribute('id','layover_front');
  var layoverPic = document.createElement('img');
  layoverPic.setAttribute('src',theElement.href);
  layoverPic.setAttribute('alt','click to hide');
  layoverFront.appendChild(layoverPic);
  layoverFront.onclick = function() {
    killLayovers();
    return false;
  }
  bodyNode.appendChild(layoverFront);
  layoverFront.style.left = Math.round((bodyNode.offsetWidth / 2) - 430) + 'px';
}

function killLayovers() {
  var oldLayers = new Array('layover_front','layover_back');
  var killLayer = function(theElement) {
    if (document.getElementById(theElement)) {
      var oldLayer = document.getElementById(theElement);
      oldLayer.parentNode.removeChild(oldLayer);
    }
  }
  forEach(oldLayers,killLayer);
}

function doRollout(theElement) {
  var triggerTargetRaw = getExtensionFromClass(theElement,'js_rolloutTrigger_');
  var triggerTargetId = 'rolloutTarget_' + triggerTargetRaw;
  if (document.getElementById(triggerTargetId)) {
    var triggerTarget = document.getElementById('rolloutTarget_' + triggerTarget);
    var rolloutContainer = getParentElement(theElement,'ul');
    var triggerSiblings = rolloutContainer.getElementsByTagName('div');
    var fireOpener = function(theSibling) {
      if (theSibling.id == triggerTargetId) {
        if (theSibling.style.display == 'none') {
          Effect.BlindDown(triggerTargetId);
        }
      } else {
        if (theSibling.style.display != 'none') {
          Effect.BlindUp(theSibling.id);
        }
      }
    }
    forEach(triggerSiblings,fireOpener);
    var allLinks = rolloutContainer.getElementsByTagName('a');
    var pushLink = function(theLink) {
      if (theLink.className && (/js_rolloutTrigger/.test(theLink.className))) {
        if (theLink != theElement) {
          removeClass(theLink,'active');
        }
      }
    }
    forEach(allLinks,pushLink);
    addClass(theElement,'active');
  }
}

/* UTILITY FUNCTIONS */
function forEach(array, action) {
  for (var i=0; i < array.length; i++) {
    action(array[i]);
  }
}

function sortNumber(a,b)  {
  return a - b;
}

function randOrd(){
  return (Math.round(Math.random())-0.5); 
}

function removeChildNodes(theElement) {
  while (theElement.hasChildNodes()) {
    theElement.removeChild(theElement.firstChild);
  }
}

function getParentElement(theElement, targetNodeName) {
  var bodyNode = document.getElementsByTagName("body")[0];
  var currentParent = theElement;
  var targetNodeName = targetNodeName.toLowerCase();
  while ((currentParent.nodeName.toLowerCase() != targetNodeName) && (currentParent != bodyNode)) {
    currentParent = currentParent.parentNode;
  }
  return currentParent;
}

function stripWhitespace(theString) {
	return theString.replace(/^\s*|\s*$/g,'');
}

function addClass(theElement,theClass) {
	if (!theElement.className) {
		theElement.className = theClass;
	} else if (theElement.className.indexOf(theClass) == -1) {
		theElement.className += (" " + theClass);
	}
}

function removeClass(theElement,theClass) {
  if (theElement.className && theElement.className.indexOf(theClass) != -1) {
    theElement.className = stripWhitespace(theElement.className.replace(theClass,""))
  }
}

function hasClassHook(theElement) {
  return (theElement.className && /js_/.test(theElement.className));
}

function getExtensionFromClass(theElement,theKey) {
	var theExtension = false;
	if (theElement.className) {
    var findExtension = function(thisClass) {
      if (thisClass.indexOf(theKey) == 0) {
        var tempName = thisClass.substring(theKey.length);
        if (tempName.length > 0) {
          theExtension = tempName;
        }
      }
    }
    forEach(theElement.className.split(' '),findExtension);
  }
	return theExtension;
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
    do {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    } while (obj = obj.offsetParent);
  }
  return [curleft,curtop];
}
