﻿//CUSTOMIZE VARIABLES

//EXTRA - NOTE: WHEN YOU SAVE THE POINT AN ALERT APPEAR WITH XML RESULT CODE
var bDebugMode = false;

//START VARIABLES    
var dLatStart = -23.55;
var dLongStart = -46.64;
var iZoomLevelStart = 12;

//NOTE OV = OVERVIEW/MINIMAP in RIGHT BOTTOM OF MAP
var iOVWidth = 150;
var iOVHeight = 150;

//STYLE VARIABLES
//NOTE: Opacity: 0 = transparent || 1 = full

//POLYGON
var sPolygonBackgroundColor = '#99FFFF';
var sPolygonStrokeColor = '#000000';
var dPolygonBackgroundOpacity = 0.3;
var dPolygonStrokeOpacity = 1;
var dPolygonStrokeSize = 1;

//DRAW
var sStrokeColor = '#000000';
var dStrokeSize =  3;
var dStrokeOpacity = 1;

//AUX
var sAuxStrokeColor = '#FF99FF';
var dAuxStrokeSize =  1;
var dAuxStrokeOpacity = 0.3;

//MESSAGE VARIABLES
var sSavePointMessage = 'Deseja salvar este ponto?';
var sSavePolygonMessage = 'Deseja salvar esta area?';
var sRemovePointMessage = 'Deseja remover este ponto?';
var sRemovePolygonMessage = 'Deseja remover esta area?';

//IMPORTANT
var xmlViewMode = "viewmode.xml";
var currentProject = 0;

//-------------------------------------------------------------------------------------------------    

//VARIABLES

var currentClickListener = null;
var mapContainer = '';
var xmlLastUpdate = '';
var currentIDSaved = 0;
var currentSaveStatus = null;

//MAPS VARIABLE
var map;
var startMarker = null;
var endMarker = null;
var routePoints = new Array();
var routeOverlays = new Array();
var arrPolyClose = new Array();
var polyClose = null;
var ovmap;
var totalDistance = 0.0;
var opacity = 0.4;

var baseIcon = new GIcon();
baseIcon.iconSize=new GSize(32,32);
baseIcon.shadowSize=new GSize(56,32);
baseIcon.iconAnchor=new GPoint(16,32);
baseIcon.infoWindowAnchor=new GPoint(16,0);

//CONSTRUCTOR
function StartMap(sContainer)
{
	mapContainer = sContainer;
	if (GBrowserIsCompatible()) 
	{
		map = new GMap2(document.getElementById(mapContainer));
		GEvent.addListener(map, "load", function() {
			ReadXMLViewMode();
			//ClearMapListnerClick();
		});
		map.setCenter(new GLatLng(dLatStart, dLongStart), iZoomLevelStart);

		map.addControl(new GScaleControl());
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());

		map.enableContinuousZoom();
	}
}

//METHODS

// NOTE: PARAMETER: iType
// 1 FOR DRAW POLYGON 
// 2 FOR MAKE A POINT
function setMapDraw(iType) 
{
    //ClearMapListnerClick();

    if(currentProject == 0)
    {
        alert('Para executar esta função, selecione um projeto.');
    }

    setCrosshairCursor();

    if(iType == 1)
    {
        currentClickListener = GEvent.addListener(map, "click", eventDrawPolyon);
    }
    else if(iType == 2)
    {
        currentClickListener = GEvent.addListener(map, "click", eventDrawPoint);
    }
}

var bRemove = false;
function RemoveLocation(objLocation,sMessage,bPolygon, arrGPoint)
{
    bRemove = false;
    
    if(confirm(sMessage))
    {
        if(bPolygon == true)
        {
            $.post(MODULE_URL + "MapServices.aspx?Function=3", {IdentityObject: objLocation.idObject}, function(response){if(Boolean(response)){map.removeOverlay(objLocation);}else{alert('Não foi possivel remover este item.');}});               
        }
        else
        {            
            $.post(MODULE_URL + "MapServices.aspx?Function=4", {IdentityObject: objLocation.idObject}, function(response){if(Boolean(response)){map.removeOverlay(objLocation);}else{alert('Não foi possivel remover este item.');}});   
        }
    }
}

