var map = null;
var geocoder = null;

function initialize(lat, lng, zoom) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"));
        map.disableDragging();
        map.setCenter(new GLatLng(lat, lng), zoom);
        map.enableScrollWheelZoom();
    }
}

function go(address) {
    if (geocoder) {
        geocoder.getLatLng(
            address,
            function(point) {
                if (!point) {
                    alert(address + " no encontrado");
                } else {
                    map.setCenter(point, 9);
                //map.setMapType(G_PHYSICAL_MAP);
                //var myLayer = new GLayer("org.wikipedia.en");
                //map.addOverlay(myLayer);
                //alert(map.getCenter());
                }
            }
            );
    }
}

function showAddress(address) {
    if (geocoder) {
        geocoder.getLatLng(
            address,
            function(point) {
                if (!point) {
                    alert(address + " not found");
                } else {
                    map.setCenter(point, 13);
                    var marker = new GMarker(point);
                    map.addOverlay(marker);
                    marker.openInfoWindowHtml("<object width='425' height='344'><param name='movie' value='http://www.youtube.com/v/xstKFaTJ0Kg&hl=en&fs=1&'></param><param name='allowFullScreen' value='true'></param><param name='allowscriptaccess' value='always'></param><embed src='http://www.youtube.com/v/xstKFaTJ0Kg&hl=en&fs=1&' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='425' height='344'></embed></object>");
                }
            }
            );
    }
}

function zoomin(){
    map.zoomIn();
}

function zoomout(){
    map.zoomOut();
}

function datos(){
    //alert("centro: " + map.getCenter() + " zoom: " + map.getZoom())
    document.getElementById("lat").value = map.getCenter().lat();
    document.getElementById("lng").value = map.getCenter().lng();
    document.getElementById("zoom").value = map.getZoom();
}

//function dep(cat, subcat, nomcat)
//{
//    //document.OfertaResultadosForm.OfertaSubcategoria.options.length=0;
//    document.getElementById('ZonadenunciaMunicipios').options.length=0;
//    select = document.getElementById('EstadoEstados');
//    if ( select.options[select.selectedIndex].value == '' ){
//        document.getElementById('ZonadenunciaMunicipios').options[0] = new Option('--', '', true, true);
//        for( i = 0; i < subcat.length; i++ ){
//            document.getElementById('ZonadenunciaMunicipios').options[document.getElementById('ZonadenunciaMunicipios').options.length] = new Option(nomcat[i], subcat[i], false, false);
//        }
//    }
//    else{
//        document.getElementById('ZonadenunciaMunicipios').options[0] = new Option('--', '', true, true);
//        for( i = 0; i < subcat.length; i++ ){
//            if( cat[i] == select.options[select.selectedIndex].value ){
//                document.getElementById('ZonadenunciaMunicipios').options[document.getElementById('ZonadenunciaMunicipios').options.length] = new Option(nomcat[i], subcat[i], false, false);
//            }
//        //alert(select.options[select.selectedIndex].value);
//        }
//    }
//}
//
//function dep2(cat, subcat, nomcat)
//{
//    //document.OfertaResultadosForm.OfertaSubcategoria.options.length=0;
//    document.getElementById('ZonadenunciaParroquias').options.length=0;
//    select = document.getElementById('ZonadenunciaMunicipios');
//    if ( select.options[select.selectedIndex].value == '' ){
//        document.getElementById('ZonadenunciaParroquias').options[0] = new Option('--', '', true, true);
//        for( i = 0; i < subcat.length; i++ ){
//            document.getElementById('ZonadenunciaParroquias').options[document.getElementById('ZonadenunciaParroquias').options.length] = new Option(nomcat[i], subcat[i], false, false);
//        }
//    }
//    else{
//        document.getElementById('ZonadenunciaParroquias').options[0] = new Option('--', '', true, true);
//        for( i = 0; i < subcat.length; i++ ){
//            if( cat[i] == select.options[select.selectedIndex].value ){
//                document.getElementById('ZonadenunciaParroquias').options[document.getElementById('ZonadenunciaParroquias').options.length] = new Option(nomcat[i], subcat[i], false, false);
//            }
//        //alert(select.options[select.selectedIndex].value);
//        }
//    }
//}
//
//function dep3(cat, subcat, nomcat)
//{
//    //document.OfertaResultadosForm.OfertaSubcategoria.options.length=0;
//    document.getElementById('ZonadenunciaLocalidades').options.length=0;
//    select = document.getElementById('ZonadenunciaMunicipios');
//    if ( select.options[select.selectedIndex].value == '' ){
//        document.getElementById('ZonadenunciaLocalidades').options[0] = new Option('--', '', true, true);
//        for( i = 0; i < subcat.length; i++ ){
//            document.getElementById('ZonadenunciaLocalidades').options[document.getElementById('ZonadenunciaLocalidades').options.length] = new Option(nomcat[i], subcat[i], false, false);
//        }
//    }
//    else{
//        document.getElementById('ZonadenunciaLocalidades').options[0] = new Option('--', '', true, true);
//        for( i = 0; i < subcat.length; i++ ){
//            if( cat[i] == select.options[select.selectedIndex].value ){
//                document.getElementById('ZonadenunciaLocalidades').options[document.getElementById('ZonadenunciaLocalidades').options.length] = new Option(nomcat[i], subcat[i], false, false);
//            }
//        //alert(select.options[select.selectedIndex].value);
//        }
//    }
//}

