
// map vars
var map;
var mapLayer;
var aerialLayer;
var markerLayer;
var click;

//var TILESERVER = "http://ntile1.navici.com/t/reittiopas/";

// wwwRoot
wwwRoot = window.location.pathname.replace('/mapSearch/', '');

// other vars
var prevSelect;

$.urlParam = function(name){
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results) return results[1];
    else return '';
}

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
    defaultHandlerOptions: {
        'single': true,
        'double': false,
        'pixelTolerance': 0,
        'stopSingle': false,
        'stopDouble': false
    },

    initialize: function(options) {
        this.handlerOptions = OpenLayers.Util.extend({}, this.defaultHandlerOptions);
        OpenLayers.Control.prototype.initialize.apply(this, arguments);
        this.handler = new OpenLayers.Handler.Click(this, {
            'click': this.trigger
            },
        this.handlerOptions);
    },

    trigger: function(e) {
        // remove previous markers
        markerLayer.clearMarkers();
        // add new marker
        if (e.lonlat) lonlat = e.lonlat;
        else lonlat = map.getLonLatFromViewPortPx(e.xy);
        log('selected coords:'+lonlat);
        var marker = getFlagMarker(lonlat);
        markerLayer.clearMarkers();
        markerLayer.addMarker(marker);
        // geocode
        var callback = function(geoStr) { setInfoBar(geoStr) }
        reverseGeocodeAjax(lonlat, $.urlParam('lang'), callback);
    }
});


function setInfoBar(geoStr) {
    var arr = geoStr.split('*');
    $("#infoBarText").css("display", "none");
    $("#infoBarTable").css("display", "block");
    $('#selectedAddress').text(arr[1]);
    $('#selectedGeoStr').attr('value', geoStr);
}


function getFlagMarker(lonlat) {
    size = new OpenLayers.Size(16,19);
    offset = new OpenLayers.Pixel(-2, -21);
    if ($.urlParam('field') == 'via_in') image = 'flag_via.png';
    else if ($.urlParam('field') == 'to_in') image = 'flag_end.png';
    else image = 'flag_start.png';
    var icon = new OpenLayers.Icon(image,size,offset);
    return new OpenLayers.Marker(lonlat,icon);
}


/* NOT USED */
function drawMapPin(lonlat) {
    var size = new OpenLayers.Size(40,37);
    var offset = new OpenLayers.Pixel(-13, -38);
    var image = 'pin3.png';
    if ($.browser.msie && $.browser.version < 7) image = 'pin3.gif';
    var icon = new OpenLayers.Icon(image,size,offset);
    var marker = new OpenLayers.Marker(lonlat,icon);
    markerLayer.clearMarkers();
    markerLayer.addMarker(marker);
}

function reverseGeocodeAjax(lonlat, lang, callback) {
    var server = wwwRoot+'/ajaxServers/reverseGeocoder.php';
    var params = {
        x: lonlat.lon,
        y: lonlat.lat,
        lang:lang
    };
    $.get(server, params, callback, 'text');
}

/* NOT USED */
function getLocationsAjax(key, langId) {
    var server = wwwRoot+'/geocode/';
    var params = {
        key: key
    };
    var callback = getLocationsAjax_cb;
    $.get(server, params, callback, 'json');
}

/* NOT USED */
function getLocationsAjax_cb(result) {
    var locs = result.data.locationGroups[0].locations;
    for (var i=0; i<locs.length; i++) {
        log(locs[i].name);
    }
}

function drawMap() {
    // settings
    divId = 'olMap-1';
    zoom = 2;
    var centerLonLat = new OpenLayers.LonLat(2552341, 6673514);
    //tilesUrl = TILESERVER;
    // init map
    var options = {
        maxExtent: new OpenLayers.Bounds(0,0,3000000,7000000),
        controls: [
        new OpenLayers.Control.Navigation(),
        new OpenLayers.Control.ScaleLine(),
        new OpenLayers.Control.PanZoomBar()
        ],
        resolutions: [0.5,
        1.125,
        2.5,
        3.125,
        4,
        6.25,
        20,
        66.66,
        133],
        restrictedExtent: new OpenLayers.Bounds(2515998,6650001,2570198,6705001),
        units: 'm',
        projection: "EPSG:2392",
        center: centerLonLat
    };
    map = new OpenLayers.Map(divId, options);
    // base layers
    mapLayer = new OpenLayers.Layer.TMS("YTV Map",
        MAP_URL, //tilesUrl,
        {
            layers: 'basic',
            buffer : 0,
            transitionEffect: 'resize',
            getURL: getMapUrl
        });
    map.addLayer(mapLayer);
    aerialLayer = new OpenLayers.Layer.TMS("YTV Aerial",
        AERIAL_URL, //tilesUrl,
        {
            layers: 'basic',
            buffer : 0,
            transitionEffect: 'resize',
            getURL: getAerialUrl
        });
    map.addLayer(aerialLayer);
    // markers layers
    markerLayer = new OpenLayers.Layer.Markers("Markers" );
    map.addLayer(markerLayer);
    // post init actions
    map.zoomTo(zoom);
    // add clicks
    click = new OpenLayers.Control.Click();
    map.addControl(click);
    click.activate();
    // add pin to default position
}

