var msgs = new Object();
msgs["registration_required"] = "Rejestracja jest wymagana, aby zmiany zostały zapisane.";

Function.prototype.inheritsFrom = function(parentClassOrObject, properties) {
    if (parentClassOrObject.constructor == Function) {
        //Normal Inheritance
        $.extend(this.prototype, parentClassOrObject.prototype);
        $.extend(this.prototype, properties);
        var self = this;
        this.prototype.constructor = this;
        this.prototype.__super__ = parentClassOrObject.prototype;
    }
    else {
        $.extend(this.prototype, parentClassOrObject);
        $.extend(this.prototype, properties);
        this.prototype.constructor = this;
        this.prototype.__super__ = parentClassOrObject;
    }
    return this;
};


var SearchBox = function (settings) {
    $.extend(this, settings || {});
    var ac = $(this.el).autocomplete({
        source: $.proxy(this.source, this),
        select: $.proxy(this.select, this),
        change: $.proxy(this.change, this),
        minLength: this.minLength,
        appendTo: this.appendTo,
        autoFocus: false
    });
    if (settings.render) {
        var data = ac.data( "autocomplete");
        if (data) {
            data._renderItem = $.proxy(settings.render, ac);
        }
    }
};

SearchBox.prototype = {
    el:null,
    appendTo:"body",
    url: null,
    place_type: null,
    minLength: 1,
    list: 'places',
    additionalData: {},

    action_handler: function (action, item) {

    },
    more_handler: function (search, data) {

    },
    change: function (event, ui) {

    },
    not_found_handler: function (search) {
        return [
            {label: 'Nie znaleziono. Dodaj miejsce.', value:search,  action:'not_found', 'img': ADD_PLACE_IMAGE}
        ];
    },
    select: function(event, ui) {
        if (ui.item) {
            this.action_handler(ui.item.action, ui.item);
        }
        return false;
    },
    build_label:function(item) {
        return item.path;
    },
    build_value:function(item) {
        return item.slug;
    },
    source: function (request, response) {
        var self = this;
        var autocomplete = this.el.data("autocomplete");
        $.ajax({
            url: this.url,
            dataType: "json",
            data: $.extend({query: request.term}, self.additionalData),
            success: function(data) {
                if (data.success && data[self.list].length > 0) {
                    if (data.more) {
                        self.more_handler(request.term, data);
                    }
                    response($.map(data[self.list], function(item) {
                        return {
                            action: "found",
                            label: self.build_label(item),
                            value: self.build_value(item),
                            slug: item.slug,
                            id: item.id,
                            img: item.img,
                            item: item
                        }
                    }));
                } else {
                    response(self.not_found_handler(request.term))
                }
            }
        });
    }
};


var SignupAction = function (settings) {
    $.ajax({
        url: settings.url,
        data: settings.data,
        type: "POST",
        dataType: "json",

        success: function(data) {
            if (data.success) {
                if (!data.is_authenticated) {
                    AuthDialog.get().register(msgs["registration_required"]);
                }
                if (settings.onSuccess) {
                    settings.onSuccess.call(this, data);

                }
            } else {
                if (settings.onFailure) {
                    settings.onFailure.call(this, data);
                }
                //TODO: something went wrong
            }
        }

    })
};

var IfSingedUpAction = function (settings) {
    $.ajax({
        url: settings.url,
        data: settings.data,
        type: "POST",
        dataType: "json",

        success: function(data) {
            if (data.success) {
                if (!data.is_authenticated) {
                    return;
                }
                if (settings.onSuccess) {
                    settings.onSuccess.call(this, data);

                }
            } else {
                if (settings.onFailure) {
                    settings.onFailure.call(this, data);
                }
            }
        }
    })
};


var AjaxSubmit = function (form) {
    var f = $(form);
    var b = $("button[type='submit']", f);
    if (b) {
        if (!b.hasClass("button")) {
            b.button();
        }
        f.submit(function () {
            var f = $(this);
            $(".error", this).removeClass("error");
            $(".errors").hide();
            var fields = $("input, textarea", f);
            $.post(f.attr("action"), f.serialize(), function (data, textStatus, jqXHR) {
                if (!data.success) {
                    show_errors(f, data);
                } else {
                    show_ok(fields, true);
                }
            }, "json");
            return false;
        });
    }
};

function show_ok(fields, show) {
    $(fields).each(function () {
        var parent = $(this).parent();
        var f = $(this);
        //f.addClass("no-errors");
        //f.removeClass("no-errors", 2000);
        parent.find(".ok").show().fadeOut(2000);

    });
}


function follow(follow_url, unfollow_url, btn) {
    var actor_id = btn.data("actor-id");
    var ct_id = btn.data("ct-id");
    btn.click(function () {
        if ($(this).hasClass("follow")) {
            new SignupAction({
                data: {
                    object_id: actor_id,
                    content_type: ct_id
                },
                url: follow_url,
                onSuccess: function (data) {
                    if (data.is_authenticated) {
                        btn.text("Nie obserwuj");
                        btn.removeClass("follow");
                        btn.addClass("unfollow");
                    }
                    else {
                        AuthDialog.get().register(msgs["registration_required"]);
                    }
                }
            });
        } else {
            $.ajax({
                url: unfollow_url,
                type: "POST",
                data: {
                    object_id: actor_id,
                    content_type: ct_id
                },
                dataType: "json",
                success:function (data) {
                    if (data.success) {
                        btn.text("Obserwuj");
                        btn.removeClass("unfollow");
                        btn.addClass("follow");
                    }
                }
            });
        }
    });
}


