/**
 * @author Marat Tanalin | http://tanalin.com/ | 2011
 */

var site = {};

if (document.all) {
	if (!window.XMLHttpRequest) {
		site.ie6 = {};
	}

	if (!document.querySelector) {
		site.ie7 = {};
	}

	if (!document.getElementsByClassName) {
		site.ie8 = {};
	}
}

/**
 * @version 2011-03-26
 */
site.isBorderRadiusSupported = function() {
	var s = document.documentElement.style;

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

site.hasProperty = function(elemName, attrName) {
	var elem = document.createElement(elemName);
	var result = attrName in elem;
	elem = null;

	return result;
};

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

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

		form.id = 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.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-11-09
 */
site.initFormValidation = function() {
	var lang = $(document.documentElement).attr('lang');

	if (lang) {
		lang = lang.toLowerCase();

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

	var localeIsRu = 'ru' === lang;

	function getLabel(elem) {
		var labels = elem.labels;

		return labels
		     ? labels[0]
		     : $('LABEL[for="' + elem.id + '"]').get(0);
	}

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

	function isEmail(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 && !isEmail(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(getLabel(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-15
 */
site.initMaxLength = function() {
	// Stupid Opera has property but has no actual feature support.
	if (!window.opera && site.hasProperty('textarea', 'maxLength')) {
		return;
	}

	var check = function() {
		var elem  = $(this),
		    value = this.value,
		    pAttr = 'data-prev-value';

		if (value.length > elem.attr('maxlength')) {
			this.value = elem.attr(pAttr);
		}
		else {
			elem.attr(pAttr, value);
		}
	};

	$('TEXTAREA[maxlength]').bind('keydown keyup keypress', check);
};

/**
 * @version 2011-11-09
 */
site.initSearch = function() {
	var form = $('#search');

	if (!form.length) {
		return;
	}

	var input = $('INPUT[type="search"]', form);
	var placeholder = input.attr('placeholder');

	var isEmpty = function() {
		return /^\s*$/.test(input.val());
	};

	form.submit(function() {
		var value = input.val();
		var trimmed = $.trim(value);

		if (!trimmed.length || placeholder === value) {
			alert('Пожалуйста, введите текст для поиска.');

			// Timeout is needed to work around IE's stupidity.
			window.setTimeout(function() {
				input.focus();
			}, 100);

			return false;
		}
		else {
			input.val(trimmed);
		}
	});

	input.removeAttr('required');
};

/**
 * @version 2011-03-04
 */
site.initPlaceholders = function() {
	var elems = $('INPUT[placeholder], TEXTAREA[placeholder]');

	if (!elems.length) {
		return;
	}

	var isEmpty = function(field) {
		return /^\s*$/.test(field.value);
	};

	var onfocus = function() {
		if ($(this).attr('data-placeholder') === this.value) {
			this.value = '';
		};
	};

	var onblur = function() {
		if (isEmpty(this)) {
			this.value = $(this).attr('data-placeholder');
		}
	};

	elems.each(function(i, elem) {
		elem = $(elem);
		var placeholder = elem.attr('placeholder');
		elem.attr('data-placeholder', placeholder)
		elem.val(placeholder).focus(onfocus).blur(onblur).removeAttr('placeholder');
	});
};

site.initNavCorners = function() {
	if (site.isBorderRadiusSupported() || site.ie6) {
		return;
	}

	var s = $(document.createElement('span'));
	$('#search > FIELDSET').append(s.clone(), s.clone(), s.clone(), s.clone());
};

site.initOldLightbox = function() {
	initLightbox();
};

site.initJs = function() {
	$(document.documentElement).addClass('js');
};

site.initJs();

$(document).ready(function() {
	//site.initExternalLinks();
	//site.initLightbox();
	site.initOldLightbox();
	site.initFormValidation();
	site.initMaxLength();
	site.initShowHide();
	site.initSearch();
	site.initPlaceholders();
	site.initNavCorners();
	site.initAutofocus();
});

if (site.ie7) {
	site.ie7.initCrumbs = function() {
		$('#crumbs LI + LI').prepend('\u003E\u00A0');
	};

	/**
	 * Removes comment nodes to work around IE7 :first-child
	 * and adjacent sibling combinator (+) bug.
	 * 
	 * http://tanalin.com/blog/2011/08/ie7-css-first-child-adjacent/
	 * 
	 * @version 2011-05-15
	 */
	site.ie7.removeComments = function() {
		var elems = document.getElementsByTagName('*'),
		    count = elems.length,
		    comments = [];

		for (var i = 0; i < count; i++) {
			var elem = elems[i],
			    childNodes = elem.childNodes,
			    childCount = childNodes.length;

			for (var j = 0; j < childCount; j++) {
				var node = childNodes[j];

				if (8 === node.nodeType) {
					comments.push(node);
				}
			}
		}

		var commentsCount = comments.length;

		for (var k = 0; k < commentsCount; k++) {
			// Since this is IE7-only problem, we are free to use IE's non-standard method.
			comments[k].removeNode();
		}

		// Forcing page redraw to workaround IE7 rendering bug.
		document.body.className = document.body.className;
	};

	$(document).ready(function() {
		site.ie7.removeComments();
		//site.ie7.initCrumbs();
	});
}

if (site.ie6) {
	site.ie6.initDropdownMenu = function() {
		var ul = $('#mnu-e > DIV > DIV > UL > LI:has(UL)').mouseover(function() {
			$(this).addClass('hover');
		}).mouseout(function() {
			$(this).removeClass('hover');
		});
	};

	site.ie6.initMenuFirst = function() {
		$('#mnu-e > DIV > DIV > UL > LI').first().addClass('first');
	};

	// IE6 does not support labels without 'for' attribute.
	site.ie6.initSearchSubmit = function() {
		var button = $('#search DIV > LABEL > INPUT');
		var id = button.attr('id');

		if (!id) {
			id = 'frm-search-submit';
			button.attr('id', id);
		}

		button.parent().attr('for', id);
	};

	$(document).ready(function() {
		site.ie6.initDropdownMenu();
		site.ie6.initMenuFirst();
		site.ie6.initSearchSubmit();
	});
}
