var xmlData = new Array();
var players = new Array();
var last;

function inarray(a){
  var o = {};
  for(var i=0;i<a.length;i++)
  {
    o[a[i]]='';
  }
  return o;
}

function randomReduceArray(array,size){
	//$('#status').append('Reducing set of '+array.length+' to '+size+"<br />");
	var used = new Array();
	var reduced = new Array();
	var rand;
	
	for(var i=0;i<size;i++){
		//find a random number
		//make sure it hasn't been used
		rand = Math.ceil((xmlData.length*Math.random())-1);
		
		while(rand in inarray(used)){
			rand = Math.ceil((xmlData.length*Math.random())-1);
		}
		
		//add item to reduced array
		reduced[i] = xmlData[rand];
		//add rand to used
		used[i] = rand;
		//$('#status').append("Using "+reduced[i]['name']+"<br />");
	}
	
	return reduced;
}

function preloadImages(){
	//stub for image preloading
	////$('#status').append("preloading the images<br />");
	var urls = new Array;
	var percent = 1;
	
	for(var i=0;i<xmlData.length;i++){
		urls = $.merge(urls,[xmlData[i]['filename']]);
	}
	
	//var urls = [ 'Brian-Mccarty-1' ];
	$.preload( urls, {
		base:'slideshow/images/',
		ext:['.jpg'],
		onComplete:function( data ){
			percent = Math.round((data.loaded/data.total)*100);
			$("#player #progress .bar").progressBar(percent);
			//$progress.html(percent);
		},
		onFinish:function( data ){
			//$('#status').append("Preloaded "+data.loaded+" images<br />");
			//createPlayers should be called after all images are preloaded
			createPlayers(1);
			//get rid of progress bar
		}
	});

	
}

function start(){
	//load the progress bar
	$("#player #progress .bar").progressBar(1, { showText: false, barImage: 'slideshow/images/progressbg_red.gif'} );
	//this starts the process by loading the xml
	//initEvents();
	loadXml(function(){preloadImages()});
}

function createPlayers(i){
	if(i<=1){
		players[i] = new Player(i);
		createPlayers(i+1);
	}else{
		//hide the progress bar
		$("#player #progress").hide();
		//pointer cursor
		//$("#player .slot").css('cursor','pointer');
		
		window.players[1].next();
		
		$(this).everyTime(2000, "player", function() {
			window.players[1].next();
		});
	}
}

function stopPlayer(){
	$(this).stopTime("player");
	//$('#status').append("stopping player<br />");
}

function loadXml(callback){
	$(function() {
		$.ajax({
			type: "GET",
			url: "slideshow/xml/slideshow.xml",
			dataType: "xml",
			success: function(xml)
			{
				var resultSetLength = $("ITEM",xml).length;
				//alert(resultSetLength);
				$("ITEM",xml).each(function(i){
					xmlData[i] = Array();
					xmlData[i]['name'] = $(this).find("name").text();
					xmlData[i]['filename'] = $(this).find("filename").text();
					xmlData[i]['url'] = $(this).find("url").text();
				});
				//xmlData = randomReduceArray(xmlData,3);
				//alert(xmlData.length);
				callback();
			}
		});
	});
}

// JavaScript Player class
function Player(name) {
	this._name = name;
}

Player.prototype._name;

Player.prototype.getName = function() {
	return this._name;
}

Player.prototype.next = function() {
	var $slot = $('#slot'+this._name);

	var rand = Math.ceil(xmlData.length*Math.random())-1;
	var replacement = '<img href="'+xmlData[rand]['url']+'" src="slideshow/images/'+xmlData[rand]['filename']+'.jpg" class="active">';

	while(xmlData[rand]['url']==$slot.children('img').attr("href")){
		////$('#status').append("same <br />");
		rand = Math.ceil(xmlData.length*Math.random())-1;
		replacement = '<img href="'+xmlData[rand]['url']+'" src="slideshow/images/'+xmlData[rand]['filename']+'.jpg" class="active">';
	}
	//$('#status').append("switching "+this._name+" to "+xmlData[rand]['name']+"<br />");
	//define active class
	var $active = $("#player #slot"+this._name+" img.active");

	//append the new one with class active
	$slot.append(replacement);

	var $next = $active.next();

	$next.css({opacity: 0.0})
	.addClass('active')
	.animate({opacity: 1.0}, 1000, function() {
		$active.removeClass('active last-active');
		$slot.html(replacement);
		//$slot.children('img.active').css('opacity','1.0');
	});

	last = this._name;
}

function appendCallback(obj,val,callback){
	obj.append(val);
	callback();
}

function htmlCallback(obj,val,callback){
	obj.html(val);
	callback();
}

function initEvents(){
	$(".slot").click(function () { 
      //alert("going to "+$(this).children('img').attr("href"));
      if($(this).children('img').attr("href").length>0){
      	window.location.href = $(this).children('img').attr("href");
      }
	});
}

$(document).ready(function() {
	start();
});