// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
// ===================================================================

var 
  MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var 
  DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');

function LZ(x)
{
  return(x<0||x>9?"":"0")+x
}

function isDate(val,format)
{
  var 
    date=getDateFromFormat(val,format);
  
  if(date==0)
  {
    return false;
  }
  return true;
}

function compareDates(date1,dateformat1,date2,dateformat2)
{
  var 
    d1=getDateFromFormat(date1,dateformat1);
  var 
    d2=getDateFromFormat(date2,dateformat2);
    
  if (d1==0 || d2==0)
    return -1;
  else if (d1 > d2)
    return 1;
  return 0;
}

function formatDate(date,format)
{
  format=format+"";
  
  var 
    result="",
    i_format=0,
    c="",
    token="";
   
  var
    y=date.getYear()+"",
    M=date.getMonth()+1,
    d=date.getDate(),
    E=date.getDay(),
    H=date.getHours(),
    m=date.getMinutes(),
    s=date.getSeconds();
    
  var 
    yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
  
  var 
    value=new Object();
  
  if (y.length < 4)
    y=""+(y-0+1900);

  value["y"]    = ""+y;
  value["yyyy"] = y;
  value["yy"]   = y.substring(2,4);
  value["M"]    = M;
  value["MM"]   = LZ(M);
  value["MMM"]  = MONTH_NAMES[M-1];
  value["NNN"]  = MONTH_NAMES[M+11];
  value["d"]    = d;
  value["dd"]   = LZ(d);
  value["E"]    = DAY_NAMES[E+7];
  value["EE"]   = DAY_NAMES[E];
  value["H"]    = H;
  value["HH"]   = LZ(H);

  if (H==0)
    value["h"] = 12;
  else if (H>12)
    value["h"] = H-12;
  else
    value["h"] = H;
  value["hh"] = LZ(value["h"]);

  if (H>11)
    value["K"] = H-12;
  else
    value["K"] = H;

  value["k"]  = H+1;
  value["KK"] = LZ(value["K"]);
  value["kk"] = LZ(value["k"]);
  if (H > 11)
    value["a"] = "PM";
  else 
    value["a"] = "AM";

  value["m"]  = m;
  value["mm"] = LZ(m);
  value["s"]  = s;
  value["ss"] = LZ(s);
  while (i_format < format.length)
  {
    c=format.charAt(i_format);
    token="";
    while ( (format.charAt(i_format)==c) && (i_format < format.length) )
      token += format.charAt(i_format++);
    if(value[token] != null)
      result=result + value[token];
    else
      result=result + token;
  }
  return result;
}
      
function _isInteger(val)
{
  var 
    digits="1234567890";
  
  for( var i=0; i < val.length; i++ )
  {
    if ( digits.indexOf(val.charAt(i))==-1)
    {
      return false;
    }
  }
  return true;
}

function _getInt(str,i,minlength,maxlength)
{
  for (var x=maxlength; x>=minlength; x--)
  {
    var 
      token=str.substring(i,i+x);
 
    if(token.length < minlength)
      return null;
 
    if(_isInteger(token))
      return token;
  }
  return null;
}

