widgets.dialog=Class.create();

Class.inherits(widgets.dialog.prototype,{
/*
	props={
		id:id,
		x:x,
		y:y,
		css:cssString,
		className:className,
		defaultX:x,
		defaultY:y,
		hidden:true/false,
		backingClass:className (modal-only),
		autoClose:false, (whether to auto-close when clicking anywhere outside the modal.  non-modal only)
		autoHide:true (if autoclose is turned on, true=hide, false=remove)
	}
*/
	init:function(props, modal, lock){
		
		this.create(props);
		this.backer=null;
		var _th=this;
		if(modal){
			this.makeModal();
		}
		else if(this.autoClose){
			var eId=this.id.replace('-','_')+'autoClose';
			Events.add(eId,"click",function(e,el){
				if(_th.skipEvent){
					_th.skipEvent=false;
				}
				else{
					var elem=e.target;				
					if(!DOM.isDescendantOf(elem,$(_th.id))){
						
						if(_th.autoHide){
							_th.hide();
						}
						else{
							_th.close();
						}			
					}
				}
			});
			this.autoEvent=Events.attach($(document.body),eId);
		}
		this.lockWindow=((isDefined(lock))?lock:false);
		this.createBacker(props);	
		if(this.hidden){
			this.hide()
		}
		else{
			this.show()
		}			
		return this.id;
	},
	create: function(props){
		this.id="Dialog"+(Math.floor(Math.random()*(new Date().valueOf())));
		var xLoc=-10000;
		var yLoc=-10000;
		this.x=xLoc;
		this.y=yLoc;
		this.defaultX=xLoc;
		this.defaultY=yLoc;
		this.hidden=true;
		this.css="position:absolute; z-index:100;";
		this.className="";
		this.autoClose=false;
		this.autoHide=true;
		this.autoEvent=null;
		Class.inherits(this,props,true);
		var _this=this
		var tmp=$e('div',{id:_this.id});
		applyStyle(tmp,this.css);
		addClass(tmp,"Dialog-Main");
		addClass(tmp,this.className);
		document.body.appendChild(tmp);
		setDisplay(this.id,(this.hidden?"none":"block"));
	},
	setContent: function(cont){
		if(isString(cont)){
			setHTML(this.id,cont);
		}
		else{
			$(this.id).appendChild(cont);
		}
		this.matchSize();
	},
	setZ:function(zind){
		setZIndex(this.id,zind);
		if(this.backer){
			setZIndex(this.backer.id,zind-1);
		}
	},
	moveTo: function(x,y){
		this.x=x;
		this.y=y;
		moveObjTo(this.id,x,y);
		this.matchPosition();
	},
	center: function(){
		this.show();
		centerXY(this.id);
		this.x=getLeft(this.id);
		this.y=getTop(this.id);
		this.matchPosition();	
	},
	centerOver: function(targ){
		this.show(true);
		centerOverXY(this.id,targ);
		this.x=getLeft(this.id);
		this.y=getTop(this.id);
		this.matchPostion();	
	},	
	hide: function(){
		moveObjTo(this.id,this.defaultX,this.defaultY);
		setDisplay(this.id,"none");
		this.hidden=true;
		this.hideBack();
	},
	show: function(){
		setDisplay(this.id,"block");
		this.skipEvent=true;
		this.showBack();
		this.hidden=false;
		moveObjTo(this.id,this.x,this.y);
		this.matchPosition();
		
	},
	remove: function(){
		setInnerHTML(this.id,'');
		document.body.removeChild($(this.id));
		this.removeBack();
		if(this.autoEvent!==null){
			Events.detach(this.autoEvent);
		}
		for(var x in this){
			this[x]=void 0;
			delete this[x];
		}				
	},
// backer functions	
	showBack: function(){
		if(this.backer){
			setDisplay(this.backer.id,"block");
			this.fixIePeek(true);
		}
	},
	hideBack:function(){
		if(this.backer){
			moveObjTo(this.backer.id,this.defaultX,this.defaultY);
			setDisplay(this.backer.id,"none");
			this.fixIePeek(false);
		}
	},
	removeBack:function(){
		if(this.backer){
			this.fixIePeek(false);
			$(this.backer.id).onclick=null;
			document.body.removeChild($(this.backer.id));
		}
	},
	getBack:function(){
		if(this.backer){
			return this.backer.id
		}
		return null
	},
	makeModal:function(){
		Class.method(this,"matchSize",function(){
			var el=((bis.smode)?document.documentElement:document.body);
			var wid=((el.scrollWidth>el.clientWidth)?el.scrollWidth:el.clientWidth);
			var hei=((el.scrollHeight>el.clientHeight)?el.scrollHeight:el.clientHeight);
			setHeight(this.backer.id,hei); 
			setWidth(this.backer.id,wid);
		});
		Class.method(this,"matchPosition",function(){
			moveObjTo(this.backer.id,0,0);
		});
		Class.method(this,"createBacker",function(props){
			this.backer={};
			this.backer.id=this.id+"Back";
			var _this=this;
			var css="position:absolute; left:-10000px; top:-10000px; z-index:"+(getStyle(this.id,'z-index')-2);
			var tmp=$e('div',{id:_this.backer.id})
			applyStyle(tmp,css);
			document.body.appendChild(tmp);		
			addClass(this.backer.id,"Modal-Back");
			if(isValidText(props.backingClass)){
				addClass(this.backer.id,props.backingClass);
			}
			this.backer.dialog=this;
			setDisplay(this.backer.id,"none");
			if(!this.lockWindow){
				$(this.backer.id).onclick=function(){_this.hide();}
			}
		});
		// hide all select boxes while the modal layer is showing to prevent it peeking through
		if(bis.ie&&bis.v<7){
			Class.method(this,"fixIePeek",function(tog){
				var tSels=$css("#"+this.id+" select");
				var dSels=$t('select');
				dSels.forEach(function(val){
					var noHide=(tSels)?tSels.some(function(v){return v==val}):false;
					if(!noHide){
						if(tog){
							hide(val);
						}
						else{
							show(val)
						}
					}
						
				});
			});
		}
	},
	fixIePeek:_Empty,
	createBacker:_Empty,
	matchSize:_Empty,
	matchPosition:_Empty
});

if(bis.ie&&bis.v<7){
	Class.inherits(widgets.dialog.prototype,{
		createBacker: function(){
			this.backer=new Object();
			this.backer.id=this.id+"Back";
			var css="position:absolute; left:-5000px; top:-5000px; z-index:"+(getStyle(this.id,'z-index')-2)+"; filter:alpha(opacity=0); background-color:transparent;";
			var tmp=$e('iframe',{src:_SPACER,id:this.backer.id});
			applyStyle(tmp,css);
			this.backer=document.body.appendChild(tmp);
			setDisplay(this.backer.id,'none');
		},		
		matchSize:function(){
			if(this.backer){
				var doTog=false;
				if(getDisplay(this.id)=="none"){
					toggle(this.id);
					doTog=true;
				}
				setWidth(this.backer.id,getFullWidth(this.id));
				setHeight(this.backer.id,getFullHeight(this.id));
				if(doTog){toggle(this.id)}
			}
		},
		matchPosition:function(){
			if(this.backer){
				moveObjTo(this.backer.id,this.x,this.y)
			}
		}
	},true);
}


			
	





