var Core = {};
if (document.addEventListener){
	Core.addEventListener = function(target, type, listener){
		target.addEventListener(type, listener, false);
	};
	Core.removeEventListener = function(target, type, listener){
		target.removeEventListener(type, listener, false);
	};
	Core.preventDefault = function(event){
		event.preventDefault();
	};
	Core.stopPropagation = function(event){
		event.stopPropagation();
	};
}else if (document.attachEvent){
	Core.addEventListener = function(target, type, listener){
		if (Core._findListener(target, type, listener) != -1) return;
		var listener2 = function(){
			var event = window.event;
			if (Function.prototype.call){
				listener.call(target, event);
			}else{
				target._currentListener = listener;
				target._currentListener(event)
				target._currentListener = null;
			}
		};
		target.attachEvent("on" + type, listener2);
		var listenerRecord = {
			target: target,
			type: type,
			listener: listener,
			listener2: listener2
		};
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		var listenerId = "l" + Core._listenerCounter++;
		if (!targetWindow._allListeners) targetWindow._allListeners = {};
		targetWindow._allListeners[listenerId] = listenerRecord;
		if (!target._listeners) target._listeners = [];
		target._listeners[target._listeners.length] = listenerId;
		if (!targetWindow._unloadListenerAdded){
			targetWindow._unloadListenerAdded = true;
			targetWindow.attachEvent("onunload", Core._removeAllListeners);
		}
	};
	Core.removeEventListener = function(target, type, listener){
		var listenerIndex = Core._findListener(target, type, listener);
		if (listenerIndex == -1) return;
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		var listenerId = target._listeners[listenerIndex];
		var listenerRecord = targetWindow._allListeners[listenerId];
		target.detachEvent("on" + type, listenerRecord.listener2);
		target._listeners.splice(listenerIndex, 1);
		delete targetWindow._allListeners[listenerId];
	};
	Core.preventDefault = function(event){
		event.returnValue = false;
	};
	Core.stopPropagation = function(event){
		event.cancelBubble = true;
	};
	Core._findListener = function(target, type, listener){
		var listeners = target._listeners;
		if (!listeners) return -1;
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		for (var i = listeners.length - 1; i >= 0; i--){
			var listenerId = listeners[i];
			var listenerRecord = targetWindow._allListeners[listenerId];
			if (listenerRecord.type == type && listenerRecord.listener == listener){
				return i;
			}
		}
		return -1;
	};
	Core._removeAllListeners = function(){
		var targetWindow = this;
		for (id in targetWindow._allListeners){
			var listenerRecord = targetWindow._allListeners[id];
			listenerRecord.target.detachEvent("on" + listenerRecord.type, listenerRecord.listener2);
			delete targetWindow._allListeners[id];
		}
	};
	Core._listenerCounter = 0;
}

