var markerIcon1 = new GIcon();
markerIcon1.iconSize = new GSize(18,30);
markerIcon1.shadowSize = new GSize(36,30);
markerIcon1.iconAnchor = new GPoint(9, 22);
markerIcon1.shadowAnchor = new GPoint(9, 22);
markerIcon1.infoWindowAnchor = new GPoint(9, 0);
markerIcon1.infoShadowAnchor = new GPoint(18, 22);
markerIcon1.image = 'map_images/pointer_01.png';
markerIcon1.shadow = 'map_images/pointer_shadow.png';

var markerIcon2 = new GIcon(markerIcon1);
markerIcon2.image = 'map_images/pointer_02.png';

var markerIcon3 = new GIcon(markerIcon1);
markerIcon3.image = 'map_images/pointer_03.png';

var markerIcon4 = new GIcon(markerIcon1);
markerIcon4.image = 'map_images/pointer_04.png';

var markerIcon5 = new GIcon(markerIcon1);
markerIcon5.image = 'map_images/pointer_05.png';

var markerIcon = new GIcon(markerIcon1);
markerIcon.image = 'map_images/pointer_00.png';

var stargif10 = 'map_images/star_s10.gif';
var stargif15 = 'map_images/star_s15.gif';
var stargif20 = 'map_images/star_s20.gif';
var stargif25 = 'map_images/star_s25.gif';
var stargif30 = 'map_images/star_s30.gif';
var stargif35 = 'map_images/star_s35.gif';
var stargif40 = 'map_images/star_s40.gif';
var stargif45 = 'map_images/star_s45.gif';
var stargif50 = 'map_images/star_s50.gif';

function setDigit(chgval) {
	if (chgval.length < 4) {
		if (!chgval.match(/\./)) {
			chgval += '.';
		}
		while (chgval.length < 4) {
			chgval += '0';
		}
	}
	return chgval;
}

function _createMarker() {
	var marker = new GMarker(this.point,this.icon);
	var html = this.html;
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml(html);
	});
	this.marker = marker;
	return marker;
}

function GetStar(score) {
	var star;
	
	if (score < 1.5) {
		star = stargif10;
	} else if (score < 2) {
		star = stargif15;
	} else if (score < 2.5) {
		star = stargif20;
	} else if (score < 3){
		star = stargif25;
	} else if (score < 3.5) {
		star = stargif30;
	} else if (score < 4) {
		star = stargif35;
	} else if (score < 4.5) {
		star = stargif40;
	} else if (score < 5) {
		star = stargif45;
	} else {
		star = stargif50;
	}
	return star;
}

function GetMarker(score) {
	var icon;
	
	if (score < 1) {
		icon = markerIcon;
	} else if (score < 2) {
		icon = markerIcon1;
	} else if (score < 3) {
		icon = markerIcon2;
	} else if (score < 4) {
		icon = markerIcon3;
	} else if (score < 5) {
		icon = markerIcon4;
	} else {
		icon = markerIcon5;
	}
	return icon;
}

function MapRstObject(mElement) {
	this.point = new_point(parseFloat(mElement.getAttribute("lng")),parseFloat(mElement.getAttribute("lat")));
	this.id = mElement.getAttribute("id");
	
	var score = mElement.getAttribute("score");
	this.icon = GetMarker(score);
	this.star = GetStar(score);
	
	var rvwcnt = mElement.getAttribute("rvwcnt");
	
	var rvwinfo;
	if (rvwcnt > 0) {
		rvwinfo = '<div class="rating"><img class="star_bar" src="'+this.star+'">'+setDigit(score)+' <span>( '+rvwcnt + ' )</span></div>';
	} else {
		rvwinfo = '<div class="noreview">この医院ってどうなの？<br>'
				+'<img src="map_images/ico_review.gif"><a href="http://www.e-dent.net/modules/weblog/post.php?code='+this.id+'" target="_blank">'
				+'レビューを書き込む</a></div>';
	}
	var URL = decodeURL(mElement.getAttribute("rsturl"));
	this.html = '<div style="width:170px;height:120px;"><div style="font-size:12px;line-height:16px;font-weight:normal;padding:0px;margin:0px;"><img src="map_images/ico_restaurant.gif" style="padding:0px;margin:0px 5px 0px 0px;vertical-align:middle;"><a href="'+URL+'" target="_blank">'+mElement.getAttribute("rstname")
			+'</a></div><div style="font-size:10px;line-height:16px;font-weight:normal;padding:0px;margin:0px;">（'+mElement.getAttribute("rstcat")+'）</div>'
			+ rvwinfo + '</div>';
	
	return this;
}
MapRstObject.prototype.createMarker = _createMarker;

