var requestPending;
var splash;
var SPLASH_BG_PATH = GFX + 'graphic/shared/splash.png';
var LOADING_PATH = GFX + 'graphic/shared/loading.gif';
var advanced_search, ajax_div_listing, reinitLink, listing, adv_search_current_url;
var search_block, search_url, search_input, search_loader, search_result, search_dropdown;

Event.observe(window, 'load', gs_ajax_init);

function gs_ajax_init(event){
	var ajaxRedirectSpan, ajaxRedirect, ajaxRedirectUrl;

		//Remove load listener
	Event.stopObserving(window, 'load', gs_ajax_init);

	requestPending = new Object;

		//Do listing init
	ajax_div_listing = $('ajax_div_listing');
	if(ajax_div_listing != null && !MSIE6 && !MSIE7 && !MSIE8){
		advanced_search = $('advanced_search');
		reinitLink = $$('#advanced_search .init a')[0];
		listing = $('listing');
		ajaxRedirectSpan = $$('.js_params.js_ajax_redirect')[0];
		adv_search_current_url = window.location.href;
		ajax_div_listing.setStyle({'position':'relative'});
		listing.setStyle({'position':'relative'});
		gs_ajax_listing_init();
		if(ajaxRedirectSpan != null){
			ajaxRedirect = JSON.parse(ajaxRedirectSpan.innerHTML);
			ajaxRedirectSpan.remove();

			ajaxRedirectUrl = 'http://' + ajaxRedirect[0];
			Object.keys(ajaxRedirect[1]).each(function(idx){
				ajaxRedirectUrl += idx + '/' + ajaxRedirect[1][idx].join('-') + '/';
			});

			if(location.href != ajaxRedirectUrl){
				gs_ajax_listing_update(ajaxRedirectUrl, 'type1', false, false);
			}
		}
	}

		//Do search block init
	search_block = $('search_block');
	if(search_block != null){
		search_block.getElementsBySelector('input').each(function(input){
			if(input.getAttribute('type') == 'hidden'){
				search_url = input.getAttribute('value');
			}
		});
		gs_ajax_searchBlock_init();
	}
}

	/********** Listing **********/
	//Define events
function gs_ajax_listing_init(){
	var filterLinks = $$('#advanced_search td a');
	var paginLinks = $$('#ajax_div_listing .pagin a');

	requestPending.listing = false;

	if(reinitLink != null){
		reinitLink.observe('click', gs_ajax_listing_type1Handler);
		reinitLink.observe('advancedSearch:sliderChange', gs_ajax_listing_type1Handler);
	}

	filterLinks.each(function(link){
		link.observe('click', gs_ajax_listing_type1Handler);
	});

	paginLinks.each(function(link){
		if(link.getAttribute('href') != '#'){
			link.observe('click', gs_ajax_listing_type2Handler);
		}
	});
}

	//Handle click event - update type 1
function gs_ajax_listing_type1Handler(event){
	event.stop();
	gs_ajax_listing_configRequest(event, 'type1');
}

	//Handle click event - update type 2
function gs_ajax_listing_type2Handler(event){
	event.stop();
	gs_ajax_listing_configRequest(event, 'type2');
}

	//Allow and configure ajax request
function gs_ajax_listing_configRequest(event, type){
	if(!requestPending.listing){
		adv_search_current_url = event.findElement('a').getAttribute('href');
		gs_ajax_listing_update(event.findElement('a').getAttribute('href'), type, event.shiftKey);
	}
}

	//Make splash screen
