﻿dojo.require("esri.map");
dojo.require("esri.tasks.identify");
dojo.require("esri.tasks.query");
dojo.require("esri.tasks.geometry");
dojo.require("esri.toolbars.draw");

var MO = {
    mapLayerUrl: false,
    identifyTaskUrl: false,
    queryTaskUrl: false,
    queryTaskCondoUrl: false,
    geometryServiceUrl: false,
    map: false,
    bar: false,
    loading: false,
    draw: false,
    extent: false,
    query: false,
    queryTask: false,
    queryTaskCondos: false,
    identifyTask: false,
    identifyParams: false,
    symbol: false,
    symbolCondos: false,
    default_layers: false,
    findTask: false,
    findParams: false,
    infos: false,
    visibleLayers:[],
    dynMapLayer: false,
    lastExtent: false,
    identWin: false,
    geometryService: false,
    measure: false,
    drag:false
};

var zoomInOut;
var _measureArea = false;
function mapResultInit() {
    MO.loading = dojo.byId('loading_img');
    zoomInOut = dojo.byId('zoom-in-out');
    esriConfig.defaults.map.slider = { right: '10px', top: '10px', width: null, height: '100px' }
    MO.map = new esri.Map("resultMapDiv", { slider: false, nav: false });
    
    if (!MO.mapLayerUrl) {return false;}
    MO.dynMapLayer = new esri.layers.ArcGISDynamicMapServiceLayer(MO.mapLayerUrl);
    
    MO.dynMapLayer.setDPI(96);
    MO.dynMapLayer.setImageFormat('jpg'); //default jpeg because aerials on by default
    //MO.dynMapLayer.setVisibleLayers([2,5,8,11,67,70]);
    MO.dynMapLayer.setVisibleLayers([2,5,8,11,71,74]);
    if (MO.dynMapLayer.loaded) { buildLayerList(MO.dynMapLayer);
    } else { dojo.connect(MO.dynMapLayer, "onLoad", buildLayerList); }

    // geometry service
    if (!MO.geometryServiceUrl) { return false; }
    MO.measure = new esri.toolbars.Draw(MO.map);
    MO.geometryService = new esri.tasks.GeometryService(MO.geometryServiceUrl);
    dojo.connect(MO.geometryService, "onAreasAndLengthsComplete", showMeaureLengths);
    dojo.connect(MO.geometryService, "onLengthsComplete", showMeaureLengths);
    dojo.connect(MO.geometryService, "onProjectComplete", function(graphics) {MO.geometryService.lengths(graphics);});
    dojo.connect(MO.measure, "onDrawEnd", function(geometry) {
        jQuery("#map-measure-box").show();
        MO.map.graphics.clear();
        var _symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("red"), 1.5);
        var mGraphic = MO.map.graphics.add(new esri.Graphic(geometry, _symbol));
        if (_measureArea) {
            MO.geometryService.simplify([mGraphic], function(graphics) {
                MO.geometryService.areasAndLengths(graphics);
            });
        } else {
            MO.geometryService.project([mGraphic], new esri.SpatialReference({ "wkid": 2236 }));
        }
    });
    
    MO.bar = new esri.toolbars.Navigation(MO.map);
    MO.draw = new esri.toolbars.Draw(MO.map);

    if (!MO.identifyTaskUrl) {return false;}
    MO.identifyTask = new esri.tasks.IdentifyTask(MO.identifyTaskUrl);
    MO.identifyParams = new esri.tasks.IdentifyParameters();
    MO.identifyParams.tolerance = 3;
    MO.identifyParams.returnGeometry = true;
    
    //condosales2010, parcelsales2010,  condosales2009,parcelsales2009, sales2008, CONDO_UNITS, PARCELS
    //MO.identifyParams.layerIds = [3,4,6,7,8,57,65];
    MO.identifyParams.layerIds = [3,4,6,7,8,61,69];
    MO.identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;

    MO.symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.2]));
    MO.symbolCondos = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 30, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.2]));
    if (!MO.queryTaskUrl) { return false; }
    MO.queryTask = new esri.tasks.QueryTask(MO.queryTaskUrl);
    if (!MO.queryTaskCondoUrl) { return false; }
    MO.queryTaskCondos = new esri.tasks.QueryTask(MO.queryTaskCondoUrl);
    MO.query = new esri.tasks.Query();
    MO.query.returnGeometry = true;

    esri.show(zoomInOut);
    dojo.connect(MO.map, "onZoomStart", showLoading);
    dojo.connect(MO.map, "onPanStart", showLoading);
    dojo.connect(MO.dynMapLayer, "onUpdate", endLoading);
    dojo.connect(MO.draw, "onDrawEnd", addToMap);
    dojo.connect(MO.map, "onLoad", after);
    dojo.connect(MO.map, "onClick", identifyWin);
    dojo.connect(MO.map, "onMouseDragStart", function(evt) { if (MO.drag) { setCursor('move'); } });
    dojo.connect(MO.map, "onMouseDragEnd", function(evt) { if (MO.drag) { setCursor(''); } });
    
    jQuery("#MapSearchWrapper").css({ visibility: 'visible' });
    endLoading();
}

