/****************************************************
* 					Pixart.it				  		*
*****************************************************
* @file	 			menu.jquery.js					*
* @descrizione	 	Classe di gestione del menu		*
* @copyright 		Copyright (c) 2010, Pixart SRL	*
****************************************************/

// Chiamata per la trasformazione di un oggetto in un oggetto menu
jQuery.fn.buildMenu = function(opt){
	// Se il parametro è nullo lo inizializza
	if(opt==null) opt = {};
	var id_menu = '#' + $(this).attr('id');
	var isIE6 = (navigator.userAgent.search('MSIE 6.0') > 0);
	// Imposta gli stili di default dei link
	if(opt.open_style==null) 			opt.open_style = {
											'background-color':'#E4E4E4',
											'color':'black'
										};
	if(opt.close_style==null) 			opt.close_style = {
											'background-color':'#E4E4E4',
											'color':'black'
										};
	if(opt.over_style==null) 			opt.over_style = {
											'background-color':'#666',
											'color':'white'
										};
	if(opt.selected_style==null)		opt.selected_style = {
											'background-color':'#666',
											'color':'white'
										};
	if(opt.link_style==null)			opt.link_style = {
											'color':'#666'
										};
	if(opt.link_selected_style==null)	opt.link_selected_style = {
											'color':'black'
										};
	if(opt.img_classes==null) 			opt.img_classes = {
										'header-open':'pixart-ui-icon-plus-gray',
										'header-close':'pixart-ui-icon-minus-gray',
										'header-open-over':'pixart-ui-icon-plus-red',
										'header-close-over':'pixart-ui-icon-minus-red',
										'header-no-child':'pixart-ui-icon-arrow-right-gray-white',
										'header-no-child-over':'pixart-ui-icon-arrow-right-red-white',
										'option-over':'pixart-ui-icon-arrow-right-white-red'
									};	
	opt.open_style['cursor'] = 'pointer';
	opt.close_style['cursor'] = 'pointer';
	opt.over_style['cursor'] = 'pointer';
	
	if(opt.href_to_link==null) 	opt.href_to_link = {
									'active':false,
									'dest_id':'default'
								};
	
	// Accede all'ul madre
	$(this).children().each(function(){
		// Scorre tutti i li dell'ul madre e li setta come ui-accordion
		$(this).children().each(function(){
			// Scorre tutti i span figli
			$(this).children('span').each(function(){
				var hasHREF = ($(this).attr('href') && $(this).attr('href')!='');
				var hasChild = !($(this).attr('nochild')=='nochild');
				var open = ($(this).attr('open')=='open');
				$(this).removeAttr('open');
				$(this).removeAttr('nochild');
				// Setta degli attributi di tipo 'data' utili alla gestione del menu
				$(this).data('opened',open);
				$(this).data('click_free',true);
				$(this).data('clicked',false);
				$(this).data('has_child',hasChild);
				// Setta gli stili di base
				if(open) $(this).css(opt.open_style);
				else $(this).css(opt.close_style);
				// Inserisce l'immagine dello stato del menu (chiuso/aperto)
				if(hasChild) var default_class = ((open) ? opt.img_classes['header-close'] : opt.img_classes['header-open']);
				else var default_class = opt.img_classes['header-no-child'];
				// Crea il pulsante di apertura/chiusura dei sotto menu
				var span = '';
				span = '<span class="menu-header-img">';
					span +='<span class="pixart-ui-icon '+ default_class +' pngFix" style="float:right;cursor:pointer;"/>';
				span +='</span>';
				// Aggiunge il pulsante al DOM
				$(this).after(span);
				// Se ha l'HREF e la traformazione in link è attiva
				if(hasHREF && opt.href_to_link['active']){
					// Setta il data->href con l'attributo href
					$(this).data('href',$(this).attr('href'));
					// Setta il data->nome con l'attributo nome
					$(this).data('nome',$(this).attr('nome'));
					// Rimuove l'attributo href
					$(this).removeAttr('href');
					// Rimuove l'attributo nome
					$(this).removeAttr('nome');
					// Imposta la funzione chiamata al click
					$(this).click(function(){
						// Imposta i click del menu allo stato iniziale
						$(id_menu).refreshClicked();
						// Imposta il link corrente come cliccato
						$(this).data('clicked',true);
						// Imposta lo stile del mouse sopra l'oggetto
						$(this).css(opt.selected_style);
						// Carica l'indirizzo href nell'oggetto destinatario del caricamento
						$('#'+opt.href_to_link['dest_id']).loadIn($(this).data('href'));
						// Esegue il tracking del link cliccato
						$.trackPage($(this).data('nome'));
					});
				}
				// Se non ha l'attributo open e ha sotto categorie, nascondo le sotto categorie
				if(!open && hasChild) $(this).parent().find('ul:eq(0)').hide();
				// Se ha sotto categorie
				if(hasChild){
					// Se si vuole che il menu sia aperto al click del mouse sul titolo
					if(!hasHREF){
						// Setta i passaggi da eseguire al click
						$(this).click(function(){
							// Controlla che il click non sia già stato effettuato
							if($(this).data('click_free')){
								// Occupa il click
								$(this).data('click_free',false);
								var opened = $(this).data('opened');
								// Effettua lo slide sull'elemento ul
								$(this).parent().find('ul:eq(0)').slideToggle('slow',function(){
									// Libera il click
									$(this).parent().find('span:eq(0)').data('click_free',true);
								});
								// Cambia il tipo di immagine negli header del menu
								var button_span = $(this).parent().find('span:last').find('span:eq(0)');
								var to_class = ((opened) ? opt.img_classes['header-open'] : opt.img_classes['header-close']);
								button_span.removeClass().addClass('pixart-ui-icon ' + to_class);
								// Cambia lo stato del link
								$(this).data('opened',!opened);
							}
						});
					}
					// Setta i passaggi da eseguire al click
					$(this).parent().find('span.menu-header-img').click(function(){
						// Controlla che il click non sia già stato effettuato
						if($(this).parent().find('span:eq(0)').data('click_free')){
							if(isIE6) $('body').find('span.menu-header-img').each(function(){$(this).hide();});
							// Occupa il click
							var link = $(this).parent().find('span:eq(0)');
							link.data('click_free',false);
							var opened = link.data('opened');
							// Effettua lo slide sull'elemento ul
							$(this).parent().find('ul:eq(0)').slideToggle('slow',function(){
								// Libera il click
								link.data('click_free',true);
								if(isIE6) $('body').find('span.menu-header-img').each(function(){$(this).show();});
							});
							// Cambia il tipo di immagine negli header del menu
							var span = $(this).find('span:eq(0)');
							var to_class = (opened) ? opt.img_classes['header-open-over'] : opt.img_classes['header-close-over'];
							span.removeClass().addClass('pixart-ui-icon ' + to_class + ' pngFix');
							// Cambia lo stato del link
							link.data('opened',!opened);
						}
					});
					// Setta il mouse over sul pulsante di apertura/chiusura menu
					$(this).parent().find('span.menu-header-img').mouseover(function(){
						var opened = $(this).parent().find('span:eq(0)').data('opened');
						var span = $(this).find('span:eq(0)');
						var to_class = (opened) ? opt.img_classes['header-close-over'] : opt.img_classes['header-open-over'];
						span.removeClass().addClass('pixart-ui-icon ' + to_class);
						if(isIE6){
							switch(to_class){
								case 'pixart-ui-icon-minus-red':
									var to_css = { top : '-37px' , left : '-157px'};
									break;
								case 'pixart-ui-icon-plus-red':
									var to_css = { top : '-7px' , left : '-157px'};
									break;							
							}
							span.find('img:eq(0)').css(to_css); 
						}
					});
					// Setta il mouse out sul pulsante di apertura/chiusura menu
					$(this).parent().find('span.menu-header-img').mouseout(function(){
						var opened = $(this).parent().find('span:eq(0)').data('opened');
						var span = $(this).find('span:eq(0)');
						var to_class = (opened) ? opt.img_classes['header-close'] : opt.img_classes['header-open'];
						span.removeClass().addClass('pixart-ui-icon ' + to_class);
						if(isIE6){
							switch(to_class){
								case 'pixart-ui-icon-minus-gray':
									var to_css = { top : '-37px' , left : '-127px'};
									break;
								case 'pixart-ui-icon-plus-gray':
									var to_css = { top : '-7px' , left : '-127px'};
									break;					
							}
							span.find('img:eq(0)').css(to_css); 
						}
						$(id_menu).refreshClasses();
					});
				}
				else{
					// Effettua il click sull'oggetto link
					$(this).parent().children('span:last').click(function(){
						$(this).parent().find('span:eq(0)').click();
					});
					// Imposta la funzione da chiamare al passaggio del mouse
					$(this).parent().children('span:last').mouseover(function(){
						// Imposta le classi del menu allo stato iniziale 
						$(id_menu).refreshClasses($(this).parent().find('span:eq(0)'));
					});
					// Setta il mouse out sul pulsante di apertura/chiusura menu
					$(this).parent().children('span:last').mouseout(function(){
						// Cambia l'icona all'uscita del mouse
						$(this).find('span:eq(0)').removeClass().addClass('pixart-ui-icon ' + opt.img_classes['header-no-child'] + ' pngFix');
						// Imposta le classi del menu allo stato iniziale 
						$(id_menu).refreshClasses();
					});				
				}			
				// Setta il mouse over del link
				$(this).mouseover(function(){
					// Imposta le classi del menu allo stato iniziale 
					$(id_menu).refreshClasses($(this));
				});
				// Setta il mouse out del link
				$(this).mouseout(function(){
					// Imposta le classi del menu allo stato iniziale 
					$(id_menu).refreshClasses();
				});
			});
			// Scorre tutti i li digli dell'ul
			$(this).find('ul:eq(0)').each(function(){
				$(this).children('li').each(function(){
					// Se non esiste lo span con l'icona del passaggio sul li col mouse, lo crea
					if($(this).find('span:eq(0)').find('span.menu-option-img').length == 0){
						// Crea l'elemento che indica la posizione del mouse corrente nel menu
						var span = '';
						span = '<span class="menu-option-img" style="display:none;">';
							span +='<span class="pixart-ui-icon '+opt.img_classes['option-over']+' pngFix"/>';
						span +='</span>';
						span +=$(this).find('span:eq(0)').html();
						// Aggiunge il nuovo elemento al DOM
						$(this).find('span:eq(0)').html(span);
					}
					// Recupera l'oggetto link
					var link = $(this).find('span:eq(0)');
					// Se la trasformazione in link è attiva
					if(opt.href_to_link['active']){
						// Imposta i parametri dell'oggetto
						// Setta il data->href con l'attributo href
						link.data('href',link.attr('href')); 
						// Setta il data->nome con l'attributo nome
						link.data('nome',link.attr('nome'));
						// Rimuove l'attributo nome
						link.removeAttr('href');
						// Rimuove l'attributo nome
						link.removeAttr('nome');
						link.data('clicked',false);
						// Imposta la funzione da eseguire al click
						link.click(function(){
							// Imposta i click del menu allo stato iniziale
							$(id_menu).refreshClicked();
							// Occupa il click
							$(this).data('clicked',true);
							// Visualizza il click nel menu
							var parent_link = $(this).parent().parent().parent().find('span:eq(0)');
							parent_link.data('clicked',true);
							parent_link.css(opt.selected_style);
							$(this).parent().find('span.menu-option-img').show();
							// Aggiorna il contenuto dell'oggetto destinatario con il nuovo indirizzo
							$('#'+opt.href_to_link['dest_id']).loadIn($(this).data('href'));
							// Esegue il tracking del link cliccato
							$.trackPage($(this).data('nome'));
						});
					}
					// Quando il mouse passa sull'opzione, visualizzo l'immagine
					link.mouseover(function(){
						$(this).find('span.menu-option-img').show();
						if(!$(this).parent().parent().parent().find('span:eq(0)').data('clicked')){
							$(this).parent().parent().parent().find('span:eq(0)').css(opt.over_style);
						}
					});
					// Quando il mouse esce dall'opzione, nascondo l'immagine
					link.mouseout(function(){
						if(!$(this).data('clicked')){
							$(this).find('span.menu-option-img').hide();
						}
					});
				});
				// Setta il mouse over dell'ul
				$(this).mouseover(function(){
					// Azzera la classe di tutti i link degli altri li
					$(this).parent().parent().children('li').each(function(){
						if(!$(this).find('span:eq(0)').data('clicked')){
							if($(this).find('span:eq(0)').data('opened')){
								$(this).find('span:eq(0)').css(opt.close_style);
							}
							else{
								$(this).find('span:eq(0)').css(opt.open_style);
							}
						}
					});
					// Setta la classe del link dell'li corrente come quello selezionato
					if(!$(this).parent().find('span:eq(0)').data('clicked')){
						$(this).parent().find('span:eq(0)').css(opt.over_style);
					}
				});
			});
		});
		$(this).mouseout(function(e) {
			mouseX = e.pageX; 
			mouseY = e.pageY;
			var top = $(this).offset().top + 1;
			var bottom = top+$(this).height() - 2;
			var left = $(this).offset().left + 1;
			var right = left+$(this).width() - 2;
			if(mouseX < left || mouseX > right || mouseY < top || mouseY > bottom){
				$(id_menu).refreshClasses();
			}
		});
	});
	
	$(this).data('opt',opt);
	
	// Restituisce l'oggetto creato
	return $(this);
	
};

