function log (msg) {
	if (window.console) console.log(msg);
}

function getLatLngByAddress (address) {
	var d = Deferred();
	(new GClientGeocoder()).getLatLng(address, function (latlng) {
		d.call(latlng);
	});
	return d;
}

var PrefCodeMap = {
	"01":{ name: "北海道", lat: 34.92918, lng: 136.91526},
	"02":{ name: "青森県", lat: 40.719477, lng: 140.914784},
	"03":{ name: "岩手県", lat: 39.502408, lng: 141.3172},
	"04":{ name: "宮城県", lat: 38.357205, lng: 140.98138},
	"05":{ name: "秋田県", lat: 39.714372, lng: 140.273734},
	"06":{ name: "山形県", lat: 38.415159, lng: 140.157141},
	"07":{ name: "福島県", lat: 37.411229, lng: 140.455743},
	"08":{ name: "茨城県", lat: 36.231426, lng: 140.290923},
	"09":{ name: "栃木県", lat: 36.539397, lng: 139.817016},
	"10":{ name: "群馬県", lat: 36.370901, lng: 139.126707},
	"11":{ name: "埼玉県", lat: 35.936292, lng: 139.562293},
	"12":{ name: "千葉県", lat: 35.639311, lng: 140.117075},
	"13":{ name: "東京都", lat: 35.678451, lng: 139.682282},
	"14":{ name: "神奈川県", lat: 35.43944, lng: 139.510395},
	"15":{ name: "新潟県", lat: 37.613849, lng: 138.875581},
	"16":{ name: "富山県", lat: 36.716698, lng: 137.154959},
	"17":{ name: "石川県", lat: 36.644956, lng: 136.656237},
	"18":{ name: "福井県", lat: 35.951836, lng: 136.170042},
	"19":{ name: "山梨県", lat: 35.621684, lng: 138.622935},
	"20":{ name: "長野県", lat: 36.258364, lng: 138.113151},
	"21":{ name: "岐阜県", lat: 35.502272, lng: 136.916051},
	"22":{ name: "静岡県", lat: 34.929361, lng: 138.361096},
	"23":{ name: "愛知県", lat: 35.086349, lng: 136.996367},
	"24":{ name: "三重県", lat: 34.709878, lng: 136.527594},
	"25":{ name: "滋賀県", lat: 35.130094, lng: 136.087314},
	"26":{ name: "京都府", lat: 35.053579, lng: 135.654842},
	"27":{ name: "大阪府", lat: 34.665831, lng: 135.520746},
	"28":{ name: "兵庫県", lat: 34.803922, lng: 135.028497},
	"29":{ name: "奈良県", lat: 34.5688, lng: 135.7887},
	"30":{ name: "和歌山県", lat: 34.050357, lng: 135.341235},
	"31":{ name: "鳥取県", lat: 35.457517, lng: 133.786706},
	"32":{ name: "島根県", lat: 35.26236, lng: 132.706875},
	"33":{ name: "岡山県", lat: 34.698389, lng: 133.85697},
	"34":{ name: "広島県", lat: 34.428402, lng: 132.741463},
	"35":{ name: "山口県", lat: 34.078741, lng: 131.511118},
	"36":{ name: "徳島県", lat: 34.04166, lng: 134.462055},
	"37":{ name: "香川県", lat: 34.289687, lng: 133.971693},
	"38":{ name: "愛媛県", lat: 33.78084, lng: 132.867963},
	"39":{ name: "高知県", lat: 33.443516, lng: 133.44954},
	"40":{ name: "福岡県", lat: 33.600985, lng: 130.582311},
	"41":{ name: "佐賀県", lat: 33.284079, lng: 130.174392},
	"42":{ name: "長崎県", lat: 32.978398, lng: 129.813549},
	"43":{ name: "熊本県", lat: 32.716894, lng: 130.67638},
	"44":{ name: "大分県", lat: 33.264481, lng: 131.514824},
	"45":{ name: "宮崎県", lat: 32.026959, lng: 131.369528},
	"46":{ name: "鹿児島県", lat: 31.256046, lng: 130.461305},
	"47":{ name: "沖縄県", lat: 26.091696, lng: 127.39865},
	"99":{ name: "海外", lat: 26.091696, lng: 127.39865}
};

