/**
 * GMapsObject v1.1
 * @since 2009年 夏
 * @author Hiroaki Komatsu
 */

var gmapsobject=function(){
	var j=window,K=document,T=navigator;
	
	// **********************************************
	// *
	// *  読み込み
	// *
	// **********************************************
	var b="undefined";
	var d=[],o=[],Z=null,e=false;
	
	var h=function(){
		var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,x=null;
		var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);
		/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/
		return{w3cdom:v,webkit:AA,ie:q,win:z,mac:w}
	}();
	
	var L=function(){
		if(!h.w3cdom){
			return 
		}
		if(h.ie&&h.win){
			try{
				K.write("<script id=__ie_ondomload defer=true src=//:><\/script>");
				var J=C("__ie_ondomload");
				if(J){I(J,"onreadystatechange",S)}
			}catch(q){}
		}if(h.webkit&&typeof K.readyState!=b){
			Z=setInterval(function(){
				if(/loaded|complete/.test(K.readyState)){E()}
			},10)
		}
		if(typeof K.addEventListener!=b){
			K.addEventListener("DOMContentLoaded",E,null);
		}
		R(E);
	}();
	
	function E(){
		if(e){return }
		if(h.ie&&h.win){
			var v=K.createElement("span")
			try{
				var u=K.getElementsByTagName("body")[0].appendChild(v);
				u.parentNode.removeChild(u)
			}catch(w){
				return 
			}
		}
		e=true;
		if(Z){
			clearInterval(Z);
			Z=null
		}
		var q=o.length;
		for(var r=0;r<q;r++){
			o[r]()
		}
	}
	
	function f(q){
		if(e){q()}else{o[o.length]=q}
	}
	
	function R(r){
		if(typeof j.addEventListener!=b){
			j.addEventListener("load",r,false)
		}else{
			if(typeof K.addEventListener!=b){
				K.addEventListener("load",r,false)
			}else{
				if(typeof j.attachEvent!=b){
					I(j,"onload",r)
				}else{
					if(typeof j.onload=="function"){
						var q=j.onload;
						j.onload=function(){
							q();
							r();
						}
					}else{
						j.onload=r
					}
				}
			}
		}
	}
	
	function C(t){
		var q=null;
		try{
			q=K.getElementById(t)
		}catch(r){}
		return q
	}
	
	function I(t,q,r){
		t.attachEvent(q,r);
		d[d.length]=[t,q,r]
	}
	
	var D=function(){
		if(h.ie&&h.win){
			j.attachEvent("onunload",GUnload);
		}
	}();
	
	// **********************************************
	// *
	// *  変数
	// *
	// **********************************************
	// マップ
	var map;
	
	// 出力されたときのコールバック
	var callback;
	
	// カテゴリ
	var category;

	// デフォルトのID
	var default_id;

	// 時間（ミリ秒）
	var startTime;
	
	// 操作パネルのアイコン指定
	var cIconDir = "/common/img/gmaps-icons/";
	
	// マーカーのアイコン指定
	var IO={};
	var default_iconDir = "/common/img/gmaps-markers/";
	
	// **********************************************
	// *
	// *  デフォルトのテンプレート
	// *
	// **********************************************
