var dadosCC = new DadosCC();
function DadosCC()
{
   this.list = null;
   this.meta = [
                { name: 'cc', type: 'int' },
                { name: 'cc_codigo', type: 'string' },
                { name: 'cc_desc', type: 'string' },
                { name: 'ccx', type: 'string' },
              ];
   this.dataAdapter = null;
   
   this.currentGridId = null;
   this.colunas = null;
   this.key = 'cc';
   this.onAddCCFunction = null;
   this.allowAdd = true;
   
   this.tooltipOff = false;
   this.editorHeight = 0;
   
   this.newCC = function(cc)
   {
      console.log('newCC', dadosCC.list);
      dadosCC.list.push(cc);
      dadosCC.createDataAdapter();
   }
   
   this.createDataAdapter = function()
   {
      var source = {
          localdata: dadosCC.list,
          datatype: "array",
          datafields: dadosCC.meta,
          autoBind: true
      };
      dadosCC.dataAdapter = new $.jqx.dataAdapter(source);
   }
   
   this.clear = function()
   { 
      dadosCC.list = null;
      dadosCC.dataAdapter = null;
      dadosCC.currentGridId = null;
      dadosCC.colunas = null;
      dadosCC.key = 'cc';
      dadosCC.onAddCCFunction = null;
      dadosCC.allowAdd = null;
      dadosCC.tooltipOff = false;
      dadosCC.editorHeight = 0;
   }
           
   this.update = function(f)
   { 
      dadosCC.clear();
      var url = http.getUrl('contahub.cmds.fin.FinanceiroCmd', 'getCCs')
            + '?emp=' + index.emp
            ;
      http.callHTTP( url, 
         function(dados)
         {
            console.log('getCCsOK', dados);
            dadosCC.list = dados.list;
            for (var i=0; i < dadosCC.list.length; i++)
            {
               dadosCC.list[i].ccx = dadosCC.list[i].cc_codigo + ' → ' + dadosCC.list[i].cc_desc;
            }
            dadosCC.createDataAdapter();
            if (f)
            {
               f();
            }
         },
         http.alert 
         );
   }
   
   this.getDescFromCC = function(cc)
   {
       var list = dadosCC.list;
       if (!list)
       {
          return null;
       }       
       for (var i=0; i < list.length; i++)
       {
         if (cc == list[i].cc)
         {
            return list[i].cc_desc;
         }
       }
       return null;
   }
   this.getDadosFromCC = function(cc)
   {
       var list = dadosCC.list;
       if (!list)
       {
          return null;
       }
       for (var i=0; i < list.length; i++)
       {
         if (cc == list[i].cc)
         {
            return list[i];
         }
       }
       return null;
   }
   this.getCodigoFromCC = function(cc)
   {
       var list = dadosCC.list;
       if (!list)
       {
          return null;
       }
       for (var i=0; i < list.length; i++)
       {
         if (cc == list[i].cc)
         {
            return list[i].cc_codigo;
         }
       }
       return null;
   }
   
   this.getDescFromCodigo = function(codigo)
   {
       var list = dadosCC.list;
       for (var i=0; i < list.length; i++)
       {
         if (codigo.toLowerCase() == list[i].cc_codigo.toLowerCase())
         {
            return list[i].cc_desc;
         }
       }
       return null;
   }
   
   this.getCCFromCodigo = function(codigo)
   {
       var list = dadosCC.list;
       for (var i=0; i < list.length; i++)
       {
         if (codigo && codigo.toLowerCase && (codigo.toLowerCase() == list[i].cc_codigo.toLowerCase()))
         {
            return list[i].cc;
         }
       }
       return null;
   }
   
   this.getHierarchy = function(codigo)
   {
	    var list = this.list;
	    var result = new Array();
	    if (codigo)
	    {
		    var i = 0;
		    for (var i=0; i < list.length; i++)
	       {
		    	var c = list[i];
		    	if ( (codigo.toLowerCase() == c.cc_codigo.toLowerCase()) || (codigo.toLowerCase().indexOf(c.cc_codigo.toLowerCase() +'.')==0) )
		      {
		    		result.push(c);	    		
		      }
	       }
	    }
       return result;
   }
   this.getHierarchyTable = function(codigo, datafield, row)
   {
       if (! codigo)
       {
          return '';
       }
//       codigo = codigo.trim();
       if (codigo=='')
       {
          return '';
       }
	    var ccs = this.getHierarchy(codigo);
       var s = '
'
       var achou = false;
       var existentes = '';
       for (var i=0; i < ccs.length; i++)
       {
          existentes += ' ' + ccs[i].cc_codigo + ' ';
          var bold = (i==ccs.length-1) ? '' : '';
          s += '' + bold + ccs[i].cc_codigo + ' ' + util.repl(' ', ccs[i].cc_codigo.length) + bold + ccs[i].cc_desc + '    ';
             var botao = '';
             if ( (dadosCC.allowAdd) && (codigo.indexOf('.')!=-1) )
             {
                botao = ' ' + bold + codigo + ' ' + util.repl(' ', codigo.length) + bold + 'CC Inexistente' + botao + '   
'
       return s;
   }
            
   this.addCCInexistente = function(codigo, datafield, row)
   {
      while (codigo.endsWith('.'))
      {
         codigo = codigo.substring(0, codigo.length-1);
      }
      if (codigo=='')
      {
         window.alert('Código inválido');
         return;
      }
      var pai = codigo.substring(0, codigo.lastIndexOf('.'));
      var paiCC = dadosCC.getCCFromCodigo( pai );
      if (! (paiCC))
      {
         window.alert('Centro de Custo superior inexistente: ' + pai);
         return;
      }
      var desc = codigo.substring(codigo.lastIndexOf('.')+1);
      var desc = window.prompt('Descriçao para o Centro de Custo [' + codigo + ']', desc);
      if ( (desc) && (desc.trim()!=null) )
      {
         console.log( 'addCCInexistente' , codigo, desc );
         
         var formData = [ { "id": "cc_codigo", "value": codigo },
                          { "id": "cc_desc", "value": desc },
                        ];
         var url = http.getUrl('contahub.cmds.fin.FinanceiroCmd', 'addCC') 
                 + '?emp=' + index.emp
                 ;
      
         http.callHTTP( url, function(dados) {
            console.log('addCCOK', row, dados);
            dados.ccx = dados.cc_codigo + ' → ' + dados.cc_desc;
            
            dadosCC.list.push( dados );
            dadosCC.createDataAdapter();
            if (dadosCC.onAddCCFunction)
            {
               dadosCC.onAddCCFunction( dados, datafield, row );
            }
         }, http.alert, formData );
      }
      
   }
   
   this.extrato = function(codigo, event)
   {
      var url = window.location.href;
      var d0 = util.getHashParameter('d0');
      if (d0!='')
      {
         d0 = '#d0=' + d0;
      }
      var d1 = util.getHashParameter('d1');
      if (d1!='')
      {
         d1 = '#d1=' + d1;
      }
      if (url.indexOf('#')>0)
      {
         url = url.substring(0, url.indexOf('#') );
      }
      url = '#financeiro.extrato' + d0 + d1 + '#cc_codigo=' + codigo;
      console.log('extrato', url, codigo, d0, d1, event.ctrlKey);
      if ( (event.ctrlKey) || (event.shiftKey) || (event.altKey) )
      {
         window.location = url;
      }
      else
      {
         window.open(url);
      }
      
   }
   
   this.setGridId = function( gridId)
   {
      tooltipOff = false;
      dadosCC.currentGridId = gridId;
      $('#' + dadosCC.currentGridId).jqxTooltip();
      
      return dadosCC;
   }
   
   this.setColunas = function(colunas)
   {
      dadosCC.colunas = '|' + colunas + '|';
      return dadosCC;
   }
   
   this.setKey = function(key)
   {
      dadosCC.key = key;
      return dadosCC;
   }
   
   this.allowAddCC = function( f )
   {
      dadosCC.allowAdd = true;
      dadosCC.onAddCCFunction = f;
      return dadosCC;
   }
      
   this.disallowAddCC = function( )
   {
      dadosCC.allowAdd = false;
      dadosCC.onAddCCFunction = null;
      return dadosCC;
   }
      
   this.tooltip = function (element, pageX, pageY) 
   {
      if (dadosCC.tooltipOff)
      {
         return;
      }
      var cell = $('#' + dadosCC.currentGridId ).jqxGrid('getcellatposition', pageX, pageY);
      var coluna = cell.column;
//      console.log('tooltip', coluna, dadosCC.colunas);
      if (dadosCC.colunas.indexOf('|' + coluna + '|')!=-1)
      {
          var cc = cell.value;
          if (dadosCC.codigoInexistente)
          {
             cc = dadosCC.codigoInexistente;
          }
          if (cc)
          {
             var codigo = cc;
             if ( (dadosCC.key=='cc_codigo') || (dadosCC.codigoInexistente) )  // key
             {
                cc = dadosCC.getCCFromCodigo(codigo);
             }
             else
             {
                codigo = dadosCC.getCodigoFromCC(cc);
             }
             var s = dadosCC.getHierarchyTable(codigo, coluna, cell.row);
             $('#' + dadosCC.currentGridId).jqxTooltip({ content: s, autoHide: true, closeOnClick: true, theme: 'orange' });
             $('#' + dadosCC.currentGridId).jqxTooltip('open', pageX + 10, pageY + 0);
             return;
          }
      }
      $('#' + dadosCC.currentGridId).jqxTooltip('close');
   }
   this.createEditorCC = function (row, cellvalue, editor, cellText, width, height) 
   {
       console.log('createEditorCC', row, cellvalue, editor, width, height);
       dadosCC.editorHeight = height;
   }
   
   this.initEditorCC = function (row, cellvalue, editor, celltext, pressedkey) 
   {
//       console.log('initEditorCC', row, cellvalue, editor, celltext, pressedkey);
       var inputField = $("';
                span1 = ' ';
             }
             
             codigo = span0 + '' + value + '