/**
 *	PokkariPlayer class
 * 	subclasses @PokkariElement
 *	For writing of video player inline
 *	$Header: /usr/local/cvsroot/otter/html/scripts/pokkariPlayer.js,v 1.13 2006/07/25 19:52:17 mike Exp $
*/

function PokkariPlayer(params) { 
	this.MAX_WIDTH = 512;
	this.MAX_HEIGHT = 512;
}

PokkariPlayer.prototype = new Object();
PokkariPlayer.prototype.constructor = PokkariPlayer;

PokkariPlayer.prototype.setSiteUrl = function(url) {
	this.site_url = url;
}

PokkariPlayer.prototype.getSiteUrl = function() {
	if(this.site_url) { 
		return this.site_url;
	} else {
		return '';
	}
}

PokkariPlayer.prototype.setPrimaryMediaUrl = function(url) {
	this.primary_media_url = url;
}

PokkariPlayer.prototype.getPrimaryMediaUrl = function() {
	return this.primary_media_url;
}

PokkariPlayer.prototype.setWidth = function(width) {
	if(width == -1) { width = 320 }
	this.width = width;
}

PokkariPlayer.prototype.setResizeRatio = function(ratio) {
	this.resizeRatio = ratio;
}

PokkariPlayer.prototype.getResizeRatio = function() {
	return this.resizeRatio;
}

/**
* TODO - FIXME
* You MUST call getWidth() before getHeight() - otherwise you'll get
* the wrong aspect ratio.
* Should probably move this into a single getDimensions() method.
*/
PokkariPlayer.prototype.getWidth = function() {
	if(this.width) {
		if(this.width < this.MAX_WIDTH) {
			return this.width;
		} else {
			this.setResizeRatio(this.MAX_WIDTH / this.width);
			return this.MAX_WIDTH;
		}
	} else {
		return '320';
	}
}

PokkariPlayer.prototype.setHeight = function(height) {

	if(height == -1) { height = 240 }

	this.height = height;
}

PokkariPlayer.prototype.getHeight = function() {
	if(this.height) {
		if(this.getResizeRatio()) {
			return this.height * this.getResizeRatio();
		} else {
			if(this.height < this.MAX_HEIGHT) {
				return this.height + 20;
			} else {
				return this.MAX_HEIGHT + 20;
			}
		}
	} else {
		return '260';
	}
}

PokkariPlayer.prototype.setAutoPlay = function(ap) {
	this.autoPlay = ap;
}

PokkariPlayer.prototype.getAutoPlay = function() {
	if(this.autoPlay) {
		return true;
	} else {
		return false;
	}
}

PokkariPlayer.prototype.setPlayerTarget = function(obj) {
	this.playerTarget = obj;	
}

PokkariPlayer.prototype.getPlayerTarget = function() {
	return this.playerTarget;
}

PokkariPlayer.prototype.getPlayer = function() {
	return $('video_player_object');
}

PokkariPlayer.prototype.getTime = function() {
	throw("Cannot get time from generic embed");
}

PokkariPlayer.prototype.setTime = function() {
	throw("Cannot set time on generic embed");
}

PokkariPlayer.prototype.getDuration = function() {
	throw("Cannot get duration from generic embed");
}

PokkariPlayer.prototype.getStatus = function() {
	throw("Cannot get plugin status from generic embed");
}

PokkariPlayer.prototype.setPermalinkUrl = function(url) {
	this.permalinkUrl = url;
}

PokkariPlayer.prototype.getPermalinkUrl = function() {
	return this.permalinkUrl;
}

PokkariPlayer.prototype.setAdvertisingType = function(t) {
	this.adType = t;
}

PokkariPlayer.prototype.getAdvertisingType = function() {
	return this.adType;
}

PokkariPlayer.prototype.setPrerollAnimationUrl = function(value) {
	this.prerollAnimationUrl = value;
}

PokkariPlayer.prototype.getPrerollAnimationUrl = function() {
	return this.prerollAnimationUrl;
}

