if (document.getElementById && document.getElementsByTagName) {//minimum required DOM caps

function TabGroup(id, linkElement, hx)
{
//private
	var _tabscontainer = null,
		_tabs = null,
		_active = null,
		_hx = hx;

	function getPageId(href)
	{
		return href.substr(href.indexOf("#") + 1);
	}

	function initTab(a, group, index)
	{
		a.group = group;
		a.index = index;
		a.page = document.getElementById(getPageId(a.href));
		a.onclick = function ()
		{
			this.group.activatePage(this.index);
			this.blur();
			return false;
		};
	}

	function hidePage(tab)
	{
		tab.page.style.display = "none";
		tab.className = "";
	}

	function showPage(tab)
	{
		tab.page.style.display = "";
		tab.className = "Current";
	}

	function hideHeadings(tab)
	{
		var hs = tab.page.getElementsByTagName(_hx);

		for (var i = 0; i < hs.length; i++)
		{
			var h = hs[i];

			h.style.display = "none";
		}
	}

	function showHeadings(tab)
	{
		var hs = tab.page.getElementsByTagName(_hx);

		for (var i = 0; i < hs.length; i++)
		{
			var h = hs[i];

			h.style.display = "";
		}
	}

//public
	this.activatePage = function (index)
	{
		var tab = _tabs[index];

		if (_active) { hidePage(_active); }
		showPage(tab);
		_active = tab;
	}

//construction
	_tabscontainer = document.getElementById(id);
	_tabs = _tabscontainer.getElementsByTagName(linkElement);

	for (var i = 0; i < _tabs.length; i++)
	{
		var tab = _tabs[i];

		initTab(tab, this, i);
		if (_hx) { hideHeadings(tab); }
		hidePage(tab);
	}
}

function EgnChecker()
{
//private
	var _controls = document.getElementById("egncheckercontrols"),
		_text = document.getElementById("egncheckertext"),
		_check = document.getElementById("egncheckercheck"),
		_reset = document.getElementById("egncheckerreset"),
		_result = document.getElementById("egncheckerresult");

	function clear()
	{
		_text.value = "";
		_result.value = "";
		_result.className = "";
	}

	function writeResultOk(msg)
	{
		_result.value = msg;
		_result.className = "EgnCheckerResultOk";
	}

	function writeResultError(msg)
	{
		_result.value = msg;
		_result.className = "EgnCheckerResultError";
	}

	function isLeapYear(yyyy)
	{
		if (yyyy % 400 == 0) { return true; }
		if (yyyy % 100 == 0) { return false; }
		if (yyyy % 4 == 0) { return true; }

		return false;
	}

//public

//construction
	_check.onclick = function ()
	{
		var digits = [],
			coeffs = [2, 4, 8, 5, 10, 9, 7, 3, 6],
			days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

		for (var i = 0; i < _text.value.length; i++)
		{
			var digit = parseInt(_text.value.charAt(i), 10);

			if (isNaN(digit)) { break; }
			digits[i] = digit;
		}

		if (10 != digits.length) { writeResultError("Моля, въведете 10 ЦИФРИ."); _text.focus(); return; }

		var dd = digits[4] * 10 + digits[5],
			mm = digits[2] * 10 + digits[3],
			yy = digits[0] * 10 + digits[1],
			yyyy = null;

		if (mm >= 1 && mm <= 12) { yyyy = 1900 + yy; }
		else if (mm >= 21 && mm <= 32) { mm -= 20; yyyy = 1800 + yy; }
		else if (mm >= 41 && mm <= 52) { mm -= 40; yyyy = 2000 + yy; }

		else { writeResultError("Некоректен месец. Позиции 3 и 4."); _text.focus(); return; }

		days[1] += isLeapYear(yyyy) ? 1 : 0;

		if (!(dd >= 1 && dd <= days[mm - 1])) { writeResultError("Некоректен ден. Позиции 5 и 6."); _text.focus(); return; }

		// Gregorian calendar adoption. 31 Mar 1916 was followed by 14 Apr 1916.
		if (yyyy == 1916 && mm == 4 && (dd >= 1 && dd < 14)) {
			writeResultError("Грешна дата (от 01.04.1916 до 13.04.1916 г. - Григориански календар)."); _text.focus(); return;
		}

		var checksum = 0;

		for (var j = 0; j < coeffs.length; j++) { checksum += digits[j] * coeffs[j]; }
		checksum %= 11;
		if (10 == checksum) { checksum = 0; }

		if (digits[9] != checksum) { writeResultError("Грешна контролна цифра на въведеният ЕГН. Позиция 10."); _text.focus(); return; }

		writeResultOk("Въведеният ЕГН е верен."); _text.focus();
	};

	_reset.onclick = function () { clear(); };

	clear();
}

}//minimum required DOM caps

