String.prototype.trim = function() { return this.replace(/^[\s]+/g,'').replace(/[\s]+$/g,''); }
//YAHOO.ext.EventManager.onDocumentReady(uiInit, window, true);
U.addEvent(window, 'load', uiInit);
YAHOO.ext.UpdateManager.defaults.indicatorText = '<img src="js/yui-ext/images/grid/loading.gif>';
//yAHOO.ext.UpdateManager.defaults.disableCaching = true;
//yAHOO.ext.UpdateManager.defaults.loadScripts = true;

var alm;
var map;
var map2;
var Utarget;
var Ustart;
var Uend;
var Upin;
var UbusStationIcon;
var UbusSolutionNum;
var UbusStations = new Array();
var UroutePath;
var UcontextMenuLatLng;
var UpositionType;

var UpoiTree;
var UpoiSource;
var UpoiType;
var Upois = new Array();
var UpoiThread = 0;
var UactivePoi;
var UdisplayedActiveAd = new Object();
var UIconImagePath = 'http://apam.urmap.com/apam/';
var UgeoObjects = new Array();
var UpmsPois = new Array();
var UpmsIcon;
var getBookingUrl = '/channel/booking/getBI.jsp';

function uiInit() {
  alm = new AutoLayoutManager('layout.xml');
  alm.getLayout('mainLayout').on('layout', refreshMap);
  alm.getPanel('headerDiv').getUpdateManager().update({ url:'/pms/include/mapHeader.jsp', scripts:true});
  alm.getPanel('toolbarDiv').getUpdateManager().update({ url:'/pms/include/toolbar.jsp', scripts:true});
  alm.getPanel('footerDiv').getUpdateManager().update('include/footer.html');
  
  map = new UMap(document.getElementById('mapDiv'));
  map.addControl(U_FULLZOOM_CONTROL);
  map.addControl(U_TYPE_CONTROL);
  overviewInit();
  iconInit();
  eventInit();
  poiDivInit();
  DWRUtil.useLoadingMessage();
  //map.centerAndZoom(new ULatLng(25.0573, 121.546), 9);
  gotoCookieLocation();
  if(pmsInit)
    pmsInit();
  checkOpenUserTab();
  checkOpenPoiTab();
  
}

function checkOpenUserTab(){
	if(CURRENT_USERNAME && CURRENT_USERNAME!=''){
		openUserTab(CURRENT_USERNAME);
	}
}

function checkOpenPoiTab(){
	if(OPEN_POI_ID && OPEN_POI_ID!=''){
		addNewTab('poi-detail-'+OPEN_POI_ID,'地標-'+OPEN_POI_NAME,'/pms/loadPoiAction.do?id='+OPEN_POI_ID+'&mode=detail&forward=detail');
	}
}


function refreshMap() {
  map.checkResize();
}

function gotoCookieLocation() {
  var str = document.cookie;
  if(!str) {
    map.centerAndZoom(new ULatLng(25.0573, 121.546), 9);
    return;
  }
  str = unescape(str)+';';
  var idx = str.indexOf('lastLocation=');
  if(idx<0) {
    map.centerAndZoom(new ULatLng(25.035405, 121.530255), 9);
    return;
  }
  str = str.substring(idx+13, str.indexOf(';', idx));
  var xyz = str.split(',');
  var lat = parseFloat(xyz[0]);
  var lng = parseFloat(xyz[1]);
  var lv = parseInt(xyz[2]);
  map.centerAndZoom(new ULatLng(lat, lng), lv);
}

function writeCookieLocation() {
  document.cookie = 'lastLocation='+escape(map.getCenter().lat()+','+map.getCenter().lng()+','+map.getZoomLevel())+';expires=Wed, 01 Jan 2020 00:00:00 GMT';
}

function overviewInit() {
  var mapMoved = false;
  var map2Moved = false;
  function mapMoveendListener(ev) {
    if(!map2Moved) {
      mapMoved = true;
      map2.centerMap(map.getCenter());
    } else {
      map2Moved = false;
    }
    writeCookieLocation();
  }
  function map2MoveendListener(ev) {
    if(!mapMoved) {
      map2Moved = true;
      map.centerMap(map2.getCenter());
    } else {
      mapMoved = false;
    }
  }
  function mapZoomListener(oldZ, newZ) {
    var zoom = newZ-4;
    if(zoom<0)
      zoom = 0;
    map2.zoomMap(zoom);
    changeBBoxInOverview(newZ);
  }
  function changeBBoxInOverview(zoom) {
    var bbox = U.gi('bbox');
    var mapDiv = U.gi('mapDiv');
    bbox.style.width = (mapDiv.clientWidth/Math.pow(2, zoom<4?zoom:4))+'px';
    bbox.style.height = (mapDiv.clientHeight/Math.pow(2, zoom<4?zoom:4))+'px';
    var overview = U.gi('overviewDiv');
    bbox.style.left = ((overview.clientWidth-bbox.offsetWidth)/2)+'px';
    bbox.style.top = ((overview.clientHeight-bbox.offsetHeight)/2)+'px';
  }
  map.addListener('moveend', mapMoveendListener);
  map.addListener('zoom', mapZoomListener);
  map2 = new UMap(U.gi('overviewDiv'));
  map2.addListener('moveend', map2MoveendListener);
  U.gi('closeOverviewLink').onclick = function() { U.gi('overviewDiv').style.display = 'none'; };
  U.gi('openOverviewLink').onclick = function() {
    U.gi('overviewDiv').style.display = 'block';
    map2.centerMap(map.getCenter());
    changeBBoxInOverview(map.getZoomLevel());
  };
}

