/**
 * Code by Giancarlo "GM" Moschitta (info@myphp.it) and Negatyve (http://www.negatyve.com)
 * Powered by jQuery (http://jquery.com))
**/
/* stabiliscono se sono state effettuate ricerche nei tab */
/* secondari del product finder */

var timeoutController = {};
var accessoriesSearched = false;
var usedSearched = false;

/**
 * Avvia tutti gli script necessari alla homepage di Digital
**/
function initDigitalHome()
{
	/* imposta il sistema di navigazione delle aree dinamiche */
	manageMenuTabNavigator( 'highlight-area' );
	manageMenuTabNavigator( 'products-finder' );
	manageMenuTabNavigator( 'products-list' );
	/* imposta l'apertura dei select di scelta opzioni del product-finder */
	$( 'a.product-finder-select-button' ).click
	(
		function(){ showProductsFinderSelect( this ); return false; }
	).hover
	(
		function(){},
		function(){ hideProductsFinderSelect( 'a', $(this) ); }
	);
	/* imposta l'opacità delle liste di scelta del product-finder */
	$( '.product-finder-select > ul' ).css( 'opacity', 0.90 );
	/* imposta la chiusura delle liste di scelta del product-finder al mouse out dalla lista */
	$( '.product-finder-select' ).hover
	(
		function(){ keepProductsFinderSelect( $( this ).find('ul') ); },
		function(){ hideProductsFinderSelect( 'div', $(this) ); }
	);

	var currentProductsFinderTab = $( '#products-finder-content-prices' );

	assignProductsFinderDetailsEvent( currentProductsFinderTab );
	assignProductsFinderPagerActions( currentProductsFinderTab );
	assignProductsFinderTooltipsActions( currentProductsFinderTab );

	$('.products-finder-content > .finder-header > .product-finder-select > ul').each
	(
		function()
		{
			assignProductsFinderSelectLinksAction( $(this) );
		}
	);

	$( '.finder-header > button' ).click
	(
		function()
		{
			/* nasconde tutti i selects */
			hideAllProductsFinderSelects();
			/* avvia la ricerca */
			productsFinderSearch( $(this).parent().parent() );
		}
	);
	/* setta i valori di default del timeoutController */
	$('.product-finder-select > ul' ).each
	(
		function()
		{
			timeoutController[ getFinderOptionSelectId( $(this) ) ] = false;
		}
	);
}

/**
 * Esegue una ricerca nel product finder
 *
 * @param button, object, required, Il pulsante di ricerca cliccato
**/
function productsFinderSearch( tab )
{
	var page = (arguments.length == 1) ? 1 : arguments[1];

	var params, tab_num, cat, price, maker, model, href;

	$( '.products-finder-list' ).hide();

	switch( tab.attr('id') )
	{
		case 'products-finder-content-prices':
			tab_num = 1;
			href = tab.find( '.products-finder-category > ul > li > a.selected' ).attr( 'href' );
			cat = getFinderCategory( href, arguments.length, arguments[2] );
			if( cat == '' )
			{
				return;
			}
			href = tab.find( '.products-finder-price > ul > li > a.selected').attr('href');
			if( href != undefined )
			{
				price = '&' + href.substr( href.lastIndexOf('-') + 1 );
			} else {
				price = '';
			}
			params = cat + price;
			break;
		case 'products-finder-content-accessories':
			tab_num = 2;
			href = tab.find( '.products-finder-category > ul > li > a.selected').attr('href');
			cat = getFinderCategory( href, arguments.length, arguments[2] );
			if( cat == '' )
			{
				return;
			}
			href = tab.find( '.products-finder-manufacturer > ul > li > a.selected').attr('href');
			if( href != undefined )
			{
				maker = '&' + href.substr( href.lastIndexOf('-') + 1 );
			} else {
				maker = '';
			}
			href = tab.find( '.products-finder-model > ul > li > a.selected').attr('href');
			if( href != undefined )
			{
				model = '&' + href.substr( href.lastIndexOf('-') + 1 );
			} else {
				model = '';
			}
			params = cat + maker + model;
			break;
	}
	showAjaxLoader( tab.find( '.finder-body' ) );
	$.ajax
	(
		{
			type: 'POST',
			url: SITE_PATH + 'a/ajax.php',
			data: 'c=home&m=productsFinderSearch&tab=' + tab_num + '&' + params + '&p=' + page,
			success: function( result )
			{
				hideAjaxLoader( tab.find( '.finder-body' ) );
				if( ajaxError( result ) )
				{
					return false;
				}
				var split_result = result.split('|');

				var searchResult = split_result[0];
				var searchCount = Number( split_result[1] );
				var searchPager = split_result[2];

				tab.find( '.products-finder-list' ).hide().html( searchResult ).fadeIn('fast');
				tab.find( '.pager' ).remove();

				if( searchCount == 0 )
				{
					tab.find( '.finder-footer-show-all').html('<span>Nessun risultato</span>');
				} else if( searchCount <= 21 )
				{
					tab.find( '.finder-footer-show-all').html('');
				} else {
					if( tab.attr('id') == 'products-finder-content-prices')
					{
						tab.find( '.finder-footer-show-all').html
						(
							'<a href="' + split_result[ 3 ] + '" title="Visualizza tutti">Visualizza tutti &raquo;</a>'
						);
					}
				}
				if( searchPager )
				{
					$( searchPager ).insertBefore( tab.find( ' .finder-footer-product-name' ) );
				}
				assignProductsFinderDetailsEvent( tab );
				assignProductsFinderPagerActions( tab );
				assignProductsFinderTooltipsActions( tab );
			}
		}
	);
}