function RemovePoint(objPoint)
{
    if(confirm(sRemovePolygonMessage))
    {
        map.removeOverlay(objPolygon);
    }
}

// NOTE:
// objMarker can be a Polygon or a single GMarker
function SaveLocation(arrPoints,bPolygon,objMarker, callback)
{
    var bReturn;
    
    if(bPolygon)
    {
        if(confirm(sSavePolygonMessage))
        {
            ServerSave(arrPoints,bPolygon,callback);
            bReturn = true;
        }
        else
        {
            map.removeOverlay(objMarker);
            bReturn = false;
        }    
    }
    else
    {
        if(confirm(sSavePointMessage))
        {
            ServerSave(arrPoints,bPolygon,callback);
            bReturn = true;
        }
        else
        {
            map.removeOverlay(objMarker);
            bReturn = false;
        }
    }
    
    return bReturn;
}


//EVENTS OPTIONS

function eventDrawPolyon(marker, point) 
{   
    if (!marker) {
        addPolygonPoint(point);
    }
    else {
        closePolygon(marker);
    }
}

function eventDrawPoint(marker,point)
{    
    if(marker == null)
    {
        var newPoint = createMarker(point);
        
        map.addOverlay(newPoint);
        
        var arrPoints = new Array();
        arrPoints.push(point);
        SaveLocation
        (
            arrPoints,
            false,
            newPoint,
            function()
            {
                newPoint.idObject = currentIDSaved;
                GEvent.addListener(newPoint,"click",function(){RemoveLocation(newPoint,sRemovePointMessage, false, null);})
            }
        );
    }
}


//DRAW OPTIONS

function addPolygonPoint(point) 
{
    var dist = 0;

    routePoints.push(point);

    if (routePoints.length > 1)	
    {
        markPolygon();
    }
    else {
        startMarker = createMarker(point)
        map.addOverlay(startMarker);
        routeOverlays.push( new GPolyline(routePoints,sStrokeColor,dStrokeSize,dStrokeOpacity));
    }


}

function markPolygon() 
{
    map.removeOverlay(routeOverlays[routeOverlays.length-1]);


    routeOverlays[routeOverlays.length-1] = new GPolyline(routePoints,sStrokeColor,dStrokeSize,dStrokeOpacity);
    map.addOverlay(routeOverlays[routeOverlays.length-1]);

	
    if (routePoints.length > 2) {
        var pClose = Array();
        pClose.push(routePoints[0]);
        pClose.push(routePoints[routePoints.length-1]);
        polyClose = new GPolyline(pClose,sAuxStrokeColor,dAuxStrokeSize,dAuxStrokeOpacity);
        arrPolyClose.push(polyClose);
        map.addOverlay(polyClose);
    }

}

function closePolygon(currentMarker) 
{

    if(routeOverlays.length > 0)
    {
        map.removeOverlay(routeOverlays[routeOverlays.length-1]);
        
        for(var pc = 0; pc < arrPolyClose.length; pc++)
        {
            map.removeOverlay(arrPolyClose[pc]);
        }

        map.removeOverlay(startMarker);

        routePoints.push(routePoints[0]);

    	
        routeOverlays[routeOverlays.length-1] = new GPolyline(routePoints,sStrokeColor,dStrokeSize,dStrokeOpacity);
        map.addOverlay(routeOverlays[routeOverlays.length-1]);
        
        //REMOVE POLYLINE
        for(var i = 0; i < routeOverlays.length; i++)
        {
            map.removeOverlay(routeOverlays[i]);
        }
        
        // CREATE POLYGON IN REPLACE OF POLYLINE
        var polygonShape = createPolyshape(routePoints);//= new GPolygon(routePoints,sPolygonStrokeColor,dPolygonStrokeSize,dPolygonStrokeOpacity,sPolygonBackgroundColor,dPolygonBackgroundOpacity);
        map.addOverlay(polygonShape);
        
        SaveLocation
        (
            routePoints,
            true,
            polygonShape,
            function()
            {
                polygonShape.idObject = currentIDSaved;
                GEvent.addListener(polygonShape,"click",function(){RemoveLocation(polygonShape,sRemovePolygonMessage,true,routePoints);});
            }
        );
        
        
        routePoints = [];
        routeOverlays = [];
        
        
    }
               
}