function reseteo(elem){
    if ( elem == "est" ){
        $('municipios').innerHTML = "";
        $('parroquias').innerHTML = "";
        $('localidades').innerHTML = "";
        $('dir').innerHTML = "";
    }
    else if( elem == "mun" ){
        $('parroquias').innerHTML = "";
        $('localidades').innerHTML = "";
        $('dir').innerHTML = "";
    }
    else if( elem == "parr" ){
        $('localidades').innerHTML = "";
        $('dir').innerHTML = "";
    }
    else if( elem == "loc" ){
        $('dir').innerHTML = "";
    }
}

var limite;

function createAddress( a0, a1, a2 ){
    var address = '';
    limite = 1;
    if( a1 != null ){
        address = address + " " + a1;
        limite = 2;
    }
    if( a2 != null ){
        address = address + " " + a2;
        if( limite == 2 ){
            limite = 4;
        }
        else
            limite = 3;
    }
    if( limite != 1 )
        address = "Venezuela "+a0+" "+address;
    return address;
}

function createMap( a0, a1, a2 ){
    map = new GMap2(document.getElementById("map_canvas"));
    var minZoom = parseInt(estado_zoom);//map.getZoom();
      // Tipos de mapa
    var mt = map.getMapTypes();
      // Establecer zoom minimo y maximo
    for (var i=0; i<mt.length; i++) {
        mt[i].getMinimumResolution = function() {return minZoom};
    }
    map.addControl(new GLargeMapControl3D());
    map.addControl(new GMapTypeControl());
    map.enableScrollWheelZoom();
    map.enableDragging();
    GEvent.addListener(map, "click", function(dgaf, coordenadas) {
        document.getElementById('longitud').value = coordenadas.x;
        document.getElementById('latitud').value = coordenadas.y;
//        alert( coordenadas.x + ' / ' + coordenadas );
        if (marker != null)
           map.removeOverlay(marker);
        marker = new GMarker(coordenadas, {draggable: true});
        map.addOverlay(marker);
    });
    // Restringir el movimiento en el mapa
      GEvent.addListener(map, "move", function() {
        checkBounds();
      });
      //Al efectuar zoom out es necesario reubicar la vista del mapa
      GEvent.addListener(map, "zoomend", function(oldzoom, newzoom) {
        checkBoundsZoom(oldzoom, newzoom);
      });
    $addressSelected = false;
    showAddress( a0, a1, a2 );
}
var $addressSelected = false;
function showAddress(a0, a1, a2) {
    var address = createAddress(a0, a1, a2);
    var resultados = new Array();
    if ( limite != 1){//Pasaron urbanizacion y/o calle
//        alert(address);
        if (geocoder) {
            geocoder.getLocations(
                address,
                function(response) {
                    if (!response) {
                    } else {
                        if( response.Placemark != null){ //si hay resultados para la direccion
                            for( var i = 0; i < response.Placemark.length; i++ ){
                                var place = response.Placemark[i];
                                var punto = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
                                if ( punto.lat() >= estadoMinYlat && punto.lat() <= estadoMaxYlat &&  punto.lng() >= estadoMinXlng && punto.lng() <= estadoMaxXlng  ){//si esta dentro de los limites del estado
//                                    $('resultados').innerHTML = $('resultados').innerHTML + "<input type='radio' name='sex' value='" + place.address + "' onchange=mostrar('acepto','" + punto.lat() + "','" + punto.lng() + "','" + limite + "') />" + place.address + "<br /> ";
                                    if ($addressSelected)
                                        resultados.push("<input type='radio' name='sex' value='" + place.address + "' onchange=mostrar('acepto','" + punto.lat() + "','" + punto.lng() + "','" + limite + "') />" + place.address + "<br /> ");
                                    else{
                                        resultados.push("<input type='radio' name='sex' checked value='" + place.address + "' onchange=mostrar('acepto','" + punto.lat() + "','" + punto.lng() + "','" + limite + "') />" + place.address + "<br /> ");
                                        mostrar('acepto',punto.lat(), punto.lng(),limite);
                                        $addressSelected = true;
                                    }
                                }
                            }
                        }
                    }
                    if ( resultados.length > 0 ){
                        if( limite == 4 || limite == 3 )
                            $('resultados').innerHTML = $('resultados').innerHTML + "<br/>Resultados de busqueda detalle alto (calle):<br />";
                        else if ( limite == 2)
                            $('resultados').innerHTML = $('resultados').innerHTML + "<br/>Resultados de busqueda detalle medio (urbanizacion/ciudad):<br />";
                        for ( var j = 0; j < resultados.length; j++ )
                            $('resultados').innerHTML = $('resultados').innerHTML +  resultados[j] ;
                    }
                    if( limite == 4 ){//explorar con detalle medio
                        showAddress(a0, a1, null);
                    }
                    else{ //caso base, colocar el estado completo
                        $('resultadosCargando').innerHTML = "";
                        $('resultados').innerHTML = $('resultados').innerHTML + "<br/>Resultados de busqueda detalle bajo (estado):<br />";
                        if ($addressSelected)
                            $('resultados').innerHTML = $('resultados').innerHTML + "<input type='radio' name='sex' value='" + estado + "' onchange=mostrar('acepto','" + estado_lat + "','" + estado_lng + "','1') />" + "Vista completa de "+estado +"<br />";
                        else{
                            $('resultados').innerHTML = $('resultados').innerHTML + "<input type='radio' name='sex' checked value='" + estado + "' onchange=mostrar('acepto','" + estado_lat + "','" + estado_lng + "','1') />" + "Vista completa de "+estado +"<br />";
                            mostrar('acepto',estado_lat,estado_lng,'1');
                            $addressSelected = true;
                        }
                    }
                }
                );
        }
    }
    else{ //Caso base, colocar el estado completo
        $('resultadosCargando').innerHTML = "";
        $('resultados').innerHTML = $('resultados').innerHTML + "<br/>Resultados de busqueda detalle bajo (estado):<br />";
        if ($addressSelected)
            $('resultados').innerHTML = $('resultados').innerHTML + "<input type='radio' name='sex' value='" + estado + "' onchange=mostrar('acepto','" + estado_lat + "','" + estado_lng + "','1') />" + "Vista completa de "+estado +"<br />";
        else{
            $('resultados').innerHTML = $('resultados').innerHTML + "<input type='radio' name='sex' checked value='" + estado + "' onchange=mostrar('acepto','" + estado_lat + "','" + estado_lng + "','1') />" + "Vista completa de "+estado +"<br />";
            mostrar('acepto',estado_lat,estado_lng,'1');
            $addressSelected = true;
        }
    }
}

