/**
* 
*/
/**
Gerenciador de conteudo dinamico 
*/


/**
* Model Activation
*/

function ViewLogger(level,divOut) {
	this.level = level;
	/*
	degug
	info
	warning
	error
	critical	
	*/
	this.divOut = divOut;
	this.debug = function(text) {
		if(level == 'debug'){
			this.appendLog('[DEBUG] ' +text);
		}
	}
	this.info = function(text) {
		if(level == 'debug' || level == 'info'){
			this.appendLog('[INFO] ' +text);
		}
	}
	this.warning = function(text) {
		if(level == 'debug' || level == 'info' || level == 'warning' ){
			this.appendLog('[WARNING] ' +text);
		}
	}
	this.error = function(text) {
		if(level == 'debug' || level == 'info' || level == 'warning' || level == 'error'){
			this.appendLog('[ERROR] ' +text);
		}
	}

	this.critical = function(text) {
		this.appendLog('[CRITICAL] ' +text);
	}
	
	this.appendLog = function(text) {
		if(viewHandler.getElementDirectly(divOut) != null && viewHandler.getElementDirectly(divOut) != undefined ){
			viewHandler.getElementDirectly(divOut).innerHTML += '\n['+ new Date() +']\t' + text;
		}
	}
}
/*
teste Logger
logger = new ViewLogger('error','mtoGUIErroLog');
logger.debug('teste debug');
logger.warning('teste warning');
logger.info('teste info');
logger.error('teste error');
logger.critical('teste critical');
document.getElementById( "mtoGUIErroLog" ).innerHTML
*/



function ViewHolderDefinition(viewClass,refreshTime, isRefreshable, status, divHolder, father) {
	this.viewClass = viewClass;
	this.divHolder = divHolder;
	this.father = father;
	//em segundos
	this.refreshTime = refreshTime;
	this.isRefreshable = isRefreshable;
	this.status = status;
	/*
	'loading'
	'refreshing'
	'drawing'
	'loaded'
	*/
	this.lastCheckTime = ( new Date() ).getTime();
	this.nextRefreshTime = ( new Date() ).getTime() + refreshTime*1000;

	this.updateStatus = function(status) {
		this.status = status;
		this.lastCheckTime = ( new Date() ).getTime();
	}

	this.updateNextRefresh = function() {
		this.nextRefreshTime = ( new Date() ).getTime() + refreshTime*1000;	
	}	

}


