if (!window.checkForm) {
	var checkForm = function(form) {
		return true;
	};
}

var site = {};

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

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

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

var home_current = '';
var home_timer = null;
var home_delay_show = 200;
var home_delay_hide = 300;

function home_show(id) {
	var ele;
	if (id == home_current) return;

	ele = document.getElementById('home_button_' + home_current);
	if (ele) ele.src = 'img/home_button_' + home_current + '_0.png';

	ele = document.getElementById('home_picture_' + home_current);
	if (ele) ele.style.display = 'none';

	ele = document.getElementById('home_button_' + id);
	if (ele) ele.src = 'img/home_button_' + id + '_1.png';

	ele = document.getElementById('home_picture_' + id);
	if (ele) ele.style.display = '';

	home_current = id;
}


function home_button_over(id) {
	window.clearTimeout(home_timer);
	if (id != home_current) {
		home_timer = window.setTimeout('home_show(\'' + id + '\')', home_delay_show);
	}
}

function home_button_out(id) {
	window.clearTimeout(home_timer);
	home_timer = window.setTimeout('home_show(\'\')', home_delay_hide);
}

function home_picture_over() {
	window.clearTimeout(home_timer);
}

function home_picture_out() {
	window.clearTimeout(home_timer);
	home_timer = window.setTimeout('home_show(\'\')', home_delay_hide);
}



var currentPhotoNumber = 1;
var photoCount = 0;
var showSubMenuTimeout = false;
var hideSubMenuTimeout = false;
var curSaved = false;
var subMenuShowDelay = 500;

function stub() {
	alert('Пока не реализовано');
	return false;
}

function getElementClasses(el) {
	var str = el.className;
	str = str.replace(/\s+/g, ' ');
	str = $.trim(str);
	var classes = str.split(' ');

	return classes;
}

function getParamFromElementClass(param, el) {
	var classes = getElementClasses(el);
	var count   = classes.length;
	var length  = param.length;
	var item;

	for (var i = 0; i < count; i++) {
		item = classes[i];
		if (item.substr(0, length) == param && item.substr(length, 1) == '-' && item.length > length + 1) {
			return item.substr(length + 1);
			break;
		}
	}

	return false;
}

function getMenuItems(dropdownOnly) {
	var items = dropdownOnly
	          ? $('#mnu > UL > LI:has(UL)')
	          : $('#mnu > UL > LI');
	
	return items;
}

function saveCurMenuItem() {
	if (!curSaved) {
		var items = getMenuItems();
		curSaved = items.filter('.cur');
		curSaved.addClass('hide-sub');
	}
}

function restoreCurMenuItem() {
	if (curSaved) {
		curSaved.removeClass('hide-sub');
	}
}

/**
 * Новая версия с полусекундной задержкой появления подменю. В разработке.
 */
function setMenuHandlers() {
	var items = getMenuItems(true);

	items.mouseenter(function() {
		$(this).addClass('hovered');
		showSubMenu(this);
	});

	items.mouseleave(function() {
		$(this).removeClass('hovered');
		hideSubMenu(this);
	});
}

function clearShowSubMenuTimeout() {
	window.clearTimeout(showSubMenuTimeout);
}

function clearHideSubMenuTimeout() {
	window.clearTimeout(hideSubMenuTimeout);
}

function showSubMenu(item) {
	mnuTimeoutOver = window.setTimeout(function() {showSubMenuCallback(item)}, subMenuShowDelay);
}

function hideSubMenu(item) {
	mnuTimeoutOut = window.setTimeout(function() {hideSubMenuCallback(item)}, subMenuShowDelay);
}

function showSubMenuCallback(item) {
	clearShowSubMenuTimeout();
	item = $(item);

	if (item.hasClass('hovered') && !item.hasClass('cur')) {
		var items = getMenuItems();

		items.addClass('hide-sub');
		item.removeClass('hide-sub').addClass('hover');

		saveCurMenuItem();
	}
}

function hideSubMenuCallback(item) {
	clearHideSubMenuTimeout();
	item = $(item);

	if (!item.hasClass('hovered')) {
		item.removeClass('hide-sub').removeClass('hover');
		restoreCurMenuItem();
	}
}

