var site = {};
site.support = {};

site.isBorderRadiusSupported = function() {
	var s = document.documentElement.style;

	return       'borderRadius' in s
	    ||    'MozBorderRadius' in s
	    || 'WebkitBorderRadius' in s
	    ||  'KhtmlBorderRadius' in s;
};

site.isInputAttrSupported = function(attrName) {
	var input = document.createElement('input');
	var result = attrName in input;
	input = null;

	return result;
};

site.getRandomInt = function(min, max) {
	return Math.floor(Math.random() * (max - min + 1)) + min;
};

/**
 * @version 2011-03-16
 */
site.openUploadForm = function(elem, part, pubid) {
	var form   = $(elem).parents('form').get(0);
	var formId = form.id;

	if (!formId) {
		form.id = site.getRandomInt(0, 999999);
		formId = form.id;
	}

	var url = '/upload.mhtml?Part=' + part + '&PubID=' + pubid + '&name=' + elem.rel + '&form=' + formId;

	var width  = 300;
	var height = 120;

	var left = (screen.availWidth  - width)  / 2;
	var top  = (screen.availHeight - height) / 2;

	var wnd = window.open(url, 'upload', 'toolbar=no,scrollbars=no,'
	        +'directories=no,status=yes,menubar=no,resizable=yes,width='
	        + width + ',height=' + height +  ',left=' + left + ',top=' + top);

	return false;
};

site.setUploadedFileAndCloseForm = function(path, formId, name) {
	var openerDoc = window.opener.document;

	var frm = openerDoc.getElementById(formId);
	var field = frm.elements[name];
	field.value = path;

	var linkElem = $('A[rel="' + name + '"]', openerDoc).get(0);
	var linkTxtNode = linkElem.firstChild;
	linkTxtNode.nodeValue = 'загрузить другой';

	var dd = linkElem.parentNode;
	var ddFirstChild = dd.firstChild;

	if (ddFirstChild.nodeName == 'A') {
		var strong = openerDoc.createElement('strong');
		var preTxt = openerDoc.createTextNode('Файл загружен | ');
		strong.appendChild(preTxt);
		dd.insertBefore(strong, ddFirstChild);
	}

	window.close();
};

site.initMenu = function() {
	var mnu = $('#mnu');
	mnu.insertBefore('#main');

	var span = document.createElement('span');
	$('LI LI A > SPAN', mnu).prepend(span);
	span = null;
};

site.initBorderRadius = function() {
	site.support.borderRadius = site.isBorderRadiusSupported();

	if (!site.support.borderRadius) {
		$('BODY').addClass('no-border-radius');
	}
};

site.initRoundedCorners = function() {
	if (site.support.borderRadius) {
		return;
	}

	var el = $(document.createElement('div'));
	var lt = el.clone().addClass('lt');
	var rt = el.clone().addClass('rt');
	var rb = el.clone().addClass('rb');
	var lb = el.addClass('lb');

	$('.content BLOCKQUOTE').append(lt).append(rt).append(rb).append(lb);
};

site.initSearch = function() {
	document.getElementById('search').onsubmit = function() {
		var value = this.elements.Search.value;

		if ( ('' === value && !site.isInputAttrSupported('required')) || -1 != value.search(/^\s+$/) ) {
			alert('Пожалуйста, введите текст для поиска.');
			return false;
		}

		form.submit();
		return false;
	};
};

site.initAsideContactsRoundedCorners = function() {
	if (site.support.borderRadius) {
		return;
	}

	var el = $(document.createElement('span'));

	$('.aside .blk.contacts > DD > DL:first-child > DD').append(el).append(el);
};

site.getRadioValue = function(elem) {
	for (var i = 0; i < elem.length; i++) {
		if (elem[i].checked) {
			var value = elem[i].value;
			break;
		}
	}

	return value;
};

site.initPoll = function() {
	$('.aside .blk.poll FORM').submit(function() {
		var form = this;
		var wndname = 'pollwnd';

		if (0 == $('INPUT:radio:checked', form).val()) {
			alert('Пожалуйста, выберите один из вариантов ответа.');
			return false;
		}

		form.target = wndname;

		var width  = 500;
		var height = 370;

		var left = (screen.availWidth  - width)  / 2;
		var top  = (screen.availHeight - height) / 2;

		window.open('about:blank', wndname, 'toolbar=no,scrollbars=yes,'
			+ 'directories=no,status=no,menubar=no,resizable=yes,width='
			+ width + ',height=' + height + ',left=' + left + ',top=' + top);
	});
};

