var IOM_TOV = 1;
var HOL_A_MOED = 2;
var HAG = 3;
var ZOM = 4;
var ROSH_HODESH = 5;
var UNKNOWN_MOED_TYPE = 99;

function MoedDay (date, type) {
	this.date = date;
	this.type = type;
}

function Moed (id, mtitle, mdescr, cond, month, days_before, days_after, rubrics, properties, cycles) {
	this.id = id;
	this.mtitle = mtitle;
	this.mdescr = mdescr;
	this.cond = cond;
	this.month = month;
	this.days_before = days_before;
	this.days_after = days_after;
	this.rubrics = rubrics;
	this.properties = properties;
	this.cycles = cycles;
}

function Moed_get_moed_end (cdate, cmonth, cyear, galut) {
	var date_end = cdate;
	var month_end = cmonth;
	var year_end = cyear;
	var initDate = new Date(year_end, month_end - 1, date_end);
	var i = 1;
	while (true) {
		curDate = new Date(initDate.getTime() + i*24*3600*1000);
		var date1 = curDate.getDate();
		var month1 = curDate.getMonth() + 1;
		var year1 = curDate.getFullYear();
		var dow = curDate.getDay();
		var curHebDate  = getHebFromCiv (date1, month1, year1);
		var date = curHebDate.date;
		var month = curHebDate.month;
		var year = curHebDate.year;
		var mlength = curHebDate.monthlength;
		var ret = 0;
		eval(this.cond);
		if (ret != 0) {
			date_end = date1;
			month_end = month1;
			year_end = year1;
		} else {
			break;
		}
		i++;
	}
	return new Array (date_end, month_end, year_end);
}
Moed.prototype.get_moed_end = Moed_get_moed_end;

function Moed_get_moed_begin (cdate, cmonth, cyear, galut) {
	var date_begin = cdate;
	var month_begin = cmonth;
	var year_begin = cyear;
	var initDate = new Date(year_begin, month_begin - 1, date_begin);
	var i = 1;
	while (true) {
		curDate = new Date(initDate.getTime() - i*24*3600*1000);
		var date1 = curDate.getDate();
		var month1 = curDate.getMonth() + 1;
		var year1 = curDate.getFullYear();
		var dow = curDate.getDay();
		var curHebDate  = getHebFromCiv (date1, month1, year1);
		var date = curHebDate.date;
		var month = curHebDate.month;
		var year = curHebDate.year;
		var mlength = curHebDate.monthlength;
		var ret = 0;
		eval(this.cond)
		if (ret != 0) {
			date_begin = date1;
			month_begin = month1;
			year_begin = year1;
		} else {
			break;
		}
		i++;
	}
	return new Array (date_begin, month_begin, year_begin);
}
Moed.prototype.get_moed_begin = Moed_get_moed_begin;
	
function Moed_get_moed_range (cdate, cmonth, cyear, galut) {
	var begin = this.get_moed_begin (cdate, cmonth, cyear, galut);
	var date_begin = begin[0];
	var month_begin = begin[1];
	var year_begin = begin[2];
	var end = this.get_moed_end (cdate, cmonth, cyear, galut);
	var date_end = end[0];
	var month_end = end[1];  
	var year_end = end[2]; 
	return new Array (date_begin, month_begin, year_begin, date_end, month_end, year_end);
}
Moed.prototype.get_moed_range = Moed_get_moed_range;

function Moed_get_moed_link (sub_url, cc_url) {
	return sub_url + cc_url + "_" + this.id + ".html";
}
Moed.prototype.get_moed_link = Moed_get_moed_link;

