var Overlay = new Object();
Overlay.overlays = { ugc: [], premium: [] };
Overlay.overlays_index = {};
Overlay.embed_div_id = null;
Overlay.embed_when_no_results = true;
Overlay.callback = null;
Overlay.options = null; 
Overlay.player_options = null;
Overlay.loaded_default_channel = false;
Overlay.param_guid = null;
Overlay.BASE_QUERY_URL = 'http://search.retail.overlay.tv/solr/search';
Overlay.DEFAULT_PLAYER_OPTIONS = {
	width: 680,
	height: 582,
	playerURL: 'http://content.retail.overlay.tv/flash/otv/retail_player.swf',
	expressInstallURL: 'http://www.overlay.tv/images/media/expressinstall.swf',
	flashVersion: '9',
	parameters: {
		allowfullscreen: true,
		allowScriptAccess: 'always'
	},
	flashVars: {
		THUMBNAIL_BASE_URL: 'http://content.retail.overlay.tv/overlays/images',
		PAGE_URL: escape(window.location),
		PLAYLISTS: { ugc: [], premium: [] }
	}
}
Overlay.DEFAULT_OPTIONS = {
	selection: 'random'
}

Overlay.indexOf = function(array, element) {
	for(var i=0; i<array.length; i++){
		if(array[i]==element){
		return i;
		}
	}
	return -1;
}

Overlay.addJavascript = function(url, complete) {
	var script = document.createElement("script");
    script.src = url;
    script.type = "text/javascript";
	script.onloadDone = false;

	script.onload = function() {
		script.onloadDone=true;
		if (complete != null){
			if(url.match(/swfobject/)) swfobject.callDomLoadFunctions();
			complete();
		}
	}
	script.onreadystatechange = function() {
		if(('loaded'===script.readyState || 'complete' === script.readyState) && !script.onloadDone) {
			script.onloadDone=true;
			if(url.match(/swfobject/)) swfobject.callDomLoadFunctions();
			if (complete != null) complete();
		}
	}
	
	document.getElementsByTagName('head')[0].appendChild(script);
}

Overlay.loadJSON = function(json) {
	Overlay.overlays = Overlay.parseJSON(json);
	// If we get no overlays and there is a default channel set, try this again
	if(Overlay.loaded_default_channel != true && Overlay.overlays.premium.length == 0 && Overlay.options.default_channel != null) {
		Overlay.loaded_default_channel = true;
		
		var options = { 
			client: Overlay.options.client,
			criteria: {
				channels: Overlay.options.default_channel
			}
		}
	
		Overlay.addJavascript(Overlay.BASE_QUERY_URL + Overlay.buildURL(options));
		return;
	}
	
	var guid = Overlay.chooseOverlay(Overlay.overlays.premium);
	Overlay.player_options.flashVars.PLAYLISTS = Overlay.overlays; // Overlay.formatPlaylist(Overlay.overlays);
	
	if (Overlay.overlays.premium.length > 0 || Overlay.overlays.ugc.length > 0 || Overlay.embed_when_no_results) {
		Overlay.embed(Overlay.embed_div_id, guid, Overlay.options.client, Overlay.player_options);
	} else if (Overlay.callback) {
		Overlay.callback(Overlay);
	}
}

/**
 * Takes a data object from a Solr response, such as:
 *  
 *   { guid_guid: "d74e5a50-b7c5-401a-a726-0b5be87b5b52",
 *     overlay_type_s: "premium",
 *     score:	0.7001375,
 *     created_at_d: ["2010-02-03T20:50:20Z"],
 *     description_t: ["Description for Overlay 3."],
 *     title_t: ["Overlay 3"] }
 *
 * And normalizes it into something that looks like:
 *
 *   { guid: "d74e5a50-b7c5-401a-a726-0b5be87b5b52",
 *     score:	0.7001375,
 *     created_at: "2010-02-03T20:50:20Z",
 *     title: "Overlay 3",
 *     description: "Description for Overlay 3." }
 *
 * Flash players use the normalized data form.
 */