FormController = function (obj) {
	return (this instanceof arguments.callee) ? this.init(obj) : new FormController(obj);
};
FormController.prototype = {
	init : function (obj) {
		var self = this;
		self.api = obj.api;

		self.form = $('#eventcal form');

		$('#selDate').click(function () {
			self.load();
			return false;
		});

		$('#btnReset').click(function () {
			self.reset();
			return false;
		});


		self.bindCalendar();

		var distance = $('#distance'), type = $('#type');

		distance.change(function () {
			type.val("");
		});

		type.change(function () {
			distance.val("");
		});

		self.bindEntry();
	},

	load : function () {
		var params = this.validate();
		if (params) {
			this.api.load(params);
		}
	},

	bindEntry : function () {
		var self = this;
		var im = $("div.for-decide");

		var t = $('li.favorite a');

		function on (target) {
			if (!target) {
				target = t;
			}

			im.find('img.joinBtn').attr('src', '/img/event/btn_remove_bookmark_off.gif');
			im.find("a").attr("href", target.attr("href").replace("/join/", "/unjoin/"));

			target.text('お気に入り削除');
			target.attr("href", target.attr("href").replace("/join/", "/unjoin/"));

		}

		function off (target) {
			if (!target) {
				target = t;
			}

			im.find('img.joinBtn').attr('src', '/img/event/btn_add_bookmark_off.gif');
			im.find("a").attr("href", target.attr("href").replace("/unjoin/", "/join/"));

			target.text('お気に入り追加');
			target.attr("href", target.attr("href").replace("/unjoin/", "/join/"));

		}

		t.click(function () {
			if (!isLoggedIn()) return showLoginBox();
			var self = this;

			$.getJSON(this.href, {}, function (data) {
				if (self.href.match("/unjoin/")) {
					off($(self));
				} else if (self.href.match("/join/")) {
					on($(self));
				}


			});
			return false;
		});

		// 同じ
		$("div.for-decide").find('a').click(function () {
			if (!isLoggedIn()) return showLoginBox();
			var self = this;

			$.getJSON(this.href, {}, function (data) {
				if (self.href.match("/unjoin/")) {
					off();
				} else if (self.href.match("/join/")) {
					on();
				}


			});
			return false;
		});


		log(User.entry);
		if (t.length && isLoggedIn() && User.entry) {
			on();
		}
	},

	bindCalendar : function () {
		var self = this;

		$('#boxEventcal01_01 table.tblCalHead a, #boxEventcal01_01 div.boxCalReset a, #boxEventcal01_01 table.tblCal a').click(function () {
			if (this.href.match(/api/)) {
				self.api.load({ url: this.href });
			} else {
				// load calendar
				$.get(this.href, {}, function (data) {
					$("#boxEventcal01_01").empty().append(data);
					self.bindCalendar();
				});
			}
			return false;
		});

	},

	validate : function () {
		var ok = true;

		var params = {};
		this.form.find("select").each(function () {
			params[this.name] = $(this).val();
		});

		if (params.start_year || params.start_month || params.start_day) {
			if ( !( params.start_year && params.start_month && params.start_day ) ) {
				alert("日時は全て選択してください");
				ok = false;
				$("#yearStart").focus();
			}
		} else
		if (params.end_year || params.end_month || params.end_day) {
			if ( !( params.end_year && params.end_month && params.end_day ) ) {
				alert("日時は全て選択してください");
				ok = false;
				$("#yearEnd").focus();
			}
		}

		return ok && params;
	},

	reset : function () {
		this.form.get(0).reset();
	}
};

FormController.init = function (opts) {
	return new FormController(opts);
};

RunEvent = function (obj) {
	return (this instanceof arguments.callee) ? this.init(obj) : new RunEvent(obj);
};

RunEvent.API = '/api/event/search';

