var SelectedContentItem = null;
var LID=null;
var SessionID=null;
var UserName=null;
var ZoneType=null;
var Browser=null;
var Viewer=null;
var ThisPage=null;
var ClosedCaptioning=false;
var UseVbrickPlayer_MACMPG4=false;
var OSVersion=null;
var MacBrowserFullScreen=false;

var _currenturl=null;
var _timeIndex=0;
var _durationOverride=0;
var _lastSelectedItem=null;
var _bWorking=false;
var _bAllowContentSelect=true;
var _AllowContentSelect_message='';
var _bUserClickedStop=false;
var _viewInfoURL = "ViewInfo4.aspx?gid=";

//
// Class definition
// Note: This class exists to support the past list architecture
//
// TODO: Remove the need for this class throughout Main.js
function ContentItem()
{
    this.Title      = null;
    this.Type       = null;
    this.UniqueID   = null;
    this.isSDU      = null;
    this.Data       = null;
    
    this.DeSelect   = _deselect;
    
    function _deselect()
    {
       DeselectItem(this.UniqueID);
    }    
}

//
// Handles a click on an item's "info" menu
function InfoClicked(uniqueID, evt)
{
	var url = _viewInfoURL + uniqueID;
	// This prevents outer elements from processing the onClick too
	DisableBubbling(evt);
	// Pop up the Info page
	popUpURL(url);
}

function ContentClicked(item)
{
    if(item == null)
        return;
    
    item = $(item);
    
    SelectedContentItem = new ContentItem();
    SelectedContentItem.UniqueID = GetGID(item);
    SelectedContentItem.Title = GetTitle(item);
    SelectedContentItem.isSDU = GetIsSDU(item);
    SelectedContentItem.Data = GetItemData(item);
    
    // Playlist area will be hidden if we're on the VOD page
    // and we're not playlist content
    if (ThisPage == enumPage.VideoLibrary && !IsPlaylistAdminPg() &&
        GetIsPlaylist(GetSelectedItem(_contentListID)) == "false")
	{
        HidePlayListArea();
        resetTimeIndex();
        _durationOverride = 0;
	}
    
    if(GetIsPresentation(item) == "true")
    {
        SelectedContentItem.Type = "presentation";
        contentitemclick(SelectedContentItem);
    }
    else
    {
        SelectedContentItem.Type = "";
        contentitemclick(SelectedContentItem);
    }
}

function createreq(evente, contentid, requesturl, arr_otherelements, bIsBlockingCall)
{
	if(_bWorking){return;}
	var aj=new ajax();
	if(requesturl==null){
		aj.SetURL("handlers/handler.aspx");
	}else{
		aj.SetURL("handlers/"+requesturl);
	}
	
	// Determines whether this is an AJAX or SJAX call
    if(bIsBlockingCall == true || bIsBlockingCall == false)
        aj.SetBlocking(bIsBlockingCall);
	    
	aj.SetOnChangeEvent(dochange);
	aj.Page_Enum=ThisPage;
	aj.Event_Enum=evente;
	aj.Browser=Browser;
	aj.Viewer=Viewer;
	aj.ZoneType=ZoneType;
	aj.LID=LID;
	aj.ClosedCaptioning=ClosedCaptioning;
	aj.OSVersion=OSVersion;
	aj.ContentID=contentid;			
	aj.SessionID=SessionID;
	//Encode UserName SCR 5424
	//aj.Username=UserName;
	aj.Username=escape(UserName);
	if(arr_otherelements!=null){
		var nameval;
		for(var i=0;i<arr_otherelements.length;i++){
			nameval=arr_otherelements[i].split(":");
			aj.AddPostElement(nameval[0],unescape(nameval[1]));
		}
	}
	_bWorking=true;
	aj.Post();
}
function LogPlayerStop(){
	if(Viewer==enumViewer.VBrickSTB){
		STB_createreq(currenttitle,enumEvent.Stop,currentcontentid);
	}else if (LID != null){ 
		createreq(enumEvent.Stop,'');
	}
}

function LogPageChange(bIsBlocking)
{
	if(LID == null)
	    return;
	
	if(bIsBlocking == true || bIsBlocking == false)
        createreq(enumEvent.PageChange, null, null, null, bIsBlocking);
    else
        createreq(enumEvent.PageChange);
}

function LogPlayerPlay(){
	if(LID!=null){return;} //if the user pushed pause, they still have a valid LID, do don't do anything
	if(SelectedContentItem) {
	    var arr = BuildPlayReqParameters();
		createreq(enumEvent.Play,SelectedContentItem.UniqueID, null, arr);
	}
}

//body onunload event
function unloadPg()
{
	try
	{
	    if(opener)
	    {
		    opener.extPlayer = false;
		    if(opener.SelectedContentItem)
			    opener.SelectedContentItem.DeSelect();
	    }
		if(extPlayer)
			extPlayer.close();
	}
	catch(ex)
	{
	}
	
	LogPageChange(true);
}

