﻿function jsMapInit() {
	var latlng = hongkong;
	var map_options = {
		zoom: defaultZoomLevel,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};

	map = new google.maps.Map(document.getElementById("map_canvas"), map_options);
	mgr = new MarkerManager(map);

	google.maps.event.addListener(mgr, 'loaded', function () {
		//utils.log('mgr.loaded');
		jsLoadStores();
		google.maps.event.clearListeners(mgr, 'loaded');
	});

	google.maps.event.addListener(map, 'zoom_changed', function () {
		//utils.log('map.zoom_changed');
		if (map.getZoom() < minZoomLevel && limit_zoom_level) { map.setZoom(minZoomLevel); }
		jsQueneLoadStore();
	});

	google.maps.event.addListener(map, 'dragend', function () {
		//utils.log('map.bounds_changed');
		jsQueneLoadStore();
	});

}

var _quene_id;
function jsQueneLoadStore() {
	_quene_id = (new Date()).valueOf();
	window.setTimeout("jsLoadStoresWorker('" + _quene_id + "')", 1000);
}

function jsLoadStoresWorker(q) {
	if (q == _quene_id) {
		jsLoadStores();
	} else {
		// waiting...
	}
}

function jsLoadStores(event) {
	var ne = map.getBounds().getNorthEast();
	var sw = map.getBounds().getSouthWest();
	var seq = (new Date()).valueOf();
	var ss_id = "", dtr_id = "", is_24x7 = "";

	try {
		$('input:checked[group="service"]').each(function () {
			ss_id += $(this).val() + ";";
		});
		dtr_id = $('#' + combox_id).attr('val');

		is_24x7 = $('#chx24x7').attr('checked') ? "1" : "";
	} catch (e) { }

	var q = "seq=" + seq;
	if (dtr_id == '' && event != 'search') {
		q += ("&ne_lat=" + ne.lat() + "&ne_lng=" + ne.lng() + "&sw_lat=" + sw.lat() + "&sw_lng=" + sw.lng());
	} else {
		q += ("&dtr_id=" + dtr_id);
	}
	q += ("&ss_id=" + ss_id + "&is_24x7=" + is_24x7);

	if (event) {
		q += ("&evt=" + event);
		if (event == "search") {
			try { _gaq.push(['_trackEvent', 'store_locator', 'search', $('#' + combox_id).html().trim()]); } catch (e) { }
		}
	}
	

	$.getJSON("/services/map.aspx?cmd=get_stores", q, jsStoreReturn);
}

function jsSetInfoWin(store_id) {
	var lg = _711.language;
	var store = store_list[store_id];
	var addr = store.addr[lg];
	var html = "<div id='store_info'>"
				+ "<h6>" + label.location + "</h6>"
				+	"<dl>"
				+ "<dt>" + label.address + "</dt><dd>" + addr + "</dd>"
				+ "<dt>" + label.openinghours + "</dt><dd>" + ((store.hr_247) ? label.hr24 : (label.weekday + ": " + store.hr_wkd + "<br/>" + label.saturday + ": " + store.hr_sat + "<br/>" + label.sunday + ": " + store.hr_sun)) + "</dd>"
				+ "</dl>"
				+	"<div id='store_info_serv_list'>"
				+ "<div id='serv_thumb_freedrink' class='serv serv_" + (store.has_gulp ? "1" : "0") + "'></div>"
				+ "<div id='serv_thumb_ice' class='serv serv_" + (store.has_slurpee ? "1" : "0") + "'></div>"
				+ "<div id='serv_thumb_hotshot' class='serv serv_" + (store.has_hotshot ? "1" : "0") + "'></div>"
				+ "<div id='serv_thumb_wifi' class='serv serv_" + (store.has_wifi ? "1" : "0") + "'></div>"
				+ "<div id='serv_thumb_sfexpress' class='serv serv_" + (store.has_taodot ? "1" : "0") + "'></div>"
				+	"</div>"
				+ "</div>";

	if (info_win == null) {
		info_win = new google.maps.InfoWindow({
			content: html
		});
	} else {
		info_win.setContent(html);
	}
}

function jsStoreReturn(res) {
	utils.log('jsStoreReturn cnt=' + res.stores.length);
	mgr.clearMarkers();
	var bounds = new google.maps.LatLngBounds();

	if (res.stores.length > 0) {
		$('#store_tbl #store_tbl_body').html('');
		store_list = {};
		store_id_list = [];
		$('#map_search_result').hide();
	} else {
		$('#map_search_result').show();
	}

	for (var i = 0; i < res.stores.length; i++) {
		var store = res.stores[i];
		store_list[store.id] = store;
		store_id_list[store_id_list.length] = store.id;
		var pos = new google.maps.LatLng(parseFloat(store.geo.latlng.lat), parseFloat(store.geo.latlng.lng));
		var marker = new google.maps.Marker({
			position: pos,
			props: store.id,
			icon: marker_icon_url
		});

		if (show_info) {
			google.maps.event.addListener(marker, 'click', function () {
				jsSetInfoWin(this.props);
				info_win.open(map, this);
			});
		} else {
			google.maps.event.addListener(marker, 'click', function () {
				window.location = 'store-locator.aspx';
			});
		}

		bounds.extend(pos);
		mgr.addMarker(marker, 3);

		/* add to store table */
		//$('#store_tbl #store_tbl_body').append(jsGetStoreListHTML(store, i));
	}

	if (res.stores.length > 0) {
		mgr.refresh();
		// check if is trigger by "search" event???
		for (var i = 0; i < res.attributes.length; i++) {
			var attr = res.attributes[i];
			if (attr.Key == "evt" && attr.Value == "search") {
				// fit map bound if is by "search" event
				map.setCenter(bounds.getCenter());
				map.fitBounds(bounds);
				break;
			}
		}

		$('#store_tbl #store_tbl_page').pagination(res.stores.length, {
			callback: jsLoadStoreList,
			items_per_page: store_list_pagesize,
			link_to: '#store_tbl',
			num_display_entries: 8,
			num_edge_entries: 2,
			prev_text: label.prev,
			next_text: label.next
		});
	}
}

