/*

MAIN.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.

*/

/*  agreement pallet limitations */
var agreementPalletMaxWeight = "";
var agreementPalletMaxLength = "";
var agreementPalletMaxWidth = "";
var agreementPalletMaxHeight = "";
var agreementPalletMaxVolume = "";
var agreementPalletMinWeight = "";
var agreementPalletMinLength = "";
var agreementPalletMinWidth = "";
var agreementPalletMinHeight = "";
var agreementPalletMinVolume = "";

/*  agreement package limitations */
var agreementParcelMaxWeight = "";
var agreementParcelMaxLength = "";
var agreementParcelMaxWidth = "";
var agreementParcelMaxHeight = "";
var agreementParcelMaxVolume = "";
var agreementParcelMinWeight = "";
var agreementParcelMinLength = "";
var agreementParcelMinWidth = "";
var agreementParcelMinHeight = "";
var agreementParcelMinVolume = "";

/*  agreement roll limitations */
var agreementRollMaxWeight = "";
var agreementRollMaxLength = "";
var agreementRollMaxDiameter = "";
var agreementRollMaxVolume = "";
var agreementRollMinWeight = "";
var agreementRollMinLength = "";
var agreementRollMinDiameter = "";
var agreementRollMinVolume = "";

/*  private package limitations */
var privateParcelMaxWeight = "";
var privateParcelMaxLength = "";
var privateParcelMaxWidth = "";
var privateParcelMaxHeight = "";
var privateParcelMaxVolume = "";
var privateParcelMinWeight = "";
var privateParcelMinLength = "";
var privateParcelMinWidth = "";
var privateParcelMinHeight = "";
var privateParcelMinVolume = "";

/*  private roll limitations */
var privateRollMaxWeight = "";
var privateRollMaxLength = "";
var privateRollMaxDiameter = "";
var privateRollMaxVolume = "";
var privateRollMinWeight = "";
var privateRollMinLength = "";
var privateRollMinDiameter = "";
var privateRollMinVolume = "";

/* För att säkra att alla onloadfunktioner körs i samma ordning i olika browsers
så lägger vi bara upp en enda funktion som i sin tur anropar de övriga (istället för att som innan anropa addEventHandler flera ggr). */
addEventHandler(window, "load", onloadFunctions);

if (savingState) {
    /* funktionen onBeforeUnloadFunctions() körs då man lämnar sidan, innan onUnloadFunctions(). */
    addEventHandler(window, "beforeunload", onBeforeUnloadFunctions);
    /* funktionen onUnloadFunctions() körs då man lämnar sidan, efter onBeforeUnloadFunctions(). */
    addEventHandler(window, "unload", onUnloadFunctions);
}

/* Hanterar cacheproblematiken i Firefox 2.x. onPageShow triggas för alla browsers,
men event.persisted är bara true då man backar till en cachead sida i Firefox.
I det läget så laddas sidan om så att Flashapplikationen initieras på nytt. */
addEventHandler(window, "pageshow", onPageShow);
function onPageShow(e) {
    if (e.persisted) {
        /* reload(true) = laddas om från server och inte från cache, behövs för "spara tillstånd" */
        window.location.reload(true);
    }
}

/* pausecomp(1) körs för onBeforeUnloadFunctions ska hinna exekveras. */
function onUnloadFunctions() { pausecomp(1); }

function onBeforeUnloadFunctions() { saveFVals(); saveState(); return null;}

/* Sparar aktuellt state på sessionen. */
function saveState() {
    /* Anropet storeState körs synkront (async:false) för att browsern ska vänta till allt är sparat på sessionen innan den går vidare. */
    Ajax.storeState("not important", stateStep ,stateCylinder, stateAgreementCustomer, stateFranko, stateWeight, stateWeightUnit, stateLength, stateWidth, stateHeight, stateDiameter,
         stateDestinationId, stateDestinationName, stateCheap, stateCheapFirst, stateDeliveryTimeDays, stateDeliveryTimeHour, stateSaturday, stateDeliveryTimeAsString, stateDeliveryTimeFirstTime, stateInformationAboutSender, stateInformationAboutReceiver, statePnrStop, stateSelectedTimeOfArrival, stateSelectedServices, 33535,
      {callback:function(bool) { var doingsomething = true; },
       async:false}
    );
}

/* Sparar undan information (flashdata bl a) om nuvarande state innan saveState() körs. */
function saveFVals(){
    if (flashId) {
       var receivedPars = new Array();
       receivedPars = flashId.getData();
       var okToMoveOn = receivedPars[9];
        if (stateStep == 2) {
            saveCurrentFlashValues(receivedPars);
        } else if (stateStep == 3) {
            if(document.getElementById("deliveryTimesArea2").style.display != "none"){
                var tmpListBox = document.getElementById("deliveryTimesFlow2");
                stateSelectedTimeOfArrival = tmpListBox[tmpListBox.selectedIndex].value;
            }
        } else if (stateStep == 4) {
            createParameterAdditionalServicesCheckBoxes();
        }
    }
}
/* the functions to run onload. */
function onloadFunctions() {
    initiateVariables();
    initLoadFlash();
    getAllDestinations();
}

/* Ser till så Skickaguiden får rätt utseende och inställningar baserat på state (data sparat på sessionen). */
function setupSavedState() {

    var avtalskund = document.getElementById("avtalskund");
    var franko = document.getElementById("franko");

    avtalskund.checked = stateAgreementCustomer ? true : false;
    franko.checked = stateFranko ? true : false;
    if (stateDestinationId != "") {

        var found = false;
        var swedenObj = document.getElementById('swedenId');
        var europeObj = document.getElementById('europeId');
        var notEuropeObj = document.getElementById('notEuropeId');

        if(stateDestinationId=="Sverige"){
            swedenObj.checked = true;
        } else {
            swedenObj.checked = false;
            for (var i=0; i < europeObj.length; i++) {
               if (stateDestinationId == europeObj.options[i].value) {
                  europeObj.selectedIndex = i;
                  found = true;
               }
            }
            if (!found){
               for (var j=0; j < notEuropeObj.length; j++) {
                 if (stateDestinationId == notEuropeObj.options[j].value) {
                   notEuropeObj.selectedIndex = j;
                 }
               }
            }
        }
    }

    /* Går in i rätt steg, samma steg som man var på när man sist lämnade Skickaguiden. */
    if (stateStep == 2) {
        disableAllSkickaToggleShow('2','');

    } else if (stateStep == 3) {

        disableAllSkickaToggleShow('3','');
        showHideArea("", "deliveryTimesArea1");
        showHideArea("", "deliveryTimesArea2");
        showHideArea("", "continueBtnToStep3");
        showHideArea("", "toStep3ButtonDivId");

        clearOptions("deliveryTimesFlow2");

        var cheapObj = document.getElementById('typeOfService1');
        var notCheapObj = document.getElementById('typeOfService2');

        cheapObj.checked = (stateCheap==null)?false:stateCheap;
        notCheapObj.checked = (stateCheap==null)?false:!stateCheap;

        if (cheapObj.checked) {
            hideDeliveryTimesArea();
        }
        if (notCheapObj.checked) {

            document.getElementById("fromPnrFlow2").value = stateInformationAboutSender;
            document.getElementById("toPnrFlow2").value = stateInformationAboutReceiver;
            getDeliveryTimes(stateInformationAboutSender,stateInformationAboutReceiver);
        }

    } else if (stateStep == 4) {
        var cheapestObj = document.getElementById('typeOfService1');
        var notCheapestObj = document.getElementById('typeOfService2');
        cheapestObj.checked = stateCheap; notCheapestObj.checked = !stateCheap;
        disableAllSkickaToggleShow('4','');

            if (stateCheap) { /* billigaste flödet */

                if (stateCheapFirst) {
                    clearDynamicFields();
                    callService(stateCheapFirst, stateInformationAboutSender, stateInformationAboutReceiver);
                } else {
                    callGetAllServicesInclPrice(stateInformationAboutSender, stateInformationAboutReceiver);
                }

            } else { /* flödet baserat på leveranstid */

                var selectedId = stateSelectedTimeOfArrival;
                getAllServicesInclTimePrice(stateDeliveryTimeDays, stateDeliveryTimeHour, stateSaturday, stateDestinationId, stateAgreementCustomer, stateFranko, parseInt(stateWeight), parseInt(stateLength*10), parseInt(stateWidth*10), parseInt(stateHeight*10), parseInt(stateDiameter*10), stateInformationAboutSender, stateInformationAboutReceiver);
            }
        }

    if (stateAgreementCustomer==null) { stateAgreementCustomer = document.getElementById("avtalskund").checked; }
    if (stateFranko==null) { stateFranko = document.getElementById("franko").checked; }
}

/* Markerar tilläggstjänster baserat på inparametern param
(sträng av nollor och ettor där etta betyder att tilläggstjänsten är vald och nolla betyder ej vald.) */
function checkBoxesBasedOnParameter(param){
    var serviceIdsArray = new Array();
    var checkBoxCounter = 0;
    var inputs = document.getElementsByTagName("input");

    for (var i = 0; i < inputs.length; i++) {
        var inputId = inputs[i].getAttribute('id');

        if (inputId != null && inputId.indexOf("additionalServiceCheckbox") != -1) {

            if(stateSelectedServices.charAt(checkBoxCounter)=='1'){
                document.getElementById(inputId).checked = true;

                if (document.getElementById(inputId).parentNode.parentNode.style.display != "block") {
                    document.getElementById(inputId).parentNode.parentNode.style.display = "block";
                    document.getElementById(inputId).parentNode.parentNode.previousSibling.style.display = "none";
                    var addArrId = document.getElementById(inputId).parentNode.parentNode.id.toString();
                    serviceIdsArray.push(parseInt(addArrId.substring(6,addArrId.length)));
                }
            }
            checkBoxCounter++;
        }
    }
    for (var i=0;i<serviceIdsArray.length;i++) {
        calculatePriceAndDeliverytime(serviceIdsArray[i]);
    }
}

