function doCountdown(element) {
	//var to;
	var pollRate = 5000;
	//var updateRate = 1/6;
	var updateRate = 1000;
	var flipspeed = 50;
	var initialflipspeed = 10;
	var units = {
		days: {
			ratio: 1 / (1000 * 60 * 60 * 24),
			modulus: Infinity,
			digits: 3
		},
		hours: {
			ratio: 1 / (1000 * 60 * 60),
			modulus: (1000 * 60 * 60 * 24),
			digits: 2
		},
		minutes: {
			ratio: 1 / (1000 * 60),
			modulus: (1000 * 60 * 60),
			digits: 2
		},
		seconds: {
			ratio: 1 / (1000),
			modulus: (1000 * 60),
			digits: 2
		}//,
		//milliseconds: {
		//	ratio: 1,
		//	modulus: 1000,
		//	digits: 4
		//}
	}
	var previousValues = {
		'days100': 0,
		'days10': 0,
		'days1': 0,
		'hours10': 0,
		'hours1': 0,
		'minutes10': 0,
		'minutes1': 0,
		'seconds10': 0,
		'seconds1': 0
	}
	var currentValues = new Object();
	var timezoneOffset = (new Date().getTimezoneOffset() * 60000);
	
	// Initial strip positions
		
	var now = new Date().getTime();
	var difference = (to - now + timezoneOffset);
	
	var absdifference = Math.abs(difference);
	var sign = difference / absdifference;
		
	for (var unit in units) {
		var temp = leadingZeros( Math.floor( absdifference % units[unit].modulus * units[unit].ratio ), units[unit].digits )
		for (var i = 0; i < units[unit].digits; i++) {
			currentValues[unit + Math.pow(10, i)] = temp.substr((units[unit].digits - i - 1),1);
		}
	}
	
	var largestInitialDigit = 0;
	
	for (var unit in units) {
		for (var i = 0; i < units[unit].digits; i++) {
			if (currentValues[unit + Math.pow(10, i)] != previousValues[unit + Math.pow(10, i)]) {
				if (currentValues[unit + Math.pow(10, i)] > largestInitialDigit) {
					largestInitialDigit = currentValues[unit + Math.pow(10, i)];
				}
				//for (var j = 0; j <= currentValues[unit + Math.pow(10, i)]; j++) {
				for (var j = currentValues[unit + Math.pow(10, i)]; j > 0; j--) {
					eval('setTimeout(function () { \
						flip($(\'div.' + unit + '' + Math.pow(10, i) + '\'), ' + ((currentValues[unit + Math.pow(10, i)] - j) + 1) + ', ' + -sign + '); \
					}, ' + initialflipspeed * (currentValues[unit + Math.pow(10, i)] - j) * 6 + ');');
				}
			}
		}
	}
	
	previousValues = $.extend({}, currentValues);
	
	// Update loop
	
	setTimeout(function () {
		setInterval(function () {
			var now = new Date().getTime();
			var difference = (to - now + timezoneOffset);
			
			var absdifference = Math.abs(difference);
			var sign = difference / absdifference;
			
			for (var unit in units) {
				var temp = leadingZeros( Math.floor( absdifference % units[unit].modulus * units[unit].ratio ), units[unit].digits )
				for (var i = 0; i < units[unit].digits; i++) {
					currentValues[unit + Math.pow(10, i)] = temp.substr((units[unit].digits - i - 1),1);
				}
			}
			
			for (var unit in units) {
				for (var i = 0; i < units[unit].digits; i++) {
					if (currentValues[unit + Math.pow(10, i)] != previousValues[unit + Math.pow(10, i)] && previousValues[unit + Math.pow(10, i)] !== undefined) {
						flip($('div.' + unit + Math.pow(10, i)), currentValues[unit + Math.pow(10, i)], sign);
					}
				}
			}
			
			previousValues = $.extend({}, currentValues);
			
		}, updateRate);
	}, largestInitialDigit * 6 * initialflipspeed);
	
	
	function flip(element, digit, direction) {
		if (direction > 0 ) {
			var base = digit * 103 * 6;
			for (var i = 0; i <= 6; i++) {
				eval('setTimeout(function () { \
					element.css(\'background-position\', \'0px -\' + normalizeOffset( base + 103 * (6 - ' + i + ') ) + \'px\'); \
				}, flipspeed * ' + i + ');');
			}
		}
		else if (direction < 0) {
			var base = (digit - 1) * 103 * 6;
			for (var i = 0; i <= 6; i++) {
				eval('setTimeout(function () { \
					element.css(\'background-position\', \'0px -\' + normalizeOffset( base + 103 * ' + i + ') + \'px\'); \
				}, flipspeed * ' + i + ');');
			}
		}
	}
	
	function normalizeOffset(offset) {
		if (offset < 0) {
			return 6180 + offset;
		}
		else if (offset > 6180) {
			return offset - 6180;
		}
		return offset;
	}
	
	function leadingZeros(number, length) {
		var str = '' + number;
		while (str.length < length) {
			str = '0' + str;
		}
		return str;
	}
}
