var plDiv = "#cwpPlaylist", cwpDetailsDiv = "#currentReleaseFrame";
var sDetailsTitle = {normal:"You're Watching",ad:"Coming Up"};
var sDescTitle = {episode:"Episode Description",webisode:"Webisode Description",other:"Description",ad:"Advertisement"};
var sAdMessage = "Your video will play after this advertisement.";
var akamaiRoot = "http://a123.g.akamai.net/f/123/41524/60m/webdata.globaltv.com/";
var ScriptRoot = akamaiRoot + "ScriptBuilder.ashx";

function expandDetails(doSlideIn){
	var sliderDiv = $("#relSlider");
	sliderDiv.stop(true,false);
	if (doSlideIn){
		if (sliderDiv.css("marginLeft")!="-290px"){
			sliderDiv.animate({marginLeft:"-290px"},(290+parseInt(sliderDiv.css("marginLeft")))/290*666);
		}
	}else if (sliderDiv.css("marginLeft")!="0px"){
		sliderDiv.animate({marginLeft:"0px"},parseInt(sliderDiv.css("marginLeft"))/-290*666);
	}
}

function performInitialAnimation(stepNum){
	if (stepNum==0){
		expandDetails(true);
		setTimeout("performInitialAnimation(" + (stepNum+1) + ")",6000);
	}else if (stepNum==1){
		expandDetails(false);
	}
}

function writeReleaseDetails(rel){
	var infoStr = sDetailsTitle.normal, info2Str = sDescTitle[rel.ClipType];
	var h3Str = "", h4Str = "", h5Str = "", pStr = "";
	if (rel.Show){h3Str += symbolsToEntities(rel.Show);}
	switch (rel.ClipType){
		case "episode":
			h4Str = symbolsToEntities(rel.title);
			if (rel.Season){h5Str += "Season " + symbolsToEntities(rel.Season) + ", ";}
			if (rel.Episode){h5Str += "Episode " + symbolsToEntities(rel.Episode) + ", ";}
			if (rel.Part){h5Str += symbolsToEntities(rel.Part) + ", ";}
			break;
		case "webisode":
			if (rel.Episode){h4Str = symbolsToEntities(rel.Episode);}
			if (rel.Part){h5Str += symbolsToEntities(rel.Part) + ", ";}
			break;
		case "other":
		default:
			if (rel.Episode){h4Str = symbolsToEntities(rel.Episode) + "<br />";}
			h4Str += symbolsToEntities(rel.title);
			if (rel.Part){h5Str += symbolsToEntities(rel.Part) + ", ";}
			break;
	}
	if (cwpManager.queuedRelease && rel.ID==cwpManager.queuedRelease.ID && cwpManager.firstPlayHappened){
		infoStr = sDetailsTitle.ad;
		info2Str = sDescTitle.ad;
		pStr = sAdMessage;
	}else if (rel.description){pStr = symbolsToEntities(rel.description);}
	h5Str += convertLength(rel.length);

	var htmlStr = '<div id="relSlider"><div id="relInfoDiv1"><div class="InnerTitles"><h6 id="cwpRelInfo">' + infoStr + '</h6></div>';
	if (h3Str){htmlStr += '<h3>' + h3Str + '</h3>';}
	if (h4Str){htmlStr += '<h4>' + h4Str + '</h4>';}
	if (h5Str){htmlStr += '<h5>' + h5Str + '</h5>';}
	htmlStr += '</div>';

	htmlStr += '<div id="relInfoDiv2"><div class="InnerTitles"><h6 id="cwpRelInfo2">' + info2Str + '</h6></div>';
	if (pStr){htmlStr += '<p id="cwpDesc">' + pStr + '</p>';}
	htmlStr += '</div></div>';

	$(cwpDetailsDiv).html(htmlStr);
	if ($("#relInfoDiv2").length>0){
		$("#relInfoDiv2").mouseenter(function(){expandDetails(true);});
		$("#relInfoDiv2").mouseleave(function(){expandDetails(false);});
		setTimeout("performInitialAnimation(0)",5000);
	}
};

