// Copyright (c) 2007, Ozonesoft Ltd. All rights reserved.

// shortcut for getElementById, a-la Prototype
function $(id) {
	return document.getElementById(id)
}

// Event listener registration
function observe(element, name, observer, useCapture) {
	useCapture = useCapture || false
	if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)) {
		name = 'keydown';
	}
	if (element.addEventListener) {
		element.addEventListener(name, observer, useCapture)
	} else if (element.attachEvent) {
		element.attachEvent('on' + name, observer)
	}
}

// Observe window load to register event handlers
observe(window, 'load', function() {
	if ($('countdown_form')) {
		updateCountdownForm()
		observe($('countdown_deadline_3i'), 'change', updateCountdownForm)
		observe($('countdown_deadline_2i'), 'change', updateCountdownForm)
		observe($('countdown_deadline_1i'), 'change', updateCountdownForm)
	}
	if ($('sponsor_form')) {
		observe($('sponsor_require_design'), 'change', function() {
			$('sponsor_upload_picture').disabled = $('sponsor_require_design').checked
		})
	}
})

// selecting a banner changes the image preview
function selectBanner(imageURL, textColor) {
	$('imagepreview').style.backgroundImage = 'url(' + imageURL + ')'
	$('textpreview').style.color = textColor
}

// Update the elements of the countdown form
function updateCountdownForm() {
	updateDays()
	updatePreviewText()
}

// Update the number of days in the day selection field of the deadline
function updateDays() {
	var daysThisMonth = new Array(31,getYear() % 4 == 0 ? 29 : 28,31,30,31,30,31,31,30,31,30,31)[getMonth()]
	var selectDay = $('countdown_deadline_3i')
	var delta = daysThisMonth - selectDay.length
	if (delta < 0) {
		if (selectDay.selectedIndex >= daysThisMonth)
			selectDay.selectedIndex = (daysThisMonth - 1)
		for (var i = 0; i < -delta; i++) {
			selectDay.remove(selectDay.length - 1)
		}
	} else if (delta > 0) {
		for (var i = 0; i < delta; i++) {
			var opt = document.createElement('option')
			opt.text = selectDay.length + 1
			try {
				selectDay.add(opt, null)
			} catch (ex) {
				selectDay.add(opt)
			}
		}
	}
}

// Retrieves the currently selected year
function getYear() {
	var e = $('countdown_deadline_1i')
	return e.options[e.selectedIndex].value
}

// Retrieves the currently selected month
function getMonth() {
	return $('countdown_deadline_2i').selectedIndex
}

// Retrieves the currently selected day
function getDayOfMonth() {
	return $('countdown_deadline_3i').selectedIndex + 1
}

// update the text on the preview banner to reflect the selected date
function updatePreviewText() {
	var selectedDate = new Date()
	selectedDate.setFullYear(getYear()) // order matters (day loops otherwise)
	selectedDate.setMonth(getMonth())
	selectedDate.setDate(getDayOfMonth())
	$('textpreview').innerHTML = distanceToDeadlineInWords(selectedDate)
}

// Expresses the distance to the deadline in words
function distanceToDeadlineInWords(deadline) {
	var now = new Date()
	now.setHours(0, 0, 0, 0)
	deadline.setHours(0, 0, 0, 0)
	var days = Math.floor((deadline.getTime()-now.getTime()) / (24*60*60*1000))
	if (days == 0) return "today is the big day!"
	else if (days < 0) return "married for " + distance_of_time_in_words(Math.abs(days))
	else if (days < 60) return distance_of_time_in_words(days)
	else return distance_of_time_in_words(days) + " (" + days + " days)"
}

// Expresses a number of days as time periods
function distance_of_time_in_words(days) {
	if (days < 2) return "1 day"
	else if (days < 30) return days + " days"
	else if (days < 60) return "about 1 month"
	else if (days < 365) return "about " + Math.floor(days / 30) + " months"
	else if (days < 730) return "about 1 year"
	else return "about " + Math.floor(days / 365) + " years"
}
