/*global $, $type, $defined, Browser, Class, Events, Options, Element, Swiff, SWFObject, escape, Json */
/*global DR:true, isJavascriptReadyForFlash:true */

/*
 * This script provides initialization for UPlayer for both MooTools 1.11 and
 * >1.2 sites. The createUPlayer21 function is a wrapper that calls the
 * apropriate SwiffObject wrappers and creates the UPlayer, or falls back to a
 * message about missing flash player.
 *
 * NOTE: The MooTools 1.11 compatible version is not featurecomplete, and
 * should only be used on legacy sites. All new sites should use the
 * DR.Ung.UPlayer class which will be actively maintained.
 */

if ($defined(window.Browser)) {
	// MooTools 1.2 domready
	isJavascriptReadyForFlash = function() { return Browser.loaded; };
} else {
	// MooTools 1.11 domready
	isJavascriptReadyForFlash = function() { return window.loaded; };
}

function createUPlayer21(container, uplayerObject)
{
	container = $(container).empty();
	uplayerObject.swf = uplayerObject.alternativeSWF ? uplayerObject.alternativeSWF : "/ung/flash/uplayer/uplayer.swf"; // "/ung/flash/uplayer/uplayer2.1.swf";

	var so;

	if ($defined(window.Swiff)) {
		so = new DR.Ung.UPlayer(container, uplayerObject);
	} else {
		// backwards compatibility with MooTools 1.11 and old SWFObject
		so = new SWFObject(uplayerObject.swf, container.id + "_player", uplayerObject.width, uplayerObject.height, uplayerObject.version, "#000000");
		so.addParam("flashvars", "data=" + escape(Json.toString(uplayerObject)));
		so.addParam("allowFullScreen", "true");
		so.addParam("name", container.id + "_player");
                so.addParam("allowScriptAccess", 'sameDomain');
		so.write(container.id);

		so = container.lastChild;
		DR.Ung.UPlayer.allUPlayers.push(so);
	}

	if (!container.getFirst())
	{
		container.set('html', '<div class="uplayer_error" style="height:'+uplayerObject.height+'px; width:'+uplayerObject.width+'px">' +
		"<h2>Flash plugin</h2>" +
		"<p>Din Flash Player skal opdateres før du kan se denne video</p>" +
		"<p>For at opgradere - <a href=\"http://www.macromedia.com/software/flash/about/\" target=\"_blank\">klik her</a></p>" +
		"</div>");
	}
	
	return so; 
}

function disposeUPlayer(player) {

	if ($type(player) === 'object') {
		player = player.player.object;
	}

	try
	{
		player.uplayer_play = null;
		player.uplayer_stop = null;
		player.pause = null;
		player.next = null;
		player.prev = null;
		player.skipTo = null;
		player.send = null;
	}
	catch(except) { }

	if (Element.prototype.remove) {
		Element.prototype.remove.apply(player);
	} else {
		Element.prototype.dispose.apply(player);
	}

	player = null;
}

if (!window.DR) { DR = {}; }
if (!DR.Ung) { DR.Ung = {}; }

