﻿//initiell verdi, overskrives av system.
var aarstall = "2009";

/***********************************************
* KID-generator
* 03.09.2004 WIS Rettet feil i ErFodselsnummer.
*                Ekstra test på kontrollsifre.
* 07.09.2004 WIS Lagt inn test på skuddår i
*                ErGyldigDato med ekstra parameter.
*                Korrigert tekst i feilmeldingene.
* 18.11.2004 WIS Feil i funksjonen calculate():
*                Feil i switch(checknumber) rettet:
*                Har lagt inn
*                  checknumber = 11 - checknumber
*                i case 1.
* 29.03.2006 WIS Lagt inn D-nummer
*                Regel:
*                - første siffer i fødselsdato er 4 høyere
*                - idnummer 0-499: født før 01.01.2000
*                - idnummer 500-599: født fra og med 01.01.2000
* 24.08.2006 wis Lagt inn termIndex i makeTerminOptions
*                for å bevare valgt termin ved bytte av skatteart
*                eller skattyter.
*                Byttet 'Org. nr.' til 'org.nr.'.
* 09.01.2008 wis Skrevet om til SOFIEs KID.
* 23.01.2008 wis Rettelser i skattearter.
* 10.02.2009 wis Justert på navn og rekkefølge av skattearter.
************************************************/

/***********************************************
* Initialiserer combobokser
* og tekstbokser
************************************************/
function init() {
   //Setter opp valgmuligheter for Skattetype
  makeYterOptions();

   //Setter opp tom comboboks for Skatteart og Termin
   resetSkatteart();

   //Setter opp valg for år
   makeAarOptions();
   document.forms[0].idnr.value="";
   document.forms[0].output.value="";
}



/***********************************************
* Setter opp valgmulighetene
* i SkattYter comboboks
************************************************/
function makeYterOptions(){
   var skattyter = document.forms[0].skattyter;
   skattyter.options.length=0;
   skattyter.options[0]=new Option("-- Velg skattyter --","nil");
   skattyter.options[1]=new Option("Personlig skattyter","perskt");
   skattyter.options[2]=new Option("Upersonlig skattyter","bedskt");
   skattyter.options[3]=new Option("Arbeidsgivere med org.nr.","bedarb");
   skattyter.options[4]=new Option("Private arbeidsgivere","perarb");

}



/***********************************************
* Metode for å initialisere eller tilbakestille
* "skatteart" comboboxen
************************************************/
function resetSkatteart(){
   var skatteart = window.document.forms[0].skatteart

   skatteart.options.length = 0;
   skatteart.options[0]=new Option("-- Velg skatteart --","nil")
   skatteart.options[0].selected=true
   hideAll()
   changeObjectVisibility("nr","visible")
   makeTerminOptions()

}

/***********************************************
* Finner hvilket valg som er
* gjort for Skattyter
************************************************/
function selectArtOptions() {
    var skattyter=document.forms[0].skattyter
    var yterInt=skattyter.selectedIndex
    var yterVal=skattyter.options[yterInt].value

    document.forms[0].output.value=""

    if (yterVal.substring(0,3)=="bed") {
      makeBedOptions()
    }
    else {
      if (yterVal.substring(0,3)=="per"){
        makePerOptions()
      }
      else {
      resetSkatteart()
      }
    }

    makeTerminOptions()
}


/***********************************************
* Setter opp valgmulighetene
* i Skatteart komboboks Organisasjon
************************************************/
function makeBedOptions() {
  var art = document.forms[0].skatteart
  var yter = document.forms[0].skattyter
  var opct = 1
  art.options.length = 0

  //Display Orgnr as input text for bedrifter:
  hideAll();
  switchDiv("onr")

  //Options for Bedrifter:
  defaultOption=true

  //Arbeidsgivere med Org. nr
  if(yter.options[yter.selectedIndex].value.substring(3,6)=="arb"){
     var option0 = new Option("Forskuddstrekk","05")
     var option1 = new Option("Arbeidsgiveravgift","06")
     var option2 = new Option("Utleggstrekk","03")
     var option3 = new Option("Forskuddstrekk fra oppgjørsblankett veld./alm.","05")
     var option4 = new Option("Artistskatt","07")
     opct = 5
  }
    //Upersonlig skattyter.
  if(yter.options[yter.selectedIndex].value.substring(3,6)=="skt"){
     var option0 = new Option("Forskuddsskatt","02")
     var option1 = new Option("Tilleggsforskudd","43")
     var option2 = new Option("Restskatt","17")
     opct = 3
  }


  for (var i=0; i < opct; i++) {
      eval("art.options[i]=option"+i)
  }

}



