var MediaPlayer = function(input) {
	var id = input.id || '';
	var url = input.url || '';
	var trackingName = input.trackingName || url;		// If the media has a 'tracking name' set, use it for the tracking, otherwise use the URL
	var previewImage = input.previewImage || '';
	var width = input.width || 770;
	var height = (input.height >= 0 ? input.height : 435);
	var useCustomControls = input.useCustomControls;
	var skin = input.skin || '../assets/global/flash/heineken.swf';
	var onload = input.onLoad || '';
	var icon = input.icons || 'true';
	var autostart = (input.autostart == false || input.autostart == 'false') ? 'false' : 'true';

	if (isMediaAnImage(url)) {
		autostart = 'false';
		icon = 'false';
		useCustomControls = 'true';
	}

	(function init() {
		var flashvars = {
			'file': url,
			'image': previewImage,
			'height': height,
			'width': width,
			'icons':icon,
			'controlbar': (useCustomControls ? 'none' : 'over'),
			'skin': skin,
			'id': id,
			'autostart': autostart,
			'title': trackingName
		};

		var params = {
			allowFullScreen: true,
			allowScriptAccess: 'always',
			wmode: 'transparent'
		};

		var attributes = {
			'id': id,
			'name': id
		};
	
		swfobject.embedSWF('../assets/global/flash/player.swf', id, width.toString(), height.toString(), '9', null, flashvars, params, attributes, onload);		

	})();
}

// Test for media being an image instead of a video, based upon file extension
function isMediaAnImage(url) {
	function stringEndsWith(sourceStr, stringToFind, ignoreCase) {
		if (ignoreCase === true) {
			sourceStr = sourceStr.toLowerCase();
			stringToFind = stringToFind.toLowerCase();
		}
		return (stringToFind == sourceStr.substring(sourceStr.length - stringToFind.length));
	}

	var imgExts = ['.jpg', '.jpeg', '.gif', '.png', '.bmp'];
	for (var loop=0; loop<imgExts.length; loop++) {
		if (stringEndsWith(url, imgExts[loop], true)) return true;
	}
	return false;
}

function playerReady(options) {
	var player = $('#' + options.id)[0];
	var mediaHolder = player.parentNode;
	var mediaControls = $('#' + options.id + "-controls");

	player.addModelListener('STATE', 'playerStateChanged');

	if (mediaControls.length !== 0) {
		var playPauseButton = $('<a href="#" id="' + options.id + '-play-pause" class="media-button play-pause pause-state">Play</a>');
		playPauseButton.bind('click', function(e){
			e.preventDefault();
			player.sendEvent("PLAY");
		});

		var stopButton = $('<a href="#" class="media-button stop">Stop</a>');
		stopButton.bind('click', function(e){
			e.preventDefault();
			player.sendEvent("STOP");
		});

		var currentTime = $('<div id="' + options.id + '-current-time" class="media-text current-time">0:00</div>');

		var progressBar = $('<div class="media-block progress-bar"></div>');
		var currentProgress = $('<div id="' + options.id + '-current-progress" class="media-block current-progress">0%</div>');
		currentProgress.css('width','0%');
		progressBar.append(currentProgress);

		var totalDuration = $('<div id="' + options.id + '-total-duration" class="media-text total-duration">0:00</div>');

		var muteButton = $('<a href="#" class="media-button mute unmuted-state">Mute</a>');
		muteButton.bind('click', function(e) {
			e.preventDefault();
			player.sendEvent("MUTE");
			muteButton.toggleClass('unmuted-state');
			muteButton.toggleClass('muted-state');
			muteButton.html(muteButton.hasClass('unmuted-state') ? "Mute" : "Unmute");
		});

		var volumeControl = $('<div id="' + options.id + '-volume-control" class="media-block volume-control"></div>');

		var volumeLevel1 = $('<a href="#" class="media-button volume level-1 off">20% volume</a>');
		volumeLevel1.bind('click', function(e) {
			e.preventDefault();
			player.sendEvent("VOLUME", 20);
		});

		var volumeLevel2 = $('<a href="#" class="media-button volume level-2 off">40% volume</a>');
		volumeLevel2.bind('click', function(e) {
			e.preventDefault();
			player.sendEvent("VOLUME", 40);
		});

		var volumeLevel3 = $('<a href="#" class="media-button volume level-3 off">60% volume</a>');
		volumeLevel3.bind('click', function(e) {
			e.preventDefault();
			player.sendEvent("VOLUME", 60);
		});

		var volumeLevel4 = $('<a href="#" class="media-button volume level-4 off">80% volume</a>');
		volumeLevel4.bind('click', function(e) {
			e.preventDefault();
			player.sendEvent("VOLUME", 80);
		});

		var volumeLevel5 = $('<a href="#" class="media-button volume level-5 off">100% volume</a>');
		volumeLevel5.bind('click', function(e) {
			e.preventDefault();
			player.sendEvent("VOLUME", 100);
		});

		volumeControl.append(volumeLevel1,volumeLevel2,volumeLevel3,volumeLevel4,volumeLevel5);
		mediaControls.append(playPauseButton,stopButton,currentTime,progressBar,totalDuration,muteButton,volumeControl);

		var volumeLevel = player.getConfig().volume;
		var volumeElements = $('#' + options.id + '-volume-control a');

		for (var x = 0, y = volumeElements.length; x < y; x++) {
			if ((((x + 1) / y) * 100) < volumeLevel) {
				volumeElements[x].className = volumeElements[x].className.replace(' off', ' on');
			} else {
				volumeElements[x].className = volumeElements[x].className.replace(' on', ' off');
			}
		}

		player.addModelListener("TIME", "setPlayheadPosition");
		player.addModelListener("STATE", "setPlayPauseButton");
		player.addControllerListener("VOLUME", "setVolumeControl");
	}
}

