var f = null;

window.addEvent('load', function() {
	init();
});

window.addEvent('unload', function() {
	f = null;
});

function init()
{
	f = new Engine();
	f.init( document );
}

var Engine = new Class({
	
	init: function( obj )
	{
		this.menus( obj.getElements('.menu') );
		this.actions( obj.getElements('.action') );
		this.zooms( obj.getElements('.zoom') );
		this.requireds( obj.getElements('.form-required') );
		var addcart = obj.getElement('.addcart');
		if (addcart)
			this.addcart( addcart );
		
		this.relabels( obj.getElements('.relabel') );
		this.suggests( obj.getElements('.suggest') );
	},
	
	menus: function( objs )
	{
		objs.each( this.menu.bind(this) );
	},
	
	/*
	menu: function( obj, i )
	{
		obj.submenus = obj.getElements('ul');
		for (var k=0; k<obj.submenus.length; k++)
		{
			var submenu = obj.submenus[k];
			submenu.trigger_li = submenu.getParent('li');
			submenu.trigger = submenu.trigger_li.getElement('a');
			var height = submenu.getSize().y;
			submenu.fx = new Fx.Tween( submenu, {
				'property': 'height',
				'duration': 500,
				'transition': Fx.Transitions.Quad.easeOut,
				'link': 'cancel'
			} ).set(0);
			submenu.closed = true;
			submenu.trigger.addEvent('click', function( submenus, k, height ) {
				for (var i=0; i<submenus.length; i++)
				{
					var submenu = submenus[i];
					if (k == i)
					{
						if (!submenu.trigger.hasClass('menu-withsub-opened'))
						{
							submenu.fx.start( height );
							submenu.trigger.addClass('menu-withsub-opened');
						}
						else
						{
							submenu.fx.start( 0 );
							submenu.trigger.removeClass('menu-withsub-opened');
						}
					}
					else
					{
						submenu.fx.start( 0 );
						submenu.trigger.removeClass('menu-withsub-opened');
					}
				}
			}.pass([obj.submenus, k, height], this) );
			
			submenu.trigger.addEvent('click', function( e ) { new Event(e).stop(); } );
			
			submenu.trigger.addClass('menu-withsub');
			submenu.setStyles( { 'overflow': 'hidden' } ); // , 'width': submenu.trigger_li.getSize().x
		}
	},
	*/
	
	menu: function( obj, i )
	{
		if (Browser.Engine.trident && (Browser.Engine.version == 4))
			obj.to = 1;
		else
			obj.to = 0;
		
		//obj.closeTimer = []
		obj.submenus = obj.getElements('ul');
		
		for (var k=0; k<obj.submenus.length; k++)
		{
			var submenu = obj.submenus[k];
			
			submenu.trigger_li = submenu.getParent('li');
			submenu.trigger = submenu.trigger_li.getElement('a');
			submenu.inject( document.body , 'top' );
			
			//document.title += 'l: '+ submenu.trigger_li.getPosition().x;
			submenu.removeClass('js');
			
			var height = submenu.getSize().y;
			submenu.fx = new Fx.Tween( submenu, {
				'property': 'height',
				'duration': 500,
				'transition': Fx.Transitions.Quad.easeOut,
				'link': 'cancel'
			} ).set( obj.to );
			submenu.closed = true;
			submenu.trigger.addEvent('mouseenter', function( obj, k, height ) {
				if (obj.closeTimer) { $clear(obj.closeTimer); }
				for (var i=0; i<obj.submenus.length; i++)
				{
					var submenu = obj.submenus[i];
					if (k == i)
					{
						if (!submenu.trigger.hasClass('menu-withsub-opened'))
						{
							submenu.setStyles( { 'left': submenu.trigger_li.getPosition().x, 'top': (submenu.trigger_li.getPosition().y + 30) } )
							submenu.setStyle('z-index', 10);
							submenu.fx.start( height );
							submenu.trigger.addClass('menu-withsub-opened');
						}
					}
					else
					{
						submenu.setStyle('z-index', 9);
						submenu.fx.start( obj.to );
						submenu.trigger.removeClass('menu-withsub-opened');
					}
				}
			}.pass([obj, k, height], this) );
			/*submenu.addEvent('mouseleave', function( submenus, k, height ) {
				var submenu = submenus[k];
				submenu.fx.start( obj.to );
				submenu.trigger.removeClass('menu-withsub-opened');
			}.pass([obj.submenus, k, height], this) );*/
			
			
			submenu.addEvent('mouseenter', function(obj, k) {
				if (obj.closeTimer) $clear(obj.closeTimer);
			}.pass([obj, k], this) );
			submenu.addEvent('mouseleave', function(obj, k) {
				obj.closeTimer = this.menuClose.delay(200, this, [obj,k]);
			}.pass([obj, k], this) );
			submenu.trigger.addEvent('mouseleave', function(obj, k) {
				obj.closeTimer = this.menuClose.delay(200, this, [obj,k]);
			}.pass([obj, k], this) );
			
			//submenu.trigger.addEvent('click', function( e ) { new Event(e).stop(); } );
			
			submenu.trigger.addClass('menu-withsub');
			submenu.setStyles( { 'overflow': 'hidden' } ); //, 'margin-left': 
		}
	},
	
	menuClose: function( obj, k )
	{
		if (obj.closeTimer) $clear(obj.closeTimer);
		for (var i=0; i<obj.submenus.length; i++)
		{
			var submenu = obj.submenus[i];
			submenu.setStyle('z-index', 9);
			submenu.fx.start( obj.to );
			submenu.trigger.removeClass('menu-withsub-opened');
		}
	},
	
	relabels: function( objs )
	{
		objs.each( this.relabel.bind(this) );
	},
	
	relabel: function( obj )
	{
		var frm = obj.getParent('form');
		var labels = frm.getElements('label');
		for (var i=0; i<labels.length; i++)
		{
			if (labels[i].get('for') == obj.get('id'))
			{
				obj.defValue = labels[i].get('html');
				labels[i].dispose();
			}
		}
		
		if (obj.get('value').length == 0)
			obj.set('value', obj.defValue);
		obj.addEvent('focus', function(obj) {
			if (obj.get('value') == obj.defValue)
				obj.set('value', '');
		}.pass(obj, this) );
		obj.addEvent('blur', function(obj) {
			if (obj.get('value') == '')
				obj.set('value', obj.defValue);
		}.pass(obj, this) );
	},
	
	suggests: function( objs )
	{
		objs.each( this.suggest.bind(this) );
	},
	
	suggest: function( obj )
	{
		// prepare
		obj.index = -1;
		obj.previous = obj.get('value');
		var pos = obj.getCoordinates();
		obj.box = new Element('div', {'class': 'suggest-box'} ).setStyles( { 'left': pos.left, 'top': pos.bottom } ).inject( obj, 'after' );
		obj.xhr = new Request( ).addEvent('onSuccess', this.suggestParse.pass(obj, this) );
		obj.frm = obj.getParent('form');
		
		// action!
		obj.addEvent('focus', this.suggestFocus.pass(obj, this) );
		obj.addEvent('blur', this.suggestBlur.pass(obj, this) );
		obj.addEvent('keydown', function(e, obj) { this.suggestKey(e, obj); if (obj.previous == obj.get('value')) return true; if (obj.suggtimer) $clear(obj.suggtimer); obj.suggtimer = this.suggestExec.delay(1000, this, obj); }.bindWithEvent(this, obj) );
	},
	
	suggestKey: function( e, obj )
	{
		if (!obj.items)
			return false;
		
		if (e.key == 'down')
			obj.index++;
		if (e.key == 'up')
			obj.index--;
		if (e.key == 'enter')
		{
			this.suggestDone( obj, obj.index );
			e.stop();
		}
		
		if ( (e.key == 'down') || (e.key == 'up') )
		{
			if (obj.index < 0)
				obj.index = obj.items.length-1;
			if (obj.index > obj.items.length-1)
				obj.index = 0;
			
			for (var i=0; i<obj.items.length; i++)
				obj.items[i].removeClass('suggest-box-item-focus');
			obj.items[obj.index].addClass('suggest-box-item-focus');
		}
	},
	
	suggestFocus: function( obj )
	{
		obj.box.setStyle('display', '');
	},
	
	suggestBlur: function( obj )
	{
		obj.box.setStyle('display', 'none');
	},
	
	suggestExec: function( obj )
	{
		obj.index = -1;
		obj.previous = obj.get('value');
		
		obj.xhr.cancel();
		obj.xhr.send( { url: obj.get('rel') + '&q=' + obj.get('value') } );
	},
	
	suggestParse: function( obj )
	{
		obj.items = []
		obj.box.empty();
		
		var json = JSON.decode( obj.xhr.response.text );
		if (json.results.length > 0)
		{
			for (var i=0; i<json.results.length; i++)
			{
				var item = json.results[i];
				var string = item.value.replace( obj.get('value'), '<strong>' + obj.get('value') + '</strong>' );
				obj.items[i] = new Element('a', {'html': '<span>' + item.counter + '</span>' + string, 'rel': item.value, 'href': 'javascript:;'} )
				.addEvent('mousedown', this.suggestDone.pass([obj, i], this) )
				.inject( obj.box );
			}
		}
	},
	
	suggestDone: function( obj, i )
	{
		obj.set('value', obj.items[i].get('rel') );
		obj.frm.submit();
	},
	
	actions: function( objs )
	{
		objs.each( this.action.bind(this) );
	},
	
	action: function( obj )
	{
		obj.xhr = new Request( );
		obj.xhr.addEvent('onComplete', this.actionParse.pass(obj, this) );
		obj.addEvent('click', this.actionExec.pass(obj, this) );
	},
	
	actionExec: function( obj )
	{
		obj.xhr.send( { url: obj.get('href') + '&client=xhr&response=json' } );
		return false;
	},
	
	actionParse: function( obj )
	{
		var response = JSON.decode( obj.xhr.response.text );
		if (response)
		{
			var item = $('item_' + response.id);
			if (item)
			switch (response.action)
			{
				case 'cart_added':
					item.addClass('stock-item-incart');
				break;
				case 'cart_removed':
					item.removeClass('stock-item-incart');
				break;
				case 'lightbox_added':
					item.addClass('stock-item-inlightbox');
				break;
				case 'lightbox_removed':
					item.removeClass('stock-item-inlightbox');
				break;
			}
			
			if (response.msg)
			{
				var message = new Element('div', {'class': 'stock-msg', 'html': '<span>' + response.msg + '</span>'} ).inject( $$('body')[0], 'top' );
				message.fx = new Fx.Tween( message ).set('opacity', 0);
				if (response.action.indexOf('cart') > -1)
					var anchor = $('cart');
				if (response.action.indexOf('lightbox') > -1)
					var anchor = $('lightbox');
				var pos = anchor.getPosition();
				var size = anchor.getSize();
				message.setStyles( { 'left': pos.x - (size.x/2), 'top': pos.y + size.y } );
				message.fx.start('opacity', 1);
				//message.fx.start.delay(2000, message.fx, ['opacity', 0])
				
				var fn = function(message) { message.fx.start('opacity', 0)
											.chain( function(message) { message.dispose(); }.pass(message) ) 
											}
				fn.delay(2000, this, message);
			}
			
			if (response.total)
			{
				if (response.action.indexOf('cart') > -1)
					var anchor = $('cart');
				if (response.action.indexOf('lightbox') > -1)
					var anchor = $('lightbox');
				anchor.getElement('span').set('html', '(' + response.total + ')');
			}
		}
	},
	
	zooms: function( objs )
	{
		objs.each( this.zoom.bind(this) );
	},
	
	zoom: function( obj )
	{
		obj.addEvent('mouseenter', this.zoomOpen.pass(obj, this) );
		obj.addEvent('mouseleave', this.zoomClose.pass(obj, this) );
	},
	
	zoomOpen: function( obj )
	{
		var pos = obj.getPosition();
		obj.zoom = new Element('div', { 'class': 'stock-zoom' } ).inject( $$('body')[0], 'top' );
		obj.zoom.img = new Element('img', { 'src': obj.get('rel') } );
		obj.zoom.img.addEvent('load', function(obj) {
			var size = {'x': obj.zoom.img.width, 'y': obj.zoom.img.height }
			obj.zoom.setStyles( { 'left': pos.x - size.x, 'top': pos.y - size.y } )
			obj.zoom.img.inject( obj.zoom );
		}.pass(obj, this) );
	},
	
	zoomClose: function( obj )
	{
		obj.zoom.dispose();
	},
	
	requireds: function( objs )
	{
		objs.each( this.required.bind(this) );
	},
	
	required: function( obj )
	{
		obj.addEvent('submit', function(obj) {
			obj.errors = []
			var inputs = obj.getElements('.required');
			for (var i=0; i<inputs.length; i++)
			{
				this.requiredCtrl(obj, inputs[i]);
			}
			if (obj.errors.length > 0)
			{
				alert('Sono stati riscontrati i seguenti errori: ' + '\n\n' + obj.errors.join('\n') );
				return false;
			}
		}.pass(obj, this) )
	},
	
	requiredCtrl: function( obj, inp )
	{
		var input = inp.getElement('input');
		var label = inp.getElement('label');
		if (input.get('value') == 0)
		{
			obj.errors.push('\t' + '- Completare il campo ' + label.get('html') );
			return false;
		}
		if (inp.hasClass('required-mail'))
		{
			var exp = /^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$/;
			if (!input.get('value').test(exp))
			{
				obj.errors.push('\t' + '- Il campo ' + label.get('html') + ' deve essere una casella mail corretta' );
				return false;
			}
		}
		if (inp.hasClass('required-password'))
		{
			var compare = $('password').get('value');
			if (input.get('value') != compare)
			{
				obj.errors.push('\t' + '- Le due password non combaciano' );
				return false;
			}
		}
	},
	
	addcart: function( obj )
	{
		obj.xhr = new Request( );
		obj.xhr.addEvent('onComplete', this.actionParse.pass(obj, this) );
		obj.xhr.addEvent('onComplete', function(obj) { obj.defcheck = obj.currcheck; this.addcartParse(obj, obj.defcheck); }.pass(obj,this) );
		
		obj.inputs = obj.getElements('input[type=radio]');
		obj.submit = obj.getElement('input[type=submit]');
		for (var i=0; i<obj.inputs.length; i++)
		{
			if (obj.inputs[i].get('checked'))
				obj.defcheck = i;
			obj.inputs[i].addEvent('change', this.addcartParse.pass([obj,i], this) );
		}
		
		obj.addEvent('submit', function(obj) {
			obj.xhr.send( { url: obj.get('action') + '&client=xhr&response=json', data: obj } );
			return false;
		}.pass(obj,this) )
		
		this.addcartParse( obj, obj.defcheck );
	},
	
	addcartParse: function( obj, i )
	{
		for (var k=0; k<obj.inputs.length; k++)
			obj.inputs[k].getParent('tr').removeClass('stock-details-cart-selected');	
		
		obj.inputs[i].getParent('tr').addClass('stock-details-cart-selected');
		if (obj.inputs[i].get('value') == 'reset')
			obj.submit.set('value', '- togli dal carrello');
		else
			obj.submit.set('value', '+ aggiungi al carrello');
		obj.submit.getParent('div').setStyle('visibility', (i == obj.defcheck) ? 'hidden' : 'visible');
		
		obj.currcheck = i;
	}
});


// IE FIX !!!!!!
Document.implement({

	id: (function(){
	    var types = {
	        string: function(id, nocash, doc){
	            id = doc.getElementById(id);
	            return (id) ? types.element(id, nocash) : null;
	        },

	        element: function(el, nocash){
	            $uid(el);
	            if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
	                var proto = Element.Prototype;
	                var p;
	                if( Browser.Engine.trident ){
	                    for (p in proto) {
	                        if ( !el[p] ) { el[p] = proto[p]; }
	                    }
	                } else {
	                    for (p in proto) {
	                        el[p] = proto[p];
	                    }
	                }                   
	            }
	            return el;
	        },

	        object: function(obj, nocash, doc){
	            if (obj.toElement) { return types.element(obj.toElement(doc), nocash); }
	            return null;
	        }

	    };

	    types.textnode = types.whitespace = types.window = types.document = $arguments(0);

	    return function(el, nocash, doc){
	        if (el && el.$family && el.uid) { return el; }
	        var type = $type(el);
	        return (types[type]) ? types[type](el, nocash, doc || document) : null;
	    };

	})()

});
