Array.prototype.inArray = function( item, equality )
{
	if ( !equality ) equality = function( a, b ) { return a == b; };
	var i = this.length;
	if ( i > 0 ) do { --i; if ( equality( this[ i ], item ) ) return true; } while ( i );
	return false;
}

Array.prototype.indexOf = function( item, equality )
{
	if ( !equality ) equality = function( a, b ) { return a == b; };
	var i = this.length - 1;
	if ( i >= 0 ) do
	{
		if ( equality( this[ i ], item ) ) return i;
	} while ( i-- );
	return i;
}

Array.prototype.trim = function()
{
	var result = new Array();
	var i;
	for ( i = 0; i < this.length; ++i ) result.push( this[ i ].trim() );
	return result;
}

Array.prototype.remove = function( element )
{
	var i = this.length - 1;
	var result = new Array();
	if ( i >= 0 ) do
	{
		if ( element != this[ i ] ) result.push( this[ i ] );
	}
	while( i-- );
	return result;
}

Array.prototype.unique = function()
{
	var result = new Array();
	var i = this.length;
	if ( i > 0 ) do { --i; if ( !result.inArray( this[ i ] ) ) result.push( this[ i ] ); } while( i );
	return result;
}

Array.prototype.foreach = function(func)
{
	var i = this.length;
	if (i > 0) do { --i; func(this[i]); } while(i);
}

Array.prototype.safejoin = function(delimiter)
{
	var i;
	var first = true;
	var result = '';
	for (i in this) if (!this[i].isFunction())
	{
		if (first) { result = this[i].toString(); first = false; }
		else result += delimiter + this[i].toString();
	}
	return result;
}

String.prototype.parseURL = function()
{
	var ret = { path : '', query : {} };
	var match = this.match(/^([^?]*)\?(.*)$/);
	if (match)
	{
		var parm = match[2].split('&');
		ret.path = match[1];
		parm.foreach(function(item) { var tmp = item.split('='); try{ ret.query[tmp[0]] = tmp[1]; } catch(ex) { ret.query[tmp[0]] = ''; } });
	}
	return ret;
}

String.prototype.trim = function()
{
	var result = this.replace(/^\s\s*/, '');
	var ws = /\s/;
	var i = result.length;
	while ( ws.test( result.charAt( --i ) ) );
	return result.slice( 0, i + 1 );
}

String.prototype.sablonReplace = function( from, to )
{
	var text = this;
	if ( from.isArray() && to.isArray() && from.length == to.length )
	{
		var i;
		for ( i = from.length - 1; i >= 0; --i ) text = text.replace( eval( '/&' + from[ i ] + ';/g' ), to[ i ] );
	}
	return text;
}

String.prototype.sablonReplaceEx = function( rules )
{
	var text = this;
	var i;
	for ( i in rules ) text = text.replace( eval( '/&' + i + ';/g' ), rules[ i ] );
	return text;
}


Object.prototype.isArray = function()
{
	var result;
	if ( this.constructor && this.constructor.toString().trim().substr( 0, 14 ) == 'function Array' ) result = true;
	else result = false;
	return result; 
}

Object.prototype.isString = function()
{
	var result;
	if ( this.constructor && this.constructor.toString().trim().substr( 0, 15 ) == 'function String' ) result = true;
	else result = false;
	return result; 
}

Object.prototype.isFunction = function()
{
	return this.toString().trim().substr(0,8) == 'function' || -1 != this.toString().trim().search(/^[a-zA-Z_]*[\t ]*=[\t ]*function/); 
}

Date.prototype.addHours = function( n )
{
	this.setHours( this.getHours() + n );
}

function getEventTarget( event )
{
	var result;
	if ( event.target ) result = event.target;
	else if ( event.srcElement ) result = event.srcElement;
	if ( result.nodeType == 3 ) result = result.parentNode;
	return result;
}

