﻿// Dojo Requirements
dojo.require("esri.map");
dojo.require("esri.tasks.query");
dojo.require("esri.toolbars.navigation");
dojo.require("dijit.form.Button");
dojo.require("dijit.Toolbar");
dojo.require("dijit.Dialog");
dojo.require("dijit.Menu");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.layout.ContentPane");

// Variables
var map,
    gMap,
    dynamicLayer,
    baseBottomLayer,
    baseTopLayer,
    diagLayer,
    navToolbar,
    mapMenu,
    currentHeight,
    currentExtent,
    graphicsLayer,
    dgraphicsLayer,
    ml_enabled_SQL,
    ml_disabled_SQL,
    lastClickPoint,
    currAlternative,
    masterLayerList,
    ptrs,
    ptrsEnabled,
    showML,
    isDiagramming = false,
    baseUrl = 'http://gis.arcadis-us.com/ArcGISPublic/rest/services/revive285/',
    baseUrl2= 'http://ga1ims2.arcadis-us.com/ArcGIS/rest/services/revive285/';

// Hook into the page load
dojo.addOnLoad(init);

function init() {
    // size the map
    setMapDivSize();

    // Get the map service layer
    dynamicLayer = new esri.layers.ArcGISDynamicMapServiceLayer(baseUrl2 + 'Dynamic/MapServer');
    baseBottomLayer = new esri.layers.ArcGISTiledMapServiceLayer(baseUrl + 'Base_Bottom/MapServer');
    baseTopLayer = new esri.layers.ArcGISTiledMapServiceLayer(baseUrl + 'Base_Top/MapServer');

    diagLayer = new esri.layers.ArcGISDynamicMapServiceLayer(baseUrl2 + 'WebMapDiagram_93/MapServer');

    map = new esri.Map("map", { slider: true, nav: true });
  
    map.addLayer(baseBottomLayer);
    map.addLayer(dynamicLayer);
    map.addLayer(diagLayer);
    map.addLayer(baseTopLayer);

    graphicsLayer = new esri.layers.GraphicsLayer();
    zoomGraphicsLayer = new esri.layers.GraphicsLayer();

    toggleDiagrams(false);
    addInterchangeMenuItems();
      
    // Create the toolbar
    navToolbar = new esri.toolbars.Navigation(map);
    
    // Setup events
    dojo.connect(navToolbar, "onExtentHistoryChange", extentHistoryChangeHandler);

    dojo.connect(window, "onresize", resizeMap);
    dojo.connect(map, "onLoad", initMap);
    dojo.connect(map, "onMouseUp", function (evt) {
        lastClickPoint = evt.mapPoint;
    });

    // Menu
    mapMenu = new dijit.Menu({
        targetNodeIds: ["map"]
    });

    mapMenu.addChild(new dijit.MenuItem({
        label: "See in Google Maps",
        onClick: function(evt) {
            showGoogleMap(lastClickPoint);
        }
    }));

    resizeHeader();
    showWelcomeScreen();
}

function initMap() {
    fullExtent();
    map.enableScrollWheelZoom();
}

function fullExtent() {
    var fullExtent = new esri.geometry.Extent(-9404050.0, 4008435.374, -9377474.0, 4022449.377, new esri.SpatialReference({ wkid: 102100 }));
    map.setExtent(fullExtent, false);
}

function indicate(evt) {
    var nm = evt.graphic.attributes['TYP']
    //dojo.byId('Idic').innerHTML = nm;

    xhrArgs = {
        url: "AJAX/GlossaryHandler.ashx",
        handleAs: "text",
        content: {
            w: nm
        },
        load: function (responseObject) {
            map.infoWindow.setTitle(nm);
            map.infoWindow.setContent(
                "<div style='width: 160px;'>" + responseObject + "</div>");
            /*dijit.byId('tabs').domNode*/
            //"<a href='" + evt.graphic.attributes["TYP"] + "' target='_blank'>" + nm + "</a>");

            map.infoWindow.resize(200, 200);

            if (map.infoWindow.isShowing == false) {
                map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
            }
            else {
                map.infoWindow.move(evt.screenPoint);
            }
        }
    };

    dojo.xhrGet(xhrArgs);
    
    //map.infoWindow.show();
}

