var formNames = ["nmz_sf", "nmz_sf_main"];

function setYearOptions(fname, iname) {
	var i, year;
	var dd = new Date();
	document.forms[fname][iname].options.length = 6;
	for (i = 1, year = dd.getFullYear() - 3; year <= dd.getFullYear() + 1; i++, year++) {
		document.forms[fname][iname].options[i].text = year + year_word;
		document.forms[fname][iname].options[i].value = year;
	}
}

function setMonthOptions(fname, iname) {
	var i, month;
	document.forms[fname][iname].options.length = 13;
	for (i = 1, month = 1; month <= 12; i++, month++) {
		document.forms[fname][iname].options[i].text = month + month_word;
		document.forms[fname][iname].options[i].value = month;
	}
}

function setDayOptions(fname, iname) {
	var i, day;
	document.forms[fname][iname].options.length = 32;
	for (i = 1, day = 1; day <= 31; i++, day++) {
		document.forms[fname][iname].options[i].text = day + day_word;
		document.forms[fname][iname].options[i].value = day;
	}
}

function selectOption(fname, iname, val) {
	for (var i = 0; i < document.forms[fname][iname].options.length; i++) {
		if (document.forms[fname][iname].options[i].value == val) {
			document.forms[fname][iname].selectedIndex = i;
			return;
		}
	}
}

function getDateStr(year, month, day) {
	return new String(parseInt(year) * 10000 + parseInt(month) * 100 + parseInt(day));
}

function getYearMonthStr(year, month) {
	return new String(parseInt(year) * 100 + parseInt(month));
}

function getYearStr(year) {
	return new String(parseInt(year));
}

function existDate(year, month, day) {
	if (year == "" || month == "" || day == "") {
		return false;
	}
	if (month < 1 || 12 < month) {
		return false;
	}
	var endDayOfMonth = getEndDayOfMonth(year, month);
	if (day < 1 || endDayOfMonth < day) {
		return false;
	}
	return true;
}

function getEndDayOfMonth(year, month) {
	var endDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 29];
	
	if (isLeapYear(year) && month == 2) {
		return endDays[12];
	}
	
	return endDays[month - 1];
}

function isLeapYear(year) {
	if (year % 4 == 0) {
		if (year % 100 == 0) {
			if (year % 400 == 0) {
				return true;
			}
			return false;
		}
		return true;
	}
	
	return false;
}

function cmpDate(by, bm, bd, ey, em, ed) {
	var beginDate, endDate;
	beginDate = parseInt(by) * 10000 + parseInt(bm) * 100 + parseInt(bd);
	endDate = parseInt(ey) * 10000 + parseInt(em) * 100 + parseInt(ed);
	if (beginDate < endDate) {
		return -1;
	}
	if (beginDate == endDate) {
		return 0;
	}
	return 1;
}

function getDateStrArray(by, bm, bd, ey, em, ed) {
	var dateStrArray = [];
	
	if (by == '' || bm == '' || bd == '' || ey == '' || em == '' || ed == '') {
		var dd = new Date();
		var ny, nm, nd;
		ny = dd.getFullYear();
		if (by == '' || bm == '' || bd == '') {
			by = ny - 3; bm = 1; bd = 1;
		}
		if (ey == '' || em == '' || ed == '') {
			ey = ny + 1; em = 12; ed = 31;
		}
	}
	
	
	if (by != '' && bm != '' && bd != '' && ey != '' && em != '' && ed != '') {
		var y, m, d;
		y = by; m = bm; d = bd;
		var endDay = getEndDayOfMonth(y, m);
		while (cmpDate(y, m, d, ey, em, ed) <= 0) {
			if ((y == by && m == bm && y == ey && m == em && (bd != 1 || ed != endDay)) || (y == by && m == bm && bd != 1) || (y == ey && m == em && ed != endDay)) {
				dateStrArray.push(getDateStr(y, m, d));
				d++;
				if (d > endDay) {
					m++;
					d = 1;
					if (m > 12) {
						y++;
						m = 1;
					}
					endDay = getEndDayOfMonth(y, m);
				}
			} else if (y == by || y == ey) {
				d = 1;
				dateStrArray.push(getYearMonthStr(y, m) + '*');
				m++;
				if (m > 12) {
					y++;
					m = 1;
					endDay = getEndDayOfMonth(y, m);
				}
			} else {
				m = 1; d = 1;
				dateStrArray.push(getYearStr(y) + '*');
				y++;
				endDay = getEndDayOfMonth(y, m);
			}
		}
	}
	return dateStrArray;
}

