// Check browser version
var isNav4 = false;
var DateSeperator="-"; 
var TimeSeperator=":";
var vDateType = 3; // Global value for type of date format 1=mm/dd/yyyy, 2=yyyy/dd/mm, 3=dd/mm/yyyy
var vTimeType=2;   // Globalt värde för tidsformat 2=hh:mm
if (navigator.appName == "Netscape") {
  if (navigator.appVersion < "5") {
    isNav4 = true;
  }
  else
    if (navigator.appVersion > "4") {
      isNav4 = false;
    }
}

function FormateraBelopp(Num) {
  Num=Num.toString().replace(/\$|\,/g,'');
  if (isNaN(Num))
    Num="0";
  var sign=(Num==(Num=Math.abs(Num)));
  Num=Math.floor(Num*100+0.50000000001);
  var Ore=Num%100;
  Num=Math.floor(Num/100).toString();
  if (Ore<10)
    Ore="0"+Ore;
  for (var i=0; i<Math.floor((Num.length-(1+i))/3); i++)
    Num=Num.substring(0, Num.length-(4*i+3))+' '+Num.substring(Num.length-(4*i+3));
  return (((sign)?'':'-')+Num+','+Ore);
}

function DateFormat(vDateName, vDateValue, e, dateType) {
  vDateType = dateType;
  // vDateName = object name
  // vDateValue = value in the field being checked
  // e = event
  // vDateType
  // 1 = mm/dd/yyyy
  // 2 = yyyy/mm/dd
  // 3 = dd/mm/yyyy
  //Enter a tilde sign for the first number and you can check the variable information.
  if (vDateValue == "~") {
    alert("AppVersion = "+navigator.appVersion+" \nNav. 4 Version = "+isNav4+
      " \nDate Type = "+vDateType+" \nSeparator = "+DateSeperator);
    vDateName.value = "";
    vDateName.focus();
    return true;
  }
  var whichCode = (window.Event) ? e.which : e.keyCode;
  // Check to see if a seperator is already present.
  // bypass the date if a seperator is present and the length greater than 8
  if (vDateValue.length > 8 && isNav4) {
    if ((vDateValue.indexOf("-") >= 1) || (vDateValue.indexOf("/") >= 1))
      return true;
  }
  //Eliminate all the ASCII codes that are not valid
  var alphaCheck = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-";
  if (alphaCheck.indexOf(vDateValue) >= 1) {
    if (isNav4) {
      vDateName.value = "";
      vDateName.focus();
      vDateName.select();
      return false;
    }
    else {
      vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
      return false;
    }
  }
  if (whichCode == 8) //Ignore the Netscape value for backspace. IE has no value
    return false;
  else {
    //Create numeric string values for 0123456789/
    //The codes provided include both keyboard and keypad values
    var strCheck = '47,48,49,50,51,52,53,54,55,56,57,58,59,95,96,97,98,99,100,101,102,103,104,105';
    if (strCheck.indexOf(whichCode) != -1) {
      if (vDateType == 1) {              // mm/dd/yyyy
        if (vDateValue.length == 2) {
          vDateName.value = vDateValue+DateSeperator;
        }
        if (vDateValue.length == 5) {
          vDateName.value = vDateValue+DateSeperator;
        }
      }
      if (vDateType == 2) {              // yyyy/mm/dd
        if (vDateValue.length == 4) {
          vDateName.value = vDateValue+DateSeperator;
        }
        // längden mellan 4 & 7 och det finns inget separatortecken
        if (vDateValue.length>4 && vDateValue.length<7 && vDateValue.indexOf(DateSeperator)==-1) {
          vDateName.value = vDateValue.substr(0, 4)+DateSeperator+vDateValue.substr(4);
        }
        if (vDateValue.length == 7) {
          vDateName.value = vDateValue+DateSeperator;
        }
        // längden > 7 och det finns inget separatortecken
        if (vDateValue.length>7 && vDateValue.indexOf(DateSeperator, 6)==-1) {
          vDateName.value = vDateValue.substr(0, 7)+DateSeperator+vDateValue.substr(7);
        }
      } 
      if (vDateType == 3) {              // dd/mm/yyyy
        if (vDateValue.length == 2) {
          vDateName.value = vDateValue+DateSeperator;
        }
        if (vDateValue.length == 5) {
          vDateName.value = vDateValue+DateSeperator;
        }
      }
      return true;
    }
    else {
      // If the value is not in the string return the string minus the last
      // key entered.
      if (isNav4) {
        vDateName.value = "";
        vDateName.focus();
        vDateName.select();
        return false;
      }
      else {
        vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
        return false;
      }
    }
  }
}