function mostrar( status, lat, lng, limite ){
    if ( status == 'acepto'){
        var point = new GLatLng(lat, lng);
//        map = new GMap2(document.getElementById("map_canvas"));
        if (limite == 4 || limite == 3)
            map.setCenter(point, 16);
        else if ( limite == 2 )
            map.setCenter(point, 15);
        else
            map.setCenter(point, parseInt(estado_zoom));
//        confirmar(lat, lng);
        var C = map.getCenter();
        var X = C.lng();
        var Y = C.lat();
        ultimoPuntoCentroEnLimites = new GLatLng(Y,X);
//        map.disableDragging();
//        $('boton').innerHTML = "";
//        $('boton').innerHTML = "<input name='boton' type='button' onclick=javascript:confirmar(" + lat + "," + lng + ") value='Confirmar seleccion' /><br />";
        
    }
//    else{
//        $('boton').innerHTML = "";
//        $('resultados').innerHTML = "";
//        if ( limite == 4 ){
//            showAddress(estado, urbanizacion, null);
//        }
//        else{
//            showAddress(estado, null, null);
//        }
//    }
}

var map = null;
var geocoder = null;
var marker = null;

function initialize() {
    if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();
    }
}


///******  TRestricter  **********************************************/
//
//// Constructor
//TRestricter = function (map) {
//    this.map = map;
//}
//
//// Función que activa la limitación del desplazamiento entre la esquina inferior izquierda
//// y la esquina superior derecha
//TRestricter.prototype.restrict = function (sw, ne) {
//    this.map._allowedBounds = new GLatLngBounds(sw, ne);
//    GEvent.addListener(this.map, 'move', this.checkBounds);
//}
//
//// Función que desactiva la limitación del desplazamiento
//TRestricter.prototype.unrestrict = function () {
//    this.map._allowedBounds = null;
//}
//
//// Listener encargado de comprobar el desplazamiento
//TRestricter.prototype.checkBounds = function() {
//    if (!this._allowedBounds || this._allowedBounds.contains(this.getCenter())) return;
//    var x = Math.min(Math.max(this.getCenter().lng(), this._allowedBounds.getSouthWest().lng()), this._allowedBounds.getNorthEast().lng());
//    var y = Math.min(Math.max(this.getCenter().lat(), this._allowedBounds.getSouthWest().lat()), this._allowedBounds.getNorthEast().lat());
//    this.setCenter(new GLatLng(y,x));
//}


