//--ブラウザ判別
  var Safari, Opera, Firefox, MSIE, NN4, NN6 = false;
  var BROWSER = '';
  var uAnt = navigator.userAgent;
  if (uAnt.indexOf("Safari")  > -1) {Safari = true;BROWSER = 'Safari';} else
  if (uAnt.indexOf("Opera")   > -1) {Opera = true;BROWSER = 'Opera';} else
  if (uAnt.indexOf("Firefox") > -1) {Firefox = true;BROWSER = 'Firefox';} else
  if (uAnt.indexOf("MSIE") > -1)    {MSIE = true;BROWSER = 'MSIE';} else
  if(document.layers)               {NN4 = true;BROWSER = 'NN4';} else
  if(document.getElementById && !document.all) {NN6 = true;BROWSER = 'NN6';}

//--キャッシュ対策変数
  var nowtime = new Date();
  var noCache = "?noCache=" + nowtime;

//--xml名引数取得
  var xmlName = location.search ;
  xmlName = unescape(xmlName);
  xmlName = xmlName.substring(1, xmlName.length);
  if (!xmlName) {alert('マップデータを取得できません！');}
  //else {alert(xmlName);}//test

//--オブジェクト変数定義
  var gMap;
  var gAjaxSearch;
  var mapObj = [];
  var iconProps=null;
  var windowLoaded;
//--document内マップ表示用オブジェクト
  var wcvmap;
  var wcvmapContainer;
  var wcvmapSearch;
  var isMapCreated = false;

// 3.0.1 08/03/17 坪川 修正 START
/*
 * マーカークリック時MAP表示位置がズレる問題への対応
 */
var tempLatLng = new GLatLng();
// 3.0.1 08/03/17 坪川 修正 START

//--XMLファイル取得（Ajax.Request）
  _url = 'wcvmap/' + xmlName + noCache; //--noCacheはキャッシュされるのを防ぐため
  new Ajax.Request(
    _url,
    {
      method:     'get',
      //onSuccess:
        //function() {alert('XML request success');},
      onFailure:
        function() {alert('マップデータを取得できません！');},
      onComplete:
        function(xhrObj)
        {
          try
          {
            mapObj = wcvReplaceTag( wcvParseXML( wcvReplaceAmpSemi(xhrObj.responseText) ) );
          }
          catch(e) {alert('マップデータを取得できません！ : ' + e);}
          finally  {}
          readyForCreateMap('XML Request Complete');
        },
      asynchronous: true
    }
  );

//--プリセットアイコンプロパティ
  _url = 'conf/iconProps.conf' + noCache;//--noCacheはキャッシュされるのを防ぐため
  new Ajax.Request(
    _url,
    {
      method:       'get',
      parameters:   '',
      //onSuccess:  function() {alert('iconProp request success');},
      onFailure:    function() {alert('アイコンデータを取得できません！');},
      onComplete:
        function(xhrObj)
        {
          eval(xhrObj.responseText);
          readyForCreateMap('iconProps Request Complete');
        },
      asynchronous: true
    }
  );
/*------------------------------------------------------------------------------
  マップデータ変換処理
------------------------------------------------------------------------------*/
//--オブジェクト全要素内の&lt, &gt を<, > に置換→マップのプロパティ完成
//--処理内容検討中
function wcvReplaceTag(_obj) {return _obj;}

//--XMLをJSオブジェクトに変換（XML.ObjTree）
function wcvParseXML(_xml)
{
  try
  {
    var xotree = new XML.ObjTree();
    return xotree.parseXML(_xml);
  }
  catch(e) { throw "parseXMLで異常が発生しました " + e; }
}

//--#wcvamp#と#wcvsemi#を&と;に置換
function wcvReplaceAmpSemi(_text)
{
  try
  {
    var rgexp1 = new RegExp("#wcvamp#", "g");
    var rgexp2 = new RegExp("#wcvsemi#", "g");
    _text = _text.replace(rgexp1 , "&");
    _text = _text.replace(rgexp2 , ";");
    return _text;
  }
  catch(e) { throw "文字列置換で異常が発生しました " + e; }
}

