
/* Namespace creation */

var com 		= typeof(com) == 'undefined' ? {} : com;
com.managr 		= typeof(com.managr == 'undefined') ? {} : com.managr;

com.managr.ui = {};
com.managr.util = {};
com.managr.storage = {
	data: null,
	get: function() { var tmp = this.data; this.data = null; return tmp; },
	set: function( data ) { this.data = data; } 
}

com.managr.ui.createDock = function(dockID){
	var id = dockID;
	var created = document.getElementById(id);
	if (!created){
		var html = "<div class='ManagrApiDock' id='"+id+"'></div>";
		document.body.innerHTML += html;
		created = document.getElementById(id);
	}else{
		created.innerHTML = '';
	}
	return created;
};

com.managr.util.connectCSS = function(cssLoc){
	var link = document.createElement('LINK');
	link.setAttribute('rel', 'stylesheet');
	link.setAttribute('type', 'text/css');
	link.setAttribute('href', cssLoc);
	var head = document.getElementsByTagName('head')[0];
	head.appendChild(link);
};

com.managr.util.getByClassName = function(class_name, scope){
	
	if (typeof(scope) == 'string')
		scope = document.getElementById(scope);
	
	if (!scope)
		scope = document.body;
	
	var coll = [];
	
	if (typeof(scope.childNodes) != 'undefined' && scope.childNodes.length){
		for (var i = 0; i<scope.childNodes.length; i++){
			
			if (
				typeof(scope.childNodes[i].className) != 'undefined' &&
				scope.childNodes[i].className.indexOf(class_name) >= 0
			){
				coll.push(scope.childNodes[i]);
			}
			var tmpColl = com.managr.util.getByClassName(class_name, scope.childNodes[i]);
			if (tmpColl.length){
				for (var j in tmpColl){
					coll.push(tmpColl[j]);
				}
			}
		}
	}
	return coll;
};

/**
 * From http://www.huddletogether.com/projects/lightbox/lightbox.js
 */
com.managr.util.clientRect = function(){
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}

	var arrayPageSize = {
		pageWidth : pageWidth,
		pageHeight : pageHeight,
		windowWidth : windowWidth,
		windowHeight : windowHeight
	}; 
	return arrayPageSize;
};

com.managr.util.obj2url = function(obj){
	var r = "";
	if (typeof(obj) == 'string'){
		r += obj;
	}else if (typeof(obj) == 'object'){
		for (var i in obj){
			if (obj.hasOwnProperty(i) && typeof(obj[i] == 'string')){
				r += '&'+encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);
			}
		}
	}
	return r;
};

com.managr.api = function(_domain){

	var domain = _domain;
	var dockID = 'ManagrAPI';
	var dockDom = null;
		
	this.addProject = function(account, options){
		var href = 'http://'+account+'.'+domain+'/api/index.php?apiFunc=newProject'+
		com.managr.util.obj2url(options);
		options.domain = domain;
		var widget = new com.managr.widget(
			href, 
			options, 
			dockDom
		);
	};
	
	this.addUser = function(account, options){
		var href = 'http://'+account+'.'+domain+'/api/index.php?apiFunc=newUser' +
		com.managr.util.obj2url(options);
		options.domain = domain;
		var widget = new com.managr.widget(
			href, 
			options, 
			dockDom
		);
	};
	
	dockDom = com.managr.ui.createDock(dockID);
	com.managr.util.connectCSS('http://api.'+domain+'/widget/widget.css');
};

com.managr.widget = function(_location, _params, _dock){
	
	var location	= _location,
		params		= typeof(_params)== 'undefined' ? {} : _params,
		dock		= _dock,
		bound		= null,
		closer		= null,
		self		= this,
		title		= typeof(params.title) == 'undefined' ? params.domain : params.title,
		width		= typeof(params.width) == 'undefined' ? 800 : params.width,
		height		= typeof(params.height) == 'undefined' ? 500 : params.height;
	
	var attachEvent = function(obj,evt,fnc){
		if(obj.addEventListener)
			obj.addEventListener(evt, fnc, false);
		else if(obj.attachEvent)
			obj.attachEvent("on" + evt, fnc);		
	};
	var detachEvent = function(obj,evt,fnc){
		if(obj.addEventListener)
			obj.removeEventListener(evt, fnc, false);
		else if(obj.detachEvent)
			obj.detachEvent("on" + evt, fnc);		
	};
	
	function createWidgetBounding(){
		
		var html = "<div class='ManagrApiWidgetShim'></div>";
		html += "<div class='MangrApiWidgetBound'>";
			html += "<div unselectable='on' class='ManagrApiWidgetBoundHeader'>" +
					"<table width='100%' cellspacing='0' cellpadding='0'>"+
					"<tr><td class='header-left'></td>" +
					"<td unselectable='on' class='header-title'>"+title+"</td>" +
					"<td class='header-close'></td>" +
					"<td class='header-right'></td></tr>" +
					"</table>" +
				"</div>";
			html += "<div class='ManagrApiWidgetBoundBody'></div>";
			html += "<div class='ManagrApiWidgetBoundFooter'></div>";
		html +="</div>";
		dock.innerHTML = html;
	};
	
	var createWidgetFrame = function(){
		var html = "";
		html += "<iframe width='100%' height='100%' frameborder='0' src='"+location+"'>";
		return html;
	};
	
	var onResize = function(){
		var shim 			= dock.childNodes[0],
			rect			= com.managr.util.clientRect();
		shim.style.width 	= rect.pageWidth + 'px';
		shim.style.height 	= rect.pageHeight + 'px';
	};
	
	var create = function(){
		createWidgetBounding();
		var frameHolder = dock.childNodes[1].childNodes[1];
		var frame = createWidgetFrame();
		frameHolder.innerHTML += frame;
		
		var widgetBody = dock.childNodes[1];
		widgetBody.style.width = width + 'px';
		widgetBody.style.height = height + 'px';
		
		var padLeft = -width/2;
		widgetBody.style.marginLeft = padLeft + 'px';
		onResize();
		
		attachEvent(com.managr.util.getByClassName('header-close', dock)[0], 'click', self.destroy, true);
		attachEvent(window, 'resize', onResize);
		
		return this;
	};
	
	this.destroy = function(){
		detachEvent(com.managr.util.getByClassName('header-close', dock)[0], 'click', self.destroy);
		detachEvent(window, 'resize', onResize);
		dock.innerHTML = '';
	};
	
	return create();
};