var map			 = null;				//GoogleMapを表示するためのクラスを格納する変数
var markers		 = new Array();			//マーカー用のデータを格納する配列
var sidebars	 = new Array();			//サイドバー用のデータを格納する配列
var FILE_PATH	 = "getxmldata.php";	//データ取得用ファイルのパス
var mode		 = 1;					//1:賃貸,2:売買
var arAreaInfo	 = new Array();			//地域の緯度経度を格納する配列、["id"] = GLatLng()
var arSyubetuInfo= new Array();			//物件種別の名称を格納する配列、["id"]["name"] or ["id"]["img"] or ["id"]["imgs"]
/* 
var highlightFLG = false;				//サイドバーのハイライトを適用するかどうか	
 */
var highlightFLG = true;				//サイドバーのハイライトを適用するかどうか	

//Zoom
var Gzoom = 13;	//ズーム初期値
var ZoomIn_Limit = 14;	//マップ拡大制限
var ZoomOut_Limit = 10;	//マップ縮小制限
//-Zoom

// 汎用的な関数 ========================================================================================

/**
 * 既存のクラスに自作メソッドを追加
 */
function add_Methods(){
	if(!Array.prototype.contains ){
		/**
		 * 配列の値の重複チェックに使用。
		 * @access public
		 * @param value mixed 検索するオブジェクト
		 * @return boolean 対象配列に既にオブジェクトが存在していれば true, そうでなければ false
		 */
		Array.prototype.contains = function( value ){
			for(var i in this){
				if( this.hasOwnProperty(i) && this[i] === value){ return true; }
			}
			return false;
		}
	}
}

/**
 * 指定されたXMLノードがあればその値を無ければ空白を返す
 * @param p_tagname string 値を取得したいタグ名
 * @return string
 */
function get_XmlNodeValue(p_tagname){
	if(p_tagname[0] == null){ return ""; }

	if(p_tagname[0].firstChild == null){ return ""; }

	if(p_tagname[0].firstChild.nodeValue == null){ return ""; }

	return p_tagname[0].firstChild.nodeValue;
}

/**
 * 1桁の数値を2桁にし、文字列で返す
 * @param p_num int 2桁にしたい数値
 * @return string
 */
function get_AddZeroStr(p_num){
	if(p_num < 10){ p_num = "0"+p_num; }
	return ""+p_num;
}

/**
 * 数値に3桁ごとのカンマを付け返す
 * @param p_num int フォーマットする数値
 * @return string
 */
function get_AddComma(p_num){
	if(isNaN(p_num)){ return p_num; }		//数値じゃないのでそのまま返す

	var sign= false;						//負の値であればtrue
	var num	= p_num;
	if(num < 0){
		sign= true;
		num = -num;							//符号による複雑さをなくすため正の値にする
	}

	var numAr = (num.toString()).split(".");//整数部と小数部に分割

	var cnt = 0;
	var numstr = "";
	var len = numAr[0].length;
	for(var i=len-1;i>=0;i--){
		if(cnt != 0 && cnt % 3 == 0){ numstr = ","+numstr; }
		cnt++;
		numstr = numAr[0].charAt(i)+numstr;
	}

	if(sign){ numstr = "-"+numstr; }
	if(numAr[1]){ numstr = numstr+"."+numAr[1]; }
	return numstr;
}

/**
 * 現在の日付時刻をyyyymmddHHMMssの形で返す
 * @return string
 */
function get_FullDateTimeStr(){
	var nowDate	= new Date();
	var year	= nowDate.getFullYear();				//4桁
	var month	= get_AddZeroStr(nowDate.getMonth()+1);	//0～11(+1で現実通り)
	var day		= get_AddZeroStr(nowDate.getDate());	//1～28･29･30･31
	var hour	= get_AddZeroStr(nowDate.getHours());	//0～23
	var min		= get_AddZeroStr(nowDate.getMinutes());	//0～59
	var sec		= get_AddZeroStr(nowDate.getSeconds());	//0～59
	
	return year+month+day+hour+min+sec;
}

/**
 * 指定日付が今日から指定した日数を過ぎているか調べる
 * @param p_date string 経過しているかどうか調べる日付(YYYY/MM/DD)
 * @param p_range int 経過日数
 * @return bool
 */
function is_NewDate(p_date,p_range){
	var now= new Date();							//今日
	var up = new Date(p_date);						//指定された日付をDateクラスへ

	var sabun= now.getTime() - up.getTime();
	var nisu = Math.floor(sabun/(24*60*60*1000));	//日数

	if(nisu < 0){ return false; }
	if(nisu > p_range){ return false; }
	return true;
}

/**
 * 2つの日付を比較し、より新しい日付を返す
 * @param p_date1 string 比較する日付1
 * @param p_date2 string 比較する日付2
 * @return string
 */
function get_NewDate(p_date1,p_date2){
	var date1 = new Date(p_date1);
	var date2 = new Date(p_date2);

	var sa= date1.getTime() - date2.getTime();
	if(sa > 0){ return p_date1; }
	if(sa < 0){ return p_date2; }
	return p_date1;
}

/**
 * 指定した画像のサイズを格納したGSizeオブジェクトを返す
 * @param p_imgpath string イメージのパス
 * @return object
 */
