﻿
dojo.require("esri.map");
dojo.require("esri.tasks.query");
dojo.require("esri.toolbars.draw");
dojo.require("esri.layers.agstiled");
dojo.require("esri.layers.agsdynamic");
dojo.require("esri.tasks.gp");

var identifyDijit;
var map;
var symbol;
var infoTemplate, infoTemplateHome, infoTemplateBusiness, infoTemplateEpixiri;
var toolbar, geomTask;
var drawGraphic;
var timer;

var visible = [];

var poisLayer;

var layerBaseStreet = "http://gis.kallithea.gr/arcgis/rest/services/kalithea161109_newdata/MapServer";
//var layerBaseSat =  "http://gis.kallithea.gr/arcgis/rest/services/kalithea161109_sat/MapServer";
var layerBaseSat =  "http://gis.kallithea.gr/arcgis/rest/services/orthophoto/MapServer";
var hybridBaseStreet = "http://gis.kallithea.gr/arcgis/rest/services/kalithea161109_hybrid/MapServer";

//var serverURL = "http://websrv01:83/services/";
var serverURL = "http://gis.kallithea.gr/services/";
var serviceURL; 

var geometryServiceURL = "http://gis.kallithea.gr/arcgis/rest/services/Geometry/GeometryServer";


var gsvc = new esri.tasks.GeometryService(geometryServiceURL);

//var layerGoodys = serviceURL;
var queryTaskBlocks; //= new esri.tasks.QueryTask(serviceURL + "8");
var queryTaskBusiness; // = new esri.tasks.QueryTask(serviceURL + "3");
var queryTaskHome; // = new esri.tasks.QueryTask(serviceURL + "2");
var queryTaskEpixiri; // = new esri.tasks.QueryTask(serviceURL + "7");

var graphLayer;
var trafficLayer;

function S4() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}

function guid() {
    return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}

var startExtent;

function init() {

    startExtent = new esri.geometry.Extent(472662, 4199714, 474477, 4200925, new esri.SpatialReference({ wkid: 2100 }));
       
    esriConfig.defaults.map.panDuration = 10;

    resizeMap();

    map = new esri.Map("mapDiv");
	
	tiledMapServiceLayer = new esri.layers.ArcGISTiledMapServiceLayer(layerBaseStreet);

	 
	tiledMapServiceLayerSat = new esri.layers.ArcGISTiledMapServiceLayer(layerBaseSat);
    tiledMapServiceLayerSat.hide();

    tiledMapServiceLayerHybrid = new esri.layers.ArcGISTiledMapServiceLayer(hybridBaseStreet, {opacity:0.9});
    tiledMapServiceLayerHybrid.hide();
		
    map.addLayer(tiledMapServiceLayerSat);
    map.addLayer(tiledMapServiceLayerHybrid);
    map.addLayer(tiledMapServiceLayer);
	
	
   // map.addLayer(trafficLayer);

    terra.map.layers.getLayersService();
    map.addLayer(terra.map.layers.layerSERVICE);
    
    if (terra.map.layers.layerSERVICE.loaded) {
        printInitialExtent(layer);
    }
    else {
        dojo.connect(terra.map.layers.layerSERVICE, "onLoad", printInitialExtent);
    }
        
    map.enableRubberBandZoom();
    map.showPanArrows();
       
    //map.setExtent(startExtent);
    
    esriConfig.defaults.io.proxyUrl = "/demo_tech/proxy.ashx";
    esriConfig.defaults.io.alwaysUseProxy = false;

    dojo.connect(map, "onLoad", createToolbar);
    dojo.connect(map, "onClick", onClickHandle);
    dojo.connect(map, "onPanEnd", onPanEnd);
    dojo.connect(map, "onMouseMove", onMouseMoveHand);
    dojo.connect(map, "onMouseOut", onMouseOutHand);
    
    //dojo.connect(map, "onLayerAdd", onLayerAdd);
    
    dojo.connect(window, "onresize", function() {

        clearTimeout(timer);
        resizeMap();

    });


    $("#accordion").accordion({
        autoHeight: false
    });

    $('#txtAddress').keypress(function(e) {
        switch (e.which) {
            //user presses the "a"               
            case 13: findFreeTextAddress($('#txtAddress').val());
                break;
        }
    });

    $('#txtFreePois').keypress(function(e) {
        switch (e.which) {
            //user presses the "a"     
            case 13: findFreeTextPois($('#txtFreePois').val());
                break;
        }
    });

    terra.map.user.logout();
          
    $("#routePoints").sortable({
        placeholder: 'ui-state-highlight',
        cursor: 'pointer'
    });

    $("#progressbar").progressbar({
        value: 100
    });

    $().ajaxSend(function(r, s) {
        $("#progressbar").show();
    });

    $().ajaxStop(function(r, s) {
        $("#progressbar").hide('fast');
    });

    $('#accordion').accordion('activate', 0);

   // createMenu();

}

