﻿// JavaScript Document
<!--

/*
   Program for kalkulering av priser for kaiplass ved Bergen Havn.
   Prisene er pr. 1.9.2002.
   Programmet er (c) Delfi Data. All uautorisert kopiering forbudt.

   Programmet er kun ment for demonstrasjonsbruk.

   Rettet jun 2007 : Justert regulativ (anl_faktor) og mva.
   Rettet mai 2009 : Div justeringer
*/


function LeggSammenFeil(sTotalFeil, sFeil) {
   if (sFeil != "") {
      if (sTotalFeil != "") {
         sTotalFeil += "\n";
      }
      sTotalFeil += sFeil;
   }
   return sTotalFeil;
}

function RapporterFeil(sTotalFeil) {
   alert(sTotalFeil);
}

function KunSiffer(felt) {
   var bOk = felt.value.length > 0;
   bOk = bOk && felt.value > 0;
   if (bOk) {
      for (var i = 0; bOk && (i < felt.value.length); i++) {
         var tegn = felt.value.substring(i, i + 1);
         bOk = bOk && ((tegn >= "0") && (tegn <= "9"));
      }

      if (bOk) {
         return "";
      }
      else {
         felt.focus();
         return "Feltet " + felt.name + " kan kun inneholde siffer.";
      }
   }
   else {
      return "Feltet " + felt.name + " må oppgis."
   }
}

function ValgtIListe(liste) {
   if (liste.selectedIndex > 0) {
      return "";
   }

   return "Noe må velges i listen " + liste.name + ".";
}

function OkInnputt(form) {
   var sTotalFeil = "";
   var sFeil;
   sFeil = KunSiffer(form.Registertonn);
   sTotalFeil = LeggSammenFeil(sTotalFeil, sFeil);

   sFeil = KunSiffer(form.AntallDager);
   sTotalFeil = LeggSammenFeil(sTotalFeil, sFeil);

   sFeil = ValgtIListe(form.Skipstype);
   sTotalFeil = LeggSammenFeil(sTotalFeil, sFeil);

   sFeil = ValgtIListe(form.Trafikktype);
   sTotalFeil = LeggSammenFeil(sTotalFeil, sFeil);
/*
   sFeil = ValgtIListe(form.Hensikt);
   sTotalFeil = LeggSammenFeil(sTotalFeil, sFeil);
*/

   if (sTotalFeil != "") {
      RapporterFeil(sTotalFeil);
      return false;
   }

   return true;
}

/*
   Vekttabell angir grunnpriser og pris for overskytende
*/
var Vekttabell =
[
   { Vekt:     0, Anloepsfaktor: 0.32, Anloepspris:     0.0, Kaifaktor: 0.78, Kaipris:     0.0 },
   { Vekt:   300, Anloepsfaktor: 0.31, Anloepspris:   96.0, Kaifaktor: 0.56, Kaipris:   234.0 },
   { Vekt:   600, Anloepsfaktor: 0.12, Anloepspris:   189.0, Kaifaktor: 0.51, Kaipris:   402.0 },
   { Vekt:  1200, Anloepsfaktor: 0.09, Anloepspris:   261.0, Kaifaktor: 0.51, Kaipris:   708.0 },
   { Vekt:  2000, Anloepsfaktor: 0.09, Anloepspris:   333.0, Kaifaktor: 0.47, Kaipris:   1116.0 },
   { Vekt:  3000, Anloepsfaktor: 0.14, Anloepspris:   423.0, Kaifaktor: 0.41, Kaipris:  1586.0 },
   { Vekt:  5000, Anloepsfaktor: 0.17, Anloepspris:  703.0, Kaifaktor: 0.41, Kaipris:  2406.0 },
   { Vekt: 10000, Anloepsfaktor: 0.09, Anloepspris:  1553.0, Kaifaktor: 0.41, Kaipris:  4456.0 },
   { Vekt: 20000, Anloepsfaktor: 0.14, Anloepspris:  2453.0, Kaifaktor: 0.41, Kaipris:  8556.0 },
   { Vekt: 30000, Anloepsfaktor: 0.14, Anloepspris:  3853.0, Kaifaktor: 0.52, Kaipris: 12656.0 },
   { Vekt: 50000, Anloepsfaktor: 0.14, Anloepspris: 6653.0, Kaifaktor: 0.52, Kaipris: 23056.0 },
   { Vekt: 70000, Anloepsfaktor: 0.26, Anloepspris: 9453.0, Kaifaktor: 0.52, Kaipris: 33456.0 },
   { Vekt: 90000, Anloepsfaktor: 0.26, Anloepspris: 14653.0, Kaifaktor: 0.52, Kaipris: 43856.0 }
];
function FinnVektInfo(Vekt) {
   var i;
   var o = null;
   for (i = 0; (o == null) && (i < Vekttabell.length); i++) {
      o = Vekttabell[i];
      if (o.Vekt > Vekt) {
         o = Vekttabell[i - 1];
      }
      else {
         o = null;
      }
   }
   if (o == null) {
      o = Vekttabell[Vekttabell.length - 1];
   }

   return o;
}