function createPolyshape(arrPoints)
{
    var polygonShape = new GPolygon(arrPoints,sPolygonStrokeColor,dPolygonStrokeSize,dPolygonStrokeOpacity,sPolygonBackgroundColor,dPolygonBackgroundOpacity);
    
    return polygonShape;
}

function createMarker(point) 
{

    var marker;
    marker = new GMarker(point);	            

    
    return marker;
}

//SERVER COMUNICATION AND RESULTS

var sendProject = 0;
var sendPolygon = false;
var sendPoint = "";

function ServerSave(arrPoints, bPolygon, callback)
{    
 
    currentIDSaved = 0;
    
    setCrosshairCursor();
    
    sendProject = currentProject;
    sendPolygon = bPolygon;

    for(var i = 0; i < arrPoints.length; i++)
    {           
        if(sendPoint != "")
        {
           sendPoint += createGPointToPost(arrPoints[i],";");
        }
        else
        {
           sendPoint = createGPointToPost(arrPoints[i],"");         
        }
    }
    
    
    if(bPolygon == true)
    {
        $.post
            (
                MODULE_URL + "MapServices.aspx?Function=1", 
                {Project: sendProject, Polygon: sendPolygon, Points: sendPoint, Color: sPolygonBackgroundColor }, 
                function(response)
                {
                    currentIDSaved = parseInt(response);
                    callback();
                }
            );
    }
    else
    {
        
        $.post
            (
                MODULE_URL + "MapServices.aspx?Function=2", 
                {Project: sendProject, Polygon: sendPolygon, Points: sendPoint, Color: sPolygonBackgroundColor }, 
                function(response)
                {                                   
                    currentIDSaved = parseInt(response);
                    callback();
                }
            );    
    }
    
    sendProject = 0;
    sendPolygon = false;
    sendPoint = "";
}

function createGPointToPost(objGPoint, sExtraSeparator)
{
    var sReturn;
 
    if(sExtraSeparator == "")
    {
        sReturn = objGPoint.x + "|" + objGPoint.y;   
    }
    else
    {
        sReturn = ";" + objGPoint.x + "|" + objGPoint.y;          
    }
    
    return sReturn;
}


//XML READ AND PARSER

function ReadXMLViewMode()
{   
        
    var xmlDoc;
    
    if(verifyIEBrowser())
    {
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4) {
				ParserXMLViewMode(xmlDoc);
			}
		};
    }
    else
    {
        var xmlDoc=document.implementation.createDocument("","",null);
        xmlDoc.onload = function() {
			ParserXMLViewMode(xmlDoc);
        };
    }
    
    xmlDoc.async = true;
    //xmlDoc.load(MODULE_URL + "MapServices.aspx?Function=5&idProject=" + currentProject);
    
    // carregando de todos os projetos
    xmlDoc.load(MODULE_URL + "MapServices.aspx?Function=5");
}

