/* carosel functionality */
(function ($) { // Compliant with jquery.noConflict()
	$.fn.jCarouselLite = function (o) {
		o = $.extend({
			btnPrev: null,
			btnNext: null,
			btnGo: null,
			mouseWheel: false,
			auto: null,
			speed: 200,
			easing: null,
			vertical: false,
			circular: true,
			visible: 3,
			start: 0,
			scroll: 1,
			beforeStart: null,
			afterEnd: null
		},
		o || {});
		return this.each(function () { // Returns the element collection. Chainable.
			var running = false,
			animCss = o.vertical ? "top" : "left",
			sizeCss = o.vertical ? "height" : "width";
			var div = $(this),
			ul = $("ul", div),
			tLi = $("li", ul),
			tl = tLi.size(),
			v = o.visible;
			if (o.circular) {
				ul.prepend(tLi.slice(tl - v - 1 + 1).clone()).append(tLi.slice(0, v).clone());
				o.start += v;
			}
			var li = $("li", ul),
			itemLength = li.size(),
			curr = o.start;
			div.css("visibility", "visible");
			li.css({
				overflow: "hidden",
				float: o.vertical ? "none" : "left"
			});
			ul.css({
				margin: "0",
				padding: "0",
				position: "relative",
				"list-style-type": "none",
				"z-index": "1"
			});
			div.css({
				overflow: "hidden",
				position: "relative",
				"z-index": "0",
				left: "0px"
			}); //julius-had to change z-index to 0 from 2 for drop downs
			var liSize = o.vertical ? height(li) : width(li); // Full li size(incl margin)-Used for animation
			var ulSize = liSize * itemLength; // size of full ul(total length, not just for the visible items)
			var divSize = liSize * v; // size of entire div(total length for just the visible items)
			li.css({
				width: li.width(),
				height: li.height()
			});
			ul.css(sizeCss, ulSize + "px").css(animCss, -(curr * liSize));
			div.css(sizeCss, divSize + "px"); // Width of the DIV. length of visible images
			if (o.btnPrev) $(o.btnPrev).click(function () {
				o.auto = 0;
				return go(curr - o.scroll);
			});
			if (o.btnNext) $(o.btnNext).click(function () {
				o.auto = 0;
				return go(curr + o.scroll);
			});
			if (o.btnStop) $(o.btnStop).click(function () {
				o.auto = 0;
				return;
			});
			if (o.btnGo) $.each(o.btnGo, function (i, val) {
				$(val).click(function () {
					return go(o.circular ? o.visible + i : i);
				});
			});
			if (o.auto) setInterval(function () {
				if (o.auto != 0) {
					go(curr + o.scroll);
				}
			},
			o.auto + o.speed);
			function vis() {
				return li.slice(curr).slice(0, v);
			};
			function go(to) {
				if (!running) {
					if (o.beforeStart) o.beforeStart.call(this, vis());
					if (o.circular) { // If circular we are in first or last, then goto the other end
						if (to <= o.start - v - 1) { // If first, then goto last
							ul.css(animCss, -((itemLength - (v * 2)) * liSize) + "px"); // If "scroll" > 1, then the "to" might not be equal to the condition; it can be lesser depending on the number of elements.
							curr = to == o.start - v - 1 ? itemLength - (v * 2) - 1 : itemLength - (v * 2) - o.scroll;
						} else if (to >= itemLength - v + 1) { // If last, then goto first
							ul.css(animCss, -((v) * liSize) + "px"); // If "scroll" > 1, then the "to" might not be equal to the condition; it can be greater depending on the number of elements.
							curr = to == itemLength - v + 1 ? v + 1 : v + o.scroll;
						} else curr = to;
					} else { // If non-circular and to points to first or last, we just return.
						if (to < 0 || to > itemLength - v) return;
						else curr = to;
					} // If neither overrides it, the curr will still be "to" and we can proceed.
					running = true;
					ul.animate(animCss == "left" ? {
						left: -(curr * liSize)
					} : {
						top: -(curr * liSize)
					},
					o.speed, o.easing, function () {
						if (o.afterEnd) o.afterEnd.call(this, vis());
						running = false;
					}); // Disable buttons when the carousel reaches the last/first, and enable when not
					if (!o.circular) {
						$(o.btnPrev + "," + o.btnNext).removeClass("disabled");
						$((curr - o.scroll < 0 && o.btnPrev) || (curr + o.scroll > itemLength - v && o.btnNext) || []).addClass("disabled");
					}
				}
				return false;
			};
		});
	};
	function css(el, prop) {
		return parseInt($.css(el[0], prop)) || 0;
	};
	function width(el) {
		return el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
	};
	function height(el) {
		return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
	};
})(jQuery);
function buttonToggle(onElement, offElement, openText, closeText) {
	onElement.id = "";
}


/* price notification used by index pages
 * id = the id of the price for notification
 * price = the target price
 * type = 0 new or used, 1 new only, 2 used only
 * email = email of the user - if null cookie will be read - if not on record, new user will be created
 * pass = password of the user - if null cookies will be read - if new email this will be the user's password
 * message = the html object that will contain the results of this call
 * remove = the html object to remove when an alert has been created
 */
function priceNotifyAlt(id, price, type, email, pass, messageContainer, removeContainer) {
        var url = "/notification/";
        var d = AJS.loadJSONDoc(url);
        d.addCallback(function (o) {
                if (o.worked == 'true') {
                        if (o.cookie != null) {
                                setCookie('u', o.cookie, 365);
                                setUserOnLogin(email);
                        } //update this box
                        messageContainer.innerHTML = o.message;
                        AJS.removeElement(removeContainer);
                        try {
                                pageTracker._trackPageview("/events/alert/price/"+id);
                        } catch(err) {}
                } else {
                        messageContainer.innerHTML = o.message;
                }
        });
        if (pass != null) {
                d.sendReq({
                        method: 'price',
                        price: price,
                        type: type,
                        email: email,
                        pass: pass,
                        id: id
                })
        } else {
                var hash = getCookie('u');
                if (hash == null) {
                        alert('Oops! That did not work like it was supposed to. Please log out, log in and try again.');
                        return false;
                } else {
                        d.sendReq({
                                method: 'price',
                                price: price,
                                type: type,
                                hash: hash,
                                id: id
                        })
                }
        }
        return false;
}


