(function()
{
	Common.Object.create('Typical.Chat.Window', {

		screenManager : null,
		data : null,
		
		element : null,
		
		isFocussed : null,
		lastEffect : null,
		
		resizeInfo : null,
		overlap : null,
		dimensionEffects : null,

		onUnfocussedActivity : null,
		onFocus : null,
		onBlur : null,
		onTitleUpdate : null,
		onClose : null,
		
		Window : function(screenManager, data)
		{
			this.screenManager = screenManager;
			
			this.data = Object.extend({ position : 25, size : [150, 250], minSize : [100, 100], maxSize : null, isPrimary : null, title : null, icon : null, cssClass : ''}, data);
			
			this.dimensionEffects = new Effect.ScopedQueue();
			
			this.onUnfocussedActivity = new Common.Dispatcher();
			this.onFocus = new Common.Dispatcher();
			this.onBlur = new Common.Dispatcher();
			this.onTitleUpdate = new Common.Dispatcher();
			this.onClose = new Common.Dispatcher();
			
			this.initGUI();
			this.manageDimensions();
			
			this.screenManager.registerWindow(this);
		},
		
		initGUI : function()
		{
			this.element = Builder.node('div', {'class' : 'typical chat window ' + this.data.cssClass});
			{
				Element.setStyle(this.element, {display : 'none', right : this.data.position + 'px', width : this.data.size[0] + 'px', height : this.data.size[1] + 'px'});
				Element.setOpacity(this.element, 0.95);
				
				/*Event.observe(this.element, 'mousemove', this.handleMouseMove.bindAsEventListener(this));
				Event.observe(this.element, 'mousedown', this.handleMouseDown.bindAsEventListener(this));
				Event.observe(this.element, 'mouseout', this.handleMouseOut.bindAsEventListener(this));
				
				Event.observe(this.element, 'dragstart', Event.stop);*/
			}
			Element.insert(document.body, this.element);
		},
		
		getChat : function()
		{
			return this.screenManager.chat;
		},
		
		setOverlap : function(overlap)
		{
			this.overlap = overlap;
			
			this.manageDimensions();
		},
		
		manageDimensions : function()
		{
			if(!this.overlap)
				return;
				
			if(true || this.data.size[0] < this.overlap.width)
			{
				//this.data.size[0] = 250; //this.overlap.width * 2;
				
				Element.setStyle(this.element, {width: this.data.size[0] + 'px'});
			}
			
			/*if(true || this.data.position + this.data.size[0] < this.overlap.right) 
			{	
				this.data.position = this.overlap.right > this.data.size[0] ? this.overlap.right - this.data.size[0] : 25;
				
				Element.setStyle(this.element, {right : this.data.position + 'px'});
			}*/
		},
		
		setTitle : function(title)
		{
			this.data.title = title;
			
			this.onTitleUpdate.dispatch();
		},
		
		getTitle : function()
		{
			return this.data.title;
		},
		
		getIcon : function()
		{
			return this.data.icon;
		},
		
		isPrimary : function()
		{
			return this.data.isPrimary;
		},
		
		getElement : function()
		{
			return this.element;
		},
		
		blur : function()
		{
			if(!this.isFocussed)
				return;
			
			this.isFocussed = false;
			
			if(this.lastEffect)
				this.lastEffect.cancel();
				
			this.lastEffect = new Effect.Fade(this.element, {duration : 0.0001});
			
			this.onBlur.dispatch(this);
		},
		
		focus : function()
		{
			if(this.isFocussed)
				return;
			
			this.isFocussed = true;
			
			if(this.lastEffect)
				this.lastEffect.cancel();
				
			this.lastEffect = new Effect.Appear(this.element, {to : 0.95, duration : 0.25});

			this.onFocus.dispatch(this);
		},
		
		close : function()
		{
			this.blur();
			
			this.onClose.dispatch(this);
		},
		
		handleMouseOut : function(event)
		{
		},
		
		getResizeDirection : function(event)
		{
			var dir = '';
			
			var handleOffsets = this.getResizeHandleOffsets(event);
			
			if(Math.abs(handleOffsets.top) < 5)
				dir += 'n';
				
			if(Math.abs(handleOffsets.left) < 5)
				dir += 'w';
				
			else if(Math.abs(handleOffsets.right) < 5)
				dir += 'e';
			
			return dir != '' ? dir : null;
		},
		
		getResizeHandleOffsets : function(event)
		{
			var offset = Element.cumulativeOffset(this.element);
			var mouse = [Event.pointerX(event), Event.pointerY(event)];
			
			return { left : mouse[0] - offset[0], top : mouse[1] -  offset[1], right: offset[0] + Element.getWidth(this.element) - mouse[0]};
		},
		
		handleMouseMove : function(event)
		{
			var resizeDir = this.getResizeDirection(event);
			
			Element.setStyle(this.element, {cursor : resizeDir ? resizeDir + '-resize' : ''});
		},
		
		handleMouseDown : function(event)
		{
			var resizeDir = this.getResizeDirection(event);
			
			if(resizeDir == null)
				return;
				
			var resizeHandler = this.handleResizeMove.bindAsEventListener(this);
			var abortHandler = this.handleResizeAbort.bindAsEventListener(this);
				
			Element.setStyle(document.body, {cursor : resizeDir + '-resize'});
				
			Event.observe(window, 'mousemove', resizeHandler);
			Event.observe(window, 'mouseup', abortHandler);
				
			this.resizeInfo = {dir : resizeDir, correction : this.getResizeHandleOffsets(event)};
		},
		
		handleResizeAbort : function(event)
		{
			Event.stopObserving(window, 'mousemove', resizeHandler);
		},
		
		handleResizeMove : function(event)
		{
			if(this.resizeInfo.dir == 'w')
			{
				var a = Event.pointerX(event);
				var b = Element.getWidth(this.element);
				var c = parseInt(Element.getStyle(this.element, 'right').split('px')[0]);
				var d = document.viewport.getWidth();
				
				var mut = a - (d - b - c);
				
				Element.setStyle(this.element, {width : (b - mut) + 'px'});
			}
			else if(this.resizeInfo.dir == 'n')
			{
				var a = Event.pointerY(event);
				var b = Element.getHeight(this.element);
				var c = parseInt(Element.getStyle(this.element, 'bottom').split('px')[0]);
				var d = document.viewport.getHeight();
				
				var mut = a - (d - b - c);
				
				Element.setStyle(this.element, {height : (b - mut) + 'px'});
			}
		}
		
	});
})();
