function AMPMIndicator(str)
{
  if (parseInt(str) >= 12)
    return 1; //'PM';
  else
    return 0; //'AM';
}

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(/[T\/,\.\-:]/g," "));
  return strarr;
}

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

function outDate(darr,how)
{
  if (darr.getDate) { // check whether function getDate exists -> it's a Date
    var dh={Y:darr.getFullYear(),M:darr.getMonth()+1,D:darr.getDate(),
            h:darr.getHours(),m:darr.getMinutes(),s:darr.getSeconds(),
            t:AMPMIndicator(darr.getHours())};
  }
  else {
    var dh={Y:darr.year,M:darr.month,D:darr.day,
            h:darr.hour,m:darr.minute,s:darr.second,t:AMPMIndicator(darr.hour)};
  }
  if (how.match(/tt\s*$/)) {
    if (dh.h > 12) dh.h=dh.h-12;
    if (dh.h==0) dh.h=12;
  }
  var curt="";
//  darrf={Y:"year",M:"month",D:"day",h:"hour",m:"minute",s:"second"};
  var ftyps="YMDhmst";
  var dstr="";

  var str_length=how.length;
  for (ccount=0;ccount<str_length;ccount++)
  {
    theChar=how.charAt(ccount);
//    if (ftyps.indexOf(theChar)!=-1)
    if ((theChar=="Y") || (theChar=="M") || (theChar=="D") || 
        (theChar=="h") || (theChar=="m") || (theChar=="s") || (theChar=="t"))
    {
      if(theChar!=curt)
      {
        curt=theChar;
        var h=dh[theChar]+"";
        if (theChar == "t") {
          if (h == 0)
            h = "AM";
          else
            h = "PM";
        }
        if (h.length==1) 
          dstr+='0';
        dstr+=h;
      }
    }
    else
      dstr+=theChar;
  }
  return dstr;
}

//dateConv
//Convert date text
function dateConv (InString, DateType,TransformToGMT,UseClientLocalTime,dateOnly) {
  var RetArray = new Object();
  if (typeof InString == "undefined") {
    RetArray.error = "No input string";
    return (RetArray);
  }
  if (InString.time) // it's an HW_API_Date
  {
    RetArray = {year: InString.year,
                month: InString.month,
                day: InString.day,
                hour: InString.hour,
                minute: InString.minute,
                second: InString.second};
    if (!dateOnly)
      transformGMTDate(RetArray,TransformToGMT,UseClientLocalTime);
    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(7);
  var ftyps="YMDhmst";
  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++;
    }
  }
  //check if the date match the pattern from the fields length poin of view (PR-1070)
  var out = checkDateFieldsLength4Format(DateType, wArr, datef);
  if (out.error) {
    RetArray.error = out.error;
    return RetArray;
  }

  var now=new Date();
  if (datef.Y<len)
    avar=wArr[datef.Y];
  else
    avar=""+ 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)
    if ((datef.t<len) && (wArr[datef.t].toUpperCase()=="PM")) {
      if (Number(wArr[datef.h])!=12) {
        avar=Number(wArr[datef.h])+12;
      }
      else {
        avar=wArr[datef.h];
      }
    }
    else {
      if ((datef.t<len) && (Number(wArr[datef.h])==12)) {
        avar=0;
      }
      else {
        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) && !dateOnly) transformGMTDate(RetArray,TransformToGMT,UseClientLocalTime);
  return (RetArray);
}

/**
 * Checks if a date-time value match a format from the fields length point of view.
 * Checks here only the year field because the others fields are checked by the checkDateSense() function.
 *
 * @param dateType: string: the date format
 * @param dateTimeArr: Array: store the fields of the date value {year, month, day, ...}
 * @param dateTimeIndex: Array (assoc): store the date fields index from the "dateTimeArr" array
 *          {Y: the index of the year field,
 *           M: the index of the mount field,
 *           ...: the index of the ... field}
 */