function onPanEnd(extent, endPoint)  {
    
   // pMenu.destroy();
    //    dijit.popup.closeAll();
}


function changeMapType(mapType) {

    if (mapType == 'hybrid') {
        tiledMapServiceLayer.hide();
        tiledMapServiceLayerHybrid.show();
        tiledMapServiceLayerSat.show();
    }

    if (mapType == 'street') {
        tiledMapServiceLayer.show();
        tiledMapServiceLayerSat.hide();
        tiledMapServiceLayerHybrid.hide();

    }

    if (mapType == 'sat') {
        tiledMapServiceLayer.hide();
        tiledMapServiceLayerSat.show();
        tiledMapServiceLayerHybrid.hide();
    }
}


function printInitialExtent(layer) {
    //map.setExtent(layer.initialExtent);
    //map.setExtent(startExtent);
   
}

function resizeMap() {

    $('#mapDiv').css(($.browser.msie && $.browser.version < 7 ? '' : '') + 'height', $(window).height() - 115 + 'px');
    $('#mapDiv').css('width', $(window).width() - 340 + 'px');
	$('#mapDiv').css('height', $(window).height() - 120 + 'px');

    //create new resize timer with delay of 500 milliseconds
    timer = setTimeout(function() { map.resize(); }, 500);
    
}

function onMouseOutHand(evt) {
      $('#mouseDIV').html("");
}

function onMouseMoveHand(evt) {

    var mp = evt.mapPoint;
    
    var t = new CoordConvertNewClass_JS();
    t.ComputeXY2LF(mp.x, mp.y);
       
    $('#mouseDIV').html("x:" + mp.x.toFixed(0) + " y:" + mp.y.toFixed(0) +"<br/> lon:"+t.f_out.toFixed(6)+" lat:"+ t.l_out.toFixed(6));    
  
}

function onClickHandle(evt) {

    var mp = evt.mapPoint;

    if (beginAddPoints == true) {

        addRoutePoint(mp.x, mp.y)

        //    } else if (beginAddServicePoints == true) {
        //      addNewServicePoint("new point ", mp.x, mp.y, true);
        //      beginAddServicePoints = false;

    } else {

        terra.map.layers.doIdentify(evt);

        // reverseGeocode(evt)

    };

}

//var streetId;
function doIdentify(mp) {

    streetId = false;
    identifyParams = new esri.tasks.IdentifyParameters();
    identifyParams.tolerance = 3;
    identifyParams.returnGeometry = true;
    identifyParams.layerIds = [6];
    identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
    identifyParams.geometry = mp;
    identifyParams.mapExtent = map.extent;
    identifyTask.execute(identifyParams, function(idResults) {

        //  addToMap(idResults, evt);
        getBuffer(null, [idResults[0].feature]);

    });
}

function getLoaderHtml(uniqueId) {
    return "<div id='identifyDiv" + uniqueId + "'> <img alt='Παρακαλώ περιμένετε' title='Παρακαλώ περιμένετε' src='img/ajax-loader.gif'/></div>";
}
function getLoaderHtml() {
    return "<div id='identifyDiv'> <img alt='Παρακαλώ περιμένετε' title='Παρακαλώ περιμένετε' src='img/ajax-loader.gif'/></div>";
}
function createToolbar(map) {

    toolbar = new esri.toolbars.Draw(map);
    dojo.connect(toolbar, "onDrawEnd", addToMap);

    var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 1, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0]), 1), new dojo.Color([255, 255, 255, 0.5]));
    var geom = new esri.geometry.Point(100, 100, new esri.SpatialReference({ wkid: 2100 }));
    var gr = new esri.Graphic(geom, symbol);
    map.graphics.add(gr);

    var emailUid = $(document).getUrlParam("view");

    if (emailUid != null) {
        terra.map.graphManager.getEmailGraphics(emailUid);
    }

    terra.map.layers.getLayers();
    
    
}

