//****************************************************************************
// Copyright (C) thePlatform for Media, Inc. All Rights Reserved.
//****************************************************************************
// dynamically resize an element, for example, the category list
function tpResize(divID, height, width)
{
	var element = document.getElementById(divID);
	element.style.height = height + "px";
	element.style.width = width + "px";
}

// open a new pop-up window
function tpOpenNewWindow(URLtoOpen, windowName, windowFeatures)
{
	var newWindow=window.open(URLtoOpen, windowName, windowFeatures); 
}

// create a unique token for each set of player controls
var tpInstanceID = (new Date()).getTime() + "|" + Math.round(Math.random() * 100000000000000000);

function tpGetInstanceID()
{
	return tpInstanceID; 
}

//determine if we're on a mac and forego localConnections
var tpUseJS = false;
if (navigator.appVersion.indexOf("Mac")!=-1) tpUseJS = true;

function tpGetUseJS()
{
	return tpUseJS ? "true" : "false";
}

// manage a list of registered control IDs for the communication manager
var tpRegisteredIDs = new Array();

function tpRegisterID(componentName)
{
	tpRegisteredIDs.push(componentName);
}

function tpGetRegisteredIDs()
{
	var retString = "";
	var start = true;
	while (tpRegisteredIDs.length > 0)
	{
		if (!start) retString += "|";
		retString += tpRegisteredIDs.shift();
		start = false;
	}
	tpRegisteredIDs.length = 0;//zap it so it isn't sitting around
	return retString;
}

// handle references to the communication manager
var tpController;
var tpCommID = "communicationwidget";

function tpSetCommManagerID(commID)
{
	// controller
	tpController = null;
	tpCommID = null;
	tpInstanceID = null;
	tpRegisteredIDs = null;
	tpRegisteredIDs = new Array();
	tpInstanceID = (new Date()).getTime() + "|" + Math.round(Math.random() * 100000000000000000);
	tpController = new tpControllerClass();
	tpCommID = commID;
}

function tpGetCommManagerID()
{
	return tpCommID;
}

