var NUM_EAT = 12;
var NUM_DRINK = 8;
var NUM_PLAY = 10;
var tabDecoder = ['meet', 'eat', 'drink', 'play'];

var container;
var map;
var results;
var startPoint = new GLatLng(48.6929893493652, -97.3350067138672);

var lastAddress = [];
var pointMarkers = [];
var letterIcons = [];
var numberIcons = [];

var yLocalResults = [];
var gLocalResults = [];
var entryLocations = [];
var geocoders = [];

var midMarkerIcon;
var midMarker;
var oldMidMarker = null;

var staticMidpoint;
var lastSearch;
var lastType = "none";
var lastAvoidCheck;

var gLocalSearch;
//var gAdsManager;

var xmlHttp = GetXmlHttpObject();

var oldhighwaycheck = false;
var directions;

function lat49Update(){
    var bnds = map.getBounds();
    var center = bnds.getCenter();
    var lat = center.lat();
    var lon = center.lng();
    
    try {
        var zoomlevel = Lat49.Tile.convertGMap2Zoom(map.getZoom());
        Lat49.updateAdByLatLon("mapad", lat, lon, zoomlevel);
    } 
    catch (e) {
    }
}

function doLoad(){
    if (GBrowserIsCompatible()) {
        //make sure the spinner and the link text is off
        $("infobar").setStyle("display", "none");
        $("searchtypes").setStyle("display", "none");
        $("link").setStyle("visibility", "hidden");
        
        container = document.getElementById("map_canvas");
        results = document.getElementById("results");
        
        map = new GMap2(container);
        map.addControl(new GScaleControl());
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.enableScrollWheelZoom()
		
        //Enable Google Searching
        gLocalSearch = new GlocalSearch();
        gLocalSearch.setResultSetSize(GSearch.LARGE_RESULTSET);
        gLocalSearch.setSearchCompleteCallback(this, handleGoogleResults);
        
        for (var i = 0; i < 8; i++) {
            letterIcons[i] = new GIcon();
            letterIcons[i].image = "images/blue_Marker" + String.fromCharCode(i + 65) + "_small.png";
            letterIcons[i].shadow = "images/letter_shadow.png";
            letterIcons[i].iconSize = new GSize(15, 26);
            letterIcons[i].shadowSize = new GSize(29, 26);
            letterIcons[i].iconAnchor = new GPoint(7, 26);
            letterIcons[i].infoWindowAnchor = new GPoint(7, 1);
        }
        
        for (var i = 0; i < 4; i++) {
            numberIcons[i] = new GIcon();
            numberIcons[i].image = "images/marker_" + String.fromCharCode(i + 49) + ".png";
            numberIcons[i].shadow = "images/marker_shadow.png";
            numberIcons[i].iconSize = new GSize(15, 26);
            numberIcons[i].shadowSize = new GSize(28, 26);
            numberIcons[i].iconAnchor = new GPoint(6, 25);
            numberIcons[i].infoWindowAnchor = new GPoint(6, 0);
            numberIcons[i].transparent = "images/marker_" + String.fromCharCode(i + 49) + ".png";
            
            geocoders[i] = new GClientGeocoder();
        }
        
        
        midMarkerIcon = new GIcon();
        midMarkerIcon.image = "images/arrow.png";
        midMarkerIcon.shadow = "images/arrow_shadow.png";
        midMarkerIcon.iconSize = new GSize(21, 34);
        midMarkerIcon.shadowSize = new GSize(39, 34);
        midMarkerIcon.iconAnchor = new GPoint(10, 34);
        midMarkerIcon.infoWindowAnchor = new GPoint(10, 0);
        midMarkerIcon.transparent = "images/arrow.png";
        
		map.setCenter(startPoint, 5);

        // alert('after set center = ' + window.getSize().y);
        //gAdsManager = new GAdsManager(map, myPubId, {
        //    maxAdsOnMap: "5",
        //    channel: "6200204468"
        //});
        //gAdsManager.enable();
        
        // alert('after ad enable = ' + window.getSize().y);
        
        //check to see if this was one that we need to load.
        if (location.search != "") {
            $("holder").setStyle("visiblity", "visible");
            $("searchtypes").setStyle("display", "none");
            $("infobar").setStyle("display", "block");
            doStaticLoad();
            $("infobar").setStyle("display", "none");
            $("searchtypes").setStyle("display", "block");
        }
        else {
            mooLoad(0);
        }
        // alert('after stuff = ' + window.getSize().y);
        resizeMap();
		
		if (google.loader.ClientLocation && google.loader.ClientLocation.latitude && 
			google.loader.ClientLocation.longitude) {
			map.setCenter(new GLatLng(parseFloat(google.loader.ClientLocation.latitude),
				parseFloat(google.loader.ClientLocation.longitude)), 5);
		}
		
		//Enable Lat49 ads
		try { //Wrap the Lat49 calls to avoid exceptions if the server is blocked
			Lat49.initAds('835');
			lat49Update();
		} 
		catch (e) {
		}
		GEvent.addListener(map, "moveend", lat49Update);
        GEvent.addListener(map, "click", lat49Update);
    }
}

