(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, environment: 'PRD'},	
		
		init: function(settings){
			$.extend(settings, defaults);
			$.extend(oteError, Error);
			ote.Window = new Object;
		},
		
		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);
			}
		},
		
		setEnvironment: function(e){
			try{
				if(e && e.length != '0'){
					ote.Setup.defaults.environment = e;					
				}	else	{
					throw new oteError('Environment could not be set(undefined)', 1);
				}			
			}	catch(e){
				ote.Error.store(e);
			}
		}
	};
	
	oteError = function(message, level){		
			this.message = message;
			this.level = level;			
	},
	ote.window = new Object,
	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.Defaults = {
			separator: '-',
			dateSeparator: '/'			
	};
	
	ote.Utils = {
		container: new Object(),
		separator: ote.Defaults.dateSeparator,
		loadStyle: function(url){
			$("head").append("<link>");
		    css = $("head").children(":last");
		    css.attr({
		      rel:  "stylesheet",
		      type: "text/css",
		      href: url
		    });
		   
		},
		popup: function ( o ){
			
			ote.window.url = $(o).attr('href');
			ote.window.features = $(o).attr('rel');
			ote.window.name = $(o).attr('title');
			
			ote.window.instance = window.open (ote.window.url, ote.window.name, ote.window.features);
			
			return false;
		},
		
		selfPopup: function (href, rel, title) {
			ote.window.url = href;
			ote.window.features = rel;
			ote.window.name = title;
			
			ote.window.instance = window.open (ote.window.url, ote.window.name, ote.window.features);
			
			return false;
		},
		Date : {
			splitDateString: function(string, dateSeparator){
				var localString = String(string);				
				parts = localString.split('/');
								
				var r = new Object;
				/** month starting at 0, substract 1 **/
				r.month = parseInt( parts[0], 10 );				
				r.day = parseInt( parts[1], 10 );
				r.year = parseInt( parts[2], 10 );
				
				return r;
			},
			difference: 0,
			stringToObject: function(dateString, difference){		
				var dateObject = ote.Utils.Date.splitDateString(dateString, ote.Utils.Date.separator);
				dateInstance = new Date(dateObject.year, dateObject.month - 1, dateObject.day );
				
				if( typeof(difference)  !== 'undefined') {
					if( difference.indexOf('d') !== -1) {
						dateInstance.setDate( dateInstance.getDate() + parseFloat(difference.replace('d', '')) );
					};
					if( difference.indexOf('m') !== -1) {
						dateInstance.setDate( dateInstance.getMonth() + parseFloat(difference.replace('m', '')) );
					};
					if( difference.indexOf('y') !== -1) {
						dateInstance.setDate( dateInstance.getYear() + parseFloat(difference.replace('y', '')) );
					};
				};
								
				return dateInstance;
			},
			compare: function(dateFrom, dateTo) {				
				var dateFromObject = ote.Utils.Date.stringToObject(dateFrom);
				var dateToObject = ote.Utils.Date.stringToObject(dateTo);
				
				if( dateFrom > dateTo)
					return true;
				else
					return false;
			}
		}
	};
	
	ote.Router = {
		getAlias: function(){
			uri = location.href;
			switch(ote.Setup.defaults.environment){
			case 'PRD':
				if(uri.indexOf('/')){
					uriParts = uri.split('/');				
					uri = uriParts[uriParts.length - 1];
					if(uri.length == 0){
						uri = uriParts[uriParts.length - 2];
					}
				}
				break;
			case 'SBX':
				if(uri.indexOf('/')){
					uriParts = uri.split('/');						
					uri = uriParts[uriParts.length - 1];
					if(uri.length == 0){
						uri = uriParts[uriParts.length - 2];
					}
				}
				break;
			}
			return uri;
		}	
	};
	
	window.ote = ote;

})(window);

oteError.prototype = new Error();