var template = '<div class="marker-style">\
<p class="marker-title">%name%</p>\
<temp:If name="%img% %address% %tel% %com%"><div class="marker-comments">\
<temp:If name="%img%"><img src="%img%" alt=""></temp>\
<temp:If name="%com%"><span>%com%</span></temp>\
<div style="clear:both;"></div>\
</div></temp>\
<temp:If name="%href%"><p class="marker-link"><a href="%href%">[ 詳細 ]</a></p></temp>\
</div>';
	
	// **********************************************
	// *
	// *  init
	// *
	// **********************************************
	
	/**
	 * GoogleMaps初期設定
	 * @param id Mapコンテンツを入れ替えるID
	 * @param lat デフォルトの緯度
	 * @param lng デフォルトの経度
	 * @param z デフォルトの縮尺
	 * @param controls addControlで追加する項目 (option)
	 */
	function GMap2_init(id,lat,lng,z,controls){
		if(GBrowserIsCompatible()){
			try{
				var map_doc = K.getElementById(id);
				map = new GMap2(map_doc);
				
				// スライダーが用意されたコントロールを追加
				if(typeof controls == "object"){
					for(var e in controls){
						var value = controls[e];
						if(!value) continue;
						switch(e){
						case "GLargeMapControl":
							// 4ボタン、ズームイン/ズームアウト、ズームスライダ
							map.addControl(new GLargeMapControl());
							break;
						case "GSmallMapControl":
							// 4ボタン、ズームイン/ズームアウト
							map.addControl(new GSmallMapControl());
							break;
						case "GSmallZoomControl":
							// ズームイン/ズームアウト
							map.addControl(new GSmallZoomControl());
							break;
						case "GOverviewMapControl":
							// 右下に概要を示す地図を表示
							if(value instanceof Array){
								map.addControl(new GOverviewMapControl(new GSize(value[0],value[1])));
							}
							break;
						case "GMapTypeControl":
							// マップタイプ切り替えメニューを追加
							map.addControl(new GMapTypeControl());
							break;
						case "GScaleControl":
							// 縮尺定規を追加
							map.addControl(new GScaleControl());
							break;
						}
					}
				}
				map.setCenter(new GLatLng(lat,lng),z);
			}catch(e){
				alert(e);
			}
		}
	}

	// **********************************************
	// *
	// *  maps
	// *
	// **********************************************

	/**
	 * JSON読み込み成功
	 * @param jsondata JSONテキスト
	 * @param statusCode 
	 */
	function complete_json(jsondata,statusCode){
		var json = eval("("+jsondata+")");
		createMap(json.marker);
	}

	/**
	 * XML読み込み成功
	 * @param xmldata XMLテキスト
	 * @param statusCode 
	 */
	function complete_xml(xmldata,statusCode){
		var markers_new=[];
		try{
			var xml = GXml.parse(xmldata);
			var markers = xml.documentElement.getElementsByTagName("marker");
			
			// Mapにマーカーを追加
			var len=markers.length;
			for(var i=0;i<len;i++){
				var ides = markers[i].getElementsByTagName("id");
				var lats = markers[i].getElementsByTagName("lat");
				var lngs = markers[i].getElementsByTagName("lng");
				var names = markers[i].getElementsByTagName("name");
				var addresses = markers[i].getElementsByTagName("address");
				var addresses2 = markers[i].getElementsByTagName("address2");
				var tels = markers[i].getElementsByTagName("tel");
				var phones = markers[i].getElementsByTagName("phone");
				var coms = markers[i].getElementsByTagName("com");
				var comments = markers[i].getElementsByTagName("comment");
				var comments2 = markers[i].getElementsByTagName("comment2");
				var imgs = markers[i].getElementsByTagName("img");
				var hrefs = markers[i].getElementsByTagName("href");
				var cates = markers[i].getElementsByTagName("cate");
				var icons = markers[i].getElementsByTagName("icon");
				var enableds = markers[i].getElementsByTagName("enabled");
				
				var data={};
				data["id"] = GXml.value(ides[0]);
				data["lat"] = parseFloat(GXml.value(lats[0]));
				data["lng"] = parseFloat(GXml.value(lngs[0]));
				data["name"] = GXml.value(names[0]);
				data["address"] = GXml.value(addresses[0]);
				data["address2"] = GXml.value(addresses2[0]);
				data["tel"] = GXml.value(tels[0]);
				data["phone"] = GXml.value(phones[0]);
				data["com"] = GXml.value(coms[0]);
				data["comment"] = GXml.value(comments[0]);
				data["comment2"] = GXml.value(comments2[0]);
				data["img"] = GXml.value(imgs[0]);
				data["href"] = GXml.value(hrefs[0]);
				data["cate"] = GXml.value(cates[0]);
				data["icon"] = GXml.value(icons[0]);
				data["enabled"] = GXml.value(enableds[0]);
				
				markers_new.push(data);
			}
		}catch(e){
			alert("XML Parse Error");
		}
		createMap(markers_new);
	}

	/**
	 * マップの作成
	 * @param markers オブジェクトの配列
	 */
	function createMap(markers){
		if(!map) return;
		var ls=[];
		try{
			// デフォルトのIDを取得して、緯度経度を設定
			if(default_id){
				for(var e in markers){
					var data = markers[e];
					if(typeof data=="object"){
						if(default_id==data["id"]){
							if(!category) category=data["cate"];
							map.setCenter(new GLatLng(data["lat"],data["lng"]));
							break;
						}
					}
				}
			}
			
			// iconオブジェクトを取得
			//var IO=IO;
			
			// Mapにマーカーを追加
			var len = markers.length;
			for(var i=0;i<len;i++){
				var data = markers[i];
				var marker=createMarker(data,IO);
				if(marker!=null){
					map.addOverlay(marker);
					data.marker = marker;
					ls.push(data);
					
					
					// デフォルトでふきだし表示
					if(default_id==data["id"]){
						var html=marker.html;
						if(html){
							marker.openInfoWindowHtml(html);
						}else{
							map.closeInfoWindow();
							map.panTo(mk.getLatLng());
						}
					}
				}
			}
		}catch(e){
			alert(e);
		}
		createControls(ls);
		if(callback) callback((new Date()).getTime() - startTime);
	}

	/**
	 * マーカーの作成
	 * @param data JSONオブジェクト
	 * @param IO iconオブジェクト
	 */
	function createMarker(data,IO){
		// エレメント取得
		var id=data["id"];
		var lat=data["lat"];
		var lng=data["lng"];
		var name=data["name"];
		var icon=data["icon"];
		var cate=data["cate"];
		var enabled=data["enabled"];
		
		if(icon==undefined || icon=="") icon=cate;
		if(lat==undefined || lat=="" || isNaN(lat)) return null;
		if(lng==undefined || lng=="" || isNaN(lat)) return null;
		
		// アイコン生成
		var opt = new Object();
		var IC = new GIcon();
		var dir=default_iconDir;
		if(typeof IO=="object"){
			if(IO.dir)dir=IO.dir;
			if(IO.sS)IC.shadow = dir+"shadow.png";
			if(IO.iS)IC.iconSize = new GSize(IO.iS[0],IO.iS[1]);
			if(IO.sS)IC.shadowSize = new GSize(IO.sS[0],IO.sS[1]);
			if(IO.iA)IC.iconAnchor = new GPoint(IO.iA[0],IO.iA[1]);
			if(IO.wA)IC.infoWindowAnchor = new GPoint(IO.wA[0],IO.wA[1]);
		}
		
		if(cate==category){
			// 同カテゴリのとき
			if(enabled == "0"){
				IC.image=dir+"disable.png";
				opt.clickable=false;
			}else{
				IC.image=dir+icon+".png";
			}
			opt.icon=IC;
		}else{
			// カテゴリが違うとき
			if(enabled=="0"){
				IC.image=dir+"disable.png";
				opt.clickable=false;
			}else{
				IC.image=dir+icon+".png";
			}
			opt.icon=IC;
		}
		
		try{
			// マーカー生成
			var mk = new GMarker(new GLatLng(lat,lng),opt);
			mk.title=name;
			mk.icon=data["icon"];
			if(enabled!="0"){
				var html=getDetailHTML(data);
				mk.html=html;
				GEvent.addListener(mk,"click",function(){
					mk.openInfoWindowHtml(html);
				});
			}
			
			/*
			// デフォルトでふきだし表示
			if(default_id==id){
				if(html){
					mk.openInfoWindowHtml(html);
				}else{
					map.closeInfoWindow();
					map.panTo(mk.getLatLng());
				}
			}
			*/
			return mk;
		}catch(e){
			return null;
		}
	}

	/**
	 * ふきだし内のHTMLを出力
	 * @param data オブジェクト
	 */
	function getDetailHTML(data){
		// テンプレートからHTMLを生成
		var h = template;
		
		// エレメント取得して、テンプレートを置き換え
		for(var e in data){
			var s = data[e];
			if(s == undefined) s = "";
			var re = new RegExp("%"+e+"%","g");
			h = h.replace(re,s);
		}
		
		// 空要素削除
		h = h.replace(/<temp:If name="">.*?<\/temp>/g,"");
		h = h.replace(/<temp:If name="\s+">.*?<\/temp>/g,"");
		
		// テンプレートタグ削除
		h = h.replace(/<temp:If name=".*?">/g,"");
		h = h.replace(/<\/temp>/g,"");
		
		return h;
	}

	// **********************************************
	// *
	// *  controls
	// *
	// **********************************************

	/**
	 * マーカーリンクの作成
	 * @param ls マーカーリスト
	 */
	function createControls(ls){
		try{
			// マーカーリンクを追加
			var cl=K.getElementById("map-controls");
			if(cl!=null){
				var ul=K.createElement("ul");
				var len=ls.length;
				for(var i=0;i<len;i++){
					// マーカーリストから要素を取得
					var marker = ls[i]["marker"];
					var cate = ls[i]["cate"];
					var enabled = ls[i]["enabled"];
					
					// カテゴリが一致していた場合のみ追加
					if(cate==category || !category){
						var doc = getControlHtml(marker);
						var li = K.createElement("li");
						if(enabled == "0"){
							li.className = "disable";
						}else{
							li.className = cate;
						}
						li.appendChild(doc);
						ul.appendChild(li);
					}
				}
				cl.appendChild(ul);
			}
		}catch(e){
			alert(e);
		}
	}

	/**
	 * マーカーリンクのHTMLを出力
	 * @param mk マーカーオブジェクト
	 * @return p pタグ
	 */
	function getControlHtml(mk){
		// リンク
		var a = K.createElement("a");
		a.href = '';
		if(mk.title){
			var str = K.createTextNode(mk.title);
			a.appendChild(str);
		}else if(mk.icon){
			var img = K.createElement("img");
			img.src = cIconDir+mk.icon+".gif";
			a.appendChild(img);
		}
		var html = mk.html;
		if(html){
			a.onclick = function(){
				mk.openInfoWindowHtml(html);
				return false;
			}
		}else{
			a.onclick = function(){
				map.closeInfoWindow();
				map.panTo(mk.getLatLng());
				return false;
			}
		}
		
		var p = K.createElement("p");
		p.appendChild(a);
		return p;
	}
	
	return{
		/**
		 * 実行処理
		 * @param id Mapコンテンツを入れ替えるID
		 * @param lat デフォルトの緯度
		 * @param lng デフォルトの経度
		 * @param z デフォルトの縮尺
		 * @param c addControlで追加する項目 (option)
		 * @param p パラメータ (option)
		 */
		init:function(id,lat,lng,z,c,p){
			if(!id||!lat||!lng||!z||!c||!p){
				return;
			}
			
			var JU,XU;
			var ID,TMP=template,CA,sIC=cIconDir,iS,sS,iA,wA;
			var iD=default_iconDir;
			
			// パラメータ設定
			if(typeof p=="object"){
				JU=p.json;
				XU=p.xml;
				ID=p.id;
				if(p.template) TMP=p.template+"";
				CA=p.category;
				if(p.sideIconDir) sIC=p.sideIconDir;
				var IC=p.icons;
				
				// マーカーアイコン設定
				if(typeof IC=="object"){
					if(IC.iconSize && IC.iconSize instanceof Array) iS=IC.iconSize;
					if(IC.shadowSize && IC.shadowSize instanceof Array) sS=IC.shadowSize;
					if(IC.iconAnchor && IC.iconAnchor instanceof Array) iA=IC.iconAnchor;
					if(IC.infoWindowAnchor && IC.infoWindowAnchor instanceof Array) wA=IC.infoWindowAnchor;
					if(IC.iconDir) iD=IC.iconDir;
				}
			}
			
			f(function(){
				startTime=(new Date()).getTime();
				
				default_id=ID;
				template=TMP;
				category=CA;
				cIconDir=sIC;
				
				IO={};
				IO.iS=iS;
				IO.sS=sS;
				IO.iA=iA;
				IO.wA=wA;
				IO.dir=iD;
				
				// GoogleMaps初期化
				GMap2_init(id,lat,lng,z,c);
				
				if(JU){
					// JSON読み込み
					GDownloadUrl(JU+"?_"+(new Date()).getTime(),complete_json);
				}else if(XU){
					// XML読み込み
					GDownloadUrl(XU+"?_"+(new Date()).getTime(),complete_xml);
				}
			});
		},
		
		/**
		 * クエリー取得
		 * @return object
		 */
		getQueryParams:function(){
			var r={};
			var u=j.location.search;
			if(u){
				var t=u.substring(1).split('&');
				var l=t.length;
				for(var i=0;i<l;i++){
					var p=t[i].indexOf('=');
					r[t[i].substring(0,p)]=t[i].substring(p+1);
				}
				
			}
			return r;
		}
		
	}
}();