function iconInit() {
  var icon = new UIcon();
  icon.image = 'img/walkman.gif';
  icon.iconWidth = 24;
  icon.iconHeight = 24;
  icon.iconAnchor = new UPoint(12, 12);
  icon.infoWindowAnchor = new UPoint(12, 0);
  Utarget = new UMarker(new ULatLng(0, 0), icon, null, null, 99);
  map.addOverlay(Utarget);
  icon = new UIcon();
  icon.image = 'img/s.gif';
  icon.iconWidth = 26;
  icon.iconHeight = 30;
  icon.iconAnchor = new UPoint(13, 30);
  icon.infoWindowAnchor = new UPoint(13, 0);
  Ustart = new UMarker(new ULatLng(0, 0), icon, null, null, 100);
  map.addOverlay(Ustart);
  icon = new UIcon(icon);
  icon.image = 'img/e.gif';
  Uend = new UMarker(new ULatLng(0, 0), icon, null, null, 100);
  map.addOverlay(Uend);
  icon = new UIcon();
  icon.image = 'img/pinmark.gif';
  icon.iconWidth = 16;
  icon.iconHeight = 20;
  icon.iconAnchor = new UPoint(5, 20);
  icon.infoWindowAnchor = new UPoint(5, 0);
  Upin = new UMarker(new ULatLng(0, 0), icon, null, null, 98);
  map.addOverlay(Upin);
  UbusStationIcon = new UIcon();
  UbusStationIcon.image = 'img/busStation.gif';
  UbusStationIcon.iconWidth = 16;
  UbusStationIcon.iconHeight = 30;
  UbusStationIcon.iconAnchor = new UPoint(8, 30);
  UbusStationIcon.infoWindowAnchor = new UPoint(8, 0);
  UpmsIcon = new UIcon();
  UpmsIcon.image = '/img/pmsPoi.gif';
  UpmsIcon.iconWidth = 20;
  UpmsIcon.iconHeight = 20;
  UpmsIcon.iconAnchor = new UPoint(10, 20);
  UpmsIcon.infoWindowAnchor = new UPoint(10, 0);
}

function eventInit() {
  map.addListener('click', mapMarkerClick);
  map.addListener('click', asppoiClick);
  map.addListener('click', pmsPoiClick);
  U.addEvent(U.gi('mapDiv'), 'contextmenu', showContextMenu);
  U.addEvent(U.gi('mapDiv'), 'mousewheel', mapMouseWheelControl);
  U.gi('viewStartLink').onclick = viewStart;
  U.gi('viewEndLink').onclick = viewEnd;
  U.gi('startRoutingLink').onclick = startRouting;
  U.gi('switchSELink').onclick = switchStartEnd;
  U.gi('resetRoutingLink').onclick = resetRoutingSetting;
  U.gi('setStartMenuItem').onclick = function(ev) {
    U.cancelDefault(ev);
    setRoutingStartLocation(UcontextMenuLatLng, '圖面自訂點');
  };
  U.gi('setEndMenuItem').onclick = function(ev) {
    U.cancelDefault(ev);
    setRoutingEndLocation(UcontextMenuLatLng, '圖面自訂點');
  };
  if(U.gi('getPinCoordsMenuItem'))
    U.gi('getPinCoordsMenuItem').onclick = getPinCoords;
  if(U.gi('closeMenuItem'))
    U.gi('closeMenuItem').onclick = hideContextMenu;
  if(U.gi('addPmsPoiMenuItem'))
    U.gi('addPmsPoiMenuItem').onclick = function(ev) { hideContextMenu(ev);showDialog('新增地標', '/pms/loadPoiAction.do?mode=insert&forward=insert&lat='+UcontextMenuLatLng.lat()+'&lng='+UcontextMenuLatLng.lng());return false; }
  if(U.gi('setCustomPoiMenuItem'))
    U.gi('setCustomPoiMenuItem').onclick = function(ev) { hideContextMenu(ev);showDialog('設定個人地點', '/pms/user/setLocation.jsp?lat='+UcontextMenuLatLng.lat()+'&lng='+UcontextMenuLatLng.lng());return false; }
  
  // --- Start of Edward add 
  U.gi('stloc0').onclick = getUserLocation;  
  U.gi('stloc1').onclick = getUserLocation;  
  U.gi('stloc2').onclick = getUserLocation;  
  U.gi('stloc3').onclick = getUserLocation;  
  U.gi('destloc0').onclick = getUserLocation;  
  U.gi('destloc1').onclick = getUserLocation;  
  U.gi('destloc2').onclick = getUserLocation;  
  U.gi('destloc3').onclick = getUserLocation;  
  // --- End of Edward add 
}

function showContextMenu(ev) {
  U.cancelDefault(ev);
  var menu = U.gi('contextMenu');
  menu.style.display = 'block';
  menu.style.left = (ev.clientX+2)+'px';;
  menu.style.top = ev.clientY+'px';
  UcontextMenuLatLng = map.transformContainerCoordinatesToLatLng(new UPoint(ev.clientX-U.findPosX(U.gi('mapDiv')), ev.clientY-U.findPosY(U.gi('mapDiv'))));
  Upin.setPoint(UcontextMenuLatLng);
  Upin.setMouseonInfo('圖釘點', '經度: '+Math.round(UcontextMenuLatLng.lng()*1000000)/1000000+'<br>緯度: '+Math.round(UcontextMenuLatLng.lat()*1000000)/1000000);
  //map.addOverlay(Upin);
}

function hideContextMenu(ev) {
  U.cancelDefault(ev);
  U.gi('contextMenu').style.display = 'none';
}

function mapMouseWheelControl(ev) {
  if(U.wheelDelta(ev)>=120)
    map.zoomOut();
  else if(U.wheelDelta(ev)<=-120)
    map.zoomIn();
}

function getPinCoords() {
  hideContextMenu();
  alert('經度: '+Upin.getPoint().lng()+'\n緯度: '+Upin.getPoint().lat()+'\n經度: '+degreeToDMS(Upin.getPoint().lng())+'\n緯度: '+degreeToDMS(Upin.getPoint().lat()));
}