/***********************************************
* Setter opp valgmulighetene
* i Skatteart komboboks for Person
************************************************/
function makePerOptions() {
  var art = document.forms[0].skatteart
  var yter = document.forms[0].skattyter
  var opct = 0
  art.options.length = 0


  //Display Fnr as input text for personer:
  hideAll();
  switchDiv('fnr')

  //Set Options for Personer
  defaultOption=true

  //Private arbeidsgivere
  if(yter.options[yter.selectedIndex].value.substring(3,6)=="arb"){
    var option0 = new Option("Forskuddstrekk fra oppgjørsblankett","05")
    var option1 = new Option("Forskuddstrekk","05")
    var option2 = new Option("Arbeidsgiveravgift","06")
    opct = 3
  }

  //Personlig skattyter
  if(yter.options[yter.selectedIndex].value.substring(3,6)=="skt"){
    var option0 = new Option("Forskuddsskatt","01")
    var option1 = new Option("Tilleggsforskudd","42")
    var option2 = new Option("Restskatt","15")
    opct=3
  }

  for (var i=0; i < opct; i++) {
     eval("art.options[i]=option" + i)
  }


}

/***********************************************
* Skatteart er forandret. Tømmer output
*
************************************************/
function skatteartSelected(){
   var skatteartobj = document.forms[0].skatteart
   var skatteart = skatteartobj.options[skatteartobj.selectedIndex].value
   makeTerminOptions(skatteart)
   document.forms[0].output.value=""
}



/***********************************************
* Setter opp valgmulighetene
* i Termin comboboks
************************************************/
function makeTerminOptions(){
   //Setter opp riktig termin
   var skatteartobj = document.forms[0].skatteart
   var skatteart = skatteartobj.options[skatteartobj.selectedIndex].value
   var term = document.forms[0].termin
   var termIndex = term.selectedIndex

   //Setter opp verdier for termin combobox
   if (skatteart =="06" || 
       (skatteart =="05" && skatteartobj.options[skatteartobj.selectedIndex].text == "Forskuddstrekk") || 
       skatteart =="03"){
      changeObjectVisibility("termintekst","visible")
      changeObjectVisibility("terminselect","visible")
      term.length = 0
      for(var i = 1; i <=6; i++){
         term.options[term.length] = new Option(i,i)
      }
      term.selectedIndex = termIndex
   }

   else{
         //Ved 0 terminer blir terminnr satt til 0
         changeObjectVisibility("termintekst","hidden")
         changeObjectVisibility("terminselect","hidden")
         term.length = 0
         term.options[term.length] = new Option(0,0)
   }
}




/***********************************************
* Setter opp valgmulighetene
* i år comboboks
************************************************/
function makeAarOptions(){

   //Setter opp verdier for aar combobox
   var tid = HentAarstall()
   var sel = document.forms[0].aar
   sel.options.length=0
   for(var i = 0; i < 6; i++){
     var opt = new Option(tid-i,tid-i)
     sel.options[sel.options.length] = opt
   }
}


/***********************************************
* Skjuler div tekstene
*
************************************************/
function hideAll(){
   changeObjectVisibility("fnr", "hidden")
   changeObjectVisibility("afnr", "hidden")
   changeObjectVisibility("onr","hidden")
   changeObjectVisibility("termintekst","hidden")
   changeObjectVisibility("terminselect","hidden")
   changeObjectVisibility("nr","hidden")
}




/***********************************************
* Forandrer synlighet til et StyleObjekt
*
************************************************/
function changeObjectVisibility(objectId, newVisibility) {
    var styleObject = getStyleObject(objectId)
    if(styleObject) {
    styleObject.visibility = newVisibility;
    return true
    } else {
    // we couldn't find the object, so we can't change its visibility
    return false
    }
}


/***********************************************
* Input: en streng med ID til et objekt.
* Returner objektets stylesheet hvis det kan finne et.
* Hvis ikke, returnerer den false
************************************************/
function getStyleObject(objectId) {
  // sjekkW3C DOM, then MSIE 4, then NN 4.
  //
  if(document.getElementById && document.getElementById(objectId)) {
    return document.getElementById(objectId).style
   }
   else if (document.all && document.all(objectId)) {
    return document.all(objectId).style
   }
   else if (document.layers && document.layers[objectId]) {
    return document.layers[objectId]
   } else {
    return false
   }
}


/***********************************************
* Funksjonen tar id til en div
* og kaller opp andre funksjoner for
* å få den til å vises
************************************************/
function switchDiv(div_id){
  var style_sheet = getStyleObject(div_id)
  if (style_sheet)
  {
    changeObjectVisibility(div_id,"visible")
  }
}




