/**
 *	JSX (JavaScript eXtended)
 *
 *	@version 0.1.10b - 2009.02.19
 */

if(typeof(NULL) == 'undefined') var NULL = null;
if(typeof(UNDEFINED) == 'undefined') var UNDEFINED = 'undefined';

/*######################################################################################*/

var JSX = {};
var jsx = {};

JSX.getVersion = function()
{
	return '0.1.9 beta';
};

/*######################################################################################*/

	/*************************************************************************************
	 *	Controleerd alle meegegeven variabelen of deze leeg zijn of niet.
	 *
	 *	@param mixed	$var	Een variabele die gecontroleerd moet worden
	 *	@param mixed	...		Nog een variabele die gecontroleerd moet worden
	 *	@return bool
	 */
	JSX.isEmpty = function()
	{
		var $r = false;
		var $iL = arguments.length;
		for(var $i=0; $i<$iL; $i++)
		{
			var $v = arguments[$i];
			var $t = typeof($v);
			var $r = (($t == UNDEFINED || $v == null || $v == '') && $t != 'boolean');
			if(!$r) break;
		}
		return $r;
	};
	
	/*************************************************************************************
	 *	Controleerd alle meegegeven variabelen of deze gedefineerd zijn.
	 *
	 *	@param mixed	$var	Een variabele die gecontroleerd moet worden
	 *	@param mixed	...		Nog een variabele die gecontroleerd moet worden
	 *	@return bool
	 */
	JSX.isSet = function()
	{
		var $r = false;
		var $iL = arguments.length;
		for(var $i=0; $i<$iL; $i++)
		{
			var $v = arguments[$i];
			var $r = (typeof($v) != UNDEFINED && $v != null);
			if(!$r) break;
		}
		return $r;
	}
	
	/*************************************************************************************
	 *	Controleerd of alle meegegeven variabelen voldoen aan het type $type dat in de
	 *	eersteparameter is aangegeven. Wanneer er 2 parameters worden meegestuurd en de 2e
	 *	een Array is, worden de waardes in deze Array vergeleken met het type $type.
	 *
	 *	@param string	$type	Het type waaraan alle variabelen moeten voldoen
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isType = function($type, $var)
	{
		var $return = true;
		var $args = arguments;
		var $iL = $args.length;
		
		if($iL == 2 && JSX.isArray($args[1]))
		{
			$args = $args[1];
			$args.unshift('');
			$iL = $args.length;
		}
		for(var $i=1; $i<$iL; $i++)
		{
			$return = (typeof($args[$i]) == $type);
			if(!$return) break;
		}
		return $return;
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type NULL is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isNull = function($var)
	{
		return ($var == null);
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type UNDEFINED is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isUndefined = function($var)
	{
		return (typeof($var) == UNDEFINED || $var == UNDEFINED);
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type Boolean is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isBool = JSX.isBoolean = function($var)
	{
		return ($var && typeof($var) == 'boolean');
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type String is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isString = function($var)
	{
		return ($var && typeof($var) == 'string' && !JSX.isUndefined($var));
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type Number is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isInt = JSX.isNumber = function($var)
	{
		return ($var && typeof($var) == 'number');
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type Number of anders een numerieke
	 *	String is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isNumeric = function($var)
	{
		if(JSX.isString($var)) $var = parseInt($var);
		return ($var && typeof($var) == 'number');
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type Object is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isObject = function($var)
	{
		return ($var && typeof($var) == 'object');
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type Object is en of de constructor
	 *	Array is wat inhoud dat de betreffende variabele een array is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isArray = function($var)
	{
		return ($var && typeof($var) == 'object' && $var.constructor === Array);
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele van het type Function is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isFunction = function($var)
	{
		return ($var && typeof($var) == 'function');
	}
	
	/*************************************************************************************
	 *	Controleerd of de meegegeven variabele scalar is. Dit houdt in dat er wordt
	 *	gekeken of de variabele van het type 'string', 'bool' of 'number' is.
	 *
	 *	@param mixed	$var	Een variabele die moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.isScalar = function($var)
	{
		return ($var && JSX.isString($var) || JSX.isBool($var) || isNumber($var));
	}

/*######################################################################################*/

	/*************************************************************************************
	 *	Geeft de standaard waarde $value terug wanneer $var leeg is.
	 *
	 *	@param mixed	$var	De variabele die moet worden gecontroleerd
	 *	@param mixed	$value	De standaard waarde die moet worden terug gegeven
	 *	@return mixed
	 */
	Function.def = function($var, $value)
	{
		return (JSX.isEmpty($var)) ? $value : $var;
	};
	
