/**
* @fileoverview This file contains the static object  CoordToolbox
* @author Sara Lin
* @version 0.1
*/

/**
* This is a static object that handles initialization for coordinate toolbox editing.
* @namespace
*/
var CoordToolbox = {
	/**
	* coordEditingMode = {
	* 0: coordinate toolbox not activated,
	* 1: coordinate toobox activated, normal add/delete mode,
	* 2: coordinate toolbox activated, click2add mode }
	* currently, this object is still using Main.user.coordEditingMode variable
	*/
	coordEditingMode: 0,
	toolbox: null,
	isNewItem: false,
	submitBtn: null,
	cancelBtn: null,
	currentItem: null,
	
	/** 
	* initialize:  attach toolbox functions to coordinate submit and cancel buttons
	* details: invoked when admin logs in
	*/
	initialize: function() {
		CoordToolbox.ExistingCoords.initialize();
		CoordToolbox.NewCoords.initialize();
		
		this.toolbox = $('coordinateToolbox');
		this.submitBtn = $('submitCoordEdit');
		Event.observe(this.submitBtn, 'click', Main.user.submitEverything);
		this.cancelBtn = $('cancelCoordEdit');
		Event.observe(this.cancelBtn, 'click', Main.user._turnOffCoordEditing);
		
		FloorManager.floorSubject.attachObserver('editCoord', Main.user._turnOffCoordEditing);
	},
	
	unload: function() {
	
	},
	
	/**
	* setting up html containers for displaying coordinate editing toolbox
	*/
	setupEditCoords: function() {
		Main.user.coordEditingMode = 1;
		Main.user.adminFloor[FloorManager.curFloor].addedItems = [];
		Main.user.adminFloor[FloorManager.curFloor].changedItems = [];
		
		//disable both edit coordinate buttons
		//reset form field values
		$('newItemForm').reset();
		$('newItemForm').disable();
		$('activateCoordEdit').disable();
		
		if (this.isNewItem) {
			$$('.coordEditExisting').each(function(el) {$(el).hide()});
			$$('.coordEditNew').each(function(el) {$(el).show()});
		} else {
			$$('.coordEditExisting').each(function(el) {$(el).show()});
			$$('.coordEditNew').each(function(el) {$(el).hide()});
		}
		
		//stop clicking observers for floor items, and start observing the items for coordinate editing
		var floor = FloorManager.getCurrentFloor();
		if (floor != null) {
			floor.setCoordEditObservers();
		}

		this.toolbox.show();
		Main.tabs._minButton();
	}
}

/**
* Object for setting up coordinate toolbox for editing existing coordinates
* @namespace
*/
CoordToolbox.ExistingCoords = {
	editCoordsBtn: null,
	itemSelect: null,
	
	initialize: function() {
		this.editCoordsBtn = $('activateCoordEdit');
		Event.observe(this.editCoordsBtn, 'click', this.setupExistingCoords);
		this.itemSelect = $('itemDropDown');
	},
	
	/**
	* sets up toolbox html for editing existing coordinates. invoked by $('activateCoordEdit')
	* @event 
	*/
	setupExistingCoords: function(event) {
		var setup = true;
		if (CoordToolbox.isNewItem && CoordToolbox.coordEditingMode)
			setup = Main.user._turnOffCoordEditing(null);
		if (!setup)
			return false;
		
		CoordToolbox.isNewItem = false;	
		//set up steps common to both existing coordinates and new coords
		CoordToolbox.setupEditCoords();
		CoordToolbox.ExistingCoords.setupFloorItems();
	},
	
	/**
	* create dropdown box for selecting floor items to select in the toolbox
	*/
	setupFloorItems: function() {
		var floor = FloorManager.getCurrentFloor();
		if (floor != null) {
			var itemSelect = CoordToolbox.ExistingCoords.itemSelect;
			var items = floor.items;
			items = items.sortBy(function(item) {if (item!=null) return item.name; else return null;});
			items.each(function(item) {
				if (item) {
					var opt = $E({
						tag: 'option',
						value: item.id,
						children: item.name
					});
					itemSelect.appendChild(opt);
				}
			});
			Event.observe(itemSelect, "change", Main.user.editItemCoords);
		}
	}
}

/**
* Object for setting up coordinate toolbox for creating new item
* @namespace
*/
CoordToolbox.NewCoords = {
	editCoordsBtn: null,
	
	initialize: function() {
		this.editCoordsBtn = $('createItem');
		Event.observe(this.editCoordsBtn, 'click', this.createTmpItem);
	},
		
	/**
	* invoked after user submits new item form.  Temporary item object is created and the toolbox is setup for adding coordinates.
	* @event 
	*/
	createTmpItem: function(event) {
		//if editing coordinate is activated, prompt user to turn it off
		var setup = true;
		if (!CoordToolbox.isNewItem && CoordToolbox.coordEditingMode)
			setup = CoordToolbox._turnOffCoordEditing(null);
		if (!setup)
			return false;
		
		//checks whether item name and type are entered
		var itemName = $F('newItemName');
		var itemType = $F('newItemType');
		if (itemName=="" || itemType=="none") {
			alert("Please enter item name and type");
			return false;
		}
		
		CoordToolbox.isNewItem = true;
		//set up steps common to both existing coordinates and new coords
		CoordToolbox.setupEditCoords();
		CoordToolbox.NewCoords.setupNewCoords(itemName, itemType);
		Main.user._click2add(null);
	},
	
	/**
	* setupNewCoords: 
	* -replaces Main.user.editItemCoords(event) for new item
	* -add new item coords struct to the addedItems array in Main.user, define Main.user.curEditItem
	* -update new item name in toolbox
	*/
	setupNewCoords: function(itemName, itemType) {
		CoordToolbox.currentItem = {
			tempID: 'newItem'+this.tempID++,
			name: itemName,
			type: itemType,
			coordSet: {
				xys: [],
				hotSpot: [],
				showLabel: true
			}
		}

		var newItems = Main.user.adminFloor[FloorManager.curFloor].addedItems;
		newItems[newItems.size()] = CoordToolbox.currentItem;
		
		var curEditItem = {
			added: true,
			deleted: false,
			ref: CoordToolbox.currentItem
		};
		Main.user.curEditItem = curEditItem;
		
		$('itemNew').innerHTML = itemName;
		Main.user.createDivsForCurItem();
		Main.user.toolboxTransition(false, true);
	}
}