/* Skapar sträng med information om vilka tilläggstjänster som är valda. */
function createParameterAdditionalServicesCheckBoxes(){
    stateSelectedServices = "";
    var inputs = document.getElementsByTagName("input");
    for (var i = 0; i < inputs.length; i++) {
        var inputId = inputs[i].getAttribute('id');

        if (inputId != null && inputId.indexOf("additionalServiceCheckbox") != -1) {
            var theService = parseInt(inputId.split("service")[1]);
            if(document.getElementById(inputId).checked){
                stateSelectedServices += "1";
            } else {
                stateSelectedServices += "0";
            }
        }
    }
}

/* Växlar mellan de två flödena, billigast o baserat på leveranstid. */
function resetCheapStateValues(isCheap) {

    /* Förhindrar att leveranstider beräknas då dessa redan visas. */
    if(!(!isCheap && (document.getElementById("deliveryTimesArea1").style.display != "none" || document.getElementById("deliveryTimesArea2").style.display != "none"))){
        stateCheap = isCheap;
        stateSelectedTimeOfArrival = null;
        stateInformationAboutSender = null;
        stateInformationAboutReceiver = null;

        if(isCheap){
            hideDeliveryTimesArea();
        } else {
            getDeliveryTimes(null,null);
        }
    }
}

privateParcelMaxVolume = privateParcelMaxVolume/1000;
privateParcelMinVolume = privateParcelMinVolume/1000;
privateRollMaxVolume = privateRollMaxVolume/1000;
privateRollMinVolume = privateRollMinVolume/1000;

agreementParcelMaxVolume = agreementParcelMaxVolume/1000;
agreementParcelMinVolume = agreementParcelMinVolume/1000;
agreementRollMaxVolume = agreementRollMaxVolume/1000;
agreementRollMinVolume = agreementRollMinVolume/1000;

//initiating min and max values
var packMaxWeight = privateParcelMaxWeight;
var packMaxLength = privateParcelMaxLength;
var packMaxWidth  = privateParcelMaxWidth;
var packMaxHeight = privateParcelMaxHeight;
var packMaxVolume = privateParcelMaxVolume;
var packMinWeight = privateParcelMinWeight;
var packMinLength = privateParcelMinLength;
var packMinWidth  = privateParcelMinWidth;
var packMinHeight = privateParcelMinHeight;
var packMinVolume = privateParcelMinVolume;

var rollMaxWeight = privateRollMaxWeight;
var rollMaxLength = privateRollMaxLength;
var rollMaxDiameter = privateRollMaxDiameter;
var rollMaxVolume = privateRollMaxVolume;
var rollMinWeight = privateRollMinWeight;
var rollMinLength = privateRollMinLength;
var rollMinDiameter = privateRollMinDiameter;
var rollMinVolume = privateRollMinVolume;

function setMinMaxValuesAgreement(limitations) {

    packMaxLength = limitations.parcelLimitations ? limitations.parcelLimitations.maxLength : '-1';
    packMaxHeight = limitations.parcelLimitations ? limitations.parcelLimitations.maxHeight : '-1';
    packMaxWidth  = limitations.parcelLimitations ? limitations.parcelLimitations.maxWidth : '-1';
    packMaxWeight = limitations.parcelLimitations ? limitations.parcelLimitations.maxWeight : '-1';
    packMaxVolume = limitations.parcelLimitations ? limitations.parcelLimitations.maxVolume : '-1';
    packMinWeight = limitations.parcelLimitations ? limitations.parcelLimitations.minWeight : '-1';
    packMinLength = limitations.parcelLimitations ? limitations.parcelLimitations.minLength : '-1';
    packMinWidth  = limitations.parcelLimitations ? limitations.parcelLimitations.minWidth : '-1';
    packMinHeight = limitations.parcelLimitations ? limitations.parcelLimitations.minHeight : '-1';
    packMinVolume = limitations.parcelLimitations ? limitations.parcelLimitations.minVolume : '-1';

    palletMaxWeight = limitations.palletLimitations ? limitations.palletLimitations.maxWeight : '-1';
    palletMaxLength = limitations.palletLimitations ? limitations.palletLimitations.maxLength : '-1';
    palletMaxWidth  = limitations.palletLimitations ? limitations.palletLimitations.maxWidth : '-1';
    palletMaxHeight = limitations.palletLimitations ? limitations.palletLimitations.maxHeight : '-1';
    palletMaxVolume = limitations.palletLimitations ? limitations.palletLimitations.maxVolume : '-1';
    palletMinWeight = limitations.palletLimitations ? limitations.palletLimitations.minWeight : '-1';
    palletMinLength = limitations.palletLimitations ? limitations.palletLimitations.minLength : '-1';
    palletMinWidth  = limitations.palletLimitations ? limitations.palletLimitations.minWidth : '-1';
    palletMinHeight = limitations.palletLimitations ? limitations.palletLimitations.minHeight : '-1';
    palletMinVolume = limitations.palletLimitations ? limitations.palletLimitations.minVolume : '-1';

    rollMaxWeight   = limitations.rollLimitations ? limitations.rollLimitations.maxWeight : '-1';
    rollMaxLength   = limitations.rollLimitations ? limitations.rollLimitations.maxLength : '-1';
    rollMaxDiameter = limitations.rollLimitations ? limitations.rollLimitations.maxDiameter : '-1';
    rollMaxVolume   = limitations.rollLimitations ? limitations.rollLimitations.maxVolume : '-1';
    rollMinWeight   = limitations.rollLimitations ? limitations.rollLimitations.minWeight : '-1';
    rollMinLength   = limitations.rollLimitations ? limitations.rollLimitations.minLength : '-1';
    rollMinDiameter = limitations.rollLimitations ? limitations.rollLimitations.minDiameter : '-1';
    rollMinVolume   = limitations.rollLimitations ? limitations.rollLimitations.minVolume : '-1';

    minParams[0]  = 0;
    minParams[1]  = packMinLength;
    minParams[2]  = packMinHeight;
    minParams[3]  = packMinWidth;
    minParams[4]  = rollMinLength;
    minParams[5]  = rollMinDiameter;
    minParams[6]  = packMinWeight;
    minParams[7]  = rollMinWeight;
    minParams[8]  = rollMinVolume;
    minParams[9]  = packMinVolume;
    minParams[10] = palletMinLength;
    minParams[11] = palletMinWidth;
    minParams[12] = palletMinHeight;
    minParams[13] = palletMinWeight;

    maxParams[0]  = 0;
    maxParams[1]  = packMaxLength;
    maxParams[2]  = packMaxHeight;
    maxParams[3]  = packMaxWidth;
    maxParams[4]  = rollMaxLength;
    maxParams[5]  = rollMaxDiameter;
    maxParams[6]  = packMaxWeight;
    maxParams[7]  = rollMaxWeight;
    maxParams[8]  = rollMaxVolume;
    maxParams[9]  = packMaxVolume;
    maxParams[10] = palletMaxLength;
    maxParams[11] = palletMaxWidth;
    maxParams[12] = palletMaxHeight;
    maxParams[13] = palletMaxWeight;
}