site.initExternalLinks = function() {
	$('A[rel="external"]').live('click', function() {
		this.target = '_blank';
	});
};

site.initLightbox = function() {
	$('A.lightbox').lightBox();
};

site.initShowHide = function() {
	$('DL.showhide > DT').live('click', function() {
		var jthis = $(this);
		jthis.children('SPAN').toggleClass('hide');
		jthis.next('DD').toggleClass('hidden');
	});

	$('DL.showhide').each(function() {
		var jthis = $(this);
		var span = $(document.createElement('span'));
		jthis.children('DT').prepend(span).addClass('inited').next('DD').addClass('inited');

		if (jthis.hasClass('show')) {
			var dt = jthis.children('DT');
			$('SPAN', dt).addClass('hide');
			dt.next().removeClass('hidden');
		}
		else {
			jthis.children('DD').addClass('hidden');
		}
	});
};

/**
 * @version 2011-03-15
 */
site.initAutofocus = function() {
	if (document.querySelector) {
		var elem = document.querySelector('INPUT[autofocus], TEXTAREA[autofocus], SELECT[autofocus]');

		if (elem) {
			try {
				elem.focus();
			}
			catch(e) {}
		}
	}
	else {
		$('INPUT[autofocus=""], TEXTAREA[autofocus=""], SELECT[autofocus=""]').eq(0).focus();
	}
};

/**
 * @version 2011-02-25
 */
