//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------

// prototype.js
Object.extend = function(dest, source, replace) {
	for(var prop in source) {
		if(replace == false && dest[prop] != null) { continue; }
		dest[prop] = source[prop];
	}
	return dest;
};

Object.extend(Function.prototype, {
	apply: function(o, a) {
		var r, x = "__fapply";
		if(typeof o != "object") { o = {}; }
		o[x] = this;
		var s = "r = o." + x + "(";
		for(var i=0; i<a.length; i++) {
			if(i>0) { s += ","; }
			s += "a[" + i + "]";
		}
		s += ");";
		eval(s);
		delete o[x];
		return r;
	},
	bind: function(o) {
		if(!Function.__objs) {
			Function.__objs = [];
			Function.__funcs = [];
		}
		var objId = o.__oid;
		if(!objId) {
			Function.__objs[objId = o.__oid = Function.__objs.length] = o;
		}

		var me = this;
		var funcId = me.__fid;
		if(!funcId) {
			Function.__funcs[funcId = me.__fid = Function.__funcs.length] = me;
		}

		if(!o.__closures) {
			o.__closures = [];
		}

		var closure = o.__closures[funcId];
		if(closure) {
			return closure;
		}

		o = null;
		me = null;

		return Function.__objs[objId].__closures[funcId] = function() {
			return Function.__funcs[funcId].apply(Function.__objs[objId], arguments);
		};
	}
}, false);

Object.extend(Array.prototype, {
	push: function(o) {
		this[this.length] = o;
	},
	addRange: function(items) {
		if(items.length > 0) {
			for(var i=0; i<items.length; i++) {
				this.push(items[i]);
			}
		}
	},
	clear: function() {
		this.length = 0;
		return this;
	},
	shift: function() {
		if(this.length == 0) { return null; }
		var o = this[0];
		for(var i=0; i<this.length-1; i++) {
			this[i] = this[i + 1];
		}
		this.length--;
		return o;
	}
}, false);

Object.extend(String.prototype, {
	trimLeft: function() {
		return this.replace(/^\s*/,"");
	},
	trimRight: function() {
		return this.replace(/\s*$/,"");
	},
	trim: function() {
		return this.trimRight().trimLeft();
	},
	endsWith: function(s) {
		if(this.length == 0 || this.length < s.length) { return false; }
		return (this.substr(this.length - s.length) == s);
	},
	startsWith: function(s) {
		if(this.length == 0 || this.length < s.length) { return false; }
		return (this.substr(0, s.length) == s);
	},
	split: function(c) {
		var a = [];
		if(this.length == 0) return a;
		var p = 0;
		for(var i=0; i<this.length; i++) {
			if(this.charAt(i) == c) {
				a.push(this.substring(p, i));
				p = ++i;
			}
		}
		a.push(s.substr(p));
		return a;
	}
}, false);

Object.extend(String, {
	format: function(s) {
		for(var i=1; i<arguments.length; i++) {
			s = s.replace("{" + (i -1) + "}", arguments[i]);
		}
		return s;
	},
	isNullOrEmpty: function(s) {
		if(s == null || s.length == 0) {
			return true;
		}
		return false;
	}
}, false);

if(typeof addEvent == "undefined")
	addEvent = function(o, evType, f, capture) {
		if(o == null) { return false; }
		if(o.addEventListener) {
			o.addEventListener(evType, f, capture);
			return true;
		} else if (o.attachEvent) {
			var r = o.attachEvent("on" + evType, f);
			return r;
		} else {
			try{ o["on" + evType] = f; }catch(e){}
		}
	};
	
if(typeof removeEvent == "undefined")
	removeEvent = function(o, evType, f, capture) {
		if(o == null) { return false; }
		if(o.removeEventListener) {
			o.removeEventListener(evType, f, capture);
			return true;
		} else if (o.detachEvent) {
			o.detachEvent("on" + evType, f);
		} else {
			try{ o["on" + evType] = function(){}; }catch(e){}
		}
	};
//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------

// core.js
Object.extend(Function.prototype, {
	getArguments: function() {
		var args = [];
		for(var i=0; i<this.arguments.length; i++) {
			args.push(this.arguments[i]);
		}
		return args;
	}
}, false);

var MS = {"Browser":{}};

Object.extend(MS.Browser, {
	isIE: navigator.userAgent.indexOf('MSIE') != -1,
	isFirefox: navigator.userAgent.indexOf('Firefox') != -1,
	isOpera: window.opera != null
}, false);

var AjaxPro = {};

AjaxPro.IFrameXmlHttp = function() {};
AjaxPro.IFrameXmlHttp.prototype = {
	onreadystatechange: null, headers: [], method: "POST", url: null, async: true, iframe: null,
	status: 0, readyState: 0, responseText: null,
	abort: function() {
	},
	readystatechanged: function() {
		var doc = this.iframe.contentDocument || this.iframe.document;
		if(doc != null && doc.readyState == "complete" && doc.body != null && doc.body.res != null) {
			this.status = 200;
			this.statusText = "OK";
			this.readyState = 4;
			this.responseText = doc.body.res;
			this.onreadystatechange();
			return;
		}
		setTimeout(this.readystatechanged.bind(this), 10);
	},
	open: function(method, url, async) {
		if(async == false) {
			alert("Synchronous call using IFrameXMLHttp is not supported.");
			return;
		}
		if(this.iframe == null) {
			var iframeID = "hans";
			if (document.createElement && document.documentElement &&
				(window.opera || navigator.userAgent.indexOf('MSIE 5.0') == -1))
			{
				var ifr = document.createElement('iframe');
				ifr.setAttribute('id', iframeID);
				ifr.style.visibility = 'hidden';
				ifr.style.position = 'absolute';
				ifr.style.width = ifr.style.height = ifr.borderWidth = '0px';

				this.iframe = document.getElementsByTagName('body')[0].appendChild(ifr);
			}
			else if (document.body && document.body.insertAdjacentHTML)
			{
				document.body.insertAdjacentHTML('beforeEnd', '<iframe name="' + iframeID + '" id="' + iframeID + '" style="border:1px solid black;display:none"></iframe>');
			}
			if (window.frames && window.frames[iframeID]) {
				this.iframe = window.frames[iframeID];
			}
			this.iframe.name = iframeID;
			this.iframe.document.open();
			this.iframe.document.write("<html><body></body></html>");
			this.iframe.document.close();
		}
		this.method = method;
		this.url = url;
		this.async = async;
	},
	setRequestHeader: function(name, value) {
		for(var i=0; i<this.headers.length; i++) {
			if(this.headers[i].name == name) {
				this.headers[i].value = value;
				return;
			}
		}
		this.headers.push({"name":name,"value":value});
	},
	getResponseHeader: function(name, value) {
		return null;
	},
	addInput: function(doc, form, name, value) {
		var ele;
		var tag = "input";
		if(value.indexOf("\n") >= 0) {
			tag = "textarea";
		}
		
		if(doc.all) {
			ele = doc.createElement("<" + tag + " name=\"" + name + "\" />");
		}else{
			ele = doc.createElement(tag);
			ele.setAttribute("name", name);
		}
		ele.setAttribute("value", value);
		form.appendChild(ele);
		ele = null;
	},
	send: function(data) {
		if(this.iframe == null) {
			return;
		}
		var doc = this.iframe.contentDocument || this.iframe.document;
		var form = doc.createElement("form");
		
		doc.body.appendChild(form);
		
		form.setAttribute("action", this.url);
		form.setAttribute("method", this.method);
		form.setAttribute("enctype", "application/x-www-form-urlencoded");
		
		for(var i=0; i<this.headers.length; i++) {
			switch(this.headers[i].name.toLowerCase()) {
				case "content-length":
				case "accept-encoding":
				case "content-type":
					break;
				default:
					this.addInput(doc, form, this.headers[i].name, this.headers[i].value);
			}
		}
		this.addInput(doc, form, "data", data);
		form.submit();
		
		setTimeout(this.readystatechanged.bind(this), 0);
	}
};

var progids = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
var progid = null;

if(typeof ActiveXObject != "undefined") {
	var ie7xmlhttp = false;
	if(typeof XMLHttpRequest == "object") {
		try{ var o = new XMLHttpRequest(); ie7xmlhttp = true; }catch(e){}
	}
	if(typeof XMLHttpRequest == "undefined" || !ie7xmlhttp) {
		XMLHttpRequest = function() {
			var xmlHttp = null;
			if(!AjaxPro.noActiveX) {
				if(progid != null) {
					return new ActiveXObject(progid);
				}
				for(var i=0; i<progids.length && xmlHttp == null; i++) {
					try {
						xmlHttp = new ActiveXObject(progids[i]);
						progid = progids[i];

					}catch(e){}
				}
			}
			if(xmlHttp == null && MS.Browser.isIE) {
				return new AjaxPro.IFrameXmlHttp();
			}
			return xmlHttp;
		};
	}
}