function getDateFromFormat(val,format)
{
  val=val+"";
  format=format+"";
  
  var 
    i_val=0,i_format=0;
  
  var 
    c="";
  var 
    token="",
    token2="";
  
  var 
    x,y;
  
  var 
    now=new Date(),
    year=now.getYear(),
    month=now.getMonth()+1,
    date=1,
    hh=now.getHours(),
    mm=now.getMinutes(),
    ss=now.getSeconds();

  var 
    ampm="";
  
  while (i_format < format.length)
  {
    c=format.charAt(i_format);
    token="";
    while ( (format.charAt(i_format)==c) && (i_format < format.length))
     token += format.charAt(i_format++);
    if (token=="yyyy" || token=="yy" || token=="y")
    {
      if(token=="yyyy")
      {
        x=4;
        y=4;
      }
      if (token=="yy")
      {
        x=2;
        y=2;
      }
      if(token=="y")
      {
        x=2;
        y=4;
      }
      year=_getInt(val,i_val,x,y);
      if (year==null)
      {
//        alert('r209:year='+year);
        return 0;
      }
      i_val += year.length;
      if (year.length==2)
      {
        if(year > 70)
          year=1900+(year-0);
        else
          year=2000+(year-0);
      }
    }
    else if (token=="MMM"||token=="NNN")
    {
      month=0;
      for (var i=0;i<MONTH_NAMES.length;i++)
      {
        var month_name=MONTH_NAMES[i];
        if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase())
        {
          if(token=="MMM"||(token=="NNN"&&i>11))
          {
            month=i+1;
            if(month>12)
              month -= 12;

            i_val += month_name.length;
            break;
          }
        }
      }
      if ((month < 1)||(month>12))
      {
        //alert('r242:month='+month);
        return 0;
      }
    }
    else if (token=="EE"||token=="E")
    {
      for(var i=0;i<DAY_NAMES.length;i++)
      {
        var 
          day_name=DAY_NAMES[i];
        
        if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase())
        {
          i_val += day_name.length;
          break;
        }
      }
    }
    else if (token=="MM"||token=="M")
    {
      month=_getInt(val,i_val,token.length,2);
      if (month==null||(month<1)||(month>12))
      {
        //alert('r265:month='+month);
        return 0;
      }
      i_val+=month.length;
    }
    else if (token=="dd"||token=="d")
    {
      date=_getInt(val,i_val,token.length,2);
      if (date==null||(date<1)||(date>31))
      {
        //alert('r265:date='+date);
        return 0;
      }
      i_val+=date.length;
    }
    else if (token=="hh"||token=="h")
    {
      hh=_getInt(val,i_val,token.length,2);
      if (hh==null||(hh<1)||(hh>12))
      {
        //alert('r285:hh='+hh);
        return 0;
      }
      i_val+=hh.length;
    }
    else if(token=="HH"||token=="H")
    {
      hh=_getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>23))
      {
        //alert('r295:hh='+hh);
        return 0;
      }
      i_val+=hh.length;
    }
    else if (token=="KK"||token=="K")
    {
      hh=_getInt(val,i_val,token.length,2);
      if (hh==null||(hh<0)||(hh>11))
      {
        //alert('r305:hh='+hh);
        return 0;
      }
      i_val+=hh.length;
    }
    else if(token=="kk"||token=="k")
    {
      hh=_getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>24))
      {
        //alert('315:hh='+hh);
        return 0;
      }
      i_val+=hh.length;
      hh--;
    }
    else if(token=="mm"||token=="m")
    {
      mm=_getInt(val,i_val,token.length,2);
      if(mm==null||(mm<0)||(mm>59))
      {
        //alert('r326:mm='+mm);
        return 0;
      }
      i_val+=mm.length;
    }
    else if (token=="ss"||token=="s")
    {
      ss=_getInt(val,i_val,token.length,2);
      if(ss==null||(ss<0)||(ss>59))
      {
        //alert('r336:ss='+ss);
        return 0;
      }
      i_val+=ss.length;
    }
    else if (token=="a")
    {
      if(val.substring(i_val,i_val+2).toLowerCase()=="am")
      {
        ampm="AM";
      }
      else if (val.substring(i_val,i_val+2).toLowerCase()=="pm")
        ampm="PM";
      else
      {
        //alert('r351:ampm='+ampm);
        return 0;
      }
      i_val+=2;
    }
    else
    {
      if (val.substring(i_val,i_val+token.length)!=token)
      {
        //alert('r360:token='+token);
        return 0;
      }
      else
        i_val+=token.length;
    }
  }
  if (i_val != val.length)
  {
    //alert('r370:i_val='+i_val);
    return 0;
  }

  if(month==2)
  {
    if ( ((year%4==0)&&(year%100 != 0) ) ||(year%400==0) )
    {
      if(date > 29)
      {
        //alert('r326:date='+date);
        return 0;
      }
    }
    else
    {
      if (date > 28)
      {
        //alert('r387:date='+date);
        return 0;
      }
    }
  }
  if ((month==4)||(month==6)||(month==9)||(month==11))
  {
    if(date > 30)
    {
      //alert('r396:date='+date);
      return 0;
    }
  }
  if(hh<12 && ampm=="PM")
    hh=hh-0+12;
  else if(hh>11 && ampm=="AM")
    hh-=12;

  var 
    newdate=new Date(year,month-1,date,hh,mm,ss);
  
  return newdate.getTime();
}

function parseDate(val)
{
  var 
    preferEuro=(arguments.length==2)?arguments[1]:false;
  
  generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
  
  monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
  
  dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
  
  var 
    checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
  
  var 
    d=null;
    
  for (var i=0;i<checkList.length;i++)
  {
    var 
      l=window[checkList[i]];

    for(var j=0;j<l.length;j++)
    {
      d=getDateFromFormat(val,l[j]);
      if(d!=0)
        return new Date(d);
    }
  }
  return null;
}

