/**
 * @namespace Holds video-on-demand specific classes for the Sureflix Client Library
 * @uses lib/Sureflix/Sureflix.js
 * @uses lib/Prototype/Prototype.js
 * @author Erik 7/17/2007 
 */
Sureflix.Vod = {};
var SxVo = Sureflix.Vod;

/**
 * Returns a correctly formatted SureflixAPI URL
 * @param {String} movie The movie code of the desired movie
 * @return {Object} The movie info object
 * @author Erik 07/17/2008
 */
Sureflix.Vod.getSureflixApiJsonUrl = function (objectType, objectName, command) {
	return "http://" + document.location.host + "/SureflixApi/v1/" + objectType  + "/" + command + "/" + objectName + ".json";
}


/**
 * Loads movie info from the SureflixAPI Web Service
 * @param {String} movie The movie code of the desired movie
 * @return {Object} The movie info object
 * @author Erik 07/17/2008
 */
Sureflix.Vod.getMovieInfo = function(movie) {
	var jsonResponse;
	var webServiceUrl = this.getSureflixApiJsonUrl("Database", "Movie", "List");

	var paramObj = {
		Code: movie
	}

	new Ajax.Request(
		webServiceUrl, {
			method: 'GET',
			asynchronous: false,
			parameters: paramObj,
			onSuccess: function(transport) {
				var result = transport.responseText;
				jsonResponse = eval('(' + result + ')');
			}
		}
	);

	var movieInfo = jsonResponse.SureflixApiResult.Content.Records.MovieZone;
	movieInfo.Year = parseInt(movieInfo.Year);
	movieInfo.Scenes = parseInt(movieInfo.Scenes);
	movieInfo.Time = parseInt(movieInfo.Time);
	movieInfo.Level = parseInt(movieInfo.Level);
	movieInfo.Rating = parseInt(movieInfo.Rating);
	movieInfo.Raters = parseInt(movieInfo.Raters);
	movieInfo.Score = parseInt(movieInfo.Score);
	movieInfo.Watched = parseInt(movieInfo.Watched);
	movieInfo.ScenePics = parseInt(movieInfo.ScenePics);
	movieInfo.RMVersion = parseInt(movieInfo.RMVersion);
	movieInfo.WMVersion = parseInt(movieInfo.WMVersion);
	movieInfo.MPVersion = parseInt(movieInfo.MPVersion);
	movieInfo.Royalty = parseInt(movieInfo.Royalty);
	movieInfo.StarPics = parseInt(movieInfo.StarPics);
	movieInfo.EpisodicInterval = parseInt(movieInfo.EpisodicInterval);
	movieInfo.EpisodicScenesQty = parseInt(movieInfo.EpisodicScenesQty);
	movieInfo.EscapeDateScene = parseInt(movieInfo.EscapeDateScene);
	movieInfo.Protected = ((movieInfo.Protected + "").toLowerCase() == "true");
	movieInfo.LP = ((movieInfo.LP + "").toLowerCase() == "true");
	movieInfo.SC = ((movieInfo.SC + "").toLowerCase() == "true");
	movieInfo.TV = ((movieInfo.TV + "").toLowerCase() == "true");

	movieInfo.WideScreen = ((movieInfo.WideScreen + "").toLowerCase() == "true");
	movieInfo.Opening = ((movieInfo.Opening + "").toLowerCase() == "true");

	movieInfo.NoClipShare = ((movieInfo.NoClipShare + "").toLowerCase() == "true");
	movieInfo.NoStudioPass = ((movieInfo.NoStudioPass + "").toLowerCase() == "true");	

	return movieInfo;
}


/**
 * Loads scene info from the SureflixAPI Web Service
 * @param {String} movie The movie code of the desired movie
 * @param {String} scene The scene number of the desired movie
 * @return {Object} The scene info object
 * @author Erik 07/17/2008
 */