function showText(textId) {
	if (site.ie6) {
		return true;
	}
	//alert(textId);

	$('#content UL.block-nav LI').removeClass('cur');
	$('#vehicles-model-section-nav-' + textId).addClass('cur');

	$('#content .text').hide('hidden');
	$('#vehicles-model-section-text-' + textId).removeClass('hidden');
	$('#vehicles-model-section-text-' + textId).show();

	return false;
}

function setPhoto(elem) {
	if (!elem.nodeName) {
		elem = $('UL LI.i-' + elem + ' A').get(0);
	}

	var li = elem.parentNode;
	var ul = li.parentNode;
	var items = $('LI', ul);
	var url = elem.href;

	items.removeClass('cur');
	$(li).addClass('cur');

	preloadAndShowPhoto(url);

	var carPhoto = getCarPhotoObject();

	var list = $('DL UL', carPhoto).get(0);
	var zoom = $('.zoom', list).get(0);
	var cmnt = elem.lastChild;
	var bigUrl = cmnt.nodeValue;
	zoomLink = $('A', zoom).get(0);
	zoomLink.href = bigUrl;

	currentPhotoNumber = getParamFromElementClass('i', li);
	var curLi = $('.cur', list).eq(0);
	var curLiCurrent = $('.current', curLi).eq(0);
	var curLiCount   = $('.count', curLi).eq(0);
	curLiCurrent.text(currentPhotoNumber);

	var title = $.trim(elem.title);

	if (title.length) {
		var dt = $('DT', carPhoto);
		dt.text(title);
	}
	
	return false;
}

function setPrevPhoto(link) {
	if (currentPhotoNumber > 1) {
		currentPhotoNumber--;
		setPhoto(currentPhotoNumber);
		$('.car-photo DL .current').text(currentPhotoNumber);
	}

	return false;
}

function setNextPhoto(link) {
	if (currentPhotoNumber < photoCount) {
		currentPhotoNumber++;
		setPhoto(currentPhotoNumber);
		$('.car-photo DL .current').text(currentPhotoNumber);
	}

	return false;
}

function showBigPhoto(link) {
	var url = link.getAttribute('href');

	if ('#' != url.substr(-1)) {
		var width  = 760;
		var height = 252;
		var left = (screen.availWidth - width) / 2;
		var top  = (screen.availHeight - height) / 2;
		var mypopup = window.open(url,'bigPhoto','toolbar=no,scrollbars=no,directories=no,status=yes,menubar=no,resizable=yes,width='
		            + width + ',height=' + height +  ',left=' + left + ',top=' + top);
	}
	else {
		alert('Увеличенное изображение отсутствует.');
	}

	return false;
}

function showCarPhotoNav() {
	var carPhoto = getCarPhotoObject();
	var carPhotoDom = carPhoto.get(0);
	carPhoto.removeClass('no-nav');
	var cmnt = carPhotoDom.lastChild;
	var navCode = cmnt.nodeValue;
	cmnt.parentNode.removeChild(cmnt);
	carPhoto.append(navCode);
}

function getCarPhotoObject() {
	return $('.car-photo').eq(0);
}

function getCarPhotoElement() {
	return getCarPhotoObject().get(0);
}

function setFirstGalleryItemAsCurrent() {
	var elems = $('UL.gallery LI A, UL.colors LI A');
	var count = elems.length;
	photoCount = count;

	if (count) {
		for (var i = 0; i < count; i++) {
			$(elems.get(i).parentNode).addClass('i-' + (i + 1));
		}

		var elem = elems.get(0);

		showCarPhotoNav();

		var carPhoto = getCarPhotoObject();
		var countObj = $('UL .cur .count', carPhoto);
		countObj.text(count);

		setPhoto(elem);
	}
}

function preloadAndShowPhoto(url) {
	if ('#' !== url.substr(-1)) {
		var img = new Image();

		img.onload = function() {
			$('DIV.car-photo').css('background-image', 'url(' + url + ')');
		};

		img.src = url;
	}
}

function showPeopleForm(elem) {
	var width = 400;
	var height = 360;
	var left = (screen.availWidth - width) / 2;
	var top = (screen.availHeight - height) / 2;
	var wnd = window.open(elem.href,'','toolbar=no,scrollbars=yes,directories=no,status=no,menubar=no,resizable=yes,width=' + width + ',height=' + height + ',left=' + left + ',top=' + top);

	return false;
}

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

