var parsedData;
var loadedCount;
var pageElem;
var openedInfowindow = null;
var profilytest;

$(function() {
    // profilytest bude true, je-li v URL retezec "profilytest"
    //  - v tom pripade se pouziji testovaci data (jina tabulka v databazi)
    profilytest = (window.location.href.search('profilytest') != -1);

    $('.hideByJS').hide();

    setupReferenceExplanation();
    setupContextTooltip();
    setupProfilesSearch();
    //setupMap();
    prepareSubjectsInOrder();

    $('div.moreInfo').hide();
    $('a.moreInfoLink')
        .removeClass('inv')
        .click(function(e) {
            e.preventDefault();
            if ($.browser.msie) {
                $('div.moreInfo').show();
            }
            else {
                $('div.moreInfo').slideDown('fast');
            }
            $('.addOrder').html(tr('placeOrder') + ' &nbsp; &gt;&gt;');
            
            $(this).hide();
        });

});

function prepareSubjectsInOrder() {
    $('#subject-row2, #subject-row3, #sameLectorRow').addClass('inv');
    $('.anotherSubjectLink').click(function(e) {
        e.preventDefault();
        switchToMoreSubjects();
    });
    $('#sameLector').change(function() {
        $('#sameLectorRow .hint').removeClass('inv');
    });

    if ($('#subject2').val() != '1' || $('#subject3').val() != '1') {
        switchToMoreSubjects();
    }
}

function switchToMoreSubjects() {
    $('.tabs').tabs();
    $('.anotherSubjectLink').addClass('inv');
    $('.tabs .menu').removeClass('inv');
    $('#subject-row2, #subject-row3, #sameLectorRow').removeClass('inv');
    $('#sameLectorRow .hint').addClass('inv');
}

        /**
 * Cislo prevede na ano/ne (jedina nula znamena "ne").
 */
function getYesNo(number) {
    if (number == 0) return tr('no');
    else return tr('yes');
}

/**
 * Nastavi chovani ramecku obsahujici mapu.
 */
/*
function setupMap() {
    if (!profilytest) return;   // na ostre verzi zatim mapu nechceme (nemame souradnice lektoru)

    // ramecek bude mozne zobrazit a skryt kliknutim na jeho zahlavi
    $('#mapHeading').text('skrýt mapu lektorů');
    $('#mapHeading').click(function(e) {
        if ($('#mapContent').is(':visible')) {
            mapHide();
        }
        else {
            mapShow();
        }
    });
}*/

/**
 * Zobrazi samotnou mapu a do ni prida marker (znacku) pro kazdeho lektora zadaneho
 *  v parametru lectorsPositions. V tomto markeru je strucne info o lektorovi.
 * Poloha markeru lektora se ridi podle jeho polohy (udana take v parametru lectorsPositions).
 */
/*function showMap(lectorsPositions) {
    if (!profilytest) return;   // na ostre verzi zatim mapu nechceme (nemame souradnice lektoru)

    var center = new google.maps.LatLng(50.0720965, 14.4281385);    // definice polohy stredu
    var mapOptions = {
        zoom: 11,
        center: center,
        mapTypeId: google.maps.MapTypeId.ROADMAP    // vychozi typ mapy je klasicka silnicni
    };

    // zde dochazi k samotnemu nacteni a vykresleni mapy, a to podle mapOptions do prvku map_canvas
    var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

    // Nyni projdeme pole lektoru a podle toho "napichame" do mapy markery
    //  (na spravna mista a se spravnymi popisky).
    var locations = new Array();
    var markers = new Array();
    var texts = new Array();
    var infowindow = new google.maps.InfoWindow();
    
    $.each(lectorsPositions, function(i) {
        // definice pozice aktualniho lektora
        locations[i] = new google.maps.LatLng(this.posLat, this.posLon);

        // pridani samotneho markeru pro aktualniho lektora
        markers[i] = new google.maps.Marker({
            map: map,
            position: locations[i],
            title: this.realname
        });
        
        // text do markeru
        texts[i] = '<div class="markerContentWrapper"><div class="markerContent">'+
            '<div class="name">'+this.realname+'</div>'+
            '<table>' +
            '<tr><td>Cena: </td><td>'+this.price+' Kč/min</td></tr>' +
            '<tr><td>Může dojíždět: </td><td>'+getYesNo(this.profileCanCommute)+'</td></tr>' +
            '<tr><td>Výuka u lektora: </td><td>'+getYesNo(this.profileCanTeachAtHome)+'</td></tr>' +
            '<tr><td colspan="2"><a href="profil/id/'+this.id+'">další informace o lektorovi</a></td></tr>'+
            '</table>' +
            '</div></div></div>';

        // Aby se nam infobox u markeru vubec zobrazil, je treba priradit markeru
        //  "listener" kliknuti - po kliknuti se tedy zobrazi infowindow s textem
        //  k danemu lektorovi.
        // Diky tomu, ze pouzivam jen jeden objekt pro infowindow, je nad mapou zobrazen vzdy
        //  nejvys jeden marker (nemuze jich tam byt vic, kdyz je to jen jedna instance).
        google.maps.event.addListener(markers[i], 'click', function() {
            infowindow.setContent(texts[i]);    // dosadim obsah
            infowindow.open(map,markers[i]);    // otevru infowindow nad danym markerem
        });
    });

    // Ramecek mapy obsahuje tridu "inv" zajistujici jeho neviditelnost (definovano v CSS)
    //  ovsem tady tridu odstranime a ramecek bude videt - ovsem prave jen pri zapnutem JS.
    // Toto nastane az po uspesnem vyhledavani, tedy pred prvnim vyhledavanim se nezobrazi
    //  nic nez filtrovaci formular.
    $('#mapHeading, #mapWrapper').removeClass('inv');

}*/