function nmzSearch(f) {
	var dateStr;
	var keyword, by, bm, bd, ey, em, ed;
	keyword = f['keyword'].value;
	by = f['nmz_by'].options[f['nmz_by'].selectedIndex].value;
	bm = f['nmz_bm'].options[f['nmz_bm'].selectedIndex].value;
	bd = f['nmz_bd'].options[f['nmz_bd'].selectedIndex].value;
	ey = f['nmz_ey'].options[f['nmz_ey'].selectedIndex].value;
	em = f['nmz_em'].options[f['nmz_em'].selectedIndex].value;
	ed = f['nmz_ed'].options[f['nmz_ed'].selectedIndex].value;
	
	// validate
	if (keyword == '' && by == '' && bm == '' && bd == '' && ey == '' && em == '' && ed == '') {
		alert(error_void_search);
		return;
	}
	
	var message;
	if ((message = validateTerm(by, bm, bd, ey, em, ed)) != "") {
		alert(message);
		return false;
	}
	
	if ((by != '' && bm != '' && bd != '') || (ey != '' && em != '' && ed != '')) {
		var dateStrArray = getDateStrArray(by, bm, bd, ey, em, ed);
		dateStrArray = dateStrArray.collect(
			function(value, index) {
				return 'TERM:' + value;
			}
		);
		if (keyword != '') {
			f['query'].value = keyword + ' and (' + dateStrArray.join(' or ') + ')';
		} else {
			f['query'].value = dateStrArray.join(' or ');
		}
	} else {
		f['query'].value = keyword;
	}
	
	f.submit();
}

function nmzSearchToday() {
	var dd = new Date();
	var year = dd.getFullYear();
	var month = dd.getMonth() + 1;
	var day = dd.getDate();
	var dateNum = year * 10000 + month * 100 + day;
	
	location.href = '/search/namazu.cgi?keyword=&query=TERM%3A' + dateNum + '&whence=0&nmz_by=' + year + '&nmz_bm=' + month + '&nmz_bd=' + day + '&nmz_ey=' + year + '&nmz_em=' + month + '&nmz_ed=' + day + '&max=10&result=normal&sort=score';
}

function initNmzSearch(keyword, by, bm, bd, ey, em, ed) {
	
}

function validateTerm(by, bm, bd, ey, em, ed) {
	var message = "";
	if (((by != "" || bm != "" || bd != "") && !existDate(by, bm, bd))
			|| ((ey != "" || em != "" || ed != "") && !existDate(ey, em, ed))) {
		message += error_invalid_date;
	}
	if (by != "" && bm != "" && bd != "" && ey != "" && em != "" && ed != "" 
				&& by * 10000 + bm * 100 + bd > ey * 10000 + em * 100 + ed) {
		message += error_invalid_term;
	}
	return message;
}

function setUTF8() {
	document.charset='utf-8';
}

function initNamazuSearchForm() {
	for (var j = 0; j < formNames.length; j++) {
		var formName = formNames[j];
		
		if (!document.forms[formName]) { continue; };
		
		setYearOptions(formName, 'nmz_by');
		setYearOptions(formName, 'nmz_ey');
		setMonthOptions(formName, 'nmz_bm');
		setMonthOptions(formName, 'nmz_em');
		setDayOptions(formName, 'nmz_bd');
		setDayOptions(formName, 'nmz_ed');
		
		var queryString = location.search.substr(1);
		var groups = queryString.split('&');
		var searched = false;
		for (var i = 0; i < groups.length; i++) {
			var group = groups[i].split('=');
			if (group[0] == 'keyword') {
				document.forms[formName]['keyword'].value = UnescapeEUCJP(group[1]);
			}
			if (group[0] == 'nmz_by' || group[0] == 'nmz_bm' || group[0] == 'nmz_bd'
					|| group[0] == 'nmz_ey' || group[0] == 'nmz_em' || group[0] == 'nmz_ed') {
				selectOption(formName, group[0], group[1]);
				searched = true;
			}
		}
		if (!searched) {
			// today
			var dd = new Date();
			var year = dd.getFullYear();
			var month = dd.getMonth() + 1;
			var day = dd.getDate();
			selectOption(formName, 'nmz_by', year);
			selectOption(formName, 'nmz_bm', month);
			selectOption(formName, 'nmz_bd', day);
			
			dd.setTime(dd.getTime() + 3600 * 24 * 30 * 1000);
			year = dd.getFullYear();
			month = dd.getMonth() + 1;
			day = dd.getDate();
			selectOption(formName, 'nmz_ey', year);
			selectOption(formName, 'nmz_em', month);
			selectOption(formName, 'nmz_ed', day);
		}
	}
}

Event.observe(window, 'load', initNamazuSearchForm, false);