function get_ImgSize(p_imgpath){
	var img = new Image();
	img.src = p_imgpath;
	return new GSize(img.width,img.height);
}

/**
 * 文字列のtrimを行い、結果後の文字列を返す
 * @param p_str string trimする文字列
 * @return string
 */
function str_Trim(p_str){
	return p_str.replace(/^\s+|\s+$/g, "");
}

/**
 * 読み込みミス時のエラーを表示
 */
function show_ReadErrMsg(){ alert("データの読み込みに失敗しました、\r\n更新ボタンを押してください。"); }

// クラス関連 ==========================================================================================

/**
 * 1件分のサイドバー用の情報を格納するクラス
 * @param p_id			int		ユニークなID、データの特定に使用
 * @param p_cdcode		string	CDコード
 * @param p_address		string	住所
 * @param p_lat			float	緯度
 * @param p_lng			float	経度
 * @param p_madori		string	間取り(1Rなど)
 * @param p_money		int		賃料
 * @param p_sikikin		int		敷金
 * @param p_reikin		int		礼金
 * @param p_kbnarea 	int		地域区分
 * @param p_kbnsyubetu	int		物件種別
 * @param p_kbnmoney	int		賃料区分
 * @param p_kbnmadori	int		間取り区分
 * @param p_kbnsintiku	int		新築区分
 * @param p_kbnpet		int		入居条件・ペット相談可
 * @param p_kbngakki	int		入居条件・楽器相談可
 * @param p_kbnchild	int		入居条件・子供可
 * @param p_kbnwomen	int		入居条件・女性専用
 * @param p_kbncorp		int		入居条件・法人専用
 * @param p_kbnalone	int		入居条件・単身者不可
 * @param p_kbnoffice	int		入居条件・事務所可
 * @param p_releasedate string	公開日
 * @param p_mainlink	string	詳細画面へのリンクURL
 * @param p_windowhtm	string	マーカーの吹き出しの内容
 */
function clSide(p_id,p_cdcode,p_address,p_lat,p_lng,p_madori,p_money,p_sikikin,p_reikin,
				p_kbnarea,p_kbnsyubetu,p_kbnmoney,p_kbnmadori,p_kbnsintiku,p_kbnpet,p_kbngakki,p_kbnchild,p_kbnwomen,p_kbncorp,p_kbnalone,p_kbnoffice,
				p_releasedate,p_mainlink,p_windowhtml){
	this.id			= p_id;
	this.cdcode		= p_cdcode;
	this.address	= p_address;
	this.lat		= p_lat;
	this.lng		= p_lng;
	this.madori		= p_madori;
	this.money		= p_money;
	this.sikikin	= p_sikikin;
	this.reikin		= p_reikin;

	this.kbnarea	= p_kbnarea;
	this.kbnsyubetu	= p_kbnsyubetu;
	this.kbnmoney	= p_kbnmoney;
	this.kbnmadori	= p_kbnmadori;
	this.kbnsintiku = p_kbnsintiku;
	this.kbnpet		= p_kbnpet;
	this.kbngakki	= p_kbngakki;
	this.kbnchild	= p_kbnchild;
	this.kbnwomen	= p_kbnwomen;
	this.kbncorp	= p_kbncorp;
	this.kbnalone	= p_kbnalone;
	this.kbnoffice	= p_kbnoffice;

	this.releasedate= p_releasedate.replace(/-/g,"/");	//mysqlにはyyyy-mm-ddで入ってるので/に変更

	this.mainlink	= p_mainlink;
	this.windowhtml	= p_windowhtml;
	this.marker		= null;
	this.visible	= true;
}

/**
 * 1マーカー用の情報を格納するクラス
 * @param p_lat		float	緯度
 * @param p_lng		float	経度
 * @param p_marker	object	GMarkerクラス
 * @param p_visible	bool	マーカーの表示有無
 */
function clMarker(p_lat,p_lng,p_marker,p_visible){
	this.lat		= p_lat;
	this.lng		= p_lng;
	this.marker		= p_marker;
	this.visible	= p_visible;
	this.previsible = false;	//直前の表示有無
}

/**
 * 指定配列の中の指定idが格納されているクラスを返す
 * @param p_array array 複数のオブジェクトが格納されている配列
 * @param p_id int 取得するデータのID
 * @return object or null
 */
function get_ObjectfromArray(p_array,p_id){
	var len = p_array.length;
	for(var i=0;i < len;i++){
		var obj = p_array[i];
		if(obj.id == p_id){ return obj; }
	}
	return null;
}

/**
 * 指定配列の中のクラスの中の指定変数が指定値のデータが1件でもあればtrueを返す
 * @param p_array array 複数のオブジェクトが格納されている配列
 * @param p_idxname string クラスのメンバ変数名
 * @param p_value mixed 値
 * @return bool
 */
function is_ObjectInValue(p_array,p_idxname,p_value){
	var len = p_array.length;
	for(var i=0;i < len;i++){
		var obj = p_array[i];
		if(obj[p_idxname] == p_value){ return true; }
	}
	return false;
}

