var Site = {
	start : function() {
		Dumper.log('KlappoAlpha::SITE_INIT');
		
		// Fix per Internet Explorer
		if (Browser.Engine.trident)
			Site.fixExplorer();
		
		// Check sulle potenzialit� del browser, per attivare o meno le animazioni
		Site.powerfulBrowser = checkPowerfulBrowser();
		
		// Inizializza il tooltip informativo sulla versione alpha
		Site.alphaTooltip = new AlphaTooltip();
		
		// Inizializza il blocco di navigazione principale
		Site.mainSearch = new MainSearch();
		Site.navigationMenu = new NavigationMenu();
		
		// Sulla base della pagina corrente attiva gli script necessari
		Site.pageCheck();
		
		Dumper.log('KlappoAlpha::SITE_READY');
	},

	fixExplorer : function() {
		$$('table').set('cellspacing', 0);
	},
	
	pageCheck: function() {
		var pageID = $$('body')[0].get('id');
		switch(pageID) {
			case 'homepage':
				Site.initHomepage();
				break;
				
			case 'elenco_post':
			case 'ricerca_blog':
			case 'dettaglio_post':
				Site.initBlog();
				break;
				
			case 'dettaglio_ingrediente':
			case 'dettaglio_produttore':
			case 'dettaglio_brand':
				Site.initDetailPage();
				break;
				
			case 'dettaglio_prodotto':
				Site.initIngredientsList();
				Site.initDetailPage();
				break;
		}
	},
	
	initHomepage: function() {
		var flashObject = new Swiff('/modelli/assets/swf/header.swf', {
		    id: 'klappoHomepageFlash',
		    container: $('flash_actions'),
		    width: 410,
		    height: 410,
		    params: {
		        wmode: 'transparent'
		    },
		    vars: {
		        xml: "/modelli/assets/swf/header.xml"
		    }
		});
	},
	
	initBlog: function() {
		Site.tagsController = new TagsController();
	},
	
	initDetailPage: function() {

		// Inizializza i testi collasabili
		Site.collapsableItems = new CollapsableItems();
		
		// Inizializza la galleria
		Site.detailGallery = new DetailGallery();	
	},
	
	initIngredientsList: function() {
		// Inizializza la lista ingredienti
		Site.ingredientsList = new IngredientsList();
	}
};

