// Меню-аккардеон. Каталог
jQuery(document) .ready(function () {
jQuery('ul.accordion li.parent') .each(function () {
jQuery(this) .append('<em class="open-close"> </em>');
});
jQuery('ul.accordion') .accordion();
jQuery('ul.accordion li.active') .each(function () {
jQuery(this) .children() .next('ul') .css('display', 'block');
});
});
// Инициализация табов на странице товара
function initTabs() {
// Блок в котором находятся табы
var tabBlock = $('#contents');
if (!tabBlock.length) {
return false;
}
// По умолчанию делаем отметку о том что активного таба не найдено
var isFind = 0;
tabBlock.find('#tabs a') .each(function (i) {
// Если нашёлся активный там
if ($(this) .hasClass('active')) {
// Инициализируем найденный таб
$(this) .click();
// Ставим отметку, о том что не нужно инициализировать первый таб на странице
isFind = 1;
}
});
// Если не найдено ни одного таба с отметкой о том что он активен
if (!isFind) {
// Ставим активным первый таб на странице.
tabSwitch(1);
}
// Проверяет хэш и если по нему была открыта вкладка, то эта функция автоматически откроет её.
checkTabHash();
// Если текущий адрес страницы предполагает добавление отзыва
if ('#goodsDataOpinionAdd' == document.location.hash) {
$('#goodsDataOpinionAddBlock') .show();
}
// Биндим изменение хэша - проверка какой таб нужно открыть.
$(window) .bind('hashchange', function () {
checkTabHash();
});
}
// Проверяет хэш, переданый пользователем и открывает соответствующий раздел
function checkTabHash() {
// Определяем текущий хэш страницы
var hash = window.location.hash.substr(1);
if (hash == 'goodsDataOpinionAdd') {
hash = 'show_tab_4';
}
if (!hash.length || hash.indexOf('show_tab_') == - 1) {
return false;
}
// Открываем тот таб, который был указан в hash-е
tabSwitch(hash.replace('show_tab_', ''))
}
// Выбор вкладки на странице товара
function tabSwitch(nb) {
// Я добавляю условие не выводить Сопутсвующие товары во вкладке Отзывы
if (nb == 4)
$('#contents .box-content') .css('display', 'none');
else
$('#contents .box-content') .css('display', 'block');
// Конец вставки
var tabBlock = $('#contents');
tabBlock.find('#tabs a') .removeClass('active');
tabBlock.find('div.tab-content') .hide();
$('#tab_' + nb) .addClass('active');
$('#content_' + nb) .show();
if ('#goodsDataOpinionAdd' != document.location.hash) {
// Записываем в хэш информацию о том какой таб сейчас открыт, для возможности скопировать и передать ссылку с открытым нужным табом
document.location.hash = '#show_tab_' + nb;
}
}
// Инициализируем табы на странице
$(function () {
initTabs();
});
$(function () {
var $container = $('.product-list, .product-list2');
var lastPage = 1;
// Скрываем навигацию по умолчанию
$('.pagination') .hide();
$container.infinitescroll({
navSelector: '.infinitescroll-pages',
// класс элемента постраничной навигации для бесконечного скрола
nextSelector: '.infinitescroll-pages a',
// класс элемента постраничной навигации, ссылка на следующую страницу
itemSelector: '.prod_hold, .category-info',
// класс элементов, которые будем извлекать
loading: {
msgText: 'Пожалуйста подождите...',
finishedMsg: 'Больше нет товаров.',
img: zoomloaderPath ? zoomloaderPath : '/zoomloader.gif'
}
}, function (newElements) {
var $newElems = $(newElements) .css({
opacity: 0
});
$newElems.imagesLoaded(function () {
$newElems.animate({
opacity: 1
});
$container.masonry('appended', $newElems, true);
// добавляю строчку ниже из-за условия быстрого предпросомтра картинок в случае если картинка одна
removePreviewOnly();
});
lastPage++;
// если это последняя страница, завершаем работу
if (lastPage >= (infiniteScrollLastPage ? infiniteScrollLastPage : 1)) {
$container.infinitescroll('pause');
}
}
);
});
// Возвращает правильное окончание для слова
function genWordEnd(num, e, m, mm) {
// Если забыли указать окончания
if (typeof (e) == 'undefined') {
e = '';
}
if (typeof (m) == 'undefined') {
e = 'а';
}
if (typeof (mm) == 'undefined') {
e = 'oв';
}
// Если передали пустую строку, вместо цифры
if (0 == num.length) {
num = 0;
}
// Превращаем цифру в правильный INT
num = GetSum(num) .toString();
// Получаем последний символ цифры
ch1 = num.substring(num.length - 1);
// Получаем последний символ цифры
ch2 = num.length == 1 ? 0 : num.substring(num.length - 2, num.length - 1);
// Если последняя цифра - 1, вернем единственное число
if (ch2 != 1 && ch1 == 1) {
return e;
}
// Если последняя цифра - от 2 до 4х , вернем множественное чило из массива с индексом 2
else if (ch2 != 1 && ch1 > 1 && ch1 <= 4) {
return m;
}
// Если последняя цифра - от 5 до 0 , вернем множественное чило из массива с индексом 3
else if (ch2 == 1 || ch1 > 4 || ch1 == 0) {
return mm;
}
}
$(document) .ready(function () {
$('#column-left .box-heading') .click(function () {
var vis = $('#column-left') .find('.box-content');
if ($(this) .hasClass('up'))
{
vis.fadeOut();
$(this) .removeClass('up');
}
else
{
vis.fadeIn();
$(this) .addClass('up');
}
});
$('.qty-plus') .click(function () {
var
quantity = $(this) .parent() .find('.quantity'),
currentVal = parseInt(quantity.val())
;
if (!isNaN(currentVal)) {
quantity.val(currentVal + 1);
quantity.trigger('keyup');
}
return false;
});
$('.qty-minus') .click(function () {
var
quantity = $(this) .parent() .find('.quantity'),
currentVal = parseInt(quantity.val())
;
if (!isNaN(currentVal) && !(currentVal <= 1)) {
quantity.val(currentVal - 1);
quantity.trigger('keyup');
}
return false;
});
$(window) .load(function () {
$('.flexslider') .flexslider({
animation: 'fade',
pauseOnHover: true,
touch: true,
animationSpeed: 1300,
slideshowSpeed: 6500,
smoothHeight: false,
controlNav: false,
directionNav: true
});
});
// hide #back-top first
$('#back-top') .hide();
// fade in #back-top
$(window) .scroll(function () {
if ($(this) .scrollTop() > 100) {
$('#back-top') .fadeIn();
} else {
$('#back-top') .fadeOut();
}
});
// scroll body to 0px on click
$('#back-top img') .click(function () {
$('body,html') .animate({
scrollTop: 0
}, 800);
return false;
});
$('#toggle_switch') .click(function () {
$('#togglerone') .slideToggle(1000);
if ($(this) .hasClass('swap')) {
$(this) .removeClass('swap');
// Удаляем из cookie информацию о том, что пользователь скрыл шапку сайта
deleteCookie('hide_header', {
path: '/'
});
} else {
$(this) .addClass('swap');
// Ставим в cookie информацию о том, что пользователь скрыл шапку сайта
setCookie('hide_header', 1, {
path: '/'
});
}
});
// Если шапка скрыта пользователем
if (getCookie('hide_header')) {
$('#togglerone') .hide();
$('#toggle_switch') .addClass('swap');
}
$('#toggle_switch1') .click(function () {
$('#togglerone1') .slideToggle(1000);
if ($(this) .hasClass('swap')) {
$(this) .removeClass('swap');
// Удаляем из cookie информацию о том, что пользователь скрыл шапку сайта
deleteCookie('hide_header', {
path: '/'
});
} else {
$(this) .addClass('swap');
// Ставим в cookie информацию о том, что пользователь скрыл шапку сайта
setCookie('hide_header', 1, {
path: '/'
});
}
});
// Если шапка скрыта пользователем
if (getCookie('hide_header')) {
$('#togglerone1') .hide();
$('#toggle_switch1') .addClass('swap');
}
});
// Работа с cookie файлами.
// Получение переменной из cookie
function getCookie(name) {
var matches = document.cookie.match(new RegExp('(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)'
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
// Установка переменной в cookie
function setCookie(name, value, options) {
options = options || {
};
var expires = options.expires;
if (typeof expires == 'number' && expires) {
var d = new Date();
d.setTime(d.getTime() + expires * 1000);
expires = options.expires = d;
}
if (expires && expires.toUTCString) {
options.expires = expires.toUTCString();
}
value = encodeURIComponent(value);
var updatedCookie = name + '=' + value;
for (var propName in options) {
updatedCookie += '; ' + propName;
var propValue = options[propName];
if (propValue !== true) {
updatedCookie += '=' + propValue;
}
}
document.cookie = updatedCookie;
}
// Удаление переменной из cookie
function deleteCookie(name, options) {
options = options || {
};
options.expires = - 1;
setCookie(name, '', options)
}
// Отправляет ошибку на сервер, для того чтобы служба тех поддержки могла разобраться в проблеме как можно быстрее.
function sendError(desc, page, line) {
var img = document.createElement('img');
img.src = 'http://storeland.ru/error/js?desc=' + encodeURIComponent(desc) + '&page=' + encodeURIComponent(window.location) + '&line=0';
img.style.position = 'absolute';
img.style.top = '-9999px';
try {
document.getElementsByTagName('head') .appendChild(img)
} catch (e) {
}
return false;
}
// Форматирует цену
function number_format(number, decimals, dec_point, thousands_sep) {
var n = number,
prec = decimals;
var toFixedFix = function (n, prec) {
var k = Math.pow(10, prec);
return (Math.round(n * k) / k) .toString();
};
n = !isFinite( + n) ? 0 : + n;
prec = !isFinite( + prec) ? 0 : Math.abs(prec);
var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;
var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec);
var abs = toFixedFix(Math.abs(n), prec);
var _,
i;
if (abs >= 1000) {
_ = abs.split(/\D/);
i = _[0].length % 3 || 3;
_[0] = s.slice(0, i + (n < 0)) +
_[0].slice(i) .replace(/(\d{3})/g, sep + '$1');
s = _.join(dec);
} else {
s = s.replace('.', dec);
}
var decPos = s.indexOf(dec);
if (prec >= 1 && decPos !== - 1 && (s.length - decPos - 1) < prec) {
s += new Array(prec - (s.length - decPos - 1)) .join(0) + '0';
}
else if (prec >= 1 && decPos === - 1) {
s += dec + new Array(prec) .join(0) + '0';
}
return s;
}
// Превращает поле пароля в текстовое поле и обратно
// @LinkObject - ссылка по которой кликнули
// @InputObject - объект у которого нужно изменить тип поля
function ChangePasswordFieldType(LinkObject, InputObject) {
var
// Ссылка по которой кликнули
LObject = $(LinkObject),
// Объект у которого изменяем тип с password на text
IObject = $(InputObject),
// Старый текст ссылки
txtOld = LObject.text(),
// Новый текст ссылки
txtNew = LObject.attr('rel');
// Если объекты не получены, завершим работу функции
if (LObject.length == 0 || IObject.length == 0) {
return false;
}
// Изменяем у ссылки текст со старого на новый
LObject.html(txtNew);
// Старый текст ссылки сохраняем в атрибуте rel
LObject.attr('rel', txtOld);
// Изменяем тип input поля
if (IObject[0].type == 'text') {
IObject[0].type = 'password';
} else {
IObject[0].type = 'text';
}
}
// Крутит изображение при обновлении картинки защиты от роботов
function RefreshImageAction(img, num, cnt) {
if (cnt > 13) {
return false;
}
$(img) .attr('src', $(img) .attr('rel') + 'icon/refresh/' + num + '.gif');
num = (num == 6) ? 0 : num;
setTimeout(function () {
RefreshImageAction(img, num + 1, cnt + 1);
}, 50);
}
$(document) .ready(function () {
//$('#tabs a').tabs();
/* Валидация формы на странице оформления заказа, а так же формы на страницы связи с администрацией
$('.order form, .feedbackForm, .clientForm, .goodsDataOpinionAddForm').submit(function(){
if($(this).valid()) {
// Кнопка отправки формы
SubmitButton = $(this).find('input:submit, button:submit');
// Если кнопку уже нажали, видимо отправка формы производилась по нажатию на кнопку enter, не допускаем этого.
if($(SubmitButton.get(0)).attr('disabled')) {
return false;
}
// Устанавливаем на кнопку отправки формы блокировку повторной оптравки
SubmitButton.attr('disabled', true);
// Через 10 секунд блокировка отправки формы снимается.
setTimeout('SubmitButton.attr("disabled", false);', 10000);
}
}).validate();*/
// Кнопки на сайте если подгружен модуль Jquery.UI
if (typeof ($('button.submit, button:submit, input:submit, input.button') .button) == 'function') {
$('button.submit, button:submit, input:submit, input.button') .button();
}
// Валидация формы на странице оформления заказа, а так же формы на страницы связи с администрацией
$('#myform, .feedbackForm, .clientForm, #quickform') .validate({
rules: {
reg_name: 'required'
}
});
// Отправка формы по Ctrl+Enter
$('form') .bind('keypress', function (e) {
if ((e.ctrlKey) && ((e.which == 10) || (e.which == 13))) {
$(this) .submit();
}
// Отправка данных формы по нажатию на Enter в случае если курсор находится в input полях (В некоторых браузерах при нажатии по enter срабатывает клик по первому submit полю, которое является кнопкой назад. Для этого написан этот фикс)
}) .find('input') .bind('keypress', function (e) {
if (((e.which == 10) || (e.which == 13))) {
try {
$(this.form) .submit();
} catch (e) {
}
return false;
}
});
// В форме оформления заказа при клике на кнопку назад просто переходим на предыдущую страницу
$('.order form input:submit[name="toprev"]') .click(function () {
var act = this.form.action;
this.form.action = act + (act.indexOf('?') > - 1 ? '&' : '?') + 'toprev=1';
this.form.submit();
return false;
});
/* Настройки галереи изображений
$.nyroModalSettings({
// из всех элементов с атрибут rel="gallery" будем создавать галерею
gallery: 'gallery',
// Включаем прокрутку с последнего изображения на первое
galleryLoop: true
});*/
// Увеличение изображение при клике на него и открытие галереи изображений
$('.goodsDataMainImage a, .goodsDataMainImageZoom a') .click(function () {
// Идентификатор главной картинки
var goodsImageId = $('.goodsDataMainImage input') .attr('rel'),
// Маленькое изображение, по которому на самом деле будем кликать
goodsImageIconElement = $('.goodsDataMainImagesIcon input[rel="' + goodsImageId + '"]') .parent() .find('a');
// Для иконки изображения запустим галерею
goodsImageIconElement.nyroModalManual();
return false;
});
// Добавление товара в корзину через ajax
$('.goodsDataForm, .goodsToCartFromCompareForm, .goodsListForm') .submit(function () {
$(this) .nyroModalManual({
formIndicator: 'ajax_q',
// Value added when a form is sent
minWidth: 450,
// Minimum width
minHeight: 140,
// Minimum height
gallery: null
// Gallery name if provided
});
return false;
});
// Изменение главного изображения товара при нажатии на миниатюру
$('.goodsDataMainImagesIcon a') .click(function () {
// Путь к среднему изображению
var MediumImageUrl = $(this) .find('img') .attr('rel'),
// Главное изображение, в которое будем вставлять новое изображение
MainImage = $('.goodsDataMainImage img'),
// В этом объекте хранится идентификатор картинки главного изображения для коректной работы галереи изображений
MainImageIdObject = $('.goodsDataMainImage input'),
// Получаем идентификатор этого изображения из соседнего input поля
GoodsImageIconId = $(this) .parent() .find('input') .attr('rel');
// Изменяем главное изображение
MainImage.attr('src', MediumImageUrl);
// Изменяем идентификатор главного изображения
MainImageIdObject.attr('rel', GoodsImageIconId);
return false;
});
// Функция собирает свойства в строку, для определения модификации товара
function getSlugFromGoodsDataFormModificationsProperties(obj) {
var properties = new Array();
$(obj) .each(function (i) {
properties[i] = parseInt($(this) .val());
});
return properties.sort(function (a, B) {
return a - b
}) .join('_');
}
var
// Запоминаем поля выбора свойств, для ускорения работы со значениями свойств
goodsDataProperties = $('form.goodsDataForm select[name="form[properties][]"]'),
// Запоминаем блоки с информацией по модификациям, для ускорения работы
goodsDataModifications = $('div.goodsDataMainModificationsList');
// Обновляет возможность выбора свойств модификации, для отключения возможности выбора по характеристикам модификации которой не существует.
function updateVisibility(y) {
// Проверяем в каждом соседнем поле выбора модификаций, возможно ли подобрать модификацию для указанных свойств
goodsDataProperties.each(function (j) {
// Если мы сравниваем значения свойства не с самим собой, а с другим списком значений свойств
if (j != y) {
// Проходим по всем значениям текущего свойства модификации товара
$(this) .find('option') .each(function () {
// Записываем временный массив свойств, которые будем использовать для проверки существования модификации
var checkProperties = new Array();
$(goodsDataProperties) .each(function (i) {
checkProperties[i] = parseInt($(this) .val());
});
// Пытаемся найти модификацию соответствующую выбранным значениям свойств
checkProperties[j] = parseInt($(this) .attr('value'));
// Собираем хэш определяющий модификацию по свойствам
slug = checkProperties.sort(function (a, B) {
return a - b
}) .join('_');
// Ищем модификацию по всем выбранным значениям свойств товара. Если модификации нет в возможном выборе, отмечаем потенциальное значение выбора как не доступное для выбора, т.к. такой модификации нет.
if (!goodsDataModifications.filter('[rel="' + slug + '"]') .length) {
$(this) .attr('disabled', true);
// Если выбрав данное значение свойства товара можно подобрать модификацию, то выделяем вариант выбора как доступный.
} else {
$(this) .attr('disabled', false);
}
});
}
});
}
// Обновляем возможность выбора модификации товара по свойствам. Для тех свойств, выбор по которым не возможен, отключаем такую возможность.
// Проверяем возможность выбора на всех полях кроме первого, чтобы отключить во всех остальных варианты, которые не возможно выбрать
updateVisibility(0);
// Проверяем возможность выбора на всех полях кроме второго, чтобы в первом поле так же отключилась возможность выбора не существующих модификаций
updateVisibility(1);
//var goodsDataProperties = $('.goodsDataForm [name="form[properties][]"]');
// Изменение цены товара при изменении у товара свойства для модификации
goodsDataProperties.each(function () {
$(this) .change(function () {
var slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties),
modificationBlock = $('.goodsDataMainModificationsList[rel="' + slug + '"]'),
modificationId = parseInt(modificationBlock.find('[name="id"]') .val()),
modificationArtNumber = modificationBlock.find('[name="art_number"]') .val(),
modificationPriceNow = parseFloat(modificationBlock.find('[name="price_now"]') .val()),
modificationPriceNowFormated = modificationBlock.find('.price_now_formated') .html(),
modificationPriceOld = parseFloat(modificationBlock.find('[name="price_old"]') .val()),
modificationPriceOldFormated = modificationBlock.find('.price_old_formated') .html(),
modificationRestValue = parseFloat(modificationBlock.find('[name="rest_value"]') .val()),
modificationDescription = modificationBlock.find('.description') .html(),
modificationMeasureId = parseInt(modificationBlock.find('[name="measure_id"]') .val()),
modificationMeasureName = modificationBlock.find('[name="measure_name"]') .val(),
modificationMeasureDesc = modificationBlock.find('[name="measure_desc"]') .val(),
modificationMeasurePrecision = modificationBlock.find('[name="measure_precision"]') .val(),
modificationIsHasInCompareList = modificationBlock.find('[name="is_has_in_compare_list"]') .val(),
goodsModificationId = $('.goodsDataMainModificationId'),
goodsPriceNow = $('.goodsDataMainModificationPriceNow'),
goodsPriceOld = $('.goodsDataMainModificationPriceOld'),
goodsAvailable = $('.goodsDataMainModificationAvailable'),
goodsAvailableTrue = goodsAvailable.find('.available-true'),
goodsAvailableFalse = goodsAvailable.find('.available-false'),
goodsArtNumberBlock = $('.goodsDataMainModificationArtNumber'),
goodsArtNumber = goodsArtNumberBlock.find('span');
goodsCompareAddButton = $('.goodsDataCompareButton.add');
goodsCompareDeleteButton = $('.goodsDataCompareButton.delete');
// goodsModDescriptionBlock = $('.goodsDataMainModificationsDescriptionBlock'); меняю строчкой ниже для редактирования описания модификации в шаблоне Товар
goodsModDescriptionBlock = $('.goodsDataMainModificationsDescriptionBlock > span');
// Изменяем данные товара для выбранных параметров. Если нашлась выбранная модификация
if (modificationBlock.length) {
// Цена товара
goodsPriceNow.html(modificationPriceNowFormated);
// Старая цена товара
if (modificationPriceOld > modificationPriceNow) {
goodsPriceOld.html(modificationPriceOldFormated);
} else {
goodsPriceOld.html('');
}
// Есть ли товар есть в наличии
if (modificationRestValue > 0) {
goodsAvailableTrue.show();
goodsAvailableFalse.hide();
// Если товара нет в наличии
} else {
goodsAvailableTrue.hide();
goodsAvailableFalse.show();
}
// Если товар есть в списке сравнения
if (modificationIsHasInCompareList > 0) {
goodsCompareAddButton.hide();
goodsCompareDeleteButton.show();
// Если товара нет в списке сравнения
} else {
goodsCompareAddButton.show();
goodsCompareDeleteButton.hide();
}
// Покажем артикул модификации товара, если он указан
if (modificationArtNumber.length > 0) {
goodsArtNumberBlock.show();
goodsArtNumber.html(modificationArtNumber);
// Скроем артикул модификации товара, если он не указан
} else {
goodsArtNumberBlock.hide();
goodsArtNumber.html('');
}
// Описание модификации товара. Покажем если оно есть, спрячем если его у модификации нет
if (modificationDescription.length > 0) {
goodsModDescriptionBlock.show() .html('<div>' + modificationDescription + '</div>');
} else {
goodsModDescriptionBlock.hide() .html();
}
// Идентификатор товарной модификации
goodsModificationId.val(modificationId);
} else {
// Отправим запись об ошибке на сервер
sendError('no modification by slug ' + slug);
alert('К сожалению сейчас не получается подобрать модификацию соответствующую выбранным параметрам.');
}
});
});
var
// Минимальное значение цены для фильтра
priceFilterMinAvailable = parseInt($('.goodsFilterPriceRangePointers .min') .text())
// Максимальное значение цены для фильтра
,
priceFilterMaxAvailable = parseInt($('.goodsFilterPriceRangePointers .max') .text())
// Максимальное значение цены для фильтра
,
priceSliderBlock = $('#goods-filter-price-slider')
// Поле ввода текущего значения цены "От"
,
priceInputMin = $('#goods-filter-min-price')
// Поле ввода текущего значения цены "До"
,
priceInputMax = $('#goods-filter-max-price')
// Блок с кнопкой, которую есть смысл нажимать только тогда, когда изменялся диапазон цен.
,
priceSubmitButtonBlock = $('.goodsFilterPriceSubmit')
;
// Изменяет размер ячеек с ценой, т.к. у них нет рамок, есть смысл менять размеры полей ввода, чтобы они выглядили как текст
function priceInputsChangeWidthByChars() {
// Если есть блок указания минимальной цены
if (priceInputMin.length) {
priceInputMin.css('width', (priceInputMin.val() .length * 7 + 30) + 'px');
priceInputMax.css('width', (priceInputMax.val() .length * 7 + 30) + 'px');
}
}
// Слайдер, который используется для удобства выбора цены
priceSliderBlock.slider({
range: true,
min: priceFilterMinAvailable,
max: priceFilterMaxAvailable,
values: [
parseInt($('#goods-filter-min-price') .val()),
parseInt($('#goods-filter-max-price') .val())
],
slide: function (event, ui) {
priceInputMin.val(ui.values[0]);
priceInputMax.val(ui.values[1]);
priceSubmitButtonBlock.show();
priceInputsChangeWidthByChars();
}
});
// При изменении минимального значения цены
priceInputMin.keyup(function () {
var newVal = parseInt($(this) .val());
if (newVal < priceFilterMinAvailable) {
newVal = priceFilterMinAvailable;
}
priceSliderBlock.slider('values', 0, newVal);
priceSubmitButtonBlock.show();
priceInputsChangeWidthByChars();
});
// При изменении максимального значения цены
priceInputMax.keyup(function () {
var newVal = parseInt($(this) .val());
if (newVal > priceFilterMaxAvailable) {
newVal = priceFilterMaxAvailable;
}
priceSliderBlock.slider('values', 1, newVal);
priceSubmitButtonBlock.show();
priceInputsChangeWidthByChars();
});
// Обновить размеры полей ввода диапазона цен
priceInputsChangeWidthByChars();
/* Кнопка добавления товара на сравнение товаров
$('.goodsDataCompareButton').click(function(){
window.location.href = $(this).attr('rel') +
($(this).attr('rel').indexOf( '\?' ) > -1 ? '&' : '?') +
'id='+
$('.goodsDataMainModificationId').val()+
'&from='+
$('input[name="form[goods_from]"]').val();
return false;
});*/
// Добавление/удаление товара на сравнение/избранное через ajax
$('.add_to_compare_small, .add_to_wishlist_small') .click(function () {
// Объект ссылки, по которой кликнули
var
a = $(this),
addUrl = a.attr('data-action-add-url'),
delUrl = a.attr('data-action-delete-url'),
addTitle = a.attr('data-action-add-title'),
delTitle = a.attr('data-action-delete-title'),
isAdd = a.attr('data-action-is-add'),
aText = a.parent() .find('.add_to_wishlist_small_text, .add_to_compare_small_text')
requestUrl = a.attr('href')
;
// Если в ссылке присутствует идентификатор, который мы можем узнать только вытащив его с текущей страницы
if (/GET_GOODS_MOD_ID_FROM_PAGE/.test(requestUrl)) {
requestUrl = requestUrl.replace(new RegExp('GET_GOODS_MOD_ID_FROM_PAGE'), $('.goodsDataMainModificationId') .val());
}
// Если есть информация о том какие URL адреса будут изменены, то можено не перегружать страницу и сделать запрос через ajax
if (addUrl && delUrl) {
$.ajax({
type: 'POST',
dataType: 'json',
cache: false,
url: requestUrl,
data: {
'ajax_q': 1
},
success: function (data) {
if ('ok' == data.status) {
if (isAdd == 1) {
var
from = addUrl,
to = delUrl,
newIsAddStatus = 0,
newTitle = delTitle ? delTitle : ''
;
a.addClass('added');
} else {
var
from = delUrl,
to = addUrl,
newIsAddStatus = 1,
newTitle = addTitle ? addTitle : ''
;
a.removeClass('added');
}
// Если указано, что изменилось число товаров на сравнении
if (typeof (data.compare_goods_count) != 'undefined') {
// Блок информации о том, что есть товары на сравнении
var compareBlock = $('#compareInfoBlock');
// Если на сравнении больше нет товаров
if (0 < data.compare_goods_count) {
compareBlock.show();
// Если на сравнении есть новые товары
} else {
compareBlock.hide();
}
// Указываем информацию о новом количестве товаров на сравнении
// заменяю следующей строчкой из-за слова Выбрано при своем создании Сравнить товары в HTML со строки 467 compareBlock.find('.nb_goods').text( data.compare_goods_count + ( typeof(genWordEnd) == 'function' ? ' товар' + genWordEnd(data.compare_goods_count, "", "а", "ов") : '') );
compareBlock.find('.nb_goods') .text('Выбрано ' + data.compare_goods_count + (typeof (genWordEnd) == 'function' ? ' товар' + genWordEnd(data.compare_goods_count, '', 'а', 'ов') : ''));
}
// Обновляем ссылку, на которую будет уходить запрос и информацию о ней
a.attr('href', a.attr('href') .replace(new RegExp(from), to)) .attr('title', newTitle) .attr('data-action-is-add', newIsAddStatus);
// Если рядом с ссылкой в виде круга есть текстовая надпись с описанием действия
if (aText.length) {
aText.text(aText.attr(isAdd == 1 ? 'data-action-text-delete' : 'data-action-text-add'));
}
// Если есть функция, которая отображает сообщения пользователю
if (typeof (noty) == 'function') {
noty({
text: data.message,
layout: 'center',
type: 'success',
textAlign: 'center',
easing: 'swing',
animateOpen: {
'height': 'toggle'
},
animateClose: {
'opacity': 'hide'
},
speed: '500',
timeout: '3000',
closable: false,
modal: false,
dismissQueue: true,
onClose: true,
killer: true
});
}
} else if ('error' == data.status) {
// Если есть функция, которая отображает сообщения пользователю
if (typeof (noty) == 'function') {
noty({
text: data.message,
layout: 'center',
type: 'error',
textAlign: 'center',
easing: 'swing',
animateOpen: {
'height': 'toggle'
},
animateClose: {
'opacity': 'hide'
},
speed: '500',
timeout: '3000',
closable: false,
modal: false,
dismissQueue: true,
onClose: true,
killer: true
});
}
}
}
});
return false;
}
});
// Сравнение товаров. Увеличение изображение при клике на ссылку увеличения и открытие галереии с изображениями этого товара
$('.CompareGoodsImageZoom') .click(function () {
// Галлерея фотографий для данной модификации товаров
var galleryBlock = $('.galleryBlock' + $(this) .attr('rel')),
// Главное изображение товара, которое сейчас стоит у товара
galleryMainImage = $('.CompareGoodsImageMain' + $(this) .attr('rel')),
// Изображение по которому нужно кликнуть в галлерее изображений
ImageIngallery = galleryBlock.find('.CompareGoodsImageGallery' + galleryMainImage.attr('rel'));
// Запускаем галлерею изображений от изображения товара, чтобы если например кликнули по гайке, то и открылись гайка, а не еще какой-либо изображение этого товара
ImageIngallery.nyroModalManual({
gallery: 'gallery' + $(this) .attr('rel')
});
return false;
});
// Сравнение товаров. Инвертирование свойств для сравнения товара
$('.CompareCheckbox.invert') .click(function () {
var checked = true,
checkboxes = $('.CompareCheckbox:not(.invert)');
checkboxes.each(function () {
if ($(this) .attr('checked')) {
checked = false;
return false;
}
});
checkboxes.each(function () {
$(this) .attr('checked', checked);
});
$(this) .attr('checked', checked);
});
// Сравнение товаров. Скрытие характеристик товара, которые выделил пользователь
$('.CompareGoodsHideSelected') .click(function () {
$('.CompareGoodsTableTbodyComparisonLine') .each(function () {
var CheckedCheckbox = $(this) .find('.CompareCheckbox:checked:not(.invert)');
if (CheckedCheckbox.length > 0) {
$(this) .hide();
}
});
// отменяем выделение характеристик товаров
$('.CompareCheckbox') .attr('checked', false);
return false;
});
// Сравнение товаров. Отображение скрытых характеристик товара
$('.CompareGoodsShowAll') .click(function () {
$('.CompareGoodsTableTbodyComparisonLine:hidden') .show();
return false;
});
// Сравнение товаров. Верхняя навигация изменение фильтра на отображение всех характеристик товаров
$('.CompareGoodsTableFilterShowAll') .click(function () {
$('.CompareGoodsTableFilterSelected') .removeClass('CompareGoodsTableFilterSelected');
$('.CompareGoodsTableTbodyComparisonLine:hidden') .show();
$(this) .addClass('CompareGoodsTableFilterSelected');
return false;
});
// Сравнение товаров. Фильтр в верхней навигации. Отображение только различающихся характеристик товара
$('.CompareGoodsTableFilterShowOnlyDifferent') .click(function () {
$('.CompareGoodsTableFilterSelected') .removeClass('CompareGoodsTableFilterSelected');
$('.CompareGoodsTableTbodyComparisonLine:not(.same)') .show();
$('.CompareGoodsTableTbodyComparisonLine.same') .hide();
$(this) .addClass('CompareGoodsTableFilterSelected');
return false;
});
// Сравнение товаров. При наведении на строку сравнения, она выделяется цветом
$('.CompareGoodsTableTbodyComparisonLine') .hover(function () {
$(this) .addClass('hover');
}, function () {
$(this) .removeClass('hover');
}
);
// При клике по строке выделяем свойство
$('.CompareGoodsTableTbodyComparisonLine td:not(.ceil1)') .click(function () {
var CompareCheckbox = $(this) .parent() .find('.CompareCheckbox');
if (CompareCheckbox.attr('checked')) {
CompareCheckbox.attr('checked', false);
} else {
CompareCheckbox.attr('checked', true);
}
});
function compareGetVars() {
return new Array($('.CompareGoodsTableTbody tr:first td') .length - 1, parseInt($('.CompareGoodsTableTbody tr:first td:visible:not(.ceil1)') .attr('class') .replace(new RegExp('noBorderBottom compare-td compare-td-'), '')), parseInt($('.CompareGoodsTableTbody tr:first td:visible:last') .attr('class') .replace(new RegExp('noBorderBottom compare-td compare-td-'), ''))
);
}
// Прокрутка списка сравнения вправо
$('.CompareGoodsTableNext') .click(function () {
// Определяем используемые поля
var data = compareGetVars();
// Изменяем их если это возможно.
if (data[0] > data[2]) {
$('.compare-td-' + data[1]) .hide();
$('.compare-td-' + (data[2] + 1)) .show();
if ((data[2] + 1) >= data[0]) {
$(this) .find('a') .addClass('disable');
}
if (data[1] + 1 != 1) {
$('.CompareGoodsTablePrev a') .removeClass('disable');
}
}
return false;
});
// Прокрутка списка сравнения влево
$('.CompareGoodsTablePrev') .click(function () {
// Определяем используемые поля
var data = compareGetVars();
// Изменяем их если это возможно.
if (1 < data[1]) {
$('.compare-td-' + (data[1] - 1)) .show();
$('.compare-td-' + data[2]) .hide();
if ((data[1] - 1) <= 1) {
$(this) .find('a') .addClass('disable');
}
if (data[2] - 1 != data[0]) {
$('.CompareGoodsTableNext a') .removeClass('disable');
}
}
return false;
});
// Форма регистрации нового пользователя, действие ссылки "показать пароль"
$('.clientForm .showPass') .click(function () {
ChangePasswordFieldType(this, $('#sites_client_pass'));
return false;
});
// Форма регистрации нового пользователя, при оформлении заказа
$('.OrderShowPass') .click(function () {
ChangePasswordFieldType(this, $('#contactPassWord'));
return false;
});
/* При вводе пароля с caps lockом, покажет блок с сообщением для пользователя
$('#sites_client_pass, #contactPassWord').capslock({
caps_lock_on:function(){$("#caps_lock").show();},
caps_lock_off:function(){$("#caps_lock").hide();}
});*/
// При оформлении заказа дадим возможность зарегистрироваться пользователю
$('#contactWantRegister') .click(function () {
if ($(this) .attr('checked')) {
$('.contactRegisterNeedElement') .show();
$('#contactEmail, #contactPassWord') .addClass('required');
} else {
$('.contactRegisterNeedElement') .hide();
$('#contactEmail, #contactPassWord') .removeClass('required');
}
});
// Добавление отзыва о товаре. Рейтинг
if (typeof ($('.goodsDataOpinionTableRating') .stars) == 'function') {
$('.goodsDataOpinionTableRating') .stars({
inputType: 'input',
split: 2,
captionEl: $('.goodsDataOpinionMsg'),
cancelShow: false
});
}
// Список отзывов о товаре. Ссылка на отображение формы для добавление отзыва о товаре
$('.goodsDataOpinionShowAddForm') .click(function () {
if (0 == $('#goodsDataOpinionAddBlock:visible') .length) {
$('#goodsDataOpinionAddBlock') .show('blind');
} else {
$('#goodsDataOpinionAddBlock') .hide('blind');
return false;
}
});
// Добавление отзыва о товаре. кнопка reset скрывающая форму добавления отзыва о товаре
$('.goodsDataOpinionFormReset') .click(function () {
$('#goodsDataOpinionAddBlock') .hide('blind');
return false;
});
// Иконка для обновления изображение капчи
$('.goodsDataOpinionCaptchaRefresh') .click(function () {
RefreshImageAction(this, 1, 1);
$('.goodsDataOpinionCaptchaImg') .attr('src', $('.goodsDataOpinionCaptchaImg') .attr('src') + '&rand' + Math.random(0, 10000));
return false;
});
// Фильтры по товарам. При нажании на какую либо характеристику или свойство товара происходит фильтрация товаров
$('.contentTbodySearchFilterBlock input') .click(function () {
$(this) [0].form.submit();
});
// Сортировка зон доставки по Алфавиту
var modifications = $('select.deliveryZoneRadio');
if (modifications.length) {
modifications.each(function () {
var self = $(this);
self.children('option:not([value="0"])') .sort(function (a, B) {
var left = $(a) .text() .toUpperCase();
var right = $(B) .text() .toUpperCase();
return (left < right) ? - 1 : (left > right) ? 1 : 0;
}) .each(function (index, element) {
self.append(element);
});
});
}
// Действия при выборе варианта доставки на этапе оформления заказа
$('.deliveryRadio') .click(function () {
// Устраняю ниже 2-мя строчками по ответу с форума проблему выбирая новый способ доставки именно через ее зону, неочищается цена в способе доставки выбранного ранее + еще строка ниже
$('.orderStageDeliveryZonePrice') .hide();
$('.orderStageDeliveryDefaultPrice') .show();
// Если текущая выделенная зона доставки не относится к выбранному варианту доставки, снимаем выделение с зоны доставки
if ($('.deliveryZoneRadio:checked') .attr('deliveryid') != $(this) .val()) {
$('.deliveryZoneRadio:checked') .click() .attr('checked', false);
}
// делаю цветной курсор в выбираемом способе доставки при оформлении заказа
$('.orderStageDeliveryListTable tbody') .removeClass('active');
$(this) .closest('tbody') .addClass('active');
}) .filter(':checked') .trigger('click');
// Действия при выборе зоны внутри варианта доставки на этапе оформления заказа
$('.deliveryZoneRadio') .click(function () {
// Устраняю ниже строчкой по ответу с форума проблему выбирая новый способ доставки именно через ее зону, неочищается цена в способе доставки выбранного ранее + еще 2 строки выше
$(this) .closest('tbody') .find('.deliveryRadio') .trigger('click');
var
deliveryId = $(this) .attr('deliveryid'),
deliveryZonePrice = $(this) .parent() .find('.deliveryZonePrice'),
deliveryTbody = $('.orderStageDeliveryListTable tbody[rel="' + deliveryId + '"]'),
deliveryBlock = deliveryTbody.find('#deliveryId' + deliveryId),
deliveryZonePriceBlock = deliveryTbody.find('.orderStageDeliveryZonePrice'),
deliveryDefaultPriceBlock = deliveryTbody.find('.orderStageDeliveryDefaultPrice')
;
// Если этот пункт уже выбран, при повторном клике пользователь видимо хочет снять выделение зоны доставки
if ('true' == $(this) .attr('rel')) {
$(this) .attr('checked', false);
$(this) .attr('rel', 'false');
// Показываем цену по умолчанию
deliveryDefaultPriceBlock.show();
// Скрываем цену образованную от зоны
deliveryZonePriceBlock.hide();
// Отмечаем у всех радио баттонов зон доставки свойство говорящее что они не отмечены
} else {
$('.deliveryZoneRadio') .attr('rel', 'false');
$(this) .attr('rel', 'true');
// Показываем цену по умолчанию
deliveryDefaultPriceBlock.hide();
// Скрываем цену образованную от зоны
deliveryZonePriceBlock.show() .html(deliveryZonePrice.html());
// Выделяем вариант доставки к которому относится зона доставки
deliveryBlock.attr('checked', true);
}
});
$('#deliveryConvenientDate') .datepicker({
dayNames: [
'Понедельник',
'Вторник',
'Среда',
'Четверг',
'Пятница',
'Суббота',
'Воскресенье'
],
dayNamesMin: [
'Вс',
'Пн',
'Вт',
'Ср',
'Чт',
'Пт',
'Сб'
],
closeText: 'Готово',
currentText: 'Сегодня',
duration: '',
monthNames: [
'Январь',
'Февраль',
'Март',
'Апрель',
'Май',
'Июнь',
'Июль',
'Август',
'Сентябрь',
'Окрябрь',
'Ноябрь',
'Декабрь'
],
monthNamesShort: [
'Янв',
'Фев',
'Март',
'Апр',
'Май',
'Июнь',
'Июль',
'Авг',
'Сен',
'Окт',
'Ноя',
'Дек'
],
yearRange: '-6:+6',
dateFormat: 'dd.mm.yy',
minDate: new Date(),
firstDay: 1
});
});
// Быстрый заказ
function quickorder(formSelector) {
// Находим форму, которую отправляем на сервер, для добавления товара в корзину
var formBlock = $($(formSelector) .get(0));
// Проверка на существование формы отправки запроса на добавление товара в корзину
if (1 > formBlock.length || formBlock.get(0) .tagName != 'FORM') {
alert('Не удалось найти форму добавления товара в корзину');
return false;
}
// Получаем данные формы, которые будем отправлять на сервер
var formData = formBlock.serializeArray();
// Сообщаем серверу, что мы пришли через ajax запрос
formData.push({
name: 'ajax_q',
value: 1
});
// Так же сообщим ему, что нужно сразу отобразить форму быстрого заказа
formData.push({
name: 'fast_order',
value: 1
});
// Аяксом добавляем товар в корзину и вызываем форму быстрого заказа товара
$.ajax({
type: 'POST',
cache: false,
url: formBlock.attr('action'),
data: formData,
success: function (data) {
$.fancybox({
content: data,
// При изменении размера окна изменяем размер окна оформления заказа
onUpdate: function () {
var w = $(window) .width() * 0.8;
if (w < 800) {
// Автоматический ресайз внутреннего блока fancybox-а
$('.fancybox-inner') .css('width', 'auto');
// Изменяем размер fancybox окна
$('.fancybox-wrap') .css({
'width': w + 'px'
});
}
return false;
}
});
setTimeout(function () {
$.fancybox.update();
}, 500);
}
});
return false;
}
// Я добавляю ниже блок для создаваемых мною крупных изображений в шаблоне Товар и счета кол-ва картинок
$(function () {
// $('a[rel="gallery"]').fancybox(); эту штатную строку заменяю след.блок ради счета картинок в Товаре
$('a[rel="gallery"]') .fancybox({
helpers: {
title: {
type: 'inside'
}
},
afterShow: function () {
var title = $(this.skin) .find('.fancybox-title');
if (!title.length) {
title = $(this.skin) .append($('<div class="fancybox-title">'));
}
title.append(' Изображение ' + (this.index + 1) + ' из ' + this.group.length);
}
});
// Увеличение изображение при клике на него и открытие галереи изображений
$('.goodsImageZoom a, .image-additional a') .click(function () {
if ($(this) .closest('.image-additional') .length) {
$('.goodsImageZoom') .attr('data', $(this) .attr('data'));
return (true);
}
$('.goodsImageList a[data="' + $('.goodsImageZoom') .attr('data') + '"]') .trigger('click');
return (false);
});
});
// Конец моего блока
// Для дизайна Отзывов + еще в main.scc
$(function () {
if ($('.goodsDataOpinionTableRating') .length) {
setInterval(function () {
$('.goodsDataOpinionTableRating input') .removeAttr('disabled');
}, 200);
}
});
// Ниже блок быстрого предпросмотр картинок + еще в main.css
$(function () {
$('.product-list') .on({
mouseenter: function () {
$(this) .closest('.prod_hold') .find('.preview') .show();
},
mouseleave: function () {
$(this) .closest('.prod_hold') .find('.preview') .hide();
}
}, '.prod_hold > div') .on('hover', '#thumb_images a.image', function () {
$(this) .closest('.prod_hold') .find('div.image img') .attr('src', $(this) .attr('data-rel'));
})
});
// Условие чтобы не показывать предпросмотр картинок, если она одна
function removePreviewOnly()
{
$('.prod-info-fly .preview') .each(function () {
if ($(this) .find('ul li') .size() < 2) {
$(this) .remove();
}
});
}
$(function () {
removePreviewOnly();
});