//var year = getURLParam("year")

src_prefix = "../../images/";

var index = {};
var cache = {};
var preloaded_count = 0;
var current = null;
var loading = [];
var show_once_loaded_src = null;
var last_direction = 1;

function make_index() {
	for (i in images) {
		var tmp = images[i];
		tmp.index = Number(i);
		index[tmp.src] = tmp;
	}
}

function preload(src) {
	if (!cache[src]) {
		var image = new Image();
		image.src = src_prefix + src;
		cache[src] = image;
		loading.push(src);
	}
}

function is_loaded(src) {
	return cache[src] && cache[src].complete;
}

function check_loaded() {
	if (loading.length > 0) {
		var new_loading = [];
		for (i=0; i<loading.length; i++) {
			var src = loading[i];
			if (!is_loaded(src)) {
				new_loading.push(src);

			} else {
				preloaded_count++;

				if (show_once_loaded_src == src) {
					set_loading(false);
					show(src);
					show_once_loaded_src = null;
				}
			}
		}
		loading = new_loading;
	}
	if (loading.length == 0 && preloaded_count < images.length) {
		preload_next();
	}
	setTimeout("check_loaded()", 200);
}

function preload_next() {
	var preload_index = current_index();
	while (is_loaded(images[preload_index].src)) {
		preload_index = (preload_index+last_direction) % images.length;
		if (preload_index < 0) preload_index = images.length - 1;
	}
	preload(images[preload_index].src);
}

function show(src) {
	var el = document.getElementById("ss_image");
	current = src;
	progress_update();
	//transition_normal(el, src);
	transition_fade(el, src);
}

function transition_normal(el, src) {
	set_image(el, src);
}

var current_effect = null;
var fade_up_id = null;
function transition_fade(el, src) {
	if (current_effect != null) {
		current_effect.cancel();
		current_effect = null;
	}
	if (fade_up_id != null) {
		clearTimeout(fade_up_id);
	}

	var trans = Effect.Transitions.linear;
	var duration = 0.5;
	var options = {to: 0, transition: trans, sync: true};
	current_effect = new Effect.Parallel([
		new Effect.Opacity("ss_image", options),
		new Effect.Opacity("name", options),
		new Effect.Opacity("agency", options),
		new Effect.Opacity("category", options),
		new Effect.Opacity("prize", options),
		new Effect.Opacity("caption", options)		
	], {
		trans: trans,
		duration: duration,
		afterFinish: function() {

			set_image(el, src);
			//to get round IE (again) not updating the image
			if (browser == "IE") {
				fade_up_id = setTimeout("fade_up()", 200);
			} else {
				fade_up();
			}
		}
	});
}

function fade_up() {
	var trans = Effect.Transitions.linear;
	var duration = 0.5;
	var options = {to: 1, transition: trans, sync: true};

	fade_up_id = null;
	current_effect = new Effect.Parallel([
		new Effect.Opacity("ss_image", options),
		new Effect.Opacity("name", options),
		new Effect.Opacity("agency", options),
		new Effect.Opacity("category", options),
		new Effect.Opacity("prize", options),
		new Effect.Opacity("caption", options)
	], {
		trans: trans,
		duration: duration,
		afterFinish: function() {
			current_effect = null;
		}
	});
}

function set_image(el, src) {
	var img = cache[src];
	el.style.width = img.width;
	el.style.height = img.height;
	el.src = src_prefix + src;
	//el.style.marginTop = "" + -img.height/2 + "px";
	update_details(src);
	aa_set_timeout();
}

function update_details(src) {
	var img = index[src];
	var el_originator = document.getElementById("name");
	var el_publisher = document.getElementById("agency");
	var el_category = document.getElementById("category");
	var el_prize = document.getElementById("prize");
	var el_caption = document.getElementById("caption");

	el_originator.innerHTML = img.originator.length==0? "&nbsp;": img.originator;
	el_publisher.innerHTML = img.publisher.length==0? "&nbsp;": img.publisher;
	el_category.innerHTML = img.category.length==0? "&nbsp;": img.category;
	el_prize.innerHTML = img.winning.length==0? "&nbsp;": img.winning;
	el_caption.innerHTML = img.caption.length==0? "&nbsp;": img.caption;
}