function resizeMap(){
    if (map) {
        setPanelSize();
        map.checkResize();
    }
}

function cleanUpError(){
    $("link").setStyle("visibility", "hidden");
    $("searchtypes").setStyle("display", "none");
    $("infobar").setStyle("display", "none");
    
    //put the old midpoint back if we have it
    if (oldMidMarker != null) {
        map.addOverlay(oldMidMarker);
    }
}

function generateDirectionsError(){
    var sb = [];
    
    sb.push('<div class="error">');
    sb.push('Sorry, there was an error generating directions... try again in a minute or check your midpoint.');
    sb.push('</div>');
    results.innerHTML = sb.join('');
    cleanUpError();
}

function generateAddressError(add){
    var sb = [];
    
    sb.push('<div class="error">');
    sb.push('Sorry, we were unable to find Location ' + add + ' please check your locations and try again.');
    sb.push('</div>');
    results.innerHTML = sb.join('');
    cleanUpError();
}

function generateTooFewPointsError(){
    var sb = [];
    
    sb.push('<div class="error">');
    sb.push('Sorry, we can only rendeznew for you with two, three or four points.');
    sb.push('</div>');
    results.innerHTML = sb.join('');
    cleanUpError();
    map.clearOverlays();
}

function generateNoCatError(tab){
    var sb = [];
    
    sb.push('<div class="error">');
    sb.push('Sorry, please check at least one category on the ' + tab + ' tab, and try again.');
    sb.push('</div>');
    results.innerHTML = sb.join('');
    cleanUpError();
}

function directionsComplete(lastTab, cats, searchTerm, staticLoad, moveZoom){
    if (directions.getStatus().code == "200") {
        if (!staticLoad) {
            var midpoint = directions.getPolyline();
            var po = midpoint.getLength() / 2;
            var point = midpoint.GetPointAtDistance(po);
            map.setCenter(point);
            midMarker = new GMarker(point, {
                icon: midMarkerIcon,
                draggable: true
            });
            var infoHtml = "<br><font color='green'>This is your Midpoint: " + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng() + "<br><strong>Drag Me to rendeznew again!</strong></font>";
            GEvent.addListener(midMarker, "click", function(){
                midMarker.openInfoWindowHtml(infoHtml);
            })
            GEvent.addListener(midMarker, "dragstart", function(){
                map.closeInfoWindow();
            })
            GEvent.addListener(midMarker, "dragend", function(){
                infoHtml = "<br><font color='green'>This is your Midpoint: " + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng() + "<br><strong>Drag Me to rendeznew again!</strong></font>";
                staticMidpoint = new GLatLng(midMarker.getPoint().lat(), midMarker.getPoint().lng());
                showLocation(true, false);
            })
            map.addOverlay(midMarker);
            setMapForSearch();
        }
        else {
            useStaticMidPoint();
            if (moveZoom) {
                setMapForSearch();
            }
        }
        
        var dirs = directions.getPolyline();
        //dirs.setStrokeStyle(GPolyStyleOptions("#00FF00",3,0.5));
        map.addOverlay(dirs);
        
        if (lastTab != "meet") {
            updateMapWithCats(cats);
        }
        else {
            updateMap(searchTerm);
        }
    }
    return false;
}

