/** Prototype Dialog by Ed Shortt **/

var dialog_zindex = 9000;

function dialog(options)
{
	var self = this;
	this.id  = 'dlg'+Math.floor(Math.random()*1100);
	this.options = [];
	
	this.construct = function(options)
	{
		if (typeof(options.closeable) == 'undefined') { options.closeable = true; }
		if (typeof(options.autoscroll) == 'undefined') { options.autoscroll = true; }
		if (typeof(options.autosize) == 'undefined') { options.autosize = true; }
		
        if (typeof(options.id) != 'undefined') { self.id = options.id; } 
        
        //parent.console.log(options);
		self.options = options;
		dialog_zindex = dialog_zindex+10;
		self.zindex = dialog_zindex;
		
		self.render_overlay();
		self.render_dialog();
        
		self.center();
		
		Event.observe(document.onresize ? document : window, "resize", self.center);
		Event.observe(document.onresize ? document : window, "scroll", self.center);
        
		if (options.closeable) {
			document.observe('keyup', self.event_keyup);
		}
        if (options.onrendered) { options.onrendered(self.id, self); }
		self.focus_first();
	}
	
    this.resize_overlay = function()
    {
        var ps = self.get_page_size(), sc = self.get_page_scroll();
        var w  = ps[0]+sc.x, h = ps[1]+sc.y;
        var css = {width:w+'px',height:h+'px'};
        var ov = $(self.id+'overlay');
        var ifr = $(self.id+'iframe');
        if (ov) { ov.setStyle(css); }
        if (ifr) { ifr.setStyle(css); }
    }
    
	this.render_overlay = function()
	{
		var height = self.get_page_size()[1];
		var zindex = parseInt(self.zindex);
		var source = /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank';
		var styles = 'border:none;margin:0;padding:0;position:absolute;width:100%;height:'+height+'px;top:0;left:0';		
		var iframe = [];
		var IE6 = false /*@cc_on || @_jscript_version <= 5.7 @*/;false /*@cc_on || @_jscript_version <= 5.7 @*/;
		if (IE6) {
			iframe.push('<iframe class="dialog-overlay-iframe" id="'+self.id+'iframe" ');
			iframe.push('style="z-index:'+(zindex+1)+';display:none;'+styles+'" ');
			iframe.push('src="'+source+'"></iframe>');
		}
		var overlay = [];
		overlay.push('<div class="dialog-overlay" id="'+self.id+'overlay" ');
		overlay.push('style="z-index:'+(zindex+2)+';display:none;'+styles+'"></div>');		
		$$('body').first().insert({top:iframe.join('')+overlay.join('')});
		if (IE6) { $(self.id+'iframe').setOpacity(0.0).show(); }
		$(self.id+'overlay').setOpacity(0.5).show();        
	}
	
	this.render_dialog = function()
	{
		var html = [];
		var css  = [];
		//if (self.options.hide) { css.push('display:none'); }
		if (self.options.width) { css.push('width:'+self.options.width+'px'); }
		if (self.options.height) { css.push('height:'+self.options.height+'px'); }
        css.push("top:-9000px");
		css.push("z-index:"+(parseInt(self.zindex)+3));
		css = (css.length) ? ' style="'+css.join(';')+'"' : '';
		html.push('<div id="'+self.id+'" class="dialog-frame"'+css+'>');
		html.push('<div id="'+self.id+'wrap" class="dialog-wrap">');
		html.push('<div id="'+self.id+'titlebar" class="dialog-titlebar">');
		var noclose = (self.options.closeable) ? '' : ' style="display:none"';
		
		//html.push('<div id="'+self.id+'close" class="dialog-close"'+noclose+'>&nbsp;X&nbsp;</div>');
		html.push('<div id="'+self.id+'close" '+noclose+'><div id="dialog-close"><span>close</span></div></div>');
		
		//html.push(self.options.title);
		html.push("<div class='dialog-title'>"+self.options.title+"</div>");

		html.push('</div>');
		var h = '';
		if (self.options.height) { h = ' style="height:'+self.options.height+'"'; }
		html.push('<div id="'+self.id+'content" class="dialog-content" style="position:relative">');
		html.push(self.options.content);
		html.push('</div>');
		var buttons = self.options.buttons;
		if (buttons) {
			var left  = [];
			var right = [];
			for (var i = 0; i < buttons.length; i++) { 
				var button = buttons[i];
				if (button.align) { 
					if (button.align == 'left') { 
						left.push(button);
						continue;
					}	
				}
				right.push(button);
			}
			html.push('<div class="dialog-footer" id="'+self.id+'footer">');
			html.push('<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr>');
			html.push('<td align="left" class="dialog-left-buttons">');
			for (var i = 0; i < left.length; i++) {
				var button = left[i];
				var hidden = (button.hidden) ? ' style="display:none"' : '';
				html.push('<a class="dlg-button btn_'+i+'" '+style+'href="#"'+hidden+'>'+button.text+'</a>');
			}
			html.push('</td><td align="right" class="dialog-right-buttons">');
			for (var i = 0; i < right.length; i++) {
				var button = right[i];
				var hidden = (button.hidden) ? ' style="display:none"' : '';
				html.push('<a class="dlg-button btn_'+i+'" href="#"'+hidden+'><span>'+button.text+'</span></a>');
			}
			html.push('</td></tr></table>');
		}
		html.push('</div>');
		
		document.body.insert({top:html.join('')});
		if (self.options.closeable) {
			$(self.id+'close').observe('click', self.close);
		}
		if (buttons) {
			$(self.id+'footer').select('.dlg-button').invoke('observe', 'click', self.button_click);
		}
	}
	
	this.remove_overlay = function()
	{
		var div = $(self.id+'overlay');
		var ifr = $(self.id+'iframe');
		if (div) { div.remove(); }
		if (ifr) { ifr.remove(); }
	}
	this.remove_dialog = function()
	{
		try {
			$(self.id).remove();
		} catch(e){}
	}
	
	this.close = function(val)
	{
        var force = (typeof(val) != 'undefined' && val == 'FORCE') ? true : false;
		if (!self.options.closeable && !force) { return; }
		
		self.remove_overlay();
		self.remove_dialog();
		
		document.stopObserving('keyup', self.keyup);
        Event.stopObserving(document.onresize ? document : window, "resize", self.center);
        Event.stopObserving(document.onresize ? document : window, "scroll", self.center);
		if (self.options.onclose) { self.options.onclose(self, val); }
	}
	
	this.center = function()
	{
		var frm = $(self.id);
        try {
            var dims = frm.getDimensions();
        } catch(e) { return; }
        var vp   = self.get_viewport_size();
        var hh   = vp.height, ww = vp.width;
        var scroll = self.get_page_scroll();
        
        var box = {};
        
        try {
            if (dims.height > hh) { 
                var h = ((hh-160) > 20) ? hh-160 : 20;
                try {
                    var css = {height:h+'px'};
                    if (self.options.autoscroll) { 
                        css['overflowX'] = 'hidden'; 
                        css['overflowY'] = 'auto'; 
                    }
                    $(self.id+'content').setStyle(css);
            } catch(e) { return; }
            self.center();
            return;
            } 
            if (dims.width > ww) { 
                var w = ((ww-20) < 400) ? ww-20 : 400;
                try {
                    $(self.id).setStyle({width:w+'px'});
            } catch(e) { return; }
            self.center();
            return;
            } 
        } catch(e) { return; }
        
        
        var top  = ((hh/2)-(dims.height/2))+scroll.y;
		var left = ((ww/2)-(dims.width/2))+scroll.x;
        var css  = {top:top+'px', left:left+'px'};
		frm.setStyle(css);   
        self.resize_overlay();
	}
	
	this.focus_first = function()
	{
		//focus the first control element in the dialog
		var ipt = $(self.id).select('.textfield').first();
		if (ipt) { ipt.focus(); }
		else {
			$(self.id).insert({top:'<input id="'+self.id+'_focus" type="text" style="position:absolute;top:-200px;">'});
			$(self.id+'_focus').focus();
		}
	}
	
	this.is_top_dialog = function()
	{
		var zindex = self.zindex+2;
		var top    = true;
		$$('.dialog-frame').each(function(el){
				if (el.id != self.id) {
					if (parseInt(el.getStyle('zIndex')) > zindex)  { top = false; }
				}
		});
		return top;
	}
	
	//Events
	this.button_click = function(ev)
	{
		var el = ev.element();
		while (el.tagName.toUpperCase() != 'A') { el = el.up('A'); }
		var num = $w(el.className)[1].split('_')[1];
		var button = self.options.buttons[num];
		var val = (button.result) ? button.result : null;
		if (button.onclick) { button.onclick(self, val); }
		else {			
			self.close(val);
		}
	}
	
	this.event_keyup = function(ev)
	{
		if (Event.KEY_ESC != ev.keyCode) { return; }
		if (!self.is_top_dialog()) { return; }
		self.close(); 
		ev.stop();
		return false; 
	}
	
	this.event_click = function()
	{
		self.close();
	}
	
	//---------- Utility -----------------
    this.get_viewport_size = function() 
    {
        var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
        var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
        return {height:h, width:w};
    }    
    
	this.get_page_scroll = function()
	{
        var scrOfX = 0, scrOfY = 0;
        if( typeof( window.pageYOffset ) == 'number' ) {
            //Netscape compliant
            scrOfY = window.pageYOffset;
            scrOfX = window.pageXOffset;
        } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
            //DOM compliant
            scrOfY = document.body.scrollTop;
            scrOfX = document.body.scrollLeft;
        } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
            //IE6 standards compliant mode
            scrOfY = document.documentElement.scrollTop;
            scrOfX = document.documentElement.scrollLeft;
        }
        return {x:scrOfX, y:scrOfY};
	}
	
	this.get_page_size = function()
	{
		var h,w;
		if (window.innerHeight && window.scrollMaxY) {
			h = window.innerHeight + window.scrollMaxY;
			w = document.body.scrollWidth;
		}
		else if(document.body.scrollHeight > document.body.offsetHeight) {
			h = document.body.scrollHeight;
			w = document.body.scrollWidth;
		}
		else {
			h = document.body.offsetHeight + document.body.offsetTop;
			w = document.body.offsetWidth;
		}
		return [w, h];
	}
	
	this.construct(options);
}
