/*********************************************************Set of JavaScript functions used throughout the databaseJavaScript Validation 1.7, 23/Oct/00Jake Howlett, http://www.codestore.net/2000.11.19 - John Dalsgaard, Dalsgaard DataExtended to handle danish error messages**********************************************************/var vLanguage = ''		// Global variable to hold language if different from english	2000.11.19/Jdavar messages = new Array();var firstInvalidItem = null;/***********************************************************validateNumber()This function checks that the value of a field is a numberand, optionally within a certain range.Arguments:val = Value to be checkedmin = Optional minimum allowed valuemax = Optional maximum allowed value************************************************************/function ValidateNumber(val, min, max){	if ( isNaN(val) ) return false;	if ( min && val < min ) return false;	if ( max && val > max ) return false;	return true;}/***********************************************************DateComponents()This function splits a date in to the day, month and year components, depending on the format supplied. Used by Date Validation routine.Arguments:obj = Input whose value is to be checkedformat = date format, ie mm/dd or dd/mm************************************************************/function DateComponents(dateStr, format) {	var results = new Array();	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;	var matchArray = dateStr.match(datePat);		if (matchArray == null) { 		return null; 	}	// parse date into variables	if (format.charAt(0)=="d"){ //what format does the server use for dates? 		results[0] = matchArray[1];		results[1] = matchArray[3];	} else { 		results[1] = matchArray[1];		results[0] = matchArray[3]; }	results[2] = matchArray[4];	return results;}/***********************************************************validateDate()This function checks that the value of a date is in the correct format and, optionally within a certain range.Arguments:obj = Input whose value is to be checkedmin = Optional minimum allowed valuemax = Optional maximum allowed valueformat = date format, ie mm/dd or dd/mm************************************************************/function ValiDate(obj, min, max, format){		dateBits = DateComponents(obj.value, format);	if (dateBits == null) return false;//Check it is a valid date first	day = dateBits[0];	month = dateBits[1];	year = dateBits[2];	if ((month < 1 || month > 12) || (day < 1 || day > 31)) { // check month range 		return false;	} 	if ((month==4 || month==6 || month==9 || month==11) && day==31) {		return false;	}	if (month == 2) {	// check for february 29th 		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); 		if (day>29 || (day==29 && !isleap)) {			return false;		}	} //Now check whether a range is specified and if in bounds	var theDate = new Date(dateBits[2], parseInt(dateBits[1]) - 1, dateBits[0]);	if ( min ) {		minBits = DateComponents (min, format);		var minDate = new Date(minBits[2], parseInt(minBits[1]) - 1, minBits[0]);		if ( minDate.getTime() > theDate.getTime() ) return false;	} 	if ( max) {		maxBits = DateComponents (max, format);		var maxDate = new Date(maxBits[2], parseInt(maxBits[1]) - 1, maxBits[0]);		if ( theDate.getTime() > maxDate.getTime() ) return false;	}	return true;}function ValidateMultipleEmail(obj) {	var emails;	var validatedEmail = true;	if (obj.value.indexOf(';') > -1) {		emails = obj.value.split(';');	} else if (obj.value.indexOf(',') > -1) {		emails = obj.value.split(',');	} else {		emails = obj.value;	}	for (var i = 0;i < emails.length;i++) {		if (!ValidateEmail(trim(emails[i]))) {			validatedEmail = false;		}	}	return validatedEmail;}/***********************************************************validateEmail()This function checks that the value of a field is a valid SMTP e-mail address ie x@xx.xxArguments:obj = Input whose value is to be checkedOrigianl source:http://javascript.internet.comAuthor:Sandeep V. Tamhankar (stamhankar@hotmail.com)Note: Work in progress = validate SMTP OR Notes Canonical************************************************************/function ValidateEmail(obj){var emailStr;if (typeof obj != 'string') {	emailStr=obj.value;} else {	emailStr=obj;}var emailPat=/^(.+)@(.+)$/var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"var validChars="\[^\\s" + specialChars + "\]"var quotedUser="(\"[^\"]*\")"var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/var atom=validChars + '+'var word="(" + atom + "|" + quotedUser + ")"var userPat=new RegExp("^" + word + "(\\." + word + ")*$")var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")var matchArray=emailStr.match(emailPat)if (matchArray==null) {	return false}var user=matchArray[1]var domain=matchArray[2]// See if "user" is valid if (user.match(userPat)==null) {    return false}// make sure the IP address is validvar IPArray=domain.match(ipDomainPat)if (IPArray!=null) {	  for (var i=1;i<=4;i++) {	    if (IPArray[i]>255) {		return false	    }    }    return true}var domainArray=domain.match(domainPat)if (domainArray==null) {    return false}var atomPat=new RegExp(atom,"g")var domArr=domain.match(atomPat)var len=domArr.lengthif (domArr[domArr.length-1].length<2 ||     domArr[domArr.length-1].length>6) {   // the address must end in a two-six letter word.   return false}// Make sure there's a host name preceding the domain.if (len<2) {   return false}// If we've gotten this far, everything's valid!return true;}/***********************************************************OnFailure()This function returns the failure message to the user andsets focus on the input in question.Arguments:obj = Input element on which to return focuslbl = Field Label to prepend on to the messagemsg = Array value for message to give the user************************************************************/function OnFailure( obj, lbl, msg ){	var msgs = new Array();    if(vLanguage == 'dk') {			// Added danish messages as an option.	2000.11.19/Jda/*		msgs["text"] = " skal udfyldes. \n\u00BB Indtast en v\u00E6rdi.";		msgs["textarea"] = " skal udfyldes. \n\u00BB V\u00E6lg en v\u00E6rdi fra listen.";		msgs["select-one"] = " skal udfyldes. \n\u00BB V\u00E6lg en v\u00E6rdi fra listen.";		msgs["select-multiple"] = " skal udfyldes. \n\u00BB V\u00E6lg en v\u00E6rdi fra listen.";		msgs["checkbox"] = " skal udfyldes. \n\u00BB V\u00E6lg et punkt.";		msgs["radio"] = " skal udfyldes. \n\u00BB V\u00E6lg et punkt.";		msgs["number"] = " skal udfyldes med et tal. \n\u00BB Indtast et gyldigt tal";		msgs["date"] = " skal udfyldes med en gyldig dato. \n\u00BB Indtast en gyldig dato p\u00E5 formen: DD-MM-\u00C5\u00C5\u00C5\u00C5";		msgs["email"] = " skal udfyldes med en gyldig email adresse. \n\u00BB Indtast en gyldig email adresse.";*/		msgs["text"] = " skal udfyldes.";		msgs["textarea"] = " skal udfyldes.";		msgs["select-one"] = " skal udfyldes.";		msgs["select-multiple"] = " skal udfyldes.";		msgs["checkbox"] = " skal udfyldes.";		msgs["radio"] = " skal udfyldes.";		msgs["number"] = " skal udfyldes med et tal.";		msgs["date"] = " skal udfyldes med en gyldig dato (DD-MM-\u00C5\u00C5\u00C5\u00C5).";		msgs["email"] = " skal udfyldes med en gyldig adresse.";		var between = " mellem ";		var and = " og ";		var greaterthan = " st\u00F8rre end ";		var after = " efter ";		var lessthan = " mindre end ";		var before = " f\u00F8r ";	}	else {		msgs["text"] = " is a required field. \n\nPlease enter a value.";		msgs["textarea"] = " is a required field. \n\nPlease enter a value.";		msgs["select-one"] = " is a required field. \n\nPlease select an entry.";		msgs["select-multiple"] = " is a required field. \n\nPlease select an entry.";		msgs["checkbox"] = " is a required field. \n\nPlease select an entry.";		msgs["radio"] = " is a required field. \n\nPlease select an entry.";		msgs["number"] = " is a numeric field. \n\nPlease enter a valid number";		msgs["date"] = " is a date field. \n\nPlease enter a valid date";		msgs["email"] = " is an address field. \n\nPlease enter a valid e-mail address.";		var between = " between ";		var and = " and ";		var greaterthan = " greater than ";		var after = " after ";		var lessthan = " less than ";		var before = " before ";	}	if( firstInvalidItem == null) {		firstInvalidItem = obj;	}	if(msg[1]	|| msg[2]){ //upper/lower bound ranges have been specified		if(msg[1]	&& msg[2]){//range			term = ( msg[0] == "date" )? " ("+msg[3]+")" : "";			return lbl + msgs[msg[0]] + term + between + msg[1] + and + msg[2] + ".";		} else if (msg[1]) {//lower bound			term = ( msg[0] == "number" ) ? greaterthan : " (" + msg[3] + ")" + after;			return lbl + msgs[msg[0]] + term + msg[1];		} else {//upper bound			term = ( msg[0] == "number" )? lessthan : " (" + msg[3] + ")" + before;			return lbl + msgs[msg[0]] + term + msg[2];		}	} else {//no range given		return lbl + msgs[msg[0]];	}				return "";}/***********************************************************isSomethingSelected()This function is passed an object of type redio group or checkbox. It then loops through all options and checks that one of them is selected, returning true if so.Arguments:obj = Reference to the parent object of the group.************************************************************/function isSomethingSelected( obj ){	var singleObj = true;	try {		obj[0].checked;		singleObj = false;	} catch(e) {	}		if(singleObj) {		return obj.checked;	}		for (var r=0; r < obj.length; r++){		if ( obj[r].checked ) return true;	}	return false;		}/***********************************************************validateRequiredFields()This function is passed an array of fields that are requiredto be filled in and iterates through each ensuring they havebeen correctly entered.************************************************************/function validateRequiredFields( f, a, langSelect ){		vLanguage = langSelect;		// Set global language variable (used in OnFailure).	2000.11.19/Jda	for (var i=0; i < a.length; i++){		e = a[i][0];			//checks input types: "text","select-one","select-multiple","textarea","checkbox","radio"				switch (e.type) {					case "text":							var msgIndex = messages.length;							if ( trim(e.value) == "" ) {								messages[msgIndex] = OnFailure(e, a[i][1], ["text"]);							}							if ( a[i][2] ) {								switch ( a[i][2][0] ){									case "number":										if ( !ValidateNumber(e.value, a[i][2][1], a[i][2][2]) ) { 											messages[msgIndex] =  OnFailure(e, a[i][1], ["number", a[i][2][1], a[i][2][2]]);										 }										break;									case "date":										if ( !ValiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) {											messages[msgIndex] = OnFailure(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]]);										}										break;									case "email":										if ( !ValidateEmail(e) )  {											messages[msgIndex] = OnFailure(e, a[i][1], ["email"]);										}										break;									case "multiple-email":										if ( !ValidateMultipleEmail(e) )  {											messages[msgIndex] = OnFailure(e, a[i][1], ["email"]);										}										break;									default:										break;								}							}						break					case "textarea":						if ( trim(e.value) == "" ) {							messages[messages.length] = OnFailure(e, a[i][1], ["textarea"]);						}						break					case "select-one":					if ( e.selectedIndex == 0 ) {						messages[messages.length] = OnFailure(e, a[i][1], ["select-one"]);					}						break					case "select-multiple":					if (e.selectedIndex == -1) {						messages[messages.length] = OnFailure(e, a[i][1], ["select-multiple"]);					}						break					default:						//must be a checkbox or a radio group if non of above						var t = "";												 try {							t = e[0].type						} catch (e) {								t = "radio"						}												switch (t) {								case "checkbox":								if ( !isSomethingSelected( e ) )  {									messages[messages.length] = OnFailure(e[0], a[i][1], ["checkbox"]);								}							break							case "radio":								if ( !isSomethingSelected( e ) ) {									messages[messages.length] = OnFailure(e[0], a[i][1], ["radio"]);								}								break								default:									break							}						break				}	}	var info ="";	if(messages.length  > 0) {				for( count = 0; count < messages.length; count++) {			info = info + "\u00BB " + messages[count] + "\n";		}		messages.length = 0;				if( firstInvalidItem != null) {			try {			firstInvalidItem.focus();			} catch(e) { /* ignore if the item is not visible */	}			try {				firstInvalidItem.select();			} catch(e) { /* ignore if the item does not have the select method. Like a <select> tag */	}			firstInvalidItem = null;		}		alert("Der er felter som ikke er udfyldt korrekt:\n\n" + info);			}	return (info  == "");}//Functions not involved in the validation............./***********************************************************doDelete is used to delete the from the serverThe user is first asked to confirm that this is what theywant to do. Giving them the chance to cancel the action.This works SIMPLY by changing the end of the URL from "?OpenDocument" to "?DeleteDocument"************************************************************/function doDelete() {	if ( confirm('Are you sure you want to delete this document?') ){		location.search = "?DeleteDocument";	}}/***********************************************************trim is a simple function to remove leading/trailing spaces************************************************************/function trim(aStr) {	return aStr.replace(/^\s{1,}/, "").replace(/\s{1,}$/, "")}/***********************************************************following two functions call the date picking dialog box************************************************************/function myDateDialog(){	var retDay;	var retMonth;	var retYear;}function openDatePickerDialog(wnd, field, dateFormat) {	myDateDialog.retDay="";	myDateDialog.retMonth="";	myDateDialog.retYear="";	var pathname = window.location.pathname;	var dlgURL = pathname.substring(0,(pathname.lastIndexOf(".nsf") + 5))+'dlgDatePicker?OpenForm';	if(wnd.showModalDialog(dlgURL,myDateDialog,"dialogHeight:380px;dialogWidth:280px;center")==true){		field.value=dateFormat.replace(/yyyy/, myDateDialog.retYear).replace(/mm/, myDateDialog.retMonth).replace(/dd/, myDateDialog.retDay);	}else{		return;	}}function validateCurrency( fld ) {    var temp_value = fld.value;   var hasReachedComma = 0;   var charsAfterComma = 0;   if (temp_value == "")    {      fld.value = "0,00";      return true;    }    var Chars = "0123456789,";    for (var i = 0; i < temp_value.length; i++)    {       if (Chars.indexOf(temp_value.charAt(i)) == -1)       {          alert("Ulovlige tegn.\n\nKun tegnene (0-9) og komma er tilladte i dette felt.");          fld.focus();          fld.select();          return false;       }      if (hasReachedComma == 1)      {         if (charsAfterComma == 2) {            alert("Der m\u00E5 kun forekomme 2 tegn efter komma.");            fld.focus();             fld.select();             return false;         }         charsAfterComma++;      }      if (temp_value.charAt(i) == ",")       {         if (hasReachedComma == 1) {            alert("Der m\u00E5 kun forekomme 1 komma.");            fld.focus();             fld.select();             return false;         }         hasReachedComma = 1;      }   }   return true;}function validateCurrencyNotZero( fld ) { 	if(validateCurrency(fld)) {		if (fld.value <= 0 || fld.value == "0,0" || fld.value == "0,00") {			alert("Bel\u00F8bet skal v\u00E6re st\u00F8rre end 0.");			fld.focus(); 			fld.select(); 			return false;		}		else {			return true;		}	}	else {		return false;	}} // end function validateCurencyNotZerofunction fixDate(field) {	var dateString = field.value;	var dmy = dateString.split("-");	if(field.value.length== 0) {		return;	}	if (dmy.length==1) { // No hyphen in Date		if (dateString.length > 8) {		// Date = DDMMYYYY			dateString = dateString.substr(0, 8);		}				if (dateString.length==8) {		// Date = DDMMYYYY			field.value = dateString.substr(0, 2) + "-" + dateString.substr(2, 2) + "-" + dateString.substr(4, 4);		} else if (dateString.length==6) {	// Date = DDMMYY			if (dateString.substr(4, 2)<"50") {				field.value = dateString.substr(0, 2) + "-" + dateString.substr(2, 2) + "-20" + dateString.substr(4, 2);			} else {				field.value = dateString.substr(0, 2) + "-" + dateString.substr(2, 2) + "-19" + dateString.substr(4, 2);			}; // end if		}; // end if	} else {	// Hyphen found in date		if (dmy.length==3 && dmy[0].length==2 && dmy[1].length==2 && dmy[2].length==2) {	// Date = DD-MM-YY			if (dmy[2]<"50") {				field.value = dmy[0] + "-" + dmy[1] + "-20" + dmy[2];			} else {				field.value = dmy[0] + "-" + dmy[1] + "-19" + dmy[2];			}; // end if		}; // end if	}; // end if	var yearInput = parseInt(field.value.substr(6,4));	var yearNow = new  Date().getFullYear();	var maxYear = parseInt(yearNow + 100);	var minYear = parseInt(yearNow - 100);	if(yearInput > maxYear) {		alert("Man kan kun indtaste datoer som er mindre end 100 \u00E5r frem i tiden.");		field.value = field.value.substr(0, 6) + maxYear;	} else if(yearInput < minYear) {		alert("Man kan kun indtaste datoer som er mindre end 100 \u00E5r tilbage i tiden.");		field.value = field.value.substr(0, 6) + minYear;	}	if(parseInt(field.value.substr(0, 2)) > 31) {		alert("Dagen i datoen kan max v\u00E6re 31.");		field.value = "31" +field.value.substr(2, 8);	}	if(parseInt(field.value.substr(3, 2)) > 12) {		alert("M\u00E5neden i datoen kan max v\u00E6re 12.");		field.value = field.value.substr(0, 3) + "12" + field.value.substr(5, 5) ;	}	} // end function fixDatefunction diffDates(date1AsText, date2AsText) {	var date1 = new Date();	var date2 = new Date();	date1.setYear(date1AsText.substr(6,4));	date1.setMonth(date1AsText.substr(3,2)-1);	date1.setDate(date1AsText.substr(0,2));	date2.setYear(date2AsText.substr(6,4));	date2.setMonth(date2AsText.substr(3,2)-1);	date2.setDate(date2AsText.substr(0,2));	return((date2-date1)/(1000*60*60*24));} // end function diffDatesfunction getLowestDate(date1AsText, date2AsText) {	var date1 = new Date();	var date2 = new Date();	date1.setYear(date1AsText.substr(6,4));	date1.setMonth(date1AsText.substr(3,2)-1);	date1.setDate(date1AsText.substr(0,2));	date2.setYear(date2AsText.substr(6,4));	date2.setMonth(date2AsText.substr(3,2)-1);	date2.setDate(date2AsText.substr(0,2));	if(date1 > date2)		return date1AsText;			return date2AsText;			} // end function getLowestDatefunction getHighestDate(date1AsText, date2AsText) {	var date1 = new Date();	var date2 = new Date();	date1.setYear(date1AsText.substr(6,4));	date1.setMonth(date1AsText.substr(3,2)-1);	date1.setDate(date1AsText.substr(0,2));	date2.setYear(date2AsText.substr(6,4));	date2.setMonth(date2AsText.substr(3,2)-1);	date2.setDate(date2AsText.substr(0,2));	if(date1 > date2)		return date1AsText;			return date2AsText;		} // end function getHighestDatefunction checkUploadConstrains(f) {	var type = f.Indleveringstype.options[f.Indleveringstype.selectedIndex].text;	var kuld = (type.toLowerCase().indexOf("kuld ") != -1);	var medmoder = (type.toLowerCase().indexOf("med mor") != -1);	var erAflivet = (typeof f.Aflivningsdato != "undefined" && f.Aflivningsdato.value != "");	var erUdleveret = (typeof f.UdleveringsDato != "undefined" && f.UdleveringsDato.value != "")		if(typeof f.IndleveringsDato != "undefined") {		IndDato = f.IndleveringsDato.value;	} else {		IndDato = indleveringsDato;	}			if(typeof f.IndleveringsDato != "undefined" && IndDato != "") { 			if(diffDates(IndDato, todaysDate) > 30) {				messages[messages.length] = "Indleveringsdato m\u00E5 ikke v\u00E6re over 1 m\u00E5ned siden.";				if(firstInvalidItem == null) firstInvalidItem = f.IndleveringsDato;								} else {				if(diffDates(IndDato, todaysDate) < 0) {					messages[messages.length] = "Du kan ikke fremdatere indleveringsdatoen.";					if(firstInvalidItem == null) firstInvalidItem = f.IndleveringsDato;									}			}					}		if(erUdleveret) {		if(diffDates(IndDato, f.UdleveringsDato.value) < 0) {			messages[messages.length] = "Dyret kan ikke udleveres f\u00F8r det er indleveret.";			if(firstInvalidItem == null) firstInvalidItem = f.UdleveringsDato;							}	}			if(erAflivet) {		if(diffDates(IndDato, f.Aflivningsdato.value) < 0) {			messages[messages.length] = "Dyret kan ikke aflives f\u00F8r det er indleveret.";			if(firstInvalidItem == null) firstInvalidItem = f.Aflivningsdato;							}	}		// Check kids and their birthdate	if((typeof f.BirthDateKids != "undefined") && f.BirthDateKids.value !="" ) {		if(Art == "Hund" && kuld) {			var diff = diffDates(f.BirthDateKids.value, IndDato);			if(diff > 8*7 || diff < 0) {				messages[messages.length] = "Hvalpenes alder skal v\u00E6re mellem 0 og 8 uger.";				if(firstInvalidItem == null) firstInvalidItem = f.BirthDateKids;								}		}		if(Art == "Kat" && kuld) {			var diff = diffDates(f.BirthDateKids.value, IndDato);			if(medmoder) {				if(diff > 12*7 || diff < 0) {					messages[messages.length] = "Killingernes alder skal v\u00E6re mellem 0 og 12 uger.";					if(firstInvalidItem == null) firstInvalidItem = f.BirthDateKids;									}			}			else {				if(diff > 8*7 || diff < 0) {					messages[messages.length] = "Killingernes alder skal v\u00E6re mellem 0 og 8 uger.";					if(firstInvalidItem == null) firstInvalidItem = f.BirthDateKids;				}			}		}	} 	// Check kids and their birthdate	if((typeof f.BirthDateInput != "undefined") && f.BirthDateInput.value !="" ) {		// following 2 vars moved into "if" by TF 060705	 	var highDate = getHighestDate(f.BirthDateInput.value, IndDato);		var lowDate = getLowestDate(f.BirthDateInput.value, IndDato);		if(Art == "Hund" && kuld && UngeJaNej=="Ja") {//			var diff = diffDates(f.BirthDateInput.value, IndDato);			var diff = diffDates(highDate, lowDate);			if(diff > 8*7 || diff < 0) {				messages[messages.length] = "Hvalpenes alder skal v\u00E6re mellem 0 og 8 uger.";				if(firstInvalidItem == null) firstInvalidItem = f.BirthDateInput;								}		}		if(Art == "Kat" && kuld && UngeJaNej=="Ja") {//			var diff = diffDates(f.BirthDateInput.value, IndDato);			var diff = diffDates(highDate, lowDate);			if(medmoder) {				if(diff > 12*7 || diff < 0) {					messages[messages.length] = "Killingernes alder skal v\u00E6re mellem 0 og 12 uger.";					if(firstInvalidItem == null) firstInvalidItem = f.BirthDateInput;									}			}			else {				if(diff > 8*7 || diff < 0) {					messages[messages.length] = "Killingernes alder skal v\u00E6re mellem 0 og 8 uger.";					if(firstInvalidItem == null) firstInvalidItem = f.BirthDateInput;				}			}		}	}	/*	THIS VALIDATION HAS TO BE CORRECTED, BECAUSE IT CONFLICTS...		if(typeof f.BirthDateInput != "undefined" && f.BirthDateInput.value!="" && UngeJaNej!="Ja") {		if(diffDates(f.BirthDate.value, IndDato) < 0) {			messages[messages.length] = "Dyret skal v\u00E6re f\u00F8dt ved indlevering.";			if(firstInvalidItem == null) firstInvalidItem = f.BirthDateInput;		}	}*/	return (messages.length == 0);} // end function checkUploadConstrains