function rendeznew(addressArray, searchTerm, searchType, staticLoad, moveZoom){
    lastAddress = addressArray;
    lastSearch = searchTerm;
    if (document.getElementById("meetbox").style.height == '1%') {
        lastTab = "meet";
    }
    else 
        if (document.getElementById("eatbox").style.height == '1%') {
            lastTab = "eat";
        }
        else 
            if (document.getElementById("drinkbox").style.height == '1%') {
                lastTab = "drink";
            }
            else 
                if (document.getElementById("playbox").style.height == '1%') {
                    lastTab = "play";
                }
    lastType = "none";
    
    var cats = [];
    if (lastTab == "eat") {
        for (var i = 0; i < NUM_EAT; i++) {
            if (document.forms[0].eat[i].checked == true) {
                cats.push(document.forms[0].eat[i].id);
            }
        }
    }
    else 
        if (lastTab == "drink") {
            for (var i = 0; i < NUM_DRINK; i++) {
                if (document.forms[0].drink[i].checked == true) {
                    cats.push(document.forms[0].drink[i].id);
                }
            }
        }
        else 
            if (lastTab == "play") {
                for (var i = 0; i < NUM_PLAY; i++) {
                    if (document.forms[0].play[i].checked == true) {
                        cats.push(document.forms[0].play[i].id);
                    }
                }
            }
    
    if (cats.length < 1 && lastTab != "meet") {
        generateNoCatError(lastTab);
        return;
    }
    
    lastType = searchType;
    
    //save search here
    if (!staticLoad) {
		document.getElementById('selected').value = -1;
        if (lastTab == "meet") {
            saveSearch(searchTerm, lastTab, lastType, addressArray.length, addressArray);
        }
        else {
            saveSearch(cats, lastTab, lastType, addressArray.length, addressArray);
        }
    }
    
    for (var i = 0; i < addressArray.length; i++) {
        geocoders[i] = new GClientGeocoder();
    }
    for (var i = addressArray.length; i < 4; i++) {
        geocoders[i] = null;
    }
    
    var id = 0;
    if (geocoders[0]) {
        geocoders[0].getLatLng(addressArray[0], function(point1){
            if (!point1) {
                generateAddressError(1);
            }
            else {
                entryLocations[id] = new EntryLocation(id, numberIcons[id], addressArray[id], point1.lat(), point1.lng());
                id++;
                if (geocoders[1]) {
                    geocoders[1].getLatLng(addressArray[1], function(point2){
                        if (!point2) {
                            generateAddressError(2);
                        }
                        else {
                            entryLocations[id] = new EntryLocation(id, numberIcons[id], addressArray[id], point2.lat(), point2.lng());
                            id++;
                            //here is where we would check for the other two if they are entered
                            if (addressArray.length > 2) {
                                if (geocoders[2]) {
                                    geocoders[2].getLatLng(addressArray[2], function(point3){
                                        if (!point3) {
                                            generateAddressError(3);
                                        }
                                        else {
                                            entryLocations[id] = new EntryLocation(id, numberIcons[id], addressArray[id], point3.lat(), point3.lng());
                                            id++;
                                            if (addressArray.length > 3) {
                                                if (geocoders[3]) {
                                                    geocoders[3].getLatLng(addressArray[3], function(point4){
                                                        if (!point4) {
                                                            generateAddressError(4);
                                                        }
                                                        else {
                                                            entryLocations[id] = new EntryLocation(id, numberIcons[id], addressArray[id], point4.lat(), point4.lng());
                                                            id++;
                                                            for (var i = 0; i < entryLocations.length; i++) {
                                                                map.addOverlay(entryLocations[i].marker());
                                                            }
                                                            
                                                            if (staticLoad) {
                                                                useStaticMidPoint();
                                                                if (moveZoom) {
                                                                    setMapForSearch();
                                                                }
                                                            }
                                                            else {
                                                                //Now that we are centered on the midpoint we can do our search
                                                                getMidPoint();
                                                            }
                                                            if (lastTab != "meet") {
                                                                updateMapWithCats(cats);
                                                            }
                                                            else {
                                                                updateMap(searchTerm);
                                                            }
                                                        }
                                                    });
                                                }
                                            }
                                            else {
                                                //At this point we found THREE addresses
                                                for (var j = 0; j < entryLocations.length; j++) {
                                                    map.addOverlay(entryLocations[j].marker());
                                                }
                                                
                                                if (staticLoad) {
                                                    useStaticMidPoint();
                                                    if (moveZoom) {
                                                        setMapForSearch();
                                                    }
                                                }
                                                else {
                                                    //Now that we are centered on the midpoint we can do our search
                                                    getMidPoint();
                                                }
                                                if (lastTab != "meet") {
                                                    updateMapWithCats(cats);
                                                }
                                                else {
                                                    updateMap(searchTerm);
                                                }
                                            }
                                        }
                                    });
                                }
                            }
                            else {
                                //At this point we found TWO addresses
                                for (var k = 0; k < entryLocations.length; k++) {
                                    map.addOverlay(entryLocations[k].marker());
                                }
                                
                                //here check for the type of direction search to do
                                var directionsPanel = document.getElementById("directions");
                                var fakeMap = document.getElementById("directionsmap");
                                directions = new GDirections(fakeMap, directionsPanel);
                                GEvent.addListener(directions, "error", function(){
									if (staticLoad) {
                                        useStaticMidPoint();
                                        if (moveZoom) {
                                            setMapForSearch();
                                        }
                                    }
                                    else {
                                        //Now that we are centered on the midpoint we can do our search
                                        getMidPoint();
                                    }
                                    if (lastTab != "meet") {
                                        updateMapWithCats(cats);
                                    }
                                    else {
                                        updateMap(searchTerm);
                                    }
                                    //generateDirectionsError();
                                });
                                GEvent.addListener(directions, "load", function(){
                                    directionsComplete(lastTab, cats, searchTerm, staticLoad, moveZoom);
                                });
                                
                                var waypoints = [];
                                waypoints.push("(" + entryLocations[0].getLatLng().lat() + "," + entryLocations[0].getLatLng().lng() + ")");
                                if (staticLoad) {
                                    waypoints.push(staticMidpoint.toString());
                                }
                                waypoints.push("(" + entryLocations[1].getLatLng().lat() + "," + entryLocations[1].getLatLng().lng() + ")");
                                var opts = {};
                                if (document.forms[0].avoidhighways.checked == true) {
                                    opts.avoidHighways = true;
                                    lastAvoidCheck = true;
                                }
                                else {
                                    opts.avoidHighways = false;
                                    lastAvoidCheck = false;
                                }
                                directions.loadFromWaypoints(waypoints, opts);
                            }
                        }
                    });
                }
            }
        });
    }
}

