/******************************************

THE SLIDESHOW
- background: fullscreen iframe (so can draw everywhere)
- foreground: words & pictures

******************************************/

var SLIDES = [];

function Slideshow(){

	var self = this;

	// The DOM & properties...
	self.dom = $("#slideshow");
	self.slideIndex = 0;
	self.currentSlide = null;
	self.currentState = null;

	// My stuff...
	self.boxes = new Boxes();
	self.simulations = new Simulations();
	self.scratch = new Scratch();
	
	// GOTO and NEXT
	var _delay = 300;
	self.IS_TRANSITIONING = false;
	self.goto = function(index, forceClear){

		// Wait for transition to finish!
		if(self.IS_TRANSITIONING) return;
		self.IS_TRANSITIONING = true;
		
		// Which slide?
		self.slideIndex = index;
		var isFirstSlide = (self.currentSlide==null);
		var slide = SLIDES[self.slideIndex];

		// Clear?
		var _delayNewSlide = 0;
		if((slide.clear || forceClear) && !isFirstSlide){
			_delayNewSlide = 800;
			self.scratch.scratchOut(); // Scratch out
			$("#container").removeAttribute("sim_is_running"); // remove that UI
			Simulations.IS_RUNNING = false; // STAHP
		}

		_setTimeout(function(){

			// Scratch in?
			if(_delayNewSlide>0){
				self.clear();
				self.scratch.scratchIn(); // Scratch in
			}

			// Remove stuff
			slide.remove = slide.remove || [];
			slide.remove.forEach(function(childConfig){
				var withFade = true;
				switch(childConfig.type){
					case "box":
						if(self.boxes.getChildByID(childConfig.id)){
							self.boxes.removeChildByID(childConfig.id, withFade);
						}
						break;
					case "sim":
						//self.simulations.removeChildByID(childConfig);
						break;
				}
			});

			// Move stuff
			slide.move = slide.move || [];
			slide.move.forEach(function(childConfig){
				switch(childConfig.type){
					case "box":
						var box = self.boxes.getChildByID(childConfig.id);
						box.classList.add("transitionable");
						var from = {
							x: parseInt(box.style.left),
							y: parseInt(box.style.top)
						};
						var to = {
							x: (childConfig.x===undefined) ? from.x : childConfig.x,
							y: (childConfig.y===undefined) ? from.y : childConfig.y
						};
						box.style.left = to.x+"px";
						box.style.top = to.y+"px";
						break;
					case "sim":
						var sim = self.simulations.getChildByID(childConfig.id);
						var newPosition = {
							x: (childConfig.x===undefined) ? sim.config.x : childConfig.x,
							y: (childConfig.y===undefined) ? sim.config.y : childConfig.y
						};
						tweenPosition(sim.config, newPosition);
						break;
				}
			});

			// Add stuff
			slide.add = slide.add || [];
			var _delayAdd = ((slide.remove.length + slide.move.length)>0) ? _delay : 0;
			_setTimeout(function(){
				var withFade = ((slide.remove.length + slide.move.length)>0);

				slide.add.forEach(function(childConfig){
					switch(childConfig.type){
						case "box":
							self.boxes.add(childConfig, withFade);
							break;
						case "sim":
							if(childConfig.ONLY_IF_IT_DOESNT_ALREADY_EXIST
								&& self.simulations.sims.length>0){
								// then nothing
							}else{
								self.simulations.add(childConfig, withFade);
							}
							break;
					}
				})

			}, _delayAdd);

			// I'm the new slide now
			self.currentSlide = slide;

			// On start (if any)
			self.currentState = {};
			if(slide.onstart) slide.onstart(self, self.currentState);

			// Transition done... sorta!
			_setTimeout(function(){
				self.IS_TRANSITIONING = false;
			},800);

		}, _delayNewSlide);

		// Tell everyone it's a new chapter
		if(slide.chapter && slide.chapter.indexOf("-")<0){ // is chapter and not sub-chapter
			publish("slideshow/goto/",[slide.chapter]);
		}

	};
	var _setTimeout = function(callback, delay){
		if(delay==0) return callback();
		else setTimeout(callback, delay);
	};
	self.gotoChapter = function(chapterID){
		var index = SLIDES.findIndex(function(slide){
			return slide.chapter == chapterID;
		});
		self.goto(index, true);
	};
	self.next = function(){
		self.goto(self.slideIndex+1);
	};

	// Clear out the DOM
	self.clear = function(){
		self.boxes.clear();
		self.simulations.clear();
		self.dom.innerHTML = "";
		pencil.gotoFrame(0);
	};

	// Update
	self.update = function(){
		var slide = self.currentSlide;
		if(slide){
			self.simulations.update();
			if(slide.onupdate) slide.onupdate(self, self.currentState);
		}
	};

	// Draw
	self.draw = function(){
		self.simulations.draw();
	}

}
