//-----------------------------------------------------------------
// Store locator
//-----------------------------------------------------------------
function initStoreLocator(docroot,siteId, locale, pageId, cg, numPerPage, mapCg) {
	Event.observe(window, 'load', function() {
		addFormEvents(docroot, siteId, locale, pageId, cg, mapCg, numPerPage);
	});
}

function callStoreLocator(docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage, currPage) {
	if(term) {

		// clean markers
		var map = gmaps.get(mapCg);
		if(map) {
			map.clearOverlays();			
		}
		
		showAjaxWaitingScreen('storeLocator-waiting');
		var url = docroot + '/servlet/AjaxActionServlet?';
		url += 'siteid='+siteId;
		url += '&locale='+locale;
		url += '&action=storeLocator';
		url += '&pageId='+pageId;
		url += '&cg='+cg;
		url += '&mapCg='+mapCg;
		url += '&_storeLocatorForm_term='+encodeURIComponent(term);
		if(numPerPage) {
			url += '&numPerPage='+numPerPage;
		}
		if(currPage) {
			url += '&page='+currPage;
		}
		if($('_bool_hasDiscs') && (Form.Element.getValue($('_bool_hasDiscs'))=='1' || Form.Element.getValue($('_bool_hasDiscs'))=='checked_prefill')) {
			url += '&hasDiscs=1';
		}
		if($('_bool_hasDemos') && (Form.Element.getValue($('_bool_hasDemos'))=='1' || Form.Element.getValue($('_bool_hasDemos'))=='checked_prefill')) {
			url += '&hasDemos=1';
		}
		if($('_bool_hasMachines') && (Form.Element.getValue($('_bool_hasMachines'))=='1' || Form.Element.getValue($('_bool_hasMachines'))=='checked_prefill')) {
			url += '&hasMachines=1';
		}
		if($('_distance')) {
			url += '&_distance='+encodeURIComponent(Form.Element.getValue($('_distance')));
		}
		
		for(var i = 1; i <= 40; i++) {
			var fieldName = '_FreeField'+i;
			if($(fieldName)) {
				url += '&'+fieldName+'='+encodeURIComponent(Form.Element.getValue($(fieldName)));
			}
		}
		
		new Ajax.Request(url, {
			method: 'post',
			onComplete: function() {
				hideAjaxWaitingScreen('storeLocator-waiting');
			},
			onSuccess: function(response) {
				showStoreLocatorResult(response, docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage);
				selectFirstMarker(mapCg);
			}
		});			
	}
}

function showStoreLocatorResult(response, docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage) {
	var xmlDoc = response.responseXML;
	if(xmlDoc) {
		var elem = xmlDoc.firstChild;
		if(elem) {
			var code = elem.getAttribute("code");
			if (code != '0') {
				// TODO: frontend error handling
				alert('Error [' + code + ']');
			} else {
				// paging
				if(elem.getElementsByTagName('paging')) {
					var pagingContent = elem.getElementsByTagName('paging')[0].firstChild.nodeValue;
					$$('.storeLocatorResult-paging').each(function(item){
						item.update(pagingContent);
					});
					addStoreLocatorPagingEvents(docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage);
				}
				// dealer list
				if($('storeLocator-'+cg)) {
					var map = gmaps.get(mapCg);
					resetMap(mapCg);
					var div = $('storeLocator-'+cg).down('div.list');
					var listitems = elem.getElementsByTagName('locationlist')[0].firstChild.nodeValue;
					Element.replace(div, listitems);
					createStoreLocatorResultEvents(mapCg);
				}
				// map markers
				if(elem.getElementsByTagName('markers')) {
					var markersNode = elem.getElementsByTagName('markers')[0];
					var mapId = markersNode.getAttribute('mapId');
					var markers = $A(markersNode.getElementsByTagName('marker'));
					markers.each(function(marker){
						var entityid = marker.getElementsByTagName('entityid')[0].firstChild.nodeValue;
						var lat = marker.getElementsByTagName('lat')[0].firstChild.nodeValue;
						var lng = marker.getElementsByTagName('lng')[0].firstChild.nodeValue;
						var icon = marker.getElementsByTagName('icon')[0].firstChild.nodeValue;
						var infowindow = marker.getElementsByTagName('infowindow')[0].firstChild.nodeValue;
						addMarker(mapId, lat, lng, infowindow, entityid, 'markerCallback', icon);
					});
				}
			}
		}
	}	
}

