
_mSvgEnabled = true ;
_mSvgForced  = true ;

var geocoder ;
var gicon ;
var map ;

function checkAvailabilityWithoutMap(address, restaurantId, silent) {
    //zjisti dostupnost adresy pro rozvoz
    if (typeof silent == 'undefined' || silent === null) {
        silent = false;
    }
    if (typeof setAvailabilityResult == 'undefined') {
        setAvailabilityResult = function(){};
    }

    var geocoder = new GClientGeocoder() ;
    geocoder.getLocations(address, function(response) {
        if (!response) {
            if (silent != true) {
                alert(address + " not found.");
            } else {
                setAvailabilityResult('bad');
            }
        } else {
            //TODO odladit, kdyz to nic nenajde - nejspis je to accuracy 1
            //misto, ktere geocoder podle adresy nasel
            var place = response.Placemark[0];
            //presnost, s jakou adresu nasel. Cim vetsi, tim presnejsi
            var accuracy = place.AddressDetails.Accuracy;
            //pokud je presnost mensi nez 6, potrebujeme upresneni
            if (accuracy < 7) {
                //je treba zadat adresu znovu
                if (silent != true) {
                    alert ('Adresa není zcela přesná.\nProsím, zadejte ji znovu, ať můžeme zjistit, kam přesně jídlo dovézt.');
                } else {
                    setAvailabilityResult('accuracy');
                }
            } else {
                //ajax pro overeni dostupnosti
                $.ajax({
                    url: '/checkDeliveryMap?checkMap&restaurantId=' + restaurantId + '&x=' + place.Point.coordinates[1] + "&y=" + place.Point.coordinates[0],
                    success: function(msg){
                        //TODO preklad
                        if (msg.indexOf('success') != -1) {
                            if (silent != true) {
                                alert("Vše je v pořádku, můžete pokračovat v objednávce.");
                            } else {
                                setAvailabilityResult('ok');
                            }
                        } else {
                            if (silent != true) {
                                alert("Sem bohužel restaurace nerozváží.\nZadali jste správnou adresu?");
                            } else {
                                setAvailabilityResult('out');
                            }
                        }
                    }
                });
            }
        }
    });
}

//nastavi lat a lng policka podle vyplnene adresy
function setHiddenMapFields(address) {
    var geocoder = new GClientGeocoder();
    geocoder.getLocations(address, function(response) {
        if (!response) {
            alert(address + " not found")
        } else {
            var place = response.Placemark[0];
            var accuracy = place.AddressDetails.Accuracy;
            $('#lat').val(place.Point.coordinates[1]);
            $('#lng').val(place.Point.coordinates[0]);
            $('#accuracyOk').val(accuracy > 6);
            $('#checkMapForm').submit();
        }
    });
}

function goToCheckDelivery(restaurantId) {
    var geocoder = new GClientGeocoder();
    var city = $('#mesto').val();
    var street = $('#ulice').val();
    var number = $('#cislo').val();
    var checkNumber = number.replace(/^\s+|\s+$/g,"");//trim();
    if (number.substring(number.length-1) == "N"){
        checkNumber = number.substring(0, number.length-1);
    }
    var address = city + ", " + street + " " + checkNumber;

    geocoder.getLocations(address, function(response) {
        if (!response) {
            alert(address + " not found")
        } else {
            var place = response.Placemark[0];
            var accuracy = place.AddressDetails.Accuracy;
            var lat = place.Point.coordinates[1];
            var lng = place.Point.coordinates[0];
            var accuracyOk = accuracy > 6;

            var name = $('#jmeno').val();
            var email = $('#mail').val();
            var phone = $('#telefon').val();
            var doorbellName = $('#zvonek').val();
            var floor =  $('#podlazi').val();
            var flatNumber = $('#byt').val();
            var note = $('#note').val();

            var orderOnTime = '';
            if ($('input:radio[name=orderType]:checked').val()=='later'){
                orderOnTime = '&orderOnTime=' + $('#orderOnTime').val();
            }

            var orderPayType = '';
            if ($('input:radio[name=payType]:checked').val()=='online'){
                orderPayType = '&orderPayType=online';
            }

            var addressIdText = "";
            var saveAddress = "";
            if (document.getElementById("addressId")) {
                addressIdText = '&addressId=' + $('#addressId').val();
            }

            if (document.getElementById("saveAddress")) {
                saveAddress =  '&saveAddress=' + document.getElementById("saveAddress").checked;
            }
            ajaxDelivery(encodeURI('goToCheck&name=' + name + '&email=' + email + '&phone=' + phone +
                '&city=' + city + "&street=" + street + "&number=" + number + '&doorbellName=' + doorbellName +
                '&floor=' + floor + '&flatNumber=' + flatNumber + '&note=' + note + '&lat=' + lat + "&lng=" + lng +
                "&accuracy=" + accuracy + "&accuracyOk=" + accuracyOk + "&restaurantId=" +restaurantId +
                orderOnTime + addressIdText + saveAddress + orderPayType));
        }
    });
}

