var gmap = null;
var geocoder = null;
var xmlHttp = null;
var addressSearchHandler = null;

addLoadEvent(init, window);
addUnloadEvent(GUnload, window);

function init() {

  gmap = new GMap2($("yield_data_map"));
  geocoder = new GClientGeocoder();
  xmlHttp = getXmlHTTPObject();
  var markerFuture = new MarkerFuture(gmap);
  var startupMarkerFuture = new MarkerFuture(gmap);
  var mapUpdater = new MapUpdater(gmap, markerFuture);
  var startupMapUpdater = new MapUpdater(gmap, startupMarkerFuture);
  var startupMapGeocoder = new MapGeocoder(geocoder, new GeocodeCallbackHandler(gmap, startupMarkerFuture));
  var mapGeocoder = new MapGeocoder(geocoder, new GeocodeCallbackHandler(gmap, markerFuture));
  var infoPaneUpdater = new InfoPaneUpdater($('yield_data_content'));
  var showOrHideDiv = new ShowOrHideDivXMLHandler($('yield_data_wrapper'),
                                                  $('yield_data_zip_wrapper'),
                                                  $('yield_data_content'),
                                                  $('yield_data_content_unknown'));
  var userInputUpdater = new UserInputUpdaterXMLHandler($('crop'), $('zip'));


  var startupHandlerArray = [userInputUpdater, showOrHideDiv, startupMapUpdater, startupMapGeocoder, infoPaneUpdater];
  var startupXMLHandler = new CompositeXMLHandler(startupHandlerArray);

  var handlerArray = [userInputUpdater, showOrHideDiv, mapUpdater, mapGeocoder, infoPaneUpdater];
  var xmlHandler = new CompositeXMLHandler(handlerArray);

  setup(gmap, xmlHttp, startupXMLHandler, xmlHandler, markerFuture);
}

function setup(googlemap, xmlHttpObj, startupXMLHandler, xmlHandler, markerFuture){
  googlemap.setCenter(UNITED_STATES_LAT_LONG, UNITED_STATES_ZOOM_LEVEL); //default view, centered over the United States
  googlemap.addControl(new GSmallMapControl());
  googlemap.disableDoubleClickZoom();
  var setupSmartServiceCallbackHandler = new SmartServiceCallbackHandler(xmlHttpObj, startupXMLHandler);  
  invokeSmartService("/yieldreport/servlet/gmap/iprSearch?random="+Math.random(), setupSmartServiceCallbackHandler);
  addressSearchHandler = new AddressSearchHandler(new InactiveGeocoder(), new GeocodeCallbackHandler(googlemap, markerFuture), new SmartServiceCallbackHandler(xmlHttpObj, xmlHandler), invokeSmartService );
  //$('updateButton').onclick = updateButtonClicked;
  //$('goButton').onclick = goButtonClicked;
}

function invokeSmartService(url, smartServiceCallbackHandler){
  xmlHttp.open("GET", url, true);
  xmlHttp.onreadystatechange = function(){
    smartServiceCallbackHandler.callback();
  };
  xmlHttp.send(null);
}

//function updateButtonClicked(){
//  addressSearchHandler.doSearch($("zip").value, $("crop").value);
//}


//function goButtonClicked(){
//  addressSearchHandler.doSearch($("goZip").value, $("goCrop").value);
//}

/*
var zipDefaultBackgroundColor = null;
var cropDefaultBackgroundColor = null;
function validateZipAndCrop(zipId, cropId) {

    var zipInput = $(zipId);
    var zipValue = zipInput.value.trim();

    if (zipValue == "") {
        if (zipDefaultBackgroundColor == null) {
            zipDefaultBackgroundColor = zipInput.style.backgroundColor;
        }
        zipInput.style.backgroundColor="red";
        zipInput.value = zipValue;
    } else {
        zipInput.style.backgroundColor = zipDefaultBackgroundColor;
    }

    var cropInput = $(cropId);
    var cropValue = cropInput.value;

    if (cropValue == "") {
        if (cropDefaultBackgroundColor == null) {
            cropDefaultBackgroundColor = cropInput.style.backgroundColor;
        }
        cropInput.style.backgroundColor="red";
    } else {
        cropInput.style.backgroundColor = cropDefaultBackgroundColor;
    }
}
*/