﻿var DEFAULT_ZOOM_LEVEL = 5;
var DEFAULT_MAPCENTER_LAT = 50.981412;
var DEFAULT_MAPCENTER_LNG = 13.856788;

var _map = null;
var _cluster = null;
var _mapMarkerList = null;

var _userList = null;
var _userMarkerList = null;
var _userDisplayList = null;

var _companyList = null;
var _companyMarkerList = null;
var _companyDisplayList = null;

var _displayList = null;

//load map from Google Maps API and gets locations from database
$().ready(function()
{
    loadSearch();
    loadMap();

    //fetch all used tags from repository
    var element = $("#search-interests");
    initTaging(element);
});

function loadSearch()
{
    $('#map-meta-top-menu-left-act').css("background-image", "url(" + APP_ROOT_PATH + "/Content/Images/Elements/Map/MapMetaTopLeft.png)");
    $('#map-meta-top-menu-right-act').css("background-image", "");

    //remove empty option
    $('#search-country').removeOption(0);
    loadFederalStates();
    
    $('#search-country').change(function()
    {
        loadFederalStates();
    });
}

function loadFederalStates()
{
    var countryId = $('#search-country').val();
    if (countryId != GUID_EMPTY)
    {
        $.ajax(
            {
                type: "POST",
                url: APP_ROOT_PATH + "/Ajax/GetFederalStates?countryId=" + countryId,
                data: "",
                success: function(result)
                {
                    //remove all options
                    $("#search-state").removeOption(/./);

                    var fedStates = $.evalJSON(result);
                    $.each(fedStates, function(i, fedState)
                    {
                        if (fedState.Id == GUID_SACHSEN)
                        {
                            $('#search-state').addOption(fedState.MapSearchTerm, fedState.Name, true);
                        }
                        else
                        {
                            $('#search-state').addOption(fedState.MapSearchTerm, fedState.Name, false);
                        }
                    });

                },
                error: function(errorcode)
                {
                    //todo: handle error
                }
            })
    }
    else
    {
        //remove all options
        $("#search-state").removeOption(/./);
    }
}

function loadMap()
{
    if (GBrowserIsCompatible())
    {
        var mapDiv = document.getElementById("map");
        _map = new GMap2(mapDiv);

        var mapType = G_PHYSICAL_MAP;
        _map.addMapType(mapType);
        _map.setMapType(mapType);
        _map.enableScrollWheelZoom();
        _map.enableContinuousZoom();

        var largeMapControl = new GLargeMapControl();
        _map.addControl(largeMapControl);

        var swLatLng = _map.getBounds().getSouthWest();
        var neLatLng = _map.getBounds().getNorthEast();

        $.ajax(
        {
            type: "POST",
            url: APP_ROOT_PATH + "/Search/Users",
            data: "swLat=" + swLatLng.lat() + "&swLng=" + swLatLng.lng() + "&neLat=" + neLatLng.lat() + "&neLng=" + neLatLng.lng(),
            success: searchUsersCallback
        });

        $.ajax(
        {
            type: "POST",
            url: APP_ROOT_PATH + "/Search/Companies",
            data: "",
            success: searchCompaniesCallback
        });
    }
}

function searchUsersCallback(result)
{
    if (result.toString() != "")
    {
        _userList = $.evalJSON(result);
        initUserProfileDisplay();
    }

    checkDisplayMarkers();
}

function searchCompaniesCallback(result)
{
    if (result.toString() != "")
    {
        _companyList = $.evalJSON(result);
        initCompanyProfileDisplay();
    }
    checkDisplayMarkers();
}

function checkDisplayMarkers()
{
    if (_userMarkerList != null &&
        _companyMarkerList != null)
    {
        displayMarkers();
    }
}

function displayMarkers()
{
    _mapMarkerList = _userMarkerList.concat(_companyMarkerList);
    _map.setCenter(new GLatLng(DEFAULT_MAPCENTER_LAT, DEFAULT_MAPCENTER_LNG), DEFAULT_ZOOM_LEVEL);
    _map.clearOverlays();

    if (_cluster != null)
    {
        _cluster.removeMarkers();
    }
    _cluster = new ClusterMarker(_map, { markers: _mapMarkerList });
    
    _map.setCenter(new GLatLng(DEFAULT_MAPCENTER_LAT, DEFAULT_MAPCENTER_LNG), DEFAULT_ZOOM_LEVEL);
    _map.savePosition();

    GEvent.addListener(_map, "moveend", function()
    {
        setRequestDelay(function() { moveEndHandler() });
    });
}