function checkDateFieldsLength4Format(dateType, dateTimeArr, dateTimeIndex) {
  var result = {error: ""};
  //check only the year because the month/day/hour/minute/seconds are checked in checkDateSense() function
  var field_value = dateTimeArr[dateTimeIndex.Y];
  if (field_value.length > dateType.date.replace(/[^Y]/g, "").length) {
    result.error = "Illegal Year-Value: " + field_value;
  }
  return result;
}

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,UseClientLocalTime)
// if HW_UI_ConvertGMTLocalGMT is true, then:
// Transforms LocalDate->GMT if TransformToGMT is true, transforms GMT->LocalDate if
// false, doesn't transform at all if undefined.
{
  if ((typeof TransformToGMT != "undefined") && (typeof HW_UI_ConvertGMTLocalGMT!="undefined") && (HW_UI_ConvertGMTLocalGMT))
  {
    // if transforming to local time && we're on the server side -> use new function by ckoch
    if (!TransformToGMT && UseClientLocalTime && typeof request != "undefined")
    { 
      transformToLocalTime(ret);
      return;
    }
    
    var HelpDate = new Date(ret.year, ret.month-1, ret.day, ret.hour, ret.minute, ret.second);
    var TOffset = HelpDate.getTimezoneOffset();
    if (TOffset>720) // netscape on mac ?
      TOffset=TOffset-1440;

    if (UseClientLocalTime)
    {
      // Use cookie "HW_GMTOff" to get TimeOffset
      if (typeof request != 'undefined') {
        if (request.field.keyvalue('Cookie')) {
          var thecookies = request.field.keyvalue('Cookie').values;
          for (var id in thecookies) {
            if (thecookies[id].search(/^HW_GMTOff=/)!= -1)
              TOffset = thecookies[id].substring(10)*60;
          }
        }
      }
    }
    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,UseClientLocalTime,dateOnly)
{
  var datestr=instr;
  if (typeof HW_API_Date != "undefined" && typeof instr == "string")
  {
    datestr=new HW_API_Date(instr);
    if (!datestr.ok)
      datestr = instr;
  }
  
  if (typeof datestr != 'string' && !datestr.time)
    return outDate(datestr,outformat);
  if (typeof HW_UI_UseLocalDate !="undefined" && !HW_UI_UseLocalDate)
    return datestr;
  ret=dateConv(datestr,inType,TransformToGMT,UseClientLocalTime,dateOnly);
  
  if (ret.error)
    return ret.error;
  else
    return (outDate(ret,outformat));
}

function checkDateInForm(theForm,elemname,doalert,allowrel,p)
{
  if (typeof theForm[elemname]=="undefined") return true;// element not found
  else return chkDateInForm(theForm[elemname],doalert,allowrel,p)
}

function chkDateInForm(inputdate,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 timeval=inputdate.value;
  if (timeval.length)
  {
    if (timeval.charAt(0)=="-" ) {
      // ERS
      if (allowreld) {
        return true; // rel date
      }
      else {
        if (alertf) {
          alert ("Error: "+"Negative date time field!"+"\n\nFormat is: "+HW_UI_Date.format);
          inputdate.focus();
        }
        return false;
      }
    }

    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);
        inputdate.focus();
      }
      return false;
    }
  }
  return true;
}

function convertDateInForm(theForm,elemname,p)
{
  if (typeof theForm[elemname]=="undefined") return true;// element not found
  if (p.Elemname) p.elem=theForm[p.Elemname];
  return convDateInForm(theForm[elemname],p)
}

function convDateInForm(inputdate,p)
{
  if (typeof HW_UI_UseLocalDate !="undefined" && !HW_UI_UseLocalDate)
    return true;
  var timeval=inputdate.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.elem) p.elem.value=timeval;
      else inputdate.value=timeval;
      return true; // rel date
    }
    
    var ret=dateConv(timeval,sForm,p.TransformToGMT,false,p.dateOnly);
    if (ret.error)
      return false;

    var outdateformat=p.dateOnly?dForm.date:dForm.full;
    if (p.elem) p.elem.value=outDate(ret,outdateformat);
    else inputdate.value=outDate(ret,outdateformat);
  }
  //if empty time/date, the underlying hidden element (p.elem !) must be deleted, otherwise in case of
  //a search with TimeCreated="something" ->Searchresult->New Search deleting the "something" has no effect.
  else if (p.elem) 
    p.elem.value="";

  return true;
}


//specify format
// Y - year
// M - month
// D - day
// h - hour
// m - minute
// s - second
// ll - AM or PM

g_dates = {};
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";
DeDate.shortTime="hh:mm";
g_dates.DeDate = DeDate;

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

var UsDate=new Object();
UsDate.format="MM/DD/YYYY hh:mm:ss tt";
UsDate.minFields=3;
UsDate.maxFields=7;
UsDate.full="MM/DD/YYYY hh:mm:ss tt";
UsDate.date="MM/DD/YYYY";
UsDate.time="hh:mm:ss tt";
UsDate.shortTime="hh:mm tt";
g_dates.UsDate = UsDate;

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";
HWDate.shortTime="hh:mm";
g_dates.HWDate = HWDate;

// ERS - add support for uk date format
var ERMSDate=new Object();
ERMSDate.format="YYYY-MM-DDThh:mm:ss";
ERMSDate.minFields=1;
ERMSDate.maxFields=6;
ERMSDate.full="YYYY-MM-DDThh:mm:ss";
ERMSDate.date="YYYY-MM-DD";
ERMSDate.time="hh:mm:ss";
ERMSDate.shortTime="hh:mm";
g_dates.ERMSDate = ERMSDate;