function MoedInList (moed_begin_date, moed_begin_month, moed_begin_year, moed_end_date, moed_end_month, moed_end_year, link, priority, moed, galut) {
	this.moed_begin_date = moed_begin_date;
	this.moed_begin_month = moed_begin_month;
	this.moed_begin_year = moed_begin_year;
	this.moed_end_date = moed_end_date;
	this.moed_end_month = moed_end_month;
	this.moed_end_year = moed_end_year;
	this.moed_link = link;
	this.moed_priority = priority;
	this.moed_dates = new Array();
	
	this.moed = new Moed(moed.id, moed.mtitle, moed.mdescr, moed.cond, moed.month, moed.days_before, moed.days_after, moed.rubrics, moed.properties, moed.cycles);
	
	var endDate = new Date(moed_end_year, moed_end_month - 1, moed_end_date, 1, 1, 1);
	var beginDate = new Date(moed_begin_year, moed_begin_month - 1, moed_begin_date, 1, 1, 1);
	if (endDate.getTime() == beginDate.getTime()) {
		var curDate = new Date(beginDate.getTime());
		var date1 = curDate.getDate();
		var month1 = curDate.getMonth() + 1;
		var year1 = curDate.getFullYear();
		var dow = curDate.getDay();
		var curHebDate  = getHebFromCiv (date1, month1, year1);
		var date = curHebDate.date;
		var month = curHebDate.month;
		var year = curHebDate.year;
		var mlength = curHebDate.monthlength;
		var ret = 0;
		eval(this.moed.cond);
		this.moed_dates[0] = new MoedDay (new Array(date1, month1, year1), ret);
	} else {
		curDate = beginDate;
		var i = 0;
		while (curDate.getTime() < endDate.getTime()) {
			var curDate = new Date(beginDate.getTime() + i*24*60*60*1000);
			var date1 = curDate.getDate();
			var month1 = curDate.getMonth() + 1;
			var year1 = curDate.getFullYear();
			var dow = curDate.getDay();
			var curHebDate  = getHebFromCiv (date1, month1, year1);
			var date = curHebDate.date;
			var month = curHebDate.month;
			var year = curHebDate.year;
			var mlength = curHebDate.monthlength;
			var ret = 0;
			eval(this.moed.cond);
			this.moed_dates[i] = new MoedDay (new Array(date1, month1, year1), ret);
			i++;
		}
	}
}

function MoedInList_get_type_by_date (cdate, cmonth, cyear) {
	for (i in this.moed_dates) {
		if (this.moed_dates[i].date[0] == cdate && this.moed_dates[i].date[1] == cmonth && this.moed_dates[i].date[2] == cyear)
			return this.moed_dates[i].type;
	}
	return UNKNOWN_MOED_TYPE;
}

MoedInList.prototype.get_type_by_date = MoedInList_get_type_by_date;


function Moadim (moed_sub_url, moed_cc_url) {
	this.moed_sub_url = moed_sub_url;
	this.moed_cc_url = moed_cc_url;
	this.moadim = new Array();
	this.recent_moadim = new Array();
	this.current_moadim = new Array();
	this.coming_moadim = new Array();
}

function Moadim_get_recent_moadim (cdate, cmonth, cyear, galut) {
	var initDate = new Date(cyear, cmonth - 1, cdate);
	this.recent_moadim = new Array ();
	if (this.moadim.length > 0) {
		var j = 0;
		for (id in this.moadim) {
			for (var i = 0; i <= this.moadim[id].days_after; i++) {
				var curDate = new Date (initDate.getTime() - i*24*60*60*1000)
				var date1 = curDate.getDate();
				var month1 = curDate.getMonth() + 1;
				var year1 = curDate.getFullYear();
				var dow = curDate.getDay();
				var curHebDate  = getHebFromCiv (date1, month1, year1);
				var date = curHebDate.date;
				var month = curHebDate.month;
				var year = curHebDate.year;
				var mlength = curHebDate.monthlength;
				var ret = 0;
				eval(this.moadim[id].cond);
				
				if (ret != 0) {
					if (i == 0) // current moed
						break;
					var moedRange = this.moadim[id].get_moed_range (date1, month1, year1, galut);					
					var moed_begin_date = moedRange[0];
					var moed_begin_month = moedRange[1];
					var moed_begin_year = moedRange[2];
					var moed_end_date = moedRange[3];
					var moed_end_month = moedRange[4];
					var moed_end_year = moedRange[5];
					var link = this.moadim[id].get_moed_link (this.moed_sub_url, this.moed_cc_url);
					var priority = i;
					this.recent_moadim[j] = new MoedInList (moed_begin_date, moed_begin_month, moed_begin_year, 
															moed_end_date, moed_end_month, moed_end_year,
															link, priority, this.moadim[id], galut);
					j++;
					break;
				}
			}
		}
		this.recent_moadim.reverse();
	}
	return this.recent_moadim;
}
Moadim.prototype.get_recent_moadim = Moadim_get_recent_moadim;

