/* base JavaScript file for PopTarts */
/* requires: jquery.js */

// namespace

var Kellogg = {
	debug: false, // set to true to enable console logging
	isIE: $.browser.msie
};

// page init functions

$(function () {
	var query = Kellogg.Util.query,
		log = Kellogg.Util.log,
		cookie = Kellogg.Util.cookie;
		
	// enable panel expand/collapse
	var tp = $(".togglepanel").click(function (e) {
		var $this = $(this),
			$p = $this.parent(),
			openpanels = [];
			
		$this[0].blur();
		e.preventDefault();
			
		// toggle selected panel	
		if ($p.hasClass("open")) {
			$p.removeClass("open").addClass("closed");
		} else {
			$p.removeClass("closed").addClass("open");
		}
		
		// persist panel state in a cookie
		$("#sidebar .open").each(function () {
			openpanels.push($(this).attr("id"));
		});
		cookie("openpanels", openpanels.join("|"), {path: "/", expires: 365})
	});
	
	if ($.browser.msie) {
		tp.css({opacity: 0, backgroundColor: "#fff"}); // IE requires a bgcolor to make the link work ?!?
	}
	
	// restore panel state from cookie
	if (cookie("openpanels")) {
		$.each(cookie("openpanels").split("|"), function (i, v) {
			$("#" + v + " .togglepanel").trigger("click");
		});
	}
	
	// enable rollover highlights
	$("div.item")
		.find("span.highlight")
			.css("opacity", 0.5)
		.end()
		.find("a")
			.hover(function () {
				$(this).parents(".item").find("a").addClass("hover");
			}, function () {
				$(this).parents(".item").find("a").removeClass("hover");
			});
		
	// enable flyout panels
	var panelcontainer = $("#wrapper-content");
	
	try {
		new Kellogg.FlyoutPanel({
			panel: $("#banner"),
			opener: $("#showbanner"),
			closer: $("#banner .close"),
			container: panelcontainer,
			openercanclose: true,
			speed: 500,
			overlap: 3,
			onopencallback: function () {
				$.scrollTo(0, 500);
				Kellogg.track("SideBannerExpand:Clicked", "SideBannerExpand:Clicked");
			},
			onclosecallback: function () {
				$("#showbanner").removeClass("on");
				Kellogg.track("SideBannerCollapse:Clicked", "SideBannerCollapse:Clicked");
			}
		});
	} catch (err) {}
	
	try {
		new Kellogg.FlyoutPanel({
			panel: $("#marketpanel"),
			opener: $(".market-download"),
			closer: $("#marketpanel .close"),
			followhref: true,
			container: panelcontainer,
			speed: 500,
			overlap: 6,
			onclosecallback: function () {
				var i = $("#marketpanel iframe");
				i.attr("src", "about:blank");
			}
		});
	} catch (err) {}
	
	$("#logo_pt").bind("click", function () {
		Kellogg.FlyoutPanel.open("banner");
	});
		
	try {
		new Kellogg.FlyoutPanel({
			panel: $("#stafpanel"),
			opener: $("#sendfriend"),
			closer: $("#stafpanel .close"),
			container: panelcontainer,
			speed: 500,
			overlap: 6,
			onopencallback: function () {
				$.scrollTo(0, 500);
				$("#stfflash")[0].resetForm();
				$("#sendfriend").addClass("on");
			},
			onclosecallback: function () {
				$("#sendfriend").removeClass("on");
			}
		});
	} catch (err) {}
		
});

// animation methods

Kellogg.swapBackground = function (c) { // static public method can be called from Flash
	//$("#wrapper-inner")[0].className = c; DISABLED
};

Kellogg.setBackground = function () {
	$("html")[0].className = "js " + Kellogg.Util.cookie("background");
};

Kellogg.setAvatar = function () {
	$("#panel_userpoints .panelitems img").attr("alt", "")[0].src = "images/assets/avatars/" + Kellogg.Util.cookie("avatar") + "_small.png";
};

Kellogg.scrollHandler = function (el, parent, top) {
	var h = Kellogg.Util.getViewportSize().y,
		scrolly = Kellogg.Util.getScrollOffset().y,
		height = el[0].offsetHeight,
		parentheight = parent[0].offsetHeight,
		newtop;
		
	if (parentheight < top + height + scrolly) {
		newtop =  top + scrolly + (parentheight - (top + height + scrolly));
	} else {
		newtop = top + scrolly;
	}
	
	el.stop();
	el.animate({top: newtop + "px"}, 600, "easeOutExpo");
};