var IngredientsList = new Class ({
	initialize: function() {
		if(!$defined($('sort_quantity'))) return;
		
		Dumper.log('KlappoAlpha::INGREDIENTS_LIST_INIT');
		
		this.container = $('ingredients');
		
		// Attiva la lista ingredienti e le funzioni di riordino
		this.sortLinksArray = new Hash({
			quantity      : $('sort_quantity').getElement('a'),
			abc           : $('sort_alphabetical').getElement('a'),
			role          : $('sort_function').getElement('a'),
			currentSortBy : 'quantity'
		});
		
		// Attiva i link per il riordino
		this.sortLinksArray.quantity.addEvent('click',function(event){this._sortByQuantity(event);}.bind(this));
		this.sortLinksArray.abc.addEvent('click',function(event){this._sortByABC(event);}.bind(this));
		this.sortLinksArray.role.addEvent('click',function(event){this._sortByRole(event);}.bind(this));
		
		// Crea l'array che contiene gli elementi degli ingredienti e le funzioni di riordino
		this.ingredientsListArray = new IngredientsListArray();
		this._createIngredientsArray();
		
		// Gestione dell'interazione con la lista
		this.showElements           = 6;
		this.expandContractListLink = this.container.getElement('.expand_collapse_action');
		this.expandContractStatus   = false;
		this._activateExpandContract();
		
	},
	
	_activateExpandContract : function() {
		
		if(this.ingredientsListArray.getIngredientsNumber() <= this.showElements) {
			
			// Nel caso gli ingredienti da visualizzare siano meno degli ingredienti minimi, toglie scrollbar e link per la visualizzazione estesa
			this.expandContractListLink.addClass('hidden');
			this.container.getElement('.ingredients_container').setStyles({
				overflow : 'auto',
				height   : 'auto'
			})
		} else {
			
			// Attiva il controllo per l'espansione della lista
			this.expandContractListLink.addEvent('click',function(event){this._expandContractLink(event);}.bind(this));
		}
	},
	
	_createIngredientsArray : function() {
		// Crea un array temporaneo contenente tutti gli elementi degli ingredienti
		var ingredientElements = this.container.getElements('.ingredient');
		
		// Inserisce gli elementi degli ingredienti nell'oggetto per la loro gestione
		for (var i=0; i < ingredientElements.length; i++) {
			this.ingredientsListArray.pushElement(ingredientElements[i]);
		};
	},
	
	_expandContractLink : function(event) {
		event.preventDefault();
		if (!this.expandContractStatus) {
			Dumper.log('expand');
			this.container.getElement('.ingredients_container').setStyles({
				'overflow-y' : 'auto',
				height   : 'auto'
			})
			this.expandContractListLink.getElement('.expand').addClass('hidden');
			this.expandContractListLink.getElement('.contract').removeClass('hidden');
			this.expandContractStatus = true;
		} else {
			Dumper.log('contract')
			this.container.getElement('.ingredients_container').setStyles({
				'overflow-y' : 'scroll',
				height   : 337
			})
			this.expandContractListLink.getElement('.expand').removeClass('hidden');
			this.expandContractListLink.getElement('.contract').addClass('hidden');
			this.expandContractStatus = false;
		}
	},
	
	_redrawIngredientList : function() {
		// Ottiene e svuota il contentitore degli ingredienti
		var elementsContainer = this.container.getElement('.ingredients_container');
		elementsContainer.empty();
		
		// Ri-stampa gli ingredienti ordinati 
		for (var i=0; i < this.ingredientsListArray.getIngredientsNumber(); i++) {
			var iEl = this.ingredientsListArray.getElement(i);
			iEl.inject(elementsContainer);
		}
	},
	
	_sortByQuantity : function(event) {
		event.preventDefault();
		var currentSortBy = this.sortLinksArray.get('currentSortBy').toString();
		
		if (currentSortBy != 'quantity') {
			this.ingredientsListArray.sortByQuantity();
			this.sortLinksArray.get(currentSortBy).removeClass('current');
			this.sortLinksArray.get('quantity').addClass('current');
			this.sortLinksArray.set('currentSortBy','quantity');
			this._redrawIngredientList();
		}
	},
	
	_sortByABC : function(event) {
		event.preventDefault();
		var currentSortBy = this.sortLinksArray.get('currentSortBy').toString();
		
		if (currentSortBy != 'abc') {
			this.ingredientsListArray.sortByABC();
			this.sortLinksArray.get(currentSortBy).removeClass('current');
			this.sortLinksArray.get('abc').addClass('current');
			this.sortLinksArray.set('currentSortBy','abc');
			this._redrawIngredientList();
		}
	},
	
	_sortByRole : function(event) {
		event.preventDefault();
		var currentSortBy = this.sortLinksArray.get('currentSortBy').toString();
		
		if (currentSortBy != 'role') {
			this.ingredientsListArray.sortByRole();
			this.sortLinksArray.get(currentSortBy).removeClass('current');
			this.sortLinksArray.get('role').addClass('current');
			this.sortLinksArray.set('currentSortBy','role');
			this._redrawIngredientList();
		}
	}
});

