function getOptionValue( option, options )
{
    var result = "";
    
    var exp = new RegExp(option+":"+"([^;]+)");
    var match = options.match(exp);
    if ( match != null ) {
        result = match[1];
    }
    return result;
}

function createPopUpMask( background )
{
    var popupHTML;

	if ($('popup-mask')==null) {
    	var window = document.body.getDimensions();
        popupHTML = "<div id=\"popup-mask\"></div>";
        Element.insert(document.body, popupHTML );
	    $('popup-mask').setStyle({ background: background });
	    $('popup-mask').setStyle({ width: window.width+'px' });
	    $('popup-mask').setStyle({ height: window.height+'px' });
        $('popup-mask').absolutize();
	    $('popup-mask').setStyle({ top: '0px' });
	    $('popup-mask').setStyle({ left: '0px' });
        $('popup-mask').setOpacity(0.75); 
    }
}

function showPopUp( name, title, text, options )
{
    if ( createPopUp( name, title, text, options ) ) {
        realisePopUp( name, options );
    }
}

function createPopUp( name, title, text, options )
{
    var result = false;
    var popupHTML;
    var hide = (options && options.find("hide"));
    var modal = (options && options.find("modal"));
    var popupName = modal?"modal-popup":(name+"-dialog");

    if ( $(popupName) ) {
		Effect.Pulsate(popupName);
	}
	else {
        if ( options && options.find("mask") ) {
            createPopUpMask( getOptionValue( "mask", options ) );
        }

	    if (!modal || $('modal-popup')==null) {
            popupHTML = "<div id=\""+popupName+"\"><div id=\""+name+"\"><div id=\"title\"><a mousetext=\"Close\" href=\"JavaScript:closePopUp("+(modal?"":("'"+name+"'"))+")\">X</a>"+title+"</div><div id=\""+name+"-content\">"+text+"</div></div></div>";
            Element.insert(document.body, popupHTML );
	        $(popupName).setStyle({ width: $(name).getWidth()+'px' });
            if ( hide ) {
                $(popupName).hide();
            }
            $(popupName).absolutize();
            $(popupName).center();
        }
        
        result = true;
    }
            
    return result;
}

function realisePopUp( name, options )
{
    var modal = (options && options.find("modal"));
    var draggable = !(options && options.find("nodrag"));
    var popupName = modal?"modal-popup":(name+"-dialog");
    
    if ( !$(popupName) ) {
        alert("ERROR: Dialog \""+popupName+"\" not found and cannot be realised, check the options passed.");
    }
    else {
        $(popupName).relativize();
        $(popupName).show();
        $(popupName).absolutize();
        $(popupName).center(10,10);
        $(popupName).render(name, "top transparent");
        if ( draggable ) {
            new Draggable($(popupName));
        }
        if ( modal ) {
            setTimeout("Event.observe(document,'click',focusOnPopUp)",1000);
        }
    }
}

function closePopUp( name )
{
    var popupName = name==null?"modal-popup":(name+"-dialog");
    if ( $(popupName) ) {
        Effect.SwitchOff(popupName);
        setTimeout("Element.remove($('"+popupName+"'))",1000);
	    if ($('popup-mask')!=null) {
            Effect.Fade('popup-mask', { duration: 0.5 });
            setTimeout("Element.remove($('popup-mask'))",1000);
        }
        if ( name == null ) {
            Event.stopObserving(document,'click',focusOnPopUp);
        }
    }
}

function focusOnPopUp(e) {
	var el = ((e.target) ? e.target : e.srcElement);

	if (Element.visible('modal-popup')) {
		if (el.id != 'modal-popup') {
			var childNode = false;
		    if (el.id != 'modal-popup' && el.tagName != 'BODY' && el.tagName != 'HTML') {
			    for (var child = el.parentNode; child.tagName != 'BODY' && child.tagName != 'HTML'; child = child.parentNode) {
				    if (child.id == 'modal-popup') {
					    childNode = true;
					    break;
				    }
			    }
			}
			if (!childNode) {
				Event.stop(e);
				Effect.Pulsate('modal-popup');
			} else {
				el.focus( );
			}
		} else {
			el.focus( );
		}
	} else {
		el.focus( );
	}
}

function initDialogs()
{
    Element.addMethods({   
		center: function ( element, limitX, limitY ) {
			var elementDims = $(element).getDimensions();
			var viewPort = document.viewport.getDimensions();
			var offsets = document.viewport.getScrollOffsets();
			var centerX = viewPort.width / 2 + offsets.left - elementDims.width / 2;
			var centerY = viewPort.height / 2 + offsets.top - elementDims.height / 2;
			if ( limitX && centerX < limitX )
			{
				centerX = parseInt(limitX);
			}
			if ( limitY && centerY < limitY )
			{
				centerY = parseInt(limitY);
			}
			
			element.setStyle( { position: 'absolute', top: Math.floor(centerY) + 'px', left: Math.floor(centerX) + 'px' } );
			
			return element;			
		}
    }); 
    Element.addMethods({   
        render: function(element, name, options) { 
            element = $(element);     
            Nifty( "div#"+name, options );
            return element;   
       } 
    }); 
}

initDialogs();