function setVolumeControl(options) {
	var volumeLevel = options.percentage;
	var volumeElements = $('#' + options.id + '-volume-control a');
	for (var x = 0, y = volumeElements.length; x < y; x++) {
		if ((((x + 1) / y) * 100) <= volumeLevel) {
			volumeElements[x].className = volumeElements[x].className.replace(' off', ' on');
		} else {
			volumeElements[x].className = volumeElements[x].className.replace(' on', ' off');
		}
	}
}

function setPlayPauseButton(options) {
	var playPauseButton = $('#' + options.id + '-play-pause')[0];
	if (options.newstate == 'PLAYING' || options.newstate == 'PAUSED') {
		var isPlaying = options.newstate == 'PLAYING';
		playPauseButton.className = (isPlaying ? playPauseButton.className.replace('pause-state', 'play-state') : playPauseButton.className.replace('play-state', 'pause-state'));
		playPauseButton.innerHTML = (isPlaying ? 'Pause' : 'Play');
	} else if (options.newstate == 'IDLE' || options.newstate == 'COMPLETED') {
		playPauseButton.className = playPauseButton.className.replace('play-state','pause-state');
		playPauseButton.innerHTML = 'Play';
	}
}

function setTotalDuration(options) {
	var durationInSeconds = options.duration;
	var minutes = Math.floor(durationInSeconds / 60);
	var seconds = Math.round(durationInSeconds % 60);
	if (seconds < 10) seconds = '0' + seconds;

	var totalDuration = $('#' + options.id + '-total-duration');
	totalDuration.html(minutes + ':' + seconds);
}

function setPlayheadPosition(options) {
	setTotalDuration(options);
	
	var currentPlaybackPositionInSeconds = options.position;
	var durationInSeconds = options.duration;
	var playbackPositionAsPercentage = Math.round((currentPlaybackPositionInSeconds / durationInSeconds) * 100);

	var currentTime = $('#' + options.id + '-current-time');
	var currentProgress = $('#' + options.id + '-current-progress');

	var minutes = Math.floor(currentPlaybackPositionInSeconds / 60);
	var seconds = Math.round(currentPlaybackPositionInSeconds % 60);
	if (seconds < 10) seconds = '0' + seconds;

	currentTime.html(minutes + ':' + seconds);
	currentProgress.css('width', playbackPositionAsPercentage + '%');
	currentProgress.html(playbackPositionAsPercentage + '%');
}

// We use this function to send Google Analytic tracking events when the video starts playing and when it finishes playing.
// See http://developer.longtailvideo.com/trac/wiki/FlashEvents for details of the JW Player API
function playerStateChanged(player) {
	var playerElConfig = $('#' + player.id)[0].getConfig();
	if (isMediaAnImage(playerElConfig.file)) return;	// We don't want to send 'play' events for images. Could potentially use getConfig().type instead?

	if (player.newstate == 'PLAYING' && (player.oldstate == 'IDLE' || player.oldstate == 'BUFFERING' || player.oldstate == 'COMPLETED')) {
		hdp.tracking.trackEvent('video', 'play', playerElConfig.title);
	} else if (player.newstate == 'COMPLETED' && player.oldstate != 'COMPLETED') {
		hdp.tracking.trackEvent('video', 'complete', playerElConfig.title);
	}
}