Core.addClass = function(target, theClass){
	if (!Core.hasClass(target, theClass)){
		if (target.className == ""){
			target.className = theClass;
		}else{
			target.className += " " + theClass;
		}
	}
};
Core.getById = function(A){
	return document.getElementById(A);
};
Core.getValue = function(elm){
	var element = Core.getById(elm);
	if( element.value != "" ){
		return element.value;
	}
	return null;
};
Core.getByName = function (A){
	return document.getElementByName(A);
};
Core.getByTagName = function (A){
	return document.getElementsByTagName(A);
};
Core.newEl = function(A){
	return document.createElement(A);
};
Core.getElementsByClass = function(theClass){
	var elementArray = [];
	if (document.all){
		elementArray = document.all;
	}else{
		elementArray = document.getElementsByTagName("*");
	}
	var matchedArray = [];
	var pattern = new RegExp("(^| )" + theClass + "( |$)");
	for (var i = 0; i < elementArray.length; i++){
		if (pattern.test(elementArray[i].className)){
			matchedArray[matchedArray.length] = elementArray[i];
		}
	}
	return matchedArray;
};
Core.hasClass = function(target, theClass){
	var pattern = new RegExp("(^| )" + theClass + "( |$)");
	if (pattern.test(target.className)){
		return true;
	}
	return false;
};
Core.getTop = function(B){
	var A=0;
	if(B.offsetParent){
		while(1){
			A += B.offsetTop;
			if(!B.offsetParent){break}
			B = B.offsetParent;
		}
	}else{
		if(B.y){A+=B.y}
	}
	return A;
};
Core.getWidth = function(A){return A.offsetWidth}
Core.getHeight = function(A){return A.offsetHeight}
Core.getScrollY = function(){
	return Core.filterResults(window.pageYOffset?window.pageYOffset:0,document.documentElement?document.documentElement.scrollTop:0,document.body?document.body.scrollTop:0)
};
Core.getWindowHeight = function(){
	var A;
	if(typeof window.innerWidth!="undefined"){
		A=window.innerHeight
	}else{
		if(typeof document.documentElement!="undefined"&&typeof document.documentElement.clientWidth!="undefined"&&document.documentElement.clientWidth!=0){
			A=document.documentElement.clientHeight
		}else{
			A=document.getElementsByTagName("body")[0].clientHeight
		}
	}
	return A
};
Core.filterResults = function(D,B,A){
	var C=D?D:0;
	if(B&&(!C||(C>B))){C=B}
	return A&&(!C||(C>A))?A:C
};
Core.getKeycode = function(B){
	var A;
	if(!B){
		var B=window.event
	}
	if(B.keyCode){
		A=B.keyCode
	}else{
		if(B.which){A=B.which}
	}
	return A
};
Core.addslashes = function(A){
	if(null==A){return""}
	A=A.toString();
	A=A.replace(/\\/g,"\\\\");A=A.replace(/\'/g,"\\'");A=A.replace(/\"/g,'\\"');A=A.replace(/\0/g,"\\0");A=A.replace(/\n/g,"\\n");
	return A
};
Core.stripslashes = function(str){
	str=str.replace(/\\'/g,'\'');str=str.replace(/\\"/g,'"');str=str.replace(/\\\\/g,'\\');str=str.replace(/\\0/g,'\0');str=str.replace(/\\n/g,'\n');
	return str;
};
Core.removeClass = function(target, theClass){
	var pattern = new RegExp("(^| )" + theClass + "( |$)");
	target.className = target.className.replace(pattern, "$1");
	target.className = target.className.replace(/ $/, "");
};
Core.getComputedStyle = function(element, styleProperty){
	var computedStyle = null;
	if (typeof element.currentStyle != "undefined"){
		computedStyle = element.currentStyle;
	}else{
		computedStyle = document.defaultView.getComputedStyle(element, null);
	}
	return computedStyle[styleProperty];
};
Core.start = function(runnable){
	Core.addEventListener(window, "load", runnable.init);
};
Core.Ajax = function() {
	this.req = null;
	this.url = null;
	this.status = null;
	this.statusText = '';
	this.method = 'GET';
	this.async = true;
	this.dataPayload = null;
	this.readyState = null;
	this.responseText = null;
	this.responseXML = null;
	this.handleResp = null;
	this.responseFormat = 'text', // 'text', 'xml', 'object'
	this.mimeType = null;
	this.headers = [];

	this.init = function() {
		var i = 0;
		var reqTry = [ 
			function() { return new XMLHttpRequest(); },
			function() { return new ActiveXObject('Msxml2.XMLHTTP') },
			function() { return new ActiveXObject('Microsoft.XMLHTTP' )} 
		];
		while (!this.req && (i < reqTry.length)) {
			try { 
				this.req = reqTry[i++]();
			} 
			catch(e) {}
		}
		return true;
	};
	this.doGet = function(url, hand, format) {
		this.url = url;
		this.handleResp = hand;
		this.responseFormat = format || 'text';
		this.doReq();
	};
	this.doPost = function(url, dataPayload, hand, format) {
		this.url = url;
		this.dataPayload = dataPayload;
		this.handleResp = hand;
		this.responseFormat = format || 'text';
		this.method = 'POST';
		this.doReq();
	};
	this.doReq = function() {
		var self = null;
		var req = null;
		var headArr = [];

		if (!this.init()) {
			alert('Could not create XMLHttpRequest object.');
			return;
		}
		req = this.req;
		req.open(this.method, this.url, this.async);
		if (this.method == "POST") {
			this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		if (this.method == 'POST') {
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		self = this;
		req.onreadystatechange = function() {
			var resp = null;
			self.readyState = req.readyState;
			if (req.readyState == 4) {
				self.status = req.status;
				self.statusText = req.statusText;
				self.responseText = req.responseText;
				self.responseXML = req.responseXML;

				switch(self.responseFormat) {
					case 'text':
						resp = self.responseText;
						break;
					case 'xml':
						resp = self.responseXML;
						break;
					case 'object':
						resp = req;
						break;
				}

				if (self.status > 199 && self.status < 300) {
					if (!self.handleResp) {
						alert('No response handler defined for this XMLHttpRequest object.');
						return;
					}else {
						self.handleResp(resp);
					}
				}else {
					self.handleErr(resp);
				}
			}
		}
		req.send(this.dataPayload);
	};
	this.abort = function() {
		if (this.req) {
			this.req.onreadystatechange = function() { };
			this.req.abort();
			this.req = null;
		}
	};
	this.handleErr = function() {
		var errorWin;
		try {
			alert( this.responseText );
//			errorWin = window.open('', 'errorWin');
//			errorWin.document.body.innerHTML = this.responseText;
		}catch(e) {
			alert('An error occurred, but the error message cannot be' +
			' displayed because of your browser\'s pop-up blocker.\n' +
			'Please allow pop-ups from this Web site.');
		}
	};
	this.setMimeType = function(mimeType) {
		this.mimeType = mimeType;
	};
	this.setHandlerResp = function(funcRef) {
		this.handleResp = funcRef;
	};
	this.setHandlerErr = function(funcRef) {
		this.handleErr = funcRef; 
	};
	this.setHandlerBoth = function(funcRef) {
		this.handleResp = funcRef;
		this.handleErr = funcRef;
	};
	this.setRequestHeader = function(headerName, headerValue) {
		this.headers.push(headerName + ': ' + headerValue);
	};
};

Core.JSON = function() {
    var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        s = {
            'boolean': function (x) {
                return String(x);
            },
            number: function (x) {
                return isFinite(x) ? String(x) : 'null';
            },
            string: function (x) {
                if (/["\\\x00-\x1f]/.test(x)) {
                    x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
                        var c = m[b];
                        if (c) {
                            return c;
                        }
                        c = b.charCodeAt();
                        return '\\u00' +
                            Math.floor(c / 16).toString(16) +
                            (c % 16).toString(16);
                    });
                }
                return '"' + x + '"';
            },
            object: function (x) {
                if (x) {
                    var a = [], b, f, i, l, v;
                    if (x instanceof Array) {
                        a[0] = '[';
                        l = x.length;
                        for (i = 0; i < l; i += 1) {
                            v = x[i];
                            f = s[typeof v];
                            if (f) {
                                v = f(v);
                                if (typeof v == 'string') {
                                    if (b) {
                                        a[a.length] = ',';
                                    }
                                    a[a.length] = v;
                                    b = true;
                                }
                            }
                        }
                        a[a.length] = ']';
                    } else if (x instanceof Object) {
                        a[0] = '{';
                        for (i in x) {
                            v = x[i];
                            f = s[typeof v];
                            if (f) {
                                v = f(v);
                                if (typeof v == 'string') {
                                    if (b) {
                                        a[a.length] = ',';
                                    }
                                    a.push(s.string(i), ':', v);
                                    b = true;
                                }
                            }
                        }
                        a[a.length] = '}';
                    } else {
                        return;
                    }
                    return a.join('');
                }
                return 'null';
            }
        };
    return {
        copyright: '(c)2005 JSON.org',
        license: 'http://www.JSON.org/license.html',
        stringify: function (v) {
            var f = s[typeof v];
            if (f) {
                v = f(v);
                if (typeof v == 'string') {
                    return v;
                }
            }
            return null;
        },
        parse: function (text) {
            try {
                return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
                        text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
                    eval('(' + text + ')');
            } catch (e) {
                return false;
            }
        }
    };
}();
Core.Cookie = {
	set: function(name,value,seconds){
		if(seconds){
			d = new Date();
			d.setTime(d.getTime() + (seconds * 1000));
			expiry = '; expires=' + d.toGMTString();
		}else{
			expiry = '';
		}
		document.cookie = name + "=" + value + expiry + "; path=/";
	},
	get: function(name){
		nameEQ = name + "=";
		ca = document.cookie.split(';');
		for(i = 0; i < ca.length; i++){
			c = ca[i];
			while(c.charAt(0) == ' '){
				c = c.substring(1,c.length);
			}
			if(c.indexOf(nameEQ) == 0){
				return c.substring(nameEQ.length,c.length);
			}
		}
		return null
	},
	unset: function(name){
		Cookie.set(name,'',-1);
	}
};
Core.Hash = function() {
	this.length = 0;
	this.items = new Array();
	for (var i = 0; i < arguments.length; i += 2) {
		if (typeof(arguments[i + 1]) != 'undefined') {
			this.items[arguments[i]] = arguments[i + 1];
			this.length++;
		}
	};
	this.removeItem = function(in_key){
		var tmp_value;
		if (typeof(this.items[in_key]) != 'undefined') {
			this.length--;
			var tmp_value = this.items[in_key];
			delete this.items[in_key];
		}
		return tmp_value;
	};
	this.getItem = function(in_key) {
		return this.items[in_key];
	};
	this.setItem = function(in_key, in_value){
		if (typeof(in_value) != 'undefined') {
			if (typeof(this.items[in_key]) == 'undefined') {
				this.length++;
			}
			this.items[in_key] = in_value;
		}
		return in_value;
	};
	this.hasItem = function(in_key){
		return typeof(this.items[in_key]) != 'undefined';
	};
};
Core.openCenteredWindow = function(url, height, width, name, parms) {
	var left = Math.floor( (screen.width - width) / 2);
	var top = Math.floor( (screen.height - height) / 2);
	var winParms = "top=" + top + ",left=" + left + ",height=" + height + ",width=" + width;
	if (parms) { winParms += "," + parms; }
	var win = window.open(url, name, winParms);
	if (parseInt(navigator.appVersion) >= 4) { win.window.focus(); }
	return win;
};
Core.From = function(iterable) {
	if (!iterable) return [];
	if (iterable.toArray) {
		return iterable.toArray();
	} else {
		var results = [];
		for (var i = 0, length = iterable.length; i < length; i++)
			results.push(iterable[i]);
		return results;
	}
};
Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};
Core.getElementsByAttribute = function(oElm, strTagName, strAttributeName, strAttributeValue){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
	var oCurrent;
	var oAttribute;
	for(var i=0; i<arrElements.length; i++){
		oCurrent = arrElements[i];
		oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);
		if(typeof oAttribute == "string" && oAttribute.length > 0){
			if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
				arrReturnElements.push(oCurrent);
			}
		}
	}
	return arrReturnElements;
}
function $id(A){return Core.getById(A)}
function $V(A){return Core.getValue(A)}
function $name(A){return Core.getByName(A)}
function $tagName(A){return Core.getByTagName(A)}
function $newEl(A){return Core.newEl(A)}
function include_once(sSrc){
	var funcScript = document.createElement("SCRIPT");
	funcScript.src = sSrc
	funcScript.type = "text/javascript";
	$tagName("HEAD")[0].appendChild(funcScript);
}