//Chiamata per riportare tutte le classi del menu alla versione originale
jQuery.fn.refreshClasses = function(link){
	var global_opt = $(this).data('opt');
	// Azzera la classe di tutti i link degli altri li
	$(this).children('ul').children('li').each(function(){
		var link = $(this).find('span:eq(0)');
		if(!link.data('clicked')){
			var hasChild = link.data('has_child');
			var span = $(this).find('span:eq(0)').find('span:last');
			if(link.data('opened')){
				// Setta l'over su link
				link.css(global_opt.close_style);
				// Se ha figli setta l'icona di chiusura/apertura del menu
				if(hasChild) span.removeClass().addClass('pixart-ui-icon ' + global_opt.img_classes['header-close'] + ' pngFix');
			}
			else{
				// Setta l'over su link
				link.css(global_opt.open_style);
				// Se ha figli setta l'icona di chiusura/apertura del menu
				if(hasChild) span.removeClass().addClass('pixart-ui-icon ' + global_opt.img_classes['header-open'] + ' pngFix');
			}
		}
	});
	// Se il link viene passato, setta la classe del link corrente come quello selezionato
	if(link!=null && !link.data('clicked')) link.css(global_opt.over_style);
};

//Chiamata per riportare tutte i click sul menu alla versione originale
jQuery.fn.refreshClicked = function(){
	var global_opt = $(this).data('opt');
	// Cicla su tutte le categorie
	$(this).children('ul').children('li').each(function(){
		// Resetta il click sulla categoria
		$(this).find('span:eq(0)').data('clicked',false);
		// Cicla su tutte le sottocategorie
		$(this).children('ul').children('li').each(function(){
			// Nasconde l'immagine del link selezionato
			var link = $(this).find('span:eq(0)');
			link.find('span.menu-option-img').hide();
			link.css(global_opt.link_style);
			link.data('clicked',false);
		});
	});
};