function degreeToDMS(degree) {
  var d = Math.floor(degree);
  var m = Math.floor((degree-d)*60);
  var s = Math.round((degree*60-d*60-m)*60*10)/10;
  var str = d+'°';
  str += m+'\'';
  str += s+'"';
  return str
}

function smartQuery(queryString) {
  //var queryString = document.getElementById('queryText').value.trim();
  if(queryString.length==0)
    return false;
  var coords = queryString.split(',');
  if(coords.length==2 && !isNaN(coords[0]) && !isNaN(coords[1])) {
    var label = '目標點';
    if(typeof initTargetName!='undefined' && initTargetName!=null) {
      label = initTargetName;
      initTargetName = null;
    }
    setMapTarget(new ULatLng(parseFloat(coords[1]), parseFloat(coords[0])), label, '經度:'+coords[0]+'<br>緯度:'+coords[1], 0);
    return false;
  }
  SearchBean.search(queryString, '0', smartQueryCallback);
  return false;
}

function smartQueryCallback(result) {
  if(result.length==0) {
    alert('很抱歉我們查不到您所輸入的地點');
    return;
  }
  var locations = result.split(';');
  if(locations.length==1) {
    var data = locations[0].split(',');
    if(data.length<8) {
      alert(result);
      return;
    }
    var positionType = (data[3]!='1' || data[7]=='準確' || data[7]=='模糊')?1:2;
    setMapTarget(new ULatLng(parseFloat(data[5]), parseFloat(data[4]), U_TM2_COORDSYS), data[1], data[2], positionType);
  } else {
    var dataTypes = ['', '', '道路', '交叉路口', '縣市', '鄉鎮市區', '村里', '基礎地標','','','','','地標'];
    var resultList = new Object();
    for(var i=0; i<dataTypes.length; i++) {
      resultList[dataTypes[i]] = new Object();
      resultList[dataTypes[i]].count = 0;
    }
    for(var i=0; i<locations.length; i++) {
      var data = locations[i].split(',');
      if(data.length!=8)
        continue;
      if(!resultList[dataTypes[parseInt(data[3])]][data[0]])
        resultList[dataTypes[parseInt(data[3])]][data[0]] = new Array();
      resultList[dataTypes[parseInt(data[3])]][data[0]].push(data[1]+';'+data[5]+';'+data[4]);
      resultList[dataTypes[parseInt(data[3])]].count++;
    }
    U.gi('listDiv').innerHTML = '<span> </span>';
    var resultTree = new treelist(U.gi('listDiv'), searchResultClick, false);
    var pickOne = false;
    for(var i=0; i<dataTypes.length; i++) {
      if(resultList[dataTypes[i]].count==0)
        continue;
      var typeNode = new treenode(dataTypes[i]+'('+resultList[dataTypes[i]].count+')', resultTree, true);
      for(city in resultList[dataTypes[i]]) {
        if(city=='count')
          continue;
        var results = resultList[dataTypes[i]][city];
        var cityNode = new treenode(city+'('+results.length+')', typeNode, false);
        for(var j=0; j<results.length; j++) {
          new treenode(results[j].split(';')[0], cityNode, false, results[j]);
          if(!pickOne) {
            var data = results[j].split(';');
            setMapTarget(new ULatLng(parseFloat(data[1]), parseFloat(data[2]), U_TM2_COORDSYS), data[0], null, 3);
            pickOne = true;
          }
        }
      }
    }
    alm.getLayout('mainLayout').showPanel('listDiv');
  }
}

function setMapTarget(latlng, label, desc, positionType) {
  UpositionType = positionType;
  switch(positionType) {
    case 1:
      Utarget.setMouseonInfo(label);
      break;
    case 2:
      Utarget.setMouseonInfo(desc);
      break;
    default:
      Utarget.setMouseonInfo(label, desc);
  }
  Utarget.setPoint(latlng);
  map.centerMap(latlng);
  Utarget.label = label;
  Utarget.desc = desc;
  mapMarkerClick(Utarget);
}

function mapMarkerClick(overlay, latlng, isRightBtn) {
  if(overlay==Utarget) {
    var html;
    switch(UpositionType) {
      case 0:
        html = '我所在的位置是：<br>'+(Utarget.label=='目標點'?'':'<b style="color:blue;">'+Utarget.label+'</b><br>')+'經度 '+Utarget.getPoint().lng()+'<br>緯度 '+Utarget.getPoint().lat();
        break;
      case 1:
        html = '我所在的位置是：<br><b>'+Utarget.label+'</b>';
        break;
      case 2:
        html = '很抱歉，本系統無此地址資料：<br>'+Utarget.label+'<br><br>目前所在位置是：<br><b style="color:blue;">'+Utarget.desc+'</b>';
        break;
      case 3:
        html = '我所在的位置是：<br><b style="color:blue;">'+Utarget.label+'</b><p>如果這不是你要找的地點，其他的相關地點都列在右邊的搜尋結果中</p>';
        break;
    }
    html += '<p><a href="javascript:void(0);" id="setStartLink">設為起點</a> | <a href="javascript:void(0);" id="setEndLink">設為終點</a>';
    if(UpositionType==1)
      html += ' | <a href="#" id="addPmsPoiLink">在此處新增地標點</a>';
    html += '</p>';
    Utarget.openInfoWindow(html);
    U.gi('setStartLink').onclick = function() {setRoutingStartLocation(overlay.getPoint(), overlay.label);};
    U.gi('setEndLink').onclick = function() {setRoutingEndLocation(overlay.getPoint(), overlay.label);};
    if(UpositionType==1)
      U.gi('addPmsPoiLink').onclick = function() { showDialog('新增地標', '/pms/loadPoiAction.do?mode=insert&forward=insert&lat='+overlay.getPoint().lat()+'&lng='+overlay.getPoint().lng()+'&addr='+encodeURI(overlay.label));return false; };
  } else if(overlay==Ustart || overlay==Uend) {
    var desc = overlay==Ustart?'導航起點':'導航終點';
    overlay.openInfoWindow(desc+'<br><b style="color:blue;">'+overlay.label+'</b><p><a href="javascript:void(0);" id="removeRoutingNodeLink">移除這個點</a> | <a href="javascript:void(0);" id="switchStartEndLink">起終點對調</a></p>');
    U.gi('removeRoutingNodeLink').onclick = function() {removeRoutingNode(overlay);};
    U.gi('switchStartEndLink').onclick = switchStartEnd;
  }
}

