errorNr = 0;

function WriteErrorMessage(errorNr)
{
  document.getElementById(errorField).innerHTML = errorText[errorNr];
}

function Dec2Hex(dec, hexDigits)
{
  hexNumber = "0123456789ABCDEF";
  hex = "";
  if (dec > Math.pow(16, hexDigits))
  {
    errorNr = 4;
    return "";
  }
  while (hexDigits > 0)
  {
    hex = hexNumber.substring(dec % 16, dec % 16 + 1) + hex;    
    dec = dec / 16
    hexDigits = hexDigits - 1;
  }
  return hex;
}

function Hex2Dec(hex, maxDigits)
{
  hexNumber = "0123456789ABCDEF";
  var address = 0;

  hex = hex.toUpperCase();
  if (hex.length > maxDigits)
  {
    errorNr = 3;
    return 0;
  }

  for (byteCount = 0; byteCount < hex.length; byteCount++)
  {
    if (hexNumber.indexOf(hex.substring(byteCount, byteCount+1)) == -1)
    {
	  errorNr = 1;
      return;
    }	
    else
    {
      address = address * 16 + hexNumber.indexOf(hex.substring(byteCount, byteCount+1));
    }     
  }
  return address;
}

function GroupETS2Addr(etsString)
{
  address = 0;
  if (etsString.indexOf("/") == -1)
  {
	errorNr = 2;
    return 0;
  } 
  address = etsString.substring(0, etsString.indexOf("/")) * 2048;
  etsString = etsString.substring(etsString.indexOf("/") + 1, etsString.length);

  if (etsString.indexOf("/") == -1)
  {
    address = address + parseInt(etsString);
  } 
  else
  {
    address = address + parseInt(etsString.substring(0, etsString.indexOf("/"))) * 256;
    address = address + parseInt(etsString.substring(etsString.indexOf("/") + 1, etsString.length));
  }
  return address;
}

function GroupAddr2Ets(address, addrLevel)
{
  if (addrLevel == 2)
    ets = Math.floor(address / 2048) + "/" + Math.floor(address % 2048);
  else  
    ets = Math.floor(address / 2048) + "/" + Math.floor((address % 2048) / 256) + "/" + Math.floor(address % 256);
  
  return ets;
}

function Eis62Percent(eis6)
{
  return Math.round(eis6 * 1000 / 255) / 10;
}

function Percent2Eis6(percent)
{
  return Math.round(percent * 255 / 100);
}

function Eis52Value(eis5)
{
  value = eis5 & 0x07ff;
  if ((eis5 & 0x08000) != 0)
  {
    value |= 0xfffff800;
    value = -value;
  }
  value <<=  ((eis5 & 0x07800) >> 11);
  if ((eis5 & 0x08000) != 0)
    value = -value;
  
  return value;
}

function Value2Eis5(value)
{
  eis5 = 0;
  exponent = 0;
  
  if (value < 0)
  {
    eis5 = 0x08000;
    value = -value;
  }  
  while (value > 0x07ff)
  {
    value >>= 1;
    exponent++;
  }
  if (eis5 != 0)
    value = - value;
  
  eis5 |= value & 0x7ff;
  eis5 |= (exponent << 11) & 0x07800;
  return eis5 & 0x0ffff;
}

function PackOrderNumber(orderNumber)
{
  packedString = "";
  packedChar = 0;
  bitOffset = 0; 
  character = 0;
  
  if (orderNumber.length > 13)
  {
    errorNr = 5;
    return "";
  }
  while (orderNumber.length < 13)
    orderNumber += "_";
  
  orderNumber = orderNumber.toUpperCase();
  for (count = 0; count < orderNumber.length; count++)
  {
    character = orderNumber.charCodeAt(count);
    if (character  < 0x30 || character  > 0x6f)
    {
	  errorNr = 6;
      return "";
    }   
    character = character - 0x30;
    character = character << 2;
    packedChar |= character >> bitOffset;
    
    if (bitOffset + 6 >= 8)
    {
      packedString += Dec2Hex(packedChar, 2);     
      packedChar = (character << (8-bitOffset)) & 0x0ff;
    }
    bitOffset += 6;
    bitOffset = bitOffset % 8;
  }  
  packedString += Dec2Hex(packedChar, 2);     
  
  return packedString;
}