// Chiamata che imposta il link cliccato
jQuery.fn.setSelectedLink = function(){
	$(this).resetMenu();
	var global_opt = $(this).data('opt');
	if($('#main').data('history')){
		if($('#main').data('history')[$.getHash()]){
			// Si procura l'href dalla history
			var uri = $('#main').data('history')[$.getHash()].elementUri;
		}else{
			// Si procura l'ultimo href nella history
			var uri = $('#main').data('history')[$('#main').data('history').last].elementUri;
		}
		// Trova l'elemento con quel href
		var elem = $(this).findLinkWithHREF(uri);
		// Imposta la classe dell'elemento precedentemente cliccato ed, eventualmente, della categoria superiore
		if(elem){
			if(elem.hasClass('fst-lvl')){
				elem.data('clicked',true).css(global_opt.selected_style);
			}
			if(elem.hasClass('snd-lvl')){
				elem.data('clicked',true);
				elem.find('span.menu-option-img').show();
				elem.css(global_opt.link_selected_style);
				elem.parent().parent().parent().find('span.fst-lvl').css(global_opt.selected_style).data('clicked',true);
			}
		}
	}
};

// Chiamata che permette di resettare classi e click sul menu
jQuery.fn.resetMenu = function(){
	$(this).refreshClicked();
	$(this).refreshClasses();
};

// Funzione che ricava l'href dell'ultimo link del menu cliccato
jQuery.fn.findLinkWithHREF = function(HREF){
	var links = $(this).find('span');
    for(var i=0; i <  $(this).find('span').size();i++){
    	if($(this).find('span:eq('+i+')').data('href')==HREF){
    		return $(this).find('span:eq('+i+')');
    	}
    }
    return;
};

/****************************************************/