google.load("maps", "2", {"other_params":"sensor=false&hl=ru"});
google.load("friendconnect", "0.8");

// now loaded from site media (minimize dns lookup)
//google.load("jquery", "1.4");

var map;
var current_beer;
var current_beer_id;
var current_beer_slug;
var IconBar;
var IconBarEmpty;
var IconShop;
var IconShopEmpty;
var navTimer;
var currentNav = null;
var skin = {};
var mapCenter;

function initIcons(){
    IconBar = new GIcon(G_DEFAULT_ICON);
    IconBar.image = MEDIA_URL + 'green.png';
    /*
    IconBar.image = MEDIA_URL + 'bar.png';
    IconBar.iconSize = new GSize(16, 34);
    IconBar.shadow = MEDIA_URL + 'bar_shadow.png';
    IconBar.shadowSize = new GSize(38, 34);
    IconBar.iconAnchor  = new GPoint(8, 30);
    IconBar.infoWindowAnchor = new GPoint(8, 17);
    */


    IconBarEmpty = new GIcon(IconBar);
    IconBarEmpty.image = MEDIA_URL + 'white.png';
    /*
    IconBarEmpty.image = MEDIA_URL + 'bar_empty.png';
    */
    /*
    IconShop = new GIcon(G_DEFAULT_ICON);
    IconShop.image = MEDIA_URL + 'shop.png';
    IconShop.iconSize = new GSize(16, 34);
    IconShop.shadow = MEDIA_URL + 'shop_shadow.png';
    IconShop.shadowSize = new GSize(38, 34);
    IconShop.iconAnchor  = new GPoint(8, 30);
    IconShop.infoWindowAnchor = new GPoint(8, 17);

    IconShopEmpty = new GIcon(IconShop);
    IconShopEmpty.image = MEDIA_URL + 'shop_empty.png';
    */
    
    mapCenter = new google.maps.LatLng(48.4647834, 35.0461292);
}

function initAddPlace(){
    $('#addplace_button').click(function(){
        showAddPlaceForm();
        return false;
    });

    $('#addplace_link').click(function(){
        showAddPlaceForm();
        return false;
    });
}

function initIndex(){

    initIcons();
    
    initAddPlace();

    // create map
    map = new google.maps.Map2(document.getElementById("map"));
    map.setUIToDefault();
    

    // fill beer options
    $('select.beer').empty()
    for(i in Beers){
        var beer = Beers[i];
        var $option = $('<option>');
        $option.text(beer.name).attr('beer_number', i);
        $('select.beer').append($option);
    }
    
    parseUriFragment();
    
    $('select.beer').change(beerSelected);
    
    //Places.sort(comparePlaceByBeer);

    // show places
    for(i in Places) {
        var place = Places[i];
        
        if (place.show_on_map_only){
            var $li = $('li#place_'+place.id);
			$li.hide();
			continue;
        }
        
        // fix places list item
        var $li = $('li#place_'+place.id);
        $li.attr('place_number', i);
        $li.click(clickPlace);
    }
    
    $('li.place').hover(function(){$(this).addClass('place_highlighted');}, function(){$(this).removeClass('place_highlighted');})
    
    $(window).resize(windowResized);
    
    navTimer = setInterval('checkNavigation()', 1000);

    beerSelected();
    map.setCenter(mapCenter, 14);
    windowResized();
    map.setCenter(mapCenter, 14);
}

function checkNavigation(){
    var fragment = getUriFragment();
    
    if (null == currentNav){
        currentNav = fragment;
        return;
    }
    
    if (fragment != currentNav){
        parseUriFragment();
        currentNav = fragment;
    }
}

function getUriFragment(){
    var beer_fragment = window.location.hash;
    
    if (beer_fragment && beer_fragment.length > 1) {
        return beer_fragment.substr(1);
    } else {
        return null;
    }
}

function parseUriFragment(){
    
    var beer_fragment = getUriFragment();
    
    if (!beer_fragment){
        return;
    }
    
    // search this fragment in beer slugs
    var this_beer_num = -1;
    for (i in Beers) {
        var beer = Beers[i];
        if (beer.slug == beer_fragment.toLowerCase()) {
            this_beer_num = i;
            break;
        }
    }
    
    if (this_beer_num >= 0){
        
        // select this beer in <select>
        $('select.beer option:selected').each(function () {
            $(this).attr('selected', '');
        });
        
        $('select.beer option[beer_number='+this_beer_num+']').attr('selected', 'selected');
        beerSelected();
    }
}
        