function showMeaureLengths(result) {
    var _result = '';
    if (!_measureArea) {
        _result = '<strong>Feet:</strong> ' + dojo.number.format((result.lengths[0] / 1));
    } else {
        _result = '<strong>Perimeter(feet):</strong> ' + dojo.number.format((result.lengths[0] / 1), { places: 2 }) + '<br />';
        _result += '<strong>Sq. feet:</strong> ' + dojo.number.format((result.areas[0] / 1), { places: 2 }) + '<br />';
        _result += '<strong>Acres:</strong> ' + dojo.number.format((result.areas[0] / 43560), {places:2});
    }
    jQuery("#map-measure-box-content").html(_result);
}

// Identify Tool
function identifyWin(evt) {
    if (MO.identWin == false) { return false; }
    MO.map.infoWindow.setTitle("Identify Result");
    MO.map.infoWindow.resize(300, 160);
    MO.map.infoWindow.setContent('<img src="img/ajax-big-e2e2e2.gif" style="top:65px;left:100px;position:absolute;" />');
    MO.map.infoWindow.show(evt.screenPoint, MO.map.getInfoWindowAnchor(evt.screenPoint));
    MO.identifyParams.geometry = evt.mapPoint;
    MO.identifyParams.mapExtent = MO.map.extent;
    MO.identifyTask.execute(MO.identifyParams, function(identifyResult) {
        var _salesInfo = '';
        var res;
        for (var k = 0; k < identifyResult.length; k++) {
            var _t = identifyResult[k];
            switch (_t.layerId) {
                case 3:
                case 4:
                case 6:
                case 7:
                case 8:
                    _salesInfo = '<table class="identify-result">';
                    _salesInfo += '<tr><th>SALE DATE:</th><td>' + _t.feature.attributes['SALEDATE'] + '</td></tr>'
                    _salesInfo += '<tr><th>AMOUNT:</th><td>$' + dojo.number.format(_t.feature.attributes['SALEPRICE'], {places:2}) + '</td></tr>';
                    _salesInfo += '</table>';
                    break;
                //case 57:
                //    res = identifyResult[k];
                //    break;
                case 61:
                    res = identifyResult[k];
                    break;
                //case 65:
                //    res = identifyResult[k];
                //    break;
                case 69:
                    res = identifyResult[k];
                    break;
            }
        }
        if (!res) { MO.map.infoWindow.setContent("Parcel not found."); return false; }
        jQuery.ajax({
            cache: false,
            url: 'AjaxControls/Identify.aspx',
            data: { pin: res.feature.attributes['PIN'] },
            success: function(data, textStatus) {
                MO.map.infoWindow.setContent('');
                if (_salesInfo != '') { data += _salesInfo; MO.map.infoWindow.resize(300, 190);}
                MO.map.infoWindow.setContent(data);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) { MO.map.infoWindow.setContent("An error occurred retrieving the data."); }
        });

    });
}

function buildLayerList(_layer) {
    var info;
    var outlist = '';
    for (i = 0; i < _layer.visibleLayers.length; i++) {
        info = _layer.layerInfos[_layer.visibleLayers[i]];
        if (info.defaultVisibility) { MO.visibleLayers.push(info.id); }
        outlist += "<input type='checkbox' class='list_item' " + (info.defaultVisibility ? "checked='checked'" : "") + " id='" + info.id + "' /><label for='" + info.id + "'>" + info.name + "</label><br />";
    }
    jQuery("#layer-list-content").html(outlist);
    _layer.setVisibleLayers(MO.visibleLayers);
    MO.map.addLayer(_layer);
}