//click event from content list
function contentitemclick(item){
	if(!IsContentSelectAllowed()){return;}
	StopPlayBack();
	_lastSelectedItem=item;

	//Do not reset timeindex if we are running a playlist. Clips in the playlist
	//start at a specified offset which we want to retain.
	if (extPlayer
	    && (ThisPage != enumPage.VideoLibrary
	        || GetIsPlaylist(GetSelectedItem(_contentListID)) == "false"))
	{
		try{
			extPlayer._timeIndex=0; //reset timeindex if switching streams while the external player window is open.
		}catch(ex){}
	}
	
	if(item.Type=="presentation"){
		launchpresentation(item.Data);
	}else{
	    var arr = BuildPlayReqParameters();
		if(extPlayer!=null)
			try{
				extPlayer.createreq(enumEvent.ContentSelect,item.UniqueID,null,arr); 
			}catch(ex){
				createreq(enumEvent.ContentSelect,item.UniqueID,null,arr);
			}
		else
			createreq(enumEvent.ContentSelect,item.UniqueID,null,arr); 
	}
	var _sdu_panel=document.getElementById('sdu_panel');
	var _sdu_show_panel=document.getElementById('sdu_show_panel');
	if(_sdu_show_panel)
		_sdu_show_panel.style.display='none';
	if(item.isSDU=='True'){
		/*var aj=new ajax();
		aj.SetURL('/'+item.Data);
		aj.SetOnChangeEvent(dochange);
		aj.Get();*/
		if(_sdu_panel)
			_sdu_panel.style.display='block';

		var _iframe_sdu=document.getElementById('sdu_panel_iframe');
		if(_iframe_sdu){
			_iframe_sdu.src=item.Data;
		}
	}else{
		if(_sdu_panel)
			_sdu_panel.style.display='none';
	}
}

function dochange(readystate,status,response){
	_bWorking=false;
	var msgDiv=document.getElementById('MessagesArea');
	//alert(readystate);
	if(readystate==4){
	
		document.getElementById('loading').style.display='none';
	
		if(response.IsPost){
			if(response.ErrorString!=''){
				alert(response.ErrorString);  //SCR 4797 - Moving alert before .DeSelect seems to fix problem where Info visibility is switched.
				if(SelectedContentItem)
					SelectedContentItem.DeSelect();
				if(response.ContinueAfterError!='true')
				{
				    // If we hit an error and we're on the VOD page (playlist
				    // area will exist only here), see if we're playing a playlist
				    // and if so, try playing the next clip.
				    if(ThisPage == enumPage.VideoLibrary && !IsPlaylistAdminPg())
				    {
		                window.setTimeout('CheckForAdjacentPlayListClip();', 100);
		            }
				    return false;
			    }
			}
			if(response.Event==enumEvent.PageChange){
				LID=null;
				return;
			} 
			if(response.Event==enumEvent.Stop){
				LID=null;
				// If the video played to its end and we are on the VOD page,
				// see if we are running a playlist. If so, play the next clip.
				if (! _bUserClickedStop && ThisPage == enumPage.VideoLibrary && !IsPlaylistAdminPg())
				    window.setTimeout('CheckForNextPlayListClip();', 100);
				return;
			} 
		
			if(response.JSCallback!=''){eval(response.JSCallback);return;}
			
			var lblmsg=document.getElementById('lblMsg');
			if(lblmsg){
				lblmsg.innerHTML="";
				if(response.Message!=''){lblmsg.innerHTML=response.Message;}
			}
			if(response.Event==enumEvent.ThumbnailCreate || response.Event==enumEvent.ThumbnailDelete){ //stop here in the case of thumbnails
				return false;
			}
			LID=response.LID;
			SelectedContentItem.Type = response.StreamType;
			if(response.URL==""){
				alert("Could not determine content item URL. Playback failed.");
				return false;
			}
			
			if(SelectedContentItem==null){return;}
			
			//prompt('',response.URL);
			_currenturl=response.URL;
			SetPlayStoppedByUser(false);
			if(ThisPage==enumPage.LiveContent || ThisPage==enumPage.ScheduledPrograms){
				//if(Viewer==enumViewer.LinuxPC){
				//	response.URL=response.URL.replace('vbhttp','http');
				//}
				fnMCast(SelectedContentItem.Title, response.Message, response.URL, 
						response.StreamType,response.ContentExpirationID, SelectedContentItem.UniqueID)
			}else if(ThisPage==enumPage.VideoLibrary){
				SetUploadThumbnailSelectedID(SelectedContentItem.UniqueID);
				//scr:3848 if its Infovalue or Kasenna greater than version 7.3 enable the ff/rw buttons
				if(GetStreamTypeEnum(response.StreamType)==enumStreamType.MPG4){
					var softrev=-1;
					if(response.VODServerSoftwareRevision!=''){
						
						var v=response.VODServerSoftwareRevision;
						var atmp=v.split('.');
						if (atmp.length>=2){
							v=atmp[0]+'.'+atmp[1];	
						}
						if(!isNaN(v)){
							softrev=parseFloat(v);
						}
					}
					if((response.VODServerTypeName=='Kasenna' && softrev>=7.3) || response.VODServerTypeName=='Infovalue'){
						ShowFFRWForMPG4();
					}
				}
				//end scr:3848
				
				if(response.StreamType=='presentation'){
					DisableThumbnails(true, false);
					launchpresentation(response.URL);
				}else if(response.StreamType=='Document' || response.StreamType=='None'){
					DisableThumbnails(true, false);
					launchwindow(response.URL);
				}else{
			        if (opener) {
			            //Keep external player on top because of playlists.
			            //When the clip changes, we want the player to stay visible.
			            window.self.focus();
			            var selItem = GetSelectedItem(_contentListID);
			            if (GetIsPlaylist(selItem) == "True")
			                SetNewClipInExternalPlayer(opener._timeIndex,
			                        opener._durationOverride);
			        }
			        else if (!IsPlaylistAdminPg())
			        {
			            var selItem = GetSelectedItem(_contentListID);
			            isPlaylist = (GetIsPlaylist(selItem) == "True");
			            DisableThumbnails(isPlaylist, isPlaylist);
			        }
			        if(Viewer==enumViewer.LinuxPC)
			        {
			            playVODLinux(SelectedContentItem.Title, response.URL, response.StreamType,_timeIndex);
			        }
			        else
			        {
					    playVOD(SelectedContentItem.Title, response.URL, response.StreamType,_timeIndex);
				    }
				}
				if(Viewer==enumViewer.MacPC){
					//had to rehide the close and record buttons, because we are now reinstantiating the player object on every play.
					//timeout is built in for Safari because its slow					
					window.setTimeout('_mac_hideRecCloseButtons()',1000);
				}
			}
			
			if(SelectedContentItem){
				var _player_titlebar=document.getElementById('player_titlebar');
				if(_player_titlebar){
					_player_titlebar.innerHTML=SelectedContentItem.Title;
					_player_titlebar.setAttribute('title',SelectedContentItem.Title);
				}
			}
		
		}else{//a GET
			if(response.ErrorString!=''){
				alert(response.ErrorString);
				if(SelectedContentItem){SelectedContentItem.DeSelect();}
				if(!response.ContinueAfterError){return false;}
			}
			var _messages=document.getElementById('messages');
			if(_messages)
				_messages.innerHTML=response.ServerResponseString;
		}
	}else{
		document.getElementById('loading').style.display='block';
	}
}