/**
 * 指定配列の中のクラスの中の指定変数が指定値であればインデックスを返す
 * (複数ある場合は一番最初のインデックス)
 * @param p_array array 複数のオブジェクトが格納されている配列
 * @param p_column string クラスのメンバ変数名
 * @param p_value mixed 値
 * @return mixed
 */
function get_IdxObjectInValue(p_array,p_column,p_value){
	var len = p_array.length;
	for(var i=0;i < len;i++){
		var obj = p_array[i];
		if(obj[p_column] == p_value){ return i; }
	}
	return false;
}

/**
 * 指定配列からに格納されているオブジェクトの指定項目が指定値のデータを全て削除して返す
 * @param p_array array 削除対象の配列
 * @param p_column string 項目名
 * @param p_value mixed 期待している値
 * @return array 削除後の配列
 */
function get_ArrayDeleteValue(p_array,p_column,p_value){
	var retArray = new Array();

	var len = p_array.length;
	for(var i=0;i<len;i++){
		obj = p_array[i];
		if(obj[p_column] == p_value){ continue; }

		retArray.push(obj);
	}

	return retArray;
}

// グローバル変数専用関数 ==============================================================================

/**
 * markersの中のクラスから緯経度をパラメータと比較し、近ければ指定配列のインデックスを返す
 * @param p_lat float 比較対象になる緯度
 * @param p_lng float 比較対象になる経度
 * @return mixed
 */
function get_SameMarkerIdx(p_lat,p_lng){
	var moji = 6;	//値が大きい=件数が増える
	var zoom = map.getZoom();

	if(0 <= zoom && zoom <= 5){
		moji = 2;
	} else if(6 <= zoom && zoom <= 10){
		moji = 5;
	} else if(11 <= zoom && zoom <= 11){
		moji = 6
	} else if(12 <= zoom && zoom <= 12){
		moji = 8;
	} else if(13 <= zoom && zoom <= 13){
		moji = 10;
	} else {
		moji = 13;
	}

	if(markers.length <= 0){ return -1; }

	for(var i in markers){
		if(i == "contains"){ continue; }	//プロトタイプで追加しているメソッド名を除く
		var obj		 = markers[i];
		var strObjlat= obj.lat.toString();
		var strPlat	 = p_lat.toString();
		var strObjlng= obj.lng.toString();
		var strPlng	 = p_lng.toString();

		if(strObjlat.substr(0,moji) == strPlat.substr(0,moji) && strObjlng.substr(0,moji) == strPlng.substr(0,moji)){
			return i;
		}
	}
	return -1;
}

/**
 * グローバル変数markersを完全クリアし、置いてあるマーカーをremoveする。
 * 抽出条件の変更時またはzoomendイベント時にコールしてください。
 */
function clear_Markers(){
	for(var i in markers){
		if(i == "contains"){ continue; }

		var obj= markers[i];
		map.removeOverlay(obj.marker);
	}
	markers.length = 0;
}

// ボタン用関数 ========================================================================================

/**
 * 更新ボタン用
 */
function click_ReloadButton(){ call_SetMarkersForDb(); }

// GoogleMapの設置用関数 ===============================================================================

/**
 * ロード
 */
function load() {
	if (GBrowserIsCompatible()) {
		//既存クラスに自作メソッドを追加-----------
		add_Methods();

		//GoogleMap作成----------------------------
		map		= new GMap2(document.getElementById("map"));
		var pt	= new GLatLng(33.9526786804199, 133.2960205078125);			//ロード時の中心座標

		map.addControl(new GLargeMapControl());								//地図のコントローラを表示 GSmallMapControl()にすると簡易型
		//map.addControl(new GMapTypeControl());							//地図・衛星・地図+写真の切り替えボタンを表示
		map.addControl(new GOverviewMapControl());							//右下に概要を示す地図を表示

		//Zoom
			//マップタイプ制限
			map.removeMapType(G_HYBRID_MAP);
			map.removeMapType(G_SATELLITE_MAP);

			//ズーム初期値を取得
			var zoom = Gzoom;
			if(zoom > ZoomIn_Limit){
				zoom = ZoomIn_Limit;
			}else{
				if(zoom < ZoomOut_Limit){
					zoom = ZoomOut_Limit;
				}
			}

			//登録されているマップタイプ全てを取得して
			//ズームレベルの制限するメソッドをオーバーライド
			var maptypes = map.getMapTypes();
			//alert("=" +maptypes.length);
	  	maptypes[0].getMaximumResolution = function(){
	   		return ZoomIn_Limit;
 			};
 			maptypes[0].getMinimumResolution = function(){
 		  	return ZoomOut_Limit;
 			};
		//-Zoom

		map.setCenter(pt, zoom);												//センターの設定、map.setCenter(new GLatLng(緯度,経度), 倍率);

		//マップにイベントを追加
		GEvent.addListener(map,'moveend',function(){ call_SetMarkersForDb(); });

		call_SetSearch();		//抽出ボックスを設置する命令をする関数をコール
		call_SetMarkersForDb();	//マーカーを設置する命令をする関数をコール
	}
}

/**
 * データを取得しマーカーを設置する関数を呼ぶ（呼んだ後は干渉しないので無責任）
 */