function after() {
    jQuery(".list_item").each(function() {
        jQuery(this).click(function() {
            var inputs = dojo.query(".list_item");
            MO.visibleLayers = [];
            for (i = 0; i < inputs.length; i++) {
                if (inputs[i].checked) { MO.visibleLayers.push(inputs[i].id); }
            }
            MO.dynMapLayer.setVisibleLayers(MO.visibleLayers);
            if (inputs[inputs.length - 1].checked) {
                MO.dynMapLayer.setImageFormat('jpg');
            } else {
                MO.dynMapLayer.setImageFormat('png');
            }
        });
    });
}

/* called outside of Object */
function execQuery(PIN) {
    MO.currentPIN = PIN;
    MO.query.where = "PIN = '" + MO.currentPIN + "'";
    try {
        MO.map.graphics.clear();
    } catch (ex) {
        return false;
    }

    MO.queryTask.execute(MO.query, function(res) {
        var ft;
        var xt;
        ft = res.features[0];
        if (!ft) {
            MO.queryTaskCondos.execute(MO.query, function(res) {
                ft = res.features[0];
                if (ft) {
                    ft.setSymbol(MO.symbolCondos);
                    var pt = ft.geometry;
                    xt = new esri.geometry.Extent(pt.x - 100, pt.y - 100, pt.x + 100, pt.y + 100, null);
                    MO.map.setExtent(xt);
                    MO.map.graphics.add(ft);
                }
            });
        } else {
            ft.setSymbol(MO.symbol);
            xt = ft.geometry.getExtent().expand(3.0);
            MO.map.setExtent(xt);
            MO.map.graphics.add(ft);
        }
    });
}

function getSelectedParcelsExtent() {
    if (MO.map.graphics.graphics.length < 1) { return false; }
    var _ext = (MO.map.graphics.graphics.length > 0) ? esri.graphicsExtent(MO.map.graphics.graphics) : false;
    if (!_ext) { return false; }
    var _tempExt = _ext.expand(1.5);
    MO.map.setExtent(_tempExt);
}

/* Called after drawing */
function addToMap(geometry) {
    if (!geometry) { return false; }
    var q = [];
    var _url = '';
    var _data = {};
    var _targetDiv = '';
    showLoading();
    MO.map.graphics.clear();
    MO.identifyParams.geometry = geometry;
    MO.identifyParams.mapExtent = MO.map.extent;
    //MO.lastExtent = MO.map.extent;
    MO.identifyTask.execute(MO.identifyParams, function(identifyResult) {
        for (i = 0; i < identifyResult.length; i++) {
            var res = identifyResult[i];
            //if (res.layerId == 65) {
            //    var _temp = res.feature.attributes['PIN'];
            //    if (jQuery.inArray(_temp, q) < 0) {
            //        res.feature.setSymbol(MO.symbol);
            //        MO.map.graphics.add(res.feature);
            //        q.push(_temp);
            //    }
            //}
            if (res.layerId == 69) {
                var _temp = res.feature.attributes['PIN'];
                if (jQuery.inArray(_temp, q) < 0) {
                    res.feature.setSymbol(MO.symbol);
                    MO.map.graphics.add(res.feature);
                    q.push(_temp);
                }
            }
            //if (res.layerId == 57) {
            //    if (jQuery.inArray(_temp, q) < 0) { q.push(res.feature.attributes['PIN']); }
            //}
            if (res.layerId == 61) {
                if (jQuery.inArray(_temp, q) < 0) { q.push(res.feature.attributes['PIN']); }
            }
        }
        if (q.length == 1) {
            jQuery('#parcelResultTab .tab-content').html('<img style="float:left;border:none;padding:0;marign:0;" src="Img/ajax-loader.gif" alt=""/>loading...');
            _url = 'AjaxControls/ParcelFull.aspx';
            _data = { pid: q[0] };
            _targetDiv = '#ParcelResultContent';
        } else {
            jQuery('#searchResultsTab .tab-content').html('<img style="float:left;border:none;padding:0;marign:0;" src="Img/ajax-loader.gif" alt=""/>loading...');
            _url = 'AjaxControls/MapSearch.aspx';
            _data = { type: 'map2', page: 1 };
            var _ids = '';
            for (var i = 0; i < q.length; i++) {
                if (_ids != '') { _ids += ','; }
                _ids += q[i];
            }
            _data.ids = _ids;
            _targetDiv = '#SearchResultContent';
        }
        jQuery.ajax({
            cache: false,
            url: _url,
            data: _data,
            beforeSend: function() {
                jQuery('#SearchResults').addClass('ajax-search');
                jQuery('#SearchResultErrorWrapper').hide();
                jQuery('#SearchResultError').html('');
            }, success: function(data, textStatus) {
                jQuery(_targetDiv).html(data);
            }, complete: function(XMLHttpRequest, textStatus) {
                jQuery('#SearchResults').removeClass('ajax-search');
                var _out = 'Search Results';
                _out += (!global_search_results) ? '' : ' (' + global_search_results + ')';
                jQuery('#searchResultsTab .tab-content').html(_out);
                jQuery('#parcelResultTab .tab-content').html('Parcel Result');
                endLoading();
            }, error: function(XMLHttpRequest, textStatus, errorThrown) {
                jQuery('#SearchResultErrorWrapper').show();
                jQuery('#SearchResultError').html(errorThrown);
            }
        });
        q = [];
    });
}