function gs_ajax_listing_splash(){
	var overallListing, offset, padding_1, padding_2, padding_3;

	requestPending.listing = true;

	overallListing = $$('#topOfMain .content .contenuListing')[0];
	offset = overallListing.cumulativeOffset();

		//IE6 IE7 hack
	padding_3 = padding_2 = padding_1 = 0;
	if($('bandeauPubTopListing').innerHTML != ''){
		padding_1 = $('bandeauPubTopListing').getHeight();
	}

	if(advanced_search != null){
		padding_2 = (advanced_search.getHeight() - $$('#advanced_search .head')[0].getHeight()) / 2 + $$('#advanced_search .head')[0].getHeight();
	}

	if(padding_2 == 0){
		padding_3 = 100;
	}

	splash = new Element('div');
	splash.setStyle({'position':'absolute'});
	splash.setStyle({'height':overallListing.getHeight() - (padding_1 + padding_2 + padding_3) + 'px'});
	splash.setStyle({'width':overallListing.getWidth() + 'px'});
	splash.setStyle({'left':offset[0] + 'px'});
	splash.setStyle({'top':offset[1] + 'px'});
	splash.setStyle({'paddingTop':padding_1 + padding_2 + padding_3 + 'px'});
	splash.setStyle({'textAlign':'center'});
	splash.setStyle({'backgroundImage':'url(' + SPLASH_BG_PATH + ')'});
	splash.update('<p style="padding:5px 0px;font-weight:bold; background-image:url(' + LOADING_PATH + '); background-repeat:no-repeat; background-position:center center;">Chargement…</p>');

	overallListing.insert({'after':splash});
	if(overallListing.cumulativeScrollOffset()[1] > 161){
		overallListing.scrollTo();
	}
}

	//Update pages tile
function gs_ajax_listing_updatePageTitle(newContent){
	document.title = newContent;
}

	//Update advanced search block
function gs_ajax_listing_updateAdvancedSearch(newContent){
	if(advanced_search != null){
		advanced_search.remove();
		ajax_div_listing.insert({'before':newContent});
		advanced_search = $('advanced_search');
		reinitLink = $$('#advanced_search .init a')[0];
		gs_ajax_listing_init();
		if(Cufon!=null){
			Cufon.replace($$('#advanced_search h1'));
			Cufon.replace($$('#advanced_search h2'));
			Cufon.replace($$('#advanced_search h3'));
			Cufon.replace($$('#advanced_search .init a'));
		}
		advancedSearch_init();
	}
}

	//Update pagin and listing content
function gs_ajax_listing_updatePaginNListing(newContent){
	ajax_div_listing.update(newContent);
	splash.setStyle({'height':$$('#topOfMain .contenuListing')[0].getHeight() + 'px'});
	gs_ajax_listing_init();
	if(Cufon!=null){
		Cufon.replace(ajax_div_listing.getElementsBySelector('.marketing p'));
	}
	setTimeout(sizes_init, 100);
}

	//Update handler
function gs_ajax_listing_update(url, updateType, slowAnim, writeStat){
	var duration = 0.25;
	var updateFunction;
	var urlForTracking;

	if(writeStat || writeStat == null){
		stat(url);
	}

	if(slowAnim){
		duration = 2;
	}

	urlForTracking = url.substring(7, url.length);
	urlForTracking = urlForTracking.substring(urlForTracking.indexOf('/'), urlForTracking.length);

	switch(updateType){
		case 'type1':
			updateFunction = function(response){
				_gaq.push(['_trackPageview', urlForTracking]);
				gs_ajax_listing_updatePageTitle(response.responseJSON.pageTitle);
				gs_ajax_listing_updateAdvancedSearch(response.responseJSON.advancedSearch);
				new Effect.Opacity(ajax_div_listing, { 
					'from':1,
					'to':0,
					'duration':duration,
					'afterFinish':function(){
						gs_ajax_listing_updatePaginNListing(response.responseJSON.paginTop + response.responseJSON.listing + response.responseJSON.paginBottom);
						new Effect.Opacity(ajax_div_listing, {'from':0, 'to':1, 'duration':duration, 'afterFinish':gs_ajax_listing_updateComplete});
					}
				});
			}
			break;
		case 'type2':
			updateFunction = function(response){
				_gaq.push(['_trackPageview', urlForTracking]);
				new Effect.Opacity(listing ,{
					'from':1,
					'to':0,
					'duration':duration,
					'afterFinish':function(){
						gs_ajax_listing_updatePaginNListing(response.responseJSON.paginTop + response.responseJSON.listing + response.responseJSON.paginBottom);
						listing = $('listing');
						listing.setStyle({'position':'relative'});
						listing.setStyle({'opacity':'0'});
						new Effect.Opacity(listing, {'from':0, 'to':1, 'duration':duration, 'afterFinish':gs_ajax_listing_updateComplete});
					}
				});
			}
			break;
	}

	new Ajax.Request(url,{'parameters':{'ajax':'1'}, 'onLoading':gs_ajax_listing_splash, 'onSuccess':updateFunction});
}

	//Update complete
