/*******************************************************
 * common objects
 * create: 2007-5-29
 * auther: M.Tsukamoto
 *******************************************************/
// open node
function $(nodeID)
{
    return document.getElementById(nodeID);
}

// detect Browser(safari, firefox, ie)
// UAからブラウザを判定（とりあえず、主要ブラウザのみ）
function detectBrowser()
{
	var agent = new String(navigator.userAgent.toLowerCase());
	// detect Browser
	if (agent.indexOf("safari") >= 0) {
		return new String('saf');
	} else if (agent.indexOf("firefox") >= 0) {
		return new String('ff');
	} else {
		return new String('ie');
	}
}

/*******************************************************
 * use gmap objects
 * create: 2007-5-29
 * auther: M.Tsukamoto
 *******************************************************/
var GMAssistant = Object({
	// GM.controlFlag -> load button
	mapButton: function (obj)
	{
		if (GM.controlFlag._move != 0) {
			obj.addControl(new GLargeMapControl());
		}
		if (GM.controlFlag._zoom != 0) {
			obj.addControl(new GSmallZoomControl());
		}
		if (GM.controlFlag._type != 0) {
			obj.addControl(new GMapTypeControl());
		}
		if (GM.controlFlag._OB != 0) {
			obj.addControl(new GOverviewMapControl());
		}
	}
});