function Moadim_get_coming_moadim (cdate, cmonth, cyear, galut) {
	var initDate = new Date(cyear, cmonth - 1, cdate);
	this.coming_moadim = new Array ();
	if (this.moadim.length > 0) {
		var j = 0;
		for (id in this.moadim) {
			for (var i = 0; i <= this.moadim[id].days_before; i++) {
				var curDate = new Date (initDate.getTime() + i*24*60*60*1000)
				var date1 = curDate.getDate();
				var month1 = curDate.getMonth() + 1;
				var year1 = curDate.getFullYear();
				var dow = curDate.getDay();
				var curHebDate  = getHebFromCiv (date1, month1, year1);
				var date = curHebDate.date;
				var month = curHebDate.month;
				var year = curHebDate.year;
				var mlength = curHebDate.monthlength;
				var ret = 0;
				eval(this.moadim[id].cond);
				if (ret != 0) {
					if (i == 0) // current moed
						break;
					var moedRange = this.moadim[id].get_moed_range (date1, month1, year1, galut);					
					var moed_begin_date = moedRange[0];
					var moed_begin_month = moedRange[1];
					var moed_begin_year = moedRange[2];
					var moed_end_date = moedRange[3];
					var moed_end_month = moedRange[4];
					var moed_end_year = moedRange[5];
					var link = this.moadim[id].get_moed_link (this.moed_sub_url, this.moed_cc_url);
					var priority = i;
					this.coming_moadim[j] = new MoedInList (moed_begin_date, moed_begin_month, moed_begin_year, 
															moed_end_date, moed_end_month, moed_end_year,
															link, priority, this.moadim[id], galut);
					j++;
					break;
				}
			}
		}		
	}
	return this.coming_moadim;
}
Moadim.prototype.get_coming_moadim = Moadim_get_coming_moadim;

function Moadim_get_current_moadim (cdate, cmonth, cyear, galut) {
	var initDate = new Date(cyear, cmonth - 1, cdate);
	this.current_moadim = new Array ();
	if (this.moadim.length > 0) {
		var j = 0;
		for (id in this.moadim) {
			var date1 = cdate;
			var month1 = cmonth;
			var year1 = cyear;
			var dow = initDate.getDay();
			var curHebDate  = getHebFromCiv (date1, month1, year1);
			var date = curHebDate.date;
			var month = curHebDate.month;
			var year = curHebDate.year;
			var mlength = curHebDate.monthlength;
			var ret = 0;
			eval(this.moadim[id].cond);
			
			if (ret != 0) {
				var moedRange = this.moadim[id].get_moed_range (date1, month1, year1, galut);					
				var moed_begin_date = moedRange[0];
				var moed_begin_month = moedRange[1];
				var moed_begin_year = moedRange[2];
				var moed_end_date = moedRange[3];
				var moed_end_month = moedRange[4];
				var moed_end_year = moedRange[5];
				var link = this.moadim[id].get_moed_link (this.moed_sub_url, this.moed_cc_url);
				var priority = ret;
				this.current_moadim[j] = new MoedInList (moed_begin_date, moed_begin_month, moed_begin_year, 
														moed_end_date, moed_end_month, moed_end_year,
														link, priority, this.moadim[id], galut);
				j++;
			}
		}	
	}

	this.current_moadim = this.sort_moadim(this.current_moadim, cdate, cmonth, cyear);
	return this.current_moadim;
}
Moadim.prototype.get_current_moadim = Moadim_get_current_moadim;