function useStaticMidPoint(){
    midMarker = new GMarker(staticMidpoint, {
        icon: midMarkerIcon,
        draggable: true
    });
    var infoHtml = "<br><font color='green'>This is your Midpoint: " + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng() + "<br><strong>Drag Me to rendeznew again!</strong></font>";
    GEvent.addListener(midMarker, "click", function(){
        midMarker.openInfoWindowHtml(infoHtml);
    })
    GEvent.addListener(midMarker, "dragstart", function(){
        map.closeInfoWindow();
    })
    GEvent.addListener(midMarker, "dragend", function(){
        infoHtml = "<br><font color='green'>This is your Midpoint: " + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng() + "<br><strong>Drag Me to rendeznew again!</strong></font>";
        staticMidpoint = new GLatLng(midMarker.getPoint().lat(), midMarker.getPoint().lng());
        showLocation(true, false);
        //updateMap(lastSearch);
    })
    map.addOverlay(midMarker);
}

function getMidPoint(){
    var boundingPoints = new Array();
    for (var i = 0; i < entryLocations.length; i++) {
        boundingPoints[i] = entryLocations[i].getPoint();
    }
    var gPolyline = new GPolyline(boundingPoints);
    midPoint = gPolyline.getBounds().getCenter();
    
    midMarker = new GMarker(midPoint, {
        icon: midMarkerIcon,
        draggable: true
    });
    var infoHtml = "<br><font color='green'>This is your Midpoint: " + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng() + "<br><strong>Drag Me to rendeznew again!</strong></font>";
    GEvent.addListener(midMarker, "click", function(){
        midMarker.openInfoWindowHtml(infoHtml);
    })
    GEvent.addListener(midMarker, "dragstart", function(){
        map.closeInfoWindow();
    })
    GEvent.addListener(midMarker, "dragend", function(){
        infoHtml = "<br><font color='green'>This is your Midpoint: " + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng() + "<br><strong>Drag Me to rendeznew again!</strong></font>";
        staticMidpoint = new GLatLng(midMarker.getPoint().lat(), midMarker.getPoint().lng());
        showLocation(true, false);
        //updateMap(lastSearch);
    })
    map.addOverlay(midMarker);
    setMapForSearch();
}

function updateMap(searchTerm){
    // turn on spinner animation
    $("infobar").setStyle("display", "block");
    $("searchtypes").setStyle("display", "none");
    
    yLocalResults = new Array();
    gLocalResults = new Array();
    
    //YELP CALL
    var yelpRequestURL = constructYelpSearchURL(searchTerm);
    
    /* do the api request */
    var script = document.createElement('script');
    script.src = yelpRequestURL;
    script.type = 'text/javascript';
    var head = document.getElementsByTagName('head').item(0);
    head.appendChild(script);
    //END YELP
    
    //GOOGLE CALL
    var anothermap = new GMap2(document.getElementById("directionsmap"));
    anothermap.setCenter(midMarker.getLatLng());
    anothermap.setZoom(10);
    gLocalSearch.setCenterPoint(anothermap);
    
    if (searchTerm == "anything") {
        searchTerm = "restaurant";
    }
    gLocalSearch.execute(searchTerm);
    //END GOOGLE
    
    return false;
}

function updateMapWithCats(cats){
    // turn on spinner animation
    $("infobar").setStyle("display", "block");
    $("searchtypes").setStyle("display", "none");
    
    //clear the results area and arrays
    yLocalResults = new Array();
    gLocalResults = new Array();
    
    //YELP CALL
    var yelpRequestURL = constructYelpCategoryUrl(cats);
    
    /* do the api request */
    var script = document.createElement('script');
    script.src = yelpRequestURL;
    script.type = 'text/javascript';
    var head = document.getElementsByTagName('head').item(0);
    head.appendChild(script);
    //END YELP
    
    //GOOGLE CALL
    
    var anothermap = new GMap2(document.getElementById("directionsmap"));
    anothermap.setCenter(midMarker.getLatLng());
    anothermap.setZoom(10);
    gLocalSearch.setCenterPoint(anothermap);
    //gLocalSearch.setCenterPoint(map);
    var googleCatString = "";
    for (var i = 0; i < cats.length; i++) {
        if (i != 0) {
            googleCatString += " OR ";
        }
        if (cats[i] == "hotdogs") {
            googleCatString += '"fast food"';
        }
        else if (cats[i] == "icecream") {
                googleCatString += '"ice cream"';
            }
            else if (cats[i] == "juicebars") {
                    googleCatString += '"juice bar"';
                }
                else if (cats[i] == "sportsbars") {
                        googleCatString += '"sports bar"';
                    }
					else if (cats[i] == "jazzandblues") {
                            googleCatString += '"jazz club"';
                        }
						else 
                            if (cats[i] == "karaoke") {
                                googleCatString += '"karaoke bar"';
                            }
                            else 
                                if (cats[i] == "spas") {
                                    googleCatString += '"day spa"';
                                }
                                else 
                                    if (cats[i] == "danceclubs") {
                                        googleCatString += '"dance club"';
                                    }
                                    else 
                                        if (cats[i] == "comedyclubs") {
                                            googleCatString += '"comedy club"';
                                        }
                                        else 
                                            if (cats[i] == "bowling") {
                                                googleCatString += '"bowling alley"';
                                            }
                                            else 
                                                if (cats[i] == "galleries") {
                                                    googleCatString += '"art gallery"';
                                                }
                                                else 
                                                    if (cats[i] == "museums") {
                                                        googleCatString += "museum";
                                                    }
                                                    else 
                                                        if (cats[i] == "parks") {
                                                            googleCatString += "park";
                                                        }
                                                        else 
                                                            if (cats[i] == "zoos") {
                                                                googleCatString += "zoo";
                                                            }
                                                            else 
                                                                if (cats[i] == "indpak") {
                                                                    googleCatString += '"indian food"';
                                                                }
																else if (cats[i] == "italian") {
                                                                    googleCatString += '"italian food"';
                                                                }
																else if (cats[i] == "chinese") {
                                                                    googleCatString += '"chinese food"';
                                                                }
																else if (cats[i] == "greek") {
                                                                    googleCatString += '"greek food"';
                                                                }
																else if (cats[i] == "vegetarian") {
                                                                    googleCatString += '"vegetarian food"';
                                                                }
																else if (cats[i] == "mexican") {
                                                                    googleCatString += '"mexican food"';
                                                                }
																
                                                                else {
                                                                    googleCatString += cats[i];
                                                                }
    }
    gLocalSearch.execute(googleCatString);
    //END GOOGLE
    
    return false;
}

