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

var site = {};

site.ie6 = false;
site.ie7 = false;
site.ie8 = false;

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-06-06
 */
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 getLabel(elem) {
		var s = 'LABEL[for="' + elem.id + '"]';
		var label,
		    labels = elem.labels;

		if (labels) {
			label = labels[0];
		}
		else if (document.querySelector) {
			label = document.querySelector(s);
		}
		else {
			label = $(s).get(0);
		}

		return label;
	}

	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-03-04
 */
site.initSearch = function() {
	var form = $('#search');

	if (!form.length) {
		return;
	}

	var input = $('INPUT[type="text"]', 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('Пожалуйста, введите текст для поиска.');
			input.focus();
		}
		else {
			input.val(trimmed);
			this.submit();
		}

		return false;
	});

	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.initPhotos = function() {
	var blk = $('.photos');

	if (!blk.length) {
		return;
	}

	/**/
	var ul = blk.children('UL');

	if (ul.length) {
		var imgDiv = document.createElement('div');
		var img = document.createElement('img');
		$(img).appendTo(imgDiv);
		$(imgDiv).appendTo(blk);
		var div = document.createElement('div');
		$(div).append(ul).appendTo(blk);
	}
	/**/

	var img   = $('DIV > IMG', blk).eq(0);
	var list  = $('UL', blk).eq(0);
	var links = $('A', list);
	var count = links.length;

	var curIndex = 0;

	// Shows specified photo, and marks appropriate thumbnail as current.
	var setCur = function(link) {
		if (link.nodeName) {
			link = $(link);
		}
		else if (!link.addClass) {
			link = links.eq(link);
		}

		$('A.cur', list).removeClass('cur');
		link.addClass('cur');

		curIndex = link.parent().prevAll().length;

		img.attr('src', link.attr('href'));
	};

	list.delegate('A', 'click', function() {
		setCur(this);
		return false;
	});

	setCur(links.eq(0));
};

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

site.initJs();

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

if (site.ie7) {
	site.ie7.initFordLogo = function() {
		$('#header').append(document.createElement('span'));
	};

	site.ie7.initNavArrows = function() {
		$('#nav A').append($(document.createElement('span')).clone());
	};

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

	/**
	 * Removes comment nodes to workaround 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.initCrumbs();
		site.ie7.removeComments();
		site.ie7.initFordLogo();
		site.ie7.initNavArrows();
	});
}

if (site.ie8) {
	site.ie8.initVisual = function() {
		$('#content > DIV').append(document.createElement('span'));
	};

	site.ie8.initPhotos = function() {
		$('.photos LI > A').append($(document.createElement('span')).clone());
	};

	$(document).ready(function() {
		site.ie8.initVisual();
		site.ie8.initPhotos();
	});
}