Object.extend(AjaxPro, {
	noOperation: function() {},
	onLoading: function() {},
	onError: function() {},
	onTimeout: function() {},
	onStateChanged: function() {},
	cryptProvider: null,
	queue: null,
	token: "",
	version: "6.10.4.1",
	ID: "AjaxPro",
	noActiveX: false,
	timeoutPeriod: 10*1000,
	queue: null,
	noUtcTime: false,
	m : {
		'\b': '\\b',
		'\t': '\\t',
		'\n': '\\n',
		'\f': '\\f',
		'\r': '\\r',
		'"' : '\\"',
		'\\': '\\\\'
	},
	toJSON: function(o) {	
		if(o == null) {
			return "null";
		}
		var v = [];
		var i;
		var c = o.constructor;
		if(c == Number) {
			return isFinite(o) ? o.toString() : AjaxPro.toJSON(null);
		} else if(c == Boolean) {
			return o.toString();
		} else if(c == String) {
			if (/["\\\x00-\x1f]/.test(o)) {
				o = o.replace(/([\x00-\x1f\\"])/g, function(a, b) {
					var c = AjaxPro.m[b];
					if (c) {
						return c;
					}
					c = b.charCodeAt();
					return '\\u00' +
						Math.floor(c / 16).toString(16) +
						(c % 16).toString(16);
				});
            }
			return '"' + o + '"';
		} else if (c == Array) {
			for(i=0; i<o.length; i++) {
				v.push(AjaxPro.toJSON(o[i]));
			}
			return "[" + v.join(",") + "]";
		} else if (c == Date) {
			var d = {};
			d.__type = "System.DateTime";
			if(AjaxPro.noUtcTime == true) {
				d.Year = o.getFullYear();
				d.Month = o.getMonth() +1;
				d.Day = o.getDate();
				d.Hour = o.getHours();
				d.Minute = o.getMinutes();
				d.Second = o.getSeconds();
				d.Millisecond = o.getMilliseconds();
			} else {
				d.Year = o.getUTCFullYear();
				d.Month = o.getUTCMonth() +1;
				d.Day = o.getUTCDate();
				d.Hour = o.getUTCHours();
				d.Minute = o.getUTCMinutes();
				d.Second = o.getUTCSeconds();
				d.Millisecond = o.getUTCMilliseconds();
			}
			return AjaxPro.toJSON(d);
		}
		if(typeof o.toJSON == "function") {
			return o.toJSON();
		}
		if(typeof o == "object") {
			for(var attr in o) {
				if(typeof o[attr] != "function") {
					v.push('"' + attr + '":' + AjaxPro.toJSON(o[attr]));
				}
			}
			if(v.length>0) {
				return "{" + v.join(",") + "}";
			}
			return "{}";		
		}
		return o.toString();
	},
	dispose: function() {
		if(AjaxPro.queue != null) {
			AjaxPro.queue.dispose();
		}
	}
}, false);

addEvent(window, "unload", AjaxPro.dispose);

AjaxPro.Request = function(url) {
	this.url = url;
	this.xmlHttp = null;
};

AjaxPro.Request.prototype = {
	url: null,
	callback: null,
	onLoading: AjaxPro.noOperation,
	onError: AjaxPro.noOperation,
	onTimeout: AjaxPro.noOperation,
	onStateChanged: AjaxPro.noOperation,
	args: null,
	context: null,
	isRunning: false,
	abort: function() {
		if(this.timeoutTimer != null) {
			clearTimeout(this.timeoutTimer);
		}
		if(this.xmlHttp) {
			this.xmlHttp.onreadystatechange = AjaxPro.noOperation;
			this.xmlHttp.abort();
		}
		if(this.isRunning) {
			this.isRunning = false;
			this.onLoading(false);
		}
	},
	dispose: function() {
		this.abort();
	},
	getEmptyRes: function() {
		return {
			error: null,
			value: null,
			request: {method:this.method, args:this.args},
			context: this.context,
			duration: this.duration
		};	
	},
	endRequest: function(res) {
		this.abort();
		if(res.error != null) {
			this.onError(res.error, this);
		}

		if(typeof this.callback == "function") {
			this.callback(res, this);
		}
	},
	mozerror: function() {
		if(this.timeoutTimer != null) {
			clearTimeout(this.timeoutTimer);
		}
		var res = this.getEmptyRes();
		res.error = {Message:"Unknown",Type:"ConnectFailure",Status:0};
		this.endRequest(res);
	},
	doStateChange: function() {
		this.onStateChanged(this.xmlHttp.readyState, this);

		if(this.xmlHttp.readyState != 4 || !this.isRunning) {
			return;
		}

		this.duration = new Date().getTime() - this.__start;

		if(this.timeoutTimer != null) {
			clearTimeout(this.timeoutTimer);
		}

		var res = this.getEmptyRes();
		if(this.xmlHttp.status == 200 && this.xmlHttp.statusText == "OK") {
			res = this.createResponse(res);
		} else {
			res = this.createResponse(res, true);
			res.error = {Message:this.xmlHttp.statusText,Type:"ConnectFailure",Status:this.xmlHttp.status};
		}
		
		this.endRequest(res);
	},
	createResponse: function(r, noContent) {	
		if(!noContent) {
			var responseText = "" + this.xmlHttp.responseText;

			if(AjaxPro.cryptProvider != null && typeof AjaxPro.cryptProvider == "function") {
				responseText = AjaxPro.cryptProvider.decrypt(responseText);
			}

			if(this.xmlHttp.getResponseHeader("Content-Type") == "text/xml") {
				r.value = this.xmlHttp.responseXML;
			} else {
				if(responseText != null && responseText.trim().length > 0) {
					r.json = responseText;
					eval("r.value = " + responseText + "*" + "/");
				}
			}
		}
		/* if(this.xmlHttp.getResponseHeader("X-" + AjaxPro.ID + "-Cache") == "server") {
			r.isCached = true;
		} */
		return r;
	},
	timeout: function() {
		this.duration = new Date().getTime() - this.__start;
		var r = this.onTimeout(this.duration, this);
		if(typeof r == "undefined" || r != false) {
			this.abort();
		} else {
			this.timeoutTimer = setTimeout(this.timeout.bind(this), AjaxPro.timeoutPeriod);
		}
	},
	invoke: function(method, args, callback, context) {
		this.__start = new Date().getTime();

		if(this.xmlHttp == null) {
			this.xmlHttp = new XMLHttpRequest();
		}

		this.isRunning = true;
		this.method = method;
		this.args = args;
		this.callback = callback;
		this.context = context;
		
		var async = typeof(callback) == "function" && callback != AjaxPro.noOperation;
		
		if(async) {
			if(MS.Browser.isIE) {
				this.xmlHttp.onreadystatechange = this.doStateChange.bind(this);
			} else {
				this.xmlHttp.onload = this.doStateChange.bind(this);
				this.xmlHttp.onerror = this.mozerror.bind(this);
			}
			this.onLoading(true);
		}
		
		var json = AjaxPro.toJSON(args) + "";
		if(AjaxPro.cryptProvider != null) {
			json = AjaxPro.cryptProvider.encrypt(json);
		}
		
		this.xmlHttp.open("POST", this.url, async);
		this.xmlHttp.setRequestHeader("Content-Type", "text/plain; charset=utf-8");
		this.xmlHttp.setRequestHeader("X-" + AjaxPro.ID + "-Method", method);
		
		if(AjaxPro.token != null && AjaxPro.token.length > 0) {
			this.xmlHttp.setRequestHeader("X-" + AjaxPro.ID + "-Token", AjaxPro.token);
		}

		if(!MS.Browser.isIE) {
			this.xmlHttp.setRequestHeader("Connection", "close");		// Mozilla Bug #246651
		}

		this.timeoutTimer = setTimeout(this.timeout.bind(this), AjaxPro.timeoutPeriod);

		try{ this.xmlHttp.send(json); }catch(e){}	// IE offline exception

		if(!async) {
			return this.createResponse({error: null,value: null});
		}

		return true;	
	}
};

AjaxPro.RequestQueue = function(conc) {
	this.queue = [];
	this.requests = [];
	this.timer = null;
	
	if(isNaN(conc)) { conc = 2; }

	for(var i=0; i<conc; i++) {		// max 2 http connections
		this.requests[i] = new AjaxPro.Request();
		this.requests[i].callback = function(res) {
			var r = res.context;
			res.context = r[3][1];

			r[3][0](res, this);
		};
		this.requests[i].callbackHandle = this.requests[i].callback.bind(this.requests[i]);
	}
};

AjaxPro.RequestQueue.prototype = {
	process: function() {
	
		this.timer = null;
		if(this.queue.length == 0) {
			return;
		}
		for(var i=0; i<this.requests.length && this.queue.length > 0; i++) {
			if(this.requests[i].isRunning == false) {
				var r = this.queue.shift();

				this.requests[i].url = r[0];
				this.requests[i].onLoading = r[3].length >2 && r[3][2] != null && typeof r[3][2] == "function" ? r[3][2] : AjaxPro.onLoading;
				this.requests[i].onError = r[3].length >3 && r[3][3] != null && typeof r[3][3] == "function" ? r[3][3] : AjaxPro.onError;
				this.requests[i].onTimeout = r[3].length >4 && r[3][4] != null && typeof r[3][4] == "function" ? r[3][4] : AjaxPro.onTimeout;
				this.requests[i].onStateChanged = r[3].length >5 && r[3][5] != null && typeof r[3][5] == "function" ? r[3][5] : AjaxPro.onStateChanged;

				this.requests[i].invoke(r[1], r[2], this.requests[i].callbackHandle, r);
				r = null;
			}
		}
		if(this.queue.length > 0 && this.timer == null) {
			this.timer = setTimeout(this.process.bind(this), 0);
		}
	},
	add: function(url, method, args, e) {

// txt += "\r\nqueue.add " + (new Date().getTime() - ss);

		this.queue.push([url, method, args, e]);
/*		
		if(this.timer == null) {
			this.timer = setTimeout(this.process.bind(this), 0);
		}
*/
		this.process();
	},
	abort: function() {
		this.queue.length = 0;
		if (this.timer != null) {
			clearTimeout(this.timer);
		}
		this.timer = null;
		for(var i=0; i<this.requests.length; i++) {
			if(this.requests[i].isRunning == true) {
				this.requests[i].abort();
			}
		}
	},
	dispose: function() {
		for(var i=0; i<this.requests.length; i++) {
			var r = this.requests[i];
			r.dispose();
		}
		this.requests.clear();
	}
};

AjaxPro.queue = new AjaxPro.RequestQueue(2);	// 2 http connections

AjaxPro.AjaxClass = function(url) {
	this.url = url;
};

AjaxPro.AjaxClass.prototype = {
	invoke: function(method, args, e) {
	
		if(e != null) {
			if(e.length != 6) {
				for(;e.length<6;) { e.push(null); }
			}
			if(e[0] != null && typeof(e[0]) == "function") {
				return AjaxPro.queue.add(this.url, method, args, e);
			}
		}
		var r = new AjaxPro.Request();
		r.url = this.url;
		return r.invoke(method, args);
	}
};
//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------

// ms.js
var addNamespace = function(ns) {
	var nsParts = ns.split(".");
	var root = window;
	for(var i=0; i<nsParts.length; i++) {
		if(typeof root[nsParts[i]] == "undefined") {
			root[nsParts[i]] = {};
		}
		root = root[nsParts[i]];
	}
};

Object.extend(window, {
	$: function() {
		var elements = [];
		for(var i=0; i<arguments.length; i++) {
			var e = arguments[i];
			if(typeof e == 'string') {
				e = document.getElementById(e);
			}
			if(arguments.length == 1) {
				return e;
			}
			elements.push(e);
		}
		return elements;
	},
	Class: {
		create: function() {
			return function() {
				if(typeof this.initialize == "function") {
					this.initialize.apply(this, arguments);
				}
			};
		}
	}
}, false);

addNamespace("MS.Debug");
MS.Debug = {};		// has been removed to debug version of core.ashx

addNamespace("MS.Position");

Object.extend(MS.Position, {
	getLocation: function(ele) {
		var x = 0;
		var y = 0;
		var p;
		for(p=ele; p; p=p.offsetParent) {
			// if(p.style.position == "relative" || p.style.position == "absolute") break;
			if(p.offsetLeft && p.offsetTop) {
				x += p.offsetLeft;
				y += p.offsetTop;
			}
		}
		return {left:x,top:y};
	},
	getBounds: function(ele) {
		var offset = MS.Position.getLocation(ele);
		var width = ele.offsetWidth;
		var height = ele.offsetHeight;
		return {left:offset.left,top:offset.top,width:width,height:height};
	},
	setLocation: function(ele, loc) {
		ele.style.position = "absolute";
		ele.style.left = loc.left + "px";
		ele.style.top = loc.top + "px";
	},
	setBounds: function(ele, rect) {
		if(rect.left && rect.top) {
			MS.Position.setLocation(ele, rect);
		}
		ele.style.width = rect.width + "px";
		ele.style.height = rect.height + "px";
	}
}, false);

addNamespace("MS.Keys");

Object.extend(MS.Keys, {
	TAB: 9,
	ESC: 27,
	KEYUP: 38,
	KEYDOWN: 40,
	KEYLEFT: 37,
	KEYRIGHT: 39,
	SHIFT: 16,
	CTRL: 17,
	ALT: 18,
	ENTER: 13,
	getCode: function(e) {
		e = MS.getEvent(e);
		if(e != null) { return e.keyCode; }
		return -1;
	}
}, false);

Object.extend(MS, {
	setText: function(ele, text) {
		if(ele == null) { return; }
		if(document.all) {
			ele.innerText = text;
		} else {
			ele.textContent = text;
		}
	},
	setHtml: function(ele, html) {
		if(ele == null) { return; }
		ele.innerHTML = html;
	},
	cancelEvent: function(e) {
		e = MS.getEvent(e);
		if(window.event) {
			e.returnValue = false;
		} else if(e) {
			e.preventDefault();
			e.stopPropagation();
		}
	},
	getEvent: function(e) {
		if(window.event) { return window.event; }
		if(e) { return e; }
		return null;
	},
	getTarget: function(e) {
		e = MS.getEvent(e);
		if(window.event) { return e.srcElement; }
		if(e) { return e.target; }
	}
}, false);

var StringBuilder = function() {
	this.v = [];
};

Object.extend(StringBuilder.prototype, {
	append: function(s) {
		this.v.push(s);
	},
	appendLine: function(s) {
		this.v.push(s + "\r\n");
	},
	clear: function() {
		this.v.clear();
	},
	toString: function() {
		return this.v.join("");
	}
}, true);
//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------
// Converter.js

// NameValueCollectionConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};
if(typeof Ajax.Web.NameValueCollection == "undefined") Ajax.Web.NameValueCollection={};

Ajax.Web.NameValueCollection = function(items) {
	this.__type = "System.Collections.Specialized.NameValueCollection";
	this.keys = [];
	this.values = [];

	if(items != null && !isNaN(items.length)) {
		for(var i=0; i<items.length; i++)
			this.add(items[i][0], items[i][1]);
	}
};
Object.extend(Ajax.Web.NameValueCollection.prototype, {
	add: function(k, v) {
		if(k == null || k.constructor != String || v == null || v.constructor != String)
			return -1;
		this.keys.push(k);
		this.values.push(v);
		return this.values.length -1;
	},
	containsKey: function(key) {
		for(var i=0; i<this.keys.length; i++) {
			if(this.keys[i] == key) return true;
		}
		return false;
	},
	getKeys: function() {
		return this.keys;
	},
	getValue: function(k) {
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == k) return this.values[i];
		}
		return null;
	},
	setValue: function(k, v) {
		if(k == null || k.constructor != String || v == null || v.constructor != String)
			return -1;
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == k) this.values[i] = v;
			return i;
		}
		return this.add(k, v);
	},
	toJSON: function() {
		return AjaxPro.toJSON({__type:this.__type,keys:this.keys,values:this.values});
	}
}, true);

// DataTableConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};
if(typeof Ajax.Web.DataTable == "undefined") Ajax.Web.DataTable={};

Ajax.Web.DataTable = function(c, r) {
	this.__type = "System.Data.DataTable,System.Data";
	this.Columns = [];
	this.Rows = [];
	this.addColumn = function(name, type) {
		this.Columns.push({Name:name,__type:type});
	};
	this.toJSON = function() {
		var dt = {};
		var i;
		dt.Columns = [];
		for(i=0; i<this.Columns.length; i++)
			dt.Columns.push([this.Columns[i].Name, this.Columns[i].__type]);
		dt.Rows = [];
		for(i=0; i<this.Rows.length; i++) {
			var row = [];
			for(var j=0; j<this.Columns.length; j++)
				row.push(this.Rows[i][this.Columns[j].Name]);
			dt.Rows.push(row);
		}
		return AjaxPro.toJSON(dt);
	};
	this.addRow = function(row) {
		this.Rows.push(row);
	};
	if(c != null) {
		for(var i=0; i<c.length; i++)
			this.addColumn(c[i][0], c[i][1]);
	}
	if(r != null) {
		for(var y=0; y<r.length; y++) {
			var row = {};
			for(var z=0; z<this.Columns.length && z<r[y].length; z++)
				row[this.Columns[z].Name] = r[y][z];
			this.addRow(row);
		}
	}
};

// IDictionaryConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};
if(typeof Ajax.Web.Dictionary == "undefined") Ajax.Web.Dictionary={};

Ajax.Web.Dictionary = function(type,items) {
	this.__type = type;
	this.keys = [];
	this.values = [];

	if(items != null && !isNaN(items.length)) {
		for(var i=0; i<items.length; i++)
			this.add(items[i][0], items[i][1]);
	}
};
Object.extend(Ajax.Web.Dictionary.prototype, {
	add: function(k, v) {
		this.keys.push(k);
		this.values.push(v);
		return this.values.length -1;
	},
	containsKey: function(key) {
		for(var i=0; i<this.keys.length; i++) {
			if(this.keys[i] == key) return true;
		}
		return false;
	},
	getKeys: function() {
		return this.keys;
	},
	getValue: function(key) {
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == key){ return this.values[i]; }
		}
		return null;
	},
	setValue: function(k, v) {
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == k){ this.values[i] = v; }
			return i;
		}
		return this.add(k, v);
	},
	toJSON: function() {
		return AjaxPro.toJSON({__type:this.__type,keys:this.keys,values:this.values});
	}
}, true);

// DataSetConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};
if(typeof Ajax.Web.DataSet == "undefined") Ajax.Web.DataSet={};

