/*	SWFObject v2.0 <http://code.google.com/p/swfobject/>
	Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/
var swfobject=function(){var Z="undefined",P="object",B="Shockwave Flash",h="ShockwaveFlash.ShockwaveFlash",W="application/x-shockwave-flash",K="SWFObjectExprInst",G=window,g=document,N=navigator,f=[],H=[],Q=null,L=null,T=null,S=false,C=false;var a=function(){var l=typeof g.getElementById!=Z&&typeof g.getElementsByTagName!=Z&&typeof g.createElement!=Z&&typeof g.appendChild!=Z&&typeof g.replaceChild!=Z&&typeof g.removeChild!=Z&&typeof g.cloneNode!=Z,t=[0,0,0],n=null;if(typeof N.plugins!=Z&&typeof N.plugins[B]==P){n=N.plugins[B].description;if(n){n=n.replace(/^.*\s+(\S+\s+\S+$)/,"$1");t[0]=parseInt(n.replace(/^(.*)\..*$/,"$1"),10);t[1]=parseInt(n.replace(/^.*\.(.*)\s.*$/,"$1"),10);t[2]=/r/.test(n)?parseInt(n.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof G.ActiveXObject!=Z){var o=null,s=false;try{o=new ActiveXObject(h+".7")}catch(k){try{o=new ActiveXObject(h+".6");t=[6,0,21];o.AllowScriptAccess="always"}catch(k){if(t[0]==6){s=true}}if(!s){try{o=new ActiveXObject(h)}catch(k){}}}if(!s&&o){try{n=o.GetVariable("$version");if(n){n=n.split(" ")[1].split(",");t=[parseInt(n[0],10),parseInt(n[1],10),parseInt(n[2],10)]}}catch(k){}}}}var v=N.userAgent.toLowerCase(),j=N.platform.toLowerCase(),r=/webkit/.test(v)?parseFloat(v.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,i=false,q=j?/win/.test(j):/win/.test(v),m=j?/mac/.test(j):/mac/.test(v);/*@cc_on i=true;@if(@_win32)q=true;@elif(@_mac)m=true;@end@*/return{w3cdom:l,pv:t,webkit:r,ie:i,win:q,mac:m}}();var e=function(){if(!a.w3cdom){return }J(I);if(a.ie&&a.win){try{g.write("<script id=__ie_ondomload defer=true src=//:><\/script>");var i=c("__ie_ondomload");if(i){i.onreadystatechange=function(){if(this.readyState=="complete"){this.parentNode.removeChild(this);V()}}}}catch(j){}}if(a.webkit&&typeof g.readyState!=Z){Q=setInterval(function(){if(/loaded|complete/.test(g.readyState)){V()}},10)}if(typeof g.addEventListener!=Z){g.addEventListener("DOMContentLoaded",V,null)}M(V)}();function V(){if(S){return }if(a.ie&&a.win){var m=Y("span");try{var l=g.getElementsByTagName("body")[0].appendChild(m);l.parentNode.removeChild(l)}catch(n){return }}S=true;if(Q){clearInterval(Q);Q=null}var j=f.length;for(var k=0;k<j;k++){f[k]()}}function J(i){if(S){i()}else{f[f.length]=i}}function M(j){if(typeof G.addEventListener!=Z){G.addEventListener("load",j,false)}else{if(typeof g.addEventListener!=Z){g.addEventListener("load",j,false)}else{if(typeof G.attachEvent!=Z){G.attachEvent("onload",j)}else{if(typeof G.onload=="function"){var i=G.onload;G.onload=function(){i();j()}}else{G.onload=j}}}}}function I(){var l=H.length;for(var j=0;j<l;j++){var m=H[j].id;if(a.pv[0]>0){var k=c(m);if(k){H[j].width=k.getAttribute("width")?k.getAttribute("width"):"0";H[j].height=k.getAttribute("height")?k.getAttribute("height"):"0";if(O(H[j].swfVersion)){if(a.webkit&&a.webkit<312){U(k)}X(m,true)}else{if(H[j].expressInstall&&!C&&O("6.0.65")&&(a.win||a.mac)){D(H[j])}else{d(k)}}}}else{X(m,true)}}}function U(m){var k=m.getElementsByTagName(P)[0];if(k){var p=Y("embed"),r=k.attributes;if(r){var o=r.length;for(var n=0;n<o;n++){if(r[n].nodeName.toLowerCase()=="data"){p.setAttribute("src",r[n].nodeValue)}else{p.setAttribute(r[n].nodeName,r[n].nodeValue)}}}var q=k.childNodes;if(q){var s=q.length;for(var l=0;l<s;l++){if(q[l].nodeType==1&&q[l].nodeName.toLowerCase()=="param"){p.setAttribute(q[l].getAttribute("name"),q[l].getAttribute("value"))}}}m.parentNode.replaceChild(p,m)}}function F(i){if(a.ie&&a.win&&O("8.0.0")){G.attachEvent("onunload",function(){var k=c(i);if(k){for(var j in k){if(typeof k[j]=="function"){k[j]=function(){}}}k.parentNode.removeChild(k)}})}}function D(j){C=true;var o=c(j.id);if(o){if(j.altContentId){var l=c(j.altContentId);if(l){L=l;T=j.altContentId}}else{L=b(o)}if(!(/%$/.test(j.width))&&parseInt(j.width,10)<310){j.width="310"}if(!(/%$/.test(j.height))&&parseInt(j.height,10)<137){j.height="137"}g.title=g.title.slice(0,47)+" - Flash Player Installation";var n=a.ie&&a.win?"ActiveX":"PlugIn",k=g.title,m="MMredirectURL="+G.location+"&MMplayerType="+n+"&MMdoctitle="+k,p=j.id;if(a.ie&&a.win&&o.readyState!=4){var i=Y("div");p+="SWFObjectNew";i.setAttribute("id",p);o.parentNode.insertBefore(i,o);o.style.display="none";G.attachEvent("onload",function(){o.parentNode.removeChild(o)})}R({data:j.expressInstall,id:K,width:j.width,height:j.height},{flashvars:m},p)}}function d(j){if(a.ie&&a.win&&j.readyState!=4){var i=Y("div");j.parentNode.insertBefore(i,j);i.parentNode.replaceChild(b(j),i);j.style.display="none";G.attachEvent("onload",function(){j.parentNode.removeChild(j)})}else{j.parentNode.replaceChild(b(j),j)}}function b(n){var m=Y("div");if(a.win&&a.ie){m.innerHTML=n.innerHTML}else{var k=n.getElementsByTagName(P)[0];if(k){var o=k.childNodes;if(o){var j=o.length;for(var l=0;l<j;l++){if(!(o[l].nodeType==1&&o[l].nodeName.toLowerCase()=="param")&&!(o[l].nodeType==8)){m.appendChild(o[l].cloneNode(true))}}}}}return m}function R(AE,AC,q){var p,t=c(q);if(typeof AE.id==Z){AE.id=q}if(a.ie&&a.win){var AD="";for(var z in AE){if(AE[z]!=Object.prototype[z]){if(z=="data"){AC.movie=AE[z]}else{if(z.toLowerCase()=="styleclass"){AD+=' class="'+AE[z]+'"'}else{if(z!="classid"){AD+=" "+z+'="'+AE[z]+'"'}}}}}var AB="";for(var y in AC){if(AC[y]!=Object.prototype[y]){AB+='<param name="'+y+'" value="'+AC[y]+'" />'}}t.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AD+">"+AB+"</object>";F(AE.id);p=c(AE.id)}else{if(a.webkit&&a.webkit<312){var AA=Y("embed");AA.setAttribute("type",W);for(var x in AE){if(AE[x]!=Object.prototype[x]){if(x=="data"){AA.setAttribute("src",AE[x])}else{if(x.toLowerCase()=="styleclass"){AA.setAttribute("class",AE[x])}else{if(x!="classid"){AA.setAttribute(x,AE[x])}}}}}for(var w in AC){if(AC[w]!=Object.prototype[w]){if(w!="movie"){AA.setAttribute(w,AC[w])}}}t.parentNode.replaceChild(AA,t);p=AA}else{var s=Y(P);s.setAttribute("type",W);for(var v in AE){if(AE[v]!=Object.prototype[v]){if(v.toLowerCase()=="styleclass"){s.setAttribute("class",AE[v])}else{if(v!="classid"){s.setAttribute(v,AE[v])}}}}for(var u in AC){if(AC[u]!=Object.prototype[u]&&u!="movie"){E(s,u,AC[u])}}t.parentNode.replaceChild(s,t);p=s}}return p}function E(k,i,j){var l=Y("param");l.setAttribute("name",i);l.setAttribute("value",j);k.appendChild(l)}function c(i){return g.getElementById(i)}function Y(i){return g.createElement(i)}function O(k){var j=a.pv,i=k.split(".");i[0]=parseInt(i[0],10);i[1]=parseInt(i[1],10);i[2]=parseInt(i[2],10);return(j[0]>i[0]||(j[0]==i[0]&&j[1]>i[1])||(j[0]==i[0]&&j[1]==i[1]&&j[2]>=i[2]))?true:false}function A(m,j){if(a.ie&&a.mac){return }var l=g.getElementsByTagName("head")[0],k=Y("style");k.setAttribute("type","text/css");k.setAttribute("media","screen");if(!(a.ie&&a.win)&&typeof g.createTextNode!=Z){k.appendChild(g.createTextNode(m+" {"+j+"}"))}l.appendChild(k);if(a.ie&&a.win&&typeof g.styleSheets!=Z&&g.styleSheets.length>0){var i=g.styleSheets[g.styleSheets.length-1];if(typeof i.addRule==P){i.addRule(m,j)}}}function X(k,i){var j=i?"visible":"hidden";if(S){c(k).style.visibility=j}else{A("#"+k,"visibility:"+j)}}return{registerObject:function(l,i,k){if(!a.w3cdom||!l||!i){return }var j={};j.id=l;j.swfVersion=i;j.expressInstall=k?k:false;H[H.length]=j;X(l,false)},getObjectById:function(l){var i=null;if(a.w3cdom&&S){var j=c(l);if(j){var k=j.getElementsByTagName(P)[0];if(!k||(k&&typeof j.SetVariable!=Z)){i=j}else{if(typeof k.SetVariable!=Z){i=k}}}}return i},embedSWF:function(n,u,r,t,j,m,k,p,s){if(!a.w3cdom||!n||!u||!r||!t||!j){return }r+="";t+="";if(O(j)){X(u,false);var q=(typeof s==P)?s:{};q.data=n;q.width=r;q.height=t;var o=(typeof p==P)?p:{};if(typeof k==P){for(var l in k){if(k[l]!=Object.prototype[l]){if(typeof o.flashvars!=Z){o.flashvars+="&"+l+"="+k[l]}else{o.flashvars=l+"="+k[l]}}}}J(function(){R(q,o,u);if(q.id==u){X(u,true)}})}else{if(m&&!C&&O("6.0.65")&&(a.win||a.mac)){X(u,false);J(function(){var i={};i.id=i.altContentId=u;i.width=r;i.height=t;i.expressInstall=m;D(i)})}}},getFlashPlayerVersion:function(){return{major:a.pv[0],minor:a.pv[1],release:a.pv[2]}},hasFlashPlayerVersion:O,createSWF:function(k,j,i){if(a.w3cdom&&S){return R(k,j,i)}else{return undefined}},createCSS:function(j,i){if(a.w3cdom){A(j,i)}},addDomLoadEvent:J,addLoadEvent:M,getQueryParamValue:function(m){var l=g.location.search||g.location.hash;if(m==null){return l}if(l){var k=l.substring(1).split("&");for(var j=0;j<k.length;j++){if(k[j].substring(0,k[j].indexOf("="))==m){return k[j].substring((k[j].indexOf("=")+1))}}}return""},expressInstallCallback:function(){if(C&&L){var i=c(K);if(i){i.parentNode.replaceChild(L,i);if(T){X(T,true);if(a.ie&&a.win){L.style.display="block"}}L=null;T=null;C=false}}}}}();