Kellogg.FlyoutPanel = function (options) {
	this.panel = options.panel;
	this.opener = options.opener;
	this.closer = options.closer;
	this.followhref = options.followhref || false;
	this.container = options.container;
	this.openercanclose = options.openercanclose || false;
	this.speed = options.speed;
	this.overlap = options.overlap || 0;
	this.onopencallback = options.onopencallback;
	this.onclosecallback = options.onclosecallback;
	this.width = this.panel[0].offsetWidth;
	this.containerwidth = this.container[0].offsetWidth;
	this.left = this.panel.css("left");
	this.showleft = "-" + this.overlap + "px";
	this.hideleft = "-" + this.width + "px";
	if (parseInt(this.left, 10)  > 0) { // positive left coordinate means panel flies out from right side
		this.showleft = (this.containerwidth - this.width + this.overlap) + "px";
		this.hideleft = this.containerwidth + "px";
	}
	this.showing = false;
	
	var that = this;
	
	this.opener.click(function (e) {
		if (that.openercanclose || !that.showing) {
			that.toggle();
		}
		this.blur();
		if (!that.followhref) {
			e.preventDefault();
		}
	});
	
	this.closer.click(function (e) {
		if (that.showing) {
			that.toggle();
		}
		this.blur();
		e.preventDefault();
	});
	
	Kellogg.FlyoutPanel.panels.push(this);
};

Kellogg.FlyoutPanel.prototype.toggle = function (shallow) {
	var that = this;
	
	if (!shallow) { // prevent infinite recursion
		// if another flyout is open, close it
		$.each(Kellogg.FlyoutPanel.panels, function (i, v) {
			if (v.panel != that.panel && v.showing) {
				v.toggle(true);
				return false;
			}
		});
	}		

	if(!this.showing) {
		this.panel.stop().animate({left: this.showleft}, this.speed, this.onopencallback);
		this.showing = true;
	} else {
		this.panel.stop().animate({left: this.hideleft}, this.speed, this.onclosecallback);
		this.showing = false;
	}
};

Kellogg.FlyoutPanel.panels = []; // static property

Kellogg.FlyoutPanel.toggle = function (id) { // static public method can be called from Flash
	$.each(Kellogg.FlyoutPanel.panels, function (i, v) {
		if (v.panel.attr("id") === id) {
			v.toggle();
			return false;
		}
	});
};

Kellogg.FlyoutPanel.open = function (id) { // static public method can be called from Flash
	$.each(Kellogg.FlyoutPanel.panels, function (i, v) {
		if (v.panel.attr("id") === id && !v.showing) {
			v.toggle();
			return false;
		}
	});
};

Kellogg.FlyoutPanel.close = function (id) { // static public method can be called from Flash
	$.each(Kellogg.FlyoutPanel.panels, function (i, v) {
		if (v.panel.attr("id") === id && v.showing) {
			v.toggle();
			return false;
		}
	});
};

Kellogg.FlyoutPanel.closeAll = function () { // static public method can be called from Flash
	$.each(Kellogg.FlyoutPanel.panels, function (i, v) {
		if (v.showing) {
			v.toggle();
			return false;
		}
	});
};

// tracking functions

Kellogg.trackers = [];

