/*
 * Dependence with:
 *		mootools-1.2.3-core-nc
 *		mootools-1.2.3.1-more:
 *			More
 *			String.QueryString
 * 			URI
 *			Fx.Elements
 *			Drag
 *			Drag.Move
 *			Assets
 *			Color
 *
 * Strucutre class:
 *
 * 	package: gx.js:
 *			file: gx.js:
 *				class: Gx
 *
 * 	package: gx.core.js:
 *			file: gx.corner.js:
 *				class: Gx.Corner
 *
 *			file: gx.form.js:
 *				class: Gx.Form
 *
 *			file: gx.widget.js:
 *				class: Gx.Widget
 */

/*
 * Gx
 */

// if (typeof Gx === 'undefined')
 
var Gx = new Hash({
	// Private and global properties
	tabindex: null,
	current: null,
	element: [],

	// Add widget to global collection
	add: function(element) {
		this.element.push(element);
	},
	//
	available: function() {
		// 
		var itab = [], ntab = [];
		
		this.element.each(function(item) {
			if (!item.isFocused())
				return;
			
			// Search if a parent is invisible
			var current = item;
			while (true) {
				if (current.getStyle('display') == 'none')
					return;
				
				if ((current = current.getParent()) == null)
					break;
			}
			
			// If the element is visible and not disabled we add, and then 
			// separating element according to the attribute "tab" or not.
			($chk(item.get('tab'))) ? itab.push(item) : ntab.push(item);
		});

		// Sort element with tab and append other element
		itab.sort(function(a, b) { return a.get('tab') - b.get('tab'); });

		//
		return itab.extend(ntab);
		
		//var element = itab.extend(ntab);
		//element.each(function(item) {
		//	console.log(item, item.get('tab'));
		//});
		//return element;
	},
	//
	contains: function(element) {
		return this.element.contains(element);
	},
	// 
	blur: function(event) {
		this.element.each(function(element) {
			element.blur(event);
		});
		
		// 
		this.current = null;
	}
});

/*
 * Add default events to document
 */

/*
Element.Events.outerClick = {
	
	base : 'click',
	
	condition : function(event){
		event.stopPropagation();
		return false;
	},
	
	onAdd : function(fn){
		this.getDocument().addEvent('click', fn);
	},
	
	onRemove : function(fn){
		this.getDocument().removeEvent('click', fn);
	}
};
*/

window.addEvents({
	blur: function(event) {
		// With IE the blur is not running with the window
		if (Browser.Engine.trident)
			return;
		
		if (Gx.current)
			Gx.current.blur(event);
	}
});

document.addEvents({
	keydown: function(event) {
		// 
		if (!(['tab', 'space', 'enter', 'up', 'down', 'left', 'right'].contains(event.key))) {
			
			// 
			if (Gx.current)
				Gx.current.fireEvent('keydown', event);
			return;
		}

		// For now this method works but it might be useful to consider an initialization function.
		//if (!Gx.contains(event.target))
		//	return;

		switch (event.key) {
			case 'tab':
				//if (Gx.tabindex >= Gx.element.length) {
					//widgets[tabindex].blur();
					//return true;
				//}
				
				//
				var element = Gx.available();
			
				// Revert if the "shift" is supported
				if (event.shift) {
					if (Gx.tabindex == 0 || Gx.tabindex == null)
						Gx.tabindex = element.length - 1;
					else
						Gx.tabindex--;
				} else {
					if (Gx.tabindex >= element.length - 1 || Gx.tabindex == null)
						Gx.tabindex = 0;
					else
						Gx.tabindex++;
				}
				
				element[Gx.tabindex].highlight();
				event.stopPropagation();
				return false;
				break;

			//case 'up':
			//case 'down':
			//case 'left':
			//case 'right':
			case 'space':
				if (!(current = Gx.current))
					return;
				
				if (current.hasClass('checkbox')) {
					current.toggle();
					event.stopPropagation();
					return false;
				}
				break;
			
			case 'enter':
				if (!(current = Gx.current))
					return;
				
				switch (true) {
					case current.hasClass('entry'):
						current.fireEvent('enter');
						break;
						
					case current.hasClass('button'):
						//current.container.addClass('active');
						current.fireEvent('click');
						break;
						
					case current.hasClass('cursor'):
						current.fireEvent('keydown', event);
						break;
				}
				break;
		}		
	},
	keyup: function(event) {
		if (!(['tab', 'space', 'enter', 'up', 'down', 'left', 'right'].contains(event.key))) {
			if (Gx.current)
				Gx.current.fireEvent('keyup', event);
			return;
		}

		if (!Gx.current)
			return;

		// For now this method works but it might be useful to consider an initialization function.
		//if (!Gx.contains(event.target))
		//	return;
		Gx.current.fireEvent('keyup', event);
		Gx.current.container.removeClass('active');
	},
	/*
	focus: function(event) {
		//if (Gx.current)
		//		Gx.current.highlight(event);
		//console.log(Gx.current);
	},
	*/
	// move to window for webkit browser
	/*
	blur: function(event) {
		//alert('document blur');
		if (Gx.current)
			Gx.current.blur(event);
	},
	*/
	mousedown: function(event) {
		if (!Gx.current)
			return;
		
		// Find target == current widget
		var element = Gx.current.getElements('*');
		if (Gx.current == event.target || element.contains(event.target)) {
			Gx.tabindex = Gx.element.indexOf(Gx.current);
			return;
		}
		
		// Blur all
		Gx.blur(event);
	}
})
