//Copyright (c) 2007 Encoded Media (UK) Limited. All Rights Reserved. For more information, visit www.encodedmedia.com //
//$Revision: 1.1.2.66 $

var debugging = true;
var isIE = false;

//data from xml
if(!window.folders){var folders = new Array();}
if(!window.allVids){var allVids = new Array();}

var subtitles = new Array();
var subtitleStyles = new Array();
var defaultStyle = new Object;
var serverTime = new Date();
var liveSlidePrefix;
var liveUrlsToQuery = {};
var liveVids = {};

var folderContentChanged = false;
var videoContentChanged = false;
var frontPageContentChanged = false;

//state
var selectedFolderIdx = -1;
var selectedVideoIdx = -1;
var selectedFolderName = '';
var selectedVideoPid = 0;
var currentMode;

var currentSlideIdx = -1;
var needToJump;
var videoJumpTarget;

//templates
var modeTypes = ['frontpage', 'videos', 'details', 'searchResults'];
var modes = new Array();
var templates = {'folderTemplate' : {'options': {}}, 
				 'videoTemplate' : {'options': {}}, 
				 'detailsTemplate' : {'options': {}}, 
				 'linkTemplate' : {'options': {}}, 
				 'downloadTemplate' : {'options': {}}, 
				 'searchResultTemplate' : {'options': {}}, 
				 'recentTemplate' : {'options': {}}, 
				 'featLiveVideoTemplate' : {'options': {}},
				 'featAnnouncementTemplate' : {'options': {}},
				 'liveVideoTemplate' : {'options': {}},
				 'announcementTemplate' : {'options': {}},
				 'announceDetailsTemplate' : {'options': {}},
				 'liveDetailsTemplate' : {'options': {}}
				 };
var vidSortProp = 'date';
var vidSortAsc = false;

//elements
var player;
var slide;
var subtitlesDiv;
var statusDiv;

//searching
var _matched;
var _matchDescription;
var _regex;
var searchText;

//history
var hist;
var stateChangePhase = 1;

var lastChaptersMouseEventTime = new Date(0);

//usage tracking
var prevPos = 0;
var startPos = 0;
var accumTime = 0;
var duration = 0;
var everReportedUsage = false;

nothumbImg = new Image(100, 75);
nothumbImg.src="images/nothumbnail.jpg?x=100&y=75";

plusimg = new Image(16, 16);
plusimg.src = 'images/plus.gif';

minusimg = new Image(16, 16);
minusimg.src = 'images/minus.gif';

if (!window.slideTypePath) {
	var slideTypePath = 'full_res/';
}

function reportUsage()
{
	if (window.logUrl && selectedFolderIdx != -1 && selectedVideoIdx != -1 && window.opener)
	{	
		everReportedUsage = true;
		var vid = folders[selectedFolderIdx].videos[selectedVideoIdx];
		var url = logUrl + '?video=' + escape(vid.title) + '&folder=' + escape(vid.folder) +
   			'&pid=' + vid.pid + '&sid=' + vid.sid + 
			'&start=' + startPos + '&end=' + (startPos + accumTime) +
   			'&length=' + duration;
        
		//uncomment to see what is being uploaded
		//alert(url);
        
		window.opener.logImg = null;
        window.opener.logImg = new Image();		
        window.opener.logImg.src = url;
	}
}

function init(dontLoadXml)
{
	if(document.all){
		isIE = true;
		getEltContent = ie_getEltContent;
		selectMultiElements = ie_selectMultiElements;
		selectElement = ie_selectElement;
	} else {
		getEltContent = ns_getEltContent;
		selectMultiElements = ns_selectMultiElements;
		selectElement = ns_selectElement;
	}
		
	if (!window.linkPathName) {
		linkPathName = window.location.pathname;
	}
	
	if (!window.redirPort) {
		redirPort = 2500;
	}

	if (!window.setUIMode) {
		setUIMode = function(mode){};
	}
	
	discoverRedirectionEnvironment();
    
	for(i in modeTypes)
	{
		modes[modeTypes[i]] = D('vl_' + modeTypes[i]);
	}
	
	player = /*(isIE) ?*/ D('vl_mediaplayer') /*: D('MediaPlayerNS')*/;
	slide = D('vl_slide');
    
    if (!templates.liveVideoTemplate.html) {
		templates.liveVideoTemplate.html = templates.videoTemplate.html;
	}
	if (!templates.featLiveVideoTemplate.html) {
		templates.featLiveVideoTemplate.html = templates.recentTemplate.html;
	}
	if (!templates.announcementTemplate.html) {
		templates.announcementTemplate.html = templates.videoTemplate.html;
	}
	if (!templates.featAnnouncementTemplate.html) {
		templates.featAnnouncementTemplate.html = templates.recentTemplate.html;
	}
	
	for (i in templates) {
		t = templates[i];
        t.container = D(i + 'Container');		  
		if(!t.html)
		{
			debug('Template ' + i + ' is blank');
			t.html = '';
		}

		if(!t.prefix){
			t.prefix = '';
		}
		if(!t.suffix){
			t.suffix = '';
		}

        t.tokens = makeTokens(t.html);		
		t.setData = function(data, text){
			var txt = this.prefix + text + this.suffix;
			if(this.hook){
				txt = this.hook(data, txt);
			}
			if(this.container){
				this.container.innerHTML = txt;
			}
		}		
	}
	
	subtitlesDiv = D('vl_subtitles');
	statusDiv = D('vl_status')

	defaultStyle.color = 'black';
	defaultStyle.align = 'bottomleft';

	//default options
	if(!templates.recentTemplate.options.sortAsc){
		templates.recentTemplate.options.sortAsc = false;
	}
	if(!templates.recentTemplate.options.number){
		templates.recentTemplate.options.number = 4;
	}
	if(!templates.folderTemplate.options.folderIndentPx){
		templates.folderTemplate.options.folderIndentPx = 18;
	}

    hist = D('vl_history');

	if(window.logUrl){
		window.onunload = reportUsage;
	}

	setInterval('processSlides()', 400);
	setInterval('processSubtitles()', 250);

	if (!dontLoadXml) {
		needToJump = true;
		debug('loading toc: ' + tocUrl);
		showStatus('Fetching data...');
        loadXMLDoc(tocUrl, handleFolders, true, tocError);
	} else { 
        if(window.vid){
			selectVideo(vid.pid, vid.folder, 0, false);
		} else {
			if (opener) {
				folders = opener.folders;
				allVids = opener.allVids;							
			}
			needToJump = true;
			jumpToLocation(unescape(location.search));
		}
	}
}

function tocError(req)
{
    if(req.status == 401 || req.status == 403)
	{
		setMode('frontpage');
		templates.recentTemplate.setData(null, '<b>You do not have permission to access this data</b>');
		templates.folderTemplate.setData(null, 'Could not download data: ' + req.statusText);
	} else {
		templates.folderTemplate.setData(null, 'Could not download data: ' + req.statusText);
	}
}

