function settings() {

  // take from URL string or use defaults defined here
  if(!(this.alat=parseFloat(getURLParam("alat")))) {
    if(google.loader.ClientLocation) this.alat=google.loader.ClientLocation.latitude;
    else this.alat=-41.272904;
  }
  if(!(this.alng=parseFloat(getURLParam("alng")))) {
    if(google.loader.ClientLocation) this.alng=google.loader.ClientLocation.longitude;
    else this.alng=174.870415;
  }
  if(!(this.zoom=parseInt(getURLParam("zoom")))) { 
    this.zoom=11;
  }
  if(!(this.blat=parseFloat(getURLParam("blat")))) this.blat=41.272904;
  if(!(this.blng=parseFloat(getURLParam("blng")))) this.blng=354.870415;
  if(!(this.panMode=getURLParam("panMode"))) this.panMode='linked';
  if(!(this.viewMode=getURLParam("viewMode"))) this.viewMode='horiz';
  if(!(this.opacity=parseFloat(getURLParam("opacity")))) this.opacity=0.5;
  if(!(this.mapControl=getURLParam("mapControl"))) this.mapControl=1;
  if(!(this.atype=getURLParam("atype"))) this.atype='m';
  if(!(this.btype=getURLParam("btype"))) this.btype='m';
}



// function to parse URL parameters
function getURLParam(strParamName){
  var strReturn = "";
  var strHref = window.location.href;
  var bFound=false;
	  
  var cmpstring = strParamName + "=";
  var cmplen = cmpstring.length;

  if ( strHref.indexOf("?") > -1 ){
    var strQueryString = strHref.substr(strHref.indexOf("?")+1);
    var aQueryString = strQueryString.split("&");
    for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
      if (aQueryString[iParam].substr(0,cmplen)==cmpstring){
        var aParam = aQueryString[iParam].split("=");
        strReturn = aParam[1];
        bFound=true;
        break;
      }
      
    }
  }
  if (bFound==false) return null;
  return strReturn;
}



function getWindowSize() {
  if(!window.innerWidth) {
    if(!(document.documentElement.clientWidth == 0)) {
      //strict mode
      sWidth = document.documentElement.clientWidth;
      sHeight = document.documentElement.clientHeight;
    } else {
      //quirks mode
      sWidth = document.body.clientWidth;
      sHeight = document.body.clientHeight;
    }
  } else {
    //w3c
    sWidth = window.innerWidth;
    sHeight = window.innerHeight;
  }
}




function moveWindow(twindow,twidth,theight,ttop,tleft,topacity,tzindex) {
      $("#"+twindow).css({ 
        width: twidth+"px",
        height: theight+"px",
        top: ttop+"px",
        left: tleft+"px",
        opacity: topacity,
        zIndex: tzindex
      });
}




function positionMapFrames(currentmode) {
  // if called with arg, set viewMode and redraw
  // otherwise use current settings
  if(currentmode) settings.viewMode=currentmode;
  else currentmode=settings.viewMode;

  getWindowSize();

  var sidebarWidth=331; // use frames
  var controlsHeight=0;

  var fullHeight=(sHeight-controlsHeight<controlsHeight)?controlsHeight:sHeight-controlsHeight;
  var halfHeight=fullHeight/2;
  var fullWidth=(sWidth-sidebarWidth<sidebarWidth)?sidebarWidth:sWidth-sidebarWidth;
  var halfWidth=fullWidth/2;

  // remember map centers before resizing divs
  var oldCentera=mapa.getCenter();
  var oldCenterb=mapb.getCenter();

  switch(currentmode) {
    case 'horiz':
      moveWindow("mapa",fullWidth,halfHeight,controlsHeight,sidebarWidth,1,1);
      moveWindow("mapb",fullWidth,halfHeight,controlsHeight+halfHeight,sidebarWidth,1,1);
      $("#hdivide").show();
      $("#vdivide").hide();
    break;
    case 'vert':
      moveWindow("mapa",halfWidth,fullHeight,controlsHeight,sidebarWidth,1,1);
      moveWindow("mapb",halfWidth,fullHeight,controlsHeight,sidebarWidth+halfWidth,1,1);
      $("#vdivide").show();
      $("#hdivide").hide();
    break;
    case 'overlay':
      if(settings.mapControl==1){
        moveWindow("mapa",fullWidth,fullHeight,controlsHeight,sidebarWidth,1-settings.opacity,2);
	moveWindow("mapb",fullWidth,fullHeight,controlsHeight,sidebarWidth,1,1);
      } else {
        moveWindow("mapa",fullWidth,fullHeight,controlsHeight,sidebarWidth,1,1);
	moveWindow("mapb",fullWidth,fullHeight,controlsHeight,sidebarWidth,settings.opacity,2);
      }
      $("#hdivide").hide();
      $("#vdivide").hide();
    break;
  }
  
  mapa.recenterCrosshairs();
  mapb.recenterCrosshairs();
  // redisplay maps at new sizes
  // shift centers to match previous canvas size
  mapa.checkResize();
  mapb.checkResize();
  mapa.setCenter(oldCentera);
  mapb.setCenter(oldCenterb);

}




