﻿// ##################### TIMER CODE ##################################
var startTime, endTime;
function showLoading() {
    startTime = new Date().getTime();
    var h = (map.height / 2) + 85;
    var w = ((map.width / 2) - 100) + 200;
    dojo.style(loading, { "top": h + "px", "left": w + "px" });
    esri.show(loading);
        
    
}

function hideLoading() {

    esri.hide(loading);
//    layersLoaded++;
//    if (layersLoaded === map.layerIds.length) {
//        endTime = new Date().getTime();
//        var timeElapsed = endTime - startTime;
//        layersLoaded = 0;
//        esri.hide(loading);

//    }
}


//################## Map Events 

// History of Extent Change in Main Map
function extentHistoryChangeHandler() {
    //dijit.byId("zoomprev").disabled = navToolbar.isFirstExtent();
    //dijit.byId("zoomnext").disabled = navToolbar.isLastExtent();
}


// ON MAP MOUSE MOVE
function onMapMouseMove(event) {

//    try {
//        var level = map.getLevel();
//        var pres = Math.min(6, level);
//        var x = event.mapPoint.x.toFixed(pres);
//        var y = event.mapPoint.y.toFixed(pres);
//        dojo.byId('mapPosition').innerHTML = dojo.string.substitute('${0}, ${1}', [x, y]);
//    } catch (Err) {
//        console.debug(Err)
//    }
}

// ON MAP MOUSE OUT
function onMapMouseOut(event) {
    //dojo.byId('mapPosition').innerHTML = '';
}

// ON MAP EXTENT CHANGE
function onMapExtentChange(extent, delta, levelChange, lod) {
    try {
//        var level = map.getLevel();
//        if (level > -1) {

//            if (mapScales != null) {

//                var scale = mapScales[level];
//                dojo.byId('mapScale').innerHTML = '1 : ' + addCommas(scale.toFixed(0));
//            }
//        } else {

//           calcScale(map.extent);

        //        }
        //calcScale(map.extent);
        

    } catch (Err) {
        console.debug(Err);

    }
}

// ON MAP PAN
function onMapPan(extent, delta) {
    //updateOVPoly(extent);
}

function calcScale(extent) {

    try {

//        var level = map.getLevel();
//        if (level > -1) {

//            var scale = mapScales[level];
//            dojo.byId('mapScale').innerHTML = '1 : ' + addCommas(scale.toFixed(0));
//        }
//        else {

            var xmin = extent.xmin;
            var ymin = extent.ymin;
            var xmax = extent.xmax;
            var ymax = extent.ymax;

            var dpi = 96;
            

            var w = map.width / dpi;
            var h = map.height / dpi;

            var mapH = map.extent.getHeight();
            var mapW = map.extent.getWidth();

            var distanceOnMap = Math.sqrt((w * w) + (h * h));
            var distanceOnGround = Math.sqrt((mapH * mapH) + (mapW * mapW));
            var scale = distanceOnGround / distanceOnMap;

            dojo.byId("mapScale").innerHTML = "1 inch = " + addCommas(scale.toFixed(0) + " feet");

        //}
    } catch (Err) {
        console.debug(Err)
    }

}


function zoomToInitialExtent() {
    map.setExtent(initialExtent, true);
}

function zoomtoExtent(x1, y1, x2, y2, expand) {
    try {
        var ext = new esri.geometry.Extent(x1, y1, x2, y2, map.spatialReference);
        map.setExtent(ext.expand(expand));
    } catch (Error) {
        console.debug(Error)
    }
}

function centerMap(feature) {

    var fExtent = feature.geometry.getExtent();
    var centerPt = new esri.geometry.Point;
    centerPt = fExtent.getCenter();
    map.centerAt(centerPt);

}

function zoomMap(geometry) {

    try {

        var fExtent = geometry.getExtent();
        if (fExtent.getHeight() < 1000) {
            var dx, dy;
            var centerPt = new esri.geometry.Point;
            centerPt = fExtent.getCenter();

            var xmin, ymin, xmax, ymax;
            xmin = centerPt.x - (1000 / 2);
            ymin = centerPt.y - (1000 / 2);
            xmax = centerPt.x + (1000 / 2);
            ymax = centerPt.y + (1000 / 2);

            var nExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, geometry.spatialReference);
            map.setExtent(nExtent, true);
        }
        else {

            map.setExtent(fExtent, true);
        }
    } catch (Error) {

    console.debug("error occurred in 'ZoomMap' function", Error);
    }
}

