/****************************
** breakout.js
**
** self-contained module
** controls the functionality of
** a breakout page.
** Design Kitchen
** @author: Matthew Story
**+@modified: Daniel Apodaca
**+/ re-factored for remove
**+/ prototype.js dependencies
*****************************/
Breakout = function(ArgumentsObj)
{
	/* Argument Defaults */
	var NewArguments =
	{
		element : false,
		openElements : [],
		openElementsDOM : [],
		closeElements : [],
		closeElementsDOM : [],
		highlightedClass : false,
		handlers : [],
		onOpen : function()
		{},
		onClose : function()
		{},
		open : false,
		toggleOpenClose : true
	};

	/* Replace Arg Defaults */
	for (var argName in ArgumentsObj)
	{
		NewArguments[argName] = ArgumentsObj[argName];
	}

	/* Set Properties via Args */
	this.element = NewArguments.element;
	this.openElements = NewArguments.openElements;
	this.openElementsDOM = new Array();
	this.closeElements = NewArguments.closeElements;
	this.closeElementsDOM = new Array();
	this.highlightedClass = NewArguments.highlightedClass;
	this.handlers = NewArguments.handlers;
	this.onOpen = NewArguments.onOpen;
	this.onClose = NewArguments.onClose;
	this.open = NewArguments.open;
	this.toggleOpenClose = NewArguments.toggleOpenClose;

	this.initialize = function()
	{
		/* create and load DOM object
		 == breakout control */
		self.element = (el = document.getElementById(self.element)) ? el : false;

		/* convert to array if need be */
		self.openElements = (self.openElements.constructor == Array) ? self.openElements : [self.openElements];

		/* create and load DOM objects
		 == elements to close on breakout */
		for (var i = 0; i < self.openElements.length; i++)
		{
			if (el = document.getElementById(self.openElements[i]))
			{
				self.openElementsDOM.push(el);
			}
		}

		/* convert to array if need be */
		self.closeElements = (self.closeElements.constructor == Array) ? self.closeElements : [self.closeElements];

		/* create and load DOM objects */
		for (var i = 0; i < self.closeElements.length; i++)
		{
			if (el = document.getElementById(self.closeElements[i]))
			{
				self.closeElementsDOM.push(el);
			}
		}

		if (self.open)
		{
			self.openBreakout();
		}
		else
		{
			self.closeBreakout();
		}

		for (var i = 0; i < self.openElementsDOM.length; i++)
		{
			self.registerOpenElement(self.openElementsDOM[i]);
		}
		for (var i = 0; i < self.closeElementsDOM.length; i++)
		{
			self.registerCloseElement(self.closeElementsDOM[i]);
		}
	}

	this.destroy = function()
	{
		self.unregisterEvents();
		self.element = null;
		self.openElements = null;
		self.openElementsDOM = null;
		self.closeElements = null;
		self.closeElementsDOM = null;
		self.highlightedClass = null;
		self.handlers = null;
	}

	this.getClassNames = function(DOMObj)
	{
		var names = DOMObj.className.split(/ /);
		return names;
	}

	this.addClassName = function(DOMObj, className)
	{
		if (!DOMObj.className.match(className))
		{
			var classes = self.getClassNames(DOMObj);
			classes.push(className);
			var newClasses = classes.join(' ');
			DOMObj.className = newClasses;
		}
	}

	this.removeClassName = function(DOMObj, className)
	{
		if (DOMObj.className.match(className))
		{
			var classes = self.getClassNames(DOMObj);
			var filteredClasses = new Array();
			for (i = 0,j = classes.length; i < j; i++)
			{
				if (classes[i] === className)
				{
					// filter, we don't want the matching classname
				}
				else
				{
					// it's not the classname to remove, load it for output
					filteredClasses.push(classes[i]);
				}
			}
			var newClasses = filteredClasses.join(' ');
			DOMObj.className = newClasses;
		}
	}

	this.registerOpenElement = function(openElement)
	{
		self.registerEvent(openElement, 'click', self.openBreakout);
	}

	this.registerCloseElement = function(closeElement)
	{
		self.registerEvent(closeElement, 'click', self.closeBreakout);
	}

	this.registerEvent = function(element, event, handler)
	{
		if (window.attachEvent)
		{ //Internet Explorer
			element.attachEvent("on" + event, handler);
		}
		else
		{ //Standards Browsers
			element.addEventListener(event, handler, false);
		}
		self.handlers.push({element: element, event: event, handler: handler});
	}

	this.unregisterEvents = function()
	{
		for (var i = 0; i < self.handlers.length; i++)
		{
			if (window.attachEvent)
			{ //Internet Explorer
				this.handlers[i].element.detachEvent("on" + self.handlers[i].event, self.handlers[i].handler);
			}
			else
			{ //Standards Browsers
				this.handlers[i].element.removeEventListener(self.handlers[i].event, self.handlers[i].handler, false);
			}
		}
		this.handlers = [];
	}

	this.openBreakout = function()
	{
		if (!self.open)
		{
			self.element.style.display = '';
			for (var i = 0; i < self.openElementsDOM.length; i++)
			{
				self.addClassName(self.openElementsDOM[i], self.highlightedClass);
			}
			self.open = true;
			self.onOpen();
		} else if (self.toggleOpenClose)
		{
			self.closeBreakout();
		}
	}

	this.closeBreakout = function()
	{
		if (self.open)
		{
			self.element.style.display = 'none';
			for (var i = 0; i < self.openElementsDOM.length; i++)
			{
				self.removeClassName(self.openElementsDOM[i], self.highlightedClass);
			}
			self.open = false;
			self.onClose();
		}
	}
	var self = this;
	self.initialize();
}