/***********************************************
* Funksjoner som skal kjøres når brukeren
* trykker Nullstill knappen.
*
************************************************/
function resetSelected(){
   init()
}


/***********************************************
* Funksjonsoppkall når termin-boksen er
* forandret
************************************************/
function terminSelected(){
      document.forms[0].output.value=""
}


/***********************************************
* Funksjonsoppkall som skal gjøres når
* år-combobox'en er forandret
************************************************/
function aarSelected(){
   document.forms[0].output.value=""
}

/***********************************************
* Funksjonsoppkall som skal gjøres når
* år-combobox'en er forandret
************************************************/
function nrChange(){
  document.forms[0].output.value=""
}


/***********************************************
* Sjekker om input er riktig.
* Punker den sjekker på er:
* - Skattyter er valgt
* - Skatteart er valgt
* - IDnr er skrevet inn
* + IDnr har riktig lengde
*   - 9 for Organisasjonsnummer
*   - 11 for Personnummer
* - Sjekker at IDnr er kun tall
* - Sjekker kontrollsiffer for personnnummer
* - Sjekker kontrollsiffer for organisasjonsnummer
************************************************/
function  preValidate(){
    var form = document.forms[0]
    var yterInt=form.skattyter.selectedIndex
    var artInt=form.skatteart.selectedIndex
    var msg ="";

    //Finner ut om det er valgt person eller bedrift
    if (form.skattyter.options[yterInt].value.substring(0,3)=="per") {
      idnrmsg="Fødselsnummer"
    }
    else {
      idnrmsg="Organisasjonsnummer"
    }


    if (form.skattyter.options[yterInt].value=="nil"){
       msg += "-velg en type skattyter\t\n"
    }
    if (form.skatteart.options[artInt].value=="nil"){
       msg += "-velg en skatteart\t\n"
    }
    if ( msg == "" && form.idnr.value=="" ){
       msg = "Fyll inn "+idnrmsg +"!"
    }
    if ( msg == "" && form.idnr.value.length !="11" && idnrmsg=="Fødselsnummer"){
       msg = idnrmsg + " har ikke riktig lengde (11 tegn)!"
    }
    if ( msg == "" && form.idnr.value.length !="9" && idnrmsg=="Organisasjonsnummer"){
       msg = idnrmsg + " har ikke riktig lengde (9 tegn)!"
    }
    if ( msg == "" && !IsNumeric(form.idnr.value)){
       msg = idnrmsg +" må kun bestå av tall!"
    }
    if ( msg == "" && !ErFodselsnummer(form.idnr.value) && idnrmsg=="Fødselsnummer"){
       msg = idnrmsg + " er ikke gyldig!"
    }
    if ( msg == "" && !ErBedriftsnummer(form.idnr.value) && idnrmsg=="Organisasjonsnummer"){
       msg = idnrmsg + " er ikke gyldig!"
    }

    //Skriver ut eventuelle feilmeldinger
    if (msg!=""){
      alert("Feil på utfylling:\n"+msg)
      return false
    }
    else
      return true
}



/***********************************************
* Beregner KID nummer
************************************************/
function calculate(){
if(preValidate()){

   var kid=""
   var skatteartobj = document.forms[0].skatteart
   var skatteart = skatteartobj.options[skatteartobj.selectedIndex].value
   var aarobj = document.forms[0].aar
   var aar = aarobj.options[aarobj.selectedIndex].value.substring(2,4)
   var idnr = Trim(document.forms[0].idnr.value)
   var terminobj = document.forms[0].termin
   var termin = terminobj.options[terminobj.selectedIndex].value
   var zero = "0"
   var checknumber = ""
   var nyttnummer = true
   var buffertall = 1

   //Padding orgnr from 9 to 11 numbers
   var f = document.forms[0]    //f = form
   var s = f.skattyter      //s = skatteyter
   if ( f.idnr.value.length == "9" && s.options[s.selectedIndex].value.substring(0,3)=="bed"){
      idnr = "00"+Trim(document.forms[0].idnr.value)
    }

   //termin skal være to siffer. zero setter inn 0 hvis ett siffer.
   if (termin > 9) {
      zero = ""
   }

   kid = idnr+skatteart+aar+zero+termin+buffertall

   //Finner checknumber
   checknumber = modEleven(kid)
   while (nyttnummer) {
      switch(checknumber){

      case 0:
         nyttnummer = false
      break

      case 1:
         buffertall += 1
         kid = idnr+skatteart+aar+zero+termin+buffertall
         checknumber = modEleven(kid)
      break

      default:
         checknumber = 11 - checknumber
         nyttnummer = false
      }
   }
   kid = kid+checknumber
   document.forms[0].output.value = kid

}

}