Sureflix.Vod.getSceneInfo = function(movie, scene) {
	if (scene <= 0) {
		throw "Invalid scene number (" + scene + ") passed to Sureflix.Vod.getSceneInfo()";
	}

	var jsonResponse;
	var webServiceUrl = this.getSureflixApiJsonUrl("Database", "Scene", "List");

	var paramObj = {
		Code: movie,
		Scene: scene
	}

	new Ajax.Request(
		webServiceUrl, {
			method: 'GET',
			asynchronous: false,
			parameters: paramObj,
			onSuccess: function(transport, json) {
				var result = transport.responseText;
				jsonResponse = eval('(' + result + ')');
			}
		}
	);

	//var sceneInfo = {};
	var sceneInfo = jsonResponse.SureflixApiResult.Content.Records.Scene;
	sceneInfo.Scene = parseInt(sceneInfo.Scene);
	sceneInfo.Time = parseInt(sceneInfo.Time);
	sceneInfo.Watched = parseInt(sceneInfo.Watched);
	if (sceneInfo.StartMillisecs != null) sceneInfo.StartMillisecs = parseInt(sceneInfo.StartMillisecs);
	if (sceneInfo.DurationMillisecs != null) sceneInfo.DurationMillisecs = parseInt(sceneInfo.DurationMillisecs);

	return sceneInfo;
}

/**
* Invokes GetMediaUrl method of Rentals.asmx web service
* @param {Object} paramObj The parameters to pass to the web service (see http://sureflix.com/Pull/Rentals.asmx?op=GetMediaUrl)
* @return {Object} The returned values as an object
* @author Erik 12/30/2008
*/
Sureflix.Vod.getMediaUrl = function(paramObj) {
	var result = null;

	var returnObj = {
		message: "",
		mediaUrl: "",
		playID: 0,
		stubID: 0,
		lastPosition: 0,
		wmDownloadEnabled: true,
		bitrateLimit: false,
		wmEnabled: true,
		rmEnabled: true,
		fmEnabled: true,
		smEnabled: true
	}

	var webServiceUrl = "http://" + document.location.host + "/Pull/Rentals.asmx/GetMediaUrl";
	new Ajax.Request(
		webServiceUrl, {
			method: 'GET',
			asynchronous: false,
			parameters: paramObj,
			onSuccess: function(transport) {
				result = transport.responseXML;
			}
		}
	);

	try {
		if (result.getElementsByTagName("result")[0].firstChild.nodeValue == "OK") {
			returnObj.message = "OK";
			try {
				returnObj.mediaUrl = result.getElementsByTagName("MediaUrl")[0].childNodes[0].nodeValue;
			} catch (e) { }
			returnObj.playID = result.getElementsByTagName("PlayID")[0].childNodes[0].nodeValue;
			returnObj.stubID = result.getElementsByTagName("StubID")[0].childNodes[0].nodeValue;
			returnObj.lastPosition = parseInt(result.getElementsByTagName("LastPosition")[0].childNodes[0].nodeValue);
			returnObj.wmDownloadEnabled = result.getElementsByTagName("WmDownloadEnabled")[0].childNodes[0].nodeValue;
			returnObj.bitrateLimit = result.getElementsByTagName("BitrateLimit")[0].childNodes[0].nodeValue;
			returnObj.wmEnabled = (result.getElementsByTagName("WMENABLED")[0].childNodes[0].nodeValue == "True");
			returnObj.rmEnabled = (result.getElementsByTagName("RMENABLED")[0].childNodes[0].nodeValue == "True");
			returnObj.fmEnabled = (result.getElementsByTagName("FMENABLED")[0].childNodes[0].nodeValue == "True");
			returnObj.smEnabled = (result.getElementsByTagName("SMENABLED")[0].childNodes[0].nodeValue == "True");
		} else {
			Sureflix.Error.ErrorHandler.consoleError({ result: result.getElementsByTagName("result")[0].firstChild.nodeValue, message: result.getElementsByTagName("message")[0].firstChild.nodeValue }, "GetMediaUrl result: #{result}\n\n#{message}");
			returnObj.message = result.getElementsByTagName("message")[0].firstChild.nodeValue;
		}
	} catch (e) {
		Sureflix.Error.ErrorHandler.userError(e, "An error has occurred trying to load the media URL: #{message}\n\n(Line #{lineNumber} in #{fileName})");
		returnObj.message = e.message;
	}

	return returnObj;
}