var allowedBounds = null;

//function confirmar( lat, lng ){
////    alert(lat + " " + lng);
////    alert("Haga click sobre el mapa en el lugar donde ocurrió el suceso.")
////    var minZoom = parseInt(estado_zoom);//map.getZoom();
////    // ====== Restringir el zoom =====
////      // Tipos de mapa
////      var mt = map.getMapTypes();
////      // Establecer zoom minimo y maximo
////      for (var i=0; i<mt.length; i++) {
////        mt[i].getMinimumResolution = function() {return minZoom};
////      }
////    map.addControl(new GLargeMapControl3D());
////    map.addControl(new GMapTypeControl());
////    map.enableScrollWheelZoom();
////    map.enableDragging();
////    GEvent.addListener(map, "click", function(dgaf, coordenadas) {
////        document.getElementById('longitud').value = coordenadas.x;
////        document.getElementById('latitud').value = coordenadas.y;
//////        alert( coordenadas.x + ' / ' + coordenadas );
////        if (marker != null)
////           map.removeOverlay(marker);
////        marker = new GMarker(coordenadas, {draggable: true});
////        map.addOverlay(marker);
////    });
////    // Restringir el movimiento en el mapa
////      GEvent.addListener(map, "move", function() {
////        checkBounds();
////      });
////      //Al efectuar zoom out es necesario reubicar la vista del mapa
////      GEvent.addListener(map, "zoomend", function(oldzoom, newzoom) {
////        checkBoundsZoom(oldzoom, newzoom);
////      });
//
//      // The allowed region which the whole map must be within
//
//    //restringir el area de exploracion del mapa confirmado
////    var bounds = map.getBounds();
////    var southWest = bounds.getSouthWest();
////    var northEast = bounds.getNorthEast();
////    allowedBounds = new GLatLngBounds(southWest, northEast);
////    estadoMaxXlng = allowedBounds.getNorthEast().lng();
////    estadoMaxYlat = allowedBounds.getNorthEast().lat();
////    estadoMinXlng = allowedBounds.getSouthWest().lng();
////    estadoMinYlat = allowedBounds.getSouthWest().lat();
////    alert(estadoMinXlng+' / '+estadoMinYlat+' / '+estadoMaxXlng+' / '+estadoMaxYlat);
//    var C = map.getCenter();
//    var X = C.lng();
//    var Y = C.lat();
//    ultimoPuntoCentroEnLimites = new GLatLng(Y,X);
////    map._restricter = new TRestricter(map);
////    map._restricter.restrict(southWest, northEast);
//    //GEvent.addListener(map, "drag", function() {
//    //    alert( ' hola ' );
//    //});
//}

