$S = CBC.SETTINGS;
$E = CBC.EVENT;
var mavenVideo = function() {	
/*
INPUTS		 
-- playerMetadata
		object which contains maven player attribute values used to load the player (see readPlayerMetadata() for more detail)
-- playlistMetadata
    object which contains html playlist options used to load the html playlist (see readPlaylistMetadata() for more detail)
*/
	var $U = CBC.UTIL;
	return	{
 		createHTMLPlaylist: function(o) {
 			var playlistMD = {}, playerMD = {};
 			if (o.playlistMetadata) playlistMD = mavenVideo.readPlaylistMetadata(o.playlistMetadata)
 			else $U.debug('Error reading playlist metadata');
 		  if (o.playerMetadata) playerMD = mavenVideo.readPlayerMetadata(o.playerMetadata)
 		  else $U.debug('Error reading player metadata');
 		  //$U.makeRequest(o.playlistMetadata.feedUrl,{success:mavenVideo.ajaxSuccess,failure:mavenVideo.ajaxFailure,context:mavenVideo},{params:{container:o.playlistMetadata.container,destUrl:o.playlistMetadata.destUrl, feedDataType:o.playlistMetadata.feedDataType}});
 		  $U.makeRequest(o.playlistMetadata.feedUrl,{success:mavenVideo.ajaxSuccess,failure:mavenVideo.ajaxFailure,context:mavenVideo},{params:{playerMD:playerMD, playlistMD:playlistMD}});
 		},
 		
 		readPlayerMetadata : function (playerMetadata){
 			var playerMD = {};
			playerMD.container=(playerMetadata.container)?playerMetadata.container:null; //id of the html element containing the maven player (string)
			playerMD.playerHeight=(playerMetadata.playerHeight)?playerMetadata.playerHeight:"379"; //maven player container height (integer)
			playerMD.playerWidth=(playerMetadata.playerWidth)?playerMetadata.playerWidth:"586"; //maven player container width (integer)
			playerMD.playerBgColor=(playerMetadata.playerBgColor)?playerMetadata.playerBgColor:"#ffffff"; //maven player background color (string)
			playerMD.playerId=(playerMetadata.playerId)?playerMetadata.playerId:null; //get maven player id from maven console (string)
			return playerMD;
 		},
 		readPlaylistMetadata : function (playlistMetadata){
 			var playlistMD = {};
 			playlistMD.playlistId = (playlistMetadata.playlistId)?playlistMetadata.playlistId:null; //get the id of the playlist from the maven console (string)
			playlistMD.container = (playlistMetadata.container)?playlistMetadata.container:null; //id of the HTML element to be populated with the playlist 
			playlistMD.feedUrl = (playlistMetadata.feedUrl)?playlistMetadata.feedUrl:null; //data type of the feed (XML, JSON, RSS)
			playlistMD.feedDataType = (playlistMetadata.feedDataType)?playlistMetadata.feedDataType:null; //url of the cached feed
			playlistMD.deeplink = (playlistMetadata.deeplink)?playlistMetadata.deeplink:false; //toggle playlist to deeplink to an archive player vs load in single clip player that lives on the same html page
			playlistMD.destUrl = (playlistMetadata.destUrl)?playlistMetadata.destUrl:null; //the deep linking url
			playlistMD.linkTarget=(playlistMetadata.linkTarget)?playlistMetadata.linkTarget:"_self"; //anchor target attribute value for clips in the playlist for deep linking ("_self", "_blank")
			playlistMD.playlistLength=(playlistMetadata.playlistLength)?playlistMetadata.playlistLength:5; //desired number of video clips to be rendered in html
 			return playlistMD;
 		},
 		ajaxSuccess : function (response){
 			
 			switch( response[1].playlistMD.feedDataType ) {
 				case 'RSS': //Legacy Case
 		      mavenVideo.writeFromRss(response[0].responseXML, response[1].playlistMD, response[1].playerMD);
 		    	break;
 		    case 'XML':
 		      mavenVideo.writeFromXml(response[0].responseXML, response[1].playlistMD, response[1].playerMD);
 		    	break;
 		    case 'JSON': //contains Legacy Case
 		     	mavenVideo.writeFromJson(response[0].responseText, response[1].playlistMD, response[1].playerMD);                     
 		    	break;
 		    default:
 		      mavenVideo.writeFromJson(response[0].responseText, response[1].playlistMD, response[1].playerMD);
 		    	break;
 			}
 		},
 		ajaxFailure : function (response,params){
 			$U.debug("AJAX request failure: Unable to fulfill request.");
 		},
 		writeFromXml: function( responseXml, playlistMD, playerMD) {
 		
 		   //tidy container
 		   var videoBag = document.getElementById( playlistMD.container );
 		   while ( videoBag.hasChildNodes() ) {
 		      videoBag.removeChild( videoBag.lastChild );
 		   }
 		
 		   //set up counter
 		   var data = responseXml.getElementsByTagName( 'videoAsset' );
 		
 		   //write out the data
 		   for (var i = 0; i < data.length; i++ ) {
					
					if (i > (playlistMD.playlistLength-1)) break;
 		
 		      // get the XML data
 		      var clipTitle = data[i].getElementsByTagName('title')[0].firstChild.nodeValue;
 		      var clipSeconds = (data[i].getElementsByTagName('videoSeconds')[0]) ? data[i].getElementsByTagName('videoSeconds')[0].firstChild.nodeValue : "0";
 		      if (clipSeconds == -1) var clipLength = "";
 		      else var clipLength = mavenVideo.formatSeconds(clipSeconds);
 		      var clipID = (data[i].getElementsByTagName('migrationId')[0])?data[i].getElementsByTagName('migrationId')[0].firstChild.nodeValue:data[i].getElementsByTagName('id')[0].firstChild.nodeValue;
 		    	var clipDesc = data[i].getElementsByTagName('shortDescription')[0].firstChild.nodeValue;
 		    	var clipMedia = data[i].getElementsByTagName('media');
 		    	for (var j=0; j<clipMedia.length; j++){ //search for the thumbnail location
 		    		if (clipMedia[j].getElementsByTagName('profile')[0].getAttribute('href') == 'defaultThumbnail')
 		    			var clipImg = (clipMedia[j].getElementsByTagName('uri')[0].firstChild)?clipMedia[j].getElementsByTagName('uri')[0].firstChild.nodeValue:"";
 		    	}
 		
 		      //write out the data
 		      mavenVideo.writeUpdate( videoBag, playlistMD.destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlistMD, playerMD);
 		   }
 		
 		},
 		writeFromRss: function( responseXml, playlistMD, playerMD) { //Legacy Function
 		   //tidy container
 		   var videoBag = document.getElementById( playlistMD.container );
 		   while ( videoBag.hasChildNodes() ) {
 		      videoBag.removeChild( videoBag.lastChild );
 		   }

 		   //set up counter
 		   var data = responseXml.getElementsByTagName( 'item' );
 		
 		   //write out the data
 		   for (var i = 0; i < data.length; i++ ) {

					if (i > (playlistMD.playlistLength-1)) break;
 		
 		      // get the XML data
 		      var clipTitle = data[i].getElementsByTagName('title')[0].firstChild.nodeValue;
 		      var clipLength = (data[i].getElementsByTagName('duration')[0]) ? data[i].getElementsByTagName('duration')[0].firstChild.nodeValue : "";
 		      if (data[i].getElementsByTagName('videoId')[0]){
 		      	var clipID = data[i].getElementsByTagName('videoId')[0].firstChild.nodeValue;
 		    	} else {
 		    		//parse link property
 		    		var clipID = data[i].getElementsByTagName('link')[0].firstChild.nodeValue.split('maven_referralObject=')[1].replace(/<\/link>/g,"");
 		    	}
 		
 		      if ( document.getElementsByTagNameNS ) {
 		         var clipImgPre = data[i].getElementsByTagNameNS('*','thumbnail');
 		         var clipImg = clipImgPre[0].getAttribute('url');
 		         var clipDescPre = data[i].getElementsByTagNameNS('*','description');
 		         var clipDesc = clipDescPre[0].firstChild.nodeValue;
 		      } else {
 		         clipImg = data[i].getElementsByTagName('media:thumbnail')[0].getAttribute('url');
 		         clipDesc = data[i].getElementsByTagName('media:description')[0].firstChild.nodeValue;
 		      }
 					clipLength = mavenVideo.formatMs(clipLength);
 		      //write out the data
 		      mavenVideo.writeUpdate( videoBag, playlistMD.destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlistMD, playerMD);
 		   }
 		
 		},
 		writeFromJson: function( responseText, playlistMD, playerMD) { 

 		  var data = eval( '(' + responseText + ')' );
 		  var desiredClips;
 		  //get the data
 		  var dataExtracted = new Array();
 		  if (data.items){ //Legacy Part of Function 
 		 		var dataItems = data.items;
 		 		
 		 		for ( i = 0; i < dataItems.length; i++ ) {
 		 		   dataExtracted.push( dataItems[i] );
 		 		}
				 		
 		 		if (dataExtracted.length < playlistMD.playlistLength) desiredClips = dataExtracted.splice( 0, dataExtracted.length );
 				else desiredClips = dataExtracted.splice( 0, playlistMD.playlistLength);
     		
 		 		//tidy container
 		 		var videoBag = document.getElementById( playlistMD.container );
 		 		while ( videoBag.hasChildNodes() ) {
 		 		   videoBag.removeChild( videoBag.lastChild );
 		 		}
 		 		//write out the data
 		 		for ( i = 0; i < desiredClips.length; i++ ) {

 		 		   //get the JSON data
 		 		   var clipTitle = desiredClips[i].title;
 		 		   var clipImg = desiredClips[i].thumbnailURL;
 		 		   var clipDesc = desiredClips[i].description;
 		 		   var clipLength = mavenVideo.formatMs(desiredClips[i].length);
 		 		   var clipID = desiredClips[i].contentID;
 		 		
 		 		   //write out the data
 		 		   mavenVideo.writeUpdate( videoBag, playlistMD.destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlistMD, playerMD);
 		 		}
 		 	}//end of Legacy Part of Function
 		 	else{
				var dataItems = data.videoAsset;
				if (dataItems.length == undefined) dataExtracted.push( dataItems ); //playlist contains only 1 video
				else{
					for ( i = 0; i < dataItems.length; i++ ) {
				  	dataExtracted.push( dataItems[i] );
					}
				}
				
				if (dataExtracted.length < playlistMD.playlistLength) desiredClips = dataExtracted.splice( 0, dataExtracted.length );
				else desiredClips = dataExtracted.splice( 0, playlistMD.playlistLength);
				
				//tidy container
				var videoBag = document.getElementById( playlistMD.container );
				while ( videoBag.hasChildNodes() ) {
				   videoBag.removeChild( videoBag.lastChild );
				}
				
				//write out the data
				for ( i = 0; i < desiredClips.length; i++ ) {

				   //get the JSON data
				   var clipTitle = desiredClips[i].title;
				   for ( j=0; j < desiredClips[i].medias.media.length; j++){
				   	if (desiredClips[i].medias.media[j].profile.attributes.href == "defaultThumbnail"){
				   		var clipImg = desiredClips[i].medias.media[j].uri;
				   	}
				   }
				   var clipDesc = desiredClips[i].shortDescription;
				   if (desiredClips[i].videoSeconds == -1) var clipLength = "";
				   else var clipLength = mavenVideo.formatSeconds(desiredClips[i].videoSeconds);
				   var clipID = desiredClips[i].id;//(desiredClips[i].migrationId)?desiredClips[i].migrationId:desiredClips[i].id;
				
				   //write out the data
				   mavenVideo.writeUpdate( videoBag, playlistMD.destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlistMD, playerMD);
				}
 		 	}
 		},
 		writeUpdate: function( videoBag, destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlistMD, playerMD) {
			var ondemandUrl = destUrl + '?playlistId=' + playlistMD.playlistId + '\u0026videoId='+ clipID;
			var onclickCall = 'mavenVideo.loadVideoPlayer({playerId:\''+playerMD.playerId+'\', videoId:\''+clipID+'\', playerWidth:\''+playerMD.playerWidth+'\', playerHeight:\''+playerMD.playerHeight+'\', playerBgColor:\''+playerMD.playerBgColor+'\',container:\''+playerMD.container+'\'}); return false;';
			if (playlistMD.deeplink == true) onclickCall = "";
			var truncDesc = mavenVideo.truncate( clipDesc, 100, '...' );
			var linkTarget = (playlistMD.linkTarget)? playlistMD.linkTarget:"_self";
			var tpl_data = {};
			var tpl_logic = {};
			tpl_data.OnDemandUrl = ondemandUrl;
			tpl_data.OnClickCall = onclickCall;
			tpl_data.TruncatedDescription = truncDesc;
			tpl_data.FullDescription = clipDesc;
			tpl_data.LinkTarget = linkTarget;
			tpl_data.ClipTitle = clipTitle;
			tpl_data.ClipImage = clipImg;
			tpl_data.Duration = clipLength;
			var tpl_videoclipsummary = new $U.Template($S.getVal("tpl_videoclipsummary"));
 			var tpl_videoclip = new $U.Template($S.getVal("tpl_videoclip"));
			videoBag.innerHTML+=tpl_videoclip.evaluate(tpl_data,tpl_logic);
 		},
 		formatMs: function( msValue ) { //Legacy Function
 		   var finalVal = '';
 		   //format number of seconds into MM:SS format
 		   initVar = msValue; // The initial data, in milliseconds
 		   milliVar = Math.floor( initVar / 1000 );
 		   minVar = Math.floor( milliVar / 60 ); // The minutes
 		   secVar = milliVar % 60; // The balance of seconds
 		   secVar += "";//convert to string
 		   if (secVar.length == 1) secVar = "0" + secVar;
 		   finalVal = minVar + ":" + secVar + ' min';
 		   return finalVal;
 		},
 		
 		/*
 		Input parameters:
 		String text, Number length, String ellipsis
 		Returns: String text
 		*/
 		truncate: function( text, length, ellipsis ) {
 		   // Set length and ellipsis to defaults if not defined
 		   if ( typeof length == 'undefined' ) {
 		      var length = 100;
 		   }
 		   if ( typeof ellipsis == 'undefined' ) {
 		      var ellipsis = '...';
 		   }
 		   // Return if the text is already lower than the cutoff
 		   if ( text.length < length ) {
 		      return text;
 		   }
 		   /* Otherwise, check if the last character is a space.
 		   If not, keep counting down from the last character
 		   until we find a character that is a space */
 		   for ( var i = length - 1; text.charAt(i) != ' '; i-- ) {
 		      length--;
 		   }
 		   /* The for() loop ends when it finds a space, and the length var
 		   has been updated so it doesn't cut in the middle of a word. */
 		   return text.substr( 0, length ) + ellipsis;
 		},
 		formatSeconds: function( sValue ) { //Legacy function
 		   var finalVal = '';
 		   //format number of seconds into MM:SS format
 		   var secondsTotal = sValue; // The initial data, in seconds
 		   var minutes = Math.floor( secondsTotal / 60 ); // The minutes
 		   var seconds = secondsTotal % 60; // The balance of seconds
			 seconds += "";//convert to string
 		   if (seconds.length == 1) seconds = "0" + seconds;
 		   finalVal = minutes + ":" + seconds + ' min';
 		   return finalVal;
 		},
 		
		loadVideoPlayer : function (o){
			/*
				o.playerId: tells the swf which player version to render in the container (string)
				o.playlistId: tells the swf which playlist to associate with a player (string)
				o.videoId: tells the swf which video to load from the playlist (string)
				o.playerHeight: embedded player height in pixels (string)
				o.playerWidth: embedded player width in pixels (string)
				o.playerBgColor: embedded player background color in hex (string)
				o.container: html parent element id of the embedded player (string)
				o.deeplink: toggle player to accept url deep linking paramaters or not (boolean)
				*************NOTE: make sure the maven include script for the player version desired is in the head***************
			*/
			var playerBgColor = (o.playerBgColor)?o.playerBgColor:"#ffffff";
			var playerHeight = (o.playerHeight)?o.playerHeight:"379";
			var playerWidth = (o.playerWidth)?o.playerWidth:"586";
			var deeplink = (o.deeplink)?o.deeplink:false;
			var so = new SWFObject (streamPath, 'video', playerWidth, playerHeight, '9', playerBgColor); 
			so.addParam('allowScriptAccess', 'always');
			so.addParam('allowFullScreen', 'true');
			so.addParam('scale', 'noscale'); 
			so.addParam('salign', 'TL');
			so.addParam('wmode', 'opaque');
			so.addVariable("playerId", o.playerId);
			so.addVariable("referralParentPlaylistId", "null" );
			so.useExpressInstall('swfobject/expressinstall.swf');
			if (deeplink == false){
				var pId = o.playlistId, vId = o.videoId;
			}else{
				//check for legacy query parameters
				var pId = (getQueryParamValue("maven_referralPlaylistId"))?getQueryParamValue("maven_referralPlaylistId"):o.playlistId;
				var vId = (getQueryParamValue("maven_referralObject"))?getQueryParamValue("maven_referralObject"):o.videoId;
				//overwrite legacy query parameters if new query parameters exist
				pId = (getQueryParamValue("playlistId"))?getQueryParamValue("playlistId"):o.playlistId;
				vId = (getQueryParamValue("videoId"))?getQueryParamValue("videoId"):o.videoId;
			}
			pId ? so.addVariable("referralPlaylistId",pId) : so.addVariable("referralPlaylistId","null");
			//pId ? so.addVariable("playlistId",pId) : so.addVariable("playlistId","null");
			if (vId) so.addVariable("referralObject", vId);

			so.write(o.container); //render the video player
		}
  };
}();
$S.setVal("tpl_videoclipsummary",'<div class="summary"><h3><a href="#{OnDemandUrl}" target="#{LinkTarget}" onclick="#{OnClickCall}">#{ClipTitle}</a></h3><p>#{TruncatedDescription}</p><p class="cta clearfix"><a href="#{OnDemandUrl}" target="#{LinkTarget}" onclick="#{OnClickCall}">Watch</a><span class="duration">#{Duration}</span></p></div>');
//$S.setVal("tpl_videoclipsummary",'<div class="summary"><h3><a href="#{OnDemandUrl}" target="#{LinkTarget}" onclick="#{OnClickCall}">#{ClipTitle}</a></h3><p class="cta clearfix"><a href="#{OnDemandUrl}" target="#{LinkTarget}" onclick="#{OnClickCall}">Watch</a><span class="duration">#{Duration}</span></p><p>#{TruncatedDescription}</p></div>');
$S.setVal("tpl_videoclip",'<div class="videoLink"><div class="thumbnail"><a href="#{OnDemandUrl}" title="#{ClipTitle}" target="#{LinkTarget}" onclick="#{OnClickCall}"></a><img src="#{ClipImage}" alt="#{ClipTitle}"/></div>' + $S.getVal('tpl_videoclipsummary') + '</div>');