/**
 * Nastaveni chovani formulare a strankovani.
 */
function setupProfilesSearch() {
    if ($('#profilesSearchFormHeading').length == 0) return;    // nejsme na strance s vyhledavanim v profilech!

    $('#profileSearchResults').removeClass('inv');
    $('.profileSearchNavigation.hide').addClass('inv');
    $('a.profileSearchPrev, a.profileSearchNext').attr('href', './#');   // je-li zapnuty javascript, adresa odkazu bude vzdy jen #

    /*
     * Je-li v adrese zadana cast za #, naplnime temito udaji vyhledavaci formular.
     * Cast za hashem se pouziva pro ukladani nastaveni filtru bez nutnosti znovunacteni stranky.
     * Tedy pokud napriklad nekdo posle nekomu odkaz ze sveho vyhledavani, tento
     *  odkaz bude zpracovan tak, ze prijemce uvidi stejne vysledky jako odesilatel
     *  (presneji receno, uvidi vysledky stejneho vyhledavani - profily samotne se muzou menit).
     */
    if (window.location.hash != '') {
        unserialize(window.location.hash, $('#profilesSearchForm'));
        doSearch(true);
    }

    // Cislo stranky je ulozene ve skrytem poli formulare - tedy pro nacteni jine
    //  stranky jej staci prepsat a spustit znovu vyhledavani.
    pageElem = $('#profilesSearchForm input[name=page]');
    $('a.profileSearchPrev').click(function(e) {
        e.preventDefault();
        pageElem.val(parseInt(pageElem.val())-1);
        doSearch(false);
    });
    $('a.profileSearchNext').click(function(e) {
        e.preventDefault();
        pageElem.val(parseInt(pageElem.val())+1);
        doSearch(false);
    });

    // pri odeslani formulare se take spusti vyhledavani
    $('#profilesSearchForm').submit(function(e) {
        e.preventDefault();
        pageElem.val(1);    // display page 1 of results of the NEW search
        doSearch(true);
    });

    // pri kliknuti na zahlavi ramecku s filtrovacim formularem se tento skryje (nebo zobrazi)
    $('#profilesSearchFormHeading').text('skrýt filtr');
    $('#profilesSearchFormHeading').click(function(e) {
        if ($('#profilesSearchForm').is(':visible')) {
            searchFormHide();
        }
        else {
            searchFormShow();
        }
    });

    // jeste zaridime popup okna s detaily o jednotlivych lektorech
    setupProfileDialog();
    setupChoosingLectors();
}


/**
 * Funkce starajici se o samotne vyhledavani.
 * Vezme data z filtrovaciho formulare, posle AJAXovy pozadavek s temito daty
 *  a vysledek zpracuje a zobrazi.
 *
 * @param loadMapData Boolean parametr urcujici, zda se maji nacist i data lektoru
 *      bez strankovani pro zobrazeni na mape (coz neni potreba, pokud se nezmenilo
 *      nastaveni filtru - mapu v tom pripade totiz neni nutne nacitat znovu)
 */