function resizeMap() {
    if(currentHeight != document.documentElement.clientHeight)
	{
	    setMapDivSize();
        map.resize();
        resizeHeader();
        map.infoWindow.hide();
    }
	currentHeight = document.documentElement.clientHeight;
}

function resizeHeader() {
    var headerWidth = dojo.marginBox('header').w - 176;
    dojo.byId('gradientImg').src = 'AJAX/Gradient.ashx?o=h&h=87&w=' + headerWidth + '&color1=FFFFFF&color2=007ea1';
    dojo.contentBox('gradientImg', {w: headerWidth});
}

function setMapDivSize() {
    var mapHeight, mapWidth, windowHeight, windowWidth;
    
    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        windowWidth = window.innerWidth;
        windowHeight = window.innerHeight;
    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        //IE 6+ in 'standards compliant mode'
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        //IE 4 compatible
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }
    
    mapHeight = windowHeight - dojo.marginBox('header').h - dojo.marginBox('navToolbar').h - dojo.marginBox('copyright').h;
    mapWidth = windowWidth - dojo.marginBox('menupane').w;
    dojo.query('#map').style('height', mapHeight + 'px').style('width', mapWidth + 'px');
}

function extentHistoryChangeHandler() {
    dijit.byId("zoomprev").disabled = navToolbar.isFirstExtent();
    dijit.byId("zoomnext").disabled = navToolbar.isLastExtent();
 }

function getManagedLaneSQLStrings(altID) {
    xhrArgs = {
        url: "AJAX/AlternativesHandler.ashx",
        handleAs: "json",
        preventCache: true,
        content: {
            a: altID,
            f: 'managedSQL'
        },
        load: function (responseObject, ioArgs) {
            dojo.byId('Idic').innerHTML = responseObject.enabledQuery + " | " + responseObject.disabledQuery;
            ml_enabled_SQL = responseObject.enabledQuery;
            ml_disabled_SQL = responseObject.disabledQuery;
        },
        error: function (err) {
            alert(err);
        }
    }

    dojo.xhrGet(xhrArgs);
}

function showWelcomeScreen() {
    var pt = new esri.geometry.Point([map.width/2, map.height/2], new esri.SpatialReference({ wkid: 102100 }));
    console.log(pt);

    var descrDialog = dijit.byId('alternativeDescriptionDialog');
    descrDialog.draggable = false;
    descrDialog.closeable = false;
    descrDialog.attr('href', 'r285Welcome.html');
    descrDialog.attr('width', '400px');
    descrDialog.attr('height', '400px');
    descrDialog.show();
}

function showGoogleMap(mapPoint) {
    var xhrArgs = {
        url: "AJAX/Converter.ashx",
        handleAs: "text",
        preventCache: true,
        content: {
            x: mapPoint.x,
            y: mapPoint.y
        },
        load: function(data) {
            var coords, latlng, myOptions;
            coords = data.split(',');
            latlng = new google.maps.LatLng(coords[1], coords[0]);
            myOptions = {
                zoom: 16,
                center: latlng,
                mapTypeId: google.maps.MapTypeId.HYBRID,
                //navigationControl: true,
                //scaleControl: true,
                //disableDefaultUI: false,
                mapTypeControl: false
            };
            
            // Show the maps box
            dijit.byId('googleMapsDialog').show();
            
            // Create the map if it doesn't already exist
            if (gMap == null)
                gMap = new google.maps.Map(document.getElementById('googleMap'), myOptions);
            else
                gMap.setCenter(latlng);
        },
        error: function(error) {
            alert("An unexpected error occurred: " + error);
        }
    }
    
    // Make the request
    dojo.xhrGet(xhrArgs);
}

function toggleLegend() {
    if (dojo.style('legend', 'display') == 'none') {
        dojo.style('legend', 'display', '');
        dojo.byId('legendToggle').innerHTML = '(click to hide)';
        dojo.style('alternativesPanel', 'display', 'none');
        dojo.style('linksPanel', 'display', 'none');
    } else {
        dojo.style('legend', 'display', 'none');
        dojo.byId('legendToggle').innerHTML = '(click to show)';
        dojo.style('alternativesPanel', 'display', '');
        dojo.style('linksPanel', 'display', '');
    }
}

