function FormatDate(_date, _formatstring, _lang, _DisplayGHM, _DisplayGHMTime)
{
   try
   {
      if (!_lang)
         _lang = "eng";
         
      if ( (_date==null) ||(_date=="") )
            return "";

      var _res;
      var _monthno = _date.getMonth() + 1;
      var _montjs = _date.getMonth();
      var _dayno        = _date.getDay();
      var _m            = _monthno +"";
      var _mm           = _m;  if (_mm.length == 1) _mm = "0" + _mm;;
      var _d            = _date.getDate()+"";;
      var _dd           = _d;  if (_dd.length == 1) _dd = "0" + _dd;;
      var _yyyy         = _date.getFullYear()+"";
      var _h            = _date.getHours() + "";
      var _hh           = _date.getHours() + ""; if (_hh.length == 1) _hh = "0" + _hh;
      var _mi   	      = _date.getMinutes()+"";  if (_mi.length == 1) _mi = "0" + _mi;
      var _ss   	      = _date.getSeconds()+"";  if (_ss.length == 1) _ss = "0" + _ss; 
         
      var _dayshort;
      var _daylong;
      var _monthshort = "";
      var _monthlong  = "";
      var _langno;
      var _monthno;
      var _dayno;  


      _lang = _lang.toLowerCase(); 
      _langno = 2; //eng 
      if (_lang == "ger") _langno=1;
      if (_lang == "eng") _langno=2;


      switch (_langno)
      {
		   case 1 : // DEUTSCH
			   switch (_monthno)
			   {				
				   case 1 : _monthlong = "Januar"; break;
				   case 2 : _monthlong = "Februar"; break;
				   case 3 : _monthlong = "März"; break;
				   case 4 : _monthlong = "April"; break;
				   case 5 : _monthlong = "Mai"; break;
				   case 6 : _monthlong = "Juni"; break;
				   case 7 : _monthlong = "Juli"; break;
				   case 8 : _monthlong = "August"; break;
				   case 9 : _monthlong = "September"; break;
				   case 10: _monthlong = "Oktober"; break;
				   case 11: _monthlong = "November"; break;
				   case 12: _monthlong = "Dezember"; break;
		   }						    
			   break;    
		   default: // ENGLISCH
			   switch (_monthno)
			   {				
				   case 1 : _monthlong = "January"; break;
				   case 2 : _monthlong = "February"; break;
				   case 3 : _monthlong = "March"; break;
				   case 4 : _monthlong = "April"; break;
				   case 5 : _monthlong = "May"; break;
				   case 6 : _monthlong = "June"; break;
				   case 7 : _monthlong = "July"; break;
				   case 8 : _monthlong = "August"; break;
				   case 9 : _monthlong = "September"; break;
				   case 10: _monthlong = "October"; break;
				   case 11: _monthlong = "November"; break;
				   case 12: _monthlong = "December"; break;
			   }		
      }

      switch (_langno)
      {
	   case 1 : // DEUTSCH
		   switch (_dayno)
		   {				
				   case 1: 
				    	   _daylong = "Montag";
				    	   _dayshort= "Mo";
				    	   break;
				   case 2: 
				    	   _daylong = "Dienstag";
				    	   _dayshort= "Di";
				    		   break;
				   case 3: _daylong = "Mittwoch";
				    	   _dayshort= "Mi";  
				    	   break;
				   case 4: _daylong = "Donnerstag";
				    	   _dayshort= "Do";
				    		   break;
				   case 5: _daylong = "Freitag";
				    	   _dayshort= "Fr";
				    		   break;
				   case 6: _daylong = "Samstag";
				    	   _dayshort= "Sa";
				    		   break;
				   case 0: _daylong = "Sonntag"; 
				    	   _dayshort= "So";
				    		   break;
		   }		
	   break;				    
	   default: //ENGLISCH
		   switch (_dayno)
		   {
				   case 1: 
				    	   _daylong = "Monday";
				    	   _dayshort= "Mon";
				    	   break;
				   case 2: 
				    	   _daylong = "Tuesday";
				    	   _dayshort= "Tue";
				    		   break;
				   case 3: _daylong = "Wednesday";
				    	   _dayshort= "Wed";  
				    	   break;
				   case 4: _daylong = "Thursday";
				    	   _dayshort= "Thu";
				    		   break;
				   case 5: _daylong = "Friday";
				    	   _dayshort= "Fri";
				    		   break;
				   case 6: _daylong = "Saturday";
				    	   _dayshort= "Sat";
				    		   break;
				   case 0: _daylong = "Sunday"; 
				    	   _dayshort= "Sun";
				    		   break;
		   }  		         
      }
            
      _monthshort = _monthlong.substr(0,3);

      _res = _formatstring.toLowerCase()


      if (_DisplayGHM)
      {
         var heute = new Date();
         var isGHM = false;
         heute = new Date(heute.getFullYear(), heute.getMonth(), heute.getDate());
         heute /= 1000;
         var morgen = heute + (24*3600);
         var gestern = heute - (24*3600);
         var entryDate = new Date(_date.getFullYear(), _date.getMonth(), _date.getDate());
         entryDate /= 1000;
         if (entryDate == heute || entryDate == gestern || entryDate == morgen)
         {
            if (entryDate == heute)
            {
               entryDate = _langno == 1 ? "Heute" : "Today";
               isGHM = true;
            }
            else if (entryDate == gestern)
            {
               entryDate = _langno == 1 ? "Gestern" : "Yesterday";
               isGHM = true;
            }
            else if (entryDate == morgen)
            {
               entryDate = _langno == 1 ? "Morgen" : "Tomorrow";
               isGHM = true;
            }
            var pos1 = _res.indexOf("#h");

            if (pos1 > 0)
            {
               _res = entryDate + (typeof (_DisplayGHM).toLowerCase() == "string" ? _DisplayGHM : "") + " " + _res.substr(pos1);
            }
            else if (pos1 < 0)
            {
               _res = entryDate
               if(_DisplayGHMTime && isGHM)
               {
                  _res += ", #h#:#mi#" + (_lang == "ger" ? " Uhr" : "");
               }
            }
         }
         
      }

      _res = _res.replace ("#monthlong#", _monthlong);
      _res = _res.replace ("#monthshort#", _monthshort);
      _res = _res.replace ("#daylong#", _daylong);
      _res = _res.replace ("#dayshort#", _dayshort);
      _res = _res.replace ("#yyyy#", _yyyy );
      _res = _res.replace ("#yy#", _yyyy.substr(2,2) );
      _res = _res.replace ("#mm#", _mm);
      _res = _res.replace ("#mjs#", _montjs);
      _res = _res.replace ("#m#",  _m);
      _res = _res.replace ("#dd#", _dd);
      _res = _res.replace ("#d#",  _d);
      _res = _res.replace ("#h#", _h);
      _res = _res.replace ("#hh#", _hh);
      _res = _res.replace ("#mi#",  _mi);
      _res = _res.replace ("#ss#",  _ss);
   }
   catch (e)
   {
      if (_IPSE || _IPAS)
      {
         _res = e.description + ": " + _date;
      }
      else
      {
         _res = "";
      }
   }
   return _res
}


