var track_hash;

String.prototype.htmlEntities = function () {
	return this.replace(/</g,'&lt;').replace(/>/g,'&gt;');
};

var insertAfter = function (p, n, r) {
	p.insertBefore(n, r.nextSibling);
};

var prependChild = function (p, n) {
	p.insertBefore(n, p.firstChild);
};

var current_scroll = function () {
	var scroll = {};
	
	if (document.all) {
		if (!document.documentElement.scrollLeft) scroll.x = document.body.scrollLeft;
		else scroll.x = document.documentElement.scrollLeft;

		if (!document.documentElement.scrollTop) scroll.y = document.body.scrollTop;
		else scroll.y = document.documentElement.scrollTop;
	} else {
		scroll.x = window.pageXOffset;
		scroll.y = window.pageYOffset;
	}
	
	return scroll;
};

var hide = function (n) {
	if (typeof n === 'string') n = document.getElementById(n);
	if (n) n.style.display = 'none';
};

var in_array = function (a, v) {
	for (var i = 0; i < a.length; i++) {
		if (a[i] == v) return true;
	}
	
	return false;
};

var radio_value = function (g) {
	for (var i = 0; i < g.length; i++) {
		if (g[i].checked) {
			return g[i].value;
		}
	}
	
	return '';
};

var show = function (n, s) {
	if (typeof n === 'string') n = document.getElementById(n);
	if (n) n.style.display = s || '';
};

var addClass = function (n, c) {
	if (typeof n === 'string') n = document.getElementById(n);
	if (n && !hasClass(n, c)) n.className += ' ' + c;
};

var Event = {
	add : function (o, e, f) {
		if (typeof o === 'string') o = document.getElementById(o);
		
		if (typeof e === 'string') {
			if (o.addEventListener) o.addEventListener(e, f, false);
			else if (o.attachEvent) o.attachEvent('on' + e, function() {
				return f.call(o, window.event);
			});
		} else {
			for (var i = 0; i < e.length; i++) Event.add(o, e[i], f);
		}
	},
	
	stop : function (e) {
		if (e) {
			e.returnValue = false;
			if (e.preventDefault) e.preventDefault();
		}
	},
	
	cancel : function (e) {
		if (e) {
			e.cancelBubble = true;
			if (e.stopPropagation) e.stopPropagation();
		}
	},
	
	target : function (e) {
		if (e) {
			var t = e.target || e.srcElement;
			return t.nodeType == 3 ? t.parentNode : t;
		}
	}
};

var Cookie = {
	add : function (n, v, d, a) {
		if (d) {
			var date = new Date();
			date.setTime(date.getTime() + (d * 24 * 60 * 60 * 1000));
			var expires = '; expires=' + date.toGMTString();
		} else {
			var expires = '';
		}
		
		if (a && Cookie.get(n)) v = Cookie.get(n) + ',' + v;
		
		document.cookie = n + '=' + v + expires + '; path=/';
	},
	
	remove : function (n) {
		Cookie.add(n, '', -1);
	},
	
	get : function (n, f) {
		var p = n + "=";
		var t = document.cookie.split(';');
		
		for (var i = 0; i < t.length; i++) {
			var c = t[i];
			while (c.charAt(0) == ' ') c = c.substring(1, c.length);
			if (c.indexOf(p) == 0) {
				c = c.substring(p.length, c.length);
				
				if (f) {
					var t = c.split(',');
					
					for (var i = 0; i < t.length; i++) {
						if (t[i] == f) return true;
					}
					
					return false;
				} else {
					return c;
				}
			}
		}
		
		return null;
	}
};

var getElementsByClass = function (n, c, t, o) {
	if (typeof n === 'string') n = document.getElementById(n);
	if (!n) n = document;
	var m = [], a = n.getElementsByTagName(t || '*'), t = new RegExp('(\\s|^)' + c + '(\\s|$)');
	for (var i = 0, e; e = a[i]; i++) if (t.test(e.className)) m.push(e);
	return o ? m[0] : m;
};

var hasClass = function (n, c) {
	if (typeof n === 'string') n = document.getElementById(n);
	return n && n.className.match(new RegExp('(\\s|^)' + c + '(\\s|$)'));
};

var HTTPRequest = function (u, f, d, t) {
	var r = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
	r.open(d ? 'POST' : 'GET', u);
	
	r.onreadystatechange = function () {
		if (r.readyState == 4) f(r.status, r.responseText, r.getResponseHeader('Content-Type'));
	};
	
	if (d) r.setRequestHeader('Content-Type', t || 'application/x-www-form-urlencoded');
	r.send(d);
};

var buildQueryString = function (o) {
	var q = [];
	
	for (var f in o) {
		if (o.hasOwnProperty(f)) {
			if (o[f] === null || o[f] === undefined) q.push(f + '=');
			else q.push(f + '=' + encodeURIComponent(o[f]));
		}
	}
	
	return q.join('&');
};

var removeElement = function (n) {
	if (typeof n === 'string') n = document.getElementById(n);
	return n.parentNode.removeChild(n);
};

