if (!Array.prototype.indexOf)
{
	Array.prototype.indexOf = function(obj)
	{
		for (var i = 0; i < this.length; i++)
			if (this[i] == obj)
				return i;
		return -1;
	}
}

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

WidgetStore = function()
{}

// Compatibility with 1.3
WidgetStore.current = WidgetStore;

WidgetStore.cache          = true;
WidgetStore.loadingText    = "Loading...";
WidgetStore.loadingScripts = [];
WidgetStore.loadingWait    = {};
WidgetStore.loadedScripts  = [];
WidgetStore.idList         = [];
WidgetStore.rootPath       = "";
WidgetStore.javaScriptPath = "JavaScript/";
WidgetStore.flashPath      = "Flash/";
WidgetStore.gameWindows    = {};
WidgetStore.overrideParamFunctionName = "WidgetStoreOverrideParam";

WidgetStore.WIDGET_TYPE_FLASH      = 1;
WidgetStore.WIDGET_TYPE_JAVASCRIPT = 2;

WidgetStore.widget = function(typeID, widgetName, instanceName, params)
{
	var id = WidgetStore.resolveID(instanceName);

	WidgetStore.log("info", "typeID: " + typeID);
	WidgetStore.log("info", "widgetName: " + widgetName);
	WidgetStore.log("info", "instanceName: " + instanceName);
	
	var initialFlatParams = WidgetStore.flatout(params);
	WidgetStore.parseParams(widgetName, instanceName, params);
	var parsedFlatParams = WidgetStore.flatout(params);

	WidgetStore.log("info", "params");
	for (var key in initialFlatParams) {
		WidgetStore.log("info", "   " + key + " (initial): " + initialFlatParams[key]);
		WidgetStore.log("info", "   " + key + " (parsed):  " + parsedFlatParams[key]);
	}

	var cssWidth  = (params["width"])  ? params["width"]  + "px" : "auto";
	var cssHeight = (params["height"]) ? params["height"] + "px" : "auto";

	var content = WidgetStore.loadingText;
	if (!swfobject.hasFlashPlayerVersion("9.0.0")) {
		content = "<a href='http://www.adobe.com/go/EN_US-H-GET-FLASH'><img style='border:none' src='http://www.adobe.com/images/shared/download_buttons/get_adobe_flash_player.png'></a>";
	}

	document.write("<span id='"+id+"' class='WidgetStore_"+widgetName+"' style='display:inline-block;width:"+cssWidth+";height:"+cssHeight+";'>"+content+"</span>");

	switch (typeID)
	{
		case WidgetStore.WIDGET_TYPE_FLASH:
			{
				var width  = params["width"]  || 0;
				var height = params["height"] || 0;
			
				// Don't ask. T-Online fix.
				delete(params["width"]);
				params["stageWidth"] = width;
				delete(params["height"]);
				params["stageHeight"] = height;

				// New way to make WebService requests
				params["serviceRequestURL"] = params["serviceURL"] + "/" + params["serviceOperation"] + "?" + WidgetStore.toQueryString(params["serviceParameters"]) + "&alt=json"

				// Flash wants the WSDL definition of the service. Not the service implementation.
				if (params["serviceURL"])
					params["serviceURL"] += "?WSDL";

				// Flash wants the service parameters in an ordered |-delimited list of their values.
				if (params["serviceParameters"])
				{
					var arr = [];
					for (var key in params["serviceParameters"])
						arr.push(params["serviceParameters"][key]);
					params["serviceParameters"] = arr.join("|");
				}
				
				for (var key in params) {
					if (key == "fontFace") {
						params["urlfontFace"/*key.replace(/Face/i, "Url")*/] = WidgetStore.rootPath + WidgetStore.flashPath + params[key] + ".swf";
					}
				}
				
				var encodedParams = {};
				for (var key in params)
					encodedParams[key] = encodeURIComponent(params[key]);
					
				var flashURL = WidgetStore.rootPath + WidgetStore.flashPath + widgetName + ".swf";
				WidgetStore.embedFlash(flashURL, id, width, height, encodedParams);
				break;
			}
		case WidgetStore.WIDGET_TYPE_JAVASCRIPT:
			{
				var widgetPath = WidgetStore.rootPath + WidgetStore.javaScriptPath + widgetName + "/";

				var scriptURL = widgetPath + "Script.js";

				WidgetStore.loadScript(scriptURL, function() {
					eval("var create = WidgetStore." + widgetName + ".create");
					create(id, params);
				});
				
				// TODO: Clone params object to keep the original intact.
				var cssParams = params;
				cssParams["id"]   = id;
				cssParams["path"] = widgetPath;

				var cssURL = widgetPath + "StyleSheet.css";
				WidgetStore.loadStyleSheet(cssURL, cssParams);

				break;
			}
	}
}