var IngredientsListArray = new Class({
	
	initialize: function() {
		this.ingredients = new Array();
	},
	
	getIngredientsNumber: function() {
		return this.ingredients.length;
	},
	
	getElement: function(i) {
		var tmpEl = this.ingredients[i].get('element').clone(true,true);
		return tmpEl;
	},
	
	pushElement: function(element) {
		var tmpHash = new Hash({
			element: null,
			sort   : new Hash({
				quantity : 0,
				abc      : '',
			    role     : 0
			})
		});
		
		// Salva l'elemento per il riordino
		tmpHash.set('element',element.clone(true,true));
		
		// Legge i dati sull'ingredienti salvati nell'id dell'elemento
		var iSortArray = element.get('id').split('_');
		
		// Riordino alfabetico
		tmpHash.sort.set('abc',iSortArray[0]);
		
		// Riordino per quantit�, utilizza l'ordine di pubblicazione
		tmpHash.sort.set('quantity',parseInt(iSortArray[1]));
		
		/* Riordino per ruolo dell'ingrediente
		 
		   0. IP: Principio attivo
		   1. PP: Prodotto
	       2. II: Ingrediente
		   3. IA: Addensante
		   4. IE: Eccipiente
		   
		   */
		
		switch (iSortArray[2]) {
			case 'IP':
				tmpHash.sort.set('role',0);
				break;
			case 'PP':
				tmpHash.sort.set('role',1);
				break;
			case 'II':
				tmpHash.sort.set('role',2);
				break;
			case 'IA':
				tmpHash.sort.set('role',3);
				break;
			case 'IE':
				tmpHash.sort.set('role',4);
				break;
		}
		
		this.ingredients.push(tmpHash);
	},
	
	sortByQuantity: function() {
		this.ingredients.sort(function(a, b){
			a = a['sort']['quantity'];
			b = b['sort']['quantity'];
			
			if (a==b) return 0;
			return (a > b) ? 1 : -1;
		});
	},
	
	sortByRole: function() {
		this.ingredients.sort(function(a, b){
			a = a['sort']['role'];
			b = b['sort']['role'];
			
			if (a==b) return 0;
			return (a > b) ? 1 : -1;
		});
	},
	
	sortByABC: function() {
		this.ingredients.sort(function(a, b){
			a = a['sort']['abc'];
			b = b['sort']['abc'];
			
			if (a==b) return 0;
			return (a > b) ? 1 : -1;
		});
	}
});

var DetailGallery = new Class ({
	initialize: function() {
		Dumper.log('KlappoAlpha::DETAIL_GALLERY_INIT');
		
		this.container       = $('gallery');
		this.controlsContainer = this.container.getElement('.controls');
		this.thumbsContainer = this.container.getElement('div.thumbnails > .container');
		this.linkPrev        = this.container.getElement('li.prev > a');
		this.linkNext        = this.container.getElement('li.next > a');
		this.labelCurrent    = this.container.getElement('span.current');
		this.labelTotal      = this.container.getElement('span.total');
		
		this.thumbsArray     = this.thumbsContainer.getElements('a');
		this.currentImage	 = 1;
		this.totalImages     = this.thumbsArray.length;
		
		if(this.totalImages<=1) {
			this.controlsContainer.destroy();
			return;
		}
		
		this.isFirst         = true;
		this.isLast          = false;
		this.thumbSize       = this.thumbsArray[0].getSize();
		
		this.labelCurrent.set('text',this.currentImage);
		this.labelTotal.set('text',this.totalImages);
		this.thumbsContainer.setStyle('width',this.thumbSize.x * this.totalImages);
		
		this.next = function(event){ this._next(event); }.bind(this);
		this.prev = function(event){ this._prev(event); }.bind(this);
		
		this.linkPrev.addEvent('click',this.prev);
		this.linkNext.addEvent('click',this.next);
	},
	
	_UpdateGalleryStatus:function() {
		if (this.currentImage == 1) {
			this.isFirst = true;
		} else {
			this.isFirst = false;
		};
		
		if (this.currentImage == this.totalImages) {
			this.isLast = true;
		} else {
			this.isLast = false;
		};
		
		this.labelCurrent.set('text',this.currentImage);
		this.labelTotal.set('text',this.totalImages);
		
		if (Site.powerfulBrowser) {
			this.thumbsContainer.tween('left',this.thumbSize.x * (this.currentImage-1) * -1);
		} else {
			this.thumbsContainer.setStyle('left',this.thumbSize.x * (this.currentImage-1) * -1);
		}
	},
	
	_next:function(event) {
		event.preventDefault();
		
		if(!this.isLast) {
			this.currentImage++;
			this._UpdateGalleryStatus();
			Dumper.log('KlappoAlpha::NEXT_IMAGE');
		};
	},
	
	_prev:function(event) {
		event.preventDefault();
		
		if(!this.isFirst) {
			this.currentImage--;
			this._UpdateGalleryStatus();
			Dumper.log('KlappoAlpha::PREV_IMAGE');
		};
	}
});

