function showStyledDialog(target, title, url, showClose, height, width, callback_fn, headerClass, bodyClass, footerClass, frameClass, titleClass, closeClass) {
    var options = {
        center_win: true,
        height: height || 500,
        width: width || 500,
        fullscreen: false,
        target: target,
        callback_fn: callback_fn,
        headerClass: headerClass,
        bodyClass: bodyClass,
        footerClass: footerClass,
        closeClass: closeClass,
        titleClass: titleClass,
		showClose:showClose,
		frameClass:frameClass,
		title:title
    }
	win = Dialog.addInstance(target, options);
    return win.show(url, title, showClose);
}
function getDialog(target){
	for(var i=0; i<Dialog.instances.length; i++){
		if(Dialog.instances[i].item.target==target){
			return Dialog.instances[i].item;
		}
	}
}
Dialog = new Class({
    initialize: function(options) {
        //this.overlay_click_close = false;
        this.callback_fns = [];
        Utilities.update(this, options);
        this.addCallback(this.callback_fn);
    },

    addCallback: function(fn) {
        if(fn) this.callback_fns.push(fn);
    },
    show: function(url, title, showClose) {
		this.showLoading();
        this.url = url;
		if(title!=null)this.title = title;
		if(showClose!=null)this.showClose = showClose;
        this.createElements();
		Dialog.onShow(this);
        return false;
    },
    hide: function() {
        var c_bs = this.callback_fns;
        if(c_bs != []) {
            Utilities.map(c_bs, function(fn) { 
                fn();
            });
        }
		Dialog.onHide(this);
		this.g_window.remove();
        this.removeFrame();
		var myThis = this;
    },
    update: function(overlayWidth, overlayHeight) {
        if(this.fullscreen) {
            this.width = Math.round(overlayWidth - (overlayWidth/100)*10);
            this.height = Math.round(overlay_h - (overlayHeight/100)*10);
        }
        this.setWindowPosition();
    },
    createElements: function() {
        Dialog.staticInit();
		if(this.g_window==null){
			this.g_window = new Element('div');
			this.g_window.setProperty('id','Dialog_window');
			this.g_window.setStyle("visibility","hidden");
			this.g_window.injectInside($E('body'));
		}

        this.initFrame();
        this.initHook();
        this.update();
    },
    removeFrame: function() {
        try{this.iframe.remove();}
        catch(e){}
        this.iframe = null;
    },
    startLoading: function() {
		// IE <6 doesn't support events for iframe
		version=null
		if (navigator.appVersion.indexOf("MSIE")!=-1){
			temp=navigator.appVersion.split("MSIE")
			version=parseFloat(temp[1])
		}
		if(version!=null && version<6){
			this.showIFrame();
		}else{
			this.showLoading();
		}
        this.iframe.setProperty("src",this.url);
    },
	showLoading: function(){
		if(this.iframe)this.iframe.setStyle("display","none");
		if(this.loading_cnt)this.loading_cnt.setStyle("display","block");
	},
	showIFrame: function(){
		if(this.iframe)this.iframe.setStyle("display","block");
		if(this.loading_cnt)this.loading_cnt.setStyle("display","none");
	},
    initFrame: function() {
        if(!this.iframe) {
			this.iframe = new Element("iframe");
			this.iframe.setProperty("name",'GB_frame');
			this.iframe.setProperty("class",this.frameClass);
			this.iframe.setProperty("frameBorder",0);
			this.iframe.setProperty("allowTransparency",true);
			var myThis = this;
			var callback = function(){
				myThis.showIFrame();
			}
			this.iframe.addEvent("load",callback);
			this.iframe.addEvent("readystatechange",callback);
			
			this.middle_cnt = new Element("div");
			this.middle_cnt.setProperty("class",this.bodyClass);
			this.middle_cnt.setStyle("width",this.width+"px");
			
			this.top_cnt = new Element("div");
			this.loading_cnt = new Element("div");
			this.loading_cnt.setProperty("id","Dialog_loadingFrame");
			this.bottom_cnt = new Element("div");
			
			this.top_cnt.injectInside(this.g_window);
			this.middle_cnt.injectAfter(this.top_cnt);
			this.bottom_cnt.injectAfter(this.middle_cnt);
			
			this.iframe.injectInside(this.middle_cnt);
			this.loading_cnt.injectAfter(this.iframe);
			this.iframe.setStyle("display","none");
			
			this.titleDiv = new Element('div');
			this.titleDiv.injectInside(this.top_cnt);
			
			this.closeDiv =  new Element("div");
			this.closeDiv.injectInside(this.top_cnt);
        }
    },
    initHook: function() {
		if(this.headerClass!=null){
			this.top_cnt.setProperty("class",this.headerClass);
			this.top_cnt.setStyle("width",this.width+"px");
		}
		this.titleDiv.setProperty("class",this.titleClass);
		if(this.title)this.titleDiv.setHTML(this.title);
		else this.titleDiv.setHTML("");
		
		var show = (this.showClose==true || this.showClose==null);
        if(this.closeClass && show) {
			this.closeDiv.setProperty('class',this.closeClass);
			var switchClass = function(to){
				this.closeDiv.setProperty("class",to);
			}
			var myThis = this;
			this.closeDiv.addEvent('mouseover',function() {myThis.closeDiv.addClass(this.closeClass+':hover'); });
			this.closeDiv.addEvent('mouseout',function() {myThis.closeDiv.removeClass(this.closeClass+':hover');myThis.closeDiv.removeClass(this.closeClass+':down');});
			this.closeDiv.addEvent('mousedown',function() {myThis.closeDiv.addClass(this.closeClass+':down'); });
			this.closeDiv.addEvent('click',function() {myThis.hide(); });
        }else{
			this.closeDiv.setProperty('class',"");
		}
		
		if(this.footerClass!=null){
			this.bottom_cnt.setProperty("class",this.footerClass);
			this.bottom_cnt.setProperty('width',this.width+"px");
		}
		var middleHeight = Math.max(this.height-parseInt(this.top_cnt.getStyle('height'))-parseInt(this.bottom_cnt.getStyle('height')),0);
		this.middle_cnt.setStyle('height',middleHeight+"px");
		this.loading_cnt.setStyle('height',middleHeight+"px");

        if(this.fullscreen){
			window.addEvent('scroll', setWindowPosition);
		}
		Extensions.divsChanged();
    },

    setWindowPosition: function() {
		this.g_window.setStyle("left",(((window.getWidth() - this.width)/2)-13)+"px");
        if(!this.center_win) {
			this.g_window.setStyle("top",window.getScrollTop()+"px");
        } else {
            var fl = ((window.getHeight() - this.height) /2) - 20 + window.getScrollTop();
            if(fl < 0)fl = 0;
			this.g_window.setStyle("top",fl+"px");
        }
    }
});