WidgetStore.resolveID = function(widgetName)
{
	var id = "Widget_" + widgetName.replace(/[^a-zA-Z0-9_]/g, "");
	var ctr = 0;
	for (var i = 0; i < WidgetStore.idList.length; i++)
		if (WidgetStore.idList[i].indexOf(id) > -1)
			ctr++;

	if (ctr > 0)
		id += "_" + ctr;

	WidgetStore.idList.push(id);

	return id;
}

WidgetStore.isInDebugMode = function()
{
	/debug=([^&]+)/.test(window.location.href);
	return String(RegExp.$1).toLowerCase() == "true";
}

WidgetStore.log = function(type, message)
{
	if (WidgetStore.isInDebugMode())
		window.setTimeout("if (console && console.log) console.log('"+message+"')", 500);
}

WidgetStore.openGameWindow = function(gameWindowName, queryString)
{
	var gameWindow = WidgetStore.gameWindows[gameWindowName];

	// This is a workaround preventing the same game opening up in multiple windows.
	// Only time will tell if it's temporary or not.
	/GameVariantId=([^&]+)/.test(queryString)
	var id = RegExp.$1 || "";
	window.open(
		WidgetStore.appendQueryString(gameWindow.url, queryString),
		id,
		"location=0,status=0,scrollbars=0,resizable=0,directories=0,toolbar=0,width="+gameWindow.width+",height="+gameWindow.height
		);
}

WidgetStore.webServiceRequest = function(url, methodName, params, handler)
{
	var fullURL = url + "/" + methodName + "?" + WidgetStore.toQueryString(params) + "&alt=json"
	
	WidgetStore.log("info", "webServiceRequest: " + fullURL);
	
	WidgetStore.FlashXMLHttpRequest.send(
		"GET",
		fullURL,
		null,
		null,
		function(json) {
			//WidgetStore.log("info", "WebServiceResponse: " + json);
			var obj = null;
			try
			{
				eval("obj = " + json);
			}
			catch(ex){}
			
			handler(obj);
			}
		);
}

WidgetStore.appendQueryString = function(url, queryString)
{
	if (queryString && queryString.indexOf("?") == 0)
		queryString = queryString.substring(1);

	var newUrl = url;
	if (queryString)
	{
		if (url.indexOf("?") > -1)
			newUrl += "&" + queryString;
		else
			newUrl += "?" + queryString;
	}
	return newUrl;
}

WidgetStore.toQueryString = function(obj)
{
	var str       = "";
	var delimiter = "";
	for (var key in obj)
	{
		str += delimiter + key + "=" + obj[key];
		delimiter = "&";
	}
	return str;
}

WidgetStore.parseBoolean = function(str)
{
	return str && (str.toLowerCase() == "true");
}

WidgetStore.parseParams = function(widgetName, instanceName, params, paramNamePrefix)
{
	for (var key in params)
	{
		var paramName  = (paramNamePrefix || "") + key;
		var paramValue = params[key];
		if (typeof(paramValue) == "object")
			WidgetStore.parseParams(widgetName, instanceName, paramValue, paramName + ".");
		params[key] = WidgetStore.parseParam(widgetName, instanceName, paramName, paramValue);
	}
}

