// Common variables
var ghrs_pager_free = true;
var ghrs_pager_initialized = false;
var ghrs_jQuery = (typeof jQuery == 'function');
var ghrs_history = (ghrs_jQuery && typeof $.history == 'object');
var ghrs_gmapVisible = false; // If true open google maps on load
/* var ghrs_ajaxHeader = 'ajax_'; */
var ghrs_ajaxHeader = '!';
var ghrs_reloadFirstPage = false;
var ghrs_setPersistentValueFlag = true; // Set false up to prevent unecessary ajax request
var ghrs_gmapUrl;
var ghrs_currentMarker = null;
var ghrs_popupTargetAction = 'book';

// Maps global variables
var map;
var panorama;
var map_initialized = true;
var mapTimeout;
var mapTimeoutFail;
var	baseLatlng = new Array() // Array with mapx,mapy that should be initialized with center of locality/region
		baseLatlng['mapx'] = 0;
		baseLatlng['mapy'] = 0; 
		baseLatlng['zoom'] = 9; 
var markers = new Array();
var addMarkers = new Array();
var myLatlngs = new Array();
var markerImages = new Array();
var infoWindow;

/*
	Must be defined in xslt as:
	var googleMarkerSprite = "<xsl:value-of select='$image_url_local' />/form/marker.png";
*/


function ghrs_ajaxModifyPagerLinks() {
	if (!ghrs_history) {
		if (document.getElementById("pager_up") || document.getElementById("pager_down")) {
			var up_array = document.getElementById("pager_up").getElementsByTagName("a");
			if (up_array.length > 0) {
				for(var i = 0; i < up_array.length; i++) {
					if(ghrs_getElementClass(up_array[i]) && ghrs_getElementClass(up_array[i]).search('ajax_pager') >= 0) ghrs_setAjaxLinkUrl(up_array[i]);
				}
			}
			var down_array = document.getElementById("pager_down").getElementsByTagName("a");
			if (down_array.length > 0) {
				for (i = 0; i < down_array.length; i++) {
					if (ghrs_getElementClass(down_array[i]) && ghrs_getElementClass(down_array[i]).search('ajax_pager') >= 0) ghrs_setAjaxLinkUrl(down_array[i]);
				}
			}
		}
		else if (document.getElementById("ajax_pager_container")) {
			var a_array = document.getElementById("ajax_pager_container").getElementsByTagName("a");
			for (var i = 0; i < a_array.length; i++) {
				if (ghrs_getElementClass(a_array[i]) && ghrs_getElementClass(a_array[i]).search('ajax_pager') >= 0)	ghrs_setAjaxLinkUrl(a_array[i]);
			}
		}
		if (document.getElementById('sort_by')) {
			var sortby_array = document.getElementById("sort_by").getElementsByTagName("a");
			if (sortby_array.length > 0) {
				for (var i = 0; i < sortby_array.length; i++) {
					if (ghrs_getElementClass(sortby_array[i]) && ghrs_getElementClass(sortby_array[i]).search('ajax_pager') >= 0) ghrs_setAjaxLinkUrl(sortby_array[i]);
				}
			}
		}
	}
}

function ghrs_setAjaxLinkUrl(elem) {
	var url=String(elem.getAttribute('href'));
	if (ghrs_isExplorer7() || ghrs_isExplorer6()) ghrs_changeHREF(elem,url);
	else ghrs_setAttribute(elem,'onclick',"ghrs_changeHREF(this,'"+url+"')");
}

function ghrs_changeHREF(link,url) {
	link.removeAttribute('href');
	ghrs_setAttribute(link,"href","javascript:ghrs_refreshResultList('"+url+"')");
}

function ghrs_refreshResultList(url) {
	if(ghrs_pager_free) {
		ghrs_pager_initialized = true;
		ghrs_pager_free = false;
		addMarkers = new Array();
		var params = {'old_url':url};
		if (url.indexOf('&template=nova')>0) url = url.replace('&template=nova','');
		if (url.indexOf('&target=template')>0) url = url.replace('&target=template','');
		ghrs_makeRequest(url + '&target=ajax&format=html','ghrs_refreshResultListRequest',params);
		ghrs_refreshMap(url);
	}
}

// GOOGLE MAPS ON HOTEL LISTS

