//<!-- Original:		8 Dimensions -->
//<!-- Web Site:		http://www.8dimensions.com -->
//<!-- Insipred by: FadeIn_1_5.js by CodeLifter.com (support@codelifter.com) at http://www.codelifter.com -->

//<!-- 01.01.2007 First version -->
//<!-- 01.02.2007 fadebgcolor in writeSlideShowCode can be omitted now, no background then -->
//<!-- 15.02.2007 writeSlideShowCode now returns a reference to the object it created (in DOM browser), so its various properties can be set -->

// Set slideShowSpeed (milliseconds)
var slideShowSpeed = 7000;

// Duration of crossfade (miliseconds, with precision of 20ms max.)
var crossFadeDuration = 3000;
// Base opacity degree to start the image to fade in from. 0..absolutely transparent = inivisible 100.. solid = no fade in 
var startOpacityDegree = 10;
//The opacity degree, when the map of the image will become active (between 0 and 100)
var mapSwapOpacityDegree = 50; 
// Specify the image files & properties
var Pic = new Array();

//No other variables found bellow should be modified outside the script!
// A semaphor for timersetting
var timerSet = false;
// To hold preloaded images
var preLoad = new Array();
//Browser identification
var domBrowser=(document.getElementById) //modern dom browsers

var activeCanvas;
var activeImageMap;
var otherCanvas;
var toFrontCanvas;
var opacityDegree;
var opacityUsed;
var opacityDegreeDelta; //the amount to add  to opacityDegree at every step of fade-in
var crossfadeFunc; 
var innerMapSwapOpacityDegree; //same function as mapSwapOpacityDegree but it's value changes during the computation for better performance

var opacity100=false; //flag to indicate wether the opacity degree is in interval <0..100> or <0..1>

var slideshowTimer;

var activeImage=0;

var inited=false;

function writeSlideShowCode(slideshowWidth, slideshowHeight,fadebgcolor) {

var opacityFrac;

opacityFrac=startOpacityDegree/100;

if (domBrowser) {//if IE5+ or modern browsers (ie: Firefox)
  document.write('<div id="master" style="position:relative;width:'+slideshowWidth+'px;height:'+slideshowHeight+'px;overflow:hidden;">');
	if (fadebgcolor==undefined) {
    document.write('<div id="canvas0" style="position:absolute;width:'+slideshowWidth+'px;height:'+slideshowHeight+'px;top:0;left:0;filter:progid:DXImageTransform.Microsoft.alpha(opacity='+startOpacityDegree+');opacity: '+opacityFrac+';-moz-opacity:'+opacityFrac+';-khtml-opacity:'+opacityFrac+';"></div>');
    document.write('<div id="canvas1" style="position:absolute;width:'+slideshowWidth+'px;height:'+slideshowHeight+'px;top:0;left:0;filter:progid:DXImageTransform.Microsoft.alpha(opacity='+startOpacityDegree+');opacity: '+opacityFrac+';-moz-opacity:'+opacityFrac+';-khtml-opacity:'+opacityFrac+';"></div>');
		}
	 else {	
    document.write('<div id="canvas0" style="position:absolute;width:'+slideshowWidth+'px;height:'+slideshowHeight+'px;top:0;left:0;filter:progid:DXImageTransform.Microsoft.alpha(opacity='+startOpacityDegree+');opacity: '+opacityFrac+';-moz-opacity:'+opacityFrac+';-khtml-opacity:'+opacityFrac+';background-color:'+fadebgcolor+'"></div>');
    document.write('<div id="canvas1" style="position:absolute;width:'+slideshowWidth+'px;height:'+slideshowHeight+'px;top:0;left:0;filter:progid:DXImageTransform.Microsoft.alpha(opacity='+startOpacityDegree+');opacity: '+opacityFrac+';-moz-opacity:'+opacityFrac+';-khtml-opacity:'+opacityFrac+';background-color:'+fadebgcolor+'"></div>');
		}
	document.write('</div>');
	return document.getElementById("master");
  }
 else
  document.write('<div><img name="defaultslide" src="'+Pic[activeImage][0]+'"></div>');
}