function moveEndHandler()
{
    initUserProfileDisplay();
    initCompanyProfileDisplay();
    _cluster.removeMarkers();

    _mapMarkerList = _userMarkerList.concat(_companyMarkerList);
    _cluster = new ClusterMarker(_map, { markers: _mapMarkerList });
    _cluster.refresh();

    displayResults();
}

function initUserProfileDisplay()
{
    _userMarkerList = new Array();
    _userDisplayList = new Array();
    $.each(_userList, function(i, user)
    {
        var marker = createUserMarker(user)
        _userMarkerList.push(marker);

        if (isInBoundary(marker))
        {
            _userDisplayList.push(_userList[i]);
        }
    });
}

function initCompanyProfileDisplay()
{
    _companyMarkerList = new Array();
    _companyDisplayList = new Array();
    $.each(_companyList, function(i, company)
    {
        var marker = createCompanyMarker(company)
        _companyMarkerList.push(marker);

        if (isInBoundary(marker))
        {
            _companyDisplayList.push(_companyList[i]);
        }
    });    
}

function createUserMarker(user)
{
    var loc = user.LatLng;

    var latitude = loc.Latitude;
    var longitude = loc.Longitude;

    var point = new GLatLng(latitude, longitude);

    var icon = new GIcon(G_DEFAULT_ICON);

    icon.image = MAP_ICON_PATH_USER + "&chs=20x20";
    icon.shadow = "";

    icon.iconSize = new GSize(20, 20);
    icon.iconAnchor = new GPoint(0, 15);

    var markerOptions = { icon: icon };

    var marker = new GMarker(point, markerOptions);

    //registers an event onmouseover -> opens infobox on map
    GEvent.addListener(marker, "mouseover", function()
    {
        setRequestDelay(function() { userMouseOverHandler(marker, user) });
    });

    //registers an event onmouseout -> closes infobox on map
    GEvent.addListener(marker, "mouseout", function()
    {
        window.clearTimeout(_timeout);
        _map.closeExtInfoWindow();
    });

    //registers an event onclick -> displays short
    GEvent.addListener(marker, "click", function()
    {
        var element = $('#map-meta-content');
        element.empty();

        displayUserCard(user.User, element);
    });

    return marker;
}

function userMouseOverHandler(marker, user)
{
    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Profile/ShortUser/" + user.User,
        data: "",
        success: function(result)
        {
            if (result.toString() != "")
            {
                marker.openExtInfoWindow(
                  _map,
                  "mapInfoBoxUser",
                  result,
                  { beakOffset: 0 }
                ); 
            }
        },
        error: function(errorcode)
        {
            //todo: handle error
        }
    })
}

function createCompanyMarker(company)
{
    var loc = company.LatLng;

    var latitude = loc.Latitude;
    var longitude = loc.Longitude;

    var point = new GLatLng(latitude, longitude);

    var icon = new GIcon(G_DEFAULT_ICON);

    icon.image = MAP_ICON_PATH_COMPANY + "&chs=20x20";
    icon.shadow = "";

    icon.iconSize = new GSize(20, 20);
    icon.iconAnchor = new GPoint(0, 15);

    var markerOptions = { icon: icon };

    var marker = new GMarker(point, markerOptions);

    //registers an event onmouseover -> opens infobox on map
    GEvent.addListener(marker, "mouseover", function()
    {
        setRequestDelay(function() { companyMouseOverHandler(marker, company) });

    });

    //registers an event onmouseout -> closes infobox on map
    GEvent.addListener(marker, "mouseout", function()
    {
        _map.closeExtInfoWindow();
    });

    //registers an event onclick -> displays short
    GEvent.addListener(marker, "click", function()
    {
        var element = $('#map-meta-content');
        element.empty();

        displayCompanyCard(company.Company, element);
    });

    return marker;
}


function companyMouseOverHandler(marker, company)
{
    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Profile/ShortCompany/" + company.Company,
        data: "",
        success: function(result)
        {
            if (result.toString() != "")
            {
                marker.openExtInfoWindow(
                  _map,
                  "mapInfoBoxCompany",
                  result,
                  { beakOffset: 0 }
                );
            }
        },
        error: function(errorcode)
        {
            //todo: handle error
        }
    })
}