function asppoiClick(overlay, latlng) {
  if(overlay) {
    if(!overlay.isPoi)
      return;
    switch(overlay.passiveAction) {
      case '1':
        if(overlay.extLink && overlay.extLink!='')
          window.open(overlay.extLink.indexOf('http')==0?overlay.extLink:'http://'+overlay.extLink);
        break;
      case '2':
        UactivePoi = overlay;
        if(overlay.contentId=='0')
          SearchBean.getAsppoiContent(overlay.pid, showPopupContent);
        else
          SearchBean.getAdvert(overlay.contentId, showPopupContent);
        break;
      case '3':
        if(overlay.contentId=='0')
          SearchBean.getAsppoiContent(overlay.pid, showDetailContent);
        else
          SearchBean.getAdvert(overlay.contentId, showDetailContent);
        break;
      default:
        overlay.openInfoWindow('<b>'+overlay.label+'</b><br>'+overlay.desc+'<p><a href="javascript:void(0);" id="setStartLink">設為起點</a> | <a href="javascript:void(0);" id="setEndLink">設為終點</a></p>');
        U.gi('setStartLink').onclick = function() {setRoutingStartLocation(overlay.getPoint(), overlay.label);};
        U.gi('setEndLink').onclick = function() {setRoutingEndLocation(overlay.getPoint(), overlay.label);};
    }
  }
}

function showPopupContent(result) {
  if(!result || result=='')
    return;
  UactivePoi.openInfoWindow(result);
}

function showDetailContent(result) {
  if(!result || result=='')
    return;
  U.gi('detailDiv').innerHTML = result;
  alm.getLayout('mainLayout').showPanel('detailDiv');
}

function searchResultClick(node) {
  var data = node.data.split(';');
  setMapTarget(new ULatLng(parseFloat(data[1]), parseFloat(data[2]), U_TM2_COORDSYS), data[0], null, 3);
  node.select(true);
}

