(function($){
    $.initPlaceCreate = function(options) {
        var opts = $.extend({
                createUrl: null,
                placesList: null,
                addressField: "input[name=address]",
                removeLink: "li.remove a",
                addPlaceLink: "#add-place",
                onCreate: function(id) {},
                onRemove: function(id) {}
            }, options),
            geocoder = new GClientGeocoder();

        function getInfoFromPlacemark(pm) {
            var box = pm.ExtendedData.LatLonBox,
                reduce = 25,
                dy = (box.north - box.south) / 100 * reduce / 2,
                dx = (box.east - box.west) / 100 * reduce / 2,
                south = box.south + dy,
                north = box.north - dy,
                east = box.east- dx,
                west = box.west + dx;

            return {
                real_name: pm.address.split(",")[0],
                south: south,
                north: north,
                east: east,
                west: west
            };
        }

        function error(message) {
            alert(message);
        }

        function addPlace(data) {
            if ($("input[name=places][value=" + data.id  + "]").length) {
                return;
            }

            if (opts.onCreate(data.id) != false) {
                $(opts.placesList).prepend('<li class="remove">'
                        + '<a href="#" class="blue-link">remove</a>'
                        + '   ' + $(opts.addressField).val()
                        + '<input type="hidden" name="places" value="' + data.id + '" />'
                        + '</li>');
                $("input[name=address]").val("");
            }
        }


        $(opts.removeLink).live("click", function(){
            var id = parseInt($(this).parent().find("input").val());
            if (opts.onRemove(id, $(this)) != false) {
                $(this).parent().remove();
            }
            return false;
        });

        $(opts.addPlaceLink).live("click", function(){
            var address = $(opts.addressField).val();
            if (address) {
                var res = null;
                geocoder.getLocations(address, function(data) {
                    if (data.Status.code == 200 && data.Placemark.length > 0) {
                        $.post(opts.createUrl, $.extend({name: address}, getInfoFromPlacemark(data.Placemark[0])), function(data){
                            if ("error" in data) {
                                error("server error");
                            } else {
                                addPlace(data);
                                $(opts.addressField).val("");
                            }
                        });
                    } else {
                        error("geocoder error");
                    }
                });
            }
            return false;
        });
    };
})(jQuery);