WidgetStore.parseParam = function(widgetName, instanceName, paramName, initialValue)
{
	var param = {
		"widgetName"   : widgetName,
		"instanceName" : instanceName,
		"name"         : paramName,
		"value"        : initialValue
		};

	switch (param.name)
	{
		/*
		case "serviceParameters.culture":
			{
				var nav = window.navigator;
				var userLanguage   = nav.userLanguage   || "";
				var systemLanguage = nav.systemLanguage || nav.language || "";

				if (userLanguage.indexOf("-") > -1)
					param.value = userLanguage;
				else if(systemLanguage.indexOf("-") > -1)
					param.value = systemLanguage;
				break;
			}
		*/
		case "serviceParameters.timezoneOffset":
			param.value = new Date().getTimezoneOffset() * -1;
			break;
	}
	if (typeof(param.value) == "string" && param.value.indexOf("Period.") == 0)
	{
		var fromTo = [];
		var periodParts = param.value.split(".");
		switch (periodParts[1])
		{
			case "Today":         fromTo = [ -1,0]; break;
			case "Last Week":     fromTo = [ -7,0]; break;
			case "Last Month":    fromTo = [-30,0]; break;
			case "Current Month": fromTo = [(-(new Date().getDate() - 1)),0]; break;
			default: fromTo = [0,0]; break;
		}
		
		return (periodParts[2] == "From") ? fromTo[0] : fromTo[1];
	}

	eval("var override; try {override = " + WidgetStore.overrideParamFunctionName + "} catch(e) {}");
	if (override)
		override(param);

	return param.value;
}

WidgetStore.addStyleRule = function(selectors, properties)
{
	if (typeof(selectors) == "string")
		selectors = [selectors];

	var propertyString = "";
	for (var key in properties) {
		if (properties[key].replace(/\s+/g, "").length > 0)
			propertyString += key + ":" + properties[key] + ";";
	}

	var ss = WidgetStore.styleSheet;
	if (!ss)
	{
		var ss = document.createElement("style");
		ss.type = "text/css";
		document.getElementsByTagName("head")[0].appendChild(ss);
		ss = document.styleSheets[document.styleSheets.length - 1];
		WidgetStore.styleSheet = ss;
	}

	if (ss.insertRule) {
		try {
			ss.insertRule(selectors.join(",") + "{" + propertyString + "}", ss.cssRules.length);
		} catch(ex) {
			// Some browsers seem to dislike invalid css here. But some invalid css
			// is necessary to make certain properties work across the field.
		}
	}
	else if (ss.addRule) {
		for (var i = 0; i < selectors.length; i++)
			ss.addRule(selectors[i], propertyString);
	}
}

WidgetStore.flatout = function flatout(obj, delimiter, flatobj)
{
	delimiter = delimiter || "";
	flatobj   = flatobj   || {};
	for (var key in obj)
	{
		var val = obj[key];
		if (typeof(val) == "object")
			flatout(val, delimiter + key + ".", flatobj);
		else
			flatobj[delimiter + key] = val;
	}
	return flatobj;
}

WidgetStore.loadStyleSheet = function(url, params)
{
	if (!WidgetStore.cache)
		url += "?" + Math.random();

	WidgetStore.FlashXMLHttpRequest.send(
		"GET",
		url,
		null,
		null,
		function(css)
		{
			var flatParams = WidgetStore.flatout(params);

			for (var key in flatParams) {
				flatParams[key] = flatParams[key].toString().split(":").join("<COLON>");
				
				if (key.toLowerCase().indexOf("color") > -1) {
					if (flatParams[key]) {
						flatParams[key] = "#" + flatParams[key];
					}
				} else if (
					key.toLowerCase().indexOf("width")  > -1 ||
					key.toLowerCase().indexOf("height") > -1 ||
					key.toLowerCase().indexOf("size")   > -1
					) {
					if (!isNaN(flatParams[key])) {
						flatParams[key] += "px";
					}
				} else if (key.toLowerCase().indexOf("font.style") > -1) {
					var styles = flatParams[key].split(",");
					var isBold = false;
					var newStyleArr = [];
					for (var i = 0; i < styles.length; i++) {
						if (styles[i].toLowerCase() == "bold") {
							isBold = true;
						} else if(styles[i]) {
							newStyleArr.push(styles[i]);
						}
					}
					flatParams[key.replace("style", "weight")] = (isBold) ? "bold" : "normal";
					if (newStyleArr.length == 0) {
						newStyleArr.push("normal");
					}
					
					flatParams[key] = newStyleArr.join(" ");
				}
			}
			
			var safety = 0;
			while (/(\[(.+?)(?:,(.+))?\])/.test(css) && safety < 1000)
			{
				css = css.split(RegExp.$1).join(flatParams[RegExp.$2] || RegExp.$3);
				safety++;
			}
			
			var rules = css.split("}");
			
			for (var ruleIndex = 0; ruleIndex < rules.length; ruleIndex++)
			{
				var rule = rules[ruleIndex];
				var rulePair = rule.split("{");
				var selectorString = rulePair[0];
				var styleString    = rulePair[1];

				if (selectorString && styleString)
				{
					var selectorArray = selectorString.split(",");
					var styleArray    = styleString.split(";");
					var styleObj = {}
					for (var styleIndex = 0; styleIndex < styleArray.length; styleIndex++)
					{
						var stylePair = styleArray[styleIndex].split(":");
						if (stylePair.length == 2)
							styleObj[stylePair[0]] = stylePair[1].split("<COLON>").join(":");
					}

					WidgetStore.addStyleRule(selectorArray, styleObj);
				}
			}
		}
		);	
}