RunEvent.prototype = {
	init : function (obj) {
		this.initval = obj;
		this.event_id = obj.event_id;
		this.map = new GMap2($('#mapEvent, #mapEventDetail').css({ width : this.event_id ? '698px' : '718px', height : '298px' }).get(0), {
			mapTypes: [ G_NORMAL_MAP, G_SATELLITE_MAP ]
		});
		if (obj.pref_code) {
			var latlng = PrefCodeMap[obj.pref_code];
			this.map.setCenter(new GLatLng(latlng.lat, latlng.lng), 9);
		} else {
			this.map.setCenter(new GLatLng(36.4566360115962, 137.63671875), 4);
		}
		this.map.addControl(new GLargeMapControl());
		this.map.setMapType(G_SATELLITE_MAP);
		this.map.addControl(new GMapTypeControl());
//		this.map.addControl(new GOverviewMapControl());

		this.load(obj);
		this.infoWindow = document.createElement("div");
		document.body.appendChild(this.infoWindow);

		FormController.init({
			api: this
		});

	},

	load : function (opts) {
		var params = {};
		if (opts.start_year && opts.start_month && opts.start_day) {
			params.start_year  = opts.start_year;
			params.start_month = opts.start_month;
			params.start_day   = opts.start_day;
		}
		if (opts.end_year && opts.end_month && opts.end_day) {
			params.end_year  = opts.end_year;
			params.end_month = opts.end_month;
			params.end_day   = opts.end_day;
		}
		if (opts.distance)    params.distance    = opts.distance;
		if (opts.type)        params.type        = opts.type;
		if (opts.pref_code)   params.pref_code   = opts.pref_code;
		if (opts.event_id)    params.event_id    = opts.event_id;
		if (this.initval.pref_code) params.pref_code = this.initval.pref_code;

		var self = this;
		$.getJSON(opts.url || RunEvent.API, params, function (data) {
			self.refresh(data.data);
		});
	},

	refresh : function (data) {
		var self = this;
		var bounds = new GLatLngBounds();

		next(function () {

			var icon = new GIcon();
			icon.image            = '/img/event/pin.png';
			icon.iconAnchor       = new GPoint(18, 40);
			icon.infoWindowAnchor = new GPoint(18, 0);
			icon.iconSize         = new GSize(37, 49);
//			icon.shadow           = "images/" + IMAGES[i] + "-shadow.png";
//			icon.shadowSize       = new GSize(59, 32);

			self.map.clearOverlays();

			return loop(data.length, function (n) {
				var d = data[n];
				if (d.lat && d.lon) d.latlng = new GLatLng(d.lat, d.lon);
				if (d.latlng) {
					// log(d.open_date.match(/(\d+)年(\d+)月(\d+)日/));
					var marker = new GMarker(d.latlng , { icon: icon });
					var detail = '/event/detail/' + d.event_id;

					GEvent.addListener(marker,"click", function() {
						var info = $([
							'<div style="padding: 1em 0 0 0" class="gmapInfoWindow">',
								'<a href="" class="title"></a>',
								'<dl>',
									'<dt>開催日</dt>',
									'<dd class="date"></dd>',
									'<dt>開催地</dt>',
									'<dd class="addr"></dd>',
								'</dl>',
								'<a href="" class="smore">もっと見る</a>',
							'</div>'
						].join(""))
						info
							.find('a.title').attr('href', detail).append(d.name).end()
							.find('dd.date').append(d.open_date).end()
							.find('dd.addr').append(d.address + '(' + d.prefecture + ')').end()
							.find('a.smore').attr('href', detail).end()
						$(self.infoWindow).empty().append(info);
						self.map.openInfoWindow(d.latlng, self.infoWindow);
					});

					self.map.addOverlay(marker);
					bounds.extend(d.latlng);
				}
			});
//			$.each(data, function () {
//				var d = this;
//				}
//			});
		}).
		next(function () {
			if (location.pathname == '/event/') {
				var center = new GLatLng(36.4566360115962, 137.63671875);
				self.map.setZoom(4);
				self.map.setCenter(center);
			} else {
				var level = self.map.getBoundsZoomLevel(bounds) - 1;
				var lim   = 14;
				if (level > lim) level = lim;
				self.map.setZoom(level);
				self.map.setCenter(bounds.getCenter());
			}
		}).
		error(function (e) {
			log(e);
		});
	}
};

RunEvent.init = function (opts) {
	RunEvent.instance = new RunEvent(opts);
	return RunEvent.instance;
};

PrefSelector = {
};

PrefSelector.init = function (opts) {
	$('#prefs').change(function () {
		var pref_id = $(this).val();
		if (pref_id != '') {
			location.href = absolute('/event/pref/' + pref_id);
		} else {
			location.href = absolute('/event/');
		}
	});
};


AhahPager = function (obj) {
	return (this instanceof arguments.callee) ? this.init(obj) : new AhahPager(obj);
};
AhahPager.prototype = {
	init : function (obj) {
		var self = this;
		self.obj = obj;
		self.limit = $(obj.target).find('div.selectLimit select').val() || 20;
		self.bind();
	},

	bind : function () {
		var self = this;
		var obj = self.obj;
		$(obj.target)
			.find('ul.pages a').click(function () {
				$.get(this.href, {}, function (d) {
					$(obj.target).html(d);
					$.scrollTo("#h2_eventlist");
					self.obj = obj;
					self.bind();
				});
				return false;
			})
			.end()
			.find('div.selectLimit select').unbind().change(function () {
				self.limit = $(this).val();
				var url = obj.api.replace(/%page%/, self.limit);
				$.get(url, {}, function (d) {
					$(obj.target).html(d);
					$.scrollTo("#h2_eventlist");
					self.bind();
				});
			}).val(self.limit);
	}
};

$(function () {
	var path = location.pathname.split('/');
	if (path[2] == 'detail') {
		RunEvent.init({
			event_id : path[3]
		});
	} else
	if (path[2] == 'pref') {
		RunEvent.init({
			pref_code : path[3]
		});
	} else {
		RunEvent.init({});
	}

	PrefSelector.init({});

	// pager
	new AhahPager({
		target: 'ul.eventList01:last',
		api :   '/event/list/1/%page%/pref_code' + (path[3] ? '/'+path[3] : "")
	});

	// accordion
	$("#eventcal h3").find("a, img").unbind().attr('onclick', '');
	$("#eventcal h3 a").mouseover(function () {
		var wait = 200;

		var me = $(this);
		if (!me.parent().next().is(":visible")) {

			me.parent().parent().find("div.boxEventcal01:visible").slideUp(wait, function () {
				me.parent().parent().find("h3 a img").each(function () {
					this.src = this.src.replace(/_open\.gif/, ".gif");
				});
			});

			me.parent().next().slideDown(wait, function () {
				me.find("img").each(function () {
					this.src = this.src.replace(/\.gif/, "_open.gif");
				});
			});

		}

		return false;
	}).each(function (n) {
		var target = $(this).parent().next();
		if (n) target.hide();
	});
});

$(window).unload(function () {
	GUnload()
});
