var map = null;
var geocoder = null;
var objXHRfindME = null;
var localSearch = null;
var searchControl = null;
var currentuser = null;
var currentip = null;
    
function OnLoad() {
   // Create a search control
   searchControl = new GSearchControl();
      
   // Add in a full set of searchers
   var options = new GsearcherOptions();
   options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
   localSearch = new GlocalSearch();
   searchControl.addSearcher(localSearch, options);
   

   // Find visitors location.  !!This will eventually feed into the
   // Geolocator service to set an initial search point
   GetMyIP();
   GetUserInformation();

   // Set the Local Search center point
   localSearch.setCenterPoint("Ypsilanti, MI");

   // Tell the searcher to draw itself and tell it where to attach
   searchControl.draw(document.getElementById("searchcontrol"));

   // establish a keep callback
   searchControl.setOnKeepCallback(this, SaveToFavorites, "<div id='AddList'>Add to My Favorite Places</div>");

   ReadFromFavorites();
}

function load() {
   if (GBrowserIsCompatible()) {
      map = new GMap2(document.getElementById("map"));
      map.addControl(new GLargeMapControl());
      map.addControl(new GMapTypeControl());

      GEvent.addListener(map, "click", function(marker, point) {
      if (marker) {
         //marker.openInfoWindowHtml("Thanks for clicking!");
         //map.removeOverlay(marker);
      } else {
         //map.addOverlay(new GMarker(point));
      }
   });

   geocoder = new GClientGeocoder();
      
   OnLoad();
   }
}

function showAddress(address, description) {
    geocoder = new GClientGeocoder();
    if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              alert(address + " not found");
            } else {
              //map.setCenter(point, 13);
              var marker = new GMarker(point);
              map.addOverlay(marker);
              GEvent.addListener(marker, "click", function() {
                 marker.openInfoWindowHtml("<p class='iwindow'>" + description + " <br /> " + address + "</p>"); 
              });
              marker.openInfoWindowHtml("<p class='iwindow'>" + description + " <br /> " + address + "</p>");
            }
          }
        );
    }
}


// Respond to user clicking on link below search result listing
function ResultHandler(result) {

    // add to map
    var strAddress = result.streetAddress + ", " + result.city + " " + result.region;
    var strDescription = result.titleNoFormatting;
    showAddress(strAddress, strDescription);

    var dElement = document.createElement("div");
    dElement.setAttribute("class", "resData");
    dElement.setAttribute("classname", "resData");
    dElement.setAttribute("onClick", "RemoveFavorite(\"" + escape(strDescription) + "\")");

    var aLink = document.createElement("a");
 //   aLink.setAttribute("href", result.url);
    aLink.appendChild(document.createTextNode(result.titleNoFormatting));

    var dTitle = document.createElement("div");
    dTitle.setAttribute("class", "resTitle");
    dTitle.setAttirbute("classname", "resTitle");
    dTitle.appendChild(aLink);

    dElement.appendChild(dTitle);

    var dAddress = document.createElement("div");
    dAddress.setAttribute("class", "resAddress");
    dAddress.setAttribute("classname", "resAddress");
    var textdata = document.createTextNode(result.streetAddress);
    dAddress.appendChild(textdata);

    dElement.appendChild(dAddress);
    
    // attach it
    var savedResults = document.getElementById("saved_results");
    savedResults.appendChild(dElement);
   
    // Save List of Favorites
    //SaveFavorites();

    SaveToFavorites(result);

}

/** Get information about the current user/visitor.
 *  First, check whether a "user" exists from GET (in case
 *  user wants to save as a shortcut, instead of relying on
 *  cookies.
 *  Check if cookie exists.  If so, retrieve user data
 *  from db..currently just username and prefered zip code
 *  Update user visit information...increase visit count.
 *  This code should be only be called on initial page load
 *  or on user login event.
 *  The login text box will be filled with the "current" user.
 *  The visitor may easily change their login id by simply typing
 *  a new user id.  NOTE: The current db logic is not very secure
 *  and an evil person could easily wreak havok on the entire system
 */

function GetUserInformation() {
   //-- currentuser : global variable identify current visitor/user

   //-- Check for "user" set by a GET
   // ENHANCEMENT FOR ITERATION 3
   // getQueryVariable("user")
   currentip   = document.loginform.currentip.value;
   currentuser = (readCookie("user")) ? readCookie("user") : currentip;

   //-- Display visitor location
   replaceText(document.getElementById("MyIpPlaceholder"), "Your IP address is " + currentip + ".");
   GetMyLocation(currentip);

   //-- Display current user in textbox
   document.loginform.username.value = currentuser;

}


function GetMyIP() {
   //-- briefly drop into php to grab visitors ip
   return "<?php echo(getenv('REMOTE_ADDR')); ?>";

 /**  Old code using XHR to determine IP address
   *  Obsolete since we can get same info from 
   *  current page...

    objXHRfindME = createRequest();
    var currTime = new Date();
    var url = "/scripts/myip.php?tor=" + currTime.getTime();

    objXHRfindME.open("GET", url, true);
    objXHRfindME.onreadystatechange = OnMyIP;
    objXHRfindME.send(null);

   */
}