function parseDate(dateStr)
{
   if (!dateStr)
      return null;
   if (dateStr.indexOf("-") != -1)
      return parseEnglishDate(dateStr);
   return parseGermanDate(dateStr);
}

function parseEnglishDate(dateStr)
{
   //Eingabeformat = d[d].m[m].y[y][y][y]

   if ((dateStr == "") || ((dateStr == null)))
      return null;
   p1 = dateStr.indexOf("-");
   p2 = dateStr.lastIndexOf("-");

   //yyyy-mm-dd
   y = dateStr.substr(0, p1) * 1;
   m = dateStr.substr(p1 + 1, p2 - p1 - 1) * 1;
   d = dateStr.substr(p2 + 1, 4) * 1;

   if (y <= 12) //mm-dd-yyyy
   {
      var x = y;
      y = d;
      d = m;
      m = x;
   }

   return (new Date(y, m-1, d));
}

function parseGermanDate (dateStr)
{
  //Eingabeformat = d[d].m[m].y[y][y][y]
    
  if ( (dateStr=="") || ((dateStr==null)) )  
      return null;
  p1 = dateStr.indexOf(".");
  p2 = dateStr.lastIndexOf(".");  
  
  d = dateStr.substr(0,p1) * 1;
  m = dateStr.substr(p1 + 1 , p2-p1 -1) * 1 -1;
  y = dateStr.substr(p2 +1 ,4) * 1;

  return (new Date(y, m, d) );
}