function initSlideShow(in_StartImage, in_RunSlideShow) {
 
 if (inited) return;
 
 inited=true; 

 if (in_StartImage==-1)
   activeImage=_selectRandomPic();
  else
   activeImage=in_StartImage;

 activeCanvas=document.getElementById('canvas1');
 otherCanvas=document.getElementById('canvas0'); 
 toFrontCanvas=activeCanvas;	
 //choose the corect crossfade function
 crossfadeFunc='';
 if (domBrowser) {
    if (activeCanvas.filters&&activeCanvas.filters[0]) { //IE
		  opacity100=true;
		  opacityDegree=100;
      if (typeof activeCanvas.filters[0].opacity=="number") //if IE6+
        crossfadeFunc='_ieCrossfade()';
       else //else if IE5.5-
        crossfadeFunc='_oldieCrossfade()';
      }
     else {
		  opacityDegree=1.0; 
		  if (activeCanvas.style.opacity) {  //CSS3
        if (activeCanvas.style.MozOpacity) {//it's Mozilla or Firefox, but Mozilla flickers in _css3Crossfade better to use_mozillaCrossfade
				  var l_TmpStr=navigator.userAgent;
					var l_Pos=l_TmpStr.indexOf('rv:');
					crossfadeFunc='_mozillaCrossfade()';
					if (l_Pos!=-1) {
					  l_TmpStr=l_TmpStr.substring(l_Pos+3,l_TmpStr.length-1);
						if (parseFloat(l_TmpStr)>=1.8)
						  crossfadeFunc='_css3Crossfade()'; //It's Firefox 2 or better
						}	
				  }
				else	
  			 crossfadeFunc='_css3Crossfade()';
				}
       else if (activeCanvas.style.MozOpacity) //older Mozilla
        crossfadeFunc='_mozillaCrossfade()';
       else if (activeCanvas.style.KhtmlOpacity) //Konqueror
        crossfadeFunc='_konquerorCrossfade()';
			}	
   }
	 
 //alert(crossfadeFunc); //for debugging
 //show first image	 
 _populateImage(Pic[activeImage][0],Pic[activeImage][1],activeImage);
 if (domBrowser) _setOpacity(activeCanvas,100);
	 
 if (in_RunSlideShow) 
   runSlideShow();
 _preloadSlideShow();
}

function runSlideShow() {
// alert('run'); //for debugging
 if (timerSet!=true) {
   slideshowTimer = setInterval('_slideImage()', slideShowSpeed);
   timerSet = true;
	 }
}

function stopSlideShow() {
 var l_AferCheck = (timerSet) && (crossfadeFunc!='') && ( (opacity100&&(opacityDegree<100)) || (!opacity100 && (opacityDegree<1)) );
 _doStopSlideShow();
 //check if correct covermap is used 
 if (l_AferCheck && (activeImageMap!=Pic[activeImage][1])) //the slideshow was stopped in the middle of crossfade, there's a chance a wrong map is used
   _populateImage(preLoad[activeImage].src,Pic[activeImage][1],-1);
}

function showImage(in_ImageSrc, in_ImageMap) {
 var picCount;
 var i=0;

 picCount = Pic.length;
 //search for picture in the list
 while ((i < picCount)&&(in_ImageSrc!=Pic[i][0])) i++;

 _doStopSlideShow();
 if (i < picCount) _populateImage(in_ImageSrc, in_ImageMap, i);
  else _populateImage(in_ImageSrc, in_ImageMap, -1);
}

function showImageByIndex(in_ImageIndex) {
 _doStopSlideShow();
 _populateImage(Pic[in_ImageIndex][0],Pic[in_ImageIndex][1],in_ImageIndex); 
}

function picRefresh() {
 var l_Started = (timerSet!=undefined);
 if (l_Started)
   stopSlideShow();
 preLoad=new Array();
  _preloadSlideShow(); 
 activeImage=Pic.length-1;	
 if (l_Started)
   runSlideShow();
}

function _doStopSlideShow() {
 if (timerSet) {
   clearInterval(slideshowTimer);
   timerSet = false;
	 if (opacity100) {
     if (opacityDegree!=100) { //make sure the active image is fully opaque
 	     opacityDegree=100;	
       _setOpacity(activeCanvas,100);
       _setOpacity(otherCanvas,0);
	     }
     }
	  else {
     if (opacityDegree!=1) { //make sure the active image is fully opaque
 	     opacityDegree=1;	
       _setOpacity(activeCanvas,100);
       _setOpacity(otherCanvas,0);
	     }
	   }
   }	 	 
}

function _populateImage(in_ImageSrc, in_ImageMap, in_ImageIndex) {

 if (domBrowser)
   _setImageINNERHTML(in_ImageSrc, in_ImageMap);
	else {
   //old browser handling	 
	 document["defaultslide"].src = in_ImageSrc;
	 document["defaultslide"].map = in_ImageMap;
	 } 
 if (in_ImageIndex!=-1)
   activeImage=in_ImageIndex;
}