function call_SetMarkersForDb(){
	var tbl		= "bukken";
	var bounds	= map.getBounds();			//現在の表示範囲を取得
	var ne		= bounds.getNorthEast();	//北東（右上）の座標	最大
	var sw		= bounds.getSouthWest();	//南西（左下）の座標	最小
	var para	= "mode="+mode+"&tbl="+tbl+"&nelat="+ne.lat()+"&nelng="+ne.lng()+"&swlat="+sw.lat()+"&swlng="+sw.lng();
	get_XmlData(para,1);
}

/**
 * 抽出ボックスを設置する関数を呼ぶ（呼んだ後は干渉しないので無責任）
 */
function call_SetSearch(){
	var para	= "mode="+mode+"&tbl=search";
	get_XmlData(para,2);
}

/**
 * マーカーのイベント設定
 * @param p_marker object GMarkerクラスのインスタンス
 * @param p_html string マーカーの吹き出しに表示するHTML
 */
function set_MarkerEvent(p_marker,p_html){
	GEvent.clearListeners(p_marker,'click');
	GEvent.addListener(p_marker,'click',function(){ p_marker.openInfoWindowHtml(p_html); });
}

/**
 * データの抽出用ボックスを設置
 */
function set_Search(p_xmlDoc){
	var html =	"<table class=\"searcharea\">"
			+	"<tr><th colspan=\"2\">検索条件を選んでください</th><td colspan=\"4\"></td></tr>"
		 	+	"<tr>"
			+	"	<th>地域</th><td>"+get_CmbKbnArea(p_xmlDoc)+"</td>"
			+	"	<th>物件種別</th><td>"+get_CmbKbnSyubetu(p_xmlDoc)+"</td>"
			+	"	<th>賃料</th><td>"+get_CmbKbnMoney(p_xmlDoc)+"</td>"
			+	"</tr>"
		 	+	"<tr>"
			+	"	<th>間取り</th><td>"+get_CmbKbnMadori(p_xmlDoc)+"</td>"
			+	"	<th>新築</th><td>"+get_CmbKbnSintiku()+"</td>"
			+	"	<th>情報更新日</th><td>"+get_CmbReleasedate()+"</td>"
			+	"</tr>"
		 	+	"<tr>"
			+	"	<th>入居条件</th><td colspan=\"5\">"+get_ChkKbnJyoken()+"</td>"
			+	"</tr>"
			+	"</table>";

	document.getElementById("search").innerHTML = html;
}
/**
 * 地域区分用コンボボックス文字列取得
 */
function get_CmbKbnArea(p_xmlDoc){
	var arData	= p_xmlDoc.documentElement.getElementsByTagName("ktiiki");
	var len		= arData.length;

	var retstr	= "<select id=\"kbnarea\" onChange=\"change_MapCenter()\">"
				+ "	<option value=\"0\">指定なし</option>";

	for(var i=0;i < len;i++){
		var id	= get_XmlNodeValue(arData[i].getElementsByTagName("id"));
		var name= get_XmlNodeValue(arData[i].getElementsByTagName("name"));
		var lat	= get_XmlNodeValue(arData[i].getElementsByTagName("lat"));
		var lng	= get_XmlNodeValue(arData[i].getElementsByTagName("lng"));

		arAreaInfo[id] = new GLatLng(lat,lng);	//緯経度を格納

		retstr += " <option value=\""+id+"\">"+name+"</option>";
	}

	retstr += "</select>";
	return retstr;
}
/**
 * 地域区分専用の処理、選択された地域をセンターに変更
 */
function change_MapCenter(){
	var ele = document.getElementById("kbnarea");	//選択した地域の緯度経度からマップ中心を変更
	var idx	= ele.selectedIndex;					//中心を変更した後はマップのmoveendが実行される
	var val	= ele.options[idx].value;
	if(val == 0){ return; }

/* 
	map.setCenter(arAreaInfo[val], 12);
 */
	map.setCenter(arAreaInfo[val], 14);
}

/**
 * 物件種別用コンボボックス文字列取得
 */
function get_CmbKbnSyubetu(p_xmlDoc){
	var arData	= p_xmlDoc.documentElement.getElementsByTagName("ksyubetu");
	var len		= arData.length;

	var retstr	= "<select id=\"kbnsyubetu\" onChange=\"change_MarkerAndSideBar()\">"
				+ "	<option value=\"0\">指定なし</option>";

	for(var i=0;i < len;i++){
		var id	= get_XmlNodeValue(arData[i].getElementsByTagName("id"));
		var val = get_XmlNodeValue(arData[i].getElementsByTagName("name"));
		var img = get_XmlNodeValue(arData[i].getElementsByTagName("markerimg"));
		var imgs= get_XmlNodeValue(arData[i].getElementsByTagName("markerimgs"));

		retstr += " <option value=\""+id+"\">"+val+"</option>";

		arSyubetuInfo[id] = new Array();
		arSyubetuInfo[id]["name"]= val;
		arSyubetuInfo[id]["img"] = img;
		arSyubetuInfo[id]["imgs"]= imgs;
	}

	retstr += "</select>";
	return retstr;
}
/**
 * 賃料用コンボボックス文字列取得
 */
