var Toolbox = new Class({

	initialize: function()
	{
		window.addEvent('domready', this.fixChildLabelEvents);
		this.highestDepth = 0;
	},

	/**
	 * Javascript version for php ucfirst function
	 *
	 * @return the string with its first character uppercase
	 **/
	ucfirst: function( string )
	{
		string += '';
		return string.charAt(0).toUpperCase() + string.substr(1);
	},

	/**
	 * Fix IE bug which does not propagate click event on an image
	 * encapsulated into a label to this label
	 *
	 * @return void
	 **/
	fixChildLabelEvents: function()
	{
		if( Browser.Engine.trident4 )
		{
			document.getElements('label').forEach(function(element, index){
				element.getChildren().forEach(function(element, index){
					if(element.get('tag') == 'img')
					{
						element.removeEvents('click').addEvent('click', function(event) {
							new Event(event).target.getParent().click();
						});
					}
				});
			});
		}
	},

	/**
	 * Switch image for registerRollover method
	 * Will deal with the IE special cas for DXImage filters
	 *
	 * @param object_or_id (DOM img element)
	 * @param mixed mask string or regex
	 * @param string replacement
	 * @return void
	 **/
	switchImage: function(object_or_id, mask, replacement)
	{
		if ( Browser.Engine.trident4 && object_or_id.hasClass('fixpng') )
		{
			object_or_id.style.filter = object_or_id.style.filter.replace(mask, replacement);
		}
		else
		{
			object_or_id.src = object_or_id.src.replace(mask, replacement);
		}
	},

	/**
	 * Auto handle rollover statuses and sources for a specific img element
	 * Will preload the *_on* *_click* and *_disable* images based on the *_off* image path
	 * and attach the corresponding events (if the image is not disabled)
	 *
	 * @param object_or_id (DOM img element)
	 * @param boolean handleClick handle the click status (default = false)
	 * @param boolean handleDisable handle the disabled status (default = false)
	 * @return void
	 **/
	registerRollover: function(object_or_id, handleClick, handleDisable)
	{
		if ( !$(object_or_id) ) return;

		var src = object_or_id.getProperty('src');
		object_or_id = $(object_or_id);
		[
			src,
			src.toString().replace(/_off/g, '_on')
		].forEach(function(el,i){
			new Asset.images(el);
		});
		//object_or_id.setProperty('previousSrc', src.toString());

		if($chk(handleDisable))
		{
			new Asset.images(src.toString().replace(/_off/g, '_disable'));
		}

		object_or_id.addEvent('mouseover', function(){
			if( !URBAN.page.toolbox.isDisabled(this) )
			{
				URBAN.page.toolbox.switchImage(this, /(_off|_disable)/g, '_on');
			}
		}).addEvent('mouseout', function(){
			if( !URBAN.page.toolbox.isDisabled(this) )
			{
				URBAN.page.toolbox.switchImage(this, /(_on|_disable)/g, '_off');
			}
		});

		if($chk(handleClick))
		{
			new Asset.images(src.toString().replace(/_off/g, '_click'));
			object_or_id.addEvent('mousedown', function(){
				if( !URBAN.page.toolbox.isDisabled(this) )
				{
					URBAN.page.toolbox.switchImage(this, /(_on|_off|_disable)/g, '_click');
				}
			});
			object_or_id.addEvent('mouseup', function(){
				if( !URBAN.page.toolbox.isDisabled(this) )
				{
					URBAN.page.toolbox.switchImage(this, /(_click|_disable)/g, '_on');
				}
			});
		}
	},

	/**
	 * Turn radiobuttons in fancy image version only
	 *
	 * @param object_or_id (DOM input element)
	 * @param parent_object_or_id (DOM input element)
	 * @return void
	 **/
	registerRadiobutton: function(object_or_id, parent_object_or_id)
	{
		object_or_id = $(object_or_id);
		$E('label[for=' + object_or_id.getProperty('id') + ']', parent_object_or_id).getChildren().forEach(function(element, index){
			if( element.get('tag') == 'img' && element.getProperty('src').toString().match(/(_off|_click|_disable)/g) )
			{
				object_or_id.setStyles({
					'position': 'absolute',
					'left': '-1000px'
				});

				var radioGroup = $ES('input[name=' + object_or_id.getProperty('name') + ']', parent_object_or_id);

				URBAN.page.toolbox.registerRollover(element);
				element.removeEvents('click').getParent().removeEvents('click').addEvent('click', function(event) {
					radioGroup.forEach(function(radio, index){
						if(radio != object_or_id)
						{
							var image = $E('label[for=' + radio.getProperty('id') + '] img', parent_object_or_id);
							URBAN.page.toolbox.switchImage(image, /(_on|_click|_disable)/g, '_off');
						}
					});
					if(!URBAN.page.toolbox.isDisabled(object_or_id))
					{
						URBAN.page.toolbox.switchImage(element, /(_on|_off|_disable)/g, '_click');
					}

				});
			}
		});
	},

	/**
	 * Get the next highest available z-index of the current DOM
	 * kind of actionscript's _root.getNextHighestDepth()+1
	 *
	 * @return integer z-index
	 **/
	getNextHighestZindex: function(object_or_id)
	{
		if ( object_or_id == undefined && this.highestDepth != 0 )
		{
			++this.highestDepth;
			return this.highestDepth;
		}

		object_or_id = $(object_or_id);
		var highestIndex = 0;
		var currentIndex = 0;
		var elArray = Array();
		if(object_or_id)
		{
			elArray = object_or_id.getElementsByTagName('*');
		}
		else
		{
			elArray = document.getElementsByTagName('*');
		}
		for(var i=0; i < elArray.length; i++)
		{
			if (elArray[i].getAttribute('id') == 'console') // Bypass console instance
			{
				continue;
			}

			if (elArray[i].currentStyle)
			{
				currentIndex = parseFloat(elArray[i].currentStyle['zIndex']);
			}
			else if(window.getComputedStyle)
			{
				currentIndex = parseFloat(document.defaultView.getComputedStyle(elArray[i],null).getPropertyValue('z-index'));
			}
			if(!isNaN(currentIndex) && currentIndex > highestIndex)
			{
				highestIndex = currentIndex;
			}
		}

		if ( object_or_id == undefined )
		{
			this.highestDepth = (highestIndex + 1);
		}

		return (highestIndex + 1);
	},

	/**
	 * Check if a specific element is disabled or not
	 * Forms objects only can have disabled property. For all others, this method will verify their class names
	 *
	 * @param DOM object
	 * @return boolean
	 **/
	isDisabled: function(object_or_id)
	{
		object_or_id = $(object_or_id);

		if ( !object_or_id ) return;

		if( $chk(object_or_id.disabled) || $chk(object_or_id.hasClass('disabled')) )
		{
			return true;
		}
		else
		{
			return false;
		}
	},

	/**
	 * Check if a specific element is disabled or not
	 * isDisabled's alias for reverse developers ;)
	 *
	 * @param DOM object
	 * @return DOM object
	 **/
	isEnable: function(object_or_id)
	{
		object_or_id = $(object_or_id);
		return !this.isDisable(object_or_id);
	},

	/**
	 * Toggle the current disabled status for a specific element
	 *
	 * @param DOM object
	 * @return DOM object
	 **/
	toggleDisable: function(object_or_id)
	{
		object_or_id = $(object_or_id);

		if ( !object_or_id ) return;

		if( this.isDisabled(object_or_id) )
		{
			return this.enable(object_or_id);
		}
		else
		{
			return this.disable(object_or_id);
		}
	},

	/**
	 * Toggle the current disabled status for a specific element
	 * toggleDisable's alias for reverse developers ;)
	 *
	 * @param DOM object
	 * @return DOM object
	 **/
	toggleEnable: function(object_or_id)
	{
		object_or_id = $(object_or_id);
		return this.toggleDisable(object_or_id);
	},

	/**
	 * Add a disabled property or class for the specified element
	 *
	 * @param DOM object
	 * @return DOM object
	 **/
	disable: function(object_or_id)
	{
		object_or_id = $(object_or_id);

		if ( !object_or_id ) return;

		var formElements = new Array('input', 'textarea', 'select', 'button');
		if( formElements.indexOf( object_or_id.get('tag') ) >= 0 )
		{
			object_or_id.setProperty('disabled', 'disabled');
		}
		else
		{
			object_or_id.addClass('disabled');
		}

		if( $chk( object_or_id.getProperty('src') ) )
		{
			//object_or_id.setProperty('src', object_or_id.getProperty('src').replace(/(_off|_on|_click)/g, '_disable'));
			//object_or_id.setProperty('previousSrc', object_or_id.getProperty('src').toString());
			URBAN.page.toolbox.switchImage(object_or_id, /(_off|_on|_click)/g, '_disable');
		}
		return object_or_id;
	},

	/**
	 * Remove disabled property or class for the specified element
	 *
	 * @param DOM object
	 * @return DOM object
	 **/
	enable: function(object_or_id)
	{
		object_or_id = $(object_or_id);

		if ( !object_or_id ) return;

		if( object_or_id.hasClass('disabled') )
		{
			object_or_id.removeClass('disabled');
		}
		else
		{
			object_or_id.removeProperty('disabled');
		}
		if( $chk( object_or_id.getProperty('src') ) )
		{
			URBAN.page.toolbox.switchImage(object_or_id, /_disable/g, '_off');
		}
		return object_or_id;
	},

	/**
	 * Check if a cookie exists
	 *
	 * @param string name of the cookie
	 * @return boolean
	 **/
	hasEnv: function(key)
	{
//		return false;
		return ( document.cookie && ( document.cookie.indexOf(escape(key)) != -1 ) && this.getEnv(key) );
	},

	/**
	 * Set a cookie
	 *
	 * @param string name of the cookie
	 * @param string value of the cookie
	 * @param integer lifetime of the cookie in seconds. May be negative
	 * @return mixed stored cookie or false
	 **/
	setEnv: function(key, value, lifetime, domain)
	{			
		// Avoid a bug in IE
		this.clearEnv(key);

		// Set cookie
		Cookie.write(key, value, {
			'duration': lifetime / (60 * 60 * 24),
			'domain': domain,
			'path': '/'
		});

		return document.cookie;
	},

	/**
	 * Get a cookie
	 *
	 * @param string name of the cookie
	 * @return mixed cookie value or false
	 **/
	getEnv: function(key)
	{
		return Cookie.read(key);
	},

	/**
	 * Delete a cookie
	 *
	 * @param string name of the cookie
	 **/
	clearEnv: function(key)
	{
		Cookie.dispose(key, {'domain': document.domain, 'path' : '/'});
		Cookie.dispose(key, {'domain': 'urban-rivals.com', 'path' : '/'});
		Cookie.dispose(key, {'path' : '/'});
	},

	/**
	 * Return the value of a GET parameter of the current page uri
	 *
	 * @param name of the GET parameter
	 * @param default needed value of the GET parameter
	 * @return mixed value or false
	 **/
	getParam: function(param_name, default_value, url)
	{
		if(!window.uri_parameters)
		{
			var url = (url ? url : document.location.search);
			if(url.contains('?'))
			{
				var query = url.split('?')[1];
				if(query != '')
				{
					var parameters = new Object();
					params = query.split('&');
					params.each(function(param){
						param = param.split('=');
						parameters[param[0]] = unescape(param[1]);
					});
					window.uri_parameters = parameters;
				}
			}
		}

		if( window.uri_parameters && $defined( window.uri_parameters[param_name] ) )
		{
			return window.uri_parameters[param_name];
		}
		else
		{
			return ( $defined(default_value) ) ? default_value : false;
		}
	},

	/**
	 * Alter an url to set a param
	 *
	 * @param name of the GET parameter
	 * @param default needed value of the GET parameter
	 * @return mixed value or false
	 **/
	setParam: function(param_name, value, url)
	{
		var url = (url ? url : document.location.href);
		var canonical_url = url;
		var parameters = new Object();
		var new_query = new Array();

		if(url.contains('?'))
		{
			canonical_url = url.split('?')[0];
			var query = url.split('?')[1];
			if(query != '')
			{
				params = query.split('&');
				params.each(function(param){
					param = param.split('=');
					parameters[param[0]] = unescape(param[1]);
				});
			}
		}
		parameters[param_name] = value;

		for( var i in parameters )
		{
			new_query.push(i + '=' + encodeURIComponent(parameters[i]));
		}

		return canonical_url + '?' + new_query.join('&');
	},

	/**
	 * Check if a specific GET parameter exists on the current page uri
	 *
	 * @param name of the GET parameter
	 * @return boolean
	 **/
	hasParam: function(param_name, url)
	{
		if( URBAN.page.toolbox.getParam(param_name, url) )
		{
			return true;
		}
		return false;

	}

});

window.addEvent('domready', function(){
	URBAN.page.toolbox = new Toolbox();
});