function poiDivInit() {
  UpoiTree = new treelist(U.gi('poiDiv'), poiTypeClick, false, '/tree/root.xml');
  function poiTypeClick(node) {
    if(node.isSelected()) {
      if(!node.data) {
        node.select(false);
        return;
      }
      var datas = node.data.split(':');
      for(var i=0; i<datas.length; i++) {
        var data = datas[i].split(';');
        if(data[0]=='geo')
          getGeoObject(data[1]);
        else {
          getPoi(data[0], data[1]);
        }
      }
    } else {
      UpoiType = null;
      clearPoi();
      clearGeoObject();
    }
  }
  function getPoi(poiSource, poiType) {
    UpoiSource = poiSource;
    UpoiType = poiType;
    if(!UpoiType) {
      clearPoi();
      return;
    }
    if(map.getZoomLevel()<7)
      return;
    var center = map.getCenter();
    var bounds = map.getBounds();
    if(UpoiSource=='asp')
      SearchBean.findAspPoi(center.x(), center.y(), bounds.getWidth(U_TM2_COORDSYS), bounds.getHeight(U_TM2_COORDSYS), UpoiType, false, getAspPoiCallback);
    else if(UpoiSource=='1111')
      SearchBean.find1111JobInArea(center.x(), center.y(), bounds.getWidth(U_TM2_COORDSYS), bounds.getHeight(U_TM2_COORDSYS), UpoiType, '1', getJob1111Callback);
    else if(UpoiSource=='surehigh') {
      getSurehighHotel(UpoiType);
    } else if(UpoiSource=='nhg') {
      SearchBean.findNHG(center.x(), center.y(), bounds.getWidth(U_TM2_COORDSYS), bounds.getHeight(U_TM2_COORDSYS), UpoiType, getNhgCallback);
    }
  }
  function getAspPoiCallback(result) {
    var pois = new Array();
    var da = result.split(';');
    for(i=0; i<da.length; i++) {
      var at = da[i].split(',');
      if(at.length<13)
        continue;
      var icon = new UIcon();
      icon.image = UIconImagePath+at[3];
      icon.iconWidth = parseInt(at[11]);
      icon.iconHeight = parseInt(at[12]);
      icon.iconAnchor = new UPoint(Math.round(icon.iconWidth/2), Math.round(icon.iconHeight/2));
      icon.infoWindowAnchor = new UPoint(Math.round(icon.iconWidth/2), 0);
      var coords = new ULatLng(parseInt(at[2]), parseInt(at[1]), U_TM2_COORDSYS);
      var txt = at[5];
      if(at[10]!='6')
      	txt += '<p><a href="#" onclick="collectAspPoi(\''+at[0]+'\',\''+at[4]+'\',\''+at[5]+'\','+coords.lat()+','+coords.lng()+');return false;">收藏此地標</a><img src="img/new.gif"></p>';
      var poi = new UMarker(coords, icon, at[4], txt);
      poi.pid = at[0];
      poi.label = at[4];
      poi.desc = at[5];
      poi.isPoi = true;
      poi.passiveAction = at[6];
      poi.extLink = at[7];
      poi.activeAction = at[8];
      poi.contentId = at[9];
      pois.push(poi);
      if(poi.activeAction!='0' && !UdisplayedActiveAd[poi.contentId]) {
        UactivePoi = poi;
        UdisplayedActiveAd[poi.contentId] = 'displayed';
        if(poi.contentId=='0')
          SearchBean.getAsppoiContent(poi.pid, showPopupContent);
        else
          SearchBean.getAdvert(poi.contentId, showPopupContent);
      }
    }
    _setPoi(pois);
  }
  function getNhgCallback(result) {
    var doc = U.stringToDom(result);
    var objs = U.gt(doc, 'RECORD');
    var pois = new Array();
    var icon = new UIcon();
    icon.image = '/asp/nhg/nh.gif'
    icon.iconWidth = 15;
    icon.iconHeight = 20;
    icon.iconAnchor = new UPoint(8, 10);
    icon.infoWindowAnchor = new UPoint(8, 0);
    for(var i=0; i<objs.length; i++) {
      var poi = new UMarker(new ULatLng(parseInt(U.getTagValue(objs[i], 'Y')), parseInt(U.getTagValue(objs[i], 'X')), U_TM2_COORDSYS), icon, U.getTagValue(objs[i], 'LABEL'), U.getTagValue(objs[i], 'DESC'));
      poi.label = U.getTagValue(objs[i], 'LABEL');
      poi.desc = U.getTagValue(objs[i], 'DESC');
      poi.isPoi = true;
      poi.passiveAction = '1';
      poi.extLink = 'http://www.nhg.com.tw/buy/buy01.asp?no='+U.getTagValue(objs[i], 'ID');
      pois.push(poi);
    }
    _setPoi(pois);
  }
  function getSurehighHotel(bookingType) {
    var sa = bookingType.split(',');
    var bounds = map.getBounds();
    var lb = bounds.getSouthWest();
    var rt = bounds.getNorthEast();
    var lt = new ULatLng(rt.lat(),lb.lng());
    var rb = new ULatLng(lb.lat(),rt.lng());
    for(var i=0;i<sa.length;i++){
    	var sUrl = getBookingUrl+'?ltlng='+lt.lng()+'&ltlat='+lt.lat()+'&rblng='+rb.lng()+'&rblat='+rb.lat()+'&btype='+sa[i]+'&vendor=surehigh'
      var transaction = YAHOO.util.Connect.asyncRequest('GET', sUrl , biCallback, null); 
  	}
  }
  var biCallback = { 
    success: function(o) {
    	var pois = new Array();
    	var xml = o.responseXML;
    	var bis = xml.getElementsByTagName('HOTEL');
    	for(var i=0;i<bis.length;i++){
    		var node = bis[i];
    		var id = node.getAttribute('ID');
    		var address = node.getAttribute('ADDRESS');
    		var cpid = node.getAttribute('CPID');
    		var lat = node.getAttribute('LATITUDE');
    		var link = node.getAttribute('LINK');
    		var lng = node.getAttribute('LONGITUDE');
    		var name = node.getAttribute('NAME');
    		var photo = node.getAttribute('PHOTO');
    		var source = node.getAttribute('SOURCE');
    		var type = node.getAttribute('TYPE');
    		var iconStr = node.getAttribute('ICON');
    		var iconWidth = node.getAttribute('ICON_WIDTH');
    		var iconHeight = node.getAttribute('ICON_HEIGHT');
    		var icon = new UIcon();
      	icon.image = UIconImagePath+iconStr;
      	icon.iconWidth = parseInt(iconWidth);
      	icon.iconHeight = parseInt(iconHeight);
      	icon.iconAnchor = new UPoint(Math.round(icon.iconWidth/2), Math.round(icon.iconHeight/2));
      	icon.infoWindowAnchor = new UPoint(Math.round(icon.iconWidth/2), 0);
      	var poi = new UMarker( new ULatLng(parseFloat(lat), parseFloat(lng)), icon, name, address);
      	poi.linkUrl = link;
      	var cn = node.firstChild;
      	if(cn!=null){
      		poi.descr = cn.nodeValue;
      	}
      	else
      		poi.descr = '';
      	poi.isPoi = true;
      	poi.extLink = link;
      	poi.passiveAction = '1' ;
    		pois.push(poi);
    	}
    	_setPoi(pois);
    }, 
    failure: function(o) {
    	alert('無法取得飯店/景點資料！');
    }, 
    argument: ['']  
  }
  function clearGeoObject() {
    while(UgeoObjects.length>0)
      map.removeOverlay(UgeoObjects.pop());
  }
  function mapChange() {
    clearTimeout(UpoiThread);
    if(map.getZoomLevel()<7)
      clearPoi();
    else {
      UpoiThread = setTimeout(function() {getPoi(UpoiSource, UpoiType);}, 1500);
    }
  }
  map.addListener('zoom', mapChange);
  map.addListener('moveend', mapChange);
  U.gi('closePoiBtn').onclick = function() {
    UpoiTree.selectAll(false);
    getPoi(null, null);
    clearGeoObject();
  }
}

function _setPoi(pois) {
  clearPoi();
  Upois = pois;
  for(var i=0; i<Upois.length; i++)
    map.addOverlay(Upois[i]);
}
function clearPoi() {
  while(Upois.length>0)
    map.removeOverlay(Upois.pop());
}


function collectAspPoi(id, name, desc, lat, lng) {
  showDialog('收藏地標', '/pms/poi/collect.jsp?asppoiId='+id+'&poiName='+encodeURI(name)+'&poiAddress='+encodeURI(desc)+'&poiPhone=&poiLongitude='+lng+'&poiLatitude='+lat+'&mode=insert');
}