function MapRvwrObject(mElement) {
	this.point = new_point(parseFloat(mElement.getAttribute("lng")),parseFloat(mElement.getAttribute("lat")));
	this.id = mElement.getAttribute("id");
	
	var score = mElement.getAttribute("score");
	this.icon = GetMarker(score);
	this.star = GetStar(score);
	
	var rvwinfo;
	if (score > 0) {
		rvwinfo = '<div class="rating"><img class="star_bar" src="'+this.star+'">'+setDigit(score)+' </div>';
	} else {
		rvwinfo = '<div class="rating">評価なし</div>';
	}
//	var rvwimg = mElement.getAttribute("rvwimg");
//	if (rvwimg) {
//		rvwinfo += '<div class="photo"><a href="'+rvwimg+'" target="_blank"><img src="'+rvwimg+'" border="0" hight="105"></a></div>';
//	}
	rvwinfo += '<div style="font-size:12px;line-height:16px;padding:0px 0px 0px 5px;margin:0px;">'+mElement.getAttribute("rvwcomment")+'</div>';
	
	var URL = decodeURL(mElement.getAttribute("rsturl"));
	this.html = '<div style="width:170px;height:120px;"><div style="font-size:12px;line-height:16px;font-weight:normal;padding:0px;margin:0px;"><img src="map_images/ico_restaurant.gif" style="padding:0px;margin:0px 5px 0px 0px;vertical-align:middle;"><a href="'+URL+'" target="_blank">'+mElement.getAttribute("rstname")
			+'</a></div><div style="font-size:10px;line-height:16px;font-weight:normal;padding:0px;margin:0px;">（'+mElement.getAttribute("rstcat")+'）</div>'
			+ rvwinfo + '</div>';
	
	return this;
}
MapRvwrObject.prototype.createMarker = _createMarker;

function createMapObject(mElement,mode) {
	if (mode == "restaurant") {
		return new MapRstObject(mElement);
	} else if (mode == "reviewer") {
		return new MapRvwrObject(mElement);
	}
}

function placeMapObj(map,url,mode) {
	var request = GXmlHttp.create();
	request.open('GET',url,true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var xmlDoc = request.responseXML;
			if (xmlDoc && xmlDoc.documentElement) {
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				for (var i = 0; i < markers.length; i++) {
					var item = createMapObject(markers[i],mode);
					var marker = item.createMarker();
					map.addOverlay(marker);
				}
			}
		}
	}
	request.send(null);
}

function addMarker(map, lat, lng, html) {
var point = new_point(lat, lng);
var marker = new GMarker(point);
	// Show this marker's index in the info window when it is clicked
	GEvent.addListener(marker, "click", function() {
	  marker.openInfoWindowHtml(html);
	});
	map.addOverlay(marker);
}

function new_point(lng, lat) {
	if (japan_check(lng,lat)) {
		return wgs2tokyo(lat, lng);
	} else {
		return new GPoint(lng, lat);
	}
}

function japan_check(lng,lat) {
	if (lng > 115
		&& lng < 152
		&& lat > 30
		&& lat < 50
	) {
		return true;
	}
	return false;
}

function wgs2tokyo(lat,lon) {
	return new GPoint(lon,lat);
}

function decodeURL(str){
    var s0, i, j, s, ss, u, n, f;
    s0 = "";                // decoded str
    for (i = 0; i < str.length; i++){   // scan the source str
        s = str.charAt(i);
        if (s == "+"){s0 += " ";}       // "+" should be changed to SP
        else {
            if (s != "%"){s0 += s;}     // add an unescaped char
            else{               // escape sequence decoding
                u = 0;          // unicode of the character
                f = 1;          // escape flag, zero means end of this sequence
                while (true) {
                    ss = "";        // local str to parse as int
                        for (j = 0; j < 2; j++ ) {  // get two maximum hex characters for parse
                            sss = str.charAt(++i);
                            if (((sss >= "0") && (sss <= "9")) || ((sss >= "a") && (sss <= "f"))  || ((sss >= "A") && (sss <= "F"))) {
                                ss += sss;      // if hex, add the hex character
                            } else {--i; break;}    // not a hex char., exit the loop
                        }
                    n = parseInt(ss, 16);           // parse the hex str as byte
                    if (n <= 0x7f){u = n; f = 1;}   // single byte format
                    if ((n >= 0xc0) && (n <= 0xdf)){u = n & 0x1f; f = 2;}   // double byte format
                    if ((n >= 0xe0) && (n <= 0xef)){u = n & 0x0f; f = 3;}   // triple byte format
                    if ((n >= 0xf0) && (n <= 0xf7)){u = n & 0x07; f = 4;}   // quaternary byte format (extended)
                    if ((n >= 0x80) && (n <= 0xbf)){u = (u << 6) + (n & 0x3f); --f;}         // not a first, shift and add 6 lower bits
                    if (f <= 1){break;}         // end of the utf byte sequence
                    if (str.charAt(i + 1) == "%"){ i++ ;}                   // test for the next shift byte
                    else {break;}                   // abnormal, format error
                }
            s0 += String.fromCharCode(u);           // add the escaped character
            }
        }
    }
    return s0;
}