function loginPlease() {
    var login = $('#email').val();
    var heslo = $('#heslo').val();
    var page  = $('#loginRedirect').val() + "/" + orderAction + "/";

    location.href= '/' + loginAction + '/?login=' + login + '&passwd=' + heslo + '&loginRedirect=/' + page;
}

function registration() {
    var login = $('#mail').val();
    var name = $('#jmeno').val();
    var phone = $('#telefon').val();
    var passwd1 = $('#passwd1').val();
    var passwd2 = $('#passwd2').val();
    var terms = "";
    if ($('#terms').is(':checked')){
        terms = '&terms';
    }
    var loginRedirect  = $('#regLoginRedirect').val();

    location.href='/' + registrationAction + '/?email=' + login + '&name=' + name + '&phone=' + phone + terms + '&action=add&passwd1=' + passwd1 + '&passwd2=' + passwd2 + '&loginRedirect=' + loginRedirect + '&orderRegister';
}

function goToCheckTakeAway(restaurantId) {

    var name = $('#jmeno').val();
    var email = $('#mail').val();
    var phone = $('#telefon').val();
    var note = $('#note').val();

    var orderOnTime = '';
    if ($('input:radio[name=orderType]:checked').val()=='later'){
        orderOnTime = '&orderOnTime=' + $('#orderOnTime').val();
    }

    ajaxDelivery(encodeURI('goToCheck&name=' + name + '&email=' + email + '&phone=' + phone + orderOnTime + '&note=' + note + "&restaurantId="+restaurantId));
}

function checkAvailabilityLocalities(city, street, uribase, silent, dismissTime) {
    if ($.trim(street) == '') {
        invalidInput('address', true, 'e');
        return false;
    }
    var address = city + ' ' + street;
    var geocoder = new GClientGeocoder() ;
    if (typeof uribase == 'undefined' || uribase === null) {
        uribase = '';
    }
    if (typeof silent == 'undefined' || silent === null) {
        silent = false;
    }
    if (typeof dismissTime == 'undefined' || dismissTime === null) {
        dismissTime = 0;
    }
    geocoder.getLocations(address, function(response) {
        //        alert($.dump(response));
        if (typeof response == 'undefined' || !response || typeof response.Placemark == 'undefined' || typeof response.Placemark[0] == 'undefined') {
            alert("Adresa " + address + " nenalezena!");
        } else {
            //misto, ktere geocoder podle adresy nasel
            var place = response.Placemark[0];
            var accuracy = place.AddressDetails.Accuracy;
            //pokud je presnost mensi nez 6, potrebujeme upresneni
            if (accuracy < 6 && uribase != geoTakeawayAction) {
                //pokud nenajde dostatecne presne misto, doplnime do ulice cislo domu, pokud neni a zkusime znova
                if (street.search(/\d/) < 0) {
                    street = street + ' 1';
                    $('#address').val(street);
                    checkAvailabilityLocalities(city, street, uribase, silent, dismissTime);
                    return;
                }

                if (silent == false) {
                    alert('Adresa není zadána dostatečně přesně.\nProsím, upřesněte zadání!');
                }

                invalidInput('address', true, 'addressError', dismissTime);
                return false;
            }
            var accurate = '';
                if (accuracy > 7){
                accurate = '&accurate=ok';
            }
            if (uribase == '/'+geoTakeawayAction+'/'){
                location.href= getLocalizedUriBase(uribase)+'?q=' + city + ', ' + street + '&lat=' + place.Point.coordinates[1] + "&lng=" + place.Point.coordinates[0] + "&city=" + city + '&first=true' + accurate;
            } else {
                location.href= getLocalizedUriBase(uribase)+'?lat=' + place.Point.coordinates[1] + "&lng=" + place.Point.coordinates[0] + "&city=" + city + "&street=" + street + accurate;
            }
        }
    });
}

/**
 * Pokud aktualni url obsahuje retezec 'english/' a uribase ne, doplni jej na konec
 */
function getLocalizedUriBase(uribase) {
    var eng = "english/";
    if (window.location.toString().indexOf(eng, 0) < 0) {
        return uribase;
    } else {
        if (uribase.indexOf(eng, 0) < 0) {
            return uribase + eng;
        } else {
            return uribase;
        }
    }
}

/**
 * zpracuje vyhledane vysledky a reaguje na ne odpovidajicim zpusobem
 */
