(function() {
	var ote = function(settings){
		return ote.Setup.init(settings);
	},
	version = '1.0',
	_ote = window.ote;	
	
	ote.Setup = ote.prototype = {
		defaults: {debug: 1, templateID: 0},	
		
		init: function(settings){
			$.extend(settings, defaults);
			$.extend(oteError, Error);
		},
		
		length: 0,
		components: new Array(),
		setTemplateID : function(templateID){
			try{
				if(templateID && templateID.length != '0' && typeof(templateID) == 'number'){
					ote.Setup.defaults.templateID = templateID;					
				}	else	{
					throw new oteError('TemplateID could not be set (NaN/undefined)', 1);
				}			
			}	catch(e){
				ote.Error.store(e);
			}
		}
	};
	
	oteError = function(message, level){		
			this.message = message;
			this.level = level;			
	},
	version = '1.0',
	_oteError = window.oteError;
	
	oteError.prototype = new Error();
	
	ote.Error = {		
		message: '',
		errors: new Array(),		
		store: function( e ) {
			if( e instanceof TypeError ) {
				e.type = 'TE';
			} 
			
			messageString = '[level: ' + e.level + '] ' + e.message;			
			errorsIndex = this.errors.length == 0 ? 0 : this.errors.length;
			
			this.errors[errorsIndex] = new Array(2);
			
			this.errors[errorsIndex]['message'] = messageString;
			this.errors[errorsIndex]['level'] = e.level;
			
			if(ote.Setup.defaults.debug == 1) {
				ote.Error.trace(false, true);
			}				
		},
		trace: function(level, progress){
			
			errorOutput = '';
			if(! progress){	
				
				if(typeof(console) !== 'undefined'){
					console.log("Start trace for session");
				}	else	{
					errorOutput = '<div style="position: absolute; top: 5; left: 5; padding: 15px; border: 1px #d3d3d3 solid; background: #FFF" id="oteErrorMessage">';
					errorOutput += '<p>Start debug trace</p>';
				}
				
			}
			for(i = 0; i <  this.errors.length; i++){
				
				if( ! level) {
					
					
					if(typeof(console) !== 'undefined'){
						switch(this.errors[i]['level']){
								case 1:
									console.error(this.errors[i]['message']);
									break;
								case 2:
									console.warn(this.errors[i]['message']);
									break;
								case 3:
									console.info(this.errors[i]['message']);
									break;
								case 4:
								default:
									console.log(this.errors[i]['message']);
									break;						
						}
					}	else	{
						levelColor = new Array();
						levelColor[1] = 'red';
						levelColor[2] = 'yelllow';
						levelColor[3] = 'blue';
						levelColor[4] = 'black';						
						errorOutput += '<p style="color: ' + levelColor[this.errors[i]['level']] +' ">' + this.errors[i]['message'] + '</p>';
					}
					;
				} else {
					if(typeof(console) !== 'undefined') {
						if(this.errors[i]['level'] == level) {
							switch(level){
								case 1:
									console.error(this.errors[i]['message']);
									break;
								case 2:
									console.warn(this.errors[i]['message']);
									break;
								case 3:
									console.info(this.errors[i]['message']);
									break;
								case 4:
								default:
									console.log(this.errors[i]['message']);
									break;						
							}						
						}
					}	else	{
						levelColor = new Array();
						levelColor[1] = 'red';
						levelColor[2] = 'yelllow';
						levelColor[3] = 'blue';
						levelColor[4] = 'black';						
						errorOutput += '<p style="color: ' + levelColor[this.errors[i]['level']] +' ">' + this.errors[i]['message'] + '</p>';						
					}
				}
			}
			
			if(! progress){
				if(typeof(console) !== 'undefined'){ 
					console.log("End trace for session");
				}	else	{					
					errorOutput += "</div>";				
					$('body').prepend(errorOutput);
				}	
			}	else	{	
				if(typeof(console) == 'undefined'){
				
					if($('#oteErrorMessage').length == 0 ){
						$('body').prepend('<div style="position: absolute; overflow:scroll; line-height: 10px; top: 5; left: 5; padding: 15px; border: 1px #d3d3d3 solid; background: #FFF; height: 100px !important; width: 450px" id="oteErrorMessage"></div>');
						$('#oteErrorMessage').prepend(errorOutput);
					}	else	{
						$('#oteErrorMessage').prepend(errorOutput);					
					}
				}
			}
			this.errors = new Array();
			
			return;
		},
		log: function(message, level){
			if(typeof(console) == 'undefined'){
				
				levelColor = new Array();
				levelColor[1] = 'red';
				levelColor[2] = 'yelllow';
				levelColor[3] = 'blue';
				levelColor[4] = 'black';						
				errorOutput = '<p style="color: ' + levelColor[level] +' ">[level ' + level + ']' + message + '</p>';
				
				if($('#oteErrorMessage').length == 0 ){
					$('body').prepend('<div style="position: absolute; overflow:scroll; line-height: 10px; top: 5; left: 5; padding: 15px; border: 1px #d3d3d3 solid; background: #FFF; height: 100px !important; width: 450px; z-index: 100" id="oteErrorMessage"></div>');
					$('#oteErrorMessage').prepend(errorOutput);
				}	else	{
					$('#oteErrorMessage').prepend(errorOutput);					
				}
			}	else	{
				switch(level){
				case 1:
					console.error(message);
					break;
				case 2:
					console.warn(message);
					break;
				case 3:
					console.info(message);
					break;
				case 4:
				default:
					console.log(message);
					break;						
				}	
			}
		}
		
	};
	
	
	ote.Utils = {
		container: new Object(),
		loadStyle: function(url){
			$("head").append("<link>");
		    css = $("head").children(":last");
		    css.attr({
		      rel:  "stylesheet",
		      type: "text/css",
		      href: url
		    });
		   
		}
	};
	
	ote.Router = {
		getAlias: function(){
			uri = location.href;
			
			if(uri.indexOf('/')){
				uriParts = uri.split('/');				
				uri = uriParts[uriParts.length - 1];
				if(uri.length == 0){
					uri = uriParts[uriParts.length - 2];
				}
			}
			return uri;
		}	
	};
	
	window.ote = ote;

})(window);

oteError.prototype = new Error();
