var timerTick=1000;     // interval of tick calls
// helper functions 
function MessageWindow(sender, message) 
{
	var msgWindow;
	if(msgWindow==null)
	{
		msgWindow=window.open("","MessageWindow","menubar=no, scrollbars=yes, status=yes, width=500, height=200, resizable")
		msgWindow.document.write("<head><title>MessageWindow</title></head>")
	}
	msgWindow.document.write(sender+"&nbsp;-&gt;&nbsp;&nbsp;"+message+"<br>");
    msgWindow.scroll(0, 2000);
	msgWindow.focus();
}
function FindObj(n, doc) 
{ 
	if(!doc)
	    doc=document; 
	var x=doc[n]; 
	if(!x && document.all) 
		x=document.all[n];  
	for(var i=0; !x && i<document.forms.length; i++) 
		x=document.forms[i][n];
	for(i=0; !x && document.layers && i<document.layers.length; i++) 
		x=FindObj(n, document.layers[i].document); 
	return x;
}
function Element(n)
{
    if(!n)
        return null;
	var rb=document.getElementById(n);
	if(rb==null)
	    rb= FindObj(n);
	return rb;
}  
function ToNumber(val)
{   // convert value with units to plain number
    for(var i=0; i<val.length; i++)
    {
        var code=val.charCodeAt(i);
        if(code!=46 && (code<48 || code>57))
        {
            val=val.substring(0,i);
            return val;
        }
    }
    return val;
}
function FileName(path)
{   // finds file name in complete path
    var pos=path.lastIndexOf('\\');
    var fn=path;
    if(pos>0)
        fn=path.substring(pos+1);
    pos=fn.lastIndexOf('/');
    if(pos>0)
        return fn.substring(pos+1);
    return fn;
}
function DirName(path)
{   // finds derectory name in complete path
    return path.substring(0, path.length-FileName(path).length-1);
}
function ReadableFileName(path)
{   // file name without extension and '_' replaced by ' '
    var fn = FileName(path);
    var pos=fn.lastIndexOf('.');
    if(pos>0)
        fn=fn.substring(0, pos);
    return fn.replace(/_/g, " ");
}
function FileNameWithoutExtension(path)
{   // finds file name without extension in complete path
    var n=FileName(path);
    var pos=n.lastIndexOf(".");
    if(pos>0)
        return n.substring(0, pos);
    return n;
}
function FileExtension(path)
{   // finds file extension in complete path
    var pos=path.lastIndexOf(".");
    if(pos>0)
        return path.substring(pos);
    return "";
}
function TimeTick()
{   // calls OnTick each timerTick
	setInterval("OnTick()", timerTick);
}

// slide show for pages containing both slide host and previews
function OnLoadPageWithSlides(slideInd, sizeFraction, maxSize, heightSelector)
{   
    slideHostDocument=document;
    SetSlideShowFields(sizeFraction, maxSize, heightSelector);
    OnLoadPreviewPage(slideInd);
}

// slide show host class (functions cslled from show host page)
function SetSlideShowFields(sizeFraction, maxSize, heightSelector)
{   // called from within slide host; sets width of slide show to a fraction (width - %) of document width
    SetNodeSize(slideHostParentNode, sizeFraction, maxSize, heightSelector); 
    ScaleSlide();
}
function SetNodeSize(nodeName, sizeFraction, maxSize, heightSelector)
{   // sets node width to a fraction of document width, %
    var element=Element(nodeName);
    if(element==null)
        return;
    var docwidth, docheight;
    if(document.body.clientWidth)
    { // IE
        docwidth = document.body.clientWidth; 
        docheight = document.body.clientHeight; 
    } 
    if (window.innerWidth)
    { //opera Netscape 6 Netscape 4x Mozilla 
        docwidth = window.innerWidth; 
        docheight = window.innerHeight; 
    }
    var w=docwidth*sizeFraction/100;
    if(maxSize && w>maxSize)
        w=maxSize;
    element.style.width=w;
    if(heightSelector==null)
        heightSelector=0; // if heightSelector >0 it is treated as height/width ratio in %
    if(heightSelector && heightSelector>0) // ratio 75 fits 4:3 slideImages; 67 fits 3:2 slideImages
        element.style.height=ToNumber(element.style.width)*heightSelector/100;
    else                    // height limited by doc height
    {
        var h=docheight*sizeFraction/100+heightSelector;
        if(maxSize && h>maxSize)
            h=maxSize;
        element.style.height=h;
    }
}
function ScaleImage(callerName)
{   // reduces image of the caller element to fit parent element dimensions
    var caller=Element(callerName);
    if(caller==null || caller.src==null || caller.src.length==0)
        return -1;
    var par=caller.parentNode;
    if(par==null || par.style==null)
        return -1;
    var w=ToNumber(par.style.width);
    var h=ToNumber(par.style.height);
	caller.style.visibility='hidden';
	var im=new Image();
	im.src = caller.src;
	var zoomX=w/im.width;
	var zoomY=h/im.height;
	var scale=1;
	if(scale>zoomX)
		scale=zoomX;
	if(scale>zoomY)
		scale=zoomY;
	caller.width=scale*im.width;
	//caller.height=scale*im.height;
	caller.style.visibility='visible';
	return caller.width;
}
function ScaleSlide()
{   // called by onload event of slide show node (from LoadSlideImage)
    var w=ScaleImage(slideHostNode);
	if(w<0)
	    return;
	var captionElement=Element(slideHostCaptionNode);
	if(captionElement!=null)
	    captionElement.style.width=w+4; // 4 to account for border width
}