/**
Gerenciador de conteudo dinamico.
*/
function ViewHandler() {
	this.REFRESHING_STATUS = 'refreshing';
	this.LOADING_STATUS = 'loading';
	
	this.activeViews = new Array();/* <ViewHolderDefinition> */
	setTimeout("viewHandler.checkRefreshable();",1000);	
	setTimeout("viewHandler.checkTimeout();",1100);
	
	    
	this.drawView = function(viewHolder, bufferHTML) {
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].divHolder != undefined){
			logger.debug('ViewHandler->DRAWView' + viewHolder  + ',' +  bufferHTML);
			this.activeViews[viewHolder].updateStatus('drawing');
			bufferHTML = templateManager.setVars(bufferHTML, /&lt;/g, "<" );
			bufferHTML = templateManager.setVars(bufferHTML, /&gt;/g, ">" );
			this.getElementDirectly(this.activeViews[viewHolder].divHolder).innerHTML = bufferHTML;
		} else {
			logger.warning('View not loaded' + viewHolder);
		}
	}
	this.getElementDirectly = function(elemtId) {
		return document.getElementById(elemtId);
	}
	this.getView = function(viewHolder) {
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined){
			return this.activeViews[viewHolder].viewClass;
		} else {
			return null;
		}		
	}
	this.getViewStatus = function(viewHolder) {
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].status != undefined){
			return this.activeViews[viewHolder].status;
		} else {
			return 'empty';
		}		
	}
	
	this.getFather = function (viewHolder){
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined){
			return this.activeViews[viewHolder].father;
		} else {
			return null;
		}
	}

	this.setFather = function (viewHolder, father){
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined){
			this.activeViews[viewHolder].father = father;
		}
	}

	this.getChildren = function (viewHolder){
		var children = new Hash();
		for (view in this.activeViews){
			if (this.getFather(view) == viewHolder){
				children.include(view,view);
			} 
		}
		return children;
	}

	this.getRefreshable = function(viewHolder) {
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].status != undefined){
			return this.activeViews[viewHolder].isRefreshable;
		} else {
			return false;
		}		
	}

	this.setRefreshable = function (viewHolder, isRefreshable){
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined){
			this.activeViews[viewHolder].isRefreshable = isRefreshable;
		}
	}
		
	this.setRefreshTime = function (viewHolder, refreshTime){
		if(this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined){
			this.activeViews[viewHolder].refreshTime = refreshTime;
		}		
	} 
	
	/*
	* registra uma nova view no view handler. 
	viewHolder, 
	viewClass, 
	refreshTime,
	isRefreshable, 
	status, 
	father
	*/
	this.registerView = function(viewHolder, viewClass, refreshTime,isRefreshable, status, father ) {
		father = father || 'home';
		//remove view atual. Limpeza para evitar mais de um registro do mesmo
		this.unregisterView(viewHolder);
		//Limpa view corrente
		viewHandler.getElementDirectly(viewHolder).innerHTML= '';
		//depois fazer uma div diferente do viewHolder; para os casos especiais.
		this.activeViews[viewHolder] = new ViewHolderDefinition(viewClass,refreshTime, isRefreshable, status, viewHolder, father);
		this.activeViews[viewHolder].viewClass.draw();		
	}
	
	
	/***********REPENSAR ESTE ESQUEMA DE REGISTER E REFRESH - JV 30/08/2007 */
	/*
	* registra uma nova view no view handler. 
	
	this.smartRegisterView = function(viewHolder, viewClass, status ) {
		//remove view atual. Limpeza para evitar mais de um registro do mesmo
		this.unregisterView(viewHolder);
		//Limpa view corrente
		viewHandler.getElementDirectly(viewHolder).innerHTML= '';
		//depois fazer uma div diferente do viewHolder; para os casos especiais.
		this.activeViews[viewHolder] = new ViewHolderDefinition(viewClass, 0, false, status, viewHolder);
		this.activeViews[viewHolder].viewClass.draw();		
	}
	/*
	 * seta o tempo de refresh da view e o isRefreshable
	 * para ser refreshable o tempo deve ser maior que zero.
	 
	this.setRefreshTime = function (viewHolder, refreshTime){
		this.activeViews[viewHolder].refreshTime = refreshTime;
		if (refreshTime > 0){
			this.activeViews[viewHolder].isRefreshable = true;
		}else{
			this.activeViews[viewHolder].isRefreshable = false;
		}
	}
	*/
	/***************************************************************/
	/*
	* remove registro da view
	*/
	/*
	this.unregisterView = function(viewHolder) {
		if( this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined )
			this.activeViews[viewHolder].viewClass.unload();

		//this.activeViews.splice(viewHolder,1); //JV: splice nao funciona pra objeto.
		delete this.activeViews[viewHolder];
		
		
	}
	*/
	
	/***************************************************************/
	/*
	* remove registro da view recursivo
	*/
	this.unregisterView = function(viewHolder) {
		var children = this.getChildren(viewHolder);
		if (children.length > 0){ 
			//for (child in children.items){
			children.each(function(value, child){
				this.unregisterView(child);
			//}
			});
		}
		if( this.activeViews[viewHolder] != null && this.activeViews[viewHolder].viewClass != undefined )
			this.activeViews[viewHolder].viewClass.unload();
		//this.activeViews.splice(viewHolder,1); //JV: splice nao funciona pra objeto.
		delete this.activeViews[viewHolder];
	}

	
	/*
	* verifica se algum componente deve ser atualizado.
	* esta fun?o sera chamada por um temporizador
	*/
	this.checkRefreshable = function() {
		var currentTime = (new Date()).getTime();
		for(currentViewIdx in this.activeViews){
			if(this.activeViews[currentViewIdx].isRefreshable == true){
				if(	this.activeViews[currentViewIdx].nextRefreshTime < currentTime ){
					this.activeViews[currentViewIdx].updateStatus(this.REFRESHING_STATUS);
					this.activeViews[currentViewIdx].updateNextRefresh();
					this.activeViews[currentViewIdx].viewClass.refresh();
				}

			}
			
		}
		setTimeout("viewHandler.checkRefreshable();",300);
	}

	this.checkTimeout = function() {
		var currentTime = (new Date()).getTime();
		var maxWait  = (new Date()).getTime() + 300*1000 ; //5 mins.
		for(currentViewIdx in this.activeViews){
			if(	this.activeViews[currentViewIdx].lastCheckTime < maxWait  && this.activeViews[currentViewIdx].status == 'loading'){
					this.activeViews[currentViewIdx].updateStatus('errorLoading');
					this.activeViews[currentViewIdx].viewClass.refresh();
			}
			
		}
		setTimeout("viewHandler.checkTimeout();",300);
	}
	
	/*
	 * Executa o resize nas views ativas que possuem o m?todo refresh, ? disparado no basic.js
	 */
	this.resizeViews = function (){
		for(currentViewIdx in this.activeViews){
			if (this.activeViews[currentViewIdx].viewClass.resize){
				this.activeViews[currentViewIdx].viewClass.resize();
			}
		}
	}
	
	this.show_fullGlass = function(){
		this.getElementDirectly('fullGlass').style.display = '';
	}
	
	this.hide_fullGlass = function(){
		this.getElementDirectly('fullGlass').style.display = 'none';
	}
	
	this.loading_start = function(){
		this.getElementDirectly('loading').style.display = '';
	}
	
	this.loading_stop = function(){
		this.getElementDirectly('loading').style.display = 'none';
	}
	
}


function ViewExample() {
	this.id = ( new Date() ).getTime();
	
	this.draw = function() {
		logger.debug('ViewExample->draw id:' + this.id);
	}
	
	this.refresh = function() {
		logger.debug('ViewExample->refresh id:' + this.id);
	}
	this.unload = function() {
		logger.debug('ViewExample->unload id:' + this.id);
	}	
	this.start = function() {
		logger.debug('ViewExample->unload id:' + this.id);
	}
	
	
}

/**
para qualquer view:
viewClass.draw();	

para view que s?o refreshaveis:
viewClass.refresh();

*/