$(function () {
    AustralPopupSingleton.Initialize();

    // Futuros popups
    $('.australpopupInstance').live('click', function () {
        AustralPopupSingleton.ShowPopup(this.href, this.title);
        return false;
    });

    // Futuros popups IMAGE
    $('.australpopupImage').live('click', function () {
        AustralPopupSingleton.ShowPopupImage(this.href, this.title);
        return false;
    });

    // Futuros botones cancel de popup
    $('.australCancelAction').live('click', function () {
        AustralPopupSingleton.CloseCurrentPopup();
        return false;
    });
});

var AustralPopupSingleton = function () {

    var $popup;
    var $iframe;

    var onPopupOpenedCallback;
    var onPopupClosedCallback;

    function onPopupCreated(event, ui) {
    }

    function onPopupOpened(event, ui) {
        ReinitializeMvcClientValidation();
        if (onPopupOpenedCallback) {
            onPopupOpenedCallback();
        }
    }

    function onPopupBeforeClosed(event, ui) {
    }

    function onPopupClosed(event, ui) {
        if (onPopupClosedCallback) {
            onPopupClosedCallback();
        }
    }

    function createDialog($p, autoOpen, width, height, title) {
        if (!title) { title = ''; }
        if (!width) { width = 'auto'; }
        if (!height) { height = 'auto'; }
        $p.dialog({
            autoOpen: autoOpen,
            modal: true,
            width: width,
            height: height,
            title: title,
            draggable: true,
            show: { effect: 'fade', duration: 500 },
            hide: { effect: 'fade', duration: 500 },
            create: function (event, ui) {
                onPopupCreated(event, ui);
            },
            open: function (event, ui) {
                onPopupOpened(event, ui);
            },
            beforeClose: function (event, ui) {
                onPopupBeforeClosed(event, ui);
            },
            close: function (event, ui) {
                onPopupClosed(event, ui);
            }
        });
    }


    return {

        Initialize: function () {
            $popup = $('#australpopup');
            createDialog($popup, false, 'auto', 'auto', '');
        },

        ShowPopup: function (url, title) {
            if (url) {
                AustralPopupSingleton.ChangeTitle(title);
                $.get(url, function (hdata) {
                    $popup.html(hdata);
                    $popup.dialog('open');
                    AjaxHandlerSingleton.HideAjaxActivity();
                });
            }
        },

        ShowPopupImage: function (url, title) {
            if (url) {
                AustralPopupSingleton.ChangeTitle(title);
                var $html = $('<div class="australpopupImageLoader australpopupImageLoading"></div>');
                var img = new Image();
                $(img).load(function () {
                    $(this).css('style', 'display: none;');
                    $html.removeClass('australpopupImageLoading').removeClass('australpopupImageLoader').append(this);
                    $(this).fadeIn();
                }).error(function () {
                    alert('Imagen no disponible');
                }).attr('src', url);

                $popup.html($html);
                $popup.dialog('open');
            }
        },

        // TODO: unicamente se crea el IFrame y no es posible cambiarle el titulo por ahora.
        ShowAsIFrame: function (url, width, height) {
            if (url) {
                $iframe = $('<iframe id="site" src="' + url + '" />');
                createDialog($iframe, true, width, height, '');
            }
        },

        CloseCurrentPopup: function () {
            $popup.dialog('close');
        },

        ChangeTitle: function (title) {
            $popup.dialog('option', 'title', title);
        },

        SetOnPopupClosedCallback: function (_onPopupClosedCallback) {
            onPopupClosedCallback = _onPopupClosedCallback;
        },

        SetOnPopupOpenedCallback: function (_onPopupOpenedCallback) {
            onPopupOpenedCallback = _onPopupOpenedCallback;
        }

    };

} ();