var ultimoPuntoCentroEnLimites = null;
//var estadoMaxXlng = null;
//var estadoMaxYlat = null;
//var estadoMinXlng = null;
//var estadoMinYlat = null;

function checkBounds() {
        // Perform the check and return if OK
//        if (allowedBounds.contains(map.getCenter())) {
//          return;
//        }
        // It`s not OK, so find the nearest allowed point and move there
        var bounds = map.getBounds();
        var northEast = bounds.getNorthEast();
        var southWest = bounds.getSouthWest();

        var maxXlng = northEast.lng();
        var maxYlat = northEast.lat();
        var minXlng = southWest.lng();
        var minYlat = southWest.lat();
//        var C = map.getCenter();
//        var X = C.lng();
//        var Y = C.lat();

        if (minXlng < estadoMinXlng || maxXlng > estadoMaxXlng || minYlat < estadoMinYlat || maxYlat > estadoMaxYlat){
            map.setCenter(ultimoPuntoCentroEnLimites);
        }
        else{
            var C = map.getCenter();
            var X = C.lng();
            var Y = C.lat();
            ultimoPuntoCentroEnLimites = new GLatLng(Y,X);
        }
//
//        if (X < estadoMinXlng) {X = estadoMinXlng;}
//        if (X > estadoMaxXlng) {X = estadoMaxXlng;}
//        if (Y < estadoMinYlat) {Y = estadoMinYlat;}
//        if (Y > estadoMaxYlat) {Y = estadoMaxYlat;}
//        alert ("Restricting "+Y+" "+X);
//        map.setCenter(new GLatLng(Y,X));
}

function checkBoundsZoom(oldzoom, newzoom){
    if ( newzoom < oldzoom ){
        var bounds = map.getBounds();
        var northEast = bounds.getNorthEast();
        var southWest = bounds.getSouthWest();

        var maxXlng = northEast.lng();
        var maxYlat = northEast.lat();
        var minXlng = southWest.lng();
        var minYlat = southWest.lat();

        var C = map.getCenter();
        var X = C.lng();
        var Y = C.lat();
        
        if (minXlng < estadoMinXlng || maxXlng > estadoMaxXlng || minYlat < estadoMinYlat || maxYlat > estadoMaxYlat){
            map.setCenter(new GLatLng(estado_lat,estado_lng));
            alert( 'Se movió el mapa al punto centro del estado.\n\nMotivo: La región visualizada estaba fuera del área permitida.' )
//            if (minXlng < estadoMinXlng) {
//                X = X + (estadoMinXlng - minXlng);
////                maxXlng = maxXlng + (estadoMinXlng - minXlng)
////                minXlng = estadoMinXlng;
//            }
//            else if (maxXlng > estadoMaxXlng) {
//                X = X - (maxXlng - estadoMaxXlng);
////                minXlng = minXlng - (maxXlng - estadoMaxXlng);
////                maxXlng = estadoMaxXlng;
//            }
//            if (minYlat < estadoMinYlat) {
//                Y = Y + (estadoMinYlat - minYlat);
////                maxYlat = maxYlat + (estadoMinYlat - minYlat);
////                minYlat = estadoMinYlat;
//            }
//            else if (maxYlat > estadoMaxYlat) {
//                Y = Y - (maxYlat - estadoMaxYlat);
////                minYlat = minYlat - (maxYlat - estadoMaxYlat);
////                maxYlat = estadoMaxYlat;
//            }
//
//            map.setCenter(new GLatLng(Y,X));
        }
    }
}

