/* CyneSubmenu.js version 0.1
*
*  Submenus auf der Seite
*
*  history: 07.11.2007	v0.1	Initialstand fuer Versionierung CMS
*   
*  copyright 2006-2007, cyne GmbH   
*/

var Cyne;
if (!Cyne) Cyne = {};

Cyne.Submenu = function(element, opts) {
	this.init(element);

	Cyne.Submenu.setOptions(this, opts);

	if (Cyne.Submenu.onloadDidFire)
		this.attachBehaviors();
	else
		Cyne.Submenu.loadQueue.push(this);
};

Cyne.Submenu.prototype.init = function(element) {
	if (element && typeof element == "string")
		this.element = document.getElementById(element);
	else
		this.element = element;

	this.hoverClass = "SubmenuItemHover";
	this.activeClass = "SubmenuItemActive";
	this.activeSubmenu = null;
};

Cyne.Submenu.onloadDidFire = false;
Cyne.Submenu.loadQueue = [];

Cyne.Submenu.addLoadListener = function(handler) {
	if (typeof window.addEventListener != 'undefined')
		window.addEventListener('load', handler, false);
	else if (typeof document.addEventListener != 'undefined')
		document.addEventListener('load', handler, false);
	else if (typeof window.attachEvent != 'undefined')
		window.attachEvent('onload', handler);
};

Cyne.Submenu.processLoadQueue = function(handler) {
	Cyne.Submenu.onloadDidFire = true;
	var q = Cyne.Submenu.loadQueue;
	var qlen = q.length;
	for (var i = 0; i < qlen; i++)
		q[i].attachBehaviors();
};

Cyne.Submenu.addLoadListener(Cyne.Submenu.processLoadQueue);

Cyne.Submenu.prototype.addClassName = function(ele, className) {
	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
		return;
	ele.className += (ele.className ? " " : "") + className;
};

Cyne.Submenu.prototype.removeClassName = function(ele, className) {
	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
		return;
	ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
};

Cyne.Submenu.setOptions = function(obj, optionsObj, ignoreUndefinedProps) {
	if (!optionsObj)
		return;
	for (var optionName in optionsObj) {
		if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
			continue;
		obj[optionName] = optionsObj[optionName];
	}
};

Cyne.Submenu.prototype.onSubmenuItemMouseOver = function(submenuItem) {
	if (submenuItem)
		this.addClassName(submenuItem, this.hoverClass);
};

Cyne.Submenu.prototype.onSubmenuItemMouseOut = function(submenuItem) {
	if (submenuItem)
		this.removeClassName(submenuItem, this.hoverClass);
};

Cyne.Submenu.prototype.onSubmenuItemClick = function(submenuItem) {
	if (this.activeSubmenu)
		this.removeClassName(this.activeSubmenu, this.activeClass);

	if (submenuItem) {
		this.addClassName(submenuItem, this.activeClass);
		this.activeSubmenu = submenuItem;
	}
};

Cyne.Submenu.prototype.attachSubmenuHandlers = function(submenuItem) {
	if (!submenuItem)
		return;

	var self = this;
	Cyne.Submenu.addEventListener(submenuItem, "click", function(e) { return self.onSubmenuItemClick(submenuItem); }, false);
	Cyne.Submenu.addEventListener(submenuItem, "mouseover", function(e) { return self.onSubmenuItemMouseOver(submenuItem); }, false);
	Cyne.Submenu.addEventListener(submenuItem, "mouseout", function(e) { return self.onSubmenuItemMouseOut(submenuItem); }, false);
};

Cyne.Submenu.addEventListener = function(element, eventType, handler, capture) {
	try	{
		if (element.addEventListener)
			element.addEventListener(eventType, handler, capture);
		else if (element.attachEvent)
			element.attachEvent("on" + eventType, handler);
	}
	catch (e) {}
};

Cyne.Submenu.prototype.initSubmenu = function(submenuItem, isDefault) {
	if (isDefault) {
		this.activeSubmenu = submenuItem;
		this.addClassName(submenuItem, this.activeClass);
	} else {
		this.removeClassName(submenuItem, this.activeClass);
	}

	this.attachSubmenuHandlers(submenuItem);
};

Cyne.Submenu.prototype.attachBehaviors = function() {
	var submenuItems = this.getSubmenuItems();
	for (var i = 0; i < submenuItems.length; i++)
	{
		this.initSubmenu(submenuItems[i], i == this.defaultActiveSubmenuItem);
	}
};

Cyne.Submenu.prototype.getSubmenuItems = function() {
	return this.getElementChildren(this.element);
};


Cyne.Submenu.prototype.getElementChildren = function(element) {
	var children = [];
	var child = element.firstChild;
	while (child)
	{
      // 2008-11-20 Webert: anpassung fuer flash und images in der subnavi
		if (child.nodeType == 1 && child.nodeName.toLowerCase() == "a") {
			children.push(child.firstChild);
		}
		child = child.nextSibling;
	}
	return children;
};