function addToMap(geometry) {

    //    var canBuffer = false;
    //    map.graphics.clear();
    //    clearPoisResults();

    var pointType;
    var pointDesc;

    switch (geometry.type) {
        case "point":
            pointType = 1;
            pointDesc = "Νέο σημείο ";
            break;
        case "polyline":
            pointType = 3;
            pointDesc = "Νέα γραμμή ";
            break;
        case "polygon":
            pointType = 2;
            pointDesc = "Νέο πολύγωνο ";
            break;
        case "extent":
            pointType = 2;
            pointDesc = "Νέο πολύγωνο ";
            break;
        case "multipoint":
            pointType = 1;
            pointDesc = "Νέο σημείο ";
            break;
    }


    if (pointType == 3) {
        
        var symbol = new esri.symbol.SimpleFillSymbol("none", new esri.symbol.SimpleLineSymbol("dashdot", new dojo.Color([255, 0, 0]), 1), new dojo.Color([255, 255, 0, 0.25]));
        var graphic = new esri.Graphic(geometry, symbol);

        gsvc.lengths([graphic], function(results) {

                var perimeter = results.lengths[0];
                perimeter = perimeter / 1000;

                var numb = terra.map.graphManager.getNewCounter();
                terra.map.graphManager.addNewGr(false, guid(), pointType, pointDesc + numb, 'Μήκος :<b>' + perimeter.toFixed(3) + " χλμ.</b>", geometry);
        });
        
    } else if (pointType == 2) {
        
        var symbol = new esri.symbol.SimpleFillSymbol("none", new esri.symbol.SimpleLineSymbol("dashdot", new dojo.Color([255, 0, 0]), 1), new dojo.Color([255, 255, 0, 0.25]));
        var graphic = new esri.Graphic(geometry, symbol);

        gsvc.areasAndLengths([graphic], function(results) {

            //{"areas":[1585800.66264039],"lengths":[4963.70759158615]}

            var surface = results.areas[0];
            var perimeter = results.lengths[0];

            surface = surface / 1000000;
            perimeter = perimeter / 1000;

            var numb = terra.map.graphManager.getNewCounter();
            terra.map.graphManager.addNewGr(false, guid(), pointType, pointDesc + numb, pointDesc + numb + '<br/><br/>Επιφάνεια :<b>' + surface.toFixed(3) + " χλμ.2</b>" + '<br/>Περίμετρος :<b>' + perimeter.toFixed(3) + " χλμ.</b>", geometry);

        });
         
    } else {
    
        var numb = terra.map.graphManager.getNewCounter();
        terra.map.graphManager.addNewGr(false, guid(), pointType, pointDesc + numb, pointDesc + numb, geometry);
    
    }


    deactivateQuery();

  //  var numb = terra.map.graphManager.getNewCounter();
  //  terra.map.graphManager.addNewGr(false, guid(), pointType, pointDesc + numb, pointDesc + numb, geometry);


}

function getBuffer(geometry, foundfeatures) {

    var params = new esri.tasks.BufferParameters();

    if (foundfeatures == null) {

        var symbol = new esri.symbol.SimpleFillSymbol("none", new esri.symbol.SimpleLineSymbol("dashdot", new dojo.Color([255, 0, 0]), 1), new dojo.Color([255, 255, 0, 0.25]));
        var graphic = new esri.Graphic(geometry, symbol);
        var params = new esri.tasks.BufferParameters();

        //  gsvc.simplify([graphic], simplifyCallback);

        params.features = [graphic];

    }
    else {

        params.features = foundfeatures;

    }

    params.distances = [$('#drpIntersectionBuffer').val()];
    params.unit = esri.tasks.BufferParameters.UNIT_METER;
    params.bufferSpatialReference = new esri.SpatialReference({ wkid: 2100 });

    gsvc.buffer(params, executeQueryTaskFromBuffer);

}

function simplifyCallback(features) {
    //CASE [1]: if you want to buffer in linear units such as meters, km, miles etc.
}

function executeQueryTaskFromDraw(geometry) {
    executeTask(geometry);
}

function executeQueryTaskFromBuffer(graphics) {
    executeTask(graphics[0].geometry);
}

