	var STATE_NONE 				= 0;
	var STATE_LOADING 		= 1;
	var STATE_LOADED			= 2;
	var STATE_PROGRESS 	= 3;
	var STATE_READY				= 4;
	
	var EVENT_START				= 'event_1';
	var EVENT_UPDATE			= 'event_2';
	var EVENT_COMPLETE	= 'event_3';
	var EVENT_ERROR			= 'event_4';
	var EVENT_CHANGE			= 'event_5';
	var EVENT_STOP				= 'event_6';

	if(!Function.prototype.bind)
	{
		Function.prototype.bind = function()
		{
			var method = this, args = new Array(), object, x;

			for(x=0; x < arguments.length; ++x)
			{
				if(x > 0)
				{
					args.push(arguments[x]);
					continue;
				}
				object = arguments[x];
			}

			return function()
			{
				return method.apply(object, args);
			};
		};
	}

	
	function TypeOf(obj)
	{
		return (String(obj.constructor).split(' ')[1] != null ? String(obj.constructor).split(' ')[1].replace('()', '') : '');
	}


	function isSiteOnline()
	{
		return (document.location.protocol != 'file:');
	}
	
	
	function Timer()
	{
		this.intInterval 	= null;
		this.delay	 	 	= 0;
		this.repeatCount 	= 0;
		this.currentCount 	= 0;
		this.running	 	= false;
		this.objEvents 		= {};
		this.cache			= {};

		this.constructor = function(delay, repeatCount)
		{
			if(delay == undefined || isNaN(delay)) delay = 1000;

			if(repeatCount == undefined || isNaN(repeatCount)) repeatCount = 0;

			this.delay 		 = delay;
			this.repeatCount = repeatCount;
		}

		this.start = function()
		{
			this.dispatchEvent(EVENT_START);
			
			this.running	 = true;
			this.intInterval = setInterval(this.exec.bind(this), this.delay);
		}

		this.stop = function()
		{
			this.running = false;
			window.clearInterval(this.intInterval);
			
			this.dispatchEvent(EVENT_STOP);
		}

		this.reset = function()
		{
			this.stop();
			this.currentCount = 0;
		}

		this.exec = function()
		{
			++this.currentCount;

			if(this.currentCount >= this.repeatCount && this.repeatCount != 0)
			{
				this.dispatchEvent(EVENT_COMPLETE);
				this.stop();
			}
			else
			{
				this.dispatchEvent(EVENT_UPDATE);
			}
		}

		this.addEvent = function(strEvent, objOptions)
		{
			if(strEvent != undefined && strEvent != '' && this.objEvents[strEvent] == null)
			{
				this.objEvents[strEvent] = objOptions;
				this.objEvents[strEvent].params = objOptions.params || [];
				this.objEvents[strEvent].scope  = objOptions.scope || this;
			}
		}

		this.dispatchEvent = function(strEvent)
		{
			if(strEvent != undefined && strEvent != '' && this.objEvents[strEvent] != null)
			{
				if(this.objEvents[strEvent].func != null)
				{
					this.objEvents[strEvent].func.apply(this.objEvents[strEvent].scope, this.objEvents[strEvent].params);
				}
			}
		}
		this.constructor.apply(this, arguments);
	}



	function getParameter(strName, strURL)
	{
		var arrContainer 	= new Array();
		var blnLocked			= false;
		var blnIsArray		= false;
		var arrTempURL		= String(document.location.search.replace(/%20&%20/g, '%20%26%20')).substr(1).split('&');
		
		if(strURL != undefined)
		{
			if(strURL.indexOf('?') >= 0)
			{
				strURL = strURL.substr((strURL.indexOf('?') + 1));
			}
			
			if(strURL.indexOf('#') >= 0)
			{
				strURL = strURL.substr(0, strURL.indexOf('#'));
			}
			arrTempURL = strURL.replace(/%20&%20/g, '%20%26%20').split('&');
		}

		for(var i=0;i < arrTempURL.length;++i)
		{
			arrElements 	= arrTempURL[i].split('=');
			blnIsArray		= false;

			if(String(arrElements[0]).indexOf('[]') >= 0)
			{
				blnIsArray = true;
				arrElements[0] = arrElements[0].replace(/\[\]/gi, '');
			}

			if(strName == arrElements[0])
			{
				if(arrElements.length == 1)
				{
					return true;
				}

				if(blnIsArray)
				{
					arrContainer[arrContainer.length] = arrElements[(arrElements.length-1)];

					if(arrElements.length > 2)
					{
						arrElements.shift();

						arrContainer[arrContainer.length] = arrElements.join('=');
					}
					blnLocked = true;
				}
				else
				{
					var strReturn = arrElements[(arrElements.length-1)];

					if(arrElements.length > 2)
					{
						arrElements.shift();

						strReturn = arrElements.join('=');
					}
					return strReturn;
				}
			}
		}
		return (blnLocked ? arrContainer : null);
	}
