var map;
var street_view_panorama;
var street_view_container;
var controls = {};
var hidden_controls = [];
var panToCenter = false;
var tabs_to_remove = [];
var translations = {
  labels: {
        en: "Show labels",
        es: "Superponer callejero",
        fr: "Afficher les noms",
        de: "Labels anzeigen",
        ja: "地名を表示"
  }
};

// map variables defaults (could be updated in the configuration file)
var API_KEY;
var MAP_TAG_ID = "gmap";       // html element id to place the map
var HOTEL_LAT;
var HOTEL_LNG;
var ZOOM = 15;

var SET_MAP_TYPE = false;
var MIRAI_MAP_TYPE = "satellite";

var SET_MAP_CENTER = false;
var MAP_CENTER_LAT = HOTEL_LAT;
var MAP_CENTER_LNG = HOTEL_LNG;

var USE_STREET_VIEW = false;
var STREET_VIEW_TAG_ID = "smap";
var STREET_VIEW_PITCH;
var STREET_VIEW_YAW;
var STREET_VIEW_ZOOM;

var USE_CUSTOM_ICON = true;
var MIRAI_CUSTOM_ICON = "http://asset0.hotelsearch.com/images/gmapicono.png";
var CUSTOM_ICON_DIMENSIONS = [32,33];

var MULTI = false;
var MULTI_ARRAY;

var USE_SMALL_ZOOM_CONTROL = false;

var mapVariablesList = ["API_KEY","MAP_TAG_ID","HOTEL_LAT","HOTEL_LNG", "ZOOM", "SET_MAP_TYPE",
  "MIRAI_MAP_TYPE", "SET_MAP_CENTER", "MAP_CENTER_LAT", "MAP_CENTER_LNG", "USE_STREET_VIEW",
  "STREET_VIEW_TAG_ID", "USE_CUSTOM_ICON", "MIRAI_CUSTOM_ICON", "CUSTOM_ICON_DIMENSIONS", "MULTI",
  "MULTI_ARRAY", "USE_SMALL_ZOOM_CONTROL", "STREET_VIEW_PITCH", "STREET_VIEW_YAW", "STREET_VIEW_ZOOM"];

var scriptUrlParams = getScriptUrlParams();
//loads config file
var fileUrl = window.location.protocol + "//" + window.location.host + "/" + (getFilename() ? getFilename() : "config.txt");
loadConfigFile(fileUrl);

function getScriptUrlParams() {
  var urlFrags = [];
  var urlParams=[];
	var urlParamRaw = [];
	var scriptTags = document.getElementsByTagName("script");
  for(var i=0; i<scriptTags.length; i++) {
    if ( scriptTags[i].src.indexOf("#") != -1  ) {
      urlFrags = unescape(scriptTags[i].src).split("##");
    }
  }
	if (urlFrags.length > 1){
    urlParamRaw = urlFrags[1].split("/");
	  if (urlParamRaw.length >= 2) {
     	for(var param=0;param<urlParamRaw.length;param+=2)
        urlParams[urlParamRaw[param]]  = (urlParamRaw.length >= param + 1 ? unescape(urlParamRaw[param+1]) : null);
    }
	}
	return(urlParams);
}

function getLanguage(){
  return scriptUrlParams["language"];
}

function getFilename(){
  return scriptUrlParams["filename"];
}

var req;
function loadConfigFile(url) {
	req = false;
  // branch for native XMLHttpRequest object
  if(window.XMLHttpRequest && !(window.ActiveXObject)) {
    try {
	 	  req = new XMLHttpRequest();
    } catch(e) {
  		req = false;
    }
    // branch for IE/Windows ActiveX version
  } else if(window.ActiveXObject) {
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        req = false;
      }
    }
  }
	if(req) {
	  req.onreadystatechange = processCallResponse;
		req.open("GET", url, true);
		req.send("");
	}
}

function processCallResponse() {
  // only if req shows "loaded"
  if (req.readyState == 4) {
    // only if "OK"
    if (req.status == 200) {
      assignsMapConfig();
    } else {
      alert("There was a problem retrieving the XML data:\n" +
      req.statusText);
    }
    callGoogle()
 }
}

function assignsMapConfig(){
  for(key in mapVariablesList) {
    if(val = getValue(req,mapVariablesList[key])){
      var a = eval( mapVariablesList[key] + "=" + val + ";");
    }
  }
}

function getValue(content, key){
  var tester = new RegExp("^\\w+$")
  if (tester.test(key)) {
    var regex = new RegExp("\\s*" + key + "\\s*=\\s*(.*)");
    if ( regex.test(content.responseText)){
      var a = regex.exec(content.responseText);
      return a[1];
    }
  }
}

function callGoogle(){
  // injects google maps library in the html dom
  if (!API_KEY){
    alert("Your google maps key is not defined in your configuration file (API_KEY = \"yourkey\").");
    return;
  }

  if (typeof GMap2 == 'function') {
    this['mirai_insert_map'].apply(this);
  } else {
    var google_maps_loader = document.createElement("script");
    google_maps_loader.setAttribute("type", "text/javascript");
    google_maps_loader.setAttribute("src", "http://maps.google.com/maps?file=api&v=2.148&sensor=false&key=" + API_KEY + "&callback=mirai_insert_map&async=2&hl=" + getLanguage());
    document.body.appendChild(google_maps_loader);
  }
}