function fillAddressArray(num){
    var returnAddressArray = [];
    for (var i = 1; i <= num; i++) {
        var addNum = "add" + i;
        if (($(addNum).value) != ("Location " + i)) {
            returnAddressArray.push($(addNum).value);
        }
    }
    return returnAddressArray;
}

// showLocation() is called when you click on the Search button
// in the form.  It geocodes the address entered into the form
// and adds a marker to the map at that location.
function showLocation(staticLoad, moveZoom){
    $('holder').setStyle('visibility', 'visible');
    
    var npe = document.getElementById('numPoints');
    
    //TODO put back if do new stuff
    //var address  = fillAddressArray(npe.value);
    var address = fillAddressArray(4);
    
    var searchType = document.getElementById("searchselect").options[document.getElementById("searchselect").selectedIndex].value;
    
    //store the old midMarker if it exists before we move stuff
    if (midMarker) {
        oldMidMarker = midMarker;
    }
    
    //Clear all the old results
    map.clearOverlays();
    results.innerHTML = "";
    entryLocations = new Array();
    yLocalResults = new Array();
    gLocalResults = new Array();
    
    if (npe.value < 2 || npe.value > 4) {
        generateTooFewPointsError();
        return false;
    }
    
    rendeznew(address, document.forms[0].term.value, searchType, staticLoad, moveZoom);
}

///////////////////////////////////////////////////
//YELP STUFF
///////////////////////////////////////////////////

function constructYelpCategoryUrl(cats){
    var URL = "http://api.yelp.com/" +
    "business_review_search?" +
    "callback=" +
    "handleResults" +
    "&num_biz_requested=8" +
    "&lat=" +
    midMarker.getPoint().lat() +
    "&long=" +
    midMarker.getPoint().lng() +
    "&radius=" +
    getRadius() +
    "&ywsid=" +
    YWSID +
    "&category=";
    for (var i = 0; i < cats.length; i++) {
        if (i != 0) {
            URL += "+";
        }
        URL += cats[i];
    }
    return encodeURI(URL);
}

/*
 * Construct the URL to call for the API request
 */
function constructYelpSearchURL(searchTerm){

    var URL = "http://api.yelp.com/";
    if (searchTerm == "anything") {
        URL += "business_review_search?" +
        "callback=" +
        "handleResults" +
        "&num_biz_requested=8" +
        "&lat=" +
        midMarker.getPoint().lat() +
        "&long=" +
        midMarker.getPoint().lng() +
        "&radius=" +
        getRadius() +
        "&ywsid=" +
        YWSID;
    }
    else {
        URL += "business_review_search?" +
        "callback=" +
        "handleResults" +
        "&term=" +
        searchTerm +
        "&num_biz_requested=8" +
        "&lat=" +
        midMarker.getPoint().lat() +
        "&long=" +
        midMarker.getPoint().lng() +
        "&radius=" +
        getRadius() +
        "&ywsid=" +
        YWSID;
    }
    return encodeURI(URL);
}

function getRadius(){
    var latLngs = new Array();
    for (var i = 0; i < entryLocations.length; i++) {
        latLngs[i] = entryLocations[i].getPoint();
    }
    
    var gPolyline = new GPolyline(latLngs);
    
    radius = gPolyline.getBounds().getSouthWest().distanceFrom(gPolyline.getBounds().getNorthEast()) / (1609.344 * 8);
    if (radius >= 25) {
        radius = 25;
    }
    if (radius <= 0) {
        radius = 1;
    }
    return radius;
}