function TimeFormat(vTimeName, vTimeValue, e, TimeType) {
  vTimeType = TimeType;
  // vTimeName = object name
  // vTimeValue = value in the field being checked
  // e = event
  // vTimeType
  // 1 = ???
  // 2 = hh:mm
  // 3 = ???
  var whichCode = (window.Event) ? e.which : e.keyCode;
  // Check to see if a seperator is already present.
  // bypass the date if a seperator is present and the length greater than 3
  if (vTimeValue.length > 3 && isNav4) {
    if ((vTimeValue.indexOf("-") >= 1) || (vTimeValue.indexOf("/") >= 1))
      return true;
  }
  //Eliminate all the ASCII codes that are not valid
  var alphaCheck = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-";
  if (alphaCheck.indexOf(vTimeValue) >= 1) {
    if (isNav4) {
      vTimeName.value = "";
      vTimeName.focus();
      vTimeName.select();
      return false;
    }
    else {
      vTimeName.value = vTimeName.value.substr(0, (vTimeValue.length-1));
      return false;
    }
  }
  
  // alert('whichcode: '+whichCode);
  
  if (whichCode == 8) {  // har tryckt backspace
    return false;
  }
  else {
    //Create numeric string values for 0123456789/
    //The codes provided include both keyboard and keypad values
    var strCheck = '47,48,49,50,51,52,53,54,55,56,57,58,59,95,96,97,98,99,100,101,102,103,104,105';
    if (strCheck.indexOf(whichCode) != -1) {
      if (vTimeType == 2) {
        if (vTimeValue.length == 2) {
          vTimeName.value = vTimeValue+TimeSeperator;
        }
        if (vTimeValue.length>2 && vTimeValue.indexOf(TimeSeperator)==-1) {    // längden >2 och det finns inget separatortecken
          vTimeName.value = vTimeValue.substr(0, 2)+TimeSeperator+vTimeValue.substr(2, 2);
        }
      } 
      return true;
    }
    else {
      // If the value is not in the string return the string minus the last
      // key entered.
      if (isNav4) {
        vDateName.value = "";
        vDateName.focus();
        vDateName.select();
        return false;
      }
      else {
        vTimeName.value = vTimeName.value.substr(0, (vTimeValue.length-1));
        return false;
      }
    }
  }
}

function Validator(frmname) {
  this.formobj=document.forms[frmname];
  if (!this.formobj) {
    //alert("BUG: couldnot get Form object "+frmname);
    return;
  }
  if (this.formobj.onsubmit) {
    this.formobj.old_onsubmit = this.formobj.onsubmit;
    this.formobj.onsubmit=null;
  }
  else {
    this.formobj.old_onsubmit = null;
  }
  this.formobj.onsubmit=form_submit_handler;
  this.addValidation = add_validation;
  this.setAddnlValidationFunction=set_addnl_vfunction;
  this.clearAllValidations = clear_all_validations;
}

function set_addnl_vfunction(functionname) {
  this.formobj.addnlvalidation = functionname;
}

function clear_all_validations() {
  for (var itr=0;itr < this.formobj.elements.length;itr++) {
    this.formobj.elements[itr].validationset = null;
  }
}

function form_submit_handler() {
  for(var itr=0;itr < this.elements.length;itr++) {
    if (this.elements[itr].validationset && !this.elements[itr].validationset.validate()) {
      return false;
    }
  }
  if (this.addnlvalidation) {
    str =" var ret = "+this.addnlvalidation+"()";
    eval(str);
    if (!ret)
      return ret;
  }
  return true;
}