/**
 * Aggiorna i select del tab relativo agli accessori del product-finder
 *
 * @param id, string, required, La classe css (id) del select selezionato
 * @param tab, object, required, Il tab di appartenenza (sempre -accessories)
**/
function updateSelectFinderOptions( id, tab )
{
	var cat = tab.find( '.products-finder-category > ul > li > a.selected').attr('href');
	var man = tab.find( '.products-finder-manufacturer > ul > li > a.selected').attr('href');

	switch( id )
	{
		case 'products-finder-category':
			/* resetta i produttori */
			resetProductsFinderMakers();
			/* resetta i modelli */
			resetProductsFinderModels();
			/* se una categoria è definita, cerca i produttori */
			if ( cat != undefined )
			{
				var category = cat.substr( cat.lastIndexOf('-') + 1 );
				$.ajax
				(
					{
						type: 'POST',
						url: SITE_PATH + 'a/ajax.php',
						data: 'c=home&m=getManufacturersByCat&category=' + category,
						success: function( result )
						{
							/* hideAjaxLoader( $('#' + area ) ); */
							if( ajaxError( result ) )
							{
								return false;
							}
							tab.find('.products-finder-manufacturer > ul').empty().html( result ).each
							(
								function(){ assignProductsFinderSelectLinksAction( $(this) ); }
							);
						}
					}
				);
			}
			break;

		case 'products-finder-manufacturer':
			/* resetta i modelli */
			resetProductsFinderModels();
			/* se un produttore è definito, cerca i modelli */
			if ( man != undefined )
			{

				var category = cat.substr( cat.lastIndexOf('-') + 1 );
				var maker = man.substr( man.lastIndexOf('=') + 1 );
				$.ajax
				(
					{
						type: 'POST',
						url: SITE_PATH + 'a/ajax.php',
						data: 'c=home&m=getModelsByMaker&category=' + category + '&maker=' + maker,
						success: function( result )
						{
							/* hideAjaxLoader( $('#' + area ) ); */
							if( ajaxError( result ) )
							{
								return false;
							}
							tab.find('.products-finder-model > ul').empty().html( result ).each
							(
								function(){ assignProductsFinderSelectLinksAction( $(this) ); }
							);
						}
					}
				);
			}
			break;
	}
}

/**
 * Resetta i produttori del product finder
**/
function resetProductsFinderMakers()
{
	var tab = $('#products-finder-content-accessories');
	tab.find('.products-finder-manufacturer > ul').empty().html
	(
		'<li><span>Nessuna marca disponibile</span></li>'
	);
	tab.find('a[href=#products-finder-manufacturer] span').html('Marca');
}

/**
 * Resetta i modelli del product finder
**/
function resetProductsFinderModels()
{
	var tab = $('#products-finder-content-accessories');
	tab.find('.products-finder-model > ul').empty().html
	(
		'<li><span>Nessun modello disponibile</span></li>'
	);
	tab.find('a[href=#products-finder-model] span').html('Modello');
}

/**
 * Restituisce l'id di una categoria di
 * prodotti in base ai parametri passati
**/
function getFinderCategory( href, args, nocat )
{
	var cat = 'ci=';
	if( href != undefined )
	{
		cat += href.substr( href.lastIndexOf('-') + 1 );
	} else {
		if( args == 3 && nocat == true)
		{
			cat += -1;
		} else {
			cat = '';
			showAlert( 'Devi selezionare la categoria' , 'alert' );
		}
	}
	return cat;
}