function zoomToPoint(pt, height) {

    try {
        var xmin, ymin, xmax, ymax;
        xmin = pt.x - (1000 / 2);
        ymin = pt.y - (1000 / 2);
        xmax = pt.x + (1000 / 2);
        ymax = pt.y + (1000 / 2);

        var nExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, map.spatialReference);
        map.setExtent(nExtent);
    } catch (Error) {
        console.debug(Error);
    }
    
}


function zoomToAllGraphics() {
    var fullExt = esri.graphicsExtent(map.graphics.graphics);
    if (fullExt != null)
        map.setExtent(fullExt.expand(1.1));
}


// RESIZE THE MAP
function resizeMap(maps) {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(function() {
        dojo.forEach(maps, function(aMap) {
            if (aMap != null) {
                aMap.resize();
                aMap.reposition();
            }
        });
    }, 500);
}





function resize() {

    var sb = dijit.byId("sideBar");
    var mb = dijit.byId("mapBorder");

    if (collapsed) {
        sb.resize({ w: 300 });
        mb.resize({ l: 302 });
        collapsed = false;

        dojo.byId("btnCollaspeExpand").src = "images/toggle_collaspe.png";


    } else {
        sb.resize({ w: 1 });
        mb.resize({ l: 3 });
        collapsed = true;

        dojo.byId("btnCollaspeExpand").src = "images/toggle_expand.png";

    }
    mb.layout();
    sb.layout();
    map.resize();
    map.reposition();
    return false;
}


function showTaskProcessing() {
    dojo.byId("taskResults").innerHTML = "";
    dojo.style(dojo.byId("taskResults"), { "display": "none" });
    dojo.style(dojo.byId("taskIsProcessing"), { "display": "block" });
    dijit.byId('taskProcessing').show();
}

function hideTaskProcessing() {
    dojo.style(dojo.byId("taskIsProcessing"), { "display": "none" });
}

function showTaskResults(connect) {
    hideTaskProcessing();
    dojo.style(dojo.byId("taskResults"), { "display": "block" });
    dojo.byId("taskResults").innerHTML = connect;
    dijit.byId('taskProcessing').show();
}

function dismissTaskProcessing() {
    // clear the Task Results panel...
    dojo.byId("taskResults").innerHTML = "";
    dojo.style(dojo.byId("taskResults"), { "display": "none" });
    dojo.style(dojo.byId("taskIsProcessing"), { "display": "block" });
    dijit.byId('taskProcessing').hide();

}


function showConfigurationError(msg, error) {
    var s = [];
    s.push("<p>Configuration Error: </p><p>" + msg + "</p>");
    if (error != null) {
        console.debug(error);
    }
    dojo.byId("info").innerHTML = s.join("");
    showPanel("info");
}

function showError(msg, error) {
    var s = [];
    s.push("<p>An error has occurred in the application: </p><p>" + msg + "</p>");
    if (error != null) {
        console.debug(error);
    }
    s.push("<p>the error message is: " + error.message + "</p>");
    dojo.byId("info").innerHTML = s.join("");
    showPanel("info");

}

function initGeometryService() {

    gsvc = new esri.tasks.GeometryService(geoServiceUrl);
    esriConfig.defaults.io.proxyUrl = "proxy.ashx";
    esriConfig.defaults.io.alwaysUseProxy = false;
}

function hidePanels() {
    try {
        dojo.forEach(mapPanels, function(name) {
            dojo.style(name, { 'display': 'none' });
        });
    } catch (Error) {
        console.warn("An error occurred in 'hidePanel': ", Error);
    }
}

function getExtentString() {
    // get the extent of the current map and convert to a string xmin,ymin,xmax,ymax
    var extString = map.extent.xmin.toString() + ",";
    extString += map.extent.ymin.toString() + ",";
    extString += map.extent.xmax.toString() + ",";
    extString += map.extent.ymax.toString();
    return (extString);
}

