// JavaScript Document
var Accordion =
{
  init: function()
  {
    Accordion.frameRate = 25;
    Accordion.duration = 0.5;
    
    var accordions = Core.getElementsByClass("accordion");
		var controls = document.getElementById("control").childNodes;
		
    for (var i = 0; i < accordions.length; i++)
    {
      var folds = accordions[i].childNodes;
			
      for (var j = 0; j < folds.length; j++)
      {
				
        if (folds[j].nodeType == 1)
        {
					var bodies = Core.getElementsByClass("body");
          folds[j]._accordionContent = bodies[j];
					
          Accordion.collapse(folds[j]);
					
					for (var k = 0; k < folds[j].childNodes.length; k++)
					{
						if (Core.hasClass(folds[j].childNodes[k], "head"))
						{
							Core.addEventListener(folds[j].childNodes[k], "mouseover", Accordion.hoverListener);
							Core.addEventListener(folds[j].childNodes[k], "mouseout", Accordion.unHoverListener);
							Core.addEventListener(folds[j].childNodes[k], "click", Accordion.clickListener);
						}
					}
        }
      }
			
			if(document.getElementById("expandAll"))
			{
				var expandAllControl = document.getElementById("expandAll");
				Core.addEventListener(expandAllControl, "click", Accordion.expandAllControlListener);
				Core.addEventListener(expandAllControl, "mouseover", Accordion.expandHoverListener);
				Core.addEventListener(expandAllControl, "mouseout", Accordion.expandUnHoverListener);
			}
			
			if(document.getElementById("collapseAll"))
			{
				var collapseAllControl = document.getElementById("collapseAll");
				Core.addEventListener(collapseAllControl, "click", Accordion.collapseAllControlListener);
				Core.addEventListener(collapseAllControl, "mouseover", Accordion.collapseHoverListener);
				Core.addEventListener(collapseAllControl, "mouseout", Accordion.collapseUnHoverListener);
			}
      
      if (location.hash.length > 1)
      {
        var activeFold = document.getElementById(location.hash.substring(1));
        if (activeFold && activeFold.parentNode == accordions[i])
        {
          Accordion.expand(activeFold);
        }
      }
    }
  },

  collapse: function(fold)
  {
    var content = fold._accordionContent;
    content._height = parseInt(content.style.height, 10);
		
    content._increment = content._height / (Accordion.frameRate * Accordion.duration);
		
    if (Core.hasClass(fold, "expanded"))
    {
      clearTimeout(content._timer);
      Accordion.collapseAnimate(content);
    }
    else
    {
      Core.addClass(fold, "collapsed");
    }
  },
  
  collapseAnimate: function(content)
  {
    var newHeight = content._height - content._increment;
    
    if (newHeight < 0)
    {
      newHeight = 0;
      Core.removeClass(content.parentNode, "expanded");
      Core.addClass(content.parentNode, "collapsed");
    }
    else
    {    
      content._timer = setTimeout(function()
        {
          Accordion.collapseAnimate(content);
        }, 1000 / Accordion.frameRate);
    }
    
    content._height = newHeight;
    content.style.height = Math.round(newHeight) + "px";
  },

  collapseAll: function(accordion)
  {
    var folds = accordion.childNodes;
    for (var i = 0; i < folds.length; i++)
    {
      if (folds[i].nodeType == 1)
      {
        Accordion.collapse(folds[i]);
      }
    }
  },

  expand: function(fold)
  {
    var content = fold._accordionContent;
    //Accordion.collapseAll(fold.parentNode);
    
    if (!Core.hasClass(fold, "expanded"))
    {
      content.style.height = "0";
      content._height = 0;
			//alert(content.style.height);
			//alert(content._height);
      Core.removeClass(fold, "collapsed");
      Core.addClass(fold, "expanded");
      content._increment = content.scrollHeight / (Accordion.frameRate * Accordion.duration);
			//alert(content.scrollHeight);
      Accordion.expandAnimate(content);
    }
  },
  
  expandAnimate: function(content)
  {
    var newHeight = content._height + content._increment;
    
    if (newHeight > content.scrollHeight)
    {
      newHeight = content.scrollHeight;
    }
    else
    {
      content._timer = setTimeout(function()
      {
        Accordion.expandAnimate(content);
      }, 1000 / Accordion.frameRate);
    }
    
    content._height = newHeight;
    content.style.height = Math.round(newHeight) + "px";
    content.scrollTop = 0;
  },
	
	expandAll: function(accordion)
	{
		var folds = accordion.childNodes;
    for (var i = 0; i < folds.length; i++)
    {
      if (folds[i].nodeType == 1)
      {
        Accordion.expand(folds[i]);
      }
    }
	},
  
  clickListener: function(event)
  {
    var fold = this.parentNode;
		
    if (Core.hasClass(fold, "collapsed"))
    {
      Accordion.expand(fold);
    }
    else
    {
      Accordion.collapse(fold);
    }  
    //Core.preventDefault(event);
  },
  
  focusListener: function(event)
  {
    var element = this;
    while (element.parentNode)
    {
      if (element.parentNode.className == "accordion")
      {
        Accordion.expand(element);
        return;
      }
      element = element.parentNode;
    }
  },
	
	hoverListener: function(event)
	{
		Core.addClass(this, "hover");
	},
	
	unHoverListener: function(event)
	{
		Core.removeClass(this, "hover");
	},
	
	collapseAllControlListener: function(event)
	{
		var accordions = Core.getElementsByClass("accordion");
		for (i = 0; i < accordions.length; i++)
		{
			Accordion.collapseAll(accordions[i]);
		}
	},
	
	expandAllControlListener: function(event)
	{
		var accordions = Core.getElementsByClass("accordion");
		for (i = 0; i < accordions.length; i++)
		{
			Accordion.expandAll(accordions[i]);
		}
	},
	
	expandHoverListener: function(event)
	{
		Core.addClass(this, "hoverExpand");
	},
	
	expandUnHoverListener: function(event)
	{
		Core.removeClass(this, "hoverExpand");
	},
	
	collapseHoverListener: function(event)
	{
		Core.addClass(this, "hoverCollapse");
	},
	
	collapseUnHoverListener: function(event)
	{
		Core.removeClass(this, "hoverCollapse");
	}
};

Core.start(Accordion);

