var Counter = Class.create(
{
	height: 25,
	digits: 2,
	duration: 0.5,
	units:
	[
		{ visible: false, verbose: 'weken', factor: 7*24*3600 },
		{ visible: true, verbose: 'dagen', factor: 24*3600 },
		{ visible: true, verbose: 'uur', factor: 3600 },
		{ visible: false, verbose: 'minuten', factor: 60 },
		{ visible: false, verbose: 'seconden', factor: 1 }
	],

	initialize: function()
	{
	},

	parse: function()
	{
		if (this.container = $$('.pageCounter').first())
		{
			this.units = this.units.filter(function(unit) { return unit.visible; });

			this.gettime(this.container.innerHTML);

			this.build();

			new PeriodicalExecuter(function() { this.settime(true); }.bind(this), 1);
		}
	},

	build: function()
	{
		var digit;

		this.update = this.units.last().factor;
		this.container.update('');

		this.units.each(function(unit)
		{
			unit.element = new Element('div', { 'class': 'counter' }).insert(new Element('div', { 'class': 'verbose' }).update(unit.verbose));
			unit.element.digits = [];

			$A(new ObjectRange(0, this.digits - 1)).reverse().each(function()
			{
				digit = new Element('div', { 'class': 'digits' }).insert(new Element('div', { 'class': 'digit' }));
				digit.digit = 0;

				unit.element.digits.push(digit);
				unit.element.insert(digit);
			});

			this.container.insert(unit.element);
		}, this);

		this.settime(false);
	},

	gettime: function(string)
	{
		var date = string.split(' ').shift().split('-').map(function(number) { return number/1; });
		var time = string.split(' ').pop().split(':').map(function(number) { return number/1; });

		this.time = (new Date(date[0], --date[1], date[2], time[0], time[1], time[2])).getTime()/1000;
	},

	settime: function(morph)
	{
		var time = (new Date).getTime();
		var diff = Math.max((this.time - time/1000).round(), 0);

		this.units.inject(diff, function(acc, unit)
		{
			return acc - unit.factor*this.setnumber(unit.element, (acc/unit.factor).floor(), morph);
		}, this);
	},

	setnumber: function(element, number, morph)
	{
		var delta;

		("0".times(Math.max(2 - number.toString().length, 0)) + number.toString()).toArray().slice(-2).each(function(digit, index)
		{
			digit	= parseInt(digit);
			delta	= Math.abs(element.digits[index].digit - digit);

			if (morph)
			{
				delta > 1 && element.digits[index].down().setStyle({ top: (-(delta + 1)*this.height) + 'px' });

				new Effect.Morph(element.digits[index].down(), { style: 'top: ' + (-digit*this.height) + 'px', duration: this.duration, transition: Effect.Transitions.spring });
			}
			else
			{
				element.digits[index].down().setStyle({ top: (-digit*this.height) + 'px' });
			}

			element.digits[index].digit = digit;
		}, this);

		return number;
	}
});

var counter = new Counter();
document.observe('dom:loaded', function(event) { counter.parse(); });