function ghrs_topMapInit() {
	$('#ajax_pager_container').before("<div id='gui_top_gmap' />");
	$('#gui_top_gmap').append('<div id="gui_top_gmap_cls" />');
	$('#gui_top_gmap_cls').append('<p id="gui_top_gmap_txt" />').find('#gui_top_gmap_txt').html(availCountMessage);
	$('#gui_top_gmap_cls').append('<p id="gui_top_gmap_bttn" onclick="$(\'#gui_mps_lnk>img\').trigger(\'click\')" >'+closeMessage+'</p>');
	$('#gui_top_gmap').append('<div id="gui_top_gmap_wrp" />');
	if ($('#gui_top_gmap_wrp').height() < 200) $('#gui_top_gmap_wrp').height(350); // Set height if not declared on CSS
	if (!ghrs_isExplorer()) $('#gui_top_gmap_wrp').fadeTo('fast', 0.6);
  var myLatlng = new google.maps.LatLng(baseLatlng['mapy'], baseLatlng['mapx']);
  var myOptions = {
    zoom: baseLatlng['zoom'],
    center: myLatlng,
    scrollwheel:false,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  map = new google.maps.Map(document.getElementById("gui_top_gmap_wrp"), myOptions);
  // Make the info window close when clicking anywhere on the map.
  google.maps.event.addListener(map, 'click', function() {ghrs_closeInfoWindow(); ghrs_currentMarker = null;});
  google.maps.event.addListener(map, 'zoom_changed', function() {
		if(ghrs_currentMarker !== null) {
			map.setCenter(myLatlngs[ghrs_currentMarker]);
			map.panBy(0,-55); // Positioning fix
		}	
  });
  panorama = map.getStreetView();
  map_initialized = true;
}
  
function ghrs_gmapsLoadScript() {
	map_initialized = false;
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=ghrs_topMapInit";
  document.body.appendChild(script);
}


function ghrs_updateTopGmap(url) {
	if (($('#gui_top_gmap').length > 0 && $('#gui_top_gmap').is(':visible')) || !map_initialized) {
		ghrs_gmapUrl = url;
		if (ghrs_currentMarker !== null) ghrs_gmapUrl += '&param[baloon]=' + ghrs_currentMarker;
		if (!ghrs_isExplorer()) $('#gui_top_gmap_wrp').fadeTo('fast', 0.6);
		if (mapTimeout) clearTimeout(mapTimeout); // Clear old timeout
		mapTimeout = setTimeout('ghrs_updateTopGmap_timeout()',100);
		if (mapTimeoutFail) clearTimeout(mapTimeoutFail); // Clear old timeout
		mapTimeoutFail = setTimeout('ghrs_updateTopGmap_fail()',10000);
	}
}

function ghrs_updateTopGmap_timeout() {
	if (map_initialized) {
		clearTimeout(mapTimeoutFail);
		var path = ghrs_gmapUrl + ((ghrs_gmapUrl.indexOf('?') == -1) ? '?' : '&') + 'param[get][map]=2&target=ajax&format=html';
		// Load markers
		$.getScript(path, function() {
			if (ghrs_isFirefox()) setTimeout('ghrs_updateTopGmap_exec()',1000); // JQuery fix to be removed when bug fixed 
			else ghrs_updateTopGmap_exec();
		});
	}	else {
		mapTimeout = setTimeout('ghrs_updateTopGmap_timeout()',500);
	}
}


function ghrs_updateTopGmap_exec() {
	if (!ghrs_isExplorer()) $('#gui_top_gmap_wrp').fadeTo('fast', 1);
	ghrs_currentMarker = null; // Reset current marker
	// Cleanup map
	panorama.setVisible(false); // Hide street view
	ghrs_closeInfoWindow(); // Close infowindow if open
	ghrs_gmapClearAllMarkers(); // Clear all markers
	// Add markers
	var googleMarkerSize = new google.maps.Size(21,32);
	var markerShadow = new google.maps.MarkerImage(
		googleMarkerSprite,
		new google.maps.Size(29,19), // Size	
		new google.maps.Point(6,0),  // Origin
		new google.maps.Point(4,16)  // Anchor
	);
	for (var i in addMarkers) {
		myLatlngs[i] = new google.maps.LatLng(addMarkers[i].geox,addMarkers[i].geoy);
		// Kind of marker
		var markerType = (((typeof addMarkers[i].match == 'undefined') || addMarkers[i].match > 0) ? 0 : 1); 
		// Create marker images
		if (typeof markerImages[i+20*markerType] != 'object') markerImages[i+20*markerType] = new google.maps.MarkerImage(googleMarkerSprite,googleMarkerSize,new google.maps.Point(21*markerType,19+32*i));
		// Add markers to the map
		if (ghrs_isExplorer6()) {
			// Fix up to prevent wrong rendering
			markers[i] = new google.maps.Marker({
				position: myLatlngs[i],
				map: map,
				title: addMarkers[i].title.replace(/amp;/g,'') // Fix entity encoding
			});
		} else {
			markers[i] = new google.maps.Marker({
				position: myLatlngs[i], 
				icon: markerImages[i+20*markerType],
				shadow: markerShadow,
				map: map,
				title: addMarkers[i].title.replace(/amp;/g,'') // Fix entity encoding
			});
		}
		if (addMarkers[i].active) ghrs_currentMarker = i;
		// Set events
		ghrs_addInfoWindow(i);
	}
	// Update hotel count
	$('#gui_top_gmap_txt_cntr').html(addMarkers.length);
	// Add markers to hotels list
	ghrs_addListMarkers(); 
	// Fit map
	if (ghrs_currentMarker !== null) ghrs_clickListMarker(); // Show acrive baloon
	else {
		for (var counter = 0 in markers) counter++;
		if (counter > 1) { 
			var bounds = new google.maps.LatLngBounds();
			for (var i in myLatlngs)	bounds.extend(myLatlngs[i]);
			map.fitBounds(bounds);
		} else {
			map.setCenter(myLatlngs[0]);
			map.setZoom(15);
		}
	}
}

function ghrs_updateTopGmap_fail() {
	clearTimeout(mapTimeout);
	$('#gui_top_gmap_wrp').fadeTo('fast', 1);
	alert('Google update failed');
	return false;
}

function ghrs_addInfoWindow(i) {
	google.maps.event.addListener(markers[i], 'click', function(e) {
		ghrs_closeInfoWindow();
		ghrs_currentMarker = i;
		map.panTo(markers[i].getPosition());
		var qs = 'action='+common_context+'_hotel_description&param[idhtl]='+addMarkers[i].idhtl;
		if (common_session) qs += '&param[idsess]='+common_session;
		qs += '&param[minrate]='+addMarkers[i].minrate + '&param[currency]='+addMarkers[i].currency + '&param[lang]=' + common_lang;
		qs += '&param[show]=baloon&target=ajax&format=html';
		if (typeof ghrs_popupPayment != 'undefined' && ghrs_popupPayment != '') qs += '&param[payment]='+ghrs_popupPayment;
		$.get(base_url,qs,function(data) {
			infoWindow = new google.maps.InfoWindow({
				content: data,
				pixelOffset: new google.maps.Size(0,28)
			});
			google.maps.event.addListener(infoWindow, 'closeclick', function() {ghrs_currentMarker = null;});
			infoWindow.open(map,markers[i]);
		})
	});
}

function ghrs_closeInfoWindow() {
	if (typeof infoWindow == 'object') infoWindow.close();
	ghrs_currentMarker = null;
}

function ghrs_gmapClearAllMarkers() {
	// Remove all markers
	if (markers.length > 0) {
		for (var i in markers) markers[i].setMap(null);
		myLatlngs = [];
		markers = [];
	}
	return true;
}

function ghrs_addListMarkers() {
	if (!$('.gui_baloon_ref').length) {
		// Add ref markers
		$('.htl_lst_wrp, .form_hotel_list_header').each(function(i,ele){
			if (typeof addMarkers[i] != 'undefined') {
				var markerRef = '<span class="gui_baloon_ref" >&nbsp;</span>';
				var markerType = (((typeof addMarkers[i].match == 'undefined') || addMarkers[i].match > 0) ? 0 : 1);
				$(ele).find('h2').prepend(markerRef).find('span:first').css('background-position','-' + (42+18*markerType)  + 'px -' + (19+32*i) + 'px').click(function(){
					ghrs_currentMarker = i;
					ghrs_clickListMarker();
				});
			}
		});
	}
}

function ghrs_clickListMarker() {
	$('html, body').animate({scrollTop:0}, "slow");
	panorama.setVisible(false); // Hide street view
	var mapZoom = map.getZoom(); 
	google.maps.event.trigger(markers[ghrs_currentMarker],'click');
	if (mapZoom < 14 || mapZoom > 17) map.setZoom(15);
	return;
}

function ghrs_refreshMap(url) {
	if (ghrs_jQuery) { 
		// Manage Multi filter map
		if (document.getElementById('gui_mps_lnk')) {
			var idMap = $('#gui_mps_lnk>img');
			// Bind click
			ghrs_currentMarker = null;
			$(idMap).unbind('click');
			$(idMap).bind('click',function() {
				if (map_initialized) {
					var text_top = $('#gui_loc_text_top, #gui_reg_txt');
					// Initialize google maps
					if ($('#gui_top_gmap').length == 0) ghrs_gmapsLoadScript();
					var top_gmap = $('#gui_top_gmap');
					var topGmapVisible = $(top_gmap).is(":visible")
					if (!topGmapVisible) {
						if (text_top.length) $(text_top).hide();
						$(top_gmap).show();
						ghrs_updateTopGmap(url);
					}
					else {
						if (text_top) $(text_top).show();
						$(top_gmap).hide();
						ghrs_currentMarker = null;
					}
					$('.gui_baloon_ref').toggleClass('gui_hddn'); // Hide baloon ref on hotel names
					if (ghrs_setPersistentValueFlag) ghrs_setPersistentValue('','gmap_open',(topGmapVisible ? '' : '1'),60); // Set map visibility
					ghrs_setPersistentValueFlag = true; // restore default value
				}
				return false;
			});
			
			// Update multiple filter map
			if ($(idMap).hasClass('gui_mps_adv')) {
				$.get(url + '&param[get][map]=1&target=ajax&format=html','', function(data) {
					$(idMap).attr('src',data.replace(/amp;/g,''));
				})
			}
		}
		// Update Main Map
		ghrs_updateTopGmap(url);
	}
	return true;
}

// END of GOOGLE MAPS ON HOTEL LISTS


function ghrs_refreshResultListRequest(http_request,params) {
	if(http_request.readyState == 4) {
		/* If the state is ready */
		if(http_request.status == 200) {
			/* If the request has been executed correctly */
			var div_container = document.getElementById("ajax_pager_container");
			if(http_request.responseText.replace(/^\s\s*/, '').replace(/\s\s*$/, '') != '' && div_container) {
				// Inject content
				div_container.innerHTML = http_request.responseText;
				// Apply ajax pager
				ghrs_ajaxModifyPagerLinks();
				// Normalize function of loaded page (currently used up to reload sample comments
				if (typeof ghrs_pageNormalize == 'function') ghrs_pageNormalize();
				// Fade-in when using JQuery
				if (ghrs_jQuery) $("#ajax_pager_container").fadeTo('fast', 1, function(){if(ghrs_isExplorer()) $(this).get(0).style.removeAttribute('filter');}); // IE fix
			}
			else {
				// On failure perform normal submit
				var before_action = String(location.href).substring(0,String(location.href).indexOf("?"));
				var after_action = String(params['old_url']).substring(String(params['old_url']).indexOf("?"),String(params['old_url']).length);
				location.href = before_action + after_action;			
			}
			ghrs_pager_free = true;
		}
	}
}

// Ajax comment request (JQuery required)
function ghrs_cmtLoader(ele,mode) {
	if (ghrs_jQuery) {
		var e = (typeof ele == 'object') ? ele : $('#'+ele);
		var lang = (typeof common_lang == 'string') ? '&param[lang]=' + common_lang : ''; 
		$(e).load('','action=form_hotel_reviews&param[get]=' + mode + '&param[idres]=' + $(e).attr('id') + lang + '&target=ajax&format=html');
	}
}

// Ajax desc loader (JQuery required)
function ghrs_descLoader(ele) {
	if (ghrs_jQuery) {
		var e = (typeof ele == 'object') ? ele : $('#'+ele);
		var lang = (typeof common_lang == 'string') ? '&param[lang]=' + common_lang : ''; 
		$(e).load('','action=form_hotel_description&param[show]=shortdesc&param[idhtl]=' + $(e).attr('id') + lang + '&target=ajax&format=html');
	}
}

// Pager normalizer (JQuery required)
function ghrs_pageNormalize() { 
	if (ghrs_jQuery) {
		$('.ajax_ex_cmmnt').each(function(i,ele) { ghrs_cmtLoader(ele,'only_short_comment') });
		$('.ajax_desc').each(function(i,ele) { ghrs_descLoader(ele) });
		$('.ajax_hddn').addClass('gui_hddn'); // Hide elements
		if (document.getElementById('gui_mps_lnk')) {
			// Modify map links
			$('.htl_lst_addr,.form_hotel_list_body .address').each(function(i,ele) {
				$(ele).find('a').click(function(e) {
					ghrs_currentMarker = i;
					e.preventDefault();
					if (!$('#gui_top_gmap_wrp').is(':visible')) {$('html, body').animate({scrollTop:0}, "slow"); $('#gui_mps_lnk>img').trigger('click');}
					else ghrs_clickListMarker();
					return false;
				})
			});
			$('.htl_lst_cnt a.img, .form_hotel_list_body .content a.img').each(function(i,ele) {
				var href = $(ele).attr('href');
				$(ele).attr('href',href + ((href.indexOf('?') >= 0) ? '&' : '?') + 'param[show]=imgslide');
			});
		}
	}
}

function ghrs_setPersistentValue(action,name,value,expire) {
	if (ghrs_jQuery) {
		if (!action) action = 'default';
		var store = '&param[param_session][' + action + '][' + name + '][value]=' + value;
		if (expire) store += '&param[param_session][' + action + '][' + name + '][expire]=' + expire;
		$.get('?action=form_session' + store + '&target=ajax&format=html', function(data) {
				/*alert(data);*/
		});
	}
}

function ghrs_toggleOtherOffers(idhtl) {
	if (ghrs_jQuery && idhtl) {
		if ($('#offr_blck_'+idhtl).hasClass('gui_hddn')) $('#offr_blck_'+idhtl+', #offr_ttl_'+idhtl).removeClass('gui_hddn').hide();
		$('#desc_lnk_'+idhtl).toggle();
		ghrs_toggleLink('htl_hdr_lnk_'+idhtl);
		ghrs_toggleLink('htl_img_lnk_'+idhtl);
		ghrs_toggleLink('htl_fbk_lnk_'+idhtl);
		$('#offr_blck_'+idhtl).slideToggle('fast');
		$('#offr_ttl_'+idhtl).slideToggle('fast',function() {
			$('#offr_tggl_'+idhtl).toggleClass('minus');
			$('#offr_tggl_'+idhtl+' span').toggleClass('gui_hddn');
		});
	}
}

// Toggle link disabled
function ghrs_toggleLink(id) {
	if (document.getElementById(id) && ghrs_jQuery) {
		var a = $('#'+id);
		if (a.attr('href')) a.data('href',a.attr('href')).removeAttr('href');
		else a.attr('href',a.data('href')).removeData('href');
	}
}

// Normalize and history support
if (ghrs_jQuery) {
	$(function() {
		// Update pager links
		ghrs_ajaxModifyPagerLinks();
		// Restore multi filter status
		$('#mlt_fltr input:checkbox').each(function(i,e) {
			if ($(e).hasClass('checked')) $(e).attr('checked','checked');
			else $(e).removeAttr('checked');
			$(e).click(function() {$(this).parent('li').not('.show_all').toggleClass('checked')}); // Attach class toggler onclick
		});
		// JQuery pager history support
		if (ghrs_history) {
			$.history.init(function(url) {
				var ajaxIndex = url.indexOf(ghrs_ajaxHeader);
				if (ajaxIndex == 0) {
					ghrs_reloadFirstPage = true;
					$("#ajax_pager_container").fadeTo('fast', 0.6, function() {window.scrollTo(0,0);});
					ghrs_refreshResultList(pager_ajax_base_link + '&' + url.substring(ajaxIndex+ghrs_ajaxHeader.length));
				} else if (ghrs_reloadFirstPage) {
					$("#ajax_pager_container").fadeTo('fast', 0.6, function() {window.scrollTo(0,0);});
					ghrs_refreshResultList(pager_ajax_base_link);
					ghrs_reloadFirstPage = false;
				} else ghrs_refreshMap(pager_ajax_base_link);
				return false;
			});

			$('.ajax_pager').live('click', function(e) {
				var href = $(this).attr('href');
				if (href.indexOf('p=')>0) href = href.replace('p=','param[page]='); // Short pager support
				var request = '';
				var start = href.indexOf("?");
				if (start >= 0) {
					var qs = href.substring(start+1);
					var par = (qs.indexOf("&")>0) ? qs.split('&') : new Array(qs);
					for (var i=0; i < par.length; i++) {
						if (par[i].indexOf("page")>0 || par[i].indexOf("ord")>0 || par[i].indexOf("dir")>0) request = request + ((request != '') ? '&' : '') + par[i];
					}
				}
				$("#ajax_pager_container").fadeTo('fast', 0.6, function() {window.scrollTo(0,0);});
				$.history.load(request != '' ? ghrs_ajaxHeader + request : '');
				return false;
			})
		}
		// Load persistent gmap
		if (ghrs_gmapVisible && document.getElementById('gui_mps_lnk')) {
			ghrs_setPersistentValueFlag = false; // Do not perform ajax request
			$('#gui_mps_lnk>img').trigger('click');
		}
		// Launch comment autoloader
		ghrs_pageNormalize();
		return false;
	});
} else {
	// Standard version
	var oldHandlerPager = window.onload;
	window.onload = function() {
		if(oldHandlerPager) oldHandlerPager();
		ghrs_ajaxModifyPagerLinks();
	}
}