/*----------------------------------------------------------
  マップ作成準備完了判定 → 実行
    マップ用プロパティオブジェクト
    プリセットアイコン
    ウィンドウロード
----------------------------------------------------------*/
function readyForCreateMap(state)
{
  //alert(state);
  if ((mapObj.mapProp) && (iconProps) && (windowLoaded) && (!isMapCreated))
  {
    //alert('createMap 実行！');
    isMapCreated = true;
    createMap(mapObj.mapProp);
  }
}

window.onload = function() { windowLoaded = true; readyForCreateMap('window onload Complete'); }
window.onunload = function() {GUnload();}

/*------------------------------------------------------------------------------
  マッププロパティに従ってマップ表示
  ※  Boolean値はXMLを経てJSobjectに戻される過程で文字列に変更されて
    しまっているので注意
  ※  また''であった要素はXMLに変換されたときに空白値となり、JSobjectに
    戻されたときにはundefinedとなるので注意（∴if文で==''と記述しては
    ならない。
------------------------------------------------------------------------------*/
function createMap(mapProp)
{
  //--マップコンテナーDOMを追加してサイズ設定
  try
  {
    document.body.appendChild(createDocElement('div', 'map_container'));
    wcvmapContainer = $('map_container');
    wcvmapContainer.appendChild(createDocElement('div', 'map'));
    wcvmap = $('map');
    wcvmapContainer.style.width  = wcvmap.style.width  = mapProp.mapSize.x + 'px';
    wcvmapContainer.style.height = wcvmap.style.height = mapProp.mapSize.y + 'px';
    if (mapProp.search.enable=='true')
    {
      wcvmapContainer.appendChild(createDocElement('div', 'map_search'));
      wcvmapSearch = $('map_search');
      wcvmap.style.height = (mapProp.mapSize.y - 30) + 'px';
      wcvmapSearch.style.height = '30px';
      wcvmapSearch.style.width  = mapProp.mapSize.x + 'px';
    }
  } catch(e)
  {
    alert('マップ表示用オブジェクトを取得できませんでした。\n--- ' + e + ' ---');
    if (wcvmap) {wcvmap.innerHTML = 'グーグルマップを表示できません。';}
    return;
  }

  //--マップobjectを作成して中心座標、ズーム設定
  if (GBrowserIsCompatible())
  {
    gMap = new GMap2(wcvmap);
    var _center = new GLatLng(mapProp.lat , mapProp.lng);
    //gMap.setCenter(_center, mapProp.zoom);
    if (isNaN(mapProp.zoom))
    {
      mapProp.zoom = 15;
    }
    else
    {
      mapProp.zoom = parseInt(mapProp.zoom);
    }
    gMap.setCenter(_center, mapProp.zoom);
  }
  else
  {
    alert('お使いのブラウザではグーグルマップを表示できません。');
    wcvmap.innerHTML = 'グーグルマップを表示できません。';
    return;
  }

  // 3.0.1 08/03/18 坪川 修正 START
  // ズームコントロール設定
  setZoom(mapProp);
  // 3.0.1 08/03/18 坪川 修正 END

  if (mapProp.control.scale    == 'on') {gMap.addControl(new GScaleControl());}
  if (mapProp.control.mapType  == 'on') {gMap.addControl(new GMapTypeControl());}
  // 3.0.1 08/03/18 坪川 修正 START
//  if (mapProp.control.overview == 'on') {gMap.addControl(new GOverviewMapControl());}
  // 3.0.1 08/03/18 坪川 修正 END
  if (mapProp.control.overview == 'on') {
	var objOverView = new GOverviewMapControl();
	gMap.addControl(objOverView);
/*	
	var overview = document.getElementById("map_overview");
	document.getElementById("wcvmap").appendChild(overview);
*/	
  }

  //--マップstate設定
  if (mapProp.enable.dragging        == 'false') {gMap.disableDragging();}
  // 3.0.1 08/03/18 坪川 修正 START
//  if (mapProp.enable.doubleClickZoom != 'false') {gMap.enableDoubleClickZoom();}
  // 3.0.1 08/03/18 坪川 修正 END
  
  if (mapProp.enable.continuousZoom  != 'false') {gMap.enableContinuousZoom();}
  //--マーカ描画
  /*
    XML<-->Object 変換をする際にmarkersが一つだとXML.ObjTreeが配列にして
    くれないので、強制的に配列に変換する。11月21日[火]
  */
  if ((mapProp.markers) && (!mapProp.markers.length))
  {
    var mk = mapProp.markers ;
    mapProp.markers = new Array(mk);
  }

  if (mapProp.markers)
  {
    for (var j = 0; j < mapProp.markers.length ; j++)
    {
      var mkProp = mapProp.markers[j] ;
      if ((mkProp.lat) && (mkProp.lng))
      {
        var marker = createMarker(mkProp, j);
        gMap.addOverlay(marker);
        //--情報ウィンドウ初期表示の指定があるとき
        if (mkProp.openInfoWindow=='true')
        {
          if (mkProp.infoWindowType == 'tab')
          {
            marker.openInfoWindowTabsHtml( tabs, {maxWidth: mkProp.infoWindowMaxWidth} );
          } else if (mkProp.infoText)
          {
            marker.openInfoWindowHtml( mkProp.infoText , {maxWidth: mkProp.infoWindowMaxWidth} );
          }
        }
      }
    }
  }

  //--地図タイプ
  if (mapProp.mapType == 'satellite')
  {
    gMap.setMapType(G_SATELLITE_MAP);
  }
  else if (mapProp.mapType == 'hybrid')
  {
    gMap.setMapType(G_HYBRID_MAP);
  }
  else
  {
    gMap.setMapType(G_NORMAL_MAP);
  }
  //--AjaxSearch 用フォーム
  if (mapProp.search.enable=='true')
  {
    wcvmapContainer.style.height = (mapProp.mapSize.y + 25) + 'px';
    var _searchtext = "";
    if (mapProp.search.text) {
        _searchtext = mapProp.search.text;
    }
    wcvmapSearch.innerHTML =
      "<nobr><span class='text'>" +
      "<input id='searchText' type='text' size='40' name='q' value='" +
      _searchtext + "' />" +
      "</span>" +
      "<span class='button'>" +
      "<input type='button' value='検索' onclick='searchExecute(\"searchText\")'/>" +
      "</span></nobr>";
    //--Search API設定
    gAjaxSearch = new GlocalSearch();
    gAjaxSearch.setCenterPoint(gMap);
    gAjaxSearch.setSearchCompleteCallback(null, callback_GAjaxSearch);
  }
}
function createDocElement(_tagName, _id)
{
  var _element = document.createElement(_tagName);
  _element.id = _id;
  return _element;
}