function add_validation(itemname,descriptor,errstr) {
  if (!this.formobj) {
    //alert("BUG: the form object is not set properly");
    return;
  }
  var itemobj = this.formobj[itemname];
  if (!itemobj) {
    //alert("BUG: Couldnot get the input object named: "+itemname);
    return;
  }
  if (!itemobj.validationset) {
    itemobj.validationset = new ValidationSet(itemobj);
  }
  itemobj.validationset.add(descriptor, errstr);
}

function ValidationDesc(inputitem, desc, error) {
  this.desc=desc;
  this.error=error;
  this.itemobj = inputitem;
  this.validate=vdesc_validate;
}

function vdesc_validate() {
 if (!V2validateData(this.desc, this.itemobj, this.error)) {
   this.itemobj.focus();
   return false;
 }
 return true;
}

function ValidationSet(inputitem) {
  this.vSet = new Array();
  this.add = add_validationdesc;
  this.validate = vset_validate;
  this.itemobj = inputitem;
}

function add_validationdesc(desc,error) {
  this.vSet[this.vSet.length]=new ValidationDesc(this.itemobj,desc,error);
}

function vset_validate() {
  for(var itr=0;itr<this.vSet.length;itr++) {
    if (!this.vSet[itr].validate()) {
      return false;
    }
  }
  return true;
}

function validateEmailv2(email) {
  // a very simple email validation checking. 
  // you can add more complex email checking if it helps 
  if (email.length <= 0) {
    return true;
  }
  var splitted = email.match("^(.+)@(.+)$");
  if (splitted == null) 
    return false;
  if (splitted[1] != null ) {
    var regexp_user=/^\"?[\w-_\.]*\"?$/;
    if (splitted[1].match(regexp_user) == null)
      return false;
  }
  if (splitted[2] != null) {
    var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
    if (splitted[2].match(regexp_domain) == null) {
      var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
      if (splitted[2].match(regexp_ip) == null)
        return false;
    }
    return true;
  }
  return false;
}

var dtCh="-";
var minYear=1900;
var maxYear=2100;
var ForBestTid=0;
var ValtDatum=0;
var raFlyg=false;
var raTag=false;
var VisaText="";
var chHamtTid=false;

function DefaultBestTid(BestTid) {
  ForBestTid=BestTid;
}

function SetFalt(Datum, Flyg, Tag, Txt, HamtTid, Faktureras) {
  ValtDatum=Datum;
  raFlyg=Flyg;
  raTag=Tag;
  Txt=Txt.replace(':', '');
  VisaText=Txt;
  chHamtTid=HamtTid;
  chFaktureras=Faktureras;
}

function isInteger(s){
  var i;
  for (i = 0; i < s.length; i++){   
    // Check that current character is number.
    var c = s.charAt(i);
    if (((c < "0") || (c > "9")))
      return false;
  }
  // All characters are numbers.
  return true;
}
  
function stripCharsInBag(s, bag){
  var i;
  var returnString = "";
  // Search through string's characters one by one.
  // If character is not in bag, append to returnString.
  for (i = 0; i < s.length; i++){   
    var c = s.charAt(i);
    if (bag.indexOf(c) == -1) 
      returnString += c;
  }
  return returnString;
}
  
function daysInFebruary (year){
  // February has 29 days in any year evenly divisible by four,
  // EXCEPT for centurial years which are not also divisible by 400.
  return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) {
  for (var i = 1; i <= n; i++) {
    this[i] = 31
    if (i==4 || i==6 || i==9 || i==11)
      {this[i] = 30}
    if (i==2)
      {this[i] = 29}
  } 
  return this
}