function _mac_hideRecCloseButtons(){
	var ifrmQ=_get_qtplayer_iframe();
	ifrmQ.document.getElementById("oVBPlayer").HideButtons(192);
}

//ShowFFRWForMPG4
//enable ff/rw. Called from doChange when playing a MPG4 file from infovalue or kasenna 7.3+
function ShowFFRWForMPG4(){
	var plyr=qtplayer.document.getElementById("oVBPlayer");
	if(plyr){
		plyr.AlwaysEnableRateChange=true;
	}
}
/*Thumbnails*/
function CreateThumbnail(){
	if(_currenturl==null || SelectedContentItem==null){
		alert('Please select a content item');
		return;
	}
	var timeindx=0;
	var plyr;
	if (Viewer==enumViewer.MacPC
	    && ((GetStreamTypeEnum(SelectedContentItem.Type)==enumStreamType.MPG4 && !UseVbrickPlayer_MACMPG4)||GetStreamTypeEnum(SelectedContentItem.Type)==enumStreamType.WM))
	{}
	else
	{
		if(GetStreamTypeEnum(SelectedContentItem.Type)==enumStreamType.WM){
			plyr=qtplayer.document.getElementById("WMPlayer");
			timeindx=plyr.controls.currentPosition;
		}else{
			plyr=qtplayer.document.getElementById("oVBPlayer");
			timeindx=plyr.GetStreamTime()
		}
	}
	var arr=new Array(3);
	arr[0]='URL:'+escape(_currenturl);
	arr[1]='TimeIndex:'+timeindx;
	arr[2]='ListID:'+_contentListID;
	createreq(enumEvent.ThumbnailCreate,SelectedContentItem.UniqueID,'ThumbnailHandler.aspx',arr)
}

function DeleteThumbnail(uniqueID, evt)
{  
    var arr=new Array(1);
	arr[0]='ListID:'+_contentListID;
    if(confirm('Would you like to delete this thumbnail?'))
        createreq(enumEvent.ThumbnailDelete, uniqueID, 'ThumbnailHandler.aspx', arr);
    
    // This prevents outer elements from processing the onClick too
    if(evt != null)
	    DisableBubbling(evt);
}

function OpenUploadThumbnail(){
	var diag=document.getElementById('uploadthumbnail');
	if(diag){
		if(diag.style.display=='none'){
			diag.style.display='block';
			if(SelectedContentItem)
				SetUploadThumbnailSelectedID(SelectedContentItem.UniqueID);
		}else{
			diag.style.display='none';
			SetUploadThumbnailSelectedID('');
		}
	}
}

//function to set the hidden input on UploadThumbnail.aspx with the GID of the selected item
function SetUploadThumbnailSelectedID(UniqueID){
	var hidGid=null;
	var ifrm=document.getElementById('ifrUploadThumbnail');
	if(Viewer==enumViewer.MacPC){
		if(ifrm)
			try{
				// This code is in a try block because of a difference between Safari and Firefox
				// on the MAC. When the 'ifrUploadThumbnail' iframe's display style is 'none', trying
				// to get the 'hidSelectedItemID' element under Safari fails with an exception. 
				// But under Firefox, getting the element returns a null value. (SCR 5210 - PB)
				hidGid=ifrm.contentWindow.document.getElementById('hidSelectedItemID');
			}
			catch(e) { hidGid=null; }
		else
			return;
	}else{
		if(ifrm)
			hidGid=ifrUploadThumbnail.document.getElementById('hidSelectedItemID');
		else
			return;
	}
	if(hidGid){
		if(UniqueID)
			hidGid.value=UniqueID;
	}
}

