var map;
var contentDiv;
var homeUrl = "http://www.japan-hopper.com";
var markerGroups = { 0: [], 1: [], 2:[]};

var baseIcon = Array();

baseIcon[0] = new GIcon();
baseIcon[0].image = homeUrl + '/images/label-red.png';
baseIcon[0].iconSize = new GSize(32, 32);
baseIcon[0].iconAnchor = new GPoint(16, 16);
baseIcon[0].infoWindowAnchor = new GPoint(25, 7);

baseIcon[1] = new GIcon();
baseIcon[1].image = homeUrl + '/images/label-orange.png';
baseIcon[1].iconSize = new GSize(32, 32);
baseIcon[1].iconAnchor = new GPoint(16, 16);
baseIcon[1].infoWindowAnchor = new GPoint(25, 7);

baseIcon[2] = new GIcon();
baseIcon[2].image = homeUrl + '/images/label-green.png';
baseIcon[2].iconSize = new GSize(32,32);
baseIcon[2].iconAnchor = new GLatLng(16,16);
baseIcon[2].infoWindowAnchor = new GLatLng(2,16);

baseIcon[3] = new GIcon();
baseIcon[3].image = homeUrl + '/images/red-pushpin.png';
baseIcon[3].shadow = homeUrl + '/images/pushpin_shadow.png';
baseIcon[3].iconSize = new GSize(32,32);
baseIcon[3].shadowSize = new GSize(59,32);
baseIcon[3].iconAnchor = new GLatLng(32,16);
baseIcon[3].infoWindowAnchor = new GPoint(16,0);

var center_marker_icon = new GIcon();
center_marker_icon.image = homeUrl + "./images/centermarker_standard01.png";
center_marker_icon.shadow = homeUrl + "./images/centermarker_standard01_shadow.png";
center_marker_icon.iconSize = new GSize( 23 , 23 );
center_marker_icon.shadowSize = new GSize( 29 , 29 );
center_marker_icon.iconAnchor = new GPoint( 11 , 11 );


