if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this) {
	  fun.call( thisp, this[i], i, this);
	  }
    }
  };
}

var b, __pop, IE = (!window.opera && document.all ? true : false);
var debug = (window.debugMode == undefined || window.debugMode == null) ? true : window.debugMode;

var Classes = new Object();
window.Classes = Classes;

var Class = function() {
	return function() {
		this.extend = function(classObj) {
			var tmp = _r(arguments,1);
			if(classObj instanceof Object) {
					if(classObj.prototype) {
						for (var property in classObj.prototype)
							if(!this[property]) this[property] = classObj.prototype[property];
						if(classObj.prototype['__construct']) classObj.prototype['__construct'].apply(this,tmp);
					}
					else {
						for (var property in classObj)
							this[property] = classObj[property];
						if(classObj['__construct']) classObj['__construct'].apply(this,tmp);
					}
			}
		};
		this.copy = function(classObj) {
			if(classObj && classObj instanceof Object)
				if(classObj.prototype) {
					for (var property in classObj.prototype)
						this[property] = classObj.prototype[property];
				}
				else {
					for (var property in classObj)
						this[property] = classObj[property];
				}
		};
		this.clone = function() {
			var obj = new Class();
			for (var property in this)
				obj[property] = this[property];
			return obj;
		};
		this.info = function() {
			var str = '';
			for (var property in this)
				if(this[property] instanceof Object)
					str+=property+'=[Object]\r\n';
				else str+=property+'='+this[property]+'\r\n';
			return str;
		};
		this.infoAbout = function(obj) {
			var str = '';
			for (var property in obj)
				if(this[property] instanceof Object)
					str+=property+'=[Object]\r\n';
				else str+=property+'='+this[property]+'\r\n';
			return str;
		};
		this.inherited = function(classObject,method) {
			if(!classObject) return;

			var tmp = _r(arguments,2);
			if(classObject.prototype && classObject.prototype[method])
				return classObject.prototype[method].apply(this, tmp);
			else if(classObject && classObject[method])
				return classObject[method].apply(this, tmp);
		}
		//---------------------------------

		if(this.__construct && this.__construct.apply) this.__construct.apply(this, arguments);

	}
};

Classes.Browser = new Class()
Classes.Browser.prototype = {
	isIE: false,
	isIE6: false,
	isIE7: false,
	isIE8: false,
	isOpera: false,
	isFireFox: false,
	isSafari: false,
	__construct: function() {
		reg = new RegExp("(MSIE|FIREFOX|OPERA|SAFARI)[^0-9]*(\\d)+","g");
		matches = reg.exec(navigator.userAgent.toUpperCase());
		if(matches!=null) {
			switch(matches[1]) {
			case 'MSIE':
				this.isIE = true;
				if(matches[2] && parseInt(matches[2]) == 6) this.isIE6 = true;
				if(matches[2] && parseInt(matches[2]) == 7) this.isIE7 = true;
				if(matches[2] && parseInt(matches[2]) == 8) this.isIE8 = true;
				break;
			case 'FIREFOX':
				this.isFirefox = true;
				break;
			case 'OPERA':
				this.isOpera = true;
				break;
			case 'SAFARI':
				this.isSafari = true;
				break;
			}
			if(this.isIE && window.opera) {
				this.isIE = false;
				this.isOpera = true;
			}
		}
	},
	displayInfo: function() {
			var str = '';
			for (var property in this)
				if(property.substr(0,2) == 'is') str+=property+' = '+this[property]+'\r\n';
			alert(str);
	}
}

var browser = new Classes.Browser();