/*######################################################################################*/

	Array.prototype.exists = function(value)
	{
		var exists = false;
		for(var i=0; i<this.length; i++)
		{
			if(value == this[i])
			{
				exists = true;
				break;
			}
		}
		return exists;

	};
	
	Array.prototype.first = function()
	{
		return this[0];
	};
	
	Array.prototype.last = function()
	{
		return this[this.length-1];
	};
	
	Array.prototype.range = function($low, $high, $step)
	{
		if(!isNumeric($step) || $step < 1) $step = 1;
		Debug.alert($low, $high, $step);
		if(isNumeric($low) && isNumeric($high))
		{
			if($high < $low)
			{
				for($low; $low>=$high; $low-=$step)
				{
					this.push($low);
				}
			}
			else if($low < $high)
			{
				for($low; $low<=$high; $low+=$step)
				{
					this.push($low);
				}
			}
		}
		else if(isString($low) && isString($high))
		{
			$alpha = 'abcdefghijklmnopqrstuvwxyz';
			//$low = $alpha.indexOf($low);
			//$high = $alpha.indexOf($high);
			
			/*if($high < $low)
			{
				for($low; $low>=$high; $low-=$step)
				{
					this.push($alpha.substr($low, 1));
				}
			}
			else if($low < $high)
			{
				for($low; $low<26; $low+=$step)
				{
					this.push($alpha.substr($low, 1));
				}
			}*/
		}
	};

/*######################################################################################*/

	String.substract = function($start, $length)
	{
		$start = parseInt($start);
		$length = parseInt($length);
		
		if($start < 0)	$start = (this.length + $start);
		if($length < 0)	$length = (this.length + $length);
		return this.substr($start, $length);
	};

/*######################################################################################*/

/*
	de loader functies worden gebruikt om functies aan het onLoad event toe te voegen
*/
JSX.Loader = {};
JSX.Loader.functions = [];

	/*****************************************************************************************
	 *	Voeg een function toe die moet worden uitgevoerd tijdens het onLoad event.
	 *
	 *	@param function	$func	Een function die moet worden uitgevoerd
	 *	@param object	$this	Het Object waarin function zich bevind
	 *	@param array	$args	Een Array met argumenten voor de function
	 *	@return void
	 */
	JSX.Loader.add = function($func, $this, $args)
	{
		if(JSX.isFunction($func))
		{
			var $this = Function.def($this, window);
			var $args = Function.def($args, []);
			JSX.Loader.functions.push([$func, $this, $args]);
		}
	};

if(JSX.isFunction(window.onload))
{
	JSX.Loader.add(window.onload, window);
}

/*****************************************************************************************
 *	Voer de toegevoegde functies uit tijdens onLoad.
 *
 *	@return void
 */
window.onload = JSX.Loader.exec = function()
{
	var $iL = JSX.Loader.functions.length;
	if($iL > 0)
	{
		for(var $i=0; $i<$iL; $i++)
		{
			var $func = JSX.Loader.functions[$i];
			$func[0].apply($func[1], $func[2]);
		}
	}
};

/*######################################################################################*/