Ajax.Web.DataSet = function(t) {
	this.__type = "System.Data.DataSet,System.Data";
	this.Tables = [];
	this.addTable = function(t) {
		this.Tables.push(t);
	};
	if(t != null) {
		for(var i=0; i<t.length; i++) {
			this.addTable(t[i]);
		}
	}
};

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.BasePage == "undefined") ProductWiki.Web.BasePage={};
if(typeof ProductWiki.Web.BasePage.PWPage == "undefined") ProductWiki.Web.BasePage.PWPage={};
ProductWiki.Web.BasePage.PWPage_class = function() {};
Object.extend(ProductWiki.Web.BasePage.PWPage_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	TrackGoogleAdsenseClick: function() {
		return this.invoke("TrackGoogleAdsenseClick", {}, this.TrackGoogleAdsenseClick.getArguments().slice(0));
	},
	TrackShoppingDotComClick: function(ProductID) {
		return this.invoke("TrackShoppingDotComClick", {"ProductID":ProductID}, this.TrackShoppingDotComClick.getArguments().slice(1));
	},
	TrackQuadrusClick: function() {
		return this.invoke("TrackQuadrusClick", {}, this.TrackQuadrusClick.getArguments().slice(0));
	},
	url: '/ajaxpro/ProductWiki.Web.BasePage.PWPage,ProductWiki.Web.ashx'
}));
ProductWiki.Web.BasePage.PWPage = new ProductWiki.Web.BasePage.PWPage_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.Search == "undefined") ProductWiki.Web.UserControls.Search={};
ProductWiki.Web.UserControls.Search_class = function() {};
Object.extend(ProductWiki.Web.UserControls.Search_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	getResults: function(query, idx) {
		return this.invoke("getResults", {"query":query, "idx":idx}, this.getResults.getArguments().slice(2));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.Search,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.Search = new ProductWiki.Web.UserControls.Search_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.Tabs == "undefined") ProductWiki.Web.UserControls.Tabs={};
ProductWiki.Web.UserControls.Tabs_class = function() {};
Object.extend(ProductWiki.Web.UserControls.Tabs_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	TabSignin: function(taburl) {
		return this.invoke("TabSignin", {"taburl":taburl}, this.TabSignin.getArguments().slice(1));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.Tabs,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.Tabs = new ProductWiki.Web.UserControls.Tabs_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.Deferred == "undefined") ProductWiki.Web.UserControls.Deferred={};
if(typeof ProductWiki.Web.UserControls.Deferred.DeferredControl == "undefined") ProductWiki.Web.UserControls.Deferred.DeferredControl={};
ProductWiki.Web.UserControls.Deferred.DeferredControl_class = function() {};
Object.extend(ProductWiki.Web.UserControls.Deferred.DeferredControl_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	GetDefferedHTML: function(URL, ID) {
		return this.invoke("GetDefferedHTML", {"URL":URL, "ID":ID}, this.GetDefferedHTML.getArguments().slice(2));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.Deferred.DeferredControl,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.Deferred.DeferredControl = new ProductWiki.Web.UserControls.Deferred.DeferredControl_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.WhereToBuy == "undefined") ProductWiki.Web.UserControls.WhereToBuy={};
ProductWiki.Web.UserControls.WhereToBuy_class = function() {};
Object.extend(ProductWiki.Web.UserControls.WhereToBuy_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	SetZip: function(zip) {
		return this.invoke("SetZip", {"zip":zip}, this.SetZip.getArguments().slice(1));
	},
	SetRegion: function(region) {
		return this.invoke("SetRegion", {"region":region}, this.SetRegion.getArguments().slice(1));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.WhereToBuy,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.WhereToBuy = new ProductWiki.Web.UserControls.WhereToBuy_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.ProductQuadrus == "undefined") ProductWiki.Web.UserControls.ProductQuadrus={};
ProductWiki.Web.UserControls.ProductQuadrus_class = function() {};
Object.extend(ProductWiki.Web.UserControls.ProductQuadrus_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	TapIt: function(product_label, tags, fixed_tags) {
		return this.invoke("TapIt", {"product_label":product_label, "tags":tags, "fixed_tags":fixed_tags}, this.TapIt.getArguments().slice(3));
	},
	UnTapIt: function(product_label, tags, fixed_tags) {
		return this.invoke("UnTapIt", {"product_label":product_label, "tags":tags, "fixed_tags":fixed_tags}, this.UnTapIt.getArguments().slice(3));
	},
	StoreTap: function(product_label, tags, fixed_tags) {
		return this.invoke("StoreTap", {"product_label":product_label, "tags":tags, "fixed_tags":fixed_tags}, this.StoreTap.getArguments().slice(3));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.ProductQuadrus,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.ProductQuadrus = new ProductWiki.Web.UserControls.ProductQuadrus_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.Quadrus == "undefined") ProductWiki.Web.UserControls.Quadrus={};
ProductWiki.Web.UserControls.Quadrus_class = function() {};
Object.extend(ProductWiki.Web.UserControls.Quadrus_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	NewQuadrusState: function() {
		return this.invoke("NewQuadrusState", {}, this.NewQuadrusState.getArguments().slice(0));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.Quadrus,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.Quadrus = new ProductWiki.Web.UserControls.Quadrus_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Quadrus == "undefined") ProductWiki.Quadrus={};
ProductWiki.Quadrus_class = function() {};
Object.extend(ProductWiki.Quadrus_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	url: '/ajaxpro/ProductWiki.Web.UserControls.QuadrusState,ProductWiki.Web.ashx'
}));
ProductWiki.Quadrus = new ProductWiki.Quadrus_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.CommunityReview == "undefined") ProductWiki.Web.UserControls.CommunityReview={};
ProductWiki.Web.UserControls.CommunityReview_class = function() {};
Object.extend(ProductWiki.Web.UserControls.CommunityReview_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	Submit: function(product_label, statement, type) {
		return this.invoke("Submit", {"product_label":product_label, "statement":statement, "type":type}, this.Submit.getArguments().slice(3));
	},
	Vote: function(statement_id, vote) {
		return this.invoke("Vote", {"statement_id":statement_id, "vote":vote}, this.Vote.getArguments().slice(2));
	},
	Delete: function(statement_id) {
		return this.invoke("Delete", {"statement_id":statement_id}, this.Delete.getArguments().slice(1));
	},
	Modify: function(statement_id, statement_text) {
		return this.invoke("Modify", {"statement_id":statement_id, "statement_text":statement_text}, this.Modify.getArguments().slice(2));
	},
	CommentConvert: function(product_label, statement_id) {
		return this.invoke("CommentConvert", {"product_label":product_label, "statement_id":statement_id}, this.CommentConvert.getArguments().slice(2));
	},
	StoreVote: function(statement_id, vote) {
		return this.invoke("StoreVote", {"statement_id":statement_id, "vote":vote}, this.StoreVote.getArguments().slice(2));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.CommunityReview,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.CommunityReview = new ProductWiki.Web.UserControls.CommunityReview_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.Promotion == "undefined") ProductWiki.Web.UserControls.Promotion={};
ProductWiki.Web.UserControls.Promotion_class = function() {};
Object.extend(ProductWiki.Web.UserControls.Promotion_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	PromoteItem: function(userid, content_type, item_id, promotion_type) {
		return this.invoke("PromoteItem", {"userid":userid, "content_type":content_type, "item_id":item_id, "promotion_type":promotion_type}, this.PromoteItem.getArguments().slice(4));
	},
	GetPromotionStatus: function(content_type, item_id) {
		return this.invoke("GetPromotionStatus", {"content_type":content_type, "item_id":item_id}, this.GetPromotionStatus.getArguments().slice(2));
	},
	PinItem: function(user_id, content_type, item_id, node_title, Pin) {
		return this.invoke("PinItem", {"user_id":user_id, "content_type":content_type, "item_id":item_id, "node_title":node_title, "Pin":Pin}, this.PinItem.getArguments().slice(5));
	},
	UnPinAll: function(content_type, item_id) {
		return this.invoke("UnPinAll", {"content_type":content_type, "item_id":item_id}, this.UnPinAll.getArguments().slice(2));
	},
	GetPinStatus: function(content_type, item_id) {
		return this.invoke("GetPinStatus", {"content_type":content_type, "item_id":item_id}, this.GetPinStatus.getArguments().slice(2));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.Promotion,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.Promotion = new ProductWiki.Web.UserControls.Promotion_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.ProductRelation == "undefined") ProductWiki.Web.UserControls.ProductRelation={};
if(typeof ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts == "undefined") ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts={};
ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts_class = function() {};
Object.extend(ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	Vote: function(DirectionID, VoteState, OtherDirectionID, IsCurrentProduct) {
		return this.invoke("Vote", {"DirectionID":DirectionID, "VoteState":VoteState, "OtherDirectionID":OtherDirectionID, "IsCurrentProduct":IsCurrentProduct}, this.Vote.getArguments().slice(4));
	},
	StoreVote: function(DirectionID, VoteState, OtherDirectionID, IsCurrentProduct) {
		return this.invoke("StoreVote", {"DirectionID":DirectionID, "VoteState":VoteState, "OtherDirectionID":OtherDirectionID, "IsCurrentProduct":IsCurrentProduct}, this.StoreVote.getArguments().slice(4));
	},
	AddRelation: function(product_label, Title, type) {
		return this.invoke("AddRelation", {"product_label":product_label, "Title":Title, "type":type}, this.AddRelation.getArguments().slice(3));
	},
	SetRelationAsInherited: function(directionid) {
		return this.invoke("SetRelationAsInherited", {"directionid":directionid}, this.SetRelationAsInherited.getArguments().slice(1));
	},
	DeleteRelation: function(directionid, type) {
		return this.invoke("DeleteRelation", {"directionid":directionid, "type":type}, this.DeleteRelation.getArguments().slice(2));
	},
	GetSuggestions: function(text, product_label, type) {
		return this.invoke("GetSuggestions", {"text":text, "product_label":product_label, "type":type}, this.GetSuggestions.getArguments().slice(3));
	},
	GetVoters: function(DirectionID, type) {
		return this.invoke("GetVoters", {"DirectionID":DirectionID, "type":type}, this.GetVoters.getArguments().slice(2));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts = new ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.IndividualReviewList == "undefined") ProductWiki.Web.UserControls.IndividualReviewList={};
ProductWiki.Web.UserControls.IndividualReviewList_class = function() {};
Object.extend(ProductWiki.Web.UserControls.IndividualReviewList_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	SetReviewHelpful: function(IsHelpful, ReviewID) {
		return this.invoke("SetReviewHelpful", {"IsHelpful":IsHelpful, "ReviewID":ReviewID}, this.SetReviewHelpful.getArguments().slice(2));
	},
	ClearReviewHelpful: function(ClearedValue, ReviewID) {
		return this.invoke("ClearReviewHelpful", {"ClearedValue":ClearedValue, "ReviewID":ReviewID}, this.ClearReviewHelpful.getArguments().slice(2));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.IndividualReviewList,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.IndividualReviewList = new ProductWiki.Web.UserControls.IndividualReviewList_class();

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.UserControls == "undefined") ProductWiki.Web.UserControls={};
if(typeof ProductWiki.Web.UserControls.GlobalRegister == "undefined") ProductWiki.Web.UserControls.GlobalRegister={};
ProductWiki.Web.UserControls.GlobalRegister_class = function() {};
Object.extend(ProductWiki.Web.UserControls.GlobalRegister_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
	CheckUserName: function(Username) {
		return this.invoke("CheckUserName", {"Username":Username}, this.CheckUserName.getArguments().slice(1));
	},
	ClearSession: function() {
		return this.invoke("ClearSession", {}, this.ClearSession.getArguments().slice(0));
	},
	SetFacebookEmailSetting: function(value) {
		return this.invoke("SetFacebookEmailSetting", {"value":value}, this.SetFacebookEmailSetting.getArguments().slice(1));
	},
	LogoutUser: function() {
		return this.invoke("LogoutUser", {}, this.LogoutUser.getArguments().slice(0));
	},
	GetUserID: function() {
		return this.invoke("GetUserID", {}, this.GetUserID.getArguments().slice(0));
	},
	PerformFacebookUserSignUp: function(Name, FacebookID, EmailAddress, AvatarURL) {
		return this.invoke("PerformFacebookUserSignUp", {"Name":Name, "FacebookID":FacebookID, "EmailAddress":EmailAddress, "AvatarURL":AvatarURL}, this.PerformFacebookUserSignUp.getArguments().slice(4));
	},
	url: '/ajaxpro/ProductWiki.Web.UserControls.GlobalRegister,ProductWiki.Web.ashx'
}));
ProductWiki.Web.UserControls.GlobalRegister = new ProductWiki.Web.UserControls.GlobalRegister_class();

function switchMode()
{
	var mobile_host='m.productwiki.com';
	var www_host='www.productwiki.com';
	var currentMode = readCookie('mobile');
	if (currentMode == null) {
		/* domain */
		if (location.host==mobile_host) 
			location.href=location.href.replace(mobile_host,www_host);
		else 
			location.href=location.href.replace(location.host,mobile_host);
	}
	else {
		/* user agent */
		if (currentMode == 'true')
			createCookie('mobile','false',1);
		else
			createCookie('mobile','true',1);
		window.location.reload();
	}
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var 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;
}

// this deletes the cookie when called
function deleteCookie(name, domain) {
	if (readCookie(name))
		document.cookie = name + "=" +
							( ( domain ) ? ";domain=" + domain : "" ) +
							";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}/*
 * jQuery 1.2.6 - New Wave Javascript
 *
 * Copyright (c) 2008 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
 * $Rev: 5685 $
 */
(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();var testgroup = readCookie('pwabtest');
//var ab_today=new Date();
var ab_day=2;
var adover=null;
if (testgroup != null) {
	if (isInteger(testgroup)) 
		document.writeln("<scr" + "ipt language='javascript' " + "src='/js/abtest/loader-"+ab_day+".js'></scr" + "ipt>"); 
}
function isInteger(s) {return (s.toString().search(/^-?[0-9]+$/) == 0);}


//statement
function Adsense(){
	width = null;
	height = null;
	format = null;
	type = null;  
	channel =null; 
	border = null;
	bg = null;
	link = null;
	url = null;
	text = null;
}function changeimage(change) 
{
	var prev = getEl('PreviewDiv');
	var upload = getEl('UploadDiv');
	var cancelUpload = getEl('CancelUploadDiv');

	if (change==true)
	{
		prev.style.display='none';
		upload.style.display='';
		cancelUpload.style.display='';
	}
	else
	{
		prev.style.display='';
		upload.style.display='none';
		cancelUpload.style.display='none';
	}
}

function img_over(thumb) {
	thumb.className = "img-on";
}

function img_out(thumb) {
	thumb.className = "img-off";
}

function img_select(id, newImageSrc, newImageFull)
{	
	var main = getEl('i');
	main.src = newImageSrc;
	
	var l = getEl('il');
	l.href = newImageFull;
}

function img_edit_select(id, newImageSrc, newtitle)
{	
	var main = getEl('i');
	main.src = newImageSrc;
	
	var title = getEl('ImageTitle');
	title.value = newtitle;
}

function getEl(id) {
	return document.getElementById(document.getElementById('prefix').value+id);
}

function hide(id) {document.getElementById(id).style.display='none';}
function show(id) {document.getElementById(id).style.display='';}

/* image slideshow javascript */
//image class
function ImageClass(){
	this.label='';
	this.extension='';
	this.description='';
	this.imgElement=null;
}

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.Slideshow = Class.create();
ProductWiki.Web.Controls.Slideshow.prototype = {
	/* PUBLIC */
	next: function() {
		this.dehighlight(this.currentIndex);
		if (this.currentIndex < this.images.length-1)
			this.currentIndex++;
		else 
			this.currentIndex=0;
		this.redraw();
	},
	previous: function() {
		this.dehighlight(this.currentIndex);
		if (this.currentIndex > 0)
			this.currentIndex--;
		else
			this.currentIndex=this.images.length-1;
		this.redraw();
		
	},
	jump: function(idx) {
		this.dehighlight(this.currentIndex);
		this.currentIndex=idx;
		this.redraw();
	},
	highlight: function(idx) {
		if (this.gallery) this.images[idx].imgElement.className = "img-on";
	},
	dehighlight: function(idx) {
		if (this.gallery) this.images[idx].imgElement.className = "img-off";
	},
	
	
	/* EVENT HANDLERS */
	clickGallery: function(event) {
		var idx=this.getThumb(event);
		this.jump(idx);
	},
	overGallery: function(event) {
		var idx=this.getThumb(event);
		if (idx!=this.currentIndex) this.highlight(idx);
	},
	outGallery: function(event) {
		var idx=this.getThumb(event);
		if (idx!=this.currentIndex) this.dehighlight(idx);
	},
	keyup: function(event) {
		switch(event.keyCode) {
			case 37:	//left
				if (this.keyboardCtl) this.previous();
				break;
			case 39:	//right
				if (this.keyboardCtl) this.next();
				break;				
		}
	},
	keydown: function(event) {
		switch(event.keyCode) {
			case 37:	//left
				return false;
				break;
			case 39:	//right
				return false;
				break;
		}
	},
	

	/* PRIVATE */
	redraw: function() {
		var img=this.images[this.currentIndex];
		this.currentImage.src=this.imageRoot+img.label+'-'+this.imageWidth+'-'+this.imageHeight+'.'+this.thumbExtension;
		if (this.detailLink!=null) this.detailLink.href=location.href+'image/'+img.label.replace(/_/g,"-")+'.html';
		if (this.zoomLink!=null) this.zoomLink.href=this.imageRoot+img.label+'.'+img.extension;
		if (this.editLink!=null) this.editLink.href='image/gbl_state_2/'+img.label.replace(/_/g,"-")+'.html';
		if (this.count!=null) this.count.innerHTML=(this.currentIndex+1).toString() + '/' + this.images.length.toString();
		this.highlight(this.currentIndex);
	},
	buildArray: function(images,extensions) {
		if (images.length>0) {
			var labels = images.split(",");
			var types = extensions.split(",");
			var image;
			for (var i=0;i<labels.length;i++) {
				image = new ImageClass();
				
				//data
				image.label=labels[i];
				image.extension=types[i];
							
				//HTML control
				if (this.gallery) {
					image.imgElement=document.getElementById('ss_img_'+i);
					
					//events
					addEvent(image.imgElement, "click", this.clickGallery.bind(this));
					addEvent(image.imgElement, "mouseover", this.overGallery.bind(this));
					addEvent(image.imgElement, "mouseout", this.outGallery.bind(this));
				}
				
				//add to array
				this.images[i]=image;
			}
		}
	},
	getThumb: function(event) {
		//get HTML control
		var thumb=null;
		if (event.target) thumb = event.target;
		else thumb = event.srcElement; 
		
		//extract index from ID ss_img_IDX, IDX=0,1,...,n
		var parts = thumb.id.split("_");
		return parts[2];
	},
	
	/* INIT */
	load: function() {
		//addEvent(window, "keyup", this.keyup.bind(this));
		//addEvent(window, "keydown", this.keydown.bind(this));
		//if (this.container!=null) this.container.focus();
	},

	initialize: function(images,extensions,idx,imageheight,imagewidth,gallery) {
		//initiliaze
		this.currentIndex = idx;
		
		//constants
		this.thumbWidth = 100;
		this.thumbHeight = 100;
		this.imageWidth = imagewidth;
		this.imageHeight = imageheight;
		this.imageRoot = 'http://www.productwiki.com/upload/images/';
		this.thumbExtension = 'jpg';
		this.gallery = gallery;
		this.keyboardCtl=false;
		
		//build image array
		this.images = [];
		this.buildArray(images,extensions);
		
		//HTML controls
		this.container = document.getElementById('product-gallery');
		this.nextLink = document.getElementById('ss_next');
		this.previousLink = document.getElementById('ss_previous');
		this.currentImage = document.getElementById('ss_currentImage');
		this.zoomLink = document.getElementById('ss_zoom');
		this.detailLink = document.getElementById('ss_detail');
		this.editLink = document.getElementById('ss_edit');
		this.count = document.getElementById('ss_count');
		
		//events
		addEvent(this.nextLink, "click", this.next.bind(this));
		addEvent(this.previousLink, "click", this.previous.bind(this));
		if (this.gallery) addEvent(this.currentImage, "click", this.next.bind(this));		
					
		//bind page load event
		addEvent(window, "load", this.load.bind(this));				
	}
};
function c_post(scroll) {
	c_show();
	if (scroll) location.href='#post';
}

function c_scroll() {
	location.href='#comments';
}

function c_register() {
	document.getElementById("c_preregister").style.display='none';
	document.getElementById("c_register").style.display='';
	
	document.getElementById("c_msg1").style.display='';
	document.getElementById("c_msg2").style.display='';
	document.getElementById("c_msg3").style.display='none';
	document.getElementById("c_password2").style.display='';
	document.getElementById("c_email").style.display='';
	document.getElementById("c_registerpost").style.display='';
	document.getElementById("c_signinpost").style.display='none';
}

function c_signin() {
	document.getElementById("c_msg1").style.display='none';
	document.getElementById("c_msg2").style.display='none';
	document.getElementById("c_msg3").style.display='';
	document.getElementById("c_password2").style.display='none';
	document.getElementById("c_email").style.display='none';
	
	document.getElementById("c_registerpost").style.display='none';
	document.getElementById("c_signinpost").style.display='';
}// Twitter stream js:
jQuery.fn.reverse = Array.prototype.reverse;
String.prototype.linkify = function() 
{
  return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g, function(m) 
  {
  return m.link(m);
  });
};

String.prototype.linkuser = function() 
{
  return this.replace(/[@]+[A-Za-z0-9-_]+/g, function(u) 
  {
    var username = u.replace("@","")
    return u.link("http://twitter.com/"+username);
  });
};

String.prototype.linktag = function() 
{
  return this.replace(/[#]+[A-Za-z0-9-_]+/, function(t) 
  {
    var tag = t.replace("#","%23")
    return t.link("http://search.twitter.com/search?q="+tag);
  });

}; 
function fetch_tweets(elem) {
	if (window.twitter["timeout"]!=null) clearInterval(window.twitter["timeout"]);
	window.twitter["timeout"]=null;
	fetch_tweets_i(elem);
}

function urlencode(str) {
	str = escape(str);
	str = str.replace('+', '%2B');
	str = str.replace('%20', '+');
	str = str.replace('*', '%2A');
	str = str.replace('/', '%2F');
	str = str.replace('@', '%40');
	return str;
}
function urldecode(str) {
	str = str.replace('+', ' ');
	str = unescape(str);
	return str;
}
function fetch_tweets_i(elem)
{		
		var loader=document.getElementById('tweetloader');
		if (loader.style.display!='none')
			$('#monitterpaging').hide();
		
		elem = $(elem);
		input = elem.attr('title');
		lang = window.twitter["lang"];
		if(input != window.twitter['text-'+input])
		{
			window.twitter['last_id'+input] = 0;
			window.twitter['text-'+input] 	= input;					
			window.twitter['count-'+input]  = 0;
			window.twitter['limit'] = window.twitter["resultperpage"];
		}
			
		/* if(window.twitter['count-'+input] > 20)
		{
			elem.prepend('<div class="tweet"><img src="http://monitter.com/widget/favicon.gif" align="absmiddle" />real time twitter by: <a href="http://monitter.com" target="_blank">monitter.com</a></div>');
			window.twitter['count-'+input] = 0;
		} */	
		
				
		var showId;
		if(window.twitter["page"]==1 && !window.twitter["paged"])
		{
			showID="&since_id="+window.twitter['last_id'+input];
		}
		else
		{
			showID="";
		}			
		var url = "http://search.twitter.com/search.json?q="+window.twitter["search"]+" -deals -sales -deal -sale -shipping -shop -new -used -bid -shit -fuck -bitch -filter:links"+"&lang="+lang+"&rpp="+window.twitter["rrp"]+"&page="+window.twitter["page"]+showID+"&callback=?";
		
		if(tabs.selected_idx==tabs.get_idx("twitter") || window.twitter["force"])
		{
			window.twitter["force"]=false;
			$.getJSON(url, function(json)
			{			
				$('div.tweet:gt('+window.twitter['limit']+')',elem).each(function(){$(this).fadeOut('slow')});
				
				var reply_url;
				if(!json.error){
					$(json.results).reverse().each(function()
					{
						if($('#tw'+this.id,elem).length == 0)
						{
							window.twitter['count-'+input]++;
							window.twitter['count']++;
						
							var thedate = new Date(Date.parse(this.created_at));
							/* var thedatestr = thedate.getHours()+':'+thedate.getMinutes(); */
							var thedatestr = thedate.toLocaleString();
							
							reply_url='http://twitter.com/home?status='+urlencode('@'+this.from_user+' RE: '+window.twitter["search"]+' '+window.twitter["tinyurl"]);
							
							var divstr = '<div id="tw'+this.id+'" class="tweet item"><img width="48" height="48" src="'+this.profile_image_url+'" alt=""/><p class="text">'+this.text.linkify().linkuser().linktag()+'<br /><strong><a target="_blank" href="http://twitter.com/'+this.from_user+'" target="_blank">'+this.from_user+'</a></strong> &nbsp;-&nbsp;<em>'+thedatestr+'</em>&nbsp;<a href="'+reply_url+'" rel="nofollow" target="_blank">@reply</a></p></div>';
						
							window.twitter['last_id'+input] = this.id;
							
							elem.prepend(divstr);
							
							$('#tw'+this.id,elem).hide();
							$('#tw'+this.id+' img',elem).hide();
							$('#tw'+this.id+' img',elem).fadeIn(0);
							$('#tw'+this.id,elem).fadeIn('fast');
							
						}
					});
				}
				input = escape(input);
				
				$('#tweets').show();
				$('#tweetloader').hide();
				
				var paging=false;
				if(window.twitter["count"] < window.twitter['limit']){
					$('.nextpage').hide();
				} else {
					$('.nextpage').show();
					paging=true;
				}
				
				if(window.twitter["page"] >	1) {
					$(".firstpage").show();
					$(".previouspage").show();
					paging=true;
				}
				else {
					$(".firstpage").hide();
					$(".previouspage").hide();
				}
				if (paging) $('#monitterpaging').fadeIn('fast');
				
				if((window.twitter["count"] < 1) && (window.twitter["page"] ==1))
					$('#notweets').show();
				else
					$('#notweets').hide();
			});
		}
									
		if(window.twitter["page"] == 1)
		{
			if(tabs.selected_idx==tabs.get_idx("twitter"))
			{
				window.twitter["paged"] = false;
				window.twitter["rrp"] = 1;
			}
			if (window.twitter["timeout"]==null)
				window.twitter["timeout"]=setInterval(function(){fetch_tweets_i(elem)},window.twitter["refresh"]);
		}				
					
	return(false);	
}

function reset_feed()
{	
	$('#tweets').hide();
	$('#tweetloader').show();
	$('#monitterpaging').hide();
	$('#notweets').hide();	
	
	window.twitter["page"]=1;
	window.twitter["paged"]=true;
	window.twitter["rrp"]=window.twitter["resultperpage"];
	window.twitter["count"]=0;
		
	$('.monitter').each(function(e)	{
		$('div.tweet').each(function(){$(this).fadeOut('slow')});
		$('div.tweet').each(function(){$(this).remove()});
				
		fetch_tweets(this);
	});
}

/* initialization functions */

$(document).ready(function(){});

$(document).ready(function(){
	window.twitter = {};
	window.twitter["search"] = $('.monittersearch').attr('value');
	window.twitter["count"] = 0;
	window.twitter["page"]=1;
	window.twitter["resultperpage"]=10;
	window.twitter["rrp"]=window.twitter["resultperpage"];
	window.twitter["paged"]=false;
	window.twitter["lang"]='en';
	window.twitter["force"]=false;
	$('#monitterpaging').hide();
	window.twitter["refresh"]=10000;
	window.twitter["tinyurl"]=$('#tinyurl').attr('value');
	
	var hash=getHash();
	if (hash=='twitter') {
		$('.monitter').each(function(e)	{
			fetch_tweets(this);
		});
	}

	$('#slidebox').slideDown(1000);
			
});

/* tie into tab click */
$(document).ready(function(){
	$('#twitter_tab').bind("click", function(){
		$('.monitter').each(function(e)	{
			$('#tweets').hide();
			$('#tweetloader').show();	
			window.twitter["force"]=true;		
			fetch_tweets(this);
		});
	});
});

/* paging utility */
$(document).ready(function(){
	window.twitter["paged"] = false;
	
	$(".nextpage").bind("click", function(){
		window.twitter["page"]+=1;
		window.twitter["paged"]=true;
		window.twitter["rrp"]=window.twitter["resultperpage"];
		window.twitter["timeout"]=null;
		window.twitter["count"]=0;

	
		$('#tweets').hide();
		$('#tweetloader').show();
		
		$('.monitter').each(function(e)	{
			$('div.tweet').each(function(){$(this).fadeOut('slow')});
			$('div.tweet').each(function(){$(this).remove()});			
			fetch_tweets(this);
		});
		
	});
	
	$(".firstpage").bind("click", function(){
		reset_feed();		
	});
	
	$(".previouspage").bind("click", function(){
		window.twitter["page"]-=1;
		window.twitter["count"]=0;
		window.twitter["timeout"]=null;

		
		$('#tweets').hide();
		$('#tweetloader').show();
			
		$('.monitter').each(function(e)	{
			$('div.tweet').each(function(){$(this).fadeOut('slow')});
			$('div.tweet').each(function(){$(this).remove()});
			window.twitter["rrp"]=window.twitter["resultperpage"];
			fetch_tweets(this);
		});
		
	});
});


/* update search */
$(document).ready(function(){
	$('.monittersearch').keypress(function(e){
		if(e.which==13){
			if('function' == typeof e.preventDefault){			
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
			
			$('.updatesearch').click();
			return false;
		}		 
	});

	$('.updatesearch').bind("click", function(){
		window.twitter["search"] = $('.monittersearch').attr('value');
		reset_feed();
	});
});

/* overwrite tweet this button */
$(document).ready(function(){
	$('.tw-button').find('a').bind("click", function(e){
			 e.preventDefault();
			 var tinyURL=$.ajax({
					url: "/proxyloader.aspx?url="+urlencode("http://tinyurl.com/api-create.php?url=" + urlencode(location.href)),
					async: false
				}).responseText;

			window.open($('.tw-button').find('a').attr('href') + tinyURL, '_blank');
			// location.href='http://www.twitter.com/home?status=' + 'productwiki Thinking about getting the+' + $('.monittersearch').attr('value') + '. Thoughts? ' + tinyURL;
			return false;
	});
});
var tracking=false;
function tcallback(res) {}
function adsense_click() {
	//top.window.focus();
	if (tracking) pageTracker_advanced._trackPageview('/productpage/clickthrus/adsense');
	ProductWiki.Web.BasePage.PWPage.TrackGoogleAdsenseClick(tcallback);
}

function sdc(label,section,m) {
	//top.window.focus();
	if (tracking) pageTracker_advanced._trackPageview('/productpage/clickthrus/sdc/'+m+'/'+section+'/'+label);
	//ProductWiki.Web.BasePage.PWPage.TrackShoppingDotComClick(pid,tcallback);
}

function register_success() {
	track('/register/success/');
}
function register_fail() {
	track('/register/fail/');
}
function register_popup(element) {
	track('/register/popup/'+element.id);
}

function track(url) {
	if (tracking) {pageTracker_advanced._trackPageview(url);}
}

function init_adsense() {
	if (document.all) {  //ie
		var el = document.getElementsByTagName("iframe");
		for(var i = 0; i < el.length; i++) {
			if(el[i].src.indexOf('googlesyndication.com') > -1) {

				el[i].onfocus =  adsense_click;
			}
		}
	} 
	else {   // firefox
		window.addEventListener('beforeunload', doPageExit, false);
		window.addEventListener('mousemove', getMouse, true);
	}
}


function FixTOC() {
	window.onresize=function() {FixTOC()};
	var c="TOC-R";
	if (clientWidth()<1000) c="";
	var m=document.getElementById('main');
	if (m.className!=c) {
		document.getElementById('header').className=c;
		document.getElementById('sub-header').className=c;
		m.className=c;
	}
}

function showmoreads(more_link, id) {
	var $el = $('#more_ads'+id);	
	
	if ($el.is(':hidden')) {
		more_link.innerHTML='show fewer offers';
		more_link.className='external';
	}
	else {
		//el.style.display='none';
		more_link.innerHTML='show more offers';
		more_link.className='zippy';
	}
	$el.slideToggle('fast');
}

function showchangeads(more_link) {
	var el=document.getElementById('change_ads');
	if (el.style.display=='none') {
		el.style.display='';
	}
}

function clickableWhereToBuy() {
	$('#product-sdc table.inline a').each(function(){
		//alert(this.href);	
	});
}

//localized where to buy
function setzip(deferred) {
	var zip=$("#zipcode").val();
	if (deferred) 
		ProductWiki.Web.UserControls.WhereToBuy.SetZip(zip,rebindDeferredWTB);
	else 
		location.href=getBaseURL(location.href)+"?zip="+zip;
}

function setregion(region,deferred) {
	if (deferred)
		ProductWiki.Web.UserControls.WhereToBuy.SetRegion(region,rebindDeferredWTB);
	else
		location.href=getBaseURL(location.href)+"?region="+region;
}

function rebindDeferredWTB() {
	bindDeferred($("#product-sdc .defer").get(0));
	bindWTBInputs();
}

function getBaseURL(url) {
	url = url.split("?")[0];
	if (url.charAt(url.length-1)!="/") url=url+"/";
	return url.substring(0,url.lastIndexOf('/')+1);
}

function bindWTBInputs(deferred) {
	$('#zipcode').bind('keypress', function(e){
		if(e.keyCode == 13) {
			e.preventDefault();
			setzip(deferred);
		}
	});
	$('#zipcode').bind('focus', function(){
		if (this.value=='zip code') this.value='';
	});
}

//for firefox
var px;
var py;

function getMouse(e) {
	px=e.pageX;
	py=e.clientY;
}

function findY(obj) {
	var y = 0;
	while (obj) {
		y += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return(y);
}

function findX(obj) {
	var x = 0;
	while (obj) {
		x += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return(x);
}

function doPageExit(e) {
	ad = document.getElementsByTagName("iframe");
	for (i=0; i<ad.length; i++) {
		var adLeft = findX(ad[i]);
		var adTop = findY(ad[i]);
		var inFrameX = (px > (adLeft - 10) && px < (parseInt(adLeft) + parseInt(ad[i].width) + 15));
		var inFrameY = (py > (adTop - 10) && py < (parseInt(adTop) + parseInt(ad[i].height) + 10));
		
		if (inFrameY && inFrameX) {
			adsense_click();
		}
	}
}
//end for firefox

function clientWidth() {
	return filterResults(window.innerWidth ? window.innerWidth : 0,document.documentElement ? document.documentElement.clientWidth : 0,document.body ? document.body.clientWidth : 0);
}
function filterResults(n_win, n_docel, n_body)
{
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
var forceRegister = false;

function bindDeferred(element) {
	//parse event binding attribute or something
	var bindelement=document.getElementById(element.id+'_bindelement').value;
	var bindevent=document.getElementById(element.id+'_bindevent').value;
	var loadinghtml=document.getElementById(element.id+'_loadinghtml').value;
	element.innerHTML=loadinghtml;
	
	if ((bindelement == "") || (bindevent == "")) {
		getDeferredHTML(element);
	}
	else {
		$("#" + bindelement).bind(bindevent,element,function(e){
			getDeferredHTML(e.data);
		});
	}
}

function getDeferredHTML(element) {
	var url=document.getElementById(element.id+'_url').value;
	var id=document.getElementById(element.id+'_id').value;
	ProductWiki.Web.UserControls.Deferred.DeferredControl.GetDefferedHTML(url,id,deferredCallBack.bind(element));
}

function deferredCallBack(res) {
	var html=res.value;
	if (html == null) html = "";
	$(this).hide();
	this.innerHTML = html;
	$(this).fadeIn("slow");
	executeJS(this);
}

function executeJS(element) {
	$('#'+element.id+' script').each(function(){
		if (this.src > "") {
			document.body.append(this.src);
		}
		else {
			eval($(this).html());
		}
	});
	$('#'+element.id+' iframe').each(function(){
		//execute scripts inside iframes
	});
}

/* register */
$(document).ready(function(){
	
	$('#tap-signin').bind('click', function(){
		$('#tap_register').hide();
		$('#tap_signin').fadeIn('fast');
	});
	
	$('#tap-register').bind('click', function(){
		$('#tap_signin').hide();
		$('#tap_register').fadeIn('fast');
	});
	
	$('#tap-signin').trigger('click');
	
	$('#tap-openid').bind('click', function(){
		$('#tap_openid .inputs').toggle();
	});
	
	
	// setup people disabling the dialog
	$('#disableRegisterBox').bind('click', function(){
		createCookie('disableRegister', $(this).is(':checked'), 1);
	});
	
	
	//ensure that you can still get pop-up by clicking on top-right links
	$('#joinPWLink').bind('click', function(){
		forceRegister = true;
		position_signin(this);
		forceRegister = false;
		$('#tap-register').trigger('click');
	});
	
	$('#signInLink').bind('click', function(){
		forceRegister = true;
		position_signin(this);
		forceRegister = false;
		$('#tap-signin').trigger('click');
	});
	
	//logout
	$('a#signout_ao').bind('click',function(){
		ProductWiki.Web.UserControls.GlobalRegister.LogoutUser();
		FB.Connect.logout(function(){
			//do nothing			
			location.reload(true);
		});					
	});
});
	
	
function fbloggedin()
{		
	$('#fb-authentication').fadeIn('slow');

	var usr = new Array(1);
	FB.Facebook.get_sessionState().waitUntilReady(function()
	{       
		var fields = new Array();
		fields[0] = "name";					
		usr[0]=FB.Connect.get_loggedInUser();
		FB.Facebook.apiClient.users_getInfo(usr,['name','pic_big', 'proxied_email'], function(uInfo, ex){
			var isNew = ProductWiki.Web.UserControls.GlobalRegister.PerformFacebookUserSignUp(uInfo[0].name.toString(), usr[0].toString(), uInfo[0].proxied_email.toString(), uInfo[0].pic_big.toString());

			register_success();

			if(isNew.value == true)
			{
				FB.Connect.showPermissionDialog('email', function(accepted){
					ProductWiki.Web.UserControls.GlobalRegister.SetFacebookEmailSetting(accepted);
					location.reload(true);
				});
			}
			else
			{
				location.reload(true);
			};
		});
	});
}

function tap_register() {
	document.getElementById("tap_register").style.display='';
	document.getElementById("tap_signin").style.display='none';
	document.getElementById("tap_openid").style.display='none';
}

function tap_signin() {
	document.getElementById("tap_register").style.display='none';
	document.getElementById("tap_signin").style.display='';
	document.getElementById("tap_openid").style.display='none';
}

function tap_openid() {
	document.getElementById("tap_register").style.display='none';
	document.getElementById("tap_signin").style.display='none';
	document.getElementById("tap_openid").style.display='';
}
function tap_close() {
	document.getElementById("tap_login").style.display='none';
	ProductWiki.Web.UserControls.GlobalRegister.ClearSession();
	register_fail();

}
function signin_signin() {
	document.getElementById("signin_signin").style.display='';
	document.getElementById("signin_openid").style.display='none';
}

function signin_openid() {
	document.getElementById("signin_signin").style.display='none';
	document.getElementById("signin_openid").style.display='';
}
function ajax_callback(res) {
	var value = res.value;
}
function position_signin(node) {
	var disableRegCookie = readCookie('disableRegister');
	if (disableRegCookie == null)
	{
		disableRegCookie = 'false';	
	};
	if((disableRegCookie == 'false') || forceRegister == true)
	{
		var signin=document.getElementById('tap_login');
		var main = document.getElementById('main');
		
		var y=xPageY(node)-240;
		if (y<0) y=0;
		signin.style.display='';
		signin.style.left = xPageX(main) + 'px';
		signin.style.top = y + 'px';
		register_popup(node);
	}
}

function xPageY(e) {
	var y = 0;
	while (e) {
		if (this.xDef(e.offsetTop)) y += e.offsetTop;
		e = this.xDef(e.offsetParent) ? e.offsetParent : null;
	}
	return y;
}
function xPageX(e) {
	var x = 0;
	while (e) {
		if (this.xDef(e.offsetLeft)) x += e.offsetLeft;
		e = this.xDef(e.offsetParent) ? e.offsetParent : null;
	}
	return x;
}
function xDef() {
	for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
	return true;
}

function addEvent(o, evType, f, capture) {
	if (o!=null) {
		if(o.addEventListener) {
			o.addEventListener(evType, f, capture);
			return true;
		} else if (o.attachEvent) {
			var r = o.attachEvent("on" + evType, f);
			return r;
		} else {
			//alert("Handler could not be attached");
		}
	}
}

function With(o, p) {
	for(var prop in p) {
		o[prop] = p[prop]; 
	}
}

function checkuser_callback(res) {
	var user_val=res.request.args.Username;
	var user_lbl=res.value[0];
	
	var e2=document.getElementById('username_url');
	e2.innerHTML=user_lbl;
			
	var e=document.getElementById('name_result');
	if (res.value[1]=='true') {
		e.innerHTML='Available!';
		e.style.color='green';
		e2.style.color='green';
	}
	else {
		e.innerHTML='Not available!';
		e.style.color='red';
		e2.style.color='red';
	}
}

function checkuser(el) {
	var user_val;
	var isvalid;
	var userlabel;
	user_val=el.value;
	var trimmed=user_val.replace(/^\s+|\s+$/g,'');
	
	var e2=document.getElementById('username_url');
		
	if (trimmed.length==0) {
		e2.innerHTML='USERNAME';
		e2.style.color='green';
	}
	else {
		ProductWiki.Web.UserControls.GlobalRegister.CheckUserName(trimmed,checkuser_callback);
	}
}

function tab_signin(node,url) {
	position_signin(node);
	ProductWiki.Web.UserControls.Tabs.TabSignin(url);
}

/* hash code stuff */
function getHash() {
	var idx = location.href.indexOf('#');
	if (idx != -1)
		return location.href.substring(idx+1, location.href.length);
	else
		return null;	
}

function saveHash() {
	document.getElementById('URLHash').value = window.location.hash;
}

function saveHash2(hash) {
	document.getElementById('URLHash').value = '#'+hash;
}

function Left(str, n) {
    if (n <= 0)     // Invalid bound, return blank string
        return "";
    else if (n > String(str).length)   // Invalid bound, return
        return str;                // entire string
    else // Valid bound, return appropriate substring
        return String(str).substring(0,n);
}

/* tie button functionality */
function tb(e,element) {
	var key=-1;
	var button=document.MainForm.elements[element];
	if (button == null) button = document.getElementById(element);
	if (e && e.which) key = e.which;
	else if (typeof(event)!="undefined") key = event.keyCode;

	switch(key) {
		case 13:	//enter
			button.click();
			return false;
			break;
		default:
			return true;
	}
}

function mainSearch() {
	var txt=document.getElementById('home-search-text').value;
	location.href='/home/search?cx=017333858719625053123%3Alr9sftht3ry&cof=FORID%3A11&q='+encodeURI(txt);
	return false;
}

/* tie button functionality OLD WAY
function tb(e,element) {
	if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
		document.MainForm.elements[element].click();
		return false;
	}
	else return true;
}
*/


/*add item to watchlist*/
function watchitem(id)
{
	ProductWiki.Web.UserControls.ContentWatchlist.WatchItem(id);
	document.getElementById('watchlist_off').style.display='none';
	document.getElementById('watchlist_on').style.display='';
}

/*remove item to watchlist*/
function unwatchitem(id)
{
	ProductWiki.Web.UserControls.ContentWatchlist.UnwatchItem(id);
	document.getElementById('watchlist_off').style.display='';
	document.getElementById('watchlist_on').style.display='none';
}


/*add friend */
function addfriend(friendid)
{
	ProductWiki.Web.UserControls.FriendAction.AddFriend(friendid);
	document.getElementById('friend_off').style.display='none';
	document.getElementById('friend_on').style.display='';
}

/*remove friend*/
function unfriend(friendid)
{
	ProductWiki.Web.UserControls.FriendAction.UnFriend(friendid);
	document.getElementById('friend_off').style.display='';
	document.getElementById('friend_on').style.display='none';
}

/*****************
** UTILITIES *****
*****************/

/*Get DOM elements by class name*/
function getElementsByClass(searchClass,node,tag) {

	var classElements = new Array();
	if (node == null)
			node = document;
	if (tag == null)
			tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	var j = 0;
	for (i = 0; i < elsLen; i++) {
			if (pattern.test(els[i].className) ) {
					classElements[j] = els[i];
					j++;
			}
	}
	return classElements;
}


/* SEARCH */
if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.SearchBox = Class.create();
ProductWiki.Web.Controls.SearchBox.prototype = {
	initialize: function(idx) {
		this.idx=idx;
		
		this.delay_timer=null;
		this.delay_time=300;
		this.first_focus=true;
		this.last_search="";
		this.results=[];
		this.active_result=0;
		
		this.text=document.getElementById('search'+this.idx+'_text');
		this.suggest=document.getElementById('search'+this.idx+'_suggest');
		this.button=document.getElementById('search'+this.idx+'_button');
	
		addEvent(window, "load", this.load.bind(this));	
	},

	load: function() {
		if (this.text != null) {
			addEvent(this.text, "focus", this.focus.bind(this));
			addEvent(this.text, "keyup", this.keyup.bind(this));
			addEvent(this.text, "keydown", this.keydown.bind(this));
			addEvent(this.button, "click", this.doSearch.bind(this));
		}
	},
	
	focus: function(event) {
		var node=this.getNode(event);
		if (this.first_focus) {
			this.suggest.style.display='';
			this.addResult(this,this.firstResult(this),0);
		}
		this.first_focus=false;
	},
	
	keyup: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				var l = this.text.value.length;
				//need to remove the <<enter>> character
				if (l>0) {
					if (this.text.value.charCodeAt(l-1)==10)
						this.text.value = this.text.value.substr(0,l-1);
				}
				this.doSearch(event);
				break;
			case 27: //esc
				this.suggest.style.display='none';
				break;
			default:
				this.getResults_delayed();
		}
	},
	
	keydown: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				return false;
				break;
		}
	},
		
	getResults_delayed: function() {
		if (this.last_search!=this.text.value) {
			this.last_search=this.text.value;
			if (this.delay_timer!=null)	clearTimeout(this.delay_timer);
			var ref=this;
			this.delay_timer=setTimeout(function(){ref.endTimer();}, this.delay_time);
			this.reset(this);
			this.text.className="textbox ajax";
		}
	},
	
	getResults: function() {
		ProductWiki.Web.UserControls.Search.getResults(this.text.value,this.idx,this.getResults_callback);
	},

	getResults_callback: function(res) {
		var me=search[res.request.args.idx];
		var results = res.value;
		me.reset(me);
		for (var i=0;i<results.length;i++) {
			me.addResult(me,me.resultHTML(results[i].Icon,results[i].Title,results[i].Description),i+1);
			me.results[me.results.length]=results[i];
		}
	},
	
	addResult: function(me,html,x) {
		var e=document.createElement("div");
		e.id="search"+me.idx+"_"+x;
		e.innerHTML=html;
		e.className="item"
		addEvent(e, "click", me.select.bind(me));
		me.suggest.appendChild(e);
	},
	
	reset: function(me) {
		this.text.className="textbox";
		me.suggest.innerHTML='';
		me.suggest.style.display='';
		me.addResult(me,me.firstResult(me),0);
		this.results=[];
		this.results[0]=null;
		this.active_result=0;
	},
	
	firstResult: function(me) {
		var query='&lt;enter query&gt;';
		if (me.text.value!="") query='<strong>'+me.text.value+'</strong>';
		return me.resultHTML("/images/zoom_icon.gif","","Search ProductWiki for "+query);
	},
	
	resultHTML: function(icon,title,description) {
		return '<span class="i"><img src="'+icon+'"/></span><span class="t">'+title+'</span><span class="d">'+description+'</span>';
	},
	
	select: function(event) {
		var sender = this.getNode(event);
		
		var id=this.extractID($(sender));
		var x=parseInt(id.toString().split("_")[1]);
		this.active_result=x;
		this.go();
	},
	
	extractID: function(obj) {
		if (obj.attr("id")=="") 
			return this.extractID(obj.parent());
		else
			return obj.attr("id");
	},

	doSearch: function(event) {
		location.href='/search?q='+encodeURI(this.text.value);
		return false;
	},

	go: function(event) {
		if (this.active_result>0) {
			location.href=this.results[this.active_result].URL;	
		}
		else {
			this.doSearch();	
		}
	},
	endTimer: function() {
		this.delay_timer=null;
		this.getResults();
	},
	
	getNode: function(event) {
		var e=null;
		if (event.target) e = event.target;
		else e = event.srcElement; 
		return e;
	}
};

$(document).ready(function(){
	$('textarea.textbox').keypress(function(e){
		if(e.which==13){
			if('function' == typeof e.preventDefault){			
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
			return false;
		}		 
	});
});function QStateIE6(){
	this.TotalCount=0;
	this.TagCount=[];
	this.TagState=[];
	this.TagNames=[];
	this.OtherTags=[];
}

//DiscoveryProduct
function showmoreexperts(more_link) {
	var el=document.getElementById('more_experts');
	if (el.style.display=='none') {
		el.style.display='';
		more_link.innerHTML='show less';
	}
	else {
		el.style.display='none';
		more_link.innerHTML='show more';
	}
}

function clearChildren(list){
	while(list.childNodes[0])
	{
		list.removeChild(list.childNodes[0]);
	}
}
	
TapperTab = Class.create();
TapperTab.prototype = {
	initialize: function(tag, pMainUL, pMoreUL, pMoreLink, pTab){
		//Constants
		this.numVisible=12;
	
		//regular member fields
		this.tappers = [];			// array of tapper objects
		this.tagName = tag;			// the tag to display
		this.mainUL = pMainUL;		// the content div that has its contents replaced
		this.moreLink = pMoreLink	// the link that says "show more"
		this.moreUL = pMoreUL;	// the "show more" div
		this.tab = pTab;			// the tab for this particular tapper group
		this.initialized=0;		// has the tab been clicked on yet?
		this.mainFragment=document.createDocumentFragment();	// stores the main list
		this.moreFragment=document.createDocumentFragment();	// stores the more list
		
		//setup events
		addEvent(this.tab.childNodes[0], 'click', this.activateTab.bind(this), false);	
	},
	
	activateTab: function(){
		this.createTab();
		
		//Set contents
		clearChildren(this.mainUL);
		if(this.moreUL != null){clearChildren(this.moreUL);}
		
		this.mainUL.appendChild(this.mainFragment);
		if(this.tappers.length > this.numVisible)	
		{
			this.moreLink.style.display = '';
			this.moreUL.appendChild(this.moreFragment);
		}
		else if(this.moreUL != null)
		{
			this.moreLink.style.display='none';
			this.moreUL.style.display='none';
		}
		
		//Set header
		this.deactivateOtherTabs();
		this.tab.className='tap-total';
		
		//track in analytics
		if (tracking) {
			var url=analytics_url;
			if (url>"") {
				if (this.tagName>"")
				{	url+="q-"+this.tagName+"/"; }
				pageTracker_advanced._trackPageview(url);
			}
		}
	},
	
	deactivateOtherTabs: function(){
		//first let's do the previous siblings
		var currentTab;
		if(this.tab.previousSibling)
		{
			currentTab = this.tab.previousSibling;
			while(currentTab)
			{
				if(currentTab.nodeType == 1)
				{
					currentTab.className = '';
				}
				currentTab = currentTab.previousSibling;
			}
		}
		
		//now let's do next siblings
		if(this.tab.nextSibling)
		{
			currentTab = this.tab.nextSibling;
			while(currentTab)
			{
				if(currentTab.nodeType == 1)
				{
					currentTab.className = '';
				}
				currentTab = currentTab.nextSibling;
			}
		}
	},
	
	createTab: function(){
		for(var inner_index=0; inner_index < this.tappers.length; ++inner_index)
		{
			if(inner_index < this.numVisible)
			{
				this.mainFragment.appendChild(this.tappers[inner_index]);
			}
			else
			{
				this.moreFragment.appendChild(this.tappers[inner_index]);
			}
		}
		
		this.initialized=1;
	}
};

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.QuadrusStats = Class.create();
ProductWiki.Web.Controls.QuadrusStats.prototype = {
	showmore: function() {
		var e = document.getElementById('moretap');
		
		if (e.style.display=='') {
			e.style.display='none';
			this.moretappers.innerHTML=this.show_text;
		}
		else {		
			this.moretappers.innerHTML = 'show less';
			e.style.display='';
		}
	},
	load: function() {
		//bind to show more link
		if(this.moretappers){
			addEvent(this.moretappers, "click", this.showmore.bind(this));
		}	
		
		//get the tabs
		var mainDiv = document.getElementById('product-tappers');
		if(mainDiv != null)
		{	
			//initialize main subsections
			var countTabs = null;
			var mainList = null;			
			var moreLink = null;
			var moreList = null;
			
			for(index in mainDiv.childNodes)
			{
				var child = mainDiv.childNodes[index];
				if(child.nodeType == 1)
				{
					if(countTabs == null){countTabs = child; continue;}
					if(mainList == null){mainList = child; continue;}
					if(moreLink == null){moreLink = child; continue;}
					if(moreList == null){moreList = child; continue;}					
				}
			}
			
			//get the tabs
			var tagTabArray = [];
			for(index2 in countTabs.childNodes)
			{
				var child = countTabs.childNodes[index2];
				if(child.nodeType == 1)
				{
					tagTabArray.push(child);					
				}
			}
			
			//now let's initialize the different tapTabs
			this.allTab = new TapperTab('all', mainList, moreList, moreLink, tagTabArray[0]);
			this.loveTab = new TapperTab('love', mainList, moreList, moreLink, tagTabArray[1]);
			this.wantTab = new TapperTab('want', mainList, moreList, moreLink, tagTabArray[2]);
			this.haveTab = new TapperTab('have', mainList, moreList, moreLink, tagTabArray[3]);
			this.otherTab = new TapperTab('tag', mainList, moreList, moreLink, tagTabArray[4]);
			
			if(mainList){
				this.addTappersToTabs(mainList.childNodes);
			}
			
			if(moreList){
				this.addTappersToTabs(moreList.childNodes);
			}
			
		} //if mainDiv != null
	},
	
	addTappersToTabs: function(nList){
		
		for(index in nList)
		{
			var child = nList[index];
			if(child.nodeType == 1)
			{
				this.allTab.tappers.push(child);
				//we need to figure out what the tags are
				var innerTags = child.innerHTML;			
				innerTags = innerTags.replace(/\s/gm,'').match(/title\=.+\"/)[0].replace('title=','').replace('href','').match(/\w+(,\s?\w+)*/)[0];
				
				
				if(innerTags.match(/\blove\b/)){this.loveTab.tappers.push(child);}
				if(innerTags.match(/\bwant\b/)){this.wantTab.tappers.push(child);}
				if(innerTags.match(/\bhave\b/)){this.haveTab.tappers.push(child);}
				
				//now determine if there's other tags
				innerTags = innerTags.replace(/want|love|have/gi,'').replace('"', '').replace('"','').replace(/\,/g,'');
				
				if(innerTags){this.otherTab.tappers.push(child);}
			}
			
		}// for index in mainList
	},		
	
	initialize: function(product_label,count,image_path) {		
		this.allTab = null;
		this.loveTab = null;
		this.wantTab = null;
		this.haveTab = null;
		this.otherTab = null;
	
	
		this.product_label=product_label;
		this.initial_count=count;
		this.image_path=image_path;
				
		//get input controls
		this.moretappers=document.getElementById('show_more');
		if(this.moretappers){this.show_text = this.moretappers.innerHTML;}
	
		//bind page load event
		addEvent(window, "load", this.load.bind(this));				
	}
};

//addNamespace("ProductWiki.Web.Controls");
if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.Quadrus = Class.create();
ProductWiki.Web.Controls.Quadrus.prototype = {
	getNode: function(event) {
		var e=null;
		if (event.target) e = event.target;
		else e = event.srcElement; 
		return e;
	},
	q_over: function(event) {
		var element = this.getNode(event);
		var idx = element.id.substr(element.id.length-1,1);
		if (!this.q_state.TagState[idx]) 
			this.qt[idx].className='qt'+idx+'_over';
	},
	q_out: function(event) {
		var element = this.getNode(event);
		var idx = element.id.substr(element.id.length-1,1);
		if (!this.q_state.TagState[idx])
			this.qt[idx].className='qt'+idx;
	},
	q_click: function(event) {
		if (this.signedin) {
			var element = this.getNode(event);
			var idx = element.id.substr(element.id.length-1,1);
			
			var value;
			var state=this.q_state.TagState[idx];
					
			if (idx < 3) {
				var tags = [];
				tags[0] = this.q_state.TagNames[idx];
				this.q_state.TagState[idx]=!this.q_state.TagState[idx];



				this.redraw();
				if (!state) ProductWiki.Web.UserControls.ProductQuadrus.TapIt(this.object_label,tags,this.q_state.TagNames,ajax_callback);
				else ProductWiki.Web.UserControls.ProductQuadrus.UnTapIt(this.object_label,tags,this.q_state.TagNames,ajax_callback);
			}
			else {
				if (!state) {
					if (this.q_input_box.style.display == '')
						this.q_input_box.style.display = 'none';
					else
						this.q_input_box.style.display = '';
						this.q_input_text.focus();
				}
				else {
					this.q_state.TagState[idx]=false;
					var other=this.q_state.OtherTags
					this.q_state.OtherTags=[];
					this.redraw();
					ProductWiki.Web.UserControls.ProductQuadrus.UnTapIt(this.object_label,other,this.q_state.TagNames,ajax_callback);
				}
			}
			
		}
		else {
			var element = this.getNode(event);
			var idx = element.id.substr(element.id.length-1,1);

			//this.quadrusdiv.style.display='none';
			position_signin(this.qt[0]);
			
			if (idx < 3) {
				var tags = [];
				tags[0] = this.q_state.TagNames[idx];
				
				if (!this.q_state.TagState[idx]) ProductWiki.Web.UserControls.ProductQuadrus.StoreTap(this.object_label,tags,this.q_state.TagNames);
			}
			ProductWiki.Web.BasePage.PWPage.TrackQuadrusClick();
		}
	},
	tagit: function() {
		var tag = this.q_input_text.value;
		if (tag.length > 0) {
			var tags = [];
			tags[0] = tag;
			this.q_state.OtherTags[this.q_state.OtherTags.length]=tag;
			this.q_state.TagState[3]=true;
			this.redraw();
			this.q_input_text.value = '';
			ProductWiki.Web.UserControls.ProductQuadrus.TapIt(this.object_label,tags,this.q_state.TagNames,ajax_callback);
		}



	},
	redraw: function() {
		//update selections
		this.q_tag_list.innerHTML = '';
		for (var i=0;i<4;i++) {
			if (this.q_state.TagState[i]) {
				this.qt[i].className='qt'+i+'_on';
				this.qt[i].innerHTML = this.msg_on[i];
				if (i==3) this.q_input_box.style.display = '';
			}
			else {
				this.qt[i].className='qt'+i;
				this.qt[i].innerHTML = this.msg_off[i];
				if (i==3) this.q_input_box.style.display = 'none';
			}
		}
		
		//redraw tags
		if (this.q_state.OtherTags.length>0) {
			this.q_tag_list.style.display='';
			for (var i=0;i<this.q_state.OtherTags.length;i++) {
				if (this.q_state.OtherTags[i] != '') {
					this.q_tag_list.innerHTML += '<li>'+this.q_state.OtherTags[i]+' </li>';
				}
			}
		}
		else {
			this.q_tag_list.style.display='none';
		}
	},
	keyup: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				var l = this.q_input_text.value.length;
				if (l>0) {
					if (this.q_input_text.value.charCodeAt(l-1)==10)
						this.q_input_text.value = this.q_input_text.value.substr(0,l-1);
				}
				this.tagit();
				break;
		}
	},
	keydown: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				return false;
				break;
		}
	},
	keypress: function(event) {
		//return false;
	},
	load: function() {
		for (var i=0;i<4;i++) {
			addEvent(this.qt[i], "mouseover", this.q_over.bind(this));
			addEvent(this.qt[i], "mouseout", this.q_out.bind(this));
			addEvent(this.qt[i], "click", this.q_click.bind(this));
		}
		
		addEvent(this.q_input_text, "keyup", this.keyup.bind(this));
		addEvent(this.q_input_text, "keydown", this.keydown.bind(this));
		addEvent(this.q_input_text, "keypress", this.keypress.bind(this));
		addEvent(this.q_input_arrow, "click", this.tagit.bind(this));
		
		this.redraw();
	},
	initialize: function(control_prefix,object_label,q1_s,q2_s,q3_s,q4_s,t1,t2,t3,q1_tc,q2_tc,q3_tc,q4_tc,ot,tc) {
		this.control_prefix = control_prefix;
		//tag input
		this.q_input_box = document.getElementById(control_prefix+'qt');
		this.q_input_text = document.getElementById('qti');
		this.q_input_arrow = document.getElementById('qtl');
		this.q_tag_list = document.getElementById(control_prefix+'qtt');
		
		//signin state
		this.signindiv = document.getElementById('tap_login');
		this.signedin = (this.signindiv == null);
		
		//div controls
		this.qt = [];
		this.qt[0] = document.getElementById('qt0');
		this.qt[1] = document.getElementById('qt1');
		this.qt[2] = document.getElementById('qt2');
		this.qt[3] = document.getElementById('qt3');
		
		this.msg_on = [];		
		this.msg_on[0] = 'love!';
		this.msg_on[1] = 'want!';
		this.msg_on[2] = 'have!';
		this.msg_on[3] = 'tagged!';

		this.msg_off = [];		
		this.msg_off[0] = 'love it';
		this.msg_off[1] = 'want it';
		this.msg_off[2] = 'have it';
		this.msg_off[3] = 'tag it';
				
		this.object_label = object_label;
		
		this.q_state = ProductWiki.Web.UserControls.Quadrus.NewQuadrusState().value;
		if (this.q_state == null) this.q_state = new QStateIE6();
		//Public TotalCount As Integer
		this.q_state.TotalCount = tc;
		
		
		/*
		//Public TagCount(3) As Integer
		this.q_state.TagCount = [];
		this.q_state.TagCount[0] = q1_tc;
		this.q_state.TagCount[1] = q2_tc;
		this.q_state.TagCount[2] = q3_tc;
		this.q_state.TagCount[3] = q4_tc;
		*/
        //Public TagState(3) As Boolean
		this.q_state.TagState = [];
		this.q_state.TagState[0] = q1_s;
		this.q_state.TagState[1] = q2_s;
		this.q_state.TagState[2] = q3_s;
		this.q_state.TagState[3] = q4_s;
        //Public TagNames(2) As String
		this.q_state.TagNames = [];
		this.q_state.TagNames[0] = t1;
		this.q_state.TagNames[1] = t2;
		this.q_state.TagNames[2] = t3;
		
        //Public OtherTags() As String
        this.q_state.OtherTags = ot.split(":");

		addEvent(window, "load", this.load.bind(this));
	},
	gettagname: function(idx) {
		if (idx==0) return 'love';
		else if (idx==1) return 'want';
		else if (idx==2) return 'have';
		else return '';
	}
};

function c_reg() {
	var e=document.getElementById('q1');
	position_signin(e);
}function Tab(){
	this.idx=-1;
	this.anchor='';
	this.visible=false;
	this.section=null;
	this.tab=null;
	this.heading=null;
}

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};

ProductWiki.Web.Controls.Tabs = Class.create();
ProductWiki.Web.Controls.Tabs.prototype = {
	toggle: function(idx,hash) {
		this.selected_idx=idx;
		for (var i=0;i<this.tabs.length;i++) {
			this.show_hide(this.tabs[i],hash);
		}
	},
	init_section: function(anchor) {
		var tab=this.tabs[this.get_idx(anchor)];
		if (tab!=null) {
			tab.tab=document.getElementById(tab.anchor+'_tab');
			tab.section=document.getElementById(tab.anchor+'_div');
			tab.heading=document.getElementById(tab.anchor+'_h2');
			tab.heading.style.display="none";
			this.show_hide(tab,false);
		}
	},
	get_idx: function(anchor) {
		for (var i=0;i<this.tabs.length;i++) {
			if (this.tabs[i].anchor==anchor) return i;
		}
		return -1;
	},
	show_hide: function(tab,hash) {
		tab.visible=(this.selected_idx==tab.idx);
		if (tab.visible) {
			this.show(tab);
			if (hash) {this.switchHash(tab,tab.idx==this.first)};
		}
		else {this.hide(tab);}	
	},
	switchHash: function(tab,blank) {
		var idx = location.href.indexOf('#');
		var base_url=location.href;
		if (idx!=-1) base_url=Left(base_url,idx);
		//if (blank) location.href=base_url;
		//else location.hash=tab.anchor;
		//location.hash=tab.anchor;
		
		saveHash2(tab.anchor);
		
		//track in analytics
		if (tracking) {
			var url=analytics_url;
			if (url>"") {
				if (tab.anchor>"") url+='t-'+tab.anchor+"/";
				pageTracker_advanced._trackPageview(url);
			}
		}
	},
	hide: function(tab) {
		tab.tab.className="tab_off";
		tab.section.style.display="none";
	},
	show: function(tab) {
		tab.tab.className="tab_on";
		tab.section.style.display="";	
	},
	build_tabs: function() {
		if (this.tab_string.length>0) {
			var values = this.tab_string.split(",");
			for (var i=0;i<values.length;i++) {
				tab = new Tab();
				tab.idx=i;
				tab.anchor=values[i];
				tab.visible=false;
				this.tabs[i]=tab;
				if (this.hash==tab.anchor) this.start=i;
			}
		}
		this.selected_idx=this.start;
	},
	initialize: function(tab_string,start) {
		this.tab_string=tab_string;
		this.tabs = [];
		this.first=start;
		this.start=start;
		this.selected_idx=-1;
		this.hash=getHash();
		this.build_tabs();
		//this.toggle(this.start,false);
	}
}
//helpful yes/no
function review_helpful(yes_no,info) {
	ProductWiki.Web.UserControls.IndividualReviewList.SetReviewHelpful(yes_no,info);
}

//statement
function Statement(){
	this.statement_id=0;
	this.score=0;
	this.vote=0;
	this.text='';
	this.element=null;
	this.point_element=null;
	this.score_element=null;
	this.agree_element=null;
	this.disagree_element=null;
	this.modify=new Modify();
	this.edit=new Edit();
	this.admin=new Admin();
}

function ShowCRSubmit() {
	document.getElementById('cr_submit').style.display='';
}

//vote
function Vote(){
	this.node=null;
	this.statement_id=0;
	this.statement=null;
	this.vote=0;
}

//modify
function Modify(){
	this.element=null;
	this.modify_element=null;
	this.delete_element=null;
	this.timer_element=null;
	this.time_remaining=0;
}

//edit
function Edit(){
	this.element=null;
	this.text_element=null;
	this.save_element=null;
	this.cancel_element=null;
}

//admin
function Admin() {
	this.modify_element=null;
	this.delete_element=null;
	this.convert_element=null;
}

var modify_timer=null;

/* tapping for registered members */
// addNamespace("ProductWiki.Web.Controls");
if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.CommunityReview = Class.create();
ProductWiki.Web.Controls.CommunityReview.prototype = {
	vote: function(event) {
		var v = this.getElement(event);
		if (this.anonymous) {
			position_signin(v.statement.agree_element);
			ProductWiki.Web.UserControls.CommunityReview.StoreVote(v.statement_id,v.vote,ajax_callback);
		}
		else {
			this.update_statement(v.vote,v.statement);
			this.refresh_statement(v.statement);
			ProductWiki.Web.UserControls.CommunityReview.Vote(v.statement_id,v.vote,ajax_callback);
		}
	},
	submit: function(event) {
		var sender = this.getNode(event);
		var ispro = this.get_ispro(event);
		
		if (this.anonymous) {
			if (ispro) {
				position_signin(this.pro_text);
			}
			else {
				position_signin(this.con_text);
			}
		}
		else {
			//determine pro or con
			this.type=0;
			var el;
			if (ispro) {
				el=this.pro_text;
				this.type=0;
			}
			else {
				el=this.con_text;
				this.type=1;
			}
						
			if ((el.value==this.default_pro) || (el.value==this.default_con) || (el.value=="")) {
				alert('Confused? Type in a pro or con first and then click submit. NOTE: To vote on pros or cons, simply click on the thumbs up or thumbs down icons and your vote will be counted automatically.');
			}	
			else {
				//clear the text and give focus
				this.text=el.value;
				el.value='';
				el.focus();	
							
				//create a placeholder
				this.temp_e = this.create_temp_statement();
				
				//submit via AJAX
				ProductWiki.Web.UserControls.CommunityReview.Submit(this.product_label,this.text,this.type,this.submit_callback);			
			}
		}
	},
	submit_callback: function(res) {
		var me=creview_js;
		var statement_id = res.value;
		me.remove_temp_statement();
		
		//initialize the new statement
		var statement = me.create_statement(statement_id,me.text,1,1,me.type) 
		
		//refresh it
		me.refresh_statement(statement);
		
		me.change_message(me.type,true);
	},
	plus: function(event) {
		var statement=this.getStatementObj(event);
		var e;
		e=statement.admin.delete_element;
		e.innerHTML='delete';
		addEvent(e, "click", this.remove.bind(this));
		
		e=statement.admin.convert_element;
		e.innerHTML='convert to comment';
		addEvent(e, "click", this.comment_convert.bind(this));
	},
	remove: function(event) {
		var statement=this.getStatementObj(event);
		ProductWiki.Web.UserControls.CommunityReview.Delete(statement.statement_id,ajax_callback);
		statement.element.parentNode.removeChild(statement.element);
	},
	comment_convert: function(event) {
		var statement=this.getStatementObj(event);
		ProductWiki.Web.UserControls.CommunityReview.CommentConvert(this.product_label,statement.statement_id,ajax_callback);
		statement.element.parentNode.removeChild(statement.element);
	},
	edit: function(event) {
		var statement=this.getStatementObj(event);
		statement.text=statement.edit.text_element.value;
		ProductWiki.Web.UserControls.CommunityReview.Modify(statement.statement_id,statement.text,ajax_callback);
		statement.point_element.removeChild(statement.edit.element);
		statement.point_element.innerHTML=statement.text;
		if (statement.modify.element!=null) statement.modify.element.style.display='';
	},
	cancel_edit: function(event) {
		var statement=this.getStatementObj(event);
		statement.point_element.removeChild(statement.edit.element);
		statement.point_element.innerHTML=statement.text;
		if (statement.modify.element!=null) statement.modify.element.style.display='';
	},
	modify: function(event) {
		var statement=this.getStatementObj(event);
		statement.point_element.innerHTML='';
		this.create_edit_element(statement);
		if (statement.modify.element!=null) statement.modify.element.style.display='none';
	},
	create_temp_statement: function() {
		var e=null;
		//add it to the appropriate container
		var element=document.createElement("div");
		element.id='cri_9999999';
		element.className="item review new";
		this.statement_divs[this.type].appendChild(element);

		e=document.createElement("div");
		e.innerHTML='<img src="/images/wait.gif" style="padding-right: 20px;"/>';
		element.appendChild(e);
		return element;
	},
	remove_temp_statement: function() {
		this.statement_divs[this.type].removeChild(this.temp_e);
	},
	create_statement: function(statement_id,text,vote,score,type) {
		var statement = new Statement();
		var e=null;
		statement.statement_id=statement_id;
		statement.score=score;
		statement.vote=vote;
		statement.text=text;
		
		//<div id="cri_x"><div class="point"/><div class="vote"/></div>
		statement.element=document.createElement("div");
		statement.element.id='cri_'+statement_id;
		
		//add it to the appropriate container
		this.statement_divs[type].appendChild(statement.element);

		e=document.createElement("div");
		e.innerHTML='&bull;';
		e.className='b';
		statement.element.appendChild(e);
		
	
		//<div class="point"></div>
		e=document.createElement("div");
		e.className='point';
		e.id='crp_'+statement_id;
		e.innerHTML=statement.text;
		statement.point_element=e;
		
		//<div class="vote"></div>
		var vote_div=document.createElement("div");
		vote_div.className='vote';
		
		statement.element.appendChild(statement.point_element);
		statement.element.appendChild(vote_div);
		e=document.createElement("br");
		e.style.clear="both";
		statement.element.appendChild(e);
		
		
		//<div class="vote"><span/><img/><img/></div>		
		e=document.createElement("span");
		e.id='crs_'+statement_id;
		statement.score_element=e;

		e=document.createElement("img");
		e.id='cra_'+statement_id;
		addEvent(e, "click", this.vote.bind(this));
		statement.agree_element=e;

		e=document.createElement("img");
		e.id='crd_'+statement_id;
		addEvent(e, "click", this.vote.bind(this));
		statement.disagree_element=e;
		
		vote_div.appendChild(statement.score_element);
		vote_div.appendChild(statement.agree_element);
		vote_div.appendChild(statement.disagree_element);
		
		//add to array
		this.statements[this.statements.length]=statement;
		
		//add a modify div
		this.create_modify_element(this.edit_time,statement);
		
		//return pointer
		return statement;
	},
	create_modify_element: function(t,statement) {
		statement.modify.time_remaining=t;
		var e=null;
		
		//<a id=crmm_>modify</a>
		e=document.createElement("a");
		e.id='crmm_'+statement.statement_id;
		e.innerHTML='modify';
		e.href='javascript:var x=0;';
		addEvent(e, "click", this.modify.bind(this));
		statement.modify.modify_element=e;
				
		//<a id=crmd_>delete</a>
		e=document.createElement("a");
		e.id='crmd_'+statement.statement_id;
		e.innerHTML='delete';
		e.href='javascript:var x=0;';
		addEvent(e, "click", this.remove.bind(this));
		statement.modify.delete_element=e;
		
		//<span id=crmt_>X</span>
		e=document.createElement("b");
		e.id='crmt_'+statement.statement_id;
		e.innerHTML=t;
		statement.modify.timer_element=e;
		
		//<div id=crm_/>	
		e=document.createElement("div");
		e.className="modify";
		e.id='crm_'+statement.statement_id;
		statement.modify.element=e;
		
		//append
		e.appendChild(statement.modify.modify_element);
		e.appendChild(document.createTextNode(" | "));
		e.appendChild(statement.modify.delete_element);
		e.appendChild(document.createTextNode(" available for "));
		e.appendChild(statement.modify.timer_element);
		e.appendChild(document.createTextNode(" sec."));
		statement.element.appendChild(e);
		
		//timer
		var ref=this;
		if (modify_timer==null) modify_timer=setInterval(function(){ref.update_timer();}, 1000);
	},
	create_edit_element: function(statement) {
		var e=null;
		
		//text
		e=document.createElement("textarea");
		e.id='cret_'+statement.statement_id;
		e.className="edit_text";
		e.value=statement.text;
		addEvent(e, "keyup", this.m_keyup.bind(this));
		addEvent(e, "keydown", this.keydown.bind(this));
		statement.edit.text_element=e;
		
		//save
		e=document.createElement("input");
		e.id='cres_'+statement.statement_id;
		e.type="button";
		e.value="save"
		addEvent(e, "click", this.edit.bind(this));
		statement.edit.save_element=e;
		
		//cancel
		e=document.createElement("input");
		e.id='crec_'+statement.statement_id;
		e.type="button";
		e.value="cancel"
		addEvent(e, "click", this.cancel_edit.bind(this));
		statement.edit.cancel_element=e;
				
		//<div id=cre_/>	
		e=document.createElement("div");
		e.className="edit";
		e.id='cre_'+statement.statement_id;
		statement.edit.element=e;
		
		//append
		e.appendChild(statement.edit.text_element);
		e.appendChild(document.createElement("br"));
		e.appendChild(statement.edit.save_element);
		e.appendChild(statement.edit.cancel_element);
		
		statement.point_element.appendChild(e);
	},
	update_statement: function(vote,statement) {
		//update the datastructure
		var inc=0;
		if (statement.vote==0) {
			inc = vote;
			statement.vote=vote;
		}
		else if (statement.vote==vote) {
			inc = -vote;
			statement.vote=0;
		}
		else {
			inc = 2*vote;
			statement.vote=vote;
		}
		statement.score+=inc;
	},
	refresh_statement: function(statement) {	
		//update the display
		var e=null;
		var plus='';
		if (statement.score>0) plus = '+';
		statement.score_element.innerHTML = plus+statement.score;

		//row
		e=statement.element;
		if (statement.modify.time_remaining>0) e.className=this.item_class+this.new_class;
		else if (statement.vote>0) e.className=this.item_class+this.up_class;
		else if (statement.vote<0) e.className=this.item_class+this.down_class;
		else if (statement.score>=0) e.className=this.item_class+this.up_class;
		else e.className=this.item_class+this.down_class;

		//score
		e=statement.score_element;
		if (statement.score>=0) e.className=this.up_class;
		else e.className=this.down_class;

		//thumbs
		statement.agree_element.src=this.agree_off;
		statement.disagree_element.src=this.disagree_off;
		if (statement.vote>0) statement.agree_element.src=this.agree_on;
		else if (statement.vote<0) statement.disagree_element.src=this.disagree_on;
	},
	change_message: function(type,exists) {
		if (this.msg_divs[type] != null) {
			if (exists)
				this.msg_divs[type].style.display='none';
			else
				this.msg_divs[type].style.display='';		
		}
	},
	update_timer: function() {
		var e=null;
		var found=false;
		for (var i=0;i<this.statements.length;i++) {
			e=this.statements[i].modify;
			if (e.element!=null) {
				e.time_remaining+=-1;
				if (e.time_remaining<=0) {
					e.element.parentNode.removeChild(e.element);
					e.element=null;
					if (this.statements[i].edit.element!=null)	{
						this.statements[i].point_element.removeChild(this.statements[i].edit.element);
						this.statements[i].point_element.innerHTML=this.statements[i].text;
					}
				}
				else {
					found=true;
					e.timer_element.innerHTML=e.time_remaining;
				}
			}
		}
		if (!found) {
			clearInterval(modify_timer);
			modify_timer=null;
		}
	},
	text_focus: function(event) {
		var node=this.getNode(event);
		var ispro=this.get_ispro(event);
		if (ispro && this.firstpro_focus) {
			node.value='';
			this.firstpro_focus=false;
		}
		else if ((ispro==false) && this.firstcon_focus) {
			node.value='';
			this.firstcon_focus=false;
		}
		if (this.anonymous) position_signin(node);
	},
	m_keyup: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				var node=this.getNode(event);
				var l = node.value.length;
				//need to remove the <<enter>> character
				if (l>0) {
					if (node.value.charCodeAt(l-1)==10)
						node.value = node.value.substr(0,l-1);
				}
				this.edit(event);
				break;
		}
	},
	keyup: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				var ispro=this.get_ispro(event)
				var el;
				if (ispro) {el=this.pro_text;}
				else {el=this.con_text;}
				var l = el.value.length;
				//need to remove the <<enter>> character
				if (l>0) {
					if (el.value.charCodeAt(l-1)==10)
						el.value = el.value.substr(0,l-1);
				}
				this.submit(event);
				break;
		}
	},
	keydown: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				return false;
				break;
		}
	},
	load: function() {
		if (this.pro_text != null) {
			addEvent(this.pro_text, "focus", this.text_focus.bind(this));
			addEvent(this.pro_text, "keyup", this.keyup.bind(this));
			addEvent(this.pro_text, "keydown", this.keydown.bind(this));
			addEvent(this.pro_button, "click", this.submit.bind(this));
		}
		if (this.con_text != null) {
			addEvent(this.con_text, "focus", this.text_focus.bind(this));
			addEvent(this.con_text, "keyup", this.keyup.bind(this));
			addEvent(this.con_text, "keydown", this.keydown.bind(this));
			addEvent(this.con_button, "click", this.submit.bind(this));
		}

		//bind votes
		for (var i=0;i<this.statements.length;i++) {
			addEvent(this.statements[i].agree_element, "click", this.vote.bind(this));
			addEvent(this.statements[i].disagree_element, "click", this.vote.bind(this));
		}
	},
	get_ispro: function(event) {
		var node=this.getNode(event);
		var idx=node.id.toLowerCase().indexOf('pro');
		if (idx>=0) {return true;}
		else {return false;}
	},
	build_statements: function() {
		//split the string
		if (this.reviewstate_string.length>0) {
			var rows = this.reviewstate_string.split(",");
			var statement;
			var values;
			var e=null;
			for (var i=0;i<rows.length;i++) {
				values=rows[i].split(":");
				statement = new Statement();
				statement.statement_id=parseInt(values[0]);
				statement.score=parseInt(values[1]);
				statement.vote=parseInt(values[2]);
				statement.element=document.getElementById('cri_'+statement.statement_id);
				statement.point_element=document.getElementById('crp_'+statement.statement_id);
				statement.score_element=document.getElementById('crs_'+statement.statement_id);
				statement.agree_element=document.getElementById('cra_'+statement.statement_id);
				statement.disagree_element=document.getElementById('crd_'+statement.statement_id);
				statement.text=statement.point_element.innerHTML;
				
				//admin
				e=document.getElementById('cram_'+statement.statement_id);
				if (e!=null) {
					addEvent(e, "click", this.modify.bind(this));
					statement.admin.modify_element=e;
					e=document.getElementById('crad_'+statement.statement_id);
					addEvent(e, "click", this.plus.bind(this));
					statement.admin.delete_element=e;
					e=document.getElementById('crac_'+statement.statement_id);
					addEvent(e, "click", this.plus.bind(this));
					statement.admin.convert_element=e;
				}
				
				var t=parseInt(values[3]);
				if (t<0) t=0;
				if (t>0) this.create_modify_element(t,statement);
				
				//add to array
				this.statements[i]=statement;
			}
		}
	},
	initialize: function(product_label,reviewstate_string,anonymous) {
		this.product_label = product_label;
		this.anonymous=anonymous;
		this.reviewstate_string=reviewstate_string;
		this.edit_time=100;
		this.all_div=document.getElementById('cr_all');
		
		var type=0;
		var temp_e=null;
		var text='';
		
		//build statements
		this.statements = [];
		this.build_statements(reviewstate_string);
						
	
		//statement containers
		this.statement_divs = [];
		this.statement_divs[0]=document.getElementById('crsd_0');
		this.statement_divs[1]=document.getElementById('crsd_1');
		
		this.msg_divs = [];
		this.msg_divs[0]=document.getElementById('crm_0');
		this.msg_divs[1]=document.getElementById('crm_1');
						
		//style constants
		this.item_class="item review ";
		this.up_class="up";
		this.down_class="down";
		this.new_class="new";
		this.agree_on="/images/thumb-up-on.gif";
		this.agree_off="/images/thumb-up-off.gif";
		this.disagree_on="/images/thumb-down-on.gif";
		this.disagree_off="/images/thumb-down-off.gif";
		
						
		//get input controls
		this.pro_text=document.getElementById('protext');
		this.con_text=document.getElementById('context');
		this.pro_button=document.getElementById('ProButton');
		this.con_button=document.getElementById('ConButton');
		
		this.default_pro=this.pro_text.value;
		this.default_con=this.con_text.value;
		
		
		//this.point_text=document.getElementById('PointText');
		//this.point_button=document.getElementById('PointButton');
		//this.pro_radio=document.getElementById('ProRadio');
		//this.con_radio=document.getElementById('ConRadio');
			
		this.firstpro_focus=true;
		this.firstcon_focus=true;
		
		this.running=false;
		
		//bind page load event
		addEvent(window, "load", this.load.bind(this));		
		//$(document).ready(){function(){creview_js.load();});

		
	},
	
	getNode: function(event) {
		var e=null;
		if (event.target) e = event.target;
		else e = event.srcElement; 
		return e;
	},
	getStatementObj: function(event) {
		var node=this.getNode(event);
		var parts=node.id.split("_");
		return this.getStatement(parts[1]);
	},
	getElement: function(event) {
		var node=this.getNode(event);
		var parts=node.id.split("_");
		var id=parts[1];
		var statement=this.getStatement(id);
		
		//extract position and idx from element id
		var e = new Vote();
		e.node=node;
		if (parts[0]=='cra') e.vote=1;
		else e.vote=-1;
		e.statement_id = id;
		
		//get a pointer to the statement
		e.statement=statement;
				
		return e;
	},
	getStatement: function(id) {
		for (var i=0;i<this.statements.length;i++)
			if (this.statements[i].statement_id==id) return this.statements[i];
		return null;		
	}
};




