
parseUri.options = {
	strictMode: false,
	key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
	q:   {
		name:   "queryKey",
		parser: /(?:^|&)([^&=]*)=?([^&]*)/g
	},
	parser: {
		strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
		loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};

function parseUri(str) {
	var	o   = parseUri.options,
		m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
		uri = {},
		i   = 14;
		
	while (i--) uri[o.key[i]] = m[i] || "";

	uri[o.q.name] = {};
	uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
		if ($1) uri[o.q.name][$1] = $2;
	});

	return uri;
}

function stateChange_slide() {
	if (xmlhttp.readyState==4) {		// 4 = "loaded"
		if (xmlhttp.status==200) {		// 200 = "OK"
			var splitResults = xmlhttp.responseText.split("\n");
			var currentSync = splitResults[1];
			var currentTarget = splitResults[2];
			// depends upon parseUri() above
			var currentFile = parseUri(currentSync).file;
			var lastNum = currentFile.replace(/.*?(\d+)[^\d]*$/,'$1');
			if(lastNum!=''){
				CurrentSlideNumber = lastNum;
				if (currentTarget.indexOf('region1')!=-1) {
					applySlideSource();
				}
			}
		}else{
			CurrentSlideNumber = "r1";
			applySlideSource();
		}
	} 
}

var xmlhttp;

function loadXMLDoc_slide(url){
	xmlhttp=null;
	
	if (window.XMLHttpRequest){
		// code for Firefox, Opera, IE7, etc.
		xmlhttp=new XMLHttpRequest();
	}else if (window.ActiveXObject){
		// code for IE6, IE5
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (xmlhttp!=null){
		// dependency on stateChange() above
		xmlhttp.onreadystatechange=stateChange_slide;
		xmlhttp.open("GET",url,true);
		xmlhttp.send(null);
	}else{
		var notice;
	    notice = 'No slide will appear until presenter synchs ';
	    notice+= 'the next item; due to a browser limitation.';
		alert(notice);
	}
}

function slideSetAsynchronously(){
	// dependency on   loadXMLDoc_slide() above,
	// which requires  stateChange() above,
	// which requires  parseUri() from lm.js or slm.js
	var onDemand = pres_ondemand;
	if (onDemand == 'visible') {
		return false;
	}else{
		loadXMLDoc_slide('g.htm');
		return true;
	}
}

var envDOMPathToSlide;    // like:  'top.Slide.slideimage'  vs.  'MediaPlayer.findName("SlideArea")'
var envDOMPathToLgSlide;  // like:  '_lgslide.lg'  vs.  'MediaPlayer.findName("SlideAreaLarge")'
var envParamSlideSource;  // like:  'src' vs. 'Source'

function getLatestSlide(){
	// set 3 environment vars above, before invoking getLatestSlide()
	if(curslideimg!='' && curslideimg!=CurrentSlideNumber){
		// Capture Station
		CurrentSlideNumber = curslideimg.replace('_1.jpg', '');
		applySlideSource();
		return true;
	}
	if(! slideSetAsynchronously()){
		CurrentSlideNumber = "r1";
		applySlideSource();
    }
}

function ImgLoad(sSrc) {
   var oImg     = new Image;
   oImg.onload  = function(){ eval(envDOMPathToSlide + '.' + envParamSlideSource + ' = "' + sSrc + '"' ); }
   oImg.onerror = function(){ eval(envDOMPathToSlide + '.' + envParamSlideSource + ' = "r1.gif"' ); }
   oImg.src     = sSrc;      
}

function applySlideSource(){
	var src;
	// DEBUG = false;
	curslideimg = CurrentSlideNumber;

	// set slide
	if(isPRO)  src = 'slide'+CurrentSlideNumber+'.jpg';
	else       src = CurrentSlideNumber + '_1.jpg';
	try{
		if(DEBUG) alert(envDOMPathToSlide + '.' + envParamSlideSource + ' = "' + src + '"');
		ImgLoad(src);
	}catch(e){ }

	// set LARGE slide
	if(isPRO)  src = 'lg_slide'+CurrentSlideNumber+'.jpg';
	else       src = CurrentSlideNumber + '_lg.jpg';
	try{
		eval(envDOMPathToLgSlide + '.' + envParamSlideSource + ' = "' + src + '"' );
	}catch(e){ }
}

