﻿/// <reference name="AppGeo.Web.Extensions.js" assembly="AppGeo.Web" />

function pageLoad(sender, args) {
    initializeComponents();

    appState.setItem("abuttersDistance", 50);
    appState.setItem("extent", AppContext.FullExtent);
    appState.setItem("tabId", "optInteractive");
    appState.setItem("ortho", false);
    appState.setItem("pixelSize", mapMain.get_pixelSize());
    appState.setItem("targetParcelIDs", []);


    CamaData = new Sys.Data.DataService("Services/CamaData.svc");
    CamaData.set_defaultFailedCallback(Svc_failed);
    MapService.set_defaultFailedCallback(Svc_failed);

    if (appState.contains("selectedPropertyID")) {
        setTab("optProperty");
        webRequests.queue(MapService, "GetExtentForProperty", { propertyID: appState.selectedPropertyID, scaleFactor: 1.6 }, MapService_GetExtent_succeeded);
        webRequests.queue(CamaData, "GetDataByPropertyID", { propertyID: appState.selectedPropertyID }, CamaData_LoadPropertyData_succeeded);
    }
    else {
        setTab("optInteractive");
        updateMap(false);
    }

    webRequests.queue(MapService, "GenerateInteractiveLegend", { dataframe: "Interactive" }, MapService_GenerateInteractiveLegend_succeeded);

}

function initializeComponents() {
    appState = $create(Ag.AppState, { id: "appState" });
    webRequests = $create(Ag.Net.WebRequestQueue, { id: "webRequests" }, { requestsQueued: webRequests_requestsQueued, requestsCompleted: webRequests_requestsCompleted });
    ddlCondos = $create(Ag.UI.SelectList, { dataTextField: "text", dataValueField: "value" }, { selectedIndexChanged: ddlCondos_selectedIndexChanged }, null, $get("ddlCondos"));
    dlAbutters = $create(Ag.UI.Repeater, null, null, null, $get("dlAbutters"));
    fvBasicPropertyInfo = $create(Ag.UI.FormView, null, null, null, $get("fvBasicPropertyInfo"));
    fvDetailedPropertyInfo = $create(Ag.UI.FormView, null, null, null, $get("fvDetailedPropertyInfo"));
    lgdInteractive = $create(Ag.UI.Legend, null, { checkChanged: lgdInteractive_checkChanged }, null, $get("lgdInteractive"));
    mvMapInfo = $create(Ag.UI.MultiView, { id: "mvMapInfo" });
    mvMapInfo.addViews(["vwProperty", "vwInteractive", "vwAbutters"]);
    mvMapInfo.set_selectedId("vwInteractive");
    mapMain = $create(Ag.UI.Map, { fullExtent: AppContext.FullExtent, extent: AppContext.FullExtent, clickMode: Ag.UI.ClickMode.zoomIn }, { extentChanged: mapMain_extentChanged, mapClick: mapMain_mapClick, mapShape: mapMain_mapShape }, { webRequestQueue: "webRequests" }, $get("mapMain"));
    menuTabs = $create(Ag.UI.ToolMenu, { id: "mapTab", itemIds: ["optProperty", "optInteractive", "optAbutters"], hoverCssClass: "mapTabHover", selectedCssClass: "mapTabSelect" }, { selectedIndexChanged: menuTabs_selectedIndexChanged });
    mapTools = $create(Ag.UI.ToolMenu, { id: "mapTools", itemIds: ["optZoomIn", "optPan", "optSelect", "optAddRemove", "optMeasureDistance", "optMeasureArea"], selectedId: "optZoomIn", disabledIds: ["optAddRemove"], hoverCssClass: "mapToolHover", selectedCssClass: "mapToolSelect", disabledCssClass: "mapToolDisabled" }, { selectedIndexChanged: mapTools_selectedIndexChanged });
    mapCommands = $create(Ag.UI.ToolMenu, { id: "mapCommands", itemIds: ["cmdFullExtent", "cmdZoomSelected", "cmdClear", "cmdPrintMapMenu", "cmdPrintLegend"], hoverCssClass: "mapCommandHover" });
    mapService = $create(Ag.UI.ShingledMapService, { id: "MapService", usePost: true });
    mapMain.addService(mapService, false);
    $addHandler($get("tboScale"), "keydown", tboScale_keydown);
    $addHandler($get("tboSearchDistance"), "keydown", tboSearchDistance_keydown);
    $create(Ag.UI.ZoomBar, { map: mapMain, orientation: Ag.UI.ZoomBarOrientation.Horizontal }, null, null, $get("zoomBar"));
    $create(Ag.UI.ScaleText, { map: mapMain, pixelLength: 96 }, null, null, $get("scaleText"));
}