var removeChildren = function (n) {
	if (typeof n === 'string') n = document.getElementById(n);
	while (n.hasChildNodes()) n.removeChild(n.firstChild);
};

var removeClass = function (n, c) {
	if (typeof n === 'string') n = document.getElementById(n);
	if (n && hasClass(n, c)) n.className = n.className.replace(new RegExp('(\\s|^)' + c + '(\\s|$)'), ' ');
};

var Form = {
	populate : function (form, row, p) {
		if (typeof form === 'string') form = document.getElementById(form) || document[form];
		
		for (var f in row) {
			var n = p !== undefined && typeof row[f] !== 'number' ? p + '[' + f + ']' : p || f;
			
			if (row[f] && typeof row[f] === 'object' && row[f].constructor !== Array) {
				Form.populate(form, row[f], n);
			} else {
				if (form[n + '[]'] && !form[n]) n += '[]';
				
				if (row.hasOwnProperty(f) && form[n]) {
					if (row[f] === null) row[f] = '';
					
					if (row[f] && row[f].constructor === Array) {
						for (var r = 0; r < row[f].length; r++) {
							var t = {};
							t[f] = row[f][r];
							Form.populate(form, t, p);
						}
					} else {
						if (form[n].nodeName == 'SELECT') {
							for (var i = 0; i < form[n].options.length; i++) {
								if ((form[n].options[i].value || form[n].options[i].text) == row[f]) form[n].options[i].selected = true;
							}
						} else if (form[n].nodeName == 'TEXTAREA') {
							form[n].innerHTML = row[f].htmlEntities();
						} else {
							if (form[n].getAttribute === undefined) {
								for (var i = 0; i < form[n].length; i++) {
									if (form[n][i] && form[n][i].value == row[f]) form[n][i].checked = true;
								}
							} else {
								if (form[n].getAttribute('type') == 'checkbox') {
									if (form[n].value == row[f]) form[n].checked = true;
								} else {
									form[n].value = row[f];
								}
							} 
						}
					}
				} else {
					n = document.getElementById(n);
					if (n) n.innerHTML = row[f];
				}
			}
		}
		
		form.onreset = function (e) {
			Form.populate(form, row);
			return false;
		};
	}
};

var validate = function (form) {
	var errors = [];
	
	for (var i = 0, f; f = form.elements[i]; i++) {
		var valid = true;
		var value = '';
		
		if (f.getAttribute('required') !== null) {
			if (f.nodeName == 'SELECT') {
				if (f.selectedIndex <= 0) valid = false;
			} else if (f.nodeName == 'TEXTAREA') {
				value = f.value.replace(/^\s+|\s+$/g, '');
				if (!value) valid = false;
			} else {
				var type = f.getAttribute('type');
				var must_equal = f.getAttribute('must_equal');
				
				if (type == 'radio' || type == 'checkbox') {
					if (!f.checked) valid = false;
				} else {
					value = f.value;
					
					if (f.getAttribute('required') == 'phone') {
						if (!f.value.match(/^\(\d\d\d\)\s*?\d\d\d\-\d\d\d\d$/)) valid = false;
					} else if (f.getAttribute('required') == 'email') {
						if (!f.value.match(/^[\w\d.%+-]+@[\d\w.-]{2,}\.[\w]{2,4}$/)) valid = false;
					} else if (f.getAttribute('required') == 'zip') {
						if (!f.value.match(/^[\d]{5}$/)) valid = false;
					} else {
						if (!f.value) valid = false;
					}
					
					if (must_equal) {
						var must_equal_element = document.getElementById(must_equal);
						if (must_equal_element && value != must_equal_element.value) valid = false;
					}
				}
			}
		}
		
		if (!valid) {
			if (!in_array(errors, f.getAttribute('prompt'))) {
				errors.push(f.getAttribute('prompt'));
			}
			
			if (errors.length < 2) {
				f.focus();
			}
		}
	}
	
	if (errors.length) {
		alert('Please correct the following errors before submitting this form:\n\n' + errors.join('\n'));
		
		return false;
	} else {
		return true;
	}
};

var preload_images = function (paths, prefix) {
	for (var i = 0, p; p = paths[i]; i++) {
		var m = new Image();
		m.src = prefix + p;
	}	
}

var default_values = function () {
	var elements = document.getElementsByTagName('*');
	
	for (var i = 0, element; element = elements[i]; i++) {
		if (element.getAttribute('default')) {
			if (!element.value) element.value = element.getAttribute('default');
			
			Event.add(element, 'focus', function (e) {
				if (this.value == this.getAttribute('default')) this.value = '';
			});
			
			Event.add(element, 'blur', function (e) {
				if (this.value == '') this.value = this.getAttribute('default');
			});
		}
	}
};

var submit_once = function () {
	var forms = document.getElementsByTagName('form');
	
	for (var f = 0, form; form = forms[f]; f++) {
		Event.add(form, 'submit', function (e) {
			var inputs = this.getElementsByTagName('input');

			for (var i = 0, input; input = inputs[i]; i++) {
				if (input.type == 'submit' && !input.name) {
					input.disabled = true;
				}
			}
		});
	}
};