function gs_ajax_listing_updateComplete(){
	requestPending.listing = false;

	splash.remove();
	splash = null;
}

	/********** Search block **********/
	//Define events
function gs_ajax_searchBlock_init(){
	requestPending.searchBlock = false;

	search_input = search_block.getElementsBySelector('.text')[0];
	search_submit = search_block.getElementsBySelector('.submit')[0];

	search_input.observe('focus', gs_ajax_searchBlock_focusHandler);
	search_input.observe('keydown', gs_ajax_searchBlock_keyDownHandler);
	search_input.observe('blur', gs_ajax_searchBlock_blurHandler);
}

	//Focus handler
function gs_ajax_searchBlock_focusHandler(e){
	if(search_input.value == 'Recherche rapide'){
		search_input.value = '';
	}

	if(search_input.value.length > 2 && search_result == null){
		gs_ajax_searchBlock_makeSearch(search_input.value);
	}
	gs_ajax_searchBlock_dropdownHandler();
}

	//Blur handler
function gs_ajax_searchBlock_blurHandler(event){
	if(search_input.value == ''){
		search_input.value = 'Recherche rapide';
	}

	if(search_dropdown =! null && search_dropdown.removeMe){
		gs_ajax_searchBlock_removeDropdown();
	}
}

	//Keydown handler
function gs_ajax_searchBlock_keyDownHandler(event){
	if(event.keyCode == 40 || event.keyCode == 38){
		gs_ajax_searchBlock_changeSelectionWithKeyboard(event.keyCode);
		Event.stop(event);
	}else if(event.keyCode == 27){
		gs_ajax_searchBlock_removeDropdown();
		Event.stop(event);
	}else if(event.keyCode == 13 || event.keyCode == 10){
		search_dropdown.getElementsBySelector('p').each(function(pElement, idx){
			if(pElement.hasClassName('selected')){
				Event.stop(event);
				window.location = search_result[idx].url;
				return;
			}
		});
	}else{
		setTimeout(function(){
			if(search_input.lastSearch != search_input.value){
				search_input.lastSearch = search_input.value;
				search_result = null;
			}

			if(search_input.value.length > 2){
				if(search_result == null){
					gs_ajax_searchBlock_makeSearch(search_input.value);
				}
			}else{
				gs_ajax_searchBlock_cancelSearch();
				gs_ajax_searchBlock_removeDropdown();
			}
		}, 0);
	}
}

	//Make ajax search
function gs_ajax_searchBlock_makeSearch(search_string){
	//gs_ajax_searchBlock_cancelSearch();
	//if(!requestPending.searchBlock){
		search_block.lastXHR = new Ajax.Request(search_url + 'containers/ajax_fastSearch/', {'parameters':{'searchUrl':null, 'searchString':search_string}, 'onLoading':function(e){requestPending.searchBlock = true}, 'onSuccess':gs_ajax_searchBlock_makeSearchHandler});
		gs_ajax_searchBlock_makeLoader();
	//}
}

	//Cancel request
function gs_ajax_searchBlock_cancelSearch(){
	if(search_block.lastXHR != null && search_block.lastXHR._complete == false){
		search_block.lastXHR.abort();
		gs_ajax_searchBlock_removeLoader();
		requestPending.searchBlock = false;
	}
}

	//Process ajax response
function gs_ajax_searchBlock_makeSearchHandler(response){
	search_result = response.responseJSON;
	gs_ajax_searchBlock_removeLoader();
	gs_ajax_searchBlock_dropdownHandler();

	requestPending.searchBlock = false;
}

	//Make loader
