ui = window['ui'] || {};
ui.BspPopup = function() {

	var parent = document.getElementsByTagName('body')[0];
	var popEl;
	var disposed = false;
	var disposeHandlers = [];
	
	this.dispose = function() {
		document.getElementsByTagName('body')[0].removeChild(popEl);
		disposed = true;
		for(var i=0; i < disposeHandlers.length; i++)
			disposeHandlers[i]();
		return false;
	}
	
	this.domElement = function() {
		return popEl;
	}
	
	this.isDisposed = function() {
		return disposed;
	}
	
	this.onDispose = function(fn) {
		disposeHandlers[disposeHandlers.length] = fn;
		return this;
	}
	
	this.position = function() {};
	
	this.append = function() {
		var conf = arguments[0] || {};
		var autoPosition = conf['auto-position'] ? true : false,
			width = conf['width'] || (autoPosition ? null : 300),
			height = conf['height'] || (autoPosition ? null : 300),
			layout = conf['positioning'] == 'relative' ? 'relative' : 'centered',
			contents = conf['contents'] || 'no contents',
			relativeElement = conf['relative-element'] || null,
			relOffset = conf['relative-offset'] || [0, 0],
			padding = conf['padding'] || 10, behavior = conf['behavior'],
			clickaction = conf['clickaction'], cancelaction = conf['cancelaction'],
			anchorPoint = conf['anchor-point'] || 'tl',
			env = this, elid = conf['id'] || '',
			zIndex = typeof(conf['z-index']) == 'undefined' ? 1000 : conf['z-index'],
			buttonText = ['Cancel', 'OK'], disposeOnClick = true;
		
		if(typeof(behavior) == 'object') {
			var o = behavior;
			behavior = o.type;
			buttonText = o.buttonText;
			disposeOnClick = o.disposeOnClick;
		}
		
		function rOffsetTop() {
			var n = relativeElement;
			var out = 0;
			while(n) {
				out += n.offsetTop;
				n = n.offsetParent;
			}
			return out;
		}
		
		function rOffsetLeft() {
			var n = relativeElement;
			var out = 0;
			while(n) {
				out += n.offsetLeft;
				n = n.offsetParent;
			}
			return out;
		}
		
		(function(popup) {
			parent.appendChild(popup);
			
			env.position = function() {
				if((layout == 'centered') && autoPosition) {
					popup.style.left = ((lib.Window.prop('innerWidth')/2) - (popup.offsetWidth/2))+'px';
					popup.style.top = (lib.Window.prop('pageYOffset')+(((lib.Window.prop('innerHeight'))/2) - (popup.offsetHeight/2)))+'px';
				}
				if(layout == 'relative') {
					var top = rOffsetTop() + relOffset[1];
					var left = rOffsetLeft() + relOffset[0];
					switch(anchorPoint) {
					case 'br':
						left -= (popup.offsetWidth - relativeElement.offsetWidth);
						top -= (popup.offsetHeight - relativeElement.offsetHeight);
					}
					
					if(autoPosition) {
						if((left + popup.offsetWidth) > (lib.Window.prop('innerWidth')+lib.Window.prop('pageXOffset'))) {
							left = ((lib.Window.prop('innerWidth')+lib.Window.prop('pageXOffset')) - (popup.offsetWidth+20));
						}
						if(left < 0)
							left = 0 + lib.Window.prop('pageXOffset');
						
						if((top + popup.offsetHeight) > (lib.Window.prop('innerHeight')+lib.Window.prop('pageYOffset'))) {
							top = (lib.Window.prop('innerHeight') + lib.Window.prop('pageYOffset')) - popup.offsetHeight;
							top -= 20;
						}
						
						if(top < lib.Window.prop('pageYOffset'))
							top = lib.Window.prop('pageYOffset');
							
					}
					
					popup.style.top = (top)+'px';
					popup.style.left = (left)+'px';
				}
			}
			env.position();
		})(
			(function(popup) {
				if(layout == 'centered' && (!autoPosition)) {
					popup.style.left = ((lib.Window.prop('innerWidth')/2) - (parseFloat(popup.style.width)/2))+'px';
					popup.style.top = (lib.Window.prop('pageYOffset')+(((lib.Window.prop('innerHeight'))/2) - (parseFloat(popup.style.height)/2)))+'px';
				}
				popEl = popup;
				return popup;
			})(
				['div', {'class':'BSPPop'}, ['div']].parseJsonML(
					function(popup) {
						if(popup.className != 'BSPPop') {
							if((typeof contents) == 'string')
								popup.innerHTML = contents;
							else popup.appendChild(contents);
							env.getContentElement = function() {
								return popup;
							}
							return popup;
						}
						popup.style.padding = 10+'px';
						if(width)
							popup.style.width = width+'px';
						if(height)
							popup.style.height = height+'px';
						popup.style.position = 'absolute';
						//popup.innerHTML = contents;
						popup.style.zIndex = zIndex;
						if(elid) popup.id = elid;
						return popup;
					}
				)
			)
		);
		var okInput;
		popEl.appendChild(
			(function() {
				if(behavior != 'confirm' && behavior != 'alert' && behavior != 'info') {
					return ['a', {'href' : '#'}, '[x] Close Window'].parseJsonML(
						function(anchr) {
							anchr.style.position = 'absolute';
							anchr.style.top = padding+'px';
							anchr.style.right = padding+'px';
							anchr.onclick = function() {
								env.dispose();
								return false;	
							}
							return anchr;
						}
					);
				}
				return ['form', {'action':'', 'method':'post', 'onsubmit':'return false;'}].parseJsonML(
					function(div) {
						if(behavior == 'info') return div;
						div.style.textAlign = 'right';
						div.style.paddingTop = padding+'px';
						if(behavior == 'confirm') {
							div.appendChild(
								['input', {'type' : 'button', 'value' : buttonText[0], 'class' : 'submit'}].parseJsonML(
									function(ipt) {
										ipt.onclick = function() {
											env.dispose();
											if(cancelaction)
												cancelaction.call(this);
											return false;
										}
										return ipt;
									}
								)
							);
						}
						div.appendChild(
							['input', {'type' : 'button', 'value' : buttonText[1], 'class' : 'submit'}].parseJsonML(
								function(ipt) {
									okInput = ipt;
									ipt.style.marginLeft = padding+'px';
									ipt.onclick = function() {
										if(disposeOnClick)
											env.dispose();
										if(clickaction)
											clickaction.apply(this, arguments);
										return false;
									}
									return ipt;
								}
							)
						);
						return div;
					}
				);
			})()
		);
		if(okInput)
			okInput.focus();
		return this;
	}
};