var mapFunc = {
	lat: 0,
	lng: 0,
	point: '',
	tabs: '',
	per_page: 5,
	pre_marker: '',
	center_marker: '',
	lastMarker: '',

	clearMarker: function(flag) {
		for (var i = 0; i < markerGroups[flag].length; i++) {
			var marker = markerGroups[flag][i];
			marker.hide();
		}
		markerGroups[flag].length = 0;
		//$('#post_form').html('');
		$('#search_result'+flag).html('');
	},
	
	tagSearch: function(q) {
		flag = 0;
		mapFunc.clearMarker(flag);
		if(q) {
			$('#help').hide('normal');
			var baseUrl = homeUrl + "/ws/search.php";
			q = q.replace(/^\s+/, "");
			q = q.replace(/\s+$/, "");
			q = q.replace(/\s/g, "+");
			post_url = baseUrl + "?mode=2&rating=1&tagf=1&edit=0&items=" + mapFunc.per_page + "&q=" + q;
			kml_url = baseUrl + "?mode=0&f=1&items=" + mapFunc.per_page + "&q=" + q;
			pos_title = '<h2 class="midashi">Tag: ' + q.replace("+", " ") + '</h2>';
			mapFunc.searchResults(flag,pos_title,post_url);
		}
	},

	searchLoc: function(loc) {
		if(geocoder) {
			if(loc != "Location" && loc != "" && loc != undefined) {
				geocoder.setBaseCountryCode("JP");
				geocoder.getLatLng(loc,function(point) {
					if (!point) {
						alert("Not Found");
					} else {
						var zoomlevel = map.getZoom();
						map.setCenter(point,zoomlevel);
					}
				});
			}
		}
	},

	getInfo: function(q,cat,zoom,flag,mode) {
		var pos_title = "";
		$('#help').hide('normal');

		mapFunc.clearMarker(flag);
		if(zoom != "") {map.setZoom(zoom);}
		var baseUrl = homeUrl + "/ws/search.php";

		if(mode == 4) {
			var bounds = map.getBounds();
			var minx = bounds.getSouthWest().lng();
			var miny = bounds.getSouthWest().lat();
			var maxx = bounds.getNorthEast().lng();
			var maxy = bounds.getNorthEast().lat();

			post_url = baseUrl + "?mode=" + mode + "&rating=0&tagf=0&edit=0&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;
			kml_url = baseUrl + "?mode=" + mode + "&f=1&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;

		} else {
			post_url = baseUrl + "?mode=" + mode + "&rating=0&tagf=0&edit=0&items=" + mapFunc.per_page;
			kml_url = baseUrl + "?mode=" + mode + "&f=1&items=" + mapFunc.per_page;
		}

		if(cat != "") {
			icon = "&icon=" + cat;
			post_url += icon;
			kml_url += icon;
		}
		
		var sort = $("input[@name='sort']:checked").val();
		if(sort == 0) {
			post_url += "&sort=0";
			kml_url += "&sort=0";
		} else {
			post_url += "&sort=1";
			kml_url += "&sort=1";
		}

		q = q.replace(/^\s+/, "");
		q = q.replace(/\s+$/, "");
		q = q.replace(/\s/g, "+");
		post_url += "&q=" + q;
		kml_url += "&q=" + q;

		if(q != "") {
			pos_title = '<h2 class="midashi">Search: ' + q.replace("+", " ") + '</h2>';
		}
		
		mapFunc.searchResults(flag,pos_title,post_url);
	},

	searchResults: function(flag, pos_title, post_url) {
		$('#search_result' + flag).append('<div class="search_result listStyle' + flag + '"><ol id="List' + flag + '"></ol></div>');
		$('#List' + flag).append('<li id="loader' + flag + '"><img src="' + homeUrl + '/images/loader.gif" alt="loadding" align="top" /></li>');
		if(pos_title != "") {
			$('#List' + flag).before(pos_title);
		}
		$('#List' + flag).after('<input type="hidden" id="page' + flag + '" name="page' + flag + '" value="0" />');
		mapFunc.displayInfo(post_url, flag, 0);
	},

	displayInfo: function(post_url, flag, p) {
		var request = GXmlHttp.create();
		request.open("GET", post_url, true);
		request.setRequestHeader('If-Modified-Since', 'Thu, 01 Jan 1970 00:00:00 GMT');
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var xmlDoc = request.responseXML;
				if(!xmlDoc || xmlDoc.documentElement == null) {
					$('#loader' + flag).remove();
					$('#List' + flag).after('<div class="notfound">Not Found</div>');
					return false;
				}

				var markers = xmlDoc.documentElement.getElementsByTagName("Placemark");
				var len = Math.min(markers.length, mapFunc.per_page);
				for (var i = 0; i < len; i++) {
					var lng, lat;
					var coordinates = markers[i].getElementsByTagName("coordinates")[0].childNodes[0].data;
					if (coordinates) {
						var c = coordinates.split(",");
						lng = parseFloat(c[0]);
						lat = parseFloat(c[1]);
					} else {
						lng = parseFloat(markers[i].getElementsByTagName("longitude")[0].childNodes[0].data);
						lat = parseFloat(markers[i].getElementsByTagName("latitude")[0].childNodes[0].data);
					}
					var point = new GLatLng(lat, lng);
					//if (!i && flag == 0) map.setCenter(point);
					var id = markers[i].getAttribute("id");
					var names = markers[i].getElementsByTagName("name");
					var name = names.length ? names[0].childNodes[0].data : '';
					var descs = markers[i].getElementsByTagName("description");
					var desc = descs.length ? descs[0].childNodes[0].data : '';
					var marker = new mapFunc.displayMarker(id, point, i, name, desc, flag, p);

                    if($('#map').length) {//10.07.08
                        map.addOverlay(marker);
                    }
				}
				
				
				if(markers.length > mapFunc.per_page-1) {
					$('#List' + flag).after('<div id="next' + flag + '" class="next"><a name="next">More results &raquo;</a></div>');
					var page = $('#page' + flag).attr('value');
					page++;
					if(page != 0){
						var prev = page - 1;
						post_url = post_url.replace("&page" + flag + "="+ prev, "");
					}
					$('#next' + flag).click(function() {
						$('#next' + flag).remove();
						$('#List' + flag).after('<div id="loader' + flag + '" class="next"><img src="' + homeUrl + '/images/loader.gif" alt="loadding" /></div>');
						var next = post_url + "&page" + flag + "=" + page;
						mapFunc.displayInfo(next, flag, page);
					});
					$('#page' + flag).attr('value', page);
				}
				
				$('#loader' + flag).remove();
			}
		}
		request.send(null);
		return false;
	},

	displayMarker: function(id, point, index, name, desc, flag, p) {

		var item_url = name.replace(/^\s+/, "");
		item_url = item_url.replace(/\s+$/, "");
		item_url = item_url.replace(/\s/g, "+");

		if(flag < 3) {
			if(p == 0) {
				var start = 1;
			} else {
				var start = p*mapFunc.per_page+1;
			}

            if($('#map').length) {//10.07.08
                var marker = new LabeledMarker(point,{
                    clickable: true,
                    icon: baseIcon[flag],
                    labelOffset: new GSize(-16, -16),
                    labelText: index+start
                });
            } else {
                var marker = new GMarker(point, baseIcon[flag]);
            }

		} else {
			var marker = new GMarker(point, baseIcon[flag]);
		}

		markerGroups[flag].push(marker);

		var letter = String.fromCharCode("A".charCodeAt(0) + index);
		var msg = name ? '<div>' + (desc ? desc : '') : 'Marker <strong>' + letter + '</strong></div>';
		var tip = '<div class="fukidashi">' + desc + '</div>';
		var li = document.createElement("li");
		li.innerHTML = desc;
		$('#List' + flag).append(li);

		var f = function() {
			var opts = { maxWidth : 200 };
			mapFunc.lastMarker = marker;
			//marker.openInfoWindowHtml(msg);
			marker.openInfoWindowHtml(tip,opts);
			li.className = 'here';
		};
		var g = function() {
			li.className = '';
		}
		GEvent.addListener(marker, "click", f);
		GEvent.addListener(marker, "infowindowclose", g);

		if(flag == 1) {
			tempFunc.linkbox();
		}

		return marker;
	},

	makePostdata: function() {
		var title	= $('#title').attr('value');
		var url		= $('#url').attr('value');
		var tag		= $('#tag').attr('value');
		var comment	= $('#comment').attr('value');
		var area	= $('#area').attr('value');
		var photo	= $('#photo').attr('value');
		var user_pass	= $('#user_pass').attr('value');
		
			url		= (!url || url == "http://") ? "" : url;
			tag		= (!tag || tag == "separate multiple tags with commas") ? "" : tag;
			comment		= (!comment) ? "" : comment;
			area		= (!area) ? "" : area;
			photo		= (!photo) ? "" : photo;
			user_pass	= (!user_pass) ? "" : user_pass;
		
		//var icon	= $('#icon').attr('value');
        var icon    = $('#icon').val();//2010.09.15
        
		var lat		= $('#lat').attr('value');
		var lng		= $('#lng').attr('value');
		
		var post_data;
		post_data = 'title=' + encodeURIComponent(title) +
			'&url='	+ encodeURIComponent(url) +
			'&tag='	+ encodeURIComponent(tag) +
			'&comment=' + encodeURIComponent(comment) +
			'&area=' + encodeURIComponent(area) +
			'&user_pass=' + encodeURIComponent(user_pass) +
			'&icon=' + encodeURIComponent(icon) +
			'&lat='	+ encodeURIComponent(lat) +
			'&lng='	+ encodeURIComponent(lng) +
			'&photo=' + encodeURIComponent(photo);
			
		return post_data;
	},
	
	pmAjax: function() {
		var cid = $('#cid').attr('value');
		var mode = $('#mode').attr('value');
		var target_url = homeUrl + '/ws/manage.php';
		var baseUrl = homeUrl + "/ws/search.php";
		var post_data = mapFunc.makePostdata();
	
		if(mode == 2) {
			post_data += '&mode=2';
			$.post(target_url, post_data, mapFunc.printResData);
			
		} else if(mode == 3) {
			mapFunc.clearMarker(0);
			post_data += '&mode=3' + '&id=' + encodeURIComponent(cid);
			$.post(target_url, post_data, mapFunc.printResData);
		}
		
		$('#mode').attr('value',2);
		$('#cid').attr('value','');
		$('#title').attr('value','');
		$('#comment').attr('value','');
		$('#ph_show').html('');
		$('#url').attr('value','');
		$('#area').attr('value','');
		$('#tag').attr('value','');
		$('#user_pass').attr('value','');
	
	},


	GetFile: function(ph_name, ph_res, flag){
		var dispImg = "<p><img src=\"" + homeUrl + "/images/placemark/" + ph_name  + "\" width=\"120\" /></p>";
		var inputPhoto = "<input type=\"hidden\" id=\"photo\" name=\"photo\" value=\"" + ph_name + "\" />";
		 tb_remove();
		$('#ph_show').html(dispImg + inputPhoto);
	},

	addTag: function(i){
		var getTag = '#tagWord'+i;
		var value = $(getTag).attr('value');
		var newTags = homeUrl + '/ws/tag.php';
		var change = '#tags'+i;
		$(change).load(newTags, { id: i, tag: value });
		$(getTag).attr('value','');
	},

	ratingVote: function(i, value){
		var newRating = homeUrl + '/ws/rate.php';
		var change = '#rating'+i;
		$(change).load(newRating, { id: i, v: value });
	},

	inappropriate: function(id){
		if(window.confirm("Please push \"OK\" if this information is spam.")){
			var target_url = homeUrl + "/ws/notifier.php";
			var post_data = 'id=' + id;
			$.post(target_url, post_data, function() {
				if(map) {
					alert('Thank you!');
					map.closeInfoWindow();
					map.removeOverlay(mapFunc.lastMarker);
				} else {
					alert('Thank you!');
					contentDiv = "#content" + id;
					$(contentDiv).html("");
				}
			});
		}
	},

	printResData: function(text_data) {
		var resData = text_data.split("\n");
		var icon = resData[3];
		var desc = resData[4];

		if(map) {
			var res_msg = '<div class="fukidashi">' + desc + '</div>';

			//map.removeOverlay(mapFunc.lastMarker);
			//var res_point = mapFunc.lastMarker.getPoint();
			var res_point = map.getCenter();
			var res_marker = new LabeledMarker(res_point,{
				clickable: true,
				icon: baseIcon[0],
				labelOffset: new GSize(-16, -16),
				labelText: 'NEW'
			});

			var f = function() {
				res_marker.openInfoWindowHtml(res_msg);
				//mapFunc.lastMarker = res_marker;
			}

			GEvent.addListener(res_marker, "click", f);
			map.addOverlay(res_marker);
			//mapFunc.lastMarker = res_marker;

			GEvent.trigger(map.getInfoWindow(), "closeclick");
			map.closeInfoWindow();
			//mapFunc.lastMarker.openInfoWindowHtml(res_msg);

		}
        
        /*if(icon == "hotel"){
            $(".catHotels").show();
        } else {*/
            $(".catOthers").show();
        //}
	},

	centerMarker: function() {
		var mapCenter = map.getCenter();
		mapFunc.lat = map.getCenter().lat();
		mapFunc.lng = map.getCenter().lng();

		map.removeOverlay(mapFunc.center_marker);
		mapFunc.center_marker = new GMarker(mapCenter, center_marker_icon);
		map.addOverlay(mapFunc.center_marker);

		$('#lat').attr('value', mapFunc.lat);
		$('#lng').attr('value', mapFunc.lng);
	},
    
    makeSublist: function(parent, child, isSubselectOptional, childVal) {  
    $("body").append("<select style='display:none' id='" + parent + child + "'></select>");  
    $('#' + parent + child).html($("#" + child + " option"));  

    var parentValue = $('#' + parent).attr('value');  
    $('#' + child).html($("#" + parent + child + " .sub_" + parentValue).clone());  

    childVal = (typeof childVal == "undefined") ? "" : childVal;  
    $("#" + child + ' option[@value="' + childVal + '"]').attr('selected', 'selected');  

    $('#' + parent).change( function() {  
          var parentValue = $('#' + parent).attr('value');  
          $('#' + child).html($("#" + parent + child + " .sub_" + parentValue).clone());  
          if (isSubselectOptional) $('#' + child).prepend("<option value='none'> -- Select -- </option>");  
            $('#' + child).trigger("change");  
          $('#' + child).focus();  
          });  
  }  

}