/*
	WidgetStore.loadScript
		url:
			The script, or an array of scripts, to be loaded.
		handler:
			This function will be invoked when the script(s) has been
			eval()-ed into the runtime.
*/
WidgetStore.loadScript = function(url, handler)
{
	if (typeof(url) == "string")
	{
		// Find out if this script has already been loaded.
		var loaded = false;
		for (var i = 0; i < WidgetStore.loadedScripts.length; i++)
		{
			if (WidgetStore.loadedScripts[i] == url)
			{
				loaded = true;
				break;
			}
		}
		
		var loading = false;
		for (var i = 0; i < WidgetStore.loadingScripts.length; i++)
		{
			if (WidgetStore.loadingScripts[i] == url)
			{
				loading = true;
				break;
			}
		}

		if (!(loading || loaded))
		{
			// This is a new script. Add it to the list of loadeding scripts and load it.
			WidgetStore.loadingScripts.push(url);

			if (!WidgetStore.cache)
				url += "?" + Math.random();
				
			WidgetStore.FlashXMLHttpRequest.send(
				"GET",
				url,
				null,
				null,
				function(res)
				{
					// res now contains the loaded javascript source.

					// When everything is done we should evaluate the source to get the code
					// into the runtime. Then we invoke the provided handler.
					function finish() {
						var w = window;
						if (w.execScript) // msie
							w.execScript(res);
						else // standard
							w.eval.call(w, res);
							
						WidgetStore.loadingScripts.splice(WidgetStore.loadingScripts.indexOf(url), 1);
						WidgetStore.loadedScripts.push(url);
							
						handler();
					};
	
					var rx = new RegExp(/~requires:([^~]+)/);
					var rxm = rx.exec(res);
					var reqstr = (rxm) ? rxm[1] : "";

					if (reqstr)
					{
						// This script requires additional scripts to be loaded.
						// Load them in the order they appear. (This code is both
						// asynchronous and recursive. How elite is that!)
						var arr = reqstr.split(",");
						for (var i = 0; i < arr.length; i++)
							arr[i] = WidgetStore.rootPath + WidgetStore.javaScriptPath + arr[i];

						WidgetStore.loadScript(arr, finish);
					}
					else
					{
						finish();
					}
				}
				);
		}
		else if (loading)
		{
			// This script is currently loading. We need to wait a while and see if it is loaded later.
			var handlerID = Math.random().toString().substr(2);
			WidgetStore.loadingWait[handlerID] = [url,handler];
			window.setTimeout("var wait = WidgetStore.loadingWait['"+handlerID+"']; delete(WidgetStore.loadingWait['"+handlerID+"']); WidgetStore.loadScript(wait[0],wait[1]);", 500);
		}
		else if (loaded)
		{
			// This script has already been loaded. Invoke the handler.
			// NOTE: In this scenario the handler will be executed synchronously.
			handler();
		}
	}
	else if (url && url.constructor.toString().indexOf("Array") > -1)
	{
		// Load each script in the array.
		if (url.length > 1)
			WidgetStore.loadScript(url.shift(), function() {WidgetStore.loadScript(url, handler);});
		else
			WidgetStore.loadScript(url[0], handler);
	}
}