/* routing related function */
function removeRoutingNode(node) {
  setRoutingNode(new ULatLng(0, 0), '', node);
  map.closeInfoWindow();
}

function setRoutingNode(latlng, label, node) {
  var desc = node==Ustart?'導航起點':'導航終點';
  node.setPoint(latlng);
  node.setMouseonInfo(label, desc);
  node.label = label;
  if(node==Ustart) {
    U.gi('viewStartLink').innerHTML = label;
    U.blinkElement(U.gi('viewStartLink').parentNode, '#fbb');
  } else {
    U.gi('viewEndLink').innerHTML = label;
    U.blinkElement(U.gi('viewEndLink').parentNode, '#fbb');
  }
  alm.getLayout('mainLayout').showPanel('routingDiv');
}

function viewStart() {
  if(Ustart.getPoint().lat()!=0)
    map.centerAndZoom(Ustart.getPoint(), 9);
  return false;
}

function viewEnd() {
  if(Uend.getPoint().lat()!=0)
    map.centerAndZoom(Uend.getPoint(), 9);
  return false;
}

function switchStartEnd() {
  var point = new ULatLng(Ustart.getPoint().lat(), Ustart.getPoint().lng());
  var label = Ustart.label;
  setRoutingNode(Uend.getPoint(), Uend.label, Ustart);
  setRoutingNode(point, label, Uend);
  map.closeInfoWindow();
  consistRoutingLocationRadio();
}

function resetRoutingSetting() {
  removeRoutingNode(Ustart);
  removeRoutingNode(Uend);
  while(UbusStations.length>0)
    map.removeOverlay(UbusStations.pop());
  UbusSolutionNum = null;
  U.gi('routingResultDiv').style.display = 'none';
  if(UroutePath)
    map.removeOverlay(UroutePath);
  
  clearRoutingLocationRadio();
}

function startRouting() {
  if(Ustart.getPoint().lat()==0 || Uend.getPoint().lat()==0) {
    alert('請先設定好起終點!');
    return;
  }
  if(U.gi('carRouting').checked==true) {
    SearchBean.getRoute(Math.round(Ustart.getPoint().x()), Math.round(Ustart.getPoint().y()), Math.round(Uend.getPoint().x()), Math.round(Uend.getPoint().y()), startCarRoutingCallback);
    //UCounter.addCount('UrMap首頁_function_開車導航');
  } else if(U.gi('busRouting').checked==true) {
    SearchBean.getPTRouting(Math.round(Ustart.getPoint().x()), Math.round(Ustart.getPoint().y()), Math.round(Uend.getPoint().x()), Math.round(Uend.getPoint().y()),  startBusRoutingCallback);
    //UCounter.addCount('UrMap首頁_function_大眾運輸導航');
  }
}

function startCarRoutingCallback(result) {
  if(result=='' || result.split(':').length!=4) {
    alert('很抱歉，你輸入的起迄點資料無法規劃出適當路徑，請變更起迄點位置以後再試一次。');
    return;
  }
  var distance = parseFloat(result.split(':')[1]);
  var pts = result.split(':')[2].split(';');
  var pathXY = result.split(':')[3].split(',');
  var html = '<table cellspacing="0"><tr><td class="num">全長</td><td class="value">'+distance+' 公尺</td></tr>';
  var box = new UBounds();
  for(var i=0; i<pts.length; i++) {
    var nxy = pts[i].split(',');
    html+='<tr><td class="num">'+(i+1)+'</td><td class="value"><a href="javascript:void(0);" xcoor="'+nxy[1]+'" ycoor="'+nxy[2]+'">&nbsp;'+nxy[0]+'</a></td></tr>';
    box.extend(new ULatLng(parseFloat(nxy[2]), parseFloat(nxy[1]), U_TM2_COORDSYS));
  }
  html+='</table>';
  box.extend(Ustart.getPoint());
  box.extend(Uend.getPoint());
  U.gi('routingResultDiv').innerHTML = html;
  U.gi('routingResultDiv').style.display = 'block';
  var links = U.gt(U.gi('routingResultDiv'), 'a');
  for(var i=0; i<links.length; i++)
    links[i].onclick = routingVertexLinkClick;
  var viewFullRouteLink = document.createElement('a');
  viewFullRouteLink.href = 'javascript:void(0);';
  viewFullRouteLink.innerHTML = '觀看全程路線地圖';
  viewFullRouteLink.onclick = function() {
    map.centerAndZoom(box.getCenter(), map.getBoundsZoomLevel(box));
    return false;
  };
  U.gi('routingResultDiv').insertBefore(viewFullRouteLink, U.gi('routingResultDiv').firstChild);
  map.centerAndZoom(box.getCenter(), map.getBoundsZoomLevel(box));
  if(UroutePath)
    map.removeOverlay(UroutePath);
  var path = new Array();
  for(var i=0; i<pathXY.length/2; i++)
    path.push(new ULatLng(parseFloat(pathXY[2*i+1]), parseFloat(pathXY[2*i]), U_TM2_COORDSYS));
  UroutePath = new UPolyline(path);
  map.addOverlay(UroutePath);
}

function routingVertexLinkClick(ev) {
  var vertex = U.findTarget(ev, 'a');
  if(vertex.getAttribute('xcoor'))
    map.centerAndZoom(new ULatLng(parseFloat(vertex.getAttribute('ycoor')), parseFloat(vertex.getAttribute('xcoor')), U_TM2_COORDSYS), 9);
  return false;
}