/* this helper function allows us to take alerts in the dynamic overlay */
function alertHelper(id, form) {
    if (AJS.getFormElementAlt(form,'email') != null) {
      var email = AJS.getFormElementAlt(form,'email').value;
    } else {
      var email = null;
    }
    if (AJS.getFormElementAlt(form,'pass') != null) {
      var pass = AJS.getFormElementAlt(form,'pass').value;
    } else {
      var pass = null;
    }
    var price = AJS.getFormElementAlt(form,'price').value;
    var type = AJS.getFormElementAlt(form,'type').value;
    var alertContainer = getChildByTag('DIV', form);
    var removeContainer = getChildByTag('TABLE', form);
    /*priceNotifyAlt(productId, price, type, email, pass, AJS.$bytc('div','alert',form), AJS.$bytc('table','form-input-table',form));*/
    priceNotifyAlt(productId, price, type, email, pass, alertContainer, removeContainer);
}

/* this helper function returns the first (and only the first) child of a specific element type */
function getChildByTag(tag, o) {
  for (i=0;i<o.childNodes.length;i++) {
    nownode=o.childNodes[i];
    if (nownode.tagName != null) {
      if(nownode.tagName == tag) {
        return nownode;
      }
    }
  }
}

/* navigation overlay functionality */
sfHover = function() {
	var sfEls = document.getElementById("nav").getElementsByTagName("LI");
	for (var i=0; i<sfEls.length; i++) {
		sfEls[i].onmouseover=function() {
			this.className+=" sfhover";
		}
		sfEls[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
		}
	}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);

