﻿/// <reference path="jquery-1.2.6-vsdoc.js"/>
function convert(D, M, S) {
    var DD;
    D < 0 ? DD = roundOff(D + (M / -60) + (S / -3600), 6) : DD = roundOff(D + (M / 60) + (S / 3600), 6);
    return DD;
}
function roundOff(num, decimalplaces) {
    var decimalfactor = Math.pow(10, decimalplaces);
    var roundedValue = Math.round(num * decimalfactor) / decimalfactor;
    return roundedValue;
}

//jQuery("#address").attr('disabled', 'disabled');
document.getElementById('address').disabled = true;
jQuery('#locatorMode').change(function () {
    jQuery('.formLocate span.locator,.formLocate p.msg').addClass('fade');
    jQuery('.formLocate input[type="text"]').attr('disabled', 'disabled');


    jQuery('#locator' + this.selectedIndex).removeClass('fade').find('input').removeAttr('disabled');
    document.getElementById('address').disabled = this.selectedIndex != 2;
    jQuery('#locator_msg' + this.selectedIndex).removeClass('fade');

});

var map = null;
var search = null;
var markers = null;
var sites = null;
var sitesAdded = false;

if (typeof (fullVersion) == 'undefined') {
    fullVersion = false;
}

var attempt = 1;