function showLoading() { esri.show(MO.loading); }
function endLoading() { esri.hide(MO.loading); }
function resetMapTools() {
    MO.draw.deactivate();
    MO.bar.deactivate();
    MO.measure.deactivate();
    MO.identWin = false;
    setCursor('');
    MO.drag = false;
}

function setCursor(type) {
    var _selector = '.container div';
    switch (type) { 
        case 'crosshair':
            jQuery(_selector).css({ cursor: 'crosshair' });
            break;
        case 'help':
            jQuery(_selector).css({ cursor: 'help' });
            break;
        case 'pointer':
            jQuery(_selector).css({ cursor: 'pointer' });
            break;
        case 'move':
            jQuery(_selector).css({ cursor: 'move' });
            break;
        case 'zoomin':
            jQuery(_selector).css({ cursor: "url('cur/zoomin.cur'), url('cur/zoomin.png'), crosshair" });
            break;
        case 'zoomout':
            jQuery(_selector).css({ cursor: "url('cur/zoomout.cur'), url('cur/zoomout.png'), crosshair" });
            break;
        default:
            jQuery(_selector).css({ cursor: 'default' });
    }
    // custom resets
    jQuery('#resultMapDiv_infowindow div').css({ cursor: 'default' });
    jQuery('#zoom-in-out div').css({ cursor: 'default' });
    jQuery('#map-sidebar div').css({ cursor: 'default' });
}

function closeAllMapItems() {
    jQuery('#map-sidebar .map-sidebar-item').each(function() {
        jQuery(this).hide();
    });
}