function get_CmbKbnMoney(p_xmlDoc){
	var arData	= p_xmlDoc.documentElement.getElementsByTagName("ktinryo");
	var len		= arData.length;

	var retstr	= "<select id=\"kbnmoney\" onChange=\"change_MarkerAndSideBar()\">"
				+ "	<option value=\"0\">指定なし</option>";

	for(var i=0;i < len;i++){
		var id	= get_XmlNodeValue(arData[i].getElementsByTagName("id"));
		var val = get_XmlNodeValue(arData[i].getElementsByTagName("tinryo"));

		retstr += " <option value=\""+id+"\">"+val+"</option>";
	}

	retstr += "</select>";
	return retstr;
}
/**
 * 間取り用コンボボックス文字列取得
 */
function get_CmbKbnMadori(p_xmlDoc){
	var arData	= p_xmlDoc.documentElement.getElementsByTagName("kmadori");
	var len		= arData.length;

	var retstr	= "<select id=\"kbnmadori\" onChange=\"change_MarkerAndSideBar()\">"
				+ "	<option value=\"0\">指定なし</option>";

	for(var i=0;i < len;i++){
		var id	= get_XmlNodeValue(arData[i].getElementsByTagName("id"));
		var val = get_XmlNodeValue(arData[i].getElementsByTagName("madori"));

		retstr += " <option value=\""+id+"\">"+val+"</option>";
	}

	retstr += "</select>";
	return retstr;
}
/**
 * 新築区分用コンボボックス文字列取得
 */
function get_CmbKbnSintiku(){
	var retstr = "<select id=\"kbnsintiku\" onChange=\"change_MarkerAndSideBar()\">"
				+ "	<option value=\"0\">指定なし</option>"
				+ "	<option value=\"1\">新築</option>"
				+ "</select>";
	return retstr;
}
/**
 * 情報更新日用コンボボックス文字列取得
 */
function get_CmbReleasedate(){
	var retstr = "<select id=\"releasedate\" onChange=\"change_MarkerAndSideBar()\">"
				+ "	<option value=\"0\">指定なし</option>"
				+ "	<option value=\"1\">3日以内</option>"
				+ "	<option value=\"2\">1週間以内</option>"
				+ "</select>";
	return retstr;
}
/**
 * 入居条件用チェックボックス文字列取得
 */
function get_ChkKbnJyoken(){
	var retstr = "";
	retstr = "<input type=\"checkbox\" id=\"kbnpet\" onClick=\"change_MarkerAndSideBar()\">ペット相談可"
		   + "<input type=\"checkbox\" id=\"kbngakki\" onClick=\"change_MarkerAndSideBar()\">楽器相談可"
		   + "<input type=\"checkbox\" id=\"kbnchild\" onClick=\"change_MarkerAndSideBar()\">子供可"
		   + "<input type=\"checkbox\" id=\"kbnwomen\" onClick=\"change_MarkerAndSideBar()\">女性専用"
		   + "<input type=\"checkbox\" id=\"kbncorp\" onClick=\"change_MarkerAndSideBar()\">法人専用"
		   + "<input type=\"checkbox\" id=\"kbnalone\" onClick=\"change_MarkerAndSideBar()\">単身者不可"
		   + "<input type=\"checkbox\" id=\"kbnoffice\" onClick=\"change_MarkerAndSideBar()\">事務所可";
	return retstr;
}

/**
 * マーカーの設置、現在表示中の緯経度内に入っているデータのみを表示
 */
function set_MarkersForDb(p_xmlDoc){
	//表示中の緯経度を取得し、範囲外のデータを削除---------------------------
	//マーカー削除のために緯経度取得
	var bounds	= map.getBounds();			//現在の表示範囲を取得
	var ne		= bounds.getNorthEast();	//北東（右上）の座標	最大
	var sw		= bounds.getSouthWest();	//南西（左下）の座標	最小

	//markersから消すべきマーカーのみ配列とマップから削除
	var delidxAr = new Array();
	for(var i in markers){
		if(i == "contains"){ continue; }

		var pt = markers[i].marker.getPoint();
		if(sw.lat() > pt.lat() || pt.lat() > ne.lat() || sw.lng() > pt.lng() || pt.lng() > ne.lng()){
			map.removeOverlay(markers[i].marker);					//マップからマーカーを削除
			sidebars= get_ArrayDeleteValue(sidebars,"markerid",i);	//sidebarsから削除
			delidxAr.push(i);
		}
	}

	//markersから削除
	var dellen = delidxAr.length;
	for(var i=0; i<dellen ;i++){
		var idx = delidxAr[i];
		delete markers[idx];
	}

	//データを取得し設置-----------------------------------------------------
	var arData = p_xmlDoc.documentElement.getElementsByTagName("info");
	set_Markers(arData);
}

/**
 * マーカーの設置処理開始
 * @param p_arData array 複数のデータが格納されている配列
 */
function set_Markers(p_arData){
	//XMLのデータからマーカー用配列に格納
	var datLen = p_arData.length;
	for(var i=0;i < datLen;i++){ set_DataArray(p_arData[i]); }

	change_Visible();	//マーカーの状態を変更
	set_SideBar();		//サイドバー変更
	set_Marker();		//マーカーの設置
}

/**
 * データをクラスに格納
 * @param p_data object 1件分のデータを格納しているXMLオブジェクト
 */
