var overlayer = {
    count: 0,
    overlays: [],

    enableKeyboardNav: function () {
        $(document).bind("keydown", overlayer.keyboardAction);
    },

    disableKeyboardNav: function () {
        $(document).unbind("keydown", overlayer.keyboardAction);
    },

    keyboardAction: function (event) {
        var keycode = event.keyCode;

        var escapeKey;
        if (event.DOM_VK_ESCAPE) {  // mozilla
            escapeKey = event.DOM_VK_ESCAPE;
        } else { // ie
            escapeKey = 27;
        }

        var returnKey;
        if (event.DOM_VK_RETURN) {
            returnKey = event.DOM_VK_RETURN;
        } else {
            returnKey = 13;
        }

        if (keycode == escapeKey) { // close overlayer
            overlayer.destroyItem();
        } else if (keycode == returnKey) {
            overlayer.submitItem();
        }
    },

    newItem: function (popupurl, options) {
        options = options || {};
        
        var allowNew = true;

        $.each(overlayer.overlays, function () {
            if ($(this).attr('ajaxify-url') == popupurl) {
                allowNew = false;
            }
        });

        if (!allowNew) {
            return;
        }

        overlayer.count++;

        var overlay_content = $('<div></div>').addClass('overlayContent');
        var overlay = $('<div></div>').addClass('layoutOverlay layoutPngfix').attr('ajaxify-url', popupurl).append(overlay_content)
                                      .attr('style', options.overlayStyle).css("top", ($(window).scrollTop() + 60) + "px").appendTo('body');

        var overlay_form = $('<form method="get" />').addClass('overlayForm').attr({'action': popupurl, 'id': 'ajaxify_form_' + overlayer.count});
        $(overlay_content).wrap(overlay_form);
        $('<input type="hidden" name="ajaxify_submit" />').val('1').insertBefore(overlay_content);

        if (overlayer.overlays.length == 0) {
            overlayer.enableKeyboardNav();
        }

        overlayer.overlays.push(overlay);

        return [overlay_content, overlayer.count];
    },

    destroyItem: function (overlay) {
        if (!overlay) {
            var newest = overlayer.overlays.pop();

            if (overlayer.overlays.length == 0) {
                overlayer.disableKeyboardNav();
            }

            $(newest).fadeOut('slow', function () {
                $(this).remove();
            });
        } else {
            var closestOverlay = $(overlay).closest('.layoutOverlay');

            var newOverlays = [];
            for (var current in overlayer.overlays) {
                if (current != closestOverlay) {
                    newOverlays.push(current);
                }
            }

            overlayer.overlays = newOverlays;

            $(closestOverlay).fadeOut('slow', function () {
                $(this).remove();
            });
        }
    },

    submitItem: function (overlay) {
        if (!overlay) {
            var newest = overlayer.overlays[overlayer.overlays.length - 1];

            // only allow submit if submit button exists and has no disabled state
            if ($(newest).find('form') && $(':input:focus').length == 0) {
                if ($(newest).find('.overlaySubmit').length > 0 && !$(newest).find('.overlaySubmit').parent().hasClass('uiButtonDisabled')) {
                    $(newest).find('form').submit();
                }
            }
        } else {
            if ($(overlay).closest('form').find('.overlaySubmit').length > 0 && !$(overlay).closest('form').find('.overlaySubmit').parent().hasClass('uiButtonDisabled')) {
                $(overlay).closest('form').submit();
            }
        }
    },

    setButtons: function (overlay) {
        $(overlay).find('.overlayClose').click(function () {
            overlayer.destroyItem(overlay);
        });

        $(overlay).find('.overlaySubmit').click(function () {
            overlayer.submitItem(overlay);
        });
    },

    startLoading: function () {
    },

    stopLoading: function () {
    }
};
