// !!! required jQuery.js

var markers = {};
var _categories = {};
var _icons = [];
var types = [];
var selected = {};
var gmap;
var map_contents = {};
var yakuba_map_contents = {};
var spa_map_contents = {};

var initialZoomLevel = 13;
var invidualZoomLevel = 14;
var data_url = '/map/map_data.js';
var yakuba_data_url = '/map/map_data_yakuba.js';
var spa_data_url = '/map/map_data_spa.js';
var default_interval = 1500;

var def_icon_size = {width: 100, height: 80};

var offset = {width: 200, height: 125};
var gmap_element;
var first_category;

var nav_color = {frame_color: '#648F24', frame_weight: 2, frame_opacity: 1, fill_color: '#648F24', fill_opacity: '0.2'};

var _use_icon = true;
var _iconsDir = '/map/icons';
var _iconImages = {11: 'pin_areamap.png', 24: 'pin_food.png', 23: 'pin_goraku.png', 16: 'pin_kanko.png', 21: 'pin_onsen.png', 22: 'pin_shisetsu.png', 13: 'pin_shop.png', 25: 'pin_yado.png', 12: 'pin_yumachi.png'}

var _opened;

var _zoomed = false;

function resized(loaded) {
	var width, height;
	if(window.innerWidth){
		width=window.innerWidth;
		height=window.innerHeight;
	}else if(document.documentElement && document.documentElement.clientWidth){
		width=document.documentElement.clientWidth;
		height=document.documentElement.clientHeight;
	}else if(document.body && document.body.clientWidth){
		width=document.body.clientWidth;
		height=document.body.clientHeight;
	}

	gm_width = (width - offset.width);
	gm_height = (height - offset.height);

	if (gm_height < 640) {
		gm_height = 640;
	}

	gmap_element.style.width = '720px';
	gmap_element.style.height = '600px';

	if (loaded && gmap) {
		var def_center = {lat: gmap.getCenter().lat(), lng: gmap.getCenter().lng()};
		gmap.checkResize();
		gmap.setCenter(new GLatLng(def_center.lat, def_center.lng));
	}
}

function load() {
	gmap_element = document.getElementById("gmap");
	if (GBrowserIsCompatible()) {
		resized(0);
		initGMap();
		initTypes();

//		initMapNav();
	}
}

function initGMap() {
	gmap = new GMap2(gmap_element);
	gmap.addControl(new GLargeMapControl());
	gmap.addControl(new GMapTypeControl());
	gmap.addControl(new GScaleControl());
	gmap.setCenter(new GLatLng(35.411011, 133.894776), initialZoomLevel);
}

function initTypes() {
	var is_first = 1;
	$.getJSON(data_url, function(json) {
		map_contents = json.map_contents;
		for (var i = 0; i < json.map_contents.length; i++) {
			if (json.map_contents[i].type == 'MapCategory') {
				var category = json.map_contents[i];
				if (category.map_contents.length) {
					if (is_first) {
						first_category = category;
						is_first = 0;
					}
					var ulCategories = getUL(category, 'Categories');
					try {
						addCategory(
							ulCategories,
							category
						);
					}
					catch(e) {}
					ulCategories.normalize();
				}
			}
			else if (json.map_contents[i].type == 'Article' || json.map_contents[i].type == 'Link') {
				var article = json.map_contents[i];
				var ulArticles = getUL(article, 'Entries');
				try {
					addEntry(
						ulArticles,
						null,
						article
					);
					if (markers[article.id]) {
						markers[article.id].show();
					}
					else {
						addMarker(article);
					}
				}
				catch (e) {}
				ulArticles.normalize();
			}
		}
	});

	$.getJSON(spa_data_url, function(json) {
		spa_map_contents = json.map_contents;
		for (var i = 0; i < json.map_contents.length; i++) {
			if (json.map_contents[i].type == 'MapCategory') {
				var category = json.map_contents[i];
				if (category.map_contents.length) {
					if (is_first) {
						first_category = category;
						is_first = 0;
					}
					var ulCategories = getUL(category, 'Categories');
					try {
						addCategory(
							ulCategories,
							category
						);
					}
					catch(e) {}
					ulCategories.normalize();
				}
			}
			else if (json.map_contents[i].type == 'Article' || json.map_contents[i].type == 'Link') {
				var article = json.map_contents[i];
				var ulArticles = getUL(article, 'Entries');
				try {
					addEntry(
						ulArticles,
						null,
						article
					);
					if (markers[article.id]) {
						markers[article.id].show();
					}
					else {
						addMarker(article);
					}
				}
				catch (e) {}
				ulArticles.normalize();
			}
		}
	});

	$.getJSON(yakuba_data_url, function(json) {
		yakuba_map_contents = json.map_contents;
		for (var i = 0; i < json.map_contents.length; i++) {
			if (json.map_contents[i].type == 'MapCategory' && json.map_contents[i].id == '22') {
				var category = json.map_contents[i];
				if (category.map_contents.length) {
					var ulCategories = getUL(category, 'Categories');
					try {
						addCategory(
							ulCategories,
							category
						);
					}
					catch(e) {}
					ulCategories.normalize();
				}
			}
		}
	});

	setTimeout('doDefaultSelection()', default_interval);
}