/**
 * Mostra le scelte relative alla ricerca nell'area products finder
 *
 * @param link, object, required, Il link selezionato
**/
function showProductsFinderSelect( link )
{
	/* recupera il link cliccato */
	var linktag = $( link );
	/* recupera l'href del link */
	var hrefid = linktag.attr('href');
	/* recupera il tab di appartenenza */
	var tab = linktag.parent().parent().parent().parent();
	/* nasconde qualunque select già aperto */
	hideAllProductsFinderSelects();
	/* mostra il select relativo al link */
	tab.find( '.' + hrefid.substr( 1 ) + ' ul ').fadeIn( 'fast' );
	/* modifica gli attributi del link */
	linktag.addClass('product-finder-select-button-selected');
}

/**
 * Nasconde un product-finder select al mouseout del link di apertura
**/
function hideProductsFinderSelect( type, item )
{
	var ul, lk, tab;
	if( type == 'div' )
	{
		ul = item.find('ul');
		lk = getFinderLinkBySelect( ul );
		tab = ul.parent().parent().parent();

		doHideProductsFinderSelect( ul, lk );

	} else {
		lk = item;
		ul = getFinderSelectByLink( lk );

		var id = getFinderOptionSelectId( ul );

		timeoutController[ id ] = true;
		setTimeout( 'hideProductsFinderOnMouseOut("' + id + '")', 1500 );
	}
}

/**
 * Nasconde un product-finder select al mouseout del link di apertura
 *
 * @param id, string, required, L'id composto dall'id del tab e del select
**/
function hideProductsFinderOnMouseOut( id )
{
	if( timeoutController[ id ] )
	{
		timeoutController[ id ] = false;
		var splitted = id.split('#');
		var select = $( '#' + splitted[0] + ' .' + splitted[1] + ' ul' );

		doHideProductsFinderSelect( select, getFinderLinkBySelect( select ) );
	}
}

/**
 * Mantiene aperto un select
 *
 * @param select, object, required, Il select da mantenere aperto
**/
function keepProductsFinderSelect( select )
{
	timeoutController[ getFinderOptionSelectId( select ) ] = false;
}

/**
 * Nasconde un select e ne ripristina il pulsante di apertura
 *
 * @param list, object, required, Il select da nascondere
 * @param link, object, required, Il link da ripristinare
**/
function doHideProductsFinderSelect( list, link )
{
	timeoutController[ getFinderOptionSelectId( list ) ] = false;
	/* nasconde il select */
	list.hide();
	/* ripristina il link */
	link.removeClass('product-finder-select-button-selected');
}

/**
 * Nasconde tutti i select di opzione nell'area products finder
**/
function hideAllProductsFinderSelects()
{
	$('.product-finder-select > ul' ).each
	(
		function(){ doHideProductsFinderSelect( $(this), getFinderLinkBySelect( $( this )) ); }
	)
}

/**
 * Recupera un select del product-finder dal link di apertura
 *
 * @param link, object, required, Il link da cui recuperare il select
**/
function getFinderSelectByLink( link )
{
	return link.parent().parent().parent().find( '.' + link.attr( 'href' ).substr( 1 ) + ' ul' );
}

/**
 * Recupera un link di apertura da un select del product-finder
 *
 * @param list, object, required, Il select del product-finder
**/
function getFinderLinkBySelect( list )
{
	return list.parent().parent().find( 'a[href=#' + list.parent().attr('class').split('product-finder-select ').join('') + ']' );
}

/**
 * Recupera l'id del tab di appartenenza dal link di apertura di un select
 *
 * @param link, object, required, Il link di apertura
**/
function getFinderTabIdByLink( link )
{
	return list.parent().parent().parent().parent().attr('id');
}

/**
 * Recupera l'id del tab di appartenenza di un select del product finder
 *
 * @param list, object, required, Il select del product-finder
**/
function getFinderTabIdBySelect( list )
{
	return list.parent().parent().parent().attr('id');
}

/**
 * Recupera la coppia di id del tab e di un select del product finder
 *
 * @param select, object, required, Il select
**/
function getFinderOptionSelectId( select )
{
	return getFinderTabIdBySelect( select ) + getFinderLinkBySelect( select ).attr('href');
}