JSX.Debug = {};
JSX.Debug.active = false;
JSX.Debug.holder;

	JSX.Debug.activate = function()
	{
		var $debug = document.createElement('div');
			$debug.setAttribute('id', 'jsx_debug');
			
			$debug.style.margin = '2px';
			$debug.style.padding = '2px';
			
			$debug.style.borderColor = '#ff0000';
			$debug.style.borderStyle = 'solid';
			$debug.style.borderWidth = '3px';
			
			$debug.style.fontFamily = 'Verdana, Arial, Helvetica, sans-serif';
			$debug.style.fontSize = '11px';
			
			$debug.innerHTML = 'JSX Debug';
		
		JSX.Debug.holder = $debug;
		JSX.Debug.active = true;
		
		document.body.insertBefore($debug, document.body.firstChild);
	};
	
	/*****************************************************************************************
	 *	Geeft alle waardes binnen een Object terug in een alert box.
	 *
	 *	@param object	$obj	Het Object waarvan we de waardes willen tonen
	 *	@return bool
	 */
	JSX.Debug.object = function($obj)
	{
		//var $a = $obj +'\n\n';
		var $a = '';
		for(var $k in $obj)
		{
			var $v = $obj[$k];
			if(typeof($v) != 'function') $a += $k +' = '+ $v +'\n';
		}
		alert($a);
	};
	
	/*****************************************************************************************
	 *	Geeft alle meegegeven parameters terug in een alert box.
	 *
	 *	@param mixed	$var	Een variabele dat we willen tonen
	 *	@return bool
	 */
	JSX.Debug.trace = function($var)
	{
		var $sfx = ', ';
		var $msg = '';
		var $iL = arguments.length;
		for(var $i=0; $i<$iL; $i++)
		{
			$msg += arguments[$i] + $sfx;
		}
		
		$msg = $msg.substr(0, ($msg.length-$sfx.length));
		
		if(JSX.Debug.active)
		{
			JSX.Debug.holder.innerHTML = $msg +'<br>'+ JSX.Debug.holder.innerHTML;
		}
		else
		{
			alert($msg);
		}
	};
	var trace = JSX.Debug.trace;

/*######################################################################################*/

JSX.Error = {};

	JSX.Error.raise = function($message, $page, $line, $chr)
	{
		alert("ERROR '"+ $message +"' on line '"+ $line +"' of page '"+ $page +"'");
	};

/*######################################################################################*/

JSX.Browser = {};
JSX.BROWSER_IE		= JSX.Browser.IE		= 'msie';
JSX.BROWSER_FF		= JSX.Browser.FF		= 'firefox';
JSX.BROWSER_OPERA	= JSX.Browser.OPERA		= 'opera';
JSX.BROWSER_SAFARI	= JSX.Browser.SAFARI	= 'safari';