function windowResized() {
    var h = $(window).height() - $('#header').outerHeight() - $('#footer').outerHeight() - 41;
    $('#places').height(h);
    $('#map').height(h);
    $('#map').width($(window).width() - $('#places').outerWidth() - 15);
    map.checkResize();
}

function createMarker(place_number, g_icon){
    var place = Places[place_number];
    var markerOptions = { icon:g_icon };
    var point = new GLatLng(place.lat, place.lon);
    var marker = new GMarker(point, markerOptions);
    marker.value = place_number;
    GEvent.addListener(marker, "click", function() {
        showPlace(place_number);
    });
    return marker;
}

function drawMarkers(){

    map.clearOverlays();

    $('#places li.no').remove();

    for (i in Places) {
        var place = Places[i];
        var $place = $('#place_'+place.id);
        var $price = $('#place_'+place.id+' .price');
        var place_number = i;
        var icon = null;
        var available = false;
        var price;
    
        for(j in BeerInPlace){
            var bp = BeerInPlace[j];
            price = '';
            if (place.id == bp.place_id && current_beer_id == bp.beer_id) {
                if (bp.available) {
                    available = true;
                    if (bp.price){
                        price = '<span>'+bp.price+' '+PriceMetrics[bp.price_metric]+'</span>';
                    }
                    break;
                }
            }
        }
        
        if (available){
            icon = new GIcon(IconBar);
            $place.addClass('yes');
            if (price){
                $price.html(price)
            }
            $place.show();
        } else {
            $place.hide();
            icon = new GIcon(IconBarEmpty);
            $place.removeClass('yes');
            $price.empty();
        }
        
        map.addOverlay(createMarker(place_number, icon));
    }

    if (0 == $('#places li.place:visible').length) {
        $('#places').prepend('<li class="no">'+current_beer.name+' в городе отсутствует :(</li>');
    }
}


function clickPlace(){
    var place_number = $(this).attr('place_number');
    map.closeInfoWindow();
    //map.setZoom(16);
    showPlace(place_number);
}

function showPlace(place_number){
    var place = Places[place_number];
    var latlon = new GLatLng(place.lat, place.lon);
    map.openInfoWindow(latlon, getHtmlPlaceDescription(place_number));
    map.panTo(latlon);
}

function getHtmlPlaceDescription(place_number){
    var place = Places[place_number];
    var html = '<div class="place_description">';
    if (place.picture_url){
        html += '<img src="'+place.picture_url+'" height="150" width="150" />';
    }
    html += getPlaceLink(place);
    
    var beer = getSelectedBeerObject();
    if (beer) {
        var beer_in_place = getBeerInPlace(beer.id, place.id);
        if (beer_in_place && beer_in_place.available) {
            if (beer_in_place.price) {
                html += '<div class="yes">&#x2714; ' + beer.name + ' по ' + beer_in_place.price + ' ' + PriceMetrics[beer_in_place.price_metric] + '</div>';
            }
        }
    }
    html += place.description;
    html += '<p><a href="'+getPlaceURL(place)+'"> отзывы &rarr; </a></p>';
    html += '</div>';
    
    return html;
}

function getPlaceURL(place){
    return '/place/'+place.slug+'/';
}

function getPlaceLink(place){
    var a = '<a href="'+getPlaceURL(place)+'">'+place.name;
    if (place.is_shop){
        a += ' <small>(магазин)</small>';
    }
    a += '</a>';

    return a;
}

function getBeerInPlace(beer_id, place_id){
    for (j in BeerInPlace) {
        var bp = BeerInPlace[j];
        if (place_id == bp.place_id && beer_id == bp.beer_id) {
            return bp;
        }
    }
    
    return null;
}

function getSelectedBeerObject(){
    for (i in Beers) {
        var beer = Beers[i];
        if (beer.id == current_beer_id) {
            return beer;
        }
    }
    
    return null;
    
}

