var IE  = false;
var IE7 = false;

/*@cc_on
	IE  = true;
	IE7 = (typeof(XMLHttpRequest) != 'undefined');
@*/

function forEach(ary, func) {
	if (ary && func) {
		for (var i = 0; i < ary.length; i++) {
			func(ary[i], i); 
		}
	}
}

function map(ary, func) {
	var list = [];
	if (ary && func) {
		for (var i = 0; i < ary.length; i++) {
			list.push(func(ary[i], i)); 
		}
	}
	return list;
}

function filter(ary, func) {
	var list = [];
	if (ary && func) {	
		for (var i = 0; i < ary.length; i++) {
			if (func(ary[i], i)) {
				list.push(ary[i]);
			}
		}
	}
	return list;
}

String.prototype.collapse = function() {
   return this.replace(/  /g, " ");
}

String.prototype.trim = function() {
   return this.replace(/^\s+|\s+$/g,"");
}

String.prototype.ltrim = function() {
   return this.replace(/^\s+/g,"");
}

String.prototype.rtrim = function() {
   return this.replace(/\s+$/g,"");
}

function formatNumber(num, decimal, bracket){
	if (decimal) {
		num = Math.round(num * Math.pow(10, decimal)) / Math.pow(10, decimal);
	} else {
		num = Math.round(num);
	}
	
    bracket = (bracket) ? (num < 0) : false;
	
	num += '';
	var splitStr = num.split('.');

	var splitLeft = splitStr[0];
	var regx = /(\d+)(\d{3})/;
	while (regx.test(splitLeft)) {
	  splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
	}
	
	var splitRight = (splitStr.length > 1) ? splitStr[1] : '';
	if (decimal) {
		splitRight = '.' + splitRight + new Array(decimal + 1).join('0').substring(0, decimal - splitRight.length);
	}
	
	return (bracket) ? '( ' + splitLeft + splitRight + ' )' : splitLeft + splitRight;
}

function unformatNumber(num) {
   return num.replace(/([^0-9\.\-])/g,'') * 1;
}

function unEscape(value) {
	return unescape(value.replace(/\+/g, ' '));
}

/*
	Cookies:
	var cookie = new Cookie(cookieName [, noparse]); //Reads value and parses it (field=value&field=value) into items unless noItems is true

	cookie.item[fieldName] = string
	or
	cookie.value = string

	//any item[] values will over-ride cookie.value when setting
*/
	
function Cookie(name, noItems) {//noItems is optional
	this.name = name;
	var match = new RegExp('(^|;|; +)' + this.name + '=([^;]+)', 'i').exec(document.cookie);
	if (match) {this.value = match[2]}

	if (!noItems) {
		this.item = new Object();
		var reFields = /([^&=]+)=([^&]*)&?/g;
		while (match = reFields.exec(this.value)) {
			this.item[unEscape(match[1])] = unEscape(match[2]);
		}
	}
}

Cookie.prototype.clear = function(path, domain) {
	this.item = new Object();
	this.value = null;
	this.set(new Date(0), path, domain);
}

Cookie.prototype.set = function(expires, path, domain, secure) {//expires = false, date, or a number of days hence
	var value = '';
	for (var f in this.item) {
		value += encodeURIComponent(f) + '=' + encodeURIComponent(this.item[f]) + '&';
	}
	if (!value) {
		value = encodeURIComponent(this.value);
	}
	if (expires) {
		if (typeof(expires) == 'number') {
			expires = new Date(new Date().getTime() + (86400000 * expires));
		}
		expires = expires.toGMTString();
	} else {
		expires = '';
	}
	document.cookie = this.name + "=" + value +	"; expires=" + expires +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") +
	((secure) ? "; secure" : "");		
}

function frameWindow(iframe) {
	var doc = frameDocument(iframe);
	if (doc) {return doc.defaultView || doc.parentWindow}
}

function frameDocument(iframe) {
    var doc = iframe.contentWindow || iframe.contentDocument;
    if (doc) {return (doc.document) ? doc.document : doc}
}
		
function $() {
	var results = [];
	map(arguments, function(element) {
		if (typeof(element) == 'string'){
			var e = document.getElementById(element);
			if (e) {results.push(e)}
			for (var f=0; f<frames.length; f++) {
				try {
					var d = (frames[f].document || frames[f]);
					if (d) {
						var e = d.getElementById(element);
						if (e) {results.push(e)}	
					}			
				} catch (ex) {}
			}
		} else {
			results.push(element);
		}
	});
	return (results.length) ? ((results.length == 1) ? results[0] : results) : null;
}