function sendMail() {


    // open default email program with URI = appName + featureID and extent
    var emailSubject = "Tax Viewer Map";
    var idString = "";
    var mapStr = "";
    var extString = getExtentString();

    var featureID = 0;
    
    var url = esri.urlToObject(window.location.toString());
    var urlStr = encodeURI(url.path) + "?featureID=" + featureID + "%26extent=" + extString;
    parent.location.href = "mailto:?subject=" + emailSubject + "&body=" + urlStr;
}


function FindIDsByLayerName(layername, layerInfos) {
    var ids = [];
    dojo.forEach(layerInfos, function(layerinfo) {
        if (layerinfo.name.toUpperCase() == layername.toUpperCase()) {
            ids.push(layerinfo.id);
        }
    });
    return ids;
}



function isEnter(e) {
    if (window.event)  // IE
        if (window.event.keyCode == 13)
        return true;
    else
        return false;
    else if (e.which) // Netscape/Firefox/Opera
    {
        //alert(e.which);
        if (e.which == 13)
            return true;
        else
            return false;
    }
}

// utility function
populateSelectFromStore = function(store, target) {
    var mySelect = dojo.byId(target);

    store.fetch({

        onBegin: function() {
            //console.debug("begin");
            var myBlank = document.createElement("option");
            myBlank.setAttribute("value", "");
            mySelect.appendChild(myBlank);
        },

        onItem: function(item) {

            if (!store.hasAttribute(item, "endOfFile")) {
                console.debug("loaded " + store.getValue(item, "name"));
                var name = store.getValue(item, "name");
                var val = store.getValue(item, "value");
                var opt = document.createElement("option");
                opt.setAttribute("value", val);
                opt.innerHTML = name;
                mySelect.appendChild(opt);
            }
        },

        onComplete: function(items, request) {
            var myNode = dojo.byId(target);
            myNode.appendChild(mySelect);
        },

        onError: function(errData, request) {
            console.debug("Error");
            console.dir(errData);
        }
    });
}

// FORMAT NUMBERS WITH COMMAS
function addCommas(nStr) {
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

function getGraphicAttribute(graphic, attName) {

    try {
        var value = graphic.attributes[attName];
        if (value.toString() === "undefined")
            value = "";

        if (value === "Null")
            value = "";


        if (value === "null")
            value = "";

        return value;
    } catch (Error) {
        console.warn("Could not find value for field: " + attName);
        console.debug(graphic);
    }
}


function getFieldValue(graphic, fieldName) {
    // return the value of a named field
    var res = esri.substitute(graphic.attributes, "${" + fieldName + "}");
    return (res);
}

function findLayerByName(layername, mapservice) {

    var id = -1;
    var gLayer = map.getLayer(mapservice);
    if (gLayer != null) {
        dojo.forEach(gLayer.layerInfos, function(layerinfo) {
            //console.debug(layerinfo);
            if (layerinfo.name.toUpperCase() == layername.toUpperCase()) {
                id = layerinfo.id;
                return id;
            }
        });
    }
    return id
}

function populateMonth(ddlName) {
    try {

        var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUNE", "JULY", "AUG", "SEPT", "OCT", "NOV", "DEC"];
        var ddl = dojo.byId(ddlName);
        if (ddl != null) {
            ddl.innerHTML = "";

            createAttachOption(ddl, "", "");
            dojo.forEach(months, function(m, indx) {
                createAttachOption(ddl, indx + 1, m);
            });
        }
    } catch (Error) {
        console.warn("An Error occurred in Utils:populateMonth", Error);

    }
}

function getLastDay(month, year) {

    var lastDay = 30;
    switch (month) {
        case "1", "3", "5", "7", "9", "10", "12":
            lastDay = 31;
            break;
        case "2":
            if ((year % 4) == 0)
                lastDay = 29;
            else
                lastDay = 28;
            break;
        default:
            lastDay = 30;
            break;
    }

    return lastDay;

}

function populateYear(ddlName, numYears) {
    try {
        var ddl = dojo.byId(ddlName);

        if (ddl != null) {
            ddl.innerHTML = "";
            createAttachOption(ddl, "", "");
            var today = new Date();
            for (i = 0; i <= numYears; i++) {
                var yr = today.getFullYear() - i;
                createAttachOption(ddl, yr, yr);
            }
        }
    } catch (Error) {
        console.warn("An Error occurred in Utils:populateMonth", Error);
    }

}