JSX.Browser.name	= '';
JSX.Browser.version	= '';

	/*****************************************************************************************
	 *	Controleerd of de gebruiker op de browser $browser met versie $versie werkt.
	 *
	 *	@param string	$browser	De naam van de browser
	 *	@param string	$version	De versie van de browser
	 *	@param string	$seperator	De seperator die tussen $browser en $version wordt geplaatst
	 *	@return bool
	 */
	JSX.Browser.isBrowser = function($browser, $version)
	{
		var $return = false;
		
		// kijk of we ook op versie moeten controleren
		if(!JSX.isEmpty($version))
		{
			// kijk of uberhaubt de naam en/of versie van de browser al bekend is
			if(JSX.isEmpty(JSX.Browser.name) || JSX.isEmpty(JSX.Browser.version))
			{
				var $separator = JSX.func.def($separator, '');
				$return = (navigator.userAgent.toLowerCase().indexOf($browser + $separator + $version) != -1);
				if($return)
				{
					JSX.Browser.name = $browser;
					JSX.Browser.version = $version;
				}
			}
			// check anders of de huidige naam en versie overeenkomen met die we willen hebben
			else $return = (JSX.Browser.name == $browser && JSX.Browser.version == $version);
		}
		// zoniet controleer alleen de naam van de browser
		else
		{
			// wanneer deze leeg is gaan we 'm zoeken
			if(JSX.isEmpty(JSX.Browser.name))
			{
				$return = (navigator.userAgent.toLowerCase().indexOf($browser) != -1);
				if($return) JSX.Browser.name = $browser;
			}
			// en anders controleren we gewoon met de naam die we al hebben
			else $return = (JSX.Browser.name == $browser);
		}
		return $return;
	};
	
	/*****************************************************************************************
	 *	Voer een controle uit of de gebruiker de goede browser heeft en of $version voldoet
	 *	aan de methode $method waarmee we controleren.
	 *
	 *	@param string	$browser	De naam van de browser
	 *	@param string	$version	De versie van de browser
	 *	@param string	$method		De controle methode waarmee de versie moet voldoen
	 *	@return bool
	 */
	JSX.Browser.check = function($browser, $version, $method)
	{
		var $agent = JSX.Browser.getDetails();
		var $return = ($agent.name == $browser);
		
		// vervolgens controleren of de versie overeenkomt (wanneer meegegeven)
		if($return && !JSX.isEmpty($version))
		{
			// de meegegeven version omzetten naar een array met apparte nrs
			var $versions = (String($version).indexOf('.') > -1) 
				? $version.split('.')
				: new Array(String($version));
			
			var $vL = $versions.length;
			var $aL = $agent.versions.length;
			
			var $numV = 0;
			var $numA = 0;
			
			var $iL = Math.max($vL, $aL);
			for(var $i=0; $i<$iL; $i++)
			{
				if($i<$vL) $numV += ($versions[$i]*Math.pow(10, ($iL-$i)));
				if($i<$aL) $numA += ($agent.versions[$i]*Math.pow(10, ($iL-$i)));
			}
			
			//JSX.debug.alert($numV, $numA);
			
			// bepaal welke verglijk methode we gebruiken
			switch($method)
			{
				case 'lt':
				case '<':		$return = ($numA < $numV);	break;
				
				case 'lte':
				case '<=':		$return = ($numA <= $numV);	break;
				
				case 'gt':
				case '>':		$return = ($numA > $numV);	break;
				
				case 'gte':
				case '>=':		$return = ($numA >= $numV);	break;
				
				// 'eq', '==':
				default:		$return = ($numA == $numV);	break;
			}
		}
		return $return;
	};
	
	
	/*****************************************************************************************
	 *	Geeft aan of de huidige browser van de bezoeker Internet Explorer gebaseerd is.
	 *
	 *	@param string	$version	De versie waaraan de browser moet voldoen
	 *	@return bool
	 */
	JSX.Browser.isIE = JSX.Browser.isExplorer = function($version)
	{
		return JSX.Browser.isBrowser(JSX.Browser.IE, $version, ' ');
		//return JSX.Browser.checkBrowser(JSX.Browser.IE, $version, '==');
	};
	
	/*****************************************************************************************
	 *	Geeft aan of de huidige browser van de bezoeker Firefox gebaseerd is.
	 *
	 *	@param string	$version	De versie waaraan de browser moet voldoen
	 *	@return bool
	 */
	JSX.Browser.isFF = JSX.Browser.isFirefox = function($version)
	{
		return JSX.Browser.isBrowser(JSX.Browser.FF, $version, '/');
	};
	
	/*****************************************************************************************
	 *	Geeft aan of de huidige browser van de bezoeker Opera gebaseerd is.
	 *
	 *	@param string	$version	De versie waaraan de browser moet voldoen
	 *	@return bool
	 */
	JSX.Browser.isOpera = function($version)
	{
		return JSX.Browser.isBrowser(JSX.Browser.OPERA, $version, '/');
	};
	
	/*****************************************************************************************
	 *	Geeft aan of de huidige browser van de bezoeker Safari gebaseerd is.
	 *
	 *	@param string	$version	De versie waaraan de browser moet voldoen
	 *	@return bool
	 */
	JSX.Browser.isSafari = function($version)
	{
		return JSX.Browser.isBrowser(JSX.Browser.SAFARI, $version, '/');
	};
	
	/*****************************************************************************************
	 *	Geeft de naam van de huidige browser terug.
	 *
	 *	@return string
	 */
	JSX.Browser.getName = function()
	{
		if(JSX.isEmpty(JSX.Browser.name))
		{
			if(JSX.Browser.isIE()){}
			else if(JSX.Browser.isFF()){}
			else if(JSX.Browser.isOpera()){}
			else if(JSX.Browser.isSafari()){}
			else JSX.Browser.browser = 'unknown';
		}
		return JSX.Browser.name;
	};
	
	/*****************************************************************************************
	 *	Geeft de versie van de huidige browser terug.
	 *
	 *	@return string
	 */
	JSX.Browser.getVersion = function()
	{
		if(JSX.isEmpty(JSX.Browser.version))
		{
			var $ua = navigator.userAgent.toLowerCase();
			var $browser = JSX.Browser.getName();
			var $version = 'unknown';
			
			switch($browser)
			{
				case JSX.Browser.IE:
				case JSX.Browser.OPERA:
				var $d = ($browser == JSX.Browser.IE) ? ';' : ' ';
				var $s = ($ua.indexOf($browser)+JSX.Browser.length+1);
				$version = $ua.substr($s, ($ua.indexOf($d, $s)-$s));
				break;
				
				case JSX.Browser.FF:
				case JSX.Browser.SAFARI:
				$version = $ua.substr($ua.indexOf($browser)+JSX.Browser.length+1);
				break;
			}
			JSX.Browser.version = $version;
		}
		return JSX.Browser.version;
	};
	
	/*****************************************************************************************
	 *	Geeft een Object met de naam en de versie van de huidige browser terug.
	 *
	 *	@return object
	 */
	JSX.Browser.getDetails = function()
	{
		var $browser = JSX.Browser.getName();
		var $version = JSX.Browser.getVersion();
		
		var $return = {};
			$return.name = $browser;
			$return.version = $version;
			$return.versions = ($version.indexOf('.') > -1)
				? $version.split('.')
				: new Array($version);
		
		return $return;
	};
	
	/*****************************************************************************************
	 *	Geeft een Object met de breedte en hoogte van het huidige venster terug of FALSE
	 *	wanneer deze niet kan worden opgehaald.
	 *
	 *	@return object|false
	 */
	JSX.Browser.getSize = function()
	{
		var $w = 0;
		var $h = 0;
		
		if(document.body.offsetWidth && document.body.offsetHeight)
		{
			$w = document.body.offsetWidth;
			$h = document.body.offsetHeight;
		}
		else if(document.body.clientWidth && document.body.clientHeight)
		{
			$w = document.body.clientWidth;
			$h = document.body.clientHeight;
		}
		else
		{
			$w = window.innerWidth;
			$h = window.innerHeight;
		}
		return ($w != 0 && $h != 0) ? {width: $w, height: $h} : false;
	};