/*end Thumbnails*/
/*Util*/
function GetStreamTypeEnum(sType){
	sType=sType.toLowerCase();
	var e;
	switch(sType){
		case "mpg1":
		case "mpg-1":
		case "mpeg1":
		case "mpeg-1":
			e=enumStreamType.MPG1;
			break;
		case "mpg2":
		case "mpg-2":
		case "mpeg2":
		case "mpeg-2":
			e=enumStreamType.MPG2;
			break;
		case "mpg4":
		case "mpg-4":
		case "mpeg4":
		case "mpeg-4":
		case "mp4":
		case "rtsp4":
		case "partner_41_mpeg-4":
		case "mp4-rtsp":
			e=enumStreamType.MPG4;
			break;
		case "wm":
		case "wm-http":
		case "wm-rtspu":
			e=enumStreamType.WM;
			break;
	}
	return e;
}

//function to check if content selection ability is enabled or not;
//typically called from qtplayer when the appropriate plugins have not been installed.
function IsContentSelectAllowed(){
	if(!_bAllowContentSelect){
		if(_AllowContentSelect_message!='')
			alert(_AllowContentSelect_message);
	}
	return _bAllowContentSelect;
}

//function to set if content selection ability is enabled or not;
function SetAllowContentSelect(bAllowContentSelect,sMessage){
	_bAllowContentSelect=bAllowContentSelect;
	if(sMessage!=null)
		_AllowContentSelect_message=sMessage;
}

//function to halt playback of any currently playing video, called from dochange when there is an error
function StopPlayBack(){
	if(_lastSelectedItem==null)
		return;
	try{
		if(extPlayer){
			if(GetStreamTypeEnum(_lastSelectedItem.Type)!=enumStreamType.WM){
				extPlayer._get_qtplayer_iframe().document.getElementById('oVBPlayer').Close();
			}else{
				extPlayer._get_qtplayer_iframe().document.getElementById('WMPlayer').close();//.controls.stop();
			}
		}else{
			if(GetStreamTypeEnum(_lastSelectedItem.Type)!=enumStreamType.WM){
				_get_qtplayer_iframe().document.getElementById('oVBPlayer').Close();
			}else{
				_get_qtplayer_iframe().document.getElementById('WMPlayer').close();//controls.stop();
			}
		}
	}catch(ex){}
}

//utility function to get the QTPlayer iframe DOM object
function _get_qtplayer_iframe(){
	if(Viewer==enumViewer.MacPC){
		return document.getElementById('qtplayer').contentWindow;
	}else{
		return qtplayer;
	}
}

var enumStreamType={
	MPG1:1,
	MPG2:2,
	MPG4:3,
	WM:4
}

function LaunchExternalPlayer(bFullScreen){
	//if we're already the external window and we want fullscreen then just resize and move the window.
	if(bFullScreen)
	    MacBrowserFullScreen = true;
	    
	if(bFullScreen && opener){
		ChangetoFullScreen();
		return;
	}
	SetPlayStoppedByUser(true);
	LogPlayerStop();
	if(SelectedContentItem==null){
		alert('Please select a content item to play.');
		return;
	}
	
	var plyr=null;
	var bIsWM=false;
	if(GetStreamTypeEnum(SelectedContentItem.Type)!=enumStreamType.WM || Viewer==enumViewer.LinuxPC || Viewer==enumViewer.MacPC){
		if(Viewer==enumViewer.MacPC && (!UseVbrickPlayer_MACMPG4) && GetStreamTypeEnum(SelectedContentItem.Type)==enumStreamType.MPG4){
			//*if the client is a MAC AND the stream is MPEG4 AND 
			//	the admin has selected that the VBrick player plugin will NOT be used for MPEG4 playback
			LaunchExternalPlayer_MAC();
			return;
		}
		plyr=qtplayer.document.getElementById("oVBPlayer");
	}else{
		if(Viewer==enumViewer.MacPC){
			LaunchExternalPlayer_MAC();
			return;
		}
		plyr=qtplayer.document.getElementById("WMPlayer")
		qtplayer.DisableAllButtons();
		bIsWM=true;
	}
	
	var wd=null;
	var ht=null;
	if(!bIsWM){
		wd=plyr.NativeWidth;
		ht=plyr.NativeHeight;
	}else{
		wd=plyr.currentMedia.imageSourceWidth;
		ht=plyr.currentMedia.imageSourceHeight+130; //110 extra pixels for buttons etc
	}
	if(wd==null || ht==null || viewer=='linux'){
		wd=500;
		ht=400;
	}
	if(wd<500 || ht<400){
		if(Viewer==enumViewer.MacPC){
			wd=520;
			ht=450;
		}else{
			wd=500;
			ht=400;
		}
	}
	
	if(bFullScreen){
		wd=window.screen.availWidth;
		ht=window.screen.availHeight;
	}
	
	var seekTime=0;
	if(ThisPage==enumPage.VideoLibrary){
		if(!bIsWM)
			seekTime= plyr.GetStreamTime();
		else
			seekTime= plyr.controls.currentPosition;
	}
	
	if(!bIsWM){
		plyr.Close();
	}else{
		plyr.close();//controls.stop();
	}
	
	var url="ExtPlayer4.aspx?GID="+SelectedContentItem.UniqueID;
	url+="&PG="+ThisPage;	
	url += "&Seek=" + seekTime;
	url += "&Duration=" + _durationOverride;
		
	if(!extPlayer)
	{
	    if(bMultipleExtPlayer=="TRUE")
    	    extPlayer = window.open(url, getExtWinName(true), "status=yes,resizable,width=" + wd + ",height=" + ht);
	    else
	   extPlayer = window.open(url,getExtWinName(), "status=yes,resizable,width=" + wd + ",height=" + ht);
    }
	
	if(bFullScreen)
		extPlayer.moveTo(0,0);

    if(bMultipleExtPlayer=="TRUE")
        extPlayer = null;
        
    window.setTimeout('ResetSafariMacBoolean()', 500);
 }

