    var map;


	//BuzzXML用
	var dataMap = new Object();
	var categoryMap  = new Object();
	var twittMap = new Object();
	var twittLinkMap = new Object();
	

	//areaControll クラスのコンストラクタ
	function areaControll() {}
	//GControl クラスを継承する
	areaControll.prototype = new GControl();
	//コントロールが地図に追加されたときに呼び出される
	//主に初期化のために用いられる
	areaControll.prototype.initialize = function(map) {
		var container = document.createElement("div");
		container.setAttribute("id","areaControll");
		

		var boxYoyogi = document.createElement("div");
		var boxYoyogiKouen = document.createElement("div");
		var boxHatsudai = document.createElement("div");
		var boxHatagaya = document.createElement("div");
		var boxHarajuku = document.createElement("div");
		var boxShibuya = document.createElement("div");
		var boxEbisu = document.createElement("div");
		boxYoyogi.setAttribute("id","yoyogi");
		boxYoyogiKouen.setAttribute("id","yoyogiKouen");
		boxHatsudai.setAttribute("id","hatsudai");
		boxHatagaya.setAttribute("id","hatagaya");
		boxHarajuku.setAttribute("id","harajuku");
		boxShibuya.setAttribute("id","shibuya");
		boxEbisu.setAttribute("id","ebisu");
		var emYoyogi = document.createElement("em");
		var emYoyogiKouen = document.createElement("em");
		var emHatsudai = document.createElement("em");
		var emHatagaya = document.createElement("em");
		var emHarajuku = document.createElement("em");
		var emShibuya = document.createElement("em");
		var emEbisu = document.createElement("em");		
		emYoyogi.appendChild(document.createTextNode("代々木・千駄ヶ谷"));
		boxYoyogi.appendChild(emYoyogi);
		emYoyogiKouen.appendChild(document.createTextNode("代々木公園・代々木上原"));
		boxYoyogiKouen.appendChild(emYoyogiKouen);
		emHatsudai.appendChild(document.createTextNode("初台・本町"));
		boxHatsudai.appendChild(emHatsudai);
		emHatagaya.appendChild(document.createTextNode("幡ヶ谷・笹塚"));
		boxHatagaya.appendChild(emHatagaya);
		emHarajuku.appendChild(document.createTextNode("原宿・表参道"));
		boxHarajuku.appendChild(emHarajuku);
		emShibuya.appendChild(document.createTextNode("渋谷"));
		boxShibuya.appendChild(emShibuya);
		emEbisu.appendChild(document.createTextNode("恵比寿・広尾・代官山"));
		boxEbisu.appendChild(emEbisu);
		
		
		
		container.appendChild(boxYoyogi);
		container.appendChild(boxYoyogiKouen);
		container.appendChild(boxHatsudai);
		container.appendChild(boxHatagaya);
		container.appendChild(boxHarajuku);
		container.appendChild(boxShibuya);
		container.appendChild(boxEbisu);
		
		//Dom の clickイベントが発生したら、処理を行う
		GEvent.addDomListener(boxYoyogi, "click", function() {
		  moveMap('35.680864550649304','139.70940113067627');
		});
		GEvent.addDomListener(boxYoyogiKouen, "click", function() {
		  moveMap('35.6714171466484','139.68549728393555');
		});
		GEvent.addDomListener(boxHatsudai, "click", function() {
		  moveMap('35.68340923210112','139.68661308288574');
		});
		GEvent.addDomListener(boxHatagaya, "click", function() {
		  moveMap('35.677064806738926','139.6763563156128');
		});
		GEvent.addDomListener(boxHarajuku, "click", function() {
		  moveMap('35.669639096873404','139.70716953277588');
		});
		GEvent.addDomListener(boxShibuya, "click", function() {
		  moveMap('35.6589002289608','139.70150470733643');
		});
		GEvent.addDomListener(boxEbisu, "click", function() {
		  moveMap('35.64711370522505','139.71094608306885');
		});
		
		//コンテナを地図上に追加
		map.getContainer().appendChild(container);
		//コンテナDiv を返す
		return container;
	}
	//位置が指定されなかったとき、コントロールの位置を決めます
	areaControll.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(0, 0));
	}



	//listControll クラスのコンストラクタ
	function listControll() {}
	//GControl クラスを継承する
	listControll.prototype = new GControl();
	//コントロールが地図に追加されたときに呼び出される
	//主に初期化のために用いられる
	listControll.prototype.initialize = function(map) {
		var container = document.createElement("div");
		container.setAttribute("id","listControll");
		
		var listBox = document.createElement("div")		
		listBox.setAttribute("id","side_bar");
		container.appendChild(listBox);
		
		var linkBox = document.createElement("div")		
		linkBox.setAttribute("id","side_banner");
		linkBox.innerHTML = "<a href='/fc/index.html' >＞＞全施設一覧はこちら</a>";
		container.appendChild(linkBox);

		//コンテナを地図上に追加
		map.getContainer().appendChild(container);
		//コンテナDiv を返す
		return container;
	}
	//位置が指定されなかったとき、コントロールの位置を決めます
	listControll.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(20, 0));
	}






    
    if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 40));
		map.addControl(new GSmallMapControl(),pos); // large を Small に変更可
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(35.661271, 139.696441), 15);
		
		//自作ボタンの追加
		map.addControl(new areaControll() );
		map.addControl(new listControll() );

		//背景画像を重ねる
		//var screenXY = new GScreenPoint(0, 0);
		//var overlayXY = new GScreenPoint(0, 0);
		//var size = new GScreenSize(944, 555);
		//var soverlay = new GScreenOverlay("/topics/img/filter.png", screenXY, overlayXY, size);
		//map.addOverlay(soverlay);
		
		var tilelayer = new GTileLayer(new GCopyrightCollection(), 0, 17);
		tilelayer.getTileUrl = function() {return "/topics/img/filter.png";};
		//tilelayer.getOpacity = function() {return 0.7};
		map.addOverlay(new GTileLayerOverlay(tilelayer));
		GEvent.addListener(map, "moveend", function() {pointVisibleChange();});

    }
    
    function moveMap(lat,lon){
		map.panTo(new GLatLng(lat, lon), 14);
		//pointVisibleChange();
	}
    function createMarker(point, label, html, markerIcon) {
	  var opts ={icon:markerIcon}
      var marker = new GMarker(point, opts);
      GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html);
      });
      return marker;
    }
    
    function createside_barEntry(marker, label, contentID) {
      var div = document.createElement("div");
      var html = '' + label + '';
      div.innerHTML = html;
      div.style.cursor = "pointer";
      div.style.marginBottom = "4px";
      div.style.padding = "4px";
	  div.setAttribute("id","pID"+contentID);	//表示非表示のトリガにするためのID
      GEvent.addDomListener(div, "click", function() {
        GEvent.trigger(marker, "click");
      });
      GEvent.addDomListener(div, "mouseover", function() {
        div.style.backgroundColor = "#eaeaea"; // ポインタが乗ったときサイドバー項目の色指定
      });
      GEvent.addDomListener(div, "mouseout", function() {
        div.style.backgroundColor = "#fff";
      });
      return div;
    }
    
    



    GDownloadUrl("/topics/geomapList.xml", function(data, responseCode) { // XMLファイルの名称・場所
    
    if(responseCode == 200) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("item");
      var side_bar = document.getElementById("side_bar");
      side_bar.innerHTML = "";

		for (var i = 0; i < markers.length; i++) {

			//var pointerType = markers[i].getElementsByTagName("group_category")[0].firstChild.nodeValue;
			var iconCommon = new GIcon();
			iconCommon.shadow = "/img/mapIcons/iconShadow.png";
			iconCommon.iconSize = new GSize(20, 30);
			iconCommon.shadowSize = new GSize(34, 30);
			iconCommon.iconAnchor = new GPoint(10, 15);
			iconCommon.infoWindowAnchor = new GPoint(10, 15);
			var icon = new GIcon(iconCommon,"/img/mapIcons/pointer_green.png");


			var lat = GXml.value( (markers[i].getElementsByTagName("lat"))[0]  );
			var lng = GXml.value( (markers[i].getElementsByTagName("long"))[0]  );
			var group_category = "";
			var catchCopy = "";
			var image = "";
			var label = "nanasi";
			
			if (!lat){	//ChromeとFFとでエレメントの取り方が違う
				if(markers[i].getElementsByTagName("geo:lat")[0] != undefined && markers[i].getElementsByTagName("geo:long")[0] != undefined){
					if(markers[i].getElementsByTagName("geo:lat")[0].firstChild  && markers[i].getElementsByTagName("geo:long")[0].firstChild ){
						if(markers[i].getElementsByTagName("geo:lat")[0].firstChild !=null && markers[i].getElementsByTagName("geo:long")[0].firstChild !=null){
					    var lat =  markers[i].getElementsByTagName("geo:lat")[0].firstChild.nodeValue ;
					    var lng =  markers[i].getElementsByTagName("geo:long")[0].firstChild.nodeValue ;
					    }
				    }
			    }else{
					continue;
				}
			}
			var contentID = markers[i].getElementsByTagName("contentID")[0].firstChild.nodeValue;
			if(markers[i].getElementsByTagName("group_category")[0].firstChild){
				group_category = markers[i].getElementsByTagName("group_category")[0].firstChild.nodeValue;
			}
			if(markers[i].getElementsByTagName("catchCopy")[0].firstChild){
				catchCopy = markers[i].getElementsByTagName("catchCopy")[0].firstChild.nodeValue;
			}
			if(markers[i].getElementsByTagName("imagePath_a")[0].firstChild){
				image = markers[i].getElementsByTagName("imagePath_a")[0].firstChild.nodeValue;
			}
			var point = new GLatLng(parseFloat(lat), parseFloat(lng) , marker);
			var link = markers[i].getElementsByTagName("link")[0].firstChild.nodeValue;
			if (markers[i].getElementsByTagName("title")[0].firstChild){
				label = markers[i].getElementsByTagName("title")[0].firstChild.nodeValue;
			}
			var html = "<a href='"+ link +"' >" ;
			if(image){ 
			html = html + "<img src=\""+image+"\" class=\" thumbnail right \" />";
			}
			html = html + label;
			html = html + "</a>";
			html = html + "<div class=\"small\">" + group_category + "</div>";
			html = html + "<div class=\"small\">" + catchCopy + "</div>";
			
			//アイコン
			if (group_category.indexOf('スポーツ')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconSports.png");
			}else if (group_category.indexOf('公園')>-1 || group_category.indexOf('リフレッシュ')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconParks.png");
			}else if ( group_category.indexOf('文化')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconCultural.png");
			}else if (group_category.indexOf('図書館')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconLibrary.png");
			}else if (group_category.indexOf('教育')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconEducation.png");
			}else if (group_category.indexOf('エコ')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconEco.png");
			}else if (group_category.indexOf('菜園')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconFarm.png");
			}else if (group_category.indexOf('地域')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconTownship.png");
			}else if (group_category.indexOf('高齢者')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconSilver.png");
			}else if (group_category.indexOf('子育')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconBaby.png");
			}else if (group_category.indexOf('障害')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconVolunteer.png");
			}else if (group_category.indexOf('医療')>-1 || group_category.indexOf('保健')>-1 ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconHospital.png");
			}else if (group_category.indexOf('女性')>-1  ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconWomen.png");
			}else if (group_category.indexOf('就労')>-1  ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconWorks.png");
			}else if (group_category.indexOf('宿泊')>-1  ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconHotel.png");
			}else if (group_category.indexOf('区役所')>-1  || group_category.indexOf('出張所')>-1  ){
				var icon = new GIcon(iconCommon,"/img/mapIcons/iconPublicOffice.png");
			}

			var marker = createMarker(point, label, html , icon);

			map.addOverlay(marker);
			var side_barEntry = createside_barEntry(marker, label, contentID);
			side_bar.appendChild(side_barEntry);
			
			
			//buzzXMLに表示するための仕組み(配列に施設情報をいれておく）
			var elementMap = new Object();
			elementMap["image"] = image;
			elementMap["title"] = label;
			elementMap["link"] = link;
			elementMap["lat"] = lat;
			elementMap["lng"] = lng;
			elementMap["contentID"] = contentID;
			elementMap["group_category"] = group_category;
			elementMap["catchCopy"] = catchCopy;
			dataMap[link] = elementMap;

			if(categoryMap[group_category]){
				var ar = new Array(); 
				ar = categoryMap[group_category];
				ar.push(link);
				categoryMap[group_category] = ar;
			}else{
				var ar = new Array(); 
				ar.push(link);
				categoryMap[group_category] = ar;
			}
			//alert(categoryMap[group_category]);

		}
      
		//Buzz用のXMLを読み込む
		google.setOnLoadCallback(initialize);
		//pointVisibleChange();


    } else if(responseCode == -1) {
       alert("タイムアウトしました。後ほど再試行してください。");
    } else { 
       alert("エラーです。XMLファイルを確認してください。");
    }
    
    });


    function showList(){
		var html="";

		for (var k in categoryMap){		//該当カテゴリの数分作業
			//alert(k);	//key
			html += "<h2>"+k+"</h2>";
			var categoryLinkArr = categoryMap[k];	//該当カテゴリ含まれる施設のリンク配列
			
			for (var key in twittLinkMap){			//twitterの順番保持マップでループ
				var url = key;
				if ( (categoryLinkArr.toString()).indexOf(url)>-1 ){
					var hashMap = dataMap[url];
					html += "<div class=\"cbox\">";		//施設情報HTMLの作成（前半）
					html += "<h3 class=\"title\">"+hashMap["title"]+"</h3>";
					if (hashMap["image"]!="/c2msuploaded/"){
						html = html+ "<img src='"+map["image"] + "' class='thumbnail'></a>";
					}
					//twitterの数分出す
					var mapArr = twittMap[url];	//twitterの内容保持マップから内容配列を取得
					//alert(mapArr);
					for (i=0;i<mapArr.length;i++){		//該当URLに関するtwittの個数分loop
						var mapElement =mapArr[i];
						html = html+ "<div class=\"twittBox\">";
						//html = html+ mapArr["title"];
						html = html+ "<p class=\"twitt\">"+mapElement["desc"]+"</p>";
						html = html+ "<p class=\"pubDate\">"+mapElement["pubData"]+"</p>";
						html = html+ "</div>";
					}
					html = html+ "</div>";
					html = html+ "<hr />";
				}
				html = html+ "<hr />";
			}

		}
		//alert(document.getElementById("mainList"));
		if (document.getElementById("mainList")){
			document.getElementById("mainList").innerHTML = html;
		}
	}



    function pointVisibleChange(){
		 var bnd = map.getBounds();
		 var mapNE_lat = bnd.getNorthEast().lat();
		 var mapNE_lng = bnd.getNorthEast().lng();
		 var mapSW_lat = bnd.getSouthWest().lat();
		 var mapSW_lng = bnd.getSouthWest().lng();
		for (var k in dataMap){
			var hashMap = dataMap[k];
			var lat = hashMap["lat"];
			var lng = hashMap["lng"];
			//alert("lat:"+lat+"]["+mapNE_lat+"]["+mapSW_lat+"] lng:"+lng+"]["+mapNE_lng+"]["+mapSW_lng+"]");
			if ( (lat <= mapNE_lat && lat >= mapSW_lat) && (lng >= mapSW_lng && lng <= mapNE_lng) ){
				//地図の範囲内である
				//alert("pID"+hashMap["contentID"]);
				document.getElementById("pID"+hashMap["contentID"]).style.visible="true";
				document.getElementById("pID"+hashMap["contentID"]).style.display="block";
				//alert("in");
			}else{
				//地図の範囲からはずれる
				document.getElementById("pID"+hashMap["contentID"]).style.visible="false";
				document.getElementById("pID"+hashMap["contentID"]).style.display="none";
				//alert("out");
			}
		}
		bnd =null;
	}


    function getHashTag(desc){
		//var RegularExp = new RegExp( desc, (^|[] !""$%&'()*+,-.:;<=>?@[\^`{|}~])#([^] !""#$%&'()*+,-.:;<=>?@[\^`{|}~\r\n]+));
		var hashTag=desc.match( /\s*\#[a-zA-Z0-9]*[\s\r]*/g );
		return hashTag;
	}

    function getUrl(desc){
		var url=desc.match( /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g );
		return url;
	}

    function getAdditionalContent(desc,title,pubData){
		var html="";
		/*
		var hashValue = "";
		var hashTagArr = getHashTag(desc);
		if(hashTagArr){
			for (i=0;i<hashTagArr.length;i++){
				hashValue = hashTagArr[i].substring( hashTagArr[i].indexOf("#")+1, hashTagArr[i].length );
				if(dataMap[hashValue]!=null){
					var map = dataMap[hashValue];
					html = html+ "<div class='subInfo'>";
					html = html+ "<a href='"+ map["link"] +"'><h4>";
					html = html+ map["title"] + "</h4>";
					if (map["image"]!="/c2msuploaded/"){
						html = html+ "<img src='"+map["image"] + "' class='thumbnail'></a>";
					}
					html = html+ "</div>";
				}
				//alert(hashValue);
			}
		}
		*/

		var urlArr = getUrl(desc);		//TwitterコメントからURLを取得（配列）
		if(urlArr){	//URL配列が存在するとき
			for (i=0;i<urlArr.length;i++){
				urlValue = urlArr[i];
				if(dataMap[urlValue]!=null){	//該当URLが施設XMLに存在した
				
					var vMap = dataMap[urlValue];
					html = html+ "<div class='subInfo'>";
					html = html+ "<a href='"+ vMap["link"] +"'>";
					if ( vMap["image"].indexOf("/c2msuploaded/")>-1 && vMap["image"]!=("/c2msuploaded/") ){
						html = html+ "<img src='"+vMap["image"] + "' class='thumbnail'>";
					}
					html = html+ "<h4>" + vMap["title"] + "</h4>";
					html = html+ "<p>" + (vMap["catchCopy"]).substring(0,18) +"..." +"</p>";
					html = html+ "</a>";
						html = html+ "</div>";
					
					//ソートされたリスト用にキーとなるURLをマップに保存（配列にしないのは重複避けるため）
					if (twittMap[urlValue]==null){
						var arr = new Array();
						var tMap= new Object();
						tMap["title"]=title;
						tMap["desc"]=desc;
						tMap["pubData"]=pubData;
						arr.push(tMap);
						twittMap[urlValue]=arr;		//発言の内容
						twittLinkMap[urlValue]=i;	//発言の順番保持用
					}else{
						var tMap= new Object();
						tMap["title"]=title;
						tMap["desc"]=desc;
						tMap["pubData"]=pubData;
						var arr = new Array();
						arr = twittMap[urlValue];
						arr.push(tMap); 
						twittMap[urlValue]=arr;
					}
					
				}
				//alert(urlValue);
			}
		}
		
		return html;

	}