$(document).ready(function() {
	setMenuHandlers();
	setFirstGalleryItemAsCurrent();
	initLightbox();
});

/*-----*/

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 = 'uploade0e3.html?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');
	});
};

/**
 * @version 2011-03-22
 */
site.initMenuVehicles = function() {
	var rootItem = $('#mnu > UL > LI.vehicles');

	if (!rootItem.length) {
		return;
	}

	var items = $('LI', rootItem);
	var count = items.length;

	if (!count) {
		return;
	}

	var classes = [
		'rr',
		'rr-sport',
		'rr-evoque',
		'discovery',
		'freelander',
		'defender'
	];

	for (var i = 0; i < count; i++) {
		items.eq(i).addClass('centered ' + classes[i]);
	}
};

/**
 * @version 2011-03-22
 */
site.initVideos = function() {
	$('.content UL.videos > LI:first-child').addClass('cur');

	// TODO: Add navigation and Flash player generation code when there will be
	// actual videos.
};

site.initSearch = function() {
	$('#search, BODY.search #content FORM').submit(function() {
		this.submit();
		return false;
	});
};

site.initAsideLinks = function() {
	$('.app DL.links LI:first-child').addClass('first');
};

// Add "after-cur" class to LI element that is after current subtree LI element.
site.initLocalnav = function() {
	var curItem = $('DIV > UL > LI:has(UL)');
	var nextItem = curItem.next();
	var nextLink = nextItem.children('A');
	nextLink.addClass('after-cur');
};

$(document).ready(function() {
	site.initExternalLinks();
	site.initLightbox();
	site.initAsideLinks();
	site.initLocalnav();
	site.initFormValidation();
	site.initMaxLength();
	site.initShowHide();
	site.initMenuVehicles();
	site.initVideos();
	site.initSearch();
	site.initPlaceholders();
	site.initAutofocus();
});

if (site.ie6) {
	site.ie6.initNavClasses = function() {
		// 'd' stands for descendants (as surrogate for '>' CSS selector).
		$('#mnu > UL > LI > A').addClass('d');

		$('#mnu LI LI:first-child').addClass('first');

		// Generates '.vehicles-cur' as surrogate for '.vehicles.cur'.
		$('#mnu LI.cur').each(function() {
			var classes = getElementClasses(this);
			$(this).addClass(classes.join('-'));
		});
	};

	site.ie6.initLocalnavClasses = function() {
		var nav = $('.app DL.nav');
		var firstItem = $('DIV > UL > LI > UL > LI:first-child', nav);
		firstItem.addClass('first');
		firstReal = firstItem.parent().get(0);

		if (firstReal) {
			DD_belatedPNG.fixPng(firstReal);
		}
	};

	site.ie6.initPng = function() {
		$('#logo, #logos').each(function() {
			var jthis = $(this);
			var elem = $(document.createElement('div'));
			jthis.css('background', 'none');
			elem.attr('id', this.id + '-ie6');
			elem.insertBefore(jthis);
		});
	};

	site.ie6.fixPng = function() {
		var selectors = [
			'.section-title',
			'.section-title SPAN',
			'.app P.blk',
			'.app DL.blk',
			'.app DL.blk DT',
			'.app DL.blk DT SPAN',
			'.app DL.blk DD',
			'.app DL.blk DD DIV',
			'.app DL.nav LI.first',
			'.app DL.nav UL A',
			'.app DL.nav UL SPAN',
			'BODY.model #content .info H2',
			'BODY.model #content .learn H2',
			'#app-2 .bn LI A',
			'.app .home-app-bn A',
			'#logos LI'
		];

		DD_belatedPNG.fix(selectors.join(','));
	};

	site.initBgImgCache = function() {
		try {
			document.execCommand('BackgroundImageCache', false, true);
		} catch(e) {}
	};

	site.ie6.fixPng();
	site.initBgImgCache();

	$(document).ready(function() {
		site.ie6.initNavClasses();
		site.ie6.initLocalnavClasses();
		site.ie6.initPng();
	});
}