function set_DataArray(p_data){
	var id				= p_data.getElementsByTagName("id")[0].firstChild.nodeValue;
	if(is_ObjectInValue(sidebars,"id",id)){ return; }	//もうすでに設置されているので終了
	
	var cdcode			= get_XmlNodeValue(p_data.getElementsByTagName("cdcode"));
	var prefecturename	= get_XmlNodeValue(p_data.getElementsByTagName("prefecturename"));
	var cityname		= get_XmlNodeValue(p_data.getElementsByTagName("cityname"));
	var townname		= get_XmlNodeValue(p_data.getElementsByTagName("townname"));
	var housenumber1	= get_XmlNodeValue(p_data.getElementsByTagName("housenumber1"));
	var housenumber2	= get_XmlNodeValue(p_data.getElementsByTagName("housenumber2"));
	var lat				= get_XmlNodeValue(p_data.getElementsByTagName("lat"));
	var lng				= get_XmlNodeValue(p_data.getElementsByTagName("lng"));
	var madori			= get_XmlNodeValue(p_data.getElementsByTagName("madori"));
	var menseki			= get_XmlNodeValue(p_data.getElementsByTagName("menseki"));
	var money			= get_XmlNodeValue(p_data.getElementsByTagName("money"));
	var sikikin			= get_XmlNodeValue(p_data.getElementsByTagName("sikikin"));
	var reikin			= get_XmlNodeValue(p_data.getElementsByTagName("reikin"));
	var comment			= get_XmlNodeValue(p_data.getElementsByTagName("comment"));
	var mainlink		= get_XmlNodeValue(p_data.getElementsByTagName("bklink"));
	var imagepath		= get_XmlNodeValue(p_data.getElementsByTagName("imagepath"));
	var kbnarea			= get_XmlNodeValue(p_data.getElementsByTagName("kbnarea"));
	var kbnsyubetu		= get_XmlNodeValue(p_data.getElementsByTagName("kbnsyubetu"));
	var kbnmoney		= get_XmlNodeValue(p_data.getElementsByTagName("kbnmoney"));
	var kbnmadori		= get_XmlNodeValue(p_data.getElementsByTagName("kbnmadori"));
	var kbnsintiku		= get_XmlNodeValue(p_data.getElementsByTagName("kbnsintiku"));
	var kbnpet			= get_XmlNodeValue(p_data.getElementsByTagName("kbnpet"));
	var kbngakki		= get_XmlNodeValue(p_data.getElementsByTagName("kbngakki"));
	var kbnchild		= get_XmlNodeValue(p_data.getElementsByTagName("kbnchild"));
	var kbnwomen		= get_XmlNodeValue(p_data.getElementsByTagName("kbnwomen"));
	var kbncorp			= get_XmlNodeValue(p_data.getElementsByTagName("kbncorp"));
	var kbnalone		= get_XmlNodeValue(p_data.getElementsByTagName("kbnalone"));
	var kbnoffice		= get_XmlNodeValue(p_data.getElementsByTagName("kbnoffice"));
/* 
	var releasedate		= get_XmlNodeValue(p_data.getElementsByTagName("releasedate"));
 */

	var releasedate		= get_XmlNodeValue(p_data.getElementsByTagName("updated"));		
	var updated			= get_XmlNodeValue(p_data.getElementsByTagName("updated"));
	var regdate			= get_XmlNodeValue(p_data.getElementsByTagName("regdate"));

/* 
	var address			= prefecturename+cityname+townname;
 */
	var address			= cityname+townname;

	var img = "";
	if(imagepath != ""){ img = "<img src=\""+imagepath+"\" class=\"windowimg\">"; }

	var url = "";
	if(mainlink != ""){ url = "<a href=\""+unescape(mainlink)+"\" target=\"_blank\">詳細を見るにはここをクリックしてください。</a>"; }

	var html = "<table class=\"window\">"
			 + "  <tr>"
			 + "	<th></th><td></td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "    <td rowspan=\"6\">"+img+"</td>"
			 + "	<th>CDコード：</th><td>"+cdcode+"</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "    <th>住所：</th><td>"+cityname+townname+"</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "    <th>間取り：</th><td>"+madori+"</tr>"
			 + "  </tr>"
			 + "  <tr>"
/* 
			 + "	<th>賃料：</th><td>"+get_AddComma(money)+"</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "	<th>敷金：</th><td>"+get_AddComma(sikikin)+"</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "	<th>礼金：</th><td>"+get_AddComma(reikin)+"</td>"
 */
			 + "	<th>賃料：</th><td class=\"fs_b\">"+get_AddComma(money)+"円</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "	<th>敷金：</th><td>"+get_AddComma(sikikin)+"円</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "	<th>礼金：</th><td>"+get_AddComma(reikin)+"円</td>"


			 + "  </tr>"
			 + "  <tr>"
			 + "	<td colspan=\"3\">"+comment.replace(/\n/g,"<br>")+"</td>"
			 + "  </tr>"
			 + "  <tr>"
			 + "	<td colspan=\"3\">"+url+"</td>"
			 + "  </tr>"
			 + "</table>";

	//配列に格納
	sidebars.push(new clSide(id,cdcode,address,lat,lng,madori,money,sikikin,reikin,
							  kbnarea,kbnsyubetu,kbnmoney,kbnmadori,kbnsintiku,kbnpet,kbngakki,kbnchild,kbnwomen,kbncorp,kbnalone,kbnoffice,
							  releasedate,unescape(mainlink),html));
}