/**
* Invokes the GetClip web service
* @param {String} movie
* @param {Int} scene
* @param {String} member
* @return {Boolean}
* @author Erik 7/08/2009
*/
Sureflix.Vod.getClip = function(movie, scene, member) {
	var result = null;

	var paramObj = {
		movie: movie,
		scene: scene,
		member: member
	}
	var returnObj = {
		Success: false,
		ErrorType: "",
		Message: "",
		Clip: 0,
		Member: "",
		Created: "",
		Movie: "",
		Scene: 0,
		StartMillisecs: 0,
		DurationMillisecs: 0,
		Title: "",
		Comment: "",
		Suspended: false,
		SuspendedReason: ""
	}

	var webServiceUrl = "http://" + document.location.host + "/pc/GetClipService.asp";
	new Ajax.Request(
		webServiceUrl, {
			method: 'GET',
			asynchronous: false,
			parameters: paramObj,
			onSuccess: function(transport) {
				result = transport.responseXML;
			}
		}
	);

	try {
		if (result.getElementsByTagName("Status")[0].firstChild.nodeValue == "SUCCESS") {
			returnObj.Success = true;
			returnObj.Clip = result.getElementsByTagName("Clip")[1].childNodes[0].nodeValue;
			returnObj.Member = result.getElementsByTagName("Member")[0].childNodes[0].nodeValue;
			returnObj.Created = result.getElementsByTagName("Created")[0].childNodes[0].nodeValue;
			returnObj.Movie = result.getElementsByTagName("Movie")[0].childNodes[0].nodeValue;
			returnObj.Scene = parseInt(result.getElementsByTagName("Scene")[0].childNodes[0].nodeValue);
			returnObj.StartMillisecs = parseInt(result.getElementsByTagName("StartMillisecs")[0].childNodes[0].nodeValue);
			returnObj.DurationMillisecs = parseInt(result.getElementsByTagName("DurationMillisecs")[0].childNodes[0].nodeValue);
			try {
				returnObj.Title = (result.getElementsByTagName("Title")[0].childNodes[0].nodeValue);
				returnObj.Comment = (result.getElementsByTagName("Comment")[0].childNodes[0].nodeValue);
				returnObj.Suspended = (result.getElementsByTagName("Suspended")[0].childNodes[0].nodeValue);
				returnObj.SuspendedReason = (result.getElementsByTagName("SuspendedReason")[0].childNodes[0].nodeValue);
			} catch (e) { }
		} else {
			returnObj.ErrorType = result.getElementsByTagName("ErrorType")[0].childNodes[0].nodeValue;
			returnObj.Message = result.getElementsByTagName("Message")[0].childNodes[0].nodeValue;
			if (returnObj.ErrorType != "ClipNotFoundException") {
				Sureflix.Error.ErrorHandler.consoleError({ result: returnObj.ErrorType, message: returnObj.Message }, "getClip result: #{result}: #{message}");
			}
		}
	} catch (e) {
		Sureflix.Error.ErrorHandler.consoleError(e, "An error has occurred in getClip: #{message}\n\n(Line #{lineNumber} in #{fileName})");
		returnObj.message = e.message;
	}

	return returnObj;
}


Sureflix.Vod.getBandwidth = function() {
	var bandwidth = SxUt.GetCookie("Bandwidth");
	bandwidth = parseInt(bandwidth);
	if (isNaN(bandwidth)) bandwidth = 0;
	return (bandwidth);
}


Sureflix.Vod.setBandwidth = function(bandwidth) {
	bandwidth = parseInt(bandwidth + "");
	if (!isNaN(bandwidth)) {
		Sureflix.SendBack("What=Bandwidth&Value=" + bandwidth);
		SxUt.SetCookie("Bandwidth", bandwidth);
	}
}


Sureflix.Vod.getPlayFormat = function(streamOrDownload) {
	var playFormat = Sureflix.Utilities.GetCookie(streamOrDownload);

	var correctFormat = /[arwsf][ds][cs](0000|0056|0256|0512|0768|1100)/.test(playFormat);

	if (!correctFormat) {
		if (streamOrDownload == "StreamFormat") {
			playFormat = "asc"; //automatic platform selection
		} else {
			playFormat = "wdc";
		}

		playFormat += "0000";
	}

	return (playFormat);
}


