﻿/**
* Garfield.CO.US.ParcelDetail is a custom module that handles displaying detailed parcel information.
* Note that the last line of this file 
*/
Garfield.CO.US.ParcelDetail = new function() {
    /**
    * Holds a reference to global variables.
    * @private
    */
    var _g = Garfield.CO.US.Globals;
    /**
    * Holds a reference to configuration variables.
    * @private
    */
    var _c = Garfield.CO.US.Config;
    /**
    * Holds a reference to utility functions.
    * @private
    */
    var _u = Garfield.CO.US.Utils;
    /**
    * Holds a reference to application enumerations.
    * @private
    */
    var _e = Garfield.CO.US.Enums;
    /**
    * Holds the collection of current parcel details.
    * @private
    */
    var _parcelDetails = [];

    /**
    * Displays the detailed information about parcels retreived from an identify task.
    * This function provides the custom implementation of Garfield.CO.US.InfoPane.HandleResult
    * @param {IdentifyResult[]} identifyResult Collection of features.
    * @private
    */
    var _handleResult = function(identifyResult) {
        //#start
        if (identifyResult.length < 1) {
            _getParcelContentContainer().innerHTML = "<p id=\"secondarySidebarDetailMessage\">" + _c.NoParcelText + "</p>";
        } else {
            _parcelDetails = [];
            var index = 0;
            for (var i = 0, l = identifyResult.length; i < l; i++) {
                if (i > 50 - 1)
                    break;
                if (index == 7)
                    index = 0;
                var result = identifyResult[i];
                result.feature.attributes.Index = index + 1;
                result.feature.attributes.ParcelDetailsIndex = _parcelDetails.length;
                var title = result.feature.attributes[_c.ParcelReportFields.Title].toString();
                if (!title.isNull() && !isNaN(title) && title != "999999999999") {
                    _parcelDetails.push(result);
                    index++;
                };
            };
            _setParcelDetailsPage(1, 0);
        };
        _toggleContent();
        if (_c.UI.HasInfoPane)
            Garfield.CO.US.UI.ToggleSidebar(dojo.query(".sidebarTab")[1]);
        //#end
    };

    /**
    * Gets the clickable HTML for a parcel detail tab.
    * @param {Number} index The index of the parcel detail.
    * @param {String} title The text of the anchor.
    * @returns The clickable HTML for a parcel detail tab.
    * @type String
    * @private
    */
    var _getTabAnchor = function(index, title) {
        //#start
        return "<a href=\"#\" onclick=\"Garfield.CO.US.ParcelDetail.DisplayParcelDetail(" + index + ");Garfield.CO.US.ParcelDetail.ToggleTabs(this.parentNode)\">" + title + "</a>";
        //#end
    };

    /**
    * Gets the HTML for paging through search results.
    * @param {Int} pageNumber The current page number.
    * @returns The HTML for paging through search results.
    * @type String
    * @private
    */
    var _getParcelDetailPaging = function(pageNumber) {
        //#start

        var html = "";
        if (_parcelDetails.length > 7) {
            var mod = _parcelDetails.length % 7;
            var pages = Math.floor(_parcelDetails.length / 7);
            pages = mod > 0 ? pages + 1 : pages;
            var parcelDetailsIndex = 0;
            html = "<p class=\"pages\">Page: ";
            for (var i = 0; i < pages; i++) {
                var page = i + 1;
                var className = page == pageNumber ? "selected" : "";
                parcelDetailsIndex = i * 7;
                //html += "<li>"
                html += "&nbsp;&nbsp;";
                if (page != pageNumber) {
                    html += "<a href=\"#\"";
                    html += " onclick=\"Garfield.CO.US.ParcelDetail.GetParcelDetailsPage(";
                    html += page + ", " + parcelDetailsIndex;
                    html += ")\">";
                };
                html += page;
                if (page != pageNumber)
                    html += "</a>";
                //html += "</li>";
                html += "&nbsp;&nbsp;";
            };
            //html += "</ul>";
        };
        return html;
        //#end
    };

    /**
    * Sets the parcel details to be displayed in the parcel information panel.
    * @param {Number} pageNumber The current page number.
    * @param {Number} index The index of _parcelDetails at which to begin.
    * @private
    */
    var _setParcelDetailsPage = function(pageNumber, index) {
        //#start
        if (_getParcelDetailContainer())
            _getParcelDetailContainer().scrollTop = 0;

        var length = index + 7;
        var i = index;
        var html = _getParcelDetailPaging(pageNumber);
        html += "<ul id=\"parcelDetailTabs\">";
        do {
            var parcelDetail = _parcelDetails[i];
            html += "<li>";
            html += _getTabAnchor(parcelDetail.feature.attributes.ParcelDetailsIndex, parcelDetail.feature.attributes[_c.ParcelReportFields.Title]);
            html += "</li>";
            i++;
        } while (i < length && i < _parcelDetails.length);
        html += "</ul>";
        html += "<div id=\"parcelDetail\">";
        html += _createParcelDetail(_parcelDetails[index]);
        html += "</div>";
        _getParcelContentContainer().innerHTML = html;
        _toggleTabs(dojo.query("#parcelDetailTabs LI")[0]);
        _drawParcel(index);
        //#end
    };

    /**
    * Creates the HTML for a parcel detail.
    * @param {_parcelDetails[item]} parcelDetail The _parcelDetails[item] from which to build the HTML.
    * @returns The HTML of a _parcelDetails[item].
    * @type String
    * @private
    */
    var _createParcelDetail = function(parcelDetail) {
        var attributes = parcelDetail.feature.attributes;
        var html = "<div id=\"parcelDetailContent\">";
        var aliases = _c.FieldAliases;
        var reportUrl = "ParcelReport.aspx?";
        var urlParams = [];
        var parcelDetailTypes = _e.ParcelDetailType;
        for (var parcelDetailType in parcelDetailTypes) {
            var detailType = parcelDetailTypes[parcelDetailType];
            var fields = eval("_c.FieldAliases." + detailType);
            if (!_u.IsUndefined(fields)) {
                html += "<div>";
                html += "<h4>" + detailType + "</h4>";
                urlParams.push(detailType + "Detail=" + detailType);
                html += "<table>";
                for (var field in fields) {
                    if (!_u.IsUndefined(attributes[field])) {
                        html += "<tr>";
                        html += "<th valign=\"top\">" + fields[field] + ":</th>";
                        var value = "";
                        value = attributes[field];
                        value = value.isNull() ? _c.Text.NullData : value;
                        urlParams.push(escape(fields[field]) + "=" + escape(value));
                        html += "<td valign=\"top\">" + value + "</td>";
                        html += "</tr>";
                    };
                };
                html += "</table>";
                html += "</div>";
            };
        };
        html += "<a href=\"Report.aspx?" + urlParams.join("&") + "\" target=\"_blank\" id=\"reportButton\">";
        html += "<img src=\"../Images/generateReport.png\" height=\"25\" width=\"120\"></a>";
        html += "</div>";
        return html;
    };

    /**
    * Displays the HTML for a parcel detail.
    * @param {Number} index The index of _parcelDetails from which to retreive information.
    * @private
    */
    var _displayParcelDetail = function(index) {
        //#start
        var container = _getParcelDetailContainer();
        if (container) {
            container.innerHTML = _createParcelDetail(_parcelDetails[index]);
            container.scrollTop = 0;
        };
        _drawParcel(index);
        container = null;
        //#end
    };

    var _drawParcel = function(index) {
        var parcelDetail = _parcelDetails[index];
        if (parcelDetail) {
            _g.MAP.graphics.clear();
            var line = null;
            var fill = null;
            var area = null;
            var symbology = _c.FeatureSymbology.Parcel;
            var hasOutline = symbology.Line.Visible;
            var hasFill = symbology.Fill.Visible;
            if (hasOutline)
                line = new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setWidth(1).setColor(new dojo.Color([symbology.Line.Color.R, symbology.Line.Color.G, symbology.Line.Color.G, 0.5]));
            if (hasFill)
                fill = new esri.symbol.SimpleFillSymbol().setStyle(esri.symbol.SimpleFillSymbol.STYLE_SOLID).setOutline(line).setColor(new dojo.Color([symbology.Fill.Color.R, symbology.Fill.Color.G, symbology.Fill.Color.B, 0.5]));
            if (line && !fill) {
                area = new esri.Graphic().setGeometry(parcelDetail.feature.geometry).setSymbol(line);
                _g.MAP.graphics.add(area);
            } if (fill) {
                area = new esri.Graphic().setGeometry(parcelDetail.feature.geometry).setSymbol(fill);
                _g.MAP.graphics.add(area);
            };

            line = null; fill = null; area = null;
        };
    };

    /**
    * Gets the DOM node containing parcel information.
    * @returns The DOM node containing parcel information.
    * @type DOM Node
    * @private
    */
    var _getParcelContentContainer = function() {
        //#start
        return dojo.byId("secondarySidebarContent");
        //#end
    };

    /**
    * Gets the DOM node containing parcel detail information.
    * @returns The DOM node containing parcel detail information.
    * @type DOM Node
    * @private
    */
    var _getParcelDetailContainer = function() {
        //#start
        return dojo.byId("parcelDetail");
        //#end
    };

    /**
    * Toggles the parcel detail tabs.
    * @param {DOM Node} node The tab to select/make active.
    * @private
    */
    var _toggleTabs = function(node) {
        //#start
        dojo.forEach(dojo.query("#parcelDetailTabs LI"), function(item) { item.className = item == node ? "selected" : ""; });
        //#end
    };

    /**
    * Toggles the content of the parcel container between loading and parcel details.
    * @private
    */
    var _toggleContent = function() {
        _u.ToggleNodeDisplay("secondarySidebarContent");
        _u.ToggleNodeDisplay("secondarySidebarLoading");
    };

    return {
        HandleResult: function(identifyResult) { _handleResult(identifyResult); },
        ToggleContent: function() { _toggleContent(); },
        DisplayParcelDetail: function(index) { _displayParcelDetail(index); },
        GetParcelDetailsPage: function(pageNumber, index) { _setParcelDetailsPage(pageNumber, index); },
        ToggleTabs: function(node) { _toggleTabs(node); }
    };
};

// Override default behavior to use custom implementation
Garfield.CO.US.InfoPane.HandleResult = Garfield.CO.US.ParcelDetail.HandleResult;