/*Helpful/Unhelpful functionality*/
if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.IndividualReview = Class.create();
ProductWiki.Web.Controls.IndividualReview.prototype = {
	voteyes: function(event) {		
	
		if(this.selection == 'HELPFUL')
		{
			this.yesLink.className = this.offclass;
			this.noLink.className = this.offclass;
			
			ProductWiki.Web.UserControls.IndividualReviewList.ClearReviewHelpful(true,this.reviewid,ajax_callback); 
			this.selection = '';
		}
		else if(this.selection == 'NOT_HELPFUL')
		{
			this.yesLink.className = this.onclass;
			this.noLink.className = this.offclass;
			
			ProductWiki.Web.UserControls.IndividualReviewList.SetReviewHelpful(true,this.reviewid,ajax_callback); 
			this.selection = 'HELPFUL';
		} 
		else
		{
			this.yesLink.className = this.onclass;
			this.noLink.className = this.offclass;
			
			ProductWiki.Web.UserControls.IndividualReviewList.SetReviewHelpful(true,this.reviewid,ajax_callback); 
			this.selection = 'HELPFUL';
		}		
				
	},
	
	voteno: function(event)	{
		
		if(this.selection == 'HELPFUL')
		{
			this.yesLink.className = this.offclass;
			this.noLink.className = this.onclass;
			
			ProductWiki.Web.UserControls.IndividualReviewList.SetReviewHelpful(false,this.reviewid,ajax_callback); 
			this.selection = 'NOT_HELPFUL';
		}
		else if(this.selection == 'NOT_HELPFUL')
		{
			this.yesLink.className = this.offclass;
			this.noLink.className = this.offclass;
			
			ProductWiki.Web.UserControls.IndividualReviewList.ClearReviewHelpful(false,this.reviewid,ajax_callback); 
			this.selection = '';
		} 
		else
		{
			this.yesLink.className = this.offclass;
			this.noLink.className = this.onclass;
			
			ProductWiki.Web.UserControls.IndividualReviewList.SetReviewHelpful(false,this.reviewid,ajax_callback); 
			this.selection = 'NOT_HELPFUL';
		}		
	},	
	
	initialize: function(div_Chooser) {
		try
		{
			this.divChoice = div_Chooser;
			var idArray = this.divChoice.id.split('-');
			this.selection = idArray[0];
			this.reviewid = idArray[1];
			this.yesLink = null;
			this.noLink = null;
			this.onclass='ind-help-button-selected';
			this.offclass='ind-help-button';
							
			/* Get the yes and no link */
			var innerLinks = getElementsByClass('ind-help-button', this.divChoice, 'div');
			this.yesLink = innerLinks[0];
			this.noLink = innerLinks[1];
			
			if(this.selection === 'HELPFUL')
			{
				this.yesLink.className = this.onclass;
				this.noLink.className = this.offclass;
			}
			else if(this.selection === 'NOT_HELPFUL')
			{
				this.yesLink.className = this.offclass;
				this.noLink.className = this.onclass;
			} 
			
			addEvent(this.yesLink, 'click', this.voteyes.bind(this));
			addEvent(this.noLink, 'click', this.voteno.bind(this)); 
		}
		catch(e)
		{
		}
		
	}
};