function ResetSafariMacBoolean()
{
    MacBrowserFullScreen=false;
}

function ChangetoFullScreen(){
	if(opener){ //if we're already the external window and we want fullscreen then just resize and move the window.
		var wd=window.screen.availWidth;
		var ht=window.screen.availHeight;
		window.moveTo(0,0);
		window.resizeTo(wd,ht);
		if(Viewer==enumViewer.MacPC && Browser==enumBrowser.Safari)
		{
			window.setTimeout('document.getElementById("qtplayer").contentWindow.resizeplayerforsafari()',500);
		}
		else if (Viewer==enumViewer.MacPC && Browser==enumBrowser.FireFox)
		{
		    window.setTimeout('document.getElementById("qtplayer").contentWindow.resizeplayerformac()',500);		
		}
	}
}

function getFileNameFromPath(path){
	var i=path.lastIndexOf('/');
	if(i>-1){
		return path.substring(i+1,path.length).toLowerCase();
	}else{
		return path;
	}
}

///navigate()
///Description: utility function. Use to change the location of the main browser window
function navigate(url){
	try
	{
		if(url==null){return false;}
		window.location=url;
	}
	catch(err) {}  //To prevent error in case navigation is canceled.
}

///launchwindow()
///Description: utility function. Use to open a new browser window.
function launchwindow(url,options){
	if(options==null){
		window.open(url,'win');
	}else{
		window.open(url,'win',options);
	}
}

///launchpresentation()
///Description: utility function. Use to open a new browser window.
function launchpresentation(url){
	window.open(url,'presentation','status=no,toolbar=no,scrolling=no,resizable=yes,width=1024,height=700');
}

///HasPlugin()
///Description: utility function. Loops through all plugins on a mozilla browser
///and returns whether or not it finds one with a matching name.
function HasPlugin(name)
{
	for(var i=0;i<navigator.plugins.length;i++){
		if(navigator.plugins[i].name==name || navigator.plugins[i].name.indexOf(name)>-1){
			return true;
		}
	}
	return false;
}

///resetTimeIndex()
///Description: used to reset the timeIndex var to 0
function resetTimeIndex(){
    //If we are running a playlist, we do not want to reset the starting time.
    //We want to keep the starting offset of the clip.
    if (!IsPlaylistAdminPg()
        && (ThisPage != enumPage.VideoLibrary
            || GetIsPlaylist(GetSelectedItem(_contentListID)) == "false"))
    {
	    _timeIndex=0;
	}
}

function SetPlayStoppedByUser(hasUserClickedStop)
{
    _bUserClickedStop = hasUserClickedStop;
}

///BuildPlayReqParameters()
///Description: build parameter array of other elements for createreq() calls.
///Parameters are those that might apply when playing a video.
function BuildPlayReqParameters()
{	
    var arr = null;
	// If there is a duration override, add it to the array (for playlists)
	if (_durationOverride != 0)
	{
	    arr = new Array(1);
	    arr[0] = "OverrideDuration:" + _durationOverride;
	}
	return arr;
}

//Description:  validate the given duration string. The expected format is
//  "X [X [X]]" where X is a part denoting the number of hours, minutes, or 
//  seconds. The parts can be in any order. The format of the parts is specified
//  by the durPartREs parameter.
//Param: enteredDur - duration string to validate.
//Param: durPartREs - array of regular expressions specifying the format of the
//                    hours, minutes, and seconds parts.
//                    Element 0 is the hours RE.
//                    Element 1 is the minutes RE.
//                    Element 2 is the seconds RE.
//Return: duration as total number of seconds or -1 upon error.
function ValidateDurationString(enteredDur, durPartREs)
{
    if (enteredDur == "0")
    {
        return 0;
    }
    enteredDur = enteredDur.toLowerCase();
    var parts = enteredDur.split(" ");
    if (parts.length == 0)
        return -1;
    var hourRE = durPartREs[0];
    var minuteRE = durPartREs[1];
    var secondRE = durPartREs[2];
    var hrPartCount = 0;
    var minPartCount = 0;
    var secPartCount = 0;
    var isValid = true;
    var totalSecs = 0;
    for (idx = 0; idx < parts.length; idx++)
    {
        var part = parts[idx];
        if (hourRE.test(part))
        {
            totalSecs += parseInt(part) * 3600;
            hrPartCount++;
        }
        else if (minuteRE.test(part))
        {
            totalSecs += parseInt(part) * 60;
            minPartCount++;
        }
        else if (secondRE.test(part))
        {
            totalSecs += parseInt(part);
            secPartCount++;
        }
        else if (part != "")
        {
            isValid = false;
            break;
        }
        
        if (hrPartCount > 1 || minPartCount > 1 || secPartCount > 1)
        {
            isValid = false;
            break;
        }
    }
    if (! isValid)
        return -1;
    return totalSecs;
}