function doDefaultSelection() {
	var arg = {};
	str = location.search.substring(1);
	arr = str.split('&');
	for (var i = 0; i < arr.length; i++) {
		kv = arr[i].split('=');
		arg[kv[0]] = kv[1];
	}
	if (arg['category'] && arg['entry']) {
		selectEntry(arg['category'], arg['entry'], true);
	}
	else if (arg['category'] && !arg['entry']) {
		selectCategory(arg['category']);
	}
	else {
//		selectCategory(first_category.id);
	}
}

function getUL(type, name) {
	var type_name = ucFirst(type.type);
	if (ucFirst(type.type) == 'Article' || ucFirst(type.type) == 'Link') {
		type_name = 'Article';
	}
	return document.getElementById('gmap' + type_name + name);
}

function addCategory(ul, category) {
	var li = document.createElement('li');

	var a = document.createElement('a');
	a.setAttribute('href',
		"javascript:selectCategory('" + category.id + "')"
	);
	a.setAttribute('id', 'category' + category.id);

	a.appendChild(document.createTextNode(category.title));

	li.appendChild(a);
	ul.appendChild(li);

	$(a).addClass('cat' + category.id);
	$(li).prepend('<input type="checkbox" class="checkbox" name="category_' + category.id + '" onclick="checkCategory(this);" />');

	_categories[category.id] = 1;
}

function addEntry(ul, category, entry) {
	var li = document.createElement('li');
	var catID = category ? "'" + category.id + "'" : null;

	var a = document.createElement('a');
	a.setAttribute('href',
		"javascript:selectEntry(" + catID + ", '" + entry.id + "')"
	);
	a.setAttribute('id', 'entry' + entry.id);

	a.appendChild(document.createTextNode(entry.title));

	li.appendChild(a);
	ul.appendChild(li);
}

function ucFirst (str) {
	return str.substr(0, 1).toUpperCase() + str.substr(1, str.length);
}


