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 = {};
		$(document.documentElement).addClass('ie8');
	}
}

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

/**
 * @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-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-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.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.initCommentForm = function() {
	var form = $('DL.comments FORM');

	form.parent('DD').prev('DT').children('LABEL').click(function() {
		form.addClass('show');
	});
};

site.initSubmitButtons = function() {
	$('.content FORM INPUT[type="submit"]').each(function() {
		var form = this.form;
		var input = $(this);
		var link = $(document.createElement('a'));

		link.attr('href', '#').addClass('button').text(input.val()).click(function() {
			form.submit();
			return false;
		});

		input.replaceWith(link);
	});
};

site.initHomeSearch = function() {
	var container = $('.home-search');

	if (!container.length) {
		return;
	}

	var form = $('._search FORM', container);

	// Preventing generating garbage "x" and "y" get parameters.
	form.submit(function() {
		this.submit();
		return false;
	});

	// Switching between "Popular" and "All" body types.
	(function() {
		var body = $('._blk._body', container)
		body.removeClass('_all');

		var bodyNav = $('UL', body);

		var nonPopular = $('DL:not(._popular) INPUT', body);
		nonPopular.prop('disabled', true);

		$('A', bodyNav).click(function() {
			var link = $(this);

			if (!link.hasClass('cur')) {
				$('A', bodyNav).removeClass('cur');
				link.addClass('cur');

				var popularClicked = link.hasClass('_popular');

				body.toggleClass('_all', !popularClicked)

				if (popularClicked) {
					nonPopular.prop('disabled', true);
				}
				else {
					nonPopular.prop('disabled', false);
				}
			}

			return false;
		});
	})();

	// Updating "Found packages" counter when changing form elements' values.
	(function() {
		var ajaxUrl = form.attr('data-ajax');
		var counter = $('DL._found > DD > SPAN', form);

		// Whether do ajax request on time interval.
		var action = false;

		// Unique id to identify exactly latest ajax request.
		var lastId;

		// Send real ajax request.
		var update = function() {
			var postData = form.serializeArray();
			var id = (new Date()).getTime();
			lastId = id;

			$.ajax({
				type: 'GET',
				url: ajaxUrl,
				data: postData,
				success: function(data) {
					if (lastId === id) {
						counter.text(data);
					}
				},
				dataType: 'text'
			});
		};

		// Set ajax boolean indicator to true.
		var requestUpdate = function() {
			action = true;
		};

		// Check if update is needed.
		var checkUpdate = function() {
			if (action) {
				update();
				action = false;
			}
		};

		$('INPUT[type="checkbox"], SELECT', container).change(requestUpdate);
		$('INPUT[type="text"]', container).bind('keypress keydown keyup change', requestUpdate);

		var delay = form.attr('data-delay');

		delay = (!delay || delay < 0)
		      ? 500
		      : parseInt(delay);

		window.setInterval(checkUpdate, delay);
	})();

	// Checking/unchecking graphic checkboxes.
	(function() {
		$('._blk INPUT[type="checkbox"]', container).click(function() {
			var dl = $(this.parentNode.parentNode);
			var input = this;

			if (dl.hasClass('_any')) {
				input.checked = true;
				var nextDls = dl.nextAll('DL');
				nextDls.removeClass('on');
				$('INPUT', nextDls).prop('checked', false);
				dl.addClass('on');
			}
			else {
				dl.toggleClass('on', input.checked);

				var parent  = $(dl.get(0).parentNode);
				var inputs  = $('DL:not(._any) INPUT', parent);
				var checked = inputs.filter(':checked');
				var anyDl   = $('DL._any', parent);

				var allOrNone = (inputs.length === checked.length) || !checked.length;

				anyDl.toggleClass('on', allOrNone);
				$('INPUT', anyDl).prop('checked', allOrNone);
			}
		});
	})();

	// Adding SPANs to emulate :before/:after in LABELs.
	if (site.ie8) {
		(function() {
			var span = $(document.createElement('span'));
			$('._blk LABEL', container).prepend(span.clone()).append(span);
		})();
	}
};

site.initPackagePhotos = function() {
	var blk = $('.package-photos-n-bn ._photos');

	if (!blk.length) {
		return;
	}

	var img   = $('DIV > IMG', blk).eq(0);
	var list  = $('UL:first-child', 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));

	// Exit if all links are visible, so scrolling is unneeded.
	if (count < 4) {
		return;
	}

	var navList  = list.next('UL');
	var navItems = $('LI', navList);
	var navPrev  = navItems.eq(0);
	var navNext  = navItems.eq(1);

	var inProgress = false;

	var leftIndex  = 0;
	var rightIndex = 2;

	navPrev.click(function() {
		if (!inProgress) {
			list.animate({scrollLeft: list.scrollLeft() - 110}, 'fast', function() {
				inProgress = false;

				var leftIndexNew = leftIndex - 1;

				if (leftIndexNew >= 0) {
					rightIndexNew = rightIndex - 1;

					if (leftIndexNew > curIndex) {
						setCur(leftIndexNew);
					}
					else if (rightIndexNew < curIndex) {
						setCur(rightIndexNew);
					}

					leftIndex  = leftIndexNew;
					rightIndex = rightIndexNew;
				}
				else {
					var curIndexNew = curIndex - 1;

					if (curIndexNew >= 0) {
						setCur(curIndexNew);
					}
				}
			});

			inProgress = true;
		}

		return false;
	});

	navNext.click(function() {
		if (!inProgress) {
			list.animate({scrollLeft: list.scrollLeft() + 110}, 'fast', function() {
				inProgress = false;

				var rightIndexNew = rightIndex + 1;

				if (rightIndexNew < count) {
					leftIndexNew = leftIndex + 1;

					if (leftIndexNew > curIndex) {
						setCur(leftIndexNew);
					}
					else if (rightIndexNew < curIndex) {
						setCur(rightIndexNew);
					}

					leftIndex  = leftIndexNew;
					rightIndex = rightIndexNew;
				}
				else {
					var curIndexNew = curIndex + 1;

					if (curIndexNew < count) {
						setCur(curIndexNew);
					}
				}
			});

			inProgress = true;
		}

		return false;
	});
};

site.initDropdown = function() {
	$('DL.dropdown').mouseleave(function() {
		$(this).removeClass('_show');
	}).delegate('DT > A', 'click', function() {
		$(this.parentNode.parentNode).toggleClass('_show');
		return false;
	});
};

site.initJs();

$(document).ready(function() {
	site.initExternalLinks();
	site.initLightbox();
	site.initHomeSearch();
	site.initFormValidation();
	site.initPackagePhotos();
	site.initCommentForm();
	site.initSubmitButtons();
	site.initDropdown();
	site.initMaxLength();
	site.initShowHide();
	site.initPlaceholders();
	site.initAutofocus();
});

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

	site.ie7.initButtonArrows = function() {
		$('A.button, .aside .blk.links A').append(document.createElement('span'));
	};

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

if (site.ie8) {
	site.ie8.initContentTables = function() {
		$('.content .tbl TBODY TR:nth-child(2n)').addClass('even');
	};

	// :after emulation.
	site.ie8.initPackagePhotosNav = function() {
		var span = $(document.createElement('span'));
		$('.package-photos-n-bn ._photos UL:first-child A').append(span.clone());
	};

	$(document).ready(function() {
		site.ie8.initPackagePhotosNav();
		site.ie8.initContentTables();
	});
}