function urltype2maptype(urltype) {
  switch(urltype) {
    case 'k':
      return G_SATELLITE_MAP;    
    case 'h':
      return G_HYBRID_MAP;
    case 'p':
      return G_PHYSICAL_MAP;
    case 's':
      return G_SKY_VISIBLE_MAP;
    case 'o':
      return G_MOON_VISIBLE_MAP;
    case 'a':
      return G_MARS_VISIBLE_MAP; 
   default:
     return G_NORMAL_MAP;
  }
}




// pan secondary map to match one being moved
// weirdness at high latitudes due to map projection
// also, secondary map should really be upside down
// only central point is located correctly!
function syncMaps(map) {

    var here = map.getCenter();
    var zoom = map.getZoom();

    var linkedMap = (map.id=='a') ? mapb : mapa ;

    // determine how to move linked map
    if (settings.panMode == 'fixed') {
      // move linked to opposite side of world
      var panTo = invertCoords(here);
    }
    else if (settings.panMode == 'linked') {
      // move linked by same change in coords
      var dLat = here.lat()-map.oldCoords.lat();
      var dLng = here.lng()-map.oldCoords.lng();
      var panTo = new GLatLng(linkedMap.oldCoords.lat()+dLat, linkedMap.oldCoords.lng()+dLng);
    }
    else {
      // zoom only (use existing coords)
      var panTo = linkedMap.getCenter();
    }

    // lock required to prevent recursive loop
    allowSync=false;
    linkedMap.setCenter(panTo,zoom);
    mapa.oldCoords = mapa.getCenter();
    mapb.oldCoords = mapb.getCenter();
    allowSync=true;

}




// find the other side of the world
function invertCoords(coords) {

  var newlat = -coords.lat();
  var newlng = coords.lng()+180;

  return new GLatLng(newlat,newlng);
}




// recenters secondary map when switching back to fixed mode
function setSyncMode(mode) {
  settings.panMode = mode;
  if (mode == 'fixed') {
    mapb.setCenter(invertCoords(mapa.getCenter()));
  }

  return true;
}




function doSearch(addressbox, map) {
 if (geocoder) {
   geocoder.getLatLng(
     $(addressbox).val(),
     function(point) {
       if (!point) {
         failedSearch(addressbox);
       } else {
         // if linked, unlink just for the search
         // (not meaningful to shift 2nd map by same amount as searched window)
         if (settings.panMode=='linked') {
           settings.panMode='free';
           map.panTo(point);
           settings.panMode='linked';

         } else map.panTo(point);
       }
     }
   );

 }


}




function failedSearch(addressbox) {

//  alert(addressbox.val() + " not found"+addressbox);
  var failedAddress = $(addressbox).val();
  
  $(addressbox).attr("value","Address not found");
  $(addressbox).css({'background-color':'#f00'});
  $(addressbox).animate({opacity: "1"},700,"linear",function() {
  $(addressbox).attr("value",failedAddress);
  $(addressbox).css({'background-color':'#fff'});
  $(addressbox).select();
  });





// setTimeout("addressbox.css({'background-color':'#f00'});addressbox.attr("value","Address not found");",1000);
//addressbox.css({'background-color':'#fff'});
//addressbox.attr("value",failedAddress);

//  addressbox.animate({
//    background-color: "#f00"
//  },1500);

  return false;
}


// modify map opacity
function changeOpacity (ui) {
  settings.opacity=ui.value/100;
  if(settings.mapControl==1) {
    $('#mapa').css({ opacity:1-ui.value/100})
  } else {
    $('#mapb').css({ opacity:ui.value/100})
  }
}

function toggleOverlayMode(animate) {
  var speed = (animate) ? "slow" : "";
  if(settings.viewMode=='overlay') {
    $('#opacitycontrol').show(speed);
  }
  else {
    $('#opacitycontrol').hide(speed);
  }
}

// switches opacity and z-index to use other maps controls
function setMapControl(mode) {
  settings.mapControl = mode;
  if (mode == 1) {
    var op = 1 - $('#mapb').css("opacity");
    $('#mapa').css({ zIndex:"2", opacity:op});
    $('#mapb').css({ zIndex:"1", opacity:"1.0"});   
  } else if (mode == 2) {
    var op = 1 - $('#mapa').css("opacity");
    $('#mapa').css({ zIndex: "1", opacity:"1.0"});
    $('#mapb').css({ zIndex: "2", opacity:op});
  }

}

// build a URL for current settings
function getURL() {
  // get current settings
  var alat = mapa.getCenter().lat();
  var alng = mapa.getCenter().lng();
  var blat = mapb.getCenter().lat();
  var blng = mapb.getCenter().lng();
  var zoom = mapa.getZoom();

  // get page url
  var url = location.href;
  var ind = url.indexOf('?');
  if (ind!=-1) url = url.substr(0,ind);

  // add settings to url string
  url += '?alat='+alat;
  url += '&alng='+alng;
  url += '&blat='+blat;
  url += '&blng='+blng;
  url += '&zoom='+zoom;
  url += '&panMode='+settings.panMode;
  url += '&viewMode='+settings.viewMode;
  url += '&opacity='+settings.opacity;
  url += '&mapControl='+settings.mapControl;
  url += '&atype='+mapa.getCurrentMapType().getUrlArg();
  url += '&btype='+mapb.getCurrentMapType().getUrlArg();

  return url;
}