/*
 *  3.0.1 08/03/18 坪川 追加 START
 *
 *  setZoom(mapProp)
 *  マップコントロール、ズームコントロールをmapPropに従い設置し、
 *  マップコントロールかズームコントロールがONの場合
 *  ダブルクリックズーム、スクロールホイールズームを有効にする
 */
function setZoom(mapProp){
	// マウスでのズームは常時無効
	gMap.disableScrollWheelZoom();
	gMap.disableDoubleClickZoom();
	if( mapProp.control.map || mapProp.control.zoom){
//		gMap.enableScrollWheelZoom();
//		gMap.enableDoubleClickZoom();
		if(mapProp.control.map == 'large'){
			gMap.addControl(new GLargeMapControl());
		}
		if(mapProp.control.map == 'small'){
			gMap.addControl(new GSmallMapControl());
		}
		if(mapProp.control.zoom){
			gMap.addControl(new GSmallZoomControl());
		}
	}/*else{
		gMap.disableScrollWheelZoom();
		gMap.disableDoubleClickZoom();
	}*/
}
// 3.0.1 08/03/18 坪川 追加 END

/*------------------------------------------------------------------------------
  マーカーオブジェクト marker 作成
------------------------------------------------------------------------------*/
//--infoWindowTextタグ復元用正規表現
  var rgexp1 = new RegExp("#wcvamp#", "g");
  var rgexp2 = new RegExp("#wcvsemi#", "g");
  var rgexp3 = new RegExp("\&amp\;", "g");
  var rgexp4 = new RegExp("\&apos\;", "g");
  var rgexp5 = new RegExp("\&quot\;", "g");
  var rgexp6 = new RegExp("\&gt\;", "g");
  var rgexp7 = new RegExp("\&lt\;", "g");