/**
 * Visualizza una sezione dell'area products finder
 *
 * @param menu, string, required, L'id del link del menu selezionato
 * @param area, string, required, L'id del div di destinazione
**/
function showProductsFinder( menu, area )
{
	hideAllProductsFinderSelects();
	switch( area )
	{
		case 'products-finder-content-accessories':
			if( !accessoriesSearched )
			{
				accessoriesSearched = true;
				productsFinderSearch( $('#products-finder-content-accessories' ), 1, true );
			}
			break;
		case 'products-finder-content-used':
			if( !usedSearched )
			{
				usedSearched = true;
			}
			break;
	}
}

/**
 * Assegna le azioni per la selezione e la deselezione di una opzione del product-finder
 *
 * @param ul, object, required, La lista di appartenenza dei links
**/
function assignProductsFinderSelectLinksAction( ul )
{
	ul.find( 'a' ).click
	(
		function(){ setFinderOptionValue( this ); return false; }
	);
}

/**
 * Imposta il valore del select di ricerca del products-finder
 *
 * @param link, object, required, Il link cliccato
**/
function setFinderOptionValue( link )
{
	var maxLen = 15;
	/* recupera l'href del link */
	var href = $(link).attr('href');
	/* recupera la lista di appartenenza */
	var ul = $(link).parent().parent();
	/* stabilisce se selezionare il link */
	var doSelect = !$(link).hasClass('selected');
	/* deseleziona tutti i link dello stesso select */
	ul.find('li > a').removeClass('selected');

	var div = ul.parent().attr('class').replace('product-finder-select ', '' );
	var select = ul.parent().parent().find('a[href=#' + div + ']');
	/* se deve selezionare, seleziona il link */
	if( doSelect )
	{
		var section_id = ul.parent().parent().parent().attr('id');
		var title = html_entities_decode( $(link).html() );
		if( section_id == 'products-finder-content-accessories' )
		{
			if( title.length > maxLen )
			{
				title = title.substr(0, maxLen - 3 ) + '...';
			}
		}
		title = html_entities_encode( title );
		select.find('span').html( title );
		$(link).addClass('selected');
	} else {
		select.find('span').html( $(select).attr('title') );
	}
	/* nasconde il select */
	hideProductsFinderSelect( 'div', ul.parent() );
	/* recupera il tab di appartenenza */
	var tab = ul.parent().parent().parent();
	/* se il tab è quello degli accessori */
	if( tab.attr('id') == 'products-finder-content-accessories' )
	{
		/* aggiorna i select in base alla scelta */
		updateSelectFinderOptions
		(
			ul.parent().attr('class').split('product-finder-select ').join(''), tab
		);
	}
}

/**
 * Mostra i dettagli del prodotto dell'area products finder
 *
 * @param link, object, required, Il link selezionato
**/
function showProductsFinderDetails( link )
{
	var link_href = $( link ).attr( 'href' );
	var product_id = getProductIdByLink( link_href );

	$( '#products-finder-result' ).remove();
	/*showAjaxLoader( $('#' + area ) ); */

	$.ajax
	(
		{
			type: 'POST',
			url: SITE_PATH + 'a/ajax.php',
			data: 'c=home&m=getProductInfo&product=' + product_id,
			success: function( result )
			{
				/* hideAjaxLoader( $('#' + area ) ); */
				if( ajaxError( result ) )
				{
					return false;
				}
				$( 'div.products-finder' ).append( result );
				$( '#finder-close-button' ).click
				(
					function()
					{
						$( '#products-finder-result' ).remove();
					}
				);
			}
		}
	);
}

/**
 * Assegna il gestore di evento per la visualizzazione del nome del prodotto
 * al mouseover sull'immagine nella lista dei prodotti cercati
 *
 * @param tab, object, required, Il tab di appartenenza della lista di risultati
**/
function assignProductsFinderTooltipsActions( tab )
{
	tab.find( '.finder-body ul a' ).mouseover
	(
		function() { tab.find( '.finder-footer-product-name' ).html( $( this ).find('img').attr( 'alt' ) ); }
	).mouseout
	(
		function() { tab.find( '.finder-footer-product-name' ).html(''); }
	);
}

/**
 * Assegna il gestore di evento per mostrare i dettagli del prodotto selezionato nel product finder
 *
 * @param tab, object, required, Il tab di appartenenza del pulsante
**/
function assignProductsFinderDetailsEvent( tab )
{
	tab.find( '.finder-body ul a' ).click
	(
		function() { showProductsFinderDetails( this ); return false; }
	);
}

