//*********************************************************************
//  Höfundur   :    Helgi Þorvarðsson
//                  XPC hugbúnaður ehf
//                  xpc@xpc.is
//*********************************************************************

//##### FORM aðgerðir #####
// xjfCheckSkraningarnumerBifreidar(V)
// xjfCheckSimi(V)
// xjfCheckCPRFasteignarILS(V)
// xjfCheckCPRFasteignarRSK(V)
// xjfCheckTextarea(V)
// xjfCheckDate(V)
// xjfCheckAr(V)
// xjfCheckRangeAr(V)
// xjfCheckFramtidarAr(V)
// xjfCheckCPRPerson(V)
// xjfCheckCPRFelag(V)
// xjfCheckCPRBoth(V)
// xjfCheckNumber(V)
// xjfCheckKommutala(V,Fjoldi)
// xjfCheckReikningsnumer(V)
// xjfCheckVedskuldabref(V)
// xjfCheckSkuldabref(V)
// xjfCheckLan(V)

//##### REIKNI aðgerðir #####
// xjfStr2Int(V)
// xjfStr2Real(V) -- EKKI NOTAÐ

//##### ALMENNAR aðgerðir #####
// xjOpenHelp(slod) -- EKKI NOTAÐ
// xjNowYear()

//##### GRUNN aðgerðir #####
// xjfNumberCheck(V,str)
// xjsValidNumberCheck(string)
// xjfKommutalaCheck(V,Fjoldi,str)
// xjsValidKommutalaCheck(strengur)
// xjsValidDateCheck(strengur)
// xjfCPRcheck(V,str,adferd)
// xjsCPRChecksumCheck(strengur)
// xjfBankaCheck(V,str)

//##### MASK aðgerðir #####
// xjsMaskOff(strengur)
// xjsMaskOn(strengur)

//##### FORM aðgerðir #####

// Aðgerð: Athugar hvort skráningarnúmer bifreiðar sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt skráningarnúmer bifreiðar eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckSkraningarnumerBifreidar(V) {
  // 101-4(2), 304, 403, 409
  if ( V.value != "" ) {
    var str, validStrengur
    str = V.value;
    str = str.toUpperCase();
    validStrengur = "AÁBCDÐEÉFGHIJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"
     if  ( (validStrengur.indexOf(str.substr(0, 1)) == -1)
      || (validStrengur.indexOf(str.substr(1, 1)) == -1)
      || (str.substr(2, 1) < "0" || "9" < str.substr(2, 1))
      || (str.substr(3, 1) < "0" || "9" < str.substr(3, 1))
      || (str.substr(4, 1) < "0" || "9" < str.substr(4, 1))
      || (str.length != 5) ) {
      alert("Ábending. Skráningarnúmer bifreiðar er ekki gilt.\nÍ þennan reit skal skrá fimm stafa númer sem samanstendur\naf tveimur bókstöfum og þremur tölustöfum.")
      V.value = ""
      V.focus()
      return false
    }
    else {
      V.value = str;
    }
  }
  return true
}