var $arrayize = function(args) {
	var len = args.length, array = [];
	array.length = len;
	while (len--) {
		array[len] = args[len];
	}
	return array;
};


var $purge = function(el) {
	return YAHOO.util.Event.purgeElement(el);
};


if (!window.console) {
	window.console = {
		log: function() {},
		info: function() {}
	};
}


if (!Function.prototype.bind) {
	Function.prototype.bind = function(context) {
		var fn = this, args = $arrayize(arguments);
		args.shift();
		return function() {
			return fn.apply(context, args.concat($arrayize(arguments)));
		};
	};
}


if (!Array.prototype.each) {
	Array.prototype.each = function(fn, context) {
		if (typeof fn !== 'function') {
			throw new TypeError();
		}
		if (context) {
			fn = fn.bind(context);
		}
		for (var i = 0, j = this.length; i < j; i++) {
			fn(this[i], i, this);
		}
		return this;
	};
}


if (!String.prototype.trim) {
	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g, '');
	};
}


if (!Date.prototype.toUnixTimestamp) {
	Date.prototype.toUnixTimestamp = function() {
		return Math.floor(parseInt(this.getTime(), 10) / 1000);
	};
}


if (!Date.prototype.precedes) {
	Date.prototype.precedes = function(other) {
		if (other.constructor !== Date) {
			throw new TypeError('Supplied param must be a Date instance');
		}
		return this.toUnixTimestamp() < other.toUnixTimestamp();
	};
}




/*
 * Metadata - Quietly extract JSON metadata contained within DOM elements
 *
 * @namespace YAHOO.plugin
 * @module metadata
 *
 * Copyright (c) 2006 John Resig, Yehuda Katz, Jorn Zaefferer, Paul McLanahan
 *
 * Ported to YUI from jQuery by tszming (tszming@gmail.com)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */
YAHOO.namespace('plugin');