/*
   Hensikttabell må være i synk med <select name="Hensikt">
   Listen nedenfor antar følgende rekkefølge på elementene
   (den første er ugyldig):
      Velg hensikt
      Lossing/lasting
      Ombord proviant/utstyr
      Bunkre
      Reparasjon
      Annet
*/
/*
var Hensikttabell =
[
   { Anloepsfaktor: 1.0, Kaifaktor: 1.0},
   { Anloepsfaktor: 1.0, Kaifaktor: 1.0},
   { Anloepsfaktor: 1.0, Kaifaktor: 1.0},
   { Anloepsfaktor: 1.0, Kaifaktor: 1.0},
   { Anloepsfaktor: 0.0, Kaifaktor: 1.0},
   { Anloepsfaktor: 1.0, Kaifaktor: 1.0},
];
function FinnHensiktInfo(Hensikt) {
   return Hensikttabell[Hensikt.selectedIndex];
}
*/
/*
   SkipTrafikkTabell mapper angitt skipstype, trafikktype til
   trafikktypekode og avgiftsbehandlingskode.
   Skipstype-og trafikktype-feltene angir indeks i Skipstype- og
   trafikktype-listene i GUI.
   Disse har følgene elementer (første element er ugyldig):
   Skipstype:
      0 Velg skipstype
      1 Laste/bulk/container/ro-ro
      2 Komb. last/passasjer
      3 Passasjer
      4 Tank
      5 Cruise
      6 Fiske
      7 Supply/offshore
      8 Annet
   Trafikktype:
      0 Velg trafikktype
      1 Linje/rute - Maks. 1 anløp pr. uke
      2 Linje/rute - Min. 2 anløp pr. uke
      3 Tilfeldig anløp
*/
var SkipTrafikkTabell =
[
   { Skipstype: 1, Trafikktype: 1, Trafikktypekode: 23, Avgiftsbehandlingskode: 2 },
   { Skipstype: 2, Trafikktype: 1, Trafikktypekode: 32, Avgiftsbehandlingskode: 3 },
   { Skipstype: 3, Trafikktype: 1, Trafikktypekode: 20, Avgiftsbehandlingskode: 4 },
   { Skipstype: 4, Trafikktype: 1, Trafikktypekode: 24, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig
   { Skipstype: 5, Trafikktype: 1, Trafikktypekode: 17, Avgiftsbehandlingskode: 1 },
   { Skipstype: 6, Trafikktype: 1, Trafikktypekode: 25, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig
   { Skipstype: 7, Trafikktype: 1, Trafikktypekode: 28, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig
   { Skipstype: 8, Trafikktype: 1, Trafikktypekode: 29, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig

   { Skipstype: 1, Trafikktype: 2, Trafikktypekode: 21, Avgiftsbehandlingskode: 2 },
   { Skipstype: 2, Trafikktype: 2, Trafikktypekode: 22, Avgiftsbehandlingskode: 3 },
   { Skipstype: 3, Trafikktype: 2, Trafikktypekode: 20, Avgiftsbehandlingskode: 4 },
   { Skipstype: 4, Trafikktype: 2, Trafikktypekode: 24, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig
   { Skipstype: 5, Trafikktype: 2, Trafikktypekode: 17, Avgiftsbehandlingskode: 1 },
   { Skipstype: 6, Trafikktype: 2, Trafikktypekode: 25, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig
   { Skipstype: 7, Trafikktype: 2, Trafikktypekode: 28, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig
   { Skipstype: 8, Trafikktype: 2, Trafikktypekode: 29, Avgiftsbehandlingskode: 1 }, // egentlig ugyldig

   { Skipstype: 1, Trafikktype: 3, Trafikktypekode: 24, Avgiftsbehandlingskode: 1 },
   { Skipstype: 2, Trafikktype: 3, Trafikktypekode: 24, Avgiftsbehandlingskode: 1 },
   { Skipstype: 3, Trafikktype: 3, Trafikktypekode: 24, Avgiftsbehandlingskode: 1 },
   { Skipstype: 4, Trafikktype: 3, Trafikktypekode: 24, Avgiftsbehandlingskode: 1 },
   { Skipstype: 5, Trafikktype: 3, Trafikktypekode: 27, Avgiftsbehandlingskode: 1 },
   { Skipstype: 6, Trafikktype: 3, Trafikktypekode: 25, Avgiftsbehandlingskode: 1 },
   { Skipstype: 7, Trafikktype: 3, Trafikktypekode: 28, Avgiftsbehandlingskode: 1 },
   { Skipstype: 8, Trafikktype: 3, Trafikktypekode: 29, Avgiftsbehandlingskode: 1 },

   // Reserve for de som ikke finnes... (annen lokal trafikk, full avgift)
   { Skipstype: 0, Trafikktype: 0, Trafikktypekode: 19, Avgiftsbehandlingskode: 1 }
];

/*
   Søker gjennom SkipTrafikkTabell og finner trafikktypekode og
   avgiftsbehandlingskode.
   Skipstype og Trafikktype er integer.
*/
function FinnSkipTrafikkInfo(Skipstype, Trafikktype) {
   var i;
   var o = null;
   for (i = 0; (o == null) && (i < SkipTrafikkTabell.length); i++) {
      o = SkipTrafikkTabell[i];
      if ((o.Skipstype != Skipstype) || (o.Trafikktype != Trafikktype)) {
         o = null;
      }
   }
   if (o == null) {
      o = SkipTrafikkTabell[SkipTrafikkTabell.length - 1];
   }

   return o;
}

/*
   TrafikktypeTabell inneholder alle trafikktypekodene og deres påvirkning på
   anløpspris (anløpsfaktor) og kaipris (kaifaktor)
*/
var TrafikktypeTabell =
[
   { Trafikktypekode: 17, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 19, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 20, Anloepsfaktor: 0.25, Kaifaktor: 1.00 },
   { Trafikktypekode: 21, Anloepsfaktor: 0.25, Kaifaktor: 0.65 },
   { Trafikktypekode: 22, Anloepsfaktor: 0.25, Kaifaktor: 0.65 },
   { Trafikktypekode: 23, Anloepsfaktor: 1.00, Kaifaktor: 0.65 },
   { Trafikktypekode: 24, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 25, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 27, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 28, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 29, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Trafikktypekode: 32, Anloepsfaktor: 0.25, Kaifaktor: 0.65 }
];
/*
   Søker gjennom TrafikktypeTabell og finner anløps- og kaifaktor.
   Trafikktypekode er integer.
*/
function FinnTrafikktypeInfo(Trafikktypekode) {
   var i;
   var o = null;
   for (i = 0; (o == null) && (i < TrafikktypeTabell.length); i++) {
      o = TrafikktypeTabell[i];
      if (o.Trafikktypekode != Trafikktypekode) {
         o = null;
      }
   }
   if (o == null) {
      o = TrafikktypeTabell[TrafikktypeTabell.length - 1];
   }

   return o;
}


/*
   AvgiftsbehandlingsTabell angir avgiftsbehandlingskodene og deres påvirkning på
   anløpspris (anløpsfaktor) og kaipris (kaifaktor)
   jun 2007  Alle faktorer satt til 1.00 mao påvirker ikke avgift
*/
var AvgiftsbehandlingsTabell =
[
   { Avgiftsbehandlingskode: 1, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Avgiftsbehandlingskode: 2, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Avgiftsbehandlingskode: 3, Anloepsfaktor: 1.00, Kaifaktor: 1.00 },
   { Avgiftsbehandlingskode: 4, Anloepsfaktor: 1.00, Kaifaktor: 1.00 }
];
/*
   Søker gjennom AvgiftsbehandlingsTabell og finner anløps- og kaifaktor.
   Avgiftsbehandlingskode er integer.
*/
function FinnAvgiftsbehandlingsInfo(Avgiftsbehandlingskode) {
   var i;
   var o = null;
   for (i = 0; (o == null) && (i < AvgiftsbehandlingsTabell.length); i++) {
      o = AvgiftsbehandlingsTabell[i];
      if (o.Avgiftsbehandlingskode != Avgiftsbehandlingskode) {
         o = null;
      }
   }
   if (o == null) {
      o = AvgiftsbehandlingsTabell[AvgiftsbehandlingsTabell.length - 1];
   }

   return o;
}


function FinnSkipsOgTrafikkInfo(Skipstype, Trafikktype) {
   var SkipTrafikkInfo = FinnSkipTrafikkInfo(Skipstype.selectedIndex, Trafikktype.selectedIndex);
   var TrafikktypeInfo = FinnTrafikktypeInfo(SkipTrafikkInfo.Trafikktypekode);
   var AvgiftsbehandlingsInfo = FinnAvgiftsbehandlingsInfo(SkipTrafikkInfo.Avgiftsbehandlingskode);

   var SkipsOgTrafikkInfo = new Object();
   SkipsOgTrafikkInfo.Anloepsfaktor = TrafikktypeInfo.Anloepsfaktor * AvgiftsbehandlingsInfo.Anloepsfaktor;
   SkipsOgTrafikkInfo.Kaifaktor = TrafikktypeInfo.Kaifaktor * AvgiftsbehandlingsInfo.Kaifaktor;

   return SkipsOgTrafikkInfo;
}

function BeregnPris(form) {
   if (OkInnputt(form)) {
      var Vekt = parseFloat(form.Registertonn.value);
      var VektInfo = FinnVektInfo(Vekt);

      var Anloepsavgift = VektInfo.Anloepspris + (VektInfo.Anloepsfaktor * (Vekt - VektInfo.Vekt));
      var Kaiavgift = VektInfo.Kaipris + (VektInfo.Kaifaktor * (Vekt - VektInfo.Vekt));

      var Anloepsfaktor = 1.0;
      var Kaifaktor = 1.0;
/*
      var HensiktInfo = FinnHensiktInfo(form.Hensikt);

      Anloepsfaktor *= HensiktInfo.Anloepsfaktor;
      Kaifaktor *= HensiktInfo.Kaifaktor;
*/
      var SkipsOgTrafikkInfo = FinnSkipsOgTrafikkInfo(form.Skipstype, form.Trafikktype);
      Anloepsfaktor *= SkipsOgTrafikkInfo.Anloepsfaktor;
      Kaifaktor *= SkipsOgTrafikkInfo.Kaifaktor;

      if (form.Kaitype[0].checked) {
         Kaifaktor = 0;
      }

      var AntallDager = parseInt(form.AntallDager.value);

      Anloepsavgift *= Anloepsfaktor;
      Kaiavgift *= Kaifaktor;
      if ((Kaiavgift > 0) && (Kaiavgift < 200)) {
         // Minimumspris på kai
         Kaiavgift = 200;
      }
      Kaiavgift *= AntallDager;

      if ((Anloepsavgift > 0) && (Anloepsavgift < 200)) {
         // Minimumspris på anløp
         Anloepsavgift = 200;
      }
      if (Vekt < 25) {
         // Småbåter betaler ikke for anløp.
         Anloepsavgift = 0;
      }

      var Moms = 0;
	  if (form.MvaKode.checked)  {
	    Moms = (Anloepsavgift + Kaiavgift) * 0.25
	  }

      form.Anloepsavgift.value = Math.round(Anloepsavgift);
      form.Kaiavgift.value = Math.round(Kaiavgift);
      form.Mva.value = Math.round(Moms);
      form.Totalt.value = Math.round(Anloepsavgift + Kaiavgift + Moms);
   }
}

// slutt kommentar JavaScript -->