/**
 * マーカーの設置
 */
function set_Marker(){
	//表示設定を初期化+以前の表示状態を格納
	for(var i in markers){
		if(i == "contains"){ continue; }

		markers[i].previsible = markers[i].visible;
		markers[i].visible = false;
	}

	//全データ配列から緯経度で間引きし、マーカー用配列を作成、
	//markersにはsidebarsから間引きされた件数しか格納されない。
	var sidelen = sidebars.length;
	for(var i=0;i < sidelen;i++){
		var cls = sidebars[i];
		if(!cls.visible){ continue; }

		var markerid = null;
		var idx = get_SameMarkerIdx(cls.lat,cls.lng);
		if(idx == -1){
			//マーカークラスのインスタンスを作成
			var mrkOpt = get_MarkerOption(cls.kbnsyubetu);
			var mrk = new GMarker(new GLatLng(cls.lat,cls.lng),mrkOpt);
			set_MarkerEvent(mrk,cls.windowhtml);

			var stridx = cls.id.toString();
			markers[stridx] = new clMarker(cls.lat,cls.lng,mrk,cls.visible);
			markerid = stridx;

		} else {
			var clm = markers[idx];				//あればサイドバーのクリックの時のために同じマーカーを見るようにする
			if(!clm.visible){ clm.visible = cls.visible; }
			markers[idx]= clm;
			markerid	= idx;
		}

		sidebars[i].markerid = markerid;
	}

	//マーカーを設置
	for(var i in markers){
		if(i == "contains"){ continue; }

		var obj= markers[i];
		if(obj.previsible != obj.visible){
			if(obj.visible){
				map.addOverlay(obj.marker);
			} else {
				map.removeOverlay(obj.marker);
			}
		}
	}
}

/**
 * マーカーオプションオブジェクトを返す
 * @param p_no int 物件種別CD
 * @return object or null
 */
function get_MarkerOption(p_no){
	var imgInfo		= get_MarkerImg(p_no);
	if(str_Trim(imgInfo["image"]) == "default"){ return null; }	//デフォルトの設定になる
	if(str_Trim(imgInfo["shadow"])== "default"){ return null; }

	var ico			= new GIcon();
	ico.image		= imgInfo["image"];			//マーカー画像
	ico.shadow		= imgInfo["shadow"];		//影の画像

	ico.iconSize	= get_ImgSize(ico.image);	//マーカーのサイズ
	ico.shadowSize	= get_ImgSize(ico.shadow);	//影のサイズ
	ico.iconAnchor	= new GPoint(ico.iconSize.width/2,ico.iconSize.height);	//画像の中心下が指定の緯度経度になる
	ico.infoWindowAnchor = new GPoint(ico.iconSize.width/2,2);				//画像の中心上あたりが吹き出しの位置

	var mrkOpt = new Object();
	mrkOpt.icon = ico;

	return mrkOpt;
}

/**
 * p_noに対応したマーカーのイメージ情報を返す
 * @param p_no int 画像選択する基準となるNo.
 * @return array
 */
function get_MarkerImg(p_no){
	var retAr = new Array();

	if(arSyubetuInfo[p_no] != null){
		retAr["image"]	= arSyubetuInfo[p_no]["img"];
		retAr["shadow"]	= arSyubetuInfo[p_no]["imgs"];
	} else {
		retAr["image"]	= "default";
		retAr["shadow"]	= "default";
	}

	return retAr;
}

/**
 * 条件にマッチしたマーカーのみを表示、抽出条件の変化時にコールされる
 */
function change_MarkerAndSideBar(){
	clear_Markers();	//markersのクリア
	change_Visible();	//マーカーの状態を変更
	set_SideBar();		//サイドバー変更
	set_Marker();		//マーカーの設置
}

/**
 * 抽出条件からマーカーの表示有無を変更
 */
function change_Visible(){
	var selAr = document.getElementsByTagName("select");		//selectタグのみ取得
	var inpAr = document.getElementsByTagName("input");			//inputタグのみ取得
	var selLen= selAr.length;
	var inpLen= inpAr.length;

	//データーの数だけループ
	var tmpAr = sidebars;
	var mrklen= tmpAr.length;
	for(var i=0 ; i<mrklen ; i++){
		var cls			= tmpAr[i];
		cls.visible		= true;									//表示用プロパティを初期化

		//コンボボックス
		for(var j=0; j<selLen; j++){
			if(!cls.visible){ continue; }						//AND条件なので1度falseになったやつは飛ばす

			var column	= selAr[j].id;
			var idx		= selAr[j].selectedIndex;
			var val		= selAr[j].options[idx].value;
			if(val == 0){ continue; }

			if(column == "releasedate"){
				var range = 0;
				if(val == 1){ range = 3; }	//3日以内
				if(val == 2){ range = 7; }	//1週間以内

				if(!is_NewDate(cls.releasedate,range)){ cls.visible = false; }

			} else {
				if(cls[column] != val){ cls.visible = false; }	//条件に一致しなかった
			}
		}

		//チェックボックス
		if(cls.visible){										//まだ表示されていればチェックボックスの条件も見る
			for(j=0 ; j<inpLen ; j++){
				if(inpAr[j].type != "checkbox"){ continue; }	//inputタグでもcheckboxのみ
				if(!cls.visible){ continue; }					//AND条件なので1度falseになったやつは飛ばす

				if(inpAr[j].checked){							//チェックが付いている場合
					var inpid	= inpAr[j].id;					//inputタグのID
					if(cls[inpid] != 1){ cls.visible = false; }	//チェックされた条件にマッチしなかった
				}
			}
		}

		sidebars[i] = cls;
	}
}