/*End Util*/
/*MAC*/
function MAC_openVBrickPlayer(url,streamtype,szRec,seekTime){
	if(Viewer!=enumViewer.MacPC){return;}
    if (qtplayer.document.getElementById("oQPlayer") != null)
    {
        if (Browser == enumBrowser.Safari) {
            qtplayer.document.getElementById("oQPlayer").Stop();
            window.setTimeout('qtplayer.document.getElementById("oQPlayer").innerHTML="";', 500);
        }
    }
	if(GetStreamTypeEnum(streamtype)==enumStreamType.MPG4 && !UseVbrickPlayer_MACMPG4){
		display_cc_btn(false); //hide the cc button for wm and MPEG4-QuickTime streams, since cc is not supported on mac for wm by MS and for QT
		if(GetStreamTypeEnum(streamtype)!=enumStreamType.WM){
			url=url.substring(0,url.indexOf('&'));
		}
		url=url.replace('vbhttp','http');
		url=url.replace('vbrtsp','rtsp');
		reloadQTPlayer(url, 0, false); //MCS.js
		display_mac_record_btn(true);
	}else{
		display_mac_record_btn(false);
		display_cc_btn(true);
		var bAlwaysEnableRateChange=false;
		if (extPlayer){
		    if (extPlayer.qtplayer.document.getElementById("oVBPlayer") != null) {
			      bAlwaysEnableRateChange=extPlayer.qtplayer.document.getElementById("oVBPlayer").AlwaysEnableRateChange;
			    }
			extPlayer.qtplayer.document.getElementById("QTPlayer").innerHTML='<object id="oVBPlayer" width="100%" height="100%" type="video/x-vbrick" VIEWASTEXT>'+
						'<embed id="oVBPlayerE" style="width:100%;height:100%" type="video/x-vbrick"></embed>'+
						'</object>'
			if(Browser==enumBrowser.Safari)
				window.setTimeout('_mac_EnableRateChange_ext('+bAlwaysEnableRateChange+');',1000);
			else
				_mac_EnableRateChange_ext(bAlwaysEnableRateChange);
		}else{
			var w=qtplayer.getPluginWidth();
			var h=qtplayer.getPluginHeight();
			var w_units = w+'px';
			var h_units = h+'px';
			if (parent.IsExtPlyr) {
				w="100%";
				h="100%";
				w_units=w;
				h_units=h;
			}
			
		    if (qtplayer.document.getElementById("oVBPlayer") != null) {
			      bAlwaysEnableRateChange=qtplayer.document.getElementById("oVBPlayer").AlwaysEnableRateChange;
			}
			qtplayer.document.getElementById("QTPlayer").innerHTML='<object id="oVBPlayer" width="'+w+'" height="'+h+'" type="video/x-vbrick">'+
						'<embed id="oVBPlayerE" style="width:'+w_units+';height:'+h_units+'" type="video/x-vbrick"></embed>'+
						'</object>';
			if(Browser==enumBrowser.Safari)
				window.setTimeout('_mac_EnableRateChange('+bAlwaysEnableRateChange+');',1000);
			else
				_mac_EnableRateChange(bAlwaysEnableRateChange);
		}
		//url=url.replace('vbrtsp','rtsp'); //removed per 4736
		if(Browser==enumBrowser.Safari)
			window.setTimeout('MCastMPEGSetup("'+url+'","'+szRec+'","'+streamtype+'",'+seekTime+')',1000); //MCS.js
		else
			MCastMPEGSetup(url,szRec,streamtype,seekTime); //MCS.js
	}
}

function _mac_EnableRateChange(bool){
	qtplayer.document.getElementById("oVBPlayer").AlwaysEnableRateChange=bool;
}
function _mac_EnableRateChange_ext(bool){
	extPlayer.qtplayer.document.getElementById("oVBPlayer").AlwaysEnableRateChange=bool;
}

///*LaunchExternalPlayer_MAC
///Description: called from main.js/LaunchExternalPlayer(). MAC Quicktime and WM Player do not support scripting
///							so the external player window launch is much simpler.
function LaunchExternalPlayer_MAC(){
    if (qtplayer.document.getElementById("oQPlayer") != null)
    {
        if (Browser == enumBrowser.Safari) {
            qtplayer.document.getElementById("oQPlayer").Stop();
            window.setTimeout('qtplayer.document.getElementById("oQPlayer").innerHTML="";', 500);
        }
    }
	qtplayer.document.getElementById("QTPlayer").innerHTML='';//stop current playback;
	
	var url="ExtPlayer4.aspx?GID="+SelectedContentItem.UniqueID;
	url+="&PG="+ThisPage;	
	url += "&Seek=0";
	url += "&Duration=" + _durationOverride;
	
    if(bMultipleExtPlayer=="TRUE")
    	extPlayer = window.open(url,getExtWinName(true), "status=yes,resizable,width=400,height=300");
    else
	extPlayer = window.open(url,getExtWinName(), "status=yes,resizable,width=400,height=300");
	
	extPlayer.opener = window;
	
    if(bMultipleExtPlayer=="TRUE")
    	extPlayer = null;
}

