function Product(form, options) {
this.form = $(form);
this.add2cart = this.form.find(".add2cart");
this.button = this.add2cart.find("input[type=submit]");
for (var k in options) {
this[k] = options[k];
}
var self = this;
// add to cart block: services
this.form.find(".services input[type=checkbox]").click(function () {
var obj = $('select[name="service_variant[' + $(this).val() + ']"]');
if (obj.length) {
if ($(this).is(':checked')) {
obj.removeAttr('disabled');
} else {
obj.attr('disabled', 'disabled');
}
}
self.updatePrice();
});
this.form.find(".services .service-variants").on('change', function () {
self.updatePrice();
});
this.form.find(".skus input[type=radio]").click(function () {
var image_id =$(this).data('image-id');
if (image_id) {
setTimeout(function(){ $("#product-image-" + image_id).click() },500);
if(self.form.find('.soaring-cart-data').data('img_url')){
self.form.find('.soaring-cart-data').data('img_url', self.images[image_id].url_crop);
}
}
if ($(this).data('disabled')) {
self.button.attr('disabled', 'disabled');
self.form.find('.quantity-wrap').hide();
} else {
self.button.removeAttr('disabled');
self.form.find('.quantity-wrap').show();
}
self.form.find('.soaring-cart-data').data('sku_name', $(this).parent().find('[itemprop="name"]:first').text());
self.form.find('input[name="quantity"]').val(1);
var sku_id = $(this).val();
self.updateSkuServices(sku_id);
self.updatePrice();
});
this.form.find(".skus input[type=radio]:checked").click();
this.form.find("select.sku-feature").change(function () {
$(this).parent().find('.feature-btn.selected').removeClass('selected');
$(this).parent().find(".feature-btn[data-value-id='" + $(this).val() + "']").addClass('selected');
var key = "", sku_name = [];
self.form.find("select.sku-feature").each(function () {
key += $(this).data('feature-id') + ':' + $(this).val() + ';';
sku_name.push($(this).find(':selected').text());
});
var sku = self.features[key];
if (sku) {
if (sku.image_id) {
setTimeout(function(){ $("#product-image-" + sku.image_id).click() }, 500);
if(self.form.find('.soaring-cart-data').data('img_url')) {
self.form.find('.soaring-cart-data').data('img_url', self.images[sku.image_id].url_crop);
}
}
self.updateSkuServices(sku.id);
if (sku.available) {
self.button.removeAttr('disabled');
self.form.find('.quantity-wrap').show();
} else {
self.form.find("div.stocks div").hide();
self.form.find(".sku-no-stock").show();
self.button.attr('disabled', 'disabled');
self.form.find('.quantity-wrap').hide();
}
self.form.find('.soaring-cart-data').data('sku_name', sku_name.join(', '));
self.form.find('input[name="quantity"]').val(1);
self.add2cart.find(".price").data('price', sku.price);
self.updatePrice(sku.price, sku.compare_price);
} else {
self.form.find('.quantity-wrap').hide();
self.form.find("div.stocks div").hide();
self.form.find(".sku-no-stock").show();
self.button.attr('disabled', 'disabled');
self.add2cart(".compare-at-price").hide();
self.add2cart(".price").empty();
}
});
this.form.find("select.sku-feature:first").change();
if (!this.form.find(".skus input:radio:checked").length) {
this.form.find(".skus input:radio:enabled:first").attr('checked', 'checked');
}
this.form.find("span.feature-btn").click(function(){
if($(this).hasClass("selected")) return false;
$(this).parent().find('select.sku-feature').val($(this).data("value-id")).change();
});
this.form.find(".quantity-wrap input").change(function(){
var max = $(this).data('max');
if(parseInt($(this).val()) > 0){
if(max && parseInt($(this).val()) > parseInt(max)){
$(this).val(parseInt(max));
alert($.buysimply.locale.err_cnt_prd);
}
$(this).val(parseInt($(this).val()));
}else{
$(this).val(1);
}
});
this.form.find(".quantity-btn-plus").click(function(){
var inp = $(this).closest('.quantity-wrap').find('input');
inp.val(parseInt(inp.val()) + 1);
inp.change();
return false;
});
this.form.find(".quantity-btn-minus").click(function(){
var inp = $(this).closest('.quantity-wrap').find('input');
inp.val(parseInt(inp.val()) - 1);
inp.change();
return false;
});
this.form.submit(function () {
var f = $(this);
$.post(f.attr('action') + (sumbolrub ? '?html=1' : ''), f.serialize(), function (response) {
if (response.status == 'ok') {
var cart_total = $(".cart-total");
var cart_div = f.closest('.cart');
if ( $(window).scrollTop()>=35 ) {
cart_total.closest('#cart').addClass( "fixed" );
}
cart_total.closest('#cart').removeClass('empty');
if ($("table.cart").length) {
$('.wrap-cart-load').load(location.href, function () {
cart_total.html(response.data.total);
$(window).unbind('load.jcarousel, resize.jcarousel');
$('ul[class^="product-slider-"]').jcarousel({
scroll: 1,
buttonNextHTML: '
',
buttonPrevHTML: '
',
reloadCallback: function(carousel){ carousel.scroll(1, false); carousel.list.css('left', 0); }
});
});
} else {
var clone = $('').append(f.clone());
if (cart_div.closest('.dialog').length) {
clone.insertAfter(cart_div.closest('.dialog'));
} else {
clone.insertAfter(cart_div);
}
clone.css({
top: cart_div.offset().top,
left: cart_div.offset().left,
width: cart_div.width()+'px',
height: cart_div.height()+'px',
position: 'absolute',
overflow: 'hidden'
}).animate({
top: cart_total.offset().top,
left: cart_total.offset().left,
width: 0,
height: 0,
opacity: 0.5
}, 500, function() {
$(this).remove();
cart_total.html(response.data.total);
});
var $scd = self.form.find('.soaring-cart-data').data();
if($scd){
var $item = $('#soaring-cart li[data-id="'+response.data.item_id+'"]');
var cnt = parseInt(self.form.find('input[name="quantity"]').val()) || 1;
if($item.length){
var $qty = $item.find('input.soaring-cart-qty');
cnt += parseInt($qty.val());
$qty.val(cnt);
$item.find('.price').html(self.currencyFormat($scd.price*cnt, !sumbolrub));//*
}else{
$.extend($scd, { id: response.data.item_id, cnt: cnt, price: ''+self.currencyFormat($scd.price*cnt, !sumbolrub) });//*
$('#soaring-cart ul').prepend(newItem($scd));
setSoaringHeight();
}
$('#soaring-cart').scrollTop( $('#soaring-cart li[data-id="'+response.data.item_id+'"]').position().top );
}
}
if (cart_div.closest('.dialog').length) {
cart_div.closest('.dialog').hide().find('.dialog-window').empty().append('');
}
if (response.data.error) {
alert(response.data.error);
}
} else if (response.status == 'fail') {
alert(response.errors);
}
}, "json");
return false;
});
}
Product.prototype.currencyFormat = function (number, no_html) {
// Format a number with grouped thousands
//
// + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfix by: Michael White (http://crestidg.com)
var i, j, kw, kd, km;
var decimals = this.currency.frac_digits;
var dec_point = this.currency.decimal_point;
var thousands_sep = this.currency.thousands_sep;
// input sanitation & defaults
if( isNaN(decimals = Math.abs(decimals)) ){
decimals = 2;
}
if( dec_point == undefined ){
dec_point = ",";
}
if( thousands_sep == undefined ){
thousands_sep = ".";
}
i = parseInt(number = (+number || 0).toFixed(decimals)) + "";
if( (j = i.length) > 3 ){
j = j % 3;
} else{
j = 0;
}
km = (j ? i.substr(0, j) + thousands_sep : "");
kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
//kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).slice(2) : "");
kd = (decimals && (number - i) ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, 0).slice(2) : "");
var number = km + kw + kd;
var s = no_html ? this.currency.sign : this.currency.sign_html;
if (!this.currency.sign_position) {
return s + this.currency.sign_delim + number;
} else {
return number + this.currency.sign_delim + s;
}
};
Product.prototype.serviceVariantHtml= function (id, name, price) {
return $('').text(name + ' (+' + this.currencyFormat(price, 1) + ')');
};
Product.prototype.updateSkuServices = function (sku_id) {
this.form.find("div.stocks div").hide();
this.form.find(".sku-" + sku_id + "-stock").show();
this.form.find("div.selectable-articul div").hide();
this.form.find(".sku-" + sku_id + "-articul").show();
var max = 0;
this.form.find(".sku-" + sku_id + "-stock i").each(function(){ max += isNaN(parseInt($(this).data('max'))) ? 0 : parseInt($(this).data('max')); });
this.form.find('input[name="quantity"]').data('max', max == 0 ? '' : max);
for (var service_id in this.services[sku_id]) {
var v = this.services[sku_id][service_id];
if (v === false) {
this.form.find(".service-" + service_id).hide().find('input,select').attr('disabled', 'disabled').removeAttr('checked');
} else {
this.form.find(".service-" + service_id).show().find('input').removeAttr('disabled');
if (typeof (v) == 'string') {
this.form.find(".service-" + service_id + ' .service-price').html(this.currencyFormat(v, !sumbolrub));
this.form.find(".service-" + service_id + ' input').data('price', v);
} else {
var select = this.form.find(".service-" + service_id + ' .service-variants');
var selected_variant_id = select.val();
for (var variant_id in v) {
var obj = select.find('option[value=' + variant_id + ']');
if (v[variant_id] === false) {
obj.hide();
if (obj.attr('value') == selected_variant_id) {
selected_variant_id = false;
}
} else {
if (!selected_variant_id) {
selected_variant_id = variant_id;
}
obj.replaceWith(this.serviceVariantHtml(variant_id, v[variant_id][0], v[variant_id][1]));
}
}
this.form.find(".service-" + service_id + ' .service-variants').val(selected_variant_id);
}
}
}
};
Product.prototype.updatePrice = function (price, compare_price) {
if (price === undefined) {
var input_checked = this.form.find(".skus input:radio:checked");
if (input_checked.length) {
var price = parseFloat(input_checked.data('price'));
var compare_price = parseFloat(input_checked.data('compare-price'));
} else {
var price = parseFloat(this.add2cart.find(".price").data('price'));
}
}
if (compare_price) {
if (!this.add2cart.find(".compare-at-price").length) {
this.add2cart.find('.product-price').prepend('');
}
this.add2cart.find(".compare-at-price").html(this.currencyFormat(compare_price, !sumbolrub)).show();
} else {
this.add2cart.find(".compare-at-price").hide();
}
var self = this;
this.form.find(".services input:checked").each(function () {
var s = $(this).val();
if (self.form.find('.service-' + s + ' .service-variants').length) {
price += parseFloat(self.form.find('.service-' + s + ' .service-variants :selected').data('price'));
} else {
price += parseFloat($(this).data('price'));
}
});
this.add2cart.find(".price").html(this.currencyFormat(price, !sumbolrub));
this.form.find('.soaring-cart-data').data('price', price);
}
$(function () {
// product images
$("#product-gallery a").click(function () {
$("#product-image").parent().find("div.loading").remove();
$("#product-image").parent().append('
');
var img = $(this).find('img');
var size = $("#product-image").attr('src').replace(/^.*\/[0-9]+\.(.*)\..*$/, '$1');
var src = img.attr('src').replace(/^(.*\/[0-9]+\.)(.*)(\..*)$/, '$1' + size + '$3');
$('').attr('src', src).load(function () {
$("#product-image").attr('src', src);
$("#product-image").parent().find("div.loading").remove();
}).each(function() {
//ensure image load is fired. Fixes opera loading bug
if (this.complete) { $(this).trigger("load"); }
});
/*replace big image url*/
var big_size = $("#product-image").data('zoom-image').replace(/^.*\/[0-9]+\.(.*)\..*$/, '$1');
var big_src = img.attr('src').replace(/^(.*\/[0-9]+\.)(.*)(\..*)$/, '$1' + big_size + '$3');
$("#product-image").attr('data-zoom-image', big_src);
$("#product-image").closest('a').attr('href', big_src);
/*select active*/
$(this).closest('ul').find('a.zoomThumbActive').removeClass('zoomThumbActive');
$(this).addClass('zoomThumbActive');
return false;
});
//product tabs
$('ul.info-block-menu li').click(function(){
$('.tab-content').hide();
$(this).parent().find('li').removeClass('selected');
$(this).addClass('selected');
$('#tab'+$(this).data('tab')).show();
});
var tabSli = $('ul.info-block-menu li.selected');
if(tabSli.length){ tabSli.click(); }else{ $('ul.info-block-menu li:first').click(); }
//print
$('a.icon-print').click(function() {
window.print();
return false;
});
});
var addLastview = function(id, lvcount, lvreverse){
if (lvcount === undefined || lvcount <= 0 ) { lvcount = 30; }
if (lvreverse === undefined) { lvreverse = true; }
var lastview = $.cookie('shop_lastview');
if (lastview) { lastview = lastview.split(','); } else { lastview = []; }
var i = $.inArray(id+'', lastview);
if (i != -1) { lastview.splice(i, 1); }
if(lvreverse) { lastview.reverse(); }
if (lastview.length >= lvcount) { lastview.shift(); lastview[lastview.length] = id+''; } else { lastview[lastview.length] = id+''; }
if(lvreverse) { lastview.reverse(); }
$.cookie('shop_lastview', lastview.join(','), { expires: 30, path: '/'});
}
/*
playback timings (ms):
LoadShardBlock: 90.361 (3)
esindex: 0.007
captures_list: 104.745
CDXLines.iter: 9.993 (3)
PetaboxLoader3.datanode: 131.205 (4)
exclusion.robots: 0.278
exclusion.robots.policy: 0.262
RedisCDXSource: 1.661
PetaboxLoader3.resolve: 33.338
load_resource: 112.906
*/