var TagsController = new Class ({
	initialize: function() {
		Dumper.log('KlappoAlpha::TAGS_CONTROLLER_INIT');
		
		this.action  = $('all_tags');
		this.bigList = $('tags_long');
		
		this.status = false;
		
		this.action.addEvent('click', this._toggle.bind(this));
	},
	
	_toggle:function() {
		if (this.status) {
			this.bigList.addClass('hidden');
			this.action.getElement('.open').removeClass('hidden');
			this.action.getElement('.close').addClass('hidden');
			this.status = false;
		} else {
			this.bigList.removeClass('hidden');
			this.action.getElement('.close').removeClass('hidden');
			this.action.getElement('.open').addClass('hidden');
			this.status = true;
		};
	}
});

var CollapsableItems = new Class ({
	initialize: function() {
		Dumper.log('KlappoAlpha::COLLAPSABLE_ITEMS_INIT');
		
		this.collapsableTexts = new Array();
		
		var tmpCollapsables = $$('.collapsable_text')
		for (var i=0; i < tmpCollapsables.length; i++) {
			this.collapsableTexts.push(new CollapsableText(tmpCollapsables[i]));
		}
	}
});

var CollapsableText = new Class ({
	initialize: function(e) {
		Dumper.log('KlappoAlpha::COLLAPSABLE_TEXT_INIT');
		
		this.container = $(e);
		this.expanded  = this.container.getElement('.expanded_content');
		this.contract  = this.container.getElement('.collapsed_content');
		this.expander  = this.container.getElement('.expander');
		
		this.status = false;
		
		this.toggle = function(event){ this._toggle(event); }.bind(this);
		this.expander.addEvent('click',this.toggle);
	},
	
	_toggle:function(event) {
		event.preventDefault();
		if (this.status) {
			this.expanded.addClass('hidden');
			this.contract.removeClass('hidden');
			this.status = false;			
		} else {
			this.contract.addClass('hidden');
			this.expanded.removeClass('hidden');
			this.status = true;			
		};
	}
});

function checkPowerfulBrowser() {
	
	var isPowerful = false;
	
	if (Browser.Engine.name == 'webkit')
		isPowerful = true;
	
	if (Browser.Engine.name == 'gecko' && Browser.Engine.version > 18)
		isPowerful = true;
	
	if (Browser.Engine.name == 'trident' && Browser.Engine.version > 5)
		isPowerful = true;
	
	return isPowerful;
}

var AlphaTooltip = new Class ({
	initialize: function() {
		Dumper.log('KlappoAlpha::ALPHA_TOOLTIP_INIT');
		
		if (!$('alpha_tooltip'))
			return;
		
		this.container    = $('alpha_tooltip');
		this.closeButton  = $('alpha_tooltip_close');
		this.openBanner   = $('alpha_label');
		this.revealEffect = new Fx.Reveal(this.container, {duration: 500, mode: 'vertical'});
		this.alphaCookie  = Cookie.read('klappoAlphaCookie');
		
		if (!this.alphaCookie) {
			this.container.removeClass('hidden');
			this.alphaCookie = Cookie.write('klappoAlphaCookie', 'visited', {duration: 7});
			this.status      = true;
			this.delayTimer  = this._toggle.delay(4000,this);
		} else {
			this.status = false;
		}
		
		this.closeButton.addEvent('click', this._toggle.bind(this));
		this.openBanner.addEvent('click', this._toggle.bind(this));
		this.openBanner.setStyle('cursor','pointer');
	},
	
	_toggle: function() {
		if (!Site.powerfulBrowser) {
			this.container.toggle();
		} else {
			if (this.status) {
				this.revealEffect.dissolve();
				this.delayTimer = $clear(this.delayTimer);
				this.status = false;
			} else {
				this.revealEffect.reveal();
				this.status = true;
			}
		}
	}
});

