function sifntDialog(){
	this.options = {};
}

sifntDialog.prototype.newDialog = function(options){
	this.options = {
		modal: false,
		fadeIn: 0,
		fadeOut: 200,
		fadeInModal: 0,
		fadeOutModal: 200,
		addClass: false,
		noResizeWidth: false,
		maxWidth: false,
		load: {
			data: {
				ajax: 1
			}
		}
	};
	$.extend(true, this.options, options);
	
	if(this.options.modal){
		this.darkenPage();
	}
	var dialog = this.createDialog();
	this.showDialog(dialog);
	
	if(typeof(this.options.load.url) == 'string'){
		dialog.find('.sm_content div:first').load(this.options.load.url, this.options.load.data, function(){
			if(Dialog.options.onComplete){
				Dialog.options.onComplete();
			}
			
			dialog.centreDialog();
		});
	}
	
	if(typeof(this.options.load.url) == 'object'){
		if(this.options.load.clone){
			dialog.find('.sm_content div:first').html($(this.options.load.url).clone());
		}
		else{
			dialog.find('.sm_content div:first').html($(this.options.load.url));
		}
		if(Dialog.options.onComplete){
			Dialog.options.onComplete();
		}
		
		dialog.centreDialog();
	}
	
	return true;
}

sifntDialog.prototype.createDialog = function(){
	// Create Modal
	dialog = $('<div>')
		.attr('class', 'sm_window')
		.addClass(this.options.addClass)
		.fadeTo(0, 0)
		.data('modal', this.options.modal)
		.data('noResizeWidth', this.options.noResizeWidth)
		.data('maxWidth', this.options.maxWidth);

	if(dialog.data('modal')){
		dialog.addClass('modal');
	}
	
	var frame = $('<div>').attr('class', 'sm_frame');
    var header = $('<div>').attr('class', 'sm_header');
	
    if(this.options.title){
        var caption = $('<div>')
            .attr('class', 'sm_caption')
            .text(this.options.title);
        $(header).append(caption);
    }
	
    var close = $('<a>')
        .attr('class', 'sm_close')
        .attr('href', 'javascript:;')
		.click(function(){
			$(this).destroyDialog();
		})
        .html('\u00D7');
    var contentBox = $('<div>').attr('class', 'sm_content');
    var content = $('<div>')
		.append($('<div>')
			.addClass('spinner')
		);
    
    $(frame)
        .append($(header).append(close))
        .append($(contentBox).append(content));

	$(dialog).append(frame);
	

	if(dialog.data('modal')){
		dialog.addClass('modal');
	}
	else{
		dialog.addClass('dialog');
		dialog.draggable({handle: header, stack: {group: '.dialog', min: 0}});
	}
	
	$('body').append(dialog);
	
	return dialog;
}

sifntDialog.prototype.showDialog = function(dialog){
	dialog.centreDialog();
	dialog.fadeTo(this.options.fadeIn,1);
}

sifntDialog.prototype.centreDialog = function(id){
	var dialog;
	if($(id).hasClass('.sm_window')){
		dialog = $(id);
	}
	else{
		dialog = $(id).closest('.sm_window');
	}
	
    var header = dialog.find('div.sm_header');
    var contentBox = dialog.find('div.sm_content');
    var content = contentBox.find('div:first');

	var vp = this.getSize(window);
	var contentBoxSize = this.getSize(contentBox);
	var contentSize = this.getSize(content);
	
	if(dialog.data('maxWidth')){
		dialog.css('width', dialog.data('maxWidth') + 'px');
	}

    if(contentSize.height > vp.height - 90){
        $(contentBox).css('height', vp.height - 60 + 'px');
    }
    else{
        $(contentBox).css('height', 'auto');
    }
    
	if(!dialog.data('noResizeWidth')){
		$(contentBox).css('width', 'auto');
		
		if(contentSize.height > vp.height - 90){
			$(contentBox).css('width', contentSize.width + 30 + 'px');
		}
	}
	else{
		$(contentBox).css('width', 'auto');
	}
    
    var windowSize = this.getSize(dialog);

	dialog.css('left', (vp.width - windowSize.width)/2 + 'px');
	dialog.css('top', (vp.height-windowSize.height)/3 + 'px');
}

sifntDialog.prototype.darkenPage = function(){
	var cover = $('<div>')
		.addClass('sm_cover')
		.fadeTo(0,0)
		.click(function(){
			$(this).destroyDialog($(this).nextAll('.sm_window'));
		});
	$('body').append(cover);
	cover.fadeTo(this.options.fadeInModal,0.5);
}

sifntDialog.prototype.destroy = function(id){
	if($(id).hasClass('sm_window')){
		var container = $(id);
	}
	else{
		var container = $(id).closest('div.sm_window');
	}
	
	if(container.data('modal')){
		container.prev('.sm_cover').fadeTo(this.options.fadeOutModal, 0, function(){$(this).remove();});
	}
	
	container.fadeTo(this.options.fadeOut, 0, function(){$(this).remove();});
	
	if(this.options.onClose){
		this.options.onClose();
	}
}

sifntDialog.prototype.getSize = function(id){
	var size = {
        width: $(id).width(),
        height: $(id).height()
    };
	
	return size;
}

sifntDialog.prototype.disableClose = function(id){
	id.find('.sm_close').hide();
	id.prev().unbind('click');
}

// Initialize
var Dialog = new sifntDialog();

// Setup some global jQuery functions
$.fn.extend({
	destroyDialog: function(id){
		if(id){
			Dialog.destroy(id);
		}
		else{
			Dialog.destroy(this);
		}
	}
});
$.fn.extend({
	centreDialog: function(id){
		Dialog.centreDialog(this);
	}
});
$.fn.extend({
	disableClose: function(id){
		if(id){
			Dialog.disableClose(id);
		}
		else{
			Dialog.disableClose(this);
		}
	}
})

// Watch for window size changes
$(window).resize(function(){
	$('div.sm_window').each(function(){
		Dialog.centreDialog(this);
	});
});

// sifntModal Compatibility Layer
function sifntModal(){
    this.dimFadeIn = 0;
    this.dimFadeOut = 200;
    this.windowFadeIn = 0;
    this.windowFadeOut = 200;
	this.options = {};
}

sifntModal.prototype.show = function(href, options){
	var parameters = {
		load: {url: href},
		modal: true
	}
	
	if(options.title){
		$.extend(parameters, {title: options.title});
	}
	if(options.onLoad){
		$.extend(parameters, {onComplete: options.onLoad});
	}
	if(options.addClass){
		$.extend(parameters, {addClass: options.addClass});
	}
	if(options.parameters){
		$.extend(true, parameters, {load: {data: options.parameters}});
	}
	if(options.noResizeWidth){
		$.extend(parameters, {noResizeWidth: true});
	}
	if(options.maxWidth){
		$.extend(parameters, {maxWidth: options.maxWidth});
	}
	
	var Modal = Dialog.newDialog(parameters);
	
	return false;
}

sifntModal.prototype.centerFloat = function(){
	Dialog.centreDialog($('.sm_window:last'));
}

sifntModal.prototype.hide = function(id){
	$(id).destroyDialog();
}

sifntModal.prototype.disableClose = function(id){
	$(id).disableClose();
}

$(function(){
	Modal = new sifntModal();
});