function filterNoneLayers(e,i,a) {
        if(e == -1) return false;
        else return true;
}

function getLyrGroup(ptrs, n, lyrList) {
    if (ptrs[n] == -1) return new Array();

    if (n + 1 == ptrs.length) {
        return lyrList.slice(ptrs[n]);
    }
    else {
        return lyrList.slice(ptrs[n], ptrs[n + 1]);    
    }
}

function getRdwyLayers() {
    return getLyrGroup(ptrs, 2, masterLayerList);
}
function getTransitLayers() {
    return getLyrGroup(ptrs, 1, masterLayerList);
}
function getViewshedLayers() {
    return getLyrGroup(ptrs, 0, masterLayerList);
}

function showLayers() {
    var arr = new Array();

    if (ptrsEnabled != null) {
        for (i = 0; i < 3; i++) {
            if (ptrsEnabled[i] == true) {
                var l = getLyrGroup(ptrs, i, masterLayerList);

                //roadway layers - alter ML visiblity
                if (i == 2) {
                    switch (showML) {
                        case 0:
                            //show all -- nothing
                            break;
                        case 1:
                            //show GP only -- pop last layer (ML) off of stack
                            l.pop();
                            break;
                        case 2:
                            //show ML only -- pop last layer (ML), pop the GP off, and then push ML
                            var mll = l.pop();
                            l.pop();
                            l.push(mll);
                            break;
                    }
                }

                arr = arr.concat(l);
            }
        }
    }

    dynamicLayer.setVisibleLayers(arr);
}

function toggleViewsheds(showSheds) {
    var i = 0;

    /*if (map.graphics != null && graphicsLayer != null) */{
        if (showSheds == false) {
            /*
            while (i < graphicsLayer.graphics.length) {
                graphicsLayer.graphics[i++].hide();
            }
            */
            graphicsLayer.hide();
        }
        else {
            /*
            while (i < graphicsLayer.graphics.length) {
                graphicsLayer.graphics[i++].show();
            }
            */
            graphicsLayer.show();
        }
    }

    ptrsEnabled[0] = showSheds;
    showLayers();
}

function toggleTransit(showTransit) {
    ptrsEnabled[1] = showTransit;
    showLayers();
}

function toggleDiagrams(showDiagram) {
    dijit.byId('DesignButton').setChecked(!showDiagram);
    dijit.byId('DiagramButton').setChecked(showDiagram);

    isDiagramming = showDiagram;

    if (showDiagram == false) {
        if (ptrs != null) {
            dojo.style('vsheds', 'display', (ptrs[0] != -1) ? '' : 'none');
            dojo.style('transpSelection', 'display', (ptrs[1] != -1) ? '' : 'none');
            dojo.style('managedLaneSelection', 'display', (ptrs[2] != -1) ? '' : 'none');
        }

        diagLayer.setVisibleLayers([]);

        if (dgraphicsLayer != null) dgraphicsLayer.hide();

        showLayers();
    }
    else {
        //dojo.style('vsheds', 'display', 'none');
        dojo.style('transpSelection', 'none');

        switch (currAlternative) {
            case '4':
                queryDefinitionsLayer(4);
                break;
            case '6a':
                queryDefinitionsLayer(10);
                break;
            case '6b':
                queryDefinitionsLayer(16);
                break;
        }

        showDiagrams([0, 1, 2, 3]);
        dynamicLayer.setDefaultVisibleLayers();

        if (dgraphicsLayer != null) dgraphicsLayer.show();
    }
}

var numVisibleLayers = 20;

function showDiagrams(inds) {
    var currarr = Array();
    var lyrs = Array();

    switch (currAlternative) {
        case '4':
            currarr = [1, 2, 3];
            break;
        case '6a':
            currarr = [6, 7, 8, 9];
            break;
        case '6b':
            currarr = [12, 13, 14, 15];
            break;
    }

    for (var i = 0; i < inds.length; i++) {
        var j = inds[i];

        if(j < currarr.length)
            lyrs.push(currarr[j]);
    }

    if(map.extent.getWidth() > 1000)
        zoomToNearestInterchange();

    showLayers();
    
    //lyrs.push(++numVisibleLayers);
    console.log(lyrs);
    diagLayer.setVisibleLayers(lyrs);
}

