/*global $, $f */

var replacePlaylist = function (playlistJSON, urlArray, sizeIndex, data) {
	var i, len = playlistJSON.length;
	for (i = 0; i < len; i += 1) {
		playlistJSON[i].url = urlArray[i][sizeIndex];
	}
	data.playlist = playlistJSON;
	return data;
};

var fullPicture = function (imageDOM, bigPic) {
	$(imageDOM).attr({
		width: 704,
		height: 370,
		src: bigPic
	});
};

var previewPicture = function (imageDOM, miniPic) {
	$(imageDOM).attr({
		width: 340,
		height: 248,
		src: miniPic
	});
};

var closeHandlers = function (element, playerID, playerDOM, playlistJSON,
	urlArray, data, sizeLinks, imageDOM, miniPic) {

	$(element).click(function () {
		// Reset playlist to "small"
		replacePlaylist(playlistJSON, urlArray, 0, data);

		$f(playerID).unload();
		$("#fadeOut").remove();
		$(playerDOM).parent().parent().removeClass("loaded");
		previewPicture(imageDOM, miniPic);
		sizeLinks.removeClass("active");

		// Hack. For some reason, sizeLinks[0] and sizeLinks.get(0) 
		// are "not a function"
		var temp = '#sizes_' + playerID + ' a:eq(0)';
		$(temp).addClass("active");
	});
};

/**
 * Reload player with new data. Using setPlaylist is more elegant, but causes
 * HW url-signing to throw a tantrum.
 */
var reloadPlayer = function (player_id, currentClip, seekTime, clipsList,
	swf_source,	playerData) {

	$f(player_id).unload();
	$(clipsList).empty();
	$(clipsList).append('<a href="${url}">${title}<span class="playlistTime">${time}</span></a>');
	$f(player_id, swf_source, playerData);
	$f(player_id).playlist(clipsList, {loop: true});
	if (seekTime !== 0) {
		$f(player_id).play(currentClip);
		var counter = 0;
		$f(player_id).onStart(function () {
			counter += 1;
			if (counter < 2) {      // Prevent infinite play-seek loops!
				$f(player_id).seek(seekTime);
			}
		});
	}
};

/**
 * Creates an overlay box when user is not logged in, prompting login or signup
 */
var promptVideoLogin = function () {
	$(".videoLoginPrompt").click(function () {
		$(this).next().fadeIn();
	});
	$(".vlp_dismiss").click(function (e) {
		e.preventDefault();
		$(this).parents(".vlp_inner").fadeOut();
	});
};

var createPlayer = function (playerID, playlistJSON, urlArray, bigPreview,
	s1, s2,	loginStatus, host) {

	var sizemap, files, dom, freeStatus, reveal, sizebuttons, miniPic, len, i,
		data, sizeLinks, imageSRC, s, t, c, sizeIndex, currentSize,
		fader, bigPic, closeWindow, player_info;

	sizemap = [
		{ width: '640',  height: '360',  label: '360p'  },
		{ width: '852',  height: '480',  label: '480p'  },
		{ width: '1280', height: '720',  label: '720p'  },
		{ width: '1920', height: '1080', label: '1080p' }
	];

	files = {
		player: s1 + 'source/js/flowplayer_electro_1.swf'
	};

	dom = {
		player: '#' + playerID,
		image: '#image_' + playerID,
		clips: '#clips_' + playerID,
		title: '#title_' + playerID,
		sizes: '#sizes_' + playerID,
		play1: '#play1_' + playerID,
		close: '#close_' + playerID
	};

	freeStatus = $(dom.player).parents(".video").parent()
		.hasClass("videoTour");

	if (loginStatus === 'notLoggedIn' && freeStatus === false) {
		promptVideoLogin();
	}

	reveal = dom.clips + ', ' + dom.title + ', ' + dom.sizes + ', ' + dom.play1;
	sizebuttons = dom.sizes + ' a';
	miniPic = $(dom.image).attr("src");

	len = playlistJSON.length;
	for (i = 0; i < len; i += 1) {
		playlistJSON[i].url = urlArray[i][0];
	}
	data = {
		playlist: playlistJSON,
		plugins: {
			controls: {
				tooltips:  {
					buttons: true
				}
			},
			f4m: {
				url: s1 + 'source/js/flowplayer.f4m.swf'
			},
			httpstreaming: {
				url: s1 + 'source/js/flowplayer.httpstreaming-3.2.6.swf'
			}
		},
		clip: {
			url: playlistJSON[0].url,
			scaling: 'fit',
			urlResolvers: ['f4m'],
			provider: 'httpstreaming',
			useStageVideo: true
		},
		onLoad: function (clip) {
			// Hack to fix disappearing play buttons on other players
			var q = ".player:not(#" + playerID + ")";
			$(q).each(function () {
				$(this).find(".play1").show();
			});
			
			// This used to be onBeforeLoad, but interfered with controlling 
			// the Flash update messages.
			$(dom.player).parent().parent().addClass("loaded");
			if (!$("#fadeOut").length) {
				$("body").prepend('<div id="fadeOut"></div>');
			}
			$(".flash_reload_banner").slideUp(300);
		}
	};

	player_info = { 
		src: files.player,
		version: [10, 1],

		// For testing "old flash player" prompt:
		// version: [20, 1],
		
		expressInstall: null,
		onFail: function () {
			
			var flash_version = flashembed.getVersion();

			// For testing "no flash player" prompt:
			// flash_version = [0, 0];

			flash_version = flash_version[0] + "." + flash_version[1];
			if (flash_version === "0.0") {
				$(".old_flash").hide();
			}
			else {
				$(".no_flash").hide();
			}

			// Remove default error message to prevent flickering
			$(dom.player).find("h2, h3, p").hide();

			$(".flash_version_number").text(flash_version);
			$(".update_flash").fadeIn(300);
		}
	};
	$f(playerID, player_info, data);
	$f(playerID).playlist(dom.clips, {loop: true});

	sizeLinks = $(sizebuttons);
	imageSRC = s1 + bigPreview;

	sizeLinks.click(function (e) {
		e.preventDefault();
		$(dom.player).parent().parent().addClass("loaded");
		s = $f(playerID).getState();
		t = 0;
		c = 0;
		if (s > 1 && s < 5) {   // player is buffering, playing, or paused
			c = $f(playerID).getClip().index;
			t = $f(playerID).getTime();
		}
		sizeLinks.removeClass("active");
		$(this).addClass("active");
		sizeIndex = $(sizeLinks).index(this);
		replacePlaylist(playlistJSON, urlArray, sizeIndex, data);
		if (!$("#fadeOut").length) {
			$("body").prepend('<div id="fadeOut"></div>');
			fader = '#fadeOut';
			closeHandlers(fader, playerID, dom.player, playlistJSON, urlArray,
				data, sizeLinks, dom.image, miniPic);
		}

		bigPic = s1 + bigPreview;
		fullPicture(dom.image, bigPic);
		if (s === 4) {
			$f(playerID).onBegin(function () {
				reloadPlayer(playerID, c, t, dom.clips, files.player, data);
			});
		} else if (s === 2 || s === 3) {  // player is playing or buffering
			reloadPlayer(playerID, c, t, dom.clips, files.player, data);
		}
	});

	closeWindow = '#close_' + playerID;
	closeHandlers(closeWindow, playerID, dom.player, playlistJSON, urlArray,
		data, sizeLinks, dom.image, miniPic);
	$(reveal).show();
};