/***********************************************
* Modulus 11 algoritme
* for Kontrollsiffere
* Se mer på:
* http://www.school-resources.co.uk/modulus_11_check_digit_calculati.htm
* eller
* http://docs.hp.com/cgi-bin/doc3k/B3031890006.10192/60
************************************************/
function modEleven(kid){
var multi = 2
var summulti = 0
for(var i = kid.length-1; i >= 0; i--){
  summulti += kid.charAt(i)*multi

  if(multi < 7)
    multi+=1
  else
    multi=2
}

return summulti%11

}

/***********************************************
* Fjerner mellomrom på begge
* sider av verdien
************************************************/
function Trim(s){
while (s.substring(0,1) == ' '){
   s = s.substring(1,s.length);
}
while (s.substring(s.length-1,s.length) == ' '){
   s = s.substring(0,s.length-1);
}
return s;
}


/***********************************************
* Sjekker at verdien er av
* kun tall
************************************************/
function IsNumeric(sText){
var ValidChars = "0123456789";
var IsNumber=true;
var Char;

for (i = 0; i < sText.length && IsNumber == true; i++)
{
   Char = sText.charAt(i);
   if (ValidChars.indexOf(Char) == -1)
   {
      IsNumber = false;
   }
}
return IsNumber;

}

/***********************************************
* Sjekker kontrollsiffer på
* fødselsnummer
* Se mer på:
* http://www.lefdal.cc/div/mod11-sjekk.html
************************************************/
function ErFodselsnummer(fNr){
var vekter1= "376189452"
var vekter2= "5432765432"
var gyldig = true
var sum1 = 0;
var sum2 = 0;

if( !ErGyldigDato(fNr.substring(0,6), fNr.substring(6,9)) ){
   gyldig=false
}

for(var i = 0; i <9; i++){
   sum1 += fNr.charAt(i)*vekter1.charAt(i)
   sum2 += fNr.charAt(i)*vekter2.charAt(i)
}

sum1 = 11 - sum1%11
if( sum1 == 10) {
   gyldig = false
}
if( sum1 == 11) {
   sum1 = 0
}

sum2 += fNr.charAt(9)*vekter2.charAt(9)
sum2 = 11 - sum2%11
if( sum2 == 10) {
   gyldig = false
}
if( sum2 == 11) {
   sum2 = 0
}

if( sum1 != fNr.charAt(9) || sum2 != fNr.charAt(10)){
   gyldig=false
}

return gyldig
}


/***********************************************
* Sjekker kontrollsiffer på
* organisasjonsnummer.
* Se mer på:
* http://www.brreg.no/samordning/organisasjonsnummer.html
************************************************/
function ErBedriftsnummer(bNr){
var gyldig = true

checknumber = modEleven(bNr.substring(0,8))

if(checknumber>1){
   checknumber = 11 - checknumber
}

if(checknumber != bNr.charAt(8)){
   gyldig = false
}

return gyldig
}


/***********************************************
* Sjekker om dato er gyldig
* - ddmmyy = dag. måned og år i fødselsnummeret
* - inr = individnummerert (3 siffer) i fødselsnummeret
************************************************/
function ErGyldigDato(ddmmyy, inr){
var gyldig = true
var mdays = 31
var day = ddmmyy.substring(0,2)
var month = ddmmyy.substring(2,4)
var year = ddmmyy.substring(4,6)
var dnr = ddmmyy.substring(0,1)

/** Legg til århundre for å beregne skuddår **/
if (dnr > 3) {
   /** D-nummer hvis første siffer i personnummeret er 4 høyere **/
   if (inr < 500) {
      year = 19 + year
   } else {
      year = 20 + year
   }
} else {
   /** Vanlig personnummer **/
   if (inr < 500) {
      year = 19 + year
   } else if (year >= 55) {
      year = 18 + year
   } else {
      year = 20 + year
   }
}

if( day<1 || month<1 || month>12) {
  gyldig = false
}

if(month==2){
   //Februar
   if( ( (year%4==0) && (year%100 !=0) ) || (year%400==0) ){
      mdays=29
   }
   else{
      mdays=28
   }
}

if(month==4 || month ==6 || month==9 || month==11){
   mdays=30
}

if (dnr > 3) {
   /** D-nummer hvis første siffer i fødselsdagen er 4 høyere **/
   day -= 40
}

if(day> mdays){
   gyldig = false
}

return gyldig
}





/***********************************************
* Returnerer årstallet
* Skal genereres riktig årstall før den sendes
* over til klienten.
* Kontaktperson: Stian Larsen på Creuna
************************************************/
function HentAarstall(){
   return aarstall;
}
function SettAarstall(systemAar)
{
    aarstall = systemAar;
}
