/**
* @fileoverview This is a floor manager object.
* @author Sara Lin
* @version 0.1
*/

/**
* manages the transition between floor objects.
 * @namespace 
 */
var FloorManager = {
	/** an array of floor objects */
	floors: new Array(),
	/** an array of functions to be invoked before floor switch can occur */
	observers: null,
	/** the current floor the user is on. */
	curFloor: -1,
	illegalFloor: "ILLEGAL_FLOOR",
	defaultFloor: 1,
	/** currently, these are the floor allowed */
	floorLimit: [0, 4],
	/** 
	* observes floor transition.
	* @type Subject */
	floorSubject: null,
	
	/**
	* loads the default floor.  create a new draggable that disallows dragging the floorplan off the screen.
	* @param {number} defaultFloor if this is negative, then no floor is loaded
	* @param {function} optionalCallback a function that would be invoked after floorplan image and floor items have been loaded.
	*/
	initialize: function(defaultFloor, optionalCallback) {
		this.floorSubject = new Subject();
		FloorManager.navigation.initialize();
		
		if (defaultFloor>=this.floorLimit[0] && defaultFloor<=this.floorLimit[1])
			this.defaultFloor = defaultFloor;
		if (defaultFloor!=this.illegalFloor)
			FloorManager.switchFloor(this.defaultFloor, optionalCallback);

		var drag = new Draggable($('floors'), {
			zindex: 0,
			starteffect: null,
			endeffect:null,
			revert: function(element) {
				var elmDimensions = Element.getDimensions(element);
				var parDimensions = Element.getDimensions(element.parentNode);
				
				var pos = Element.cumulativeOffset(element);
				pos.right = pos.left + elmDimensions.width;
				pos.bottom = pos.top + elmDimensions.height;
				
				function constraint(lower1, lower2, upper1, upper2) {
					var limit = {min:100, lower: lower1, upper: upper1} ;
					if (lower1<lower2)
						limit.lower = lower2;
					if (upper1>upper2)
						limit.upper = upper2;
					
					if ((limit.upper-limit.lower)>limit.min)
						return false;
					return true;
				}
				
				var toRevert = {};
				toRevert.x = constraint(0, pos.left, parDimensions.width, pos.right);
				toRevert.y = constraint(0, pos.top, parDimensions.height, pos.bottom);
				
				if (toRevert.x || toRevert.y)
					return true;
				return false;
			}
		});
		Main.draggables.push(drag);
	},
	
	/**
	* swtiches to the user selected floor level
	* @param {number} floor floor level
	* @param {function} optionalCallback
	*/
	switchFloor: function(floor, optionalCallback) {
		if (FloorManager.floorSubject && !FloorManager.floorSubject.notifyObservers(floor))
			return false;
			
		if (!FloorManager.floors[floor]) {
			FloorManager.floors[floor] = new Floor(floor, optionalCallback);
		} else {
			FloorManager.floors[floor].show();
			if (optionalCallback)
				optionalCallback();
		}

		if (this.curFloor>=0 && this.curFloor != floor) {
			this.floors[this.curFloor].hide();
			var oldFloor = $$('#navFloor_'+this.curFloor)[0];
			if (oldFloor) {
				$(oldFloor).removeClassName('active');
			}
		}
		
		newFloor = $$('#navFloor_'+floor)[0];
		if (newFloor) {
			$(newFloor).addClassName('active');
		}
		
		//changed the legend image to the one for the new floor level
		var legendElem = $$('#legend img')[0];
		var path = legendElem.src.split('/');
		path[path.size()-1] = "legend"+floor+".gif";
		$$('#legend img')[0].src = path.join('/');
		
		this.curFloor = floor;
		return true;
	},
	
	/**
	* returns the currently active floor object
	*/
	getCurrentFloor: function() {
		return this.floors[this.curFloor];
	}
}

/**
* navigation handles switching floor from the floor navigation area.
*/
FloorManager.navigation = {
	/**
	* attaches event handlers to all floor links on the floor navigation area
	* @constructor
	*/
	initialize: function(event) {
		var thisObj = this;
		$$('.navFloor').each(function(element) {
			Event.observe(element, "click", thisObj.switchFloor);
		});
	},
	
	/**
	* retrieves the floor number to swtich to and invoke FloorManager.switchFloor
	* @event
	*/
	switchFloor: function(event) {
		var element = Event.element(event).parentNode;
		var floor = element.id.split('_')[1];
		FloorManager.switchFloor(floor);
	}
}