// static members
Dialog.overlayAlpha = 0.5;
Dialog.currentAlpha = 0;
Dialog.instances = [];
Dialog.inited = false;
Dialog.stack = [];
Dialog.staticInit = function(){
	if(!Dialog.inited){
		Dialog.inited = true;
		if(Dialog.overlay==null){
			Dialog.overlay = new Element('div');
			Dialog.overlay.setProperty('id','Dialog_overlay');
			Dialog.overlay.setHTML("&nbsp;"); //Safari bugfix
			Dialog.overlay.setOpacity(0);
			Dialog.overlay.injectInside($E('body'));
		}
		window.addEvent("scroll",function(){Dialog.onScroll();});
		window.addEvent("resize",function(){Dialog.onResize();});
		Dialog.onScroll();
	}
}
Dialog.onScroll = function(){
	if(window.gecko) Dialog.overlay.setStyle("width","100%");
	else Dialog.overlay.setStyle("width",window.getWidth()+"px");

	var max_height = Math.max(window.getScrollTop()+window.getHeight(), window.getScrollTop()+this.height);
	if(max_height < window.getScrollTop()){
		Dialog.overlay.setStyle("height",max_height+"px");
	}else{
		Dialog.overlay.setStyle("height",(window.getScrollTop()+window.getHeight())+"px");
	}
}
Dialog.onResize = function(){
	Dialog.onScroll();
	var overlayWidth = this.overlay.getStyle('width').toInt();
	var overlayHeight = window.getHeight();
	for(var i=0; i<Dialog.instances.length; i++){
		var dialogBox = Dialog.instances[i];
		if(dialogBox && dialogBox.update)dialogBox.update(overlayWidth, overlayHeight);
	}
}
Dialog.addInstance = function(target, options){
	var dialogBox = null;
	for(var i=0; i<Dialog.instances.length; i++){
		if(Dialog.instances[i].target==target){
			var dialogBox = Dialog.instances[i];
		}
	}
	if(!dialogBox){
		dialogBox = new Dialog(options);
		Dialog.instances.push({item:dialogBox,shown:false});
	}
	return dialogBox;
}
Dialog.onShow = function(dialogBox){
	Dialog.stack.push(dialogBox);
	Dialog.staticInit();
	var depth = 0;
	for(var i=0; i<Dialog.instances.length; i++){
		var item = Dialog.instances[i].item;
		if(item == dialogBox){
			Dialog.instances[i].shown = true;
		}
		depth = Math.max(depth,Dialog.instances[i].item.g_window.getStyle("z-index").toInt());
	}
	if(depth!=null)dialogBox.g_window.setStyle("z-index", depth+1)
	if(Dialog.currentAlpha != Dialog.overlayAlpha && overlayAlpha){
		var dialog = dialogBox;
		var tween = new Fx.Style(Dialog.overlay, 'opacity', {duration:300,
								 onComplete:function() {
									dialog.g_window.setStyle("visibility","visible");
									dialog.startLoading();
								}});
		tween.start(Dialog.currentAlpha,Dialog.overlayAlpha);
		Dialog.currentAlpha = Dialog.overlayAlpha;
	}else{
		dialogBox.g_window.setStyle("visibility","visible");
		dialogBox.startLoading();
	}
}
Dialog.hide = function(){
	Dialog.stack[Dialog.stack.length-1].hide();
}
Dialog.onHide = function(dialogBox){
	if(Dialog.stack[Dialog.stack.length-1]==dialogBox)Dialog.stack.splice(Dialog.stack.length-1,1);
	var stillOverlay = false;
	var i=0;
	while(i<Dialog.instances.length){
		var item = Dialog.instances[i].item;
		if(item == dialogBox){
			//Dialog.instances[i].shown = false;
			Dialog.instances.splice(i,1);
		}else if(item && Dialog.instances[i].shown){
			stillOverlay = true;
			i++;
		}else{
			i++;	
		}
	}
	if(!stillOverlay){
		var tween = new Fx.Style(Dialog.overlay, 'opacity', {duration:300});
		tween.start(Dialog.currentAlpha, 0);
		Dialog.currentAlpha = 0;
	}
}