var docwidth, docheight;
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 sp = path.split('\\');
    sp = sp[sp.length-1].split('/');
    return sp[sp.length-1];
}
function DirName(path)
{   // finds derectory name in complete path
    return path.substring(0, path.length-FileName(path).length);
}
function ReadableFileName(path)
{   // file name without extension and removed '_'
    var fn = FileName(path);
    var pos=fn.lastIndexOf('.');
    if(pos>0)
        fn=fn.substring(0, pos);
    return fn.replace(/_/g, " ");
}
function TimeTick()
{   // calls OnTick each timerTick
	OnTick();
	setTimeout("TimeTick()", timerTick);
}
function GetWindowSize()
{   // sets document width and height
    //opera Netscape 6 Netscape 4x Mozilla 
    if (window.innerWidth)
    { 
        docwidth = window.innerWidth; 
        docheight = window.innerHeight; 
    } 
    //IE Mozilla 
    if (document.body.clientWidth)
    { 
        docwidth = document.body.clientWidth; 
        docheight = document.body.clientHeight; 
    } 
}
// resizable slide show class
var slideShowNode='slideShow';
var slideShowParentNode='slideShow_holder';
var slideShowCaptionNode='slideShow_caption';
var lastSelectedImg=null;
var slideDirection=1;
var slideIndex=-1;
var imageArrayIndex=0;
var singleImageName="";
var slideTimeLeft=0;         // number of milliseconds left till next OnTick call
var slidePeriod=20000; // period of slide show
var previewArray=new Array();
function OnLoadPageWithSlides(slideInd, widthFraction, maxWidth)
{   // all pages with slide shows have to start timer, specify initial slide show index, and set slide fields
    SetSlideShowFields(widthFraction, maxWidth);
    setTimeout("StartDelayLoad()", 500);
    imageArrayIndex=slideInd;
    TimeTick();
}
function StartDelayLoad()
{
	for(var i=0; i<previewArray.length; i++)
	{
	    var fileName=previewArray[i];
	    var el=Element(FileName(fileName));
        if(el) { el.src=fileName+".jpg"; }
	}
}
function SetSingleImage(imgName)
{   
	if(!slideImagesArray)
	    return;
	var dname=DirName(imgName);
	imageArrayIndex=-1;
	for(var i=0; i<slideImagesArray.length; i++)
	    if(DirName(slideImagesArray[i][0])==dname)
	        imageArrayIndex=i;
	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;
	    SetSlidePeriod(15000);
	}
	if(slideIndex<0)
	    imageArrayIndex=-1;
    if(!SetSlideImage(imgName))
        LoadSlideHost(imageArrayIndex, slideIndex, imgName);
}
function LoadSlideHost(imageArrayIndex, slideIndex, imgName) { }
function SetNodeSize(nodeName, widthFraction, maxWidth, ratio)
{   // sets node width to a fraction of document width (width - %) and node height to a fraction of node width (ratio - %)
    var element=Element(nodeName);
    if(element==null)
        return;
    var w=docwidth*widthFraction/100;
    if(maxWidth && w>maxWidth)
        w=maxWidth;
    element.style.width=w;
    if(ratio)
        element.style.height=ToNumber(element.style.width)*ratio/100;
}
function SetSlideShowFields(widthFraction, maxWidth)
{   // sets width of slide show to a fraction (width - %) of document width
    GetWindowSize();
    //SetNodeSize(slideShowParentNode, widthFraction, maxWidth, 75);    // fits 4:3 picture
    SetNodeSize(slideShowParentNode, widthFraction, maxWidth, 72);    // middle ground
    //SetNodeSize(slideShowParentNode, widthFraction, maxWidth, 67);    // fits 3:2 picture
    ScaleSlide();
}
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()
{
    var w=ScaleImage(slideShowNode);
	if(w<0)
	    return;
	var captionElement=Element(slideShowCaptionNode);
	if(captionElement!=null)
	    captionElement.style.width=w+4; // 4 to account for border width
}
function DelayValidatedSingleImage(imgName, delay)
{   // calls SetSlideImage only if imgName is the same longer than delay
	lastSelectedImg=imgName;    // sels last image for validation at call time
	setTimeout("ValidatedSingleImage('"+imgName+"')", delay);
}
function ValidatedSingleImage(imgName)
{   
    if(imgName==lastSelectedImg)    // eliminates image resetting if mouce moves fast over control area
	    SetSingleImage(imgName); 
}
function SetSlideImage(imgName)
{   // sets image of slideShowNode
	var el=Element(slideShowNode);
	if(el==null)
	    return false;
    try
    {
	    el.filters(0).Apply();
	    el.src=imgName+".jpg";
        el.filters(0).Play();
	}
	catch(ex)
	{
	    el.src=imgName+".jpg";
	}
	var captionElement=Element(slideShowCaptionNode);
	if(captionElement!=null)
	    captionElement.innerHTML="<center>"+ReadableFileName(imgName)+"</center>";
	return true;
}
function OnTick()
{
	slideTimeLeft-=timerTick;
	if(slideTimeLeft>=0)
	    return;
	slideTimeLeft=slidePeriod;
    ShowNextSlide();
}
function ShowNextSlide()
{   // finds next file of the slide show and calls SetSlideImage
    if(imageArrayIndex<0 || imageArrayIndex>=slideImagesArray.length)
        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]);
	SetSlideImage(imageName);
}
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=-slideDirection;
    ShowNextSlide();	
}
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(name, location, height, previewSuffix, previewSubdir)
{
	var elName=previewSuffix ? name+previewSuffix : name;   // preview image element name
	var imageName=location+"/"+name;
	var previewImageName=previewSubdir ? location+"/"+previewSubdir+"/"+elName : location+"/"+elName;
	previewArray.push(previewImageName);
	document.writeln("<IMG class=\"activeImg\" id=\""+elName+"\" name=\""+elName+"\" height='"+height+"' alt=\""+name+
	    "\" onclick=\"SetSingleImage('"+imageName+"')\" onmouseover=\"HighBorder('"+elName+"');DelayValidatedSingleImage('"+
	    imageName+"', 1500)\" onmouseout=\"NormalBorder('"+elName+"');lastSelectedImg=null\"/>");
}
