// <![CDATA[

function log(msg)
{
	if(typeof console != 'undefined'){
		console.log(msg);
	}
	else{
		alert(msg);
	}
}

var Search = Class.create(
{
	initialize: function()
	{
		var q = $('q');
		var f = $('search-form');
		var s = $('btn-search-submit');

		var isValidForm = function()
		{
			var q = $('q');
			var qField = $(q.parentNode).removeClassName('error');
			var msg = 'The form is incomplete or some field(s) are incorrect.';

			if(q.value.length<=0)
			{
				msg = 'A keyword (min. 3 characters) is required';
			}
			else if(q.value.length<3)
			{
				msg = 'The keyword must be more than 2 characters';
			}
			else
			{
				return true;
			}
			
			alert(msg);
			qField.addClassName('error');
			q.select();
			return false;
		};
		
		q.select();
		
		s.observe('click', function(event){
			event.stop();
			if(isValidForm())
			{
				f.submit();
			}
		});
		
		f.observe('submit', function(event){
			if(!isValidForm())
			{
				event.stop();
			}
		});
		
		q.observe('blur', function(){
			if(this.value.length<=0)
			{
				$(this.parentNode).removeClassName('error');
			}
		});
	}
});

var BackToTop = Class.create({
	initialize: function()
	{
		$('btn-backtotop').observe('click', this.scrollToTop.bindAsEventListener(this));
	},
	
	scrollToTop: function(event)
	{
		event.stop();
		new Effect.ScrollTo('top', {duration: .3});
	}
});

var Menu = Class.create({
	initialize: function(options){

		var el        = this.el    = $('menu');
		var items     = this.items = el.cleanWhitespace().childElements();
		var subs      = this.subs  = el.select('ul');

		this.selected = null;
		this.timer    = null;

		subs.invoke('hide');
		subs.invoke('setStyle', {visibility: 'visible'});

		items.each(function(item, i){

			var elts = item.childElements();

			item.observe('mouseover', function(event){

				this.select(item, elts, event);

			}.bind(this));

		}.bind(this));
		
		document.observe('mouseover', function(event){

			var el = event.element();

			if((this.selected!=null) && !((el==this.selected) || (el.descendantOf(this.selected))))
			{
				this.deselect();
			}

		}.bind(this));
	},
	
	select: function(item, elts, event)
	{
		if(item != this.selected)
		{
			//log('new selection ' + item.tagName);
			this.activateItem(item);

			if(elts.length>1)
			{
				var sub = elts[1];

				this.showSub(sub, event);
				this.selected = item;
			}
			else
			{
				this.hideSubs();
			}
		}
		else
		{
			this.cancelDeselection();
		}
	},
	
	activateItem: function(item)
	{
		this.items.invoke('removeClassName', 'active');
		item.addClassName('active');
	},
	
	showSub: function(sub, event)
	{
		if(!sub.visible())
		{
			this.subs.invoke('hide');
			
			sub.absolutize();

			var pos = event.element().positionedOffset();

			sub.setStyle({zIndex: 1000, top:pos.top + 'px', left: pos.left + 90 + 'px'});

			sub.show();					
		}
	},
	
	deselect: function()
	{
		this.timer = window.setTimeout(this.hideSubs.bind(this), 1000);
	},
	
	cancelDeselection: function()
	{
		if(this.timer){
			this.timer = window.clearTimeout(this.timer);
		}
	},
	
	hideSubs: function()
	{
		this.subs.invoke('hide');
		this.items.invoke('removeClassName', 'active');
		this.selected = null;
	}	
});