/**
* Returns the member's option of what to do when a video ended (stored in a cookie)
* @return {String} "Stop" | "Next" | "Loop"
* @author Erik 12/31/2008
*/
Sureflix.Vod.getVideoEnded = function() {
	var videoEnded = SxUt.GetCookie("VideoEnded");

	if (videoEnded != "Next" && videoEnded != "Loop") {
		videoEnded = "Stop";
	}

	return videoEnded;
}


/**
* Sets the member's option of what to do when a video ended (stored in a cookie)
* @param {String} videoEnded "Stop" | "Next" | "Loop"
* @author Erik 12/31/2008
*/
Sureflix.Vod.setVideoEnded = function(videoEnded) {
	if (videoEnded != "Next" && videoEnded != "Loop") {
		videoEnded = "Stop";
	}

	SxUt.SetCookie("VideoEnded", videoEnded);
}


/**
 * Returns the Fast Forward Interval in milliseconds (used in setInterval in the Player), reading it from a cookie or returning the default value
 */
Sureflix.Vod.getFFInt = function() {
	var ffInt = parseInt(SxUt.GetCookie("FFInt"));
	
	if (isNaN(ffInt)) ffInt = 1000
	else if (ffInt <= 750) ffInt = 500
	else if (ffInt > 750 && ffInt <= 1250) ffInt = 1000
	else if (ffInt > 1250 && ffInt <= 1750) ffInt = 1500
	else if (ffInt > 1750 && ffInt <= 2250) ffInt = 2000
	else if (ffInt > 2250) ffInt = 2500;

	return (ffInt);
}


/**
 * Returns an array of 4 fast forward speeds, reading it from a cookie or returning the default value;
 * the first element of the array is always 1 (indicating normal speed)
 * eg: [1, 2, 5, 20] => (0x, 2x, 5x, 20x)
 */
Sureflix.Vod.getFFSpeeds = function() {
	var ffSpeed = SxUt.GetCookie("FFSpeed") + "";
	var ffSpeeds = ffSpeed.split("|");
	if (ffSpeeds.length != 4) ffSpeeds = ["1", "2", "5", "20"];
	ffSpeeds[0] = 1;

	for (var i = 1; i <= 3; i++) {
		var speed = parseInt(ffSpeeds[i]);
		
		if (speed < 2) speed = 2
		else if (speed == 7) speed = 8
		else if (speed == 9) speed = 10
		else if (speed == 11) speed = 12
		else if (speed == 13) speed = 14
		else if (speed == 15) speed = 15
		else if (speed == 17) speed = 18
		else if (speed >= 19 && speed < 30) speed = 20
		else if (speed >= 30 && speed < 40) speed = 30
		else if (speed >= 40) speed = 40;
		
		ffSpeeds[i] = speed;
	}
	
	return (ffSpeeds);
}


/**
* Invokes the CreateClip method of the Rentals.asmx web service (currently using /pc/ClipShareService.asp
* @param {String} member The member ID
* @param {String} movie The movie code
* @param {Integer} scene The scene number
* @param {Integer} start The start time in seconds
* @param {String} title The clip title
* @param {String} comment The clip comment
* @return {Object} The returned values as an object; 
* return.result: "OK" or "ERROR";
* return.message: Error message if return.result is "ERROR";
* return.clipID: The ID of the newly created Clip if return.result is "OK"
* @author Erik 02/11/2009
*/
Sureflix.Vod.createClip = function(member, movie, scene, start, title, comment) {
	var paramObj = {
		member: member,
		movie: movie,
		scene: scene,
		start: start,
		title: title,
		comment: comment
	}

	var returnObj = {
		result: "",
		feedback: "",
		message: "",
		clipID: ""
	}

	var webServiceUrl = "http://" + document.location.host + "/pc/CreateClipService.asp";
	new Ajax.Request(
		webServiceUrl, {
			method: 'POST',
			asynchronous: false,
			parameters: paramObj,
			onSuccess: function(transport) {
				result = transport.responseXML;
			}
		}
	);

	try {
		if (result.getElementsByTagName("result")[0].firstChild.nodeValue == "OK") {
			returnObj.result = "OK"
			returnObj.feedback = result.getElementsByTagName("feedback")[0].firstChild.nodeValue;
			returnObj.message = result.getElementsByTagName("message")[0].firstChild.nodeValue;
			returnObj.clipID = result.getElementsByTagName("clipID")[0].childNodes[0].nodeValue;
		} else {
			returnObj.result = "ERROR";
			returnObj.message = result.getElementsByTagName("message")[0].firstChild.nodeValue;
		}
	} catch (e) {
		returnObj.result = "ERROR";
		returnObj.message = e.message;
	}

	return returnObj;
}