function _setImageINNERHTML(in_ImageSrc, in_ImageMap) {
 var l_Html;
 l_Html='<img src="'+in_ImageSrc+'" BORDER="0';
 if ((in_ImageMap!=undefined)&&(in_ImageMap!='')) {
   l_Html=l_Html+'" USEMAP="'+in_ImageMap;
	 activeImageMap=in_ImageMap;
	 }
	else
	 activeImageMap=''; 
 l_Html=l_Html+'">';	  
 activeCanvas.innerHTML=l_Html;
}

function _selectRandomPic() {
//selects a random number of a picture from the allowed list
 var allowedCount;
 var randPool = new Array();
 var poolPos = 0;
 
 allowedCount = Pic.length;
 //check the flags and remember what numbers can be selected by random
 for (i = 0; i < allowedCount; i++) {
   if (Pic[i][2]) {
		 randPool[poolPos] = i;
		 poolPos++;
		 };
   }
 if (poolPos>0)
   return randPool[parseInt(Math.random()*(poolPos))];
  else
   return 0;
}

function _preloadSlideShow() {
 var picCount;
 picCount = Pic.length;
 //preload images
 for (i = 0; i < picCount; i++) {
   preLoad[i] = new Image();
   preLoad[i].src = Pic[i][0];
	 //change undefined maps to empty ones
	 if ((Pic[i][1])==undefined) (Pic[i][1])='';
   }
}

function _css3Crossfade() {
 opacityDegree+=opacityDegreeDelta;
 if (opacityDegree>=innerMapSwapOpacityDegree) {//check if map should be changed
   _setImageINNERHTML(preLoad[activeImage].src,(Pic[activeImage][1]));
	 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach
	 }
 if (opacityDegree<1) {
   if (opacityDegree-opacityUsed>=0.01) {//repeaint only if change by 1% happened at least
	   opacityUsed=opacityDegree;
  	 activeCanvas.style.opacity=opacityDegree;
		 }
	 }
  else {
	 opacityDegree=1;
	 activeCanvas.style.opacity=opacityDegree;
	 otherCanvas.style.opacity=0;
   clearInterval(slideshowTimer);
   slideshowTimer=setInterval("_slideImage()",slideShowSpeed);
	 }
}

function _mozillaCrossfade() {
 opacityDegree+=opacityDegreeDelta;
 if (opacityDegree>=innerMapSwapOpacityDegree) {//check if map should be changed
   _setImageINNERHTML(preLoad[activeImage].src,(Pic[activeImage][1]));
	 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach
	 }
 if (opacityDegree<1) {
//	 alert('Used:'+opacityUsed+'Set:'+opacityDegree);
   if (opacityDegree-opacityUsed>=0.01) {//repeaint only if change by 1% happened at least
	   opacityUsed=opacityDegree;
  	 activeCanvas.style.MozOpacity=opacityDegree;
		 }
	 }
  else {
	 opacityDegree=1;
	 opacityUsed=0.9999;
	 activeCanvas.style.MozOpacity=opacityUsed;
	 otherCanvas.style.MozOpacity=0;
   clearInterval(slideshowTimer);
   slideshowTimer=setInterval("_slideImage()",slideShowSpeed);
	 }
}

function _konquerorCrossfade() {
 opacityDegree+=opacityDegreeDelta;
 if (opacityDegree>=innerMapSwapOpacityDegree) {//check if map should be changed
   _setImageINNERHTML(preLoad[activeImage].src,(Pic[activeImage][1]));
	 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach
	 }
 if (opacityDegree<1) 
   if (opacityDegree-opacityUsed>=0.01) {//repeaint only if change by 1% happened at least
	   opacityUsed=opacityDegree;
  	 activeCanvas.style.KhtmlOpacity=opacityDegree;
		 }
  else {
	 opacityDegree=1;
	 opacityUsed=1;
	 activeCanvas.style.KhtmlOpacity=opacityDegree;
	 otherCanvas.style.KhtmlOpacity=0;
   clearInterval(slideshowTimer);
   slideshowTimer=setInterval("_slideImage()",slideShowSpeed);
	 }
}

function _ieCrossfade() {
 opacityDegree+=opacityDegreeDelta;
 if (opacityDegree>=innerMapSwapOpacityDegree) {//check if map should be changed
   _setImageINNERHTML(preLoad[activeImage].src,(Pic[activeImage][1]));
	 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach
	 }
 if (opacityDegree<100) {
   if (opacityDegree-opacityUsed>=1) {//repeaint only if change by 1% happened at least
	   opacityUsed=Math.floor(opacityDegree);
 	   activeCanvas.filters[0].opacity=opacityUsed;
	   }
   }		 
  else {
	 opacityDegree=100;
	 opacityUsed=100;
	 activeCanvas.filters[0].opacity=opacityDegree;
	 otherCanvas.filters[0].opacity=0;
   clearInterval(slideshowTimer);
   slideshowTimer=setInterval("_slideImage()",slideShowSpeed);
	 }
}