function selectCategory(categoryID) {
	var category = getCategory(categoryID);
	var ul;
	var firstArticle;

	if (_opened) {
		var now_latlng = (markers[_opened].getLatLng());
	}

	gmap.closeInfoWindow();

	for (var i in markers) {
		markers[i].hide();
	}

	for (var j = 0; j < category.map_contents.length; j++) {
		if (category.map_contents[j].type != 'MapCategory') {
			firstArticle = category.map_contents[j];
			break;
		}
	}

	ul = getUL(firstArticle, 'Entries');
	if (ul.childNodes && ul.childNodes.length) {
		var length = ul.childNodes.length;
		for (var i = 0; i < length; i++) {
			ul.removeChild(ul.childNodes[0]);
		}
	}

	var is_first = 1;
	var most_neer = {};
	for (var i = 0; i < category.map_contents.length; i++) {
		var entry = category.map_contents[i];
		if (entry.type == 'MapCategory') continue;

		if (now_latlng) {
			if (most_neer.range == undefined) most_neer.range = now_latlng.distanceFrom(new GLatLng(entry.lat, entry.lng));

			if (most_neer.range > now_latlng.distanceFrom(new GLatLng(entry.lat, entry.lng))) {
				most_neer = {id: entry.id, range: now_latlng.distanceFrom(new GLatLng(entry.lat, entry.lng))};
			}
		}

/*
		if (is_first) {
			gmap.setCenter(new GLatLng(entry.lat, entry.lng));
			is_first = 0;
		}
*/
		addEntry(ul, category, entry);

		if (markers[entry.id]) {
			markers[entry.id].show();
		}
		else {
			addMarker(entry);
		}
	}

	selected = { 'categoryID' : categoryID };

	for (i in _categories) {
		if (e = document.getElementById('category' + i)) {
			if (i == categoryID) {
				e.style.fontWeight = 'bold';
//				$("input[name^='category_" + categoryID + "']:checkbox").hide();
			}
			else if (e.style.fontWeight != 'normal') {
				e.style.fontWeight = 'normal';
//				$("input[name^='category_" + i + "']:checkbox").show();
			}
		}
	}
	

	if (most_neer.id) {
		selectEntry(categoryID, most_neer.id);
	}
	else if (firstArticle.id) {
		selectEntry(categoryID, firstArticle.id);
	}

	$("#gmapMapCategoryTitle").text(category.title);

	$("input[name^='category_']:checked").each(function() {
		checkCategory($(this));
	});

	if (selected.categoryID) {
		$("input[name^='category_" + selected.categoryID + "']:checkbox").attr('checked', 'checked');
	}

}

function selectEntry(categoryID, entryID, setCenter) {
	if (setCenter == undefined) setCenter = false;
	if (categoryID && selected.categoryID != categoryID) {
		selectCategory(categoryID);
		var category = getCategory(categoryID);
		$("#gmapMapCategoryTitle").text(category.title);
	}

	GEvent.trigger(markers[entryID], 'click');
	if (!_zoomed) {
		gmap.setZoom(invidualZoomLevel);
	}
	_zoomed = true;

	for (i in markers) {
		if (e = document.getElementById('entry' + i)) {
			if (i == entryID) {
				e.style.fontWeight = 'bold';
			}
			else if (e.style.fontWeight != 'normal') {
				e.style.fontWeight = 'normal';
			}
		}
	}

	if (setCenter == true) {
		gmap.setCenter(markers[entryID].getLatLng());
	}
}

function getType(id) {
	for (var i = 0; i < types.length; i++) {
		var type = types[i];
		if (type.id == id) {
			return type;
		}
	}
}

function getCategory(id) {

	for (var i = 0; i < map_contents.length; i++) {
		var category = map_contents[i];
		if (category.type == 'MapCategory' && category.id == id) {
			return category;
		}
	}

	for (var i = 0; i < spa_map_contents.length; i++) {
		var category = spa_map_contents[i];
		if (category.type == 'MapCategory' && category.id == id) {
			return category;
		}
	}

	for (var i = 0; i < yakuba_map_contents.length; i++) {
		var category = yakuba_map_contents[i];
		if (category.type == 'MapCategory' && category.id == id) {
			return category;
		}
	}


/*
	for (var i = 0; i < type.categories.length; i++) {
		var category = type.categories[i];
		if (category.id == id) {
			return category;
		}
	}
*/
}

function getEntries(type, categoryID) {
	if (type.use_category == 1) {
		for (var i = 0; i < type.categories.length; i++) {
			var category = type.categories[i];
			if (category.id == categoryID) {
				return category.entries;
			}
		}
	}
	else {
		return type.entries;
	}
}