//checks, whether the markers is in the visible part ob the map
//returns: bool
function isInBoundary(marker)
{
    return _map.getBounds().contains(marker.getLatLng());
}

var _itemsPerPage = 3;
function displayResults()
{
    _displayList = _companyDisplayList.concat(_userDisplayList);
    
    $('#map-meta-top-menu-left-act').css("background-image", "");
    $('#map-meta-top-menu-right-act').css("background-image", "url(" + APP_ROOT_PATH + "/Content/Images/Elements/Map/MapMetaTopRight.png)");

    $("#map-meta-content").empty();

    if (_displayList.length == 0) $('#map-meta-content').html("<b>Kein Profil in diesem Bereich der Karte</b>");
    else
    {
        $("#map-meta-content").append("<div id=\"map-meta-content-pagination\" class=\"pagination\"></div>");
        $("#map-meta-content").append("<div class=\"clear\">&nbsp;</div><br />");
        $("#map-meta-content").append("<div id=\"map-meta-content-results\"></div>");
        $("#map-meta-content-pagination").pagination(_displayList.length, {
            num_edge_entries: 2,
            num_display_entries: 8,
            callback: pageSelectCallback,
            items_per_page: _itemsPerPage,
            next_text: "",
            prev_text: ""
        });
    }
}

function pageSelectCallback(page_index, jq)
{
    setRequestDelay(function() { displayProfileCards(page_index) });

}

function displayProfileCards(page_index)
{
    var maxEle = Math.min((page_index + 1) * _itemsPerPage, _displayList.length);
    var element = $("#map-meta-content-results");
    element.empty();

    for (var i = page_index * _itemsPerPage; i < maxEle; i++)
    {
        var userId = _displayList[i].User;
        var companyId = _displayList[i].Company;

        if (userId != null)
        {
            displayUserCard(userId, element);
        }
        else
        {
            displayCompanyCard(companyId, element);
        }
    } 
}

function displayUserCard(userId, element)
{
    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Profile/UserCard/" + userId,
        data: "",
        success: function(result)
        {
            element.append(result);
        },
        error: function(errorcode)
        {
            //todo: handle error
        }
    })
}

function displayCompanyCard(companyId, element)
{
    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Profile/CompanyCard/" + companyId,
        data: "",
        success: function(result)
        {
            element.append(result);
        },
        error: function(errorcode)
        {
            //todo: handle error
        }
    })
}

function search()
{
    var country = $('#search-country option:selected').text();
    var federalState = $('#search-state').val();
    var city = $('#search-city').val();
    
    getSearchLatLng(country + " " + federalState + " " + city);
}

function getSearchLatLng(locationString)
{
    _map.clearOverlays();
    var geocoder = new GClientGeocoder();

    geocoder.getLatLng(locationString, getSearchLatLngCallback);
}

function getSearchLatLngCallback(point)
{
    if (point)
    {
        var lng = point.x;
        var lat = point.y;
        var circuit = $('#search-area').val();
        circuit = circuit * 1000;
        var tags = $('#search-interests').val();

        if (tags == "" || tags == "Tags")
        {
            searchWithoutTags(lat, lng, circuit);
        }
        else
        {
            searchWithTags(lat, lng, circuit, tags);
        }
    }
    else
    {
        //todo: handle error
    }
}

function searchWithoutTags(lat, lng, circuit)
{
    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Search/UsersInCircuit",
        data: "lat=" + lat + "&lng=" + lng + "&circuit=" + circuit,
        success: searchUsersCallback
    });

    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Search/CompaniesInCircuit",
        data: "lat=" + lat + "&lng=" + lng + "&circuit=" + circuit,
        success: searchCompaniesCallback
    });
}

function searchWithTags(lat, lng, circuit, tags)
{
    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Search/UsersInCircuitWithTags",
        data: "lat=" + lat + "&lng=" + lng + "&circuit=" + circuit + "&tags=" + tags,
        success: searchUsersCallback
    });

    $.ajax(
    {
        type: "POST",
        url: APP_ROOT_PATH + "/Search/CompaniesInCircuitWithTags",
        data: "lat=" + lat + "&lng=" + lng + "&circuit=" + circuit + "&tags=" + tags,
        success: searchCompaniesCallback
    });
}