function parseAddressWorker(address, gStreet, gCity, accuracy, place, uribase, filter) {
    if (typeof address == 'undefined' || address == null) {
        address = '';
    }
    if (typeof gStreet == 'undefined' || gStreet == null) {
        gStreet = '';
    }
    if (typeof gCity == 'undefined' || gCity == null) {
        gCity = '';
    }
    if (gCity == 'Prague') {
        gCity = 'Praha';
    }
    if (typeof accuracy == 'undefined' || accuracy == null) {
        accuracy = 0;
    }
    if (typeof place == 'undefined' || place == null) {
        place = null;
    }
    if (typeof uribase == 'undefined' || uribase == null) {
        uribase = null;
    }
    if (typeof filter == 'undefined' || filter == null) {
        filter = '';
    }

    var townIndex = -1;
    address = address.replace(/^\s+|\s+$/g, '');

    if (address == '') {
        //neni zadana adresa
        invalidInput('address', true, '#emptyError', 2500);
        return false;
    }

    if (gCity != '') {
        //pridani mesta, jak je nasel google do adresy
        address = address + " " + gCity;
    }

    address = address.replace(/[:;-]/g,' ');
    address = address.replace(/\./g,' ');
    address = address.replace(/,/g,' ');
    address = address.replace(/_/g,' ');
    address = address.replace('  ',' ');
    address = address.toLowerCase();

    var tokens = new Array();
    tokens = address.split(' ');

    var actualTown = '';
    for (var i = 0; i < towns.length; i++) {
        if (townIndex > -1) {
            break;
        }
        actualTown = towns[i].toLowerCase();
        for (var j = 0; j<tokens.length; j++) {
            actualToken = tokens[j];
            //vyrazeni predlozek a cisel z rozpoznavani mesta
            if (actualToken.length > 3 && !actualToken.match(/^[0-9/]+$/)) {
                res = actualTown.search(actualToken);

                if (res > -1) {
                    townIndex = i;
                    break;
                }
            }
        }
    }

    if (townIndex > -1) {
        street = $('#address').val();
        parsedTown = towns[townIndex];
        seoTown = seoTowns[townIndex];
    } else {
        invalidInput('address', true, '#cityError', 2500);
        return false;
    }

    if (gStreet != '' && gCity == '' && parsedTown != '') {
        //ve vysledku od googlu neni mesto, ale v hledanem retezci bylo
        gCity = parsedTown;
    }

    var ok = false;
    if (seoTown != '' && accuracy > 5 && place != null && uribase != null && gStreet != '' && gCity != '') {
        //presnost je dostatecna a mame vse, co je treba
        ok = true;
    }

    // path vcetne seo name a filtru
    var path = uribase + seoTown + '/' + filter;

    if (ok == true) {
        //presmerujeme na stranku s vysledky
        var accurate = '';
        if (accuracy > 7){
            accurate = '&accurate=ok';
        }
        location.href=path+'?lat=' + place.Point.coordinates[1] + "&lng=" + place.Point.coordinates[0] + "&city=" + gCity + "&street=" + gStreet + accurate;
    } else {
        if (seoTown != '') {
            //ulice nenalezena, ale nalezeno mesto z hledaneho retezce, presmerujeme na nej
            location.href=path+'?town='+seoTown;
        } else {
            //nenalezeno nic kloudneho, zobrazime hlasku
            invalidInput('address', true, 'addressError', 2500);
            return false;
        }
    }
}

/*
 * Parsuje adresu pro vyhledavani a preda dalsi metode ke zpracovani
 */
