// panel.js
// written by Tyson Stewart
// last updated 2 April 2008
// copyright 2008 Phoenix Web Group, Inc.

/* Description:
  On load, looks through the page for a specific class and makes them hidden panels.
*/

var pwg = 
{
  util: {},
  panel:
  { 
    config:{},
    attaches: []
  }
};

// CONFIG SECTION
pwg.panel.config.classname = "panel";

// Defines how the panel title should be defined.
//  If "tag" then the first element in the panel of with
//  the tag defined by panelTitleValue will be used.
//  If "class" then the first element in the panel with
//  the classname defined by panelTitleValue will be used.
pwg.panel.config.panelTitleType = "tag";
pwg.panel.config.panelTitleValue = "h3";
// END CONFIG

var prevOnload = window.onload;
window.onload = function ()
{
  pwg.onloadRun = true;
  
  if (typeof (prevOnload) == "function")
    prevOnload();
  
  if (pwg.onload)
  {
    if (pwg.onload.constructor == Function)
      pwg.onload();
    else if (pwg.onload.constructor == Array)
    {
      for (index = 0, length = pwg.onload.length; index < length; index++)
      {
        if (pwg.onload[index].constructor == Function)
          pwg.onload[index]();
      }
    }
  }
  
  var panels = pwg.util.getElementsByClassName(pwg.panel.config.classname);
  if (!panels || !panels.length)
    return;
  
  var frag = pwg.util.getUrlFragment(window.location.href);
  var openIndex = 0;
  var elements = [];
  for (var index = 0, length = panels.length; index < length; index++)
  {
    var panel = panels[index];
    panel.setAttribute("panelid", index);
    var t = pwg.panel.findAndSetTitleElement(panel);
    if (frag.length && frag == t.getAttribute("fragment"))
      openIndex = index;
    elements.push(
    {
      panel: panel,
      title: t
    });
  }
  
  pwg.panel.elements = elements;
  pwg.panel.onClick(openIndex);
}
var prevOnunload = window.onunload;
window.onunload = function ()
{
  if (typeof (prevOnunload) == "function")
    prevOnunload();
  
  for (var index = 0, att = pwg.panel.attaches, length = att.length; index < length; index++)
  {
    var attach = att[index];
    switch (attach.type)
    {
      case 1:
        attach.elem.removeEventListener(attach.evt, attach.handler, attach.bubble);
        break;
      case 2:
        attach.elem.detachEvent(attach.evt, attach.handler);
        break;
      default:
        break;
    }
  }
}

pwg.panel.findAndSetTitleElement = function (panelElement)
{
  var list = null;
  if (pwg.panel.config.panelTitleType == "tag")
  {
    list = panelElement.getElementsByTagName(pwg.panel.config.panelTitleValue);
  }
  else if (pwg.panel.config.panelTitleType == "class")
  {
    list = pwg.util.getElementsByClassName(pwg.panel.config.panelTitleValue);
  }
  
  if (list === null || !list.length)
    return null;
  
  var titleElement = list[0];
  var panelid = panelElement.getAttribute("panelid");
  var func = function()
  {
    pwg.panel.onClick(panelid);
  };
  if (titleElement.addEventListener)
  {
    pwg.panel.attaches.push(
    {
      elem: titleElement,
      type: 1,
      evt: 'click',
      handler: func,
      bubble: false
    });
    titleElement.addEventListener('click', func, false);
  }
  else if (titleElement.attachEvent)
  {
    pwg.panel.attaches.push(
    {
      elem: titleElement,
      type: 2,
      evt: 'onclick',
      handler: func,
      bubble: null
    });
    titleElement.attachEvent('onclick', func);
  }
  else
    titleElement.onclick = func;
  
  titleElement.setAttribute("paneltitle", "true");
  titleElement.style.cursor = "pointer";
  
  return titleElement;
}

pwg.panel.hideAllChildren = function (element)
{
  var children = element.childNodes;
  for (var index = 0, length = children.length; index < length; index++)
  {
    var child = children[index];
    if (child.nodeType == 1 && child.getAttribute("paneltitle") != "true")
    {
      child.style.display = "none";
    }
    else if (child.nodeType == 3)
    {
      var span = document.createElement("span");
      span.style.display = "none";
      var text = element.replaceChild(span, child);
      span.appendChild(text);
    }
  }
}

pwg.panel.showAllChildren = function (element)
{
  var children = element.childNodes;
  for (var index = 0, length = children.length; index < length; index++)
  {
    var child = children[index];
    if (child.nodeType == 1)
      child.style.display = "";
  }
}

pwg.panel.preClick = null;
pwg.panel.postClick = null;

pwg.panel.onClick = function (panelid)
{
  panelid -= 0;
  panelidStr = panelid += '';
  if (typeof (pwg.panel.preClick) == "function")
    pwg.panel.preClick(panelid);
  
  var elements = pwg.panel.elements;
  for (var index = 0, length = elements.length; index<length; index++)
  {
    var panel = elements[index].panel;
    if (panel.getAttribute("panelid") == panelidStr)
      pwg.panel.showAllChildren(panel);
    else
      pwg.panel.hideAllChildren(panel);
  }
  
  if (typeof (pwg.panel.postClick) == "function")
    pwg.panel.postClick(panelid);
}

/*
	The Ultimate getElementsByClassName
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
	Taken from 
		http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
pwg.util.getElementsByClassName = function (className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

pwg.util.getUrlFragment = function (url)
{
  if (!(typeof (url) == "string" || url instanceof String))
    return "";
  var index = url.indexOf('#');
  if (index >= 0)
    return url.substr(index + 1);
  else
    return "";
}

