﻿// JScript File
var rootPath="";
try { rootPath=appRoot; } catch(e) { rootPath="/"; }
var targetFramerate = 42; //number of milliseconds between pixel movements
var targetTime = 500; //target fade time, in milliseconds
var targetImageDuration = 10000; //target time for each image to remain in view (overlaps above targetTime) -- deprecated
var targetPanSpeed = 150; //target number of pixels to pan over the time specified - 150
var height=215;  //target height in pixels
var width=520; //target width in pixels
var widthErrorTolerance = 5; //size in pixels that images may vary from the above given width
var heightErrorTolerance = 5; //size in pixels that images may vary from the above given height
var ssRounds = 100; //number of times to repeat cycle

var neededHeight = targetPanSpeed+height;
var neededWidth = targetPanSpeed+width;
var target;
var images = new Array();
var imagePaths = new Array();
var numOfImages = 0;
var numGoodImages = 0;
var loadedImages = 0;
var ss;
var currentImage = 0;
var lastImage = -1;
var drawingDefaultSlideshow = false;

function SetOpacity(elem, opacityAsInt)
{
	var opacityAsDecimal = opacityAsInt;
	
	if (opacityAsInt > 100)
		opacityAsInt = opacityAsDecimal = 100; 
	else if (opacityAsInt < 0)
		opacityAsInt = opacityAsDecimal = 0; 
	
	opacityAsDecimal /= 100;
	if (opacityAsInt < 1)
		opacityAsInt = 1; // IE7 bug, text smoothing cuts out if 0
	
	elem.style.opacity = opacityAsDecimal;
	elem.style.filter  = "alpha(opacity=" + opacityAsInt + ")";
}

function FadeOpacity(elemId, fromOpacity, toOpacity, time, fps)
{
    document.getElementById(elemId).style.display='block';
	var steps = Math.ceil(fps * (time / 1000));
	var delta = (toOpacity - fromOpacity) / steps;
	
	
	FadeOpacityStep(elemId, 0, steps, fromOpacity, delta, (time / steps));
}

function FadeOpacityStep(elemId, stepNum, steps, fromOpacity, delta, timePerStep)
{
    SetOpacity(document.getElementById(elemId), Math.round(parseInt(fromOpacity) + (delta * stepNum)));
    

    if (stepNum < steps)
        setTimeout("FadeOpacityStep('" + elemId + "', " + (stepNum+1) + ", " + steps + ", " + fromOpacity + ", " + delta + ", " + timePerStep + ");", timePerStep);
    else
    {
        if(document.getElementById(elemId).style.opacity=="0")
            document.getElementById(elemId).style.display='none';
        
    }
}

function panImage(elemID, directionLeft, directionTop)
{
    
    var currentTarget = document.getElementById(elemID);
    currentTarget.style.left=parseInt(currentTarget.style.left)+directionLeft+"px";
    currentTarget.style.top=parseInt(currentTarget.style.top)+directionTop+"px";
}

//pan('ssImage0',150,10000-500, 1, 1);
function pan(elemID, fps, time, directionLeft, directionTop)
{
    var currentTarget = document.getElementById(elemID);
    var ssPanDeltaLeft = parseInt(currentTarget.style.width) - width;
    var ssPanDeltaTop = parseInt(currentTarget.style.height) - height;
    var ssPanDelta;
    if(ssPanDeltaLeft<ssPanDeltaTop)
        ssPanDelta=ssPanDeltaLeft;
    else
        ssPanDelta=ssPanDeltaTop;
        
    
    
    if(parseInt(currentTarget.style.height)>=neededHeight && parseInt(currentTarget.style.width)>=neededWidth)
    {
        if(directionLeft>=0)
            currentTarget.style.left=-1*Math.abs((currentTarget.style.width.replace("px","")*1)-width)+"px";
        else
            currentTarget.style.left="0px";
        if(directionTop>=0)
            currentTarget.style.top=-1*Math.abs((currentTarget.style.height.replace("px","")*1)-height)+"px";
        else
            currentTarget.style.top="0px";
        
        //var rate = (time*1.0*Math.abs(directionLeft)/fps);
        
        for(i=0;i<ssPanDelta;i++)
        {
            setTimeout("panImage('"+elemID+"', "+directionLeft+", "+directionTop+");",(Math.abs(directionLeft)*targetFramerate)*i);
        }
    }
}

function resize(imgHeight, imgWidth)
{
    var newHeight = 0;
    var newWidth = 0;
    var ar = (height*1.0)/width;
    var iar = (imgHeight*1.0)/imgWidth;
    if(imgHeight > height || imgWidth > width)
    {
        if(iar > ar)
        { //too tall
            newHeight=height;
            newWidth = Math.round(((imgWidth)*(newHeight))/(imgHeight));
        }
        else
        { //too wide
            newWidth = width;
            newHeight = Math.round(((newWidth)*(imgHeight))/(imgWidth));
        }
    }
    else
    {
        newHeight=imgHeight;
        newWidth=imgWidth;
    }
    //alert(newHeight + " " + newWidth);
    
    return [newHeight, newWidth];
}