function _oldieCrossfade() {
 opacityDegree+=opacityDegreeDelta;
 if (opacityDegree>=innerMapSwapOpacityDegree) {//check if map should be changed
   _setImageINNERHTML(preLoad[activeImage].src,(Pic[activeImage][1]));
	 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach
	 }
 if (opacityDegree<100) { 
   if (opacityDegree-opacityUsed>=1) {//repeaint only if change by 1% happened at least
	   opacityUsed=Math.floor(opacityDegree);
	   activeCanvas.style.filter="alpha(opacity="+opacityDegree+")";
		 }
	 }	 
  else {
	 opacityDegree=100;
	 opacityUsed=100;
	 activeCanvas.style.filter="alpha(opacity="+opacityDegree+")";
	 otherCanvas.style.filter="alpha(opacity=0)";
   clearInterval(slideshowTimer);
   slideshowTimer=setInterval("_slideImage()",slideShowSpeed);
	 }
}

function _setOpacity(in_obj, in_opacity) {
  if (in_obj.filters&&in_obj.filters[0]){
    if (typeof in_obj.filters[0].opacity=="number") //if IE6+
      in_obj.filters[0].opacity=in_opacity;
     else //else if IE5.5-
      in_obj.style.filter="alpha(opacity="+in_opacity+")";
		opacityUsed=in_opacity;	
    }
   else if (in_obj.style.opacity) {
	  opacityUsed=in_opacity/100;
    in_obj.style.opacity=opacityUsed;
		}
   else if (in_obj.style.MozOpacity) {
	  opacityUsed=in_opacity/101;
    in_obj.style.MozOpacity=opacityUsed; //101 is to prevent flickering in older Mozilla versions, the new ones should be handles by the previous if anyway
		}
   else if (in_obj.style.KhtmlOpacity) {
	  opacityUsed=in_opacity/100;
    in_obj.style.KhtmlOpacity=opacityUsed;
		}
}

function _slideImage() {
 var l_tempCanvas;
 var l_mapToUse;

 activeImage = (activeImage < Pic.length - 1)? activeImage+1: 0;
// alert('Sliding'); //for debugging
 if (domBrowser)  { //modern browsers
   l_tempCanvas=activeCanvas;
   activeCanvas=otherCanvas;
   otherCanvas=l_tempCanvas;
   if (crossfadeFunc=='' || crossFadeDuration==0) { //transparency not supported by the browser
	   //just swaping canvases
     _setImageINNERHTML(preLoad[activeImage].src,Pic[activeImage][1]);
		 if (activeCanvas==toFrontCanvas) 
       activeCanvas.style.zIndex++;
			else 
       activeCanvas.style.zIndex--;
		 if (crossfadeFunc!='') //instant swaping while opacity supported, ensure proper transparency 
		   {
		   _setOpacity(otherCanvas,0);
		   _setOpacity(activeCanvas,100);
			 }
		 }
		else { //crossfading 
     l_mapToUse=activeImageMap; //remember the used map 
     //change image
     opacityDegreeDelta=((100-startOpacityDegree)*40)/crossFadeDuration;
     opacityDegree=startOpacityDegree;
     //set map change border value
		 if (l_mapToUse!=Pic[activeImage][1]) {//map change must happen sometimes
       if (startOpacityDegree>=mapSwapOpacityDegree) { //check if map should be changed now
         l_mapToUse=Pic[activeImage][1];
				 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach
				 }
				else //change during crossfade
				 innerMapSwapOpacityDegree=mapSwapOpacityDegree;
			 }
			else 	  
			 innerMapSwapOpacityDegree=200; //a value opacity degree can never reach

		 if (!opacity100) { //non IE Browsers use interval <0..1>
		   opacityDegreeDelta/=100;
		   opacityDegree/=100;
			 innerMapSwapOpacityDegree/=100;
		   }
			 
     _setOpacity(activeCanvas,startOpacityDegree);
     _setImageINNERHTML(preLoad[activeImage].src,l_mapToUse); 
     activeCanvas.style.zIndex++;
     clearInterval(slideshowTimer);
     slideshowTimer=setInterval(crossfadeFunc,40);
		 }
	 }
	else
	 _populateImage(preLoad[activeImage].src,(Pic[activeImage][1]),activeImage); 	
}