PokkariPlayer.prototype.setPostrollAnimationUrl = function(value) {
	this.postrollAnimationUrl = value;
}

PokkariPlayer.prototype.getPostrollAnimationUrl = function() {
	return this.postrollAnimationUrl;
}

PokkariPlayer.prototype.convertTimeToSeconds = function(timecode) {
	var time = timecode.replace(/;\d+$/,"");
	var timeParts = time.split(':');
	var result = timeParts[0]*60*60 + timeParts[1]*60 + timeParts[2];
	return result;
}

PokkariPlayer.prototype.convertSecondsToTime = function(s) {
	var d = new Date(s*1000);
	return d.toGMTString().substr(17,8);
}

PokkariPlayer.prototype.ensureSeconds = function(p) {
	if (isNaN(p)) { return this.convertTimeToSeconds(p); }
	else { return p; }
}

PokkariPlayer.prototype.ensureTime = function(p) {
	if (!isNaN(p)) { return this.convertSecondsToTime(p); }
	else { return p; }
}

PokkariPlayer.prototype.render = function() {

	if(!this.getPrimaryMediaUrl()) {
		throw("Cannot render without primary media URL");
	}
        if(!this.getPlayerTarget()) {
                throw("Cannot render without player target");
        }

	var autoPlay = (this.getAutoPlay()) ? 'true' : 'false';

	var html = '<embed src="' + this.getPrimaryMediaUrl() + '" autoplay="' + autoPlay + '" controller="true" width="' + this.getWidth() + '" height="' + this.getHeight() + '" scale="aspect" EnableJavaScript="true" ></embed>';

	this.getPlayerTarget().style.width = this.getWidth() + "px";
	this.getPlayerTarget().style.height = this.getHeight() + "px";

	this.getPlayerTarget().innerHTML = html;
}

PokkariPlayer.GetInstanceByMimeType = function(type) {

	var obj;

        switch(type) {
                case 'video/quicktime':
			return new PokkariQuicktimePlayer();
                break;
		case 'video/mpg':
			return new PokkariQuicktimePlayer();
		break;
		case 'video/mpeg':
			return new PokkariQuicktimePlayer();
		break;
		case 'video/mp4':
			return new PokkariQuicktimePlayer();
		break;
		case 'video/x-dv':
			return new PokkariQuicktimePlayer();
		break;
		case 'video/x-flv':
			return new PokkariFlashPlayer();
		break;
		case 'video/ms-wmv':
			return new PokkariWindowsPlayer();
		break;
		case 'video/x-ms-wmv':
			return new PokkariWindowsPlayer();
		break;
		case 'video/ms-wmv,video/x-ms-wmv':
			return new PokkariWindowsPlayer();
		break;
		case 'video/msvideo':
			return new PokkariWindowsPlayer();
		break;
		case 'application/ogg':
			return new PokkariTheoraPlayer();
		break;
		case 'video/theora':
			return new PokkariTheoraPlayer();
		break;
		case 'video/vnd.objectvideo':
			return new PokkariQuicktimePlayer();
		break;
		case 'image/jpeg':
			return new PokkariImagePlayer();
		break;
		case 'image/png':
			return new PokkariImagePlayer();
		break;
		case 'image/bmp':
			return new PokkariImagePlayer();
		break;
		case 'image/gif':
			return new PokkariImagePlayer();
		break;
		default:
			return new PokkariPlayer();
		break;
        }

}

function PokkariWindowsPlayer(params) {

}

PokkariWindowsPlayer.prototype = new PokkariPlayer();
PokkariWindowsPlayer.prototype.constructor = PokkariWindowsPlayer;
PokkariWindowsPlayer.prototype.superclass = PokkariPlayer;