function getResults() {
    jQuery('.locator.fade input').val('');
    var geocoder = new SAPO.Maps.Geocoder();
    var query = '';

    var locatorMode = document.getElementById("locatorMode").selectedIndex;
    switch (locatorMode) {
        case 1:
            try {
                var latitude = document.getElementById("latitude").value;
                var longitude = document.getElementById("longitude").value;
                if (latitude == '' || longitude == '') {
                    alert('Preencha as coordenadas');
                    return;
                }
                var regex = new RegExp("(\\d+)\\D+(\\d+)\\D+([\\d.]+)\\D+(\\D)");
                var r = regex.exec(latitude);
                if (r != null) {
                    latitude = convert(parseFloat(r[1]), parseFloat(r[2]), parseFloat(r[3]));
                    var r = regex.exec(longitude);
                    longitude = -1 * convert(parseFloat(r[1]), parseFloat(r[2]), parseFloat(r[3]));
                } else {
                    latitude = parseFloat(latitude);
                    longitude = parseFloat(longitude);
                }

                var lonlat = new OpenLayers.LonLat(longitude, latitude);
                map.setMapCenter(lonlat, 9);
                marker = new SAPO.Maps.Marker(lonlat);
                var marker = new SAPO.Maps.Marker(lonlat, { draggable: false },
                    {
                        markerImage: '/imgs/tdt_pin_03.png'//'/imgs/tdt_pin.png'
                    }
                );
                markers.removeMarkers();
                markers.addMarker(marker);
                marker.registerEvent('mouseover', this, markerCoveragePopup);
                markerCoveragePopup.call(marker, marker);
            } catch (ex) {
            }
            return;
            break;
        case 2:
            var address = document.getElementById("address").value;
            var city = document.getElementById("city").value;
            if (address == '' || city == '') {
                alert('Preencha a morada e a localidade.');
                return;
            }
            query = address;
            if (query.length > 0) query += ", ";
            query += city;
            break;
        case 3:
            query = document.getElementById("cp7_1").value;
            if (query == '') {
                alert('Preencha o código postal');
                return;
            }
            if (document.getElementById("cp7_2").value.length > 0) query += "-";
            query += document.getElementById("cp7_2").value;
    }
    window.location = '#div_mapa';
	if(query==''){
		jQuery('#passo2 .mensagem.resultados').html('<p>Não foram encontrados resultados para a pesquisa efectuada.</p>').show();
		jQuery('#passo2 .mensagem.cobertura').html('').hide();
		jQuery('#passo3 .channel1').html('');
		jQuery('#passo3 .channel2').html('');
		jQuery('#passo3 .bestServer1').html('');
		jQuery('#passo3 .bestServer2').html('');
		jQuery('#passo3 .emissor').hide();	
		attempt=1;
		return;
	}
    /*if (fullVersion) {
        query += document.getElementById("cp7_1").value;
        if (document.getElementById("cp7_2").value.length > 0) query += "-";
        query += document.getElementById("cp7_2").value;
        if (document.getElementById("city").value.length > 0) query += ", ";
    }*/
    

    geocoder.getLocations(query, function(pois) {
        //map.zoomTo(6);
        markers.removeMarkers();
        var marker = false, lonlat = false;
        for (var i = 0; i < pois.length; ++i) {
            lonlat = new OpenLayers.LonLat(Number(pois[i].Longitude), Number(pois[i].Latitude));
            marker = new SAPO.Maps.Marker(lonlat);

            var marker = new SAPO.Maps.Marker(lonlat, { draggable: false },
                    {
                        markerImage: '/imgs/tdt_pin_03.png'//'/imgs/tdt_pin.png'
                    }
                );

            marker.poi = pois[i];
            markers.addMarker(marker);
            marker.registerEvent('mouseover', this, markerCoveragePopup);
        }
        jQuery('#passo2 .mensagem.resultados').hide();
        if (pois.length == 0) {
                jQuery('#passo2 .mensagem.resultados').html('<p>Não foram encontrados resultados para a pesquisa efectuada.</p>').show();
                jQuery('#passo2 .mensagem.cobertura').html('').hide();
                jQuery('#passo3 .channel1').html('');
                jQuery('#passo3 .channel2').html('');
                jQuery('#passo3 .bestServer1').html('');
                jQuery('#passo3 .bestServer2').html('');
                jQuery('#passo3 .emissor').hide();
        } else if (pois.length == 1) {
            markerCoveragePopup.call(marker, marker);
        } else {
            //var markersCenter = markers.getBounds().getCenterLonLat();
            map.setBounds(markers.getBounds());
            //map.zoomToExtent(markers.getBounds(), true);
        }
    }, function(e) { /*alert(e);*/ /*error*/ }, { maxResults: 10, searchForStreetsAndLocations: true });
}
var overlay = null;
var alternativeProjectionObject = new OpenLayers.Projection('EPSG:102164');
jQuery(document).ready(function() {
    jQuery.joinInputs('cp7_1', 'cp7_2');
    jQuery("#find").click(getResults);

    var options = {};
    //if (!fullVersion) {
    //    options = { isDraggable: false, isWheelEnabled: false };
    //}
    
    map = new SAPO.Maps.Map("div_mapa", options);
    map.addControl(new SAPO.Maps.Control.MapType());
    map.addControl(new SAPO.Maps.Control.Navigation());
    markers = new SAPO.Maps.Markers();
    map.zoomTo(6);

   // var p = new OpenLayers.Geometry.Point(0,0).transform(map.getProjectionObject(), new OpenLayers.Projection('EPSG:102164'));

    map.events.register('changebaselayer', this, function () { markers.setZIndex(1000); });

    overlay = new OpenLayers.Layer.WMS(
                    "TDT Coverage",
                        ["http://map1.mapas.sapo.pt/server/wms",
                        "http://map2.mapas.sapo.pt/server/wms",
                        "http://map3.mapas.sapo.pt/server/wms",
                        "http://map4.mapas.sapo.pt/server/wms"],
                    {
                        width: 256,
                        height: 256,
                        layers: 'tdt_coverage',
                        styles: '',
                        srs: 'EPSG:900913',
                        //format: format,
                        tiled: true,
                        tilesOrigin: map.maxExtent.left + ',' + map.maxExtent.bottom,
                        transparent: true,
                        isBaseLayer: false
                    },
                    {
                        buffer: 0,
                        opacity: 0.6, // Layer Opacity, can be controlled by code
                        displayOutsideMaxExtent: true
                    }
                );
                    map.addLayer(overlay);
                    map.addMarkers(markers);

    //map.events.register('dblclick', map, function(e) { console.log('dbclick'); });
    var click = null;
    map.events.register('zoomend', map, function(e) {
        if (!sitesAdded) {
            map.addMarkers(sites);
            sitesAdded = true;
        }
        if (click != null) {
            clearTimeout(click); click = null;
        }
    });
    if (fullVersion) {
        map.events.register('click', map, function(e) {
            if (click == null) {
                click = setTimeout(function() {
                    click = null;
                    var lonlat = map.getLonLatFromContainerPixel(e.xy);
                    markers.removeMarkers();
                    marker = new SAPO.Maps.Marker(lonlat);
                    //marker.poi = pois[i];
                    markers.addMarker(marker);
                    marker.registerEvent('click', this, markerCoveragePopup);
                    markerCoveragePopup.call(marker, marker);
                }, 500);
            }
            OpenLayers.Event.stop(e);
        });
    }
    loadSites(map);
});