function jsLoadStoreList(page_index, jq) {
	var items_per_page = store_list_pagesize;
	var max_elem = Math.min((page_index + 1) * items_per_page, store_id_list.length);

	if (max_elem > page_index * items_per_page) {
		$('#store_tbl #store_tbl_body').html('');
		var html = '';
		for (var i = page_index * items_per_page; i < max_elem; i++) {
			var store = store_list[store_id_list[i]];
			html += jsGetStoreListHTML(store, i);
		}
		$('#store_tbl #store_tbl_body').append(html);
	}

}

function jsGetStoreListHTML(store, i) {
	var html = "<div class='item_" + (i % 2 ? "even" : "odd")  +" clearfix'>"
		+ "<div class='dtr'>" + store.distr.name[_711.language] + "</div>"
		+ "<div class='adrr'>" + store.addr[_711.language] + "</div>";

	if (store.hr_247) {
		html += ("<div class='open'>" + label.hr24 + "</div>");
	} else {
		html += ("<div class='open'>"
			+ "<div class='wkd'>" + label.weekday + ":" + store.hr_wkd + "</div>"
			+ "<div class='sat'>" + label.saturday + ":" + store.hr_sat + "</div>"
			+ "<div class='sun'>" + label.sunday + ":" + store.hr_sun + "</div>"
			+ "</div>");
	}

	html += "<div class='serv serv_" + (store.has_gulp ? "1" : "0") + "'></div>";
	html += "<div class='serv serv_" + (store.has_slurpee ? "1" : "0") + "'></div>";
	html += "<div class='serv serv_" + (store.has_hotshot ? "1" : "0") + "'></div>";
	html += "<div class='serv serv_" + (store.has_wifi ? "1" : "0") + "'></div>";
	html += "<div class='serv serv_" + (store.has_taodot ? "1" : "0") + "'></div>";

	html += "</div>";

	return html;
}

function jsCheckLocation() {
	if (navigator.geolocation) {
		var geo_option = {
			timeout: (5 * 1000),
			maximumAge: (1000 * 60 * 15),
			enableHighAccuracy: true
		};
		//navigator.geolocation.getCurrentPosition(jsFoundLocation, jsLocationNoFound, geo_option);
		navigator.geolocation.getCurrentPosition(jsFoundLocation, jsLocationNoFound);
	} else if (google.gears) {
		var geo = google.gears.factory.create('beta.geolocation');
		geo.getCurrentPosition(jsFoundLocation, jsLocationNoFound);
	}
}

function jsFoundLocation(position) {
	var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

	try {
		var geoCoder = new google.maps.Geocoder();
		geoCoder.geocode({ 'latLng': latlng }, function (results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				if (results.length > 1) {
					utils.log("Browser Position Found: " + results[0].formatted_address);
					_gaq.push(['_trackEvent', 'geo_check', results[1].formatted_address]);
				}
			}
		});
	} catch (e) {
	}
	map.setCenter(latlng);
}

function jsLocationNoFound(error) {
	utils.log(error);
}

function jsLoadDistrict() {
	var d = 'dt=district';
	$('#districtPane').hide();

	$.getJSON('/services/query.aspx', d, function (data) {
		$.each(data, function (i, item) {
			var html = "<a class='item' ref='" + item.district_id + "'>" + item["name_" + _711.language] + "</a>";
			$('#districtPane div.' + item.region_code.toLowerCase()).append(html);
		});
		$('#districtPane div.grp').append('<div style="clear:both;"></div>');

		$('#districtPane div.grp a.item').click(function () {
			$('#districtPane div.grp a.item').removeClass('selected');
			$(this).addClass('selected');
			$('#cbxDistrict').click().attr('val', $(this).attr('ref')).html($(this).html());
		});

		$('#districtSelect #cancel').click(function () {
			$('#districtPane div.grp a.item').removeClass('selected');
			var o = $('#cbxDistrict').attr('orginal');
			$('#cbxDistrict').attr('val', '').html(o);
		});

	});
}

$(function () {
	jsLoadDistrict();
	jsMapInit();
	jsCheckLocation();
	$("#map_filter_control").click(function () {
		jsLoadStores("search");
	});
	$('#cbxDistrict').toggle(function () {
		$('#districtPane').slideDown();
	}, function () {
		$('#districtPane').slideUp();
	})
});