function startBusRoutingCallback(result) {
  U.gi('routingResultDiv').innerHTML = result;
  U.gi('routingResultDiv').style.display = 'block';
  var links = U.gt(U.gi('routingResultDiv'), 'a');
  for(var i=0; i<links.length; i++) {
    links[i].onclick = busStationLinkClick;
    links[i].href = '#';
  }
  var solutions = U.gt(U.gi('routingResultDiv'), 'td');
  for(var i=0; i<solutions.length; i++) {
    solutions[i].solutionNum = i;
    var viewSolutionLink = document.createElement('a');
    viewSolutionLink.href = '#';
    viewSolutionLink.style.paddingLeft = '10px';
    viewSolutionLink.innerHTML = '觀看此方案所有站牌位置';
    viewSolutionLink.onclick = busSolutionLinkClick;
    solutions[i].appendChild(viewSolutionLink);
  }
  UbusSolutionNum = null;
}

function setBusStations(solutionNum) {
  if(UbusSolutionNum==solutionNum)
    return;
  UbusSolutionNum = solutionNum;
  while(UbusStations.length>0)
    map.removeOverlay(UbusStations.pop());
  var stLinks = U.gt(U.gt(U.gi('routingResultDiv'), 'td')[solutionNum], 'a');
  for(var i=0; i<stLinks.length; i++) {
    if(stLinks[i].getAttribute('xcoor')) {
      var station = new UMarker(new ULatLng(parseFloat(stLinks[i].getAttribute('ycoor')), parseFloat(stLinks[i].getAttribute('xcoor')), U_TM2_COORDSYS), UbusStationIcon, stLinks[i].innerHTML, null, 98);
      UbusStations.push(station);
      map.addOverlay(station);
    }
  }
}

function busStationLinkClick(ev) {
  var station = U.findTarget(ev, 'a');
  if(station.getAttribute('xcoor')) {
    setBusStations(station.parentNode.solutionNum);
    map.centerAndZoom(new ULatLng(parseFloat(station.getAttribute('ycoor')), parseFloat(station.getAttribute('xcoor')), U_TM2_COORDSYS), 9);
  }
  return false;
}

function busSolutionLinkClick(ev) {
  var solution = U.findTarget(ev, 'td');
  setBusStations(solution.solutionNum);
  var box = new UBounds();
  for(var i=0; i<UbusStations.length; i++)
    box.extend(UbusStations[i].getPoint());
  box.extend(Ustart.getPoint());
  box.extend(Uend.getPoint());
  map.centerAndZoom(box.getCenter(), map.getBoundsZoomLevel(box));
  return false;
}

function setRoutingStartLocation(latlng, label) {
  setRoutingNode(latlng, label, Ustart);
  map.closeInfoWindow();
  hideContextMenu();
}

function setRoutingEndLocation(latlng, label) {
  setRoutingNode(latlng, label, Uend);
  map.closeInfoWindow();
  hideContextMenu();
}


var pmsPOIArray = new Array();
function markPmsPoi(str) {
  clearPmsPoi();
  var poiStr = str.split(';;;');
  for(var i=0; i<poiStr.length; i++) {
    if(poiStr[i].trim()=='')
      continue;
    var da = poiStr[i].split('@@@');
    var uicon = new UIcon();
    var type = da[5];
    if (type=='0') {
      uicon.image = '/pms/img/publicPOIIcon.gif';
    }
    else if (type=='1') {
      uicon.image = '/pms/img/publicPOIIcon.gif';
    }
    else if (type=='2') {
      uicon.image = '/pms/img/privatePOIIcon.gif';
    }
    else if (type=='3') {
      uicon.image = '/pms/img/colPOIIcon.gif';
    }
    uicon.iconWidth = 21;
    uicon.iconHeight = 21;
    uicon.iconAnchor = new UPoint(10, 20);
    uicon.infoWindowAnchor = new UPoint(10, 0);
    //var poi = new UMarker(new ULatLng(parseFloat(da[4]), parseFloat(da[3])), UpmsIcon, da[1], da[2]);
    var poi = new UMarker(new ULatLng(parseFloat(da[4]), parseFloat(da[3])), uicon, da[1], da[2]);
    poi.id = da[0];
    poi.name = da[1];
    poi.isPms = true;
    poi.pmsType = type;
    var chkObj = document.getElementById('poiType' + type);
    if (chkObj.checked == true) map.addOverlay(poi);
    UpmsPois.push(poi);
    if (!pmsPOIArray[type]) { pmsPOIArray[type] = new Array();
    }
    pmsPOIArray[type].push(poi);
  }
}

function clearPmsPoi() {
	while(UpmsPois.length>0){
    map.removeOverlay(UpmsPois.pop());
  }
  pmsPOIArray = new Array();
}

function removePOIType(type) {
  if (pmsPOIArray[type]) {
    for (i=0;i<pmsPOIArray[type].length; i++) {
      map.removeOverlay(pmsPOIArray[type][i]);
    }
  }
}

function remarkPOIType(type) {
  if (pmsPOIArray[type]) {
    for (i=0;i<pmsPOIArray[type].length; i++) {
      map.addOverlay(pmsPOIArray[type][i]);
    }
  }
}

function pmsPoiClick(overlay, latlng) {
  if(!overlay || !overlay.isPms)
    return;
  addNewTab('poi-detail-'+overlay.id,'地標-'+overlay.name,'/pms/loadPoiAction.do?id='+overlay.id+'&mode=detail&forward=detail&nomove=true');
}