function getCookies()
{
	var result = new Object();
	if ( document.cookie.length > 0 )
	{
		var array = document.cookie.split( ';' );
		var i;
		for ( i = 0; i < array.length; ++i )
		{
			var item = array[ i ].split( '=' );
			if (!item[1]) item[1] = ""; // buta IE
			result[ item[ 0 ].trim() ] = item[ 1 ].trim();
		}
	}
	return result;
}

function applyToAllMatchedElementRec( element, px, ax )
{
	try
	{
		if ( element && element.nodeName && element.id && ("" + element.id).search( px ) != -1 )
		{
			ax( element );
		}
	}
	catch ( ex ) {  }
	if ( element.childNodes )
	{
		var i;
		for ( i = 0; i < element.childNodes.length; ++i ) applyToAllMatchedElementRec( element.childNodes[ i ], px, ax );
	}
}

function applyToAllMatchedElement( pattern, apply )
{
	applyToAllMatchedElementRec( document.body, pattern, apply );
}

function applyToAllSubelement( element, apply )
{
	if ( element.tagName ) apply( element );
	if ( element.childNodes )
	{
		var i;
		for ( i = 0; i < element.childNodes.length; ++i ) applyToAllSubelement( element.childNodes[ i ], apply );
	}
}

function globalOffsetTop( obj )
{
	if ( obj.offsetTop != null )
	{
		var result = obj.offsetTop;
		if ( obj.offsetParent != null )
		{
			var p = obj.offsetParent;
			while ( p != null )
			{
				result += p.offsetTop;
				p = p.offsetParent;
			}
		}
		return result;
	}
	else
	{
		return 0;
	}
}

function globalOffsetLeft( obj )
{
	if ( obj.offsetTop != null )
	{
		var result = obj.offsetLeft;
		if ( obj.offsetParent != null )
		{
			var p = obj.offsetParent;
			while ( p )
			{
				result += p.offsetLeft;
				p = p.offsetParent;
			}
		}
		return result;
	}
	else
	{
		return 0;
	}
}

function submitAForm(action, fields, method)
{
	var form = document.createElement('form');
	form.method = method ? method : 'get';
	form.accpectCharset = 'utf-8';
	form.action = action;
	var div = document.createElement('div');
	try { form.style.display = 'none;'; } catch (ex) { }
	if (fields && fields.length) for(var i in fields) if (parseInt(i) == i)
	{
		input = document.createElement('input');
		input.type = 'hidden';
		input.name = fields[i].name;
		input.value = fields[i].value;
		div.appendChild(input);
	}
	form.appendChild(div);
	document.body.appendChild(form);
	form.submit();
}

function addOption(select, value, text)
{
	var option = document.createElement('option');
	option.text = text;
	option.value = value;
	try { select.add( option, null ); }
	catch( ex ) { select.add( option ); }
	return option;
}

function getOpacity(element)
{
	var result = 1.0;
	if (element.style)
	{
		var match;
		if (element.style.opacity) result = parseFloat(element.style.opacity);
		else if (element.style.MozOpacity) result = parseFloat(element.style.MozOpacity);
		else if (element.filters && element.filters.alpha && element.filters.alpha.opacity) result = parseFloat(element.filters.alpha.opacity) / 100.0;
		else if (match = element.style.filter.match(/^alpha\(opacity=([0-9]{1,3})\)$/)) result = parseFloat(match[1]) / 100.0;
	}
	return result;
}

function setOpacity(element, opacity)
{
	if (element.style)
	{
		if (element.style.opacity) element.style.opacity = opacity;
		else if (element.style.MozOpacity) element.style.MozOpacity = opacity;
		else if (element.filters && element.filters.alpha && element.filters.alpha.opacity) element.filters.alpha.opacity = parseInt(opacity * 100.0);
		else element.style.filter = 'alpha(opacity=' + parseInt(opacity * 100.0) + ')';
	}
}
