/**
 *  ----------------------------------------------------------------------  *
 *  arquivo: panel.class.js
 *  versão: 0.01
 *  revisão: 001
 *  data criação:
 *  data atualização: 05/03/2008
 *  dependência: ECMAscript 1.0
 *  categoria: Biblioteca de Classe JS  
 *  modulo: CORE
 *  since: 0.0.001
 *  autor: Ramon         <ramon@realweb.com.br>
 *  copyleft: Realweb Soluções  2007-2008
 *  @versao 
 *  ----------------------------------------------------------------------  *
 */


/**
 *  ----------------------------------------------------------------------  *
 *  Definição do Construtor da Classe
 *  ----------------------------------------------------------------------  *
 *  Esta classe define o componente Page
 *
 */
function classPanel( objID, objNome )
{
/**
 *  ----------------------------------------------------------------------  *
 *  definição dos atributos Privadas
 *  ----------------------------------------------------------------------  *
 */
  var nomeVar = null;
  
/**
 *  ----------------------------------------------------------------------  *
 *  definição dos atributos Públicos
 *  ----------------------------------------------------------------------  *
 */
  this.id   = objID;
  this.name = objNome || objID;
  
/**
 *  ----------------------------------------------------------------------  *
 *  principais node´s do objeto
 *  ----------------------------------------------------------------------  *
 *  armazena os NodeDOM dos principais elementos do Objeto
 */
  this.node        = null;
  this.nodeFrame   = null;
  this.nodeCaption  = null;
  
/**
 *  ----------------------------------------------------------------------  *
 *  lista de propriedades do Componente
 *  ----------------------------------------------------------------------  *
 */
  this.name    = objNome || objID;
  this.enable  = false;
  this.type    = null; 
//  this.zIndex  = 200;
  
/**
 *  ----------------------------------------------------------------------  *
 *  variáveis de controle interno
 *  ----------------------------------------------------------------------  *
 */  
  this.ajax    = null;    //  handle para o RPC
  this.opened  = false;   //  flag que indica se o Objeto esta aberto
  this.started = false;   //  flag que indica que o Objeto foi inicializado
  
  
/**
 *  ----------------------------------------------------------------------  *
 *  Definição dos Metodos Privados do Componente
 *  ----------------------------------------------------------------------  *
 */
 
/**
 *  ----------------------------------------------------------------------  *
 *  setEventoInteracao()
 *  ----------------------------------------------------------------------  *
 *  metodo para adicionar o controle de eventos de interação do Objeto
 *
 *  adiciona a lista de evento do Objeto, (Padrão Observer) os metodos
 *  responsáveis pela interação.
 *
 *  estes metodos estão definidos neste arquivo de classe
 */
  this.setEventoInteracao = function()
  {
    var dom_ = findDOM( this.id );
    this.setEvento( dom_, 'click',     this.mouseClick );
    
  }// End metodo
	


/**
 *  ----------------------------------------------------------------------  *
 *  setEventoAcao()
 *  ----------------------------------------------------------------------  *
 *  metodo para adicionar o controle de eventos de ação do Objeto
 *
 *  adiciona a lista de evento do Objeto, (Padrão Observer) os metodos
 *  responsáveis pela ação.
 *
 *  estes metodos estão definidos no arquivo nomeObjeto.eventos.js
 */  
  this.setEventoAcao = function()
  {
    var _dom = findDOM( this.id );
   // var nFunc = this.id + '_onClick';
    
//    this.setEvento( _dom, 'click', this.onClick );
    
  }// End metodo
  

/**
 *  ----------------------------------------------------------------------  *
 *  mouseClick()
 *  ----------------------------------------------------------------------  *
 *  metodo de interação mouseClick
 *
 */  
  this.mouseClick = function( evt )
  {
		try 
		{
		  var _objID = appWeb.getObjEvento( evt );
		  var _ID = _objID.split( '_' )[ 0 ];
		} catch(e){}
  }// End metodo
 
//Codigo cortado  
  
/**
 *  ----------------------------------------------------------------------  *
 *  initObj()
 *  ----------------------------------------------------------------------  *
 *  metodo para inicializar o Objeto
 * 
 *  aciona o controle de eventos do Objeto e renderiza o template
 */
  this.initObj = function()
  {
    try
    {
      this.setEventoInteracao();
//      this.renderize();
      this.setEventoAcao();
      
      this.setzIndex( this.node, this.zIndex );
      this.started = true;
    }catch( _err_ )
    {
      //alert('erro na inicialização do Objeto[' + this.id + "]\n" + _err_ );
      
    }// End try
  }// End metodo
  
/* 
 *  ----------------------------------------------------------------------  *
 *  startRet()
 *  ----------------------------------------------------------------------  *
 *  este metodo é executado no retorno do serviço getConfig do Webservice
 *
 *  recebe como parametro o template do Objeto e os valores default das
 *  propriedades dinamicas do Objeto
 */
  this.startRet = function( _ret )
  {
    
    var _arr      = _ret.split( '*' );
    var _objID    = _arr[ 0 ];     // em depreciação
    var _template = _arr[ 1 ];
    var _atributo = _arr[ 2 ];
    var _metodos  = _atributo.split( ',' );
    var _objID    = this.handleObj.id;
    
    var _handleObj = panel.objects[ this.handleObj ];
//alert( _handleObj.id);
    
/**
 *  ----------------------------------------------------------------------  *
 *  se o objeto for do tipo carga dinamica insere o HTML (template)
 *  no nodeDOM do Objeto
 *  ----------------------------------------------------------------------  *
 */
    var _cmdo  = _metodos[ 0 ].split( ':' )[ 0 ];
    var _value = _metodos[ 0 ].split( ':' )[ 1 ];
    
    if( _cmdo == 'tipoObjeto' )
    {
      if( _value == 'dynamic' )
      {
        reloadCSS( _objID + '.css' );
        var objDOM = appWeb.findDOM( _objID );
        
        if( objDOM == null )
        {
          var objDOM  = document.createElement( 'div' );
          appWeb.setAttribute( objDOM, 'id', _objID );
          appWeb.nodePage.insertBefore( objDOM, appWeb.nodePage.lastChild );
        }// End if( objDOM == null )
        
        objDOM.innerHTML = _template;
      }// End if( _value == 'dynamic' )
    }// End if( _cmdo == 'tipoObjeto' )
/**
 *  ----------------------------------------------------------------------  *
 *  armazena os principais node´s 
 *  ----------------------------------------------------------------------  *
 */    
    _handleObj.node        = appWeb.findDOM( _objID              );
    _handleObj.nodeFrame   = appWeb.findDOM( _objID + '_frame'   );
    _handleObj.nodeCaption  = appWeb.findDOM( _objID + '_caption'  );
/**
 *  ----------------------------------------------------------------------  *
 *  configura os valores default dos metodos do objeto
 *  ----------------------------------------------------------------------  *
 */    
    for( var ix in _metodos )
    {
      if( ix > 0 )
      {
        var _cmdo  = _metodos[ ix ].split( ':' )[ 0 ];
        var _value = _metodos[ ix ].split( ':' )[ 1 ];
/**
 *  ----------------------------------------------------------------------  *
 *  monta o comando Setter para configurar os atributos dinamicos
 *  ----------------------------------------------------------------------  *
 */     
        var _obj_ = _cmdo.substr( 0, 1 ).toUpperCase() + _cmdo.substr( 1 );
        var _cmd_ = _objID + '.set' + _obj_ + '( "' + _value + '" );';

      }// End if()
    }// End for()
/**
 *  ----------------------------------------------------------------------  *
 *  Adiciona os metodos de ação a lista de eventos (padrão Observer)
 *  ----------------------------------------------------------------------  *
 *  estes eventos estão definidos no arquivo 'nomeObjeto'.eventos.js
 */
//    eval( '_handleObj.onClick = ' + _handleObj.id + '_onClick' );
//    eval( '_handleObj.onFocus = ' + _handleObj.id + '_onFocus' );
//    eval( '_handleObj.onBlur  = ' + _handleObj.id + '_onBlur'  );
    
/**
 *  ----------------------------------------------------------------------  *
 *  inicializa o Objeto
 *  ----------------------------------------------------------------------  *
 */
    //panel.objects[ _objID ].initObj();
    _handleObj.initObj();
    
  }// End metodo
	
	
	
this.start = function()
  {
/**
 *  --------------------------------------------------------------------  *
 *  armazena os principais node´s 
 *  --------------------------------------------------------------------  *
 */    
    this.node = appWeb.findDOM( this.id );
    this.box  = appWeb.findDOM( this.id + "_box" );
    this.nodeFrame = appWeb.findDOM( this.id + "_frame" );

/**
 *  --------------------------------------------------------------------  *
 *  Adiciona os metodos de ação a lista de eventos (padrão Observer)
 *  --------------------------------------------------------------------  *
 *  estes eventos estão definidos no arquivo 'nomeObjeto'.eventos.js
 */
//    eval( 'this.onClick = ' + this.id + '_onClick' );

		var _height = this.box.offsetHeight;
		var _width = this.box.offsetWidth;
		//Array multi-dimensional, com os seguintes dados: nome dado ao elemento, top e left.
//		var _tam = 11;
//		_arrImgName_[0] = ['_cornerLT', "-1px", "-1px"];
//		_arrImgName_[1] = ['_cornerLB', _height -_tam+"px", "-1px"];
//		_arrImgName_[2] = ['_cornerRT', "-1px", _width -_tam+"px"];
//		_arrImgName_[3] = ['_cornerRB', _height - _tam+"px", _width -_tam+"px"];
//		for (var _i_=0; _i_ < _arrImgName_.length;_i_++) 
//		{
//			_img_ = document.createElement("img");
//			_div_ = document.createElement("DIV");
//			_div_.style.width = "10px";
//			_div_.style.height = "10px";
//			_div_.id = this.node.id + _arrImgName_[_i_][0];
//			_div_.style.position = "absolute";
//			_div_.style.top = _arrImgName_[_i_][1];
//			_div_.style.left = _arrImgName_[_i_][2];
//			_div_.style.zIndex = _i_ + 10;
//			this.box.appendChild(_div_);
//			_img_.src = _arrImg_[_i_].src;
//			_div_.appendChild(_img_);
//		}//End for (var _i_=0;_i_<this._arrImgName_.length;_i_++)

/**
 *  --------------------------------------------------------------------  *
 *  inicializa o Objeto
 *  --------------------------------------------------------------------  *
 */

   this.initObj();

  }// End metodo
  
/**
 *  ----------------------------------------------------------------------  *
 *  Definição do Construtor da Classe
 *  ----------------------------------------------------------------------  *
 */
  this._construtor = function( _id_ )
  {
/**
 *  ----------------------------------------------------------------------  *
 *  registra o Objeto na lista de objetos da Classe
 *  ----------------------------------------------------------------------  *
 */
    panel.objects[ _id_ ] = this;
    
/**
 *  ----------------------------------------------------------------------  *
 *  cria uma conexão com o Webservice & executa o serviço getConfig
 *  ----------------------------------------------------------------------  *
 */
    var _url = appWeb.dirRoot + 'core/RPC_panel.tpl.php';
      
    this.ajax = new classAjax();
    this.ajax.setParams( _id_ );
    this.ajax.setMetodo( 'GET' );
    this.ajax.setURL( _url );
    this.ajax.setReturnTo( this.startRet );
    this.ajax.setObj( _id_ );
    //this.ajax.conectar();
    
  }// End Metodo
  this._construtor( objID );  
  
}// End Class