/*
 * If a sucessful Yelp API response is received, place
 * markers on the map.  If not, display an error.
 */
function handleResults(data){
    if (data.message.text == "OK") {
        if (data.businesses.length > 0) {
            yLocalResults = new Array();
            //results.innerHTML = "";
            //var id = 0;
            for (var i = 0; i < data.businesses.length; i++) {
                biz = data.businesses[i];
                if ( (biz.latitude == null && biz.longitude == null) || biz.is_closed == true) {
                    // Do nothing
                }
                else {
                    yLocalResults.push(new YelpLocalResult(i, biz.latitude, biz.longitude, biz.name, biz.address1, biz.address2, biz.city, biz.state, biz.zip, formatPhoneNumber(biz.phone), biz.rating_img_url_small, biz.avg_rating, biz.url, biz.review_count));
                }
            }
        }
    }
    
    //Now sort the results based on Review
    yLocalResults.sort(localResultsSortByReview);
	   
	//set the markers AFTER we sort
    for (var i = 0; i < yLocalResults.length; i++) {
        yLocalResults[i].marker(letterIcons[i]);
    }
	    
    if (lastType == "yelp") {
        populateScreen();
    }
}

/*
 * Formats the Yelp phone number HTML
 */
function formatPhoneNumber(num){
    if (num.length != 10) 
        return '';
    return '(' + num.slice(0, 3) + ') ' + num.slice(3, 6) + '-' + num.slice(6, 10);
}

//END YELP STUFF
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//GOOGLE STUFF
///////////////////////////////////////////////////

// Called when Local Search results are returned from Google
function handleGoogleResults(){
    // if we have local search results, put them on the map
    if (gLocalSearch.results && gLocalSearch.results.length > 0) {
        for (var k = 0; k < gLocalSearch.results.length; k++) {
            var result = gLocalSearch.results[k];
            // if this is a local search result, AND it is in our bounds then proceed...
            if (result.GsearchResultClass == GlocalSearch.RESULT_CLASS) {
                if (map.getBounds().containsLatLng(new GLatLng(result.lat, result.lng))) {
                    var phoneNumber = null;
                    if (result.phoneNumbers.length > 0) {
                        phoneNumber = result.phoneNumbers[0].number;
                    }
                    gLocalResults.push(new GoogleLocalResult(k, result.lat, result.lng, result.titleNoFormatting, result.streetAddress, result.city, result.region, phoneNumber, letterIcons[k]));
                }
            }
        }
    }
    if (lastType == "google") {
        populateScreen();
    }
}

function setMapForSearch(){
    var latLngs = new Array();
    for (var i = 0; i < entryLocations.length; i++) {
        latLngs[i] = entryLocations[i].getPoint();
    }
    latLngs[entryLocations.length] = midMarker.getPoint();
    var gPolyLine = new GPolyline(latLngs);
    var zoomlev = map.getBoundsZoomLevel(gPolyLine.getBounds());
    //if(zoomlev > 7) {
    //	zoomlev = zoomlev - 1;
    //}
    map.setCenter(gPolyLine.getBounds().getCenter(), zoomlev);
}

//END GOOGLE STUFF
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//POST PROCESSING
///////////////////////////////////////////////////

function clearMap(){
    //remove the yelp results
    for (var i = 0; i < yLocalResults.length; i++) {
        map.removeOverlay(yLocalResults[i].marker());
    }
    //remove the google results
    for (var i = 0; i < gLocalResults.length; i++) {
        map.removeOverlay(gLocalResults[i].marker());
    }
}