function parseGermanDateTime(dateStr) {
    //Eingabeformat = d[d].m[m].y[y][y][y]
    pos = dateStr.indexOf(" ");
    if (pos == -1)
        return null;
    datePart = dateStr.substr(0, pos);
    timePart = dateStr.substr(pos + 1);
    if (dateStr == "" || dateStr == null)
        return null;
    p1 = datePart.indexOf(".");
    p2 = datePart.lastIndexOf(".");

    d = datePart.substr(0, p1) * 1;
    m = datePart.substr(p1 + 1, p2 - p1 - 1) * 1 - 1;
    y = datePart.substr(p2 + 1) * 1;

    h = 0;
    mi = 0;
    s = 0;
    ms = 0;
    if (timePart != "")
    {
        p1 = timePart.indexOf(":");
        p2 = timePart.lastIndexOf(":");
        p3 = timePart.lastIndexOf(".");
        h = timePart.substr(0, p1) * 1;
        mi = timePart.substr(p1 + 1, p2 - p1 - 1) * 1;
        if (p3 != -1) 
        {
            s = timePart.substr(p2 + 1, p3 - p2 - 1) * 1;
            ms = timePart.substr(p3+1) * 1;
        }
        else
            s = timePart.substr(p2 + 1) * 1;
    }
    return (new Date(y, m, d, h, mi, s, ms));
}


function SQLDateTimeToDate (_value)
{
  if ( (_value==null) || (_value=="") )
      return null;
      
  return new Date( _value );
}

function DateToSQLDateTime (_date)
{
  if ( (_date==null) || (_date=="") )
      return null;
      
  //return (_date.valueOf() / 1000 /60 /60 /24  +  25570);
  //return ( (_date.valueOf() / 1000 /60 /60 +2)  /24  +  25569);
  return ( (_date.valueOf() / 1000 /60 /60 - (_date.getTimezoneOffset()/ 60))  /24  +  25569);
}

function dmyToDateTime (dateStr)
{
   return DateToSQLDateTime (parseGermanDate(dateStr));
}

function dmyhToDateTime (dateStr)
{
   return DateToSQLDateTime (parseGermanDateTime(dateStr));
}

function daysBetween(earlyDate,laterDate)
{
   //-- Returns number of days between two date objects.
   var earlySecs=earlyDate.getTime()
   var laterSecs=laterDate.getTime()
   return Math.floor ((((((laterSecs-earlySecs)/1000)/60)/60)/24))
}

function DateAdd(opt, d, value)
{
   var secs = d.getTime();
   if (opt=="day")
   {
      secs = secs + value*1000*60*60*24;
   }
   
   return new Date(secs);
}

function IstSommerzeit(dateObj)
{
    if (dateObj.getHours() - dateObj.getUTCHours() == 2)
      return true;
    else
      return false;  
}


function getYearWeek (_date)
{
   DoDat = donnerstag(_date);
   kwjahr = DoDat.getFullYear();
   DoKW1 = donnerstag(new Date(kwjahr,0,4));
   return Math.floor(1.5+(DoDat.getTime()-DoKW1.getTime())/86400000/7);
}
function donnerstag(datum) 
{
   var Do = new Date();
   Do.setTime(datum.getTime() + (3-((datum.getDay()+6) % 7)) * 86400000);
   return Do;
}

function DatePartDate(_dateTime) 
{
   return new Date(_dateTime.getFullYear(), _dateTime.getMonth(), _dateTime.getDate());
}

function ParseXMLDate(_dateStr)
{
   var regExp = /(\d{4})-(\d{1,})-(\d{1,})T(\d{1,}):(\d{1,}):(\d{1,})*/;
   var matchObj = regExp.exec(_dateStr);
   if (matchObj)
   {
      return new Date (matchObj[1], matchObj[2]-1, matchObj[3], matchObj[4], matchObj[5], matchObj[6]);
   }
   else
      return new Date(1970,1,1);
}