function IsTime(strTime) { 
  var strTime1 = /^(\d{1,2})(\:)(\d{2})\2(\d{2})(\ )\w[AM|PM|am|pm]$/; 
  var strTime2 = /^(\d{1,2})(\:)(\d{2})(\ )\w[A|P|a|p]\w[M|m]$/; 
  var strTime3 = /^(\d{1,2})(\:)(\d{1,2})$/; 
  var strFormat1 = strTime.match(strTime1); 
  var strFormat2 = strTime.match(strTime2); 
  var strFormat3 = strTime.match(strTime3); // Check to see if it matches one of the 3 Format Strings. 
  if (strFormat1 == null && strFormat2 == null && strFormat3 == null) {
    return false;
  } 
  else if (strFormat1 != null) { // Validate for this format: 3:48:01 PM 
    if (strFormat1[1] > 12 || strFormat1[1] < 00) { return false; } 
    if (strFormat1[3] > 59 || strFormat1[3] < 00) { return false; } 
    if (strFormat1[4] > 59 || strFormat1[4] < 00) { return false; } 
  } 
  else if (strFormat2 != null) { // Validate for this format: 3:48 PM 
    if (strFormat2[1] > 12 || strFormat2[1] < 00) { return false; } 
    if (strFormat2[3] > 59 || strFormat2[3] < 00) { return false; } 
  } 
  else if (strFormat3 != null) { // Validate for this format: 15:48 
    if (strFormat3[1] > 23 || strFormat3[1] < 00) { return false; } 
    if (strFormat3[3] > 59 || strFormat3[3] < 00) { return false; } 
  } 
  return true; 
}

function isDate(strValue) {  
  var objRegExp =/^\d{4}\-\d{2}\-\d{2}$/;
  //check to see if in correct format
  if (!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else {
    var arrayDate = strValue.split(DateSeperator); //split date into month, day, year
    //create a lookup for months not equal to Feb.
    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
      '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31};
    var intDay = parseInt(arrayDate[2], 10);
    //check if month value and day value agree
    if (arrayLookup[arrayDate[1]] != null) {
      if (intDay <= arrayLookup[arrayDate[1]] && intDay != 0)
        return true; //found in lookup table, good date
    }
    //check for February
    var intYear = parseInt(arrayDate[0], 10);
    var intMonth = parseInt(arrayDate[1], 10);
    if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0 && intMonth==2)
      return true; //Feb. had valid number of days
  }
  return false; //any other values, bad date
}     

function TidKoll(AktTid) {          
  var myDate = new Date();
  var intYear = myDate.getFullYear();
  var intMonth = myDate.getMonth()+1;
  if (intMonth<=9)
    intMonth="0"+intMonth;
  var intDay = myDate.getDate();
  if (intDay<=9)
    intDay="0"+intDay;
  var Idag = intYear+'-'+intMonth+'-'+intDay;
  // koll om valtdatum=dagens datum => gör kollen annars inte
  if (Idag==ValtDatum) {
    var arrayDate = AktTid.split(TimeSeperator); //split time into hour, minute
    var intHour = parseInt(arrayDate[0], 10);
    var intMin = parseInt(arrayDate[1], 10);
    var Datum = new Date();
    var Tim=Datum.getHours();
    var Min=Datum.getMinutes()+ForBestTid;    // lägg till minsta förbeställningstid
    while(Min>=60) {
      Min=Min-60;
      Tim=Tim+1;
    }
    Datum.setHours(Tim, Min);
    var NuTid = Datum.getTime();
    Datum.setHours(intHour, intMin);
    var Tid = Datum.getTime();
    if (Tid<NuTid) {
      return false; 
    }
  }
  return true;
}