/**
 * Assegna le funzioni per il cambio pagina ad un pager del product-finder
 *
 * @param tab, object, required, Il tab di appartenenza del pager
**/
function assignProductsFinderPagerActions( tab )
{
	tab.find( '.finder-footer ul a' ).click
	(
		function()
		{
			var href = $( this ).attr( 'href' );
			var page = href.substr( href.lastIndexOf('#p') + 2 );
			productsFinderSearch( tab, page, true );
			return false;
		}
	);
}

/**
 * Gestice la navigazione a tab di un contenuto
 *
 * @param id, string, required, L'id del menu che gestisce il contenitore
**/
function manageMenuTabNavigator( id )
{
	showTheSelectedItem( id );

	$( '#' + id + '-menu > li > a' ).click
	(
		function() { tabNavigateToItem( this ); return false; }
	);
}

/**
 * Mostra l'elemento iniziale di un container
 *
 * @param id, string, required, L'id del menu che gestisce il contenitore
 *
**/
function showTheSelectedItem( id, content )
{
	var item = $( '#' + id + '-menu > li > a.selected' ).attr( 'id' );
	$( '#' + id + '-content-' + getLinkName( item ) ).show();
}

/**
 * Visualizza una sezione dell'area selezionata
 *
 * @param link, object, required, Il link selezionato
**/
function tabNavigateToItem( link )
{
	var currentLink = $( link );
	var currentLinkId = currentLink.attr( 'id' );
	var currentMenuId = currentLinkId.substr( 0, currentLinkId.lastIndexOf( '-menu') );
	var currentAreaId = currentMenuId + '-content-' + getLinkName( currentLinkId );

	$( '#' + currentMenuId + '-menu > li > a' ).removeAttr( 'class' );

	currentLink.addClass( 'selected' );

	$( '.' + currentMenuId + '-content' ).hide();
	$( '#' + currentAreaId ).show();

	switch( currentMenuId )
	{
		case 'highlight-area':
			showHighlightArea( currentLinkId, currentAreaId );
			break;

		case 'products-list':
			showProductsList( currentLinkId, currentAreaId );
			break;

		case 'products-finder':
			showProductsFinder( currentLinkId, currentAreaId );
			break;
	}
}

/**
 * Visualizza una sezione dell'area in evidenza
 *
 * @param menu, string, required, L'id del link del menu selezionato
 * @param area, string, required, L'id del div di destinazione
**/
function showHighlightArea( menu, area )
{
	if( menu == 'highlight-area-menu-reviews' || menu == 'highlight-area-menu-news' )
	{
		return;
	}
	if( $( '#' + area + ' > ol' ).html() != null )
	{
		return;
	}
	showAjaxLoader( $( '#highlight-area' ) );
	$.ajax
	(
		{
			type: 'POST',
			url: SITE_PATH + 'a/ajax.php',
			data: 'c=home&m=' + getMethodName(menu),
			success: function( result )
			{
				hideAjaxLoader( $( '#highlight-area' ) );
				if( ajaxError( result ) )
				{
					return false;
				}
				$( '#' + area + ' > h2').after( result );
				$( '#' + area + ' > h2').next().hide().fadeIn( 'slow' );
			}
		}
	);
}

/**
 * Visualizza una sezione dell'area lista prodotti
 *
 * @param menu, string, required, L'id del link del menu selezionato
 * @param area, string, required, L'id del div di destinazione
**/
function showProductsList( menu, area )
{
	var category = menu.substr( menu.lastIndexOf('-') + 1 );
	if( $( '#' + area ).html() != null )
	{
		return;
	}
	showAjaxLoader( $( '#products-list' ), 0, 500 );
	$.ajax
	(
		{
			type: 'POST',
			url: SITE_PATH + 'a/ajax.php',
			data: 'c=home&m=getProductsList&category=' + category + '&products=' + PRODUCTS_LIST_ROWS,
			success: function( result )
			{
				hideAjaxLoader( $( '#products-list' ) );
				if( ajaxError( result ) )
				{
					return false;
				}
				$( '#products-list-content-container' ).append( result );
				/*$( '#' + area ).show();*/
				$( '#' + area ).fadeIn( 'slow' );
			}
		}
	);
}

/**
 * Restituisce il nome del metodo
 *
 * @param s, string, required, Il nome del link
 * @return string
**/
function getMethodName( s )
{
	var t = s.split( '-' );
	var r = t[0];

	for( var i = 1; i < t.length; i++ )
	{
		r += t[i].substr( 0, 1 ).toUpperCase() + t[i].substr( 1 );
	}
	return r;
}

/**
 * Associa la funzione initDigitalHome all'evento onload della pagina
**/
$( document ).ready( initDigitalHome );