function doSearch(loadMapData) {
    /*var profileSearchUrl;   // rozliseni na testovaci a ostra data
    if (window.location.href.search('profilytest') != -1)
        profileSearchUrl = '/lektori/public/profilessearchtest.php';
    else profileSearchUrl = '/lektori/public/profilessearch.php';*/
    var profileSearchUrl = '/lektori/public/profilessearch.php';

    // do requestu pridame parametr urcujici, zda se maji nacist data pro mapu
    var dataAppend;
    /*if (loadMapData)
        dataAppend = '&mapdata=true';
    else dataAppend = '&mapdata=false';*/
    dataAppend = '&mapdata=false';

    // a ted uz samotny AJAX pozadavek vcetne callbacku
    $.ajax({
        url: profileSearchUrl,
        type: 'get',
        data: $('#profilesSearchForm').serialize() + dataAppend,
        dataType: 'text',
        beforeSend: function() {    // pred vyslanim pozadavku prislusne upravime stranku
            $('.profileSearchProcessing').removeClass('inv');
            $('#profileSearchResults').html('');
            $('#profileSearchResultsNoJS').addClass('inv');
            $('.profileSearchNavigation').addClass('inv');
        },
        error: function() {
            alert(tr('TransferFailed') + "!", tr('Error'));
        },
        success: function(data) {   // pokud data uspesne dojdou:
            parsedData = json_parse(data);
            setNavigation(parsedData.count);    // nejprve nastavenime strankovaci navigaci

            // pokud nejsou zadne vysledky:
            if (parsedData.results.length == 0) {
                $('.profileSearchProcessing').addClass('inv');  // skryjeme loader
                searchFormHide();   // skryjeme filtr
                window.location.hash = $('#profilesSearchForm').serialize();    // pridame nastaveni filtru za hash

                // zobrazime chybovou hlasku
                $('#profileSearchResults').html($('#noLectorsFoundMessage').html());
                $('a.searchFormShow').click(function(e) {
                    e.preventDefault();
                    searchFormShow();
                });
                //alert($('a.order2ndStepLink.lower').length);
                $('a.addOrder.order2ndStepLink.lower').css('display', 'none');
                return;
            }

            $('a.addOrder.order2ndStepLink.lower').css('display', '');
            // projdeme vsechny vysledky (pocet odpovida poctu profilu na jedne strance)
            loadedCount = 0;
            $.each(parsedData.results, function(key, result) {
                var partial = $('#template .profilePartial').clone();
                $('#profileSearchResults').append(partial);
                //$('#profileSearchResults').append('<div>'+dump(result)+'</div><hr />');
               result.price = currency(result.price);

               $.each(result, function(column, value) {
                    if (value == "" || value == null)
                        $('.'+column+'Item', partial).remove();
                    else $('.'+column+'Val', partial).html(disarmText(value));
                });
                
                $('.refsVal', partial).html($('.refsVal', partial).html().replace(/#\$#/g, '<br /><br />'));
                $('.subjectsVal', partial).text(getTranslatedSubjects(result));
                $('span.yesNo', partial).each(function(i) {
                    if ($(this).text() == '1') $(this).text(tr('yes'));
                    else $(this).text(tr('no'));
                });
                $('[lectorId=""]', partial).attr('lectorId', result.idOfLector);
                var photoSrc;
                if (result.photo == "1")
                    photoSrc = '/lektori/lectors_data/photo_small/'+result.idOfLector+'.jpg';
                else photoSrc = '/lektori/public/css/images/silhouette.jpg';
                
                $('img', partial).attr('src', photoSrc);
                partial.attr('name', result.realname).attr('photoSrc', photoSrc).attr('lectorId', result.idOfLector);

            });

            $('.profileSearchProcessing').addClass('inv');
            searchFormHide();
            $('.profileSearchNavigation').removeClass('inv');
            setupProfileDialog();
            setupChoosingLectors();
            window.location.hash = $('#profilesSearchForm').serialize();

        }
    });
}

function currency(stringValue) {
    var value = parseFloat(stringValue);
    if (value == Math.round(value))
        return value.toString();
    else return stringValue.replace('.',',');    // spolehame na to, ze dostaneme castku se dvema desetinnymi misty
}

function getTranslatedSubjects(data) {
    var subjects = new Array();
    $.each([data.subject1, data.subject2, data.subject3, data.subject4, data.subject5, data.subject6, data.subject7], function(key, value) {
        if (value == '0') return;
        subjects[subjects.length] = tr('subject'+value);
    });
    subjects.sort();

    return implode(subjects, ', ');
}

function implode(arrayData, separator) {
    var isFirst = true;
    var result = '';
    for (var i=0; i<arrayData.length; ++i) {
        if (isFirst) isFirst = false;
        else result += separator;

        result += arrayData[i];
    }

    return result;
}

function disarmText(text) {
    text = text.replace(/</g, '&lt;');
    text = text.replace(/>/g, '&gt;');
    text = text.replace(/((\r)?\n)+/g, '<br />');
    return text;
}


/**
 * Prida lektora do vyberu.
 */
function setupChoosingLectors() {
    $('a.chooseLector').click(onClickChooseLector);
    prepareRemoveLinks($('.chosenLectors .remove'));
    adjustChooseLinks();
    update2ndStepLink();
}

function adjustChooseLinks() {
    $('.chosenLectors .lector').each(function() {
        $('.chooseLector.link[lectorId='+$(this).attr('lectorId')+']').addClass('inv').after('<span class="lectorChosenText">('+tr('lectorAlreadyChosenShort')+')</span>');
    });
}

function onClickChooseLector(e) {
    e.preventDefault();
    var parent = $(this).parents('.profilePartial');
    if ($('.chosenLectors div[lectorId='+parent.attr('lectorId')+']').length > 0) {
        alert(tr('lectorAlreadyChosen')+'!');
        return;
    }
    parent.find('.chooseLector.link').addClass('inv').after('<span class="lectorChosenText">('+tr('lectorAlreadyChosenShort')+')</span>');
    $('.chosenLectors div.noLector').addClass('inv');    // zneviditelnime "zadneho lektora", jehoz ramecek tam na zacatku je
    
    var newChosenLector = $('.chosenLectors div.noLector').clone().prependTo('.chosenLectors');
    newChosenLector
        .removeClass('noLector')
        .removeClass('inv')
        .attr('lectorId', parent.attr('lectorId'))
        .find('.name')
            .text(parent.attr('name'))
        .end()
        .find('img.photo')
            .attr('src', parent.attr('photoSrc'))
        .end();
    newChosenLector.find('.remove').removeClass('inv')
    prepareRemoveLinks(newChosenLector.find('.remove'));
    update2ndStepLink();
}

function prepareRemoveLinks(links) {
    links
        .unbind('click')
        .click(function(e) {
            e.preventDefault();
            if (confirm(tr('confirmDeletingLectorFromChoice'))) {
                var lectorId = $(this).parents('div.lector').attr('lectorId');
                $(this).parents('div.lector').remove();
                if ($('.chosenLectors div.lector').length == 1) {   // zbyva uz jen noLector, zviditelnime
                    $('.chosenLectors div.noLector').removeClass('inv');
                }
                update2ndStepLink();
                $('.profilePartial[lectorId='+lectorId+']')
                    .find('a.chooseLector.link')
                        .removeClass('inv')
                        .end()
                    .find('span.lectorChosenText')
                        .remove();
            }
        });
}

function update2ndStepLink() {
    var hrefParts = $('.order2ndStepLink').attr('href').split('?');
    var params = window.location.hash.replace(/^#/g, "");
    if (!params) {
        hrefSplitted = window.location.href.split('?');
        params = hrefSplitted[1] || '';
    }
    var newHref = hrefParts[0];
    newHref += '?' + params;
    newHref += '&ids=' + getChosenLectorsIds();
    $('.order2ndStepLink').attr('href', newHref);

    if ($('.chosenLectors div.noLector').hasClass('inv')) { // nejaci lektori jsou vybrani
        //$('.order2ndStepLink.upper').css('color', 'green');
        $('.addOrder.order2ndStepLink span').text(tr('ChosenContinue'));
        $('.addOrder.order2ndStepLink').css('color', 'green');
    }
    else {
        //$('.order2ndStepLink.upper').css('color', 'gray')
        $('.addOrder.order2ndStepLink span').text(tr('SkipThisStep'));
        $('.addOrder.order2ndStepLink').css('color', 'gray');
    }
}

function getChosenLectorsIds() {
    var ids = '';
    $('.chosenLectors div.lector').each(function() {
        ids += $(this).attr('lectorId');
        ids += ',';
    });
    return ids.slice(0,ids.length-3);
}

/**
 * Zajisti zobrazeni popup okna s detaily profilu.
 */
function setupProfileDialog() {
    $('table.profileShort').removeClass('inv'); // zkraceny prehled profilu nechceme

    $('div.profileAllWrapper').each(function() {
        if ($(this).parents('#template').length > 0) {
            //alert('x');
            return;
        }

        // ulozime si odkaz na detail profilu pro budouci pouziti
        var profileShortTable = $(this).prev('hr').prev('table');
        var link = profileShortTable.find('a.profileDetailLink');
        link.removeClass('inv');
        link.data('table', $(this));

        // nastavime tlacitka v popup okne
        var buttons;
        if (link.hasClass('linkToDetailInDialog')) {    // 2 tlacitka: přidat lektora a zavrit
            buttons = {
                "AddLector": function(e) {
                    //window.location.href = link.attr('href');
                    var lectorId = $(this).attr('lectorId');
                    $('a.chooseLector.link[lectorId='+lectorId+']').click();
                    $(this).dialog("close");
                },
                "Close": function() {
                    $(this).dialog("close");
                }
            }
        }
        else {  // pouze tlacitko Zavrit
            buttons = {
                "Close": function() {
                    $(this).dialog("close");
                }
            }
        }

        // samotna definice popupu
        $(this).dialog({
            autoOpen: false,
            width: 600,
            height: 500,
            show: 'clip',
            hide: 'clip',
            buttons: buttons
        });
    });

    // po kliknuti na prislusny odkaz se otevre popup definovany vyse
    $('a.profileDetailLink').click(function(e) {
        e.preventDefault();
        $($(this).data('table')).dialog('open');
        $('.ui-dialog button:contains(Close)').text(tr('Close'));
        $('.ui-dialog button:contains(AddLector)').text(tr('AddLector'));
    });
}

/**
 * Skryje filtrovaci formular a nastavi popisek do zahlavi.
 */
function searchFormHide() {
    if ($.browser.msie) {
        $('#profilesSearchFormContent').hide();
    }
    else {
        $('#profilesSearchFormContent').slideUp();
    }
    $('#profilesSearchFormHeading').text(tr('showFilter'));
}

/**
 * Zobrazi filtrovaci formular a nastavi popisek do zahlavi.
 */
function searchFormShow() {
    if ($.browser.msie) {
        $('#profilesSearchFormContent').show();
    }
    else {
        $('#profilesSearchFormContent').slideDown();
    }
    $('#profilesSearchFormHeading').text(tr('hideFilter'));
}

/**
 * Skryje mapu a nastavi popisek do zahlavi.
 */
/*function mapHide() {
    $('#mapContent').slideUp();
    $('#mapHeading').text('zobrazit mapu lektorů');
}

/**
 * Zobrazi mapu a nastavi popisek do zahlavi.
 */
/*function mapShow() {
    $('#mapContent').slideDown();
    $('#mapHeading').text('skrýt mapu lektorů');
}

/**
 * Nastavi strankovaci navigaci.
 * @param count Celkovy pocet zaznamu dle daneho filtru (z toho se spocita pocet stranek).
 */
function setNavigation(count) {
    // zjistime potrebna cisla a ulozime si je
    var page = parseInt(pageElem.val());
    var recordsOnPage = parseInt($('#profilesSearchForm input[name=recordsOnPage]').val());
    var totalPages = Math.ceil(count / recordsOnPage);
    $('span.page').text(page);
    $('span.pagesCount').text(totalPages);

    // nastaveni zobrazeni jednotlivych ovladacich prvku v krajnich pripadech (prvni/posledni stranka)
    if (page == totalPages) {
        $('a.profileSearchNext').addClass('inv');
        $('span.profileSearchNextInactive').removeClass('inv');
    }
    else {
        $('a.profileSearchNext').removeClass('inv');
        $('span.profileSearchNextInactive').addClass('inv');
    }
    
    if (page == 1) {
        $('a.profileSearchPrev').addClass('inv');
        $('span.profileSearchPrevInactive').removeClass('inv');
    }
    else {
        $('a.profileSearchPrev').removeClass('inv');
        $('span.profileSearchPrevInactive').addClass('inv');
    }
}

/**
 * Vezme query string z URL a nastavi podle nej zadany formular.
 * @param values Retezec hodnot, podle kterych se formular nastavi.
 * @param form Formular, ktery ma byt nastaven.
 */
function unserialize(values, form) {
    values = values.replace(/^#/g, "").split("&");

    $.each(values, function() {
        var properties = this.split("=");
        if((typeof properties[0] != 'undefined') && (typeof properties[1] != 'undefined')) {
            if (properties[0] == 'recordsOnPage') return;
            
            var element = $(form).add("input,select,textarea").filter('[name='+properties[0].replace(/\+/g, " ")+']');
            if (element.length > 0) {
                if(element.attr("type") == "checkbox")
                    element.attr("checked", true);
                else element.val(properties[1].replace(/\+/g, " "));
            }
        }
    });

}

function setupReferenceExplanation() {
    $('a#referenceExplain').removeClass('inv');
    $('a#referenceExplain').click(function(e) {
        e.preventDefault();
        $('a#referenceExplain').addClass('inv');
        $('#referenceExplainDiv').removeClass('inv');    
    });    
}

function setupContextTooltip() {
    $('.context').tooltip({
    	track: true,
    	delay: 100,
    	opacity: 1,
    	showURL: false,
    	showBody: "#$# ",
    	fade: 100,
    	positionLeft: true
    });   
}     