// Aðgerð: Athugar hvort símanúmer sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt símanúmer eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckSimi(V) {
  if (V.value != "") {
    if ( xjsValidNumberCheck(V.value) && V.value.length == 7 ) {
      return true
    }
    else {
      alert("Símanúmer/faxnúmer/gsm er ekki rétt skrifað.\nNúmerið er sjö stafa og á að skrifa án bandstriks/bils.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort fastanúmer eignar sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt fastanúmer eignar eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckCPRFasteignarILS(V) {
  // 101-4, 303
  if (V.value != "") {
    if ( xjsValidNumberCheck(V) && V.value.length == 7 ) {
      return true
    }
    else {
      alert("Fastanúmer eignar er ekki rétt skrifað.\nNúmerið er sjö stafa og á að skrifa án bandstriks.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort fastanúmer eignar sé gilt frá formi (tekur tillit til sex stafa númer sumarbústaða)
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt fastanúmer eignar eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckCPRFasteignarRSK(V) {
  // 101-4, 303
  if (V.value != "") {
    if ( xjsValidNumberCheck(V) && V.value.length == 7 ) {
      return true
    }
    else {
      alert("Fastanúmer eignar er ekki rétt skrifað.\nNúmerið er (oftast) sjö stafa og á að skrifa án bandstriks.\n\nEf um er að ræða 6 stafa fastanúmer, t.d. vegna sumarbústaðar,\nskal setja 0 fyrir framan númerið svo það verði sjö stafa.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort memo svæði sé stærra en 2000 tákn og hreinsar það sem er framyfir
// Inntak: Tekur inn form
// Úttak:  EKKERT
//         Ef memo svæði er stærra en 2000 tákn þá er því eytt sem er framyfir og villustrengur birtur
function xjfCheckTextarea(V) {
   var Fjoldi = V.value.length
   if(Fjoldi > 2000){
     V.value = V.value.substring(0,2000)
     alert("Athugið að textinn má ekki vera lengri en 2000 stafir.");
     V.focus()
   }
}
// Aðgerð: Athugar hvort dagsetning eignar sé gild frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild dagsetning eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckDate(V) {
  if (!xjsValidDateCheck(V.value)) {
    alert("Ábending. Dagsetningin er ekki gild.\nDagsetnigu skal skrifa á eftirfarandi hátt: 'd.m.áááá', t.d. '17.7.1966'")
    V.value = ""
    V.focus()
    return false
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort ártal sé á bilinu 1901 til núgildandi árs
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt ártal eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckAr(V) {
  if ( V.value != "" ) {
    var ar = xjNowYear()
    if (xjsValidNumberCheck(V) && V.value <= ar && V.value >= 1901) {
      return true
    }
    else {
      alert("Ábending. Ártalið er ekki gilt.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort ártal sé á bilinu frá núgildandi ári eða þar eftir
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt ártal eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckFramtidarAr(V) {
  if ( V.value != "" ) {
    var ar = xjNowYear();
    if (xjsValidNumberCheck(V) && V.value >= ar) {
      return true
    }
    else {
      alert("Ábending. Ártalið er ekki gilt.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort ártal sé á bilinu frá núgildandi ári eða þar eftir
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt ártal eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckFramtidarArMin1(V) {
  if ( V.value != "" ) {
    var ar = xjNowYear() - 1;
    if (xjsValidNumberCheck(V) && V.value >= ar) {
      return true
    }
    else {
      alert("Ábending. Ártalið er ekki gilt.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort ártal sé núgildandi ár eða sjö þau næst frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt ártal eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckRangeAr(V) {
  if ( V.value != "" ) {
    var ar = xjNowYear()
    if (xjsValidNumberCheck(V) && V.value <= (ar + 7) && V.value >= ar) {
      return true
    }
    else {
      alert("Ábending. Ártalið er ekki gilt.")
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort kennitala sé gild persónukennitala frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild persónukennitala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckCPRPerson(V) {
  return xjfCPRcheck(V,"Ábending. Kennitalan er ekki gild eða ekki rétt skrifuð.\nAthugið að kennitölur þarf að skrifa án bandstriks.",1)
}
// Aðgerð: Athugar hvort kennitala sé gild fyrirtækjakennitala frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild fyrirtækjakennitala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckCPRFelag(V) {
  return xjfCPRcheck(V,"Ábending. Kennitala félags er ekki gild eða ekki rétt skrifuð.\nAthugið að kennitölur þarf að skrifa án bandstriks.",2)
}
// Aðgerð: Athugar hvort kennitala sé gild kennitala frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild kennitala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckCPRBoth(V) {
  return xjfCPRcheck(V,"Ábending. Kennitalan er ekki gild eða ekki rétt skrifuð.\nAthugið að kennitölur þarf að skrifa án bandstriks.",3)
}
// Aðgerð: Athugar hvort tala sé gild  frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild tala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckNumber(V) {
  return xjfNumberCheck(V,"Ábending. Talan er ekki gild.")
}
// Aðgerð: Athugar hvort kommutala sé gild frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild kommutala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckKommutala(V,Fjoldi) {
  return xjfKommutalaCheck(V,Fjoldi,"Ábending. Talan er ekki gild.")
}
// Aðgerð: Athugar hvort reikningsnúmer sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt reikningsnúmer eða tómt, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckReikningsnumer(V) {
  return xjfBankaCheck(V,"Ábending. Reikningsnúmerið er ekki gilt.")
}
// Aðgerð: Athugar hvort númer veðskuldabréfs sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt númer veðskuldabréfs eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckVedskuldabref(V) {
  return xjfBankaCheck(V,"Ábending. Númer veðskuldabréfsins er ekki gilt.")
}
// Aðgerð: Athugar hvort númer skuldabréfs sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt númer skuldabréfs eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckSkuldabref(V) {
  return xjfBankaCheck(V,"Ábending. Númer skuldabréfsins er ekki gilt.")
}
// Aðgerð: Athugar hvort númer láns sé gilt frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gilt númer láns eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCheckLan(V) {
  return xjfBankaCheck(V,"Ábending. Númer láns er ekki gilt.")
}
//##### REIKNI aðgerðir #####
// Aðgerð: Breytir streng í tölu, ef strengur er tómur þá er töluni 0 skilað
// Inntak: Tekur inn form
// Úttak:  Skilar tölu
function xjfStr2Int(V) {
  if ( V.value != "" ) {
    return parseInt(xjsMaskOff(V.value), 10)
    }
  else {
    return 0
  }
}
// Aðgerð: Breytir streng í kommutölu, ef strengur er tómur þá er töluni 0 skilað
// Inntak: Tekur inn form
// Úttak:  Skilar kommutölu
function xjfStr2Real(V) {
  var A
  var B
  if ( V.value != "" ) {
    A = V.value.indexOf(",")
    if (A != -1) {
      B = V.value.substring(0,A) + "." + V.value.substring(A+1,V.value.length)
      return parseFloat(B)
    }
    else {
      return parseInt(V.value, 10)
    }
  }
  else {
    return 0
  }
}

//##### ALMENNAR aðgerðir #####

// Aðgerð: Opnar hjálparglugga
// Inntak: Tekur inn streng sem innheldur URL
// Úttak:  Opnar glugga með URL-inu
function xjOpenHelp(slod) {
  var popupHelp=window.open(slod, "Ibudalanasjodur", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=650,height=600");
  popupHelp.opener = self;
  popupHelp.focus();
}
// Aðgerð: Skilar núgildandi ártali
// Inntak: EKKERT
// Úttak:  Skilar ártali á forminu YYYY
function xjNowYear() {
  today = new Date()
  ar = today.getYear()
  if (ar < 1900) {
    ar = ar + 1900
  }
  return ar
}

//##### GRUNN aðgerðir #####

// Aðgerð: Athugar hvort númer sé gilt frá formi
// Inntak: Tekur inn form og villustreng
// Úttak:  Skilar true ef formið er eingöngu samsettur úr tölum eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfNumberCheck(V,str) {
  V.value = xjsMaskOff(V.value)
  if (!xjsValidNumberCheck(V.value)) {
    alert(str)
    V.value = ""
    V.focus()
    return false
  }
  else {
    V.value = xjsMaskOn(V.value)
    return true
  }
}
// Aðgerð: Athugar hvort númer sé gilt frá streng
// Inntak: Tekur inn streng
// Úttak:  Skilar true ef strengurinn er eingöngu samsettur úr tölum eða tómur, annars false
function xjsValidNumberCheck(string) {
  if ( string != "" ) {
    var generic="0123456789"
    for (var i = 0; i < string.length; i++) {
      var character = string.charAt(i)
      if (!(generic.indexOf(character) >= 0)) {
        return false
      }
    }
  }
  return true
}
// Aðgerð: Athugar hvort kommutala sé gilt frá formi
// Inntak: Tekur inn form, fjölda leyfilegra talna fyrir aftan kommu og villustreng
// Úttak:  Skilar true ef formið er gild kommutala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfKommutalaCheck(V,Fjoldi,str) {
  var A
  if (!xjsValidKommutalaCheck(V.value)) {
    alert(str)
    V.value = ""
    V.focus()
    return false
  }
  else {
    A = V.value.indexOf(",")
    if (((V.value.length-A-1) > Fjoldi) && (A >= 0)) {
      alert("Ekki má skrifa fleiri en " + Fjoldi + " aukastaf(i) fyrir aftan kommu")
      V.value = ""
      V.focus()
      return false
    }
    else {
      return true
    }
  }
}
// Aðgerð: Athugar hvort kommutala sé gild frá formi
// Inntak: Tekur inn form
// Úttak:  Skilar true ef formið er gild kommutala eða tómur, annars false
function xjsValidKommutalaCheck(strengur) {
  if ( strengur != "" ) {
    var A = strengur.indexOf(",")
    var B = strengur.lastIndexOf(",")
    var str1, str2
    if ( A == B && A != 0 && A != strengur.length-1 ) {
      str1 = xjsMaskOff(strengur.substring(0,A))
      if ( !(xjsValidNumberCheck(str1)) ) {
        return false
      }
      str2 = strengur.substring(A+1,strengur.length)
      if ( !(xjsValidNumberCheck(str2)) ) {
        return false
      }
      return true
    }
    else {
      return false
    }
  }
  return true
}
// Aðgerð: Athugar hvort dagsetning sé gild frá formi
// Inntak: Tekur inn streng
// Úttak:  Skilar true ef formið er gild dagsetning eða tómur, annars false
function xjsValidDateCheck(strengur) {
  if ( strengur != "" ) {
    var A = strengur.indexOf(".")
    var B = strengur.lastIndexOf(".")
    if ((A == -1) && (B == -1)) {
      A = strengur.indexOf("/")
      B = strengur.lastIndexOf("/")
    }
    var ar = xjNowYear()
    if ( A != B && A != 0 && B != strengur.length-1 ) {
      if ( !(parent.xjsValidNumberCheck(strengur.substring(0,A))) ) {
        return false
      }
      if ( !(parent.xjsValidNumberCheck(strengur.substring(A+1,B))) ) {
        return false
      }
      if ( !(parent.xjsValidNumberCheck(strengur.substring(B+1,strengur.length))) ) {
        return false
      }
      var d = parseInt(strengur.substring(0,A), 10)
      var m = parseInt(strengur.substring(A+1,B), 10)
      var y = parseInt(strengur.substring(B+1,strengur.length), 10)
      if (y <= xjNowYear() && y >= 1901) {
        if (m <= 12 && m >= 1) {
          if ((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && d <= 31) {
            return true
          }
          else {
            if ((m == 4 || m == 6 || m == 9 || m == 11) && d <= 30) {
              return true
            }
            else {
              if (y % 4 == 0) {
                if (m == 2 && d <= 29) {
                  return true
                }
                else {
                  return false
                }
              }
              else {
                if (m == 2 && d <= 28) {
                  return true
                }
                else {
                  return false
                }
              }
            }
          }
        }
        else {
          return false
        }
      }
      else {
        return false
      }
    }
    else {
      return false
    }
  }
  return true
}
// Aðgerð: Athugar hvort kennitala sé gild frá formi
// Inntak: Tekur inn form, villustreng og tegund kennitölu
// Úttak:  Skilar true ef formið er gild kennitala eða tómur, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfCPRcheck(V,str,adferd) {
  if (V.value != "") {
    if ( xjsValidNumberCheck(V.value) && V.value.length == 10 ) {
      if (adferd == 1) {
        if (!(parseInt(V.value.charAt(0), 10) <= 3)) {
          alert(str)
          V.value = ""
          V.focus()
          return false
        }
      }
      if (adferd == 2) {
        if (!(parseInt(V.value.charAt(0), 10) >= 4 && parseInt(V.value.charAt(0), 10) <= 7)) {
          alert(str)
          V.value = ""
          V.focus()
          return false
        }
      }
      if (adferd == 3) {
        if (!(parseInt(V.value.charAt(0), 10) <= 7)) {
          alert(str)
          V.value = ""
          V.focus()
          return false
        }
      }
      if ( xjsCPRChecksumCheck(V.value) ) {
        return true
      }
      else {
        alert(str)
        V.value = ""
        V.focus()
        return false
      }
    }
    else {
      alert(str)
      V.value = ""
      V.focus()
      return false
    }
  }
  else {
    return true
  }
}
// Aðgerð: Athugar hvort vartala kennitölu sé gild
// Inntak: Tekur inn streng,
// Úttak:  Skilar true ef formið er gild vartala eða tómur, annars false
function xjsCPRChecksumCheck(strengur) {
  var sum = 0
  var factors = new Array(3, 2, 7, 6, 5, 4, 3, 2, 0, 0)
  var checksum
  var remainder
  for (var i = 0; i <= 9; i++) {
    sum = sum + parseInt(strengur.charAt(i), 10) * factors[i]
  }
  remainder = sum % 11
  if (remainder == 0) {
    checksum = 0
  }
  else {
    checksum = 11 - remainder
  }
  if (checksum == parseInt(strengur.charAt(8), 10)) {
    return true
  }
  else {
    return false
  }
}
// Aðgerð: Athugar hvort reikningsnúmer sé gilt frá formi
// Inntak: Tekur inn form og villustreng
// Úttak:  Skilar true ef formið er gilt reikningsnúmer eða tómt, annars false
//         Ef fals þá er formið hreinsað og villustrengur birtur
function xjfBankaCheck(V,str) {
  V.value = xjsMaskOff(V.value)
  if (!xjsValidNumberCheck(V.value)) {
    alert(str)
    V.value = ""
    V.focus()
    return false
  }
  else {
    return true
  }
}

//##### MASK aðgerðir #####

// Aðgerð: Tekur inn streng og tekur mask af
// Inntak: Tekur inn streng,
// Úttak:  Skilar streng án mask
function xjsMaskOff(strengur) {
  number2 = "";
  for (i=0; i < strengur.length; i++) {
    if (strengur.charAt(i) == ".") {
      number2 += "";
    }
    else{
      number2 += strengur.charAt(i);
    }
  }
    return number2;
}
// Aðgerð: Tekur inn streng og setur mask á
// Inntak: Tekur inn streng,
// Úttak:  Skilar streng með mask
function xjsMaskOn(strengur) {
  number = '' + xjsMaskOff(strengur + '');
  if (number.length > 3) {
     var mod = number.length % 3;
    var output = (mod > 0 ? (number.substring(0,mod)) : '');
     for (i=0 ; i < Math.floor(number.length / 3); i++) {
       if ((mod == 0) && (i == 0)) {
         output += number.substring(0, 3);
      }
      else {
        if (output == "-") {
           output += number.substring(mod + 3 * i, mod + 3 * i + 3);
        }
        else {
           output += '.' + number.substring(mod + 3 * i, mod + 3 * i + 3);
        }
      }
    }
    return (output);
  }
  else
    return number;
}