function OnMyIP() {
    if (objXHRfindME.readyState ==4) {
    var myipaddress = objXHRfindME.responseText;
    replaceText(document.getElementById("MyIpPlaceholder"), "Your IP address is " + myipaddress + ".");
    //alert(myipaddress);
  //  createCookie("user", myipaddress, 30);
    GetMyLocation(myipaddress);
  }
}

function GetMyLocation(ipaddress) {
  //alert (ipaddress);
  objXHRfindME = createRequest();
  var currTime = new Date();

  // Used the following line for troubleshooting problem with repsonding to geolocator failing to find ip/city match
  //ipaddress = "71.238.87.196";

  var url = "/scripts/mylocation.php?ip=" + ipaddress + "&tor=" + currTime.getTime();

  objXHRfindME.open("GET", url, true);
  objXHRfindME.onreadystatechange = OnMyLocation;
  objXHRfindME.send(null);
}

function OnMyLocation() {
// Need to re-evaluate the reading of the xml response to include namespace information

  if (objXHRfindME.readyState ==4) {

    var xmlLocation = objXHRfindME.responseXML;
    var resLocation = xmlLocation.getElementsByTagName("name");
    //alert(resLocation.length);
    if (resLocation.length == 0) {
      var resLocation = xmlLocation.getElementsByTagName("gml:name");
    }
    //alert(resLocation.length);
    var location = resLocation[1].childNodes[0].nodeValue;
    replaceText(document.getElementById("MyLocPlaceholder"), "You are located in " + location + ".");
    
    // If geolocater couln't determine city, then default to Ypsi
    // Recent change from api.hostip.info site to respond differently?
    if ((location == "(Unknown city)") || (location == "(Unknown City?)")) {
       location = "Ypsilanti, MI";
    }
    CenterMap(location);
  }
}

function SaveToFavorites(result) {
  objXHRsaveResults = createRequest();
  var currTime = new Date();
  var favoritedata = "?userid="     + readCookie("user")
                   + "&favoriteid=" + result.titleNoFormatting
                   + "&address="    + result.streetAddress
                   + "&city="       + result.city
                   + "&state="      + result.region
                   + "&zip="        + "48000"
                   + "&lat="        + result.lat
                   + "&lon="        + result.lng
                   + "&url="        + result.url
                   + "&tor="        + currTime.getTime();

 // favoritedata = URLEncode(favoritedata);   
 // favoritedata = encodeURIComponent(favoritedata);
  var url = "/scripts/_addfavorite.php" + favoritedata;

  objXHRsaveResults.open("GET", url, true);
  objXHRsaveResults.onreadystatechange = OnFavoritesSaved;
  objXHRsaveResults.send(null);
}

function OnFavoritesSaved() {
    // Need to re-evaluate the reading of the xml response to include namespace information

    if (objXHRsaveResults.readyState ==4) {
      // alert("Processing has completed\n" + objXHRsaveResults.responseText );
	ReadFromFavorites();
    }
}

function ReadFromFavorites() {
  objXHRreadFavorites = createRequest();
  var currTime = new Date();
  var favoritedata = "?userid=" + readCookie("user") + "&tor=" + currTime.getTime();
  var url = "/scripts/_readfavorites.php" + favoritedata;

  objXHRreadFavorites.open("GET", url, true);
  objXHRreadFavorites.onreadystatechange = OnFavoritesRead;
  objXHRreadFavorites.send(null);

}

function OnFavoritesRead() {
    if (objXHRreadFavorites.readyState ==4) {
     //  alert("Processing has completed\n" + objXHRreadFavorites.responseText );
        ParseFavorites(objXHRreadFavorites.responseXML);
    }

}

function RemoveFavorite(favorite) {
  objXHRremoveFavorite = createRequest();
  var currTime = new Date();
  var favoritetoremove = "?userid=" + readCookie("user")
                       + "&favoriteid=" + unescape(favorite)
                       + "&tor=" + currTime.getTime();
  var url = "/scripts/_removefavorite.php" + favoritetoremove;
 // alert (url);
  objXHRremoveFavorite.open("GET", url, true);
  objXHRremoveFavorite.onreadystatechange = OnFavoriteRemoved;
  objXHRremoveFavorite.send(null);

}

function OnFavoriteRemoved() {
    if (objXHRremoveFavorite.readyState ==4) {
      // alert("Processing has completed\n" + objXHRremoveFavorite.responseText );
      ReadFromFavorites();
    }

}


function loginuser() {
   eraseCookie("user");
   createCookie("user", document.loginform.username.value, 30);
//   alert(readCookie("user"));
   ReadFromFavorites();
}