function V2validateData(strValidateStr, objValue, strError) { 
  var epos = strValidateStr.search("="); 
  var  command  = ""; 
  var  cmdvalue = ""; 
  if (epos >= 0) { 
    command  = strValidateStr.substring(0,epos); 
    cmdvalue = strValidateStr.substr(epos+1); 
  } 
  else { 
    command = strValidateStr; 
  } 
  switch(command) { 
    case "req": 
    case "required": { 
      if (eval(objValue.value.length) == 0) { 
         if (!strError || strError.length ==0) { 
           strError = objValue.name + " : Obligatoriskt fält"; 
         }
         alert(strError); 
         return false; 
      }
      break;             
    }
    
    case "date": {  
      if (!isDate(objValue.value)) {
        alert("Fel format på datum! Var god och ange ett korrekt format!");
        return false; 
      } 
      break;      
    }
    
    case "time": {
      if (!IsTime(objValue.value)) {
        alert('Ej en giltig tid. Var god ange tiden i formatet hh:mm'); 
        return false; 
      }
      break;
    }
    
    case "gtdate": {   // koll att inte tidigare än dagens datum
      var arrayDate = objValue.value.split(DateSeperator); //split date into month, day, year
      var intYear = parseInt(arrayDate[0], 10);
      var intMonth = parseInt(arrayDate[1], 10);
      var intDay = parseInt(arrayDate[2], 10);
      var myDate = new Date();
      myDate.setFullYear(intYear, intMonth-1, intDay);
      var today = new Date();
      if (myDate<today) {
        alert("Angivet datum är tidigare än dagens datum!");
        return false; 
      }
      break;      
     }
     
    case "gttime": {   // koll att inte tidigare än aktuell tid
      if (!TidKoll(objValue.value)) {
        alert("Angivet klockslag är tidigare än tillåtet!");
        return false; 
      }
      break;      
    }
     
    case "spec1": {  // specialhantering! Om vissa fält ikryssade måste ett klockslag anges + vara rimligt
      if (raFlyg==true || raTag==true) {   // om flyg eller tåg
        if (eval(objValue.value.length)==0) {  // koll att det finns något angivet
          if (raFlyg==true) {
            alert("När Flyg är ifylld så måste "+VisaText+" anges"); 
          }
          else {
            alert("När Tåg är ifylld så måste "+VisaText+" anges"); 
          }
          return false; 
        }
        else {              // det fanns något angivet, kolla att tiden är i rätt format
          if (!IsTime(objValue.value)) {
            alert('Ej en giltig tid. Var god ange '+VisaText+'en i formatet hh:mm'); 
            return false;
          }
          else {            // kolla att tiden är rimlig
            if (!TidKoll(objValue.value)) {
              alert("Angiven "+VisaText+" är tidigare än tillåtet!");
              return false; 
            }
          }          
        }            
      }
      break;             
    }
    
    case "spec2": {  // specialhantering! Om hämttid är ikryssad måste hätmttiden vara tom ananrs inte + vara rimligt
      if (chHamtTid==false) {                 // om hämttid inte är ikryssad
        if (eval(objValue.value.length)==0) {  // koll att det finns något angivet
          alert("Hämttid måste anges"); 
          return false; 
        }
        else {              // det fanns något angivet, kolla att tiden är i rätt format
          if (!IsTime(objValue.value)) {
            alert('Ej en giltig tid. Var god ange hämttiden i formatet hh:mm'); 
            return false;
          }
          else {            // kolla att tiden är rimlig
            if (!TidKoll(objValue.value)) {
              alert("Angiven hämttid är tidigare än tillåtet!");
              return false; 
            }
          }          
        }            
      }
      else {                             // hämttid är ikryssad
        if (eval(objValue.value.length)!=0) {  // koll att det finns något angivet
          alert("Hämttid ska inte anges! "+'\n'+"Det görs av beställningscentralen "+'\n'+"med hjälp av angiven "+VisaText); 
          return false; 
        }
      }
      break;             
    }

    case "spec3": {  // specialhantering! Om flyg är ikryssad måste flygnr vara angivet
      if (raFlyg==true) {                 // om flyg är ikryssad
        if (eval(objValue.value.length)==0) {  // koll att det finns något angivet
          alert("Flygnr måste anges!"); 
          return false; 
        }
      }
      break;             
    }

    case "spec4": {  // specialhantering! Om faktureras är ikryssad måste kst vara angivet
      if (chFaktureras==true) {             // om faktureras är ikryssad
        if (eval(objValue.value.length)==0) {  // koll att det finns något angivet
          alert("Kostnadsställe måste anges!"); 
          return false; 
        }
      }
      break;             
    }

    case "maxlength":
    case "maxlen": { 
      if (eval(objValue.value.length) >  eval(cmdvalue)) { 
        if (!strError || strError.length ==0) { 
          strError = objValue.name + " : "+cmdvalue+" max tecken "; 
        }
        alert(strError + "\n[Nuvarande längd = " + objValue.value.length + " ]"); 
        return false; 
      }
      break; 
    }
    
    case "minlength": 
    case "minlen": { 
      if (eval(objValue.value.length) <  eval(cmdvalue)) {
        if (!strError || strError.length ==0) {
          strError = objValue.name + " : " + cmdvalue + " min tecken  "; 
        }
        alert(strError + "\n[Nuvarande längd = " + objValue.value.length + " ]");
        return false;
      }
      break; 
    }
    
    case "alnum":
    case "alphanumeric": {
      var charpos = objValue.value.search("[^A-Za-z0-9]");
      if (objValue.value.length > 0 &&  charpos >= 0) {
        if (!strError || strError.length ==0) {
          strError = objValue.name+": Endast alfanumeriska tecken tillåtna ";
        }
        alert(strError + "\n [Fel vid pos " + eval(charpos+1)+"]");
        return false;
      }
      break; 
    }
    
    case "num":
    case "numeric": {
      var charpos = objValue.value.search("[^0-9]");
      if (objValue.value.length > 0 &&  charpos >= 0) {
        if (!strError || strError.length ==0) {
          strError = objValue.name+": Endast siffror tillåtna "; 
        }               
        alert(strError + "\n [Fel vid pos " + eval(charpos+1)+"]");
        return false;
      }
      break;               
    }
    
    case "alphabetic":
    case "alpha": {
      var charpos = objValue.value.search("[^A-Za-z]");
      if (objValue.value.length > 0 &&  charpos >= 0) {
        if (!strError || strError.length ==0) {
          strError = objValue.name+": Endast bokstäver tillåtna ";
        }
        alert(strError + "\n [Fel vid pos " + eval(charpos+1)+"]");
        return false;
      }
      break; 
    }
    
    case "alnumhyphen": {
      var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
      if (objValue.value.length > 0 &&  charpos >= 0) {
        if (!strError || strError.length ==0) {
          strError = objValue.name+": endast tecken A-Z,a-z,0-9,- och _";
        }
        alert(strError + "\n [Fel vi pos " + eval(charpos+1)+"]");
        return false;
      }
      break;
    }
    
    case "email": {
      if (!validateEmailv2(objValue.value)) {
        if (!strError || strError.length ==0) {
          strError = objValue.name+": Skriv in en giltig epostadress ";
        }
        alert(strError);
        return false;
      }
      break; 
    }
    
    case "lt":
    case "lessthan": {
      if (isNaN(objValue.value)) {
        alert(objValue.name+": Ska vara ett nummer ");
        return false;
      }
      if (eval(objValue.value) >=  eval(cmdvalue)) {
        if (!strError || strError.length ==0) {
          strError = objValue.name + " : värdet ska vara mindre än "+ cmdvalue;
        }
        alert(strError);
        return false;
      }
      break; 
    }
    
    case "gt":
    case "greaterthan": {
      if (isNaN(objValue.value)) {
        alert(objValue.name+": Ska vara ett nummer ");
        return false;
      }
      if (eval(objValue.value) <=  eval(cmdvalue)) {
        if (!strError || strError.length ==0) {
          strError = objValue.name + " : värdet ska vara större än "+ cmdvalue; 
        }
        alert(strError);
        return false;
      }
      break; 
    }
     
    case "regexp": {
      if (objValue.value.length > 0) {
        if (!objValue.value.match(cmdvalue)) {
          if (!strError || strError.length ==0) {
            strError = objValue.name+": Ej tillåtna tecken funna "; 
          }
          alert(strError);
          return false;
        }
      }
      break; 
    }
    
    case "dontselect": {
      if (objValue.selectedIndex == null) {
        //alert("BUG: dontselect command for non-select Item");
        return false;
      }
      if (objValue.selectedIndex == eval(cmdvalue)) {
        if (!strError || strError.length ==0) {
          strError = objValue.name+": Var god och välj ett värde ";
        }
        alert(strError);
        return false;
      }
      break;
    }
  }
  return true; 
}