/*######################################################################################*/

JSX.System = {};
JSX.SYSTEM_WIN = JSX.System.WIN = 'windows';
JSX.SYSTEM_MAC = JSX.System.MAC = 'mac';
JSX.SYSTEM_UNIX = JSX.System.UNIX = 'unix';

JSX.System.name = '';
JSX.System.version = '';
JSX.System.language = '';

	/*****************************************************************************************
	 *	Controleerd of de gebruiker op het systeem $os werkt.
	 *
	 *	@param string	$os	Het OS waarop moet worden gecontroleerd
	 *	@return bool
	 */
	JSX.System.isOS = function($os)
	{
		var $return = false;
		if(JSX.isEmpty(JSX.System.name))
		{
			$return = (navigator.userAgent.toLowerCase().indexOf($os) != -1);
			if($return) JSX.System.name = $os;
		}
		return $return;
	};
	
	/*****************************************************************************************
	 *	Geeft aan of de bezoeker op een Windows systeem werkt.
	 *
	 *	@return bool
	 */
	JSX.System.isWin = function()
	{
		return JSX.System.isOS(JSX.SYSTEM_WIN);
	};
	
	/*****************************************************************************************
	 *	Geeft aan of de bezoeker op een Macintosh systeem werkt.
	 *
	 *	@return bool
	 */
	JSX.System.isMac = function()
	{
		return JSX.System.isOS(JSX.SYSTEM_MAC);
	};
	
	/*****************************************************************************************
	 *	Geeft aan of de bezoeker op een *unix systeem werkt.
	 *
	 *	@return bool
	 */
	JSX.System.isUnix = function()
	{
		return (!JSX.System.isWin() && !JSX.System.isMac());
	};
	
	/*****************************************************************************************
	 *	Geeft de naam van het huidige OS waarop de gebruiker werkt.
	 *
	 *	@return string
	 */
	JSX.System.getName = function()
	{
		if(JSX.isEmpty(JSX.System.name))
		{
			if(JSX.System.isWin()){}
			else if(JSX.System.isMac()){}
			else if(JSX.System.isUnix()){}
			else JSX.System.os = 'unknown';
		}
		return JSX.System.name;
	};
	
	/*****************************************************************************************
	 *	Geeft de versie van het huidige OS waarop de gebruiker werkt.
	 *
	 *	@return string
	 */
	JSX.System.getVersion = function()
	{
		return UNDEFINED;
	};
	
	/*****************************************************************************************
	 *	Geeft de taal van het huidige OS waarop de gebruiker werkt.
	 *
	 *	@return string
	 */
	JSX.System.getLanguage = function()
	{
		var $return = UNDEFINED;
		var $langs = ['language', 'userLanguage', 'browserLanguage'];
		var $iL = $langs.length;
		for(var $i=0; $i<$iL; $i++)
		{
			var $lang = $langs[$i];
			if(!JSX.isEmpty(navigator[$lang]))
			{
				$return = navigator[$lang];
				if($i==0 && JSX.Browser.isSafari()) $return = $return.split('-')[0];
				break;
			}
		}
		return $return;
	};

