function removeWhiteS(str)
{
  str=str.replace(/^\s+/,"");
  str=str.replace(/\s+$/,"");  
  return str;
}

function SplitArr(str)
{
  return removeWhiteS(str).split(/\s+/);
}

//yearAbbr
//Return last two digits of year
function yearAbbr (Year) {
  Year = "" + Year;
  return (Year.length == 4)?Year.substring (2, 4):Year;
}

function leapYear (Year) {
  if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0))
    return 1;
  else
    return 0;
}

function simpleSplit(InString)
{
  var strarr=SplitArr(InString.replace(/[\/,\.\-:]/g," "));
  return strarr;
}

function norm(istr)
{
  if (istr.length<2)
    istr="0"+istr;
  return istr;
}

function outDate(darr,how)
{
  var curt="";
  darrf={Y:"year",M:"month",D:"day",h:"hour",m:"minute",s:"second"};
  var ftyps="YMDhms";
  var dstr="";

  for (ccount=0;ccount<how.length;ccount++)
  {
    theChar=how.charAt(ccount);
    if (ftyps.indexOf(theChar)!=-1)
    {
      if(theChar!=curt)
      {
        curt=theChar;
        dstr+=darr[darrf[theChar]];
      }
    }
    else
      dstr+=theChar;
  }
  return dstr;
}

//dateConv
//Convert date text
function dateConv (InString, DateType,TransformToGMT) {
  var RetArray = new Object();
  if (typeof InString == "undefined") {
    RetArray.error = "No input string";
    return (RetArray);
  }

  if (typeof HW_UI_UseLocalDate !="undefined" && !HW_UI_UseLocalDate)
    return InString;

  var len = InString.length
  if (len == 0)
  {
    RetArray.error="No date string";
    return (RetArray);
  }

  wArr = simpleSplit(InString);

  len=wArr.length;
  if (len < DateType.minFields || len > DateType.maxFields)
  {
    RetArray.error="Wrong Date-Format";
    return (RetArray);
  }

  var curt="";
  datef=new Array(6);
  var ftyps="YMDhms";
  var fn=0;

  for (ccount=0;ccount<DateType.format.length;ccount++)
  {
    theChar=DateType.format.charAt(ccount);
    if (theChar!=curt && ftyps.indexOf(theChar)!=-1)
    {
      curt=theChar;
      datef[curt]=fn;
      fn++;
    }
  }

  var now=new Date();
  if (datef.Y<len)
    avar=wArr[datef.Y];
  else
    avar=""+ yearComplete(now.getFullYear());

  if (avar.length<=2)
  {
    var tyear=parseInt(avar);
    if (tyear<70)
      tyear=2000+tyear;
    else
      tyear=1900+tyear;
    avar=""+tyear;
  }
  RetArray.year=avar;

  if (datef.M<len)
    avar=wArr[datef.M];
  else
    avar="01";
  RetArray.month=norm(avar);

  if (datef.D<len)
    avar=wArr[datef.D];
  else
    avar="01";
  RetArray.day=norm(avar);

  if (datef.h<len)
    avar=wArr[datef.h];
  else
    avar="00";
  RetArray.hour=norm(avar);

  if (datef.m<len)
    avar=wArr[datef.m];
  else
    avar="00";
  RetArray.minute=norm(avar);

  if (datef.s<len)
    avar=wArr[datef.s];
  else
    avar="00";
  RetArray.second=norm(avar);
  if (checkDateSense(RetArray)) transformGMTDate(RetArray,TransformToGMT);
  return (RetArray);
}

function checkDateSense(DateX, Doalert)
//checks if DateX is/was/will be legal at any time of history since Year 1 //
//Legal Range: s(0,59), m(0.59), h(0,23), D(1,), M(1,12), Y(1,) //
{
  var DaysInMonths = new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
  var UseAlert=false;
  var Error;
  var DateXX = new Object();
  if (typeof Doalert != "undefined") UseAlert = Doalert;
  Error="";

  for (var n1 in DateX)
  {
    DateXX[n1] = DateX[n1]-0;
    if (isNaN(DateXX[n1])) DateXX[n1]=-1;
  }

  if (DateXX.year < 1) Error="Year-Value: "+DateX.year;
  else if ((DateXX.month > 12) || (DateXX.month < 1)) Error="Month-Value: "+DateX.month;
  else if ((DateXX.month == 2) && leapYear(DateXX.year))
  {
    if ((DateXX.day > 29) || (DateXX.day < 1)) Error="Day-Value: "+DateX.day;
  }
  else if ((DateXX.day > DaysInMonths[DateXX.month]) || (DateXX.day < 1)) Error="Day-Value: "+DateX.day;
  else if ((DateXX.hour > 23) || (DateXX.hour < 0)) Error+="Hour-Value: "+DateX.hour;
  else if ((DateXX.minute > 59) || (DateXX.minute < 0)) Error="Minute-Value: "+DateX.minute;
  else if ((DateXX.second > 59) || (DateXX.second < 0)) Error="Second-Value: "+DateX.second;

  if (Error=="") return true;
  else
  {
    DateX.error="Illegal "+Error;
    if (UseAlert) alert(DateX.error);
    return false;
  }
}