Kellogg.track = function (sPageName, sPageTitle, sContentCat) {
	
	sPageName = Kellogg.Util.stripTags(sPageName);
	sPageTitle = Kellogg.Util.stripTags(sPageTitle); // DEPRACATED 1/6/09
	sContentCat = Kellogg.Util.stripTags(sContentCat); // DEPRACATED 1/6/09
	
	//trackMTC(sPageName, sPageTitle, sContentCat); // DISABLED 1/6/09
	trackGA(sPageName);
	
	// manticore DEPRACATED 1/6/09
	function trackMTC (sPageName, sPageTitle, sContentCat) {
		if (typeof mtcGO == "function") {
			Kellogg.Util.log('track.mtc', arguments);
			mtcSetPageTitle(sPageTitle);
			mtcSetAbsolutePageName(sPageName);
			sTMContentCategory = (typeof sContentCat != "undefined") ? sContentCat : "";
			mtcGO();
		} else {
			Kellogg.Util.log('waiting - track.mtc', arguments);
			setTimeout(function () {
				trackMTC(sPageTitle, sPageName, sContentCat);
			}, 200);
		}
	}
	
	
	// google
	function trackGA (str) {
		str = stringToPath(str);
		Kellogg.Util.log('track.ga', str);
		for (var i = 0, l = Kellogg.trackers.length; i < l; i++) {
			if (typeof Kellogg.trackers[i]._trackPageview === "function") {
				if (str) {
					Kellogg.trackers[i]._trackPageview(str);
				} else {
					Kellogg.trackers[i]._trackPageview();
				}
			}
		}
	}
	
	function stringToPath (s) {
		return (s) ? escape("/" + s.replace(/[\s\/]/g, "-").replace(/[\:\[\]]/g, "/").replace(/\/\//g, "/")) : s; // TODO: optimize regexes
	}
};

// "favorites" functions

Kellogg.addRemove = function (id, action, callback) {
	$.ajax({
		cache: false,
		data: {
			"id": id,
			"action": action
		},
		url: "AddRemoveStuff.aspx",
		error: ajaxError,
		success: function (data, status) {
			Kellogg.Util.log(id, action, data, status);
			if (data !== "true" || status !== "success") {
				ajaxError();
			} else {
				if (typeof callback === "function") {
					callback();
				}
			}
		}
	});
	
	function ajaxError() {
		alert("Unable to process your request due to a server error. Please try again later.");
	};
};

Kellogg.itemInFavorites = function (id) {
	var result = false,
		favorites = Kellogg.Util.cookie("favorites");
	
	if (favorites) {
		favorites = favorites.split(",");
		$.each(favorites, function (i, val) {
			if (val && val === id) {
				result = true;
				return false;
			}
		});
	}
	
	return result;
};

// utility methods

Kellogg.Util = {
	
	log: function () {
		if (Kellogg.debug || window.location.hash === "#debug") {
			try {
				if (typeof loadFirebugConsole === "function" && typeof console === "undefined") {
					window.loadFirebugConsole();
				}
				console.log(arguments);
			} catch (err) {}
		}
	},
	
	stripTags: function (s) {
		return (s) ? s.replace(/<[^>]+>/g, "") : s;
	},
	
	query: (function () {
		var qString, queryStart, query, parts, bits, subbits, returnVals = {};
		qString = window.location.toString();
		queryStart = qString.indexOf('?');
		if (queryStart==-1) {
			return returnVals;
		}
		query = qString.substring(queryStart + 1, qString.length);
		parts = query.split("&");
		for (var i=0; i<parts.length; i++) {
			bits = parts[i].split("=");
			if (bits[1]) {
				subbits = bits[1].split("#");
				returnVals[bits[0].toLowerCase()] = subbits[0]; // query properties are lowercase!
			}
		}
		return returnVals;
	}) (), // self-invoking!
	
	cookie: function (name, value, options) { // adapted from http://www.stilbuero.de/2006/09/17/cookie-plugin-for-jquery/
	    if (typeof value != 'undefined') { // name and value given, set cookie
	        options = options || {};
	        if (value === null) {
	            value = '';
	            options.expires = -1;
	        }
	        var expires = '';
	        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
	            var date;
	            if (typeof options.expires == 'number') {
	                date = new Date();
	                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
	            } else {
	                date = options.expires;
	            }
	            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
	        }
	        var path = options.path ? '; path=' + options.path : '';
	        var domain = options.domain ? '; domain=' + options.domain : '';
	        var secure = options.secure ? '; secure' : '';
	        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
	    } else { // only name given, get cookie
	        var cookieValue = null;
	        if (document.cookie && document.cookie !== '') {
	            var cookies = document.cookie.split(';');
	            for (var i = 0, l = cookies.length; i < l; i++) {
	                var cookie = cookies[i].replace(/^\s+|\s+$/g, "");
	                // Does this cookie string begin with the name we want?
	                if (cookie.substring(0, name.length + 1) == (name + '=')) {
	                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
	                    break;
	                }
	            }
	        }
	        return cookieValue;
	    }
	},
	
	getPageSize: function () {
		var x = Math.max(document.documentElement.scrollWidth || document.body.scrollWidth, document.body.offsetWidth);
		var y = Math.max(document.documentElement.scrollHeight || document.body.scrollHeight, document.body.offsetHeight);
		return {"x": x, "y": y};
	},
	
	getViewportSize: function () {
		var x = self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
		var y = self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
		return {"x": x, "y": y};
	},
	
	getScrollOffset: function () {
		var x = self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
		var y = self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
		return {"x": x, "y": y};
	}, 
	
	getElemPosition: function (el) {
		var x = 0, y = 0;
		if (el.offsetParent) {
			do {
				x += el.offsetLeft;
				y += el.offsetTop;
			} while (el = el.offsetParent);
		}
		return {"x": x, "y": y};
	},
	
	highlight: function (el, classname) {
		classname = classname || "highlight";
		el.toggleClass(classname);
		return el; // chainable
	},
	
	popup: function(URL,windowName,width,height) {
		var w = screen.availWidth;
		var h = screen.availHeight;
		var leftPos = Math.round((w-width)/2);
		var topPos = Math.round((h-height)/2);
		var defaults = "scrollbars, resizable";
		var centerOnScreen = "top="+topPos+", left="+leftPos+", width="+width+", height="+height;
		var options = centerOnScreen + " ," + defaults;
		var msgWindow = window.open(URL,windowName,options);
		if(!msgWindow) {
			return false;
		} else {
			msgWindow.creator=self;
			msgWindow.focus();
		}
	  return true;
	}
	
};

// set page background
if (Kellogg.Util.cookie("background")) {
	Kellogg.setBackground();
}

// legacy functions

var createCookie = readCookie = Kellogg.Util.cookie;

var MonitorFlash = function(sPageName, sPageTitle, sContentCat) {
    Kellogg.track(sPageName, sPageTitle, sContentCat);
};

// enable styles for js-enabled browsers
if(document.getElementById && document.createTextNode) {
	$("html").addClass("js");
};
 
// prevent background image flicker in IE
try {
	document.execCommand("BackgroundImageCache", false, true);
} catch(err) {};


// jQuery plugins

// from http://gsgd.co.uk/sandbox/jquery/easing/
jQuery.extend( jQuery.easing, {
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	}
});