function writeErrorDetails(heading,message){
	$(cwpDetailsDiv).html('<div class="InnerTitles"><h6>' + heading + '</h6></div><p>' + message + '</p>');
}

function startWaitingAnimation(){$(plDiv).html("<div class='animFrame'></div>");}

function focusOnTargetRelease(key, id, startingDepth,startingCat){
	cwpManager.fetchSingleRelease(key + "s",id,function(relExists){
		if (relExists){
			cwpManager.singleRelease.requestVideoPlay();
			// make this next line share code with the release select
			writeReleaseDetails(cwpManager.singleRelease);
			var cat = startingCat.findFirstParentCategory(cwpManager.singleRelease);
			if (cat){
				var loadedCat = cat.loadChildrenAtDesiredDepth($(plDiv),startingDepth,function(targetCat){
					targetCat.select();
					var rel = cat.getRelease(key,id);
					if (rel){rel.selectWithParents(startingDepth);}
					if (rel){cwpManager.setPlayingRelease(rel);}
					scrollToReleaseID = "#rel"+rel.ID;
				});
				if (!loadedCat){logError("Could not load category corresponding to target release.");}
			}
		}else{writeErrorDetails("!! Error !!","This video is no longer available.");}
	});
}

function focusOnTargetCategory(key, id, startingDepth){
	var cat = cwpManager.getCategory(key, id);
	// If we find the category and it has releases, or we should show empty categories
	if (cat && cat.hasReleases || !cwpManager.hideEmptyCats){
		var loadedCat = cat.loadChildrenAtDesiredDepth($(plDiv),startingDepth,function(targetCat){
			targetCat.select();
			cat.selectWithParents(startingDepth);
			scrollToReleaseID = "#cat"+cat.ID;
		});
		if (!loadedCat){writeErrorDetails("!! Error !!","This category is no longer available.");}
	}else{writeErrorDetails("!! Error !!","This category is no longer available.");}
}

function getCategories(data,startingDepth){
	// start loading the categories, use the callback to render
	if (cwpManager.rootCats.length===0){
		startWaitingAnimation();
		cwpManager.getCategories(function(){
			// Create list for categories and ask the manager to render all of them
			cat = cwpManager.getCategory("fullTitle",data.targetCat);
			if (!cat || !cat.hasReleases){
				$(plDiv).html("<p style='margin:20px;margin-top:20px !important;font-size:larger;font-weight:bold;color:white;'>There are currently no clips available for this player.  Please check back later.</p>");
			}
			cat.renderHTML($("#cwpMenu"),startingDepth,startingDepth);
			var qs = new cwpQS();
			if (qs.contains("releaseID")){data.enableAutoplay=false;focusOnTargetRelease("ID",qs.get("releaseID"),startingDepth,cat);}
			else if (qs.contains("releaseid")){data.enableAutoplay=false;focusOnTargetRelease("ID",qs.get("releaseid"),startingDepth,cat);}
			else if (qs.contains("releasePID")){data.enableAutoplay=false;focusOnTargetRelease("PID",qs.get("releasePID"),startingDepth,cat);}
			else if (qs.contains("releasepid")){data.enableAutoplay=false;focusOnTargetRelease("PID",qs.get("releasepid"),startingDepth,cat);}
			else if (qs.contains("categoryID")){focusOnTargetCategory("ID",qs.get("categoryID"),startingDepth);}
			else if (qs.contains("categoryid")){focusOnTargetCategory("ID",qs.get("categoryid"),startingDepth);}
			else{
				for (var i=0;i<cat.children.length;i++){
					if (cat.children[i].hasReleases){
						cat.children[i].select();
						break;
					}
				}
			}
		});
	}
}