function chkOrthos_click(e) {
    $common.setVisible($get("pnlWaitMap"), true);
    appState.setItem("ortho", $get("chkOrthos").checked);
    updateMap(true);
}

function cmdClear_click(e) {
    selectProperty(null);
}

function cmdExportAbuttersData_click(e) {
    webRequests.newContent("ExportAbuttersData.ashx", { appState: appState }, "_blank");
}

function cmdMailingLabels_click(e) {
    webRequests.newContent("PrintLabels.ashx", { appState: appState }, "_blank");
}

function cmdNewSearch_click(e) {
    webRequests.newContent("Default.aspx", { appState: appState });
}

function cmdPrintLegend_click(e) {
    webRequests.newContent("PrintLegend.ashx", { appState: appState }, "_blank");
}
function cmdPrintMenu_click(e) {
    $common.setVisible($get("pnlPrintMenu"), true);
}

function cmdPrintMap_click(e) {
    var layoutName = "Letter";
    if ($get("optTabloid").checked) {
        layoutName = "Tabloid";
    }
    webRequests.newContent("PrintMap.ashx", { appState: appState, layoutname: layoutName, mapTitle: $get("tboMapTitle").value }, "_blank");
    $common.setVisible($get("pnlPrintMenu"), false);
}

function cmdPrintMapCancel_click(e) {
    $common.setVisible($get("pnlPrintMenu"), false);
}

function cmdPropertyRecordCard_click(e) {
    webRequests.newContent("PropertyRecordCard.ashx", { appState: appState }, "_blank");
}

function cmdSelectedProperty_click(el) {
    webRequests.queue(CamaData, "GetDataByPropertyID", { propertyID: el.tag }, CamaData_LoadPropertyData_succeeded);
}

function cmdZoomFullExtent_click(e) {
    mapMain.set_extent(mapMain.get_fullExtent());
}

function cmdZoomSelected_click(e) {
    var selectedTab = menuTabs.get_selectedId();
    if (selectedTab == "optAbutters") {
        webRequests.queue(MapService, "GetExtentforHighlightedProperties", { appState: appState, scaleFactor: 1.6 }, MapService_GetExtent_succeeded);
    }
    else {
        webRequests.queue(MapService, "GetExtentForProperty", { propertyID: appState.selectedPropertyID, scaleFactor: 1.6 }, MapService_GetExtent_succeeded);
    }
}

function ddlCondos_selectedIndexChanged(sender, args) {
    webRequests.queue(CamaData, "GetDataByPropertyID", { propertyID: ddlCondos.get_selectedValue() }, CamaData_UpdatePropertyData_succeeded);
}

function lgdInteractive_checkChanged(sender, args) {
    $common.setVisible($get("pnlWaitMap"), true);
    appState.setItem("interactiveLayers", lgdInteractive.get_checkedValues());
    updateMap(true);
}

function mapMain_extentChanged(sender, args) {
    appState.setItem("extent", mapMain.get_extent());
    appState.setItem("pixelSize", mapMain.get_pixelSize());
    $get("tboScale").value = String(Math.round(mapMain.get_scale()));
}

function mapMain_mapClick(sender, args) {
    if (mapTools.get_selectedId() == "optSelect") {
        webRequests.queue(MapService, "MapClick", { coord: args.get_mapCoord(), pixelSize: mapMain.get_pixelSize(), selectedPropertyID: appState.selectedPropertyID });
    }
}

function mapMain_mapShape(sender, args) {
    if (menuTabs.get_selectedId() == "optAbutters") {
        if (mapTools.get_selectedId() == "optAddRemove") {
            webRequests.queue(MapService, "EditAbutters", { poly: args.get_mapShape(), selectedPropertyID: appState.selectedPropertyID });
        }
    }
}

function mapTools_selectedIndexChanged(sender, args) {
    var opt = sender.get_selectedId();
    switch (opt) {
        case "optZoomIn":
            mapMain.set_clickMode(Ag.UI.ClickMode.zoomIn);
            break;

        case "optPan":
            mapMain.set_clickMode(Ag.UI.ClickMode.pan);
            break;

        case "optSelect":
            mapMain.set_clickMode(Ag.UI.ClickMode.click);
            break;

        case "optAddRemove":
            mapMain.set_clickMode(Ag.UI.ClickMode.drawRectangle);
            break;

        case "optMeasureDistance":
            mapMain.set_clickMode(Ag.UI.ClickMode.measureLength);
            break;

        case "optMeasureArea":
            mapMain.set_clickMode(Ag.UI.ClickMode.measureArea);
            break;
    }
}

