﻿// Class Modal
//
// - Requires -
// class.js
// jquery.js (version 1.3+)
//
// - Properties -
// modalTitle: Friendly title for modal (added to modalOptions)
// modalElements: object containing
//		modalDiv - div that $().dialog() is called on
//		targetElement - link that fires dialog()
// snippetPath: absolute path to snippet aspx
// params: Query string params for ajax populate call
// modalOptions: the options object passed into $().dialog()

BenefulMap.Modal = Class.extend({
    init: function(modalTitle, modalElements, modalOptions, snippetPath, params) {
        this.modalDiv = modalElements.modalDiv;
        this.targetEl = modalElements.targetElement;
        this.closeButton = modalElements.modalDiv + " .close";
        this.snippetPath = snippetPath;
        this.params = params;
        this.initialParams = params;
        this.originalTitle = modalTitle;
        this.continueFlow = null;

        this.modalOptions = {};
        this.modalOptions.autoOpen = false;
        this.modalOptions.draggable = false;
        this.modalOptions.resizable = false;
        this.modalOptions.title = modalTitle;
        this.modalOptions.width = 600;
        this.modalOptions.modal = true;
        this.modalOptions.position = ["center", 100];
        this.modalOptions.bgiframe = true; // to block select boxes under modals in IE6
        this.extendModalOptions(modalOptions);

        this.firedTarget;

        $(this.modalDiv).dialog(this.modalOptions);
        this.addModalTargetListener();
        this.dialogCloseListener(); // this catches the event the modal itself fires when it is being closed
    },
    dialogCloseListener: function() {
        var self = this;
        $(this.getModalDiv()).bind('dialogclose', function(event, ui) {
            console.info(self.getModalTitle(), " now closing");
            self.revertToInitialState();
        });
    },
    revertToInitialState: function() {
        console.info(this.getModalTitle(), " returning to initial state");
        this.setParams(this.getInitialParams());
        this.setTitle(this.getOriginalTitle());
    },
    getOriginalTitle: function() {
        return this.originalTitle;
    },
    setOriginalTitle: function(originalTitle) {
        this.originalTitle = originalTitle;
    },
    getContinueFlow: function() {
        return this.continueFlow;
    },
    setContinueFlow: function(continueFlow) {
        this.continueFlow = continueFlow;
    },
    getInitialParams: function() {
        return this.initialParams;
    },
    getModalTitle: function() {
        return this.modalOptions.title;
    },
    setModalTitle: function(title) {
        this.modalOptions.title = title;
    },
    getModalDiv: function() {
        return this.modalDiv;
    },
    setModalDiv: function(modalDiv) {
        this.modalDiv = modalDiv;
    },
    getCloseButton: function() {
        return this.closeButton;
    },
    setCloseButton: function(closeButton) {
        this.closeButton = closeButton;
    },
    getSnippetPath: function() {
        return this.snippetPath;
    },
    setSnippetPath: function(snippetPath) {
        this.snippetPath = snippetPath;
    },
    getParams: function() {
        return this.params;
    },
    setParams: function(params) {
        this.params = params;
    },
    extendParams: function(additionalParams) {
        jQuery.extend(this.getParams(), additionalParams);
    },
    getTargetEl: function() {
        return this.targetEl;
    },
    setTargetEl: function(targetEl) {
        this.targetEl = targetEl;
    },
    getModalOptions: function() {
        return this.modalOptions;
    },
    setModalOptions: function(modalOptions) {
        this.modalOptions = modalOptions;
    },
    getTitle: function() {
        return this.modalOptions.title;
    },
    setTitle: function(title) {
        this.modalOptions.title = title;
        $(this.modalDiv).dialog('option', 'title', title);
    },
    extendModalOptions: function(additionalModalOptions) {
        jQuery.extend(this.getModalOptions(), additionalModalOptions);
    },
    populate: function() {
        var self = this;
        jQuery.ajax({
            type: "GET",
            cache: false,
            url: self.getSnippetPath(),
            data: self.getParams(),
            success: function(data, textStatus) {
                $(self.getModalDiv()).html(data);
                $(self.getModalDiv()).dialog('open');
                self.addModalListeners();
            },
            dataType: "html"
        });
    },
    addModalListeners: function() {
        var self = this;
        $(this.getCloseButton()).click(function(event) {
            event.preventDefault();
            self.close();
        });
        $(this.getModalDiv() + " a.new-tab").newWindow();
        $(this.getModalDiv() + " a.pop-up").popup({
            scrollbars: true,
            resizable: true,
            status: false,
            width: 640,
            height: 600
        });
    },
    // next function
    open: function() {
        this.populate();
    },
    close: function() {
        //$(this.getModalDiv()).dialog('destroy');
        $(this.getModalDiv()).empty();
        $(this.getModalDiv()).dialog('close');
    },
    openListener: function(eventName) {
        var self = this;
        $(document).bind(eventName, function(event) {
            self.open();
        });
    },
    closeListener: function(eventName) {
        var self = this;
        $(document).bind(eventName, function(event) {
            self.close();
        });
    },
    setFiredTarget: function(firedTarget) {
        this.firedTarget = firedTarget;
    },
    getFiredTarget: function() {
        return this.firedTarget;
    },
    addModalTargetListener: function() {
        var self = this;
        $(this.targetEl).live('click', function(event) {
            event.preventDefault();
            self.setFiredTarget(this);
            self.populate();
        });
    }
});