function populateScreen(){
    if (lastType == "yelp") {
        if (yLocalResults.length > 0) {
            for (var i = 0; i < yLocalResults.length; i++) {
                map.addOverlay(yLocalResults[i].marker());
                results.innerHTML += yLocalResults[i].getResultsHtml(letterIcons[i], yLocalResults[i].getId());
                //if (i == 2) {
                //results.innerHTML += $('fakead').innerHTML;
                //results.innerHTML += '<a href="http://www.tkqlhce.com/click-3351811-10520742" target="_top">$20 off with 3 night booking!</a><img src="http://www.lduhtrp.net/image-3351811-10520742" width="1" height="1" border="0"/>';
                //results.innerHTML += '<a href="http://www.anrdoezrs.net/click-3351811-10581470" target="_top"><img src="http://www.tqlkg.com/image-3351811-10581470" width="120" height="90" alt="Cash Back Coupon!" border="0"/></a>';
                //<a href="http://www.tkqlhce.com/click-3351811-10443216" target="_blank"><img src="http://www.awltovhc.com/image-3351811-10443216" width="88" height="31" alt="hotels.com" border="0"/></a>
                //<a href="http://www.kqzyfj.com/click-3351811-10591139" target="_blank"><img src="http://www.awltovhc.com/image-3351811-10591139" width="88" height="31" alt="#1 Site For Love - Match.com® Official Site" border="0"/></a>
                //}
                //results.innerHTML += '<script type="text/javascript">GA_googleFillSlot("5874674450");</script>';
                //results.innerHTML += '<script type="text/javascript"><!--google_ad_client = "pub-4656883934391852";google_ad_slot = "5874674450";google_ad_width = 234;google_ad_height = 60;//--></script>;';
            }
        }
        else {
            var sb = [];
            
            sb.push('<div class="error">');
            sb.push('Sorry there were no results returned for your search near the midpoint.<br>');
            sb.push('Try dragging the midpoint (<img src="images/arrow_small.png"/>), checking the Google results OR<br>');
            sb.push('Try a different search term<br>');
            sb.push('<br>');
            sb.push('We are working hard to get search results for everything, but you tried something we can\'t do yet. Sorry!');
            sb.push('</div>');
            
            results.innerHTML = sb.join('');
        }
    }
    else if (lastType == "google") {        
        if (gLocalResults.length > 0) {
            for (var i = 0; i < gLocalResults.length; i++) {
                map.addOverlay(gLocalResults[i].marker());
                results.innerHTML += gLocalResults[i].getResultsHtml(letterIcons[i], i);
            }
        }
        else {
            var sb = [];
            
            sb.push('<div class="error">');
            sb.push('Sorry there were no results returned for your search near the midpoint.<br>');
            sb.push('Try dragging the midpoint (<img src="images/arrow_small.png"/>), checking the Yelp results OR<br>');
            sb.push('Try a different search term<br>');
            sb.push('<br>');
            sb.push('We are working hard to get search results for everything, but you tried something we can\'t do yet. Sorry!');
            sb.push('</div>');
            
            results.innerHTML = sb.join('');
        }
	}
	updateLink(lastAddress, lastSearch, lastType, lastAvoidCheck);
	if (document.getElementById('selected').value > -1) {
		openInfoWindow(document.getElementById('selected').value);
	}
}

//END POST PROCESSING
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//ENTRY STYLE
///////////////////////////////////////////////////
function doInputBlur(e, s){
    if (e.value === '') 
        e.value = s;
}

function doInputFocus(e, s){
    if (e.value === s) 
        e.value = '';
}

function doPointBlur(e, s){
    if (e.value === '') {
        var npe = document.getElementById('numPoints');
        npe.value--;
        if (npe.value < 3) {
            document.forms[0].avoidhighways.checked = oldhighwaycheck;
            document.forms[0].avoidhighways.disabled = false;
        }
    }
    doInputBlur(e, s);
}

function doPointFocus(e, s){
    if (e.value === s) {
        var npe = document.getElementById('numPoints');
        npe.value++;
        if (npe.value > 2) {
            oldhighwaycheck = document.forms[0].avoidhighways.checked;
            document.forms[0].avoidhighways.checked = false;
            document.forms[0].avoidhighways.disabled = true;
        }
    }
    doInputFocus(e, s);
}


///////////////////////////////////////////////////
//STATIC LOAD
///////////////////////////////////////////////////
// look for:
// term, tab, checks, add1, add2, add3, add4, type, mpnt
function doStaticLoad(){
    var x = location.search.substr(1).split("&")
    var GETDATA = new Array();
    for (var i = 0; i < x.length; i++) {
        var y = x[i].split("=");
        GETDATA[y[0]] = unescape(y[1]);
    }
    //Fill the values on the page if we have them
    if (GETDATA['tab']) {
        if (GETDATA['tab'] > 0) {
            //figure out which boxes to check...
            if (GETDATA['checks']) {
                var checkSplit = GETDATA['checks'].split(",");
                //Do stuff with these checks
                for (var i = 0; i < checkSplit.length; i++) {
                    document.getElementById(checkSplit[i]).checked = true;
                }
            }
        }
        mooLoad(GETDATA['tab']);
    }
    else {
        mooLoad(0);
    }
    if (GETDATA['term']) {
        document.getElementById('term').value = GETDATA['term'];
    }
    document.getElementById('numPoints').value = 0;
    if (GETDATA['add1']) {
        document.getElementById('add1').value = GETDATA['add1'];
        document.getElementById('numPoints').value++;
    }
    if (GETDATA['add2']) {
        document.getElementById('add2').value = GETDATA['add2'];
        document.getElementById('numPoints').value++;
    }
    if (GETDATA['add3']) {
        document.getElementById('add3').value = GETDATA['add3'];
        document.getElementById('numPoints').value++;
    }
    if (GETDATA['add4']) {
        document.getElementById('add4').value = GETDATA['add4'];
        document.getElementById('numPoints').value++;
    }
    if (GETDATA['avoid']) {
        if (GETDATA['avoid'] == "true") {
            document.forms[0].avoidhighways.checked = true;
        }
        else {
            document.forms[0].avoidhighways.checked = false;
        }
    }
    else {
        document.forms[0].avoidhighways.checked = false;
    }
    if (GETDATA['sel']) {
		document.getElementById('selected').value = GETDATA['sel'];
	}
    if (GETDATA['type']) {
        if (GETDATA['type'] == "google") 
            document.getElementById("searchselect").selectedIndex = 1;
        if (GETDATA['type'] == "yelp") 
            document.getElementById("searchselect").selectedIndex = 0;
    }
    if (GETDATA['mpnt']) {
        //set the midpoint lat and lng and run the search AFTER we have loaded the page
        var pointSplit = GETDATA['mpnt'].split(",");
        staticMidpoint = new GLatLng(parseFloat(pointSplit[0]), parseFloat(pointSplit[1]));
        showLocation(true, true);
    }
}