var MainSearch = new Class ({
	initialize: function(){
		Dumper.log('KlappoAlpha::MAIN_SEARCH_INIT');
		
		if (!$('main_search'))
			return;
		
		this.whatInput = $('search_input');
		this.whatHint = $('search_snippet');
		this.searchBtn = $('search_submit');
		this._activateSearchHint();
		this._activateSubmit();
		
		if (Browser.Platform.ipod)
			this._fixIpodForm();
	},

	_activateSearchHint: function() {
		
		// Al click sull'hint, lo nasconde ed assegna il focus all'input
		this.whatHint.addEvent('click',function(){
			Site.mainSearch.whatHint.addClass('hidden');
			Site.mainSearch.whatInput.focus();
		})
		
		// Al focus sull'input, nasconde l'hint
		this.whatInput.addEvent('focus',function(){
			Site.mainSearch.whatHint.addClass('hidden');
		})
		
		// Al blur dell'input, nel caso non sia stato immesso testo visualizza l'hint
		this.whatInput.addEvent('blur',function(){
			if (Site.mainSearch.whatInput.get('value') == '') {
				Site.mainSearch.whatHint.removeClass('hidden');
			}
		})
		
		// Nel caso il campo di testo contenga gi� qualcosa, nascone l'hint
		if (this.whatInput.get('value') != '') {
			this.whatHint.addClass('hidden');
		}
	},
	
	_activateSubmit: function() {
		
		// Submit del form di ricerca
		this.searchBtn.addEvent('click',function(event){
			event.preventDefault();
			$('main_search').submit();
		})
	},
	
	_fixIpodForm: function() {
		$('main_search').getElement('.input_container').addClass('ipod');
	}
});

var NavigationMenu = new Class ({
	initialize: function(){
		Dumper.log('KlappoAlpha::NAVIGATION_MENU_INIT');
		
		this.menuItems = new Array();
		this.itemsElement = $$('.navigation_item');
		
		for(var i=0; i < this.itemsElement.length; i++) {
			this.menuItems.push(new NavigationMenuItem(this.itemsElement[i]));
		}
	}
});

var NavigationMenuItem = new Class ({
	initialize: function(e){
		this.container     = e;
		this.tab           = this.container.getElement('.tab');
		this.content       = this.container.getElement('.content');
		
		this.status = (this.container.hasClass('closed')) ? false : true;
		
		this.tab.addEvent('mouseenter',this._show.bind(this));
		this.tab.addEvent('click',this._tabclick.bind(this));
	},
	
	_show: function() {
		this.container.removeClass('closed');
		this.container.addEvent('mouseleave',this._hide.bind(this));
		this.status = true;
	},
	
	_hide: function() {
		this.container.addClass('closed');
		this.container.removeEvent('mouseleave');
		this.status = false;
	},
	
	_tabclick: function() {
		Dumper.log('KlappoAlpha::TAB');
		if (this.status) {
			this._hide();
		} else {
			this._show();
		}
	}
});

var Dumper = {
	containerId : "dump",
	enabled : true,

	log : function() {
		if (Dumper.enabled) {
			try {
				var subj = arguments.length == 1 ? arguments[0] : arguments;
				console.log(subj);
			} catch (err) {
			}
		}
	},

	dir : function() {
		if (Dumper.enabled) {
			try {
				var subj = arguments.length == 1 ? arguments[0] : arguments;
				console.dir(subj);
			} catch (err) {
			}
		}
	},

	add : function($var) {
		try {
			var p = new Element("p");
			p.setText($var);
			$(this.containerId).appendChild(p);
		} catch (err) {
		}
	}
}

window.addEvent('domready', function() {
	Site.start();
});