// Initialize helpfulness
function initializeHelpful(){
	var divs = getElementsByClass('ind-help', null, 'div');	
	var helpfulVotes = new Array();
	for(index in divs)
	{
		var review = new ProductWiki.Web.Controls.IndividualReview(divs[index])
		helpfulVotes.push(review);
	}	
}


/*prometer stuff*/

/* init pop-in */
$(document).ready(function(){
	$('.showscoreexplanation').each(function(){
		$(this).bind("click", function(){
			$('#ProScoreExplanation').slideToggle("fast");
		});
	});
});//DiscoveryProduct
function showmorediscovery(more_link,typename) {
	var el=document.getElementById('more_'+typename);
	if (el.style.display=='none') {
		el.style.display='';
		more_link.innerHTML='show less';
	}
	else {
		el.style.display='none';
		more_link.innerHTML='show more';
	}
}

//RelatedProduct
function RelatedProduct() {
	this.directions=[];
	this.directions[0]=new Direction(); //0,self,better
	this.directions[1]=new Direction(); //1,page,worse
	
	this.history_element=null;
	this.log_element=null;
}

function Direction() {
	this.id=0;
	this.score=0;
	this.vote=0;
	
	this.star_element=null;
	this.title_element=null;
	this.delete_element=null;
}

//vote
function RelatedVote(){
	this.node=null;
	
	this.winner=0; //direction idx 0 or 1
	this.loser=0; 
	
	this.product=null;
	this.vote=1;
	this.votestate=0; //0 - new, 1 - switch, 2 - unvote
}

