(function($) {

window.log = function() {
    if (this.console) {
        this.console.log(Array.prototype.slice.call(arguments));
    }
};

if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(callback) {
        for (var idx in this) {
            if (!callback(this[idx])) {
                return false;
            }
        }

        return true;
    };
}

window.shiftpress = {
    url: window.location.origin,

    messagebox: null,
    message: function(msg) {
        var messagebox;
        if (this.messagebox == null) {
            messagebox = $('#sp-message');
            if (messagebox.length == 0) {
                messagebox = $('<div id="sp-message"></div>');
                $('body').append(messagebox.hide());
            }

            $(document).click(function() {
                messagebox.stop(true).fadeOut('fast');
            });

            this.messagebox = messagebox;
        } else {
            messagebox = this.messagebox;
        }

        messagebox.stop(true);

        if (messagebox.is(":visible")) {
            messagebox.fadeOut('fast', function() { messagebox.html(msg); });
        } else {
            messagebox.html(msg);
        }

        messagebox.fadeIn('fast').delay(60000).fadeOut('slow');
    },

    apiurl: '/api',
    _apinum: 0,
    api: function(options) {
        var apinum = ++shiftpress._apinum;

        var defaults = {
            url: null,
            data: { },
            complete: null,
            success: null,
            method: 'GET'
        };

        options = $.extend(defaults, options);

        log("API-" + apinum + ": " + shiftpress.apiurl + "/" + options.url, options.data);

        $.ajax({
            url: shiftpress.apiurl + '/' + options.url,
            data: options.data,
            dataType: 'json',
            type: options.method,
            complete: function() {
                log("API-" + apinum + ": complete");

                if (options.complete) {
                    options.complete();
                }
            },
            success: function(data) {
                if (options.success) {
                    options.success(data);
                }
            }
        });
    },

    tooltiptpl: '<div class="sp-tooltip-wrapper">' +
        '<div class="sp-tooltip">' +
            '<div class="sp-tooltip-callout"></div>' +
            '<div class="sp-tooltip-content">' +
                '{{content}}' +
            '</div>' +
        '</div>' +
    '</div>',

    tooltip: function(options) {
        var defaults = {
            items: null,
            content: null,
            alwaysShow: false,
            container: $('body')
        };

        options = $.extend(defaults, options);

        var content = shiftpress.tooltiptpl;
        content = content.replace(/{{content}}/, options.content);
        
        $(options.items).each(function() {
            var $tooltip = $(content);
            var $item = $(this);
            
            $tooltip
                .appendTo(options.container)
                .css({
                    position: 'absolute',
                    zIndex: 99999
                })
                .position({
                    of: $item,
                    my: "left top",
                    at: "left bottom"
                })
                .fadeIn('fast')
            ;

            if ($tooltip.position().left < $item.position().left) {
                $('.sp-tooltip-callout', $tooltip).css({ left: ($item.position().left - $tooltip.position().left) + 10 });
            }

            $item.add($tooltip).one('blur focus focusin click tooltipclose', function() {
                $tooltip.fadeOut(function() { $(this).remove(); });
            });
        });
    },

    fieldError: function(field, error, container) {
        var $field = $(field);

        shiftpress.tooltip({
            items: $field,
            content: error,
            alwaysShow: true,
            container: container
        });
    },

    overlay: function($el, options) {
        var defaults = {
            cls: null,
            content: null,
            zIndex: 10,
            container: $('body')
        };

        options = $.extend(defaults, options);

        var $overlay = $('<div class="sp-overlay">' +
                '<div class="sp-overlay-content">' +
                '</div>' +
            '</div>'
        )
            .hide()
            .addClass(options.cls)
            .appendTo(options.container)
            .css({
                position: 'absolute',
                zIndex: options.zIndex
            })
            .css($el.position())
            .width($el.width())
            .height($el.height())
            .fadeIn('fast')
        ;

        $('.sp-overlay-content', $overlay).append($(options.content));

        var $els = $($overlay).add($el);
        
        $els.bind('overlayclose', function(e) {
            $els.unbind(e);

            $overlay.fadeOut('fast', function() { $(this).remove(); });
        });

    },

    filedrop: function($el, options) {
        var defaults = {
            url: null,
            data: null,
            paramname: "file",
            overlayClass: "sp-filedrop-overlay",
            overlayContent: '<p>Drop your files here</p>',
            overlayContainer: $el
        };

        options = $.extend(defaults, options);

        var overlay = null;

        var fdoptions = {
            url: options.url,
            data: options.data,
            paramname: options.paramname,
            maxfilesize: 20,
            docEnter: function() {
                if (overlay == null) {
                    shiftpress.overlay($el, {
                        cls: options.overlayClass,
                        content: options.overlayContent,
                        zIndex: 99999,
                        container: options.overlayContainer
                    });

                    overlay = true;
                }

                if (options.docEnter) {
                    options.docEnter.apply(this, arguments);
                }
            },
            docLeave: function() {
                $el.trigger('overlayclose');
                overlay = null;

                if (options.docLeave) {
                    options.docLeave.apply(this, arguments);
                }
            },
            drop: function() {
                $el.trigger('overlayclose');
                overlay = null;

                if (options.drop) {
                    options.drop.apply(this, arguments);
                }
            },
            dragOver: options.dragOver,
            dragLeave: options.dragLeave,
            docOver: options.docOver,
            uploadStarted: options.uploadStarted,
            uploadFinished: options.uploadFinished,
            progressUpdated: options.progressUpdated,
            speedUpdated: options.speedUpdated,
            rename: options.rename,
            beforeEach: options.beforeEach,
            afterAll: options.afterAll
        };

        $el.filedrop(fdoptions);
    },

    watermark: function($el, title) {
        $el = $el.not(".sp-watermarked");

        var show = function() {
            $el.addClass("sp-watermark-active").val(title);
        };

        var hide = function() {
            $el.removeClass("sp-watermark-active").val("");
        }

        $el.addClass("sp-watermarked");

        $el.focus(function() {
            if ($el.hasClass("sp-watermark-active")) {
                hide();
            }
        });

        $el.blur(function() {
            if ($.trim($el.val()) == "") {
                show();
            }
        });

        if ($.trim($el.val()) == "") {
            show();
        }
    },

    html2string: function(html) {
        return html.replace(/<\/p>\s*<p>/ig, "\n").replace(/<[^>]+>/g, '');
    }
};

$.fn.error = function(msg) {
    shiftpress.fieldError(this, msg);
};

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

})(jQuery);

