function Date(month,day,year)
{
  this.month =  month;
  this.day = day;
  this.year =  year;
}

function Range(start,end)
{
  this.start = start;
  this.end = end;
}

function to_string(date)
{
  return date.month + "/" + date.day + "/" + date.year;
}

function date_from_string(val,name)
{
  pat = /(\d*).?(\d*).?(\d*)/;
  if(date_items = val.match(pat)) {
    mon = date_items[1];
    day = date_items[2];
    year = date_items[3];
    if(year < 1000) {
      alert('Please enter the ' + name + ' in MM/DD/YYYY format.');
      return ;
    }
    d = new Date(mon,day,year);
    if(validate_and_alert(mon,day,year,name))
      return d;
  }
  return ;
}

function validate_datestring(val)
{
  pat = /(\d*).?(\d*).?(\d*)/;
  if(date_items = val.match(pat)) {
    mon = date_items[1];
    day = date_items[2];
    year = date_items[3];
    if(year < 1000 || year > 9999) {
      return false;
    }
    return validate_date(mon,day,year);
  }
  return true;
}

function validate_date(mon,day,year)
{
  if(mon < 1 || mon > 12)     {
    return false;
  }
  if(day < 1 || day > 31)     {
    return false;
  }
  if(year < 1900)     {      
    return false;
  }
  if((mon == 4 || mon == 6 || mon == 9 || mon == 11) && day > 30) {
    return false;
  }
  // this is if it was leap year
  if(year % 4 == 0)	{
    if(mon == 2 && day > 29)    {       
      return false;
    }
  }
  else if(mon == 2 && day > 28)    {       
    return false;
  } 
  return true;
}

function validate_and_alert(mon,day,year,name)
{
  if (!validate_date(mon,day,year)) {
    alert("Please enter a valid date for " + name + ".");
    return false;
  }
  return true;
}

function is_valid_range(d1,d2)
{
  if(Number(d1.year) < Number(d2.year))	
	go_ahead = true;
  else {
	     if(Number(d1.year) == Number(d2.year)) {
		if(Number(d1.month) < Number(d2.month)) {
			go_ahead = true;
		}
		else {
			if(Number(d1.month) == Number(d2.month))
				go_ahead = (Number(d1.day) <= Number(d2.day))? true : false;
			else
				go_ahead = false;
		     }
              }
		else
		go_ahead = false;
	}
  return go_ahead;
}

function number_of_days(d1,d2)
{
        if(d1.year == d2.year)  {
            diff = days_from_1st_jan(d2) - days_from_1st_jan(d1);
        } else {
            diff = days_from_1st_jan(d2) + days_to_31st_dec(d1);
            if((d2.year - d1.year) > 1) {
              for(i=d1.year;i<d2.year-1;i++)
              {
                if(i % 4)
                    diff += 365;
                else
                    diff += 366;
              }
            }
          }
      return diff;
}


function days_from_1st_jan(d1)
{
  var m = d1.month;
  var diff = 0;
  for(j=0;j<m;j++)
  {
    if(j == 2) {
      if(d1.year % 4)
        diff += 28 ;
      else
        diff += 29 ;
    } else {
        if(j == 1 || j == 3 || j ==5 || j == 7 || j == 8 || j == 10 || j == 12)         {
          diff += 31 ;
        } else
              if(j > 0)
                  diff += 30 ;
      }
  }
  diff += new Number(d1.day);
  return diff;
}

function days_to_31st_dec(d1)
{
  var m = d1.month;
  var diff = 0;
  for(j=m;j<=12;j++)
  {
    if(j == 2) {
      if(d1.year % 4)
        diff += 28 ;
      else
        diff += 29 ;
    } else {
        if(j == 1 || j == 3 || j ==5 || j == 7 || j == 8 || j == 10 || j == 12)         {
          diff += 31 ;
        } else
              if(j > 0)
                  diff += 30 ;
      }
  }
  diff -= new Number(d1.day);
  return diff;
}

function check_dates(range_start,range_end,name)
{
  var d1 = "";
  var d2 = "";
  d1 = document.getElementById(range_start).value;
  d2 = document.getElementById(range_end).value;
  if(d1 == '' || d2 == '')  {
    alert('Please enter valid Start and End dates for ' + name);
  	return false;
  }

  if(d1 != "" || d2 != "")
  {
    var dd1 = date_from_string(d1,"Start Date " + name);
    var dd2 = date_from_string(d2,"End Date " + name);
                                                                                                    
    if(dd1 && dd2) {
      if(!is_valid_range(dd1,dd2))
      {
        alert("The Start Date should be earlier than the End for " + name);
        return false;
      }
    } else 
  			return false;
  }
	return true;
}


function filter_date_type_doc(selected_doc_type,selected_date)
{
  var dropdown = document.getElementById("date_type");

  var date_type_options = new Array();
  date_type_options[0] = [ "none" , new Option('Report Date',"report_date",false,false)];
  date_type_options[1] = [ "none" , new Option('Created Date',"creation_date",false,false)];
  date_type_options[2] = [ "none" , new Option('Last Modified Date',"last_modified",false,false)];
  date_type_options[3] = [ "order" , new Option('Converted to Order Date',"ordered_date",false,false)];
  date_type_options[4] = [ "invoice" , new Option('Converted to Invoice Date',"invoiced_date",false,false)];
  date_type_options[5] = [ "po" , new Option('Submitted Date',"submitted_date",false,false)];

  var j=0;
  dropdown.options.length=0;
  for (var i=0;i<date_type_options.length;i++)
  {
    if(date_type_options[i][0] == "none" || date_type_options[i][0] == selected_doc_type)
    {
      dropdown.options[j] = date_type_options[i][1];
      if(selected_date == dropdown.options[j].value) {
              dropdown.options[j].selected = true;
      }
      j++;
    }
  }
}


