var urlSafe = function(txt) { return escape(txt).replace("+", "%2B"); } $(document).ready(function() { var sslEnabled = document.location.href.indexOf("https://")==0; // Quick buy menu var quickBuyForm = $("#quickbuy-frm"); quickBuyForm.find("input[type=submit]").hide(); quickBuyForm.find("select").change(function() { this.form.submit(); }); // Jajja statistics if(!sslEnabled) { var img = new Image(); img.src = "http://wp.statistik.jajja.com/wp_stat.php?pid=98459001&page=" + escape(document.location.href) + "&referer=" + escape(document.referrer); } initHelpers(); }); var _helpers = {}; var _helperTimeout = null; var _helperElement = null; var _helperIFrameElement = null; function initHelpers() { _helperElement = $('
'); _helperIFrameElement = $(''); $(document.body).append(_helperIFrameElement, _helperElement); _helpers["campaign"] = "With a campaign code you get access to special discounts and offers. To activate the campaign code you enter the code in the box and click \"Activate\". Campaign codes can be found in connection to special events and campaigns."; _helpers["password"] = "Skriv in ett lösenord (valfritt) så skapar synfel.se ett privat medlemskonto till dig. Via ditt medlemskonto erbjuds du ett antal tjänster för att underlätta dina framtida inköp. För mer info se \"Frågor & Svar\"."; _helpers["repackage"] = "If you live in a flat or by some other circumstance have a narrow letterbox (less than 3cm in height), you can choose the service \"Thin package\". Your order will then be packaged in the thinnest way possible. Letterboxes vary a lot in size so we cannot guarantee that our special package will fit all letterboxes. Thin packaging cannot be done when the order contains lens solution or if the order is too large for our special pack."; _helpers["rememberme"] = "Check the box and you will be automatically logged in the next time you visit Lensstore – then you don’t have to enter your e-mail address and password to access your membership account."; _helpers["crossell"] = "Genom \"rekommenderade produkter\" kan du lätt se vilka produkter som passar ihop med de du har valt!"; _helpers["image"] = ""; _helpers["subscription"] = "Välj den smarta lösningen linsabonnemang, så ser vi till att du aldrig står utan linser! Du har alltid full kontroll över ditt abonnemang! Du kan när som helst via ditt medlemskonto ändra leveransintervall, pausa för viss tid/antal leveranser och/eller avsluta ditt linsabonnemang.

Du bestämmer själv intervall för dina framtida leveranser. Du kan antingen välja vårt rekommenderade intervall eller själv välja ett eget leveransintervall. Vi meddelar dig i god tid via mail innan varje ny leverans."; _helpers["subscriptionNextDelivery"] = "Här visas din nästa/kommande linsleverans."; _helpers["subscriptionInterval"] = "Här visas antal dagar mellan varje ny leverans. Du kan enkelt ändra leveransintervall under kontrollpanelen."; _helpers["subscriptionDeliveryCount"] = "Här visas totalt antal leveranser som utförts."; _helpers["subscriptionpause"] = "Om du inte behöver linser på ett tag eller är bortrest etc. kan du här enkelt själv pausa visst antal leveranser. Exempel: Om du idag har 30 dagars leveransintervall och väljer att hoppa över/pausa 2 leveranser kommer systemet att pausas under 60 dagar. Fyll i antal leveranser som du önskar pausa ditt abonnemang med och tryckt på knappen ”Spara ändringar”. Nytt/aktuellt leveransdatum visas under rubriken ”Nästa leverans”."; _helpers["subscriptionviewinterval"] = "Här kan du själv enkelt ändra leveransintervall för dina linsleveranser. Exempel: Om du idag har 30 dagar/1 månad mellan varje leverans och ändrar till 60 dagar får du nya linser var 60 dag, dvs. var annan månad istället. Fyll i antal dagar som du önskar mellan varje ny leverans och tryck på knappen "Spara ändringar". Nytt/aktuellt leveransdatum visas under rubriken ”Nästa leverans”."; _helpers["recept"] = "All types of contact lenses:
BC/Radius
= Base curve
DIA = Diameter
Sphere/SPH/PWR = Power
Visus = Not applicable, ignore

Only toric lenses:
Cyl
= Cylinder (e.g. \"-0.75\")
Ax = Axis (e.g. "90")

Only progressive lenses:
Add/Addition
= Extra power (e.g. \"+2.00\" or \"Low\")"; var helperLinks = $("a.helper"); helperLinks.addClass("helptip"); helperLinks.hover( function(){showHelper(this);}, function(){hideHelper( );} ); _helperElement.hover(function(){showHelper();},function(){hideHelper();}); helperLinks.click(function(){return false;}); } function showHelper(helperLink) { clearTimeout(_helperTimeout); if(!helperLink) return; var helpTitle = helperLink.href.match(/\/helper_descriptions.asp\?helpid=(.*?)$/)[1]; var helpText = _helpers[helpTitle]; _helperElement.html(helpText); var pos = $(helperLink).offset(); var win = $(window); _helperElement.show(); _helperIFrameElement.show(); var _minMax = {min: { left: win.scrollLeft(), top: win.scrollTop() }, max: { left: win.scrollLeft()+win.width()-(_helperElement.width()+16), top: win.scrollTop()+win.height()-(_helperElement.height()+16) }}; var _targetPos = {left: pos.left+$(helperLink).width(), top: pos.top}; _helperElement[0].style.left = _helperIFrameElement[0].style.left = Math.min(_minMax.max.left, _targetPos.left+16) + "px"; _helperElement[0].style.top = _helperIFrameElement[0].style.top = Math.min(_minMax.max.top, _targetPos.top) + "px"; _helperIFrameElement[0].style.width = $(_helperElement).width() + "px"; _helperIFrameElement[0].style.height = $(_helperElement).height() + "px"; } function hideHelper() { clearTimeout(_helperTimeout); _helperTimeout = setTimeout(function() { _helperElement.hide(); _helperIFrameElement.hide(); }, 300); } /* Form Validation */ (function($) { // Formvalidator function FormValidator() { this.defaults = { "onvalidated": null, "onsucess": null, "onfail": null }; this.validationmethods = { "nonempty": function(field) { return field.value.length>0; }, "checked": function(field) { return field.checked; }, "email": function(field) { return field.value.search(/^\b[A-Z0-9._%+-]+@[A-Z0-9\.-]+\.[A-Z]{2,}\b$/i)==0; }, "ssn": function(field) { var i, n, sum = 0, l; var validate = /^\d{2}?(\d{6})-?(\d{4})$/; if(!field.value.search(validate)) return false; num = field.value.toString().replace(validate,"$1$2"); l = num.length; if(l==10) l--; for(i = l - 1; i >= 0; i--) { n = parseInt(num.charAt(i)) * (2 - ((l + 3 - i) % 2)); sum += parseInt(Math.floor(n / 10) + (n % 10)); } return ((10 - (sum % 10)) % 10) == num[num.length-1]; } }; } $.extend(FormValidator.prototype, { addValidator: function(name, method) { this.validationmethods[name] = method; }, _validateForm: function(form, _settings) { var processedFields = {}; var errors = []; var settings = $.extend({}, $.formvalidator.defaults, _settings||{}); $(form).find("input, select").each(function() { var result = $.fieldvalidator._validateField(this, true, processedFields); if(!result.success) errors.push(result); processedFields[this] = result.success; }); if(errors.length>0) if(settings.onfail) settings.onfail(form, false, errors); else if(settings.onsuccess) settings.onsuccess(form, true, errors); if(settings.onvalidated) settings.onvalidated(form, errors.length==0, errors) return errors.length==0; }, _register: function(validatorInstance) { $(validatorInstance._element).submit(function() { return $.formvalidator._validateForm(validatorInstance._element, validatorInstance._settings ); }); } }); function FormValidatorInstance(element, settings) { this._element = element; this._settings = settings; $.formvalidator._register(this); this.validate = function() { $.formvalidator._validateForm(this._element, this._settings); }; } // Fieldvalidator function FieldValidator() { this.defaults = { "validators": [], "failMessage": "Validation failed.", "region": "", "onsuccess": null, "onfail": null }; this.validators = $.formvalidator.validationmethods; } $.extend(FieldValidator.prototype, { getValidator: function(field) { return $(field).data("validation"); }, _validateField: function(field, allowScolding, stateLog) { var _errorElement = $("#jquery-valid-" + $.data(field)) var result = {"success": true, "field": "field", "region": null, "message": ""}; var validationSet = $(field).data("validation"); if(!validationSet) return result; var settings = $.extend({}, $.fieldvalidator.defaults, validationSet[0]._settings||{}); if(allowScolding && settings.mustValidate) { var failed = false; for(var i=0,item; item = settings.mustValidate[i]; ++i) { var state = stateLog?stateLog[item]:null; if(state==null) state = this._validateField(item, false, stateLog).success; if(!state) failed = true; } if(failed) return result; } for(var i=0, mi=validationSet.length; i"); _errorElement.hover( function() { $(field).addClass("invalid-error"); }, function() { $(field).removeClass("invalid-error"); } ); _errorElement.click( function() { field.focus(); } ); $(typeof(settings.region)=="function"?settings.region.call(field):settings.region).append(_errorElement); } } if(allowScolding && _errorElement) { _errorElement.addClass("active-validation-error"); _errorElement.html(result.message); } if(settings.onfail) settings.onfail.call(field, allowScolding, validationName); if(settings.onvalidate) settings.onvalidate.call(field, allowScolding, success); return result; }; if(_errorElement) { _errorElement.removeClass("active-validation-error"); _errorElement.html(""); } if(settings.onsuccess) settings.onsuccess.call(field, allowScolding); if(settings.onvalidate) settings.onvalidate.call(field, allowScolding, success); return result; }, _register: function(validatorInstance) { if(!$(validatorInstance._element).data("bound-field-validation")) { $(validatorInstance._element).change(function() { $.fieldvalidator._validateField(validatorInstance._element, true); }); $(validatorInstance._element).keyup(function(e) { $.fieldvalidator._validateField(validatorInstance._element, false); }); $(validatorInstance._element).data("bound-field-validation", true) } } }); function FieldValidatorInstance(element, settings, validator) { this._element = element; this._settings = settings; this._validator = validator; $.fieldvalidator._register(this); } // Init field/formvalidators $.formvalidator = new FormValidator(); $.fieldvalidator = new FieldValidator(); $.fn.attachValidator = function(validator, settings) { this.each(function() { switch(this.nodeName) { case "FORM": settings = validator; var valid = $(this).data("validation")||[]; valid.push(new FormValidatorInstance(this, settings)); $(this).data("validation", valid); break; default: var _settings = settings||{}; var validators = _settings.validators||(typeof(validator)=="string"?[validator]:validator); _settings.validators = null; var valid = $(this).data("validation")||[]; for(var i=0, mi=validators.length; i0) return; valid.push(new FieldValidatorInstance(this, _settings, validators[i])); }; $(this).data("validation", valid); }; }); return this; }; })(jQuery);