/* AJS functionality - Last Modified: 31/08/07 15:06:50 VERSION 4.1**/
if (!AJS) {
	var AJS = {
		BASE_URL: "",
		ajaxErrorHandler: null,
		////
		// General accessor functions
		////
		getQueryArgument: function (var_name) {
			var query = window.location.search.substring(1);
			var vars = query.split("&");
			for (var i = 0; i < vars.length; i++) {
				var pair = vars[i].split("=");
				if (pair[0] == var_name) {
					return pair[1];
				}
			}
			return null;
		},
		isIe: function () {
			return (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1);
		},
		isNetscape7: function () {
			return (navigator.userAgent.toLowerCase().indexOf("netscape") != -1 && navigator.userAgent.toLowerCase().indexOf("7.") != -1);
		},
		isSafari: function () {
			return (navigator.userAgent.toLowerCase().indexOf("khtml") != -1);
		},
		isOpera: function () {
			return (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
		},
		isMozilla: function () {
			return (navigator.userAgent.toLowerCase().indexOf("gecko") != -1 && navigator.productSub >= 20030210);
		},
		isMac: function () {
			return (navigator.userAgent.toLowerCase().indexOf('macintosh') != -1);
		},
		isCamino: function () {
			return (navigator.userAgent.toLowerCase().indexOf("camino") != -1);
		},
		////
		// Array functions
		////
		//Shortcut: AJS.$A
		createArray: function (v) {
			if (AJS.isArray(v) && !AJS.isString(v)) return v;
			else if (!v) return [];
			else return [v];
		},
		forceArray: function (args) {
			var r = [];
			AJS.map(args, function (elm) {
				r.push(elm);
			});
			return r;
		},
		join: function (delim, list) {
			try {
				return list.join(delim);
			} catch(e) {
				var r = list[0] || '';
				AJS.map(list, function (elm) {
					r += delim + elm;
				},
				1);
				return r + '';
			}
		},
		isIn: function (elm, list) {
			var i = AJS.getIndex(elm, list);
			if (i != -1) return true;
			else return false;
		},
		getIndex: function (elm, list
		/*optional*/
		, eval_fn) {
			for (var i = 0; i < list.length; i++) if (eval_fn && eval_fn(list[i]) || elm == list[i]) return i;
			return -1;
		},
		getFirst: function (list) {
			if (list.length > 0) return list[0];
			else return null;
		},
		getLast: function (list) {
			if (list.length > 0) return list[list.length - 1];
			else return null;
		},
		update: function (l1, l2) {
			for (var i in l2) l1[i] = l2[i];
			return l1;
		},
		flattenList: function (list) {
			var r = [];
			var _flatten = function (r, l) {
				AJS.map(l, function (o) {
					if (o == null) {} else if (AJS.isArray(o)) _flatten(r, o);
					else r.push(o);
				});
			}
			_flatten(r, list);
			return r;
		},
		////
		// Functional programming
		////
		map: function (list, fn,
		/*optional*/
		start_index, end_index) {
			var i = 0,
			l = list.length;
			if (start_index) i = start_index;
			if (end_index) l = end_index;
			for (i; i < l; i++) {
				var val = fn(list[i], i);
				if (val != undefined) return val;
			}
		},
		rmap: function (list, fn) {
			var i = list.length - 1,
			l = 0;
			for (i; i >= l; i--) {
				var val = fn.apply(null, [list[i], i]);
				if (val != undefined) return val;
			}
		},
		filter: function (list, fn,
		/*optional*/
		start_index, end_index) {
			var r = [];
			AJS.map(list, function (elm) {
				if (fn(elm)) r.push(elm);
			},
			start_index, end_index);
			return r;
		},
		partial: function (fn) {
			var args = AJS.$FA(arguments);
			args.shift();
			return function () {
				args = args.concat(AJS.$FA(arguments));
				return fn.apply(window, args);
			}
		},
		////
		// DOM functions
		////
		//--- Accessors ----------------------------------------------
		//Shortcut: AJS.$
		getElement: function (id) {
			if (AJS.isString(id) || AJS.isNumber(id)) return document.getElementById(id);
			else return id;
		},
		//Shortcut: AJS.$$
		getElements: function (
		/*id1, id2, id3*/
		) {
			var args = AJS.forceArray(arguments);
			var elements = new Array();
			for (var i = 0; i < args.length; i++) {
				var element = AJS.getElement(args[i]);
				elements.push(element);
			}
			return elements;
		},
		//Shortcut: AJS.$bytc
		getElementsByTagAndClassName: function (tag_name, class_name,
		/*optional*/
		parent, first_match) {
			var class_elements = [];
			if (!AJS.isDefined(parent)) parent = document;
			if (!AJS.isDefined(tag_name)) tag_name = '*';
			var els = parent.getElementsByTagName(tag_name);
			var els_len = els.length;
			var pattern = new RegExp("(^|\\s)" + class_name + "(\\s|$)");
			for (i = 0, j = 0; i < els_len; i++) {
				if (pattern.test(els[i].className) || class_name == null) {
					class_elements[j] = els[i];
					j++;
				}
			}
			if (first_match) return class_elements[0];
			else return class_elements;
		},
		nodeName: function (elm) {
			return elm.nodeName.toLowerCase();
		},
		_nodeWalk: function (elm, tag_name, class_name, fn_next_elm) {
			var p = fn_next_elm(elm);
			var checkFn;
			if (tag_name && class_name) {
				checkFn = function (p) {
					return AJS.nodeName(p) == tag_name && AJS.hasClass(p, class_name);
				}
			} else if (tag_name) {
				checkFn = function (p) {
					return AJS.nodeName(p) == tag_name;
				}
			} else {
				checkFn = function (p) {
					return AJS.hasClass(p, class_name);
				}
			}
			while (p) {
				if (checkFn(p)) return p;
				p = fn_next_elm(p);
			}
			return null;
		},
		getParentBytc: function (elm, tag_name, class_name) {
			return AJS._nodeWalk(elm, tag_name, class_name, function (m) {
				return m.parentNode;
			});
		},
		hasParent: function (elm, parent_to_consider, max_look_up) {
			if (elm == parent_to_consider) return true;
			if (max_look_up == 0) return false;
			return AJS.hasParent(elm.parentNode, parent_to_consider, max_look_up - 1);
		},
		getPreviousSiblingBytc: function (elm, tag_name, class_name) {
			return AJS._nodeWalk(elm, tag_name, class_name, function (m) {
				return m.previousSibling;
			});
		},
		getNextSiblingBytc: function (elm, tag_name, class_name) {
			return AJS._nodeWalk(elm, tag_name, class_name, function (m) {
				return m.nextSibling;
			});
		},
		getBody: function () {
			return AJS.$bytc('body')[0]
		},
		//--- Form related ----------------------------------------------
		//Shortcut: AJS.$f
		getFormElement: function (form, name) {
			form = AJS.$(form);
			var r = null;
			AJS.map(form.elements, function (elm) {
				if (elm.name && elm.name == name) r = elm;
			});
			if (r) return r;
			AJS.map(AJS.$bytc('select', null, form), function (elm) {
				if (elm.name && elm.name == name) r = elm;
			});
			return r;
		},
		getFormElementAlt: function (form, name) {
			var r = null;
			AJS.map(form.elements, function (elm) {
				if (elm.name && elm.name == name) r = elm;
			});
			if (r) return r;
			AJS.map(AJS.$bytc('select', null, form), function (elm) {
				if (elm.name && elm.name == name) r = elm;
			});
			return r;
		},
		formContents: function (form) {
			var form = AJS.$(form);
			var r = {};
			var fn = function (elms) {
				AJS.map(elms, function (e) {
					if (e.name) r[e.name] = e.value || '';
				});
			}
			fn(AJS.$bytc('input', null, form));
			fn(AJS.$bytc('textarea', null, form));
			return r;
		},
		formContentsAlt: function (form) {
			var r = {};
			var fn = function (elms) {
				AJS.map(elms, function (e) {
					if (e.name) r[e.name] = e.value || '';
				});
			}
			fn(AJS.$bytc('input', null, form));
			fn(AJS.$bytc('textarea', null, form));
			return r;
		},
		getSelectValue: function (select) {
			var select = AJS.$(select);
			return select.options[select.selectedIndex].value;
		},
		//--- DOM related ----------------------------------------------
		//Shortcut: AJS.DI
		documentInsert: function (elm) {
			if (typeof(elm) == 'string') elm = AJS.HTML2DOM(elm);
			document.write('<span id="dummy_holder"></span>');
			AJS.swapDOM(AJS.$('dummy_holder'), elm);
		},
		cloner: function (element) {
			return function () {
				return element.cloneNode(true);
			}
		},
		//Shortcut: AJS.ACN
		appendChildNodes: function (elm
		/*, elms...*/
		) {
			if (arguments.length >= 2) {
				AJS.map(arguments, function (n) {
					if (AJS.isString(n)) n = AJS.TN(n);
					if (AJS.isDefined(n)) elm.appendChild(n);
				},
				1);
			}
			return elm;
		},
		appendToTop: function (elm
		/*, elms...*/
		) {
			var args = AJS.forceArray(arguments).slice(1);
			if (args.length >= 1) {
				var first_child = elm.firstChild;
				if (first_child) {
					while (true) {
						var t_elm = args.shift();
						if (t_elm) AJS.insertBefore(t_elm, first_child);
						else break;
					}
				} else {
					AJS.ACN.apply(null, arguments);
				}
			}
			return elm;
		},
		//Shortcut: AJS.RCN
		replaceChildNodes: function (elm
		/*, elms...*/
		) {
			var child;
			while ((child = elm.firstChild)) elm.removeChild(child);
			if (arguments.length < 2) return elm;
			else return AJS.appendChildNodes.apply(null, arguments);
			return elm;
		},
		insertAfter: function (elm, reference_elm) {
			reference_elm.parentNode.insertBefore(elm, reference_elm.nextSibling);
			return elm;
		},
		insertBefore: function (elm, reference_elm) {
			reference_elm.parentNode.insertBefore(elm, reference_elm);
			return elm;
		},
		swapDOM: function (dest, src) {
			dest = AJS.getElement(dest);
			var parent = dest.parentNode;
			if (src) {
				src = AJS.getElement(src);
				parent.replaceChild(src, dest);
			} else {
				parent.removeChild(dest);
			}
			return src;
		},
		removeElement: function (
		/*elm1, elm2...*/
		) {
			var args = AJS.forceArray(arguments);
			AJS.map(args, function (elm) {
				AJS.swapDOM(elm, null);
			});
		},
		createDOM: function (name, attrs) {
			var i = 0,
			attr;
			var elm = document.createElement(name);
			var first_attr = attrs[0];
			if (AJS.isDict(attrs[i])) {
				for (k in first_attr) {
					attr = first_attr[k];
					if (k == 'style' || k == 's') elm.style.cssText = attr;
					else if (k == 'c' || k == 'class' || k == 'className') elm.className = attr;
					else {
						elm.setAttribute(k, attr);
					}
				}
				i++;
			}
			if (first_attr == null) i = 1;
			for (var j = i; j < attrs.length; j++) {
				var attr = attrs[j];
				if (attr) {
					var type = typeof(attr);
					if (type == 'string' || type == 'number') attr = AJS.TN(attr);
					elm.appendChild(attr);
				}
			}
			return elm;
		},
		_createDomShortcuts: function () {
			var elms = ["ul", "li", "td", "tr", "th", "tbody", "table", "input", "span", "b", "a", "div", "img", "button", "h1", "h2", "h3", "h4", "h5", "h6", "br", "textarea", "form", "p", "select", "option", "optgroup", "iframe", "script", "center", "dl", "dt", "dd", "small", "pre", 'i'];
			var extends_ajs = function (elm) {
				AJS[elm.toUpperCase()] = function () {
					return AJS.createDOM.apply(null, [elm, arguments]);
				};
			}
			AJS.map(elms, extends_ajs);
			AJS.TN = function (text) {
				return document.createTextNode(text)
			};
		},
		setHTML: function (elm, html) {
			elm.innerHTML = html;
			return elm;
		},
		//--- CSS related ----------------------------------------------
		showElement: function (
		/*elms...*/
		) {
			var args = AJS.forceArray(arguments);
			AJS.map(args, function (elm) {
				elm.style.display = ''
			});
		},
		hideElement: function (elm) {
			var args = AJS.forceArray(arguments);
			AJS.map(args, function (elm) {
				elm.style.display = 'none'
			});
		},
		isElementHidden: function (elm) {
			return ((elm.style.display == "none") || (elm.style.visibility == "hidden"));
		},
		getCssDim: function (dim) {
			if (AJS.isString(dim)) return dim;
			else return dim + "px";
		},
		getCssProperty: function (elm, prop) {
			elm = AJS.$(elm);
			var y;
			if (elm.currentStyle) y = elm.currentStyle[prop];
			else if (window.getComputedStyle) y = document.defaultView.getComputedStyle(elm, null).getPropertyValue(prop);
			return y;
		},
		setStyle: function (
		/*elm1, elm2..., property, new_value*/
		) {
			var args = AJS.forceArray(arguments);
			var new_val = args.pop();
			var property = args.pop();
			AJS.map(args, function (elm) {
				elm.style[property] = AJS.getCssDim(new_val);
			});
		},
		setWidth: function (
		/*elm1, elm2..., width*/
		) {
			var args = AJS.forceArray(arguments);
			args.splice(args.length - 1, 0, 'width');
			AJS.setStyle.apply(null, args);
		},
		setHeight: function (
		/*elm1, elm2..., height*/
		) {
			var args = AJS.forceArray(arguments);
			args.splice(args.length - 1, 0, 'height');
			AJS.setStyle.apply(null, args);
		},
		setLeft: function (
		/*elm1, elm2..., left*/
		) {
			var args = AJS.forceArray(arguments);
			args.splice(args.length - 1, 0, 'left');
			AJS.setStyle.apply(null, args);
		},
		setTop: function (
		/*elm1, elm2..., top*/
		) {
			var args = AJS.forceArray(arguments);
			args.splice(args.length - 1, 0, 'top');
			AJS.setStyle.apply(null, args);
		},
		setClass: function (
		/*elm1, elm2..., className*/
		) {
			var args = AJS.forceArray(arguments);
			var c = args.pop();
			AJS.map(args, function (elm) {
				elm.className = c
			});
		},
		addClass: function (
		/*elm1, elm2..., className*/
		) {
			var args = AJS.forceArray(arguments);
			var cls = args.pop();
			var add_class = function (o) {
				if (!new RegExp("(^|\\s)" + cls + "(\\s|$)").test(o.className)) o.className += (o.className ? " " : "") + cls;
			};
			AJS.map(args, function (elm) {
				add_class(elm);
			});
		},
		hasClass: function (elm, cls) {
			if (!elm.className) return false;
			return elm.className == cls || elm.className.search(new RegExp(" " + cls + "|^" + cls)) != -1
		},
		removeClass: function (
		/*elm1, elm2..., className*/
		) {
			var args = AJS.forceArray(arguments);
			var cls = args.pop();
			var rm_class = function (o) {
				o.className = o.className.replace(new RegExp("\\s?" + cls, 'g'), "");
			};
			AJS.map(args, function (elm) {
				rm_class(elm);
			});
		},
		setOpacity: function (elm, p) {
			elm.style.opacity = p;
			elm.style.filter = "alpha(opacity=" + p * 100 + ")";
		},
		resetOpacity: function (elm) {
			elm.style.opacity = 1;
			elm.style.filter = "";
		},
		//--- Misc ----------------------------------------------
		RND: function (tmpl, ns, scope) {
			scope = scope || window;
			var fn = function (w, g) {
				g = g.split("|");
				var cnt = ns[g[0]];
				for (var i = 1; i < g.length; i++) cnt = scope[g[i]](cnt);
				if (cnt == '') return '';
				if (cnt == 0 || cnt == -1) cnt += '';
				return cnt || w;
			};
			return tmpl.replace(/%\(([A-Za-z0-9_|.]*)\)/g, fn);
		},
		HTML2DOM: function (html,
		/*optional*/
		first_child) {
			var d = AJS.DIV();
			d.innerHTML = html;
			if (first_child) return d.childNodes[0];
			else return d;
		},
		preloadImages: function (
		/*img_src1, ..., img_srcN*/
		) {
			AJS.AEV(window, 'load', AJS.$p(function (args) {
				AJS.map(args, function (src) {
					var pic = new Image();
					pic.src = src;
				});
			},
			arguments));
		},
		////
		// Ajax functions
		////
		getXMLHttpRequest: function () {
			var try_these = [function () {
				return new XMLHttpRequest();
			},
			function () {
				return new ActiveXObject('Msxml2.XMLHTTP');
			},
			function () {
				return new ActiveXObject('Microsoft.XMLHTTP');
			},
			function () {
				return new ActiveXObject('Msxml2.XMLHTTP.4.0');
			},
			function () {
				throw "Browser does not support XMLHttpRequest";
			}];
			for (var i = 0; i < try_these.length; i++) {
				var func = try_these[i];
				try {
					return func();
				} catch(e) {}
			}
		},
		getRequest: function (url, data, type) {
			if (!type) type = "POST";
			var req = AJS.getXMLHttpRequest();
			if (url.match(/^https?:\/\//) == null) {
				if (AJS.BASE_URL != '') {
					if (AJS.BASE_URL.lastIndexOf('/') != AJS.BASE_URL.length - 1) AJS.BASE_URL += '/';
					url = AJS.BASE_URL + url;
				}
			}
			req.open(type, url, true);
			if (type == "POST") req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			return AJS._sendXMLHttpRequest(req);
		},
		_sendXMLHttpRequest: function (req, data) {
			var d = new AJSDeferred(req);
			var onreadystatechange = function () {
				if (req.readyState == 4) {
					var status = '';
					try {
						status = req.status;
					} catch(e) {};
					if (status == 200 || status == 304 || req.responseText == null) {
						d.callback();
					} else { if (d.errbacks.length == 0) {
							if (AJS.ajaxErrorHandler) AJS.ajaxErrorHandler(req.responseText, req);
						} else d.errback();
					}
				}
			}
			req.onreadystatechange = onreadystatechange;
			return d;
		},
		_reprString: function (o) {
			return ('"' + o.replace(/(["\\])/g, '\\$1') + '"').replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r");
		},
		_reprDate: function (db) {
			var year = db.getFullYear();
			var dd = db.getDate();
			var mm = db.getMonth() + 1;
			var hh = db.getHours();
			var mins = db.getMinutes();
			function leadingZero(nr) {
				if (nr < 10) nr = "0" + nr;
				return nr;
			}
			if (hh == 24) hh = '00';
			var time = leadingZero(hh) + ':' + leadingZero(mins);
			return '"' + year + '-' + mm + '-' + dd + 'T' + time + '"';
		},
		serializeJSON: function (o) {
			var objtype = typeof(o);
			if (objtype == "undefined") {
				return "undefined";
			} else if (objtype == "number" || objtype == "boolean") {
				return o + "";
			} else if (o === null) {
				return "null";
			}
			if (objtype == "string") {
				return AJS._reprString(o);
			}
			if (objtype == 'object' && o.getFullYear) {
				return AJS._reprDate(o);
			}
			var me = arguments.callee;
			if (objtype != "function" && typeof(o.length) == "number") {
				var res = [];
				for (var i = 0; i < o.length; i++) {
					var val = me(o[i]);
					if (typeof(val) != "string") {
						val = "undefined";
					}
					res.push(val);
				}
				return "[" + res.join(",") + "]";
			} // it's a function with no adapter, bad
			if (objtype == "function") return null;
			res = [];
			for (var k in o) {
				var useKey;
				if (typeof(k) == "number") {
					useKey = '"' + k + '"';
				} else if (typeof(k) == "string") {
					useKey = AJS._reprString(k);
				} else { // skip non-string or number keys
					continue;
				}
				val = me(o[k]);
				if (typeof(val) != "string") { // skip non-serializable values
					continue;
				}
				res.push(useKey + ":" + val);
			}
			return "{" + res.join(",") + "}";
		},
		loadJSONDoc: function (url) {
			var d = AJS.getRequest(url);
			var eval_req = function (data, req) {
				var text = req.responseText;
				if (text == "Error") d.errback(req);
				else return AJS.evalTxt(text);
			};
			d.addCallback(eval_req);
			return d;
		},
		evalTxt: function (txt) {
			try {
				return eval('(' + txt + ')');
			} catch(e) {
				return eval(txt);
			}
		},
		evalScriptTags: function (html) {
			var script_data = html.match(/<script.*?>((\n|\r|.)*?)<\/script>/g);
			if (script_data != null) {
				for (var i = 0; i < script_data.length; i++) {
					var script_only = script_data[i].replace(/<script.*?>/g, "");
					script_only = script_only.replace(/<\/script>/g, "");
					eval(script_only);
				}
			}
		},
		queryArguments: function (data) {
			var post_data = [];
			for (k in data) post_data.push(k + "=" + AJS.urlencode(data[k]));
			return post_data.join("&");
		},
		////
		// Position and size
		////
		getMousePos: function (e) {
			var posx = 0;
			var posy = 0;
			if (!e) var e = window.event;
			if (e.pageX || e.pageY) {
				posx = e.pageX;
				posy = e.pageY;
			} else if (e.clientX || e.clientY) {
				posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
				posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
			}
			return {
				x: posx,
				y: posy
			};
		},
		getScrollTop: function () { //From: http://www.quirksmode.org/js/doctypes.html
			var t;
			if (document.documentElement && document.documentElement.scrollTop) t = document.documentElement.scrollTop;
			else if (document.body) t = document.body.scrollTop;
			return t;
		},
		//Shortcut: AJS.$AP
		absolutePosition: function (elm) {
			var posObj = {
				'x': elm.offsetLeft,
				'y': elm.offsetTop
			};
			if (elm.offsetParent) {
				var next = elm.offsetParent;
				while (next) {
					posObj.x += next.offsetLeft;
					posObj.y += next.offsetTop;
					next = next.offsetParent;
				}
			} // safari bug
			if (AJS.isSafari() && elm.style.position == 'absolute') {
				posObj.x -= document.body.offsetLeft;
				posObj.y -= document.body.offsetTop;
			}
			return posObj;
		},
		getWindowSize: function (doc) {
			doc = doc || document;
			var win_w, win_h;
			if (self.innerHeight) {
				win_w = self.innerWidth;
				win_h = self.innerHeight;
			} else if (doc.documentElement && doc.documentElement.clientHeight) {
				win_w = doc.documentElement.clientWidth;
				win_h = doc.documentElement.clientHeight;
			} else if (doc.body) {
				win_w = doc.body.clientWidth;
				win_h = doc.body.clientHeight;
			}
			return {
				'w': win_w,
				'h': win_h
			};
		},
		isOverlapping: function (elm1, elm2) {
			var pos_elm1 = AJS.absolutePosition(elm1);
			var pos_elm2 = AJS.absolutePosition(elm2);
			var top1 = pos_elm1.y;
			var left1 = pos_elm1.x;
			var right1 = left1 + elm1.offsetWidth;
			var bottom1 = top1 + elm1.offsetHeight;
			var top2 = pos_elm2.y;
			var left2 = pos_elm2.x;
			var right2 = left2 + elm2.offsetWidth;
			var bottom2 = top2 + elm2.offsetHeight;
			var getSign = function (v) {
				if (v > 0) return "+";
				else if (v < 0) return "-";
				else return 0;
			}
			if ((getSign(top1 - bottom2) != getSign(bottom1 - top2)) && (getSign(left1 - right2) != getSign(right1 - left2))) return true;
			return false;
		},
		////
		// Events
		////
		getEventElm: function (e) {
			if (e && !e.type && !e.keyCode) return e
			var targ;
			if (!e) var e = window.event;
			if (e.target) targ = e.target;
			else if (e.srcElement) targ = e.srcElement;
			if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
			return targ;
		},
		setEventKey: function (e) {
			e.key = e.keyCode ? e.keyCode : e.charCode;
			if (window.event) {
				e.ctrl = window.event.ctrlKey;
				e.shift = window.event.shiftKey;
			} else {
				e.ctrl = e.ctrlKey;
				e.shift = e.shiftKey;
			}
			switch (e.key) {
			case 63232:
				e.key = 38;
				break;
			case 63233:
				e.key = 40;
				break;
			case 63235:
				e.key = 39;
				break;
			case 63234:
				e.key = 37;
				break;
			}
		},
		//Shortcut: AJS.AEV
		addEventListener: function (elm, type, fn,
		/*optional*/
		listen_once, cancle_bubble) {
			var ajs_l_key = 'ajsl_' + type + fn;
			if (!cancle_bubble) cancle_bubble = false;
			AJS.listeners = AJS.$A(AJS.listeners); //Fix keyCode
			if (AJS.isIn(type, ['keypress', 'keydown', 'keyup', 'click'])) {
				var old_fn_1 = fn;
				fn = function (e) {
					AJS.setEventKey(e);
					return old_fn_1.apply(window, arguments);
				}
			} //Hack since these does not work in all browsers
			var is_special_type = AJS.isIn(type, ['submit', 'load', 'scroll', 'resize']);
			var elms = AJS.$A(elm);
			AJS.map(elms, function (elm_i) {
				if (listen_once) {
					var old_fn_2 = fn;
					fn = function (e) {
						AJS.REV(elm_i, type, fn);
						return old_fn_2.apply(window, arguments);
					}
				}
				if (is_special_type) {
					var old_fn = elm_i['on' + type];
					var wrap_fn = function () {
						if (old_fn) {
							fn(arguments);
							return old_fn(arguments);
						} else return fn(arguments);
					};
					elm_i[ajs_l_key] = wrap_fn;
					elm_i[ajs_l_key + 'old'] = old_fn;
					elm['on' + type] = wrap_fn;
				} else {
					elm_i[ajs_l_key] = fn;
					if (elm_i.attachEvent) elm_i.attachEvent("on" + type, fn);
					else if (elm_i.addEventListener) elm_i.addEventListener(type, fn, cancle_bubble);
					AJS.listeners.push([elm_i, type, fn]);
				}
			});
		},
		//Shortcut: AJS.REV
		removeEventListener: function (elm, type, fn,
		/*optional*/
		cancle_bubble) {
			var ajs_l_key = 'ajsl_' + type + fn;
			if (!cancle_bubble) cancle_bubble = false;
			fn = elm[ajs_l_key] || fn;
			if (elm['on' + type] == fn) {
				elm['on' + type] = elm[ajs_l_key + 'old'];
			}
			if (elm.removeEventListener) {
				elm.removeEventListener(type, fn, cancle_bubble);
				if (AJS.isOpera()) elm.removeEventListener(type, fn, !cancle_bubble);
			} else if (elm.detachEvent) elm.detachEvent("on" + type, fn);
		},
		//Shortcut: AJS.$b
		bind: function (fn, scope,
		/*optional*/
		extra_args) {
			fn._cscope = scope;
			return AJS._getRealScope(fn, extra_args);
		},
		bindMethods: function (self) {
			for (var k in self) {
				var func = self[k];
				if (typeof(func) == 'function') {
					self[k] = AJS.$b(func, self);
				}
			}
		},
		callLater: function (fn, interval) {
			var fn_no_send = function () {
				fn();
			};
			window.setTimeout(fn_no_send, interval);
		},
		preventDefault: function (e) {
			if (AJS.isIe()) window.event.returnValue = false;
			else {
				e.preventDefault();
			}
		},
		_listenOnce: function (elm, type, fn) {
			var r_fn = function () {
				AJS.removeEventListener(elm, type, r_fn);
				fn(arguments);
			}
			return r_fn;
		},
		_getRealScope: function (fn,
		/*optional*/
		extra_args) {
			extra_args = AJS.$A(extra_args);
			var scope = fn._cscope || window;
			return function () {
				var args = AJS.$FA(arguments).concat(extra_args);
				return fn.apply(scope, args);
			};
		},
		_unloadListeners: function () {
			if (AJS.listeners) AJS.map(AJS.listeners, function (elm, type, fn) {
				AJS.REV(elm, type, fn)
			});
			AJS.listeners = [];
		},
		////
		// Misc.
		////
		keys: function (obj) {
			var rval = [];
			for (var prop in obj) {
				rval.push(prop);
			}
			return rval;
		},
		values: function (obj) {
			var rval = [];
			for (var prop in obj) {
				rval.push(obj[prop]);
			}
			return rval;
		},
		urlencode: function (str) {
			return encodeURIComponent(str.toString());
		},
		isDefined: function (o) {
			return (o != "undefined" && o != null)
		},
		isArray: function (obj) {
			return obj instanceof Array;
		},
		isString: function (obj) {
			return (typeof obj == 'string');
		},
		isNumber: function (obj) {
			return (typeof obj == 'number');
		},
		isObject: function (obj) {
			return (typeof obj == 'object');
		},
		isFunction: function (obj) {
			return (typeof obj == 'function');
		},
		isDict: function (o) {
			var str_repr = String(o);
			return str_repr.indexOf(" Object") != -1;
		},
		exportToGlobalScope: function (scope) {
			scope = scope || window;
			for (e in AJS) scope[e] = AJS[e];
		},
		log: function (o) {
			if (window.console) console.log(o);
			else {
				var div = AJS.$('ajs_logger');
				if (!div) {
					div = AJS.DIV({
						id: 'ajs_logger',
						'style': 'color: green; position: absolute; left: 0'
					});
					div.style.top = AJS.getScrollTop() + 'px';
					AJS.ACN(AJS.getBody(), div);
				}
				AJS.setHTML(div, '' + o);
			}
		}
	}
	AJS.Class = function (members) {
		var fn = function () {
			if (arguments[0] != 'no_init') {
				return this.init.apply(this, arguments);
			}
		}
		fn.prototype = members;
		AJS.update(fn, AJS.Class.prototype);
		return fn;
	}
	AJS.Class.prototype = {
		extend: function (members) {
			var parent = new this('no_init');
			for (k in members) {
				var prev = parent[k];
				var cur = members[k];
				if (prev && prev != cur && typeof cur == 'function') {
					cur = this._parentize(cur, prev);
				}
				parent[k] = cur;
			}
			return new AJS.Class(parent);
		},
		implement: function (members) {
			AJS.update(this.prototype, members);
		},
		_parentize: function (cur, prev) {
			return function () {
				this.parent = prev;
				return cur.apply(this, arguments);
			}
		}
	}; //End class
	//Shortcuts
	AJS.$ = AJS.getElement;
	AJS.$$ = AJS.getElements;
	AJS.$f = AJS.getFormElement;
	AJS.$b = AJS.bind;
	AJS.$p = AJS.partial;
	AJS.$FA = AJS.forceArray;
	AJS.$A = AJS.createArray;
	AJS.DI = AJS.documentInsert;
	AJS.ACN = AJS.appendChildNodes;
	AJS.RCN = AJS.replaceChildNodes;
	AJS.AEV = AJS.addEventListener;
	AJS.REV = AJS.removeEventListener;
	AJS.$bytc = AJS.getElementsByTagAndClassName;
	AJS.$AP = AJS.absolutePosition;
	AJSDeferred = function (req) {
		this.callbacks = [];
		this.errbacks = [];
		this.req = req;
	}
	AJSDeferred.prototype = {
		excCallbackSeq: function (req, list) {
			var data = req.responseText;
			while (list.length > 0) {
				var fn = list.pop();
				var new_data = fn(data, req);
				if (new_data) data = new_data;
			}
		},
		callback: function () {
			this.excCallbackSeq(this.req, this.callbacks);
		},
		errback: function () {
			if (this.errbacks.length == 0) alert("Error encountered:\n" + this.req.responseText);
			this.excCallbackSeq(this.req, this.errbacks);
		},
		addErrback: function (fn) {
			this.errbacks.unshift(fn);
		},
		addCallback: function (fn) {
			this.callbacks.unshift(fn);
		},
		abort: function () {
			this.req.abort();
		},
		addCallbacks: function (fn1, fn2) {
			this.addCallback(fn1);
			this.addErrback(fn2);
		},
		sendReq: function (data) {
			if (AJS.isObject(data)) {
				this.req.send(AJS.queryArguments(data));
			} else if (AJS.isDefined(data)) this.req.send(data);
			else {
				this.req.send("");
			}
		}
	}; //End deferred
	//Prevent memory-leaks
	AJS.addEventListener(window, 'unload', AJS._unloadListeners);
	AJS._createDomShortcuts()
}
script_loaded = true;

/* open and close functionality */
function showHide(openCloseElement, labelElement, openText, closeText) {
	if (openCloseElement.style.display == 'none') {
		openCloseElement.style.display = 'block';
		labelElement.innerHTML = closeText;
	} else {
		openCloseElement.style.display = 'none';
		labelElement.innerHTML = openText;
	}
}

/* ajax functionality */
var email;
function showHide(openCloseElement, labelElement, openText, closeText) {
	if (openCloseElement.style.display == 'none') {
		openCloseElement.style.display = 'block';
		labelElement.innerHTML = closeText;
	} else {
		openCloseElement.style.display = 'none';
		labelElement.innerHTML = openText;
	}
}
/* price notification used by the product page */
function priceNotify(id) {
	var url = "/notification/";
	var d = AJS.loadJSONDoc(url);
	d.addCallback(function (o) {
		if (o.worked == 'true') {
			if (o.cookie != null) {
				setCookie('u', o.cookie, 365);
				setUserOnLogin(email);
			} //update this box
			AJS.$('price-alert').innerHTML = o.message;
			AJS.removeElement(AJS.$('price-entry')); //conversion tracking
			try {
				pageTracker._trackPageview("/events/alert/price/"+id);
			} catch(err) {}
		} else {
			AJS.$('price-alert').innerHTML = o.message;
		}
	});
	var form = AJS.$('price-form');
	if (AJS.$f(form, 'pass') != null) {
		email = AJS.$f(form, 'email').value;
		d.sendReq({
			method: 'price',
			price: AJS.$f(form, 'price').value,
			type: AJS.$f(form, 'type').value,
			email: AJS.$f(form, 'email').value,
			pass: AJS.$f(form, 'pass').value,
			id: id
		})
	} else {
		var hash = getCookie('u');
		if (hash == null) {
			alert('Oops! That did not work like it was supposed to. Please log out, log in and try again.');
			return false;
		} else {
			d.sendReq({
				method: 'price',
				price: AJS.$f(form, 'price').value,
				type: AJS.$f(form, 'type').value,
				hash: hash,
				id: id
			})
		}
	}
	return false;
}
function refundNotify(id) {
	var url = "/notification/";
	var d = AJS.loadJSONDoc(url);
	d.addCallback(function (o) {
		if (o.worked == 'true') {
			if (o.cookie != null) {
				setCookie('u', o.cookie, 365);
				setUserOnLogin(email);
			} //update this box
			AJS.$('refund-alert').innerHTML = o.message;
			AJS.removeElement(AJS.$('refund-entry')); //conversion tracking
			try {
				pageTracker._trackPageview("/events/alert/refund/"+id);
			} catch(err) {}
		} else {
			AJS.$('refund-alert').innerHTML = o.message;
		}
	});
	var form = AJS.$('refund-form');
	if (AJS.$f(form, 'pass') != null) {
		email = AJS.$f(form, 'email').value;
		d.sendReq({
			method: 'refund',
			time: AJS.$f(form, 'time').value,
			site: AJS.$f(form, 'site').value,
			email: AJS.$f(form, 'email').value,
			pass: AJS.$f(form, 'pass').value,
			price: AJS.$f(form, 'price').value,
			id: id
		})
	} else {
		var hash = getCookie('u');
		if (hash == null) {
			alert('Oops! That did not work like it was supposed to. Please log out, log in and try again.');
			return false;
		} else {
			d.sendReq({
				method: 'refund',
				time: AJS.$f(form, 'time').value,
				site: AJS.$f(form, 'site').value,
				price: AJS.$f(form, 'price').value,
				hash: hash,
				id: id
			})
		}
	}
	return false;
}
function setUserOnLogin(userName) {
	try { //user area
		var shortName = userName.split('@')[0];
		AJS.$('user').innerHTML = 'hi ' + shortName + '!  <a href="/account">your account</a>   <a href="/signout">sign out</a>   <a href="/help">help</a>'
	} catch(err) {}
	try { //change the refund elements
		AJS.$('refund-user-name').innerHTML = '<td>user</td><td><a href=\"/account/">' + userName + '</a></td>'
		AJS.$('refund-user-name').style.display = "table-row";
		AJS.$('refund-email').style.display = "none";
		AJS.$('refund-password').style.display = "none";
		AJS.$('refund-tip').style.display = "none";
	} catch(err) {}
	try { //change the price alert elements
		AJS.$('price-alert-user-name').innerHTML = '<td>user</td><td><a href=\"/account/">' + userName + '</a></td>'
		AJS.$('price-alert-user-name').style.display = "table-row";
		AJS.$('price-alert-email').style.display = "none";
		AJS.$('price-alert-password').style.display = "none";
		AJS.$('price-alert-tip').style.display = "none";
	} catch(err) {}
}
function setCookie(cookieName, cookieValue, days) {
	var today = new Date();
	var expire = new Date();
	if (days == null || days == 0) days = 365;
	expire.setTime(today.getTime() + 3600000 * 24 * days);
	document.cookie = cookieName + "=" + cookieValue + ";expires=" + expire.toGMTString() + ";path=/;";
}
function removeCookie(cookieName) {
	document.cookie = cookieName + "=null;expires=Thu, 01-Jan-1970 00:00:01 GMT";
}
function getCookie(check_name) {
	var a_all_cookies = document.cookie.split(';');
	var a_temp_cookie = '';
	var cookie_name = '';
	var cookie_value = '';
	var b_cookie_found = false; // set boolean t/f default f
	for (i = 0; i < a_all_cookies.length; i++) {
		a_temp_cookie = a_all_cookies[i].split('=');
		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
		if (cookie_name == check_name) {
			b_cookie_found = true;
			if (a_temp_cookie.length > 1) {
				cookie_value = unescape(a_temp_cookie[1].replace(/^\s+|\s+$/g, ''));
			}
			return cookie_value;
			break;
		}
		a_temp_cookie = null;
		cookie_name = '';
	}
	if (!b_cookie_found) {
		return null;
	}
}

/* more ajax functionality */
/* remove an alert */
function removeNotify(id, email, type, merchant, elementId) {
	var url = "/notification/";
	var d = AJS.loadJSONDoc(url);
	d.addCallback(function(o) { 
		if (o.worked == 'true') {
			//AJS.$(elementId).style.display = 'none';
			AJS.$('info'+elementId).innerHTML = o.message + '<br><br>';
		} else {
			alert("Could not communicate with Shopobot servers.  Please try again later.");
		}
	});
	d.sendReq({
		method:'remove',
		type:  type,
		email: email,
		hash:  getCookie('u'),
		merchant: merchant,
		id:    id
	})
	return false;
}