/**
 * sidebarsの内容からサイドバーを設置
 */
function set_SideBar(){
	var sidehtml =  "<table class=\"sidebar\">";
/* 
	sidehtml += "<tr><th>物件所在地</th><th>物件種別<br>間取り</th><th>賃料</th><th>敷金<br>礼金</th></tr>";
 */
	sidehtml += "<tr><th id=\"sidebar_t_address\">物件所在地</th><th id=\"sidebar_t_type\">物件種別<br>間取り</th><th id=\"sidebar_t_price\">賃料</th><th id=\"sidebar_t_ex\">敷金<br>礼金</th></tr>";

	var cnt = 0;				//奇数行、偶数行を判断するカウンタ
	var len = sidebars.length;
	for(var i=0 ; i < len ; i++){
		if(!sidebars[i].visible){ continue; }

		cnt++;
		var cls = sidebars[i];
		var trc = "";
		if(cnt%2 == 0){ trc="rec1"; } else { trc="rec2"; }

		var sintiku = "";
		if(cls.kbnsintiku == 1){ sintiku = "<font class=\"sintiku\">【新築】</font>"; }

		var newdata = "";
		if(is_NewDate(cls.releasedate,7)){ newdata = "<font class=\"new\">【NEW】</font>"; }

		//グローバル変数のチェック
		if(arSyubetuInfo[cls.kbnsyubetu] == null){
			show_ReadErrMsg();
			return;
		}

		var sid = "S"+cls.id;	//サイドバーの行に与えるID
		var event = "onmouseover=\"set_OverColor('"+sid+"')\" onmouseout=\"set_OutColor('"+sid+"','"+trc+"')\" onClick=\"click_Sidebar('"+cls.id+"')\"";
		sidehtml += "<tr id="+sid+" class=\""+trc+"\" "+event+">"
				 +  "	<td>"+cls.address+"<br>"+sintiku+newdata+"</td>"
				 +  "	<td>"+arSyubetuInfo[cls.kbnsyubetu]["name"]+"<br>"+cls.madori+"</td>"
/* 
				 +  "	<td>"+get_AddComma(cls.money)+"円</td>"
				 +  "	<td>"+get_AddComma(cls.sikikin)+"円<br>"+get_AddComma(cls.reikin)+"円</td>"
 */
				 +  "	<td class=\"ta_r fs_b\">"+get_AddComma(cls.money)+"円</td>"
				 +  "	<td class=\"ta_r\">"+get_AddComma(cls.sikikin)+"円<br>"+get_AddComma(cls.reikin)+"円</td>"




				 +  "</tr>";
	}

	sidehtml += "</table>";
	document.getElementById("sidebar").innerHTML = sidehtml;
	document.getElementById("maxcount").innerHTML = "物件数："+get_AddComma(cnt)+"件";
}
/**
 * サイドバーのマウスオーバー時のスタイルを適用
 */
function set_OverColor(p_id){
	if(highlightFLG){ document.getElementById(p_id).className = "highlight"; }
}
/**
 * サイドバーのマウスアウト時にスタイルを戻す
 */
function set_OutColor(p_id,p_class){
	if(highlightFLG){ document.getElementById(p_id).className = p_class; }
}

/**
 * サイドバーをクリックしたときの処理
 * @param p_id mixed サイドバーに対応したマーカーを特定する値
 */
function click_Sidebar(p_id){
	var cls			= get_ObjectfromArray(sidebars,p_id);
	var windowhtml	= cls.windowhtml;
	markers[cls.markerid].marker.openInfoWindowHtml(windowhtml);
}

/**
 * 渡されたパラメータを付加し、PHPからXML形式のデータを受け取り非同期で関数を実行
 * @param p_para string PHPへ渡すパラメータ、URLの?から後ろ
 * @param p_mode int 1:物件データ用,2:抽出データ用
 */
function get_XmlData(p_para,p_mode){
	if(str_Trim(p_para) != ""){ p_para = p_para+"&"; }
	var dt = get_FullDateTimeStr();
	var phppath= encodeURI(FILE_PATH+"?"+p_para+"nocache="+dt);

	//PHPを通してDBからデータ取得
	var req = GXmlHttp.create();
	req.open("GET",phppath,true);		//非同期で実行
	req.onreadystatechange = function(){
		if(req.readyState == 4){
			var xmlDoc = GXml.parse(req.responseText);
			if(p_mode==1){ set_MarkersForDb(xmlDoc); }
			if(p_mode==2){ set_Search(xmlDoc); }
		}
	}
	req.send(null);
}