function transformGMTDate(ret,TransformToGMT)
// if HW_UI_ConvertGMTLocalGMT is true, then:
// Transforms GMT -> LocalDate if TransformToGMT is true, transforms LocalDate-> GMT if
// false, doesn't transform at all if undefined.
{
  if ((typeof TransformToGMT != "undefined") && (HW_UI_ConvertGMTLocalGMT))
  {
    var HelpDate = new Date(ret.year, ret.month-1, ret.day,
      ret.hour, ret.minute, ret.second);
    var TOffset = HelpDate.getTimezoneOffset();
    // A Workaround, in order to bypass the getTimezoneoffset bug in N4.0.4, N4.0.5
    var WinterDate = new Date(1990,0,1,0,0,0);
    var SummerDate = new Date(1990,6,1,0,0,0);
    var Win = WinterDate.getTimezoneOffset();
    var Sum = SummerDate.getTimezoneOffset();
    if (Math.abs(Win - Sum) > 60)
    {
      var correct = (Sum > Win)? Sum : Win;  // correct = TimeOffset without DST (DaylightSavingTime)!
      if (correct != TOffset) TOffset+=60;   // correction for bug !
    }
    // End of Workaround
    if (TransformToGMT)
      HelpDate.setTime(HelpDate.getTime()+TOffset*60000);
    else
      HelpDate.setTime(HelpDate.getTime()-TOffset*60000);
    ret.year = norm(HelpDate.getFullYear()+"");
    ret.month = norm((HelpDate.getMonth()+1)+"");
    ret.day = norm(HelpDate.getDate()+"");
    ret.hour = norm(HelpDate.getHours()+"");
    ret.minute = norm(HelpDate.getMinutes()+"");
    ret.second = norm(HelpDate.getSeconds()+"");
  }
}

function transformDate(instr,inType,outformat,TransformToGMT)
{
  if (typeof HW_UI_UseLocalDate !="undefined" && !HW_UI_UseLocalDate)
    return instr;
  ret=dateConv(instr,inType,TransformToGMT);

  if (ret.error)
    return ret.error;
  else
    return (outDate(ret,outformat));
}

function checkDateInForm(theForm,elemname,doalert,allowrel,p)
{
  if (typeof HW_UI_UseLocalDate !="undefined" && !HW_UI_UseLocalDate)
    return true;

  var alertf=false;
  if (typeof doalert != "undefined")
    alertf=doalert;

  var allowreld=false;
  if (typeof allowrel != "undefined")
    allowreld=allowrel;

  var elemIdx=findObjectwithName(theForm,elemname);
  if (elemIdx==-1)
    return true; // element not found
  var timeval=theForm.elements[elemIdx].value;
  if (timeval.length)
  {
    if (timeval.charAt(0)=="-" && allowreld)
      return true; // rel date

    var sForm;
    if (typeof p != "undefined") sForm = p.sFormat || HW_UI_Date;
    else sForm = HW_UI_Date;
    var ret=dateConv(timeval,sForm);
    if (ret.error)
    {
      if (alertf)
      {
        alert ("Error: "+ret.error+"\n\nFormat is: "+HW_UI_Date.format);
        theForm.elements[elemIdx].focus();
      }
      return false;
    }
  }
  return true;
}

function convertDateInForm(theForm,elemname,p)
{
  if (typeof HW_UI_UseLocalDate !="undefined" && !HW_UI_UseLocalDate)
    return true;
  var elemIdx=findObjectwithName(theForm,elemname);
  if (elemIdx==-1)
    return true;
  var timeval=theForm.elements[elemIdx].value;
  var sForm;
  var dForm;
  if (typeof p != "undefined")
  {
    sForm = p.sFormat || HW_UI_Date;
    dForm = p.dFormat || HWDate;
  }
  else
    {
      sForm = HW_UI_Date;
      dForm = HWDate;
    }
  if (timeval.length)
  {
    if (timeval.charAt(0)=="-")
    {
      if (p.Elemname) elemIdx=findObjectwithName(theForm,p.Elemname);
      theForm.elements[elemIdx].value=timeval;
      return true; // rel date
    }
    var ret=dateConv(timeval,sForm,p.TransformToGMT);
    if (ret.error)
      return false;
    else
    {
      if (p.Elemname) elemIdx=findObjectwithName(theForm,p.Elemname);
      theForm.elements[elemIdx].value=outDate(ret,dForm.full);
    }
  }
  return true;
}


//spezify format
// Y - year
// M - month
// D - day
// h - hour
// m - minute
// s - secound

var DeDate= new Object();
DeDate.format="DD.MM.YYYY hh:mm:ss";
DeDate.minFields=3;
DeDate.maxFields=6
DeDate.full="DD.MM.YYYY hh:mm:ss";
DeDate.date="DD.MM.YYYY";
DeDate.time="hh:mm:ss";

var EnDate=new Object();
EnDate.format="MM/DD/YYYY hh:mm:ss";
EnDate.minFields=3;
EnDate.maxFields=6;
EnDate.full="MM/DD/YYYY hh:mm:ss";
EnDate.date="MM/DD/YYYY";
EnDate.time="hh:mm:ss";

var HWDate=new Object();
HWDate.format="YYYY/MM/DD hh:mm:ss";
HWDate.minFields=1;
HWDate.maxFields=6;
HWDate.full="YYYY/MM/DD hh:mm:ss";
HWDate.date="YYYY/MM/DD";
HWDate.time="hh:mm:ss";