var tempFunc = {

	linkbox: function() {
		$("div").filter(".linkbox").hover(
			function() {
				$(this).addClass("linkbox_hover");
			},
			function() {
				$(this).removeClass("linkbox_hover");
		});

		$("div").filter(".linkbox").click(function() {
			var thelink = $(this).find('a').eq(0).attr("href");
			window.open(thelink,'_blank','');
			return false;
		});
	}
}



$(function() {

	if($('.loc').attr('value') == "") { $('.loc').preInput('Location'); }
    if($('.q').attr('value') == "") { $('.q').preInput('Keyword(s)'); }
    if($('#tag').attr('value') == "") { $('#tag').preInput('separate multiple tags with commas'); }

    // get parameter
    var loc = "";
    var q = "";
    var query = location.search.substring(1);
    var pairs = query.split("&");
    for (var i=0; i<pairs.length; i++) {
        var pos = pairs[i].indexOf("=");
        var argname = pairs[i].substring(0,pos).toLowerCase();
        var value = pairs[i].substring(pos+1).toLowerCase();
				
        if (argname == "catlist") {
            $('#catList').val(value);
        }
        if(argname == "tname") {
            var tname = value;
        }
        if (argname == "loc") {
            loc = value;
            $('.loc').attr('value',value);
            $('.loc').removeClass('pre-input');
        }
        if (argname == "q") {
            q = value;
            sw = decodeURI(q);
            $('.q').attr('value',sw);
            $('.q').removeClass('pre-input');
        }
        if (argname == "lat") {lat = parseFloat(value);}
        if (argname == "lng") {lng = parseFloat(value);}
        if (argname == "zoom") {zoom = parseInt(value);}
        if (argname == "type") {
            if (value == "m") {maptype = G_NORMAL_MAP;}
            if (value == "k") {maptype = G_SATELLITE_MAP;}
            if (value == "h") {maptype = G_HYBRID_MAP;}
            if (value == "p") {maptype = G_PHYSICAL_MAP;}
        }
    }


	if(GBrowserIsCompatible()) {// check google map
		indicator = new Image(16, 16);
		indicator.src = homeUrl + "/images/loader.gif";
		$(window).unload(function() { GUnload(); });

		if($('#map').length) {

			// default parameter
			var lat = $('#def_lat').attr('value');
			var lng = $('#def_lng').attr('value');
			if(lat == undefined || lat == "" || lng == undefined || lng =="") {
				var zoom = parseInt(4);
			} else {
				var zoom = parseInt(14);
			}
			if(lat == undefined || lat == "") { lat = 35.689506; }
			if(lng == undefined || lng == "") { lng = 139.691701; }


			map = new GMap2(document.getElementById("map"));
			map.addControl(new GSmallMapControl());
			map.addControl(new GMapTypeControl(true));
			map.addMapType(G_PHYSICAL_MAP);
			map.enableScrollWheelZoom();
			geocoder = new GClientGeocoder();
			
			point = new GLatLng(parseFloat(lat),parseFloat(lng));
			map.setCenter(point, zoom);
			
			if($('#def_lat').length > 0 && $('#def_lng').length > 0) {
				mapFunc.pre_marker = new GMarker(point, baseIcon[3]);
				map.addOverlay(mapFunc.pre_marker);
			}

			mapFunc.centerMarker();
			GEvent.addListener(map, "moveend", function(){ mapFunc.centerMarker(); });


            if(loc != "") {
                mapFunc.searchLoc(loc);
            }
		
            $('#loclist').change(function() {
                var lines = "";
                $("#loclist option:selected").each(function() {
                    var lines = $(this).val().split(",");
                    point = new GLatLng(parseFloat(lines[1]),parseFloat(lines[0]));
                    map.setCenter(point, parseInt(lines[2]));
                });
            });

            $('.searchLoc').submit(function() {
                var loc = $('.loc').attr('value');
                mapFunc.searchLoc(loc);
                return false;
            });

            $('.locSearch').click(function() {
                var loc = $('.loc').attr('value');
                mapFunc.searchLoc(loc);
            });
		}
	}

    $('.postForm').submit(function() {
        var title	= $('#title').attr('value');
        if(!title) {
            alert("ERROR: Please enter a title.");
        } else {
            mapFunc.pmAjax();
        }
        return false;
    });
				
    $('.searchForm').submit(function() {
        var q = $('.q').attr('value');
        var cat = $('#catList option:selected').val();

        var inarea = $("input:checkbox:checked").eq(0).val();
        if(inarea == 1) {
            m = 4;
        } else {
            m = 0;
        }

        //mapFunc.clearMarker(0);
        mapFunc.getInfo(q,cat,"",1,m);
        return false;
    });

    $('.searchAPIForm').submit(function() {
		var pos_title = "";
        var q = $('.q').attr('value');
        var mode = $('#catList option:selected').val();

		var baseUrl = homeUrl + "/ws/search.php";
        post_url = baseUrl + "?mode=" + mode + "&items=" + mapFunc.per_page;
        kml_url = baseUrl + "?mode=" + mode + "&f=1&items=" + mapFunc.per_page;

		mapFunc.clearMarker(1);

		q = q.replace(/^\s+/, "");
		q = q.replace(/\s+$/, "");
		q = q.replace(/\s/g, "+");
		post_url += "&q=" + encodeURI(q);
		kml_url += "&q=" + encodeURI(q);

		if(q != "") {
			pos_title = '<h2 class="midashi">Search: ' + q + '</h2>';
		}
		
		mapFunc.searchResults(1,pos_title,post_url);
        return false;
    });

	$('.filetree').treeview({
		collapsed: false,
		animated: "fast"
	});

    $('a.lightbox').lightBox();

	tempFunc.linkbox();
    
    $("#q").suggest("http://www.japan-hopper.com/ws/searcharea.php",{});
        
    $('#clustrMapsImg').error(function() {
        this.onerror=null;
        this.src='http://www2.clustrmaps.com/images/clustrmaps-back-soon.jpg';
        document.getElementById('clustrMapsLink').href='http://www2.clustrmaps.com';
    });
});

$.fn.preInput = function(txt, options) {
	var default_options = {
		class_name: 'pre-input'
	};

	options = $.extend(default_options, options || {});
	return this.each(function(){
		if(typeof this.value == 'undefined') return;

		var elm = $(this);
		elm.val(txt)
		elm.addClass(options.class_name)
		elm.focus(function(){
			if(elm.val() == txt) {
				elm.removeClass(options.class_name)
				elm.val('');
			}
		});
		elm.blur(function(){
			if(elm.val() == '') {
				elm.addClass(options.class_name)
				elm.val(txt)
			}
		});
	});
}

