var image_loaded =      false;
var image_height =      0;
var image_width =       0;

var slide_delay =       200;  // milliseconds
var slide_time =        0;
var slide_current =     0;
var slide_current_url = '';
var slide_height =      260;
var slide_width =       260;
var slide_first =       true;
var slide_caption =     false;

var fade_run =          false;
var fade_direction =    0;
var fade_time =         0;
var fade_time_offset =  0;
var fade_begin =        0;
var fade_change =       100;
var fade_duration =     200;
var fade_element =      null;
var fade_timer =        null;

var capt_run =          false;
var capt_time =         0;
var capt_time_offset =  0;
var capt_begin =        slide_height;
var capt_change =       0;
var capt_duration =     50;
var capt_element =      null;
var capt_timer =        null;

var pan_run =           false;
var pan_direction =     0;
var pan_time =          0;
var pan_time_offset =   0;
var pan_begin =         0;
var pan_change =        0;
var pan_duration =      400;
var pan_timer =         null;
var pan_threshold_x =   32;
var pan_threshold_y =   32;

var win_obj_ref;

function OpenLink(uri, target) {

    if(win_obj_ref == null || win_obj_ref.closed) {
        win_obj_ref = window.open(uri, target, "titlebar=yes,menubar=yes,toolbar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes");
    }
    else {
        if(win_obj_ref.focus) {
            win_obj_ref.focus();
        }
    }

}

function Preload(load_image) {

    var img = new Image();
    img.name = load_image;
    
    if (document.addEventListener) {
        img.addEventListener('load', function(){
            image_loaded = true; 
            image_height = this.height; 
            image_width = this.width;
        }, false);
        img.addEventListener('error', function(){
            // Get next slide
            slide_current++;
            if (slide_current > slide.length - 1) {
                slide_current = 0;
            }
            Preload(slide[slide_current][0]);
        }, false);
    } else if (document.attachEvent) {
        img.attachEvent('onload', function(){
            image_loaded = true; 
            image_height = img.height;
            image_width = img.width;
        }, false);
        img.attachEvent('onerror', function(){
            // Get next slide
            slide_current++;
            if (slide_current > slide.length - 1) {
                slide_current = 0;
            }
            Preload(slide[slide_current][0]);
        }, false);
    }
  
    img.src = image_base + load_image;

}

function InitSlideshow() {

    Preload(slide[0][0]);
    
    // Get elements
    capt_element = document.getElementById('caption');
    text_element = document.getElementById('caption-text');
    fade_element = document.getElementById('slide');
 
    // Attach OnClick event
    if (document.addEventListener) {
        fade_element.addEventListener('click', function(){
            if (slide_current_url != '') {
                OpenLink(slide_current_url,'_blank');
            }
        }, false);
    } else if (document.attachEvent) {
        fade_element.attachEvent('onclick', function(){
            if (slide_current_url != '') {
                OpenLink(slide_current_url,'_blank');
            }
        }, false);
    } 
 
    // 0% opacity
    SetOpacity(fade_element,0);
    
    // Start
    slide_time = slide_delay;
    slide_timer = setInterval("SlideShowController();", 15);
    
    //IE6 Wait cursor flicker bug
    try {
        document.execCommand("BackgroundImageCache", false, true);
    } catch(err) {};

}

function SetOpacity(obj,value) {

	obj.style.opacity = value/100;
	obj.style.filter = 'alpha(opacity=' + value + ')';

}

function SineInOut(t, b, c, d) {

	return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;

}

function NextSlide() {

    // Setup styles
    fade_element.style.backgroundImage = 'url(' + image_base + slide[slide_current][0] + ')';
    text_element.innerHTML = slide[slide_current][2];
        
    reset_x = 'center';
    reset_y = 'center';
    if (image_height > (slide_height + pan_threshold_y)) {
        reset_y = (slide_height - image_height) + 'px';
    } else {
        if (image_height < slide_height) {
            var capt_height_offset = 0;
            if (slide[slide_current][2] != '') {
                var capt_height = capt_element.offsetHeight;
                capt_height_offset = (capt_height) / 2;
            }
            var image_top = ((slide_height - image_height) / 2) - capt_height_offset;
            reset_y = image_top + 'px';
        }
    }
    if (image_width > (slide_width + pan_threshold_x)) {
        reset_x = (image_width - slide_width) + 'px';
    }
    if (image_height >= slide_height) {
        capt_element.style.backgroundImage = '';
    } else {
        capt_element.style.backgroundImage = 'url(/images/slideshow-caption-bg.gif)';
    }
    slide_current_url = slide[slide_current][1];
    if (slide_current_url != '') {
        fade_element.style.cursor = 'pointer';
    } else {
        fade_element.style.cursor = 'default';
    }
    fade_element.style.backgroundPosition = reset_x + ' ' + reset_y;
    
    //Temp
    //text_element.innerHTML = text_element.innerHTML + '<br><br>(width=' + image_width + ' | height=' + image_height + ')';
    //text_element.innerHTML = text_element.innerHTML + '<br><br>(ratio=' + (image_height/image_width) + ')';
   
    // Go
    BeginFade(1);
    
    
}