PokkariWindowsPlayer.prototype.getPrimaryMediaUrl = function() {

	if (window.navigator.platform == "Win32" &&
		(this.getAdvertisingType() || 
		this.getPrerollAnimationUrl() || 
		this.getPostrollAnimationUrl()))
	{
		var url = new Url(this.getPermalinkUrl());
		url.setQueryParam("skin","asx");
		url.setQueryParam("preurl",this.getPrerollAnimationUrl());
		url.setQueryParam("posturl",this.getPostrollAnimationUrl());

		return url.getUrl();
	}
	else {
		return PokkariPlayer.prototype.getPrimaryMediaUrl.apply(this,[]);
	}
}

PokkariWindowsPlayer.prototype.render = function() {
	
	if(!this.getPrimaryMediaUrl()) {
		throw("Cannot render without primary media URL");
	}
	if(!this.getPlayerTarget()) {
		throw("Cannot render without player target");
	}

	var autoPlay = (this.getAutoPlay()) ? 'true' : 'false';

	var html = '<object id="video_player_object" width="' + this.getWidth() + '" height="' + this.getHeight() + '" classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" standby="Loading Microsoft Windows Media Player components...", type="application/x-oleobject">';


	html += '<param name="fileName" value="' + this.getPrimaryMediaUrl() + '">';
	html += '<param name="animationStart" value="true">';

	if (typeof(this.startTime) != "undefined" && this.startTime) {
		html += '<param name="currentPosition" value="'+this.startTime+'">';
		autoPlay = true;
	}

	html += '<param name="AutoStart" value="' + autoPlay + '">';
	html += '<param name="showControls" value="true">';
	html += '<param name="transparentatStart" value="false">';
	html += '<param name="loop" value="false">';

	html += '<embed type="application/x-mplayer2" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" id="video_player_object" name="video_player_object" displaysize="4" autosize="-1" bgcolor="darkblue" showcontrols="true" showtracker="-1" showdisplay="0" showstatusbar="-1" videoborder3d="-1" width="' + this.getWidth() + '" height="' + this.getHeight() + '" src="' + this.getPrimaryMediaUrl() + '" autostart="' + autoPlay + '" designtimesp="5311" loop="false"';
	if (typeof(this.startTime) != "undefined" && this.startTime) {
		html += ' currentPosition="'+this.startTime+'"';
	}
	
	html += '></embed>';
	html += '</object>';

	this.getPlayerTarget().style.width = this.getWidth() + "px";
	this.getPlayerTarget().style.height = this.getHeight() + "px";

	this.getPlayerTarget().innerHTML = html;
}

PokkariWindowsPlayer.prototype.setTime = function(time) {
	var s = this.ensureSeconds(time);
	var player = this.getPlayer();

	if (player) {	
		player.controls.currentPosition = s;
	}
	else {
		this.startTime = s;
	}
}

PokkariWindowsPlayer.prototype.getTime = function() {
	var player = this.getPlayer();

	if (player) {
		player.controls.currentPosition;
	}
	else if (this.startTime) {
		return this.startTime;
	}
	else {
		return null;
	}
}

PokkariWindowsPlayer.prototype.getDuration = function() {
	var player = this.getPlayer();

	if (player) {
		player.currentMedia.duration;
	}
	else {
		return null;
	}
}

PokkariWindowsPlayer.prototype.getStatus = function() {
	// TODO FIXME Convert status
	//Value 	State 	Description
	//0 	Undefined 	Windows Media Player is in an undefined state.
	//1 	Stopped 	Playback of the current media item is stopped.
	//2 	Paused 	Playback of the current media item is paused. When a media item is paused, resuming playback begins from the same location.
	//3 	Playing 	The current media item is playing.
	//4 	ScanForward 	The current media item is fast forwarding.
	//5 	ScanReverse 	The current media item is fast rewinding.
	//6 	Buffering 	The current media item is getting additional data from the server.
	//7 	Waiting 	Connection is established, but the server is not sending data. Waiting for session to begin.
	//8 	MediaEnded 	Media item has completed playback.
	//9 	Transitioning 	Preparing new media item.
	//10 	Ready 	Ready to begin playing.
	//11 	Reconnecting
	var player = this.getPlayer();

	if (player) {
		return player.playState;
	}
	else {
		return null;
	}
}