Overlay.normalizeSolrData = function(data) {
  var normalized = {
    guid:         data.guid_guid,
    score:        data.score,
    created_at:   data.created_at_d[0],
    title:        data.title_t[0],
    submitted_by: data.submitted_by_s
  };
  
  // descriptions are optional, and thus must be specially handled
  if (data.description_t != null) {
    normalized.description = data.description_t[0];
  }
  
  return normalized;
};

Overlay.parseJSON = function(json) {	
	if(typeof json == 'string') {
		json = eval("(" + unescape(json) + ")");
	}
	
	var overlays = {};
	overlays.premium = [];
	overlays.ugc = [];

	for(var i = 0; i < json.response.docs.length; i++) {
		var overlay = json.response.docs[i];
		var playlist_overlay;

		switch (overlay.overlay_type_s) {
			case "premium":
 				playlist_overlay = Overlay.normalizeSolrData(overlay);
				overlays.premium.push(playlist_overlay);
				Overlay.overlays_index[playlist_overlay.guid] = Overlay.indexOf(overlays.premium, playlist_overlay);
				break;
			case "ugc":
 				playlist_overlay = Overlay.normalizeSolrData(overlay);
				overlays.ugc.push(playlist_overlay);
				break;
		}
	}
	return overlays;
}

Overlay.formatPlaylist = function(playlist) {
	var types = ["premium", "ugc"];
	for(var j = 0; j < types.length; j++) {
		var type = types[j];
		for(var i = 0; i < playlist[type].length; i++) {
			playlist[type][i] = playlist[type][i]["guid"];
		}
	}
	return playlist;
}

Overlay.embed = function(div_id, guid, client, player_options) {
	if(document.getElementById(div_id) == null) {
		// document.write('<div id="' + div_id + '"></div>');
		var newdiv = document.createElement('div');
        newdiv.setAttribute('id', div_id);
		document.body.appendChild(newdiv);
	}
		
	if(client == null) throw 'No Client Specified';
	if(player_options == null) {
		player_options = Overlay.DEFAULT_PLAYER_OPTIONS;
	} else { 
		Overlay.mergeOptions(player_options, Overlay.DEFAULT_PLAYER_OPTIONS);
	}

	if(Overlay.options == null) {
		Overlay.options = Overlay.DEFAULT_OPTIONS;
		Overlay.options.client = client;
	}

	if(player_options.flashVars.OVERLAY_GUID != null) guid = player_options.flashVars.OVERLAY_GUID;
	if(Overlay.param_guid != null) guid = Overlay.param_guid;
	player_options.flashVars.OVERLAY_GUID = guid;
	player_options.flashVars.PARTNER = client;
	player_options.flashVars.CLIENT = client;	
	player_options.flashVars.OPTIONS = escape(Overlay.optionsToString(Overlay.options));

	var guid_index = Overlay.overlays_index[guid];
	var chosen_overlay = { guid: guid };
	
	if(typeof(guid_index) != "undefined") {
		chosen_overlay = player_options.flashVars.PLAYLISTS["premium"][guid_index];
		player_options.flashVars.PLAYLISTS["premium"].splice(guid_index,1);
	}
	
	player_options.flashVars.PLAYLISTS["premium"].splice(0,0,chosen_overlay);
	player_options.flashVars.PLAYLISTS = escape(Overlay.optionsToString(player_options.flashVars.PLAYLISTS));

	var complete = function() {
		swfobject.embedSWF(
			player_options.playerURL,
			div_id,
			player_options.width,
			player_options.height,
			player_options.flashVersion,
			player_options.expressInstallURL,
			player_options.flashVars,
			player_options.parameters
		);
		if (Overlay.callback) {
			Overlay.callback(Overlay);
		}
	};

	if(typeof swfobject == 'undefined') {
		Overlay.addJavascript("http://static.retail.overlay.tv/swfobject.js", complete);	
	} else {
		complete();
	}

}