function initializePlayerTemplate(data){
	initData = {
		categoryFields:"title,fullTitle",
		releaseFields:"thumbnailURL,title,length,description;Part,Clip Type,Web Exclusive",
		PID:data.PID,
		playerTag:data.playerTag,
		hideEmptyCats:data.hideEmptyCats,
		adParameters:data.adParameters,
		site:data.site,
		siteZone:data.siteZone,
		catPlayerTag:data.catPlayerTag
	};
	// initialize Canwest Player object
	cwpInitializeManager(initData);
	var autoplayTriggered = false;

	var startingDepth = 3;
	
	if (data.targetCat){
		startingDepth = data.targetCat.split("/").length;
	}
	// Second level category behaviours
	cwpManager.catRendering[startingDepth] = new catRender(function(targetContainer,cat){ // method for rendering a category
		targetContainer.append("<li>" + symbolsToEntities(cat.title) + "</li>");
		return targetContainer.children(":last");
	},function(targetContainer, rel){
		return targetContainer;
	});

	cwpManager.catClick(startingDepth,function(cat){
		if (!cat.isSelected){cat.select();}
	});

	cwpManager.catSelect(startingDepth,function(cat){
		if (!cat.releasesLoaded){startWaitingAnimation();}
		cat.loadChildren(function(){
			var htmlStr = "<div class='C8'><div class='ShowFeature ShowsVideoC8Title'><h3>" + symbolsToEntities(cat.title) + "</h3></div></div><div class='cwpChildren'></div>"
			$(plDiv).html(htmlStr);
			cat.showChildren($(plDiv).children(":last"),startingDepth+1,startingDepth+1);
			if (data.enableAutoplay && !autoplayTriggered){
				var rel = cat.getFirstRelease();
				if (rel){
					rel.requestVideoPlay();
					rel.select();
				}
				autoplayTriggered = true;
			}
		});	
	});

	cwpManager.catUnselect(startingDepth,function(cat){
		cat.element.parent().removeClass(CWP_CLASS_SEL);
	});

	// Release behaviours
	if (typeof(classicsReleaseRenderOverride)=='function'){
		cwpManager.relRendering = classicsReleaseRenderOverride;
	} else {
		cwpManager.relRendering = function(targetContainer,rel){
			var htmlStr = '<div id="rel'+rel.ID+'" class="ShowsVideoButton C2"><div class="Video2PlayOverLay">' +
				'<a href="javascript:void(0);"><img alt="" src="'+ rel.thumbnailURL + '" width="100" height="70"/></a><a class="PlayButton" href="javascript:void(0);"></a></div>';
			switch (rel.ClipType){
				case "webisode":
					htmlStr += "<h4>" + symbolsToEntities(rel.title) + "</h4>";
					titleStr = "";
					if (rel.Episode){
						titleStr = symbolsToEntities(rel.Episode);
						if (rel.Part){titleStr += "<br /> (" + symbolsToEntities(rel.Part) + ")";}
					}else if (rel.Part){titleStr += symbolsToEntities(rel.Part);}
					if (titleStr){htmlStr += "<p>" + titleStr + "</p>";}
					break;
				case "episode":
					titleStr = symbolsToEntities(rel.title);
					if (rel.Part){titleStr += "<br />  (" + symbolsToEntities(rel.Part) + ")";}
					if (rel.Episode){htmlStr += "<h4>Episode " + symbolsToEntities(rel.Episode) + "</h4><p>" + titleStr + "</p>";}
					else{htmlStr += "<h4>" + titleStr + "</h4>";}
					break;
				case "other":
				default:
					titleStr = symbolsToEntities(rel.title);
					if (rel.Part){titleStr += "<br />  (" + symbolsToEntities(rel.Part) + ")";}
					if (rel.Episode){htmlStr += "<h4>" + symbolsToEntities(rel.Episode) + "</h4><p>" + titleStr + "</p>";}
					else{htmlStr += "<h4>" + titleStr + "</h4>";}
					break;
			}
			htmlStr += "</div>";
			targetContainer.append(htmlStr);
			var newElement = targetContainer.children(":last");
			// If this is the first release we are writing, let's figure out if we need to lock the height
			if (rel.parentCat.children[0]==rel){
				targetContainer.height(newElement.outerHeight(true)*Math.ceil(rel.parentCat.children.length/4));
			}
			return newElement;
		};
	}

	cwpManager.relClick(function(rel){
		rel.requestVideoPlay();
		$.scrollTo(0);
		rel.select();
	});

	cwpManager.relSelect(function(rel){
		writeReleaseDetails(rel);
	});	

	cwpManager.OnPlayBlocked = function(blockPlay,rel){
		if (!blockPlay){
			// Replace the "wait on advertisement" text
			$("#cwpRelInfo").html(sDetailsTitle.normal);
			$("#cwpRelInfo2").html(sDescTitle[rel.ClipType]);
			if (rel.description){$("#cwpDesc").html(symbolsToEntities(rel.description));}
			else{$("#cwpDesc").remove();}
		}
	};

	cwpManager.relOnVideoStart(function(rel,pdkEvent){
		// If the ad synching library is available, we will let it handle companion ads
		if (typeof adSync == "object"){
			adSync.TriggerVideoAdSynch(pdkEvent);
		}
	});

	cwpManager.OnPlayClick = function(){
		if (data.targetCat){
			var rel = cwpManager.rootCats[0].getCategory("fullTitle",data.targetCat).getFirstRelease();
			if (rel){
				rel.requestVideoPlay();
				rel.selectWithParents(startingDepth+1);
				cwpManager.setPlayingRelease(rel);
			}
		}
	};

	cwpManager.OnNoCategories = function(){
		$(plDiv).html("<div style='margin:20px;margin-top:20px !important;font-size:larger;'>There are currently no clips available for this player.  Please check back later.</div>");
	}
	getCategories(data,startingDepth);
	cwpAjaxLinks();
}

