var _latestValidProductParametersForSelectionRequest = new Date().getTime(); var _lastAddressValidation = new Date().getTime(); var _expiredProductMessages = new Array(); var _validationErrors = []; var _firstLoad = 1; var _submitted = false; var _overridingCampaignId = -1; var _dontReplaceProductID = -1; Array.prototype.remove = function(s) { for (i = 0; i < this.length; i++) { if ( s == this[i]) this.splice(i, 1); } } Array.prototype.unique = function() { var result = new Object(); for (var i = 0; i < this.length; i++) { result[this[i]] = this[i]; } var a = []; for (var k in result) { a.push(k); } return a; } function setDontReplaceProductID(productID) { _dontReplaceProductID = productID; } function setOverridingCampaignId(id) { _overridingCampaignId = id; } function getOverridingCampaignId() { return _overridingCampaignId; } function getRowController(rowElement) { var e = jQuery(rowElement).find("#index").get(0); if (e) { return rowIdToController[e.value]; } else { return null; } } function getValidProductParameters(productRow, whatChanged) { var params = new Array(); var param = null; var rowElements = jQuery("#productTable").find('>.cartRow'); if (!productRow) { for (var i = 0; i < rowElements.length; i++) { var ctrl = getRowController(rowElements[i]); param = ctrl.getSelectedProductParameters(whatChanged); if(param != null) { params.push(param); } } } else { var ctrl = getRowController(productRow); if (ctrl) { ctrl.storeSelection(whatChanged); param = ctrl.getSelectedProductParameters(whatChanged); if(param != null) { params.push(param); } } } updateProductSelection(params); } function onSubmitCartForm() { return false; } function updateProductSelection(params) { var url = "/servlet/productselection"; var order = getCurrentOrder(true); var validProductParametersRequest = createValidProductParametersRequest(params); var orderJSON = serializeJSON({order:order}); if (getOverridingCampaignId() > 0) { order.campaign = getOverridingCampaignId(); validProductParametersRequest.lensParameterSelections.campaignId = getOverridingCampaignId(); } var d; if (validProductParametersRequest.lensParameterSelections.parameterSelections.lensParameterSelection.length > 0) { var validProductParametersJSON = serializeJSON(validProductParametersRequest); d = postJSONDoc(url, {validParameters:validProductParametersJSON, updatePrice:orderJSON}); } else { d = postJSONDoc(url, {updatePrice:orderJSON}); } d.addCallback(function (result) { var msg = evalJSON(result.responseText); if(msg.productSelectionPrice && msg.productSelectionPrice.parameterCombinationsMatches) { updateRowsIfLatest(msg.productSelectionPrice); } if(msg.productSelectionPrice && msg.productSelectionPrice.orderPriceInfo) { updateSumFields(msg.productSelectionPrice.orderPriceInfo); if (_firstLoad) { _firstLoad = 0; getValidProductParameters(null, 'group'); setTimeout(function() { getValidProductParameters(null, 'size') }, 1000); // make sure order is saved in session } } if(msg.productSelectionPrice && msg.productSelectionPrice.paymentMethodSelections) { updatePaymentMethodSelections(msg.productSelectionPrice.paymentMethodSelections); } }); d.addErrback(function (result) { // alert(result); }); } function createValidProductParametersRequest(params) { _latestValidProductParametersForSelectionRequest = new Date().getTime(); return { lensParameterSelections: { parameterSelections: { lensParameterSelection: params }, timeStamp: _latestValidProductParametersForSelectionRequest } }; } function updateRowsIfLatest(result) { if (!_latestValidProductParametersForSelectionRequest || !result.parameterCombinationsMatches.timeStamp || _latestValidProductParametersForSelectionRequest <= result.parameterCombinationsMatches.timeStamp) { updateRows(result); } } function updateRows(result) { var matches = result.parameterCombinationsMatches.matches; var invalidSelection = false; var expiredProductMessage = ""; for (var match = 0; match < matches.length; match++) { var ctrl = rowIdToController[matches[match].productFieldNumber]; if (ctrl) { if (matches[match].parameters.productId != _dontReplaceProductID && matches[match].replacedProductID) { queryReplaceProduct(matches[match], ctrl); } else { ctrl.setParameters(matches[match]); if (matches[match].whatChanged == 'group' || matches[match].whatChanged == 'size') { ctrl.setQuantities(matches[match].prices); } } if (matches[match].invalidSelection && ctrl.isComplete() && !matches[match].notSellable) { getValidProductParameters(ctrl.getElement(), 'group'); getValidProductParameters(ctrl.getElement(), 'pow'); } } } } function queryReplaceProduct(match, ctrl) { // showReplacementPopup(match.parameters.productId, true, function(respondedYes,isReplacedInform,isCompletelyDisabled){ // if (respondedYes){ // document.location.href='cart?prd_id=' + match.replacedProductID; // } // if(!respondedYes && isReplacedInform){ // document.location.href = "/cart?noreplace=1&prd_id=" + match.parameters.productId; // } // if(!respondedYes && isCompletelyDisabled){ // document.location.href = "/product?lensgroupid=" + match.parameters.groupID; // } // }); showReplacementPopup(match.parameters.productId, true, function(respondedYes,isReplacedInform) { if (respondedYes) { ctrl.setProduct(match.replacedProductGroupID, match.replacedProductID, match.replacedSize); getValidProductParameters(ctrl.getElement(), 'group'); } else if(!respondedYes && isReplacedInform){ setDontReplaceProductID(match.parameters.productId); getValidProductParameters(ctrl.getElement(), 'group'); }else if(!respondedYes && match.notSellable){ document.location.href = "/product?prdgrp_id=" + match.parameters.groupID + "&productType=LENS&productType=PRIVATE"; }else { //ctrl.setParameters(match); //ctrl.setQuantities(match.prices); //getValidProductParameters(ctrl.getElement(), 'size'); document.location.href = "/products?productType=LENS&productType=PRIVATE"; } }); } function postJSONDoc(url, postVars) { var req = getXMLHttpRequest(); req.open("POST", url, true); req.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); var data = queryString(postVars); var d = sendXMLHttpRequest(req, data); return d; } function Order() { this.orderRows = new Array(); this.paymentMethod = 0; this.campaign = ""; this.wantClosestMatchOfFreeProduct = false; this.countRowsOfType = function(type) { var count = 0; for (var i = 0; i < this.orderRows.length; i++) { if (this.orderRows[i].item.type == type) { count++; } } return count; } } function ProductData() { this.productID = 0; this.brand = ''; this.power = ''; this.bc = ''; this.diameter = ''; this.color = ''; this.cylinder = ''; this.axis = ''; this.extraPower = ''; this.solutionSize = ''; } function OrderRow() { this.item = new ProductData(); this.quantity = 0; } function getCurrentOrder(includeIncompleteRows) { var order = new Order(); var paymentMethodField = document.getElementById("payment_method"); if (paymentMethodField != null && parseInt(paymentMethodField.value) > 0) { order.paymentMethod = paymentMethodField.value; } var rowElements = jQuery("#productTable").find('>.cartRow'); for (var i = 0; i < rowElements.length; i++) { var ctrl = getRowController(rowElements[i]); if (ctrl) { var row = ctrl.toOrderRow(); if (row && (includeIncompleteRows || ctrl.isComplete())) { order.orderRows.push(row); } } } return order; } function guessValuesBasedOnCart(controller) { if (controller.getType() == 'GLASSES') { var order = getCurrentOrder(true); for (var i = 0; i < order.orderRows.length; i++) { if (order.orderRows[i].item.type == controller.getType()) { controller.fromOrderRow(order.orderRows[i]); } } } } function isCompleteOrder() { var rowElements = jQuery("#productTable").find('>.cartRow'); for (var i = 0; i < rowElements.length; i++) { var ctrl = getRowController(rowElements[i]); if (ctrl && !ctrl.isComplete()) { return false; } } return true; } function updateSumFields(orderPriceInfo) { var sumField = document.getElementById("sumField"); var discountField = document.getElementById("discountField"); var discountHeader = document.getElementById("discountHeader"); var freightField = document.getElementById("freightField"); var total = document.getElementById("Total"); var flatpackable = document.getElementById("flatpackquestion"); if (orderPriceInfo.isFlatPackable) { flatpackable.style.display = "block"; flatpackable.style.visibility = "visible"; } else { flatpackable.style.display = "none"; flatpackable.style.visibility = "hidden"; } sumField.innerHTML = orderPriceInfo.orderTotalWithoutDiscounts; discountField.innerHTML = orderPriceInfo.discount; if (orderPriceInfo.discountHeader == '') { hideField(discountHeader); hideField(discountField); } else { unhideField(discountHeader); unhideField(discountField); } paymentDiscountField = document.getElementById("SkontoField"); if (paymentDiscountField != null) { paymentDiscountField.innerHTML = orderPriceInfo.paymentDiscount; } discountHeader.innerHTML = orderPriceInfo.discountHeader; freightField.innerHTML = orderPriceInfo.freight; total.innerHTML = orderPriceInfo.orderTotal; var messageField = document.getElementById("messageField"); if (orderPriceInfo.message != null && orderPriceInfo.message != "") { ShowWarning(orderPriceInfo.message.replace(/\n/g,"
"),"warning"); } else { HideWarning(); } if (orderPriceInfo.flashMessage) { showFlash("flashMessage", orderPriceInfo.flashMessage, orderPriceInfo.flashMessage.replace(/\.swf/,'.jpg'), "786", "100", null, {}); } var askForClosestMatchOfFreeProductField = document.getElementById("ask_add_nonmatching_campaign_addon"); if (orderPriceInfo.askForClosestMatchOfFreeProduct) { askForClosestMatchOfFreeProductField.value = orderPriceInfo.addClosestMatchMessage; } else { askForClosestMatchOfFreeProductField.value = ''; } } function updatePaymentMethodSelections(paymentMethodSelections) { var paymentMethodSelectBox = jQuery('#payment_method')[0]; if (paymentMethodSelectBox.options) { updateSelectBoxOptions(paymentMethodSelections.methods, paymentMethodSelectBox); } updatePaymentFields(paymentMethodSelectBox.value); // enableOnlyInvoiceForTrialPack(); } function updatePaymentFields(paymentMethod) { var buyForm = document.getElementById("buyForm"); if (buyForm != null) { if (paymentMethod == 520) { jQuery("#direct_td1").removeClass("hidden"); jQuery("#direct_td2").removeClass("hidden"); validateAddress(); } else if (jQuery("#direct_td1")) { jQuery("#direct_td1").addClass("hidden"); jQuery("#direct_td2").addClass("hidden"); } } } function loadOrder(orderJSON, typeToAdd, productIdToAdd, groupIdToAdd, sizeToAdd) { _productIDSelectedInURL = productIdToAdd; var addedOrderRows = 0; var orderCookie = orderJSON; var order = null; if (orderCookie) { var orderCookieVal = evalJSON(orderCookie); if (orderCookieVal && orderCookieVal.order && orderCookieVal.order.orderRows) { order = orderCookieVal.order; } } if (!order) { order = new Order(); } syncTrialPack(order); for (var i = 0; i < order.orderRows.length; i++) { var orderRow = order.orderRows[i]; if (orderRow.item && orderRow.item.type) { var ctrl = addRow(orderRow.item.type); ctrl.fromOrderRow(orderRow); addedOrderRows++; } } if (groupIdToAdd > 0 || productIdToAdd > 0) { addRow(typeToAdd, null, groupIdToAdd, sizeToAdd, productIdToAdd); addedOrderRows += 1; if (typeToAdd == 'LENS') { addRow(typeToAdd, null, groupIdToAdd, sizeToAdd); addedOrderRows += 1; } } if (addedOrderRows == 0) { addRow("LENS", 'VÄNSTER ÖGA'); addRow("LENS", 'HÖGER ÖGA'); } getValidProductParameters(null, 'group'); return addedOrderRows; } // TODO: Remove duplicate cookies, see trialpack.jsp function syncTrialPack(order) { var trialbox = GetCookie("trialbox"); var row = null; for (var i = 0; i < order.orderRows.length; i++) { if (order.orderRows[i].item.type == 'TRIALPACK') { row = order.orderRows[i]; } } if (trialbox && trialbox != 'undefined' && !row) { var r = new Order(); r.item = new ProductData(); r.item.type = 'TRIALPACK'; order.orderRows.push(r); } else if ((!trialbox || trialbox == 'undefined') && row) { order.orderRows.remove(row); } } function ShowWarning(text, warningType) { var warningText = document.getElementById("warningText"); var warningSpacer = document.getElementById("warningSpacer"); var warning = document.getElementById("warning"); var warningBg = document.getElementById("warningBg"); warningText.innerHTML = text; warningSpacer.style.display = "block"; warning.style.display = "block"; } function HideWarning() { var warningSpacer = document.getElementById("warningSpacer"); var warning = document.getElementById("warning"); warningSpacer.style.display = "none"; warning.style.display = "none"; } function askAddClosestMatchOfFreeProduct() { var askForClosestMatchOfFreeProductField = document.getElementById("ask_add_nonmatching_campaign_addon"); if (askForClosestMatchOfFreeProductField != null && askForClosestMatchOfFreeProductField.value != "") { var wantClosestMatchOfFreeProductField = document.getElementById("want_closest_match_of_free_product"); if (wantClosestMatchOfFreeProductField != null) { if (confirm(askForClosestMatchOfFreeProductField.value)) { wantClosestMatchOfFreeProductField.value = "true"; } else { wantClosestMatchOfFreeProductField.value = "false"; } } } } function handleRowMessages() { var rowElements = jQuery("#productTable").find('>.cartRow'); var errors = []; var warnings = []; for (var i = 0; i < rowElements.length; i++) { var ctrl = getRowController(rowElements[i]); errors = errors.concat(ctrl.getErrors()); warnings = warnings.concat(ctrl.getWarnings()); } warnings = warnings.unique(); if (errors.length > 0) { showPopupDialog(errors[0], 'Information'); return false; } for (var i = 0; i < warnings.length; i++) { if (!confirm(warnings[i])) { return false; } } return true; } function checkAddressForm() { validateAddress(true); if (_validationErrors.length > 0) { alert(_validationErrors[0]); return false; } else { return true; } } function checkForm() { var o = getCurrentOrder(); if (!checkAddressForm()) { return false; } if (isCompleteOrder() || confirm('Du har inte fyllt i all nödvändig information om alla produkter. De produkter som saknar information kommer inte att läggas till i din beställning. Vill du genomföra beställningen trots det?')) { return true; } else { return false; } } function checkMismachingParams() { var prev_pow = null; var prev_bc = null; var prev_dia = null; var warning = ""; var marketingMessage = false; var rowElements = jQuery("#productTable").find('>.cartRow'); for (var i = 0; i < rowElements.length; i++) { var ctrl = getRowController(rowElements[i]); var row = ctrl.toOrderRow(); if (row && ctrl.isComplete() && row.item.type == 'LENS') { var item = row.item; if (prev_dia == null) { prev_dia = item.diameter; } else if (prev_dia != item.diameter) { warning = 'Du har valt linser med olika diameter. Är du säker på att du vill beställa dessa produkter?'; } if (prev_bc == null){ prev_bc = item.bc; } else if (prev_bc != item.bc) { warning = 'Du har valt linser med olika baskurva. Är du säker på att du vill beställa dessa produkter?'; } if (prev_pow == null) { prev_pow = item.power; } else if ((prev_pow < 0 && item.power > 0) || (prev_pow > 0 && item.power < 0)) { warning = 'Du har valt produkter för både närsynthet och långsynthet. Är du säker på att du vill beställa dessa produkter?'; } else { prev_pow = item.power; } } } if (warning) { return confirm(warning); } else { return true; } } function submitOrder() { if (_submitted) { // alert("submitted"); return; } _submitted = true; var o = getCurrentOrder(); if (o.orderRows.length == 0 && !GetCookie("trialbox")) { alert("Vänligen välj en eller flera produkter. Om du har valt produkter - Vänligen välj alla parametrar."); _submitted = false; return; } var os = serializeJSON({order:o}); document.getElementById("order_json").value = os; if(document.getElementById("flatpackquestion").style.visibility == "hidden"){ document.getElementById("flatpackcheckbox").checked = false; } if (!checkMismachingParams()) { _submitted = false; return; } if (handleRowMessages() && checkForm(o)) { askAddClosestMatchOfFreeProduct(); var formToSubmit = document.getElementById("buyForm"); if (formToSubmit == null) { formToSubmit = document.getElementById("reorderForm"); } if (formToSubmit == null) { formToSubmit = document.getElementById("subscribeForm"); } askIfNewsLetter(); formToSubmit.submit(); } else { _submitted = false; } } function Address() { this.firstName = ''; this.lastName = ''; this.ssn = ''; // this.birthDateStr = ''; this.nationalId = ''; this.street = ''; this.zip = ''; this.flat = ''; this.county = ''; this.state = ''; this.city = ''; this.phone = ''; this.cellPhone = ''; this.email = ''; this.countryIso = ''; this.country = ''; } function getAddressFields(all) { if ((jQuery('#payment_method').length > 0 && jQuery('#payment_method')[0].value == 520) || all) { return ['firstName','lastName','ssn','street','zip','flat', 'county','city','phone','cellPhone','email','country', 'birthDateStr','routingNo','accountNo']; } else { return ['firstName','lastName','ssn','street','zip','flat', 'county','city','phone','cellPhone','email','country', 'birthDateStr']; } } function getInputAddressField(field) { if (field == "birthDateStr") { return jQuery("#birthDateStryear,#birthDateStrmonth,#birthDateStrday"); } else { return jQuery("#" + field); } } function handleAddressValidationResult(result) { var f = getAddressFields(); validationErrors = []; var msg = evalJSON(result.responseText); if (msg.validationErrors.timestamp <= _lastAddressValidation) { return; } _lastAddressValidation = msg.validationErrors.timestamp; if (msg.validationErrors.fieldErrors) { if (msg.validationErrors.fieldErrors.field) { var el = getInputAddressField(msg.validationErrors.fieldErrors.field); if (!el.hasClass('PersonalInfoInputError')) { el.addClass('PersonalInfoInputError'); } f.remove(msg.validationErrors.fieldErrors.field); validationErrors.push(msg.validationErrors.fieldErrors.message); } else { for (var i = 0; i < msg.validationErrors.fieldErrors.length; i++) { var el = getInputAddressField(msg.validationErrors.fieldErrors[i].field); if (!el.hasClass('PersonalInfoInputError')) { el.addClass('PersonalInfoInputError'); } f.remove(msg.validationErrors.fieldErrors[i].field); validationErrors.push(msg.validationErrors.fieldErrors[i].message); } } } for (var i = 0; i < f.length; i++) { var el = getInputAddressField(f[i]); if (el.hasClass('PersonalInfoInputError')) { el.removeClass('PersonalInfoInputError'); } } _validationErrors = validationErrors; } function validateAddress(waitForComplete) { var address = new Address(); var f = getAddressFields(); var els = jQuery('#' + f.join(",#")); for (var i = 0; i < els.length; i++) { address[els[i].id] = els[i].value; } address.timestamp = new Date().getTime(); // var cell = address.cellPhone; // cell = cell.replace(/[%&]/g,''); address.cellPhone = address.cellPhone.replace(/[%&]/g,''); var addressJSON = serializeJSON({'address':address}); addressJSON = addressJSON.replace('&', '%26'); if (waitForComplete) { var params = 'address=' + addressJSON; var hxr = getXMLHttpRequest(); hxr.open("POST", "/addressValidation", false); hxr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); hxr.send(params); handleAddressValidationResult(hxr); } else { var params = 'address=' + addressJSON; var req = getXMLHttpRequest(); req.open("POST", "/addressValidation", true); req.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); var d = sendXMLHttpRequest(req, params); d.addCallback(handleAddressValidationResult); return d; } } function setupAddressValidation() { var f = getAddressFields(true); for (var i = 0; i < f.length; i++) { getInputAddressField(f[i]).keyup(function() { validateAddress(false); } ); getInputAddressField(f[i]).change(function() { validateAddress(false); } ); } validateAddress(); } function showFlash(parentNode, flashContent, backupImage, width, height, linkDest, flashVars) { var replaceMeNodeId = parentNode + '_flashContent'; var replaceMeNode = jQuery("#" + replaceMeNodeId)[0]; var contentFromObjectTag; if (replaceMeNode) { if (replaceMeNode && replaceMeNode.data) { if (flashContent.indexOf("http://") == -1) { contentFromObjectTag = replaceMeNode.data.replace(/http:\/\/[^\/]+/, ''); } else { contentFromObjectTag = replaceMeNode.data; } } if (contentFromObjectTag != flashContent) { swfobject.removeSWF(replaceMeNodeId); replaceMeNode = jQuery('#' + replaceMeNodeId)[0]; } } if (replaceMeNode == null) { var replaceMe; if (linkDest) { replaceMe = DIV({ id: replaceMeNodeId, 'class': 'flashContent' }, A({ id: replaceMeNodeId+"_backupLink", href: linkDest }, IMG({ id: replaceMeNodeId+"_backupImage", src: backupImage, width: width, height: height, border: '0' }))); } else { replaceMe = DIV({ id: replaceMeNodeId, 'class': 'flashContent' }, IMG({ id: replaceMeNodeId+"_backupImage", src: backupImage, width: width, height: height, border: '0' })); } appendChildNodes(parentNode, replaceMe); } var existingBackupImage = jQuery('#' + replaceMeNodeId+"_backupImage")[0]; if(existingBackupImage != null && existingBackupImage.src != backupImage) { existingBackupImage.src = backupImage; existingBackupImage.width = width; existingBackupImage.height = height; } var existingBackupLink = jQuery('#' + replaceMeNodeId+"_backupLink")[0]; if(existingBackupLink != null && existingBackupLink.href != linkDest) { existingBackupLink.href = linkDest; } if (contentFromObjectTag != flashContent) { swfobject.embedSWF(flashContent, replaceMeNodeId, width, height, '6.0.0', false, flashVars, { menu: 'false', quality: 'high', play: 'true', loop: 'true', wmode: 'transparent', allowscriptaccess: 'always' }, {}); } }