jQuery(function() {
    jQuery('#map-zoom-out').click(function() {
        MO.map.setExtent(MO.map.extent.expand(1.6));
    });
    jQuery('#map-zoom-in').click(function() {
        MO.map.setExtent(MO.map.extent.expand(0.6));
    });
    jQuery("#map_full_extent").click(function() {
        MO.bar.zoomToFullExtent();
    });
    jQuery("#map_identify").click(function() {
        resetMapTools(); MO.identWin = true;
        setCursor('help');
    });
    jQuery("#map_select").click(function() {
        closeAllMapItems();
        resetMapTools();
        jQuery("#map-selection-box").show().css({ cursor: 'default' });
        jQuery("#map-selection-box-content").html('');
        jQuery("#radio-selection-extent").click();
    });
    jQuery("#map-selection-box-select-type :input").click(function() {
        resetMapTools();
        if (this.type == 'radio') {
            switch (this.value) {
                case 'extent':
                    MO.draw.activate(esri.toolbars.Draw.EXTENT);
                    break;
                case 'polyline':
                    MO.draw.activate(esri.toolbars.Draw.POLYLINE);
                    break;
                case 'polygon':
                    MO.draw.activate(esri.toolbars.Draw.POLYGON);
                    break;
            }
            setCursor('crosshair');
        }
    });
    jQuery("#map-selection-box-close-btn").click(function() {
        jQuery("#map-selection-box").hide(); resetMapTools();
    });
    jQuery("#map_zoom_in").click(function() {
        resetMapTools();
        MO.bar.activate(esri.toolbars.Navigation.ZOOM_IN);
        setCursor('zoomin');
    });
    jQuery("#map_zoom_out").click(function() {
        resetMapTools();
        MO.bar.activate(esri.toolbars.Navigation.ZOOM_OUT);
        setCursor('zoomout');
    });
    jQuery("#map_pan").click(function() {
        resetMapTools();
        MO.bar.activate(esri.toolbars.Navigation.PAN);
        MO.drag = true;
    });
    jQuery("#clear_map_selection").click(function() {
        MO.map.graphics.clear(); MO.map.infoWindow.hide();
    });
    jQuery("#map-nav-bar-wrapper div").click(function() {
        if (jQuery(this).hasClass("nobox")) { return false; }
        jQuery("#map-nav-bar-wrapper div").each(function() { jQuery(this).removeClass('selected'); });
        jQuery(this).addClass('selected');
    });
    jQuery("#map-nav-bar-wrapper div").hover(
        function() { jQuery(this).css({ textDecoration: 'underline' }); },
        function() { jQuery(this).css({ textDecoration: 'none' }); }
    );
    jQuery("#layer_list").click(function() {
        closeAllMapItems();
        jQuery("#layer-list-wrapper").toggle();
    });
    jQuery("#layer-list-close-btn").click(function() {
        jQuery("#layer-list-wrapper").hide();
    });
    jQuery("#zoom_to_selection").click(function() {
        //if (MO.lastExtent) { MO.map.setExtent(MO.lastExtent); }
        if (getSelectedParcelsExtent()) { 
        
        }
    });
    jQuery("#map_measure").click(function() {
        closeAllMapItems();
        jQuery("#map-measure-box").show(); resetMapTools();
        jQuery("#map-measure-box-content").html('');
        jQuery("#radio-measure-polyline").click();
        MO.measure.activate(esri.toolbars.Draw.POLYLINE);
    });
    jQuery("#map-measure-box-select-type :input").click(function() {
        resetMapTools();
        if (this.type == 'radio') {
            switch (this.value) {
                case 'polygon':
                    MO.measure.activate(esri.toolbars.Draw.POLYGON); _measureArea = true;
                    break;
                case 'polyline':
                    MO.measure.activate(esri.toolbars.Draw.POLYLINE); _measureArea = false;
                    break;
            }
            setCursor('crosshair');
        }
    });
    jQuery("#map-measure-box-close-btn").click(function() {
        jQuery("#map-measure-box").hide(); MO.map.graphics.clear(); resetMapTools(); jQuery("#map_pan").click();
    });
    
    var _baseMapHref = '';
    jQuery("#print_current_view").click(function() {
        if (_baseMapHref == '') { _baseMapHref = this.href; }
        var layerString = '';
        var xmax = MO.map.extent.xmax;
        var xmin = MO.map.extent.xmin;
        var ymax = MO.map.extent.ymax;
        var ymin = MO.map.extent.ymin;
        this.href = _baseMapHref + '?xmax=' + xmax + '&xmin=' + xmin + '&ymax=' + ymax + '&ymin=' + ymin;
        if (MO.visibleLayers.length < 1) { return true; }
        for (i = 0; i < MO.visibleLayers.length; i++) {
            if (layerString != '') { layerString += ','; }
            layerString += MO.visibleLayers[i];
        }
        this.href += '&layers=' + layerString;
        return true;
    });
    
    var _baseVirualEarthHref = ''
    jQuery("#microsoft-live-earth").click(function() {
        if (_baseVirualEarthHref == '') { _baseVirualEarthHref = this.href; }
        var x = (MO.map.extent.xmin + MO.map.extent.xmax) / 2;
        var y = (MO.map.extent.ymin + MO.map.extent.ymax) / 2;
        this.href = _baseVirualEarthHref + '?x=' + x + '&y=' + y;
        return true;
    });
});