function gs_ajax_searchBlock_makeLoader(){
	if(search_loader == null){
		search_loader = new Element('img', {'style':'position:absolute;', 'src':GFX + 'graphic/shared/loading.gif'});
		search_loader.setStyle({'height':Math.round(search_input.getWidth() / 208 * 13) + 'px'});
		search_loader.setStyle({'width':search_input.getWidth() + 'px'});
		search_block.insert({'bottom':search_loader});
	}
}

	//Remove loader
function gs_ajax_searchBlock_removeLoader(){
	if(search_loader != null){
		search_loader.remove();
		search_loader = null;
	}
}

	//Make & update dropdown
function gs_ajax_searchBlock_dropdownHandler(){
	if(search_result != null && search_result.length > 0){
		if(search_dropdown == null){
			search_dropdown = new Element('div', {'id':'search_block_dropdown'});
			search_dropdown.clonePosition(search_input, {'setHeight':false, 'setWidth':false, 'setTop':false});
			search_dropdown.setStyle({'top':search_input.cumulativeOffset()[1] + 16 + 'px'});
			$('main').insert({'bottom':search_dropdown});
		}

		search_dropdown.update('');
		search_dropdown.removeMe = true;
		search_result.each(function(product){
			var pElement;

			pElement = new Element('p', {'id':'search_product_id_' + product.id});
			pElement.update('<a href="' + product.url + '">' + product.title + '</a>');
			pElement.observe('mouseover', gs_ajax_searchBlock_changeSelectionWithMouse);
			pElement.observe('mousedown', function(e){search_dropdown.removeMe = false;});
			search_dropdown.insert({'bottom':pElement});
		});
	}else{
		gs_ajax_searchBlock_removeDropdown();
	}
}

	//Remove dropdown
function gs_ajax_searchBlock_removeDropdown(){
	if(search_dropdown != null){
		search_dropdown.remove();
		search_dropdown = null;
	}
}

	//Change selection in drop down using keyboard
function gs_ajax_searchBlock_changeSelectionWithKeyboard(keyCode){
	var start;
	var listLength;

	if(search_dropdown != null){
		listLength = search_dropdown.getElementsBySelector('p').length;

		search_dropdown.getElementsBySelector('p').each(function(pElement, idx){
			if(pElement.hasClassName('selected')){
				start = idx;
			}
			pElement.removeClassName('selected');
		});

		if(keyCode == 40){
			if(start == null || start == listLength - 1){
				start = 0;
			}else{
				start++;
			}
		}else if(keyCode == 38){
			if(start == null || start == 0){
				start = listLength - 1;
			}else{
				start--;
			}
		}

		gs_ajax_searchBlock_changeSelectionExec(search_dropdown.getElementsBySelector('p')[start]);
	}
}

	//Change selection in drop down using keyboard
function gs_ajax_searchBlock_changeSelectionWithMouse(event){
	search_dropdown.getElementsBySelector('p').each(function(pElement, idx){
		pElement.removeClassName('selected');
	});

	gs_ajax_searchBlock_changeSelectionExec(event.findElement('p'));
}

	//Execute selection change
function gs_ajax_searchBlock_changeSelectionExec(selected){
	selected.addClassName('selected');
	if(selected.cumulativeOffset()[1] + selected.getHeight() - search_dropdown.cumulativeOffset()[1] - search_dropdown.scrollTop > search_dropdown.getHeight()){
		search_dropdown.scrollTop = selected.cumulativeOffset()[1] + selected.getHeight() - search_dropdown.cumulativeOffset()[1] - search_dropdown.getHeight();
	}else if(selected.cumulativeOffset()[1] - search_dropdown.cumulativeOffset()[1] - search_dropdown.scrollTop < 0){
		search_dropdown.scrollTop += selected.cumulativeOffset()[1] - search_dropdown.cumulativeOffset()[1] - search_dropdown.scrollTop;
	}
}