//****************************************************************************
// Copyright (C) thePlatform for Media, Inc. All Rights Reserved.
//****************************************************************************
////// UTIL FUNCTIONS ////////////
// 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";
}
// helper function for getting the "top" coordinate of an object
function tpGetTop(obj)
{
result = 0;
while (obj)
{
result += obj.offsetTop;
obj = obj.offsetParent;
}
return result;
}
// helper function for getting the "left" coordinate of an object
function tpGetLeft(obj)
{
result = 0;
while(obj)
{
result += obj.offsetLeft;
obj = obj.offsetParent;
}
return result;
}
tpThisMovie = function(movieName)
{
var oDoc
if (window.frame)
{
oDoc = frame.contentWindow.document || frame.contentDocument.document ;
}
else
{
oDoc = document
}
return oDoc.getElementById(movieName);
}
function tpDebug(str)
{
if (document.getElementById("debugDiv"))
{
document.getElementById("debugDiv").innerHTML += str + "
";
}
}
// open a new pop-up window
function tpOpenNewWindow(URLtoOpen, windowName, windowFeatures)
{
var newWindow=window.open(URLtoOpen, windowName, windowFeatures);
}
// handle tracking URLs
var tpTrackingImage = new Image();
function tpCallTrackingUrl(url)
{
url = unescape(url);
tpTrackingImage.src = url;
for (i = 0; ((!tpTrackingImage.complete) && (i < 100000)); i++)
{
}
}
///// INIT tpController //////////
function tpGetUseJS() { return "true" }
function tpGetInstanceID() { return tpInstanceID; }
function tpGetCommManagerID() { return tpCommID; }
tpLogLevel = "warn";
function tpSetLogLevel(level){ tpLogLevel = level };
function tpGetLogLevel() { return tpLogLevel }
function tpGetProperties()
{
//each pdk controller will call this to get the default properties
var props = new Object();
props.commManagerId = tpGetCommManagerID();
props.instanceId = tpGetInstanceID();
props.useJS = tpGetUseJS();
props.registeredComponents = tpGetRegisteredIDs();
props.logLevel = tpGetLogLevel();
return props;
}
var registeredIDs = new Array();
function tpRegisterID(swfName)
{
for (var i = 0; i < registeredIDs.length; i++)
{
if (registeredIDs[i] == swfName) return;
}
registeredIDs.push(swfName);
}
function tpGetRegisteredIDs()
{
return registeredIDs;
}
// handle references to the communication manager
var tpController;
var tpCommID;
var tpBridgeID;
var tpExternalController;
//the kicks off the creation of the tpController, must be called before any pdk components are set on the page
function tpSetCommManagerID(commID, embed, commManagerUrl)
{
// create a unique token for each set of player controls
tpInstanceID = (new Date()).getTime() + "|" + Math.round(Math.random() * 100000000000000000);
if (commID && embed)
{
//get rid of any existing commManager
var divEl = window.document.getElementById("commManagerDiv");
if (divEl)
{
divEl.parentNode.removeChild(divEl);
divEl = null;
}
//create a commManager as the first element in the body
divEl = window.document.createElement('div');
divEl.id = "commManagerDiv";
divEl.style.position = "absolute";
divEl.style.top = "0";
divEl.style.left = "0";
var bodyTag = window.document.getElementsByTagName('body')[0];
bodyTag.insertBefore(divEl, bodyTag.firstChild);
var url = commManagerUrl ? commManagerUrl : "swf/commManager.swf"
var so = new SWFObject(url, commID, "1", "1", "9.0.0.0");
so.addParam("allowScriptAccess", "always");
so.addParam("wmode", "transparent");
so.write("commManagerDiv");
}
tpController = new tpControllerClass();
tpCommID = commID;
tpBridgeID = commID ? commID : "unknown";
//external controller
//tpCleanupExternal();
}
///// TPCONTROLLER CLASS /////////////
// implementation of the controller proxy in javascript
function tpControllerClass()
{
//vars loaded at bottom
/////// Send Messages to the rest of the app //////////////
///////////////////////////////////////////////////////////
//all communication to the communication manager happens here
this.sendMessage = function(destination, message, skipBus)
{
//tpDebug("putting message on queue: " + message.name + " skipBus?" + skipBus + " canMessage?" + this.canMessage + " isLoading?" + this.isLoading);
var sendObj = new Object();
sendObj.message = message;
sendObj.destination = destination;
if (this.isLoading && !skipBus)
{
//these are low priority messages that should be sent only after OnPlayerLoaded is fired
this.messageQueue.push(sendObj);
}
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(sendObj);
}
else
{
this.doSendMessage(sendObj);
}
}
this.doSendMessage = function(sendObj)//private function
{
if (this.isShutDown) return;
var obj = tpThisMovie(sendObj.destination);
//tpDebug("sending: " + sendObj.message.name + " dest:" + sendObj.destination);
// Flash ExternalInterface will convert any "" or " " string to null. However,
// in the PDK, null and "" mean different things. So, if there are blank strings,
// convert to a signal value, and then unconvert on the way out.
/*for (var i=0; i 0)
{
this.doSendMessage(this.messageQueue.shift());
}
}
this.checkPriorityQueue = function()
{
while (this.priorityQueue.length > 0)
{
var sendObj = this.priorityQueue.shift();
if (sendObj.destination == "unknown") sendObj.destination = tpBridgeID;
this.doSendMessage(sendObj);
}
}
this.wrapMessage = function(messageName, payload)
{
var comm = {globalDataType:this.getDataTypeName("CommInfo"), id:"javascript"}
var message = {globalDataType:this.getDataTypeName("MessageInfo"), name:messageName, payload:payload, comm:comm};
return message;
}
this.getDataTypeName = function(shortType)
{
switch(shortType)
{
case "AdPattern":return "com.theplatform.pdk.data::AdPattern";
case "Banner":return "com.theplatform.pdk.data::Banner";
case "BaseClip":return "com.theplatform.pdk.data::BaseClip";
case "CallInfo":return "com.theplatform.pdk.communication::CallInfo";
case "CategoryInfo":return "com.theplatform.pdk.data::CategoryInfo";
case "Clip":return "com.theplatform.pdk.data::Clip";
case "CommInfo":return "com.theplatform.pdk.communication::CommInfo";
case "CustomData":return "com.theplatform.pdk.data::CustomData";
case "CustomValue":return "com.theplatform.pdk.data::CustomValue";
case "DispatchInfo":return "com.theplatform.pdk.communication::DispatchInfo";
case "FunctionInfo":return "com.theplatform.pdk.communication::FunctionInfo";
case "HandlerInfo":return "com.theplatform.pdk.communication::HandlerInfo";
case "HyperLink":return "com.theplatform.pdk.data::HyperLink";
case "MediaClick":return "com.theplatform.pdk.data::MediaClick";
case "MediaFile":return "com.theplatform.pdk.data::MediaFile";
case "MessageInfo":return "com.theplatform.pdk.communication::MessageInfo";
case "MetricInfo":return "com.theplatform.pdk.data::MetricInfo";
case "Overlay":return "com.theplatform.pdk.data::Overlay";
case "PdkEvent":return "com.theplatform.pdk.events::PdkEvent";
case "ProviderInfo":return "com.theplatform.pdk.data::ProviderInfo";
case "Range":return "com.theplatform.pdk.data::Range";
case "Rating":return "com.theplatform.pdk.data::Rating";
case "Release":return "com.theplatform.pdk.data::Release";
case "ReleaseInfo":return "com.theplatform.pdk.data::ReleaseInfo";
case "ScopeInfo":return "com.theplatform.pdk.communication::ScopeInfo";
case "Sort":return "com.theplatform.pdk.data::Sort";
case "Subtitles":return "com.theplatform.pdk.data::Subtitles";
case "TrackingUrl":return "com.theplatform.pdk.data::TrackingUrl";
case "BandwidthPreferences":return "com.theplatform.pdk.data::BandwidthPreferences";
}
}
this.createScope = function(scope)
{
if (scope == undefined) return this.defaultScope;
else
{
scope.push("javascript");
tpDebug("creating scopes: " + scope.toString());
return {globalDataType:this.getDataTypeName("ScopeInfo"),controlId:"javascript",isGlobal:true,isAny:false,isEmpty:false,scopeIds:scope};
}
}
//////// handle communication to the rest of the app ///////
////////////////////////////////////////////////////////////
//register a function
this.registerFunction = function(funcName, callback, scopes)
{
var scopeObj = this.createScope(scopes);
var informComm = false;
if (this.functions[funcName] == undefined)
{
this.functions[funcName] = new Object();
informComm = true;
}
for (var i = 0; i < scopeObj.scopeIds.length; i++)
{
var s = scopeObj.scopeIds[i];
if (s == "*") return;//can't register a scope of any
this.functions[funcName][s] = callback;
}
if (informComm)
{
//send the registered function to the commManager
var func = {globalDataType:this.getDataTypeName("FunctionInfo"),name:funcName,scope:scopeObj};
var message = this.wrapMessage("registerFunction", func);
this.sendMessage(tpBridgeID,message,true);
}
}
this.unregisterFunction = function(funcName, scope)
{
var scopeObj = this.createScope(scopes);
if (this.functions[funcName] != undefined)
{
var funcs = this.functions[funcName];
for (var i = 0; i < scopeObj.scopeIds.length; i++)
{
var s = scopeObj.scopeIds[i];
if (s == "*")
{
delete funcs;//delete them all
break;
}
if (funcs[s] != undefined) delete funcs[s];//delete each scope
}
var funcsLeft = false;
if (funcs != undefined)//prune the object
{
for (var sc in funcs)
{
funcsLeft = true;
break;
}
if (!funcsLeft) delete this.functions[funcName];
}
}
if (!funcsLeft)
{
var func = {globalDataType:this.getDataTypeName("FunctionInfo"),name:funcName,scope:scopeObj};
var message = this.wrapMessage("unregisterFunction", func);
this.sendMessage(tpBridgeID,message,true);
}
}
this.addEventListener = function(eventName, callback, scope)
{
tpDebug("adding event listener: " + eventName + " callback:" + callback);
var scopeObj = this.createScope(scope);
var handler = {globalDataType:this.getDataTypeName("HandlerInfo"),name:eventName,handler:callback,scope:scopeObj}
var informComm = false;
if (this.events[eventName] == undefined)
{
this.events[eventName] = new Array();
informComm = true;
}
var evts = this.events[eventName];
var repeat = false;
for (var i = 0; i < evts.length; i++)//repeats?
{
if (evts[i].handler == callback)
{
evts[i] = handler;//replace the scopes
repeat = true;
break;
}
}
if (!repeat) evts.push(handler);
tpDebug("how many listeners? " + evts.length);
if (informComm)
{
tpDebug("informing comm of event listener");
var message = this.wrapMessage("addEventListener", handler);
this.sendMessage(tpBridgeID,message,true);
}
}
this.removeEventListener = function(eventName, callback, scope)
{
if (this.events[eventName] != undefined)
{
var scopeObj = this.createScope(scope);
var handler = {globalDataType:this.getDataTypeName("HandlerInfo"),name:eventName,handler:callback,scope:scopeObj}
var eventArray = this.events[eventName];
for (var i = 0; i < eventArray.length; i++)
{
var h = eventArray[i];
if (h.handler == handler.handler)
{
eventArray = eventArray.splice(i, 1);
break;
}
}
if (eventArray.length == 0)
{
//no callbacks left, zap the variable
delete this.events[eventName];
var message = this.wrapMessage("removeEventListener", handler);
this.sendMessage(tpBridgeID, message, true)
}
}
}
this.dispatchEvent = function(eventName, value, scope)
{
var scopeObj = this.createScope(scope);
var evt = {globalDataType:this.getDataTypeName("PdkEvent"),type:eventName, data:value};
var dispatch = {globalDataType:this.getDataTypeName("DispatchInfo"),evt:evt,scope:scopeObj};
//check local events
this.doDispatchEvent(dispatch);
var message = this.wrapMessage("dispatchEvent", dispatch);
this.sendMessage(tpBridgeID, message, true);
}
this.callFunction = function(funcName, args, scope)
{
var scopeObj = this.createScope(scope);
var call = {globalDataType:this.getDataTypeName("CallInfo"),name:funcName,args:args,scope:scopeObj};
this.doCallFunction(call);
var message = this.wrapMessage("callFunction", call);
this.sendMessage(tpBridgeID, message, true);
}
this.doDispatchEvent = function(dispatch)
{
tpDebug("do dispatching event: " + dispatch.evt.type);
if (this.events[dispatch.evt.type] != undefined)
{
var handlers = this.events[dispatch.evt.type]
for (var i = 0; i < handlers.length; i++)
{
var handler = handlers[i];
tpDebug("checking handler? " + handler.handler)
if (dispatch.scope.isAny)
{
eval(handler.handler)(dispatch.evt);
continue;
}
for (var j = 0; j < handler.scope.scopeIds.length; j++)
{
var s = handler.scope.scopeIds[j];
var fired = false;
if (s == "*")
{
eval(handler.handler)(dispatch.evt);
break;
}
for (var k = 0; k < dispatch.scope.scopeIds.length; k++)
{
tpDebug("running through scopes handler: " + s + " dispatch: " + dispatch.scope.scopeIds[k]);
if (s == dispatch.scope.scopeIds[k])
{
fired = true;
tpDebug("firing");
eval(handler.handler)(dispatch.evt);
break;
}
}
if (fired) break;//go to next handler
}
}
}
}
this.doCallFunction = function(call)
{
if (this.functions[call.name] != undefined)
{
//check local functions
var funcsToCall = new Object();
for (var i = 0; i < call.scope.scopeIds.length; i++)
{
var s = call.scope.scopeIds[i];
if (this.functions[call.name][s] != undefined)
{
funcsToCall[this.functions[call.name][s]] = "f";//we need lookup
}
}
for (var f in funcsToCall)
{
eval(f)(call.args);
}
}
}
//////// RECEIVE CALLS FROM AS //////////////
////////////////////////////////////////////
//all communication from the communication manager happens here
this.receiveMessage = function(destination, message)
{
if (destination == "javascript")
{
//tpDebug("receiving message: " + message.name)
var messStr = message.name;
switch(messStr)
{
case "commReady":
tpBridgeID = tpCommID;
this.canMessage = true;
this.checkPriorityQueue();
break;
case "bridgeReady":
tpBridgeID = message.comm.id;
this.canMessage = true;
this.checkPriorityQueue();
break;
case "dispatchEvent":
var dispatch = message.payload;
this.receiveEvent(dispatch);
break;
case "callFunction":
var call = message.payload;
this.doCallFunction(call);
break;
default:
break;
}
}
else
{
//transfer the message to its final destination
this.sendMessage(destination, message, true);
}
}
this.receiveEvent = function(dispatch)
{
//tpDebug("RECIEVED:" + dispatch.evt.type)
if (dispatch.evt.type == "OnPlayerLoaded")
{
this.isLoading = false;
this.checkMessageQueue();
}
this.doDispatchEvent(dispatch);
}
//create a list of direct calls
// PLAYER
this.setRelease = function(release, replaceDefault, scope)
{
release = this.modRelease(release);
this.callFunction("setRelease", [release, replaceDefault], scope);
}
this.loadRelease = function(release, replaceDefault, scope)
{
release = this.modRelease(release);
this.callFunction("loadRelease", [release, replaceDefault], scope);
}
this.loadReleaseURL = function(releaseURL, replaceDefault, scope)
{
this.callFunction("loadReleaseURL", [releaseURL, replaceDefault], scope);
}
this.setReleaseURL = function(url, replaceDefault, scope)
{
this.callFunction("setReleaseURL", [url, replaceDefault], scope);
}
this.loadSmil = function(smil, replaceDefault, scope)
{
if (replaceDefault == undefined) replaceDefault = true;
this.callFunction("loadSmil", [smil, replaceDefault], scope);
}
this.setSmil = function(smil, scope)
{
this.callFunction("setSmil", [smil], scope);
}
this.resetPlayer = function(scope)
{
this.callFunction("resetPlayer", [], scope);
}
this.setPlayerMessage = function(message, showDuration, scope)
{
if (showDuration == undefined) showDuration = 5000;
this.callFunction("setPlayerMessage", [message, showDuration], scope);
}
this.clearPlayerMessage = function(scope)
{
this.callFunction("clearPlayerMessage", [], scope);
}
this.setCurrentReleaseList = function(id, scope)
{
this.callFunction("setCurrentReleaseList", [id], scope);
}
this.seekToPosition = function(position, scope)
{
this.callFunction("seekToPosition", [position], scope);
}
this.seekToPercentage = function(percent, scope)
{
this.callFunction("seekToPercentage", [percent], scope);
}
this.nextClip = function(scope)
{
this.callFunction("nextClip", [], scope);
}
this.previousClip = function(scope)
{
this.callFunction("previousClip", [], scope);
}
this.mute = function(muted, scope)
{
this.callFunction("mute", [muted], scope);
}
this.pause = function(paused, scope)
{
this.callFunction("pause", [paused], scope);
}
this.setPreviewImageUrl = function(url, scope)
{
this.callFunction("setPreviewImageUrl", [url], scope);
}
this.showFullScreen = function(isFullScreen, scope)
{
if (isFullScreen)
{
alert("Switching to full screen from Javascript is not supported by the Flash run-time. Flash only allows you to go to full screen mode via a click in the player itself.");
}
else
{
this.callFunction("showFullScreen", [isFullScreen], scope);
}
}
this.showEmailForm = function(visible, scope)
{
this.callFunction("showEmailForm", [visible], scope);
}
this.showLinkForm = function(visible, scope)
{
this.callFunction("showLinkForm", [visible], scope);
}
this.trace = function(str, className, level)
{
this.callFunction("trace", [str, className, level], null);
}
this.useDefaultPlayOverlay = function(useDefault, scope)
{
this.callFunction("useDefaultPlayOverlay", [useDefault], scope);
}
this.getUseDefaultPlayOverlay = function(scope)
{
this.callFunction("getUseDefaultPlayOverlay", [], scope);
}
this.useDefaultLinkForm = function(useDefault, scope)
{
this.callFunction("useDefaultLinkForm", [useDefault], scope);
}
this.useDefaultEmailForm = function(useDefault, scope)
{
this.callFunction("useDefaultEmailForm", [useDefault], scope);
}
this.getSubtitleLanguage = function(requestor, scope)
{
this.callFunction("getSubtitleLanguage", [requestor], scope);
}
this.clickPlayButton = function(scope)
{
this.callFunction("clickPlayButton", [], scope);
}
this.disablePlayerControls = function(disable, exceptions, scope)
{
this.callFunction("disablePlayerControls", [disable, exceptions], scope);
}
this.hidePlayerRegions = function(hide, exceptions, scope)
{
this.callFunction("hidePlayerRegions", [hide, exceptions], scope);
}
this.setSubtitleLanguage = function(language, scope)
{
this.callFunction("setSubtitleLanguage", [language], scope);
}
this.getPlayerVariables = function(names, scope)
{
this.callFunction("getPlayerVariables", [names], scope);
}
this.setVolume = function(volume, scope)
{
this.callFunction("setVolume", [volume], scope);
}
this.clearAdCookie = function(scope)
{
this.callFunction("clearAdCookie", [], scope);
}
this.setBandwidthPreferences = function(bandwidthPreferences, scope)
{
if (bandwidthPreferences) bandwidthPreferences.globalDataType = this.getDataTypeName("BandwidthPreferences");
this.callFunction("setBandwidthPreferences", [bandwidthPreferences], scope);
}
this.getBandwidthPreferences = function(scope)
{
this.callFunction("getBandwidthPreferences", [], scope);
}
this.setVideoScalingMethod = function(method, scope)
{
this.callFunction("setVideoScalingMethod", [method], scope);
}
this.setExpandVideo = function(expand, scope)
{
this.callFunction("setExpandVideo", [expand], scope);
}
this.showPlayerCard = function(deckId, cardId, otherCardAction, parentCardId, animation, scope)
{
this.callFunction("showPlayerCard", [deckId, cardId, otherCardAction, parentCardId, animation], scope)
}
this.hidePlayerCard = function(deckId, animation, scope)
{
this.callFunction("hidePlayerCard", [deckId, animation], scope)
}
// RELEASE MODEL
this.refreshReleaseModel = function(category, search, sort, range, params, secondaryParams, scope, mediaIds, feedUrl)
{
if (sort) sort.globalDataType = this.getDataTypeName("Sort");
if (range) range.globalDataType = this.getDataTypeName("Range");
this.callFunction("refreshReleaseModel", [category, search, sort, range, params, secondaryParams, mediaIds, feedUrl], scope);
}
// CATEGORY MODEL
this.refreshCategoryModel = function(params, scope, feedUrl)
{
this.callFunction("refreshCategoryModel", [params, feedUrl], scope);
}
// NAVIGATION
this.nextRange = function(scope)
{
this.callFunction("nextRange", [], scope);
}
this.previousRange = function(scope)
{
this.callFunction("previousRange", [], scope);
}
// CLIP INFO
this.setClipInfo = function(clip, isDefault, scope)
{
clip = this.modClip(clip);
this.callFunction("setClipInfo", [clip, isDefault], scope);
}
// CATEGORY LIST
this.clearCategorySelection = function(scope)
{
this.callFunction("clearCategorySelection", [], scope);
}
// RELEASE LIST
this.suspendPlayAll = function(suspend, scope)
{
this.callFunction("suspendPlayAll", [suspend], scope);
}
this.playNext = function(wrapAround, naturalEnd, scope)
{
this.callFunction("playNext", [wrapAround, naturalEnd], scope);
}
this.playPrevious = function(wrapAround, scope)
{
this.callFunction("playPrevious", [wrapAround], scope);
}
// GENERAL
this.modRelease = function(release)
{
if (release)
{
release.globalDataType = this.getDataTypeName("Release");
if (release.categories) release.categories = this.modCategories(release.categories);
if (release.thumbnails)
{
for (var i = 0; i < release.thumbnails.length; i++)
{
release.thumbnails[i].globalDataType = this.getDataTypeName("MediaFile");
if (release.thumbnails[i].customValues) release.thumbnails[i].customValues = this.modCustomValues(release.thumbnails[i].customValues);
}
}
if (release.customValues) release.customValues = this.modCustomValues(release.customValues);
if (release.metrics)
{
for (var i = 0; i < release.metrics.length; i++)
{
release.metrics[i].globalDataType = this.getDataTypeName("MetricInfo");
}
}
if (release.provider)
{
release.provider.globalDataType = this.getDataTypeName("ProviderInfo");
if (release.provider.customValues) release.provider.customValues = this.modCustomValues(release.provider.customValues);
}
if (release.ratings)
{
for (var i = 0; i < release.ratings.length; i++)
{
release.ratings[i].globalDataType = this.getDataTypeName("Rating");
}
}
// backwards compatibility helper
if (release.URL)
{
release.url = release.URL;
}
}
return release;
}
this.modCustomValues = function(customValues)
{
for (var i = 0; i < customValues.length; i++)
{
customValues[i].globalDataType = this.getDataTypeName("CustomValue");
}
return customValues;
}
this.modCategories = function(categories)
{
for (var i = 0; i < categories.length; i++)
{
categories[i].globalDataType = this.getDataTypeName("CategoryInfo");
}
return categories;
}
this.modClip = function(clip)
{
if (clip)
{
//set the class names correctly for casting in as3.
clip.globalDataType = this.getDataTypeName("Clip");
var baseClip = clip.baseClip;
if (!baseClip) baseClip = new Object();
if (clip.banners) baseClip.banners = clip.banners;
if (clip.overlays) baseClip.overlays = clip.overlays;
clip.baseClip = this.modBaseClip(baseClip);
if (clip.chapter) clip.chapter.globalDataType = this.getDataTypeName("Chapter");
}
return clip;
}
this.modBaseClip = function(baseClip)
{
if (!baseClip) baseClip = new Object();
baseClip.globalDataType = this.getDataTypeName("BaseClip");
if (baseClip.moreInfo)
{
baseClip.moreInfo.globalDataType = this.getDataTypeName("HyperLink");
if (baseClip.moreInfo.clickTrackingUrls) baseClip.moreInfo.clickTrackingUrls = this.modTracking(baseClip.moreInfo.clickTrackingUrls);
}
if (baseClip.banners)
{
for (var i = 0; i < baseClip.banners.length; i++)
{
baseClip.banners[i].globalDataType = this.getDataTypeName("Banner");
if (baseClip.banners[i].clickTrackingUrls) baseClip.banners[i].clickTrackingUrls = this.modTracking(baseClip.banners[i].clickTrackingUrls)
}
}
if (baseClip.overlays)
{
for (var i = 0; i < baseClip.overlays.length; i++)
{
baseClip.overlays[i].globalDataType = this.getDataTypeName("Overlay");
if (baseClip.overlays[i].clickTrackingUrls) baseClip.overlays[i].clickTrackingUrls = this.modTracking(baseClip.overlays[i].clickTrackingUrls)
}
}
if (baseClip.availableSubtitles)
{
for (var i = 0; i < baseClip.availableSubtitles; i++)
{
baseClip.availableSubtitles[i].globalDataType = this.getDataTypeName("Subtitles");
}
}
if (baseClip.categories) baseClip.categories = this.modCategories(baseClip.categories);
if (baseClip.adPattern) baseClip.adPattern.globalDataType = this.getDataTypeName("AdPattern");
if (baseClip.trackingURLs) baseClip.trackingURLs = this.modTracking(baseClip.trackingURLs);
if (baseClip.contentCustomData) baseClip.contentCustomData.globalDataType = this.getDataTypeName("CustomData");
if (baseClip.ownerCustomData) baseClip.ownerCustomData.globalDataType = this.getDataTypeName("CustomData");
if (baseClip.outletCustomData) baseClip.outletCustomData.globalDataType = this.getDataTypeName("CustomData");
return baseClip;
}
this.modTracking = function(trackingUrls)
{
for (var i = 0; i < trackingUrls.length; i++)
{
trackingUrls.globalDataType = this.getDataTypeName("TrackingUrl")
}
return trackingUrls
}
this.shutDown = function()
{
var args = [];
this.callFunction("shutDown", args, ["*"]);
this.isShutDown = true;//prevent any more messages
}
//vars initialized
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.shutdownIDs;//array to keep all the controller ids for shutdown
this.isShutDown = false;
this.blankString = "__blank_string__";
this.defaultScope = {globalDataType:this.getDataTypeName("ScopeInfo"),controlId:"javascript",isGlobal:true,isAny:false,isEmpty:false,scopeIds:["javascript","default"]};
}
function tpReceiveMessage(destination, message)
{
//tpDebug("---message received---" + message.name + " dest:" + destination)
tpController.receiveMessage(destination, message);
}
//functions for controlling external players
var tpHolderName = "pdkHolder";
var tpExternalJS;
function tpSetPlayerIDForExternal(playerName){};//no longer needed
function tpSetHolderIDForExternal(holderName)//needed
{
tpHolderName = holderName;
}
function tpLoadExternalMediaJS()
{
tpExternalJS = tpLoadExternalMediaJS.arguments;
for (var i = 0; i < tpExternalJS.length; i++)
{
tpLoadScript(tpExternalJS[i]);
}
}
function tpCleanupExternal()
{
if (tpExternalJS)//if there's no external js, then nothing was loaded in
{
var scripts = window.document.getElementsByTagName('head')[0].getElementsByTagName('script');
for (var i = 0; i < scripts.length;i++)
{
for (var j = 0; j < tpExternalJS.length; j++)
{
if (scripts[i].src == tpExternalJS[j])
{
window.document.getElementsByTagName('head')[0].removeChild(scripts[i]);
break;
}
}
}
tpExternalJS.length = 0;
}
if (tpExternalController)
{
tpExternalController.cleanup();
}
}
/////////////////////////////////////////////////////////////////////
tpScriptLoader = new ScriptLoader();
// called from flash via ExternalInterface
function tpLoadJScript(scriptFile, callback, id, atts)
{
tpScriptLoader.addScript(scriptFile, callback, id, atts);
}
// need to wrap method to fix scoping issue on callback
function callbackDispatcher(loadObj) { tpScriptLoader.callbackDispatcher(loadObj) }
function invokeCallbacks(loadObj) { tpScriptLoader.invokeCallbacks() }
/////////////////////////////////////////////////////////////////////
// L O A D O B J E C T
/////////////////////////////////////////////////////////////////////
function LoadObj(scriptFile, callback, id, atts)
{
this.script = scriptFile;
this.callback = callback;
this.id = id;
this.atts = atts;
}
/////////////////////////////////////////////////////////////////////
// S C R I P T L O A D E R
/////////////////////////////////////////////////////////////////////
// constructor
function ScriptLoader()
{
// queued up for loading scripts
this.scriptQueue = new Array();
// queued up for invoking callbacks
this.callbackQueue = new Array();
}
/////////////////////////////////////////////////////////////////////
ScriptLoader.prototype.addScript = function(scriptFile, callback, id, atts)
{
var loadObj = new LoadObj( scriptFile, callback, id, atts );
this.scriptQueue.push(loadObj);
// if the queue was empty, we need to kick
// off the queue processing again.
if (this.scriptQueue.length == 1)
this.checkScriptQueue();
}
/////////////////////////////////////////////////////////////////////
ScriptLoader.prototype.checkScriptQueue = function()
{
if (this.scriptQueue.length)
{
var loadObj = this.scriptQueue.shift();
this.loadScript(loadObj);
}
else
{
// as a timing precaution, we wait until the queue
// empties out before we invoke callbacks
interval_id = setInterval("invokeCallbacks()",100) // more timing precautions :-/
//this.invokeCallbacks();
}
}
/////////////////////////////////////////////////////////////////////
ScriptLoader.prototype.callbackDispatcher = function(loadObj)
{
for (var i in this.callbackQueue)
{
if (this.callbackQueue[i] == loadObj)
{
this.checkScriptQueue();
return;
}
}
this.callbackQueue.push(loadObj);
this.checkScriptQueue();
}
/////////////////////////////////////////////////////////////////////
ScriptLoader.prototype.invokeCallbacks = function()
{
clearInterval(interval_id);
while (this.callbackQueue.length)
{
var loadObj = this.callbackQueue.shift();
eval(loadObj.callback)(loadObj.script);
}
}
/////////////////////////////////////////////////////////////////////
ScriptLoader.prototype.loadScript = function(loadObj)
{
var scriptFilename = loadObj.script;
var callbackFunction = loadObj.callback;
var id = loadObj.id;
var atts = loadObj.atts;
// Create script element and set it to load the requested script
var scriptEl = window.document.createElement('script');
scriptEl.charset = "utf-8";
if (id) scriptEl.id = id;
scriptEl.type = "text/javascript";
//scriptEl.defer = true;
if (atts)
{
for (var i = 0; i < atts.length; i++)
scriptEl.setAttribute(atts[i].att, atts[i].value);
}
scriptEl.src = scriptFilename;
if (callbackFunction)
{
// Function to be called when script has finished loading
var _onFinished = function(_loadObj, _callback)
{
// Invoke the callback function
_callback(_loadObj)
// Clean up event handlers
this.onreadystatechange = null;
this.onload = null;
this.onerror = null;
};
// Set callback for IE
// In defiance of MSDN documentation IE's script object has no onload handler
scriptEl.onreadystatechange = function()
{
_onFinished(loadObj, callbackDispatcher);
};
// Set callback for W3C-compatible browsers
scriptEl.onload = function()
{
_onFinished(loadObj, callbackDispatcher);
};
// Set another callback for W3C-compatible browsers
// since onreadystatechange for IE also fires in case of an error
scriptEl.onerror = function()
{
_onFinished(loadObj, callbackDispatcher);
};
}
// Add script element to the document
window.document.getElementsByTagName('head')[0].appendChild(scriptEl);
}
/////////////////////////////////////////////////////////////////////
// ORIGINAL LOADSCRIPT - USED BY MOVENETWORKS
/////////////////////////////////////////////////////////////////////
function tpLoadScript(scriptFilename, callbackFunction, id, atts)
{
// Create script element and set it to load the requested script
var scriptEl = window.document.createElement('script');
scriptEl.charset = "utf-8";
if (id) scriptEl.id = id;
scriptEl.type = "text/javascript";
//scriptEl.defer = true;
if (atts)
{
for (var i = 0; i < atts.length; i++)
{
scriptEl.setAttribute(atts[i].att, atts[i].value);
}
}
scriptEl.src = scriptFilename;
if (callbackFunction)
{
// Function to be called when script has finished loading
var _onFinished = function(_callbackFunction, _scriptFilename)
{
// Invoke the callback function
_callbackFunction(_scriptFilename);
// Clean up event handlers
this.onreadystatechange = null;
this.onload = null;
this.onerror = null;
};
// Set callback for IE
// In defiance of MSDN documentation IE's script object has no onload handler
scriptEl.onreadystatechange = function()
{
_onFinished(callbackFunction, scriptFilename);
};
// Set callback for W3C-compatible browsers
scriptEl.onload = function()
{
_onFinished(callbackFunction, scriptFilename);
};
// Set another callback for W3C-compatible browsers
// since onreadystatechange for IE also fires in case of an error
scriptEl.onerror = function()
{
_onFinished(callbackFunction, scriptFilename);
};
}
// Add script element to the document
window.document.getElementsByTagName('head')[0].appendChild(scriptEl);
}
/////////////////////////////////////////////////////////////////////
//constructor for tpExternalControl
function tpExternalControllerClass()
{
this.playerTypes = new Object();//keep a lookup of classes
this.extPlayers = new Object();//keep the instances here
this.registerExternalPlayer = function(type, playerClass)
{
this.playerTypes[type] = playerClass;//keep the class as a string
}
this.routeMessage = function(swfId, controllerId, streamType, funcName, args)
{
var curController = this.extPlayers[controllerId];//see if we have the existing controller lookup
if (!curController) curController = this.extPlayers[controllerId] = {};//make a lookup for the controller
var curPlayer = curController[streamType];//now see if we have the actual player object instantiated
if (!curPlayer)
{
var playerClass = this.playerTypes[streamType];
if (!playerClass) return; //we don't have the correct stream type on hand
curPlayer = eval("new " + playerClass + "('" + swfId + "', '" + controllerId + "');");//create a new instance of the class
if (!curPlayer) return;//abort here, too
curController[streamType] = curPlayer;
}
curPlayer[funcName](args);
}
this.returnMessage = function(swfId, controllerId, funcName, args)
{
var obj = tpThisMovie(swfId);
obj.receiveJSMessage(controllerId, funcName, args);
}
this.cleanup = function()
{
for (var controllerId in this.extPlayers)
{
var players = this.extPlayers[controllerId];
for (var player in players)
{
players[player].cleanup();
delete players[player];
}
delete this.extPlayers[controllerId];
}
}
}
function tpExternalMessage(swfId, controllerId, streamType, funcName, args)
{
tpExternalController.routeMessage(swfId, controllerId, streamType, funcName, args);
}
//build this without needing the commManager
tpExternalController = new tpExternalControllerClass();
function tpShowAlert(alertCode)
{
switch(alertCode)
{
case "FULLSCREEN_DISABLED":
//if (deconcept.SWFObjectUtil.getPlayerVersion().major < 9)
alert("Full screen is only available with Flash 9 or later")
break;
}
}