function parseAddress(uribase, filter) {
    var geocoder = new GClientGeocoder() ;
    var address = $('#address').val();

    geocoder.getLocations(address, function(response) {
        var gStreet = null;
        var gCity = null;
        var accuracy = null;
        var place = null;

        if (!response) {
            alert(address + " není možno nalézt.\nZkuste to, prosím, později!");
        } else {
            //misto, ktere geocoder podle adresy nasel
            if (typeof response.Placemark != 'undefined' && typeof response.Placemark[0] != 'undefined' && response.Placemark[0] != null) {
                //                alert($.dump(response.Placemark));
                var selectedPlacemark = 0;
                if (response.Placemark.length > 1) {
                    // je vice nalezenych mist - porovnam nazvy mest s mesty kam se rozvazi
                    // vyberu prvni nalezene misto, ktere se naslo i v rozvozovych mestech
                    for (var i = 0; i < response.Placemark.length; i++) {
                        if (typeof response.Placemark[i].AddressDetails.Country != 'undefined') {
                            if (typeof response.Placemark[i].AddressDetails.Country.AdministrativeArea != 'undefined') {
                                if (typeof response.Placemark[i].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != 'undefined') {
                                    if (typeof response.Placemark[i].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName != 'undefined') {
                                        placemarkName = response.Placemark[i].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;

                                        for (var j = 0; j < towns.length; j++) {
                                            actualTown = towns[j];
                                            res = actualTown.search(placemarkName);
                                            if (res > -1) {
                                                selectedPlacemark = i;
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                place = response.Placemark[selectedPlacemark];

                accuracy = place.AddressDetails.Accuracy;

                if (place != null && accuracy > 5) {
                    //dostatecna presnost vysledku
                    if (typeof place.AddressDetails.Country != 'undefined') {
                        if (typeof place.AddressDetails.Country.AdministrativeArea != 'undefined') {
                            if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != 'undefined') {
                                if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName != 'undefined') {
                                    gCity = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
                                }
                            }
                        }
                    }
                    
                    if (typeof place.AddressDetails.Country != 'undefined' && typeof place.AddressDetails.Country.AdministrativeArea != 'undefined' && typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != 'undefined') {
                        if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != 'undefined') {
                            //struktura s Locality
                            if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare != 'undefined') {
                                //ulice (ceska 3)
                                gStreet = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
                                if (gStreet.match(/^[0-9/]+$/) != null && typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName != 'undefined') {
                                    gStreet = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName + " " + place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
                                }
                            } else if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.AddressLine != 'undefined') {
                                //budova nebo misto (nadrazi)
                                gStreet = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.AddressLine[0];
                            } else if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality != 'undefined') {
                                //mestska cast (Smichov... - napr. Plzenska 34, Praha)
                                if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare != 'undefined') {
                                    gStreet = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName;
                                }
                            }
                        } else if (typeof place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Thoroughfare != 'undefined') {
                            //struktura s SubAdministrativeAreaName (cast mesta nebo, oblast)
                            gStreet = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Thoroughfare.ThoroughfareName;
                        }
                    } else if (typeof place.AddressDetails.AddressLine != 'undefined') {
                        //budova nebo misto - dalsi varianta (semilasso)
                        gStreet = place.AddressDetails.AddressLine[0];
                    } else if (typeof place.AddressDetails.Country != 'undefined' &&  typeof place.AddressDetails.Country.AddressLine != 'undefined') {
                        //budova nebo misto - dalsi varianta (masarykova univerzita brno)
                        gStreet = place.AddressDetails.Country.AddressLine[0];
                    }
                    
                }
            }
        //            alert($.dump(place));
        }

        //predame vysledky k dalsimu zpracovani
        //        alert('parseAddressWorker('+address+', '+gStreet+', '+gCity+', '+accuracy+', '+place+', '+uribase+', '+filter+')');
        parseAddressWorker(address, gStreet, gCity, accuracy, place, uribase, filter);
    });
}

//inicializuje mapu - nedela nic vic, jen nastaveni promennych
function initializeMap() {
    map = new GMap2(document.getElementById("map"));
    //    var start = new GLatLng(35.127771,-89.967041);
    //    map.setCenter(start, 3);

    map.addControl(new GLargeMapControl());
    map.addControl(new GScaleControl()) ;
    map.addControl(new GOverviewMapControl()) ;
    map.enableScrollWheelZoom();

    gicon = new GIcon(icon);
    gicon.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
    gicon.iconAnchor = new GPoint(-20, 20);
}


//ktere pasmo je momentalne aktivni
var aktivni = 1;
//pole bodu polygonu
var pointsArray = [];
var colors =  new Array("#000000", "#FF0000", "#0000FF", "#CC00CC", "#FFFF00", "#FFFFFF", "#FF0000");
var polygonsArray = [];
var markersArray = [];
var center;
var radius;
var prices = [];
var gicon;
var posledni = 1;
var freeColors = [];

var icons = [];
{
    for (var i = 1; i < 6; i++) {
        var icon = new GIcon();
        switch (i) {
            case 1:
                icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
                break;
            case 2:
                icon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
                break;
            case 3:
                icon.image = "http://labs.google.com/ridefinder/images/mm_20_purple.png";
                break;
            case 4:
                icon.image = "http://labs.google.com/ridefinder/images/mm_20_yellow.png";
                break;
            case 5:
                icon.image = "http://labs.google.com/ridefinder/images/mm_20_white.png";
                break;
            default:
                icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
        }
        icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
        icon.iconSize = new GSize(12, 20);
        icon.shadowSize = new GSize(22, 20);
        icon.iconAnchor = new GPoint(6, 20);
        icons[i] = icon;
    }
}

/**
 * inicializuje objekty na mape a nastavi mape zoom podle danych bodu a cen pasem
 */
function initializeMapPoints(points, prices) {
    pointsArray = points;
    prices = prices;
    aktivni = 1;
    posledni = pointsArray.length - 1;
    for (var i = 1; i < pointsArray.length; i++) {
        pridejDiv(i);
        markersArray[i] = [];
    }
    setMapZoom(pointsArray[aktivni]);
    nastavRadiusACenter();
    nastavMarkers(aktivni);
    nastavEnabledMarkers()
    nastavAllPolygons();
    nastavAllDivs();
}

/**
 * inicializuje objekty na mape podle zadane adresy a polomeru, nastavi zoom mapy
 */
function initializeMapAddress(address, radius) {
    var geocoder = new GClientGeocoder() ;
    geocoder.getLatLng(address, function(point) {
        if (!point) {
            alert(address + " not found")
        } else {
            setRadius(point, radius);
            setCenter(point);
            var points = calculatePoints();
            pointsArray[1] = points;
            aktivni = 1;
            nastavAllPolygons();
            pridejDiv(aktivni);
            nastavAllDivs();
            nastavAllMarkers();
            nastavEnabledMarkers();
            setMapZoom(pointsArray[aktivni]);
        }
    }) ;
}

/**
 * nastavi zoom mapy tak, aby se tam idealne vesly vsechny GLatLng body points
 */
function setMapZoom(points) {
    var bounds = getMinimumBoundingRectangle(points);
    var zoom = map.getBoundsZoomLevel(bounds);
    //    $(document).ready(function(){
    map.setCenter(bounds.getCenter(), zoom);
//        map.setZoom(zoom - 1);
//        map.setZoom(zoom + 1);
//    });
}

/**
 * vypocita body "kruznice". Pro uspesne provedeni musi byt zadany marker center a radius
 */
function calculatePoints() {
    var points = [];
    var point = center.getPoint();
    var lat = point.lat();
    var lng = point.lng();

    var Cradius = point.distanceFrom(radius.getPoint()) * 0.000621371192;

    var d2r = Math.PI/180;                // degrees to radians
    var r2d = 180/Math.PI;                // radians to degrees
    var Clat = (Cradius/3963) * r2d;      //  using 3963 as earth's radius

    var Clng = Clat/Math.cos(lat*d2r);

    for (var i = 0; i < 13; i++) {
        var theta = Math.PI * (i/6);
        Cx = lng + (Clng * Math.cos(theta));
        Cy = lat + (Clat * Math.sin(theta));

        points.push(new GLatLng(Cy,Cx));
    }
    return points;
}

/**
 * nastavi vsechny polygony na mape
 */
function nastavAllPolygons() {
    //done
    for (var i = 1; i < pointsArray.length; i++) {
        nastavPolygon(i);
    }
}

/**
 * nastavi na mape polygon podle cisla "cislo"
 */
function nastavPolygon(cislo) {
    //done
    var poly = pointsArray[cislo];
    polygonsArray[cislo] = new GPolygon(poly, colors[cislo], 3, 1, colors[cislo], 0.2);

    map.addOverlay(polygonsArray[cislo]);
}

/**
 * nastavi vsechny divy (radiobutton + text input) podle aktualnich dat v globalnich promennych
 */
function nastavAllDivs() {
    //done
    $('input[name="pasmoRadio"]').attr('checked', false);
    for (var i = 1; i <= pointsArray.length; i++) {
        $('#pasmoPrice'+ i).val(prices[i]);
        if (i == aktivni) {
            $('#pasmoRadio'+ i).attr('checked', 'checked');
        }
    }

}

/**
 * nastavi div (radiobutton + text input) podle cisla "cislo"
 */
function nastavDiv(cislo) {
//done
}

/**
 * nastavi vsechny GMarker body na mape s property draggable = false
 */
function nastavAllMarkers() {
    //done
    for (var i = 1; i < pointsArray.length; i++) {
        markersArray[i] = [];
        nastavMarkers(i);
    }
//    var str = "markersArray:";
//    for (var j = 1; j < markersArray.length; j++) {
//        for (var k = 0; k < markersArray[j].length; k++) {
//            str += "[" + j + "][" + k + "] = " + markersArray[j][k] + "\n";
//        }
//    }
//    alert(str);
}

/**
 * nastavi konkretni body polygonu daneho cislem
 */
function nastavMarkers(cislo) {
    //done
    markersArray[cislo] = [];
    for (var i = 0; i < pointsArray[cislo].length - 1; i++) {
        markersArray[cislo][i] = new GMarker(pointsArray[cislo][i], {
            icon:icons[cislo]
        });
        map.addOverlay(markersArray[cislo][i]);
    }
}

/**
 * nastavi vsechny pasma - tj. markery a polygony
 * TODO - asi nepouzito - zkontrolovat a kdyztak removnout
 */
function nastavVsechnyPasma() {
    nastavVsechnyMarkery();
    nastavVsechnyPolygony();
}

function pridejPasmo(adresa) {
    if (posledni < 4) {
        posledni += 1;
        zneaktivniAktivniPasmo();
        pridejPoints(adresa);
    } else {
        alert('Jsou povolena pouze 4 pasma rozvozu.');
    }
}

function pridejPoints(adresa) {
    var geocoder = new GClientGeocoder();
    var polomer = $("#radius").val();
    geocoder.getLatLng(adresa, function(point) {
        if (!point) {
            alert(adresa + " not found")
        } else {
            aktivni = posledni;
            setRadius(point, polomer);
            setCenter(point);
            var points = calculatePoints();
            pointsArray[aktivni] = points;
            pridejDiv(aktivni);
            nastavPolygon(aktivni);
            nastavAllDivs();
            nastavMarkers(aktivni);
            nastavEnabledMarkers();
            setMapZoom(pointsArray[aktivni]);
        }
    }) ;
}

function zaktivniPasmo(cislo) {
    zneaktivniAktivniPasmo();
    aktivni = cislo;
    nastavEnabledMarkers();
    nastavRadiusACenter();
    nastavRadio(cislo);
}

function nastavRadiusACenter() {
    var bounds = getMinimumBoundingRectangle(pointsArray[aktivni]);
    setCenter(bounds.getCenter());
    setRadius(center.getLatLng(), getRadiusByBounds(bounds));
}

function nastavEnabledMarkers() {
    for (var i = 0; i < pointsArray[aktivni].length - 1; i++) {
        if (markersArray[aktivni][i] != null) {
            map.removeOverlay(markersArray[aktivni][i]);
        }
        markersArray[aktivni][i] = new GMarker(pointsArray[aktivni][i], {
            icon:icons[aktivni],
            draggable: true
        });
        function f(x) {
            GEvent.addListener(markersArray[aktivni][i], 'dragend', function() {
                markerEvent(x);
            });
        }
        f(i);

        map.addOverlay(markersArray[aktivni][i]);
    }
}

function markerEvent(number) {
    if (number == 0) {
        pointsArray[aktivni][12] = markersArray[aktivni][number].getLatLng();
    }
    pointsArray[aktivni][number] = markersArray[aktivni][number].getLatLng();
    removePolygon();
    nastavPolygon(aktivni);
}

function removePolygon() {
    map.removeOverlay(polygonsArray[aktivni]);
}

function pridejDiv(cislo) {
    //TODO check
    var divStr = '<div id="pasmoDiv'+cislo+'"><input type="radio" id="pasmoRadio' + cislo + '" name="pasmoRadio" value="' + cislo +
    '" onclick="javascript:zaktivniPasmo(' + cislo+');">pasmo <span id="nazev' + cislo + '" style="background-color:' + colors[cislo] + '; color: white">'+ cislo +
    '</span><input type="text" name="pasmo' + cislo + '" id="pasmoPrice'+ cislo +'" value="" /> <a id="upravit' + cislo +
    '" href="javascript:zaktivniPasmo(' + cislo + ')">upravit</a> <a id="odebrat' + cislo + '" href="javascript:odeberPasmo(' + cislo +
    ')">odebrat</a></div>';
    $('#emptyMapDiv').before(divStr);   
    nastavRadio(cislo);
}

function nastavRadio(cislo) {
    $('input[name="pasmoRadio"]').attr('checked', false);
    $("#pasmoRadio" + cislo).attr('checked', 'checked');
}

function zneaktivniAktivniPasmo() {
    znicRadiusAndCenter();
    odeberEnabledMarkers();
}

function odeberEnabledMarkers() {
    for (var i = 0; i < pointsArray[aktivni].length - 1; i++) {
        if (markersArray[aktivni][i] != null) {
            map.removeOverlay(markersArray[aktivni][i]);
        }
    }
}

function znicRadiusAndCenter() {
    //    if (radius != null) {
    //        map.removeOverlay(radius);
    //        radius = null;
    //    }
    if (center != null) {
        map.removeOverlay(center);
        center = null;
    }
}

function getMinimumBoundingRectangle(points) {
    var minx = 0;
    var miny = 0;
    var maxx = 0;
    var maxy = 0;

    if (points.length < 4) {
        return (GLatLngBounds(new GLatlng(minx, miny), new GLatlng(maxx, maxy)));
    }

    minx = points[0].lat();
    miny = points[0].lng();
    maxx = points[0].lat();
    maxy = points[0].lng();

    for (var i = 1; i < points.length ; i++) {
        if (points[i].lat() > maxx) {
            maxx = points[i].lat();
        }
        if (points[i].lat() < minx) {
            minx = points[i].lat();
        }
        if (points[i].lng() > maxy) {
            maxy = points[i].lng();
        }
        if (points[i].lng() < miny) {
            miny = points[i].lng();
        }
    }

    return  new GLatLngBounds(new GLatLng(maxx,miny), new GLatLng(minx,maxy));
}

/**
 * nastavi na mape center marker
 */
function setCenter(centerPoint) {
    if (center != null) {
        map.removeOverlay(center);
    }
    center = new GMarker(centerPoint, {
        icon:icons[aktivni],
        draggable: true,
        title: "Center"
    });
//    center.enableDragging();
//
//    map.addOverlay(center);
//
//    GEvent.addListener(center, 'dragend', function() {
//        calculateEvent();
//    });
}

/**
 * nastavi na mape radius marker - ten, co udava velikost kruhu
 */
function setRadius(centerPoint, miles) {
    if (radius != null) {
        map.removeOverlay(radius);
    }
    radius = new GMarker(getRadius(centerPoint, miles), {
        icon:gicon,
        draggable: true,
        title: "Polomer"
    });
//    map.addOverlay(radius);
//    radius.enableDragging();
//    GEvent.addListener(radius,'dragend', function() {
//        calculateEvent();
//        $('#radius').val(miles);
//    });
}

/**
 * spocita pozici pro radiusMarker podle centerPointu.
 * vrati GLatLng noveho radius bodu
 */
function getRadius(centerPoint, miles) {
    var lat = centerPoint.lat();
    var lng = centerPoint.lng();
    var d2r = Math.PI/180;                // degrees to radians
    var r2d = 180/Math.PI;                // radians to degrees
    var Clat = (miles/3963) * r2d;       //  using 3963 as earth's radius
    var Clng = Clat/Math.cos(lat*d2r);
    Clng = lng + Clng;
    Clat = lat;
    return (new GLatLng(Clat,Clng));
}

/**
 * TODO
 */
function calculateEvent() {
//TODO
}

function odeberPasmo(cislo) {
    for (var i = 0; i < markersArray[cislo].length; i++) {
        if (markersArray[cislo][i] != null) {
            map.removeOverlay(markersArray[cislo][i]);
        }
    }
    if (polygonsArray[cislo] != null) {
        map.removeOverlay(polygonsArray[cislo]);
    }

    $("#pasmoDiv" + cislo).remove();
    zneaktivniAktivniPasmo();
    pointsArray[cislo] = [];
    polygonsArray[cislo] = [];
    markersArray[cislo] = [];
    //    posunuti cislovani elementu
    if (cislo != posledni){
        for (var j = cislo + 1; j <= posledni; j++) {
            $("#pasmoDiv" + j).attr("id", "pasmoDiv" + (j-1));
            $("#pasmoRadio" + j).attr("value", (j-1));
            $("#pasmoRadio" + j).attr("onclick", "javascript:zaktivniPasmo(" + (j-1)+")");
            $("#pasmoRadio" + j).attr("id", "pasmoRadio" + (j-1));
            $("#pasmoPrice" + j).attr("name", "pasmo" + (j-1));
            $("#pasmoPrice" + j).attr("id", "pasmoPrice" + (j-1));
            $("#upravit" + j).attr("href", "javascript:zaktivniPasmo(" + (j-1) + ")");
            $("#upravit" + j).attr("id", "upravit" + (j-1));
            $("#odebrat" + j).attr("href", "javascript:odeberPasmo(" + (j-1) + ")");
            $("#odebrat" + j).attr("id", "odebrat" + (j-1));
            var nazev = $("#nazev" + j);
            nazev.attr("id", "nazev" + (j-1));
            nazev.attr("style", "color:white; background-color:" + colors[j-1]);
            nazev.text(j-1);
            //polygonsArray[j-1] = new GPolygon(pointsArray[j], colors[j], 3, 1, colors[j], 0.2);
            //map.addOverlay(polygonsArray[j-1]);
            pointsArray[j-1] = pointsArray[j];
            pointsArray[j] = [];
            nastavPolygon(j-1);
            map.removeOverlay(polygonsArray[j]);
            markersArray[j-1] = markersArray[j];
            markersArray[j] = [];
        }
    }

    posledni -= 1;
    aktivni = cislo;
    nastavEnabledMarkers();
    nastavRadiusACenter();
    nastavRadio();
    setMapZoom(pointsArray[aktivni]);
}

// nahrazeno metodou odeber pasmo
//function odeberPosledniPasmo() {
//    for (var i = 0; i < markersArray[posledni].length; i++) {
//        if (markersArray[posledni][i] != null) {
//            map.removeOverlay(markersArray[posledni][i]);
//        }
//    }
//
//    if (polygonsArray[posledni] != null) {
//        map.removeOverlay(polygonsArray[posledni]);
//    }
//
//    $("#pasmoDiv" + posledni).remove();
//    zneaktivniAktivniPasmo();
//    pointsArray[posledni] = [];
//    polygonsArray[posledni] = [];
//    markersArray[posledni] = [];
//    posledni -= 1;
//    aktivni = posledni;
//    nastavEnabledMarkers();
//    nastavRadiusACenter();
//    nastavRadio();
//    setMapZoom(pointsArray[aktivni]);
//}

function getRadiusByBounds(bounds) {
    var pointMin = bounds.getSouthWest();
    pointMin.lng = bounds.getNorthEast().lng;
    var pointMax = bounds.getNorthEast();
    pointMax.lng = bounds.getSouthWest().lng;
    var i = pointMin.distanceFrom(pointMax) / 2 / 1000;
    //    var i = bounds.getSouthWest().distanceFrom(bounds.getNorthEast()) / 2 / 1.4142 / 1000;
    return i;
}

function savePolygon(restaurant) {
    var link = "/" + restaurant + "/" + deliveriesAction + "/" + localitiesAction + "/?";


    for (var i = 1 ; i < pointsArray.length ; i++) {
        for (var j = 0 ; j < pointsArray[i].length ; j++) {
            link += "x" + i + "_" + j + "="+ pointsArray[i][j].lat();
            link += '&';
            link += "y" + i + "_" + j + "="+ pointsArray[i][j].lng();
            link += '&';
        }
    }

    for (var k = 1 ; k <= posledni ; k++) {
        link += "pasmoPrice" + k + "=" + $("#pasmoPrice" + k).val() + "&";
    }
    location.href = link;
}


var centerMarker;

function loadMapAdminLocalities()
{
    var center;
    var zoom = 6;
    if ( $('#lat').val() != null && $('#lat').val() != '') {
        center = new GLatLng($('#lat').val(),$('#lng').val());
        zoom = 13;
        marker = new GMarker(center, {
            icon:icon,
            draggable: true,
            title: "Center"
        });
        GEvent.addListener(marker,'dragend',function() {
            $('#lat').val(marker.getPoint().lat());
            $('#lng').val(marker.getPoint().lng());
        });
        centerMarker = marker;
    } else {
        center = new GLatLng(49.827771,15.467041);
    }
    map = new GMap2(document.getElementById("map"));
    map.setCenter(center, zoom);
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl()) ;
    map.addControl(new GOverviewMapControl());
    if (marker) {
        map.addOverlay(marker);
    }
}
function showAddressAdmin(address) {
    var geocoder = new GClientGeocoder() ;
    geocoder.getLatLng(address, function(point)
    {
        if (!point)
        {
            alert(address + " not found")
        } else
{
            if (centerMarker) {
                map.removeOverlay(centerMarker);
            }
            marker = new GMarker(point, {
                icon:icon,
                draggable: true,
                title: "Center"
            });
            GEvent.addListener(marker,'dragend',function() {
                $('#lat').val(marker.getPoint().lat());
                $('#lng').val(marker.getPoint().lng());
            });
            marker.enableDragging();
            map.addOverlay(marker);
            $('#lat').val(point.lat());
            $('#lng').val(point.lng());
            map.setCenter(point, 13);
            centerMarker = marker;
        }
    }) ;
}