function PokkariQuicktimePlayer(params) {

}

PokkariQuicktimePlayer.prototype = new PokkariPlayer();
PokkariQuicktimePlayer.prototype.constructor = PokkariQuicktimePlayer;
PokkariQuicktimePlayer.prototype.superclass = PokkariPlayer;

PokkariQuicktimePlayer.prototype.getPrimaryMediaUrl = function() {
	if (this.getAdvertisingType() ||
		this.getPrerollAnimationUrl() ||
		this.getPostrollAnimationUrl()) 
	{
		var url = new Url(this.getPermalinkUrl());
		url.setQueryParam("skin","smil");
		url.setQueryParam("preurl",this.getPrerollAnimationUrl());
		url.setQueryParam("posturl",this.getPostrollAnimationUrl());
		return url.getUrl();
	}
	else {
		return PokkariPlayer.prototype.getPrimaryMediaUrl.apply(this,[]);
	}
}

PokkariQuicktimePlayer.prototype.getTime = function() {
	var player = this.getPlayer();

	return player.GetTime() / player.GetTimeScale();
}

PokkariQuicktimePlayer.prototype.setTime = function(time) {
	var player = this.getPlayer();

	time = time * player.GetTimeScale();

	player.SetTime(time);
}

PokkariQuicktimePlayer.prototype.getDuration = function() {
	var player = this.getPlayer();

	return player.GetDuration() / player.GetTimeScale();
}

PokkariQuicktimePlayer.prototype.getPlayer = function() {
	
	return document.video_player_object;
	
}

PokkariQuicktimePlayer.prototype.getStatus = function() {
	return this.getPlayer().GetPluginStatus();
}

PokkariQuicktimePlayer.prototype.render = function() {
	if(!this.getPrimaryMediaUrl()) {
		throw("Cannot render without primary media URL");
	}
	if(!this.getPlayerTarget()) {
		throw("Cannot render without player target");
	}

	var autoPlay = (this.getAutoPlay()) ? 'true' : 'false';

	var html = '<object id="video_player_object" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="' + this.getWidth() + 
		'" height="' + this.getHeight() + '" codebase="http://www.apple.com/qtactivex/qtplugin.cab">';

	html += '<param name="src" value="' + this.getPrimaryMediaUrl() + '">';
	html += '<param name="autoplay" value="' + autoPlay + '">';
	html += '<param name="controller" value="true">';
	html += '<param name="scale" value="aspect">';

	html += '<embed name="video_player_object" src="' + this.getPrimaryMediaUrl() + '" autoplay="' + autoPlay + 
		'" controller="true" width="' + this.getWidth() + '" height="' + this.getHeight() + 
		'" scale="aspect" EnableJavaScript="true" type="video/quicktime"></embed>';

	html += '</object>';

	this.getPlayerTarget().style.width = this.getWidth() + "px";
	this.getPlayerTarget().style.height = this.getHeight() + "px";

	this.getPlayerTarget().innerHTML = html;

}

function PokkariImagePlayer(params) {

}

PokkariImagePlayer.prototype = new PokkariPlayer();
PokkariImagePlayer.prototype.constructor = PokkariImagePlayer;
PokkariImagePlayer.prototype.superclass = PokkariPlayer;

PokkariImagePlayer.prototype.render = function() {

	var html = '<img src="' + this.getPrimaryMediaUrl() + '" width="' + this.getWidth() + '" height="' + this.getHeight() + '" />';

	this.getPlayerTarget().style.width = this.getWidth() + "px";
	this.getPlayerTarget().style.height = this.getHeight() + "px";

	this.getPlayerTarget().innerHTML = html;
}

function PokkariFlashPlayer(params) {

}

PokkariFlashPlayer.prototype = new PokkariPlayer();
PokkariFlashPlayer.prototype.constructor = PokkariFlashPlayer;
PokkariFlashPlayer.prototype.superclass = PokkariPlayer;

