/**
 * Generic
 */

var defaultFocusOccur;
var defaultFocusField;



function updateField( field, value )
{
	field.value = value;
	window.close();
}

function isDigit( str )
{
  for( var i = 0; i < str.length; i++ )
  {
    var charCode = str.charCodeAt( i );
    if( !(charCode >= 48 && charCode <= 57) )
      return( false );
  }
  return( true );
}

function isLetter( str )
{
  for( var i = 0; i < str.length; i++ )
  {
    var charCode = str.charCodeAt( i );
    if( !(charCode >= 65 && charCode <= 90 || charCode >= 97 && charCode <= 122) )
      return( false );
  }
  return( true );
}

function isLetterOrDigit( str )
{
  for( var i = 0; i < str.length; i++ )
  {
    var character = str.charAt( i );
    if( !isDigit( character ) && !isLetter( character ) )
      return( false );
  }
  return( true );
}
/**
 * Format
 */

// Constantes
SYMBOL      = 0;
CARACTER    = 1;
SEPARATOR   = 2;
SIGNAL      = 3;
UPPER       = 4;
LOWER       = 5;
MINUS       = 6;
OTHER       = 7;

function findSymbol( symbol )
{
  var typeSymbol = SYMBOL;
  switch( symbol )
  {
    case '#':
    case '0':
    case 'L':
    case 'l':
    case 'A':
    case 'a':
    case 'C':
    case 'c': {
                typeSymbol = CARACTER;
                break;
              }
    case 'S': {
                typeSymbol = SIGNAL;
                break;
              }
    case 's': {
                typeSymbol = MINUS;
                break;
              }
    case '>': { typeSymbol = UPPER;
                break;
              }
    case '<': { typeSymbol = LOWER;
                break;
              }
    case '\\': {
                 typeSymbol = SEPARATOR;
                 break;
               }
    default: typeSymbol = OTHER;
  }
  return( typeSymbol );
}

/**
 * Number
 */

function positionMaskString( offs, displayMask )
{
  var pos       = 0;
  var i         = 0;
  var tipo      = 1;
  var ultimoTipo;
  var caracter = " ";

  while ( i < displayMask.length )
  {
    //caracter da m?scara
    caracter = displayMask.charAt( i );
    ultimoTipo = tipo;
    tipo = findSymbol( caracter );
    if ( pos >= offs &&
         tipo == CARACTER &&
         ultimoTipo != SEPARATOR )
      break;
    if ( tipo != SEPARATOR &&
         tipo != LOWER &&
         tipo != UPPER )
      ++pos;
    ++i;
  }
  return( caracter );
}

function validateCaracterString( str, offs, displayMask )
{
  var caracterMask;
  var caracterStr;
  var charCode;
  for( var j = 0; j < str.length; ++j )
  {
    caracterMask = positionMaskString( offs + j, displayMask );
    caracterStr  = str.charAt( j );
    charCode     = str.charCodeAt( j );
    switch( caracterMask )
    {
      case '#':
      case '9': { //caracter num?rico ou espa?o
                  if( !(isDigit( caracterStr ) || caracterStr == ' ') )
                    return( false );
                  break;
                }
      case '0': { //caracter num?rico
                  if( !isDigit( caracterStr ) )
                    return( false );
                  break;
                }
      case 'A':
      case 'a': { //caracter alfanum?rico
                  if( !(isLetterOrDigit( caracterStr ) || caracterStr == ' ') )
                    return( false );
                  break;
                }
      case 'L':
      case 'l': { //caracter alfab?tico
                  if( !(isLetter( caracterStr ) || caracterStr == ' ') )
                    return( false );
                  break;
                }
      case 'C':
      case 'c':  break;
      case 'S': {
                  if( caracterStr != '+' &&
                      caracterStr != '-' )
                    return( false );
                  break;
                }
      case '\\':
      default  : return( false );
    }
  }
  return( true );
}

function deleteMaskString( value, displayMask ) 
{
  var caracter      = "";
  var valueDelete   = "";
  var valor         = 0;
  var lenValue      = 0;
  var caracterValue = "";
  var i             = 0;

  while ( i < displayMask.length && lenValue < value.length )  
  {
    caracter      = displayMask.substr( i, 1 );
    caracterValue = value.substr( lenValue, 1 );
    valor         = findSymbol( caracter );
    if( valor == CARACTER || valor == SIGNAL )
      valueDelete = valueDelete + caracterValue;
    else if ( valor == UPPER || valor == LOWER )
      --lenValue;
    else if( valor == SEPARATOR )
    {
      if ( displayMask.charAt(i+1) != caracterValue )
        valueDelete = valueDelete + caracterValue;
      ++i;
    }
    else
      if ( caracter != caracterValue )
        valueDelete = valueDelete + caracterValue;
    ++lenValue;
    ++i;
  }
  return( valueDelete );
}

function formatString( value, displayMask )
{
  if ( value.length == 0 )
    return value;
  value = deleteMaskString( value, displayMask );
  var formatValue = "";
  var lenValue = 0;
  var caracter;
  var symbol;
  var i = 0;
  var typeCase = OTHER;

  while ( i < displayMask.length )
  {
    caracter = displayMask.charAt( i );

    symbol = findSymbol( caracter );
    if ( symbol == SEPARATOR )
    {
      formatValue =  formatValue + displayMask.substr( i + 1, 1 );
      ++i;
    }
    else
    if ( symbol == CARACTER )
    {
      if ( value.length == lenValue )
        break;
      var check = validateCaracterString( value.substr( lenValue, 1 ), formatValue.length, displayMask );

      if ( check )
      {
        var valueCaracter = value.substr( lenValue, 1 );
        if ( typeCase == UPPER )
          valueCaracter = valueCaracter.toUpperCase();
        else
          if ( typeCase == LOWER )
            valueCaracter = valueCaracter.toLowerCase()
        formatValue =  formatValue + valueCaracter;
      }
      else
        --i;
      ++lenValue;
    }
    else
    if ( symbol == UPPER )
      typeCase = UPPER;
    else
    {
      if ( symbol == LOWER )
      {
        if ( findSymbol( displayMask.substr( i + 1, 1 ) ) == UPPER )
        {
          typeCase = OTHER;
          ++i;
        }
        else
          typeCase = LOWER;
      }
      else
        if ( lenValue < value.length )
          formatValue =  formatValue + caracter;
    }
    ++i;
  }
  return( formatValue );
}

function formatValueString( field, displayMask, keyEvent )
{
  var value = field.value;
  var valueFormated = formatString( value, displayMask );
  if( value != valueFormated )
    field.value = valueFormated;
}