WidgetStore.createCookie = function(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

WidgetStore.readCookie = function(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

WidgetStore.embedFlash = function(src, id, width, height, flashvars) {
	var params = {
		quality:           "high",
		play:              "true",
		loop:              "true",
		menu:              "true",
		swliveconnect:     "true",
		allowscriptaccess: "always",
		devicefont:        "false",
		bgcolor:           "#ffffff",
		scale:             "noscale",
		wmode:             "transparent",
		salign:            "lt"
		};
	
	swfobject.embedSWF(src, id, width, height, "9.0.0", "expressInstall.swf", flashvars, params);
}

/*
WidgetStore.FlashXMLHttpRequest routes an HTTP request via Flash to circumvent javascript's
inability to make requests to remote servers. As long as there is a crossdomain.xml properly
configured on the remote server Flash will be able to make the request.
*/

WidgetStore.FlashXMLHttpRequest = function()
{
	this.id = (WidgetStore.FlashXMLHttpRequest.ctr++).toString();
}
WidgetStore.FlashXMLHttpRequest.proxyPath = "Proxy.swf";
WidgetStore.FlashXMLHttpRequest.proxyID   = "WidgetStore_FlashXMLHttpRequest_Proxy";
WidgetStore.FlashXMLHttpRequest.proxy     = null;
WidgetStore.FlashXMLHttpRequest.newLine   = "{NEW_LINE}";
WidgetStore.FlashXMLHttpRequest.instances = {};
WidgetStore.FlashXMLHttpRequest.queue     = [];
WidgetStore.FlashXMLHttpRequest.ctr       = 0;

WidgetStore.FlashXMLHttpRequest.send = function(verb, url, headers, vars, handler)
{
	if (WidgetStore.FlashXMLHttpRequest.proxy)
	{
		new WidgetStore.FlashXMLHttpRequest().send(verb, url, headers, vars, handler);
	}
	else
	{
		WidgetStore.FlashXMLHttpRequest.queue.push([verb,url,headers,vars,handler]);
		WidgetStore.FlashXMLHttpRequest.loadProxy();
	}
}

WidgetStore.FlashXMLHttpRequest.prototype.send = function(verb, url, headers, vars, handler)
{
	WidgetStore.FlashXMLHttpRequest.instances[this.id] = this;
	
	this.handler = handler || function() {};
	
	WidgetStore.FlashXMLHttpRequest.proxy.httpRequest(
		verb,
		url,
		headers,
		vars,
		"WidgetStore.FlashXMLHttpRequest.instances['"+this.id+"'].handleResponse"
		);
}

WidgetStore.FlashXMLHttpRequest.handleProxyReady = function()
{
	var id = WidgetStore.FlashXMLHttpRequest.proxyID;

	WidgetStore.FlashXMLHttpRequest.proxy = document[id] || document.getElementById(id);
	if (!WidgetStore.FlashXMLHttpRequest.proxy)
	{
		window.setTimeout("WidgetStore.FlashXMLHttpRequest.handleProxyReady()", 100);
		return;
	}

	var items = WidgetStore.FlashXMLHttpRequest.queue;
	while (items.length > 0)
	{
		var item = items.shift();
		WidgetStore.FlashXMLHttpRequest.send(item[0],item[1],item[2],item[3],item[4]);
	}
}

WidgetStore.FlashXMLHttpRequest.prototype.handleResponse = function(res)
{
	delete(WidgetStore.FlashXMLHttpRequest.instances[this.id]);
	this.handler(res.split(WidgetStore.FlashXMLHttpRequest.newLine).join("\n"));
}
	
WidgetStore.FlashXMLHttpRequest.loadProxy = function()
{
	if (!WidgetStore.FlashXMLHttpRequest.windowLoaded)
		return;

	if (WidgetStore.FlashXMLHttpRequest.loadingProxy)
		return;

	WidgetStore.FlashXMLHttpRequest.loadingProxy = true;

	var tmp = document.createElement("div");
	tmp.id = WidgetStore.FlashXMLHttpRequest.proxyID;
	tmp.style.position = "absolute";
	document.body.appendChild(tmp);

	var flashvars = {
		newLine:      WidgetStore.FlashXMLHttpRequest.newLine,
		readyHandler: "WidgetStore.FlashXMLHttpRequest.handleProxyReady"
		};

	WidgetStore.embedFlash(
		WidgetStore.rootPath + WidgetStore.FlashXMLHttpRequest.proxyPath,
		tmp.id,
		1,
		1,
		flashvars
		);
}

WidgetStore.FlashXMLHttpRequest.handleWindowLoad = function()
{
	WidgetStore.FlashXMLHttpRequest.windowLoaded = true;
	
	if (WidgetStore.FlashXMLHttpRequest.queue.length > 0)
		WidgetStore.FlashXMLHttpRequest.loadProxy();
}

if (window.attachEvent)
	window.attachEvent("onload", WidgetStore.FlashXMLHttpRequest.handleWindowLoad);
else
	WidgetStore.FlashXMLHttpRequest.handleWindowLoad();

WidgetStore.Json = function() {}

WidgetStore.Json.serialize = function(obj) {
	var str = "null";
	switch (typeof(obj)) {
		case "boolean":
			str = (obj) ? "true" : "false";
			break;
		case "number":
			str = obj.toString();
			break;
		case "string": {
			var esc = obj;
			esc = esc.split("\\").join("\\\\");
			esc = esc.split("\"").join("\\\"");
			str = "\"" + esc + "\"";
			break;
		}
		case "object": {
			if (obj) {
				if (obj.constructor.toString().indexOf("Array") > -1) {
					var arr = [];
					for (var i = 0; i < obj.length; i++) {
						arr.push(WidgetStore.Json.serialize(obj[i]));
					}
					str = "[" + arr.join(",") + "]";
				} else {
					var arr = [];
					for (var key in obj) {
						arr.push(key + ":" + WidgetStore.Json.serialize(obj[key]));
					}
					str = "{" + arr.join(",") + "}";
				}
			}
			break;
		}
	}
	return str;
}

WidgetStore.Json.deserialize = function(str) {
	var obj;
	eval("obj = " + str);
	return obj;
}

//---

WidgetStore.rootPath = "http://widgetstore.bosscasinos.com/Widgets/";
WidgetStore.gameWindows = {BingoGameWinUrl:{url:"http://widgetservice.bosscasinos.com/service.asmx?wsdl",width:"0",height:"0"},CasinoGameWinUrl:{url:"http://widgetservice.bosscasinos.com/service.asmx?wsdl",width:"0",height:"0"},PokerGameWinUrl:{url:"http://widgetservice.bosscasinos.com/service.asmx?wsdl",width:"0",height:"0"},JackpotGameWinUrl:{url:"",width:"0",height:"0"}};

//---

//WidgetStore.widget(WidgetStore.WIDGET_TYPE_FLASH, "Grid", "new Tournaments English", {width:460,height:600,bgColorEven:"ffffff",bgColorOdd:"f5f5f5",fontColor:"000000",fontSize:"11",fontFace:"Verdana",columns:"160,50,130,120",columnsAlign:"left,left,center,right",columnsCaptionShow:"true",columnsCaption:"Tournament Name,Game,Start Time,Buy In",bgColorHeader:"dddddd",fontColorHeader:"000000",sortable:"true",errReloadTime:"10",dataReloadTime:"300",serviceURL:"http://widgetservice.bosscasinos.com/service.asmx",serviceOperation:"GetPokerTournamentFeed",serviceParameters:{customerId:23,culture:"en-us",columns:"1,0,2,4",maxRows:50,timezoneOffset:0,campaign:"",stateFilter:"0,1",ignoreVisibleTime:"false"}});
	WidgetStore.widget(WidgetStore.WIDGET_TYPE_FLASH, "Grid", "new Tournaments English", {width:350,height:98,bgColorEven:"BBBBBB",bgColorOdd:"f5f5f5",fontColor:"000000",fontSize:"8",fontFace:"Verdana",columns:"130,35,100,80",columnsAlign:"left,left,center,right",columnsCaptionShow:"true",columnsCaption:"Tournament Name,Game,Start Time,Buy In",bgColorHeader:"dddddd",fontColorHeader:"000000",sortable:"true",errReloadTime:"10",dataReloadTime:"300",serviceURL:"http://widgetservice.bosscasinos.com/service.asmx",serviceOperation:"GetPokerTournamentFeed",serviceParameters:{customerId:23,culture:"en-us",columns:"1,0,2,4",maxRows:50,timezoneOffset:0,campaign:"",stateFilter:"0,1",ignoreVisibleTime:"false"}});