function doLinkFocus(){
    document.getElementById("linktext").focus();
    document.getElementById("linktext").select();
}

function updateLink(addresses, searchTerm, typeTerm, lastAvoidCheck){
    //setup the link
    var linkString = 'http://rendeznew.com/';
    //check the tab we last searched with:
    if (lastTab == 'meet') {
        linkString += '?tab=0';
        linkString += '&term=' + searchTerm;
    }
    else 
        if (lastTab == 'eat') {
            linkString += '?tab=1';
            var gotone = false;
            for (var i = 0; i < NUM_EAT; i++) {
                if (document.forms[0].eat[i].checked == true) {
                    if (gotone == false) {
                        linkString += "&checks=" + document.forms[0].eat[i].id;
                        gotone = true;
                    }
                    else {
                        linkString += "," + document.forms[0].eat[i].id;
                    }
                }
            }
        }
        else 
            if (lastTab == 'drink') {
                linkString += '?tab=2';
                var gotone = false;
                for (var i = 0; i < NUM_DRINK; i++) {
                    if (document.forms[0].drink[i].checked == true) {
                        if (gotone == false) {
                            linkString += "&checks=" + document.forms[0].drink[i].id;
                            gotone = true;
                        }
                        else {
                            linkString += "," + document.forms[0].drink[i].id;
                        }
                    }
                }
            }
            else 
                if (lastTab == 'play') {
                    linkString += '?tab=3';
                    var gotone = false;
                    for (var i = 0; i < NUM_PLAY; i++) {
                        if (document.forms[0].play[i].checked == true) {
                            if (gotone == false) {
                                linkString += "&checks=" + document.forms[0].play[i].id;
                                gotone = true;
                            }
                            else {
                                linkString += "," + document.forms[0].play[i].id;
                            }
                        }
                    }
                }
    
    for (var i = 1; i <= addresses.length; i++) {
        linkString += '&add' + i + '=' + addresses[i - 1];
    }
    
    if (addresses.length < 3) {
        if (lastAvoidCheck == true) {
            linkString += "&avoid=true";
        }
    }
	
	if(document.getElementById('selected').value  > -1) {
		linkString += "&sel=" + document.getElementById('selected').value;
	}
    
    linkString += "&type=" + typeTerm;
    
    //get the midpoint from our marker
    linkString += "&mpnt=" + midMarker.getPoint().lat() + "," + midMarker.getPoint().lng();
    document.getElementById("linktext").value = linkString.replace(/ /g, "%20");
    
    //then make it visible
    $("link").setStyle("visibility", "visible");
    $("searchtypes").setStyle("display", "block");
    $("infobar").setStyle("display", "none");
}

function openInfoWindow(id){
    if (lastType == "yelp") {
		var index = findLocalResult(id);
		yLocalResults[index].marker(letterIcons[index]).openInfoWindowHtml(yLocalResults[index].getInfoHtml(letterIcons[index]));
		document.getElementById('selected').value = id;
		updateLink(lastAddress, lastSearch, lastType, lastAvoidCheck);
		map.panTo(yLocalResults[index].getPoint());
    }
    else if (lastType == "google") {
        gLocalResults[id].marker().openInfoWindowHtml(gLocalResults[id].getInfoHtml(letterIcons[id]));
		document.getElementById('selected').value = id;
		updateLink(lastAddress, lastSearch, lastType, lastAvoidCheck);
        map.panTo(gLocalResults[id].getPoint());
	}
}

function infoWindowClosed() {
	document.getElementById('selected').value = -1;
	updateLink(lastAddress, lastSearch, lastType, lastAvoidCheck);
}

function onChangeType(selectobj){
    var searchType = selectobj.value;
    if (lastType != "none" && lastType != searchType) {
        lastType = searchType;
        results.innerHTML = "";
        clearMap();
        populateScreen();
    }
}

///////////////////////////////////////////////////
//PHP Call to MySQL
///////////////////////////////////////////////////
function saveSearch(term, tab, type, numadd, add){
	if (xmlHttp == null) {
        //alert ("Browser does not support HTTP Request");
        return;
    }
    var url = document.location.href + "scripts/recordsearch.php?";
    url += "term=" + term;
    url += "&tab=" + tab;
    url += "&type=" + type;
    url += "&numadd=" + numadd;
    for (var i = 1; i < numadd + 1; i++) {
        url += "&add" + i + "=" + add[i - 1];
    }
    
    if (url.substring(4, 0) == "http") {
        xmlHttp.open("GET", url, true);
        xmlHttp.send(null);
    }
}

function GetXmlHttpObject(){
    var xmlHttp = null;
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp = new XMLHttpRequest();
    } 
    catch (e) {
        //Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}