Classes.ElementList = Class();
Classes.ElementList.prototype = {
	elementArray: null,
	selector:		null,
	tagName:		null,
	tagId:			null,
	className:	null,
	rootElement:  null,
	__construct: function(selector) {
		this.elementArray = new Array();
		if(arguments.length>=2)
			this.rootElement = arguments[1];
		reg = new RegExp("^(\\w*\\s*)?(\\#\\w+\\s*)?(\\s*\\.(?:\\w*\\s*)+){0,1}","g");
		matches = reg.exec(selector);
		if(matches != null && matches.length<=4) {
			this.selector = matches[0];
			this.tagName = matches[1];
			if(this.tagName)
				this.tagName = this.tagName.toUpperCase().replace(' ','');
			this.tagId = matches[2];
			if(this.tagId)
				this.tagId = this.tagId.substr(1);
			this.className = matches[3];
			if(this.className)
				this.className = this.className.substr(1);
			this.harvestElements(this.rootElement);
		}
	},
	checkNodeList: function(nodeList) {
		var classRule = new RegExp("^"+this.className+"\\s*|\\s+"+this.className+"\\s+|\\s*"+this.className+"\\s*$","g");
		for(var i=0;i<nodeList.length;i++) {
			e = nodeList[i];
			if(this.tagName && this.tagName != e.nodeName) continue;
			if(this.tagId && this.tagId != e.id) continue;
			if(this.className && !(e.className && e.className.match(classRule))) continue;
			this.elementArray.push(e);
		}
	},
	harvestElements: function() {
		var tab = arguments.length>=1 ? arguments[0] : null;
		if(this.tagId) {
			tab = new Array;
			tab.push(_e(this.tagId));
			this.checkNodeList(tab);
		}
		else
		if(this.tagName) {
			tab = (!tab ? document.body : tab).getElementsByTagName(this.tagName.toUpperCase());
			this.checkNodeList(tab);
			return;
		}
		else {
			tab = (!tab ? document.body : tab);
			this.checkNodeList(tab.childNodes);
			if(!tab.childNodes) return;
			for(var i=0;i<tab.childNodes.length;i++)
				this.harvestElements(tab.childNodes[i]);
		}
	},
	forEach: function(callback) {
		this.elementArray.forEach(callback,this);
	}
};

function wylaczEnter(e)
{
	var key;
	key = (window.event)? window.event.keyCode : e.which; //IE : FF

	return (key != 13);
}



function _join(obj1,obj2) {
	var newObj = {};
	for(var a in obj1) {
		newObj[a] = obj1[a];
	}
	for(var a in obj2) {
		newObj[a] = newObj[a]!==undefined ? newObj[a] : obj2[a];
	}
	return newObj;
}

function _e(x) { return (typeof x == 'string') ? document.getElementById(x) : x; }

function _n(x) { var y = _e(x); return y ? y.nodeName : null; }

function _v(x) { var y = _e(x); return y ? (y.value ? y.value : y.innerHTML) : (arguments.lenght>=2 ? arguments[1] : null); }

function _root(x) { return root = (x ? (x.documentElement ? x.documentElement : x.firstChild) : null); }

function _xn(x) { return x ? x.nodeName : null; }

function _xv(x) { return x ? (x.nodeValue ? x.nodeValue : (x.firstChild ? x.firstChild.nodeValue : (arguments.lenght>=2 ? arguments[1] : null))) : (arguments.lenght>=2 ? arguments[1] : null); }

function _string(value,defaultValue) {
	var v = !value ? defaultValue : value;
	return v;
}
function _int(value,defaultValue) {
	var v = parseInt(value, 10);
	if(isNaN(v)) v = defaultValue;
	return v;
}

function _offset(e) {
	var a = [0,0];
	var e = _e(e);
	while(e && e.parentNode!=undefined) {
		a[1] += e.offsetTop;
		a[0] += e.offsetLeft;
		e = e.offsetParent;
	}
	return a;
}

function show(e) { e = _e(e);	if(e) e.style.display = ''; }

function hide(e) { e = _e(e); if(e) e.style.display = 'none'; }

function _switch(e) { e = _e(e); if(e) { if(e.style.display == 'none') e.style.display = ''; else e.style.display = 'none' } }

function _style(e) {
	return browser.isIE ? e.currentStyle : (window.getComputed ? window.getComputed(e,'') : document.defaultView.getComputedStyle(e, ''));	
}

function centerElement(element)
{
		element = _e(element);
		var hasElement = document.documentElement && document.documentElement.clientWidth;
		var w = browser.isIE ? (hasElement ? document.documentElement.clientWidth : document.body.clientWidth) : window.innerWidth;
		var h = browser.isIE ? (hasElement ? document.documentElement.clientHeight : document.body.clientHeight) : window.innerHeight;
		var offsetTop = _int((browser.isIE || browser.isOpera ? (hasElement ? document.documentElement.scrollTop : document.body.scrollTop) : window.scrollY),0);
		var offsetLeft = _int((browser.isIE || browser.isOpera ? (hasElement ? document.documentElement.scrollLeft : document.body.scrollLeft) : window.scrollX),0);

		element.style.position = 'absolute';
		element.style.left = '0px';
		element.style.top = '0px';

		var eo = _offset(element);
		offsetLeft -= eo[0];
		offsetTop -= eo[1];

		var x = offsetLeft+(w - element.offsetWidth)/2;
		var y = offsetTop+(h - element.offsetHeight)/2;

		element.style.left = _int(x,0)+'px';
		element.style.top = _int(y,0)+'px';
}