YAHOO.plugin.Metadata = {

    cache: {},

    defaults: {
        type: 'class',
        name: 'metadata',
        cre: /({.*})/,
        single: 'metadata'
    },

    setType: function(type, name) {
        this.defaults.type = type;
        this.defaults.name = name;
    },

    get: function(elem, opts) {

        var settings = this.defaults;
        opts = opts || {};
        if ('undefined' !== typeof opts.type) settings.type = opts.type;
        if ('undefined' !== typeof opts.name) settings.name = opts.name;

        // check for empty string in single property
        if (!settings.single.length) settings.single = 'metadata';

        var elemId = YAHOO.util.Dom.generateId(elem);
        if ('undefined' === typeof this.cache[elemId]) this.cache[elemId] = {};
        var data = this.cache[elemId][settings.single];

        // returned cached data if it already exists
        if (data) return data;

        data = '{}';

        if (settings.type == 'class') {
            var m = settings.cre.exec(elem.className);
            if (m) data = m[1];
        } else if (settings.type == 'elem') {
            if (!elem.getElementsByTagName) return;
            var e = elem.getElementsByTagName(settings.name);
            if (e.length) data = YAHOO.lang.trim(e[0].innerHTML);
        } else if (elem.getAttribute != undefined) {
            var attr = elem.getAttribute(settings.name);
            if (attr) data = attr;
        }

        if (data.indexOf('{') < 0) data = '{' + data + '}';

        data = eval('(' + data + ')');

        this.cache[elemId][settings.single] = data;

        return data;
    }
};

YAHOO.register('YAHOO.plugin.Metadata', YAHOO.plugin.Metadata, {version: '2.0', build: '2'});

/* images swap */

/**
 * SwapImage - YUI plugin for swapping image(s)
 *
 * Copyright (c) 2009 tszming (tszming@gmail.com)
 *
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 * Enable image swapping, requires metadata plugin.
 *
 * @example YAHOO.plugin.SwapImage.bind(".swapImage");
 * @desc Enable image swapping for all images with CSS class name equal to "swapImage", e.g.
 *	<img class="swapImage {src: 'images/new.gif'}" src="images/old.gif" />
 *
 * All you need is to call the YAHOO.plugin.SwapImage.bind method, which contains the
 * parameters: (i, preload, repeat, swapInEvent, swapOutEvent)
 *
 * @param i Images to be selected.
 * @param preload Preload the image, default = true.
 * @param repeat Repeat the effect, default = true.
 * @param swapInEvent Event for swap In.
 * @param swapOutEvent Event for swap Out.
 *
 * @version 1.0.4
 */

(function() {

    var dom = YAHOO.util.Dom;
    var metadata = YAHOO.plugin.Metadata;

    YAHOO.namespace('plugin');

    YAHOO.plugin.SwapImage = {

        files: {},

        data: {},

        init: function() {
            var id = dom.generateId(this);
            var mdata = metadata.get(this);

            swapImage.data[id] = swapImage.data[id] || {};
            if (typeof mdata.src != "undefined") {
                swapImage.data[id]["src"] = mdata.src;
                swapImage.files[mdata.src] = false;
            }

            swapImage._each(swapImage._grep([[mdata.sin, "sin"], [mdata.sout, "sout"]],
            function(n) {
                return (typeof n[0] != "undefined" && n[0].length > 0);
            }),
            function() {
                var arr = this[0];
                var vname = this[1];
                for (var i = 0; i < arr.length; i++) {
                    var idx = mdata[vname][i].indexOf(":");
                    var selection = mdata[vname][i].substring(0, idx);
                    var file = mdata[vname][i].substring(idx + 1);
                    swapImage.data[id][vname] = swapImage.data[id][vname] || [];
                    if (idx > 1) {
                        swapImage.data[id][vname].push([selection, file]);
                        swapImage.files[file] = false;
                    } else {
                        swapImage.data[id][vname].push([file]);
                    }
                }
            });
        },

        preload: function() {
            swapImage._each(swapImage.files,
            function(k, v) {
                if (v == false) {
                    swapImage.files[k] = true;
                    var img = new Image();
                    img.src = k;
                }
            });
        },

        swapIn: function() {
            swapImage.swap(this, "sin");
        },

        swapOut: function() {
            swapImage.swap(this, "sout");
        },

        swap: function(obj, a) {
            var id = dom.generateId(obj);
            if (typeof swapImage.data[id][a] != "undefined") {
                for (var i = 0; i < swapImage.data[id][a].length; i++) {
                    var s = YAHOO.util.Selector.query(swapImage.data[id][a][i][0]);
                    if (swapImage.data[id][a][i].length > 1) {
                        swapImage._each(s,
                        function() {
                            this.src = swapImage.data[id][a][i][1];
                        });
                    } else {
                        swapImage._each(s, swapImage._swap);
                    }
                }
            } else {
                swapImage._swap.call(obj);
            }
        },

        _swap: function() {
            var id = dom.generateId(this);
            var data = swapImage.data[id];
            if (typeof data.src != "undefined") {
                var tmp = data.src;
                data.src = this.src;
                this.src = tmp;
            }
        },

        // From jQuery
        _each: function(object, callback) {
            var name, i = 0, length = object.length;
            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]) {}
            }
        },

        // From jQuery
        _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;
        },

        bind: function(i, preload, repeat, swapInEvent, swapOutEvent) {

            YAHOO.util.Event.onDOMReady(function() {

                if (typeof repeat == "undefined") {
                    repeat = true;
                }

                if (typeof preload == "undefined") {
                    preload = true;
                }

                var elem = YAHOO.util.Selector.query(i);
                swapImage._each(elem, swapImage.init);

                if (typeof swapInEvent == "undefined" && typeof swapInEvent == "undefined") {
                    swapInEvent = "mouseover";
                    swapOutEvent = "mouseout";
                }

                if (repeat) {
                    if (typeof swapOutEvent != "undefined") {
                        YAHOO.util.Event.addListener(elem, swapInEvent, swapImage.swapIn);
                        YAHOO.util.Event.addListener(elem, swapOutEvent, swapImage.swapOut);
                    } else {
                        YAHOO.util.Event.addListener(elem, swapInEvent, swapImage.swapIn);
                    }
                } else {
                    YAHOO.util.Event.addListener(elem, swapInEvent,
                    function() {
                        swapImage.swapIn.call(this);
                        YAHOO.util.Event.removeListener(elem, swapInEvent, null);
                    });
                }

                if (preload) {
                    swapImage._each(elem, swapImage.preload);
                }

            });
        }
    };

    var swapImage = YAHOO.plugin.SwapImage;

    YAHOO.register('YAHOO.plugin.SwapImage', YAHOO.plugin.SwapImage, {version: '1.0', build: '4'});
		YAHOO.plugin.SwapImage.bind(".swapImageDisjoint");
		
})();



// Outspark global namespace
var OSK = OSK || {};


OSK.fakeUUID = function() {
	var s = function() {
		return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
	};
	return (s()+s()+'-'+s()+'-'+s()+'-'+s()+'-'+s()+s()+s());
};


OSK.getMouseCoordinates = function(evt) {
	var evt = evt || window.event || false;
	var coordinates = false;
	if (evt) {
		if (evt.pageX || evt.pageY) {
			coordinates = {
				x: evt.pageX,
				y: evt.pageY
			};
		}
		else if (evt.clientX || evt.clientY) {
			coordinates = {
				x: evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
				y: evt.clientY + document.body.scrollTop + document.documentElement.scrollTop
			};
		}
	}
	return coordinates;
};


OSK.redirect = function(url) {
	window.location.replace(url);
	return false;
};


OSK.charCodes = {
	ENTER: 13,
	TAB: 9,
	BACKSPACE: 8,
	ESCAPE: 27,
	SPACEBAR: 32,
	LEFT_ARROW: 37,
	UP_ARROW: 38,
	RIGHT_ARROW: 39,
	DOWN_ARROW: 40
};