/*######################################################################################*/

JSX.Event = {};

	/*****************************************************************************************
	 *	Geeft het Object waarop het wordt uitgevoerd de mogelijkheid om events uit te zenden.
	 *
	 *	@param object	$target	Het Object die events moet kunnen uitzenden
	 *	@return void
	 */
	JSX.Event.makeBroadcaster = function($target)
	{
		$target.__listeners = [$target];
		
		/*************************************************************************************
		 *	...
		 *
		 *	@return void
		 */
		$target.addEventListener = function($listener)
		{
			this.__listeners.push($listener);
		};
		
		$target.removeEventListener = function($listener)
		{
			var $iL = this.__listeners.length;
			for(var $i=0; $i<$iL; $i++)
			{
				if(this.__listeners[$i] == $listener)
				{
					alert('remove listener');
					this.__listeners.splice($i, 1);
					break;
				}
			}
		};
		
		/*$target.addEventHandler = function($eventName, $eventHandler)
		{
			var $listener = {};
				$listener[$eventName] = $eventHandler;
			
			if(!JSX.isArray(this.___handlers[$eventName])) this.___handlers[$eventName] = new Array();
			
			this.___handlers[$eventName].push([$eventHandler, $listener]);
			this.addEventListener($listener);
		};
		
		$target.removeEventHandler = function($eventName, $eventHandler)
		{
			
			var $list = this.___handlers[$eventName];
			var $iL = $list.length;
			alert('remove '+ $eventName +', '+ $list +', '+ $iL);
			for(var $i=0; $i<$iL; $i++)
			{
				if($list[0] == $eventHandler)
				{
					alert('remove '+ $eventName);
					this.___handlers[$eventName].splice($i, 1);
					this.removeEventListener($list[1]);
					break;
				}
			}
		};*/
		
		$target.dispatchEvent = function($eventName, $args)
		{
			if(!JSX.isArray($args)) $args = [];
			
			var $iL = this.__listeners.length;
			for(var $i=0; $i<$iL; $i++)
			{
				var $listener = this.__listeners[$i];
				if(JSX.isSet($listener) && JSX.isFunction($listener[$eventName]))
				{
					$listener[$eventName].apply($listener, $args);
				}
			}
		};
	};
	
	JSX.Event.attach = function($target, $eventName, $eventHandler)
	{
		$eventName = $eventName.toLowerCase();
		
		// ff
		if($target.addEventListener)
		{
			$eventName = $eventName.substr(2);
			$target.addEventListener($eventName, $eventHandler, false);
		}
		// ie
		else if($target.attachEvent)
		{
			$target.attachEvent($eventName, $eventHandler);
		}
		else
		{
			var $event = $target[$eventName];
			if(!JSX.isFunction($event)) $target[$eventName] = $eventHandler;
			else
			{
				$target[$eventName] = function($e)
				{
					$event($e);
					$eventHandler($e);
				};
			}
		}
	};