function addFormEvents(docroot, siteId, locale, pageId, cg, mapCg, numPerPage) {
	$('storeLocatorForm').observe('submit', function(event) {
		event.preventDefault();
		fireCallStoreLocator(docroot, siteId, locale, pageId, cg, mapCg, numPerPage);
	});
	
	$('storeLocatorForm-btnSubmit').observe('click', function(item) {
		fireCallStoreLocator(docroot, siteId, locale, pageId, cg, mapCg, numPerPage);
	});	
}

function fireCallStoreLocator(docroot, siteId, locale, pageId, cg, mapCg, numPerPage) {
	var termId = 'storeLocatorForm-term-' + cg;
	if(!Form.Element.getValue($(termId)).empty()) {
		var term = Form.Element.getValue($(termId));
		callStoreLocator(docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage);
	}
}

function addStoreLocatorPagingEvents(docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage) {
	$$('div.storeLocatorPaging a.pagingLink').each(function(item){
		var pageNum = 0;
		Element.classNames(item).each(function(className) {
			if (className.indexOf('pagingLinkNum_')==0) {
				pageNum = parseInt(className.substring('pagingLinkNum_'.length, className.length));
			}
		});
		item.observe('click', function(event){
			event.preventDefault();
			if(!item.up('div').hasClassName('inactive')) {
				callStoreLocator(docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage, pageNum);
			}
		});
	});

	$$('div.storeLocatorPaging a.pagenum').each(function(item){
		var pageNum = 0;
		Element.classNames(item).each(function(className) {
			if (className.indexOf('pagenum_')==0) {
				pageNum = parseInt(className.substring('pagenum_'.length, className.length));
			}
		});
		item.observe('click', function(event){
			event.preventDefault();
			if(!item.hasClassName('current')) {
				callStoreLocator(docroot, siteId, locale, pageId, cg, term, mapCg, numPerPage, pageNum);
			}
		});
	});

}

function createStoreLocatorResultEvents(mapCg) {
	$$('div.storeLocator-listitem').each(function(item){

		item.observe('click', function(event){
			var entryId = getItemEntryId(item);
			var lat = item.down('div.lat').firstChild.nodeValue;
			var lng = item.down('div.lng').firstChild.nodeValue;
			selectMarker(mapCg, entryId);
		});

	});
}


function getItemEntryId(item) {
	var entryId = item.id;
	if(entryId && entryId.indexOf('storeLocator-listitem-')==0) {
		entryId = entryId.substring('storeLocator-listitem-'.length, entryId.length);
	}
	return entryId;
}

function selectFirstMarker(mapCg) {
	var firstItem = $$('div.storeLocator-listitem').first();
	if(firstItem) {
		var entryId = getItemEntryId(firstItem);
		selectMarker(mapCg, entryId);
	}
}

function selectMarker(mapCg, entryId) {
	var map = gmaps.get(mapCg);
	if(map) {
		if(gmarkers && entryId) {
			var marker = gmarkers.get(entryId);
			if(marker)
				map.setZoom(15); // TODO: get zoom level from content load
				GEvent.trigger(marker, "click");
		} else {
			map.setZoom(15); // TODO: get zoom level from content load
			map.panTo(new GLatLng(lat, lng));					
		}
	}
}

function markerCallback(markerId, marker) {
	GEvent.addListener(marker, 'click', function() {
		$$('.storeLocator-listitem').each(function(item) {
			item.removeClassName('selected');
			if(item.id == 'storeLocator-listitem-'+markerId) {
				item.addClassName('selected');
			}
		});
	});
}