function ajaxDelivery(action) {
    var pw = $('#pwHref').val();
    if (pw == null){
        pw = "";
    }
    var address = "/deliveryOrder?" +action + pw + "&time="+ new Date().getTime();
    if ($("#ulozitAdresu:checked").val() != null) {
        address += "&saveAddress=true";
    }
    $('#floatmenu').remove();
    linkupdateparams("rozvozyDiv", address, null, "deliveryOrder");
//nastavit obsah divu floatmenu novym divem floatmenu
}

function validateDeliveryForm() {
    var toValidate = new Array("jmeno", "mail", "telefon", "ulice", "cislo", "mesto", "city", "street", "number");
    var first = true;
    var result = true;

    for (var i = toValidate.length-1; i > -1 ; i--) {
        if ($('#'+toValidate[i]).length > 0) {
            var res = validateRequired(toValidate[i], "");
            if (res == false) {
                if (result = true) {
                    result = false;
                }
                if (first == true) {
                    firts = false;
                    invalidInput(toValidate[i], true);
                } else {
                    invalidInput(toValidate[i], false);
                }
            }
        }
    }
    if (!result){
        showNoreg();
    }
    return result;
}

function submitForm(id, delivery) {
    var valid = validateDeliveryForm();
    if (valid == true) {
        if (delivery == true) {
            goToCheckDelivery(id);
        } else {
            goToCheckTakeAway(id);
        }
    }
}