PokkariFlashPlayer.prototype.render = function() {
	
	var autoPlay = (this.getAutoPlay()) ? 'true' : 'false';
	var query = "file=" + escape(this.getPrimaryMediaUrl()) + "&autoStart=" + autoPlay;
	if (this.getAdvertisingType()) {
		query += "&trailerMovie=http://ad.postroller.com/postroller/flash/blip.swf";
	}
	else if (this.getPostrollAnimationUrl()) {
		query += "&trailerMovie=" + this.getPostrollAnimationUrl();
	}
	if (this.getPrerollAnimationUrl()) {
		query += "&thumbNail=" + this.getPrerollAnimationUrl();
	}
	
	var html = '<object id="video_player_object" type="application/x-shockwave-flash" width="' + this.getWidth() + '" height="' + this.getHeight() + '" wmode="transparent" data="' + this.getSiteUrl() + '/scripts/flash/blipplayer.swf?' + query + '">';
	html += '<param name="movie" value="' + this.getSiteUrl() + '/scripts/flash/blipplayer.swf?' + query + '">';
	html += '<param name="wmode" value="transparent" />';
	html += '</object>';

	this.getPlayerTarget().style.width = this.getWidth() + "px";
	this.getPlayerTarget().style.height = this.getHeight() + "px";

	this.getPlayerTarget().innerHTML = html;

}

PokkariFlashPlayer.prototype.getTime = function() {
	var player = this.getPlayer();
	
	return player.GetVariable("videoCurrentTime");
}

PokkariFlashPlayer.prototype.setTime = function(value) {
	var player = this.getPlayer();

	player.SetVariable("videoSetCurrentTime",value);
}

PokkariFlashPlayer.prototype.getDuration = function(value) {
	var player = this.getPlayer();

	return player.GetVariable("videoTotalTime");
}

PokkariFlashPlayer.prototype.getStatus = function(value) {
	var player = this.getPlayer();

	// TODO TRANSLATE ME
	return player.GetVariable("videoCurrentStatus");
}

function PokkariTheoraPlayer(params) {
}

PokkariTheoraPlayer.prototype = new PokkariPlayer();
PokkariTheoraPlayer.prototype.constructor = PokkariTheoraPlayer;
PokkariTheoraPlayer.prototype.superclass = PokkariPlayer;  // This isn't necessary is it?

PokkariTheoraPlayer.prototype.render = function() {
	var url = this.getPrimaryMediaUrl().replace("/file/get","/uploadedFiles");
	var width = this.getWidth();
	var height = this.getHeight();

	var html =  '<object classid="clsid:CAFEEFAC-0014-0002-0000-ABCDEFFEDCBA"\n' +
		'width="' + width + '" height="' + height + '"\n' +
	    'codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4_2-windows-i586.cab#Version=1,4,2,0">\n' +
		'<param name="code" value="com.fluendo.player.Cortado.class" />\n' +
		'<param name="codebase" value="http://blip.tv/scripts/theora" />\n' +
	    '<param name="type" value="application/x-java-applet;jpi-version=1.4.2">\n' +
	    '<param name="scriptable" value="true">\n' +	
		'<param name="url" value="' + url + '" />\n' +
		'<param name="local" value="false" />\n' +
		'<param name="keepaspect" value="true" />\n' +
		'<comment>\n' +		
		'<APPLET code="com.fluendo.player.Cortado.class"\n' +
        'codebase="/scripts/theora"\n' +
        'width="' + width + '" height="' + height + '">\n' +
  		'<PARAM name="url" value="' + url + '"/>\n' +
	  	'<PARAM name="local" value="false"/>\n' +
	  	'<PARAM name="keepaspect" value="true"/>\n' +
		'</APPLET>\n' +
		'</comment>\n' +
		'</object>\n';

	this.getPlayerTarget().innerHTML = html;
}