function getNode(event) {
	var e=null;
	if (event.target) e = event.target;
	else e = event.srcElement; 
	return e;
}

function hide(id) {document.getElementById(id).style.display='none';}
function show(id) {document.getElementById(id).style.display='';}

var Pet = Class.create();
Pet.prototype = {
	//our 'constructor'
	initialize: function(petName, age){
		this.name = petName;
		this.age = age;
	},
	
	communicate: function(){
		alert('I do not know what I should say, but my name is ' + this.name);
	}
};

if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.ProductRelation = Class.create();
ProductWiki.Web.Controls.ProductRelation.prototype = {
	del1: function(event) {
		var node=this.getNode(event);
		var e=null;
		var p=null;
				
		var idx=node.id.split("_")[1];
		var id=this.products[idx].directions[1].id;
				
		node.innerHTML="delete";
		addEvent(node, "click", this.del2.bind(this));
		
		if (this.type==2) {
			p=node.parentNode;
			e=document.createElement("span");
			e.id = 'i_'+ id
			e.innerHTML='inherit?';
			e.className='delete';
			p.appendChild(e);
		}
		addEvent(e, "click", this.inherit.bind(this));
	},
	del2: function(event) {
		var node=this.getNode(event);
		var idx=node.id.split("_")[1];
		var id=this.products[idx].directions[0].id;
		ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.DeleteRelation(id,this.type,ajax_callback);
		node.innerHTML="REMOVED.";
		node.className+=" X";
		
	},
	inherit: function(event) {
		var node=this.getNode(event);
		var id=node.id.split("_")[1];
		ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.SetRelationAsInherited(id,ajax_callback);
		node.innerHTML="subclass";
		node.className+=" X";
	},
	vote: function(event) {
		var v = this.getElement(event);
		var cur=false;
		if (v.winner==1) cur=true;
		if (this.anonymous) {
			position_signin(v.product.directions[0].star_element);
			ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.StoreVote(v.product.directions[v.winner].id,v.votestate,v.product.directions[v.loser].id,cur,ajax_callback);
		}
		else {
			this.update_product(v);
			this.refresh_product(v);
			var x=null;
			ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.Vote(v.product.directions[v.winner].id,v.votestate,v.product.directions[v.loser].id,cur,ajax_callback);
		}
	},
	history: function(event) {
		var node=this.getNode(event);
		var idx=node.id.split("_")[1];
		var id=this.products[idx].directions[0].id;
		var e = this.products[idx].log_element;
		if (e.style.display=='') e.style.display='none';
		else {		
			var html = ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.GetVoters(id).value
			e.innerHTML = html;
			if (html=='') e.style.display='none';
			else e.style.display='';
		}
		if (e.style.display=='') node.className="open"
		else node.className="closed"
	},
	create_temp_product: function() {
		var e=null;
		//add it to the appropriate container
		var element=document.createElement("div");
		element.id='tempproduct999999';
		this.main_list.appendChild(element);

		e=document.createElement("div");
		e.innerHTML='<img src="/images/wait.gif" style="padding-right: 20px;"/>';
		element.appendChild(e);
		return element;
	},
	remove_temp_product: function() {
		this.main_list.removeChild(this.e_temp);
	},
	submit: function(event) {
		var sender = this.getNode(event);
		
		//timer
		if (this.delay==null) {}
		
		
		if (this.anonymous) position_signin(this.product_text);
		else {
			this.text=this.product_text.value;
			var whatType = this.type;
			if(this.inheritedcheck != null)
				if(this.inheritedcheck.checked)
					whatType=10; // this is the inheritence type
			
			
			//submit via AJAX
			this.e_temp = this.create_temp_product();
			ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.AddRelation(this.product_label,this.text,whatType,this.submit_callback);
		}
	},
	submit_callback: function(res) {
		var me=rel[res.request.args.type];
		var rvals = res.value;
		me.remove_temp_product();
		var success=(rvals[0]!="0");
		var isnew=(rvals[1]!="0");
		var ids=[];
		ids[0]=rvals[2];
		ids[1]=rvals[3];
		var titles=[];
		titles[0]=me.text;
		titles[1]=me.product_title;
		var url=rvals[4];
		var img=rvals[5];

		
		
		//initialize the new product
		if (success) {
			me.create_product(ids,titles,url,isnew,img);
			if (me.vote_section!=null) me.vote_section.style.display='';
		}
		else alert("Error: This product already exists in the list.")
		
		//clear the text and give focus
		me.product_text.value='';
		me.product_text.focus();
		me.get_suggestions();
	},
	select: function(event) {
		var sender = this.getNode(event);
		if(document.all)
			this.product_text.value=sender.innerText;
		else
			this.product_text.value=sender.textContent;
		this.product_suggest.style.display='none';
		this.product_suggest.innerHTML='';
		this.product_text.focus();
	},
	over: function(event) {this.getNode(event).className="over";},
	out: function(event) {this.getNode(event).className="";},
	get_suggestions_callback: function(res) {
		var me=rel[res.request.args.type];
		var titles = res.value;
		me.product_suggest.innerHTML='';
		if (titles.length>0) {
			me.product_suggest.style.display='';
			for (var i=0;i<titles.length;i++) {
				e=document.createElement("div");
				e.innerHTML=titles[i];
				addEvent(e, "click", me.select.bind(me));
				addEvent(e, "mouseover", me.over.bind(me));
				addEvent(e, "mouseout", me.out.bind(me));
				me.product_suggest.appendChild(e);
			}
		}
		else {
			me.product_suggest.style.display='none';
		}
	},
	get_suggestions: function() {
		ProductWiki.Web.UserControls.ProductRelation.AlternativeProducts.GetSuggestions(this.product_text.value,this.product_label,this.type,this.get_suggestions_callback);
	},
	get_suggestions_delayed: function() {
		if (this.delay_timer!=null)
			clearTimeout(this.delay_timer);
		var ref=this;
		this.delay_timer=setTimeout(function(){ref.stop_timer();}, this.delay_time);
	},
	keyup: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				var l = this.product_text.value.length;
				//need to remove the <<enter>> character
				if (l>0) {
					if (this.product_text.value.charCodeAt(l-1)==10)
						this.product_text.value = this.product_text.value.substr(0,l-1);
				}
				this.submit(event);
				break;
			case 27: //esc
				this.product_suggest.style.display='none';
				break;
			default:
				this.get_suggestions_delayed();
		}
	},
	keydown: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				return false;
				break;
		}
	},
	text_focus: function(event) {
		var node=this.getNode(event);
		if (this.first_focus) node.value='';
		if (this.anonymous) position_signin(node);
		else if (this.first_focus) this.get_suggestions();
		this.first_focus=false;
	},
	update_product: function(v) {
		switch(v.votestate) {
			case 0: //new
				v.product.directions[v.winner].vote=1;
				v.product.directions[v.loser].vote=0;
				v.product.directions[v.winner].score++;
				break;
			case 1: //switch
				v.product.directions[v.winner].vote=1;
				v.product.directions[v.loser].vote=0;
				v.product.directions[v.winner].score++;
				v.product.directions[v.loser].score--;
				break;
			case 2: //unvote
				v.product.directions[v.winner].vote=0;
				v.product.directions[v.loser].vote=0;
				v.product.directions[v.winner].score--;
				break;
		}
	},
	refresh_product: function(v) {
		var product=v.product;
		var dir=null;var c="";
		if ((product.directions[0].vote==1) || (product.directions[1].vote==1))
			c=this.vote_off_class;
		for (var j=0;j<2;j++) {
			dir=product.directions[j];
			switch(dir.vote) {
				case 0:
					dir.star_element.src=this.vote_off_src;
					dir.title_element.className=c;
					break;
				case 1:
					dir.star_element.src=this.vote_on_src;
					dir.title_element.className=this.vote_on_class;
					break;
			}		
		}
		if (product.history_element != null) {
			var count=parseInt(product.history_element.innerHTML.split(" ")[0]);
			switch(v.votestate) {
				case 0:
					count+=1;
					break;
				case 2:
					count-=1;
					break;
			}
			var str="s";if (count==1) str="";
			product.history_element.innerHTML=count+" vote"+str;
		}
	},
	create_product: function(ids,titles,url,isnew,img) {
		var e=null;

		if (this.none_msg!=null) this.none_msg.style.display='none';
		//create datastructure
		var product = new RelatedProduct();
		for (var j=0;j<2;j++) {
			id=ids[j];
			dir=product.directions[j];
			dir.id=id;
			dir.score=0;
			dir.vote=0;
			
			//star - <img src="/images/check-off.gif" id="pr1v_215"/>
			e=document.createElement("img");
			e.id='pr'+this.type+'v_'+id;
			e.src=this.vote_off_src;
			addEvent(e, "click", this.vote.bind(this));
			dir.star_element=e;
			
			//title - <span class="novote" id="pr1s_215">BioShock</span>
			e=document.createElement("span");
			e.id='pr'+this.type+'s_'+id;
			e.className="";
			e.innerHTML=titles[j];
			dir.title_element=e;
		}	
		
		//create voting element
		var ve;
		ve=document.createElement("div");
		ve.className="vote-action";
		if (this.type==1) {
			e=document.createElement("div");
			e.appendChild(product.directions[1].star_element);
			e.appendChild(product.directions[1].title_element);
			ve.appendChild(e);
			var s=document.createElement("div");
			s.innerHTML="<strong>vs.</strong>";
			ve.appendChild(s);
			e=document.createElement("div");
			e.appendChild(product.directions[0].star_element);
			e.appendChild(product.directions[0].title_element);
			ve.appendChild(e);
		}
		if (isnew) {
			s=document.createElement("a");
			s.href=url+'edit/';
			s.innerHTML="edit stub"
			ve.appendChild(s);
		}
		
		var outer=document.createElement("div");
		var vo=document.createElement("div");
		var pli=this.create_list_item(titles[0],url,img);
		
		vo.className="voting";
		outer.className="feature-item-outer item";
			
		vo.appendChild(ve);		
		outer.appendChild(pli);
		outer.appendChild(vo);
		this.main_list.appendChild(outer);
		
		//add to array
		this.products[this.products.length]=product;
	},
	create_list_item: function(title,url,img) {
		e=document.createElement("div");
		e.className="feature-item item";
		
		e2=document.createElement("div");
		e2.className="img";
		a=document.createElement("a");
		i=document.createElement("img");
		a.href=url;
		i.src=img;
		a.appendChild(i);
		e2.appendChild(a);
		
		e3=document.createElement("div");
		e3.className="info";
		h=document.createElement("h2");
		a2=document.createElement("a");
		a2.innerHTML=title;
		a2.href=url;
		h.appendChild(a2);
		e3.appendChild(h);
		
		e.appendChild(e2);
		e.appendChild(e3);
		
		return e;
	},
	build_products: function() {
		//split the string
		if (this.relatedstate_string.length>0) {
			var rows = this.relatedstate_string.split(",");
			var product;var values;var e=null;var id=0;var dir=null;
			for (var i=0;i<rows.length;i++) {
				values=rows[i].split(":");
				product = new RelatedProduct();
				for (var j=0;j<2;j++) {
					id=parseInt(values[3*j]);
					dir=product.directions[j];
					dir.id=id;
					dir.score=parseInt(values[1+3*j]);
					dir.vote=parseInt(values[2+3*j]);
					dir.star_element=document.getElementById('pr'+this.type+'v_'+id);
					dir.title_element=document.getElementById('pr'+this.type+'s_'+id);				
				}	
				product.history_element=document.getElementById('pr'+this.type+'vi_'+i);
				product.log_element=document.getElementById('pr'+this.type+'vo_'+i);
				product.delete_element=document.getElementById('pr'+this.type+'d_'+i);
				product.inherit_element=document.getElementById('pr'+this.type+'i_'+i);
				//add to array
				this.products[i]=product;
			}
		}
	},
	load: function() {
		if (this.product_text != null) {
			addEvent(this.product_text, "focus", this.text_focus.bind(this));
			addEvent(this.product_text, "keyup", this.keyup.bind(this));
			addEvent(this.product_text, "keydown", this.keydown.bind(this));
			addEvent(this.product_button, "click", this.submit.bind(this));
		}
	
		//bind votes
		for (var i=0;i<this.products.length;i++) {
			for (var j=0;j<2;j++) {
				if (this.products[i].directions[j].star_element!=null)
					addEvent(this.products[i].directions[j].star_element, "click", this.vote.bind(this));
			}
			if (this.products[i].history_element!=null)
				addEvent(this.products[i].history_element, "click", this.history.bind(this));
			if (this.products[i].delete_element!=null)
				addEvent(this.products[i].delete_element, "click", this.del1.bind(this));
			if (this.products[i].inherit_element!=null)
				addEvent(this.products[i].inherit_element, "click", this.inherit.bind(this));
			
		}
	},
	initialize: function(product_label,product_title,type,relatedstate_string,anonymous) {
		//constants
		this.vote_on_src='/images/thumb-up-on.gif';
		this.vote_off_src='/images/thumb-up-off.gif';
		this.vote_on_class='voted';
		this.vote_off_class='novote';
			
		//init variables
		this.product_label = product_label;
		this.product_title = product_title;
		this.type=type;
		this.anonymous=anonymous;
		this.relatedstate_string=relatedstate_string;
		this.e_temp =null;
		this.text='';
		
		//build statements
		this.products = [];
		this.build_products();
		
		//keypress
		this.delay_timer=null;
		this.delay_time=300;
	
		//get input controls
		this.vote_section=document.getElementById('vote-link-section-'+this.type);
		this.product_text=document.getElementById('pr'+this.type+'_text');
		this.product_suggest=document.getElementById('pr'+this.type+'_suggest');
		this.product_button=document.getElementById('pr'+this.type+'_button');
		this.vote_list=document.getElementById('vote-list-'+this.type);
		this.main_list=document.getElementById('list-'+this.type);
		this.none_msg=document.getElementById('rel-none-'+this.type);
		this.first_focus=true;
		this.inheritedcheck=document.getElementById('pr2_check');	
	
		if ((this.vote_section!=null) && (this.products.length==0))
			this.vote_section.style.display='none';
			
		
		//bind page load event
		addEvent(window, "load", this.load.bind(this));				
	},
	
	getNode: function(event) {
		var e=null;
		if (event.target) e = event.target;
		else e = event.srcElement; 
		return e;
	},
	getElement: function(event) {
		var node=this.getNode(event);
		var parts=node.id.split("_");
		var id=parts[1];
		var direction_id = parts[1];
		var e = new RelatedVote();
		e.node=node;
		e.vote=1;
		e.product=this.getProduct(direction_id);
				
		//existing direction
		var vote_direction=0;
		if (e.product.directions[0].vote!=0)
			vote_direction=e.product.directions[0].id;
		else if (e.product.directions[1].vote!=0)
			vote_direction=e.product.directions[1].id;
			
		//type of vote
		if (direction_id==vote_direction)
			e.votestate=2; //unvotes
		else if (vote_direction>0)
			e.votestate=1; //switch
		else
			e.votestate=0; //new
			
		//opposite
		if (direction_id==e.product.directions[0].id) {
			e.winner=0;
			e.loser=1;
		}
		else {
			e.winner=1;
			e.loser=0;
		}
		return e;
	},
	getProduct: function(id) {
		for (var i=0;i<this.products.length;i++) {
			for (var j=0;j<2;j++) {
				if (this.products[i].directions[j].id==id) return this.products[i];
			}
		}
		return null;		
	},
	stop_timer: function() {
		this.delay_timer=null;
		this.get_suggestions();
	}
};