/**
 *  ----------------------------------------------------------------------  *
 *  Atributos privados da Classe
 *  ----------------------------------------------------------------------  *
 */
var panel = new Object();

panel.objects   = new Object();
//panel.selected  = null;
panel.zIndex    = null;
panel.bgColor   = '#EFEFEF';
//panel.selColor  = '#FFFF99';


/**
 *  ----------------------------------------------------------------------  *
 *  pre-load dos elementos de designer do componente
 *  ----------------------------------------------------------------------  *
*/

//_arrImgName_ = [];
//		
//this._arrImg_ = {'0' : new Image(), '1' : new Image(), '2' : new Image(), '3' : new Image()};
//
//var _pathImg_ = appWeb.dirRoot + appWeb.dirImage;
//_arrImg_[0].src = _pathImg_ + "cornerLT.png";
//_arrImg_[1].src = _pathImg_ + "cornerLB.png";
//_arrImg_[2].src = _pathImg_ + "cornerRT.png";
//_arrImg_[3].src = _pathImg_ + "cornerRB.png";


/**
 *  ----------------------------------------------------------------------  *
 *  Definição dos Metodos Públicos
 *  ----------------------------------------------------------------------  *
 */
classPanel.prototype = 
{
	setVisible: function(_status){
		var panDOM = appWeb.findDOM(this.id);
		var newStatus = (_status) ? 'inherit' : 'hidden';
		
		appWeb.setAttribute(panDOM, 'visibility', newStatus);
	},
	setTop: function(_top){
		var panDOM = appWeb.findDOM(this.id);		
		_top = (isNaN(_top)) ? _top : _top + "px";
		panDOM.style.top = _top;
	},
	setLeft: function(_left){
		var panDOM = appWeb.findDOM(this.id);		
		_left = (isNaN(_left)) ? _left : _left + "px";
		panDOM.style.left = _left;
	},
	setBar: function( _status ){
		var barDOM = appWeb.findDOM( this.id + '_barra' );		
		var newStatus = (_status) ? 'inherit' : 'none';
		
		appWeb.setAttribute(barDOM, 'display', newStatus);
	},
	setBarPosition: function ( _position ){
		var panDOM = appWeb.findDOM( this.id );
		var barDOM = appWeb.findDOM( this.id + '_barra' );
		if ( _position == 'top' ) 
		{
			appWeb.setLeft(barDOM, 0);
			appWeb.setTop(barDOM, 0);
		} //End if (_position == 'top') 
		else if ( _position == 'bottom' ) 
		{
			var _top = appWeb.getHeight(panDOM) - appWeb.getHeight(barDOM);
			appWeb.setLeft(barDOM, 0);
			appWeb.setTop(barDOM, _top);
		}//End else if (_position == 'bottom') 
		appWeb.setAttribute(barDOM, 'position', 'absolute')
	},
	setDisplayTitulo: function(_status){
		var panDOM = appWeb.findDOM(this.id + '_titulo');
		
		appWeb.setAttribute(panDOM, 'display', _status);
	},
	setFontTitulo: function( _font ){
		var panDOM = appWeb.findDOM(this.id + '_titulo');
		
		appWeb.setAttribute(panDOM, 'font-family', _font);
	},
	setFontColorTitulo: function( _cor ){
		var panDOM = appWeb.findDOM(this.id + '_titulo');
		
		appWeb.setAttribute(panDOM, 'color', _cor);
	},
	setTitulo: function( _titulo ){
		var titDOM = appWeb.findDOM(this.id + '_titulo');
		
		titDOM.innerHTML = _titulo;
	},
	setBorderBar: function ( _estilo ) {
		var panDOM = appWeb.findDOM(this.id + '_barra');
		
		appWeb.setAttribute(panDOM, 'border', _font);
	},
	setFontColorBar: function( _cor ){
		var panDOM = appWeb.findDOM(this.id + '_barra');
		
		appWeb.setAttribute(panDOM, 'color', _cor);
	},
	setBgColorBar: function( _cor ){
		var panDOM = appWeb.findDOM(this.id + '_barra');
		
		appWeb.setAttribute(panDOM, 'background', _cor);
	},
	setAlignTitulo: function( _align ){
		var titDOM = appWeb.findDOM(this.id + '_titulo');
		appWeb.setWidth(titDOM, titDOM.parentNode.offsetWidth);
		appWeb.setHeight(titDOM, titDOM.parentNode.offsetHeight);
		appWeb.setLeft(titDOM, 0);
		if ( titDOM != null ) //Aplica a propriedade de alinhamento, somente se o nó existir
		{
			appWeb.setAttribute(titDOM, 'textAlign', _align);
		}
	},
  setHTML:
  function( _html )
  {
    this.nodeFrame.innerHTML = _html;
  }
	
}


/**
 *  ----------------------------------------------------------------------  *
 *  Atributos privados da Classe
 *  ----------------------------------------------------------------------  *
 */

/**
 *  ----------------------------------------------------------------------  *
 *  extend a classe classPanel
 *  ----------------------------------------------------------------------  *
 *  define os metodos Públicos do Objeto appWeb
 *  este metodos são atribuidos nesta etapa porque são
 *  dependente da familia do Browser
 */
classPanel.prototype.setEvento = setEvento;
classPanel.prototype.setzIndex = setzIndex;
classPanel.prototype.getzIndex = getzIndex;


/**
 *  ----------------------------------------------------------------------  *
 *  Funções auxiliares
 *  ----------------------------------------------------------------------  *
 *  grupo de Metodos auxiliares para estender a 
 *  classe classAppWeb
 */

/**
 *  ----------------------------------------------------------------------  *
 *  estende a instancia da Classe classAppWeb
 *  ----------------------------------------------------------------------  *
 *  adiciona as funçoes auxiliares ao objeto appWeb
 *  ----------------------------------------------------------------------  *
 */