function alterDefnQuery(lyrno, sql) {
    var new_defns = []; // dynamicLayer.layerDefinitions;
    new_defns[lyrno] = sql;

    dynamicLayer.setLayerDefinitions(new_defns);
}

function displayManagedLanes(level) {
    if (isDiagramming == false) {
        switch (level) {
            case 0:
                alterDefnQuery(getRdwyLayers()[0], "");

                showML = 0;
                showLayers();

                break;
            case 1:
                alterDefnQuery(getRdwyLayers()[0], ml_disabled_SQL);

                showML = 1;
                showLayers();
                break;
            case 2:
                alterDefnQuery(getRdwyLayers()[0], ml_enabled_SQL);

                showML = 2;
                showLayers();
                break;
        }
    }
    else {
        switch(level) {
            case 0:
                showDiagrams([0, 1, 2, 3]);
                break;

            case 1:
                showDiagrams([0, 1,    3]);
                break;

            case 2:
                showDiagrams([0,   2,  3]);
                break;
        }
    }
}

var ichanges = [
{ "id": 0, "name": "Windy Hill Rd",                     "x": -9403374.6194, "y": 4015736.9769 },
{ "id": 1, "name": "I-75",                              "x": -9402125.8068, "y": 4014085.0372 },
{ "id": 2, "name": "Northside Dr / New Northside Dr",   "x": -9398697.8484, "y": 4016380.0007 },
{ "id": 3, "name": "Riverside Dr",                      "x": -9395973.2138, "y": 4017455.0169 },
{ "id": 4, "name": "Roswell Rd",                        "x": -9393195.8812, "y": 4017041.1963 },
{ "id": 5, "name": "GA-400",                            "x": -9390663.9684, "y": 4016921.5829 },
{ "id": 6, "name": "Ashford-Dunwoody Rd",               "x": -9388451.0340, "y": 4017812.7941 },
{ "id": 7, "name": "Chamblee-Dunwoody Rd",              "x": -9385888.9308, "y": 4018111.4704 },
{ "id": 8, "name": "North Peachtree Rd",                "x": -9384510.0977, "y": 4018287.9346 },
{ "id": 9, "name": "Peachtree-Industrial Blvd",         "x": -9382757.9651, "y": 4017245.8214 },
{ "id": 10, "name": "Buford Hwy",                       "x": -9381667.6447, "y": 4015851.8229 },
{ "id": 11, "name": "I-85",                             "x": -9379874.0517, "y": 4014349.4986 }];

function zoomToNearestInterchange() {
    var Extent = map.extent;
    var distsx = Array();
    var distsy = Array();
    
    var j = Infinity;
    var k = -1;

    for (var i = 0; i < ichanges.length; i++) {
        //distsx.push(Math.abs(ichanges[i] - Extent.getCenter().x));

        var diff = Math.abs(ichanges[i].x - Extent.getCenter().x);

        console.log(i);
        console.log(diff);

        if (diff < j) {
            k = i;
            j = diff;
        }

        console.log(k);
    }

    if (k == 0 || k == 1) {
        if (Math.abs(ichanges[0].y - Extent.getCenter().y) <
            Math.abs(ichanges[1].y - Extent.getCenter().y)) {

            k = 0;
        }
        else k = 1;
    }

    var x = ichanges[k].x;
    var y = ichanges[k].y;

    var Extent = new esri.geometry.Extent
                    (x - 600, y - 600, x + 600, y + 600, new esri.SpatialReference({ wkid: 102100 }));
    map.setExtent(Extent);
}

function addInterchangeMenuItems() {
    for (var i = 0; i < ichanges.length; i++) {
        
        dijit.byId('quickZoomMenu').addChild(new dijit.MenuItem({
            label: ichanges[i].name,

            onClick: function (evt) {
                var i = dijit.byId('quickZoomMenu').getIndexOfChild(this);
                var x = ichanges[i].x;
                var y = ichanges[i].y;

                var Extent = new esri.geometry.Extent
                    (x - 600, y - 600, x + 600, y + 600, new esri.SpatialReference({ wkid: 102100 }));

                map.setExtent(Extent);
            }
        }));
    }
}