function progress_update() {
	var el_progress = document.getElementById("progress_text");
	el_progress.innerHTML =  (current_index()+1) + " out of " + images.length;

	var value = current_index() / images.length;

	var el_track =  document.getElementById("progress_track");
	var el_indicator =  document.getElementById("progress_indicator");

	el_indicator.style.width = el_track.offsetWidth * value;
}

function progress_click(event) {
	aa_stop();
	var el_track =  document.getElementById("progress_track");
	var pointer  = [Event.pointerX(event), Event.pointerY(event)];
	var offsets  = Position.cumulativeOffset(el_track);
	var value = (pointer[0] - offsets[0])/el_track.offsetWidth;
	var index = Math.floor(value * images.length);
	if (index < 0) index = 0;
	if (index >= images.length) index = images.length-1;
	display(images[index].src);
}

function set_loading(loading) {
	var el = document.getElementById("indicator");
	if (loading) {
		el.style.display = "block";
	} else {
		el.style.display = "none";
	}
}

function display(src) {
	if (is_loaded(src)) {
		show(src);

	} else {
		show_once_loaded_src = src;
		set_loading(true);
		preload(src);
	}
}

function has_next() {
	return current_index()+1 < images.length;
}

function has_prev() {
	var i = get_index(current);
	return current_index() > 0;
}

function next_image() {
	//aa_stop();
	display_next();
}

function prev_image() {
	aa_stop();
	display_prev();
}

function display_next() {
	last_direction = 1;
	var new_index = (current_index()+1)%images.length;
	display(images[new_index].src);
}

function display_prev() {
	last_direction = -1;
	var new_index = current_index()-1;
	if (new_index < 0) new_index = images.length-1;
	display(images[new_index].src);
}

function current_index() {
	return get_index(current);
}

function get_index(src) {
	var item = index[src];
	return item.index;
}

// auto-advance
var aa_speed = 0.5;
var aa_min_period = 8000;
var aa_max_period = 1000;
var aa_is_playing;
var aa_id = null;

function aa_init() {
	aa_is_playing = true;
	aa_set_timeout();
}

function aa_set_speed(speed) {
	aa_speed = speed;
	aa_clear_timeout();
	aa_set_timeout();
}

function aa_set_timeout() {
	if (aa_is_playing && aa_id == null) {
		aa_id = setTimeout("aa_next()", aa_min_period + (aa_max_period-aa_min_period)*aa_speed);
	}
}

function aa_next() {
	aa_id = null;
	display_next();
}

function aa_start() {
	aa_is_playing = true;
	aa_next();
	set_start_stop_icon();
}

function aa_stop() {
	aa_is_playing = false;
	aa_clear_timeout();
	set_start_stop_icon();
}

function aa_clear_timeout() {
	clearTimeout(aa_id);
	aa_id = null;
}

function aa_start_stop() {
	if (aa_is_playing) {
		aa_stop();
	} else {
		aa_start();
	}
}

function set_start_stop_icon() {
	var el = document.getElementById("play_pause_image");
	if (aa_is_playing) {
		el.src = "/images/ss_pause.gif";
	} else {
		el.src = "/images/ss_play.gif";
	}
}

function aa_initialise_slider() {
	new Control.Slider('aa_handle', 'aa_track',{
      onSlide: function(v) { aa_set_speed(v); },
			sliderValue: aa_speed
	});
}

function initialise() {
	make_index();
	var src = getURLParam("name");
	if (src == null){
		src = images[0].src;
	} else {
		var year = getURLParam("year");
		src = year + "/" + src ;
	}
	
	display(src);
	check_loaded();
	aa_init();
	aa_initialise_slider();
	window.status = "Preloading images...";
}

function _dump(str) {
	var el = document.getElementById("output");
	el.innerHTML = str + "<br/>" + el.innerHTML;
}

function getURLParam(strParamName){
  var strReturn = null;
  var strHref = window.location.href;
  if ( strHref.indexOf("?") > -1 ){
    var strQueryString = strHref.substr(strHref.indexOf("?"));//.toLowerCase();
    var aQueryString = strQueryString.split("&");
    for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
      if (
aQueryString[iParam].indexOf(strParamName + "=") > -1 ){
        var aParam = aQueryString[iParam].split("=");
        strReturn = aParam[1];
        break;
      }
    }
  }
  return strReturn;
}