function beerSelected(){
    var beer_number = $("select.beer option:selected").first().attr('beer_number');
    var beer = Beers[beer_number];
    if (beer) {
        document.title = 'Пивовед — разливной ' + beer.name + ' в Днепропетровске';
        current_beer = beer;
        current_beer_id = beer.id;
        current_beer_slug = beer.slug;
        uri_fragment = getUriFragment();
        if (!uri_fragment || (uri_fragment && uri_fragment.toLowerCase() != current_beer_slug)) {
            currentNav = current_beer_slug;
            window.location.hash = current_beer_slug;
        }
        $('p.beer').html('<image src="' + MEDIA_URL + beer.slug + '.png" width="40" height="48" /><span> &mdash; ' + beer.description + '</span>');
        drawMarkers();
    }
}

function getPlaceById(place_id){
    for (i in Places) {
        var place = Places[i];
        if (place.id == place_id){
            return place;
        }
    }
    
    return null;
}


function showAddPlaceForm(){
    $('#addplace_dialog').dialog({
        modal: true,
        title: 'Пивное заведение',
        buttons: {
            "Предложить": postPlace,
            "Отменить": function(){$(this).dialog("close");}
        },
        open: dialogOpened,
        width: 600
    });
}

function dialogOpened(event, ui) {
    // init dialog map
    var dmap = new google.maps.Map2(document.getElementById("addplace_map"));
    dmap.addControl(new GSmallMapControl());
    dmap.setCenter(mapCenter, 14);
    
    GEvent.addListener(dmap, "click", function(overlay, latlng) {
        dmap.clearOverlays();
        dmap.addOverlay(new GMarker(latlng));
        $("input[name='lat']").val(latlng.lat());
        $("input[name='lng']").val(latlng.lng());
    });
    
    $('#addplace_progress').empty();
    $("#addplace_form")[0].reset();
    $("#addplace_form input[name='lat']").val('');
    $("#addplace_form input[name='lng']").val('');
    $("#addplace_form input[name='name']").focus();
}

function postPlace() {
    if (!validateAddPlaceForm()){
        return;
    }
    $('#addplace_progress').removeClass('error').text('отсылаю... секундочку');
    $.post(
        '/addplace/',
        $("#addplace_form").serialize(),
        function(data) {
            $('#addplace_progress').text('Предложение будет рассмотрено и принято! Спасибо!');
            setTimeout(closeDialog, 2000);
        }
    );
}

function validateAddPlaceForm() {
    if ( ! $("#addplace_form input[name='name']").val().length ) {
        $('#addplace_progress').addClass('error').text('Название заведения забыли...');
        return false;
    }
    
    if ( !$("input[name='lat']").val() || !$("input[name='lng']").val() ) {
        $('#addplace_progress').addClass('error').text('Кликните на карте в место');
        return false;
    }
    
    return true;
}

function closeDialog(){
    $('#addplace_dialog').dialog("close");
}


function initPlace() {

    initIcons();
    
    initAddPlace();

    var place = getPlaceById(current_place_id);
    
    if (place) {
        // show beer prices
        for (i in Beers) {
            var beer = Beers[i];
            var tr = '';
            var beer_in_place = getBeerInPlace(beer.id, place.id);
            if (beer_in_place && beer_in_place.available) {
                tr += ' &#x2714; ';
                if (beer_in_place.price) {
                    tr +=  beer_in_place.price + ' ' + PriceMetrics[beer_in_place.price_metric];
                }
                $('tr#beer_'+beer.id+' td').html(tr).addClass('yes');
            } else if (beer_in_place && beer_in_place.price) {
                tr =  ' ' + beer_in_place.price + ' ' + PriceMetrics[beer_in_place.price_metric];
                $('tr#beer_'+beer.id+' td').append(tr);
            }
        }
        
        $('#prices table tr').hover(function(){$(this).addClass('place_highlighted');}, function(){$(this).removeClass('place_highlighted');})

        // create map
        map = new google.maps.Map2(document.getElementById("map"));
        map.setCenter(new google.maps.LatLng(place.lat, place.lon), 15);
        //map.setUIToDefault();
        var icon = new GIcon(IconBar);
        var markerOptions = { icon: icon };
        map.addOverlay(new GMarker(new GLatLng(place.lat, place.lon), markerOptions));

        // search neighbors
        for (i in Places) {
            var nb = Places[i];
            if (nb == place){
                nb.dist = 0.0;
                continue;
            }
            var distLat = place.lat-nb.lat;
            var distLon = place.lon-nb.lon;
            nb.dist = Math.sqrt(distLat*distLat + distLon*distLon);
        }

        Places.sort(comparePlaceDistance);

        for (i=1; i<=5; i++){
            nb = Places[i];
            var $nb = $('<li>'+getPlaceLink(nb)+'</li>');
            $('#neighbors').append($nb);
        }
        
        
        // show google gadgets
        initGFCSkin();
        google.friendconnect.container.setParentUrl('/' /* location of rpc_relay.html and canvas.html */);
        google.friendconnect.container.initOpenSocialApi({
            site: gfc_site_id,
            onload: function(securityToken) { initGFC(); }
        });

        
    }
}