// implementation of the controller proxy in javascript
function tpControllerClass()
{
	this.events = new Object();
	this.functions = new Object();
	this.isLoading = true;
	this.canMessage = false;
	this.messageQueue = new Array();
	this.priorityQueue = new Array();
	this.sendQueue = new Array();//yet another queue for timing externalInterface calls
	this.isSending = false;
	this.sendInterval;
	
	this.register = function(callback)
	{
		if (this.events["OnPlayerLoaded"] == undefined)
		{
			var eventArray = new Array();
			eventArray.push(callback);
			this.events["OnPlayerLoaded"] = eventArray;
		}
		else
		{
			var eventArray = this.events["OnPlayerLoaded"];
			var repeat = false;
			for (var i = 0; i < eventArray.length; i++)
			{
				if (eventArray[i] == callback)
				{
					repeat = true;
					break;
				}
			}
			if (!repeat) eventArray.push(callback);
		}
		//registering for now simply means that the component will get an OnPlayerLoaded event
	}
	
	this.registerFunction = function(funcName, callback)
	{
		if (this.functions[funcName] == undefined)
		{
			var functionArray = new Array();
			functionArray.push(callback);
			this.functions[funcName] = functionArray;
			this.sendMessage("addBusFunction", tpGetCommManagerID(), [funcName, "javascript"], true);
		}
		else
		{
			var functionArray = this.functions[funcName];
			var repeat = false;
			for (var i = 0; i < functionArray.length; i++)
			{
				if (functionArray[i] == funcName)
				{
					repeat = true;
					break;
				}
			}
			if (!repeat) functionArray.push(callback);
		}
	}
	
	this.unRegisterFunction = function(funcName, callback)
	{
		if (this.functions[funcName] != undefined)
		{
			var funcs = this.functions[funcName];
			for (var i = 0; i < funcs.length; i++)
			{
				if (funcs[i] == callback)
				{
					funcs.splice(i, 1);
					break;
				}
			}
			if (funcs.length == 0)
			{
				//delete the array just to tidy things up
				delete functions[funcName];
				this.sendMessage("removeBusFunction", tpGetCommManagerID(), [funcName, "javascript"]);
			}
		}
	}
	
	//all communication to the communication manager happens here
	this.sendMessage = function(method, destination, parameters, skipBus)
	{
		var methObj = new Object();
		methObj.method = method;
		methObj.parameters = parameters;
		methObj.destination = destination;
		if (this.isLoading && !skipBus)
		{
			//these are low priority messages that should be sent only after OnPlayerLoaded is fired
			this.messageQueue.push(methObj);
		}
		else if (!this.canMessage)
		{
			//these are high priority messages (like addEventListener or registerFunction) that usually need to be sent before OnPlayerLoaded is fired
			//but we still have to wait until after the communication manager has loaded or they'll just disappear
			this.priorityQueue.push(methObj);
		}
		else
		{
			this.doSendMessage(methObj);
		}
	}
	
	this.doSendMessage = function(messageObj)//private function
	{
		this.thisMovie(messageObj.destination).execute(messageObj.method, messageObj.parameters);	
	}
	
	
	
	this.addEventListener = function(eventName, callback)
	{
		if (this.events[eventName] == undefined)
		{
			var eventArray = new Array();
			eventArray.push(callback);
			this.events[eventName] = eventArray;
			var args = [eventName, "javascript"];
			this.sendMessage("addEventListener", tpGetCommManagerID(), args, true);
		}
		else
		{
			var eventArray = this.events[eventName];
			var repeat = false;
			for (var i = 0; i < eventArray.length; i++)
			{
				if (eventArray[i] == callback)
				{
					repeat = true;
					break;
				}
			}
			if (!repeat) eventArray.push(callback);
		}
	}
	
	this.removeEventListener = function(eventName, callback)
	{
		if (this.events[eventName] != undefined)
		{
			var eventArray = this.events[eventName];
			for (var i = 0; i < eventArray.length; i++)
			{
				if (eventArray[i] == callback)
				{
					eventArray.splice(i, 1);//remove that element
					break;
				}
			}
			if (eventArray.length == 0)
			{
				//no callbacks left, zap the variable
				delete this.events[eventName];
				this.sendMessage("removeEventListener", tpGetCommManagerID(), [eventName, "javascript"])
			}
		}
	}
	
	this.dispatchEvent = function(evtName, value, sender, originator)
	{
		this.sendMessage("remoteDispatchEvent", tpGetCommManagerID(), [{type:evtName, value:value, sender:sender, originator:originator}]);
	}
	
	this.checkMessageQueue = function()//private function
	{
		var len = this.messageQueue.length
		while (this.messageQueue.length > 0)
		{
			this.doSendMessage(this.messageQueue.shift());
		}
	}
	
	this.checkPriorityQueue = function()
	{
		while (this.priorityQueue.length > 0)
		{
			var messObj = this.priorityQueue.shift();
			this.doSendMessage(messObj);
		}
	}
	
	//all communication from the communication manager happens here
	this.receiveMessage = function(funcName, destination, args)
	{
		if (destination == "javascript")
		{
			switch(funcName)
			{
				case "receiveEvent":
					var evt = args[0];
					this.receiveEvent(evt);
					break;
				case "commReady":
					this.canMessage = true;
					this.checkPriorityQueue();
					break;
				default:
					var functionArray = this.functions[funcName];
					for (var i = 0;i < functionArray.length;i++)
					{
						var callback = functionArray[i];
						eval(callback)(args);//hit all the callbacks
					}
					break;
			}
		}
		else
		{
			//transfer the message to its final destination
			this.sendMessage(funcName, destination, args, true);
		}
	}
	
	this.receiveEvent = function(evt)
	{
		if (evt.type == "OnPlayerLoaded")
		{
			this.isLoading = false;
			this.checkMessageQueue();
		}
		
		if (this.events[evt.type]) 
		{
			var eventArray = this.events[evt.type];
			for (var i = 0; i < eventArray.length; i++)
			{
				eval(eventArray[i])(evt);
			}
		}
		
	}
	
	this.thisMovie = function(movieName)
	{
 		var oDoc
		if (window.frame)
		{
			oDoc = frame.contentWindow.document || frame.contentDocument.document ;
		}
		else
		{
			oDoc = document
		}
		return oDoc.getElementById(movieName);
	}

	//create a list of direct calls
	this.seekToPosition = function(position)
	{
		var args = [position, "javascript"];
		this.sendMessage("seekToPosition", tpGetCommManagerID(), args);
	}
	this.seekToPercentage = function(percent)
	{
		var args = [percent, "javascript"];
		this.sendMessage("seekToPercentage", tpGetCommManagerID(), args);
	}
	this.refreshReleaseModel = function(category, sort, range, search, params)
	{
		var args = [category, sort, range, search, params, "javascript"];
		this.sendMessage("refreshReleaseModel", tpGetCommManagerID(), args);
	}
	this.refreshCategoryModel = function()
	{
		var args = ["javascript"];
		this.sendMessage("refreshCategoryModel", tpGetCommManagerID(), args);
	}
	this.nextRange = function()
	{
		var args = ["javascript"];
		this.sendMessage("nextRange", tpGetCommManagerID(), args);
	}
	this.previousRange = function()
	{
		var args = ["javascript"];
		this.sendMessage("previousRange", tpGetCommManagerID(), args);
	}
	this.setClipInfo = function(clip)
	{
		var args = [clip, "javascript"];
		this.sendMessage("setClipInfo", tpGetCommManagerID(), args);
	}
	this.setRelease = function(release)
	{
		var args = [release, "javascript"];
		this.sendMessage("setRelease", tpGetCommManagerID(), args);
	}
	this.setReleaseURL = function(url)
	{
		var args = [url, "javascript"];
		this.sendMessage("setReleaseURL", tpGetCommManagerID(), args);
	}
	this.nextClip = function()
	{
		var args = ["javascript"];
		this.sendMessage("nextClip", tpGetCommManagerID(), args);
	}
	this.previousClip = function()
	{
		var args = ["javascript"];
		this.sendMessage("previousClip", tpGetCommManagerID(), args);
	}
	this.mute = function(isMute)
	{
		var args = [isMute, "javascript"];
		this.sendMessage("mute", tpGetCommManagerID(), args);
	}
	this.play = function()
	{
		var args = ["javascript"];
		this.sendMessage("play", tpGetCommManagerID(), args);
	}
	this.stop = function()
	{
		var args = ["javascript"];
		this.sendMessage("stop", tpGetCommManagerID(), args);
	}
	this.pause = function(isPaused)
	{
		var args = [isPaused, "javascript"];
		this.sendMessage("pause", tpGetCommManagerID(), args);
	}
	this.showFullScreen = function(isFullScreen)
	{
		var args = [isFullScreen, "javascript"];
		this.sendMessage("showFullScreen", tpGetCommManagerID(), args);
	}
	this.showEmailForm = function(isVisible)
	{
		var args = [isVisible, "javascript"];
		this.sendMessage("showEmailForm", tpGetCommManagerID(), args);
	}
	this.showLinkForm = function(isVisible)
	{
		var args = [isVisible, "javascript"];
		this.sendMessage("showLinkForm", tpGetCommManagerID(), args);
	}
	this.setVolume = function(volume)
	{
		var args = [volume, "javascript"];
		this.sendMessage("setVolume", tpGetCommManagerID(), args);
	}
}	

function tpReceiveMessage(funcName, destination, args)
{
	tpController.receiveMessage(funcName, destination, args);
}




