/*  
	Filename: EDJSUtils.js
	Miscellaneous JavaScript routines
	Author: Marin Oom
*/

DIGITS = new Array('0','1','2','3','4','5','6','7','8','9');

DATE_VALID_CHARS = new Array('0','1','2','3','4','5','6','7','8','9','-');
DATE_VALID_SEPARATOR = '-';

TIME_VALID_CHARS = new Array('0','1','2','3','4','5','6','7','8','9',':');
TIME_VALID_SEPARATOR = ':';

PN_VALID_CHARS = new Array('0','1','2','3','4','5','6','7','8','9','-');
PN_VALID_SEPARATOR = '-';

CURRENCY_VALID_CHARS = new Array('0','1','2','3','4','5','6','7','8','9',',','-');
CURRENCY_VALID_SEPARATOR = ',';

DAYS_IN_MONTH = new Array(2);
DAYS_IN_MONTH[false] = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
DAYS_IN_MONTH[true] = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var ParsedResult = '';
var ErrorStr = '';

function Trim(AText)
{
  var tmpText = AText;
  while (tmpText.charAt(0) == ' ')
  {
    tmpText = tmpText.slice(1,tmpText.length);
  }
  while (tmpText.charAt(tmpText.length-1) == ' ')
  {
    tmpText = tmpText.slice(0,tmpText.length - 1);
  }
  return (tmpText)
}

function IsLeapYear(Year)
{  
  return ((Year % 4 == 0) && ((Year % 100 !== 0) || (Year % 400 == 0)))
}

function DaysInMonth(AYear,AMonth)
{
  if ((AMonth < 1) || (AMonth > 12))
    alert ('Invalid month: ' + AMonth + '. The month was not between 1 and 12.')  
  return (DAYS_IN_MONTH[IsLeapYear(AYear)][AMonth - 1])
}

function ControlDigit_10mod(AText)
{
  var Result = '';
  var digsum = 0;
  var digval = 0;
  var dbl = true;
  for (i = AText.length - 1 ; i >= 0 ; i--)
  {
    digval = AText.charCodeAt(i) - 48;
    if (dbl)
      digval += digval;
    if (digval >= 10)
      digval -= 9;
    digsum += digval;
    dbl = !dbl;
  }
  digsum = digsum % 10;
  if (digsum > 0)
    Result = String.fromCharCode(10 - digsum + 48)
  else
    Result = '0';
  return (Result)
}

function CheckValidChars(ctrl,ValidChars,Event)
{
  var CharOK = false;
  for (i=0; i < ValidChars.length; i++) 
  {
    if (String.fromCharCode(Event.keyCode) == ValidChars[i])
    {			
      CharOK = true;
      break;
    }
  }
  if (CharOK == false)
    Event.returnValue = false;
  return (CharOK);
}

function ParseYear(AText)
{
  var Result = false;
  if ((AText < 0) || (AText > 9999))
    ErrorStr = AText + ' är inte ett giltigt år.';
  else 
  {
    ParsedResult = AText;
    Result = true;
  }
  return (Result)
}

function ParseCtrlYear(ctrl)
{
  var tmpText = Trim(ctrl.value);
  var Result = false;
  if (tmpText != '')
  {
    Result = ParseYear(tmpText);
    if (Result == false)
    {
      alert(ErrorStr)
      ctrl.focus();
    }
    else
      ctrl.value = ParsedResult;
  }
  return (Result)
}

function ParseDate(AText)
{
  var Result = false;
  var tmpArray = AText.split(DATE_VALID_SEPARATOR);
  var tmpYear = '';
  var CENTURY_LIMIT = 20;
  if (tmpArray.length == 1) {
    if (AText.length == 8) {
      tmpArray[0] = AText.slice(0,4);
      tmpArray[1] = AText.slice(4,6);
      tmpArray[2] = AText.slice(6,8);
    }
    else if (AText.length == 6) {
      tmpYear = AText.slice(0,2);
      if (tmpYear <= CENTURY_LIMIT)
        tmpArray[0] = 20 + tmpYear;
      else
        tmpArray[0] = 19 + tmpYear;
      tmpArray[1] = AText.slice(2,4);
      tmpArray[2] = AText.slice(4,6);
    }
  }
  if ((tmpArray.length != 3) || (tmpArray[0].length > 4) || (tmpArray[1].length > 2) || (tmpArray[2].length > 2))
    ErrorStr = AText + ' är inte ett giltigt datum.';
  else if ((tmpArray[0] < 0) || (tmpArray[0] > 9999) || (tmpArray[1] < 1) || (tmpArray[1] > 12) || (tmpArray[2] < 1) || (tmpArray[2] > DaysInMonth(tmpArray[0],tmpArray[1])))
    ErrorStr = AText + ' är inte ett giltigt datum.';
  else
  {
    ParsedResult = tmpArray[0] + DATE_VALID_SEPARATOR + (tmpArray[1].length < 2 ? '0' : '') + tmpArray[1] + DATE_VALID_SEPARATOR + (tmpArray[2].length < 2 ? '0' : '') + tmpArray[2];
    Result = true;
  }
  return (Result)
}