function getMapUrl(bounds) {
    var res = this.map.getResolution();
    var x = Math.round(bounds.left / (res * this.tileSize.w));
    var y = Math.round(bounds.bottom / (res * this.tileSize.h));
    var url = this.url+2392+"x"+res+"x"+x+"x"+y+".png?cid="+NAVICI_CID;
    return url;
}

function getAerialUrl(bounds) {
    var res = this.map.getResolution();
    var x = Math.round(bounds.left / (res * this.tileSize.w));
    var y = Math.round(bounds.bottom / (res * this.tileSize.h));
    var url = this.url+2392+"x"+res+"x"+x+"x"+y+".jpeg?cid="+NAVICI_CID;
    return url;
}

function log(text) {
    if (window.console) {
        window.console.log(text);
    }
}

function printArr(object) {
    var str;
    for(prop in object) {
        str += prop + ":"+ object[prop]+"\n";
    }
}

function exportToSearchForm(field, address, geoStr) {
    var input= function (id, val) { 
        return '<input type="hidden" id="'+id+'" name="'+id+'" value="'+val+'">'
    };
    if (field=='from_in') {
        parent.top.$('#from_in').attr('value',address);
        parent.top.$('#from_prev').attr('value',address);
        parent.top.$('#from_elem').html(input('from', geoStr));
        parent.top.$('#to_in').focus();
    }
    else if (field=='via_in') {
        parent.top.$('#via_in').attr('value',address);
        parent.top.$('#via_prev').attr('value',address);
        parent.top.$('#via_elem').html(input('via', geoStr));
        parent.top.$('#to_in').focus();
    }
    else if(field=='to_in') {
        parent.top.$('#to_in').attr('value',address);
        parent.top.$('#to_prev').attr('value',address);
        parent.top.$('#to_elem').html(input('to', geoStr));
        parent.top.$('#searchButton').focus();
    }
    parent.top.$('#fancy_close').trigger('click');

}

function setLocation(fieldBaseName, locName, locGeo)
{
    var DOM = LBS.UTIL.DOM;
    var GET_ELEMENT = DOM.getElement;
    var CREATE_ELEMENT = DOM.createElement;
    var CLEAR_ELEMENT = DOM.clearElement;
    var APPEND_ELEMENT = DOM.appendElement;
    var APPEND_NEW_ELEMENT = DOM.appendNewElement;

    var suggestionContainer = GET_ELEMENT(fieldBaseName + '_elem');
    CLEAR_ELEMENT(suggestionContainer);

    var locElem = CREATE_ELEMENT('input');
    locElem.type = 'hidden';
    locElem.id = fieldBaseName;
    locElem.name = fieldBaseName;
    locElem.value = locGeo;

    APPEND_ELEMENT(suggestionContainer, locElem);

    var prevElem = GET_ELEMENT(fieldBaseName + '_prev');
    prevElem.value = locName;

    var inputElem = GET_ELEMENT(fieldBaseName + '_in');
    inputElem.value = locName;

    GET_ELEMENT('searchForm_form').submit();
}


function addAutoComplete(inputEl) {
    var options = {
        width:220,
        minChars:2,
        onSelect:
        function(value, data) {
            prevSelect = value;
            var arr = data.split('*'); // data = x*y
            var lonlat = new OpenLayers.LonLat(arr[0], arr[1])
            $('#centerMapButton').attr('disabled', false);
            $('#centerMapButton').click(
                function() {
                    map.setCenter(lonlat);
                    $("#infoBarText").css("display","none");
                    $("#infoBarTable").css("display","block");
                    var marker = getFlagMarker(lonlat);
                    markerLayer.clearMarkers();
                    markerLayer.addMarker(marker);
                    $('#selectedAddress').text(value);
                    $('#selectedGeoStr').attr('value', 'location*'+value+'*'+data);
                }
                )
        },
        params: {
            lang: $.urlParam('lang')
        },
        serviceUrl: wwwRoot+'/ajaxServers/mapSearchAutoComplete.php'
    };
    inputEl.autocomplete(options);
}

