first = true;
function setCurrentLocation(latlng) {
    $('#lat').val(latlng.lat());
    $('#lng').val(latlng.lng());
    geo.moveTo(latlng, first?10:null);
    first=false;
    geo.moveLastPoint(latlng);



    var hash = LatLng_to_All(latlng);
    for(format in hash) {
        var context = $('#'+format+"_input");
        var values = hash[format];
        //alert("ZZZ"+format);
        for(field in values) {
            var value = values[field];
            $("input[is='"+field+"']", context).val(value);
            var select = $("select[is='"+field+"']", context);
            //alert(field);
            if(select.length) {
                //alert('select!'+field);
                //alert(value);
                select.val(value);
                $('span.minus', select.parent()).text((1==parseInt(value))?"":"-")
            }
        }
    }


/*
    $.post(
        "/items/location",
        {
            lat:latlng.lat(),
            lng:latlng.lng()
        },
        function(data) {
            $('#location').text(data);
        }
    */

            var geocoder = new YMaps.Geocoder(latlng.get(), {results: 1});

            // Обработчик успешного завершения процесса геокодирования
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
                var text ="";
                if (this.length()&&this.get(0)) {
                    window.g=this.get(0);
                    text = this.get(0).text;
                }
                $("#location_field").val(text);
                $("#location_display").text(text);

            });

            // Обработчик неудачного завершения геокодирования
            YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error) {
                //alert("Произошла ошибка: " + error.message)
            });



    /*
    $.get({
        url: '/items/location',
        dataType: 'json',
        data: {
            lat:latlng.lat(),
            lng:latlng.lng()
        },
        success: function(data) {
            alert(data);
        }
    });
    */
}




//DegDec  MinDec  DMS

function LatLng(lat, lng) {
    this.o = new YMaps.GeoPoint( lng, lat);

    this.lat = function() {
        return this.o.getLat();
    };

    this.lng = function() {
        return this.o.getLng();
    };

    this.get = function() {
        return this.o;
    };

}


var geo = {
    init: function(latlng) {
            this.map = new YMaps.Map(document.getElementById("map_canvas"));
            this.map.addControl(new YMaps.TypeControl());
            this.map.addControl(new YMaps.ToolBar());
            this.map.addControl(new YMaps.Zoom());
            //map.addControl(new YMaps.MiniMap());
            this.map.addControl(new YMaps.ScaleLine());

            this.s = new YMaps.Style();
            this.s.iconStyle = new YMaps.IconStyle();
            this.s.iconStyle.href = "/img/layout/marker.png",
            this.s.iconStyle.size = new YMaps.Point(21, 21);
            this.s.iconStyle.offset = new YMaps.Point(-10, -10);

            this.s_v = new YMaps.Style();
            this.s_v.iconStyle = new YMaps.IconStyle();
            this.s_v.iconStyle.href = "/img/layout/marker_virtual.png"
            this.s_v.iconStyle.size = new YMaps.Point(21, 21);
            this.s_v.iconStyle.offset = new YMaps.Point(-10, -10);
            
            
    },
    moveTo: function(latlng, zoom) {
         if(zoom) {
            this.map.setCenter(latlng.get(), zoom);
         } else {
            this.map.setCenter(latlng.get()); 
         }
        //this.map.setCenter(latlng.get(), zoom);
    },
    
    getStyle: function(type_id) {
        if(2==type_id) {
            return this.s_v;
        }
        return this.s;
    }
    ,
    addPoint: function(latlng, text, type_id) {
        var style = geo.getStyle(type_id);       
        var placemark = new YMaps.Placemark(latlng.get(), {style: style});
        //placemark.name="mark";
        placemark.description=text;
        this.map.addOverlay(placemark);
        this.placemark=placemark;
    },
    moveLastPoint: function(latlng) {
        this.placemark.setCoordPoint(latlng.get());
    },
    styleLastPoint: function(type_id) {
        var style = geo.getStyle(type_id);
        this.placemark.setStyle(style);
    },

    
}









function DMS_to_LatLng(lat_d, lat_m, lat_s, lat_inv , lng_d, lng_m , lng_s, lng_inv) {
    var lat = Math.coord_d(lat_d+lat_m/60+lat_s/3600);
    var lng = Math.coord_d(lng_d+lng_m/60+lng_s/3600);
    return new LatLng(lat_inv*lat, lng_inv*lng);
}

function MinDec_to_LatLng(lat_d, lat_m ,lat_inv, lng_d, lng_m,lng_inv) {
    var lat = Math.coord_d(lat_d+lat_m/60);
    var lng = Math.coord_d(lng_d+lng_m/60);
    return new LatLng(lat_inv*lat, lng_inv*lng);
}

function DegDec_to_LatLng(lat_d , lng_d) {
    var lat = Math.coord_d(lat_d);
    var lng = Math.coord_d(lng_d);
    return new LatLng(lat, lng);
}

function LatLng_to_All(latlng) {
    result = {};
    var lat = latlng.lat();
    var lng = latlng.lng();


    result.DegDec = {};
    result.MinDec = {};
    result.DMS = {};

    result.DegDec.lat_d=Math.coord_d(lat);
    result.DegDec.lng_d=Math.coord_d(lng);

    lat_inv = lat>0?1:-1;
    lng_inv = lng>0?1:-1;
    lat = Math.abs(lat);
    lng = Math.abs(lng);

    result.MinDec.lat_d=Math.floor(lat);
    result.MinDec.lng_d=Math.floor(lng);
    result.MinDec.lat_m=Math.coord_m((lat-result.MinDec.lat_d)*60);
    result.MinDec.lng_m=Math.coord_m((lng-result.MinDec.lng_d)*60);
    result.MinDec.lat_inv=lat_inv;
    result.MinDec.lng_inv=lng_inv;

    result.DMS.lat_d=Math.floor(lat);
    result.DMS.lng_d=Math.floor(lng);
    result.DMS.lat_m=Math.floor((lat-result.DMS.lat_d)*60);
    result.DMS.lng_m=Math.floor((lng-result.DMS.lng_d)*60);
    result.DMS.lat_s=Math.coord_s((lat-result.DMS.lat_d-result.DMS.lat_m/60)*3600);
    result.DMS.lng_s=Math.coord_s((lng-result.DMS.lng_d-result.DMS.lng_m/60)*3600);
    result.DMS.lat_inv=lat_inv;
    result.DMS.lng_inv=lng_inv;

    return result;
}


function getVal(is, context, tag) {
    var value = parseFloat($((tag?tag:'input')+"[is='"+is+"']", context).val());
    return isNaN(value)?0:value;
}