DR.Ung.UPlayer = new Class({
	Implements: [Events, Options]
	,options: {
		width:"620",
		height:"348",
		version:"9.0.114",
		smoothing: false,
		loopPlaylist: false,
		autoplay: false,
		//swf: '/ung/flash/uplayer/uplayer2.1.swf'
		swf: '/ung/flash/uplayer/uplayer.swf'
	},

	initialize: function (container, options) {

		this.setOptions(options);
		this.container = container;

		this.player = new Swiff(this.options.swf, {
			width: this.options.width
			,height: this.options.height
			,container: container
			,version: this.options.version
			,id: ($type(container) === 'string' ? container : container.get('id')) + '_player'
			,params: {
				bgcolor: "#000000"
				,allowFullScreen: true
                ,allowScriptAccess: 'sameDomain'
			}
			,vars: {
				data: JSON.encode(this.options)
			}
			,callBacks: {
				onLoad: this.onLoad.bind(this)
				,onData: this.onData.bind(this)
				,onSkip: this.onSkip.bind(this)
				,onStateChange: this.onStateChange.bind(this)
				,onComplete: this.onComplete.bind(this)
				,onModuleEvent: this.onModuleEvent.bind(this)
			}
		});

        /*
        Property: state
            Set to 'init', 'play' or 'pause' depending on what state the player is in
        */
        this.state = 'init';

		// store this for cleanup...
		if (!$defined(DR.Ung.UPlayer.allUPlayers)) {
			DR.Ung.UPlayer.allUPlayers = [];
		}
		DR.Ung.UPlayer.allUPlayers.push(this.player);
	}
	,onLoad: function () {
		/*
		Event: load
			Fired when the player is loaded and ready
		*/
		this.fireEvent('load');
	}
	,onData: function () {
		this.fireEvent('data');
	}
	,onSkip: function (pos) {
		/*
		Event: skip
			Fired when the player skips to another item in playlist
		*/
		this.fireEvent('skip', pos);
	}
	,onStateChange: function (state) {

        if (state === 'play' || state === 'pause') {
            this.state = state;
        }

		/*
		Event: stateChange
			Fired when the players state changes from stopped to playing to paused.

		Parameters:
			state - the new state
		*/
		this.fireEvent('stateChange', state);
	}
					
	,onComplete: function(state)
	{
		this.fireEvent('complete', state);
	}
	
	,onModuleEvent: function(state)
	{
		this.fireEvent('moduleEvent', state);
	}

	/*
	Function: play
	*/
	,play : function() {
		Swiff.remote(this.player.object, 'uplayer_play');
	}
	/*
	Function: pause
	*/
	,pause : function() {
		Swiff.remote(this.player.object, 'pause');
	}
	/*
	Function: skipTo
	   
	Parameters:
		pos - Position in playlist to play
	*/
	,skipTo : function(pos) {
		Swiff.remote(this.player.object, 'skipTo', pos);
	}

	// wrapper for backwards compatibility
	,uplayer_play: function() {
		this.play();
	}

	,toElement: function () {
		return $(this.container);
	}
	/*
		Function: loadPlaylist
		
			Loads a new playlist from a file
			
			Parameters:
				file	-	Path to a playlist XML file
	*/
	,loadPlaylist : function(file)
	{
		Swiff.remote(this.player.object, 'loadPlaylist', file);
	}
	/*
		Function: setPlaylist
		
			Sets the playlist to an Array of playlist element objects
			
			Parameters:
				array	-	Path to a playlist XML file
	*/
	,setPlaylist : function(array)
	{
		Swiff.remote(this.player.object, 'setPlaylist', array);
	}

	/*
		Function: getProgress
		
            returns the progress of the players as a timestamp (02:00 or 00:04:25)
	*/
	,getProgress: function()
	{
		return Swiff.remote(this.player.object, 'getProgress');
	}

	/*
		Function: setProgressFloat

            jump to a specific point in the currently playing clip

            Parameters:
                position    -   A number between 0 and 1 where 0 is the beginning of the clip, and 1 is the end
	*/
	,setProgressFloat: function(position)
	{
		Swiff.remote(this.player.object, 'setProgressFloat', position);
	}
	
	
});

DR.Ung.UPlayer.allUPlayers = [];

DR.Ung.UPlayer.unload = function(e) {

	try {
		window.removeEvent('unload', DR.Ung.UPlayer.unload);
	} catch (except) {
	}

	for (var i = 0; i < DR.Ung.UPlayer.allUPlayers.length; i++)
	{
		var player = DR.Ung.UPlayer.allUPlayers[i];
		try
		{
			player.uplayer_play = null;
			player.uplayer_stop = null;
			player.pause = null;
			player.next = null;
			player.prev = null;
			player.skipTo = null;
			player.send = null;
		}
		catch(exception) { }
	}
};

// attach cleanup event
window.addEvent('unload', DR.Ung.UPlayer.unload); 