/*end MAC*/
/*STB*/
var currenttitle='';
var currentcontentid='';
var currloadbalurl='';
function STB_createreq(title,evente,contentid,szTmplt){
	currenttitle=title;
	currentcontentid=contentid;
	var aj=new ajax();
	aj.SetURL("handlers/handler.aspx");
	aj.SetOnChangeEvent(STBdochange);
	aj.Page_Enum=ThisPage;
	aj.Event_Enum=eval(evente);
	aj.Browser=Browser;
	aj.Viewer=Viewer;
	aj.ZoneType=ZoneType;
	if (LID == null)
		aj.LID = "useIP"; //fix for VBrick STB access loggin when changing to Fullscreen. See Mike Phillips
	else
		aj.LID=LID;
		
	aj.ClosedCaptioning=ClosedCaptioning;
	
	aj.ContentID=contentid;			
	aj.SessionID=SessionID;				
	aj.Username=UserName;					
	
	if(ThisPage==enumPage.VideoLibrary){
		aj.AddPostElement('LoadBalancedURL',currloadbalurl);
	}
	
	aj.Post();
	
	if(szTmplt!=null)
		SDULoad(szTmplt);
}

function STBdochange(readystate,status,response){
	var msgDiv=document.getElementById('MessagesArea');
	if(readystate==4){
		if(response.IsPost){
			if(response.ErrorString!=''){
				alert(response.ErrorString);
				if(response.ContinueAfterError!='true'){return false;}
			}
			if(response.Event==enumEvent.Stop || response.Event==enumEvent.PageChange){
				LID=null;
				return;
			} 
			
			if(response.JSCallback!=''){eval(response.JSCallback);return;}
			var lblmsg=document.getElementById('lblMsg');
			if(lblmsg){
				if(response.Message!='')
				{
					lblmsg.innerHTML="";
				    lblmsg.innerHTML=response.Message;
				}
			}
			
			if(response.Event==enumEvent.VBrickSTB_BeginVideoEvent){
				LID=response.LID;
				return;
			}
			if(response.URL==""){
				alert("Could not determine content item URL. Playback failed.");
				return false;
			}
			currloadbalurl=response.URL;
			if(ThisPage==enumPage.LiveContent || ThisPage==enumPage.ScheduledPrograms){
				fnMCast(currenttitle, response.Message, response.URL, response.StreamType, 
						response.ContentExpirationID, currentcontentid)
			}else if(ThisPage==enumPage.VideoLibrary){
				play(currenttitle, response.URL, 0, response.StreamType) //duration parameter no longer used. URL will already include &duration=
			}
		
		}else{//a GET
			if(response.ErrorString!=''){
				alert(response.ErrorString);
				if(SelectedContentItem){SelectedContentItem.DeSelect();}
				if(!response.ContinueAfterError){return false;}
			}
			msgDiv.innerHTML=response.ServerResponseString;
		}
	}else{
	}
}
/*STB*/

/*layout*/
var _mainarea;
var _messages;
var _workspace;
var _list1_maindiv;
var _footer;

///Description: load ball images for "Live Broadcasts" and "Video Library" buttons on the search bar
var imgGreenLight=new Image();
imgGreenLight.src='/images/ball_green.gif';
var imgGrayLight=new Image();
imgGrayLight.src='/images/ballgray.gif';

function clientSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
return myHeight;
}
///*init
///Description: page initialize for UI elements, private function do not use
function init(){
	_footer=document.getElementById('footer');
	_mainarea=document.getElementById('mainarea');
	_messages=document.getElementById('messages');
	_workspace=document.getElementById('workspace');
	_list1_maindiv=document.getElementById('list1');
	var img=null;
	
	if(ThisPage==enumPage.LiveContent){
		img=document.getElementById('btnimg_Live');
	}else if(ThisPage==enumPage.VideoLibrary && !IsPlaylistAdminPg()){
		img=document.getElementById('btnimg_VOD');
	}
	if(img){
		img.src=imgGreenLight.src;
	}
	resize();
	
	//gjh: adjust height of mcslist on init and resize due to ajax calls
	try{
	    var aHeight = clientSize() - 200;
	    _list1_maindiv.style.height = aHeight + "px";
        setListheight(aHeight);
    }
    catch(err)
    {}
}

///*resize
///Description: function to resize height of several divs in new GUI. private function, do not use
function resize(){
	if(screen.height<=600)
		return;

	_workspace.style.height=_footer.offsetTop-4;
	_mainarea.style.height=_footer.offsetTop-120;
	
	if((_footer.offsetTop-528)>1){
		var iMinusVal_list1=133;
		var iMinusVal_messages=528;
		if(Browser==enumBrowser.FireFox){
			iMinusVal_list1=151;
			iMinusVal_messages=546;
		}
		if(_list1_maindiv)
			//gjh: adjust height of mcslist on init and resize due to ajax calls
            try{
	            var aHeight = clientSize() - 200;
	            _list1_maindiv.style.height = aHeight + "px";
                setListheight(aHeight);
            }
            catch(err)
            {}
            
		if(_messages)
			_messages.style.height=_footer.offsetTop-iMinusVal_messages;
	}else{
		if(_list1_maindiv)
			_list1_maindiv.style.height=396;
		if(_messages)
			_messages.style.height=1;
	}
}
//  GJH added for Channel Guide 7-16-07
//  passes screen availHeight to hidden value to re-adjust mcsList height for OS, Browsers and screen resolutions
function setListheight(h)
{
    document.getElementById("availHeight").value = screen.availHeight;
    document.getElementById('listHeight').value = h;    
}