var mapOverlayList = {};
function ParserXMLViewMode(xmlDoc)
{
	map.clearOverlays();
	mapOverlayList = {}

    var mapNode = xmlDoc.getElementsByTagName("map")[0];
    var arrLocation = mapNode.getElementsByTagName("location");
    //var iconeConcluido = new GIcon(G_DEFAULT_ICON, "http://maps.google.com.br/mapfiles/ms/micons/ltblue-dot.png");

    for(var i = 0; i < arrLocation.length; i++)
    {
        var nodeLocation = arrLocation[i];
        var bIsPolygon = nodeLocation.getAttribute("polygon"); 

        var idObject = nodeLocation.getAttribute("idObject");
        var idProjeto = nodeLocation.getAttribute("idProjeto");
        var nomePrograma = nodeLocation.getAttribute("nomePrograma");
        var concluido = nodeLocation.getAttribute("concluido").replace("True", "Sim").replace("False", "Não");
        var identificadorPortal = nodeLocation.getAttribute("identificadorPortal");
        var urlPortal;

       if (identificadorPortal.indexOf("http://") > 0) {
			urlPortal = identificadorPortal;
       } else {
			urlPortal = "/" + identificadorPortal;
       }

		var strWindowText = "<b>Programa: </b>" + nomePrograma + "<br/><b>Concluído: </b>" + concluido + "<br/><a style='margin:auto' href='" + urlPortal + "' target='_blank'>Ver mais >></a>";
		if (IS_EDITABLE == "True") {
			strWindowText += '<br /><a href="javascript:void(0);" onclick="deleteOverlay(' + idObject + ')">Excluir</a>';
		}
        if(bIsPolygon == "true")
        {
            var arrPoints = nodeLocation.getElementsByTagName("point");
            var arrGPoint = new Array();

            for(var p = 0; p < arrPoints.length; p++)
            {
                var x = arrPoints[p].getAttribute("lat");
                var y = arrPoints[p].getAttribute("long");
                var point = new GPoint(x,y);
                arrGPoint.push(point);
            }

            var polygonShape = createPolyshape(arrGPoint);
            //polygonShape.referenceShape = polygonShape;
            polygonShape.arrGPoint = arrGPoint;
            polygonShape.idObject = idObject;
            polygonShape.isPolygon = true;

            map.addOverlay(polygonShape);
            mapOverlayList[idObject] = polygonShape;

            if (concluido != "Sim") {
				polygonShape.setFillStyle({color: '#ff0000'});
            }
            
            polygonShape._strWindowText = strWindowText;

			GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) {
				if (overlay && overlay._strWindowText) {
					map.openInfoWindowHtml(overlaylatlng, overlay._strWindowText);
				}
			});
        }
        else
        {
            var local = nodeLocation.getElementsByTagName("point")[0];

            var x = local.getAttribute("lat");
            var y = local.getAttribute("long");

            var point = new GPoint(x,y);

            var newPoint = createMarker(point);
            newPoint.idObject = nodeLocation.getAttribute("idObject");
			newPoint._strWindowText = strWindowText;

            map.addOverlay(newPoint);
            mapOverlayList[idObject] = newPoint;

            if (concluido == "Sim") {
				newPoint.setImage("http://maps.google.com.br/mapfiles/ms/micons/ltblue-dot.png");
			}
        }
    }
}


function verifyIEBrowser()
{   
    if(navigator.appName == "Microsoft Internet Explorer")
    {
        return true;
    }
    else
    {
        return false;
    }
}

//AUX
function ClearMapListnerClick()
{
    GEvent.clearListeners(map,"click");
    setHandCursor();
    
}

function setProject(idProject)
{
    currentProject = idProject;
}

function setCrosshairCursor()
{
    document.getElementById(mapContainer).firstChild.firstChild.style.cursor = "crosshair";
}

function setHandCursor()
{
    document.getElementById(mapContainer).firstChild.firstChild.style.cursor = "pointer";
}

function setCurrentProject(idProject)
{
    currentProject = idProject;
}

function setZoom(code) {
	document.getElementById('li1').className = 'off';
	document.getElementById('li2').className = 'off';
	document.getElementById('li3').className = 'off';
	document.getElementById('li4').className = 'off';
	document.getElementById('li' + code).className = 'on';
	
	if (code == 1) {
		map.setCenter(new GLatLng(dLatStart, dLongStart), iZoomLevelStart);
	}
	if (code == 2) {
		map.setCenter(new GLatLng(-22.583583,-48.47168), 6);
	}
	if (code == 3) {
		map.setCenter(new GLatLng(-14.179186,-50.449219), 4);
	}
	if (code == 4) {
		map.setCenter(new GLatLng(0, -30), 2);
	}
}

function deleteOverlay(idObject) {
	var ov = mapOverlayList[idObject];
	var func;
	if(ov.isPolygon == true)
	{
		func = 3;
	}
	else
	{            
		func = 4;
	}
	if (confirm("Deseja realmente excluir este elemento do mapa?")) 
	{
		$.post(MODULE_URL + "MapServices.aspx?Function=" + func, {IdentityObject: idObject}, function(response) { if (response) map.removeOverlay(ov); });
		map.closeInfoWindow();
		alert("Elemento excluído com sucesso");
	}
}
