﻿window.onload = init;
window.onresize = adjustWindowSize;

var map;
var Utarget;
var UpositionType;
var UcontextMenuLatLng;
var Upin;
var passiveMode = false;
var connected = false;
var markerArray = new Object();

function init() {
  map = new UMap(U.gi('mapDiv'));
  map.addControl(U_TYPE_CONTROL);
  map.addControl(U_FULLZOOM_CONTROL);
  map.centerAndZoom(new ULatLng(25.035405, 121.530255), 9);
  map.addListener('click', mapMarkerClick);
  map.addListener('moveend', mapChange);
  map.addListener('zoom', mapChange);
  adjustWindowSize();
  var icon = new UIcon();
  icon.image = '/images/search-marker.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 = '/images/marker.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);
  /* initialize event */
  U.gi('queryBtn').onclick = _smartQuery;
  U.gi('queryForm').onsubmit = _smartQuery;
  if(U.gi('measureLink'))
    U.gi('measureLink').onclick = function() {map.setMapAction(U_MEASURE_ACTION);};
  U.addEvent(U.gi('mapDiv'), 'contextmenu', showContextMenu);
  U.gi('addMarkerMenuItem').onclick = addMarker;
  /*
  U.gi('setStartMenuItem').onclick = function(ev) {
    U.cancelDefault(ev);
    _setRoutingStartLocation(UcontextMenuLatLng, '圖面自訂點');
  };
  U.gi('setEndMenuItem').onclick = function(ev) {
    U.cancelDefault(ev);
    _setRoutingEndLocation(UcontextMenuLatLng, '圖面自訂點');
  };
  */
  //U.gi('closeMenuItem').onclick = hideContextMenu;
  try {
    window.external.Channel.Initialize();
  } catch(ex) {}
}

function adjustWindowSize() {
  var dim = U.getWindowSize();
  var headerHeight = U.gi('headerDiv').offsetHeight;
  var h = (dim[1]-headerHeight-U.gi('toolbarDiv').offsetHeight);
  U.gi('mapDiv').style.height = h+'px';
  map.checkResize();
}

function _smartQuery() {
  var queryString = document.getElementById('queryText').value.replace(/^[\s]+/g,'').replace(/[\s]+$/g,'');
  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;
  }
  //U.gi('queryFrame').src = '/msn/search.jsp?qs='+encodeURI(queryString);
  map.locateTo(queryString, function(data){
		  var pos = data.records[0];
	setMapTarget( new ULatLng(parseFloat(pos.latitude), parseFloat(pos.longitude)), pos.formal_address, pos.level, pos.position_result);		  
//		  console.log(data);
  });
  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])), data[1], data[2], positionType);
  } else {
    for(var i=0; i<locations.length; i++) {
      var data = locations[i].split(',');
      if(data.length!=8)
        continue;
      setMapTarget(new ULatLng(parseFloat(data[5]), parseFloat(data[4])), data[1], null, 3);
      break;
    }
  }
}

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);
  if(!passiveMode)
    sendData('t,'+latlng.lat()+','+latlng.lng()+','+label+','+desc+','+positionType);
  passiveMode = false;
}

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;
    }
    Utarget.openInfoWindow(html);
  }
  hideContextMenu();
}

function mapChange() {
  if(!passiveMode)
    sendData('m,'+map.getCenter().lat()+','+map.getCenter().lng()+','+map.getZoomLevel());
  passiveMode = false;
}

function hideContextMenu(ev) {
  U.cancelDefault(ev);
  U.gi('contextMenu').style.display = 'none';
  //map.removeOverlay(Upin);
  Upin.setPoint(new ULatLng(0, 0));
}

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 addMarker() {
  hideContextMenu();
  var dim = U.getWindowSize();
  var div = U.gi('addMarkerDiv');
  div.style.left = ((dim[0]-250)/2)+'px';
  div.style.top = ((dim[1]-100)/2)+'px';
  U.gi('markerName').value = '';
  U.gi('markerDesc').value = '';
  div.style.display = 'block';
}

function addMarker2() {
  var time = new Date().getTime()+'';
  var name = U.gi('markerName').value;
  var desc = U.gi('markerDesc').value+'<br><a href="javascript:removeMarker(\''+time+'\');">移除此標記點</a>';
  var marker = new UMarker(UcontextMenuLatLng, null, name, desc);
  marker.addListener('click', function() { marker.openInfoWindow(name+'<hr>'+desc); });
  markerArray[time] = marker;
  map.addOverlay(marker);
  marker.openInfoWindow(name+'<hr>'+desc);
  U.gi('addMarkerDiv').style.display = 'none';
  sendData('am,'+UcontextMenuLatLng.lat()+','+UcontextMenuLatLng.lng()+','+name+','+desc+','+time);
}

function removeMarker(time) {
  var marker = markerArray[time];
  delete markerArray[time];
  map.removeOverlay(marker);
  map.closeInfoWindow();
  if(!passiveMode)
    sendData('rm,'+time);
  passiveMode = false;
}

function Channel_OnRemoteAppLoaded() {
  connected = true;
}

function Channel_OnRemoteAppClosed() {
  connected = false;
  alert('對方已關閉地圖連線');
}

function Channel_OnDataReceived() {
  var data = window.external.Channel.Data.split(',');
  switch(data[0]) {
    case 'm':
      passiveMode = true;
      map.centerAndZoom(new ULatLng(parseFloat(data[1]), parseFloat(data[2])), parseInt(data[3]));
      break;
    case 't':
      passiveMode = true;
      setMapTarget(new ULatLng(parseFloat(data[1]), parseFloat(data[2])), data[3], data[4], parseInt(data[5]));
      break;
    case 'am':
      var marker = new UMarker(new ULatLng(parseFloat(data[1]), parseFloat(data[2])), null, data[3], data[4]);
      marker.addListener('click', function() { marker.openInfoWindow(data[3]+'<hr>'+data[4]); });
      markerArray[data[5]] = marker;
      map.addOverlay(marker);
      marker.openInfoWindow(data[3]+'<hr>'+data[4]);
      break;
    case 'rm':
      passiveMode = true;
      removeMarker(data[1]);
      break;
  }
}

function Channel_OnDataError() {
  alert('data error');
}

function Channel_OnTypeChanged() {
  if(connected && window.external.Channel.Type==2)
    Channel_OnRemoteAppClosed();
}

function Channel_OnAppClose() {
}

function sendData(data) {
  if(!connected)
    return;
  try {
    window.external.Channel.SendData(data);
  } catch(ex) {
    alert('與對方的地圖連線發生錯誤');
  }
}

