var markers = {};
var _categories = {};
var types = [];
var selected = {};
var gmap;

var initialZoomLevel = 14;
var images_url = '/gmap-admin/images';
var data_url = '/gmap-admin/javascripts/gmap-data.js';
var default_interval = 1500;

function load() {
	if (GBrowserIsCompatible()) {
		initGMap();
		initTypes();
	}
}

function initGMap() {
	gmap = new GMap2(document.getElementById("gmap"));
	gmap.addControl(new GSmallMapControl());
//	gmap.addControl(new GMapTypeControl());
	gmap.setCenter(new GLatLng(35.495041,133.692718), initialZoomLevel);
}

function initTypes() {
	GDownloadUrl(data_url, function(data, responseCode) {
		types = eval('(' + data + ')');

		for (var i = 0; i < types.length; i++) {
			var type = types[i];

			if (type.use_category == 1) {
				var ulCategories = getUL(type, 'Categories');

				for (var j = 0; j < type.categories.length; j++) {
					try {
					addCategory(
						ulCategories,
						type,
						type.categories[j]
					);
					}
					catch(e) { }
				}

				ulCategories.normalize();
			}
			else {
				var ulEntries = getUL(types[i], 'Entries');

				for (var j = 0; j < type.entries.length; j++) {
					try {
					addEntry(
						ulEntries,
						type,
						null,
						type.entries[j]
					);
					}
					catch(e) { }
				}

				ulEntries.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['type'], arg['category'], arg['entry']) {
		selectEntry(arg['type'], arg['category'], arg['entry']);
	}
	else {
		if (types[0].use_category == 1) {
			selectEntry(
				types[0].id,
				types[0].categories[0].id,
				types[0].categories[0].entries[0].id
			);
		}
		else {
			selectEntry(types[0].id, null, types[0].entries[0].id);
		}
	}
}

function getUL(type, name) {
	return document.getElementById('gmap' + ucFirst(type.id) + name);
}

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

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

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

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

	_categories[category.id] = 1;
}

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

	var a = document.createElement('a');
	a.setAttribute('href',
		"javascript:selectEntry('" + type.id + "', " + 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(typeID, categoryID) {
	var type = getType(typeID);
	var entries = getEntries(type, categoryID);
	var ul;
	var category;

	gmap.closeInfoWindow();

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

	if (type.use_category == 1) {
		ul = getUL(type, 'Entries');

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

		category = getCategory(type, categoryID);
	}

	for (var i = 0; i < entries.length; i++) {
		var entry = entries[i];

		if (i == 0) {
			gmap.setCenter(new GLatLng(entry.lat, entry.lng));
		}

		if (type.use_category == 1) {
			addEntry(ul, type, category, entry);
		}

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

	selected = { 'typeID' : typeID, 'categoryID' : categoryID };

	for (i in _categories) {
		if (e = document.getElementById('category' + i)) {
			if (i == categoryID) {
				e.style.fontWeight = 'bold';
			}
			else if (e.style.fontWeight != 'normal') {
				e.style.fontWeight = 'normal';
			}
		}
	}
	
	if (entries[0].id) {
		selectEntry(typeID, categoryID, entries[0].id);
	}
}

function selectEntry(typeID, categoryID, entryID) {
	if (selected.typeID != typeID || selected.categoryID != categoryID) {
		selectCategory(typeID, categoryID);
	}

	GEvent.trigger(markers[entryID], 'click');

	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';
			}
		}
	}
}

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

function getCategory(type, id) {
	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) {
	var marker = new GMarker(new GLatLng(data.lat, data.lng));

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

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

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

			img.setAttribute('src', images_url + '/' + data.id + '.' + data.image_ext);
			img.setAttribute('width', data.image_width);
			img.setAttribute('height', data.image_height);
			img.setAttribute('border', 0);
			img.setAttribute('alt', data.title);

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

		if (data.text) {
			var t = createContentDiv('gmapText');

			t.appendChild(document.createTextNode(data.text));

			content.appendChild(createContentDiv(
				'gmapText',
				document.createTextNode(data.text)
			));
		}

		if (data.zip) {
			zip = '〒' + data.zip;

			content.appendChild(createContentDiv(
				'gmapZip',
				document.createTextNode(zip)
			));
		}

		var address = [];
		var keys = ['prefecture', 'city', 'address1', 'address2'];
		for (var i = 0; i < keys.length; i++) {
			if (data[keys[i]]) {
				address.push(data[keys[i]]);
			}
		}

		var addr = address.join('');
		if (addr) {
			content.appendChild(createContentDiv(
				'gmapAddress',
				document.createTextNode(addr)
			));
		}

		if (data.telephone) {
			content.appendChild(createContentDiv(
				'gmapTelephone',
				document.createTextNode('TEL: ' + data.telephone)
			));
		}

		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);
	});

	gmap.addOverlay(marker);

	markers[data.id] = marker;
}

function createContentDiv(classname, child) {
	var div = document.createElement('div');
	if (navigator.userAgent.indexOf("MSIE")!=-1 && navigator.userAgent.indexOf("Trident/4.0")!=-1) {
		div.setAttribute('class', classname);
	}
	else {
		div.setAttribute((document.all ? 'className' : 'class'), classname);
	}

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

	return div;
}