/**
 *
 * Copyright (c) 2007 Tom Deater (http://www.tomdeater.com)
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 * 
 */
 
(function($) {
	/**
	 * equalizes the heights of all elements in a jQuery collection
	 * thanks to John Resig for optimizing this!
	 * usage: $("#col1, #col2, #col3").equalizeCols();
	 */
	 
	$.fn.equalizeCols = function(){
		var height = 0,
			reset = $.browser.msie ? "1%" : "auto";
  
		return this
			.css("height", reset)
			.each(function() {
				height = Math.max(height, this.offsetHeight);
			})
			.css("height", height)
			.each(function() {
				var h = this.offsetHeight;
				if (h > height) {
					$(this).css("height", height - (h - height));
				};
			});
			
	};
	
})(jQuery);

/**
 *
 * Copyright (c) 2008 Tom Deater (http://www.tomdeater.com)
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * uses an iframe, sized in ems, to detect font size changes then trigger a "fontresize" event
 * heavily based on code by Hedger Wang: http://www.hedgerwow.com/360/dhtml/js-onfontresize.html
 *
 * "fontresize" event is triggered on the document object
 * subscribe to event using: $(document).bind("fontresize", function (event, data) {});
 * "data" contains the current size of 1 em unit (in pixels)
 * 
 */
 
jQuery.onFontResize = (function ($) {
	// initialize
	$(document).ready(function () {
		var $resizeframe = $("<iframe />")
			.attr("id", "frame-onFontResize" + Date.parse(new Date))
			.css({width: "100em", height: "10px", position: "absolute", borderWidth: 0, top: "-5000px", left: "-5000px"})
			.appendTo("body");
			
		if ($.browser.msie) {
			// use IE's native iframe resize event
			$resizeframe.bind("resize", function () {
				$.onFontResize.trigger($resizeframe[0].offsetWidth / 100);
			});
		} else {
			// everyone else uses script inside the iframe to detect resize
			var doc = $resizeframe[0].contentWindow || $resizeframe[0].contentDocument || $resizeframe[0].document;
			doc = doc.document || doc; 
			doc.open();
			doc.write('<div id="em" style="width:100em;height:10px;"></div>');
			doc.write('<scri' + 'pt>window.onload = function(){var em = document.getElementById("em");window.onresize = function(){if(parent.jQuery.onFontResize){parent.jQuery.onFontResize.trigger(em.offsetWidth / 100);}}};</scri' + 'pt>');
			doc.close();
		}
	});
	
	return {
		// public method, so it can be called from within the iframe
		trigger: function (em) {
			$(document).trigger("fontresize", [em]);
		}
	};
}) (jQuery);

/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Date: 2/19/2008
 * @author Ariel Flesler
 * @version 1.3.3
 */
;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);