var LoginPane = Class.create({
	initialize: function()
	{
		var container = $('login');
		
		if(!container)
		{
			return false;
		}
		else
		{
			container.hide();
		}
		
		var btn = $('btn-login');		
		var updating = false;
		
		var isValidForm = function()
		{
			var u = $('quick_username');
			var uField = $(u.parentNode).removeClassName('error');
			var p = $('quick_password');
			var pField = $(p.parentNode).removeClassName('error');
			var msg = '';
			var focused = false;

			if(u.value.length<=0)
			{
				msg += '\n- You didn\'t type your username.';
				uField.addClassName('error');
				if(!focused)
				{
					u.select();
					focused = true;
				}
			}
			else if(u.value.length<6)
			{
				msg += '\n- Your username must be at least 6 characters long.';
				uField.addClassName('error');
				if(!focused)
				{
					u.select();
					focused = true;
				}
			}
			
			if(p.value.length<=0)
			{
				msg += '\n- You didn\'t type your password.';
				pField.addClassName('error');
				if(!focused)
				{
					p.select();
					focused = true;
				}
			}
			else if(p.value.length<6)
			{
				msg += '\n- Your password must be at least 6 characters long.';
				pField.addClassName('error');
				if(!focused)
				{
					p.select();
					focused = true;
				}
			}

			if(msg.length==0)
			{
				return true;
			}

			alert('The form is incomplete or some field(s) are incorrect.\n' + msg);

			return false;
		};
		
		btn.observe('click', function(event){
			event.stop();
			if(!updating)
			{
				new Effect.toggle($('login'), 'slide',
				{
					duration:.2,
					beforeStart: function()
					{
						updating = true;
						if(!$F('quick_username'))
						{
							$($('quick_username').parentNode).removeClassName('error');
						}
						if(!$F('quick_password'))
						{
							$($('quick_password').parentNode).removeClassName('error');
						}
					},
					afterFinish: function()
					{
						setTimeout(function(){ updating = false; }, 500);
						if($('login').visible())
						{
							$('quick_username').focus();
						}
						else
						{
							if((q = $('q')))
							{
								q.focus();
							}
						}
					}
				});
			}
		});
		
		$('quick_username').observe('focus', function(){ this.select(); });
		$('quick_password').observe('focus', function(){ this.select(); });
		
		/*
		document.observe('mouseover', function(event){
			var elt = event.element();
			if(!updating && $('login').visible() && (elt!=$('account') && !elt.descendantOf($('account'))))
			{
				updating = true;

				setTimeout(function(){new Effect.SlideUp($('login'), 
				{
					duration:.2,
					beforeStart: function(){ updating = true; },
					afterFinish: function()
					{
						setTimeout(function(){ updating = false; }, 1500);
						if((q = $('q')))
						{
							q.focus();
						}
					}
				}); }, 1000);
			}
		});
		*/
		
		$('btn-quick-login-submit').observe('click', function(event){
			event.stop();

			if(isValidForm())
			{
				$('quick-login-form').submit();
			}
		});
		
		$('quick-login-form').observe('submit', function(event){
			if(!isValidForm())
			{
				event.stop();
			}
		});
		
	}	
});

var ProfilePane = Class.create({
	initialize: function()
	{
		var container = $('profile');
		
		if(!container)
		{
			return false;
		}
		else
		{
			container.hide();
		}
		
		var btn = $('btn-profile');		
		var updating = false;
		
		btn.observe('click', function(event){
			event.stop();
			if(!updating)
			{
				new Effect.toggle($('profile'), 'slide',
				{
					duration:.2,
					beforeStart: function()
					{
						updating = true;
					},
					afterFinish: function()
					{
						setTimeout(function(){ updating = false; }, 500);
					}
				});
			}
		});
		
		document.observe('mouseover', function(event){
			var elt = event.element();
			if(!updating && $('profile').visible() && (elt!=$('account') && !elt.descendantOf($('account'))))
			{
				new Effect.SlideUp($('profile'), 
				{
					duration:.2,
					beforeStart: function(){ updating = true; },
					afterFinish: function()
					{
						setTimeout(function(){ updating = false; }, 250);
					}
				});
			}
		});
	}	
});

document.observe('dom:loaded', function(){
	new Menu();
	new Search();
	new BackToTop();
	new LoginPane();
	new ProfilePane();
});

// ]]>