function ParseCtrlDate(ctrl)
{
  var tmpText = Trim(ctrl.value);
  var Result = false;
  if (tmpText != '')
  {	
    Result = ParseDate(tmpText);
    if (Result == false)
    {	
      alert(ErrorStr)	
      ctrl.focus();
    }
    else
      ctrl.value = ParsedResult;
  }
  return (Result)
}

function ParseTime(AText)
{
  var Result = false;
  var tmpArray = AText.split(TIME_VALID_SEPARATOR);
  if (tmpArray.length == 1) {
    if (AText.length <= 2) {
      tmpArray[0] = AText;
      tmpArray[1] = '0';
    }
    else if (AText.length == 3) {
      tmpArray[0] = AText.slice(0,1);
      tmpArray[1] = AText.slice(1,3);
    }
    else if (AText.length == 4) {
      tmpArray[0] = AText.slice(0,2);
      tmpArray[1] = AText.slice(2,4);
    }      
  }
  if ((tmpArray.length != 2) || (tmpArray[0].length > 2) || (tmpArray[1].length > 2))
    ErrorStr = AText + ' är inte en giltig tid.';
  else if ((tmpArray[0] < 0) || (tmpArray[0] > 23) || (tmpArray[1] < 0) || (tmpArray[1] > 59))
    ErrorStr = AText + ' är inte en giltig tid.';
  else
  {
    ParsedResult = tmpArray[0] + TIME_VALID_SEPARATOR + (tmpArray[1].length < 2 ? '0' : '') + tmpArray[1];
    Result = true;
  }
  return (Result)
}

function ParseCtrlTime(ctrl)
{
  var tmpText = Trim(ctrl.value);
  var Result = false;
  if (tmpText != '')
  {
    Result = ParseTime(tmpText);
    if (Result == false)
    {
      alert(ErrorStr);
      ctrl.focus();
    }
    else
      ctrl.value = ParsedResult;
  }
  return (Result)
}

function ParsePN(AText)
{	
  var Result = false;
  var tmpArray = AText.split(PN_VALID_SEPARATOR);
  var yearStr = '';
  var monthStr = '';
  var dayStr = '';	
  if ((tmpArray.length != 2) || (tmpArray[0].length != 8) || (tmpArray[1].length != 4))
    ErrorStr = AText + ' är inte ett giltigt personnummer. Formatet ska vara ååååmmdd-nnnn.';
  else
  {		
    yearStr = tmpArray[0].slice(0,4);
    monthStr = tmpArray[0].slice(4,6);
    dayStr = tmpArray[0].slice(6,8);
    if (ParseDate(yearStr + DATE_VALID_SEPARATOR + monthStr + DATE_VALID_SEPARATOR + dayStr) == true)
    {	
      if (ControlDigit_10mod(yearStr.slice(2,4) + monthStr + dayStr + tmpArray[1].slice(0,3)) == tmpArray[1].slice(tmpArray[1].length-1,tmpArray[1].length))
      {
        ParsedResult = yearStr + monthStr + dayStr + PN_VALID_SEPARATOR + tmpArray[1];
        Result = true;
      }
      else
        ErrorStr = 'Personnummret ' + AText + ' har felaktig kontrollsiffra.';
    }
  }		
  return (Result)
}

function ParseCtrlPN(ctrl)
{
  var tmpText = Trim(ctrl.value);
  var Result = false;
  if (tmpText != '')
  {
    Result = ParsePN(tmpText)
    if (Result == false)
    {
      alert(ErrorStr);
      ctrl.focus();
    }
    else
      ctrl.value = ParsedResult;
  }
  return (Result)
}

function ParseCurrency(AText)
{
  var Result = false;
  var tmpArray = AText.split(CURRENCY_VALID_SEPARATOR);
  if (tmpArray.length == 1) {
    tmpArray[0] = AText;
    tmpArray[1] = '00';
  }
  if ((tmpArray.length != 2) || (tmpArray[1].length > 2))
    ErrorStr = AText + ' är inte ett giltigt belopp.';
  else
  {
    ParsedResult = tmpArray[0] + CURRENCY_VALID_SEPARATOR + tmpArray[1] + (tmpArray[1].length < 2 ? '0' : '');
    Result = true;
  }
  return (Result)
}

function ParseCtrlCurrency(ctrl)
{
  var tmpText = Trim(ctrl.value);
  var Result = false;
  if (tmpText != '')
  {
    Result = ParseCurrency(tmpText);
    if (Result == false)
    {
      alert(ErrorStr);
      ctrl.focus();
    }
    else
      ctrl.value = ParsedResult;
  }
  return (Result)  
}

function IsReturnKey(AKey)
{
  return (AKey == 13);
}