var Calendar = {
	
	now: function() {
		var d = new Date();
		
		if (typeof(arguments[0]) !== "undefined") {
			return (d.getMonth()+1) + "/" + d.getDate() + "/" + d.getFullYear();
		}
		else {
			var min = d.getMinutes();
			if(min < 10) {
				min = "0" + min;
			}
			var sec = d.getSeconds();
			if(sec < 10) {
				sec = "0" + sec;
			}
			var rd = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear() + " " +
			d.getHours() +
			":" +
			min +
			":" +
			sec;
			return rd;
		}
	},
	
	human_date: function(d) {
		if(!d) {
			return Calendar.now();
		}
		var mmddyy_regex = /(....)-(.{1,2})-(.{1,2})/;
		if(mmddyy_regex.test(d)) {
			var mdy_parts = mmddyy_regex.exec(d);
			return mdy_parts[2] + "/" + mdy_parts[3] + "/" + mdy_parts[1];
		} else {
			return "-1";
		}
	},
	
	dbDate: function(d) {
		var mmddyy_regex = /(.{1,2})\/(.{1,2})\/(....)/;
		if(mmddyy_regex.test(d)) {
			var mdy_parts = mmddyy_regex.exec(d);
			return mdy_parts[3] + "-" + mdy_parts[1] + "-" + mdy_parts[2];
		} else {
			return "-1";
		}
	},
	
	
	JSDate_to_dbDate: function(d) {
		d = d.getMonth() + "/" + d.getDate() + "/" + d.getFullYear();
		var mmddyy_regex = /(.{1,2})\/(.{1,2})\/(....)/;
		if(mmddyy_regex.test(d)) {
			var mdy_parts = mmddyy_regex.exec(d);
			mdy_parts[1]++;
			if(mdy_parts[1] < 10) {
				mdy_parts[1] = "0" + mdy_parts[1];
			}
			if(mdy_parts[2] < 10) {
				mdy_parts[2] = "0" + mdy_parts[2];
			}
			return mdy_parts[3] + "-" + mdy_parts[1] + "-" + mdy_parts[2];
		} else {
			return "-1";
		}
	},
	
	
	splitDate: function(d) {
		var mmddyy_regex = /(.{1,2})\/(.{1,2})\/(....)/;
		if(mmddyy_regex.test(d)) {
			var d_ar = mmddyy_regex.exec(d);
			return new Array(d_ar[3], d_ar[1], d_ar[2]);
		}
		
		var yyyymmdd_regex = /(....)\-(.{1,2})\-(.{1,2})/;
		if(yyyymmdd_regex.test(d)) {
			var d_ar = yyyymmdd_regex.exec(d);
			return d_ar.slice(1);
		}
		
		//alert("Calendar.splitDate failed: " + d);
		return d;
	},
	
	makeUTC: function(date_ar) {
		if(!is_array(date_ar)) {
			date_ar = this.splitDate(date_ar);
		}
		
		var lhs = new Date();
		lhs.setYear(date_ar[0]);
		lhs.setMonth(date_ar[1]);
		lhs.setDate(date_ar[2]);
		var utc = Date.UTC(lhs.getFullYear(),lhs.getMonth()+1,lhs.getDate());
		delete lhs;
		return utc;
	},
	
	cmpDate: function(lhs,rhs) {
		var lhs_utc = this.makeUTC(lhs);
		var rhs_utc = this.makeUTC(rhs);

		
		if(lhs_utc > rhs_utc) {
			return 1;
		}
		
		if(lhs_utc < rhs_utc) {
			return -1;
		}
		
		return 0;		
	},
	
	
	valiDates: function(lhs,mhs,rhs) {
		lhs = this.makeUTC(lhs);
		mhs = this.makeUTC(mhs);
		rhs = this.makeUTC(rhs);
		
		return ((lhs < mhs) && (mhs < rhs));
	},
	
	
	calculate_weeks: function(startDate, endDate) {
		var startDate_ar;
		if(!is_array(startDate)) {
			startDate_ar = this.splitDate(startDate);
		} else {
			startDate_ar = startDate;
		}
		
		var lhs = this.makeUTC(startDate_ar);
		
		
		var endDate_ar;
		if(!is_array(endDate)) {
			endDate_ar = this.splitDate(endDate);
		} else {
			endDate_ar = endDate;
		}
		
		var rhs = this.makeUTC(endDate_ar);
		
		
		var diff =  rhs - lhs;
		
		var secs_in_day = 24 * 60 * 60;
		var days = diff / secs_in_day;
		var weeks = Math.ceil((days / 7) / 1000); //7 days in a week...
		if(!weeks) {
			weeks = 1;
		}

		return weeks;
	},
	
	set_calendar: function(id_suffix,target_date) {
		if(!target_date) {
			target_date = this.JSDate_to_dbDate(new Date());
		} else {
			if(typeof(target_date) == "object") {
				target_date = this.JSDate_to_dbDate(target_date);
			}
		}
		
		var d_ar = this.splitDate(target_date);
		var y = "obj_year_" + id_suffix;
		var m = "obj_month_" + id_suffix;
		var d = "obj_day_" + id_suffix;
		
		Selectbox.set(y,Selectbox.find(y,d_ar[0]));
		Selectbox.set(m,Selectbox.find(m,d_ar[1]));
		Selectbox.set(d,Selectbox.find(d,d_ar[2]));
	},
	
	set: function(id_suffix,target_date) {
		return Calendar.set_calendar(id_suffix,target_date);
	},
	
	read: function(suffix) {
		return this.read_calendar(suffix);
	},
	
	read_calendar: function(id_suffix) {
		var y = "obj_year_" + id_suffix;
		var m = "obj_month_" + id_suffix;
		var d = "obj_day_" + id_suffix;
		if (typeof(arguments[1]) == "undefined") {
			return Selectbox.get(y) + "-" + Selectbox.get(m) + "-" + Selectbox.get(d);
		} else {
			return Selectbox.get(m) + "/" + Selectbox.get(d) + "/" + Selectbox.get(y);
		}
	},
	
	configure: function(startYear,endYear,id_suffix) {
		var years = new Array();
		if (startYear < endYear) {
			for (var i = startYear; i < endYear + 1; i++) {
				years.push(i);
			}
		} else {
			for (var i = startYear; i > endYear - 1; i--) {
				years.push(i);
			}
		}
		
		var days = new Array();
		for(var i=1;i<32;i++) {
			days.push(i);
		}
		
		var months = {
			"01": "January",
			"02": "February",
			"03": "March",
			"04": "April",
			"05": "May",
			"06": "June",
			"07": "July",
			"08": "August",
			"09": "September",
			"10": "October",
			"11": "November",
			"12": "December"
		};
		
		Selectbox.fill("obj_year_" + id_suffix,years);
		Selectbox.fill("obj_month_" + id_suffix,months);
		Selectbox.fill("obj_day_" + id_suffix,days);
	},
	
	
	
	
	monthDiff: function(lhsCalendar,rhsCalendar) {
		var lhs = Calendar.read(lhsCalendar);
		var rhs = Calendar.read(rhsCalendar);
		
		lhs = Calendar.splitDate(lhs);
		rhs = Calendar.splitDate(rhs);
		
		d1 = new Date();
		d1.setFullYear(lhs[0],(lhs[1]-1),lhs[2]);
		
		d2 = new Date();
		d2.setFullYear(rhs[0],(rhs[1]-1),rhs[2]);
		
		var months = d2.getMonthsBetween(d1);
		if(months < 0) { months *= -1; }
		if(months < 1) { months = 1; }
		return Math.round(months);
	},
	
	monthDiff_datestr: function(lhsCalendar,rhsCalendar) {
		
		lhs = Calendar.splitDate(lhsCalendar);
		rhs = Calendar.splitDate(rhsCalendar);
		
		d1 = new Date();
		d1.setFullYear(lhs[0],(lhs[1]-1),lhs[2]);
		
		d2 = new Date();
		d2.setFullYear(rhs[0],(rhs[1]-1),rhs[2]);
		
		var months = d2.getMonthsBetween(d1);
		if(months < 0) { months *= -1; }
		if(months < 1) { months = 1; }
		return Math.round(months);
	}
	
};









////////////////////


Date.prototype.lastday = function() {
  var d = new Date(this.getFullYear(), this.getMonth() + 1, 0);
  return d.getDate();
};



Date.prototype.getMonthsBetween = function(d) {
  var sDate, eDate;
  var d1 = this.getFullYear() * 12 + this.getMonth();
  var d2 = d.getFullYear() * 12 + d.getMonth();
  var sign;
  var months = 0;

  if (this == d) {
    months = 0;
  } else if (d1 == d2) { //same year and month
    months = (d.getDate() - this.getDate()) / this.lastday();
  } else {
    if (d1 <  d2) {
      sDate = this;
      eDate = d;
      sign = 1;
    } else {
      sDate = d;
      eDate = this;
      sign = -1;
    }

    var sAdj = sDate.lastday() - sDate.getDate();
    var eAdj = eDate.getDate();
    var adj = (sAdj + eAdj) / sDate.lastday() - 1;
    months = Math.abs(d2 - d1) + adj;
    months = (months * sign)
  }
  return months;
};