function ParseFavorites(xmlFavorites) {

   //-- start by clearing existing results
   var savedResults = document.getElementById("saved_results");
   removeChildNodes(savedResults);

   // var xml = xmldoc;
   var favorites = xmlFavorites.getElementsByTagName('item');
   var favorite;
   var title = "";

   var node = '';
   var location = '';
   var stuff = '';

   // Iterate through favorite items
   for (var i = 0; i < favorites.length; i++){
      favorite = favorites.item(i).getElementsByTagName("title");
      title       = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("description");
      description = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("address");
      address     = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("city");
      city        = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("state");
      state       = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("zip");
      zip         = favorite.item(0).childNodes[0].nodeValue;

//    favorite = favorites.item(i).getElementsByTagName("phone");
//    phone       = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("lat");
      lat         = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("lon");
      lon         = favorite.item(0).childNodes[0].nodeValue;

      favorite = favorites.item(i).getElementsByTagName("link");
      link        = favorite.item(0).childNodes[0].nodeValue;


// Construct html table

     var dElement = null;
    
     //-- Crazy workaround for MS  problem
     try {

        if ((i/2) == (Math.round(i/2))) {
           dElement = document.createElement("<div class='resData'>");
        } else {
           dElement = document.createElement("<div class='resDataAlt'>");
        }

     } catch(err) {

        dElement = document.createElement("div");
        if ((i/2) == (Math.round(i/2))) {
           dElement.setAttribute("class", "resData");
        } else {
           dElement.setAttribute("class", "resDataAlt");
        }
     }


     //-- Create link to open info window on screen

     var aLink = document.createElement("a");
// old link     aLink.setAttribute("href", link);
     aLink.setAttribute("href", "javascript:showAddress(\""
          + address + ", " + city + ", " + state + "\", \"" + title + "\")"); 
     aLink.appendChild(document.createTextNode(title));

     //-- DIV's have to be created in a unique way because of MS
     //-- This is the Results Title Div for the business name
     var dTitle = null;
     try {
        dTitle = document.createElement("<div class='resTitle'>");
     } catch(err) {
        dTitle = document.createElement("div");
        dTitle.setAttribute("class", "resTitle");
     }
     dTitle.appendChild(aLink);


     dElement.appendChild(dTitle);


     //-- Another wacky div creation thanks to MS
     var dAddress = null;
     try {
        dAddress = document.createElement("<div class='resAddress'>");
     } catch(err) {
        dAddress = document.createElement("div");
        dAddress.setAttribute("class", "resAddress");
     }
     var textdata = document.createTextNode(address + " - " + city + ", " + state + " " + zip);
     dAddress.appendChild(textdata);
     dElement.appendChild(dAddress);

     var dDelete = null;
     try {
        dDelete = document.createElement("<a class='resDeletion'>");

     } catch(err) {

        dDelete = document.createElement("a");
        dDelete.setAttribute("class", "resDeletion");
     }
     dDelete.setAttribute("href", "javascript:RemoveFavorite(\"" + escape(title) + "\")");

     var textdata = document.createTextNode("Remove Favorite");
     dDelete.appendChild(textdata);

     dElement.appendChild(dDelete);
    
     //-- Place the reconstructed nodes back into the savedResults div
     savedResults.appendChild(dElement);
 
  }
}


function CenterMap(location) {
      geocoder = new GClientGeocoder();

      if (geocoder) {
        geocoder.getLatLng(
          location,
          function(point) {
            if (!point) {
              alert(location + " not found");
            } else {
              map.setCenter(point, 13);
              localSearch.setCenterPoint(location);

              // Tell the searcher to draw itself and tell it where to attach
         //     searchControl.draw(document.getElementById("searchcontrol"));

              // establish a keep callback
         //     searchControl.setOnKeepCallback(this, ResultHandler, "<div id='AddList'>Add to My Favorite Places</div>");

              // Execute an inital search
              searchControl.execute("Pizza");

              var marker = new GMarker(point);
              map.addOverlay(marker); 
            }
          }
        );
      }       
}

function SaveFavorites___DELETETHIS() {
   favorites = document.getElementById("saved_results").innerHTML;
   favorites = escape(favorites);
   var cookiename="favlist";
   createCookie(cookiename, favorites, 365);

}

function ReadFavorites___DELETETHIS() {
   var favorites = readCookie("favlist");
   if (favorites != null) {
     //objFavorites = 
     objFavorites = unescape(favorites);
     //alert(objFavorites);

     document.getElementById("saved_results").innerHTML = objFavorites;
   }
}

function ClearFavorites___DELETETHIS() {
   div_saved_results = document.getElementById("saved_results");
   removeChildNodes(div_saved_results);

   var cookiename = "favlist";
   eraseCookie(cookiename);

}


function createCookie(cookiename,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = cookiename+"="+value+expires+"; path=/";
}

function readCookie(cookiename) {
	var nameEQ = cookiename + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(cookiename) {
	createCookie(cookiename,"",-1);
}