// slide show preview class (functions cslled from show preview page)
var slideHostDocument;
var slideHostNode='slideShow';
var slideHostParentNode='slideShow_holder';
var slideHostCaptionNode='slideShow_caption';
var lastSelectedImg=null;       // last selected img to support hover delay
var slideDirection=1;           // 1 - forward; -1 - backward
var slideIndex=-1;              // indes of current slide in the show
var imageArrayIndex=0;          // slide show index 
var slideTimeLeft=0;            // number of milliseconds left till next slide
var singleImageTime=15000;      // time to show single image before switching
var slidePeriod=singleImageTime;// initial period of slide show
var hoverDelay=1500;            // delay in ms before hover activates image
var previewArray=new Array();   // list of images on preview page
var previewElementPrefix="el_";
var previewSuffix="";           // suffix of preview image name
function LoadSlideHost(imageArrayIndex, slideIndex, imgName) { return document; }
function IsSlideHostOpened()
{
    if(slideHostDocument==null)
        return false;
    try
    {
        var el=slideHostDocument.getElementById(slideHostNode);
        if(el==null)
            return false;           // checks if correct page displayed in slide host window
        var slideWindow=slideHostDocument.parentWindow;
        return slideWindow!=null && !slideWindow.closed; // checks if slide host window opened
    }
    catch(ex)
    {
        slideHostDocument=null;
        return false;
    }
}
function OnLoadPreviewPage(slideInd)
{   // pages with slide previews start timer and specify initial slide show index
    setTimeout("LoadPreviews()", 500);
    imageArrayIndex=slideInd;
    TimeTick();
}
function LoadPreviews()
{
	for(var i=0; i<previewArray.length; i++)
	{
	    var fileName=previewArray[i];
	    var elName=previewElementPrefix+FileNameWithoutExtension(fileName);
	    if(previewSuffix!=null && previewSuffix.length>0)
	        elName=elName.replace(previewSuffix, "");
	    var el=Element(elName);
        if(el) { el.src=fileName; }
	}
}
function SetSingleImage(imgName)
{   // sets slide show parameters from the single image name
	if(!slideImagesArray)
	    return;
	var dname=DirName(imgName);
	imageArrayIndex=-1;
	for(var i=0; i<slideImagesArray.length; i++)
	    if(slideImagesArray[i].length>0 && DirName(slideImagesArray[i][0])==dname)
	    {
	        imageArrayIndex=i;
	        break;
	    }
	if(imageArrayIndex>=0)
	{
	    var fname=FileName(imgName);
        var slideImages=slideImagesArray[imageArrayIndex];
        slideIndex=-1;
	    for(i=0; i<slideImages.length; i++)
	        if(FileName(slideImages[i])==fname)
	        {
	            slideIndex=i;
	            break;
	        }
	    SetSlidePeriod(singleImageTime);
	}
	if(slideIndex<0)
	    imageArrayIndex=-1;
	if(IsSlideHostOpened())
        LoadSlideImage(imgName, true);
	else
	    slideHostDocument=LoadSlideHost(imageArrayIndex, slideIndex, imgName);
}
function DelayValidatedSingleImage(imgName)
{   // shows new image only if imgName is the same longer than hoverDelay
	lastSelectedImg=imgName;    // sels last image for validation at call time
	setTimeout("ValidatedSingleImage('"+imgName+"')", hoverDelay);
}
function ValidatedSingleImage(imgName)
{   
    if(imgName==lastSelectedImg)    // eliminates image resetting if mouce moves fast over control area
	    SetSingleImage(imgName); 
}
function LoadSlideImage(imageName, focus)
{   // sets image of slideHostNode
    try
    {
        if(slideHostDocument==null)
            return false;
	    var el=slideHostDocument.getElementById(slideHostNode);
	    if(el==null)
	        return false;
	    try
	    {
	        el.filters(0).Apply();
	        el.src=imageName;
            el.filters(0).Play();
        }
	    catch(ex)
		{
		    el.src=imageName;
		}
	    if(focus)
            slideHostDocument.parentWindow.focus();
	    var captionElement=slideHostDocument.getElementById(slideHostCaptionNode);
	    if(captionElement!=null)
	        captionElement.innerHTML="<center>"+ReadableFileName(imageName)+"</center>";
	    return true;
	}
	catch(ex1) { return false; }
}
function OnTick()
{   // called by timer each timer tick
	slideTimeLeft-=timerTick;
	if(slideTimeLeft>=0)
	    return;
	slideTimeLeft=slidePeriod;
    ShowNextSlide();
}
function ShowNextSlide()
{   // finds next file of the slide show and show it
    if(imageArrayIndex<0 || imageArrayIndex>=slideImagesArray.length)
        return;
    if(!IsSlideHostOpened())
        return;
    var slideImages=slideImagesArray[imageArrayIndex];
	slideIndex+=slideDirection;
	if(slideDirection<0)
	    slideDirection=1;
	if(slideIndex>=slideImages.length)
		slideIndex-=slideImages.length;
	if(slideIndex<0)
		slideIndex+=slideImages.length;
    var dir=DirName(slideImages[0]);
	var imageName=dir+'/'+FileName(slideImages[slideIndex]);
	LoadSlideImage(imageName, false);
}
function RunSlides(imageArrayInd, period)
{
    if(imageArrayInd<0 || imageArrayInd>=slideImagesArray.length)
        return;
    imageArrayIndex=imageArrayInd;
    var slideImages=slideImagesArray[imageArrayIndex];
    if(slideImages.length<=0)
        return;
    slideDirection=1;
    slidePeriod=period;
    slideTimeLeft=slidePeriod;
    slideIndex=0;
	if(IsSlideHostOpened())
        LoadSlideImage(slideImages[slideIndex], true);
	else
	    slideHostDocument=LoadSlideHost(imageArrayIndex, slideIndex, slideImages[slideIndex]);
}
function SetSlidePeriod(period) { slideTimeLeft=period; slidePeriod=period; }
function ForwardSlides()        { slideDirection=1; slideTimeLeft=0; }
function BackwardSlides()       { slideDirection=-1; slideTimeLeft=0; }
function HighBorder(name)
{
    var el=Element(name);
    if(el) { el.className="activeImghover"; }
}
function NormalBorder(name)
{
    var el=Element(name);
    if(el) { el.className="activeImg"; }
}
function PreviewImage(path, location, height, previewSuffix_, previewSubdir)
{   // writes preview image with click and hover capabilities
    previewSuffix=previewSuffix_;
	var name=FileNameWithoutExtension(path);
	var ext=FileExtension(path);
	var elName=previewElementPrefix+name; // preview image element name
	var pn=previewSuffix ? name+previewSuffix : name; // preview image name
	var imageName=location+"/"+name+ext;
	var previewImageDir=previewSubdir ? location+"/"+previewSubdir : location;
	previewArray.push(previewImageDir+"/"+pn+ext);
	return "<img class='activeImg' id='"+elName+"' name='"+elName+"' height='"+height+"' src='' alt='"+name+
	    "' onclick=\"SetSingleImage('"+imageName+"')\" onmouseover=\"HighBorder('"+elName+"');DelayValidatedSingleImage('"+
	    imageName+"')\" onmouseout=\"NormalBorder('"+elName+"');lastSelectedImg=null\" />";
}

