/*
* Window
*/

Class.createNameSpace('ps.ui');
ps.ui.Window =  ps.util.event.Listenable.extend({


	title : '',

	options : null,
	
	elements : null,

	showing : false,

	initialize : function(title, options){
		//Object.extend(this.options.copy(), options);
		
		this.options = {

			width : 500,
			height: null,

			closeButton : true,
			shadowMode : 'drop', //possible values: 'border', 'drop', 'none'

			className : 'defaultWindow',
			shadowClassName : 'defaultWindowShadow'
		}
		Object.extend(this.options, options);
		
		this.elements = {
			outer : null,
			inner : null,
			titlebar : null,
			iconbox : null,
			shadow : null,
			iframe : null
		};
				
		this.elements.outer = new Element('div');
		this.elements.outer.className = this.options.className;
		this.elements.outer.style.width = this.options.width+'px';

		this.elements.inner = new Element('div');
		this.elements.inner.className = 'inner';
		this.elements.inner.style.width = this.options.width+'px';
		if (this.options.height != null) this.elements.inner.style.height = this.options.height+'px';
		
		this.elements.titlebar = new Element('div');
		this.elements.titlebar.className = 'header';
		this.setTitle(title);
		
		this.elements.iconbox = new Element('span');
		this.elements.iconbox.className = 'iconbox';
		if (this.options.closeButton) this.addIconButton('/images/new/embed-side-close.gif', this.hide.bind(this));
		
		this.elements.outer.appendChild(this.elements.iconbox);
		this.elements.outer.appendChild(this.elements.titlebar);
		this.elements.outer.appendChild(this.elements.inner);
		
		this.elements.shadow = new Element('div');
		this.elements.shadow.className = this.options.shadowClassName;
		
		this.elements.shadow.style.display = 'none';
		document.body.appendChild(this.elements.shadow);
		this.elements.outer.style.display = 'none';
		document.body.appendChild(this.elements.outer);

	},
	
	setSize : function(w,h){
		this.options.width = w;
		this.options.height = h;
		this.elements.inner.style.width = this.options.width+'px';
		this.elements.outer.style.width = this.options.width+'px';
		this.recenter();
	},
	
	/*
	*	Sets title of window
	*/
	setTitle : function(title){
		this.title = title;
		this.elements.titlebar.innerHTML = title;
	},
	
	/*
	*	Sets HTML content
	*/
	setContentHTML : function(html){
		if ($type(html) == 'string') {
			
			this.elements.inner.innerHTML = html;
		
		} else {
			
			this.elements.inner.innerHTML = '';
			this.elements.inner.appendChild(html);
		
		}

		this.recenter();
	},
	
	/*
	*	Load content from URL. 
	*/
	setContentURL : function(url, useframe){
		if (typeof useframe == 'undefined') useframe = true;
		
		if (!useframe){
			var options = {
				method : 'get',
				onComplete : this.contentLoaded.bind(this)
			}
		
			new Ajax(url, options).request();
		} else {
			
			if (this.elements.iframe == null) this.elements.iframe = new Element('iframe');
			
			this.elements.iframe.src = url;
			if (this.options.height!=null) this.elements.iframe.style.height = this.options.height+'px';
			
			this.elements.inner.innerHTML = '';
			this.elements.inner.appendChild(this.elements.iframe);
			
		}
		
		this.recenter();
		
	},
	
	contentLoaded : function(text){
		this.setContentHTML(text);
	},
	
	/*
	*	Adds an icon to the icon bar
	*/
	addIconButton : function(src,callback){
		var img = new Element('img');
		img.src = src;
		img.onclick = callback;
		
		this.elements.iconbox.appendChild(img);
	},
	
	/*
	*	Shows the window
	*/
	show : function(){
		if (this.showing) return;
		
		this.elements.outer.style.zIndex = (ps.ui.Window.nwindows * 2) + 10;
		this.elements.shadow.style.zIndex = (ps.ui.Window.nwindows * 2) + 9;
		ps.ui.Window.nwindows++;
		
		this.onShow();
		this.elements.outer.style.visibility = 'hidden';
		this.elements.outer.style.display = '';		
		this.recenter();
		
		this.showing = true;
	},
	
	/*
	*	Hides the window
	*/
	hide : function(){
		if (!this.showing) return;
		
		this.elements.outer.style.display = 'none';
		this.elements.shadow.style.display = 'none';
		this.onHide();
		
		this.showing = false;	
	},
	
	/*
	*	Removes the window from the DOM and deletes it
	*/
	destroy : function(){
		this.elements.outer.remove();
		this.elements.shadow.remove();
		delete this.elements;
	},
	
	/*
	*	Recenters the window after the content has been updated.
	*/
	recenter : function(){
		
		var winWidth = window.getWidth();
		var winHeight = window.getHeight();
		var coords = this.elements.outer.getCoordinates();
		
		var x = (winWidth/2)-(coords.width/2);
		var y = (winHeight/2)-(coords.height/2);

		this.elements.outer.style.top = y+'px';
		this.elements.outer.style.left = x+'px';

		this.updateShadow();
		this.elements.outer.style.visibility = '';
		
	},

	updateShadow : function(){
		var winWidth = window.getWidth();
		var winHeight = window.getHeight();
		var coords = this.elements.outer.getCoordinates();

		if (this.options.shadowMode == 'none'){
			return;
		} else if (this.options.shadowMode == 'border'){
			this.elements.shadow.style.top = coords.top-10+'px';
			this.elements.shadow.style.left = coords.left-10+'px';
			this.elements.shadow.style.width = coords.width+20+'px';
			this.elements.shadow.style.height = coords.height+20+'px';
		} else 	if (this.options.shadowMode == 'drop'){
			this.elements.shadow.style.top = coords.top+5+'px';
			this.elements.shadow.style.left = coords.left+5+'px';
			this.elements.shadow.style.width = coords.width+'px';
			this.elements.shadow.style.height = coords.height+'px';
		}
		
		this.elements.shadow.style.display = '';
	},
	
	/*
	*	Stubs
	*/
	onShow : function(){},
	onHide : function(){},
	onClose : function(){}
	
	
});
ps.ui.Window.nwindows = 0;
