/**
 * @author Vlad Yakovlev (red.scorpix@gmail.com)
 * @link www.scorpix.ru
 */
$(function() {

	function counter(rootEl, years, months, days, hours, minutes, seconds, timezone) {
		rootEl = $(rootEl);

		var
			yearsEl = rootEl.find('.years'),
			monthsEl = rootEl.find('.months'),
			daysEl = rootEl.find('.days'),
			hoursEl = rootEl.find('.hours'),
			minutesEl = rootEl.find('.minutes'),
			secondsEl = rootEl.find('.seconds');

		var
			birthday = new Date(years, months, days, hours, minutes, seconds),
			curYears,
			curMonths,
			curDays,
			curHours,
			curMinutes,
			curSeconds;

		update();
		rootEl.css('display', 'block');
		setInterval(update, 1000);

		function update() {
			var now = new Date();
			now = now.getTime() + Math.round((now.getTimezoneOffset() / 60 + timezone) * 3600000);
			now = new Date(now);

			var years = now.getFullYear() - birthday.getFullYear();
			compare(birthday, now, true, true, true, true) || years--;

			var months = (now.getMonth() - birthday.getMonth() + 12) % 12;
			compare(birthday, now, true, true, true) || months--;

			var daysInMonth = (new Date(birthday.getFullYear(), birthday.getMonth() + 1, 0)).getDate();
			var days = (now.getDate() - birthday.getDate() + daysInMonth) % daysInMonth;
			compare(birthday, now, true, true) || days--;

			var hours = (now.getHours() - birthday.getHours() + 24) % 24;
			compare(birthday, now, true) || hours--;

			var minutes = (now.getMinutes() - birthday.getMinutes() + 60) % 60;
			compare(birthday, now) || minutes--;

			var seconds = (now.getSeconds() - birthday.getSeconds() + 60) % 60;

			if (curYears !== years) {
				updateEl(yearsEl, curYears = years);
			}

			if (curMonths !== months) {
				updateEl(monthsEl, curMonths = months);
			}

			if (curDays !== days) {
				updateEl(daysEl, curDays = days);
			}

			if (curHours !== hours) {
				updateEl(hoursEl, curHours = hours);
			}

			if (curMinutes !== minutes) {
				updateEl(minutesEl, curMinutes = minutes);
			}

			if (curSeconds !== seconds) {
				updateEl(secondsEl, curSeconds = seconds);
			}
		}

		function updateEl(el, value) {
			el.find('.count').text(10 > value ? '0' + value : value);
			el.find('i').css('display', 1 == value ? 'none' : '');
		}

		/**
		 * @param {Date} from
		 * @param {Date} to
		 * @param {Boolean} [minutes]
		 * @param {Boolean} [hours]
		 * @param {Boolean} [days]
		 * @param {Boolean} [months]
		 * return {Boolean}
		 */
		function compare(from, to, minutes, hours, days, months) {
			if (months) {
				var diff = to.getMonth() - from.getMonth();

				if (0 > diff) {
					return false;
				} else if (0 < diff) {
					return true;
				}
			}

			if (days) {
				var diff = to.getDate() - from.getDate();

				if (0 > diff) {
					return false;
				} else if (0 < diff) {
					return true;
				}
			}

			if (hours) {
				var diff = to.getHours() - from.getHours();

				if (0 > diff) {
					return false;
				} else if (0 < diff) {
					return true;
				}
			}

			if (minutes) {
				var diff = to.getMinutes() - from.getMinutes();

				if (0 > diff) {
					return false;
				} else if (0 < diff) {
					return true;
				}
			}

			return 0 <= to.getSeconds() - from.getSeconds();
		}
	}

	//counter($('#birthday'), '21 Jul 1981 23:30:00 GMT+0300');
	counter($('#birthday'), 1981, 6, 21, 23, 30, 0, 3);
});
