/**
 * Form javascript
 * @package WeblogischSysteem
 * @subpackage Scripts
 */

/**
 * WeblogischSysteem wsToolbox object
 * 
 * File:		wstoolbox.js <br>
 * Type:		Javascript object <br>
 * Name:		wsToolbox <br>
 * Date:		2007/10/05 <br>
 * Purpose:	Encapsulating crossbrowser DOM functionality
 * @author Renze van der Kamp <admin@weblogisch.com>
 * @version 0.1 
 */ 
wsToolbox = new function wsToolboxConstructor () {
	
	/**
	 * Cross-browser getElementById
	 * @link http://www.netlobo.com/javascript_get_element_id.html
	 */
	this.getElementById = function( id )
	{
		if (document.getElementById)
			var returnVar = document.getElementById(id);
		else if (document.all)
			var returnVar = document.all[id];
		else if (document.layers)
			var returnVar = document.layers[id];
		return returnVar;
	}

	/**
	 * Cross-browser getElementByClass
	 * @link http://javascript.internet.com/snippets/getelementsbyclass.html
	 */
	this.getElementsByClass = function(searchClass,node,tag) {
		var classElements = new Array();
		if (node == null)
			node = document;
		if (tag == null)
			tag = '*';
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
		for (i = 0, j = 0; i < elsLen; i++) {
			if (pattern.test(els[i].className) ) {
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	}

	// addEvent and removeEvent, designed by Aaron Moore
	this.addEvent = function(element, listener, handler)
	{
		//if the system is not set up, set it up, and
		// store any outside script's event registration in the first handler slot
		if(typeof element[listener] != 'function' || 
		typeof element[listener + '_num'] == 'undefined'){
			element[listener + '_num'] = 0;
			if(typeof element[listener] == 'function'){
				element[listener + 0] = element[listener];
				element[listener + '_num']++;
			}
			element[listener] = function(e){
				var r = true;
				e = (e) ? e : window.event;
				for(var i = 0; i < element[listener + '_num']; i++)
					if(element[listener + i](e) === false) r = false;
				return r;
			}
		}
		//if handler is not already stored, assign it
		for(var i = 0; i < element[listener + '_num']; i++)
			if(element[listener + i] == handler) return;
		element[listener + element[listener + '_num']] = handler;
		element[listener + '_num']++;
	}
	this.removeEvent = function(element, listener, handler)
	{
		//if the system is not set up, or there are no handlers to remove, exit
		if(typeof element[listener] != 'function' || 
		typeof element[listener + '_num'] == 'undefined' ||
		element[listener + '_num'] == 0) return;
		//loop through handlers,
		//  if target handler is reached, begin overwriting each
		//  handler with the handler in front of it until one before the last
		var found = false;
		for(var i = 0; i < element[listener + '_num']; i++){
			if(!found)
				found = element[listener + i] == handler;
			if(found && (i+1) < element[listener + '_num'])
				element[listener + i] = element[listener + (i+1)];
		}
		//if handler was found, decrement the handler count
		if(found)
			element[listener + '_num']--;
	}

	/**
	 * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
	 * @link http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html
	 */
	this.getElementStyle = function(elementID, CssStyleProperty) {
		var element = document.getElementById(elementID);
		if (element.currentStyle) {
			return element.currentStyle[toCamelCase(CssStyleProperty)];
		} else if (window.getComputedStyle) {
			var compStyle = window.getComputedStyle(element, '');
			return compStyle.getPropertyValue(CssStyleProperty);
		} else {
			return '';
		}
	}

	/**
	 * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
	 * @link http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp
	 */
	this.toCamelCase = function(CssProperty) {
		var stringArray = CssProperty.toLowerCase().split('-');
		if (stringArray.length == 1) {
			return stringArray[0];
		}
		var ret = (CssProperty.indexOf("-") == 0) ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1) : stringArray[0];
		for (var i = 1; i < stringArray.length; i++) {
			var s = stringArray[i];
			ret += s.charAt(0).toUpperCase() + s.substring(1);
		}
		return ret;
	}

	/* Great baking functions */

	/**
	 * Create cookie
	 * @param name string Cookie name
	 * @param value mixed Value of cookie
	 * @param days number Number of days before expiration 
	 * @return void 
	 */
	this.createCookie = function(name, value, days) {
		var expires = '';
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days*24*60*60*1000));
			var expires = '; expires=' + date.toGMTString();
		}
		document.cookie = name + '=' + value + expires + '; path=/';
	}
	/**
	 * Read cookie
	 * @param name string Cookie name
	 * @return mixed Data of cookie or null on failure 
	 */ 
	this.readCookie = function(name) {
		var cookieCrumbs = document.cookie.split(';');
		var nameToFind = name + '=';
		for (var i = 0; i < cookieCrumbs.length; i++) {
			var crumb = cookieCrumbs[i];
			while (crumb.charAt(0) == ' ') {
				crumb = crumb.substring(1, crumb.length); /* delete spaces */
			}
			if (crumb.indexOf(nameToFind) == 0) {
				return crumb.substring(nameToFind.length, crumb.length);
			}
		}
		return null;
	}
	/**
	 * Erase cookie
	 * @param name string Cookie name 
	 * @return void
	 */ 
	this.eraseCookie = function(name) {
		createCookie(name, '', -1);
	}
	
	/*
	 * Disables all 'test' links, that point to the href '#'
	 * @author Ross Shannon
	 * @return void
	 */
	this.disableTestLinks = function() {
		var pageLinks = document.getElementsByTagName('a');
		for (var i=0; i<pageLinks.length; i++) {
			if (pageLinks[i].href.match(/[^#]#$/)) {
				addEvent(pageLinks[i], 'click', knackerEvent, false);
			}
		}
	}
	
	/*
	 * Scroll node to specified element
	 * @author Renze van der Kamp
	 * @return void
	 */
	this.nodeScrollTo = function(id,nodeId,direct) {
		if (direct == undefined) {
			direct = true;
		}
		var node = document.getElementById(nodeId);
		var elements = wsToolbox.getElementsByClass('scrollcontent',node,'div');
		node = elements[0];
		var target = document.getElementById(id).offsetTop;
		if (direct) {
			if (node.scrollTop !== undefined) {
				node.scrollTop = target-10;
			}
		} else {
			if (wsToolbox.scroll_timer != undefined) {
				if (wsToolbox.scroll_timer[id] != undefined) {
					clearTimeout(wsToolbox.scroll_timer[id]);
				}
			} else {
				wsToolbox.scroll_timer = new Array();
			}
			
			if (node.scrollTop != undefined) {
				if (target > node.scrollHeight-node.offsetHeight) {
					target = node.scrollHeight-node.offsetHeight;
				}
				
				if(node.scrollTop < target){
					var duration = 1;
					var framerate = 50;//frames per second
					var scrollStep = Math.ceil((target/framerate/duration)*(target-node.scrollTop)/target);
					node.scrollTop = node.scrollTop + scrollStep;
					wsToolbox.scroll_timer[id]= setTimeout("wsToolbox.nodeScroll('"+id+"','"+nodeId+"',false)",Math.ceil(1000/framerate));
				} else {
					clearTimeout(wsToolbox.scroll_timer[id]);
					node.scrollTop = target;
				}
			}
		}
	}
	
	
	this.setNodeScroll = function(obj,down) {
		if (obj === false) {
			clearInterval(setNodeScroll.interval);
		} else {
			var wrapper = obj.parentNode;
			var elements = wsToolbox.getElementsByClass('scrollcontent',wrapper,'div');
			nodeScroll.node = elements[0];
			if (down) {
				nodeScroll.down = true;
			} else {
				nodeScroll.down = false;
			}
			setNodeScroll.interval = setInterval('nodeScroll()',20);
		}
	}

	this.nodeScroll = function() {
		step = 2;
		if (nodeScroll.down == undefined) {
			nodeScroll.down = true;
		}
		if (nodeScroll.node !== undefined) {
			var node = nodeScroll.node;
			if (node.scrollTop !== undefined) {
				if (nodeScroll.down) {
					if (node.scrollTop + step <= node.scrollHeight) {
						node.scrollTop += step;
					} else {
						node.scrollTop = node.scrollHeight;
					}
				} else {
					if (node.scrollTop - step >= 0) {
						node.scrollTop -= step;
					} else {
						node.scrollTop = 0;
					}
				}
			}
		}
	}
	
}