//browsercheck
//**************************************************************************************************************************
var agt=navigator.userAgent.toLowerCase();
var appVer = navigator.appVersion.toLowerCase();
var iePos  = appVer.indexOf('msie');
var is_opera = (agt.indexOf("opera") != -1);
var is_safari = ((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;
var is_konq = false;
var kqPos   = agt.indexOf('konqueror');
if (kqPos !=-1) {
   is_konq  = true;
}
var is_khtml  = (is_safari || is_konq);
var is_ie   = ((iePos!=-1) && (!is_opera) && (!is_khtml));
//**************************************************************************************************************************

/* millisekunder sedan 1970/01/01
sekvensnummer för att hålla reda på vilket ajaxanrop som hör till vilket svar */
var sequenceNr = new Date().getTime();

/* legala kombinationer av tilläggstjänster.. */
var legalCombinationsArrayVar = new Array(new Array(new Array()));
var servicesInclPriceAnswerCopy;
var deliveryTimesCopy;
var lengthC = stateLength;
var lengthL = stateLength;
var weightC = stateWeight;
var weightL = stateWeight;
var selectedCountry = "";
var globalPnrFrom = "";
var globalPnrTo = "";
var notEuropeIdUsed = false;
var europeIdUsed = false;
var timesOfArrivalUsed = false;
var currentStep = 1;
var totalNumOfSteps = 4;
var steps = new Array(4);
var decimalsForKilos = 1;
var theMajorErrorText = "Ett allvarligt fel har uppstått. Var vänlig försök igen senare.";
var tooManyErrorText = "För närvarande är det väldigt många som använder Skickaguiden. Var vänlig försök igen senare.";
var theServiceNotFoundErrorText = "Ingen tjänst hittades. Se över dina val i föregående steg.";
var pnrInfoTextSingle = "<p>För att kunna visa prisalternativ för din försändelse måste du fylla i vilket postnummer som du vill skicka från.</p>";
var pnrInfoTextBoth = "<p>För att kunna visa prisalternativ för din försändelse måste du fylla i vilka postnummer som du vill skicka från och till.</p>";
var combinationErrorText = "Vissa av våra tilläggstjänster kan inte kombineras med varandra, andra förutsätter att du valt ytterligare en tilläggstjänst - prova att lägga till eller ta bort en tilläggstjänst.";
var flashMinValueErrorText = "Ett eller flera av de värden du har angivit är mindre än Postens minimått och har därför ändrats. Klicka på \"fortsätt\" för att gå vidare.";
var bulkyText = "<img src='img/alert_gul.gif' width='24' height='24' alt='Skrymmande försändelse' style='float:left;margin-right:0.5em;' /><span style='float:left;vertical-align:top;width:15.5em;'>Priset har påverkats eftersom din försändelse är skrymmande.<br /><br /></span>";
var volumebasedText = "<img src='img/alert_gul.gif' width='24' height='24' alt='Volymbaserat pris' style='float:left;margin-right:0.5em;' /><span style='float:left;vertical-align:top;width:15.5em;'>Priset är baserat på en volymberäknad vikt motsvarande:";

var postalNumberFrom = "";
var postalNumberTo = "";

function setGlobalPostalNumbers(pnrFromId, pnrToId) {
    if (document.getElementById(pnrFromId) && document.getElementById(pnrFromId).value != null && document.getElementById(pnrFromId).value != "") {
        globalPnrFrom = document.getElementById(pnrFromId).value;
        stateInformationAboutSender = globalPnrFrom;
    }
    if (document.getElementById(pnrToId) && document.getElementById(pnrToId).value != null && document.getElementById(pnrToId).value != "") {
        globalPnrTo = document.getElementById(pnrToId).value;
        stateInformationAboutReceiver = globalPnrTo;
    }
}

function step(){
    return{
       beforeName:"",
       activeName:"",
       afterName:""
    }
}

for (var i=0; i<steps.length; i++) {
    steps[i] = new step();
}

/* initierar steg */
steps[0].beforeName = "Vart vill du skicka försändelsen?";
steps[0].activeName = "Vart vill du skicka försändelsen?";
steps[0].afterName  = "";

steps[1].beforeName = "Vad har försändelsen för mått och vikt?";
steps[1].activeName = "Vad har försändelsen för mått och vikt?";
steps[1].afterName  = "";

steps[2].beforeName = "Leveranstid";
steps[2].activeName = "När ska försändelsen vara framme?";
steps[2].afterName  = "När ska försändelsen vara framme?";

steps[3].beforeName = "Resultat";
steps[3].activeName = "Resultat";
steps[3].afterName  = "";

/* Skriver rubriktext för respektive steg i Skickaguiden. */
function setStepAfterName(step){
    if (step == 0) {
        steps[step].afterName = "Vald destination: " + stateDestinationName;
    } else if(step==1){
        var presentationWeight;
        if (stateCylinder == 2) {
            if("kg" == stateWeightUnit){
                presentationWeight = (stateWeight / 1000).toFixed(decimalsForKilos);
            } else  {
                presentationWeight = stateWeight;
            }
            steps[step].afterName = "Mått: "+stateDiameter+"cm x "+lengthC+"cm &nbsp;&nbsp;&nbsp; Vikt: " + presentationWeight.toString().replace(/\./g,",") + " " + stateWeightUnit;
        } else {
            if("kg" == stateWeightUnit){
                presentationWeight = (stateWeight / 1000).toFixed(decimalsForKilos);
            } else {
                presentationWeight = stateWeight;
            }
            steps[step].afterName = "Mått: "+stateLength+"cm x "+stateWidth+"cm x "+stateHeight+"cm &nbsp;&nbsp;&nbsp; Vikt: "+presentationWeight.toString().replace(/\./g,",") + " " + stateWeightUnit;
        }
    } else if(step==2) {

        if(document.getElementById('typeOfService1').checked){
            steps[step].afterName = "Ingen specificerad leveranstid";
        } else {
            var tmpListBox = document.getElementById("deliveryTimesFlow2");
            var selectedId = stateSelectedTimeOfArrival;
            steps[step].afterName = stateDestinationName + ", " + stateDeliveryTimeAsString;
        }
    }
}

/* Körs då vi gå vidare till steg 4. */
function continueToStep4() {
    if (!stateCheap) {
        var tmpListBox = document.getElementById("deliveryTimesFlow2");
        stateSelectedTimeOfArrival = tmpListBox[tmpListBox.selectedIndex].value;
        stateDeliveryTimeAsString = deliveryTimesCopy[stateSelectedTimeOfArrival].deliveryTimeAsString;
    }
    disableAllSkickaToggleShow('4','');
    getCorrectService(document.getElementById('typeOfService1').checked);
}

/* Tar bort mellanslag i början och slutet av en sträng. */
function trim(stringToTrim) {
    return stringToTrim.replace(/^\s+|\s+$/g,"");
}

/* Tar bort samtliga mellanslag från en sträng. */
function trimItAll(stringToTrim) {
    return stringToTrim.replace(/\s/g,"");
}

function initiateVariables() {
    document.getElementById("step1").innerHTML = steps[0].activeName;
    document.getElementById("step2").innerHTML = steps[1].beforeName;
    document.getElementById("step3").innerHTML = steps[2].beforeName;
    document.getElementById("step4").innerHTML = steps[3].beforeName;
}

/*Visar och döljer de olika stegen.
 id talar om vilket steg vi ska visa (övriga steg döljs då).
 Behavior har tre värden, change, vid klick på ändra-knappen, first, då funktionen körs onload och initierar
 nödvändiga parametrar samt tom sträng som betyder att man går till steg id. */
function disableAllSkickaToggleShow(id,behaviour) {

    document.getElementById("mailSent").style.display = "none";
    document.getElementById("sendingMail").style.display = "none";

    if (behaviour=="change"){
        updateChangeBtns(parseInt(id));
        hidetooltip("ttLayer1");
    } else {
        updateChangeBtns(id);
    }
    if (id == "1" && behaviour == "change") {
        setBackErrorTextStep2();
        stateCheap = null;
        clearFlash();
    }
    if (id <= 2 && behaviour == "change") {
        stateCheap = null;
        stateSelectedTimeOfArrival = null;
        stateDeliveryTimeFirstTime = true;
        deliveryTimeFirstTime = true;
    }

    if (id <= 3 && behaviour == "change") {
        statePnrStop = false;
        stateCheapFirst = true;
        stateSelectedServices = "";
    }

    document.getElementById("cmtBanner").style.display = "none";
    document.getElementById("postalErrorArea").style.display = "none";
    document.getElementById("fromPnrFlow2Text").style.color = "black";
    document.getElementById("toPnrFlow2Text").style.color = "black";
    var rubId = "skickaRub" + id;
    var rubSpanId = "skickaRubSpan" + id;
    var contentId = "skickaToggleShow" + id;
    var stepId = "step" + id;
    var divs = document.getElementsByTagName("div");
    var spans = document.getElementsByTagName("span");
    var theStyle = document.getElementById(contentId).style;

    for (var i=0; i<divs.length; i++) {
        if (divs[i].className.indexOf("menuSkickaguide") != -1) {
            divs[i].className = "menuSkickaguideDisabled";
        }
        if (divs[i].className.indexOf("menuContent") != -1 && divs[i].className.indexOf("menuContentFlash") == -1) {
                divs[i].style.display = "none";
        }
    }
    if (!(behaviour == "first" && id == "1")) {
        stateStep = id;
    }
    if (behaviour != "first" && id != "1") {

        if (id == "3" && behaviour == "change") {
            if(document.getElementById('typeOfService1').checked){
                hideDeliveryTimesArea();
            } else if (showPnrFrom || showPnrTo) {
                /* Till- och/eller Från-postnummer ska anges, visa ej listan med leveranstider */
                hideLastPartOfDeliveryTimesArea();
            }
        }

        if (id == 3) {
            document.getElementById("skickaToggleShow1").style.display = "none";
            toggleSWF(false);
        }
    }

    for (var j=0; j<spans.length; j++) {
        if (spans[j].className.indexOf("rubNum") != -1) {
            spans[j].className = "rubNumDisabled";
        }
        if (spans[j].className.indexOf("menuText") != -1) {
            spans[j].className = "menuTextDisabled";
        }
    }
    for(var a=1; a<id; a++){
        var theRubId     = "skickaRub" + a;
        var theRubSpanId = "skickaRubSpan" + a;
        var theStepId    = "step" + a;

        document.getElementById(theRubId).className = "menuSkickaguideVisited";
        document.getElementById(theRubSpanId).className = "rubNumVisited";
        document.getElementById(theStepId).className = "menuTextVisited";
    }

    document.getElementById(rubId).className = "menuSkickaguide";
    document.getElementById(rubSpanId).className = "rubNum";
    document.getElementById(stepId).className = "menuText";

    if (behaviour != "first"){
        for (var k=0; k < steps.length; k++) {
            var tmpStepId="step"+(k+1);

            if(k+1<id && document.getElementById(tmpStepId)){
                setStepAfterName(k);
                document.getElementById(tmpStepId).innerHTML = steps[k].afterName;
            }
            if (k+1==id && document.getElementById(stepId)){
                document.getElementById(stepId).innerHTML = steps[k].activeName;
            }
            if (k+1>id && document.getElementById(tmpStepId)){
                document.getElementById(tmpStepId).innerHTML = steps[k].beforeName;
            }
        }

    }

    document.getElementById("fromPnrFlow2").value = globalPnrFrom;
    document.getElementById("toPnrFlow2").value = globalPnrTo;

    if (document.getElementById("destinationWhileWaiting").style.display == 'none') {
        document.getElementById(contentId).style.display = 'block';
    }

    if (id == "1") {
        if(is_ie) document.getElementById("skickaToggleShow1").style.height = "30em"; else document.getElementById("skickaToggleShow1").style.height = "28em";
    }

    if (id == 2) {

        document.getElementById("toStep3ButtonDivId").style.display = 'block';
        document.getElementById("skickaToggleShow1").style.display = "none";

        getLimitations(stateDestinationId, stateAgreementCustomer);

        myFlashDiv = document.getElementById(contentId);
        myFlashDiv.style.margin=0; myFlashDiv.style.padding=0;

    }
    if(behaviour == "change"){
        stepFocus(parseInt(id));
    }
    document.getElementById(contentId).style.visibility = 'visible';
    document.getElementById('sendByMail').style.display = "none";

}

 /* Rensar dynamiska fält. */
 function clearDynamicFields() {
    if(document.getElementById("skickaToggleShowTest") != null) {
        document.getElementById("skickaToggleShowTest").innerHTML="";
    }
    if(document.getElementById("lastStepBox") != null) {
        document.getElementById("lastStepBox").innerHTML="";
    }
    if(document.getElementById("divShop") != null) {
        document.getElementById("divShop").innerHTML="";
    }
    if(document.getElementById("divPrint") != null) {
        document.getElementById('divPrint').style.display="none";
    }
 }

/* Visar elementet show samt döljer elementet hide. */
function showHideArea(show,hide) {
    if (show != "") {
        document.getElementById(show).style.display="block";
    }
    if (hide != "") {
        document.getElementById(hide).style.display="none";
    }
}

/* Sätter fokus på checkbox för tilläggstjänst additionalService tillhörande tjänsten service. */
function focusOnCheckbox(service, additionalService) {
    var chkBoxElem = "additionalServiceCheckbox"+additionalService+"service"+service;
    document.getElementById(chkBoxElem).focus();
}

/* Döljer/Visar elementet id. */
function toggle(id){
    var style = document.getElementById(id).style;
    if (style.display == 'block') {
        style.display = 'none';
    } else {
        style.display = 'block';
    }
}

/* Genererar dynamisk html för priser o leveranstider mm.
 myIndex är aktuell service. myDiv är id på containern där htmln skrivs ut.
 vat är en flagga för om vi har moms eller ej. */
function addSuggestionContentOne(myIndex,myDiv,vat) {
    var index=myIndex+"";
    var suggestionContent="<div class='resultLastStep clearFix'>\n<span style='float:left;width:28em;margin-right:5em;'><span class='resultLastStepText'>Posten rekommenderar:</span>";
    suggestionContent=suggestionContent+"<div id='resultMainInfo"+index+"' class='resultMainInfo' style='padding-top:0.5em;font-weight:normal;'></div>";
    suggestionContent=suggestionContent+"</span>";
    if(vat){
        suggestionContent=suggestionContent+"\n<span style='float:left;width:20em;'><div><b>Kostnaden inkl. moms:</b></div>";
    } else {
        suggestionContent=suggestionContent+"\n<span style='float:left;width:20em;'><div><b>Kostnad:</b></div>";
    }
    suggestionContent=suggestionContent+"<div id='resultMainPriceIncTax"+index+"' class='resultMainPriceIncTax'></div>";
    suggestionContent=suggestionContent+"<div id='resultMainPriceExTax"+index+"' class='resultMainPriceExTax'></div>";
    suggestionContent=suggestionContent+"<div class='timeOfDeliveryContainer'><div class='timeOfDeliveryText'>Leveranstid:</div><div id='timeOfDelivery"+index+"' class='timeOfDelivery'></div></div>";
    suggestionContent=suggestionContent+"<div id='handingIn"+index+"' class='handingIn'></div>";
    suggestionContent=suggestionContent+"<div id='bulky"+index+"' style='margin-top:2em;padding-bottom:1em;'></div>";
    suggestionContent=suggestionContent+"<div id='volumebased"+index+"' style='margin-top:2em;'></div></span></div>";

    document.getElementById(myDiv).innerHTML=suggestionContent;
}

/* Genererar dynamisk html för för priser och leveranstider mm när man valt att se fler alternativ och tilläggstjänster.
myIndex är aktuell service.  service är aktuell service
vat är en flagga för om vi har moms eller ej. */
function addSuggestionContentMore(myIndex, service, vat) {

    /*
        css class resultLastStep används på första träffen men resultLastStepAlt för alla övriga.
        För att huvudsakligen ändra border-color på övriga..
    */
    var additionalServicesArray = service.additionalServiceAdditionalInfos;

    var alternativeColorCSS = "";
    var alternativeText = "Posten rekommenderar:";
    if (myIndex != 0) {
        alternativeColorCSS = "Alt";
        alternativeText = "Alternativ:";
    }

    if (additionalServicesArray.length == 0) {
        var buttonAddSArea = "<span style='font-weight:bold;padding: 0.1em 1em 0.1em 0;'>Tjänsten saknar tilläggstjänster</span>";
    } else {
        var buttonAddSArea = "<input type='button' value='Visa tilläggstjänster' onclick='showHideArea(\"addarr"+myIndex+"\",\"resultMainbtn"+myIndex+"\");focusOnCheckbox("+myIndex+",0);' title='Visa tilläggstjänster' class='btnAdditionalServices' />";
    }

    var suggestionContent="<div class='resultLastStep"+alternativeColorCSS+" clearFix'>\n<div id='combinationErrorContainer"+myIndex+"' class='combinationError'>"+combinationErrorText+"</div>";
    suggestionContent=suggestionContent+"<span style='float:left;width:28em;margin-right:5em;'><span class='resultLastStepText'>"+alternativeText+"</span>";
    suggestionContent=suggestionContent+"<div id='resultMainInfo"+myIndex+"' class='resultMainInfo' style='padding-top:0.5em;font-weight:normal;'></div>";
    suggestionContent=suggestionContent+"<div id='resultMainbtn"+myIndex+"' class='resultMainbtn'>"+buttonAddSArea+"</div>";
    suggestionContent=suggestionContent+"<div id='addarr"+myIndex+"' class='clearFix' style='margin-top:0.5em; padding:0.5em; background-color:#D4E9FC; display:none;'>";
    suggestionContent=suggestionContent+"<div style='padding:0.2em 0 0.5em 0;font-weight:bold;'>Tilläggstjänster</div>";

    for(var i=0;i<additionalServicesArray.length;i++){
		suggestionContent=suggestionContent+"<div class='additionalSPadding'><input id='additionalServiceCheckbox"+i+"service"+myIndex+"' value='"+i+"' name='addCheck"+myIndex+"' type='checkbox' style='padding:0.2em;margin-right:0.8em;'/>";
		suggestionContent=suggestionContent+"<div id='additionalLink"+myIndex+"add"+i+"' onclick='toggle(\"additionalS"+myIndex+"add"+i+"\");' class='linkSpan' style='padding:0.2em;display:inline;'>"+additionalServicesArray[i].additionalService.name+"</div></div>";
        suggestionContent=suggestionContent+"<div id='additionalS"+myIndex+"add"+i+"' style='display:none;padding:0.5em;margin-left:1.6em;'>"+additionalServicesArray[i].additionalService.comment+"</div>";
    }

    suggestionContent=suggestionContent+"<div style='padding-top:0.5em; font-weight:bold; margin:0.5em 0 0.2em 6.5em;'>Uppdatera pris och leveranstid<input style='float:none;' onclick='calculatePriceAndDeliverytime("+myIndex+");' title='Uppdatera pris och leveranstid' class='buttonArrowTools' type='button' /></div>";
    suggestionContent=suggestionContent+"</div>";
    suggestionContent=suggestionContent+"</span>";

    if(vat){
        suggestionContent=suggestionContent+"\n<span style='float:left;width:20em;'><div><b>Kostnaden inkl. moms:</b></div>";
    } else {
        suggestionContent=suggestionContent+"\n<span style='float:left;width:20em;'><div><b>Kostnad:</b></div>";
    }

    suggestionContent=suggestionContent+"<div id='resultMainPriceIncTax"+myIndex+"' class='resultMainPriceIncTax'></div>";
    suggestionContent=suggestionContent+"<div id='resultMainPriceExTax"+myIndex+"' class='resultMainPriceExTax'></div>";
    suggestionContent=suggestionContent+"<div class='timeOfDeliveryContainer'><div class='timeOfDeliveryText'>Leveranstid:</div><div id='timeOfDelivery"+myIndex+"' class='timeOfDelivery'></div></div>";
    suggestionContent=suggestionContent+"<div id='handingIn"+myIndex+"' class='handingIn'></div>";
    suggestionContent=suggestionContent+"<div id='bulky"+myIndex+"' style='margin-top:2em;padding-bottom:1em;'></div>";
    suggestionContent=suggestionContent+"<div id='volumebased"+myIndex+"' style='margin-top:2em;'></div></span></div>";
    
    return suggestionContent;
}

/* Kontrollerar om kombinationen av valda tilläggstjänster är tillåten.
firstArr är en lista med valda tilläggstjänster. */
function isCombinationLegal(firstArr, secondArr){

    if(firstArr.length != secondArr.length){
        return false;
    }
    for(var i=0; i<firstArr.length; i++){
        if(firstArr[i] != secondArr[i]){
            return false;
        }
    }
    return true;
}

/* Markerar felaktig kombination av tilläggstjänster.
 myIndex är aktuell tjänst. chosenAddServices är en lista med valda tilläggstjänster. */
function writeError(myIndex,chosenAddServices) {
    document.getElementById("combinationErrorContainer"+myIndex).style.display = "block";
    for (var i=0; i<chosenAddServices.length; i++) {
        document.getElementById("additionalLink"+myIndex+"add"+chosenAddServices[i]).style.color = "#C10000";//"#031c52";
    }
}

/* Tar bort felmarkering för tilläggstjänster.
 myIndex är aktuell tjänst. numberOfadditionalServices är antalet tilläggstjänster. */
function removeErrorFormat(myIndex,numberOfadditionalServices) {
    document.getElementById("combinationErrorContainer"+myIndex).style.display = "none";
    for (var i=0; i<numberOfadditionalServices; i++) {
        document.getElementById("additionalLink"+myIndex+"add"+i).style.color = "black";//"#031c52";
    }
}

/* Skriver ut pris och leveranstid för den valda kombinationen tilläggstjänster förutsatt att den är legal (tillåten).
 baseIndex är aktuell tjänst och matchingIndex är det index i legalCombinationsOfAdditionalServices som matchar den valda kombinationen tilläggstjänster. */
function writePriceAndDeliveryTime(baseIndex, matchingIndex) {

    var newPriceAddition = 0;
    var newPriceAdditionIncTax = 0;
    var addIncTax = 0;
    var tax;

    var newPriceExTax           = servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[baseIndex].legalCombinationsOfAdditionalServices[matchingIndex].priceExclTax;
    var newPriceInclTax         = servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[baseIndex].legalCombinationsOfAdditionalServices[matchingIndex].priceInclTax;
    var newPriceExTaxAsString   = servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[baseIndex].legalCombinationsOfAdditionalServices[matchingIndex].priceExclTaxAsString;
    var newPriceInclTaxAsString = servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[baseIndex].legalCombinationsOfAdditionalServices[matchingIndex].priceInclTaxAsString;
    var newDeliveryTime         = servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[baseIndex].legalCombinationsOfAdditionalServices[matchingIndex].deliveryTime.deliveryTimeAsString;

    document.getElementById("resultMainPriceExTax"+baseIndex).innerHTML = "("+newPriceExTaxAsString+" exkl. moms)";
    document.getElementById("resultMainPriceIncTax"+baseIndex).innerHTML = " "+newPriceInclTaxAsString;
    document.getElementById("timeOfDelivery"+baseIndex).innerHTML = newDeliveryTime;
}

/* Räknar ut pris och leveranstid för myIndex.
  myindex är aktuell tjänst */
function calculatePriceAndDeliverytime(myIndex) {

    var newPrice = 0;
    var chosenAddServices = new Array();
    var checkboxes = document.getElementsByName("addCheck"+myIndex);
    var indexCounter = 0;

    for(var i = 0; i < checkboxes.length; i++) {
        if(checkboxes[i].checked == true) {
            chosenAddServices[indexCounter] = i;
            indexCounter++;
        }
    }

    if(servicesInclPriceAnswerCopy.baseServiceAdditionalInfos != null) {

        var isAnyCombinationLegal = false;
        var matchingIndex = -1;

        for(var i=0; i<servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[myIndex].legalCombinationsOfAdditionalServices.length;i++) {
            if(isCombinationLegal(chosenAddServices,servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[myIndex].legalCombinationsOfAdditionalServices[i].indexOfAdditionalServices)){
                isAnyCombinationLegal = true;
                matchingIndex = i;
            }
        }
        if(isAnyCombinationLegal){
            removeErrorFormat(myIndex,checkboxes.length);
            writePriceAndDeliveryTime(myIndex, matchingIndex);
        } else {
            removeErrorFormat(myIndex,checkboxes.length);
            writeError(myIndex,chosenAddServices);
        }
        var service = servicesInclPriceAnswerCopy.baseServiceAdditionalInfos[myIndex];
        if (service.baseService.id.indexOf("1a_klass") != - 1 && service.bulkyCalculatedPrice) {
            handleBulkyText(myIndex);
        }
    }
}

/* Anropar getServicesInclPricePerCategory() med parametrar. */
function callGetServicesInclPricePerCategory(pnrFrom,pnrTo) {
    getServicesInclPricePerCategory(stateDestinationId, stateAgreementCustomer, stateFranko, parseInt(stateWeight), parseInt(stateLength*10), parseInt(stateWidth*10), parseInt(stateHeight*10), parseInt(stateDiameter*10), pnrFrom, pnrTo);
}

/* Rensar dynamiska fält samt anropar getAllServicesInclPrice() med parametrar. */
function callGetAllServicesInclPrice(pnrFrom,pnrTo) {
    clearDynamicFields();
    document.getElementById("cmtBanner").style.display = "none";
    getAllServicesInclPrice(stateDestinationId, stateAgreementCustomer, stateFranko, parseInt(stateWeight), parseInt(stateLength*10), parseInt(stateWidth*10), parseInt(stateHeight*10), parseInt(stateDiameter*10), pnrFrom, pnrTo);
}

/* Formaterar postnummer och anropar callGetServicesInclPricePerCategory() eller callGetAllServicesInclPrice().
 isPerCategory är true om vi har valt flödet, "billigaste".
 pfrom, avsändarpostnummer, pto, mottagarpostnummer. */
function callService(isPerCategory,pfrom,pto) {
    if (pfrom!=null) {
        pfrom = trimItAll(pfrom.toString());
    }
    if (pto!=null) {
        pto = trimItAll(pto.toString());
    }
    setGlobalPostalNumbers("pnrFrom","pnrTo");

    if (isPerCategory) {
        callGetServicesInclPricePerCategory(pfrom,pto);
    } else {
        callGetAllServicesInclPrice(pfrom,pto);
    }
}

/* Presenterar dynamisk html rörande postnummer i "billigaste"-flödet.
 isPerCategory anger om bara billigaste är aktuellt.
 returnCode är den returkod vi får av prissättningstjänsten.
 myErrorText är felmeddelandetexten som vi får från prissättningstjänsten.
 myContentDiv är elementet där den genererade htmln ska appliceras.
 text är en rubriktext över postnummerfälten.
 informationAboutSenderReceiver är ett, två eller tre beroende på om avsändarpostnummer, mottagarpostnummer eller båda krävs.
 inputInformationAboutSender är avsändarpostnummer.
 inputInformationAboutReceiver är mottagarpostnummer. */
function addAlternativeContent(isPerCategory,returnCode,myErrorText,myContentDiv,text,informationAboutSenderReceiver, inputInformationAboutSender, inputInformationAboutReceiver) {
    document.getElementById(myContentDiv).style.display="block";
    var altContent = ""; var isError = false; var pnrFromError = false; var pnrToError = false;

    var errMsg = (myErrorText != null && myErrorText != "")?myErrorText:"";

    if (returnCode >= 101 && returnCode <= 103) {
        isError = true;
        errMsg = (errMsg=="")?"Postnummer saknas eller har fel format.":errMsg;
    } else if ((returnCode >= 104 && returnCode <= 105) || returnCode == 110) {
        isError = true;
        errMsg = (errMsg=="")?"Du måste ange postnummer.":errMsg;
    } else if (returnCode >= 106 && returnCode <= 108) {
        isError = true;
        errMsg = (errMsg=="")?"Felaktigt postnummer":errMsg;
    }

    var tmpInfoSender = inputInformationAboutSender;
    var tmpInfoReceiver = inputInformationAboutReceiver;
    if (tmpInfoSender==null) {tmpInfoSender=""}
    if (tmpInfoReceiver==null) {tmpInfoReceiver=""}

    if (tmpInfoSender=="") {
        tmpInfoSender = globalPnrFrom;
    }
    if (tmpInfoReceiver=="") {
        tmpInfoReceiver = globalPnrTo;
    }

    if (informationAboutSenderReceiver >= 1 && informationAboutSenderReceiver <=3){
        statePnrStop = true;
    }

    if (informationAboutSenderReceiver == 1) { /* avsändarpostnummer efterfrågas. */
        if (isError) {
            altContent=altContent+"<div class=\"displayError\">"+errMsg+"</div>";
        }
        altContent=altContent+"<div style='padding:0.5em;'><b>"+text+"</b></div>";
        altContent=altContent+"<div style='padding:0.5em;'>För att kunna visa prisalternativ för din försändelse måste du fylla i vilket postnummer som du vill skicka ifrån.</div>";
        altContent=altContent+"<div class='clearFix'>";
        if (returnCode==101 || returnCode==102 || returnCode==104 || returnCode==106 || returnCode==107 || returnCode==110) {
            altContent=altContent+"<span style='padding:0.5em;color:#C10000;font-weight:bold;'>Från postnummer</span>";
            pnrFromError = true;
        } else {
            altContent=altContent+"<span style='padding:0.5em;'><b>Från postnummer</b></span>";
        }
        altContent=altContent+"<input type='text' alt='postnummer' maxlength='6' id='pnrFrom' value='"+tmpInfoSender+"' />";
        if (inputInformationAboutReceiver==null) {
            altContent=altContent+"<span class='toolsButton' style='float:none;'><input value='' onclick='callService("+isPerCategory+",document.getElementById(\"pnrFrom\").value,null);' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        } else {
            altContent=altContent+"<span class='toolsButton' style='float:none;'><input value='' onclick='callService("+isPerCategory+",document.getElementById(\"pnrFrom\").value,\""+inputInformationAboutReceiver+"\");' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        }
        altContent=altContent+"</div>";
        isError = true;

    } else if(informationAboutSenderReceiver == 2) { /* mottagarpostnummer efterfrågas. */
        if (isError) {
            altContent=altContent+"<div class=\"displayError\">"+errMsg+"</div>";
        }
        altContent=altContent+"<div style='padding:0.5em;'><b>"+text+"</b></div>";
        altContent=altContent+"<div style='padding:0.5em;'>För att kunna visa prisalternativ för din försändelse måste du fylla i vilket postnummer som du vill skicka till.</div>";
        altContent=altContent+"<div class='clearFix'>";
        if (returnCode==101 || returnCode==103 || returnCode==105 || returnCode==106 || returnCode==108 || returnCode==110) {
            altContent=altContent+"<span style='padding:0.5em;color:#C10000;font-weight:bold;'>Till postnummer</span>";
            pnrToError = true;
        } else {
            altContent=altContent+"<span style='padding:0.5em;'><b>Till postnummer</b></span>";
        }
        altContent=altContent+"<input type='text' alt='postnummer' maxlength='6' id='pnrTo' value='"+tmpInfoReceiver+"' />";
        if (inputInformationAboutSender==null) {
            altContent=altContent+"<span class='toolsButton' style='float:none;'><input value='' onclick='callService("+isPerCategory+",null,document.getElementById(\"pnrTo\").value);' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        } else {
            altContent=altContent+"<span class='toolsButton' style='float:none;'><input value='' onclick='callService("+isPerCategory+",\""+inputInformationAboutSender+"\",document.getElementById(\"pnrTo\").value);' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        }
        altContent=altContent+"</div>";

        isError = true;

    } else if(informationAboutSenderReceiver == 3) { /* avsändar- och mottagarpostnummer efterfrågas. */
        if (isError) {
            altContent=altContent+"<div class=\"displayError\">"+errMsg+"</div>";
        }
        altContent=altContent+"<div style='padding:0.5em;'><b>"+text+"</b></div>";
        altContent=altContent+"<div style='padding:0.5em;'>För att kunna visa prisalternativ för din försändelse måste du fylla i vilka postnummer som du vill skicka ifrån och till.</div>";
        altContent=altContent+"<div class='clearFix'>";
        if (returnCode==101 || returnCode==102 || returnCode==104 || returnCode==106 || returnCode==107 || returnCode==110) {
            altContent=altContent+"<span style='padding:0.5em;color:#C10000;font-weight:bold;'>Från postnummer</span>";
            pnrFromError = true;
        } else {
            altContent=altContent+"<span style='padding:0.5em;'><b>Från postnummer</b></span>";
        }
        altContent=altContent+"<input type='text' alt='postnummer' maxlength='6' id='pnrFrom' value='"+tmpInfoSender+"' />";
        if (returnCode==101 || returnCode==103 || returnCode==105 || returnCode==106 || returnCode==108 || returnCode==110) {
            altContent=altContent+"<span style='padding:0.5em;color:#C10000;font-weight:bold;'>till postnummer</span>";
            pnrToError = true;
        } else {
            altContent=altContent+"<span style='padding:0.5em;'><b>till postnummer</b></span>";
        }
        altContent=altContent+"<input type='text' alt='postnummer' maxlength='6' id='pnrTo' value='"+tmpInfoReceiver+"' />";
        altContent=altContent+"<span class='toolsButton' style='float:none;'><input value='' onclick='callService("+isPerCategory+",document.getElementById(\"pnrFrom\").value,document.getElementById(\"pnrTo\").value);' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        altContent=altContent+"</div>";

        isError = true;

    } else { /* Ingen mer info krävs, presentera bara fråga om att se allt */
        altContent=altContent+"<span><b>Visa fler alternativ och tilläggstjänster</b></span>";
        if (inputInformationAboutSender==null && inputInformationAboutReceiver==null) {
            altContent=altContent+"<span id='toolsButtonStep3' class='toolsButton' style='float:none;'><input value=''  onclick='callGetAllServicesInclPrice(null,null);' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        } else {                   
            altContent=altContent+"<span id='toolsButtonStep3' class='toolsButton' style='float:none;'><input value=''  onclick='callGetAllServicesInclPrice(\""+inputInformationAboutSender+"\",\""+inputInformationAboutReceiver+"\");' title='Visa fler alternativ' class='buttonArrowTools' type='button'></span>";
        }
    }
    document.getElementById(myContentDiv).innerHTML=altContent;
    if (!isError) {
        document.getElementById('divPrint').style.display = "block";
    }

    if (informationAboutSenderReceiver == 1 || informationAboutSenderReceiver == 3) {
        if (informationAboutSenderReceiver == 3 && !pnrFromError && pnrToError) {
            document.getElementById("pnrTo").focus();
        } else {
            document.getElementById("pnrFrom").focus();
        }
    } else if (informationAboutSenderReceiver == 2) {
        document.getElementById("pnrTo").focus();
    } else {
        document.getElementById("toolsButtonStep3").focus();
    }
}

/* Visar respektive döljer texter om tjänsterna. */
function toggleMoreInfoShow(show,hide) {
    if(show.indexOf("showDescription") != -1){
        document.getElementById(show).style.display = "block";
        document.getElementById(hide).style.visibility = "hidden";
    } else {
        document.getElementById(hide).style.display = "none";
        document.getElementById(show).style.visibility = "visible";
    }
}

/* Genererar läs-mer-text med tillhörande länkar. */
function getMoreInfoLink(descriptionText,index) {
    var tmpStr = "";
    tmpStr=tmpStr+"&nbsp;<a id='lblMoreInfo"+index+"' href='javascript:toggleMoreInfoShow(\"showDescription"+index+"\",\"lblMoreInfo"+index+"\");document.getElementById(\"lblHideInfo"+index+"\").focus();'>Läs&nbsp;mer</a>";
    tmpStr=tmpStr+"<div id='showDescription"+index+"' style='display: none;'>";
    tmpStr=tmpStr+"<div class='descriptionText'>";
    tmpStr=tmpStr+descriptionText;
    tmpStr=tmpStr+"</div>";
    tmpStr=tmpStr+"<a id='lblHideInfo"+index+"' href='javascript:toggleMoreInfoShow(\"lblMoreInfo"+index+"\",\"showDescription"+index+"\");document.getElementById(\"lblMoreInfo"+index+"\").focus();'>Dölj info</a>";
    tmpStr=tmpStr+"</div>";

    return tmpStr;
}

/* Lägger till option till selectlista. */
function insertOption(theSelect, theValue, theText) {
    var y = document.createElement('option');
    var x = document.getElementById(theSelect);

    y.text=theText;
    y.value=theValue;
    try {
        x.add(y, null);
    } catch(e) {
        x.add(y); /* IE */
    }
}

/* Tar bort samtliga options för selectlistan id. */
function clearOptions(id) {
    var x = document.getElementById(id);
    while (x.length>0) {
        x.remove(x.length-1);
    }
}

/* Döljer ändra-knappar för steg efter steg currentStep. */
function updateChangeBtns(currentStep) {
    for (var i=1; i <= totalNumOfSteps; i++) {
        if (i < currentStep) {
            document.getElementById("changeBtn"+i).style.visibility = "visible";
        } else {
            document.getElementById("changeBtn"+i).style.visibility = "hidden";
        }
    }
}

/* Döljer vissa element i leveranstidsflödet. */
function hideLastPartOfDeliveryTimesArea() {
    document.getElementById("deliveryTimesArea2").style.display = "none";
    document.getElementById("continueBtnToStep3").style.display = "none";
}

/* Döljer samtliga element i leveranstidsflödet. */
function hideDeliveryTimesArea() {
    stateDeliveryTimeFirstTime = true;
    deliveryTimeFirstTime = true;
    document.getElementById("deliveryTimesArea1").style.display = "none";
    document.getElementById("deliveryTimesArea2").style.display = "none";
    if (is_ie) {
        document.getElementById("continueBtnToStep3").style.width = "100%";
        document.getElementById("continueBtnToStep3").style.marginBottom = "2em";
    }
    document.getElementById("continueBtnToStep3").style.display = "block";
    document.getElementById("postalErrorArea").style.display = "none";
    document.getElementById("fromPnrFlow2Text").style.color = "black";
    document.getElementById("toPnrFlow2Text").style.color = "black";
}

/* Visar väntemeddelande vid hämtning av leveranstider. */
function showSecondDeliveryTimesAreaBeforeAnswer() {

    document.getElementById("deliveryTimesArea2").style.display = "none";
    document.getElementById("deliveryTimesWhileWaiting").style.display = "block";
    document.getElementById("postalErrorArea").style.display = "none";
    document.getElementById("fromPnrFlow2Text").style.color = "black";
    document.getElementById("toPnrFlow2Text").style.color = "black";

}

/* Visar selectlista med leveranstider. */
function showSecondDeliveryTimesAreaAfterAnswer() {
    document.getElementById("deliveryTimesWhileWaiting").style.display = "none";
    document.getElementById("deliveryTimesArea2").style.display = "block";
    if (is_ie) {
        document.getElementById("continueBtnToStep3").style.width = "100%";
        document.getElementById("continueBtnToStep3").style.marginBottom = "2em";
    }
    document.getElementById("continueBtnToStep3").style.display = "block";
}

/* Tooltip-funktionalitet, används vid de tvingande tilläggstjänsterna. (checkboxar) */
var toolTipMsg = new Array;
toolTipMsg[0] = "Denna tilläggstjänst går inte att välja bort. <a href='javascript:void(0);' onclick='hidetooltip(\"ttLayer1\");' title='Stäng inforutan'>Stäng</a>";
toolTipMsg[1] = "Sverige är redan valt. Vill du skicka din försändelse utomlands? Välj land nedan. <a href='javascript:void(0);' onclick='hidetooltip(\"ttLayer2\");' title='Stäng inforutan'>Stäng</a>";

/* Tillhandahåller tooltipfunktionalitet. */
function showtooltip(c,no,x,y,layer) {
    if (document.getElementById) {
        ttLayerObj = document.getElementById(layer);
        ttLayerObj.innerHTML=toolTipMsg[no];
        ttLayerObj.style.height=c.style.height;
        var objPosition = findPos(c);
        var xPos = parseInt(objPosition[0]+x);
        var yPos = parseInt(objPosition[1]+y);
        ttLayerObj.style.left=xPos+"px";
        ttLayerObj.style.top=yPos+"px";
        ttLayerObj.style.display = "block";
    }
}

/* Döljer elementet layer. */
function hidetooltip(layer) {
    if(document.getElementById) {
        document.getElementById(layer).style.display="none";
    }
}

/* Visar tooltip för elem. */
function checkboxCheck(elem){
    if(elem != null){
        elem.checked = true;
        showtooltip(elem,'1',25,-10,'ttLayer2');
    }
}

/* Sätter stateFranko till checkboxens markeringsstatus. */
function setFrankoState() {
    stateFranko = document.getElementById("franko").checked;
}

/* Hanterar destinationsval i steg 1. */
function selectDestination(id) {

    /* Avmarkerar alla destinationer förutom vald destination */
    if (id == 'swedenId') {
        var elemSweden = document.getElementById('swedenId');
        /* Checkboxen för Sverige är markerad */
        if (document.getElementById('europeId') && document.getElementById('europeId').disabled == false) {
            document.getElementById('europeId').selectedIndex = '0';
        }
        if (document.getElementById('notEuropeId') && document.getElementById('notEuropeId').disabled == false) {
            document.getElementById('notEuropeId').selectedIndex = '0';
        }
        stateDestinationId = elemSweden.value;
        stateDestinationName = 'Sverige';
        if (!elemSweden.checked) {
            checkboxCheck(elemSweden);
        }

    } else if (id == 'europeId') {
        /* Val har gjorts i listan för 'Utanför Sverige men inom Europa' */
        hidetooltip("ttLayer2");
        if (document.getElementById('swedenId') && document.getElementById('swedenId').disabled == false) {
            document.getElementById('swedenId').checked = false;
        }
        if (document.getElementById('notEuropeId') && document.getElementById('notEuropeId').disabled == false) {
            document.getElementById('notEuropeId').selectedIndex = '0';
        }
        stateDestinationId = document.getElementById('europeId').selectedIndex != 0 ? document.getElementById('europeId').value : '';
        stateDestinationName = document.getElementById('europeId').selectedIndex != 0 ? document.getElementById('europeId').options[document.getElementById('europeId').selectedIndex].text : '';

        if(stateDestinationId==''){
            document.getElementById('europeId').selectedIndex = oldDestinationEuropeSelectedIndex;
            document.getElementById('europeId').value = oldStateEuropeDestinationId;
            document.getElementById('europeId').options[document.getElementById('europeId').selectedIndex].text = oldStateEuropeDestinationName;
            stateDestinationId = oldStateEuropeDestinationId;
            stateDestinationName = oldStateEuropeDestinationName;
        }
        oldDestinationEuropeSelectedIndex = document.getElementById('europeId').selectedIndex;
        oldStateEuropeDestinationId = document.getElementById('europeId').value;
        oldStateEuropeDestinationName = document.getElementById('europeId').options[document.getElementById('europeId').selectedIndex].text;

    } else if (id == 'notEuropeId') {
        /* Val har gjorts i listan för 'Utanför Europa' */
        hidetooltip("ttLayer2");
        if (document.getElementById('swedenId') && document.getElementById('swedenId').disabled == false) {
            document.getElementById('swedenId').checked = false;
        }
        if (document.getElementById('europeId') && document.getElementById('europeId').disabled == false) {
            document.getElementById('europeId').selectedIndex = '0';
        }
       stateDestinationId = document.getElementById('notEuropeId').selectedIndex != 0 ? document.getElementById('notEuropeId').value : '';
       stateDestinationName = document.getElementById('notEuropeId').selectedIndex != 0 ? document.getElementById('notEuropeId').options[document.getElementById('notEuropeId').selectedIndex].text : '';

        if(stateDestinationId==''){
            document.getElementById('notEuropeId').selectedIndex = oldDestinationNotEuropeSelectedIndex;
            document.getElementById('notEuropeId').value = oldStateNotEuropeDestinationId;
            document.getElementById('notEuropeId').options[document.getElementById('notEuropeId').selectedIndex].text = oldStateNotEuropeDestinationName;
            stateDestinationId = oldStateNotEuropeDestinationId;
            stateDestinationName = oldStateNotEuropeDestinationName;
        }
        oldDestinationNotEuropeSelectedIndex = document.getElementById('notEuropeId').selectedIndex;
        oldStateNotEuropeDestinationId = document.getElementById('notEuropeId').value;
        oldStateNotEuropeDestinationName = document.getElementById('notEuropeId').options[document.getElementById('notEuropeId').selectedIndex].text;
    }
}

/* Togglar visning mellan visat resultat och mailformulär. */
function toggleSendByMail(){
   document.getElementById('sendingMail').style.display = 'none';
   document.getElementById('mailSent').style.display = 'none';

   if (document.getElementById('skickaToggleShow4').style.display == "none") {
       document.getElementById('skickaToggleShow4').style.display = "block";
       document.getElementById('sendByMail').style.display = "none";
   } else {
       document.getElementById('skickaToggleShow4').style.display = "none";
       document.getElementById('sendByMail').style.display = "block";
   }
}

/* Validerar mailformuläret (klientvalidering) och mailar. */
function checkMail(){
    var va = new Validator();
    var er = new ErrorRenderer();
    if (va.isEmpty(document.getElementById('sendername'))) {
        va.addError(new Error('sendernameError','Här ska du ange ditt namn'));
    }
    if (va.isEmpty(document.getElementById('senderemail'))) {
        va.addError(new Error('senderemailError','Här ska du ange din e-postadress'));
    } else if (!va.checkEmail(document.getElementById('senderemail').value)) {
        va.addError(new Error('senderemailError','Kontrollera din e-postadress'));
    }
    if (va.isEmpty(document.getElementById('receivername'))) {
        va.addError(new Error('receivernameError','Här ska du ange mottagarens namn'));
    }
    if (va.isEmpty(document.getElementById('receiveremail'))) {
        va.addError(new Error('receiveremailError','Här ska du ange mottagarens e-postadress'));
    } else if (!va.checkEmail(document.getElementById('receiveremail').value)) {
        va.addError(new Error('receiveremailError','Kontrollera mottagarens e-postadress'));
    }
    if (document.getElementById('messagetoreceiver').value.length > 300) {
        va.addError(new Error('messagetoreceiverError','Meddelandet får var max 300 tecken långt'));
    }
     if (er.displayErrors(va.getErrors())) {
         var resultURL = makeURL();
         var textBody = mailBody(document.getElementById('sendername').value,document.getElementById('senderemail').value, document.getElementById('messagetoreceiver').value, resultURL, false);
         var htmlBody = mailBody(document.getElementById('sendername').value,document.getElementById('senderemail').value, document.getElementById('messagetoreceiver').value, resultURL, true);
         document.getElementById('sendByMail').style.display = 'none';
         document.getElementById('sendingMail').style.display = 'block';

         sendVelocityMail(document.getElementById("receiveremail").value, null, "Tips från Postens Skickaguide", resultURL, document.getElementById("sendername").value, document.getElementById("messagetoreceiver").value, textBody, htmlBody);
     }
}

/* Skapar URL med parametrar baserat på state (statevariablerna) just nu. */
function makeURL () {
    createParameterAdditionalServicesCheckBoxes();
    var url = 'http://' + serverName + '/skickaguiden/main_do.jsp?';

    if (state != null && state != '' && state != 'null') {
        url += 'state='+state+"&";
    }
    if (stateStep != null && stateStep != '' && stateStep != 'null') {
        url += 'step='+stateStep+"&";
    }
    if (stateCylinder != null && stateCylinder != '' && stateCylinder != 'null') {
        url += 'cylinder='+stateCylinder+"&";
    }
    if (stateAgreementCustomer != null && stateAgreementCustomer != 'null') {
        url += 'agreementCustomer='+stateAgreementCustomer+"&";
    }
    if (stateFranko != null && stateFranko != 'null') {
        url += 'franko='+stateFranko+"&";
    }
    if (stateWeight != null && stateWeight != '' && stateWeight != -1) {
        url += 'weight='+stateWeight+"&";
    }
    if (stateWeightUnit != null && stateWeightUnit != '' && stateWeightUnit  != 'null') {
        url += 'weightUnit='+stateWeightUnit+"&";
    }
    if (stateLength != null && stateLength != '' && stateLength != -1) {
        url += 'length='+stateLength+"&";
    }
    if (stateWidth != null && stateWidth != '' && stateWidth != -1 && stateWidth != 'null') {
        url += 'width='+stateWidth+"&";
    }
    if (stateHeight != null && stateHeight != '' && stateHeight != -1 && stateHeight != 'null') {
        url += 'height='+stateHeight+"&";
    }
    if (stateDiameter != null && stateDiameter != '' && stateDiameter != -1 && stateDiameter != 'null') {
        url += 'diameter='+stateDiameter+"&";
    }
    if (stateDestinationId != null && stateDestinationId != '' && stateDestinationId != 'null') {
        url += 'destinationId='+stateDestinationId+"&";
    }
    if (stateDestinationName != null && stateDestinationName != '' && stateDestinationName != 'null') {
        url += 'destinationName='+encodeHTML(stateDestinationName)+"&";
    }
    if (stateCheap != null && stateCheap != 'null') {
        url += 'cheap='+stateCheap+"&";
    }
    if (stateCheapFirst != null && stateCheapFirst != 'null') {
        url += 'cheapFirst='+stateCheapFirst+"&";
    }
    if (stateDeliveryTimeDays != null && stateDeliveryTimeDays != '' && stateDeliveryTimeDays != 'null') {
        url += 'deliveryTimeDays='+stateDeliveryTimeDays+"&";
    }
    if (stateDeliveryTimeHour != null && stateDeliveryTimeHour != '' && stateDeliveryTimeHour != 'null') {
        url += 'deliveryTimeHour='+stateDeliveryTimeHour+"&";
    }
    if (stateSaturday != null && stateSaturday != '' && stateSaturday != 'null') {
        url += 'saturday='+stateSaturday+"&";
    }
    if (stateDeliveryTimeAsString != null && stateDeliveryTimeAsString != '' && stateDeliveryTimeAsString != 'null') {
        url += 'deliveryTimeAsString='+encodeHTML(stateDeliveryTimeAsString)+"&";
    }
    if (stateDeliveryTimeFirstTime != null && stateDeliveryTimeFirstTime != '' && stateDeliveryTimeFirstTime != 'null') {
        url += 'deliveryTimeFirstTime='+stateDeliveryTimeFirstTime+"&";
    }
    if (stateInformationAboutSender != null && stateInformationAboutSender != '' && stateInformationAboutSender != 'null') {
        url += 'informationAboutSender='+stateInformationAboutSender+"&";
    }
    if (stateInformationAboutReceiver != null && stateInformationAboutReceiver != '' && stateInformationAboutReceiver != 'null') {
        url += 'informationAboutReceiver='+stateInformationAboutReceiver+"&";
    }
    if (stateSelectedTimeOfArrival != null && stateSelectedTimeOfArrival != '' && stateSelectedTimeOfArrival != 'null') {
        url += 'selectedTimeOfArrival='+stateSelectedTimeOfArrival+"&";
    }
    if (stateSelectedServices != null && stateSelectedServices != '' && stateSelectedServices != 'null') {
        url += 'selectedServices='+stateSelectedServices+"&";
    }
    return url.substring(0,url.length - 1);
}

/* Fixar till svenska tecken.. */
function encodeHTML(str) {
      str = str.replace(/[å]+/g, "%E5");
      str = str.replace(/[Å]+/g, "%C5");
      str = str.replace(/[ä]+/g, "%E4");
      str = str.replace(/[Ä]+/g, "%C4");
      str = str.replace(/[ö]+/g, "%F6");
      str = str.replace(/[Ö]+/g, "%D6");
      return str;
}

/* Skapar mailbody med eller utan html. Html-varianten används bara om velocitymailet går snett. */
function mailBody (senderName, senderMail, senderMessage, url, html) {
    var theBody = "";
    if (html) {
        theBody += "<html><body>";
        theBody += "<b>Hej!</b><br/><br/>";
        theBody += senderName + " vill tipsa dig om en av Postens tjänster. Så här skriver " + senderName + ":<br/><br/>";
        theBody += senderMessage + "<br/><br/>";
        theBody += "Om du kopierar adressen nedan och går mot den i din webbläsare, så kommer du till Posten.se och den sida i Skickaguiden som " + senderName + " vill att du ska ta del av. "
        theBody += "Tänk på att de priser och leveranstider som du hittar där är de som gäller när den här e-posten skickas, de kan komma att ändras.<br/><br/>";
        theBody += "<a href=\"" + url + "\" title=\"Visa sökning\">Klicka här</a>";
        theBody += "</body></html>";
    } else {
        theBody += "Hej!\n\n";
        theBody += senderName + " vill tipsa dig om en av Postens tjänster. Så här skriver " + senderName + ":\n\n";
        theBody += senderMessage + "\n\n";
        theBody += "Om du kopierar adressen nedan och går mot den i din webbläsare, så kommer du till Posten.se och den sida i Skickaguiden som " + senderName + " vill att du ska ta del av. "
        theBody += "Tänk på att de priser och leveranstider som du hittar där är de som gäller när den här e-posten skickas, de kan komma att ändras.\n\n";
        theBody += url;
    }
    return theBody;
}

/* Hanterar informationsstexten för skrymmande. Endast för 1:a-klassbrev */
function handleBulkyText(myIndex) {
    var checkboxes = document.getElementsByName("addCheck"+myIndex);

    /* Skrymmandetexten ska ej visas när tilläggstjänster som matchar villkoret nedan har markerats */
    var regexp = /^Expressbrev|Rek|Postförskott/;
	var found = false;

    for(var i = 0; i < checkboxes.length; i++) {
        var additionalServiceName = document.getElementById(additionalServiceName = "additionalLink"+myIndex+"add"+i).innerHTML;
        if(checkboxes[i].checked == true && regexp.test(additionalServiceName)) {
            found = true;
            document.getElementById('bulky'+myIndex).style.visibility = 'hidden';
            break;
        }
    }
    if (!found) {
        document.getElementById('bulky'+myIndex).style.visibility = 'visible';
    }
}

/*  Hanterar felmeddelanden för postnummer
    retCode Felkod
    myErrorText Felmeddelande från prissättningssjänsten. Om det saknas används de "lokala" feltexterna från denna funktion.
*/
function showPostalNumberError(retCode,myErrorText) {
    document.getElementById("deliveryTimesWhileWaiting").style.display = "none";
    document.getElementById("postalErrorArea").style.display = "block";
    if (retCode >= 101 && retCode <= 103) {
        if(myErrorText != null && myErrorText != ""){
            document.getElementById("postalErrorArea").innerHTML = myErrorText;
        } else {
            document.getElementById("postalErrorArea").innerHTML = "Postnummer saknas eller har fel format.";
        }
    } else if ((retCode >= 104 && retCode <= 105) || retCode == 110) {
        if(myErrorText != null && myErrorText != ""){
            document.getElementById("postalErrorArea").innerHTML = myErrorText;
        } else {
            document.getElementById("postalErrorArea").innerHTML = "Du måste ange postnummer.";
        }
    } else if (retCode >= 106 && retCode <= 108) {
        if(myErrorText != null && myErrorText != ""){
            document.getElementById("postalErrorArea").innerHTML = myErrorText;
        } else {
            document.getElementById("postalErrorArea").innerHTML = "Felaktigt postnummer";
        }
    }

    var fromPostnr = document.getElementById("fromPnrFlow2");
    var toPostnr = document.getElementById("toPnrFlow2");
    var fromPostnrText = document.getElementById("fromPnrFlow2Text");
    var toPostnrText = document.getElementById("toPnrFlow2Text");

    if (retCode == 101 || retCode == 106 || retCode == 110 || retCode == 103 || retCode == 105 || retCode == 108) {
        toPostnrText.style.color = "#CE0000"; toPostnr.focus();
    }
    if (retCode == 101 || retCode == 106 || retCode == 110 || retCode == 102 || retCode == 104 || retCode == 107) {
        fromPostnrText.style.color = "#CE0000"; fromPostnr.focus();
    }
}

function avtalskundClicked() {
    var akInput = document.getElementById("avtalskund");
    var frankoInput = document.getElementById("franko");

    if (!akInput.checked && !frankoInput.checked) {
        frankoInput.checked = true;
        setFrankoState();
    }
}

function frankoClicked() {
    var akInput = document.getElementById("avtalskund");
    var frankoInput = document.getElementById("franko");

    if (!akInput.checked && !frankoInput.checked) {
        akInput.checked = true;
        toggleMinMaxValuesInFlash();
    }
}