function createMarker(mkProp, idNumber)
{
  var marker;
  var _draggable   = (mkProp.draggable=='true')?                true : false;
  var _title       = (typeof(mkProp.title)=='undefined')?       ''   : mkProp.title ;
  var _iconType    = (typeof(mkProp.iconType)=='undefined')?    ''   : mkProp.iconType ;
  var _infoEvent   = (typeof(mkProp.infoEvent)=='undefined')?   ''   : mkProp.infoEvent ;
  var _infoText    = (typeof(mkProp.infoText)=='undefined')?    ''   : mkProp.infoText ;
  var _blowupEvent = (typeof(mkProp.blowupEvent)=='undefined')? ''   : mkProp.blowupEvent ;
  if (_infoText)
  {
    _infoText = _infoText.replace(rgexp1 ,"&");
    _infoText = _infoText.replace(rgexp2 ,";");
    _infoText = _infoText.replace(rgexp3 ,"&");
    _infoText = _infoText.replace(rgexp4 ,"'");
    _infoText = _infoText.replace(rgexp5 ,'"');
    _infoText = _infoText.replace(rgexp6 ,">");
    _infoText = _infoText.replace(rgexp7 ,"<");

  }

  if ((_iconType) && (_iconType != 'default'))
  {
    //--アイコンタイプの指定がある場合
    try
    {
      marker = new GMarker( new GLatLng(mkProp.lat , mkProp.lng), { icon:createIcon(_iconType), title: _title , draggable: _draggable } );
    }
    catch(e)
    //--アイコン作成失敗時（デフォルトアイコン使用）
    {
      alert(e);
      marker = new GMarker( new GLatLng(mkProp.lat , mkProp.lng), { title: _title , draggable: _draggable } );
    }
  }
  else
  //--指定がない場合（デフォルトアイコン使用）
  {
    marker = new GMarker( new GLatLng(mkProp.lat , mkProp.lng), { title: _title , draggable: _draggable } );
  }

  //--タブ型 infoWindow の指定があるときタブ・オブジェクト作成
    var tabs = new Array();
    if (mkProp.infoTabs =='true')
    {
      for (var i = 0; i < mkProp.infoTabs.length ; i++)
      {
        tabs.push( new GInfoWindowTab( mkProp.infoTabs[i].label, mkProp.infoTabs[i].infoText ) );
      }
    }

  //--イベントリスナー追加 （infoEvent 発生時に infoWindow を open : タブ型と通常型）
    if ( (_infoEvent) && ((_infoText) || (tabs)))
    {
      //--タブ型インフォウィンドウ
      if (mkProp.infoWindowType == 'tab')
      {
        GEvent.addListener( marker, _infoEvent , function() { marker.openInfoWindowTabsHtml( tabs, { maxWidth: mkProp.infoWindowMaxWidth } ) } );
      //--通常型インフォウィンドウ
      }
      else if (_infoText)
      {
        GEvent.addListener( marker, _infoEvent , 
		function() {
			marker.openInfoWindowHtml( _infoText , { maxWidth: mkProp.infoWindowMaxWidth } )

			// 3.0.1 08/03/17 坪川 修正 START
			tempLatLng = gMap.getCenter();
			// 3.0.1 08/03/17 坪川 修正 END
		}
	);
	// 3.0.1 08/03/17 坪川 修正 START
	/* 
	 *  MAP編集画面でデフォルト以外のマーカーをクリックした時に
	 *  MAP表示位置がズレる不具合の対応を行った際に発生した問題
	 *  プレビュー画面でもクリックするとズレる　不具合への対応処理
	 */
	GEvent.addListener( marker, 'infowindowopen',
		function(){
			gMap.setCenter( tempLatLng );
		}
	);
	// 3.0.1 08/03/17 坪川 修正 START
      }
    }

  //--マーカーイベントリスナー追加
    //  ※blowupEventには通常ダブルクリックを指定する
      //if (_blowupEvent) {
      // 3.0.1 08/03/18 坪川 修正 START
//        GEvent.addListener( marker, 'dblclick' , function() { marker.showMapBlowup({zoomLevel: 17}); } );
      // 3.0.1 08/03/18 坪川 修正 END
      //}
    //--マーカークリック　→ マウスダウンを使用
      if (_infoText)
      {
        GEvent.addListener( marker, 'click', function() { marker.openInfoWindowHtml( mkProp.infoText , { maxWidth: mkProp.infoWindowMaxWidth } );});
      }
    //--マーカーダブルクリック
    //  GEvent.addListener(marker, 'dblclick',
    //    function() {markerEvent(marker, 'dblclick');});
    //--マーカーマウスダウン
    //  if (_infoText) {
    //    GEvent.addListener(marker, 'mousedown',
    //      function() {
    //        marker.openInfoWindowHtml(_infoText , {maxWidth: mkProp.infoWindowMaxWidth });
    //      });
    //  }
  return marker;
}