(function() {


	var YUE = YAHOO.util.Event;
	var YUD = YAHOO.util.Dom;
	var YUA = YAHOO.util.Anim;
	var YUC = YAHOO.util.Connect;
	var YUCK = YAHOO.util.Cookie;
	var YLJ = YAHOO.lang.JSON;
	var MSIE = 'attachEvent' in window;


	var $ = function(id) {
		return YUD.get(id);
	};


	OSK.portal = {};


	OSK.mixin = function(recipient, mixin) {
		if (recipient === Object.prototype) {
			throw '[OSK.mixin] Recipient cannot be Object.prototype';
		}
		for (p in mixin) {
			if (p in recipient) {
				console.log('[OSK.mixin] Overwriting ' + p + ' in recipient');
			}
			recipient[p] = mixin[p];
		}
		return recipient;
	};


	OSK.Spinner = {

		__spinner__: null,


		setSpinner: function(spinner) {
			this.__spinner__ = spinner;
			return this;
		},


		getSpinner: function() {
			var fn = arguments.callee;
			fn.null_spinner = fn.null_spinner || new Image();
			return this.__spinner__ || fn.null_spinner;
		},


		showSpinner: function() {
			this.getSpinner().style.visibility = 'visible';
			return this;
		},


		hideSpinner: function() {
			this.getSpinner().style.visibility = 'hidden';
			return this;
		}

	};


	OSK.Animation = {

		__anim__: null,

		animate: function(anim_args) {
			var fn = arguments.callee;
			var p, e, args = {}, anim, el;
			fn.null_handler = fn.null_handler || function(evt) {
				return false;
			};
			fn.default_args = fn.default_args || {
				'tween': YAHOO.util.Easing.easeOut,
				'css' : {},
				'duration': 0.5,
				'onStart': fn.null_handler,
				'onTween': fn.null_handler,
				'onComplete': fn.null_handler
			};
			for (p in fn.default_args) {
				args[p] = fn.default_args[p];
				if (p in anim_args) {
					args[p] = anim_args[p];
				}
			}
			try {
				el = this.getWrapper();
			}
			catch (e) {
				console.log('[OSK.Animation.animate] Could not obtain wrapper element; cannot continue');
				throw e;
			}
			this.__anim__ = new YUA(el, args.css, args.duration, args.tween);
			this.__anim__.onStart.subscribe(args.onStart);
			this.__anim__.onTween.subscribe(args.onTween);
			this.__anim__.onComplete.subscribe(args.onComplete);
			this.__anim__.animate();
			return this;
		}

	};


	OSK.getFirstDescendantByClassName = function(ref_node, css_class) {
		var nodes = YUD.getElementsByClassName(css_class, null, ref_node);
		return nodes.length ? nodes.shift() : false;
	};


	OSK.TokenManager = {

		token: '',

		forms: [],

		init: function(initial_token) {
			this.forms = this.findForms();
			this.update(initial_token);
		},

		findForms: function() {
			return YUD.getElementsBy(function(node) { return true; }, 'form', document.body);
		},

		register: function(form) {
			this.forms.push(form);
		},

		update: function(token) {
			var dis = this;
			this.token = token;
			this.forms.each(function(form) {
				var i, input = dis.createInput();
				if (!MSIE) {
					if (!form.elements.token) {
						YUD.insertAfter(input, YUD.getLastChild(form));
					}
					form.elements.token.value = token;
				}
				else {
					// Again, because MSIE blows
					for (i = 0; i < form.elements.length; i++) {
						if (form.elements[i].name != 'token') {
							continue;
						}
						form.elements[i].value = token;
					}
				}
			});
		},

		createInput: function() {
			var input = document.createElement('input');
			input.setAttribute('name', 'token');
			input.setAttribute('type', 'hidden');
			input.setAttribute('value', '');
			return input;
		}

	};


	OSK.TextRadioPair = function(radio, text_input) {
		YUE.addListener(text_input, 'focus', function(evt) {
			$(radio).checked = true;
		});
		YUE.addListener(radio, 'click', function(evt) {
			$(text_input).focus();
		});
	};


	OSK.FloatingBox = function(class_index) {
		var fn = arguments.callee, missing_keys = [], wrapper;
		fn.expected_keys = fn.expected_keys || [
			'table',
			'top_left',
			'top_mid',
			'top_right',
			'mid_left',
			'mid_mid',
			'mid_right',
			'bot_left',
			'bot_mid',
			'bot_right'
		];
		fn.expected_keys.each(function(key) {
			if (!class_index[key]) {
				missing_keys.push(key);
			}
		});
		if (missing_keys.length) {
			throw new Error('[OSK.FloatingBox] Missing keys: ' + missing_keys.join(', '));
		}
		this.classIndex = class_index;
		this.wrapperID = OSK.fakeUUID();
		this.headingID = OSK.fakeUUID();
		this.contentID = OSK.fakeUUID();
		this.wrapper = this.getWrapper();
		this.wrapper.style.display = 'none';
		this.wrapper.style.opacity = '0.999';
		YUD.insertBefore(this.wrapper, YUD.getFirstChild(document.body));
		return this;
	};


	OSK.FloatingBox.prototype = {

		addContent: function(html) {
			this.getContentNode().innerHTML += (html + '');
			return this;
		},

		setContent: function(html) {
			this.clearContent().addContent(html);
			return this;
		},

		clearContent: function() {
			this.getContentNode().innerHTML = '';
			return this;
		},

		setHeading: function(html) {
			this.getHeadingNode().innerHTML = html;
			return this;
		},

		getWrapper: function() {
			var dis = this;
			var table, thead, tbody, tfoot;
			if (!this.wrapper) {
				table = document.createElement('table');
				thead = document.createElement('thead');
				tbody = document.createElement('tbody');
				tfoot = document.createElement('tfoot');
				table.id = this.wrapperID;
				table.className = this.classIndex.table;
				table.setAttribute('cellspacing', '0');
				table.setAttribute('cellpadding', '0');
				thead.style.height = '0px';
				tfoot.style.height = '0px';
				table.appendChild(thead);
				table.appendChild(tbody);
				table.appendChild(tfoot);
				['top', 'mid', 'bot'].each(function(row) {
					var tr = document.createElement('tr');
					['left', 'mid', 'right'].each(function(column) {
						var td = document.createElement('td');
						var position = row + '_' + column;
						td.className = dis.classIndex[position];
						td.innerHTML = '&nbsp;';
						tr.appendChild(td);
						switch (position) {
							case 'top_mid': td.id = dis.headingID; break;
							case 'mid_mid': td.id = dis.contentID; break;
						}
					});
					tbody.appendChild(tr);
				});
				this.wrapper = table;
			}
			return this.wrapper;
		},

		getContentNode: function() {
			var node = $(this.contentID);
			if (!node) {
				console.log('[OSK.FloatingBox.prototype.getContentNode] Could not locate content node');
			}
			return node;
		},

		getHeadingNode: function() {
			var node = $(this.headingID);
			if (!node) {
				console.log('[OSK.FloatingBox.prototype.getHeadingNode] Could not locate heading node');
			}
			return node;
		},

		setPlacementStrategy: function(strategy) {
			if (strategy && strategy.place && typeof strategy.place == 'function') {
				this.placementStrategy = strategy;
			}
			else {
				console.log('[OSK.FloatingBox.prototype.setPlacementStrategy] Supplied object must implement a "place" method');
			}
			return this;
		},

		getPlacementStrategy: function() {
			var fn = arguments.callee;
			fn.null_strategy = fn.null_strategy || {
				place: function() {
					console.log('[OSK.FloatingBox.prototype.getPlacementStrategy] A placement strategy is not set');
					return false;
				}
			};
			return this.placementStrategy || fn.null_strategy;
		},

		setCloseButton: function(node) {
			var dis = this;
			if (node) {
				node.style.cursor = 'pointer';
				YUE.addListener(node, 'click', function(evt) {
					node.style.cursor = 'default';
					dis.hide();
					YUE.stopEvent(evt);
				});
			}
			return this;
		},

		place: function(evt) {
			this.getPlacementStrategy().place(this.getWrapper(), evt);
			return this;
		},

		hide: function() {
			var table = this.getWrapper();
			this.onBeforeHide();
			if (!MSIE) {
				this.animate({
					duration: 0.1,
					onComplete: function(evt) {
						table.style.display = 'none';
						YUD.setStyle(table, 'opacity', '0.999');
					},
					css: {
						opacity: {
							to: '0.001'
						}
					}
				});
			}
			else {
				table.style.display = 'none';
			}
			this.onAfterHide();
			return this;
		},

		remove: function() {
			var table = this.getWrapper();
			if (YUD.inDocument(table)) {
				$purge(table);
				document.body.removeChild(table);
				this.wrapper = null;
			}
			return this;
		},

		onBeforeHide: function() {
			return false;
		},

		onAfterHide: function() {
			return false;
		}

	};


	OSK.mixin(OSK.FloatingBox.prototype, OSK.Animation);


	OSK.DefaultFloatingBox = function() {
		var fn = arguments.callee;
		fn.gc = fn.gc || {
			'table':     'rb',
			'top_left':  'rb_top_left',
			'top_mid':   'rb_top_mid',
			'top_right': 'rb_top_right',
			'mid_left':  'rb_mid_left',
			'mid_mid':   'rb_mid_mid',
			'mid_right': 'rb_mid_right',
			'bot_left':  'rb_bot_left',
			'bot_mid':   'rb_bot_mid',
			'bot_right': 'rb_bot_right'
		};
		fn.ps = fn.ps || {
			place: function(wrapper, evt) {
				var coordinates = OSK.getMouseCoordinates(evt);
				if (coordinates) {
					wrapper.style.left = coordinates.x + 'px';
					wrapper.style.top = coordinates.y + 'px';
				}
				wrapper.style.display = 'inline';
			}
		};
		return new OSK.FloatingBox(fn.gc).setPlacementStrategy(fn.ps);
	};


	OSK.DefaultFloatingBox.preload = new OSK.DefaultFloatingBox();


	OSK.xhrSubmitForm = function(transport, uri, form, success_callback) {
		var fn = arguments.callee;
		var transport = transport || form.method || 'POST';
		var uri = uri || form.action;
		var callback = { success: success_callback };
		fn.get_element_value = fn.get_element_value || function(el) {
			var i;
			if (el && el.type) {
				switch (el.type) {
					case 'text':
					case 'textarea':
					case 'password':
					case 'hidden':
						return el.value;

					case 'radio':
						for (i = 0; i < el.length; i++) {
							if (el[i].checked) {
								return el.value;
							}
						}
						return null;

					case 'checkbox':
						return el.checked ? '1' : '0';

					case 'select-one':
						i = el.options.selectedIndex;
						return el.options[i].value || el.options[i].text;

				}
			}
			return null;
		};
		fn.url_encode_form = fn.url_encode_form || function(form) {
			var i, input, value, serialized = [];
			for (i = 0; i < form.elements.length; i++) {
				input = form.elements[i];
				value = fn.get_element_value(input);
				serialized.push(encodeURIComponent(input.name) + '=' + encodeURIComponent(value));
			}
			return serialized.join('&');
		};
		setTimeout(function() {
			YUC.asyncRequest(transport.toUpperCase(), uri, callback, fn.url_encode_form(form));
		}, 50);
	};


	OSK.AjaxForm = function(form, response_handler) {
		var dis = this;
		var transport = form.method || 'POST';
		var handler_url = form.action || false;
		if (!handler_url) {
			throw new Error('[OSK.AjaxForm]: form argument must have an "action" property');
		}
		if (!response_handler || typeof response_handler != 'function') {
			throw new TypeError('OSK.AjaxForm]: response_handler argument must be a function');
		}
		this.submit = function() {
			dis.showSpinner();
			OSK.xhrSubmitForm(transport, handler_url, form, function(r) {
				var response = YLJ.parse(r.responseText);
				dis.hideSpinner();
				response_handler(response);
			});
			return this;
		};
		YUE.addListener(form, 'submit', function(evt) {
			YUE.stopEvent(evt);
			dis.submit();
			return false;
		});
		return this;
	};


	OSK.mixin(OSK.AjaxForm.prototype, OSK.Spinner);


	OSK.TabbedPanes = function(map) {
		var fn = arguments.callee;
		fn.null_callback = function() {};
		map = map || {}
		map.walk = function(callback) {
			callback = callback || fn.null_callback;
			var p, tab, pane;
			for (p in this) {
				if (typeof this[p] === 'function') {
					continue;
				}
				tab = $(p);
				pane = $(this[p]);
				callback(pane, tab);
			}
		};
		map.walk(function(pane, tab) {
			YUE.addListener(tab, 'click', function(evt) {
				map.walk(function(_pane, _tab) {
					YUD.setStyle(_pane, 'display', 'none');
				});
				YUD.setStyle(pane, 'display', 'block');
			});
		});
		YUE.addListener(window, 'beforeunload', function(evt) {
			map.walk(function(pane, tab) {
				YUE.purgeElement(tab);
			});
		});
		this.map = map;
	};


	OSK.ColdTextInput = function(input, default_text) {
		var FORM_CLASS_XHR = 'xhr';
		var input = $(input);
		var default_text = default_text || input.value;
		var focus_handler = function(evt) {
			if (input.value == default_text) {
				input.value = '';
				YUD.removeClass(input, 'cold');
			}
		};
		var blur_handler = function(evt) {
			if (input.value === '' || input.value === default_text) {
				YUD.addClass(input, 'cold');
				input.value = default_text;
			}
		};

		YUE.addListener(input, 'focus', focus_handler);
		YUE.addListener(input, 'blur', blur_handler);

		// If the input element belongs to a form, and that form has CSS class
		// "xhr", override the form's default submit behavior so that the input
		// clears itself before the form is actually sent.
		if (input.form) {
			YUE.addListener(input.form, 'submit', function(evt) {
				if (YUD.hasClass(input.form, FORM_CLASS_XHR)) {
					YUE.stopEvent(evt);
				}
				if (input.value == default_text) {
					input.value = '';
				}
			});
		}
		blur_handler();
		return this;
	};


	OSK.portal.userStatus = {

		RESPONSE_STATUS_OK: 200,
		RESPONSE_STATUS_FAILED: 500,
		DEFAULT_ERROR_MESSAGE: 'Internal error. Please try again later.',

		init: function(form) {
			if (form) {
				this.xhr = new OSK.AjaxForm(form, this.handleResponse.bind(this));
				this.xhr.setSpinner(OSK.getFirstDescendantByClassName(form, 'spinner'));
				this.input = $('userStatus');
				this.errorMessageContainer = $('status_error');
				this.initialValue = this.input.value || '';
				this.setListeners();
				this.revert();
			}
			return this;
		},

		revert: function() {
			var e;
			try {
				YUD.removeClass(this.input, 'editing');
				this.input.value = this.initialValue;
				this.input.style.cursor = 'pointer';
				this.input.blur();
			}
			catch (e) {} // bury it
			return this;
		},

		setListeners: function() {
			var dis = this;
			YUE.addListener(this.input, 'blur', function(evt) {
				if (!dis.listening || this.value == dis.initialValue) {
					dis.revert();
				}
				else {
					dis.listening = false;
					dis.xhr.submit();
				}
			});
			YUE.addListener(this.input, 'focus', function(evt) {
				this.style.cursor = 'text';
				YUD.addClass(this, 'editing');
			});
			YUE.addListener(this.input, 'keypress', function(evt) {
				var charCode = YUE.getCharCode(evt);
				if (charCode == OSK.charCodes.ESCAPE) {
					YUE.stopEvent(evt);
					dis.revert();
				}
				else if (charCode == OSK.charCodes.ENTER) {
					YUE.stopEvent(evt);
					dis.xhr.submit();
					dis.listening = false;
				}
			});
			this.listening = true;
			return this;
		},

		handleResponse: function(response) {
			this.input.blur();
			YUD.removeClass(this.input, 'editing');
			if (response) {
				if (response.token) {
					OSK.TokenManager.update(response.token);
				}
				if (response.status) {
					if (response.status == this.RESPONSE_STATUS_OK) {
						this.input.value = response.user_status;
						this.initialValue = response.user_status;
					}
					else if (response.status == this.RESPONSE_STATUS_FAILED) {
						if (response.error) {
							this.errorMessageContainer.innerHTML = response.error;
						}
						else {
							this.errorMessageContainer.innerHTML = this.DEFAULT_ERROR_MESSAGE;
						}
					}
				}
			}
			this.listening = true;
			return this;
		}

	};


	OSK.Template = function(template_html) {
		this.html = template_html;
		return this;
	};


	OSK.Template.prototype = {

		assign: function(vars) {
			var p, html = this.html, regex;
			for (p in vars) {
				regex = new RegExp(p);
				do {
					html = html.replace(p, vars[p], 'gm');
				}
				while (regex.test(html)); // because MSIE sucks
			}
			this.html = html;
			return this;
		},

		render: function() {
			return this.html;
		}

	};


	OSK.RuxpinSignal = function(anchor) {
		var properties = YLJ.parse(decodeURIComponent(anchor.rel));
		this.getProperty = function(index) {
			return properties[index] || '';
		};
		return this;
	};


	OSK.RuxpinSignal.prototype = {

		getAction: function() {
			return this.getProperty('action');
		},

		getUserID: function() {
			return this.getProperty('buddy_id');
		},

		getSparkID: function() {
			return this.getProperty('buddy_sparkid');
		}

	};


	OSK.Ruxpin = {

		DOM_NAMESPACE:         'ruxpin_',
		TRIGGER_CLASS_SUFFIX:  'trigger',
		DEFAULT_MESSAGE:       'Click here to add your message... (Optional)',

		headings: {
			'request': 'Add as Friend',
			'remove': 'Remove Friend',
			'accept': 'Confirm Friend',
			'ignore': 'Ignore Friend Request'
		},

		init: function() {
			this.setListeners();
			this.fbox = new OSK.DefaultFloatingBox();
			YUE.addListener(document.body, 'unload', this.tearDown.bind(this));
			return this;
		},

		tearDown: function() {
			this.clearListeners();
			return this;
		},

		getAnchors: function() {
			var css_class = this.DOM_NAMESPACE + this.TRIGGER_CLASS_SUFFIX;
			return YUD.getElementsByClassName(css_class, null, document.body);
		},

		setListeners: function() {
			var dis = this;
			this.getAnchors().each(function(anchor) {
				YUE.addListener(anchor, 'click', function(evt) {
					dis.currentAnchor = anchor;
					anchor.style.cursor = 'pointer';
					anchor.blur();
					dis.showPrompt(evt, anchor);
				});
			});
			return this;
		},

		clearListeners: function() {
			this.getAnchors().each(function(anchor) {
				YUE.removeListener(anchor, 'click');
			});
			return this;
		},

		showPrompt: function(evt, anchor) {
			var dis = this;
			var p, cnode;
			var signal = new OSK.RuxpinSignal(anchor);
			var html = this.getTemplateHTML(signal.getAction());
			var template = new OSK.Template(html).assign({
				'%BUDDY_ID%': signal.getUserID(),
				'%BUDDY_SPARKID%': signal.getSparkID()
			});

			this.fbox.setHeading(this.headings[signal.getAction()]).setContent(template.render());
			cnode = this.fbox.getContentNode();

			var form = YUD.getFirstChildBy(cnode, function(node) {
				return node.tagName.toLowerCase() === 'form';
			});

			this.prepareForm(form);
			this.fbox.setCloseButton(OSK.getFirstDescendantByClassName(cnode, 'close'));
			this.fbox.place(evt);

			YUE.stopEvent(evt);

			return this;
		},

		prepareForm: function(form) {
			var fn = arguments.callee;
			fn.null_form = fn.null_form || (function() {
				var nf = document.createElement('form');
				nf.action = window.location.href;
				nf.method = 'POST';
				YUE.addListener('nf', 'submit', function(evt) {
					YUE.stopEvent(evt);
					return false;
				});
				return nf;
			})();

			var cti, textarea;
			var xhr = new OSK.AjaxForm(form || fn.null_form, this.handleResponse.bind(this));
			xhr.setSpinner(OSK.getFirstDescendantByClassName(this.fbox.getWrapper(), 'spinner'));
			textarea = OSK.getFirstDescendantByClassName(form, 'message');
			if (textarea) {
				cti = new OSK.ColdTextInput(textarea, this.DEFAULT_MESSAGE);
			}
			return this;
		},

		getTemplateHTML: function(action) {
			var template_id = this.DOM_NAMESPACE + action;
			return $(template_id).innerHTML;
		},

		handleResponse: function(response) {
			var dis = this, html, template, cnode = this.fbox.getContentNode();
			OSK.TokenManager.update(response.token);
			html = this.getTemplateHTML('response');
			if (response.token) {
				OSK.TokenManager.update(response.token);
			}
			this.reloadOnClose = response.reload || false;
			template = new OSK.Template(html).assign({
				'%RESPONSE_MESSAGE%': response.message
			});
			if (!response.error) {
				this.disableAnchor(this.currentAnchor);
			}
			this.fbox.setContent(template.render()).setCloseButton(OSK.getFirstDescendantByClassName(cnode, 'close'));
			if (response.reload) {
				this.fbox.onBeforeHide = function() {
					window.location.reload();
				};
			}
			return this;
		},

		disableAnchor: function(anchor) {
			var dis = this;
			if (anchor.rel && anchor.rel != 'disabled') {
				anchor.setAttribute('rel', 'disabled');
				YUD.setStyle(anchor, 'opacity', '0.333');
				YUD.setStyle(anchor, 'cursor', 'default');
				YUE.removeListener(anchor, 'click');
				YUE.addListener(anchor, 'click', function(evt) {
					YUE.stopEvent(evt);
					anchor.blur();
				});
			}
			return this;
		},

		setCloseButton: function(node) {
			var dis = this;
			if (node) {
			    YUE.addListener(node, 'click', function(evt) {
			        dis.fbox.hide();
			    });
			}
			return this;
		}

	};


	OSK.Zong = {

		markets: {},
		forms: null,

		init: function(market_selector, iframe_container, market_data) {
			var dis = this;
			this.markets = market_data;
			YUE.addListener(market_selector.form, 'submit', function(evt) {
				YUE.stopEvent(evt);
				return false;
			});
			YUE.addListener(market_selector, 'change', function(evt) {
				if (this.value) {
					$('zongDialog').innerHTML = '';
					dis.getForms().each(function(form) {
						form.style.display = 'none';
						form.elements.entryPointURL.options.selectedIndex = 0;
					});
					$('zongPricePoint_' + this.value).style.display = 'block';
				}
			});
			this.getForms().each(function(form) {
				YUE.addListener(form, 'submit', function() {
					YUE.stopEvent(evt);
					return false;
				});
				YUE.addListener(form.elements.entryPointURL, 'change', function(evt) {
					document.body.style.cursor = 'progress';
					OSK.xhrSubmitForm('post', '/zong/buy', this.form, dis.placeResponse);
				});
			});
		},

		getForms: function() {
			if (!this.forms) {
				this.forms = [];
				for (iso in this.markets) {
					this.forms.push($('zongPricePoint_' + iso));
				}
			}
			return this.forms;
		},

		placeResponse: function(r) {
			document.body.style.cursor = 'default';
			$('zongDialog').innerHTML = r.responseText;
		}

	};


	// YouTube widget
	YUE.onDOMReady(function() {
		var flashvars, params, attributes;
		if ($('youTubeWidget')) {
			flashvars = { FEED_XML: 'http%3A//gdata.youtube.com/feeds/api/playlists/91DA9A72D2F9506E' };
			params = { menu: 'false', salign: 'lt', scale: 'noscale', wmode: 'transparent' };
			attributes = { id: 'youTubeWidget', name: 'youTubeWidget' };
			swfobject.embedSWF('/swf/youtube_widget.swf', 'youTubeWidget', '300', '196', '8.0.0', false, flashvars, params, attributes);
		}
	});


	// Front page SWF messaging area
	/* - Removed by sean - 20090722
	YUE.onDOMReady(function() {
		var flashvars, params, attributes, fma_url = '/swf/fma.swf?v=' + OSK.app.version;
		if ($('fmacontent')) {
			flashvars = { FEED_XML: encodeURIComponent(OSK.fma.confURL) + '/?v=' + OSK.app.version };
			params = { menu: 'false', salign: 'lt', scale: 'noscale', wmode: 'transparent' };
			attributes = { id: 'fmacontent', name: 'fmacontent' };
			swfobject.embedSWF(fma_url, 'fmacontent', '440', '240', '8.0.0', false, flashvars, params, attributes);
		}
	});
	*/


	YUE.onContentReady('userSearch', function() {
		var cti = new OSK.ColdTextInput('userSearch', 'Search by SparkID');
	});


	YUE.onDOMReady(function() {
		if ($('userStatus')) {
			OSK.portal.userStatus.init($('userStatus').form);
		}
	});


	YUE.onDOMReady(function() {
		if ($('send-im') && OSK.user && OSK.su) {
			YUE.addListener('send-im', 'click', function(evt) {
				YUE.stopEvent(evt);
				Meebo.im(OSK.su.id, OSK.su.sparkid);
			});
		}
	});


	YUE.onDOMReady(function() {
		if (OSK.ruxpinEnabled) {
			OSK.Ruxpin.init();
		}
	});


	// Image cropper control
	YUE.onDOMReady(function() {
		var ic, dims, offsets;
		var INITIAL_HEIGHT = 80;
		var INITIAL_WIDTH = 80;
		var DEFAULT_DIMS = [180, 180];
		if (OSK.croppableImage && $('croppableProfileImage')) {
			dims = OSK.croppableImage.dims;
			if (!dims.length) {
				dims = DEFAULT_DIMS;
			}
			offsets = [
				Math.floor((dims[0] - INITIAL_WIDTH) / 2),
				Math.floor((dims[1] - INITIAL_HEIGHT) / 2)
			];
			ic = new YAHOO.widget.ImageCropper('croppableProfileImage', {
				initialXY: offsets,
				initHeight: INITIAL_HEIGHT,
				initWidth: INITIAL_WIDTH,
				minWidth: 24,
				minHeight: 24,
				ratio: true
			});
			[1, 2, 3, 4].each(function(ord) {
				var node = $('yui-gen'+ord);
				$purge(node);
				node.parentNode.removeChild(node);
			});
		}
		if ($('imageCropperForm')) {
			YUE.addListener('imageCropperForm', 'submit', function(evt) {
				var els = this.elements, coords = ic.getCropCoords();
				els.xcoord.value = coords.left;
				els.ycoord.value = coords.top;
				els.msize.value = coords.width;
				return true;
			});
		}
	});


	YUE.onDOMReady(function() {
		if (OSK.token) {
			OSK.TokenManager.init(OSK.token);
		}
	});


	YUE.onDOMReady(function() {
		if (OSK.zongMarkets) {
			OSK.Zong.init($('zongMarket'), $('zongDialog'), OSK.zongMarkets);
		}
	});


	// Games page
	YUE.onDOMReady(function() {
		var tp;
		if (OSK.gamesPage) {
			tp = new OSK.TabbedPanes({
				'fiestaMoreDetails': 'overlayFiesta',
				'fiestaViewVideo': 'overlayFiesta',
				'solsticeMoreDetails': 'overlaySolstice',
				'solsticeViewVideo': 'overlaySolstice',
				'projectpowderMoreDetails': 'overlayProPow',
				'projectpowderViewVideo': 'overlayProPow',
				'blackshotMoreDetails': 'overlayBlackshot',
				'blackshotViewVideo': 'overlayBlackshot',
				'windslayerMoreDetails': 'overlayWindslayer',
				'windslayerViewVideo': 'overlayWindslayer',
				'breadnbutterMoreDetails': 'overlayBreadButter',
				'breadnbutterViewVideo': 'overlayBreadButter'
			});
			tp.map.walk(function(pane, tab) {
				var close_btn = OSK.getFirstDescendantByClassName(pane, 'hideButton');
				YUE.addListener(close_btn, 'click', function(evt) {
					YUE.preventDefault(evt);
					YUE.stopEvent(evt);
					YUD.setStyle(pane, 'display', 'none');
				});
				YUE.addListener(window, 'beforeunload', function(evt) {
					YUE.purgeElement(close_btn);
				});
			});
		}
	});


	/**
	 * Textarea MaxLength, by PPK
	 * http://www.quirksmode.org
	 */
	var setMaxLength = function() {
		var i, x = document.getElementsByTagName('textarea');
		var counter = document.createElement('div');
		var counterClone;
		var checkMaxLength = function(evt) {
			var el = this;
			setTimeout(function() {
				var maxLength = el.getAttribute('maxlength');
				var currentLength = el.value.trim().length;
				if (currentLength > maxLength) {
					el.relatedElement.className = 'toomuch';
				}
				else {
					el.relatedElement.className = '';
				}
				el.relatedElement.firstChild.nodeValue = currentLength;
			}, 10);
		};
		counter.className = 'counter';
		for (i=0;i<x.length;i++) {
			if (x[i].getAttribute('maxlength')) {
				counterClone = counter.cloneNode(true);
				counterClone.relatedElement = x[i];
				counterClone.innerHTML = '<span>0</span>/'+x[i].getAttribute('maxlength');
				x[i].parentNode.insertBefore(counterClone,x[i].nextSibling);
				x[i].relatedElement = counterClone.getElementsByTagName('span')[0];
				x[i].onkeyup = x[i].onchange = checkMaxLength;
				x[i].onkeyup();
			}
		}
	};

	YUE.onDOMReady(setMaxLength);

	YUE.onDOMReady(function() {
		if ($('comment') && OSK.maxCommentLength) {
			YUE.addListener('comment', 'keyup', function(evt) {
				var counter_container = YUD.getNextSibling(this);
				var error_message = $('commentErrorMessage');
				if (this.value.trim().length > OSK.maxCommentLength) {
					this.value = this.value.trim().substr(0, OSK.maxCommentLength);
					error_message.innerHTML = 'Comments cannot exceed '+OSK.maxCommentLength+' characters in length.';
					YUD.removeClass(error_message, 'no-render');
				}
			});
		}
	});

	YUE.onDOMReady(function() {
		YUE.addListener(window, 'load', function() {
			if ($('send-im') && OSK.user && OSK.su) {
				YUE.addListener('send-im', 'click', function(evt) {
					YUE.stopEvent(evt);
					Meebo.im(OSK.su.id, OSK.su.sparkid);
				});
			}
		});
	});

})();