///*resizeOther
///Description: function can be called by a developer on the body.onload and body.onresize events
///							in order to resize the height of a div on their page. See Status4.aspx for implementation
function resizeOther(elementID,minusVal){
	if(screen.height<=600)
		return;
	var el=document.getElementById(elementID);
	if(el){
		if((_footer.offsetTop-minusVal)>1){
			el.style.height=_footer.offsetTop-minusVal;
		}
	}
}

///*_highlight_btn
///Description: function for highlighting "Live Broadcasts" and "Video Library" buttons on the search bar
function _highlight_btn(oDiv,imgID,enumPG,bLight){
	var img=document.getElementById(imgID);
	if(bLight){
		//oDiv.style.backgroundColor='#83B0E4';
		//
		    oDiv.style.backgroundImage='url(../images/ucHdrTabMouseOver.jpg)';
		    oDiv.style.backgroundPosition='left';
		    oDiv.style.backgroundRepeat='repeat-x';
		//
		img.src=imgGreenLight.src;
	}else{
		//oDiv.style.backgroundColor='';
		//
		    oDiv.style.backgroundImage=''
		//
		if(ThisPage!=enumPG || IsPlaylistAdminPg())
			img.src=imgGrayLight.src;
	}
}
/*layout*/
/*CC*/
function changeCC(url,CCon)
{
	if (CCon)
		url = url.replace("&cc=off", "&cc=on_ovl");
	else
		url = url.replace("&cc=on_ovl", "&cc=off");
  return url;
}
/*end CC*/

function toggleControlPanel()
{
	var sdu_panel = document.getElementById('sdu_panel');
	var sdu_show = document.getElementById('sdu_show_panel');
	
	if (sdu_panel)
	{
		if (sdu_panel.style.display == 'block')
		{
			sdu_panel.style.display = 'none';
			
			if (sdu_show)// && (viewer != "STB")
				sdu_show.style.display = 'block';
		}
		else
		{
			sdu_panel.style.display = 'block';
			
			if (sdu_show)
				sdu_show.style.display = 'none';
		}
	}
}

function SDULoad(szTmplt)
{
  var sdu_panel = document.getElementById('sdu_panel');
  var sdu_show = document.getElementById('sdu_show_panel');
  
	if (sdu_show)
		sdu_show.style.display = 'none';
		
	if (szTmplt.length > 0)
	{
		if (sdu_panel)
			sdu_panel.style.display = 'block';

		var sdu_iframe = document.getElementById('sdu_panel_iframe');

		if (sdu_iframe)
			sdu_iframe.src = szTmplt;
	}
	else
	{
		if (sdu_panel)
			sdu_panel.style.display = 'none';
	}  	
}

function SDUKey(key)
{
  var oDoc = document;
  var oFrm = oDoc.frames ? oDoc.frames['sdu_panel_iframe'] : oDoc.getElementById('sdu_panel_iframe');
  var oPag = oFrm.document || oFrm.contentWindow.document;
  
  if (oFrm.src.length > 0)
  {
    var bVBIR = (oFrm.src.indexOf("VBIR.aspx") != -1);
    
    if (key == 'SDU Stop')
      oPag.getElementById('btnStop').click();
      
    else if (key == 'SDU Play')
      oPag.getElementById('btnPlay').click();
      
    else if (key == 'SDU Pause')
      oPag.getElementById('btnPause').click();
      
    else if (key == 'SDU Rew')
      oPag.getElementById('btnRew').click();
      
    else if (key == 'SDU FFwd')
      oPag.getElementById('btnFFwd').click();
      
    else if ((key == 48) && bVBIR)
      oPag.getElementById('btnNum0').click();

    else if ((key == 49) && bVBIR)
      oPag.getElementById('btnNum1').click();

    else if ((key == 50) && bVBIR)
      oPag.getElementById('btnNum2').click();

    else if ((key == 51) && bVBIR)
      oPag.getElementById('btnNum3').click();

    else if ((key == 52) && bVBIR)
      oPag.getElementById('btnNum4').click();

    else if ((key == 53) && bVBIR)
      oPag.getElementById('btnNum5').click();

    else if ((key == 54) && bVBIR)
      oPag.getElementById('btnNum6').click();

    else if ((key == 55) && bVBIR)
      oPag.getElementById('btnNum7').click();

    else if ((key == 56) && bVBIR)
      oPag.getElementById('btnNum8').click();

    else if ((key == 57) && bVBIR)
      oPag.getElementById('btnNum9').click();
    
    else if (!isFullScreen) // If fullscreen don't toggle device control panel.
      toggleControlPanel();
  }
}

function DisableBubbling(e)
{
    if(!e) return;

	if (e.stopPropagation)
	    e.stopPropagation();
	else
	    e.cancelBubble = true;
}

///Description: Determines if currently on Playlist Admin page.
function IsPlaylistAdminPg()
{
	if (String(document.location).toLowerCase().indexOf("playlist.aspx") >= 0)
		return true;
	else
		return false;
}