Overlay.optionsToString = function(options) {

	var jsonObjects = [];
    if (typeof options == 'string') {
		return "\"" + options + "\"";
	} 
	else {
		for (var option in options) {
			switch (typeof options[option]) {
				case 'string':
					var value = "\"" + options[option] + "\"";
					break;
				case 'object':
					if (options[option] instanceof Array) {
						if (options[option].length == 0) {
							var value = "[]";
						}
						else {
							var array_objs = [];
							for (var i = 0; i < options[option].length; i++) {
								array_objs.push(Overlay.optionsToString(options[option][i]));
							}
							var value = "[" + array_objs.join(",") + "]";
						}
					}
					else {
						var value = Overlay.optionsToString(options[option]);
					}
					break;
				default:
					var value = 'null';
			}
			
			if (value != 'null') {
				jsonObjects.push("\"" + option + "\": " + value);
			}
		}
	}
	return "{" + jsonObjects.join(",") + "}";
}

Overlay.mergeOptions = function(options, default_options) {
	for(var option in default_options) {
		if(typeof default_options[option] == 'object' && options[option] != null) {
			Overlay.mergeOptions(options[option], default_options[option]);
		} else {
			if(options[option] == null) {
				options[option] = default_options[option];
			}
		}
	}
}

Overlay.chooseOverlay = function(overlays) {
	if(overlays.length > 0) {
		switch(Overlay.options.selection) {
			case 'random':
				return overlays[Math.round(Math.random() * (overlays.length - 1))].guid;
				break;
			case 'ranked':
				overlays.sort(function(a, b){ a.score - b.score });
				return overlays[0].guid;
				break;
			default:
				if(typeof options.selected == 'function') {
					return options.selected(overlays);
				} else {
					return overlays[0]; // Fallback, just choose the first one
				}
		}
	} else {
		return Overlay.options.default_overlay;
	}	
}

Overlay.playerQuery = function(text) {
	Overlay.options.text = text;
	return Overlay.BASE_QUERY_URL + Overlay.buildURL(Overlay.options);
}

/**
 * Builds a URL path from the specified query options. For example,
 * where the query options are:
 *
 *   { client: 1,
 *     criteria: { tags: ['tag1', 'tag2'] },
 *     type: 'Channel' }
 *
 * Then the URL is built as:
 *
 *   "1/type_q/Channel/ta_q/tag1/tag2"
 */
Overlay.buildURL = function(options) {
	var criterias = [];
	var query = options.client;
	
	// Add the specified model type (e.g. Channel) to the query URL if
	// the type option is specified.
	if (options.type) {
	  query += '/type_q/' + escape(options.type);
	}
	
	for(var criteria in options.criteria) {
		criterias.push(criteria);
	}
	
	for(var i=0; i < criterias.sort().length; i++) {
		query += Overlay.buildURLChunk(criterias[i].substring(0,2) + '_q', options.criteria[criterias[i]]);
	}
	
	if(options.text != null) {
		query += '/te_q/' + escape(options.text);
	}

	return '/' + query;
}

Overlay.buildURLChunk = function(type, params) {
	return '/' + type + '/' + params.sort().join('/');
}

Overlay.queryEmbed = function(div_id, query_options, player_options, embed_when_no_results, callback) {
	
	function executeQuery(query) {
		Overlay.addJavascript(Overlay.BASE_QUERY_URL + query);
	}
	
	if(query_options == null) throw 'No options supplied in Overlay.embed';
	Overlay.mergeOptions(query_options, Overlay.DEFAULT_OPTIONS);
	
	Overlay.loaded_default_channel = false;
	
	Overlay.embed_div_id = div_id;
	Overlay.options = query_options;
	Overlay.player_options = player_options;
	Overlay.callback = callback;
	if (embed_when_no_results != undefined) {
		Overlay.embed_when_no_results = embed_when_no_results;
	}
	
	executeQuery(Overlay.buildURL(Overlay.options));	
}

Overlay.getParameter = function(name) {
	var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
	match = regex.exec(window.location)
	if(match != null) {
		return match[1];
	} else {
		return null;
	}
}

Overlay.param_guid = Overlay.getParameter('overlay_guid');
if(Overlay.param_guid == null) Overlay.param_guid = Overlay.getParameter('OVERLAY_GUID');
Overlay.DEFAULT_PLAYER_OPTIONS.flashVars.context = Overlay.getParameter('context');