function menuTabs_selectedIndexChanged(sender, args) {
    var selectedTab = menuTabs.get_selectedId();
    var selectedTool = mapTools.get_selectedId();
    setTab(selectedTab);

    if (selectedTab == "optAbutters") {
        mapTools.setEnabled("optAddRemove", true);
        mapTools.set_selectedId("optAddRemove");
        mapMain.set_clickMode(Ag.UI.ClickMode.drawRectangle);
        webRequests.queue(MapService, "GetExtentforHighlightedProperties", { appState: appState, scaleFactor: 1.6 }, MapService_GetExtent_succeeded);
    }
    else {
        if (selectedTool == "optAddRemove") {
            mapTools.set_selectedId("optZoomIn");
            mapMain.set_clickMode(Ag.UI.ClickMode.zoomIn);
        }
        mapTools.setEnabled("optAddRemove", false);
        updateMap(true);
    }
}

function tboScale_keydown(e) {
    if (e.keyCode == Sys.UI.Key.enter) {
        var mapScale = Number.parseInvariant($get("tboScale").value);
        if (isNaN(mapScale)) {
            alert("Please enter a valid scale number.");
        }
        else {
            mapMain.set_scale(mapScale);
        }

    }
}

function tboSearchDistance_keydown(e) {
    if (e.keyCode == Sys.UI.Key.enter) {
        webRequests.queue(MapService, "FindAbutters", { bufferDistance: $("#tboSearchDistance").val(), selectedPropertyID: appState.selectedPropertyID, targetParcelIDs: appState.targetParcelIDs });
        appState.setItem("abuttersDistance", $("#tboSearchDistance").val());
    }
}

function webRequests_requestsQueued(sender, args) {
    $common.setVisible($get("pnlWaitMap"), true);
    $("#dlAbutters > table:odd").css("background-color", "#FFFFFF");
}

function webRequests_requestsCompleted(sender, args) {
    $common.setVisible($get("pnlWaitMap"), false);
}

function CamaData_GetDataByAbuttersParcelIDs_succeeded(result) {
    dlAbutters.set_dataSource(result);
    dlAbutters.dataBind();
}

function CamaData_LoadPropertyData_succeeded(result) {
    selectProperty(result, true);
}

function CamaData_UpdatePropertyData_succeeded(result) {
    selectProperty(result, false);
}

function MapService_EditAbutters_succeeded(result) {
    if (result != null) {
        if ($get("optAbuttersEdit").checked) {
            var abuttersParcelIDs = appState.getItem("abuttersParcelIDs");
            var abutterCount = abuttersParcelIDs.length;

            if ($get("optAdd").checked) {
                for (var i = 0; i < result.length; i++) {
                    if (!Array.contains(abuttersParcelIDs, result[i])) {
                        Array.add(abuttersParcelIDs, result[i]);
                    }
                }
            }
            else {
                for (var i = 0; i < result.length; i++) {
                    if (Array.contains(abuttersParcelIDs, result[i])) {
                        Array.remove(abuttersParcelIDs, result[i]);
                    }
                }
            }
            if (abuttersParcelIDs.length != abutterCount) {
                appState.setItem("abuttersParcelIDs", abuttersParcelIDs);
                webRequests.queue(CamaData, "GetDataByAbuttersParcelIDs", { parcelIDs: abuttersParcelIDs.toString(), propertyID: appState.selectedPropertyID });
                updateMap(true);
            }
        }
        else {
            var targetParcelIDs = appState.getItem("targetParcelIDs");
            var targetCount = targetParcelIDs.length;

            if ($get("optAdd").checked) {
                for (var i = 0; i < result.length; i++) {
                    if (!Array.contains(targetParcelIDs, result[i])) {
                        Array.add(targetParcelIDs, result[i]);
                    }
                }
            }
            else {
                for (var i = 0; i < result.length; i++) {
                    if (Array.contains(targetParcelIDs, result[i])) {
                        Array.remove(targetParcelIDs, result[i]);
                    }
                }
            }
            if (targetParcelIDs.length != targetCount) {
                appState.setItem("targetParcelIDs", targetParcelIDs);
                webRequests.queue(MapService, "FindAbutters", { bufferDistance: $("#tboSearchDistance").val(), selectedPropertyID: appState.selectedPropertyID, targetParcelIDs: targetParcelIDs });
            }
        }
    }
}