function listarParroquias(municipio){
        var munparr = document.getElementById('p'+municipio);
        var parr = document.getElementById('parroquias2');
        parr.options.length=0;
        var n=munparr.options.length;
        for(var i=0; i<n; i++){
            parr.options[parr.options.length] = new Option(''+munparr.options[i].text, ''+munparr.options[i].value);
            parr.options[i].id = munparr.options[i].id;
        }
//        if ( document.getElementById('municipios2').options[1].selected == true ){
            $('localidades').hide();
//        }
    }
    function municipio(mun){
        var n = document.getElementById('municipios2').options.length;
        for ( var i = 1; i < n; i++ ){
            if ( document.getElementById('municipios2').options[i].value == mun ){
                document.getElementById('municipios2').options[i].selected = true;
                break;
            }
        }
        if ( mun != '-1' ){
            $('localidades').show();
        }
        else{
            $('localidades').hide();
        }
        
    }

    function activarEstado(mun, parr){
        if (!document.getElementById('AgenteCheck').checked){
            document.getElementById('AgenteEstados').disabled = true;
            $('municipios').update("");
            $('municipios').insert("Municipio: "+mun);
            $('municipios').insert("<br/>Parroquia: "+parr);
        }
        else{
            document.getElementById('AgenteEstados').disabled = false;
    //        document.getElementById('AgenteCheck').hide();
            new Ajax.Updater('municipios', '/agentes/buscaMunicipiosEdit/');
        }
    }

    function agregarVictimas(numVictimas){
        var edades = "<option value='-1'></option>";
        for ( i = 0; i < 121; i++ )
            edades = edades + "<option value='"+i+"'>"+i+"</option>";
        $('victimas').update("");
        if( numVictimas > 0 )
            $('victimasIns').update("<br/>Cualquier campo puede ser dejado vacío si desconoce la información.<br/>");
        else
            $('victimasIns').update("");
        for ( i = 0; i < numVictimas; i++ ){
            $('victimas').insert("<label for='VictimaNombre"+i+"'>Nombre: </label><input name='data[Victima][datos]["+i+"][nombre]' type='text' maxlength='50' value='' id='VictimaNombre"+i+"' />");
            $('victimas').insert("<label for='VictimaOcupacion"+i+"'>Ocupación: </label><input name='data[Victima][datos]["+i+"][ocupacion]' type='text' maxlength='50' value='' id='VictimaOcupacion"+i+"' />");
            $('victimas').insert("<label for='VictimaSexo"+i+"'>Sexo: </label><select name='data[Victima][datos]["+i+"][sexo]' id='VictimaSexo"+i+"'><option value='-1'></option><option value='0'>Femenino</option><option value='1'>Masculino</option></select>");
            $('victimas').insert("<label for='VictimaEdad"+i+"'>Edad: </label><select name='data[Victima][datos]["+i+"][edad]' id='VictimaEdad"+i+"'>"+edades+"</select><br/>");
        }
    }
    
    //Efectua submit del paso filtrores del wizard, si el usuario ya coloco el pin en el mapa
    function submitMapa(){
        if ( marker != null ){
            document.forms['DenunciaForm'].submit();
        }
        else{
            alert('Debe colocar un pin en el lugar donde ocurrió el delito');
        }
    }