function executeTask(geometry) {

    var symbol = new esri.symbol.SimpleFillSymbol("none", new esri.symbol.SimpleLineSymbol("dashdot", new dojo.Color([255, 0, 0]), 1), new dojo.Color([255, 255, 0, 0.25]));
    var graphic = new esri.Graphic(geometry, symbol);
    map.graphics.add(graphic);


    var sI = $('#drpIntersection').val();
    if (sI == 0) {
        return null;
    }

    if (sI == 1) executePoiQueryTask(geometry, false);
    if (sI == 2) executePoiQueryTask(geometry, true);

    if (sI == 3) {

        var query = new esri.tasks.Query();
        query.returnGeometry = true;
        query.outFields = ["NOIK", "HOUSES", "PER_MEN", "PER_WOM", "PER_POP"];
        query.geometry = geometry;
        queryTaskBlocks.execute(query, getResults);

        var queryHOME = new esri.tasks.Query();
        queryHOME.returnGeometry = true;
        queryHOME.outFields = ["PAR2", "ADDR", "DIMOS"];
        queryHOME.geometry = geometry;
        queryTaskHome.execute(queryHOME, getResultsHOME);

        var queryBUSINESS = new esri.tasks.Query();
        queryBUSINESS.returnGeometry = true;
        queryBUSINESS.outFields = ["PAR_BD", "ADDR", "DIMOS"];
        queryBUSINESS.geometry = geometry;
        queryTaskBusiness.execute(queryBUSINESS, getResultsBUSINESS);

        var queryEpixiri = new esri.tasks.Query();
        queryEpixiri.returnGeometry = true;
        queryEpixiri.outFields = ["address", "name"];
        queryEpixiri.geometry = geometry;
        queryTaskEpixiri.execute(queryEpixiri, getResultsEpixiri);
    }

    map.setExtent(graphic.geometry.getExtent());

}



function executeQueryStreet(id) {

    queryStreet = new esri.tasks.Query();
    queryStreet.returnGeometry = true;
    queryStreet.outFields = ["ID_OD_L_N"];
    queryStreet.where = " ID_OD_L_N = " + id;
    queryTaskStreet.execute(queryStreet, showStreet);

}


var forBufferGeom;
function showStreet(featureSet) {

    map.graphics.clear();
    clearPoisResults();

    var newLine = new esri.geometry.Polyline();

    var lineSymb = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 255, 0.5]), 5);

    for (var j = 0; j < featureSet.features.length; j++) {

        var gr = featureSet.features[j];
        var geom = gr.geometry;

        for (var i = 0; i < geom.paths.length; i++) {
            newLine.addPath(geom.paths[i]);
        }

        //map.graphics.add(graphic);


    }

    var newGraph = new esri.Graphic(newLine, lineSymb);
    map.graphics.add(newGraph);

    getBuffer(null, featureSet.features);

}



function toggleLayers() {

    visible = new Array();

    $(".checklayer").each(function() {
        if ($(this).attr('checked') == true) {
            visible.push(parseInt($(this).attr('value')));
        }
    });

    dynamicLayer.setVisibleLayers(visible);

}

function activateQuery(object) {

    // map.graphics.clear();

    switch (object) {
        case "point":
            toolbar.activate(esri.toolbars.Draw.POINT);
            break;
        case "line":
            toolbar.activate(esri.toolbars.Draw.LINE);
            break;
        case "polyline":
            toolbar.activate(esri.toolbars.Draw.POLYLINE);
            break;
        case "polygon":
            toolbar.activate(esri.toolbars.Draw.POLYGON);
            break;
        case "extent":
            toolbar.activate(esri.toolbars.Draw.EXTENT);
            break;
        case "freehandline":
            toolbar.activate(esri.toolbars.Draw.FREEHAND_POLYLINE);
            break;
        case "freehandpoly":
            toolbar.activate(esri.toolbars.Draw.FREEHAND_POLYGON);
            break;
    }

    map.hideZoomSlider();
    $('#draw').hide();
    $('#drawCancel').show();

}

function deactivateQuery() {
    toolbar.deactivate();
    map.showZoomSlider();
    $('#draw').show();
    $('#drawCancel').hide();
}

var goodysList;
function getGoodys() {

    $.getJSON(serverURL + "goodys.txt",
       function(data) {

           goodysList = data;
           //comboItem =
           var html = "";
           var selected = '';
           for (var i = 0; i < data.length; i++) {
               if (i == 0) { selected = 'selected' } else { selected = '' };
               html += "<option value='" + i + "' " + selected + ">" + data[i].desc + "</option> ";
           }
           $('#selectGoodys').html(html);
       });
    // updatePoisSubCat();
}

function addGoodys() {
    var i = $('#selectGoodys').val();
    addNewServicePoint(goodysList[i].desc, goodysList[i].x, goodysList[i].y, false);
}
