﻿var map = null
var geocoder = null
var geocoderDelay = 100
var geocoderTimer = null
var custIcon = null

var com2render = null
var comIndex = null
var prevSearchTerm = ""

function doStartup()
{
    // Display the map, with some controls and set the initial location 
    var divMap = document.getElementById("map")
    if (divMap == null)
    {
        setTimeout('doStartup()',100)
    }
    else
    {
        if (GBrowserIsCompatible()) {
            document.body.onunload = GUnload
            map = new GMap2(divMap)
            map.addControl(new GLargeMapControl())
            map.addControl(new GMapTypeControl())
            map.setCenter(new GLatLng(44.20,-90.0),7)
            
            geocoder = new GClientGeocoder()

            custIcon = new GIcon()
            custIcon.iconSize=new GSize(38,44)
            custIcon.shadowSize = new GSize(1,1)
            custIcon.iconAnchor = new GPoint(11,44)
            custIcon.infoWindowAnchor = new GPoint(11,4)
            custIcon = new GIcon(custIcon, "/assets/images/icons/arrow.png")
        }
        else {
          alert("Sorry, the Google Maps API is not compatible with this browser")
        }
    }
}
function doWheretobuy(link)
{
    if (link.className == "inactive")
    {
        link.setAttribute("class", "active");
        link.setAttribute("className", "active");
    }
    else
    {
        link.setAttribute("class", "inactive");
        link.setAttribute("className", "inactive");
    }
    return false
}
function validate(inputId, re, searchTerm)
{
    var ret = ''
    var elInput = $get(inputId)
    if (elInput != null)
    {
        if (elInput.value.length > 0) {
            if (inputId != "txtZip" || elInput.value != "Zip Code") {
                if (re.test(elInput.value))
                    ret = elInput.value
                else {
                    ret = null
                    elInput.focus()
                }
            }
        }
    }
    
    return ret;
}
function searchWheretobuy(listResult)
{
    var hasCheese = false
    var hasMailOrder = false
    var hasWebsite = false
    var hasPlantTours = false
    var hasRetailStores = false

    var searchTerm = new CompanySearchTerm()
    var elTable = $get("wtb_tableOptions")
    for (var ir = 0; ir < elTable.rows.length; ir++)
    {
        for (var io = 0; io < elTable.rows[ir].cells.length; io++)
        {
            if (elTable.rows[ir].cells[io].id.startsWith('wtb_') && elTable.rows[ir].cells[io].firstChild.className == "active")
            {
                var option = elTable.rows[ir].cells[io].id.substring(4)
                
                if (option == "MakeCheese")
                    searchTerm.MakeCheese = true
                else if (option == "MailOrder")
                    searchTerm.MailOrder = true
                else if (option == "Website")
                    searchTerm.Website = true
                else if (option == "PlantTours")
                    searchTerm.PlantTours = true
                else if (option == "RetailStores")
                    searchTerm.RetailStore = true
                else if (option == "LiquidProducts")
                    searchTerm.MakeFluidProducts = true
                else if (option == "AwardWinning")
                    searchTerm.AwardWinning = true
            }
        }
    }
    ret = validate("txtRadius", /\d{1,4}|\d+[.]\d*|\d*[.]\d+/, searchTerm)
    if (ret == null)
    {
        alert ("Please enter a valid number for radius")
        return false
    }
    else if (ret.length > 0)
        searchTerm.Radius = parseFloat(ret)

    var ret = validate("txtZip", /\d{5,5}/, searchTerm)
    if (ret == null)
    {
        alert ("Please enter a valid zip code")
        return false
    }
    else if (ret.length > 0)
        searchTerm.Zip = ret

    var elCity = $get('txtCity')
    if (elCity.value.length > 0 && elCity.value != elCity.defaultValue)
        searchTerm.City = elCity.value

    var elCheese = $get('sltCheeseVariety')
    var varieties = '';
    for (var ic = 1; ic < elCheese.options.length; ic++)
    {
        if (elCheese.options[ic].selected)
            varieties += ',' + elCheese.options[ic].value;
    }
    //this odd. Here's why we did this. varieties.length > 1 is true unless it's in an if statement.
    //for some odd reason (and this is cross browser) if(varieties.length > 1) returns false.
    //not sure why it does this but by forcing varieties.length to be an int and storing it into vlen
    //that seems to fix our issues.
    //mc: 9/18/08
    var vlen = parseInt(varieties.length,10);
    if (vlen > 1)
        searchTerm.CheeseVarieties = varieties.substring(1);

    if (!searchTerm.equals(prevSearchTerm))
    {
        if (map != null)
        {
            if (geocoderTimer != null)
                clearTimeout(geocoderTimer)

            map.clearOverlays()
        }
        if (listResult)
            searchTerm.listResult = listResult
        com2render = null
        CompanyService.SearchWheretoBuy(searchTerm,OnSearchWheretoBuySucceeded, OnSearchWheretoBuyFailed, searchTerm)
    }
    $get('divListHolder').style.display = 'none'

    return false
}
var gListWin
function preOpenPrintContent(sourceId) {
    var url = "/common/printcontent.htm?id=" + sourceId
    var win = window.open(url, "content_print", "toolbar=no, directories=no, location=no, status=yes, menubar=no, resizable=yes, scrollbars=yes, width=740, height=680")
    win.focus()
    return win
}
function listWheretobuy()
{
    searchWheretobuy(true)
    var elList = $get('divCompanyList')
    if (com2render == null) {
        elList.innerHTML = ''
        gListWin = preOpenPrintContent("loadingContent")
    }
    else {
        var elHolder = $get('divListHolder')
        var listHtml = ''
        for (var ic = 0; ic < com2render.length; ic++)
        {
            var company = com2render[ic]
            listHtml += '<div class="list_item">'
            listHtml += '<div class="padding">'
            if (company.Website.length > 0)
                listHtml += '<h3><a href="' + company.Website + '" target="_blank">' + company.Name + '</a></h3>'
            else
                listHtml += '<h3>' + company.Name + '</h3>'
                
            listHtml += company.TypeOfAddress + '<br/>' + company.Address1 + '<br/>'
            if (company.Address2.length > 0)
                listHtml += company.Address2 + '<br/>'
    
            listHtml += company.City + ', ' + company.State + ' ' + company.Zip + '<br/>'
            if (company.Phone1.length > 0)
                listHtml += 'Phone: ' + company.Phone1 + '<br/>'

            if (company.Fax.length > 0)
                listHtml += 'Fax: ' + company.Fax + '<br/>'

            if (company.StoreHours.length > 0)
                listHtml += company.StoreHours + '<br/>'

            listHtml += '<div class="list_icons">' + addIcons(company) + '</div>'
            listHtml += '</div>'
            listHtml += '</div>'
            if((ic+1)%3==0){
                listHtml += '<div class="clear"></div>'
            }
        }
        if (com2render.length < 1){
            listHtml = '<p>No company found matching your search. Please try again.</p>' 
        }
        elList.innerHTML = listHtml
        //elHolder.style.display = 'inline'
        if (gListWin == null || gListWin.closed)
            openPrintContent('divListHolder')
        else
            gListWin.renderPrintContent('divListHolder')
    }
    return false
}
function OnSearchWheretoBuySucceeded(companies, searchTerm)
{
    prevSearchTerm = searchTerm
    com2render = companies 
    if (searchTerm.listResult)
        listWheretobuy()
    if (map != null)
    {
        if (geocoderTimer != null)
            clearTimeout(geocoderTimer)

        map.clearOverlays()
        putOnMap(companies)
    }
}
function OnSearchWheretoBuyFailed(result)
{
    alert ("Search where to buy failed: " + result.get_message())
}
function putOnMap()
{
    var num = com2render.length
    if (num < 1)
        alert("No company found matching your search. Please try again.")
    else
    {
        comIndex = 0
        //geocoderTimer = setTimeout('getGeoCoding()', 1)
        while (comIndex < num) {
            if (com2render[comIndex].Lat != 0 && com2render[comIndex].Lon != 0) {
                var point = new GLatLng(com2render[comIndex].Lat, com2render[comIndex].Lon)
                var marker = createMarker(point, generatePopup(com2render[comIndex]), custIcon)
                map.addOverlay(marker)
            }
            comIndex++
        }
    }
}
function getGeoCoding()
{
    var search = com2render[comIndex].Address1 + ',' + com2render[comIndex].City + ',' + com2render[comIndex].State + ' ' + com2render[comIndex].Zip
    geocoder.getLocations(search, geocoderResult)
}
function addIcons(company) {
    var iconHtml = ''
    if (company.MakesCheese)
        iconHtml += '<img src="../assets/images/icons/makecheese.png">'
    if (company.CheeseAwards)
        iconHtml += '<img src="../assets/images/icons/awards.png">'
    if (company.HasRetailStore)
        iconHtml += '<img src="../assets/images/icons/retailstore.png">'
    if (company.HostPublicTours)
        iconHtml += '<img src="../assets/images/icons/tours.png">'
    if (company.HasMailOrder)
        iconHtml += '<img src="../assets/images/icons/mailorder.png">'
    if (company.Website.length > 0)
        iconHtml += '<img src="../assets/images/icons/website.png">'
    if (company.MakesFluidProducts)
        iconHtml += '<img src="../assets/images/icons/liquid.png">'

    return iconHtml
}
function generatePopup(company)
{
    var popHtml = '<div class="wheretobuy_popup"><h2>' + company.Name + '</h2>'
          + company.Address1 + '<br/>'
    if (company.Address2.length > 0)
        popHtml += company.Address2 + '<br/>'
    
    popHtml += company.City + ', ' + company.State + ' ' + company.Zip + '<br/>'
    if (company.Phone1.length > 0)
        popHtml += company.Phone1 + '<br/>'

    if (company.StoreHours.length > 0)
        popHtml += company.StoreHours + '<br/>'

    if (company.Website.length > 0)
        popHtml += '<a href="' + company.Website + '" target="_blank">' + company.Website + '</a><br/>'

    popHtml += '<div class="hr"></div>'
    popHtml += addIcons(company)
    popHtml += '</div>'
    return popHtml
}
function createMarker(point,html,icon) {
    var marker = new GMarker(point, icon)
    GEvent.addListener(marker, "click", function() {
      marker.openInfoWindowHtml(html);
    });
    return marker;
}
function OnSaveLatLonSucceeded(results) {
}
function OnSaveLatLonFailed(results) {
}