Sureflix.Vod.handlePlayOrRentScene = function(isRented, movieCode, scene) {
        
	var tabDays = this.getCurrentTabPosition();
	
	if (isRented) {
		this.playScene(movieCode, scene, tabDays, 'event');	
	} else {	
		this.doRent(movieCode, scene, tabDays);
	} 
}

Sureflix.Vod.doRent = function(movieCode, scene, tabDays) {
	var values = {movie: movieCode, scene: scene, days: tabDays}
	//var url = 'Rent.asp?Movie=' + movieCode + '&Scene=' + scene + '&Days=' + tabDays + '&Source=' + SxUt.getEncodedSource();
	var urlTemplate = new Template(Sureflix.getRentLinkTemplate());
	var url = urlTemplate.evaluate(values)  + '&Source=' + SxUt.getEncodedSource();
	document.location = url;
}


Sureflix.Vod.getCurrentTabPosition = function(){
	
	var tabDaysCode = SxUt.GetCookie('DaysTab') || 'A';
	var tabDays = Sureflix.getTabDays()[tabDaysCode];
	return tabDays;
}


Sureflix.Vod.showDays = function(tab, divId, detailRef, isPPM, channel) {
		
		if(isPPM + "" == "undefined"){
		    isPPM = false;
		}
		
		divId = divId + "";
	    detailRef = detailRef + "";
	    channel = channel + "";
	    
    	if (channel != "undefined") {
    	        scenes = 0;
    	}
    	
		  for (var scene=1; scene <= scenes + 1; scene++) { 
	    
            if(isPPM && scene == 0) {
				if(tab == 'C' || tab == 'D') continue;
			}
			    if ((minutes[0] > 0) || (minutes[scene] > 0)) continue;
			    if (minutes[scene] == -1) continue;
			    
			        if (tab == 'A') {
				        if (detailRef == "undefined"){
        				
					        $('DivDaysA'+scene).show();
					        $('DivDaysB'+scene).hide();
					        $('DivDaysC'+scene).hide();
					        $('DivDaysD'+scene).hide();
					        
					    }else if(detailRef == "rent"){ 
					        $('RentDivIdA0').show();
					        $('RentDivIdB0').hide();
					        $('RentDivIdC0').hide();
					        $('RentDivIdD0').hide(); 
        										
				        }else{
        				
					        for(var i = 0; i < 5; ++ i){
						        if($('DivDays100B'+ i) == null) continue;
						        if($('DivDays100C'+ i) == null) continue;
						        if($('DivDays100D'+ i) == null) continue;
        						
						        $('DivDays100B'+ i).hide();						
						        $('DivDays100A'+ i).show();
						        $('DivDays100C'+ i).hide();						
						        $('DivDays100D'+ i).hide();							
        						
					        }		
				        }
        						
			        } else if (tab == 'B') {
				        if (detailRef == "undefined"){        				
					        
					         $('DivDaysA'+scene).hide();
					         $('DivDaysB'+scene).show();
					         $('DivDaysC'+scene).hide();
					         $('DivDaysD'+scene).hide();
					         
        				}else if(detailRef == "rent"){ 
					        $('RentDivIdA0').hide();
					        $('RentDivIdB0').show();
					        $('RentDivIdC0').hide();
					        $('RentDivIdD0').hide(); 
        					
				        }else{
        									
					        for(var i = 0; i < 5; ++ i){
						        if($('DivDays100A'+i) == null) continue;
        						if($('DivDays100C'+ i) == null) continue;
        						if($('DivDays100D'+ i) == null) continue;
        						
						        $('DivDays100A'+i).hide();						
						        $('DivDays100B'+i).show();
						        $('DivDays100C'+ i).hide();						
						        $('DivDays100D'+ i).hide();	
        											
					        }
				        }
        				
			        } else if (tab == 'C') {
			        
				             if (detailRef == "undefined"){        				
					        
					         $('DivDaysA'+scene).hide();
					         $('DivDaysB'+scene).hide();
					         $('DivDaysC'+scene).show();
					         $('DivDaysD'+scene).hide();
					         
        				}else if(detailRef == "rent"){ 
					        $('RentDivIdA0').hide();
					        $('RentDivIdB0').hide();
					        $('RentDivIdC0').show();
					        $('RentDivIdD0').hide(); 
        					
				        }else{
        									
					        for(var i = 0; i < 5; ++ i){
						        if($('DivDays100A'+i) == null) continue;
        						if($('DivDays100B'+ i) == null) continue;
        						if($('DivDays100D'+ i) == null) continue;
        						
						        $('DivDays100A'+i).hide();						
						        $('DivDays100B'+i).hide();
						        $('DivDays100C'+i).show();						
						        $('DivDays100D'+i).hide();	
        											
					        }
				        }
			        
			        } else if (tab == 'D') {
			        
				             if (detailRef == "undefined"){        				
					        
					         $('DivDaysA'+scene).hide();
					         $('DivDaysB'+scene).hide();
					         $('DivDaysC'+scene).hide();
					         $('DivDaysD'+scene).show();
					         
        				}else if(detailRef == "rent"){ 
					        $('RentDivIdA0').hide();
					        $('RentDivIdB0').hide();
					        $('RentDivIdC0').hide();
					        $('RentDivIdD0').show(); 
        					
				        }else{
        									
					        for(var i = 0; i < 5; ++ i){
						        if($('DivDays100A'+i) == null) continue;
						        if($('DivDays100B'+i) == null) continue;
        						if($('DivDays100C'+i) == null) continue;
        						
        						
						        $('DivDays100A'+i).hide();						
						        $('DivDays100B'+i).hide();
						        $('DivDays100C'+i).hide();						
						        $('DivDays100D'+i).show();	
        											
					        }
				        }
			        }
			
		}
		
	

		Sureflix.Utilities.SetCookie("DaysTab", tab);
		var rentalDays = Sureflix.getTabDays()[tab] || 1;
		Sureflix.Utilities.SetCookie("RentalDays", rentalDays);

		ShowDaysExtra(tab);
	}


	Sureflix.Vod.getRentalDays = function() {
		var days = SxUt.GetCookie("RentalDays");
		days = parseFloat(days);
		if (isNaN(days)) days = 1;
		return days;
	}


	Sureflix.Vod.autoPlay = function() {
		var movieToPlay = SxUt.GetCookie("MovieToPlay");
		var sceneToPlay = SxUt.GetCookie("SceneToPlay");

		SxUt.SetCookie("MovieToPlay", "");
		SxUt.SetCookie("SceneToPlay", "");

		if (movieToPlay != "" && sceneToPlay != "") {
			Sureflix.Vod.playScene(movieToPlay, sceneToPlay, 0, null, true);
		}
	}

	Sureflix.Vod.playScene = function(movie, scene, days, evt, onload) {
		if (!days) days = Sureflix.Vod.getRentalDays();
		// evt: event object to determine if altKey was pressed
		// onload: if true, PlayScene is being called at page load time, not a click

		var console = 1;
		if (!SxUt.isEmpty(evt)) {
			if (evt.altKey)
				console = 2;
			else
				console = 1;
		}

		consoleStr = GetConsole(console);
		consoleArray = consoleStr.split("|");

		playerSize = consoleArray[0];
		playerLeft = consoleArray[1];
		playerTop = consoleArray[2];
		tabBottom = consoleArray[3];
		tabSide = consoleArray[4];
		playerWidth = consoleArray[5];
		playerHeight = consoleArray[6];

		//don't allow player to go completely off the screen
		if (playerLeft >= window.screen.width - 20) playerLeft = 20;
		if (playerTop >= window.screen.height - 20) playerTop = 20;

		var playerWindow = window.open("Player.asp?Movie=" + movie + "&Scene=" + scene + "&Days=" + days + "&Console=" + console, "SureFlix" + console, "left=" + playerLeft + ",top=" + playerTop + ",width=" + playerWidth + ",height=" + playerHeight + ",scrollbars=yes,toolbar=no,directories=no,status=no,resizable=yes");
		if (!playerWindow) {
			if (!onload) PopupBlocked();
		} else {
			playerWindow.focus();
		}
	}