function MapService_FindAbutters_succeeded(result) {
    appState.setItem("abuttersParcelIDs", result);
    webRequests.queue(CamaData, "GetDataByAbuttersParcelIDs", { parcelIDs: appState.abuttersParcelIDs.toString(), propertyID: appState.selectedPropertyID });
    if (menuTabs.get_selectedId() == "optAbutters") {
        updateMap(true);
    }
}

function MapService_FindCondos_succeeded(result) {
    if (result != null && result.length > 1) {
        ddlCondos.set_dataSource(result);
        ddlCondos.dataBind();
        ddlCondos.set_selectedValue(appState.selectedPropertyID);
        $common.setVisible($get("lblOwner"), false);
        $common.setVisible($get("ddlCondos"), true);
    }
    else {
        $common.setVisible($get("lblOwner"), true);
        $common.setVisible($get("ddlCondos"), false);
    }
}

function MapService_GenerateInteractiveLegend_succeeded(result) {
    lgdInteractive = $find("lgdInteractive");
    lgdInteractive.set_dataSource(result);
    lgdInteractive.dataBind();
    appState.setItem("interactiveLayers", lgdInteractive.get_checkedValues());

    if (menuTabs.get_selectedId() == "optInteractive") {
        updateMap(true);
    }
}

function MapService_GetExtent_succeeded(result) {
    if (result == 0 || result == null) {
        alert("Property extent could not be found.");
        updateMap(true);
    }
    else {
        mapMain.set_extent(result);
    }
}

function MapService_MapClick_succeeded(result) {
    if (result != null) {
        if (mapTools.get_selectedId() == "optSelect") {
            webRequests.queue(CamaData, "GetDataByPropertyID", { propertyID: result }, CamaData_LoadPropertyData_succeeded);
        }
    }
}

function Svc_failed(error) {
    alert(error.get_message());
}

function selectProperty(property, newParcel) {
    if (property != null) {
        appState.setItem("selectedPropertyID", property.PropertyID);
        fvBasicPropertyInfo.set_dataSource(property);
        fvBasicPropertyInfo.dataBind();
        fvDetailedPropertyInfo.set_dataSource(property);
        fvDetailedPropertyInfo.dataBind();
        $("#fvDetailedPropertyInfo tr:odd").css("background-color", "#FFFFFF");
        appState.setItem("targetParcelIDs", []);
        webRequests.queue(MapService, "FindAbutters", { bufferDistance: $("#tboSearchDistance").val(), selectedPropertyID: appState.selectedPropertyID, targetParcelIDs: appState.targetParcelIDs });

        if (newParcel) {
            $common.setVisible(ddlCondos.get_element(), false);
            webRequests.queue(MapService, "FindCondos", { selectedPropertyID: appState.selectedPropertyID });

            if (menuTabs.get_selectedId() != "optAbutters") {
                updateMap(true);
            }
        }
    }
    else {
        $common.setVisible(ddlCondos.get_element(), false);
        if (appState.contains("selectedPropertyID")) {
            appState.remove("selectedPropertyID");
            fvBasicPropertyInfo.set_dataSource(null);
            fvBasicPropertyInfo.dataBind();
            fvDetailedPropertyInfo.set_dataSource(null);
            fvDetailedPropertyInfo.dataBind();
            updateMap(true);
        }
    }
}

function setTab(tabId) {
    appState.setItem("tabId", tabId);
    menuTabs.set_selectedId(tabId);

    mvMapInfo.set_selectedIndex(menuTabs.get_selectedIndex());
    updateMap(false);
}

function updateMap(refresh, forceReload) {
    if (refresh && forceReload) {
        appState.setItem("updateTime", (new Date()).valueOf());
    }

    mapService.set_urlFormat(mapFormatBase + "&appState=" + appState.encode());

    if (refresh) {
        mapMain.refresh();
    }
}

var appState = null;
var ddlCondos = null;
var ddlTheme = null
var dlAbutters = null;
var CamaData = null;
var fvBasicPropertyInfo = null;
var fvDetailedPropertyInfo = null;
var lgdInteractive = null;
var mapMain = null;
var mapService = null;
var mapTools = null;
var menuTabs = null;
var mvMapInfo = null;
var webRequests = null;

var mapFormatBase = "MapHandler.ashx?xmin={0}&ymin={1}&xmax={2}&ymax={3}&width={4}&height={5}";

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