function _a() {
	var array = new Array();
	if(arguments.length == 1) {
		if(arguments[0] instanceof Array) return arguments[0];
		else if(arguments[0] instanceof Object) {
			if(arguments[0].length)
				for(var i=0;i<arguments[0].length;i++) array.push(arguments[0][i]);
			else
				for(var n in arguments[0]) array.push(arguments[0][n]);
		}
		else array.push(arguments[0]);
	} else
		for(var i=0;i<arguments.length;i++) array.push(arguments[i]);
	return array;
}

function _r(x) {
	var y = _a(x);
	switch(arguments.length) {
	case 1:	break;
	case 2:
		return y.slice(arguments[1],y.length);
		break;
	case 3:
		return y.slice(arguments[1],arguments[2]);
		break;
	}
	return y;
}

Function.prototype.bind = function() {
  var method = this, object = arguments[0];
  return function() {
	var args = _a(arguments);
	return method.apply(object, args);
  }
}

Function.prototype.bindEvent = function() {
  var method = this, object = arguments[0], args = _a(arguments);
  return function(e) {
	args[0] = e;
	return method.apply(object, args);
  }
}

Function.prototype.bindArgs = function() {
  var method = this, object = arguments[0], args = _r(arguments,1);
  return function() {
	return method.apply(object, args);
  }
}

Function.prototype.bindFuncArgs = function() {
  var method = this, args = _a(arguments);
  return function() {
	return method.apply(method, args);
  }
}

Function.prototype.bindResponse = function() {
  var method = this, object = arguments[0];
  return function() {
	var args = _a(arguments);
	args = [].concat([this],args);
	return method.apply(object, args);
  }
}
/*
if (!Array.prototype.forEach) {
	Array.prototype.forEach = function(fun) {
		var len = this.length;
		if (typeof fun != "function") throw new TypeError();
		var thisp = arguments[1];
		for (var i = 0; i < len; i++) {
			if (i in this) fun.call(thisp, this[i], i, this);
		}
	};
}
*/



function formGetData(formId)
{
	var formNode = _e(formId);
	var formLen = formNode.length;
	var requestData = '';

	if(formNode && formNode.length > 0) {
		for(var j=0;j<formNode.length;j++) {
			var node = formNode.elements[j];
			if(j==0)
				requestData = node.name + '=' + encodeURIComponent(node.value);
			else
				requestData += '&' + node.name + '=' + encodeURIComponent(node.value);
		}
	}
	return requestData;
}

function addEvent(element,event,func) {
	if(!element) return;
	if(browser.isIE) element.attachEvent("on"+event, func);
	else element.addEventListener(event,func,false);
}

function removeEvent(element,event,func) {
	if(!element) return;
	if(browser.isIE) element.detachEvent("on"+event, func);
	else element.removeEventListener(event,func,false);
}

function eventTarget(x) {
	x = x ? x : window.event;
	return Core.ie ? x.srcElement : x.target;
}

function fixEvent(x) {
	return x ? x : window.event;
}

function preventDefault(e) {
	if(!e) return;
	if(e.preventDefault) e.preventDefault();
	e.returnValue = false;
}

function stopPropagation(e) {
	if(!e) return;
	if(e.stopPropagation) e.stopPropagation();
	e.cancelBubble = true;
}

function objectInfo(object) {
	if(!object) return '';

	var str = '<table>';
	for(var e in object) {
		str += '<tr><td style="vertical-align: top">'+e+':</td><td>';
		if(object[e]) {
			if(typeof (object[e]) == "object") str += "{<br />"+objectInfo(object[e])+"}";
			else str += object[e];
		}
		str += '</td></tr>';
	}
	str += '</table>';
	return str;
}

/* http://www.openjs.com/scripts/dom/class_manipulation.php */
function hasClass(ele,cls) {
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}

function redirectTo(url) {
	document.location = url;
}

function dump_arr(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}