function addMarker(data) {
//	if (data.lat == null || data.lng == null) return;

	var iconObj;
	if (_use_icon) {
		if (_icons[data.map_category_id]) {
			iconObj = _icons[data.map_category_id];
		}
		else {
			iconObj = new GIcon();
			iconObj.image = _iconsDir + '/' + _iconImages[data.map_category_id];
			iconObj.iconSize = new GSize(22, 34);
			iconObj.shadow = G_DEFAULT_ICON.shadow;
			iconObj.shadowSize = G_DEFAULT_ICON.shadowSize;
			iconObj.iconAnchor = G_DEFAULT_ICON.iconAnchor;
			iconObj.infoWindowAnchor = G_DEFAULT_ICON.infoWindowAnchor;
			
			_icons[data.map_category_id] = iconObj;
		}
	}

	var marker = new GMarker(new GLatLng(data.lat, data.lng), {icon: iconObj});

	GEvent.addListener(marker, 'click', function() {
		var content = document.createElement('div');
		content.setAttribute(
			(document.all ? 'className' : 'class'), 'gmapWindow'
		);

		content.appendChild(
			createContentDiv('gmapTitle', document.createTextNode(data.title))
		);

		if (data.icon_url) {
			var img = document.createElement('img');

			img.setAttribute('src', data.icon_url);

			if (def_icon_size.width) {
				img.setAttribute('width', def_icon_size.width);
				img.setAttribute('height', def_icon_size.height);
			}
			else {
				img.setAttribute('width', data.icon_file_width);
				img.setAttribute('height', data.icon_file_height);
			}

			img.setAttribute('border', 0);
			img.setAttribute('alt', data.icon_alt);

			content.appendChild(createContentDiv(
				'gmapImage',
				img
			));
		}

		if (data.description || data.map_text) {
			var t = createContentDiv('gmapText');

			if (data.description) {
				var description = data.description;
				t.innerHTML = '<p>' + description + '</p>';
			}

			if (data.map_text) {
				var text = data.map_text;
				text = text.replace(/\r\n/g, "<br />");
				text = text.replace(/(\n|\r)/g, "<br />");
				t.innerHTML = t.innerHTML + text;
			}
			content.appendChild(t);
		}

		if (data.url) {
			var a = document.createElement('a');
			a.setAttribute('href', data.url);
			a.setAttribute('target', '_blank');
			a.appendChild(document.createTextNode('詳細ページ'));
			content.appendChild(createContentDiv(
				'gmapUrl',
				a
			));
		}

		marker.openInfoWindowHtml(content);
		_opened = data.id;
	});

	gmap.addOverlay(marker);

	markers[data.id] = marker;
}

function createContentDiv(classname, child) {
	var div = document.createElement('div');
	div.setAttribute((document.all ? 'className' : 'class'), classname);

	if (child) {
		div.appendChild(child);
	}

	return div;
}


function checkCategory(e) {
	var cat = $(e).attr('name').split('_');
	var category = getCategory(cat[1]);
		for (var i = 0; i < category.map_contents.length; i++) {
			var entry = category.map_contents[i];
			if (entry.type == 'MapCategory') continue;

			if ($(e).attr('checked')) {
				if (markers[entry.id]) {
					markers[entry.id].show();
				}
				else {
					addMarker(entry);
				}
			}
			else {
				if (markers[entry.id]) markers[entry.id].hide();
			}
		}

}


// w: 288, h: 178
var mapNav;

function initMapNav() {
	
	mapNav = new GMap2(document.getElementById('mapNav'));
	mapNav.setCenter(new GLatLng(35.263561862152095, 133.8299560546875), 7);
	mapNav.disableDragging();
	mapNav.disableInfoWindow();
	mapNav.disableDoubleClickZoom();
	mapNav.disableContinuousZoom();
	mapNav.disableGoogleBar();
	mapNav.disableScrollWheelZoom();

	GEvent.addListener(mapNav, 'click', function(overlay, point) {
		gmap.setCenter(point);
	});

	GEvent.addListener(gmap, 'moveend', drawMapNav);

	drawMapNav();
}

function drawMapNav() {
		mapNav.clearOverlays();

		var center = gmap.getCenter();
		var bounds = gmap.getBounds();

		var sw = bounds.getSouthWest();
		var ne = bounds.getNorthEast();

		var polygon = new GPolygon([
			new GLatLng(ne.lat(), sw.lng()),
			ne,
			new GLatLng(sw.lat(), ne.lng()),
			sw,
			new GLatLng(ne.lat(), sw.lng()),
		], nav_color.frame_color, nav_color.frame_weight, nav_color.frame_opacity, nav_color.fill_color, nav_color.fill_opacity);

		GEvent.addListener(polygon, 'click', function(point) {
			gmap.setCenter(point);
		});

		mapNav.addOverlay(polygon);
}
