﻿/// <reference path="jquery-1.3.2.min.js" />

var initialZoomLevel = 3;
var maxZoomLevel = 8;
var minZoomLevel = 6;

var map;
var manager;
var currentPlotMarker;
var currentMarker;
var swapValues = [];

var $j = jQuery.noConflict();
var $$ = $j.fn;

$$.extend({

    InitializeMap: function() {
        var element = $j("#MapArea");
        map = new GMap2(element[0]);
        map.setCenter(new GLatLng(32, -92), initialZoomLevel);
        map.setUIToDefault();
        manager = new MarkerManager(map, { borderPadding: 20, maxZoom: maxZoomLevel });
    },

    PlaceMarkers: function(plotMarkers) {
        if ($j.isArray(plotMarkers)) {
            manager.clearMarkers();
            for (var idx = 0; idx < plotMarkers.length; idx++) {

                var plotMarker = plotMarkers[idx];
                var marker = null;

                marker = manager.getMarker(plotMarker.Latitude, plotMarker.Longitude, minZoomLevel);

                if (marker.isAdded) {
                    marker.PlotMarkers.push(plotMarker);
                } else {
                    marker.PlotMarkers = [];
                    marker.PlotMarkers.push(plotMarker);

                    GEvent.addListener(marker, "click", function() {

                        currentMarker = this;

                        tmpMarker = this.PlotMarkers[0];

                        var containerString =
                            "<div style='height:auto;width:260px;'>" +
                            "<div style='height:100px;width:250px;overflow:auto;'>" +
                            "  <span style='font-weight:bold;'>" + tmpMarker.City + ", " + tmpMarker.State + " " + tmpMarker.Zip + "</span><br /><br />" +
                            "  <table class='dealer-table' style='border-collapse:collapse;' cellpadding='2' cellspacing='3' width='100%'>" +
                            "    <colgroup>" +
                            "      <col align='left' />" +
                            "      <col align='left' />" +
                            "    </colgroup>" +
                            "    <thead>" +
                            "      <tr>" +
                            "        <th align='left'>Year</th><th align='left'>Cooperator</th>" +
                            "      </tr>" +
                            "    </thead>" +
                            "    <tbody>" +
                            "    </tbody>" +
                            "  </table>" +
                            "</div>" +
                            "</div>";

                        var container = $j(containerString);

                        var table = container.find(".dealer-table");

                        this.PlotMarkers.forEach(function(x, idx) {
                            var rowString =
                                "<tr class='plot-row' meta:idx='" + idx + "'>" +
                                "  <td>" + cleanData(x.Year) + "</td><td>" + x.DealerName + "</td>" +
                                "</tr>";
                            var row = $j(rowString);

                            row.click(function(e) {
                                e.preventDefault();
                                var idx = $j(this).attr("meta:idx");
                                currentPlotMarker = currentMarker.PlotMarkers[idx];
                                $$.PlotResultWidget.GetPlotData();
                            });

                            table.append(row);
                        });

                        table.find("tr.plot-row:even").addClass("listalternate");

                        this.openInfoWindow(container.get(0));
                    });

                    // add markers to the MarkerManager
                    manager.addMarker(marker, minZoomLevel);
                    marker.isAdded = true;
                }
            }
            manager.refresh();
        }
    },

    ZoomToLocation: function(location) {
        var geoCoder = new GClientGeocoder();
        geoCoder.getLatLng(location, function(latLng) {
            if (latLng !== null) {
                $$.ZoomToPoint(latLng, maxZoomLevel);
            } else {
                alert('Unable to find that location');
            }
        });
    },

    ZoomToPoint: function(latLng, zoomLevel) {
        map.setZoom(zoomLevel);
        map.panTo(latLng);
    },

    PlotResultWidget: {

        Ready: function() {
            //subscribe to the find button's click event
            $j("#Find").click(function(e) {
                e.preventDefault();
                $$.PlotResultWidget.SearchPlots();
            });

            $j(".swap_value").each(
                function(i) {
                    swapValues[i] = $j(this).val();
                    $j(this).focus(function() {
                        if ($j(this).val() == swapValues[i]) {
                            $j(this).val("")
                        }
                    }
                    ).blur(function() {
                        if ($j.trim($j(this).val()) == "") {
                            $j(this).val(swapValues[i])
                        }
                    }
                 )
                });
        },

        SearchPlots: function() {

            var client = new RenkSeed.Application.Web.Scripts.PlotServiceClient();

            var productName = $j("#SeedType").val();
            var range = $j("#Range").val();
            var zipCode = $j("#EnterZipcode").val();
            var city = $j("#EnterCity").val();
            var state = $j("#State").val();

            var plotSearch;

            if (zipCode !== "" && zipCode !== "Enter Zipcode" && isNumeric(zipCode)) {
                plotSearch = { ProductName: productName, Location: zipCode, Range: range };
                client.GeoLocateZip(
                    plotSearch,
                    function(plotMarkers) {
                        $$.PlaceMarkers(plotMarkers);
                        $$.ZoomToLocation(plotSearch.Location);
                    },
                    function(e) {
                        alert(e);
                    }
                );
            } else if (city !== "" && city !== "Enter City") {
                plotSearch = { ProductName: productName, Location: city + "," + state, Range: range };
                client.GeoLocateCity(
                    plotSearch,
                    function(plotMarkers) {
                        $$.PlaceMarkers(plotMarkers);
                        $$.ZoomToLocation(plotSearch.Location);
                    },
                    function(e) {
                        alert(e);
                    }
                );
            } else {
                alert("Please specify valid location criteria.");
            }
        },

        GetPlotData: function() {
            var client = new RenkSeed.Application.Web.Scripts.PlotServiceClient();
            client.PlotReport(
                currentPlotMarker,
                function(plotData) {
                    $$.PlotResultWidget.PrintVarietyReport(plotData);
//                    $j("html, body").animate({
//                        scrollTop: $j("#DataReport").offset().top
//                    }, 200);
                },
                function(e) {
                    alert(e);
                }
            );
        },

        PrintVarietyReport: function(plotData) {

            $j("#DataReport").removeClass("off").addClass("on");

            $j("#dealerNameDataCell").html(cleanData(plotData.Detail.DealerName));
            $j("#cityDataCell").html(cleanData(plotData.Detail.City));
            $j("#yearDataCell").html(cleanData(plotData.Detail.Year));
            $j("#soilTypeDataCell").html(cleanData(plotData.Detail.SoilType));
            $j("#plantingDateDataCell").html(cleanData($j.formatDate(plotData.Detail.PlantingDate, 'MM/dd/yyyy')));
            $j("#harvestDateDataCell").html(cleanData($j.formatDate(plotData.Detail.HarvestDate, 'MM/dd/yyyy')));
            $j("#plantingPopulationDataCell").html(cleanData(plotData.Detail.PlantingPopulation));
            $j("#rowWidthDataCell").html(cleanData(plotData.Detail.RowWidth));
            $j("#checkVarietyDataCell").html(cleanData(plotData.Detail.CheckVariety));

            // remove the rows
            $j("#cornReportTable tr.dataRow").remove();
            $j("#soyReportTable tr.dataRow").remove();

            $j("#cornReportTable").hide();
            $j("#soyReportTable").hide();

            var table = null;

            if ($j("#SeedType").val() === "Corn") {
                table = $j("#cornReportTable");
                if ($j.isArray(plotData.Varieties)) {

                    for (var idx = 0; idx < plotData.Varieties.length; idx++) {
                        var v = plotData.Varieties[idx];

                        var rowString =
                            "<tr class='dataRow'>" +
                            "<td><b>" + cleanData(v.Name) + "</b></td>" +
                            "<td align=\"right\">" + setPrecision((v.Yield),1) + "</td>" +
                            "<td align=\"right\">" + setPrecision(cleanData(v.CheckPlus),1) + "</td>" +
                            "<td align=\"right\">" + setPrecision(cleanData(v.MoisturePercent),1) + "</td>" +
                            "<td align=\"right\">" + setPrecision(cleanData(v.EconomicReturn),2) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.TestWeight) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.StalkLodge) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.RootLodge) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.HarvestPopulation) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.Notes) + "</td>" +
                            "</tr>";

                        var row = $j(rowString);

                        table.append(row);
                    }
                    $j("#cornReportTable tr.dataRow:even").addClass("listalternate");
                    table.show();
                }
            } else {
                table = $j("#soyReportTable");
                if ($j.isArray(plotData.Varieties)) {

                    for (var idx = 0; idx < plotData.Varieties.length; idx++) {
                        var v = plotData.Varieties[idx];

                        var rowString =
                            "<tr class='dataRow'>" +
                            "<td><b>" + cleanData(v.Name) + "</b></td>" +
                            "<td align=\"right\">" + setPrecision((v.Yield),1) + "</td>" +
                            "<td align=\"right\">" + setPrecision(cleanData(v.CheckPlus),1) + "</td>" +
                            "<td align=\"right\">" + setPrecision(cleanData(v.MoisturePercent),1) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.RootLodge) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.HarvestPopulation) + "</td>" +
                            "<td align=\"right\">" + cleanData(v.Notes) + "</td>" +
                            "</tr>";

                        var row = $j(rowString);

                        table.append(row);
                    }
                    $j("#soyReportTable tr.dataRow:even").addClass("listalternate");
                    table.show();
                }
            }

        }
    }

});

function cleanData(value) {

    if (value === null || (isString(value) && value.toLowerCase() === "null"))
        return "-";
        
    if (isString(value) && value === "")
        return "-";

    if (!isNumeric(value) && value.toString() === "false")
        return "-";

    if (isNumeric(value) && value === 0)
        return "-";

    return value;
}

function isNumeric(sText) {
    var ValidChars = "0123456789.";
    var IsNumber = true;
    var Char;

    for (i = 0; i < sText.length && IsNumber == true; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            IsNumber = false;
        }
    }
    return IsNumber;

}

function isString(a) {
    return typeof a == 'string';
}

if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun /*, thisp*/) {
        var len = this.length;
        if (typeof fun != "function")
            throw new TypeError();

        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this)
                fun.call(thisp, this[i], i, this);
        }
    };
}

function setPrecision(number, numberOfDecimals) {
    if (number != "-") {
        number = parseFloat(number);
        number = number.toFixed(numberOfDecimals);
        number = number.toString();
    }
    return number;
}

// my little hack for associating PlotMarkers with GMarkers
GMarker.prototype.PlotMarkers = null;
GMarker.prototype.isAdded = false;