var slideTracker = new Object();

function slideController(obj){		// registers paired sets of button IDs and div IDs inside slideTracker, sets click listeners for the buttons to revealSlide
	newKey = Object.keys(slideTracker).length;
	slideTracker[newKey] = new Object();
	slideTracker[newKey].pairs = new Object();
	
	for(i=0; i<obj.pairs.length; i++){
		key = (obj.pairs[i])[0];
		value = (obj.pairs[i])[1]
		slideTracker[newKey].pairs[key] = value;
		Event.observe(key, 'click', window.revealSlide.bindAsEventListener(this, newKey, value, i));
	}
	slideTracker[newKey].slideIndex = obj.pairs.clone();
	if(("activeSlide" in obj) && (slideTracker[newKey].activeSlide != ""))
		slideTracker[newKey].activeSlide = obj.activeSlide - 1;
	else
		slideTracker[newKey].activeSlide = 0;
	slideTracker[newKey].advanceID = obj.advanceID;
	slideTracker[newKey].retireID = obj.retireID;
	slideTracker[newKey].advanceImage = obj.advanceImage;
	slideTracker[newKey].retireImage = obj.retireImage;
	slideTracker[newKey].advanceImagePressed = obj.advanceImagePressed;
	slideTracker[newKey].retireImagePressed = obj.retireImagePressed;

	Event.observe(obj.advanceID, 'click', window.advanceSlide.bindAsEventListener(this, newKey));
	if(obj.advanceImagePressed != ""){
		Event.observe(obj.advanceID, 'mousedown', window.navigatorButtons.bindAsEventListener(this, 'push', 'right', newKey));
		Event.observe(obj.advanceID, 'mouseup', window.navigatorButtons.bindAsEventListener(this, 'release', 'right', newKey));
	}
	Event.observe(obj.retireID, 'click', window.retireSlide.bindAsEventListener(this, newKey));
	if(obj.retireImagePressed != ""){
		Event.observe(obj.retireID, 'mousedown', window.navigatorButtons.bindAsEventListener(this, 'push', 'left', newKey));
		Event.observe(obj.retireID, 'mouseup', window.navigatorButtons.bindAsEventListener(this, 'release', 'left', newKey));
	}
	updateButtons(newKey);
	return newKey;
}

function revealSlide(event, key, which, index){	//updates current button with active class, appears the selected slide div
	slideTracker[key].activeSlide = index;
	x = Event.element(event);
	if(event)
		if(x.inspect().indexOf("thumb-") == -1)
			x = x.up();
	for(var n in slideTracker[key].pairs){
		if($(n).className == 'active_slide'){
			$(n).removeClassName('active_slide');
			$(n).addClassName('inactive_slide');
			Effect.Fade(slideTracker[key].pairs[n], {duration: 0.1, queue: 'end'});
		}
	}
	x.addClassName('active_slide');
	x.removeClassName('inactive_slide');
	Effect.Appear(which, {duration: 0.1, queue: 'end'});
	updateButtons(key);
}

function rightButtonActive(key){
	if((slideTracker[key].activeSlide + 1) == slideTracker[key].slideIndex.length)
		return false;
	else
		return true;
}
function leftButtonActive(key){
	if((slideTracker[key].activeSlide) == 0)
		return false;
	else
		return true;
}
function navigatorButtons(event, action, direction, key){
	if(action == 'push'){
		if(direction == 'right'){
			if(rightButtonActive(key))
				$(slideTracker[key].advanceID).src = slideTracker[key].advanceImagePressed;
		}
		else{
			if(leftButtonActive(key))
				$(slideTracker[key].retireID).src = slideTracker[key].retireImagePressed;
		}
	}
	else{	// release
		if(direction == 'right')
			$(slideTracker[key].advanceID).src = slideTracker[key].advanceImage;
		else
			$(slideTracker[key].retireID).src = slideTracker[key].retireImage;
	}
}

function updateButtons(key){
	if((slideTracker[key].activeSlide + 1) == slideTracker[key].slideIndex.length){
		$(slideTracker[key].advanceID).removeClassName('slide_navigator_enabled');
		$(slideTracker[key].advanceID).addClassName('slide_navigator_disabled');
	}
	else{
		//alert("key: " + slideTracker[key].retireID + " activeslide: " + slideTracker[key].activeSlide + " slidelength: " + slideTracker[key].slideIndex.length);
		if(! ((slideTracker[key].activeSlide + 1) > slideTracker[key].slideIndex.length)){
			$(slideTracker[key].advanceID).removeClassName('slide_navigator_disabled');
			$(slideTracker[key].advanceID).addClassName('slide_navigator_enabled');	
		}
	}
	if((slideTracker[key].activeSlide) == 0){
		$(slideTracker[key].retireID).removeClassName('slide_navigator_enabled');
		$(slideTracker[key].retireID).addClassName('slide_navigator_disabled');
	}
	else{
		$(slideTracker[key].retireID).removeClassName('slide_navigator_disabled');
		$(slideTracker[key].retireID).addClassName('slide_navigator_enabled');	
	}

	if(activeSubSection[activeSection])
		if(activeSubSection[activeSection] in subsections)
			subsections[activeSection][activeSubSection[activeSection]].currentSlide = slideTracker[key].activeSlide + 1;  //registers the currently displayed slide with the navigation controller
}

function advanceSlide(event, key){
	currentSlide = slideTracker[key].activeSlide;
	slideCount = slideTracker[key].slideIndex.length;
	
	if((currentSlide + 1) < slideCount){
		for(var n in slideTracker[key].pairs){
			if($(n).className == 'active_slide'){
				$(n).removeClassName('active_slide');
				$(n).addClassName('inactive_slide');
				Effect.Fade(slideTracker[key].pairs[n], {duration: 0.1, queue: 'end'});
			}
		}
		$(slideTracker[key].slideIndex[currentSlide+1][0]).addClassName('active_slide');
		$(slideTracker[key].slideIndex[currentSlide+1][0]).removeClassName('inactive_slide');
		Effect.Appear(slideTracker[key].slideIndex[currentSlide+1][1], {duration: 0.1, queue: 'end'})
		slideTracker[key].activeSlide++;

		updateButtons(key);		

	}
}

function retireSlide(event, key){
	currentSlide = slideTracker[key].activeSlide;
	slideCount = slideTracker[key].slideIndex.length;

	if(currentSlide > 0){
		for(var n in slideTracker[key].pairs){
			if($(n).className == 'active_slide'){
				$(n).removeClassName('active_slide');
				$(n).addClassName('inactive_slide');
				Effect.Fade(slideTracker[key].pairs[n], {duration: 0.1, queue: 'end'});
			}
		}
		$(slideTracker[key].slideIndex[currentSlide-1][0]).addClassName('active_slide');
		$(slideTracker[key].slideIndex[currentSlide-1][0]).removeClassName('inactive_slide');
		Effect.Appear(slideTracker[key].slideIndex[currentSlide-1][1], {duration: 0.1, queue: 'end'})
		slideTracker[key].activeSlide--;

		updateButtons(key);		

	}
}