function doSort(type, isSearch)
{
    if(type == 'title'){
		vidSortProp = 'title';
		vidSortAsc = true;
	} else if (type == 'titleR') {
		vidSortProp = 'title';
		vidSortAsc = false;
	} else if (type == 'date') {
		vidSortProp = 'creationDate';
		vidSortAsc = true;
	} else if (type == 'dateR') {
		vidSortProp = 'creationDate';
		vidSortAsc = false;
	} else if (type == 'length') {
		vidSortProp = 'length';
		vidSortAsc = true;
	} else if (type == 'lengthR') {
		vidSortProp = 'length';
		vidSortAsc = false;
	} else if (type == 'folder') {
		vidSortProp = 'folder';
		vidSortAsc = true;
	}

	if(isSearch){
		searchResults();
	} else {
		showVideos();
	}
}

function setSelectedSort(elt)
{
	if(vidSortProp == 'title'){
		elt.value = vidSortAsc?'title':'titleR';
	} else if (vidSortProp == 'creationDate') {
		elt.value = vidSortAsc?'date':'dateR';
	} else if (vidSortProp == 'length') {
		elt.value = vidSortAsc?'length':'lengthR';
	} else if (vidSortProp == 'folder') {
		elt.value = vidSortAsc?'folder':'folderR';
	}
}

function expandFolder(node)
{
	var i = 0;
	var topNode = templates.folderTemplate.container;
	node = node.parentNode.parentNode.parentNode.parentNode;
    var currentImg = getFolderButton(node);
	if (currentImg == '') {
		return;
	}
	
	var processing = false;
	var processed = false;
    
	if(!topNode){
		exit;
	}

    var n;
	while(topNode.childNodes[i])
	{
		if((n = topNode.childNodes[i])){
            if(processing){
				if (n.style.marginLeft > node.style.marginLeft) {
					 if (currentImg == minusimg.src) {
						 n.style.display = 'block';
					 } else {
						 n.style.display = 'none';
					 }
				}
				if(n.style.marginLeft <= node.style.marginLeft){
					break;
				}
				processed = true;
			}
			
			if (n == node) {
				processing = true; 
			}	
		}
		i++;
	}

	if (currentImg == minusimg.src){
		setFolderButton(node, plusimg.src);
	} else {
		setFolderButton(node, minusimg.src);
	}
}

function getFolderButton(node)
{
	var imgs = node.getElementsByTagName('img');
	for (j in imgs) {
        if(imgs[j].src == plusimg.src){
			return plusimg.src;
		} else if(imgs[j].src == minusimg.src){
			return minusimg.src;
		}
	}
}

function setFolderButton(node, selectedimg)
{	
	var imgs = node.getElementsByTagName('img');
	for (j in imgs) {
        if(imgs[j].src == plusimg.src || imgs[j].src == minusimg.src){
			//this is a button image
			imgs[j].src = selectedimg;
		}
	}
}


function compareFolders(s1, s2)
{
    if(s1.path.toLowerCase() > s2.path.toLowerCase()) return 1;
	if (s1.path.toLowerCase() < s2.path.toLowerCase()) {
		return -1;
	}
	return 0;
}

function compareVids(v1, v2)
{
	var result = 0;
	if(typeof(v1[vidSortProp]) == 'string' || v1[vidSortProp] instanceof String){
		//intelli-sort
		var s1 = v1[vidSortProp].toLowerCase();
		var s2 = v2[vidSortProp].toLowerCase();
		var regex = new RegExp(/(\D*)(\d*)(\D*)(.*)/);
		var parts1 = regex.exec(s1);
		regex.index = 0;
		var parts2 = regex.exec(s2);
		if (parts1[1] > parts2[1]) {
			result = 1;
		} else if (parts1[1] < parts2[1]) {
			result = -1;
		} else {
			if(parts1[2]-0 > parts2[2]-0) {
				result = 1;
			} else if (parts1[2]-0 < parts2[2]-0) {
				result = -1;
			} else {
				if(parts1[3] > parts2[3]) {
					result = 1;
				} else if (parts1[3] < parts2[3]) {
					result = -1;
				} else {
					if(parts1[4]-0 > parts2[4]-0) {
						result = 1;
					} else if (parts1[4]-0 < parts2[4]-0) {
						result = -1;
					} else {
						result = 0;
					}
				}
			}
		}		
	} else {
		result = v1[vidSortProp] > v2[vidSortProp] ? 1 : -1;
	}

	if (vidSortAsc){
		return result;
	} else {
		return -result;
	}
}

function handleSubtitles(req)
{
    subtitles.length = 0;
    var elts = req.responseXML.getElementsByTagName('style');
    subtitleStyles.length = 0;
    for (i = 0; i < elts.length; i++) 
	{
        var style = new Object();
		style.color = selectElement(elts[i], 'fontstyle').getAttribute('color');
		
		//hack to work round the recent change in backcolor
		if(style.color == 'white' || style.color == '#fff' || style.color == '#ffffff' || style.color == 'rgb(255,255,255)')
		{
			style.color = 'black';
		}
		
		style.align = selectElement(elts[i], 'position').getAttribute('alignment');
		subtitleStyles[elts[i].getAttribute('name')] = style;
	}
	if(!subtitleStyles['Default']){
		subtitleStyles['Default'] = defaultStyle;
	}
	
	var elts = selectMultiElements(req.responseXML, 'subtitle');
    for (i = 0; i < elts.length; i++) 
	{
		var sub = new Object;
        sub.text = getEltContent(elts[i], 'text');
		sub.style = selectElement(elts[i], 'text').getAttribute('style');
		if(!sub.style){
			sub.style = 'Default';
		}
		sub.start = elts[i].getAttribute('start') - 0;
		if(elts[i].getAttribute('stop')){
			sub.stop = elts[i].getAttribute('stop') - 0;
		} else {
			if(elts[i].getAttribute('duration')){
				sub.stop = sub.start + (elts[i].getAttribute('duration') - 0);
			} else {
				sub.stop = sub.start + 2;
			}
		}
		subtitles[subtitles.length] = sub;    		
	}

    if(subtitles.length > 0)
	{
		subtitlesDiv.style.display="block";
	} else {
	    subtitlesDiv.style.display="none";
	}
}

function formatTime(time)
{
	var hours = Math.floor(time / 3600) + ''; if(hours.length == 1){hours = '0' + hours;}
	var mins = Math.floor(time % 3600 / 60) + ''; if(mins.length == 1){mins = '0' + mins;}
	var secs = (time % 60) + ''; if(secs.length == 1){secs = '0' + secs;}
	return hours + ':' + mins + ':' + secs;
}

var vidPropsMap = {
'title':'title',
'comment':'comment',
            'longDescription': 'longdescription',
			'keywords': 'keywords',
            'email':'email',
            'author':'author',
			'copyright':'copyright',
            'mms':'directMMSLink'};