var add_to_favorites = function () {
	if (navigator.appName != 'Microsoft Internet Explorer') { 
		window.sidebar.addPanel(document.title, window.location.href, '');
	} else {
		window.external.AddFavorite(document.title, window.location.href);
	}
	
	return false;
};

var scrolling = null;

var scroll_to_top = function () {
	var start = 0;
	if (window.scrollY) start = window.scrollY;
	else if (document.documentElement.scrollTop) start = document.documentElement.scrollTop;
	else start = document.body.scrollTop;

	var distance = -start;
	var duration = 35;
	var time = 0;
	var interval = 1;

	window.clearInterval(scrolling);
	
	var scrolling = window.setInterval(function () {
		time += interval;
	
		if (time < duration) {
			window.scrollTo(0, distance / 2 * (1 - Math.cos(Math.PI * time / duration)) + start);
		} else {
			window.scrollTo(0, start + distance);
			window.clearInterval(scrolling);
			window.location.hash = '#';
		}
	}, interval);
};

var smooth_scroll = function () {
	var anchors = document.getElementsByTagName("*");
	
	for (var i = 0, anchor; anchor = anchors[i]; i++) {
		
		if (anchor.hash && anchor.hash.substring(0, 1) == '#' && anchor.hash != '#' && anchor.getAttribute('scroll') != 'false') {
			anchor.onclick = function (e) {
				var nav_link = this;
				var kch = null;
				
				if (this.hash == '#kids-club' || this.hash == '#fun-facts' || this.hash == '#kids-contests' || this.hash == '#club-events' || this.hash == '#family-activities' || this.hash == '#join-now') {
					kch = this.hash;
					nav_link = document.getElementById('nav-kids-club');
				}
				
				var previous = getElementsByClass('nav', 'active', 'a');
				
				if (!static_nav) {
					for (var i = 0; i < previous.length; i++) {
						removeClass(previous[i], 'active');
					}
				}
				
				addClass(nav_link, 'active');
				addClass('nav-' + nav_link.hash.substring(1), 'active');
				nav_link.blur();
				
				if (this.getAttribute('kids') == 'true') {
					addClass('nav-kids-club', 'active');
				}
				
				var new_hash = nav_link.hash;
				
				if (nav_link.hash.indexOf('kids') == -1) {
					removeClass('nav-kids-club-box', 'open');
				}
				
				if (nav_link.hash.indexOf('stores') == -1) {
					removeClass('store-listing', 'expanded');
				}
								
				var section = document.getElementById(nav_link.hash.substring(1));
				
				if (section) {
					var start = 0;
					if (window.scrollY) start = window.scrollY;
					else if (document.documentElement.scrollTop) start = document.documentElement.scrollTop;
					else start = document.body.scrollTop;
				
					var distance = section.offsetTop - start;
					var duration = 35;
					var time = 0;
					var interval = 1;
				
					window.clearInterval(scrolling);
				
					var scrolling = window.setInterval(function () {
						time += interval;
					
						if (time < duration) {
							window.scrollTo(0, distance / 2 * (1 - Math.cos(Math.PI * time / duration)) + start);
						} else {
							window.scrollTo(0, start + distance);
							window.clearInterval(scrolling);
							window.location.hash = new_hash;
							
							if (pageTracker) {
								pageTracker._trackPageview(kch || new_hash);
							}
						}
					}, interval);
					
					return false;
				}
			};
		}
	}
};

var send_form = function (n) {
	if (typeof n === 'string') n = document.getElementById(n);
	
	if (validate(n)) {
		n.submit();
	}
	
	return false;
};

var open_window = function (anchor) {
	window.open(anchor.href, 'popup-window', 'height=700,width=900,scrollbars=1');
	
	return false;
};

var image_enlargers = function () {
	var images = document.getElementsByTagName('img');
	
	for (var i = 0, image; image = images[i]; i++) {
		if (hasClass(image, 'enlarge')) {
			image.title = 'Click to enlarge...';
			
			Event.add(image, 'click', function (e) {
				old_scroll = current_scroll();
				//window.scrollTo(0, 0);
					
				document.getElementById('enlarge-image-overlay-wrap').style.top = old_scroll.y + 'px';
				
				document.getElementById('enlarged-image').src = this.src;
				addClass('enlarge-image-overlay', 'active');
			});
		}
	}
};

var current_scroll = function () {
	var scroll = {};
	
	if (document.all) {
		if (!document.documentElement.scrollLeft) scroll.x = document.body.scrollLeft;
		else scroll.x = document.documentElement.scrollLeft;

		if (!document.documentElement.scrollTop) scroll.y = document.body.scrollTop;
		else scroll.y = document.documentElement.scrollTop;
	} else {
		scroll.x = window.pageXOffset;
		scroll.y = window.pageYOffset;
	}
	
	return scroll;
};

var format_phone = function (input) {
	input.value = input.value.replace(/[^\d]/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3').substr(0, 14);
	return false;
};

var format_digits_only = function (input) {
	input.value = input.value.replace(/[^\d]/g, '');
	return false;
};

var old_scroll = {'x' : 0, 'y' : 0};
var static_nav = false;