/*######################################################################################*/

JSX.Element = {};
	
	
	JSX.Element.create = function($element, $target)
	{
		if(!$target) var $target = document.body;
		var $elem = document.createElement($element);
		$target.appendChild($elem);
		return $elem;
	};
	
	JSX.Element.getPosition = function($element)
	{
		var $return = false;
		if($element.nodeType == 1)
		{
			var $parent = $element;
			var $x = $parent.offsetLeft;
			var $y = ($parent.offsetTop-1);
			
			// en haal ook alle x en y punten op voor de elementen
			// waar het veld zich in bevind
			while($parent.offsetParent)
			{
				$parent = $parent.offsetParent;
				$x += $parent.offsetLeft;
				$y += $parent.offsetTop;
			}
			$return =
			{
				x: $x,
				y: $y
			};
		}
		return $return;
	};

/*######################################################################################*/

JSX.Class = {};

	/*****************************************************************************************
	 *	...
	 *
	 *	@return function
	 */
	JSX.Class.create = function($name)
	{
		if(!JSX.isString($name)) var $name = '';
		
		return function()
		{
			this.__name = $name;
			
			if(JSX.isFunction(this.__construct))
			{
				this.__construct.apply(this, arguments);
			}
			if(!JSX.isFunction(this.toString))
			{
				return '[object '+ this.__name +']';
			}
		}
	};
	
	JSX.Class.destroy = function($obj)
	{
		if(JSX.isFunction($obj.__deconstruct)) $obj.__deconstruct();
		$obj = null;
		return $obj;
	};
	
	/*************************************************************************************
	 *	Geeft de naam van de class waaruit het Object bestaat terug.
	 *
	 *	@param mixed	$var	De variabele waarvan we de naam van de class willen weten
	 *	@return string
	 */
	JSX.Class.getName = function($var)
	{
		var $return = null;
		if(JSX.isSet($var) && !JSX.isEmpty($var.constructor))
		{
			var $t = $var.toString();
			if($t.substr(0, 1) == '[' && $t.substr($t.length-1) == ']')
			{
				$return = $t.substr(8, ($t.length-9));
			}
			else
			{
				$t = String($var.constructor);
				var $s = ($t.indexOf('function ')+9);
				$return = $t.substr($s, ($t.indexOf('(', $s)-$s));
			}
		}
		return $return;
	};
	
	JSX.Class.getMethods = function($class)
	{
		var $return = [];
		if(JSX.isFunction($class)) $class = $class.prototype;
		if(JSX.isObject($class))
		{
			for(var $k in $class)
			{
				if(JSX.isFunction($class[$k])) $return.push($k);
			}
		}
		return $return;
	};
	
	JSX.Class.hasMethod = function($class, $method)
	{
		if(JSX.isFunction($class)) $class = $class.prototype;
		return (JSX.isObject($class) && JSX.isFunction($class[$method]));
	};
