﻿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 buildSearchCriteriaHeader(searchTerm) {
    var listHtml = ''
    if (searchTerm != null) {
        // build search criteria
        // Search: [Cheese Variety or All]
        listHtml += '<div class="search_criteria">'
        listHtml += 'Search Criteria:<br/>'
        listHtml += ' Cheese Variety: '
        if (searchTerm.CheeseVarieties.length > 0) {
            var elCheese = $get('sltCheeseVariety')
            for (var ic = 1; ic < elCheese.options.length; ic++) {
                if (elCheese.options[ic].selected)
                    listHtml += elCheese.options[ic].innerText
            }
        }
        else
            listHtml += 'All'
        listHtml += '<br/>'
        listHtml += ' Options: '
        var delim = ''
        if (searchTerm.MailOrder) {
            listHtml += delim + 'Mail Order'
            delim = ', '
        }
        if (searchTerm.MakeCheese) {
            listHtml += delim + 'Make Cheese'
            delim = ', '
        }
        if (searchTerm.Website) {
            listHtml += delim + 'Has Website'
            delim = ', '
        }
        if (searchTerm.MakeFluidProducts) {
            listHtml += delim + 'Milk and Ice Cream'
            delim = ', '
        }
        if (searchTerm.PlantTours) {
            listHtml += delim + 'Plant Tours'
            delim = ', '
        }
        if (searchTerm.RetailStore) {
            listHtml += delim + 'Retail Store'
            delim = ', '
        }
        if (searchTerm.AwardWinning) {
            listHtml += delim + 'Award Winning'
            delim = ', '
        }
        listHtml += '<br/>'
        if (searchTerm.Radius > 0) {
            listHtml += ' Within ' + searchTerm.Radius
            listHtml += ' miles of '
            if (searchTerm.Zip.length > 0)
                listHtml += searchTerm.Zip
            else if (searchTerm.City.length > 0)
                listHtml += searchTerm.City
        }
        listHtml += '<br/><br/>'
        listHtml += '</div>'
    }
    return listHtml
}
function keyIconsToDisplay() {
    this.icons = 0;
    this.showMakeCheese = 0x1;
    this.showCheeseAwards = 0x2;
    this.showRetailStore = 0x4;
    this.showPublicTours = 0x8;
    this.showMailOrdre = 0x10;
    this.showWebsite = 0x20;
    this.showFluidProducts = 0x40;
    return this;
}

function listWheretobuy(searchTerm)
{
    searchWheretobuy(true)
    var elList = $get('divCompanyList')
    if (com2render == null) {
        elList.innerHTML = ''
        gListWin = preOpenPrintContent("loadingContent")
    }
    else
    {
        var elHolder = $get('divListHolder')
        var listHtml = buildSearchCriteriaHeader(searchTerm != null ? searchTerm : prevSearchTerm)
        var keyIcons = new keyIconsToDisplay();
        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/>'
            if (company.TypeOfAddress != 'Online Retail Only') {
                listHtml += 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.Email.length > 0)
                listHtml += 'Email: ' + company.Email + '<br/>'

            if (company.StoreHours.length > 0)
                listHtml += company.StoreHours + '<br/>'

            if (company.AdditionalInfo.length > 0)
                listHtml += company.AdditionalInfo + '<br/>'

            listHtml += '<div class="list_icons">' + addIcons(company, keyIcons) + '</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>'
        }
        else {
            listHtml += addKeyIcons(keyIcons);
        }
        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(searchTerm)
    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, keyIcons) {
    var iconHtml = ''
    if (company.MakesCheese) {
        iconHtml += '<img src="../assets/images/icons/makecheese.png" alt="Makes Cheese" title="Makes Cheese">'
//        keyIcons.icons |= keyIcons.showMakeCheese;
    }
    if (company.CheeseAwards) {
        iconHtml += '<img src="../assets/images/icons/awards.png" alt="Award Winning" title="Award Winning">'
//        keyIcons.icons |= keyIcons.showCheeseAwards;
    }
    if (company.HasRetailStore) {
        iconHtml += '<img src="../assets/images/icons/retailstore.png" alt="Retail Store" title="Retail Store">'
//        keyIcons.icons |= keyIcons.showRetailStore;
    }
    if (company.HostPublicTours) {
        iconHtml += '<img src="../assets/images/icons/tours.png" alt="Public Tours Available" title="Public Tours Available">'
//        keyIcons.icons |= keyIcons.showPublicTours;
    }
    if (company.HasMailOrder) {
        iconHtml += '<img src="../assets/images/icons/mailorder.png" alt="Mail Order" title="Mail Order">'
//        keyIcons.icons |= keyIcons.showMailOrder;
    }
    if (company.Website.length > 0) {
        iconHtml += '<a href="' + company.Website + '" target="_blank"><img src="../assets/images/icons/website.png" alt="Website" title="Website"></a>'
//        keyIcons.icons |= keyIcons.showWebsite;
    }
    if (company.MakesFluidProducts) {
        iconHtml += '<img src="../assets/images/icons/liquid.png" alt="Milk, Ice Cream" title="Milk, Ice Cream">'
//        keyIcons.icons |= keyIcons.showFluidProducts;
    }

    return iconHtml
}

function addKeyIcons(keyIcons) {
    var iconHtml = '<div class="clear"></div><div><hr class="hr" /><table id="print_key">'
//    if (keyIcons.icons & keyIcons.showMakeCheese != 0) {
        iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/makecheese.png" alt="Makes Cheese" title="Makes Cheese"></td><td id="print_key_label">Makes Cheese</td></tr>'
//    }
//    if (keyIcons.icons & keyIcons.showCheeseAwards != 0) {
        iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/awards.png" alt="Award Winning" title="Award Winning"></td><td id="print_key_label">Award Winning</td></tr>'
//    }
//    if (keyIcons.icons & keyIcons.showRetailStore != 0) {
        iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/retailstore.png" alt="Retail Store" title="Retail Store"></td><td id="print_key_label">Retail Store</td></tr>'
//    }
//    if (keyIcons.icons & keyIcons.showPublicTours != 0) {
          iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/tours.png" alt="Public Tours Available" title="Public Tours Available"></td><td id="print_key_label">Public Tours Available</td></tr>'
          //    }
//    if (keyIcons.icons & keyIcons.showMailOrder != 0) {
          iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/mailorder.png" alt="Mail Order" title="Mail Order"></td><td id="print_key_label">Mail Order</td></tr>'
          //    }
//    if (keyIcons.icons & keyIcons.showWebsite != 0) {
          iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/website.png" alt="Website" title="Website"></td><td id="print_key_label">Website</td></tr>'
          //    }
//    if (keyIcons.icons & keyIcons.showFluidProducts != 0) {
          iconHtml += '<tr><td id="print_key_icon"><img src="../assets/images/icons/liquid.png" alt="Milk, Ice Cream" title="Milk, Ice Cream"></td><td id="print_key_label">Milk, Ice Cream</td></tr>'
          //    }

    iconHtml += '</table></div>'
    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
    }
}