/**
 * Client side code
 *
 * Copyright (c) 2009 TOLRA Micro Systems Limited. All rights reserved.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/**
 * Core library functions
 */
var slideMenu = new function() {
	var self = this;

	/**
	 * Events
	 */
	var handlers = [];

	this._findHandler = function(target, eventName, fnHandler) {
		for(i in handlers) {
			if(handlers[i].target == target && handlers[i].eventName == eventName && handlers[i].fnHandler == fnHandler)
				return i;
		}

		return -1;
	};

	// Attach to an event
	this.observe = function(target, eventName, fnHandler) {
		// if given a string look up the object
		if(typeof target == "string") target = document.getElementById(target);

		// Look for an existing handler
		if(self._findHandler(target, eventName, fnHandler) != -1) return;

		// create wrapper event function to fix browser differences
		var fn = function(evt) {
			evt = evt ? evt : (window.event ? window.event : null);
			if(evt) {
				// For IE convert srcElement to target
				if(!evt.target) evt.target = evt.srcElement;

				// if handler returns false don't run default
				if(!fnHandler(evt)) {
					if(evt.stopPropagation) {
						evt.stopPropagation();
						evt.preventDefault();
					}
					else if(evt.cancelBubble) {
						evt.cancelBubble = true;
						evt.returnValue = false;
					}
					return false;
				}
			}
		};

		// Remember handler
		handlers.push({target: target, eventName: eventName, fnHandler: fnHandler, fn: fn});

		// Attach event to object
		if(target.addEventListener)
			target.addEventListener(eventName, fn, false);
		else {
			target.attachEvent("on" + eventName, fn);

			// For IE add unloader to remove all handlers
			if(!window._fusionLibEventUnload) {
				window._fusionLibEventUnload = true;
				self._removeAllEvents = function() {
					for(i in handlers) {
						handlers[i].target.detachEvent("on" + handlers[i].eventName, handlers[i].fn);
					}
				}

				var _oldOnUnload = window.onunload;
				if(typeof window.onunload != 'function') window.onunload = self._removeAllEvents;
				else window.onunload = function() { self._removeAllEvents(); _oldOnUnload(); };
			}
		}
	};
};

// Initialise the menu
function initSubMenu(id) {
	var e = document.getElementById(id);
	for(var i=0;i<e.children.length;i++) {
		var c = e.children[i].getElementsByTagName("SPAN");
		if(c.length) {
			c[0].menuId = i;
			slideMenu.observe(c[0], 'click', function(evt) {
				var m = e.lastMenuId == evt.target.menuId ? -1 : evt.target.menuId;
				showSubMenu(e, m);
				return false;
			});
		}
	}

	// Hide the child menus
	showSubMenu(id, -1);
}

// Hide all the sub menus except for selected
function showSubMenu(id, active) {
	var e = typeof id == "string" ? document.getElementById(id) : id;
	e.lastMenuId = active;
	for(var i=0;i<e.children.length;i++) {
		var c = e.children[i].getElementsByTagName("UL");
		if(c.length)
			c[0].style.display = i == active ? "block" : "none";
		c = e.children[i].getElementsByTagName("SPAN");
		if(c.length)
			c[0].style.backgroundImage = i == active ? "url(/images/up.png)" : "url(/images/down.png)";
	}
}