function show_errors(form, data) {

    for (var field in data.errors) {
        var errors = data["errors"][field];
        if (errors.length > 0) {
            var error = errors[0];
            var parent = $("#" + field).parent();
            parent.addClass("error");
            parent.find(".errors").html(error).fadeIn("slow");
        }
    }
}


function fileUpload(settings) {
    var uploadButton = settings.uploadButton;
    var uploadList = settings.uploadList;
    var url = settings.url;
    var flash_url = settings.flash_url;
    var params = settings.params;
    var success = settings.success;
    var complete = settings.complete;


    var swfu = new SWFUpload({
        upload_url : url,
//        debug:true,
        flash_url : flash_url,
        file_size_limit : "5 MB",
        button_placeholder_id: uploadButton.attr("id"),
        button_width : settings.button_width,
        button_height : settings.button_height,
        button_cursor: SWFUpload.CURSOR.HAND,
        button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
        file_post_name: "image",
        post_params: params,
        button_action: settings.button_action ? settings.button_action : SWFUpload.BUTTON_ACTION.SELECT_FILES,
        file_queue_limit: settings.file_queue_limit,
        file_dialog_start_handler: settings.file_dialog_start_handler,
        file_dialog_complete_handler: function() {

            if (settings.dialogCloseHandler) {
                settings.dialogCloseHandler.apply(this, arguments);
            }
            if (settings.autoStart) {
                this.startUpload();
            }
        },
        file_queued_handler: function (file) {
            if (uploadList) {
                var progressBar = $("<li>" + file.name + ": <div id='" + file.id + "'></div></li>");
                uploadList.append(progressBar);
                progressBar.find("#" + file.id).progressbar({value:0});
            }
        },
        upload_progress_handler: function (file, bytesLoaded, bytesTotal) {
            if (uploadList) {
                try {
                    var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);
                    $("#" + file.id).progressbar({value:percent});
                } catch (ex) {
                }
            }

        },
        upload_success_handler: function (file, server_data, receivedResponse) {
            if (uploadList) {
                $("#" + file.id).parent().fadeOut('fast', function () {
                    $(this).remove();
                });
            }
            var response = $.parseJSON(server_data);
            if (response.success) {
                success(file, response);
            } else {

            }
        },
        upload_complete_handler: function() {
            this.startUpload();
        },
        queue_complete_handler: function (numFiles) {
            if (complete) {
                complete(numFiles);
            }
        }
    });
    return swfu;
}


var TimeLine = function (url) {
    this.url = url;
    $(this).everyTime(5000, "update_timeline", $.proxy(this.timeout, this));
};

TimeLine.prototype = {
    url: null,
    timeout: function () {
       var self = this;
       $.ajax({
            url: this.url,
            type: "GET",
            dataType: "html",
            success: function(data) {
                if ($.trim(data).length > 0) {
                    var content = $(data);
                    $(".timeline").prepend(data);
                    $(".timeline > li.action").each(function () {
                        var s = $(this);
                        if (s.hasClass("ui-helper-hidden")) {
                            s.show("slow", function () {
                                s.removeClass("ui-helper-hidden");
                            });
                        }
                    });
                }
            }

        });
    }
};



function create_map(where_id, lat, lng, title)  {
    var latlng = new google.maps.LatLng(lat, lng);

    var myOptions = {
        zoom: 8,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById(where_id), myOptions);
    var marker = new google.maps.Marker({
        position: latlng,
        map: map,
        draggable:true,
        animation: google.maps.Animation.DROP,
        title:title
        //                        ,icon: 'icons/house.png'
    });
    return map
}

if ($.fn.cycle) {
    $.fn.cycle.transitions.shuffly = function($cont, $slides, opts) {
        var i, w = $cont.css('overflow', 'visible').width();
        this.rotations = ['rotation-1', 'rotation-2', 'rotation-3'];
        $slides.css({left: 0, top: 0});
        opts.before.push(function(curr, next, opts) {
            //$.fn.cycle.commonReset(curr, next, opts, true, true, true);
        });
        // only adjust speed once!
        if (!opts.speedAdjusted) {
            opts.speed = opts.speed / 2; // shuffle has 2 transitions
            opts.speedAdjusted = true;
        }
        opts.random = 0;
        opts.shuffle = opts.shuffle || {left:-w, top:15};
        this.els = this.els ? this.els : [];
        if (this.els.length == 0) {
            for (i = 0; i < $slides.length; i++) {
                var $slide = $slides[i];
                this.els.push($slide);
                $($slide).css("z-index", $slides.length - i);
                if (i > 0) {
                    $($slide).addClass(this.rotations[i % this.rotations.length])
                }
                $($slide).show();
            }
        }
        var self = this;
        // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
        opts.fxFn = function(curr, next, opts, cb, fwd) {
            if (opts.rev)
                fwd = !fwd;
            var $el = fwd ? $(curr) : $(next);
            var count = opts.slideCount;
            var newz = fwd ? 1 : count;
            var zchange = fwd ? 1 : -1;

            $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
                $(self.els).each(function (idx, val) {
                    if (this == $el.context) {
                        $(this).css("z-index", newz);
                    } else {
                        $(this).css("z-index", parseInt($(this).css('z-index')) + zchange);
                    }
                    if (this == next) {
                        $(this).addClass("no-rotation");
                        $(this).removeClass("rotation-1");
                        $(this).removeClass("rotation-2");
                    } else {
                        $(this).removeClass("no-rotation");
                        $(this).removeClass("rotation-1");
                        $(this).removeClass("rotation-2");
                        $(this).addClass(self.rotations[idx % self.rotations.length]);
                    }
                });
                $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
                    if (cb) cb();
                });
            });
        };
        $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
    };
}





var N  = {
    trace: function (s) {
        if (console) {
            console.log(s);
        }
    }
};