function UnpackOrderNumber(packedString)
{
  orderNumberStr = "";
  packedChar = 0;
  bitOffset = 0;
  packedOffset = 0;
  unpackedChar = 0;
  
  packedString = packedString.toUpperCase();
  packedChar = Hex2Dec(packedString.substring(packedOffset, packedOffset + 4), 4);
  packedOffset = 4;
  for (count = 0; count < 13; count++)
  {
    unpackedChar = ((packedChar << bitOffset) & 0x0fC00) >> 10;
    orderNumberStr += String.fromCharCode(unpackedChar + 0x30);
    bitOffset += 6;
    if (bitOffset >= 8)
    {
      packedChar &= 0x0ff;
      packedChar <<= 8;
      packedChar |= Hex2Dec(packedString.substring(packedOffset, packedOffset + 2), 2);
      packedOffset += 2;
    }
    bitOffset %= 8;
  
  }
  return orderNumberStr;
}

function FormGroupHex2Ets(hex)
{
  var address = 0;
  ets = "";

  errorField = "groupAddressError";
  errorNr = 0;
  WriteErrorMessage(0);

  address = Hex2Dec(hex, 4);
    
  if (document.groupAddr.level3.checked == 0)
    ets = GroupAddr2Ets(address, 2);
  else  
    ets = GroupAddr2Ets(address, 3);
 
  if (errorNr != 0)
  {
    ets = "";
	WriteErrorMessage(errorNr);
  }
  document.groupAddr.GroupEts.value = ets;
}

function FormGroupEts2Hex(ets)
{
  errorField = "groupAddressError";
  errorNr = 0;
  WriteErrorMessage(0);

  addr = Dec2Hex(GroupETS2Addr(ets),4);
  if (errorNr != 0)
  {
    addr = "";
	WriteErrorMessage(errorNr);
  }
  document.groupAddr.GroupHex.value = addr;
  return;
}

function FormPercent2Eis6(percent)
{
  errorField = "EIS6Error";
  errorNr = 0;
  WriteErrorMessage(0);

  eis6value = Dec2Hex(Percent2Eis6(percent), 2);
  if (errorNr != 0)
  {
    eis6value = "";
	WriteErrorMessage(errorNr);
  }

  document.EIS6.eis6.value = eis6value;
}

function FormEis62Percent(eis6)
{
  errorField = "EIS6Error";
  errorNr = 0;
  WriteErrorMessage(0);

  percent = Eis62Percent(Hex2Dec(eis6, 2));
  if (errorNr != 0)
  {
    percent = "";
	WriteErrorMessage(errorNr);
  }
  document.EIS6.percent.value = percent;
}

function FormValue2Eis5(value)
{
  errorField = "EIS5Error";
  errorNr = 0;
  WriteErrorMessage(0);

  eis5value = Dec2Hex(Value2Eis5(value * 100), 4);
  if (errorNr != 0)
  {
    eis5value = "";
	WriteErrorMessage(errorNr);
  }

  document.EIS5.eis5.value = eis5value;
}

function FormEis52Value(eis5)
{
  errorField = "EIS5Error";
  errorNr = 0;
  WriteErrorMessage(0);

  value = Eis52Value(Hex2Dec(eis5, 4)) / 100;
  if (errorNr != 0)
  {
    value = "";
	WriteErrorMessage(errorNr);
  }
  document.EIS5.value.value = value;
}

function FormPackOrderNumber(orderNumber)
{
  errorField = "orderNumberError";
  errorNr = 0;
  WriteErrorMessage(0);

  value = PackOrderNumber(orderNumber);
  if (errorNr != 0)
  {
    value = "";
	WriteErrorMessage(errorNr);
  }
  document.orderNumber.packed.value = value;
}

function FormUnpackOrderNumber(packed)
{
  errorField = "orderNumberError";
  errorNr = 0;
  WriteErrorMessage(0);
  value = UnpackOrderNumber(packed);
  if (errorNr != 0)
  {
    value = "";
	WriteErrorMessage(errorNr);
  }

  document.orderNumber.ordernumber.value = value;
}