function Moadim_sort_moadim (moadim, cdate, cmonth, cyear) {
	for (var i=0; i < moadim.length; i++) {
		for (j = i + 1; j < moadim.length; j++) {
			if (moadim[i].get_type_by_date (cdate, cmonth, cyear) >
				moadim[j].get_type_by_date (cdate, cmonth, cyear)) {
				var tmp = moadim[i];
				moadim[i] = moadim[j];
				moadim[j] = tmp;
			}
		}
	}
	return moadim;
}
Moadim.prototype.sort_moadim = Moadim_sort_moadim;

function Moadim_get_term_moadim_str (moadim, cdate, cmonth, cyear) {
		var moadim_str = "";
		if (moadim.length > 0) {
			for (var i = 0; i < moadim.length; i++) {
				moadim_str += "<a href='" + moadim[i].moed_link + "'>" + moadim[i].moed.mtitle;
				moadim_str += "&nbsp;(" + this.get_moed_type_str(moadim[i], cdate, cmonth, cyear) + ")";
				moadim_str += "</a><span dir='ltr'></span>";
				if (i < moadim.length - 1)
					moadim_str += ",&nbsp;";
			}							
		}
		return moadim_str;
}
Moadim.prototype.get_term_moadim_str = Moadim_get_term_moadim_str;

function Moadim_get_set_moadim_str (moadim, cdate, cmonth, cyear) {
		var moadim_str = "";
		if (moadim.length > 0) {
			for (var i = 0; i < moadim.length; i++) {
				moadim_str += "<a href='"+ moadim[i].moed_link + "'>" + moadim[i].moed.mtitle;
				if (moadim[i].moed_begin_date == moadim[i].moed_end_date) {
					moadim_str += " (" + format_2digits(moadim[i].moed_begin_date)+ "/" + format_2digits(moadim[i].moed_begin_month)+ ")";
				} else if (moadim[i].moed_begin_year == moadim[i].moed_end_year) {
					moadim_str += " (" + format_2digits(moadim[i].moed_begin_date)+ "/" + format_2digits(moadim[i].moed_begin_month)+ " - " + format_2digits(moadim[i].moed_end_date)+ "/" + format_2digits(moadim[i].moed_end_month)+ ")";
				} else {
					$moadim_str += " (" + format_2digits(moadim[i].moed_begin_date)+ "/" + format_2digits(moadim[i].moed_begin_month)+ "/" + moadim[i].moed_begin_year.toString().substr(2,2)+ "&nbsp;-&nbsp;" + format_2digits(moadim[i].moed_end_date)+ "/" + format_2digits(moadim[i].moed_end_month)+ "/" + moadim[i].moed_end_year.toString().substr(2,2) + ")";
				}				
				moadim_str += "</a>";
				if (i < moadim.length - 1)
					moadim_str += ",<br>";
			}	
		}
		return moadim_str;
}
Moadim.prototype.get_set_moadim_str = Moadim_get_set_moadim_str;

function Moadim_get_moed_type_str (moed, cdate, cmonth, cyear) {
	switch (moed.get_type_by_date(cdate, cmonth, cyear)) {
		case  IOM_TOV:
			return "יום טוב";
			break;
		case  HOL_A_MOED:
			return "חול המועד";
			break;
		case  HAG:
			return "חג";
			break;
		case  ZOM:
			return "צום";
			break;
		case  ROSH_HODESH:
			return "רוש חודש";
			break;
		case  UNKNOWN_MOED_TYPE:
		default:
			break;
	}
	return "";
}
Moadim.prototype.get_moed_type_str = Moadim_get_moed_type_str;

function Moadim_moadim_is_jom_tov (moadim, cdate, cmonth, cyear) {
		if (moadim.length > 0) {
			for (var i = 0; i < moadim.length; i++) {
				if (moadim[i].get_type_by_date(cdate, cmonth, cyear) == IOM_TOV) {
					return true;
				}
			}
		}
		return false;
}
Moadim.prototype.moadim_is_jom_tov = Moadim_moadim_is_jom_tov;

