//snipDiv v2.1
//©2009 saumilzx.com. For online use by thatsourworld.com sites

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

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

function refreshDivByRandomSnippet_viaHashJS(withThisSnippetBaseID, upperVal, intoThisDivID){
// range of snippetIDs from withThisSnippetBaseID+randomNumber from 1 to upperval
var divObjTobeRefreshed= document.getElementById(intoThisDivID);
if (upperVal<=1) {
	divObjTobeRefreshed.innerHTML=snippetContentHash[withThisSnippetBaseID+"1"];}
else{
	var rndSnipVal=1+Math.floor(Math.random()*(upperVal));
	// floor of (random*upperVal) generates random integer from 0 to upperVal-1
	if (rndSnipVal<1){ rndSnipVal=1;}
	if (rndSnipVal>upperVal){ rndSnipVal=upperVal;} // If .random genrates 1?
	divObjTobeRefreshed.innerHTML=snippetContentHash[withThisSnippetBaseID+rndSnipVal];}
}

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 newXMLHttpRequestObject(){
var XMLHttpRequestObject = false;
if (window.XMLHttpRequest){
XMLHttpRequestObject = new XMLHttpRequest();
} else if (window.ActiveXObject){
XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");}
return XMLHttpRequestObject;
}

function refreshDivBySnippet_viaAjax(withThisSnippetID, intoThisDivID){

var anXMLHttpReqObj= newXMLHttpRequestObject();
// comment above if using ajaxhash below

// ajaxhash still does not do multiple calls, but works fine for one
// uncomment global array divAjaxObjects on top of page
//if (divAjaxObjects[intoThisDivID]){
//anXMLHttpReqObj=divAjaxObjects[intoThisDivID];}
//else{
//divAjaxObjects[intoThisDivID]= newXMLHttpRequestObject();
//anXMLHttpReqObj= divAjaxObjects[intoThisDivID];}

	if (anXMLHttpReqObj) {
	var obj=document.getElementById(intoThisDivID);
	anXMLHttpReqObj.open("GET", withThisSnippetID);
	anXMLHttpReqObj.onreadystatechange = function(){
		if (anXMLHttpReqObj.readyState==4 && anXMLHttpReqObj.status == 200){
		obj.innerHTML = anXMLHttpReqObj.responseText;}}
	anXMLHttpReqObj.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, optionalTitle){
var isSlideShowRunning=false;
var skipEvent=false;
var showTitle="";

	if (curSlideInDivElements[targetDivName]){
		if (curSlideInDivElements[targetDivName]!="reset"){
	 	isSlideShowRunning=true;}
	}

	if (direction==0) { // resets to a new show as in startingSlideSnippetID and clears past
		if (optionalTitle){
		showTitle=optionalTitle;
		var divTitleObj= document.getElementById(targetDivName+"Title");
		divTitleObj.innerHTML=showTitle;}	
		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, theTitle){
 browseOrReFreshSlidesInDiv(startingSlideSnippetID, 0, targetDivName, theTitle);
}

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

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

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

function lastSlideInDiv(targetDivName){
 browseOrReFreshSlidesInDiv('', 10, targetDivName, '');
}

function firstSlideInDiv(targetDivName){
 browseOrReFreshSlidesInDiv('', -10, 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 (direction==10){
		nextSlideID=totalSlides;} // jump to last slide
		else {
			if (curSlideID>=totalSlides){
				if (direction>1) {
				nextSlideID=1;}
				else{
				nextSlideID=totalSlides;}
			}
			else{
			nextSlideID=curSlideID+1;}}
	}
	else if (direction==0){ //homeSlide, this condition is not reached as 0 in browseOrReFreshSlidesInDiv inits a new show
	nextSlideID=0
	}
	else{ // rewind
		if (direction==-10){
		nextSlideID=1;} // jump to first slide, home bn
		else {
			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);
 	}
    }
 
