var XMLHttpRequestObject = false;
if (window.XMLHttpRequest){
XMLHttpRequestObject = new XMLHttpRequest();
} else if (window.ActiveXObject){
XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");}

var snippetContentHash = new Array();
var baseURL="";
var curSlideInDivElements = new Array();

function refreshDivByThisString(withThisString, intoThisDivID){
var divObjTobeRefreshed= document.getElementById(intoThisDivID);
divObjTobeRefreshed.innerHTML=withThisString;
}


function refreshDivBySnippet_viaHashJSorAjax(withThisSnippetID, intoThisDivID){
//resetDeeperDIVs (intoThisDivID); // uncomment is layout has DIVs with depth

if (withThisSnippetID==''){
 alert("Select an option in this topic"); }
	else if (snippetContentHash[withThisSnippetID]) {
		var divObjTobeRefreshed= document.getElementById(intoThisDivID);
		divObjTobeRefreshed.innerHTML=snippetContentHash[withThisSnippetID];}
	else{
		tryAjax(withThisSnippetID, intoThisDivID);
		}

	function tryAjax(aSnippetID, aDivID){
	if (aSnippetID.indexOf('.')>=1){
		if (aSnippetID.indexOf("http")==1){
		refreshDivBySnippet_viaAjax(aSnippetID, aDivID) //implies absolute URL
		}
		else{
		getURL=baseURL+aSnippetID;
		refreshDivBySnippet_viaAjax(getURL, aDivID) //make absolute URL
		}
	}
	else {
		getURL=baseURL+aSnippetID+ ".txt"; // snippet ID needs to be converted to a filename
		refreshDivBySnippet_viaAjax(getURL, aDivID)}
	}
	
	// uncomment above, if deeper DIVs need to be cleared, in layouts with DIV depth
	function resetDeeperDIVs (aDivID){
	var docDIVprefix="towSnipDV";
	var docMaxDivDepth=3;
	var aStr="";
	aStr=aDivID;
	i=aStr.substr(docDIVprefix.length);
	curDepth= parseInt(i);
	for (j=curDepth;j<=docMaxDivDepth;j=j+1) {
	resetDivID = docDIVprefix + j;
	var divObjTobeRefreshed= document.getElementById(resetDivID);
	divObjTobeRefreshed.innerHTML='Choose Topic...';}
	}
}	

// if snippetID starts with http, then get as is, else baseURL is prefixed.
// if no extenstion then .txt is appended (assumed).


function refreshDivBySnippet_viaAjax(withThisSnippetID, intoThisDivID){
if (XMLHttpRequestObject) {
var obj=document.getElementById(intoThisDivID);
XMLHttpRequestObject.open("GET", withThisSnippetID);
XMLHttpRequestObject.onreadystatechange = function(){
if (XMLHttpRequestObject.readyState==4 && XMLHttpRequestObject.status == 200){
obj.innerHTML = XMLHttpRequestObject.responseText;
}}
XMLHttpRequestObject.send(null);
}}

//User calls onOptionClicked for click type actions to display snippet in Div
function onOptionClicked (aSnippetID, aDivID) {
refreshDivBySnippet_viaHashJSorAjax(aSnippetID, aDivID);}

//User calls onMenuOptionChange for click type actions to display snippet in Div
function onMenuOptionChange (theMenu, aDivID){
var aSnippetID;
aSnippetID = theMenu.options[theMenu.selectedIndex].value
refreshDivBySnippet_viaHashJSorAjax(aSnippetID, aDivID);}


// if direction==0 then clears past and loads startingSlideSnippetID as fresh
// if direction +/- then fetch adjacent, based on memory; startingSlideSnippetID is ignored
// if direction +/- but slideShow is not begun, then load show with startingSlideSnippetID
// assumes slide counter is to be displayed in targetDivName+"CountStatus"

// if this DIV (targetDivName) is only aletered or set by this fn (browserOrRefresh)
// the slide show should work fine

function browseOrReFreshSlidesInDiv(startingSlideSnippetID, direction, targetDivName){
var isSlideShowRunning=false;
var skipEvent=false;
	if (curSlideInDivElements[targetDivName]){
		if (curSlideInDivElements[targetDivName]!="reset"){
	 	isSlideShowRunning=true;}
	}

	if (direction==0) { // resets to a new show as in startingSlideSnippetID and clears past
		nextSlideSnippetID=startingSlideSnippetID;
		curSlideInDivElements[targetDivName]=startingSlideSnippetID;} // now in v1.75
		//curSlideInDivElements[targetDivName]="reset"; // as in v1.6
	else {
		if (isSlideShowRunning) {
			nextSlideSnippetID= getnextSlideSnippetID (curSlideInDivElements[targetDivName], direction);
			curSlideInDivElements[targetDivName]=nextSlideSnippetID;}
		else {
			skipEvent=true; 
			//legacy- v1.6 forced a slide show if none, 
			// but in v1.75, nx/pr does nothing, if noShow is set
			// this is not a problem, since the proper functioning is that this DIV
			// must always have a show and the show is manipulated by this fn
			
			//nextSlideSnippetID= startingSlideSnippetID //since not loaded, the nextSlide is starting slide
			//curSlideInDivElements[targetDivName]=nextSlideSnippetID;
			}	
	}
	if (skipEvent){
	var divObjTobeRefreshed= document.getElementById(targetDivName+"CountStatus");
	divObjTobeRefreshed.innerHTML="";
	}
	else{
	refreshDivBySnippet_viaHashJSorAjax(nextSlideSnippetID, targetDivName)
	statusStr=getSlideCountStatusStr(nextSlideSnippetID); //after refreshing
	var divObjTobeRefreshed= document.getElementById(targetDivName+"CountStatus");
	divObjTobeRefreshed.innerHTML=statusStr;
	}
}

function newSlideShowInDiv(startingSlideSnippetID, targetDivName){
 browseOrReFreshSlidesInDiv(startingSlideSnippetID, 0, targetDivName);
}

function nextSlideInDiv(targetDivName){
 browseOrReFreshSlidesInDiv('', 1, targetDivName);
}

function prevSlideInDiv(targetDivName){
 browseOrReFreshSlidesInDiv('', -1, targetDivName);
}
function nextSlideWithWrapInDiv(targetDivName){
 browseOrReFreshSlidesInDiv('', 2, targetDivName);
}

function prevSlideWithWrapInDiv(targetDivName){
 browseOrReFreshSlidesInDiv('', -2, targetDivName);
}

// 1st or lastSlide (if wrap) can be reached from Zero_th slide, depending on direction !=0
// but zeroth slide cannot be reached from any other slide by next/prev
// to reach zeroth slide, direction must be 0

function getSlideCountStatusStr (aSlideName){
var slidefrom="_", slideTo=".", slideOf="of";
aStr=aSlideName; 
curSlideID=0; //default
totalIDs=0; //

startSlideIndex= aSlideName.lastIndexOf(slidefrom); // "_" must be present
aSlideNamePreStr=aSlideName.substring(0,startSlideIndex);

if (aSlideName.lastIndexOf(slideTo)> -1){ // dot can be absent
endSlideIndex= aSlideName.lastIndexOf(slideTo);
aSlideNameSufStr=aSlideName.substring(endSlideIndex+1); //to end; assumes dot is not last char
}
else{
endSlideIndex= aSlideName.length; // if dot is absent then assume till end, since no extension
slideTo="";
aSlideNameSufStr="";
}

if ((startSlideIndex>=0) && (endSlideIndex>0) && (endSlideIndex>startSlideIndex)){
	if (slideTo.length>=1) {
	rangeStr=aSlideName.substring(aSlideName.lastIndexOf(slidefrom)+slidefrom.length);}
	else{
	rangeStr=aSlideName.substring(aSlideName.lastIndexOf(slidefrom)+slidefrom.length, aSlideName.lastIndexOf(slideTo)); }

curSlideID=parseInt(rangeStr.substring(0, rangeStr.indexOf(slideOf)));
totalSlides=parseInt(rangeStr.substring(rangeStr.indexOf(slideOf)+slideOf.length)); // 
}
return (curSlideID+" of "+totalSlides);
}

function getnextSlideSnippetID (aSlideName, direction){
var slidefrom="_", slideTo=".", slideOf="of";
aStr=aSlideName;

startSlideIndex= aSlideName.lastIndexOf(slidefrom); // "_" must be present
aSlideNamePreStr=aSlideName.substring(0,startSlideIndex);

if (aSlideName.lastIndexOf(slideTo)> -1){ // dot can be absent
endSlideIndex= aSlideName.lastIndexOf(slideTo);
aSlideNameSufStr=aSlideName.substring(endSlideIndex+1); //to end; assumes dot is not last char
}
else{
endSlideIndex= aSlideName.length; // if dot is absent then assume till end, since no extension
slideTo="";
aSlideNameSufStr="";
}


if ((startSlideIndex>=0) && (endSlideIndex>0) && (endSlideIndex>startSlideIndex)){
if (slideTo.length>=1) {
rangeStr=aSlideName.substring(aSlideName.lastIndexOf(slidefrom)+slidefrom.length); 
}
else{
rangeStr=aSlideName.substring(aSlideName.lastIndexOf(slidefrom)+slidefrom.length, aSlideName.lastIndexOf(slideTo)); 
}
curSlideID=parseInt(rangeStr.substring(0, rangeStr.indexOf(slideOf)));
totalSlides=parseInt(rangeStr.substring(rangeStr.indexOf(slideOf)+slideOf.length)); // till end
	if (direction>0) { //forward
		if (curSlideID>=totalSlides){
			if (direction>1) {
			nextSlideID=1;}
			else{
			nextSlideID=totalSlides;}
		}
		else{
		nextSlideID=curSlideID+1;}
	}
	else if (direction==0){ //homeSlide
	nextSlideID=0
	}
	else{ // rewind
		if (curSlideID<=1){
			if (direction< -1) {
			nextSlideID=totalSlides;} //wrap if high negative
			else{
			nextSlideID=1;} // first slide, no wrap
		}
		else{
		nextSlideID=curSlideID-1;}	
	}
	
aStr=aSlideNamePreStr+slidefrom+nextSlideID+slideOf+totalSlides+slideTo+aSlideNameSufStr
//alert (aStr);
return aStr;
}
	
else{
alert("cannot get next slide");}
}

    
 topLayerZindex=99;
 LinkJustClickedInDiv=false; //boolean primitive, not boolean object //var LinkJustClickedInDiv=new Boolean(false); 
 function ShowThisAboveOthers(aDivID, elementClicked) {
 	bringToTop=false; 
 	obj = document.getElementsByTagName("div");
 	
 	if (elementClicked=="linkInDiv")		// a link clicked inside a div
 	{	bringToTop=true;
    	LinkJustClickedInDiv=true;
    	obj[aDivID].style.visibility= 'visible'; // if target div layer is hidden, make visible
    }
    else							// else a broad div click
    {	
    	if (LinkJustClickedInDiv)
    	{
  		 LinkJustClickedInDiv=false; // first divClick after a linkClick is ignored and LinkJustClicked is reset 
  		 }							 // since a linkClick implies a divClick(this Div should not show over TargetDiv)
  		 else
  		 {
  		 bringToTop=true; // if link is not just-clicked, then this is a valid Div click
  		}
 	}
 	
 	if (bringToTop) // if bringToTop was boolean object, then this statment always evals to true
 	{
    obj[aDivID].style.zIndex= topLayerZindex+1;
    topLayerZindex +=1;
    // alert (LinkJustClickedInDiv);
 	}
    }
 
