/*

AJAX.JS
Anropas från mainView.jsp.
Ligger inte med i JspServiceInfo.xml för att delar av javascripten innehåller java-expressions och
inte kan brytas ut som separata js-filer som inkluderas i <head> på sidan.

*/

    /* Anropar Ajax-metod för att hämta destionationer */
    function getAllDestinations()  {
        Ajax.getAllDestinations(++sequenceNr, receiveDestinations);
    }

    /* Callback-funktion för Ajax.getAllDestinations() */
    function receiveDestinations(getAllDestinationsAnswer) {

        try  {

            if(sequenceNr != getAllDestinationsAnswer.sequenceNr) {                                                    P
                return;
            }

            var destinations = getAllDestinationsAnswer.destinations;
            if (destinations == null) {
                document.getElementById('destinationWhileWaiting').innerHTML = 'Inga destinationer - något gick fel';
            } else {

                for (var i = 0; i < destinations.length; i++) {
                    if (destinations[i].destinationName == null || destinations[i].destinationName == "") {
                        continue;
                    }
                    if (destinations[i].destinationId=="Sverige") {
                            if (stateDestinationId == "" || stateDestinationId == 'null') {
                            // Sverige finns med som destination och ingen destination vald sedan tidigare. Sätt Sverige som förvald destination.
                            stateDestinationId = destinations[i].destinationId;
                            stateDestinationName = destinations[i].destinationName;
                        }

                        document.getElementById("swedenIdText").className = '';
                        document.getElementById("swedenId").disabled = false;
                        document.getElementById("swedenId").className = '';
                        document.getElementById("swedenId").checked = true;
                        document.getElementById("swedenId").value = destinations[i].destinationId;
                        continue;
                    }

                    if (destinations[i].inEurope) {
                        document.getElementById("europeId").disabled = false;
                        document.getElementById("europeIdText").className = '';
                        if (!europeIdUsed) {insertOption("europeId", destinations[i].destinationId, destinations[i].destinationName);}
                    } else {
                        document.getElementById("notEuropeId").disabled = false;
                        document.getElementById("notEuropeIdText").className = '';
                        if (!notEuropeIdUsed) {insertOption("notEuropeId", destinations[i].destinationId, destinations[i].destinationName);}
                    }

                }

                europeIdUsed = true; notEuropeIdUsed = true;
                document.getElementById('destinationWhileWaiting').style.display = 'none';
                document.getElementById('skickaToggleShow1').style.display = 'block';


                if (savingState) {
                    getLastPossibleDeliveryTimes();
                } else {
                    stateAgreementCustomer = document.getElementById("avtalskund").checked;
                    stateFranko = document.getElementById("franko").checked;
                }
            }
        } catch(err) {
            var txt;
            txt = "There was an error on this page.\n\n"
            txt += "Error description: " + err.description + "\n\n"
            txt += "Click OK to continue.\n\n"
            document.getElementById('destinationWhileWaiting').innerHTML = txt;
        }
    }

    /* Anropar Ajax-metod för att hämta vikt- & måttgränser baserat på destinaton och kundtyp
    destionation Vald destination
    isAgreement True = Avtalskund, False = icke avtalskund
    */
    function getLimitations(destination, isAgreement) {
        Ajax.getLimitations(destination, isAgreement, ++sequenceNr, receiveLimitations);
    }

    /* Calback-funktion för vikt- & måttbegränsningar som anropas efter svar från Ajax.getLimitations() */
    function receiveLimitations(getLimitationsAnswer) {

         if(sequenceNr != getLimitationsAnswer.sequenceNr) {
                return;
            }
        var limitations = getLimitationsAnswer.limitations;

        toggleSWF(true);
        initiateFlashValues(limitations);
        stepFocus(2);
    }

    /* Anropar Ajax-metod för att skicka mail */
    function sendVelocityMail(to,cc,subject,url,sender,message,textBody,htmlBody) {
        Ajax.sendVelocityMail(to, cc, subject, url, sender, message, textBody, htmlBody, ++sequenceNr, mailReceipt);
    }

    /* Callback-funktion för Ajax.sendVelocityMail(). Visar "kvitto". */
    function mailReceipt(SendMailAnswer)  {
       if(sequenceNr != SendMailAnswer.sequenceNr) {
          return;
       }
       document.getElementById('sendingMail').style.display = 'none';
       document.getElementById('mailSent').style.display = 'block';
    }

    /* Visar eventuellt felmeddelande vid "backande" från steg 2 */
    function setBackErrorTextStep2() {
        document.getElementById("skickaToggleShow1").style.display = "block";
        toggleSWF(false);
    }

    /*  Visar anpassat felmeddelande beroende på parametrar
        step Aktuellt steg
        functionName Namn på funktion där felet inträffade (används för loggningen)
        returnCode Felkod
        errorText Feltext */
    function showMajorError(step, functionName, returnCode, errorText) {

        Ajax.logError("Unknown server error - returnCode: " + returnCode + " - functionName: "+ functionName + "",receivelogError);

        if (step == 4) {
            clearDynamicFields();
            deleteWaitingText();
            var errorArea = document.getElementById("skickaToggleShowTest");
        } else if (step == 3) {
            toggleSWF(false);
            var errorArea = document.getElementById("skickaToggleShow2Error");
            errorArea.style.display = "block";
            deleteWaitingText();
        } else if (step == 2) {
            var errorArea = document.getElementById("skickaToggleShow2Error");
            errorArea.style.display = "block";
            document.getElementById("skickaToggleShow3").style.display = "none";
        } else {
            //övriga steg
        }
        errorArea.innerHTML = "<p class='showError'>"+errorText+"</p>";
    }

    /* Anropar Ajax.getServicesInclPricePerCategory() som hämtar ut resultatet för "billigaste"-flödet
        stateDestinationId Id för vald destination
        agreementCustomer Kundtyp (true = avtalskund, false = ej avtalskund)
        franko True = frankeringsmaskin, false = ej frankeringsmaskin
        weight Vikt
        length Längd
        width Bredd
        height Höjd/tjocklek
        diameter Diameter
        informationAboutSender Från-postnummer
        informationAboutReceiver Till-postnummer  */
    function getServicesInclPricePerCategory(   stateDestinationId,
                                                agreementCustomer, franko, weight, length, width,
                                                height, diameter, informationAboutSender,
                                                informationAboutReceiver)  {

        writeInitialWaitingText("skickaToggleShowTest");
        Ajax.getServicesInclPricePerCategory(  stateDestinationId,
                                                agreementCustomer, franko, parseInt(weight), parseInt(length), parseInt(width),
                                                parseInt(height), parseInt(diameter), informationAboutSender,
                                                informationAboutReceiver, ++sequenceNr, receiveAllServicesInclPricePerCategory);
     }

    /* Callback-funktion för  Ajax.getServicesInclPricePerCategory() */
    function receiveAllServicesInclPricePerCategory(getServicesInclPriceAnswer) {
         try  {
             if(sequenceNr != getServicesInclPriceAnswer.sequenceNr) {
                return;
             }
             retCode = getServicesInclPriceAnswer.baseAnswer.returnCode;
             if (retCode < 0) {
                 if (retCode == -5) {
                    showMajorError(3,"receiveAllServicesInclPricePerCategory",retCode, tooManyErrorText);
                 } else {
                    showMajorError(3,"receiveAllServicesInclPricePerCategory",retCode, theMajorErrorText);
                 }
                 document.getElementById("cmtBanner").style.display = "block";
                 return;
             }
             if (retCode == 111) {
                showMajorError(3,"receiveAllServicesInclPricePerCategory",retCode, theServiceNotFoundErrorText);
                document.getElementById("cmtBanner").style.display = "block";
                return;
             }
             deleteWaitingText();
             document.getElementById("divPrint").style.display = "block";
             var servicesInclPriceAnswer = getServicesInclPriceAnswer.servicesInclPriceAnswer;

             var receivedReturncode = servicesInclPriceAnswer.returnCode;
             var myErrorText = servicesInclPriceAnswer.errorText;
             var informationAboutSenderReceiver;
             var inputInformationAboutSender = getServicesInclPriceAnswer.inputInformationAboutSender;
             var inputInformationAboutReceiver = getServicesInclPriceAnswer.inputInformationAboutReceiver;

             informationAboutSenderReceiver = getServicesInclPriceAnswer.informationAboutSenderReceiver;

             if (servicesInclPriceAnswer.baseServiceAdditionalInfos != null && servicesInclPriceAnswer.baseServiceAdditionalInfos.length > 0) {
                 for (var i=0; i < servicesInclPriceAnswer.baseServiceAdditionalInfos.length; i++) {

                     var priceExTaxNum  = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceExclTax;
                     var priceIncTaxNum = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceInclTax;
                     if (priceExTaxNum == priceIncTaxNum) {
                         addSuggestionContentOne(i,"skickaToggleShowTest",false);
                     } else {
                         addSuggestionContentOne(i,"skickaToggleShowTest",true);
                     }
                     var priceExTax     = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceExclTaxAsString;
                     var priceIncTax    = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceInclTaxAsString;

                     var theDeliveryTime = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].deliveryTime.deliveryTimeAsString;

                     var handingIn = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].handingInInformation;

                     document.getElementById("resultMainInfo"+i).innerHTML = "<div style='margin-bottom:0.2em;font-size:1.2em;font-weight:bold;'>" + servicesInclPriceAnswer.baseServiceAdditionalInfos[i].baseService.name + "</div>" + servicesInclPriceAnswer.baseServiceAdditionalInfos[i].baseService.info + getMoreInfoLink(servicesInclPriceAnswer.baseServiceAdditionalInfos[i].baseService.detailedInfo,i);
                     document.getElementById("resultMainPriceIncTax"+i).innerHTML = " "+priceIncTax;
                     document.getElementById("resultMainPriceExTax"+i).innerHTML = "("+priceExTax+" exkl. moms)";
                     document.getElementById("timeOfDelivery"+i).innerHTML = theDeliveryTime
                     document.getElementById("handingIn"+i).innerHTML = '<b>Lämnas:&nbsp;</b>';
                     document.getElementById("handingIn"+i).innerHTML += handingIn != null ? handingIn : '';

                     /* isBulky är true om priset påverkats eftersom försändelsen är skrymmande. */
                     var isBulky = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].bulkyCalculatedPrice;
                     var isPriceVolumebased = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].volCalculatedPrice;

                     if (isBulky) {
                        document.getElementById("bulky"+i).innerHTML = bulkyText;
                     }

                     if (isPriceVolumebased) {
                        var volumeWeight = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].volumeWeightAsString;
                        document.getElementById("bulky"+i).style.margin = "0";
                        document.getElementById("volumebased"+i).innerHTML = volumebasedText + " " + volumeWeight + " kg</span>";
                     }
                 }
                 /* Sätter focus på rätt element, för att tabordningen ska bli korrekt. */
                 if (document.getElementById("lblMoreInfo0")) {
                    document.getElementById("lblMoreInfo0").focus();
                 }
                 if (receivedReturncode == 0) {
                     document.getElementById("cmtBanner").style.display = "block";
                     getHtmlForShopProducts(servicesInclPriceAnswer.baseServiceAdditionalInfos[0].shopItemIds[0]);
                 }
                 if (servicesInclPriceAnswer.baseServiceAdditionalInfos.length == 1) {
                     if (servicesInclPriceAnswer.baseServiceAdditionalInfos[0].showMore) {
                        addAlternativeContent(true,receivedReturncode,myErrorText,"lastStepBox","Vill du se flera alternativ?",informationAboutSenderReceiver,inputInformationAboutSender,inputInformationAboutReceiver);
                     }
                 } else {
                    addAlternativeContent(true,receivedReturncode,myErrorText,"lastStepBox","Vill du se flera alternativ?",informationAboutSenderReceiver,inputInformationAboutSender,inputInformationAboutReceiver);
                 }
              } else {
                 addAlternativeContent(true,receivedReturncode,myErrorText,"lastStepBox","Ange postnummer.",informationAboutSenderReceiver,inputInformationAboutSender,inputInformationAboutReceiver);
              }
         }
         catch(err)  {
             alert("error");
             showMajorError(3,"receiveAllServicesInclPricePerCategory","javascript Error: " + err.description + "", theMajorErrorText);
         }
    }

    /* Anropar Ajax.getLastPossibleDeliveryTimes() för hämtning av leveranstider (som finns sparade på sessionen) */
    function getLastPossibleDeliveryTimes(){
        Ajax.getLastPossibleDeliveryTimes(++sequenceNr,receiveLastPossibleDeliveryTimes)
    }

    /* Callback-funktion för Ajax.getLastPossibleDeliveryTimes() */
    function receiveLastPossibleDeliveryTimes(getLastPossibleDeliveryTimesAnswer){
        deliveryTimesCopy = getLastPossibleDeliveryTimesAnswer.deliveryTimes;
        setupSavedState();
    }

    /*  Anropar Ajax-funktion för att hämta leveranstider baserat på inparametrar
        agreementCustomer Kundtyp (true = avtalskund, false = ej avtalskund)
        franko True = frankeringsmaskin, false = ej frankeringsmaskin
        weight Vikt
        length Längd
        width Bredd
        height Höjd/tjocklek
        diameter Diameter
        stateDestinationId Id för vald destination
        informationAboutSender Från-postnummer
        informationAboutReceiver Till-postnummer  */
    function getPossibleDeliveryTimes(agreementCustomer, franko, weight, length, width, height,
                                      diameter, stateDestinationId, informationAboutSender, informationAboutReceiver)  {

        Ajax.getPossibleDeliveryTimes(agreementCustomer, franko, parseInt(weight), parseInt(length), parseInt(width), parseInt(height),
                                      parseInt(diameter), stateDestinationId, informationAboutSender, informationAboutReceiver,
                                      ++sequenceNr, receiveDeliveryTimes);
    }

    /* Callback-funktion för Ajax.getPossibleDeliveryTimes() */
    function receiveDeliveryTimes(getPossibleDeliveryTimesAnswer) {

        try  {
            if(sequenceNr != getPossibleDeliveryTimesAnswer.sequenceNr) {
                return;
            }

            var senderReceiverInfo = getPossibleDeliveryTimesAnswer.informationAboutSenderReceiver;
            var retCode = getPossibleDeliveryTimesAnswer.baseAnswer.returnCode;
            var myErrorText = getPossibleDeliveryTimesAnswer.baseAnswer.errorText;

            if (deliveryTimeFirstTime && stateDeliveryTimeFirstTime && retCode != 111) {
                showPnrFrom  = (senderReceiverInfo==1||senderReceiverInfo==3) ? true:false;
                showPnrTo    = (senderReceiverInfo==2||senderReceiverInfo==3) ? true:false;
                deliveryTimeFirstTime = false;
            } else {
                stateDeliveryTimeFirstTime = false;
                if (retCode != 0) {
                    showPnrFrom  = (senderReceiverInfo==1||senderReceiverInfo==3) ? true:false;
                    showPnrTo    = (senderReceiverInfo==2||senderReceiverInfo==3) ? true:false;
                } else {
                    showPnrFrom = false;
                    showPnrTo = false;
                }

                if (retCode < 0 && retCode != -1) {
                   if (retCode == -5) {
                      showMajorError(2,"receiveDeliveryTimes",retCode, tooManyErrorText);
                   } else {
                      showMajorError(2,"receiveDeliveryTimes",retCode, theMajorErrorText);
                   }
                   document.getElementById("cmtBanner").style.display = "block";
                   return;
                } else if (retCode == 111) {
                   showMajorError(2,"receiveDeliveryTimes",retCode, theServiceNotFoundErrorText);
                   document.getElementById("cmtBanner").style.display = "block";
                   return;
                } else if ((retCode >= 101 && retCode <= 108) || retCode == 110) {
                   showPostalNumberError(retCode,myErrorText);
                   document.getElementById("deliveryTimesArea1").style.display = "block";
                   return;
                }
            }

            if (showPnrTo || showPnrFrom) {
                /* Till- och/eller Från-postnummer ska visas */
                document.getElementById("deliveryTimesArea1").style.display = "block";
                if (showPnrFrom && showPnrTo) {
                    document.getElementById("pnrInfoText").innerHTML = pnrInfoTextBoth;
                } else {
                    document.getElementById("pnrInfoText").innerHTML = pnrInfoTextSingle;
                }
                if (showPnrFrom) {
                    document.getElementById("fromPnrFlow2Container").style.display = "inline";
                }  else {
                    document.getElementById("fromPnrFlow2Container").value = "";
                    document.getElementById("fromPnrFlow2Container").style.display = "none";
                }
                if (showPnrTo) {
                    document.getElementById("toPnrFlow2Container").style.display = "inline";
                } else {
                    document.getElementById("toPnrFlow2Container").value = "";
                    document.getElementById("toPnrFlow2Container").style.display = "none";
                }
                document.getElementById("deliveryTimesArea2").style.display = "none";
                document.getElementById("continueBtnToStep3").style.display = "none";
                document.getElementById("deliveryTimesWhileWaiting").style.display = "none";

            } else {
                /*  Varken Till- eller Från-postnummer ska visas så därför hämtas, och visas, listan med leveranstider direkt. */
                var deliveryTimes = getPossibleDeliveryTimesAnswer.deliveryTimes;

                deliveryTimesCopy = deliveryTimes;

                for (var i = 0; i < deliveryTimes.length; i++) {
                    insertOption("deliveryTimesFlow2", i, deliveryTimes[i].deliveryTimeAsString);
                }

                showSecondDeliveryTimesAreaAfterAnswer();
                document.getElementById("deliveryTimesArea1").style.display = "none";
                document.getElementById("deliveryTimesArea2").style.display = "block";


                if (stateSelectedTimeOfArrival != null) {
                    document.getElementById("deliveryTimesFlow2").selectedIndex = stateSelectedTimeOfArrival;
                }
            }
        }
        catch(err)  {
            showMajorError(2,"receiveDeliveryTimes","javascript Error: " + err.description + "",theMajorErrorText);
        }
    }

    /* Anropar Ajax-funktion för att hämta resultat beroende på inparametrar
        stateDestinationId Id för vald destination
        agreementCustomer Kundtyp (true = avtalskund, false = ej avtalskund)
        franko True = frankeringsmaskin, false = ej frankeringsmaskin
        weight Vikt
        length Längd
        width Bredd
        height Höjd/tjocklek
        diameter Diameter
        informationAboutSender Från-postnummer
        informationAboutReceiver Till-postnummer */
    function getAllServicesInclPrice(stateDestinationId,
                                     agreementCustomer, franko, weight, length, width,
                                     height, diameter, informationAboutSender,
                                     informationAboutReceiver)  {
        stateCheapFirst = false;
        writeInitialWaitingText("skickaToggleShowTest");
        Ajax.getAllServicesInclPrice(stateDestinationId,
                                     agreementCustomer,
                                     franko,
                                     parseInt(weight),
                                     parseInt(length),
                                     parseInt(width),
                                     parseInt(height),
                                     parseInt(diameter),
                                     informationAboutSender,
                                     informationAboutReceiver,
                                     ++sequenceNr,
                                     receiveAllServicesInclPrice);
    }


    /*  Anropar Ajax.getAllServicesInclTimePrice() för hämtning av resultat. "Levranstidsflödet".
        deliveryTimeDays Leveranstid (dagar)
        deliveryTimeHour Leveranstid (klockslag)
        saturday Lördagsutdelning
        stateDestinationId Id för vald destination
        agreementCustomer Kundtyp (true = avtalskund, false = ej avtalskund)
        franko True = frankeringsmaskin, false = ej frankeringsmaskin
        weight Vikt
        length Längd
        width Bredd
        height Höjd/tjocklek
        diameter Diameter
        informationAboutSender Från-postnummer
        informationAboutReceiver Till-postnummer */
    function getAllServicesInclTimePrice(deliveryTimeDays,
                                         deliveryTimeHour,
                                         saturday,
                                         stateDestinationId,
                                         agreementCustomer, franko, weight, length, width,
                                         height, diameter, informationAboutSender,
                                         informationAboutReceiver)  {
        writeInitialWaitingText("skickaToggleShowTest");

        Ajax.getAllServicesInclTimePrice(deliveryTimeDays,
                                         deliveryTimeHour,
                                         saturday,
                                         stateDestinationId,
                                         agreementCustomer,
                                         franko,
                                         parseInt(weight),
                                         parseInt(length),
                                         parseInt(width),
                                         parseInt(height),
                                         parseInt(diameter),
                                         informationAboutSender,
                                         informationAboutReceiver,
                                         ++sequenceNr,
                                         receiveAllServicesInclPrice);
    }

    /* Callback-funktion för Ajax.getAllServicesInclPrice() */
    function receiveAllServicesInclPrice(getServicesInclPriceAnswer) {

     try  {

         if(sequenceNr != getServicesInclPriceAnswer.sequenceNr) {
            return;
         }
         retCode = getServicesInclPriceAnswer.baseAnswer.returnCode;

         if (retCode < 0) {
             if (retCode == -5) {
                showMajorError(3,"receiveAllServicesInclPrice",retCode, tooManyErrorText);
             } else {
                showMajorError(3,"receiveAllServicesInclPrice",retCode, theMajorErrorText);
             }
             document.getElementById("cmtBanner").style.display = "block";
             return;
         }
         if (retCode == 111) {
            showMajorError(3,"receiveAllServicesInclPrice",retCode, theServiceNotFoundErrorText);
            document.getElementById("cmtBanner").style.display = "block";
            return;
         }
         deleteWaitingText();
         var servicesInclPriceAnswer = getServicesInclPriceAnswer.servicesInclPriceAnswer;
         servicesInclPriceAnswerCopy = servicesInclPriceAnswer;

             var receivedReturncode = servicesInclPriceAnswer.returnCode;
             var myErrorText = servicesInclPriceAnswer.errorText;
             var inputInformationAboutSender = getServicesInclPriceAnswer.inputInformationAboutSender;
             var inputInformationAboutReceiver = getServicesInclPriceAnswer.inputInformationAboutReceiver;

             var informationAboutSenderReceiver;
             informationAboutSenderReceiver = getServicesInclPriceAnswer.informationAboutSenderReceiver;

             /* saving state */
             statePnrStop = false;

             if (servicesInclPriceAnswer.baseServiceAdditionalInfos != null && servicesInclPriceAnswer.baseServiceAdditionalInfos.length > 0) {

                 var tmpSuggestionContent = "";

                 for (var i=0; i < servicesInclPriceAnswer.baseServiceAdditionalInfos.length; i++) {
                     var priceExTaxNum  = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceExclTax;
                     var priceIncTaxNum = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceInclTax;
                     if (priceExTaxNum == priceIncTaxNum) {
                         //tmpSuggestionContent = tmpSuggestionContent + addSuggestionContentMore(i,servicesInclPriceAnswer.baseServiceAdditionalInfos[i].additionalServiceAdditionalInfos, false);
                         tmpSuggestionContent = tmpSuggestionContent + addSuggestionContentMore(i,servicesInclPriceAnswer.baseServiceAdditionalInfos[i], false);
                     } else {
                         //tmpSuggestionContent = tmpSuggestionContent + addSuggestionContentMore(i,servicesInclPriceAnswer.baseServiceAdditionalInfos[i].additionalServiceAdditionalInfos, true);
                         tmpSuggestionContent = tmpSuggestionContent + addSuggestionContentMore(i,servicesInclPriceAnswer.baseServiceAdditionalInfos[i], true);
                     }
                 }

                 document.getElementById("skickaToggleShowTest").innerHTML=tmpSuggestionContent;

                 for (var i=0; i < servicesInclPriceAnswer.baseServiceAdditionalInfos.length; i++) {

                     var priceExTaxNum  = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceExclTax;
                     var priceIncTaxNum = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceInclTax;

                     var priceExTax  = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceExclTaxAsString;
                     var priceIncTax = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].priceInclTaxAsString;
                     var theDeliveryTime = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].deliveryTime.deliveryTimeAsString;

                     var handingIn = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].handingInInformation;

                     document.getElementById("resultMainInfo"+i).innerHTML = "<div style='margin-bottom:0.2em;font-size:1.2em;font-weight:bold;'>" + servicesInclPriceAnswer.baseServiceAdditionalInfos[i].baseService.name + "</div>" + servicesInclPriceAnswer.baseServiceAdditionalInfos[i].baseService.info + getMoreInfoLink(servicesInclPriceAnswer.baseServiceAdditionalInfos[i].baseService.detailedInfo,i);
                     document.getElementById("resultMainPriceIncTax"+i).innerHTML = " "+priceIncTax;
                     document.getElementById("resultMainPriceExTax"+i).innerHTML = "("+priceExTax+" exkl. moms)";
                     document.getElementById("timeOfDelivery"+i).innerHTML = theDeliveryTime;
                     document.getElementById("handingIn"+i).innerHTML = '<b>Lämnas:&nbsp;</b>';
                     document.getElementById("handingIn"+i).innerHTML += handingIn != null ? handingIn : '';

                     /* isBulky är true om priset påverkats eftersom försändelsen är skrymmande. */
                     var isBulky = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].bulkyCalculatedPrice;
                     var isPriceVolumebased = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].volCalculatedPrice;
                     var isOrttillagg = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].orttillaggCalculatedPrice;

                     if (isBulky) {
                        document.getElementById("bulky"+i).innerHTML = bulkyText;
                     }
                                          
                     if (isPriceVolumebased) {                        
                        var volumeWeight = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].volumeWeightAsString;
                        document.getElementById("bulky"+i).style.margin = "0";
                        document.getElementById("volumebased"+i).innerHTML = volumebasedText + " " + volumeWeight + " kg</span>";
                     }

                     if (servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices != null && servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices.length>0) {

                         /* Loopa över giltiga index i den första legala kombinationen av tilläggstjänster. Markera dessa index/tilläggstjänster.
                         Lägg också till onclick-funktionalitet för dessa tilläggstjänster.. de ska inte gå att avmarkera.. meddelande ska komma upp om att de är tvingande. */
                         for (var j=0; j<servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].indexOfAdditionalServices.length;j++){
                             var checkboxes = document.getElementsByName("addCheck"+i);
                             var checkBoxIndex = servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].indexOfAdditionalServices[j];
                             checkboxes[checkBoxIndex].checked = true;

                             /* Tvingande tilläggstjänster (här i form av kryssrutor) ska inte gå att avmarkera. Ett meddelande kring detta ska istället visas. */
                             checkboxes[checkBoxIndex].onclick = function(e){
                                 var clickedElem = getTargetElement(e);
                                 if(clickedElem != null){
                                     clickedElem.checked = true;
                                     showtooltip(clickedElem,'0',25,25,'ttLayer1');
                                 }
                             };
                         }

                         if (servicesInclPriceAnswer.baseServiceAdditionalInfos[i].legalCombinationsOfAdditionalServices[0].indexOfAdditionalServices.length>0){
                             /* Tvingande tilläggstjänster ska de visas expanderade från början.. */
                             showHideArea("addarr"+i+"","resultMainbtn"+i+"");
                         }
                     }
                 }

                 /* Sätter focus på rätt element, för att tabordningen ska bli korrekt. */
                 if (document.getElementById("lblMoreInfo0")) {
                    document.getElementById("lblMoreInfo0").focus();
                 }

                 document.getElementById("lastStepBox").style.display="none";

                 if (receivedReturncode == 0) {
                     document.getElementById("cmtBanner").style.display = "block";
                     getHtmlForShopProducts(servicesInclPriceAnswer.baseServiceAdditionalInfos[0].shopItemIds[0]);
                 }
                 document.getElementById('divPrint').style.display="block";
                 checkBoxesBasedOnParameter(stateSelectedServices);
             } else {
                addAlternativeContent(false,receivedReturncode,myErrorText,"lastStepBox","Ange postnummer.",informationAboutSenderReceiver,inputInformationAboutSender,inputInformationAboutReceiver);
             }
        }
        catch(err)  {
             showMajorError(3,"receiveAllServicesInclPrice","javascript Error: " + err.description + "", theMajorErrorText);
        }
    }

    /*  Hämtar tjänst
        cheapestAlternative True = "billigaste"-flödet, false = "levanstids"-flödet */
    function getCorrectService(cheapestAlternative) {

        clearDynamicFields();

        if (cheapestAlternative) {
            getServicesInclPricePerCategory(stateDestinationId, stateAgreementCustomer, stateFranko, parseInt(stateWeight), parseInt(stateLength*10), parseInt(stateWidth*10), parseInt(stateHeight*10), parseInt(stateDiameter*10), null, null);
        }
        else {
            var pFrom = document.getElementById("fromPnrFlow2").value;
            var pTo =  document.getElementById("toPnrFlow2").value;
            if (pFrom != null) {
                pFrom = trimItAll(pFrom);
            }
            if (pTo != null) {
                pTo = trimItAll(pTo);
            }
            var tmpListBox = document.getElementById("deliveryTimesFlow2");

            stateSelectedTimeOfArrival = tmpListBox[tmpListBox.selectedIndex].value;

            stateDeliveryTimeDays = deliveryTimesCopy[stateSelectedTimeOfArrival].deliveryTimeDays;
            stateDeliveryTimeHour = deliveryTimesCopy[stateSelectedTimeOfArrival].deliveryTimeHour;
            stateSaturday = deliveryTimesCopy[stateSelectedTimeOfArrival].saturday;
            stateDeliveryTimeAsString = deliveryTimesCopy[stateSelectedTimeOfArrival].deliveryTimeAsString;

            getAllServicesInclTimePrice(stateDeliveryTimeDays, stateDeliveryTimeHour, stateSaturday, stateDestinationId, stateAgreementCustomer, stateFranko, parseInt(stateWeight), parseInt(stateLength*10), parseInt(stateWidth*10), parseInt(stateHeight*10), parseInt(stateDiameter*10), document.getElementById("fromPnrFlow2").value, document.getElementById("toPnrFlow2").value);
        }
    }

    /*  Hämtar leveranstider baserat på postnummer
        pFrom Frånpostnummer
        pTo Tillpostnummer  */
    function getDeliveryTimes(pFrom,pTo) {
        clearOptions("deliveryTimesFlow2");
        showSecondDeliveryTimesAreaBeforeAnswer();
        setGlobalPostalNumbers("fromPnrFlow2","toPnrFlow2");
        if (pFrom != null) {
            pFrom = trimItAll(pFrom);
        }
        if (pTo != null) {
            pTo = trimItAll(pTo);
        }
        getPossibleDeliveryTimes(stateAgreementCustomer, stateFranko, parseInt(stateWeight), parseInt(stateLength*10), parseInt(stateWidth*10), parseInt(stateHeight*10),
                                      parseInt(stateDiameter*10), stateDestinationId, pFrom, pTo)
    }

    /* Callback-funktion för Ajax.getHtmlForShopProducts() */
    function receiveHtmlForShopProducts(getHtmlForShopProductsAnswer) {

         try  {
             if(sequenceNr != getHtmlForShopProductsAnswer.sequenceNr) {
                return;
             }
             var receiveHtmlForShopProductsAnswer = getHtmlForShopProductsAnswer.html;

             if (receiveHtmlForShopProductsAnswer != null)  {

                 document.getElementById("divShop").innerHTML = '';
                 var newdiv = document.createElement("div");
                 newdiv.innerHTML = receiveHtmlForShopProductsAnswer;
                 document.getElementById("divShop").appendChild(newdiv);
                 document.getElementById('divPrint').style.display="block";
             }
         }
         catch(err) {
             Ajax.logError("Unknown javascript error in receiveHtmlForShopProducts()",receivelogError);
         }
    }

    /*  Anropar Ajax-metod för hämtning av html-kod för artikel från butiken
        articleId Arikel-Id att hämta html för. */
    function getHtmlForShopProducts(articleId)  {
         var articleIds = new Array();
         if (typeof(articleId) != "undefined")  {
           articleIds[0] = articleId;
         }
         Ajax.getHtmlForShopProducts(articleIds, ++sequenceNr, receiveHtmlForShopProducts);
     }

    /*  Visar väntemeddelande vid hämtande av resultat
        contentArea Id för element att visa meddelande i */
    function writeInitialWaitingText(contentArea) {
         document.getElementById(contentArea).innerHTML = "";
         document.getElementById("lastStepBox").style.display = "none";
         document.getElementById("showWaitingBox").innerHTML = "<img src='img/hamtar_resultat_vit_bak.gif' width='158px' height='35px' alt='Hämtar resultat..'/>";
         document.getElementById("showWaitingBox").style.display = "block";
     }

    /* Tar bort väntemeddelande */
    function deleteWaitingText() {
         document.getElementById("showWaitingBox").style.display = "none";

     }
     /* Delayfunktion väntar millis millisekunder.
        millis Millisekunder */
     function pausecomp (millis) {
        var date = new Date();
        var curDate = null;
        do {
            curDate = new Date();
        } while(curDate-date < millis);
     }

     /* Callback-funktion för Ajax.logError() */
     function receivelogError() {
     }