function mirai_insert_map() {
  /* Create GMap2 instance. */
  map = new GMap2(document.getElementById(MAP_TAG_ID), { });

  setMapCenter();
  setMapOptions();
  setMapControls();
  setMapMarkers();

  if (USE_STREET_VIEW ) {
    addStreetViewToMap();
  }
}

function setMapCenter() {
  if (SET_MAP_CENTER)
    map.setCenter(new GLatLng(parseFloat(MAP_CENTER_LAT), parseFloat(MAP_CENTER_LNG)), parseInt(ZOOM));
  else
    map.setCenter(new GLatLng(parseFloat(HOTEL_LAT), parseFloat(HOTEL_LNG)), parseInt(ZOOM));
}

function addStreetViewToMap() {
  street_view_panorama = new GStreetviewPanorama(document.getElementById(STREET_VIEW_TAG_ID));
  var pov;
  if (STREET_VIEW_PITCH !== '' && STREET_VIEW_YAW !== '' && STREET_VIEW_ZOOM !== '') {
    pov = {pitch:STREET_VIEW_PITCH, yaw:STREET_VIEW_YAW, zoom:STREET_VIEW_ZOOM};
  }
  street_view_panorama.setLocationAndPOV(new GLatLng(parseFloat(HOTEL_LAT), parseFloat(HOTEL_LNG)), pov);
}

function setMapOptions() {
  setMapType();

  map.enableDragging();
  map.enableInfoWindow();
  map.enableDoubleClickZoom();
  map.disableContinuousZoom();
  map.enableGoogleBar();

  map.addMapType(G_NORMAL_MAP);
  map.addMapType(G_SATELLITE_MAP);
  map.addMapType(G_HYBRID_MAP);
  map.addMapType(G_PHYSICAL_MAP);
  map.addMapType(G_SATELLITE_3D_MAP);
}

function setMapType() {
  if (SET_MAP_TYPE ){
    switch(MIRAI_MAP_TYPE) {
      case "satellite":
        map.setMapType(G_SATELLITE_MAP);
        break;
      case "normal":
        map.setMapType(G_NORMAL_MAP);
        break;
      case "hybrid":
        map.setMapType(G_HYBRID_MAP);
        break;
      case "physical":
        map.setMapType(G_PHYSICAL_MAP);
        break;
      default:
        alert("Unknow map type: "+ MIRAI_MAP_TYPE);
    }
  } else {
    map.setMapType(G_NORMAL_MAP);
  }
}

function setMapControls() {
  /* Add controls to the map. */
  var scale_control = new GScaleControl();
  map.addControl(scale_control, new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(5, 44)));
  controls['scale'] = [scale_control, new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(5, 44))];
  var map_control_type = new GLargeMapControl3D();
  if (USE_SMALL_ZOOM_CONTROL) {
    map_control_type = new GSmallMapControl();
  }
  map.addControl(map_control_type);
  controls['map_control_type'] = map_control_type;
  var overview_control = new GOverviewMapControl();
  map.addControl(overview_control);
  controls['overview'] = overview_control;
  overview_control.hide(true);

  var mapControl = new GHierarchicalMapTypeControl();
  mapControl.clearRelationships();
  mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, translations['labels'][getLanguage()], true);
  map.addControl(mapControl, new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(6,7)));
}

function setMapMarkers() {
  var map_icons = createMapIcons();

  map.markers = new Array();

  if (MULTI) {
    var bounds = new GLatLngBounds();
    for(i in MULTI_ARRAY){
      var mlat = MULTI_ARRAY[i][0];
      var mlng = MULTI_ARRAY[i][1];
      var minfohtml = MULTI_ARRAY[i][2];
      var minfosize = MULTI_ARRAY[i][3];
      var marker = createMarker(map, map_icons[i], mlat, mlng, minfohtml, minfosize);
      map.addOverlay(marker);

      bounds.extend(new GLatLng(parseFloat(mlat), parseFloat(mlng )));
    }
    map.setZoom(map.getBoundsZoomLevel(bounds));
    map.setCenter(bounds.getCenter());
  }else{
    var marker = createMarker(map, map_icons[0], HOTEL_LAT, HOTEL_LNG, null, null);
    map.addOverlay(marker);
  }
}

function createMarker(map, icon, mlat, mlng, minfohtml, minfosize) {
  var options = { dragCrossMove: false, clickable: true, bouncy: false, bounceGravity: 1 };
  if (icon != null)
    options['icon'] = icon;
  var marker = new GMarker(new GLatLng(parseFloat(mlat), parseFloat(mlng)), options);
  marker.disableDragging();

  if (minfosize)
    marker.bindInfoWindowHtml("'" + minfohtml + "'", {maxWidth:"'" + minfosize + "'"});
  else if (minfohtml)
    marker.bindInfoWindowHtml("'" + minfohtml + "'");

  map.markers.push(marker);
  return marker;
}

function createMapIcons() {
  var map_icons = new Array();
  var num_icons = MULTI ? MULTI_ARRAY.length: 1;
  for(var i=0; i<num_icons; i++){
      map_icons.push(createDefaultMapIcon());
  }

  return map_icons;
}

function createDefaultMapIcon() {
  var icon = new GIcon(G_DEFAULT_ICON);
  if (USE_CUSTOM_ICON){
    icon.image = MIRAI_CUSTOM_ICON;
    icon.iconSize = new GSize(CUSTOM_ICON_DIMENSIONS[0], CUSTOM_ICON_DIMENSIONS[1]);
  }
  return icon;
}