function geocoderResult(result)
{
    if (result.Status.code == G_GEO_SUCCESS) {
      var p = result.Placemark[0].Point.coordinates;
      var point = new GLatLng(p[1],p[0])
      var marker = createMarker(point,generatePopup(com2render[comIndex]),custIcon)
      map.addOverlay(marker)
      com2render[comIndex].Lat = p[1]
      com2render[comIndex].Lon = p[0]
      CompanyService.SaveLatLon(com2render[comIndex].AddressId, com2render[comIndex].Lat, com2render[comIndex].Lon, OnSaveLatLonSucceeded, OnSaveLatLonFailed)
  }
    
    comIndex++
    if (comIndex < com2render.length)
        geocoderTimer = setTimeout('getGeoCoding()',1)
}

CompanySearchTerm = function()
{
    this.MailOrder = false
    this.MakeCheese = false
    this.Website = false
    this.MakeFluidProducts = false
    this.PlantTours = false
    this.AwardWinning = false
    this.RetailStore = false
    this.CheeseVarieties = ""
    this.Radius = 0
    this.Zip = ""
    this.City = ""
}
CompanySearchTerm.prototype =
{
    equals: function(searchTerm)
    {
        var ret = false
        if (searchTerm != null)
            ret = (this.MailOrder == searchTerm.MailOrder
                    && this.MakeCheese == searchTerm.MakeCheese 
                    && this.Website == searchTerm.Website
                    && this.MakeFluidProducts == searchTerm.MakeFluidProducts 
                    && this.PlantTours == searchTerm.PlantTours 
                    && this.AwardWinning == searchTerm.AwardWinning 
                    && this.RetailStore == searchTerm.RetailStore 
                    && this.CheeseVarieties == searchTerm.CheeseVarieties 
                    && this.Radius == searchTerm.Radius 
                    && this.Zip == searchTerm.Zip 
                    && this.City == searchTerm.City)

        return ret
    }
}