function insertScript(data, extraSwfParams){
	if (!data.skipFlash){
		var parsedLocation = window.location.href.replace(/[?].*/,"");
		var rootURL = parsedLocation.match(/^[^\/]*\/\/[^\/]*/);
		var playerURL = "&playerURL=" + escape(parsedLocation + "?releasePID={releasePID}");
		var rssURL = "&RSSURL=";
		if (data.rssURL){rssURL += escape(data.rssURL);}
		else{rssURL += escape(akamaiRoot + "MRSS.ashx?U=" + parsedLocation);}
		
		var sbStr = ScriptRoot + "?type=Video&u=" + escape(parsedLocation) + playerURL + rssURL + ((data.theme == "default")?"":"&theme="+data.theme) + "&width=" + data.videoWidth + "&height=" + data.videoHeight + "&PID=" + data.PID + "&playerTag=" +data.playerTag;
		if (data.overlayImage){sbStr += "&plugin6=type=overlay|URL=http://webdata.globaltv.com/global/canwestPlayer/swf/ImageOverlayPlugin.swf|image_path=" + data.overlayImage;}
		if(extraSwfParams) {sbStr += extraSwfParams;}
		logDebug("Scriptbuilder: " + sbStr);
		$.ajaxSetup({cache:true});
		$.getScript(sbStr,function(){
			$(document).ready(function(){initializePlayerTemplate(data);});
		});
		$.ajaxSetup({cache:false});
	}else{
		$(document).ready(function(){initializePlayerTemplate(data);});
	}
}

function cwpInsertPlayer(data){
	// set defaults
	var initData = {};
	if(!ScriptRoot){alert("ScriptRoot must be defined somewhere in the page or the template.");}
	if(!data.PID){alert("You must specify the PID.");return;}
	if(!data.playerTag){alert("You must specify the playerTag.");return;}
	if(!data.site){alert("You must specify the site.");return;}
	data.theme = data.theme || "default";
	data.videoWidth = data.videoWidth || 400;
	data.videoHeight = Math.floor(data.videoWidth / 16 * 9 + 20);
	data.playerWidth = data.playerWidth || 400;
	data.playerHeight = data.playerHeight || data.videoHeight;
	// If the user hasn't specified adParameters, look for a global adParameters object
	data.adParameters = data.adParameters || window["adParameters"] || null;
	$("#playerFrame").before('<div class="commManager" id="commManagerDiv"></div>');

	insertScript(data);
}