site.initFormValidation = function() {
	var lang = $(document.documentElement).attr('lang').toLowerCase();

	if (lang) {
		if ('ru' !== lang) {
			lang = 0 === lang.indexOf('ru-')
			     ? 'ru'
			     : 'en';
		}
	}
	else {
		lang = 'ru';
	}

	var localeIsRu = 'ru' === lang;

	function getLabelForElement(elem) {
		var s = 'LABEL[for="' + elem.id + '"]';

		return document.querySelector
		     ? document.querySelector(s)
		     : $(s).get(0);
	}

	function isEmpty(str) {
		return false === str || /^\s*$/.test(str);
	}

	function isEMailAddr(str) {
		return /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/.test(str);
	}

	function getRadioGroupValue(elem) {
		var obj = elem.form.elements[elem.name];
		var count = obj.length;

		for (var i = 0; i < count; i++) {
			if (obj[i].checked) {
				return obj[i].value;
			}
		}

		return false;
	}

	function validate(frm) {
		function getRequiredItems(frm) {
			var labels = $('LABEL', frm).get(),
			    items  = [],
			    label, starNode, starNodeNameLC, id, elem;

			$.each(labels, function(i, label){
				starNode = label.lastChild;
				starNodeNameLC = starNode.nodeName.toLowerCase();

				if ('span' === starNodeNameLC && starNode.firstChild && '*' === starNode.firstChild.nodeValue) {
					elem = document.getElementById(label.htmlFor);

					if (elem && !elem.disabled) {
						var starClass = starNode.className;

						var reqtype = 'email' === starClass
						            ? starClass
						            : '';

						items.push({
							'element' : elem,
							'reqtype' : reqtype
						});
					}
				}
			});

			return items;
		}

		var requiredItems = getRequiredItems(frm);

		if (!requiredItems.length) {
			return true;
		}

		var value,
		    emptyElems   = [],
		    invalidElems = [];

		$.each(requiredItems, function(i, item) {
			var elem = item.element;

			switch (elem.nodeName.toLowerCase()) {
				case 'select':
					value = $(elem).val();
					break;

				case 'input':
					switch (elem.type.toLowerCase()) {
						case 'checkbox':
							value = elem.checked
								  ? elem.value
								  : '';
							break;

						case 'radio':
							value = getRadioGroupValue(elem);
							break;

						default:
							value = elem.value;
					}

					break;

				default:
					value = elem.value;
			}

			if (isEmpty(value)) {
				emptyElems.push(elem);
			}
			else if ('email' === item.reqtype && !isEMailAddr(value)) {
				var message = localeIsRu
				            ? '«' + value + '» не\u00A0является корректным адресом электронной почты'
				            : '“' + value + '” is not a\u00A0valid e-mail address';

				invalidElems.push({
					'element' : elem,
					'message' : message
				});
			}
			else if ('textarea' === elem.nodeName.toLowerCase()) {
				var maxlength = elem.getAttribute('maxlength');

				if (maxlength) {
					var curlength = elem.value.length;

					if (curlength > maxlength) {
						var message = localeIsRu
						            ? 'количество знаков не\u00A0должно превышать '
						            + maxlength + '. (Сейчас\u00A0— ' + curlength + ')'
						            : 'maximum allowed length of\u00A0the\u00A0field is\u00A0' + maxlength
						            + '. (Current length is\u00A0' + curlength + ')';

						invalidElems.push({
							'element' : elem,
							'message' : message
						});
					}
				}
			}
		});

		var generateErrorMessage = function(data) {
			var elems = data.elements,
				count = elems.length;

			if (!count) {
				return true;
			}

			var header = 1 === count
					   ? data.singular[lang]
					   : data.plural[lang];

			header += "\n";

			var frags = [header];
			var message = null;

			$.each(elems, function(i, elem) {
				if (elem.message) {
					var message = elem.message;
					elem = elem.element;
				}

				var labelText = $.trim(getLabelForElement(elem).firstChild.nodeValue);
				var lastChar  = labelText.slice(-1);

				if (':' === lastChar || '.' === lastChar) {
					labelText = labelText.slice(0, -1);
				}

				var delimiter = (i < count - 1)
							  ? ';'
							  : '.';

				var frag = message
				         ? '\u2022 ' + labelText + ":\n" + message + delimiter + "\n"
				         : '\u2022 ' + labelText + delimiter;

				frags.push(frag);
				message = null;
			});

			var message = frags.join("\n");

			alert(message);

			var firstElem = elems[0];

			if ('hidden' !== firstElem.type) {
				try {
					if (firstElem.element) {
						firstElem.element.focus();
					}
					else {
						firstElem.focus();
					}
				}
				catch(e) {} // for IE
			}

			return false;
		}

		var lists = [
			{
				'elements' : emptyElems,
				'singular' : {
					'en' : 'Caution, following required field is not filled:',
					'ru' : 'Внимание, не заполнено следующее обязательное поле:'
				},
				'plural' : {
					'en' : 'Caution, following required fields are not filled:',
					'ru' : 'Внимание, не заполнены следующие обязательные поля:'
				}
			},
			{
				'elements' : invalidElems,
				'singular' : {
					'en' : 'Caution, value of the following field is invalid:',
					'ru' : 'Внимание, следующее поле заполнено неправильно:'
				},
				'plural' : {
					'en' : 'Caution, values of the following fields are invalid:',
					'ru' : 'Внимание, следующие поля заполнены неправильно:'
				}
			}
		];

		var listsCount = lists.length;

		for (var i = 0; i < listsCount; i++) {
			if (false === generateErrorMessage(lists[i])) {
				return false;
			}
		}

		return true;
	}

	function onsubmit() {
		var form = $(this);

		if (form.hasClass('novalidation')) {
			return;
		}

		var onsubmitOld = this.onsubmit;

		if (!!onsubmitOld) {
			form.removeAttr('onsubmit');

			form.submit(function() {
				return validate(this)
				     ? onsubmitOld.call(this)
				     : false;
			});
		}
		else {
			form.submit(function() {
				return validate(this);
			});
		}
	};

	$('.content FORM').each(onsubmit);
};

/**
 * @version 2011-03-17
 */
site.initVisual = function() {
	var elem = document.getElementById('visual');

	if (!elem || $('OBJECT', elem).length) {
		return;
	}

	var comment = elem.firstChild;

	if (comment.nodeType !== 8) {
		return;
	}

	var data = $.trim(comment.data);

	if (data.slice(-1) === ',') {
		data = data.slice(0, -1);
	}

	data = '[' + data + ']';
	items = eval(data);
	var count = items.length;
	var index = site.getRandomInt(0, count - 1);
	var item = items[index];

	elem = $(elem);
	var n1 = $(document.createElement('div'));
	var n2 = $(n1).clone();
	var n3 = $(n1).clone();

	elem.css('background-image', 'url(' + item.image + ')');
	n3.append(item.title);

	n2.append(n3);
	n1.append(n2);
	elem.append(n1);
};

$(document).ready(function() {
	site.initExternalLinks();
	site.initLightbox();
	site.initFormValidation();
	site.initShowHide();
	site.initPoll();
	site.initSearch();
	site.initBorderRadius();
	site.initRoundedCorners();
	site.initAsideContactsRoundedCorners();
	site.initMenu();
	site.initVisual();
	site.initAutofocus();
});
