(function($) {

//******************** PRIVATE VARIABLES ********************//

// variables	
var imageTimeout = new Array();
var imageFXSpeed = new Array();
var imageDelay = new Array();
var showCt = 0;
var numTotalImages = 0;
var numSlideShows = 0;
var imagesLoaded = 0;
var debugOneShowNum = -1; 
var slideCounter = new Array();
var slidesPerShow = new Array();
var showsEnded = 0;
var showRestart = new Array();
var imageLocs = new Array();
var imageWidths = new Array();
var imageHeights = new Array();
var opts;

//******************** INIT ********************//

$.fn.brookfieldIntro = function(xmlFile, options) {

	// options
	opts = $.extend({}, $.fn.brookfieldIntro.defaults, options);

	// errors
	if (this.length != 1) {
		log("There must be one and only one intro.");
		return this;
	}
	if (xmlFile == null) {
		log("Must specify an xml file for the intro.");
		return this;
	}
	
	// load xml
	$.ajax({
		type: "GET",
		url: xmlFile,
		dataType: "xml",
		success: xmlLoaded,
		error: opts.xmlDidNotLoad
	});

	return this;

};

$.fn.brookfieldIntro.defaults = {
  xmlDidNotLoad: null,
  imageDidNotLoad: null
};

//******************** FUNCTIONS ********************//

// log errors etc
function log() {
	if (window.console && window.console.log)
		window.console.log('[brookfieldIntro] ' + Array.prototype.join.call(arguments,' '));
	else alert('[brookfieldIntro] ' + Array.prototype.join.call(arguments,' '))	
};

// finished loading xml
function xmlLoaded(xml) {
	
	// get total numer of images for preloading imagery
	numTotalImages = $(xml).find("image").size();
	
	// init count
	var imageCt = 0;
	
	// make a slideshow for each imagegroup
	$(xml).find("imagegroup").each(function() {
		
		// get attributes
		var imageXPos = $(this).attr('x');
		var imageYPos = $(this).attr('y');
		var imageWidth = $(this).attr('width');
		var imageHeight = $(this).attr('height');
		var id = $(this).attr('id');
		var showImageCt = 0;
		
		// making data arrays 2d
		imageTimeout[showCt] = new Array();
		imageFXSpeed[showCt] = new Array();
		imageLocs[showCt] = new Array();
		imageWidths[showCt] = new Array();
		imageHeights[showCt] = new Array();
		
		// initialize slide counter
		slideCounter[showCt] = 0;
		slidesPerShow[showCt] = 0;
		
		// make div and position
		var imageDiv = "<div class='intro_slideshow' id='intro_slideshow_"+id+"'></div>";
		var imageId = "#intro_slideshow_"+id;
		
		$("#intro_show").append(imageDiv);
		$(imageId).css( { "left": imageXPos + "px", "top":imageYPos + "px" } );
		
		// set delay
		var dly = parseFloat($(this).attr('delay'));
		if (isNaN(dly)) imageDelay[showCt] = -2;
		else imageDelay[showCt] = dly;
		
		// debug only showing one
		if (debugOneShowNum == -1 || showCt == debugOneShowNum) {

			// if debug change need to preload
			if (debugOneShowNum != -1) numTotalImages = $(this).find("image").size();
		
			// go through images
			$(this).find("image").each(function() {
				
				// set image array vars
				imageLocs[showCt][showImageCt] = $(this).text();
				imageWidths[showCt][showImageCt] = imageWidth;
				imageHeights[showCt][showImageCt] = imageHeight;
				
				// setting timeout
				var imgTimeout = parseFloat($(this).attr('timeout'));
				if (isNaN(imgTimeout)) imageTimeout[showCt][showImageCt] = 2;
				else imageTimeout[showCt][showImageCt] = imgTimeout;
				
				// setting speed
				var imgFXSpeed = parseFloat($(this).attr('fxspeed'));
				if (isNaN(imgFXSpeed)) imageFXSpeed[showCt][showImageCt] = 1.4;
				else imageFXSpeed[showCt][showImageCt] = imgFXSpeed;
				
				// making image tags
				var imageTag;
				if (showImageCt == 0) imageTag = "<img class='first' src='" + imageLocs[showCt][showImageCt] + "' width='" + imageWidth + "' height='" + imageHeight + "' id='" + id + "'>";
				else imageTag = "<img src='" + imageLocs[showCt][showImageCt] + "' width='" + imageWidth + "' height='" + imageHeight + "' id='" + id + "'>";
				$(imageId).append(imageTag);
				
				//console.log(imageTag);
			
				slidesPerShow[showCt]++;
				imageCt++;
				showImageCt++;
			});
			
		}

		showRestart[showCt] = false;
		showCt++;
	});
	
	// preloading imagery
	for(var i=0;i<showCt;i++) {
		for(var j=0;j<imageLocs[i].length;j++) {
			// for preloading
			var img = new Image(imageWidths[i][j],imageHeights[i][j]); 
			img.src = imageLocs[i][j];
			
			// if error
			img.onerror = opts.imageDidNotLoad;
			
			// if cached
			if (img.complete) imageLoaded();
			else $(img).bind('load', imageLoaded); 
		}
	}
}

// images are loaded, start the slideshow
function imageLoaded() {

	imagesLoaded++;
	//console.log("imagesLoaded: ", imagesLoaded);
	
	if (imagesLoaded == numTotalImages)
	{
		
		for(var i=0;i<showCt;i++)
		{
			if (debugOneShowNum == -1 || i == debugOneShowNum) {
				var imageId = "#intro_slideshow_"+i;	
				//console.log("--start slideshow: ", i);
				
				// make slideshow
				$(imageId).cycle({
					fx: 'fadeOver',
					before: beforeEffect,
					speed: 1900,
					timeout: 2,
					delay: (imageDelay[i]*1000)
				});
			}
		}
	}
	
}

function beforeEffect(currElement, nextElement, opts, isForward) {

	// getting effect data
	var showNum = parseFloat(currElement.id);
	var slideNum;

	// for the first time through, use the first tag's timeout (there is no speed / anim on the first)
	if (slideCounter[showNum] == 0) {
		
		slideNum = opts.currSlide;
		
		// setting timeout
		opts.timeout = imageTimeout[showNum][slideNum] * 1000;
	}
	// second time through use next tag
	else {
		
		slideNum = opts.nextSlide;
		
		// setting timeout and speed
		opts.timeout = imageTimeout[showNum][slideNum] * 1000;
		opts.speedIn = imageFXSpeed[showNum][slideNum] * 1000;
		opts.speedOut = imageFXSpeed[showNum][slideNum] * 1000;
		opts.speed = imageFXSpeed[showNum][slideNum] * 1000;
	
		// if we restart, pause all and restart to keep timing right
		if (slideNum == 0) {
			
			// pause slide show
			showsEnded++;
			var showId = "#intro_slideshow_"+showNum;
			$(showId).cycle('pause');
			//console.log("paused: ", showNum);
			
			// once they are all paused, start em up again
			if (showsEnded == showCt) {
				
				// restart process
				showsEnded = 0;
			
				// restart em
				for(var i=0;i<showCt;i++) {
					showId = "#intro_slideshow_"+i;
					$(showId).cycle('resume');
					//console.log("start: ", i);
				}
			}
			
			// no speed, instant in, and take two off beginning
			opts.speedIn = 50;
			opts.speedOut = 50;
			opts.speed = 50;
			opts.timeout = ((imageTimeout[showNum][slideNum]-2) * 1000) + 200;
		}
		
		//if (showNum == debugOneShowNum) {
		//console.log("show[", showNum, "]", "slide[", slideNum, "] - timeout[", opts.timeout, "] speed[", opts.speedIn , "]");
		//}
	}
	
	// update counter
	slideCounter[showNum]++;
}
 
})(jQuery);
	
	