function handleFolders(req)
{
    if(req.status == 304){
        showStatus('');
		
		for (i in liveUrlsToQuery) {
            loadXMLDoc(liveUrl + escape(i) + '/livestatus.xml', handleLiveStatus, true, handleLiveStatus);
		}
        
		return;
	}
	
	showStatus('Got ' + req.responseText.length + ' bytes of xml...');
	debug('Toc has changed - processing');

	folders.length = 0;
	allVids.length = 0;

	liveUrlsToQuery = {};
	var elts = req.responseXML.getElementsByTagName('live');
	if(elts.length > 0){
		liveUrlsToQuery[elts[0].getAttribute('defaultLiveUrl')] = 1;
	}

	elts = req.responseXML.getElementsByTagName('service');
    for (i = 0; i < elts.length; i++) {
        var elt = elts.item(i);
        var folder = new Object();
        var nameParts = elt.getAttribute('name').split(/\//);
        folder.level = nameParts.length - 1;
		if (folder.level == 0) {
			folder.topLevel = 'toplevel';
		} else{
			folder.toplevel = '';
		}
		folder.indent = folder.level * templates.folderTemplate.options.folderIndentPx;
		folder.name = nameParts[nameParts.length - 1];
		folder.path = elt.getAttribute('name');
        folder.sid = elt.getAttribute('sid');
        folders[folders.length] = folder;
        folder.videos = new Array();
		folder.videos.length = 0;
		var velts = selectMultiElements(elt, 'video');
		for(j = 0; j < velts.length; j++)
		{
            var velt = velts.item(j);
            var vid = new Object;

			//attributes
			vid.pid = velt.getAttribute('pid');			
			vid.length = velt.getAttribute('lengthsecs');
            if (velt.getAttribute('hidden')) {
				vid.hidden = "yes";
			} else {
			  vid.hidden = "no";
			}

			vid.categories = {};
            vid.slides = new Array();
			vid.chapters = new Array();
			vid.jumpPoints = new Array();
			vid.links = new Array();
            vid.folder = folder.path;
			vid.sid = folder.sid;

			var delt = selectElement(velt, 'embargodate');
			if(delt){
				vid.embargo = new Date(delt.getAttribute('timestamp')-0);
			} else {
				vid.embargo = 'none';
			}
			
			delt = selectElement(velt, 'expirydate');
			if (delt){ 
				vid.expiry = new Date(delt.getAttribute('timestamp')-0);			
			} else {
				vid.expiry = 'none';
			} 

            vid.title = getEltContent(velt, 'title');
			vid.comment = getEltContent(velt, 'comment');
            vid.longDescription = getEltContent(velt, 'longdescription');
			vid.keywords = getEltContent(velt, 'keywords');
            vid.email = getEltContent(velt, 'email');
            vid.author = getEltContent(velt, 'author');
			vid.copyright = getEltContent(velt, 'copyright');
            vid.directMMSLink = getEltContent(velt, 'mms');
            vid.httplink = mungeHttpLink(getEltContent(velt, 'http'));

			vid.creationDate = new Date(selectElement(velt, 'lastmodified').getAttribute('timestamp')-0);
            		           
			var catElts = selectMultiElements(selectElement(velt, 'categories'), 'category');
			for(k = 0; k < catElts.length; k++)
			{
				vid.categories[catElts[k].getAttribute('name')] = getContent(catElts[k]);
			}
            
			var selts = selectMultiElements(selectElement(velt, 'slides'), 'slide');
			var allJump = selectElement(velt, 'slides').getAttribute('allJump') == 'yes';
			var prevJumpChap;
			for (var k = 0; k < selts.length; k++) 
			{
				var selt = selts[k];
				var thisSlide = new Object;
				thisSlide.url = selt.getAttribute('url');
				thisSlide.time = selt.getAttribute('time');
                thisSlide.title = getEltContent(selt, 'title');
                thisSlide.keywords = getEltContent(selt, 'keywords');
				thisSlide.description = getEltContent(selt, 'description');
                
				thisSlide.level = selt.getAttribute('level')-0;

                if(thisSlide.url){
					vid.slides[vid.slides.length] = thisSlide;
				}
				if(thisSlide.title){
					vid.chapters[vid.chapters.length] = thisSlide;
				}
				if((window.allChaptersJump || selt.getAttribute('isJump') == 'yes' || allJump) && thisSlide.title){
					if (prevJumpChap) {
						thisSlide.length = thisSlide.time - prevJumpChap.time;						
					} else {
						thisSlide.length = thisSlide.time;
					}
					thisSlide.jumpPid = vid.pid;
					thisSlide.jumpFolder = vid.folder;
					vid.jumpPoints[vid.jumpPoints.length] = thisSlide;
                }
			}
            selts = selectMultiElements(selectElement(velt, 'links'), 'a');
			for (k = 0; k < selts.length; k++) {
                var link = new Object;
                link.linkTitle = getContent(selts[k]);
                link.linkUrl = selts[k].getAttribute('href');
                vid.links[vid.links.length] = link;
			}
			
            if (vid.categories['em:liveLinkUrl']) {
                vid.liveTime = new Date(vid.categories['em:liveTime']*1000);					
				if(liveVids[vid.pid]){
					vid.isLive = 'LiveNow';
					vid.liveUrl = liveVids[vid.pid].liveUrl;
					debug('Keeping live vid live across content change: ' + vid.title);
				} else{
					vid.isLive = 'Announce';
				}
				liveUrlsToQuery[vid.categories['em:liveLinkUrl']] = 1;
			}
			vid.url = location.protocol + '//' + location.host + linkPathName + '?' + escape(vid.folder) + ':' + vid.pid;
			setVideoMMSLinks(vid);
			
			folder.videos[folder.videos.length] = vid;
			allVids[allVids.length] = vid; 
			if(allVids.length % 10 == 0){
                showStatus(allVids.length + ' videos loaded...');								
			}			
		}
		folder.numVids = folder.videos.length;		
	}

	for (i in liveVids) {
		if(liveVids[i].isFake){
			//add the fake vid back in or it won't reappear until the 
			//livestatus comes back, interrupting the current playing vid
			addFakeVid(vid);
		}
	}

	for (i in liveUrlsToQuery) {
        loadXMLDoc(liveUrl + escape(i) + '/livestatus.xml', handleLiveStatus, true);
    }
	
	showStatus('Sorting data');
	folders.sort(compareFolders);
    
	folderContentChanged = true;
	videoContentChanged = true;
	frontPageContentChanged = true;

    var ret = false;
    if(needToJump){
		needToJump = false;
		if(location.search != ''){
			ret = jumpToLocation(unescape(location.search));	
		}
	}
	
	if(!ret){
		selectVideo(selectedVideoPid, selectedFolderName);	    
	}
	showStatus('');
}

function ns_getEltContent(elt, name)
{
    var a = elt.getElementsByTagName(name);
	return a.length > 0?a[0].textContent:'';
}

function ie_getEltContent(elt, name)
{
	var a = elt.selectSingleNode(name);
    return a&&a.firstChild?a.firstChild.nodeValue:'';
}

function ns_selectMultiElements(elt, name)
{
	return elt.getElementsByTagName(name);
}

function ie_selectMultiElements(elt, name)
{	
	return elt.selectNodes(name);
}

function ns_selectElement(elt, name)
{
	return elt.getElementsByTagName(name)[0];
}

function ie_selectElement(elt, name)
{
	return elt.selectSingleNode(name);
}

function refresh()
{
	showStatus('Fetching data...');
	loadXMLDoc(tocUrl, handleFolders, true);
}

function showStatus(str)
{
	if (statusDiv) {
		statusDiv.innerHTML = str;
	}
}

function handleLiveStatus(req, url)
{
	var pid = 0;
	
	if(req.status == 304){
		return;
	} else if (req.status != 200) {
		//do nothing
	} else {
		var somethingChanged = false;
		var foundMatch = false;
		var linkUrl = getContent(req.responseXML.getElementsByTagName('linkUrl')[0]);
		var elts = req.responseXML.getElementsByTagName('liveBroadcast');
		if(elts.length == 1){
			//first look to see if we have an announced pid
			var elt = elts[0];
			pid = elt.getAttribute('pid')-0;
		} else {
			pid = 0;
		}
	}
    		
    for (i in allVids) {
		var vid = allVids[i];
		if (vid.pid == pid){							
			if(vid.isLive == 'Announce'){
				vid.isLive = 'LiveNow';
				liveVids[vid.pid] = vid;
				somethingChanged = true;				
			}
			foundMatch = true;
			vid.liveUrl = getEltContent(elt, 'url');			
		} else if(url == liveUrl + escape(vid.categories['em:liveLinkUrl']) + '/livestatus.xml') {
			if (vid.isLive == 'LiveNow') {
				if(vid.isFake){
					//no longer live
					debug(vid.title + ': ad-hoc broadcast has finished');
					removeVid(vid);
					somethingChanged = true;
				} else {
					//no longer live
					debug(vid.title + ' is no longer live. Current live pid is ' + pid + ', whilst this vid\'s pid is ' + vid.pid);
					somethingChanged = true;
					vid.isLive = 'Announce';
					delete liveVids[vid.pid];
				}
			}
		}
	}

    if (!foundMatch && pid != 0) {
		
        //create a fake video and insert it into the right place
		var vid = {
           length: 0,
           lang: 'en-GB',
           hidden: 'no',
           longDescription: '',
           keywords: '',
           email: '',
           author: '',
           copyright: '',
           creationDate: new Date(),
           chapters: {},
           downloads: new Array(),
           subtitles: new Array(),
           slides: new Array(),
           chapters: new Array(),
		   links: new Array(),
           subtitleStyles: {},
           categories: {}
		};

		vid.pid = pid;
		vid.title = getEltContent(elt, 'title');
		vid.comment = getEltContent(elt, 'comment');
		vid.description = getEltContent(elt, 'description');
		vid.folder = getEltContent(elt, 'folder');
		vid.liveUrl = getEltContent(elt, 'url');
		vid.liveTime = new Date(elt.getAttribute('startedAt')-0);
		vid.hasLiveSlides = elt.getAttribute('liveSlides') == 'yes';
		vid.isLive = 'LiveNow';				
		vid.categories['em:liveLinkUrl'] = linkUrl;	
		vid.httpLink = getEltContent(elt, 'linkUrl');
		vid.isFake = true;

		addFakeVid(vid);		
		somethingChanged = true;
	}

	if(somethingChanged){
		folderContentChanged = true;
		videoContentChanged = true;
		frontPageContentChanged = true;
		selectVideo(selectedVideoPid, selectedFolderName);
	}
}

function addFakeVid(vid)
{
    liveVids[vid.pid] = vid;
	var folderIdx = findFolder(vid.folder);
	if (folderIdx != -1) {
		folders[folderIdx].videos[folders[folderIdx].videos.length] = vid;
	}
	
	allVids[allVids.length] = vid;
}

function removeVid(vid)
{
    var i;
	for (i = 0; i < allVids.length; i++) {
		if (allVids[i].pid == vid.pid) {
            allVids.splice(i, 1);
		}
	}

	var folderIdx = findFolder(vid.folder);
	if (folderIdx != -1) {
		for (i = 0; i < folders[folderIdx].videos.length; i++) {
			if (folders[folderIdx].videos[i].pid == vid.pid) {
				folders[folderIdx].videos.splice(i, 1);
			}	
		}
	} else {
		debug('can\'t find folder: ' + vid.folder);
	}

	delete liveVids[vid.pid];
}

function setMode(mode)
{
    currentMode = mode;
	for (i in modes) {
        if(i == mode && modes[i]){
            modes[i].style.display = 'block';
		} else {
            if(modes[i] && modes[i].style){			
				modes[i].style.display = 'none';
			}
		}
	}
	
	if(setUIMode){
		setUIMode(mode);
	}
}

function jumpToLocation(tgt, dontSave)
{
    if(!tgt){
		var target = '';
	} else {
		var target = tgt + '';
	}
    
	debug('jumping to [' + target + '], dontSave=' + dontSave);
	
	
	if (target.substr(0, 1) == '?') {
		target = target.substring(1);
    }
    if(target.indexOf('search=') == 0){
        var searchString = target.substring(7);
        searchResults(false, searchString);
        return true;
    } else {
        if (target == '') {
            selectVideo(0, '***', 0, dontSave);		
            return true;
        } else {
            var parts = target.split(':', 2);
            if(parts[1] && parts[1].length != 0){
                parts[1] = target.substr(parts[0].length + 1);
            }
            var folderName;
            if (parts[0] && parts[0].length >= 1){
                folderName = parts[0];
            } else {
                folderName = '***';
            }
            selectVideo(parts[1]?parts[1]-0:0, folderName, 0, dontSave);		
            return true;
        }        
    }
    
    return false;	
}

function seekToChapter(time)
{
    try
	{
		player.CurrentPosition = time-0+0.05;	
	} catch (e)
	{

	}
}

function selectFolder(path)
{
	selectVideo(0, path);
}

function findFolder(path)
{
	for (i in folders) {
        if (folders[i].path == path) {
			return i;
		}
	}
	return -1;
}

function findVideo(pid)
{
    if(selectedFolderIdx == -1){
		return -1;
	}

    for (i in folders[selectedFolderIdx].videos) {
		if (folders[selectedFolderIdx].videos[i].pid == pid) {
			return i;
		}
	}
	return -1;
}

function makeTokens(str)
{
	var regex = new RegExp(/\$(\$([a-zA-Z]+){([^}]*)}|([a-zA-Z.]+)(::)?([a-zA-Z]*)(.))/mg);
    var rows = new Array();
	var prevIdx = 0;
    while (parts = regex.exec(str)) {
        rows[rows.length] = {type:'text', text:str.substring(prevIdx, parts.index)};		
		prevIdx = parts.index + parts[0].length;
        if (parts[1].indexOf('{') != -1) {
            rows[rows.length] = {type:'subtemplate', property:parts[2], tokens:makeTokens(parts[3])};
		} else {
			rows[rows.length] = {type:'property', property:parts[4], format:parts[6]};
			if (parts[7] != '|') {
				prevIdx--;
			}
		}		
	}
	rows[rows.length] = {type:'text', text:str.substring(prevIdx, str.length)};		
	
	return rows;
}

