function DateFormat(d) {
	return d.getMonth()+1+'/'+d.getDate()+'/'+d.getFullYear();
}
function daysInMonth(iMonth, iYear)
{
	return 32 - new Date(iYear, iMonth, 32).getDate();
}
Date.prototype.Add = function(strInterval, intIncrement)
{
    if(
    strInterval != "M"
    && strInterval != "D"
    && strInterval != "Y"
    && strInterval != "h"
    && strInterval != "m"
    && strInterval != "uM"
    && strInterval != "uD"
    && strInterval != "uY"
    && strInterval != "uh"
    && strInterval != "um"
    && strInterval != "us"
    )
    {
        throw("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");
    }

    if(typeof(intIncrement) != "number")
    {
        throw("DateAdd: Third parameter must be a number");
    }

    switch(strInterval)
    {
        case "M":
		dayOfMonth = this.getDate();
		maxDays = daysInMonth(parseInt(this.getMonth()) + parseInt(intIncrement), this.getFullYear());
		this.setDate(Math.min(dayOfMonth,maxDays));
        this.setMonth(parseInt(this.getMonth()) + parseInt(intIncrement));
        break;

        case "D":
        this.setDate(parseInt(this.getDate()) + parseInt(intIncrement));
        break;

        case "Y":
        this.setYear(parseInt(this.getYear()) + parseInt(intIncrement));
        break;

        case "h":
        this.setHours(parseInt(this.getHours()) + parseInt(intIncrement));
        break;

        case "m":
        this.setMinutes(parseInt(this.getMinutes()) + parseInt(intIncrement));
        break;

        case "s":
        this.setSeconds(parseInt(this.getSeconds()) + parseInt(intIncrement));
        break;

        case "uM":
        this.setUTCMonth(parseInt(this.getUTCMonth()) + parseInt(intIncrement));
        break;

        case "uD":
        this.setUTCDate(parseInt(this.getUTCDate()) + parseInt(intIncrement));
        break;

        case "uY":
        this.setUTCFullYear(parseInt(this.getUTCFullYear()) + parseInt(intIncrement));
        break;

        case "uh":
        this.setUTCHours(parseInt(this.getUTCHours()) + parseInt(intIncrement));
        break;

        case "um":
        this.setUTCMinutes(parseInt(this.getUTCMinutes()) + parseInt(intIncrement));
        break;

        case "us":
        this.setUTCSeconds(parseInt(this.getUTCSeconds()) + parseInt(intIncrement));
        break;
    }
    return this;
}
// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}
function isValidDate(dateStr, format) {
   if (format == null) { format = "MDY"; }
   format = format.toUpperCase();
   if (format.length != 3) { format = "MDY"; }
   if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) ) { format = "MDY"; }
   if (format.substring(0, 1) == "Y") { // If the year is first
      var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
      var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
   } else if (format.substring(1, 2) == "Y") { // If the year is second
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
   } else { // The year must be third
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
   }
   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
   if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
   var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
   // Check to see if the 3 parts end up making a valid date
   if (format.substring(0, 1) == "M") { var mm = parts[0]; }
   else if (format.substring(1, 2) == "M") { var mm = parts[1]; }
   else { var mm = parts[2]; }
   if (format.substring(0, 1) == "D") { var dd = parts[0]; }
   else if (format.substring(1, 2) == "D") { var dd = parts[1]; }
   else { var dd = parts[2]; }
   if (format.substring(0, 1) == "Y") { var yy = parts[0]; }
   else if (format.substring(1, 2) == "Y") { var yy = parts[1]; }
   else { var yy = parts[2]; }
   if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
   if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
   if (parseFloat(dd) != dt.getDate()) { return false; }
   if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
   return true;
}
function monthsBetween(thisDate, thatDate) {
  if (thisDate > thatDate) {
    return monthsBetween(thatDate, thisDate);
  }
 
  var number = 0;
  if (thatDate.getFullYear() > thisDate.getFullYear()) {
    number = number + (thatDate.getFullYear() - thisDate.getFullYear() - 1) * 12;
  } else {
    return thatDate.getMonth() - thisDate.getMonth();
  }
 
  if (thatDate.getMonth() > thisDate.getMonth()) {
    number = number + 12 + thatDate.getMonth() - thisDate.getMonth();
  } else {
    number = number + (12 - thisDate.getMonth()) + thatDate.getMonth();
  }

  if (thatDate.getDate() < thisDate.getDate()) {
  	number -= 1;
  }

  return number;
}
function DollarFormat(amount,symbol)
{
	var delimiter = ","; // replace comma if desired
	var a = amount;
	switch(typeof(a)) {
		case 'number':
			a = a.toFixed(2);
			a = a.toString();
			break;
		case 'string':
			a = a.replace(/\,/g,'');
			if(isNaN(a)) a = 0;
			a = parseFloat(a);
			a = a.toFixed(2);
			a = a.toString();
	}
	a = a.split('.',2);
	var d = a[1];
	if(d==null) d = '';
	var i = parseInt(a[0]);
	if(isNaN(i)) { return ''; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	var n = new String(i);
	var a = [];
	while(n.length > 3)
	{
		var nn = n.substr(n.length-3);
		a.unshift(nn);
		n = n.substr(0,n.length-3);
	}
	if(n.length > 0) { a.unshift(n); }
	n = a.join(delimiter);
	if(d.length < 1) { a = n; }
	else { a = n + '.' + d; }
	a = minus + a;
	if(symbol) a = symbol + a;
	return a;
}
function now() {
	return new Date();
}
function updateSubscriptionForm() {
	if(getCheckedValue(document.form.IsSubscription)=='0') return;

	var s = document.form.StartDate;
	var e = document.form.EndDate;
	var _s = new Date(s.value);
	var _e = new Date(e.value);
	var a = parseFloat(document.form.Amount.value.replace(/\,/g,''));
	var t = parseFloat(document.form.MaxAmountToBePaid.value.replace(/\,/g,''));
	var u = 0;
	var o = 0;
	var _one_day = 1000*60*60*24;
	var _termination = getCheckedValue(document.form.Termination);

	if(_s<now()) {
		_s = now();
	}

	if(getCheckedValue(document.form.UnitType)=='days')
		u = parseInt(document.form.UnitCount_days.value);
	else u = parseInt(document.form.UnitCount_months.value);

	if(isNaN(a)||a<10) a = 10;
	if(isNaN(u)) u = 0;
	if(isNaN(t)) t = 0;

	switch(_termination) {
		case 'endDate':
			if(u==0) break;
			if (!isValidDate(e.value)) {
				e.value = '';
				break;
			}
			o=1;
			while (o == 1) {
				if (getCheckedValue(document.form.UnitType) == 'months') {
					_months = monthsBetween(_s, _e);
					o = Math.floor(_months / u) + 1;
				}
				else {
					_days = Math.ceil((_e.getTime() - _s.getTime()) / (_one_day));
					o = Math.floor(_days / u) + 1;
				}
				if(o==1) o=2;
			}
			t = a * o;
			break;
		case 'paymentCount':
			o = parseInt(document.form.PaymentCount.value);
			if(isNaN(o)) o = 0;
			if(o==1) o=2;
			t = a * o;
			break;
		case 'amountDonated':
			if(a==0||t==0) break;
			o = Math.floor(t / a);
			if(o==1) o=2;
			t = a * o;
			break;
		case 'ongoing':
			o = 0;
			t = 0;
	}

	document.getElementById('AmountPerPayment').innerHTML = DollarFormat(a,'$');
	document.getElementById('NumberOfPayments').innerHTML = o>0?o:'n/a';
	document.getElementById('TotalAmountDonated').innerHTML = t>0?DollarFormat(t,'$'):'n/a';
	document.getElementById('min_MaxAmount').innerHTML = a>0?'(min. '+DollarFormat(a*2,'$')+')':'';

	var tmp = _s;
	/*if (getCheckedValue(document.form.UnitType) == 'months')
		tmp.Add("M",u);
	else
		tmp.Add("D",u);*/
	s.value = DateFormat(tmp);
	if (_termination != 'ongoing') {
		if (o * u * t > 0) {
			if (getCheckedValue(document.form.UnitType) == 'months')
				_s.Add("M", (o-1) * u);
			else 
				_s.Add("D", (o-1) * u);
			e.value = (_s.getMonth() + 1) + '/' + _s.getDate() + '/' + _s.getFullYear();
			if(_s.getMonth()<9) e.value = '0'+e.value;
		}
		else e.value = '';
		document.form.MaxAmountToBePaid.value = t > 0 ? DollarFormat(t) : '';
		document.form.PaymentCount.value = o > 0 ? o : '';
	}
}