/**
 * class	Q_RegionCountry
 * author	Paul Kruijt
 */
var Q_RegionCountry = new Class({
	
	/**
	 * initialize
	 * @return	void
	 */
	initialize: function()
	{
		// nodes
		this.filter_page_node			= $('filter_page');
		this.region_wrapper_node		= $('region_wrapper');
		this.region_header_node			= this.region_wrapper_node.getElement('h1');
		this.country_wrapper_node		= $('country_wrapper');
		this.country_bg_node			= $('country_bg');
		this.active_region_node			= null;
		
		// id's
		this.region_wrapper_id		= 'region_wrapper';
		this.country_wrapper_id		= 'country_wrapper';
		this.region_item_arrow_id	= 'region_item_arrow';
		
		// classes
		this.region_item_bg_class		= 'region_item_bg';
		this.country_item_wrapper_class	= 'country_item_wrapper';
		this.show_class					= 'show';
		this.hide_class					= 'hide';
		this.active_class				= 'active';
		this.direct_link_class			= 'direct_link';
		
		// prefixes
		this.region_item_handler_prefix		= 'region_item_handler_';
		this.region_item_handler_bg_prefix	= 'region_item_handler_bg_';
		this.region_item_listener_prefix	= 'region_item_listener_';
		
		// settings
		this.slider_duration	= 300;
		this.alpha_duration		= 400;
		this.country_col_amount	= 22;
	},
	
	/**
	 * start
	 * @return void
	 */
	start: function()
	{
		// create regions
		this.createRegions();
	},
	
	/**
	 * create regions
	 * @return void
	 */
	createRegions: function()
	{
		if (this.region_wrapper_node && q_regions)
		{
			// create ul node
			var region_inject_node	= new Element('ul');
			
			// inject node
			region_inject_node.injectInside(this.region_wrapper_node);
			
			var a = 1;
			for (region in q_regions)
			{
				// create
				var region_item_node	= new Element('li');
				var region_link_node	= new Element('a');
				var region_item_bg_node	= new Element('div');
				
				// properties
				region_item_node.setProperty('id', this.region_item_handler_prefix + a);
				region_link_node.setProperty('href', '#');
				region_item_bg_node.setProperty('id', this.region_item_handler_bg_prefix + a);
				region_item_bg_node.setProperty('class', this.region_item_bg_class);
				
				// text
				region_link_node.set('text', region);
				
				// inject
				region_link_node.injectInside(region_item_node);
				region_item_node.injectInside(region_inject_node);
				region_item_bg_node.injectInside(this.region_wrapper_node);
				
				// position
				var region_wrapper_coordinates	= this.region_wrapper_node.getCoordinates();
				var region_wrapper_top			= region_wrapper_coordinates.top;
				var region_item_coordinates		= region_item_node.getCoordinates();
				var region_item_top				= region_item_coordinates.top;
				var region_item_bg_top			= parseInt(region_item_top - region_wrapper_top);
				
				region_item_bg_node.setStyle('top', region_item_bg_top+'px');
				
				// create countries
				this.createCountries(a, q_regions[region]);
				
				a++;
			}
			
			// create region item arrow (for active state)
			var region_item_arrow_node	= new Element('div');
			
			// properties
			region_item_arrow_node.setProperty('id', this.region_item_arrow_id);
			
			// inject
			region_item_arrow_node.injectInside(this.region_wrapper_node);
			
			// set region events
			this.setRegionEvents();
		}
	},
	
	/**
	 * create countries
	 * @param	integer	item_nr
	 * @param	array	arr_regions
	 * @return	void
	 */
	createCountries: function(item_nr, arr_regions)
	{
		if (this.country_wrapper_node)
		{
			// create
			var country_item_wrapper_node	= new Element('div');
			
			// properties
			country_item_wrapper_node.setProperty('id', this.region_item_listener_prefix + item_nr);
			country_item_wrapper_node.setProperty('class', this.country_item_wrapper_class);
			
			// inject node
			country_item_wrapper_node.injectInside(this.country_wrapper_node);
			
			// check for Array
			if (arr_regions.constructor == Array)
			{
				if (arr_regions.length > 0)
				{
					var b = 1;
					
					for (var a=0; a<arr_regions.length; a++)
					{
						if (b == 1)
						{
							// create inject node
							var country_inject_node	= new Element('ul');
							
							// inject
							country_inject_node.injectInside(country_item_wrapper_node);
						}
						
						// set array from object
						var obj_country	= arr_regions[a];
					
						for (country_name in obj_country)
						{
							// set name and link
							var country_name	= country_name;
							var country_link	= obj_country[country_name];
						}
						
						// create
						var country_item_node	= new Element('li');
						var country_link_node	= new Element('a');
						
						// properties
						country_link_node.setProperty('href', country_link);
						
						// text
						country_link_node.set('text', country_name);
						
						// inject
						country_link_node.injectInside(country_item_node);
						country_item_node.injectInside(country_inject_node);
						
						// set event
						country_link_node.onclick = function()
						{
							document.location = this.href;
							return false;
						}
						
						b++;
						
						if (b > this.country_col_amount) b = 1;
					}
				}
			}
			
			// direct link from region
			else
			{
				// get region (link) node
				var region_item_node = $(this.region_item_handler_prefix + item_nr);
				
				if (region_item_node)
				{
					var region_link_node	= region_item_node.getElement('a');
					
					// set href
					if (region_link_node)
					{
						var region_link	= arr_regions;
						
						if (this.isValidUrl(region_link))
						{
							region_link_node.setProperty('href', region_link);
							region_link_node.setProperty('class', this.direct_link_class);
						}
					}
				}
			}
		}
	},
	
	/**
	 * set region events
	 * @return void
	 */
	setRegionEvents: function()
	{
		// set vars
		var _this					= this;
		var region_item_nodes		= $$('#'+this.region_wrapper_id+' li');
		var total_region_item_nodes	= region_item_nodes.length;
		
		if (total_region_item_nodes > 0)
		{
			for (var a=0; a<total_region_item_nodes; a++)
			{
				var region_item_node	= region_item_nodes[a];
				
				region_item_node.addEvent('mouseenter',	function (){_this.hoverOn(this);});
				region_item_node.addEvent('mouseleave',	function (){_this.hoverOff(this);});
				
				region_item_node.onclick = function()
				{
					var region_link_node	= this.getElement('a');
					
					// set href
					if (region_link_node)
					{
						// open direct link
						if (_this.isValidUrl(region_link_node.href) && region_link_node.className == _this.direct_link_class)
						{
							document.location = region_link_node.href;
						}
						
						// slide countries
						else
						{
							// activate region
							_this.activate(this);
						
							_this.slide(this);
						}
						
						return false;
					}
				}
				
				region_item_node.onfocus = function()
				{
					this.blur();
				}
			}
		}
	},
	
	/**
	 * hover on handler item
	 * @param	object	handler_node
	 * @return	void
	 */
	hoverOn: function(handler_node)
	{
		// set object as var
		var _this	= this;
		
		// get item number for handler bg
		var handler_id		= handler_node.id;
		var arr_handler_id	= handler_id.split(this.region_item_handler_prefix);
		var handler_bg_nr	= arr_handler_id[1];
		
		if (handler_bg_nr > 0)
		{
			// get handler bg node
			var handler_bg_node	= $(this.region_item_handler_bg_prefix + handler_bg_nr);
			
			if (handler_bg_node)
			{
				handler_bg_node.setStyle('visibility', 'visible');
			}
		}
	},
	
	/**
	 * hover off handler item
	 * @param	object	handler_node
	 * @return	void
	 */
	hoverOff: function(handler_node)
	{
		// set object as var
		var _this	= this;
		
		if (handler_node != this.active_region_node)
		{
			// get item number for handler bg
			var handler_id		= handler_node.id;
			var arr_handler_id	= handler_id.split(this.region_item_handler_prefix);
			var handler_bg_nr	= arr_handler_id[1];
			
			if (handler_bg_nr > 0)
			{
				// get handler bg node
				var handler_bg_node	= $(this.region_item_handler_bg_prefix + handler_bg_nr);
				
				if (handler_bg_node)
				{
					handler_bg_node.setStyle('visibility', 'hidden');
				}
			}
		}
	},
	
	/**
	 * activate handler item
	 * @param	object	handler_node
	 * @return	void
	 */
	activate: function(handler_node)
	{
		// set object as var
		var _this	= this;
		
		// only if handler is different than active one
		if ($(this.region_item_arrow_id) && handler_node != this.active_region_node)
		{
			// hide arrow in region header
			if (!this.active_region_node && this.region_header_node)
			{
				this.region_header_node.setStyles({
					'background': 'none',
					'filter': ''
				});
			}
			
			// de-activate
			if (this.active_region_node)
			{
				// get item number for handler bg
				var active_region_id		= this.active_region_node.id;
				var arr_active_region_id	= active_region_id.split(this.region_item_handler_prefix);
				var active_region_bg_nr		= arr_active_region_id[1];
				
				if (active_region_bg_nr > 0)
				{
					// get active_region bg node
					var active_region_bg_node	= $(this.region_item_handler_bg_prefix + active_region_bg_nr);
					
					if (active_region_bg_node)
					{
						this.active_region_node.className = '';
						
						active_region_bg_node.setStyle('visibility', 'hidden');
					}
				}
			}
			
			// set active class
			handler_node.className = this.active_class;
			
			// get position
			var region_wrapper_coordinates	= this.region_wrapper_node.getCoordinates();
			var region_wrapper_top			= region_wrapper_coordinates.top;
			var handler_coordinates			= handler_node.getCoordinates();
			var handler_top					= handler_coordinates.top;
			var region_item_arrow_top		= parseInt(handler_top - region_wrapper_top);
			
			// set position
			$(this.region_item_arrow_id).setStyles({
				'top': region_item_arrow_top+'px',
				'visibility': 'visible'
			});
		}
	},
	
	/**
	 * slide countries in or out
	 * @param	object	handler_node
	 * @return	void
	 */
	slide: function(handler_node)
	{
		// set object as var
		var _this	= this;
		
		// only if handler is different than active one
		if (handler_node != this.active_region_node)
		{
			// get coordinates of countries bg
			var country_bg_width		= parseInt(this.country_bg_node.getStyle('width'));
			var country_bg_left_start	= parseInt(this.country_bg_node.getStyle('left'));
			
			// get item number for listener
			var handler_id			= handler_node.id;
			var arr_handler_id		= handler_id.split(this.region_item_handler_prefix);
			var listener_item_nr	= arr_handler_id[1];
			
			if (listener_item_nr > 0)
			{
				// get listener node
				var listener_node	= $(this.region_item_listener_prefix + listener_item_nr);
				
				if (listener_node)
				{
					// show page filter
					if (this.filter_page_node) this.filter_page_node.className = this.show_class;
					
					// start effect for first time
					if (country_bg_left_start < 0)
					{
						var country_bg_left_end	= 0;
						var slider_effect		= new Fx.Morph(this.country_bg_node, {duration: this.slider_duration, transition: Fx.Transitions.Quad.easeOut});
				 		
						slider_effect.start({
						    'left': [country_bg_left_start, country_bg_left_end]
						}).chain(function(){
							
							// make visible
							listener_node.setStyle('visibility', 'visible');
							
							// fade in listener
							var alpha_effect = new Fx.Morph(listener_node, {duration: _this.alpha_duration, transition: Fx.Transitions.Quad.easeOut});
							
							alpha_effect.start({
							   'opacity': [0, 1]
							}).chain(function(){
								
								// hide page filter
								if (_this.filter_page_node) _this.filter_page_node.className = _this.hide_class;
								
							});
							
						});
					}
					
					// switch region
					else
					{
						if (this.active_region_node)
						{
							// get item number for active listener
							var active_handler_id		= this.active_region_node.id;
							var arr_active_handler_id	= active_handler_id.split(this.region_item_handler_prefix);
							var active_listener_item_nr	= arr_active_handler_id[1];
							
							if (active_listener_item_nr > 0)
							{
								// get active listener node
								var active_listener_node	= $(this.region_item_listener_prefix + active_listener_item_nr);
								
								if (active_listener_node)
								{
									// fade out active listener
									var alpha_effect = new Fx.Morph(active_listener_node, {duration: _this.alpha_duration, transition: Fx.Transitions.Quad.easeOut});
									
									alpha_effect.start({
									   'opacity': [1, 0]
									}).chain(function(){
										
										// make active item invisible
										listener_node.setStyle('visibility', 'hidden');
										
										// slide out bg
										var country_bg_left_end_first	= parseInt((0 - country_bg_width));
										var country_bg_left_end_second	= 0;
										var slider_effect		= new Fx.Morph(_this.country_bg_node, {duration: _this.slider_duration, transition: Fx.Transitions.Quad.easeOut});
										
										slider_effect.start({
										    'left': [country_bg_left_start, country_bg_left_end_first]
										}).chain(function(){
											
											// slide in bg
											slider_effect.start({
											   'left': [country_bg_left_end_first, country_bg_left_end_second]
											}).chain(function(){
												
												// make visible
												listener_node.setStyle('visibility', 'visible');
												
												// fade in listener
												var alpha_effect = new Fx.Morph(listener_node, {duration: _this.alpha_duration, transition: Fx.Transitions.Quad.easeOut});
												
												alpha_effect.start({
												   'opacity': [0, 1]
												}).chain(function(){
													
													// hide page filter
													if (_this.filter_page_node) _this.filter_page_node.className = _this.hide_class;
													
												});
												
											});
											
										});
										
									});
								}
							}
						}
					}
				}
			}
		}
		
		// set active region
		this.active_region_node = handler_node;
		
	},
	
	/**
	 * Valid URL check
	 * @param	string	url
	 * @return	boolean
	 */
	isValidUrl: function(url)
	{
		var regexp	= /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
		return regexp.test(url);
	}
	
});