function markerCoveragePopup(marker) {
    var zoom = Math.max(map.getZoom(), 11);
    map.setMapCenter(marker.getLonLat(), zoom);
    
    
    var cp4 = jQuery('#cp7_1').val();
    var cp3 = jQuery('#cp7_2').val();

    var xy = map.getContainerPixelFromLonLat(marker.getLonLat());
    jQuery('#passo2 .mensagem.cobertura').hide();
    jQuery('#passo3 .emissor').hide();

    getCoverage(xy, map, function(data) {
        var msg = '', msg2 = '';
        window.TDTCoverage = data.coverage;
        switch (data.coverage) {
            case 1.0:
                msg = '<b>Está numa zona com cobertura parcial TDT.</b><br/>Deverá consultar um instalador habilitado para verificar as condições de cobertura no local.';
                msg2 = 'Está numa zona com <br/>cobertura parcial TDT.';
                break;
            case 2.0:
                msg = '<b>Está numa zona com cobertura TDT.</b>Veja <a class="gotoStep3" href="#" onclick="jQuery(\'#lnkPasso3\').click();return false;">aqui</a> como fazer a transição para a Televisão Digital Terrestre.';
                msg2 = 'Está numa zona com <br/>cobertura TDT.Veja <a class="gotoStep3" href="#" onclick="jQuery(\'#lnkPasso3\').click();return false;">aqui</a> como fazer a transição para a Televisão Digital Terrestre.';
                break;
            case 0.0:
                msg = 'Uma pequena percentagem da população portuguesa não terá acesso à nova televisão digital por via terrestre, uma vez que não existe viabilidade técnica para a cobertura TDT de todo o território nacional. Para estas situações, o serviço de televisão digital com os canais gratuitos nacionais, será assegurado através de uma tecnologia alternativa, ou seja, de TDT Complementar via satélite (Direct To Home - DTH). Veja <a href="/como/Default.aspx?code=XzX6F8">aqui</a> como fazer a transição para a Televisão Digital nestas zonas.';
                msg2 = 'Está uma zona com probabilidade <br/>reduzida de cobertura TDT.';
                break;
        }

        if (typeof (marker.poi) != 'undefined') {
            var title = marker.poi.Name;
            if (title.length > 25) {
                var idx = title.indexOf(' ', 25);
                title = title.substr(0, idx) + "<br/>" + title.substr(idx);
            }
            marker.openPopup('<h2>' + title + '</h2>' + '<p>' + msg2 + '</p>');
        } else {
            marker.openPopup('<p>' + msg2 + '</p>');
        }

        jQuery('#passo2 .mensagem.cobertura').html('<p>' + msg + '</p>').show();
        jQuery('#passo3 .channel1').html(data.channel1);
        jQuery('#passo3 .channel2').html(data.channel2);
        if (data.bestServer2 != '') {
            jQuery('#passo3 .2servers').show();
        } else {
            jQuery('#passo3 .2servers').hide();
        }
        jQuery('#passo3 .bestServer1').html(data.bestServer1);
        jQuery('#passo3 .bestServer2').html(data.bestServer2);
        jQuery('#passo3 .emissor').show();

        showParishOverlay(data.parishId);
        if (fullVersion) {
            jQuery('#passo3').show();
        }

    }, marker.getLonLat().lat, marker.getLonLat().lon, cp4+cp3);

    jQuery.getJSON("/handlers/installerSearch.ashx?cp4=" + cp4 + "&cp3=" + cp3,
        function(data) {
            if (typeof (data.name) == 'undefined') {
                jQuery('.instalador').hide();
                return;
            }            
            jQuery('.instalador .nome').text(data.name);
            jQuery('.instalador .tel1').text(data.phoneNumber1);
            jQuery('.instalador .tel2').text(data.phoneNumber2);
            jQuery('.instalador').show();
        });
    }