function substituteProperties(tokens, obj, searchRegex)
{
    var result = '';
    for (var i in tokens) {
		var tok = tokens[i];
		if (tok.type=='text') {
			result += tok.text;
		} else if (tok.type == 'subtemplate') {
		   for (var j in obj[tok.property]) {
               result += substituteProperties(tok.tokens, obj[tok.property][j], null);
		   }
		} else if (tok.type == 'property') {
            if (tok.property.indexOf('.') != -1) {			
				var val = obj;
				var parts = tok.property.split('.');
				for (j in parts) {
					val = val[parts[j]];			   
				}
			} else {
				var val = obj[tok.property];
			}
            if(val != null){
				switch(tok.format){
				case 'jsEscape':
					val = val.replace(/\'/g, '\\\'');
					val = val.replace(/\"/g, '%22');
					break;
				case 'urlEscape':
					val = escape(val);
					break;
				case 'searchHilight':
					val = hilightMatch(searchRegex, val, true);
					break;	
				case 'formatTime':
					val = formatTime(val);
					break;				
				case 'date':
					if(val.toDateString){
						val = val.toLocaleDateString();
					}
					break;
				case 'time':
					if(val.toTimeString)
					{
						val = val.toLocaleTimeString();
					}
					break;
				case 'bool':
					if(val)
					{
						val = 'true';
					} else {
						val = 'false';
					}
					break;
				case 'empty':
					if(val + '' == '')
					{
						val = 'empty';
					} else {
						val = '';
					}
					break;
				case 'shortTime':
					if(val.toTimeString)
					{
						var ts = val.toLocaleTimeString();
						val = ts.substring(0, ts.lastIndexOf(':'));
					}
					break;
				case '':
					break;
				}
				result += ''+val;
			} else {
				result += tok.property;
			}
		} 		
	}

    return result;
}

function showFolders()
{
    var accumHTML = '';
    for (var i = 0; i < folders.length; i++) 
	{
        if(folders[i].level != 0 && (i == folders.length - 1 || folders[i+1].level <= folders[i].level))
		{
			folders[i]['plus'] = 'images/nochildren.gif';
        } else {
			folders[i]['plus'] = 'images/plus.gif';		
		}	
		accumHTML += substituteProperties(templates.folderTemplate.tokens, folders[i]);               
	}
     
	showRecent();
    templates.folderTemplate.setData(folders, accumHTML);	
	doBreadcrumbs();	
}

function showRecent()
{
    frontPageContentChanged = false;
    var accumHTML = '';
    vidSortProp = 'creationDate';
    vidSortAsc = templates.recentTemplate.options.sortAsc;
    allVids.sort(compareVids);
    max = templates.recentTemplate.options.number;

    var numOutput = 0;

    //first stick in vid if it is live
    for (i = 0; i < allVids.length && numOutput < max; i++)
    {
        var vid = allVids[i];
        if (vid.isLive == 'LiveNow') {
            numOutput++;
            accumHTML += substituteProperties(templates.featLiveVideoTemplate.tokens, vid);
        }
    }

    //then announces
    for (i = 0; i < allVids.length && numOutput < max; i++)
    {
        var vid = allVids[i];
        if (vid.isLive == 'Announce') {
            numOutput++;
            accumHTML += substituteProperties(templates.featAnnouncementTemplate.tokens, vid);
        }
    }

    //output only those which are "featured", newest first
    var featuredVids = [];
    for (i = 0; i < allVids.length && numOutput < max; i++) {
        var vid = allVids[i];
        if (vid.categories.featured) {
            featuredVids[featuredVids.length] = vid;
        }
    }
    featuredVids.sort(function(a, b){
        if (parseInt(a.categories.featured) > parseInt(b.categories.featured)) {
            return 1;
        }
        else if (parseInt(a.categories.featured) < parseInt(b.categories.featured)) {
            return -1;
        }
        else {
            return compareVids(a, b);
        }
    });

    for(i = 0; i < featuredVids.length; i++)
    {
        var vid = featuredVids[i];
        numOutput++;
        accumHTML += substituteProperties(templates.recentTemplate.tokens, vid);
    }

    //if we couldn't find |max| featured vids, the fill up with non-featured ones
    for (i = 0; i < allVids.length && numOutput < max; i++)
    {
        vid = allVids[i];
        if (!vid.categories.featured && !vid.isLive && !vid.categories.notFeatured) {
            numOutput++;
            accumHTML += substituteProperties(templates.recentTemplate.tokens, vid);
        }
    }

    templates.recentTemplate.setData(allVids, accumHTML);
}





function showVideos()
{
    folderContentChanged = false;
	var accumHTML = '';
	if (templates.videoTemplate.options.sortAsc) {
		vidSortAsc = templates.videoTemplate.options.sortAsc;
	}
	setSelectedSort(D('vl_sortselect'));

    folder = folders[selectedFolderIdx];
    if(D('vl_folder_name')){
		D('vl_folder_name').innerHTML = folder.name;
	}
	if(D('vl_folder_numVids')){
		D('vl_folder_numVids').innerHTML = folder.videos.length;
	}
    
	folder.videos.sort(compareVids);
    for (i in folder.videos) 
	{
        var vid = folder.videos[i];
        if(vid.isLive == 'Announce'){
			accumHTML += substituteProperties(templates.announcementTemplate.tokens, vid);
		}else if(vid.isLive == 'LiveNow'){
			accumHTML += substituteProperties(templates.liveVideoTemplate.tokens, vid);
		}else{
			accumHTML += substituteProperties(templates.videoTemplate.tokens, vid);
		}
	}
    
	templates.videoTemplate.setData(folder.videos, accumHTML);
    doBreadcrumbs();
}

function searchResults(isAdvanced, searchTextParam)
{
    stateChangePhase = 1;
    
    if(!searchTextParam){
		if(isAdvanced){
			searchText = D('vl_searchtextA').value;
			D('vl_searchtext').value = searchText;
	
		} else {
			searchText = D('vl_searchtext').value;
			D('vl_searchtextA').value = searchText;
		}
	} else {
		searchText = searchTextParam;
		D('vl_searchtext').value = searchText;
		D('vl_searchtextA').value = searchText;
	}

    if(searchText == ''){
		selectFolder('');
		return;
	}

	setMode('searchResults');
	setSelectedSort(D('vl_ssortselect'));
	templates['searchResultTemplate'].setData(null, 'Please wait...');

	saveState(encodeState());
	setTimeout(_searchResults, 100);
}

function _searchResults()
{
    var accumHTML = '';
	var searchMatches = new Array();

	D('vl_searchQuery').innerHTML = searchText;
	if(D('vl_searchLink')){
		D('vl_searchLink').innerHTML = 
			location.protocol + '//' + location.host + linkPathName + '?search=' + escape(searchText);
	}
    
	try
	{
		var regex = new RegExp('(' + searchText + ')', 'ig');
	}
	catch(e)
	{
		alert('Invalid search string');
		templates['searchResultTemplate'].setData(null, 'Invalid search string');
		exit;
	}
    var matches = 0;
	var i;
	var j;
    for(h in folders)
	{
		var folder = folders[h];
    
		for (i in folder.videos) 
		{
			var vid = folder.videos[i];
			var matched = false;
			var matchDescription = '';
			if (D('vl_searchTitle').checked){
			   if(regex.exec(vid.title)){
				   matched = true;
			   }
			}

			if(!matched && D('vl_searchAuthor').checked){
				if(regex.exec(vid.comment)) {
					matched = true;
				}
			}
				
            if(/*!matched &&*/ D('vl_searchAll').checked){
                if(regex.exec(vid.keywords) != null){
					matched = true;
					if (window.showKeywordMatches)
					{
						matchDescription = makeMatchDesc('keywords', regex, vid.keywords);
					}
				}
				if(!matched && regex.exec(vid.comment)){
					matched = true;
					matchDescription = makeMatchDesc('description', regex, vid.comment);
				}
				if(!matched && regex.exec(vid.author)){
					matched = true;
					matchDescription = makeMatchDesc('author', regex, vid.author);
				}
				if(!matched && regex.exec(vid.copyright)){
					matchDescription = makeMatchDesc('copyright text', regex, vid.copyright);
					matched = true;
				}
				if(!matched && regex.exec(vid.email)){
					matchDescription = makeMatchDesc('email address', regex, vid.email);
					matched = true;
				}
				if(!matched){
					for (j in vid.links) {
						if(regex.exec(vid.links[j].linkTitle)){
							matchDescription = makeMatchDesc('related link ' + (j- -1), regex, vid.links[j].linkTitle);
							matched = true;
							break;
						}
					}					
				}
				if(!matched){
                    for (j in vid.chapters) {
						if(regex.exec(vid.chapters[j].title)){
							matchDescription = makeMatchDesc('chapter ' + (j- -1), regex, vid.chapters[j].title);
							matched = true;							
						}

						if(regex.exec(vid.chapters[j].description)){
							matchDescription = makeMatchDesc('chapter ' + (j- -1), regex, vid.chapters[j].description);
							matched = true;						
						}

						if(regex.exec(vid.chapters[j].keywords)){
							if (window.showKeywordMatches)
							{
								matchDescription = makeMatchDesc('keywords for chapter ' + (j- -1), regex, vid.chapters[j].keywords);
							}
							matched = true;					
						}

						if (matched && vid.chapters[j].jumpPid) {
							matchDescription = '<a href="javascript:selectVideo(' + vid.chapters[j].jumpPid + 
								', \'' + escape(vid.chapters[j].jumpFolder) + '\', ' + vid.chapters[j].time + ')">' + matchDescription + '</a>';
						}

						if(matched){
							break;
						}
					}					
				}	
			}

			/*if(!matched && D('searchSubtitles').checked){
				_regex = regex;
                _matched = matched;
				_matchDescription = matchDescription;
				_video = vid.title;
				_folder = vid.folder;
				loadXMLDoc('/local/content/' + vid.httplink + 'subtitles.xml', handleSearchSubtitles, false);
				if(_matched){
					debug('subtitles matched');
				}else{
					debug('subtitles did not match');
				}
				matched = _matched;
				matchDescription = _matchDescription;
			}*/
				
			if(matched){
				vid.matchDescription = matchDescription;
				searchMatches[searchMatches.length] = vid;				
			}
		}
	}

	searchMatches.sort(compareVids);
	matches = searchMatches.length;

    var accumHTML = ''
    for(i in searchMatches)
	{
		var vid = searchMatches[i];
		accumHTML += substituteProperties(templates.searchResultTemplate.tokens, vid, regex);
		delete(vid.matchDescription);		
	}

    if (matches > 0) {
		D('vl_searchMatches').innerHTML = 'Results 1-' + matches + ' ';
	} else {
		D('vl_searchMatches').innerHTML = 'No matches ';
	}
	
	templates['searchResultTemplate'].setData(matches, accumHTML);
	doBreadcrumbs(true);
}

function handleSearchSubtitles(req){
    handleSubtitles(req);
    for (i in subtitles) {
        if (_regex.exec(subtitles[i].text)) {
            _matchDescription = makeMatchDesc('subtitle at <a href="javascript:selectVideo(\''+_video+'\', \''+_folder+'\', ' + subtitles[i].start + ')">'  
											  + subtitles[i].start + 's</a>', _regex, subtitles[i].text);
            _matched = true;
			break;
		}
	}
}

function handleDownloads(req)
{
	if(selectedVideoIdx == -1 || selectedFolderIdx == -1){
		//we could have quickly left the page while the xml was downloading
		return;
	}
	var body = req.responseXML.getElementsByTagName('body')[0];
	var elts = selectMultiElements(body, 'a');
	var vid = folders[selectedFolderIdx].videos[selectedVideoIdx];
    for (i = 0; i < elts.length; i++) 
	{
		a = elts[i];	
        d = new Object();
 		d.icon = 'images/file_icon.gif';
 		d.url = vid.httplink + 'Downloads/' + a.getAttribute('href');
 		d.name = getContent(a);
        vid.retrievedDownloads[vid.retrievedDownloads.length] = d;
 	}
 
 	showDownloads();
 }
 
 
 function showDownloads()
 {
 	var accumHtml = '';
    var vid = folders[selectedFolderIdx].videos[selectedVideoIdx];
 	for (i in vid.retrievedDownloads) {
 		var d = vid.retrievedDownloads[i];
 		if(d.name){	
 			var html = templates.downloadTemplate.html;
			html = html.replace('$icon', d.icon);
 			html = html.replace('$url', d.url);
 			html = html.replace('$name', d.name);
			accumHtml += html;
		}
 	}
	templates.downloadTemplate.setData(vid.retrievedDownloads, accumHtml);    

}


function hilightMatch(regex, subj, isProp)
{
    regex.exec('');
	if(!regex.exec(subj)){
		return subj;
		if(prop){
			debug('no match in val of ' + prop);
		}
	}

	MAX_CONTEXT_LENGTH = 200;
	CONTEXT_BEFORE = 15;
	var trimmed;
	if (subj.length > MAX_CONTEXT_LENGTH) {
		//clear state in regex??
		regex.exec('');

		m = regex.exec(subj);
        if (m.index < CONTEXT_BEFORE) {
			trimmed = subj.substr(0, MAX_CONTEXT_LENGTH - 3) + '...';
		} else {
			trimmed = '...' + subj.substr(m.index - CONTEXT_BEFORE, MAX_CONTEXT_LENGTH - 6) + '...';
		}		
	} else {
		trimmed = subj;
	}
	var replaced = trimmed.replace(regex, '<span class="searchMatchHilight">$1</span>')
    return replaced;
}

function makeMatchDesc(type, regex, context)
{
	return '<div>Matched in ' + type + ':<br /><i>' + hilightMatch(regex, context) + '</i></div>';
}

function onSlide(url)
{
	if(liveSlidePrefix){
		debug('loading live slide: ' + liveSlidePrefix + url + slideSizeParams());
		slide.src = liveSlidePrefix + url + slideSizeParams();
	}
}


function selectVideo(pid, folderName, videoOffset, dontSave)
{
	//selectvideo is now also responsible for only refreshing content if it has changed
	stateChangePhase = 1;
	
	everReportedUsage = false;

	searchText = '';

    var oldSelectedFolderName = selectedFolderName;
	var oldSelectedVideoPid = selectedVideoPid;
	
	if(folderName || folderName === ''){
        selectedFolderIdx = findFolder(folderName);
	}
	
	selectedVideoIdx = findVideo(pid);
    selectedFolderName = folderName;
    
	if(selectedVideoIdx != -1){
		var vid = folders[selectedFolderIdx].videos[selectedVideoIdx];
		if(!selectedFolderName){
			selectedFolderName = vid.folder;
		}
		selectedVideoPid = vid.pid;		
	} else {
		selectedVideoPid = -1;
	}
    
    if(!dontSave && encodeState() != escape(loadState())){
		saveState(encodeState());
	} 

    if(selectedVideoIdx == -1){
        if(selectedFolderIdx == -1){
            selectedFolderName = '';
			selectedVideoPid = -1;
            if(player && player.filename){
				player.Stop();
			}
            if (frontPageContentChanged){
                setMode('frontpage');
				showFolders();
			} else {
				setMode('frontpage');				
			}
			if (folderName != '***' && folderName != '') {
				alert('Video Library could not find the folder associated with this item.');
			}
		} else {
			selectedFolderName = folderName;
			selectedVideoPid = -1;
			debug('selected: folder: ' + folderName);
			if(player && player.filename){
				player.Stop();
			}
            if (selectedFolderName != oldSelectedFolderName || folderContentChanged) {
                setMode('videos');
				showVideos();				
			} else {
				setMode('videos');				
			}
		}  
		return;
	}

	var updatingCurrentVideo = false;
	if (currentMode == 'details' && oldSelectedVideoPid == selectedVideoPid) {
		//re-selecting the current video - be careful not to disturb the playing video more than necessary
		if (!videoContentChanged) {
			//really do nothing
			return;
		} 		
		updatingCurrentVideo = true;		
	}
	videoContentChanged = false;
	setMode('details');


    if(!vid.downloads)
	{
		vid.retrievedDownloads = new Array();
		if(vid.httplink+'' != 'Undefined')
		{			
			loadXMLDoc(vid.httplink + 'Downloads/index.xml', handleDownloads, true, function(req){templates.downloadTemplate.setData(null, '')});
		}
	} else {
 		vid.retrievedDownloads = new Array();
 		for (i in vid.downloads) {
 			var d = new Object();
 			d.icon = 'images/file_icon.gif';
 			d.url = vid.httplink + 'Downloads/' + vid.downloads[i];
 			if (vid.downloads[i].indexOf('/') != -1) {
 				d.name = vid.downloads[i].substring(vid.downloads[i].lastIndexOf('/')+1, vid.downloads[i].length);
 			} else {
				d.name = vid.downloads[i];				
			}			
 			vid.retrievedDownloads[vid.retrievedDownloads.length] = d;
 		}
 		showDownloads();
  	}
	
	//@@@player.style.backgroundImage = 'url(' + vid.httplink + 'thumbnail.jpg)';

    if(vid.isLive == 'LiveNow'){
		templates['detailsTemplate'].setData(vid, substituteProperties(templates.liveDetailsTemplate.tokens, vid));
	}else if(vid.isLive == 'Announce'){
		templates['detailsTemplate'].setData(vid, substituteProperties(templates.announceDetailsTemplate.tokens, vid));
	} else {
		templates['detailsTemplate'].setData(vid, substituteProperties(templates.detailsTemplate.tokens, vid));
	}
 	doBreadcrumbs();
	
	var accumHtml = '';
    for (i = 0; i < vid.links.length; i++) 
	{
        accumHtml += substituteProperties(templates.linkTemplate.tokens, vid.links[i]);	
	}
	templates.linkTemplate.setData(vid.links, accumHtml);

	
	//chapters
	var chaptersSelect = D('vl_chaptersSelect');
	var f = function(){lastChaptersMouseEventTime = new Date()};
	chaptersSelect.onmousemove = chaptersSelect.onmousedown = chaptersSelect.onmouseup = f;
	chaptersSelect.onkeydown = chaptersSelect.onkeyup = f;
	chaptersSelect.onmouseout = function(){lastChaptersMouseEventTime = new Date(0)};
    chaptersSelect.options.length = 0;	
	chaptersSelect.options[chaptersSelect.options.length] = new Option('Go to...', 0);
	
	//slides
	if (vid.isLive == 'LiveNow') {
		//get the current slide otherwise nothing is shown until the first scriptCommand
		if(chaptersSelect.className.indexOf('noHide') == -1)
		{
			chaptersSelect.style.display = 'none';
		}
		liveSlidePrefix = mungeHttpLink('_1.2/liveslides/') + 
			escape(vid.categories['em:liveLinkUrl'] + '/slides/');
		if (vid.hasLiveSlides) {
			slide.src = 'images/beforeslides.jpg' + slideSizeParams();
		} else {
			slide.src = 'images/noslides.jpg' + slideSizeParams();
		}
	} else {
		liveSlidePrefix = false;
		for (i = 0; i < vid.chapters.length; i++) {
			if(vid.chapters[i].title == 'Untitled')
			{
				vid.chapters[i].title = 'Slide ' + (i+1);
			}
			chaptersSelect.options[chaptersSelect.options.length] = 
				new Option(formatChapterForLevel(unescape(vid.chapters[i].title), vid.chapters[i].level), vid.chapters[i].time);			
			if(vid.chapters[i].level == 1){
			    chaptersSelect.options[chaptersSelect.options.length - 1].style.fontWeight = 'bold';
				chaptersSelect.options[chaptersSelect.options.length - 1].style.backgroundColor = 'silver';
			}
		}
		if(vid.chapters.length == 0)
		{
			debug('no chapters');
			chaptersSelect.options[0] = new Option('No chapters available');
            if(chaptersSelect.className.indexOf('noHide') == -1)
			{
				chaptersSelect.style.display = 'none';
			}
		} else {
			chaptersSelect.style.display = 'block';
		}
	}

    //subtitles
	subtitlesDiv.innerHTML = '';
	subtitles.length=0;
	if(!vid.isLive && !vid.subtitles){
        loadXMLDoc(vid.httplink + 'subtitles.xml', handleSubtitles, true, subsError);
	} else if(!vid.subtitles){
		subsError();
	}

    prevPos = 0;
    accumTime = 0;
    startTime = 0;


    if(!updatingCurrentVideo || (vid.isLive == 'LiveNow' && vid.liveUrl != player.filename)){
        player.Autostart = 1;	
	
		//mms link
		if (vid.isLive == 'LiveNow') {  
            player.filename = vid.liveUrl;		  
		} else{	
			//the skin can set neverMunge to disable all url rewriting
			if (window.neverMunge) {
				vid.mmslink = vid.directMMSLink;
				debug('Using direct url: ' + vid.mmslink);
			} else {
				if(cdmEnvironment == 4){
					vid.mmslink = vid.vFourUrl;
					debug('Using v4 url: ' + vid.mmslink);
				} else if(cdmEnvironment == 5){
					vid.mmslink = vid.vFiveUrl;	
					debug('Using v5 url: ' + vid.mmslink);
				} else if (cdmEnvironment == 'custom') {
                    vid.mmslink = vid.customMMSUrl;
                    debug('Using custom mms redirection: ' + vid.mmslink);
                }   	
			}
            
			player.filename = unescape(vid.mmslink);
			//player.filename = 'http://192.168.10.150:81/¬£&;`\'é—/1.asf';
			if (videoOffset)
			{
				debug('jumping video to ' + videoOffset);
				videoJumpTarget = Math.round(videoOffset);
			}
		} 
	}
	
	currentSlideIdx = -1; 	
}

function formatChapterForLevel(title, level)
{
	if (level <= 1) {
		return title;	
	} else {
		var ret = title;
		for (var i = level - 1; i > 0; i--) {
            ret = '  ' + ret;
		}
		return ret;
	}
}

function subsError(req)
{
    subtitlesDiv.style.display="none";
}

// "state" can depend on searchText, selectedFolder, selectedVideo
// so between the time one of these changes and saveState() is called
// there is a danger of a spurious historychange event, so we use
// window.stateChanging

function loadState()
{
	try
	{
		return unescape(hist.contentWindow.location.search.substring(1));       
	}
	catch(e)
	{
		debug('error loading state:'  + e.message);
		throw(e);
	}
}

function saveState(state)
{
    try
	{
		hist.contentWindow.location.search = state;   
	} catch (e){
		debug('error saving state: ' + e.message);
		throw(e);
	}
}

function encodeState()
{
	if(searchText && searchText != ''){
	  return escape('search=' + searchText);
	}
	
	if(selectedFolderIdx == -1){
		return '';
	} else if(selectedVideoIdx == -1){
		return escape(selectedFolderName);
	} else {
		return escape(selectedFolderName + ':' + selectedVideoPid);
	}
}

function syncWithHistory()
{
	if(needToJump) return;
	if(stateChangePhase != 0){
		stateChangePhase++;
        if (stateChangePhase > 5) {
			stateChangePhase = 0;
		}
		return;
	}
    
	try
	{
		if (escape(loadState()) != encodeState()){			
			debug('History: [' + escape(loadState()) + '] != [' + encodeState() + ']: jumping to: ' + loadState());
			jumpToLocation(loadState(), true);	
		}
	} catch (e)
	{
	}
}

function processSubtitles()
{
	syncWithHistory();

	if (!player.currentPosition) {
		return;
	}
	
	var pos = player.CurrentPosition;

    if (pos != 0 && videoJumpTarget) {
		debug('actually jumping to ' + videoJumpTarget-0);
		player.currentPosition = videoJumpTarget-0;
		videoJumpTarget = 0;
	}
	for (i in subtitles) {
		var sub = subtitles[i];
        if ((sub.start > pos || sub.stop < pos) && sub.div) {
            subtitlesDiv.removeChild(sub.div);
			sub.div = undefined;
		} else if (sub.start <= pos && sub.stop > pos && !sub.div) {
			sub.div = document.createElement('div');
            if(sub.style != 'Default'){
				sub.div.title = sub.style;
			}
            sub.div.innerHTML = sub.text;
			sub.div.style.color = subtitleStyles[sub.style].color;
			if(subtitleStyles[sub.style].align.indexOf('right') != -1){
				sub.div.style.textAlign = 'right';
			} else {
				sub.div.style.textAlign = 'left';
			}
            subtitlesDiv.appendChild(sub.div);			
		}
	}

    if(isIE){
		//subtitlesDiv.doScroll('scrollBarDown');
	}
}

function slideSizeParams()
{
	return '?x=' + slide.width + '&y=' + slide.height;
}

function processSlides(redo)
{
    if(selectedFolderIdx == -1 || selectedVideoIdx == -1) {
        if(slide.src.indexOf('images/noslides.jpg') == -1){
			slide.src = 'images/noslides.jpg' + slideSizeParams();
		}  
		return;
	} 
    vid = folders[selectedFolderIdx].videos[selectedVideoIdx];

	if(vid.isLive != 'LiveNow'){
		var pos = player.CurrentPosition;
		
		if(vid.chapters)
		{
			var idx = 0; 
			while(idx < vid.chapters.length && vid.chapters[idx].time <= pos)
			{				
				idx++;
			}
			var chaptersSelect = D('vl_chaptersSelect');
			
			if (new Date() - lastChaptersMouseEventTime > 10000) {
				chaptersSelect.selectedIndex = idx;
			}
		}
		
		if(!vid.slides || vid.slides.length == 0){
			if(slide.src.indexOf('images/noslides.jpg') == -1){
				slide.src = 'images/noslides.jpg' + slideSizeParams();
			}			
		} else {

			idx = 0;
			while(idx < vid.slides.length && vid.slides[idx].time < pos)
			{				
			   // debug('is ' + vid.slides[idx].time + ' < ' + pos);
			   // debug(' and is ' + idx + ' < ' + vid.slides.length);
				idx++;
			}
			idx--;
			
			if (currentSlideIdx == -1 || currentSlideIdx != idx || redo) {
				currentSlideIdx = idx;
				if(idx == -1){
					if(slide.src.indexOf('images/beforeslides.jpg') == -1){
						slide.src = 'images/beforeslides.jpg' + slideSizeParams();
					}
				} else {
					var newSrc = vid.httplink + slideTypePath + vid.slides[idx].url;
					if(slide.src.indexOf(newSrc) == -1){
						slide.src = newSrc + slideSizeParams();
					}			
				}		   
			}	 
		}

        if(player.duration){
			duration = player.duration;
		} else {
			duration = 0;
		}
		
		if(!pos){
			pos = 0;
		}
        if (pos < prevPos || pos > prevPos + 2) {
		   //a skip has occurred
		   if(accumTime > 0) {
				   reportUsage();
		   }
		   accumTime = 0;
		   startPos = pos;
		   prevPos = pos;
		} else if (pos == prevPos && accumTime != 0) {
		   //player has stopped
		   reportUsage();
		   startPos = pos;
		   accumTime = 0;
		} else if (pos > prevPos) {
		   accumTime = pos - startPos;
		   prevPos = pos;
		}

		if(!everReportedUsage && duration != 0)
		{
			reportUsage();
		}
	}
}

function doLiveSlide(param)
{
	if(selectedFolderIdx == -1 || selectedVideoIdx == -1) {
        if(slide.src.indexOf('images/noslides.jpg') == -1){
			slide.src = 'images/noslides.jpg' + slideSizeParams();
		}
		return;
	}

    vid = folders[selectedFolderIdx].videos[selectedVideoIdx];
	
	if(vid.isLive){
		slide.src = mungeHttpLink('_1.2/liveslides/') + 
			escape(vid.categories.liveSlideUrl) +
			'?x=' + slide.width + '&y=' + slide.height + '&slideNYI=' + param;
	}
}