function $T() {
	var results = [];
	map(arguments, function(tag) {
		var tags = document.getElementsByTagName(tag);
		for (var i=0; i < tags.length; i++) {
			results.push(tags[i]);
		}
	});
	return results;
}

function $F(x) {
	if (typeof(x) == 'function') {return x()}
	return x;
}

function insertAfter(newNode, referenceNode) {
	if (referenceNode.nextSibling) {
		referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
	} else {
		referenceNode.parentNode.appendChild(newNode);
	}
	return newNode;
}

function $$(className, context, tag) {
	context = context || document;
	var nodeList;

	if (context == document || context.nodeType == 1) {
		if (typeof(document.evaluate) == 'function') {
			var xpath = document.evaluate(".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]", context, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
			var els = [];
			for (var i = 0, l = xpath.snapshotLength; i < l; i++) {
				els.push(xpath.snapshotItem(i));
			}
			return els;
		} else {
			nodeList = context.getElementsByTagName((tag) ? tag : '*');
		}
	} else {
		nodeList = context;
	}

	var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
	return filter(nodeList, function(node) {  return node.className.match(re) });
}

function createStyleSheet() {

	var styleSheetElement = document.createElement("style");
	styleSheetElement.type = "text/css";
	document.getElementsByTagName("head")[0].appendChild(styleSheetElement);
	
	var styleSheet;
	for(i = 0; i<document.styleSheets.length; i++) {
		if (!document.styleSheets[i].disabled) {
			styleSheet = document.styleSheets[i];
		}
	}

	return styleSheet;
}

function setCSS (selector, style, styleSheet) {

	if (!document.styleSheets && !styleSheet) {return}	
	var mediaType;

	if (!styleSheet) {
		if(document.styleSheets.length > 0) {
			for(i = 0; i<document.styleSheets.length; i++) {
				if (document.styleSheets[i].disabled) {continue}
				var media = document.styleSheets[i].media;
				mediaType = typeof(media);

				if(mediaType == "string") {//IE
					if(media == "" || media.indexOf("screen") != -1) {
						styleSheet = document.styleSheets[i];
					}
				} else if(mediaType == "object") {
					if(media.mediaText == "" || media.mediaText.indexOf("screen") != -1) {
						styleSheet = document.styleSheets[i];
					}
				}
			}
		}
	}

	if (!styleSheet) {
		styleSheet = createStyleSheet();
		if (!styleSheet) {return}
	}
	
	var rules = (styleSheet.cssRules) ? styleSheet.cssRules: styleSheet.rules;

	//delete existing rule
	for(i = 0; i<rules.length; i++) {
		if(rules[i].selectorText.toLowerCase() == selector.toLowerCase()) {
			if (styleSheet.deleteRule) {
				styleSheet.deleteRule(i);	
			} else {
				styleSheet.removeRule(i);
			}
		}
	}
	
	//add replacement
	if (style) {
		if (styleSheet.cssRules) {
			styleSheet.insertRule(selector + "{" + style + "}", styleSheet.cssRules.length);
		} else {
			styleSheet.addRule(selector, style);
		}
	}
}

function XMLHttpObject() {
	if (typeof(XMLHttpRequest) != 'undefined') {
		return new XMLHttpRequest();
	} else {
		/*@cc_on
		   @if (@_jscript_version >= 5)
			  try {
				return new ActiveXObject("Msxml2.XMLHTTP");
			  } catch (ex){
				 try {
					return new ActiveXObject("Microsoft.XMLHTTP");
				 } catch (ex2){
					return false;
				 }
			  }
		   @end
		@*/
	}
	return false;
}

function HttpRequest() {//[callback function, [,passthrough object]] url [,name, value ...] [, value]
	if (!arguments.length) {return false}

	var callback, passthrough, params = '';
	if ((typeof(arguments[0]) == 'function') && (arguments.length != 1)) {callback = arguments[0]}

	var begin = (callback) ? 2 : 1;
	if (callback && ((arguments.length > 2) && (typeof(arguments[1]) == 'object'))) {
		passthrough = arguments[1];
		begin ++;
	}

	for (var i = begin; i < arguments.length; i++) {
		if (params) {params += '&'}
		if ((i+1) < arguments.length) {
			params += encodeURIComponent($F(arguments[i]));
			i++;
		} else {
			params += 'param';
		}
		params += '=' + encodeURIComponent($F(arguments[i]).toString());
	}
	
	var XMLHttp = XMLHttpObject();
	if (!XMLHttp) {return false}
	
	try {
		XMLHttp.open((params) ? 'POST' : 'GET', $F(arguments[begin-1]), (callback) ? true : false);
		if (params) {XMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')}
		if (callback) {
			XMLHttp.onreadystatechange = function() {
				if (XMLHttp.readyState == 4) {
					if (XMLHttp.getResponseHeader("Content-Type") == 'application/json') {
						var a;
						eval('a = ' + XMLHttp.responseText);
						callback(XMLHttp, passthrough, a);
					} else {
						callback(XMLHttp, passthrough);
					}
					XMLHttp = null;
				}
			}
		}
		XMLHttp.send(params);	
		return (callback) ? true : XMLHttp;
	} catch(ex) {}

	return false;
}

/*
	W3C DOM's are extended with these methods/properties from the MSXML DOM:
		XMLDocument.transformNode(XSLDOM) (Document only extended)	
		Element.selectSingleNode(Xpath)
		Element.selectNodes(XPath)
		Element.xml
		Node.text	
*/

function NSResolver(prefix) {
	switch (prefix) {
		case 'SOAP-ENV' : return 'http://schemas.xmlsoap.org/soap/envelope/';
	}
	return null;
}
	
if (typeof(XMLDocument) != 'undefined') {	
	XMLDocument.prototype.transformNode = function(stylesheet) {
		var result = document.implementation.createDocument('', '', null);
		try {
			new XSLTProcessor().transformDocument(this, stylesheet, result, null);
		} catch(ex) {
			return false;
		}
		try {
			return new XMLSerializer().serializeToString(result);
		} catch(ex) {
			return false;
		}
	}
		
	Element.prototype.selectNodes = function(XPath, NSResolver) 
	{
		var result = [];
		result.item = function(index){return result[index]}
		try {
			var doc = (this.implementation ? this : this.ownerDocument);
			var nodes = doc.evaluate(XPath, this, NSResolver, 5, null);
			var node = nodes.iterateNext();
			while(node) {
				result[result.length] = node;
				node = nodes.iterateNext();
			}
		} catch(ex) {
			return false;
		}
		return result;
	}
	
	Element.prototype.selectSingleNode = function(XPath, NSResolver) {
		try {
			var result = (this.implementation ? this : this.ownerDocument);
			return result.evaluate(XPath, this, NSResolver, 9, null).singleNodeValue;
		} catch(ex) {
			return false;
		}
	}
	
	Element.prototype.__defineGetter__("xml", function (){
		try {
			return (new XMLSerializer()).serializeToString(this);
		} catch(ex) {
			return false;
		}
	});
	
	Node.prototype.__defineGetter__("text", function()
	{
		try {
			var result = '';
			if(this.nodeType==3) {return this.nodeValue}
			if(this.hasChildNodes()) {
				var children = this.childNodes;
				for(var i=0;i<children.length;i++) {
					var n = children[i];
					if(n.nodeType==3) {result+=n.nodeValue}
					if(n.nodeType==1 && n.hasChildNodes()){result+=n.text}
				}
			}
			return result;
		} catch(ex) {
			return false;
		}
	});					
}

/*
	Event.add(element, event, function);
	Event.remove(element, event, function);
	Event.unload(); //automatically added for window.unload in IE to prevent memory leaks.
	Event.onDOMReady(function);	
*/

Event = {
	add : function(el, type, func) {	
		el = $(el);
		if (!func.$$guid) {func.$$guid = Event._guid++}
		if (!el.events) {el.events = {}}
		var handlers = el.events[type];
		if (!handlers) {
			handlers = el.events[type] = {};
			if (el["on" + type]) {
				handlers[0] = el["on" + type];
			}
		}
		handlers[func.$$guid] = func;
		el["on" + type] = Event._handleEvent;
  		if (!Event.observers) {Event.observers = []}
  		Event.observers.push([el, type, func, false]);
	},

	remove : function(el, type, func) {
		el = $(el);
		if (el.events && el.events[type]) {delete el.events[type][func.$$guid]}
		for (var i = 0; i < Event.observers.length; i++) {
			if (Event.observers[i]) {
				if ((Event.observers[i][0] == el) && (Event.observers[i][1] == type) && (Event.observers[i][2] == func)) {
					delete Event.observers[i];		
				}
			}
		}
	},

	_handleEvent : function(e) {
		var returnValue = true;
		e = e || Event._fixEvent(window.event);
		//e.key is unreliable on keypressed events, try and use keyup events
		e.key = (e.charCode) ? e.charCode : (e.keyCode) ? e.keyCode : (e.which) ? e.which : null;
		var handlers = this.events[e.type], el = $(this);

		for (var i in handlers) {	
			el.$$handleEvent = handlers[i];		
			if (el.$$handleEvent(e) === false) {returnValue = false}
		}
		return returnValue;
	},

	_fixEvent : function(e) {
		e.preventDefault = Event._preventDefault;
		e.stopPropagation = Event._stopPropagation;
		return e;
	},

	_preventDefault : function() { this.returnValue = false },

	_stopPropagation : function() { this.cancelBubble = true },

	_guid : 1,

	onDOMReady : function(f) {
		if (!this._readyCallbacks) {
			var domReady = this._domReady;
			if (domReady.done) {return f()}
			if (document.addEventListener) {document.addEventListener("DOMContentLoaded", domReady, false)}
			/*@cc_on @*/
				/*@if (@_win32)			
					document.write("<script id=__ie_onload defer src=//:javascript:void(0)><\/script>");
					document.getElementById("__ie_onload").onreadystatechange = function() {
						if (this.readyState == "complete") { domReady() }
					};
			/*@end @*/
			if (/WebKit/i.test(navigator.userAgent)) {
				this._timer = setInterval(function() {
					if (/loaded|complete/.test(document.readyState)) {domReady()}
				}, 10);
			}
			Event.add(window, 'load', domReady);
			Event._readyCallbacks =  [];
		}
		Event._readyCallbacks.push(f);
	},

	_domReady : function() {
		if (arguments.callee.done) {return}
		arguments.callee.done = true;
		if (Event._timer) {clearInterval(Event._timer)}
		forEach(Event._readyCallbacks, function(f) { f() });
		Event._readyCallbacks = null;
	},

	unload : function() {
		if (!Event.observers) {return}
		forEach(Event.observers, function(e) {
			Event.remove.apply(Event, e);
		});
	}
}

function getElementMetrics (e) {
	e = $(e);
	var result = new Object();
	if (e) {
		if (e == window) {
			result.x = (window.pageXOffset) ? (window.pageXOffset) : (document.documentElement) ? document.documentElement.scrollLeft : document.body.scrollLeft;
			result.y = (window.pageYOffset) ? (window.pageYOffset) : (document.documentElement) ? document.documentElement.scrollTop : document.body.scrollTop;
				
			if (window.innerHeight != window.undefined) {
				result.h = window.innerHeight;
			} else if (document.compatMode=='CSS1Compat') {
				result.h = document.documentElement.clientHeight;
			} else if (document.body) {
				result.h =  document.body.clientHeight;
			}

			if (window.innerWidth != window.undefined) {
				result.w = window.innerWidth;
			} else if (document.compatMode=='CSS1Compat') {
				result.w = document.documentElement.clientWidth;
			} else if (document.body) {
				result.w = document.body.clientWidth;
			}
		} else {
			result.x = parseInt(e.offsetLeft);
			result.y = parseInt(e.offsetTop);
		
			var o=e;
			while (o.offsetParent!=null){
				o=o.offsetParent;
				if(o.block){return true}
				result.x+=parseInt(o.offsetLeft);
				result.y+=parseInt(o.offsetTop);
				
				if (o.offsetParent) {
					if (o.scrollLeft) {result.x-=parseInt(o.scrollLeft)}
					if (o.scrollTop) {result.y-=parseInt(o.scrollTop)}
				}
			}
			result.h = parseInt(e.offsetHeight);
			result.w = parseInt(e.offsetWidth);
		}
	} else {
		result.x = 0;
		result.y = 0;
		result.h = 0;
		result.w = 0;
	}
	result.r=result.x+result.w;
	result.b=result.y+result.h;
	
	return result;
}
		
if (navigator.appVersion.match(/\bMSIE\b/)) {Event.add(window, 'unload', Event.unload)}
