PTX.Timer = function(callback, interval){ var timer = null; var counter = 0; var isStopped = false; var isExecuting = false; var self = this; function execute(){ counter++; if(isFunction(callback)){ callback.call(this, counter); }; isExecuting = false; }; this.start = function(){ if(isExecuting == false && isStopped == false){ isExecuting = true; execute(); timer = window.setTimeout(function(){ self.start(); }, interval); }; return this; }; this.pause = function(){ isStopped = true; isExecuting = true; return this; }; //when resume is invoked after stop the counter will start again from 0. "wait" parameter has to be set to true, //@wait - If true the execution will restart after the interval predefined. If false or not defined it will restart immidiately. this.resume = function(wait){ isStopped = false; isExecuting = false; if(wait === true){ var newTimer = window.setTimeout(function(){ self.start(); newTimer = window.clearTimeout(newTimer); }, interval); }else{ this.start(); }; return this; }; this.stop = function(){ isStopped = true; counter = 0; isExecuting = true; timer = window.clearTimeout(timer); return this; }; }; function setTopMenuSlideBox(idBt, idBox, exclusion){ var button = $('#{0}'.format(idBt)); var box = $('#{0}'.format(idBox)); //button.removeAttr('href'); button.click(function(e){ e.preventDefault(); box.slideToggle(200); button.toggleClass('active'); }); box.mouseup(function(e){ return false; }); $('body').mouseup(function(e) { if(e.target == button[0]){ return; }; var tgt = $(e.target); if(!(tgt.parent('#{0}'.format(idBt)).length > 0) && !(isDefined(exclusion) && (tgt.is(exclusion)))) { button.removeClass('active'); box.slideUp(200); }; }); }; function setTopMenuHoverBox(idBt, idBox){ var button = $('#{0}'.format(idBt)); var buttonParent = button.parent(); var box = $('#{0}'.format(idBox)); buttonParent.hover( function(e){ button.addClass('active'); box.show(); }, function(e){ button.removeClass('active'); box.hide(); } ); }; function setUpLogonMini(){ var frmLogon = $('#frmLogonSmall'); var inpUserNameMini = frmLogon.find('#inpUserNameMini'); var inpPasswordMini = frmLogon.find('#inpPasswordMini'); var fieldset = frmLogon.find('fieldset'); var label = frmLogon.find('#logonMiniResponse'); var loader = $('
'); var gear = $('
'); function doLogin(){ fieldset.append(loader).append(gear); $.ajax({ type : 'POST', dataType : 'json', url : 'https://www.swsprinting.com/en/site/handlers/logon.php', data : frmLogon.serialize() }).done(function(data, textStatus, jqXHR){ if(data.success === 1){ if(isGlobalVar('isLogonPage') && isLogonPage){ document.redirect("https://www.swsprinting.com/en/index.php"); }else{ document.redirect(document.location); }; }else{ label.html(data.message); gear.remove(); loader.remove(); }; }).fail(function(jqXHR, textStatus, errorThrown){ label.html("An error has occurred. Please try again later."); gear.remove(); loader.remove(); }).always(function(data_jqXHR, textStatus, jqXHR_errorThrown){ frmLogon.find('input:password').val(''); //frmLogon.find('input:text, input:password').val(''); //frmLogon.find('input:checkbox').removeAttr('checked'); }); }; frmLogon.bind('submit', function(){ label.html(''); if(isValidText(inpUserNameMini.val()) && isValidText(inpPasswordMini.val())){ doLogin(); }else{ label.html("Please insert username and password !"); }; return false; }); }; function setUpSkype(){ var btSkype = $('#btSkype') .click(function(e){ document.redirect('skype:sws.pubblicita?call'); }) .tipsy({gravity : 'w', offset : 2}); var skypeUrl = '/site/handlers/skype.php'; var skypeInvalidStatuses = [0, 1, 6,]; function checkSkypeStatus(){ $.get(skypeUrl, function(data){ var data = parseInt(data); if(skypeInvalidStatuses.contains(data)){ btSkype.removeClass('active') .attr('title', 'Offline'); }else{ btSkype.addClass('active') .attr('title', 'Online'); }; }); }; new PTX.Timer(checkSkypeStatus, (10 * Date.CONST.MINUTE)).start(); }; function setValidator(frm, validCallback, invalidCallback, inline, closeOnClick){ var validator = frm.validate({ wrapper : 'div', errorElement : 'div', errorClass : 'content', highlight : function(element, errorClass){ var element = $(element); if(element.is(':radio') || element.is(':checkbox')){ element.closest('.field-container').addClass('x-error'); }else{ element.addClass('x-field-error'); }; }, unhighlight : function(element, errorClass){ var element = $(element); if(element.is(':radio') || element.is(':checkbox')){ element.closest('.field-container').removeClass('x-error'); }else{ element.removeClass('x-field-error'); }; if(validator.isValid()){ if(isFunction(validCallback)){ validCallback.call(this, frm, validator); }; }; }, invalidHandler : function(e, validator){ if(isFunction(invalidCallback)){ validator.settings.focusInvalid = false; invalidCallback.call(this, e, validator); }; }, errorPlacement : function(error, element){ error.addClass('validator-error-tooltip'); error.css('opacity', 0.8); error.appendTo(element.parent()); if(closeOnClick === true){ error.bind('click', function(e){ error.remove(); }); }; if(inline){ error.addClass('inline'); }else{ var labelLeftSpace = 0; if(element.is(':radio') || element.is(':checkbox')){ labelLeftSpace = element.parent().find('label').width()+10; }; error.css({ left : element.outerWidth()+10 + element[0].offsetLeft + labelLeftSpace, top : -(error.outerHeight()-element.outerHeight())/2 }); }; } }); return validator; }; function setUpCartMiniView(){ var cartMiniViewContainer = $('#ptxCartMiniViewContainer'); var childPos = $('#btCart').offset().left; var wrapper = $('.wrapper:first', document.body); var parentPos = wrapper.offset().left; cartMiniViewContainer.outerWidth(wrapper.width()-parseInt(childPos - parentPos)) .setSelectable(false); }; //$(window).resize(setUpCartMiniView); PTX.Cart = function(){ var isInitialized = false; var self = this; var nfPos = 0; this.page; this.mode = cartMode; this.btCart; this.container; this.loader = $('
'); this.loaderGear = $('
'); this.loaderTarget; this.token; this.bgColorSuccess; this.bgColorFailure; //mode 1 only this.lblCounter; this.frmAdd; this.btAdd; this.prodSpecs; this.prodIsCustomizable; //mode 3 only this.paymentContainer; this.paymentMethod = 0; var setupAjax = (function(){ $.ajaxSetup({ type : 'POST', url : 'https://www.swsprinting.com/en/site/handlers/cart.php', dataType : 'html', success : function(data, textStatus, jqXHR){}, error : function(jqXHR, textStatus, errorThrown){} }); })(); this.InitShopping = function(){ if(!isInitialized){ this.container = $('#ptxCartMiniViewContainer'); this.loaderTarget = this.container; this.setupCommon(); this.bgColorSuccess = '#f0f0f0'; this.bgColorFailure = '#c78785'; this.lblCounter = this.btCart.find('#ptxCartCounterLabel'); this.frmAdd = $('#ptxCartFrmAdd'); this.btAdd = this.frmAdd.find('#ptxCartBtAdd'); this.prodSpecs = this.frmAdd.find('#pcps'); this.prodIsCustomizable = (this.frmAdd.find('#pcpic').val() == 1); this.btAdd.click(function(e){ e.preventDefault(); self.AddItem($(this)); }); //to be put on btAdd as well ? var pe = new PTX.Timer(function(){ self.Refresh(); }, (Date.CONST.SECOND * 10)).start(); self.container.hover(function(){ pe.pause(); }, function(){ pe.resume(true); }); isInitialized = true; }; }; this.InitRevision = function(){ if(!isInitialized){ this.container = $('#ptxCartFullViewContainer'); this.loaderTarget = this.container; if(this.mode === 3){ this.loaderTarget = $('#ptxCartBillingContainer'); this.paymentContainer = $('#ptxCartPaymentContainer'); var shipmentBox = $('#ptxCartShipment') if(this.paymentContainer.length){ this.paymentContainer.append(shipmentBox.removeClass('hs')); }; shipmentBox.find('input:radio[name="pcpm"]').live('change', shipmentBox.container, function(e){ self.paymentMethod = $(this).val(); self.Refresh(); }); shipmentBox.find('input:submit[name="commit_order"]').live('click', shipmentBox.container, function(e){ var bt = $(this); if($('form[name=frmBilling]').valid()){ (function(){ bt.attr('disabled', true).addClass('disabled'); }).delay(100); }; }); }; this.setupCommon(); this.bgColorSuccess = '#7A9709'; this.bgColorFailure = '#c78785'; isInitialized = true; }; }; this.AddItem = function(bt){ if(this.mode === 1){ var containerIsOpen = this.container.is(':visible'); if(containerIsOpen){ this.openLoader(); }; if(bt){ bt.attr('disabled', true).addClass('disabled'); }; this.prodSpecs.val(''); if(this.prodIsCustomizable){ this.prodSpecs.val(dfmain.Df.getAll());//see dfmain.Df.generateProd }; $.ajax({ data : this.frmAdd.serialize(), }).done(function(data, textStatus, jqXHR){ var response = self.updateView(data); var hasError = response.hasError; self.page.animate({scrollTop : 0}, 400); if(!containerIsOpen){ self.btCart.click(); }; //if(!hasError || Number(response.code).isInRange(303, 305)){ var itemList = response.view.find('div.cart-item-list'); var lastAddedItem = $('.ci[data-uid="{0}"]'.format(response.lastUid)); if(lastAddedItem.length){ lastAddedItem.css('backgroundColor', (hasError ? self.bgColorFailure : self.bgColorSuccess)); itemList.animate( {scrollTop : lastAddedItem[0].offsetTop-5}, 300, function(){ lastAddedItem.animate({backgroundColor: "#9a9a9a"}, 1000); } ); }; //}; if(bt){ bt.removeAttr('disabled', true).removeClass('disabled').blur(); }; self.notify(response.message, hasError); }).fail(function(jqXHR, textStatus, errorThrown){ self.notify("An error has occurred. Please try again later.", true); }); }; }; this.UpdateItem = function(uid, qty){ this.openLoader(); $.ajax({ data : {pct : self.token, pcm : self.mode, pcpm : self.paymentMethod, pcc : 'update', pcuid : uid, pcpq : qty}, }).done(function(data, textStatus, jqXHR){ var response = self.updateView(data); var hasError = response.hasError; var itemList = response.view.find('div.cart-item-list'); var lastUpdatedItem = $('.ci[data-uid="{0}"]'.format(response.lastUid)); if(lastUpdatedItem.length){ var oriBgColor = lastUpdatedItem.css('backgroundColor'); //itemList.scrollTop(lastUpdatedItem[0].offsetTop-((self.mode === 1) ? 5 : 1)); itemList.scrollTop(lastUpdatedItem[0].offsetTop-itemList[0].offsetTop-((self.mode === 1) ? 5 : 1));//itemList[0].offsetTop added for mode 3 lastUpdatedItem.css('backgroundColor', (hasError ? self.bgColorFailure : self.bgColorSuccess)) .animate({backgroundColor: oriBgColor}, 1000); }; self.notify(response.message, response.hasError); }).fail(function(jqXHR, textStatus, errorThrown){ self.notify("An error has occurred. Please try again later.", true); }); }; this.RemoveItem = function(uid){ this.openLoader(); $.ajax({ data : {pct : self.token, pcm : self.mode, pcpm : self.paymentMethod, pcc : 'remove', pcuid : uid}, }).done(function(data, textStatus, jqXHR){ var response = self.updateView(data); var hasError = response.hasError; if(hasError){ var itemList = response.view.find('div.cart-item-list'); var lastNotDeletedItem = $('.ci[data-uid="{0}"]'.format(response.lastUid)); if(lastNotDeletedItem.length){ var oriBgColor = lastUpdatedItem.css('backgroundColor'); itemList.scrollTop(lastNotDeletedItem[0].offsetTop-5); lastNotDeletedItem.css('backgroundColor', (hasError ? self.bgColorFailure : self.bgColorSuccess)) .animate({backgroundColor: oriBgColor}, 1000); }; }; self.notify(response.message, hasError); }).fail(function(jqXHR, textStatus, errorThrown){ self.notify("An error has occurred. Please try again later.", true); }); }; this.Refresh = function(){ this.openLoader(); $.ajax({ data : {pct : self.token, pcm : self.mode, pcpm : self.paymentMethod, pcc : 'refresh'}, }).done(function(data, textStatus, jqXHR){ var response = self.updateView(data); }); }; //this.CountItems(function(num){ alert(num); }, function(){ alert(fail); }); this.CountItems = function(fnDone, fnFail){ $.ajax({ data : {pct : self.token, pcc : 'count'}, dataType : 'text' }).done(function(data, textStatus, jqXHR){ if(isFunction(fnDone)){ fnDone.call(fnDone, data); }; }).fail(function(jqXHR, textStatus, errorThrown){ if(isFunction(fnFail)){ fnFail(); }; }); }; this.Clear = function(){ $.ajax({ data : {pct : self.token, pcm : self.mode, pcc : 'clear'}, }).done(function(data, textStatus, jqXHR){ var response = self.updateView(data); //alert(response.message); }).fail(function(jqXHR, textStatus, errorThrown){ //alert(errorThrown); }); }; this.setupCommon = function(){ this.page = $('html'); this.btCart = $('#btCart'); this.token = this.container.find('#pct').val(); $('.ci-bt-delete').live('click', this.container, function(e){ var uid = $(this).parents('.ci').attr('data-uid'); self.RemoveItem(uid); }); $('.ci-bt-add').live('click', this.container, function(e){ var ci = $(this).parents('.ci'); var uid = ci.attr('data-uid'); var qty = ci.attr('data-qty'); self.UpdateItem(uid, (parseInt(qty)+1)); }); $('.ci-bt-remove').live('click', this.container, function(e){ var ci = $(this).parents('.ci'); var uid = ci.attr('data-uid'); var qty = ci.attr('data-qty'); self.UpdateItem(uid, (parseInt(qty)-1)); }); }; this.openLoader = function(){ this.loaderTarget.append(this.loader).append(this.loaderGear); }; this.updateView = function(html){ this.container.html(html); var view = this.container.find('#ptxCartView'); var cartCount = view.find('#ptxCartCount').text(); var cartCode = view.find('#ptxCartCode').text(); var cartLastUid = view.find('#ptxCartLastUid').text(); var cartMessage = view.find('#ptxCartMessage').html(); if(this.mode === 1){ this.lblCounter.text(cartCount)[(parseInt(cartCount) > 0 ? 'removeClass' : 'addClass')]('hs'); }; if(this.mode === 3){ if(!this.container.find('.cart-item-list').children('.ci').length){ document.redirect(document.location); }; this.paymentContainer.children().remove() this.paymentContainer.append($('#ptxCartShipment').removeClass('hs')); }; this.loaderTarget.find(this.loaderGear).remove(); this.loaderTarget.find(this.loader).remove(); return { view : view, count : cartCount, code : cartCode, message : cartMessage, lastUid : cartLastUid, hasError : (parseInt(cartCode) > 299) }; }; this.notify = function(msg, hasError){ if(!msg){ return; }; var targetPos = 0; var arrivalTop = 0; var nfClass = ''; var startLeft = 0; var startTop = 0; if(this.mode === 1){ targetPos = this.btCart.offset(); arrivalTop = targetPos.top + this.btCart.height() + 2; nfClass = 'ptx-cart-notifier-mini'; startLeft = targetPos.left; startTop = targetPos.top; }else{// if(this.mode === 2){ targetPos = this.container.offset(); if(this.mode === 3){ targetPos = this.container.find('.cart-item-list ').offset(); }; arrivalTop = targetPos.top; nfClass = 'ptx-cart-notifier-full'; startLeft = targetPos.left; startTop = targetPos.top; }; var nfInc = 30; var nf = $('
'.format(nfClass)) .appendTo($(document.body)) .attr('class', '{0} {1}'.format(nfClass, (hasError ? 'ptx-cart-failure' : 'ptx-cart-success'))) .text(msg) nf.css({ left : startLeft - ((this.mode === 1) ? nf.outerWidth() : 0), top : startTop, opacity : 0 }) .show() .animate({ top : arrivalTop + nfPos, opacity : 1 }, 100).delay(1000).slideUp(function(){ nfPos -= nfInc; }); nfPos += nfInc; }; }; $(function(){ $('a.sn, ul.carriers>li>a>img').tipsy({gravity : $.fn.tipsy.autoNS, offset : 2}); setTopMenuSlideBox('btLogon', 'boxLogon', '#btLogonTrigger'); setUpLogonMini(); setTopMenuSlideBox('btChoseLang', 'boxChoseLang'); if(cartMode === 1){ var PTXCART = new PTX.Cart(); setTopMenuSlideBox('btCart', 'ptxCartMiniViewContainer', '#ptxCartBtAdd'); setUpCartMiniView(); PTXCART.InitShopping(); }else if(cartMode !== 1){ var PTXCART = new PTX.Cart(); PTXCART.InitRevision(); }; setUpSkype(); });