var formatPrice = function(v) { return formatPrice2(v) + " €"; };
var formatPrice2 = function(v) { return Number(v).toFixed(2).toString().replace(".", ","); };
var urlSafe = function(txt) { return escape(txt).replace("+", "%2B"); }
var htmlDecode = function(txt) { return $("
").html(txt).html(); }
$(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"] = "Kampanjakoodin avulla voit hyödyntää erikoistarjouksia sekä useita alennuksiamme. Aktivoidaksesi kampanjakoodin syötä saamasi koodi sille varattuun ruutuun ja paina \"OK\"-nappia. Kampanjakoodi voi olla osa erityisesti kohdistettua kampanjaa tai tarjousta.";
_helpers["password"] = "Skriv in ett lösenord (valfritt) så skapar lensstore.fi 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"] = "Mikäli käyttämässäsi tilausosoitteessa on normaalia ahtaampi postiluukku (asut esim. taloyhtiössä, jonka postiluukkujen korkeus on alle 3 cm.) voit tilauksesi yhteydessä käyttää \"ohut pakkaus\" –vaihtoehtoa, jolloin paketoimme piilolinssit uudestaan ohueen erikoispakkaukseen, joka lähetetään suoraan haluamaasi osoitteeseen. Postiluukkujen ja –laatikkojen koko ja muoto vaihtelevat kuitenkin tapauskohtaisesti, joten emme voi taata sitä että toimittamamme linssit mahtuvat kaikkiin postiluukkumalleihin. Uudelleenpaketointi ei ole mahdollista, mikäli tilaat piilolinssinesteitä tai jos tilaus ei kokonsa puolesta mahdu ohueen erikoispakkaukseen.";
_helpers["rememberme"] = "Klikkaa ruutua halutessasi kirjautua automaattisesti sisään Lensstore.fi-sivustolle. Seuraavalla vierailullasi sivusto muistaa sinut automaattisesti ilman, että sinun tarvitsee syöttää sähköpostiosoitetta ja salasanaasi ja pääset suoraan käyttäjätililles. Katso lisätiedot kohdasta \"Kysymyksiä & vastauksia\".";
_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"] = "
Yhteistä kaikille linsseille:
BC/Radie = Kaarevuus
DIA = Halkaisija
Sfär/SPH/PWR = Vahvuus
Visus = Ei käytössä, jätä huomioimatta
Koskee ainoastaan toorisia piilolinssejä:
Cyl = Sylinterin arvo (
esim. \"-0.75\")
Ax = Akselin arvo (
esim. "90")
Koskee ainoastaan progressiivisia (moniteho) linssejä:
Add/Addition = Extravahvuus (
esim. \"+2.00\" tai \"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; i