if ('addEvent' in window && location.pathname.match('/invite')) {

	OSK.ContactChooser = {

		RESPONSE_STATUS_OK: 200,
		RESPONSE_STATUS_BAD_REQUEST: 400,
		RESPONSE_STATUS_FAILED: 500,

		contacts: new Hash(),

		init: function() {
			this.contacts = new Hash();
			this.prepareLoginForm();
			this.prepareAddContactControls();
			this.prepareImportContactsForm();
			$('addAll').addClass('clickable').addEvent('click', this.addAll.bind(this));
			$('removeAll').addClass('clickable').addEvent('click', this.removeAll.bind(this));
			var cti = new OSK.ColdTextInput($('inviteMessage'));
		},

		prepareAddContactControls: function() {
			var dis = this;
			$('addContact').addEvent('keypress', function(evt) {
				if (evt.key == 'enter') {
					$('addContactButton').fireEvent('click');
					evt.stop();
				}
			});
			$('addContactButton').addEvent('click', function(evt) {
				var contact, contact_element, email = $('addContact').value.trim();
				if (email) {
					if (!dis.contacts.has(email)) {
						contact_element = dis.createContactElement(email);
						dis.contacts.set(email, {
							selected: false,
							imported: false,
							element: contact_element
						});
						contact_element.fireEvent('click');
					}
					else {
						contact = dis.contacts[email].element.fireEvent('click');
					}
				}
				$('addContact').value = '';
			});
		},

		prepareLoginForm: function() {
			var dis = this;
			var form = $('importContactsLoginForm');
			var form_disabled = false;
			form.addEvent('submit', function(evt) {
				evt.stop();
				if (form_disabled) {
					return false;
				}
				var overlay = new Element('div').addClass('importContactsLoginFormOverlay');
				var request = new Request({
					url: '/invite/fetch',
					method: 'post',
					data: $(this),
					onRequest: function() {
						$(document.body).setStyle('cursor', 'wait');
					},
					onComplete: function(r) {
						var els, response = JSON.decode(r);
						$(document.body).setStyle('cursor', 'default');
						if (!response.error) {
							if (response.status === dis.RESPONSE_STATUS_OK) {
								form_disabled = true;
								$('importContactsLoginError').innerHTML = '&nbsp;';
								overlay.inject('inviteStep1', 'top');
								$arrayize(form.elements).each(function(el) {
									el.blur();
								});
								dis.prepareImports(response.data);
							}
						}
						else {
							$('importContactsLoginError').innerHTML = response.error;
						}
					}
				}).send();
			});
		},

		prepareImportContactsForm: function() {
			var dis = this;
			$('importContactsForm').addEvent('submit', function(evt) {
				evt.stop();
				var email, request, form = this, fn = arguments.callee;
				var recipients = '';
				fn.li = fn.li || new Element('li');
				form.elements.contacts.innerHTML = '';
				for (email in dis.contacts) {
					if (dis.contacts[email].selected) {
						recipients += email + '\n';
						fn.li.clone().set('html', email).inject($('recipients'));
					}
				}
				form.elements.contacts.value = recipients;
				$(document.body).setStyle('cursor', 'wait');
				$('submitButton').setStyle('cursor', 'wait');
				request = new Request({
					url: '/invite/import',
					method: 'post',
					data: $(this),
					onComplete: function(r) {
						var response = JSON.decode(r);
						if (response && response.status === dis.RESPONSE_STATUS_OK) {
							$(document.body).setStyle('cursor', 'default');
							setTimeout(function() {
								window.location.replace('/invite/history');
							}, 1000);
						}
					}
				}).send();
				return false;
			});
		},

		prepareImports: function(imported_contacts) {
			var email;
			for (email in imported_contacts) {
				this.contacts.set(email, {
					selected: false,
					imported: true,
					element: this.createContactElement(email, imported_contacts[email]).inject($('importedContactsAction'))
				});
			}
		},

		createContactElement: function(contact_email, contact_name) {
			var dis = this, fn = arguments.callee, html, el;
			fn.contact = fn.contact || new Element('a').setProperty('class', 'contact');
			if (contact_name == contact_email) {
				contact_name = false;
			}
			html = contact_name ? contact_name + ' (' + contact_email + ')' : contact_email;
			if (html.length > 70) {
				html = html.substr(0, 70) + '...';
			}
			el = fn.contact.clone().setProperty('rel', contact_email).set('html', html);
			return el.addClass('clickable').addEvent('click', function(evt) {
				var clone, contact = dis.contacts[this.rel];
				contact.selected = true;
				clone = contact.element.setStyle('display', 'none').clone();
				if (clone.innerHTML.length > 30) {
					clone.innerHTML = clone.innerHTML.substr(0, 30) + '...';
				}
				clone.setStyle('display', 'block').inject($('selectedContactsAction'));
				clone.removeEvents().addEvent('click', function(evt) {
					var contact = dis.contacts[this.rel] || false;
					if (contact) {
						contact.selected = false;
						contact.element.setStyle('display', 'block');
						if (!contact.imported) {
							dis.contacts.erase(this.rel);
						}
					}
					this.destroy();
				});
			});
		},

		addAll: function() {
			var email;
			this.contacts.each(function(contact) {
				if (!contact.selected) {
					contact.element.fireEvent('click');
				}
			});
		},

		removeAll: function() {
			$('selectedContactsAction').getElements('a').each(function(el) {
				if (el.rel) {
					el.fireEvent('click');
				}
			});
		}

	};

	window.addEvent('domready', function() {
		if ($('importContactsForm')) {
			OSK.ContactChooser.init();
		}
	});

}