var ssCurrentSecondOffset=0;
var ssLastImage = -1;
function ssGenerateTimeouts()
{
    
    if(ssLastImage==-1 || numGoodImages>1)
        for(var i=0; i<numGoodImages;i++)
        {
            var ssCurrentImage = document.getElementById('ssImage'+i);
            var ssPanDeltaLeft = parseInt(ssCurrentImage.style.width) - width;
            var ssPanDeltaTop = parseInt(ssCurrentImage.style.height) - height;
            var ssPanDelta;
            if(ssPanDeltaLeft<ssPanDeltaTop)
                ssPanDelta=ssPanDeltaLeft;
            else
                ssPanDelta=ssPanDeltaTop;
                
            var ssCurrentImageTimeout = ssCurrentSecondOffset;
            //alert('ssPanDelta: '+ ssCurrentImage.style.width +'; scheduling fade at ' + ssCurrentImageTimeout);
            
            var ssCommandText = "";
            if(ssLastImage>=0)
                ssCommandText = "FadeOpacity('ssImage"+ ssLastImage +"', 100, 0, "+targetTime+", "+targetFramerate+"); "
            
            ssCommandText += " FadeOpacity('ssImage"+ i +"', 0, 100, "+targetTime+", "+targetFramerate+"); pan('ssImage"+i+"',"+targetPanSpeed+","+(targetImageDuration)+", "+Math.pow(-1,i%3)+", "+Math.pow(-1,i%5)+");";
            
            setTimeout(ssCommandText, ssCurrentImageTimeout);
            ssLastImage=i;
            ssCurrentSecondOffset=ssCurrentImageTimeout+(Math.round(ssPanDelta*targetFramerate));
        }
}


function writeSlideshow()
{
    
    if(numOfImages>0)
    {
        target.style.height=(height)+"px";
        target.style.width=(width)+"px";
        
        
        target.innerHTML="";
        for(i=0; i<numOfImages; i++) //numOfImages
        {
            if((Math.abs(images[i].width-width)<=widthErrorTolerance && Math.abs(images[i].height-height)<=heightErrorTolerance) || (images[i].width>=neededWidth && images[i].height>=neededHeight))
            {
                var newImg = document.createElement('img');
                newImg.style.position="absolute";
                newImg.style.left="0px";
                newImg.style.top="0px";
                newImg.style.opacity = 0.01;
	            newImg.style.filter  = "alpha(opacity=1)";
	            newImg.src=imagePaths[i];
	            newImg.style.width=images[i].width+"px";
	            newImg.style.height=images[i].height+"px";
                newImg.id="ssImage"+numGoodImages;
                newImg.style.display="none";
                target.appendChild(newImg); 
                numGoodImages++; 
            }
        }
        
        
        if(numGoodImages>0)
        {
            for(var i=1; i<=ssRounds; i++)
            {
                ssGenerateTimeouts();
            }
               
        }
        else
        {
            target.parentNode.style.display="none";
        }
    }
}

function parseSlideshow(xmldoc, isArray)
{
    if(isArray)
    {
        imagePaths=xmldoc;
    }
    else
    {
        var path = xmldoc.getElementsByTagName("album")[0].attributes[0].value;
        for(i=0; i<xmldoc.getElementsByTagName("img").length; i++)
        {
            imagePaths[i]=path+xmldoc.getElementsByTagName("img")[i].attributes[0].value;
        }
    }
    numOfImages = imagePaths.length;
    
    
    target.innerHTML="Loading Slideshow Images ... (<span id='ssImageLoadCount'>0</span>%)";
    for(i=0; i<numOfImages; i++)
    {
        //alert("loading " + imagePaths[i]);   
        images[i] = new Image();
        images[i].onload=function () {  loadedImages++; document.getElementById('ssImageLoadCount').innerHTML=Math.round(((loadedImages*1.0)/numOfImages)*100); if(loadedImages==numOfImages) { writeSlideshow(); }  };
        images[i].src=imagePaths[i];
    }
}


function getXmlDoc(txt)
{
    try //Internet Explorer
      {
          xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async="false";
          xmlDoc.loadXML(txt);
          return xmlDoc;
      }
    catch(e)
      {
          parser=new DOMParser();
          xmlDoc=parser.parseFromString(txt,"text/xml");
          return xmlDoc;
      }
}

function drawSlideshow(path)
{
    target = document.getElementById(slideshowDivID);
    
    if((typeof path)=="object")
    {
        if(path.length > 0)
            parseSlideshow(path, true);
        else
        {
            drawSlideshow([defaultSlideshowImageURL]); //reset with safe default
            return;
        }
    }
    else
    {
        
        var xmlhttp;
        if (window.XMLHttpRequest)
          {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
          }
        else if (window.ActiveXObject)
          {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
          
        //do it
        xmlhttp.onreadystatechange=function()
        {
            if(xmlhttp.readyState==4)
            {
                try
                {
                    parseSlideshow(getXmlDoc(xmlhttp.responseText), false);
                }
                catch(e)
                { 
                    if(!drawingDefaultSlideshow) //fixes an infinite loop issue on some pages
                    {
                        drawingDefaultSlideshow=true;
                        drawSlideshow([defaultSlideshowImageURL]); //reset with safe default 
                    }
                }
            }
        }
        xmlhttp.open("GET",rootPath+"gcr/images/config.aspx?path="+path,true);
        xmlhttp.send(null);
    }
}