// main Objects
function loadMaps(GM) {
	
	/*******************************************************
	 * Ajax method
	 *******************************************************/
	var responseValue;
	
	this.loadXML = function(callback, xmlPath, async){
  		sendRequest(callback, null, 'POST', xmlPath, async, true);
	}
  	
	// response -> into responseValue
	this.getResponse = function(obj) {
	   	//responseXMLでレスポンスを取得
    	responseValue = obj.responseXML;
	}
  	
	// Ajax callback function
	this.on_loadedXML = function(obj) {
	   	//responseXMLでレスポンスを取得
    	var res = obj.responseXML;
    	//XMLをHTMLに変換します
	   	loadPopup(res);
	}
	
	/*******************************************************
	 * method county in loadMaps
	 *******************************************************/
	// xml -> parse tag Elements
	//XML内を分解して各要素を取得
	this.parseXML = function(xml)
	{
		return new Object({
			item:    xml.getElementsByTagName("item"),
    		name:    xml.getElementsByTagName("name"),
    		info:    xml.getElementsByTagName("info"),
    		url:     xml.getElementsByTagName("url"),
    		jpeg:    xml.getElementsByTagName("jpeg"),
    		ico:     xml.getElementsByTagName("ico"),
    		iheight: xml.getElementsByTagName("iheight"),
    		iwidth:  xml.getElementsByTagName("iwidth"),
    		shi:     xml.getElementsByTagName("shico"),
    		shh:     xml.getElementsByTagName("shheight"),
    		shw:     xml.getElementsByTagName("shwidth"),
    		lon:     xml.getElementsByTagName("lon"),
    		lat:     xml.getElementsByTagName("lat")
		});
	}
	
	// xml Elements -> load popup html
	// 取得したXMLからマーカーを作成
	this.loadPopup = function(xmlObject)
	{
		//XML内を分解して各要素を取得
		var parse = parseXML(xmlObject);
		// empty xml Object process
		if (!xmlObject) {
			return null;
		}
		
		// initialize value
		var pname;
		var pinfo;
		var purl;
		var pjpeg;
		var pico;
		var piH;
		var piW;
		var pshi;
		var pshH;
		var pshW;
	    var plon;
		var plat;
		
		var html;
		var disableURL_HTML = GM.htmlExp;
		var enableURL_HTML  = GM.htmlBox;
		var source;
	
		var BI = new GIcon();
		BI.iconSize = new GSize(30, 30);
		BI.iconAncher = new GSize(10, 40);
		BI.infoWindowAnchor = new GSize(10, 40);
		
		for (i=0; i<parse.item.length; i++) {
    		pname = parse.name[i].firstChild.nodeValue;
			pinfo = parse.info[i].firstChild.nodeValue;
			purl  = parse.url[i].firstChild.nodeValue;
			pjpeg = parse.jpeg[i].firstChild.nodeValue;
    		pico  = parse.ico[i].firstChild.nodeValue;
    		piH   = parse.iheight[i].firstChild.nodeValue;
    		piW   = parse.iwidth[i].firstChild.nodeValue;
    		pshi  = parse.shi[i].firstChild.nodeValue;
    		pshH  = parse.shh[i].firstChild.nodeValue;
    		pshW  = parse.shw[i].firstChild.nodeValue;
		    plon  = parse.lon[i].firstChild.nodeValue;
    		plat  = parse.lat[i].firstChild.nodeValue;

			//マーカーを表示する
			
			html = '<div style="width:250px">';
			if (purl == 'none' || purl == '#') {
				html += disableURL_HTML.replace('<$name$>', pname);
			} else {
				tempHtml = enableURL_HTML;
				tempHtml = tempHtml.replace('<$name$>', (pname=='none')?null:pname);
				tempHtml = tempHtml.replace('<$url$>',  purl);
				tempHtml = tempHtml.replace('<$jpeg$>', (pjpeg=='none')?GM.blankImage:pjpeg);
				tempHtml = tempHtml.replace('<$info$>', (pinfo=='none')?null:pinfo);
				html += tempHtml;
			}
			
			// add marker
			source = (pico != null) ? pico : i;
			var marker = clickEventIcon(new GPoint(plon, plat), html, source, piH, piW, pshi, pshH, pshW);
  			mapObject.addOverlay(marker);
		}
	}
	
	// cleate event marker
	// クリックイベント付のアイコンの作成
    this.clickEventIcon = function(Point, html, source, iX, iY, sSource, sIX, sIY) {
		
		// create Marker Object
		var marker = createMarker(Point, source, iX, iY, sSource, sIX, sIY);
		// add mouseEvent
		markerAddEvent(marker, html);
		
		return marker;
	}
	
	// cleate marker
	// アイコンの作成
    this.createMarker = function(Point, source, iX, iY, sSource, sIX, sIY) {
		// validate source
		if (source.match(/\.(jpg|gif|png)$/)) {
			// marker property setup
			var iconLon    = (iX)?iX:30;
			var iconLat    = (iY)?iX:30;
			var iconPosLon = (iconLon)?Math.floor(iconLon/2):0;
			var iconPosLat = (iconLat)?Math.floor(iconLat/2):0;
			
			// cleate icon
			var icon                  = new GIcon();
				icon.iconSize         = new GSize(iconLon, iconLat);
				icon.iconAnchor       = new GPoint(iconPosLon,iconPosLat);
				icon.infoWindowAnchor = new GPoint(iconPosLon, iconPosLat);
				icon.infoShadowAnchor = new GPoint(5, 5);
				icon.image            = source;
				if (sSource.match(/\.(jpg|gif|png)$/)) {
					icon.shadow           = sSource;
	    			icon.shadowSize = new GSize(sIX, sIY);
				}
			
			// return marker
			return new GMarker(Point, icon);
		} else {
			return new GMarker(Point);
		}
	}
	
	// xml -> parse tag Elements
	// アイコンにクリックイベントを付加
    this.markerAddEvent = function(marker, html) {
		// add mouseEvent
		if (marker != null && html != null) {
			GEvent.addListener(marker, "click", function() {
				marker.openInfoWindowHtml(html);
			});
		}
	}
	
	// free Overlay
	// マーカーの削除
	this.clearMarker = function ()
	{
		mapObject.clearOverlays();
	}
	
	////////////////////////////////////////////////////////////////
	//マウスホールによるズーム処理
	//ADD 20070410 by Kojo
	////////////////////////////////////////////////////////////////
	this.mouseWheelZooming = function (event)
	{
		//マウスホイールの上／下の取得と、スクロールのキャンセル
		// zoom process
		if (GM.browser == 'ie' || GM.browser == 'saf') {
			var delta = event.wheelDelta;
			event.returnValue = false;
		} else if (GM.browser == 'ff') {
			var delta = event.detail * -1;
			event.preventDefault();
		}
		// zoom Event
		var zl_temp = mapObject.getZoomLevel() + ((delta<0) ? 1 : -1);
		// zoom range(1-13)
		/*if (zl_temp > 0 && zl_temp < 14) {
			mapObject.zoomTo(zl_temp);
		}*/
		mapObject.zoomTo(zl_temp);
	}
	
	/*******************************************************
	 * definition Gmap
	 * Gmap Api version: GMap(not support GMap2)
	 *******************************************************/
	// get map id
	// googleマップを代入するタグIDを定義
	this.mapID = $(GM.mapIdName);
	
	// create GMap Object
	// googleマップを格納
	this.mapObject = new GMap(mapID);
	
	// create GMap Status Object
	// googleマップに渡すアイコンオブジェクトを格納
	var GmapIcon  = new Object();
	
	// get default ViewPoints
	// googleマップ座標を取得
	var vPoint    = GM.priViewPoint;
	
	// get image source
	// googleマップに使用する画像パスを取得
	var imageSrc  = GM.imgSource;
	
	// get xml source
	// googleマップに使用するXMLパスを取得
	var xmlSrc  = GM.xmlSource;
	
	// positioning
	// googleマップの中心座標を設定
	mapObject.centerAndZoom(new GPoint(vPoint.x, vPoint.y), vPoint.zoom);
	
	// GMap button load
	// googleマップにボタンを追加
	GMAssistant.mapButton(mapObject);
	
	// preview Icon
	// 最初にアイコンを表示する
	if (GM.loadIcon != 0) {
		responseValue = null;
		loadXML(getResponse, xmlSrc, false);
		if (responseValue != null) {
			loadPopup(responseValue);
		}
	}
	/*******************************************************
	 * zoom action
	 *******************************************************/
	// Mouse Wheel Action
	// マウスホイールによるアクション
	if (GM.browser == 'ie') {
		mapID.attachEvent('onmousewheel', mouseWheelZooming);
	} else if (GM.browser == 'ff') {
		mapID.addEventListener('DOMMouseScroll', mouseWheelZooming, false);
	} else if (GM.browser == 'saf') {
		mapID.onmousewheel = mouseWheelZooming;
	}
	// zoom level action
	//ズームレベルが変わった場合
   	GEvent.addListener(mapObject, 'zoom', function(oldZoomLevel, newZoomLevel) {
		responseValue = null;
		loadXML(getResponse, xmlSrc, false);
		if (responseValue != null) {
			loadPopup(responseValue);
		}
   	});
}