function BeginPan(d) {
    
    pan_time = 0;    
    pan_direction = d;
    
    if (d == 0) {
    
        // Vertical
        pan_change = image_height - slide_height;
        pan_begin = slide_height - image_height;
    
    }
    else {
    
        // Horizontal
        pan_change = slide_width - image_width;
        pan_begin = 0;        
    }
      
    pan_run = true;    
}

function DoPan(obj,d) {

	if (pan_time > pan_duration) {
		pan_run = false;
	} 
    else {
		var pan_offset = SineInOut(pan_time, pan_begin, pan_change, pan_duration);
        pan_offset = parseInt(pan_offset) + 'px';
        if (d == 0) {
            obj.style.backgroundPosition = '0 ' + pan_offset;
        }
        else {
            obj.style.backgroundPosition = pan_offset + ' 0';
        }
        pan_time++;
	}
	
}

function BeginFade(d) {

	// Reset time
	fade_time = 0;
	
	// Set starting points
	if (d == 0) {
	
        fade_begin =        100;
        fade_change =       -100;
        fade_run =          true;
        //if (slide_caption) {
        //   BeginCaption(0);
        //}
        
    } 
    else {
    
        fade_begin =        0;
        fade_change =       100;    
        fade_run =          true;    
        
        // Caption
        //if (slide[slide_current][2] != '') {
        //    setTimeout("BeginCaption(1);", 750);
        //    slide_caption = true;
        //}  
        //else {
        //    slide_caption = false;
        //}
        
        // Pan
        if (image_height > (slide_height + pan_threshold_x)) {
            BeginPan(0);
        }
        if (image_width > (slide_width + pan_threshold_y)) {
            BeginPan(1);
        }    
            
    }
    fade_direction = d;

}

function DoFade(obj,d) {

	if (fade_time > fade_duration) {

		fade_run = false;
		
        if (d == 0) {
           
            NextSlide();
            
        }
        else {

            // Reset timer
            slide_time = 0;
            
            // Get next slide
            slide_current++;
            if (slide_current > slide.length - 1) {
                slide_current = 0;
            }
            
            // Preload
            return Preload(slide[slide_current][0]);
            
        }
        
	}
	else {
	
		var fade_opacity = SineInOut(fade_time, fade_begin, fade_change, fade_duration);
		SetOpacity(obj,fade_opacity);
		fade_time++;
	} 
	
}

function BeginCaption(d) {

	// Reset time
	capt_time = 0;

    if (d == 0) {
        capt_change = capt_element.offsetHeight;
        capt_begin = slide_height - capt_change;
    } 
    else {
        capt_change = -capt_element.offsetHeight;
        capt_begin = slide_height;    
    }	

	capt_run = true;

}

function DoCaption(obj) {

	if (capt_time > capt_duration) {
		capt_run = false;
	} 
    else {
		var capt_top = SineInOut(capt_time, capt_begin, capt_change, capt_duration);
        capt_top = parseInt(capt_top) + 'px';
        obj.style.top = capt_top;
        capt_time++;
	}
	
}

function SlideShowController() {

    slide_time++;

    // New cycle
    if (slide_time >= slide_delay) {
        if (image_loaded) {
        image_loaded = false;
            if (slide_first) {
                slide_first = false;
                NextSlide();
            }
            else {
                BeginFade(0);
            }
        }
    }
    
    // Pan  
    if (pan_run) {
        DoPan(fade_element,pan_direction);
    }
    
    // Caption
    //if (capt_run) {    
    //    DoCaption(capt_element);
    //}
    
    // Fade
    if (fade_run) {    
        DoFade(fade_element,fade_direction);
    }
    
}