Proj4js.defs["EPSG:102164"] = "+proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=200000 +y_0=300000 +ellps=intl +units=m +no_defs +towgs84=-288.885,-91.744,126.244,-1.691,0.41,-0.211,-4.598";

function getCoverage(xy, map, callback, latitude, longitude, zipCode) {
    var location = map.getLonLatFromContainerPixel(xy);
    var bbox = map.getExtent();
    var srs = map.getProjection();
    // Is Portugal mainland
    if (location.lon > -10 && location.lon < -5 && location.lat > 36 && location.lat < 43) {
        bbox = bbox.transform(map.getProjectionObject(), alternativeProjectionObject);
        srs = 'EPSG:102164';
    }

    xy.x = Math.round(xy.x);
    xy.y = Math.round(xy.y);
    params = {
        REQUEST: "GetFeatureInfo",
        EXCEPTIONS: "application/vnd.ogc.se_xml",
        BBOX: bbox.toBBOX(),
        X: xy.x,
        Y: xy.y,
        INFO_FORMAT: 'text/html',
        QUERY_LAYERS: 'tdt_coverage',
      //  FEATURE_COUNT: 50,
        Layers: 'tdt_coverage',
      //  Styles: '',
        Srs: srs,
        WIDTH: map.size.w,
        HEIGHT: map.size.h,

        latitude: latitude,
        longitude: longitude,
        SERVICE: 'wms',
        zipCode: zipCode,
        format: 'image/png'
        //,
        //format: format
    };

    var str = [];
    for (var p in params)
        str.push(p + "=" + encodeURIComponent(params[p]));
    str = str.join("&");

    jQuery.getJSON("/handlers/gisCoverage.ashx?" + str,
        function(data) {
            callback(data);
        });
        
}


function loadSites(map) {
    sites = new SAPO.Maps.Markers();

    jQuery.ajax({
        url: "/handlers/sites.ashx",
        dataType: 'json',
        success:
        function(data) {
            for (var el in data) {
                var marker = new SAPO.Maps.Marker(new OpenLayers.LonLat(data[el].longitude, data[el].latitude), { draggable: false },
                    {
                        markerImage: '/imgs/tdt_pin_02.png'//'/imgs/tdt_pin.png'
                    }
                );
                marker.siteName = data[el].name;
                marker.channel = data[el].channel;
                sites.addMarker(marker);
                marker.registerEvent('mouseover', this,
                    function(marker) {
                        marker.openPopup('<strong>' + marker.siteName + '</strong> ' + marker.channel + '');
                    }
                );
                marker.registerEvent('mouseout', this,
                    function(marker) {
                        marker.closePopup();
                    }
                );
            }
        },
        error: function(a, b) {
           // alert(b);
        }
    });
    }
//OpenLayers.Util.distVincenty = function(	p1,p2	)

    var polygon = null;
    function showParishOverlay(parishId) {

        jQuery.getJSON("/CoverageOverlay.svc/?parishId=" + parishId,
            function(response) {
                for (var i = 0; i < response.length; i++) {
                    var lonlats = new Array();
                    for (var j = 0; j < response[i].length; j++) {
                        lonlats.push(new OpenLayers.LonLat(response[i][j].Lon, response[i][j].Lat));
                        // alert(new OpenLayers.LonLat(response[i][j].Lon, response[i][j].Lat));
                    }
                    if (polygon != null) {
                        map.removeOverlay(polygon);
                    }
                    polygon = new SAPO.Maps.Polyline(lonlats,
                       {
                           strokeColor: '#0000FF',
                           strokeOpacity: 1,
                           strokeWidth: 1,
                           strokeDashstyle: 'dash',
                           fillColor: '#0000FF',
                           fillOpacity: 0
                       });
                    map.addOverlay(polygon);
                    //var overlay_layer = map.layers[map.layers.length - 1];
                    //map.setLayerZIndex(overlay_layer, 999);
                }
            });
    }