function initGFC() {
    renderSignInGFC();
    renderReviewGadgetGFC(getPlaceURL(getPlaceById(current_place_id)));
    renderRecommendButton(getPlaceById(current_place_id));
}

function renderSignInGFC(){
    var gfc_auth_cookie = 'fcauth'+gfc_site_id;
    if (document.cookie && document.cookie.indexOf(gfc_auth_cookie) > -1){
        // user signed in
        google.friendconnect.container.renderSignInGadget({
                id: 'gfc-signin',
                site: gfc_site_id
            },
            skin
        );
    } else {
        // user is not signed
        $('#gfc-signin').empty();
        google.friendconnect.renderSignInButton({ 'id': 'gfc-signin', 'style': 'long', 'text': 'Войти или присоединиться' });
        //$('#gfc-signin').html('<a href="#" onclick="google.friendconnect.requestSignIn()">Sign in</a>');
    }
}

function renderReviewGadgetGFC(docId){
    google.friendconnect.container.renderReviewGadget(
        {
            id: 'gfc-reviews',
            site: gfc_site_id,
           'view-params': {
                "disableMinMax":"false",
                "scope":"ID",
                "allowAnonymousPost":"true",
                "docId":docId,
                "startMaximized":"true"
            }
        },
        skin
    );
    
}

function renderRecommendButton(place){
    google.friendconnect.container.renderOpenSocialGadget(
        {
            id: 'gfc-recommend-button',
            url:'http://www.google.com/friendconnect/gadgets/recommended_pages.xml',
            height: 21,
            site: gfc_site_id,
            'view-params': {
                'pageUrl':getPlaceURL(place),
                'pageTitle':place.name,
                'docId':'recommendedPages'
            }
        },
        skin
    );
}

function initGFCSkin(){
    skin['FONT_FAMILY'] = 'segoe ui, lucida grande, sans-serif';
    skin['BORDER_COLOR'] = '#cccccc';
    skin['ENDCAP_BG_COLOR'] = '#ffffff';
    skin['ENDCAP_TEXT_COLOR'] = '#333333';
    skin['ENDCAP_LINK_COLOR'] = '#883300';
    skin['ALTERNATE_BG_COLOR'] = '#ffffff';
    skin['CONTENT_BG_COLOR'] = '#ffffff';
    skin['CONTENT_LINK_COLOR'] = '#883300';
    skin['CONTENT_TEXT_COLOR'] = '#000000';
    skin['CONTENT_SECONDARY_LINK_COLOR'] = '#883300';
    skin['CONTENT_SECONDARY_TEXT_COLOR'] = '#666666';
    skin['CONTENT_HEADLINE_COLOR'] = '#333333';
    skin['DEFAULT_COMMENT_TEXT'] = '\u0432\u0430\u0448 \u043e\u0442\u0437\u044b\u0432';
    skin['HEADER_TEXT'] = '\u041e\u0442\u0437\u044b\u0432\u044b ';
    skin['POSTS_PER_PAGE'] = '5';
    skin['ALIGNMENT'] = 'left';
    skin['BUTTON_STYLE'] = 'compact';
    skin['BUTTON_TEXT'] = '\u0420\u0435\u043a\u043e\u043c\u043c\u0435\u043d\u0434\u0443\u044e!';
    skin['BUTTON_ICON'] = 'heart';
}


function comparePlaceDistance(p1 ,p2){
    return p1.dist - p2.dist;
}