/*------------------------------------------------------------------------------
    アイコン新規作成
------------------------------------------------------------------------------*/
function createIcon(iconType)
{
  var icon = new GIcon();
  var iconProp = iconProps[iconType];
  try
  {
    icon.image =            iconProp.iUrl ;
    icon.shadow =           iconProp.sUrl ;
    icon.iconSize =         new GSize(iconProp.iSizeX , iconProp.iSizeY);
    icon.shadowSize =       new GSize(iconProp.sSizeX , iconProp.sSizeY);
    icon.iconAnchor =       new GPoint(iconProp.iAnchorX , iconProp.iAnchorY);
    icon.infoWindowAnchor = new GPoint(iconProp.iwAnchorX , iconProp.iwAnchorY);
    return icon;
  }
  catch(e) {
    throw "指定されたタイプのアイコン作成に失敗しました。\nデフォルトアイコンを作成します。";
  }
}

//--情報ウィンドウタブ新規作成 -- 引数：タブラベル、インフォテキスト(html)
function createInfotab(_label, _infoText) { var tab = {label:_label, infoText:_infoText};return tab; }
/*------------------------------------------------------------------------------
    検索キーワードによる緯度・経度の取得、地図移動
------------------------------------------------------------
      2006.10.1現在、GClientGeocoder は日本語による
      検索ができないため、Google Ajax Searchによる
      Geocoding で代用する。
------------------------------------------------------------------------------*/
//--ローカルサーチオブジェクト
var gAjaxSearch;
function searchExecute(container)
{
  if (!$(container)) { alert('検索ワードのコンテナが見つかりません。'); return false; }
//  searchText = $(container).innerHTML;
  searchText = $(container).value;
  gAjaxSearch.execute($(container).value);
  return false;
}
var searchText;
function callback_GAjaxSearch()
{
  if ((!gAjaxSearch.results) || (gAjaxSearch.results[0] == null))
  {
    alert(searchText + ' は見つかりませんでした。\n住所またはキーワードを入力し直してもう一度検索して下さい。'); return;
  }
  gMap.setCenter(new GLatLng( parseFloat(gAjaxSearch.results[0].lat), parseFloat(gAjaxSearch.results[0].lng) ), gMap.getZoom());
}

