//  -*- mode: javascript; -*-
/* Grensesnitt for å kunna køyra applikasjonar modalt. 
 * Sak #751.0.
 */

/* Namnerom. */
var ModalApp = {};

/* Klient-side. Singleton, ikkje avhengig av jquery eller jquery-ui. Noop dersom
 * sida ikkje blir køyrd i ein ModalApp.popup 
 */

ModalApp.client = function() {
    var options = {
	window: false,
	modal: false,
	caller: false
    };
    var delayed = {};
    
    return  {
	is_modal: function() { 
	    return options.modal; 
	},

	is_window: function() { 
	    return options.window; 
	},

	close: function() {
	    if(options.caller) {
		options.caller.close();
	    }
	},

	finish: function(result, message) {
	    if(options.caller) {
		options.caller.finish(result, message);
	    } else {
		delayed.finished = {result:result,message:message};
	    }
	    return false;
	},
	
	options: function(opt) {
	    if(options.caller) {
		options.caller.options(opt);
	    } else {
		delayed.options = opt;
	    }
	},

	parent: function() {
	    return window.parent;
	},
	
	init: function(initoptions) {
	    options=initoptions;
	    if(delayed.finished) {
		options.caller.finish(delayed.finished.result, delayed.finished.message);
	    } else if(delayed.options) {
		options.caller.options(delayed.options);
	    }
	}
    }
}();

/* Konstruktør for ModalApp-interfacen. 
 * content_url: URL til applikasjon som skal køyrast 
 * config_add:  Opsjonar til ModalApp-popupen:
 * { callback: false,  // callback som blir køyrd av finish-metoden. Blir kalla med kontekst og resultatverdi.
 *   context: false,   // Vilkårleg verdi for å hugsa konteksten.
 *   messagecontainer: '#messages' // ID til <div> i vertsapplikasjonen som kan motta meldingar frå klienten.
 *   }
 * dialog_options_add: // Ekstra opsjonar til jquery-ui-dialogen.~~
 */

ModalApp.Popup = function(content_url, config_add, dialog_options_add) {

    var contentframe = $('<iframe style="border: none; margin: 0px; padding: 0px;"  height="100%" width="100%"></iframe>');
    var popup = $('<div>');
    var self = this;
    
    var url = content_url;
    
    var dialog_options = {
	height: 440,
   	width: 640,
	modal: true,
   	autoOpen: false,
	position: "top"
    };
    if(dialog_options_add) {
	$.extend(dialog_options,dialog_options_add);
    }
    
    var config = {
	callback: false,
	context: false,
	resize: true,
	messagecontainer: '#messages'
    }
    if(config_add) {
	$.extend(config,config_add);
    }
    
    
    this.message = function(message) {
	$(config.messagecontainer).html(message);
    }
    
    this.finish= function(result, message) {
	self.message(message);
	self.close();
	if(config.callback) {
	    config.callback(config.context, result);
	}
    }
    
    this.close = function() {
	popup.dialog("close");
    }
    
    this.options = function(dialogoptions) {
	popup.dialog("option",dialogoptions);
    }

    this.open = function(context) {
    	popup.html(contentframe);
	contentframe.attr('src', url);
	if(context) {
	    config.context=context;
	}

	popup.dialog(dialog_options).dialog('open');
	
	contentframe.load(function() {
	    var content =  $(contentframe).contents();
	    contentframe[0].contentWindow.ModalApp.client.init({'caller': self,'window': true,'modal':true});
	    if(! dialog_options.title) {
		popup.dialog("option","title", content.attr("title"));
	    }
	    if(config.resize) {
		popup.dialog("option","height",content.height() + 40);
	    }
	    content.find('.hide_framed').hide();
	    content.find('.hide_unframed').show();
	});
    }	
};

/* Fabrikkmetode for modalt iframevindu. my_options  */
ModalApp.create= function (content_url, my_options, dialog_options) {
    return new ModalApp.Popup(content_url, my_options, dialog_options);
};

/* Gjer om <a>-ar til å opna modale vindu. selector er ein kva som helst gyldig jquery-selector. */
ModalApp.makemodal = function(selector,  my_options, dialog_options) {
    $(function() {	
	$(selector).live('click', function(event) {
	    event.preventDefault();
	    ModalApp.create(this + '&embed=1', my_options, dialog_options).open();
	})
    })
};