function addFirefoxSearchEngine() {
  if((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function")) {
    window.sidebar.addSearchEngine(
      "http://www.urmap.com/firefox/urmap.src",
      "http://www.urmap.com/firefox/urmap.gif",
      "UrMap電子地圖搜尋引擎",
      "General");
  } else {
    alert("此搜尋列僅支援 Firefox 或 Mozilla 瀏覽器");
  }
}


//--Start of add by Edwrad


function getUserLocation( ev ){
	var fid = this.id;
	var fvalue = this.value;
	//alert(this.id);
	//alert(this.value);
	var ptType = fid.substring(0,2);
	
	var ulUrl = '/pms/getUserLocations.jsp?locType='+fvalue+'&ptType='+ptType;
	var transaction = YAHOO.util.Connect.asyncRequest('GET', ulUrl , ulCallback, null); 
}

var ulCallback = { 
    success: function(o) {
    	var text = o.responseText;
    	var sa = text.split(';');
    	if(sa[0].trim()=='success'){
    		var ss = sa[1].split(',');
    		var latlng = new ULatLng(parseFloat(ss[1]),parseFloat(ss[0]));
    		if(ss[3].trim()=='st'){ // 設定起點
    			map.centerMap(latlng);
    			setRoutingStartLocation(latlng, ss[2]);
    			
    		}
    		else{
    			map.centerMap(latlng);
    			setRoutingEndLocation(latlng, ss[2]);
    		}
    			
    	}
    	else if(sa[0]=='failure'){
    		alert(sa[1].trim()+'!');
    	}
    	else{
    		alert('Unexpected return header!');
    	}
    	
    	
    }, 
    failure: function(o) {
    	alert(o.statusText);
    	//alert('系統發生錯誤！');
    }, 
    argument: ['']  
  }
  
var allUserPmsPois = new Array();
function getAllUserPmsPoi( str ){
	clearAllUserPmsPoi();
  var poiStr = str.split(';;;');
  for(var i=0; i<poiStr.length; i++) {
    if(poiStr[i].trim()=='')
      continue;
    var da = poiStr[i].split('@@@');
    var uicon = new UIcon();
    var type = da[5];
    if (type=='0') {
      uicon.image = '/pms/img/publicPOIIcon.gif';
    }
    else
    	continue;
    
    uicon.iconWidth = 21;
    uicon.iconHeight = 21;
    uicon.iconAnchor = new UPoint(10, 20);
    uicon.infoWindowAnchor = new UPoint(10, 0);
    var poi = new UMarker(new ULatLng(parseFloat(da[4]), parseFloat(da[3])), uicon, da[1], da[2]);
    poi.id = da[0];
    poi.name = da[1];
    poi.isPms = true;
    poi.pmsType = type;
    var chkObj = document.getElementById('openPmsPoi');
    if (chkObj.checked == true) map.addOverlay(poi);
    allUserPmsPois.push(poi);
  }	
}
function clearAllUserPmsPoi(){
	while(allUserPmsPois.length>0){
    map.removeOverlay(allUserPmsPois.pop());
  }
  allUserPmsPois = new Array();
}

function removeAllUserPmsPOI() {
  for (i=0;i<allUserPmsPois.length; i++) {
    map.removeOverlay(allUserPmsPois[i]);
  }
  
}

function remarkAllUserPmsPOI() {
  
  for (i=0;i<allUserPmsPois.length; i++) {
    map.addOverlay(allUserPmsPois[i]);
  }
  
}

function clearRoutingLocationRadio(){
	U.gi('stloc0').checked = false;  
  U.gi('stloc1').checked = false;  
  U.gi('stloc2').checked = false;  
  U.gi('stloc3').checked = false;  
  U.gi('destloc0').checked = false;  
  U.gi('destloc1').checked = false;  
  U.gi('destloc2').checked = false;  
  U.gi('destloc3').checked = false;  
}

function consistRoutingLocationRadio(){
	clearRoutingLocationRadio();
	if(Ustart.label == '住家'){
		U.gi('stloc0').checked = true;  
	}
	else if(Ustart.label == '公司'){
		U.gi('stloc1').checked = true;  
	}
	else if(Ustart.label == '學校'){
		U.gi('stloc2').checked = true;  
	}
	else if(Ustart.label == '個人地點'){
		U.gi('stloc3').checked = true;  
	}
	
	if(Uend.label == '住家'){
		U.gi('destloc0').checked = true;  
	}
	else if(Uend.label == '公司'){
		U.gi('destloc1').checked = true;  
	}
	else if(Uend.label == '學校'){
		U.gi('destloc2').checked = true;  
	}
	else if(Uend.label == '個人地點'){
		U.gi('destloc3').checked = true;  
	}
}

//--End of add by Edward

var TempHeadBanner = {
  headBanner: null,
  headBannerContent: new Array(
    /*
	'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60"><param name="movie" value="/banner/vote_pms.swf"><param name="quality" value="high"><embed src="/banner/vote_pms.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="468" height="60"></embed></object>',
	*/
    '<a href="/urphone/edm/" target="_blank"><img src="/banner/roll_pic03.gif"></a>',
    /*
	'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60"><param name="movie" value="/banner/vote_pms.swf"><param name="quality" value="high"><embed src="/banner/vote_pms.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="468" height="60"></embed></object>',
	*/
    '<a href="/YahooMessenger/doc/YM_account.html" target="_blank"><img src="/banner/roll_pic01.gif"></a>',
    /*
	'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60"><param name="movie" value="/banner/vote_pms.swf"><param name="quality" value="high"><embed src="/banner/vote_pms.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="468" height="60"></embed></object>',
	*/
    '<a href="/urphone/edm/" target="_blank"><img src="/banner/roll_pic03.gif"></a>',
    /*
	'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60"><param name="movie" value="/banner/vote_pms.swf"><param name="quality" value="high"><embed src="/banner/vote_pms.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="468" height="60"></embed></object>',
*/
    '<a href="/msn/doc/" target="_blank"><img src="/banner/roll_pic02.gif"></a>'
  ),
  headBannerIdx: 1,
  setBannerDiv: function(div) {
    TempHeadBanner.headBanner = div;
    TempHeadBanner.headBanner.innerHTML = TempHeadBanner.headBannerContent[0];
    setInterval('TempHeadBanner.headBanner.innerHTML = TempHeadBanner.headBannerContent[(TempHeadBanner.headBannerIdx++)%TempHeadBanner.headBannerContent.length];', 8000);
  }
};
