//All the functions to validate standard strings and numbers.
//Telephone, email, barcodes, postal code.

//Telephone Check. Returns false if invalid and returns formatted phone number if valid.
function validPhone(phoneStr){
	// matches (999)-999-9999, (999) 999-9999, (999)999-999, etc.
	var regexp = /^((\((\d{3})\)|(\d{3}))[- ]?){1}(\d{3})[- ]?(\d{4})$/;
	var newphoneStr = ""
	// exec() returns an array:
	if ( regexp.exec( phoneStr ) ) {
		// one of $3 or $4 will be null:
		if ( RegExp.$3 == "" && RegExp.$4 == "") { alert( "Invalid phone number:\n" + phoneStr ); return false; }
		else {
			newphoneStr = RegExp.$3 + RegExp.$4 + "-" + RegExp.$5 + "-" + RegExp.$6;
			//document.write(newphoneStr);
			return newphoneStr;  
		}				
	}
	else { alert( "Invalid phone number:\n" + phoneStr ); return false; }
}

// Email Check. Returns false if invalid and returns email address if valid.
function validEmail(emailStr){
	var emailPat=/^(.+)@(.+)$/
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	var validChars="\[^\\s" + specialChars + "\]"
	var firstChars=validChars
	var quotedUser="(\"[^\"]*\")"
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var atom="(" + firstChars + validChars + "*" + ")"
	var word="(" + atom + "|" + quotedUser + ")"
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
	var matchArray=emailStr.match(emailPat)
	
	if(emailStr.length!=0) {
		if (matchArray==null) { alert("Email address seems incorrect (check @ and .'s)"); return false; }

		var user=matchArray[1]
		var domain=matchArray[2]
		if (user.match(userPat)==null) { alert("Email username doesn't seem to be valid."); return false; }
	
		var IPArray=domain.match(ipDomainPat);
		if (IPArray!=null) {
			// this is an IP address
			for (var i=1;i<=4;i++) { if (IPArray[i]>255) { alert("Destination IP address is invalid."); return false; } }
		}
	
		var domainArray=domain.match(domainPat);
		if (domainArray==null) { alert("Domain name doesn't seem to be valid."); 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>3) {
			alert("Email address must end in a three-letter domain, or two letter country.");
			return false;
		}
		if (domArr[domArr.length-1].length==3 && len<2) { alert("Email address is missing a hostname."); return false; }
		//if passed all the checks and gotten here without returning, is an ok email.
		return emailStr;
	}
	else { alert("Blank email address."); return false; }
}

//Postal Code. Returns false if invalid and formatted postal code if valid.
function validPostalCode(codeStr){	
	var codestring=""
  codestring = codeStr.toUpperCase(); //Change to uppercase
  var regexp = /^([A-Z][0-9][A-Z])[ -]?([0-9][A-Z][0-9])$/;
  // exec() returns an array:
  if ( regexp.exec( codestring ) ) { codeStr = RegExp.$1 + " " + RegExp.$2; return codeStr; }
	else {
		alert("Your Postal Code is not valid, example V6Y 1R8");
		return false;
	}
}

function codabarCheckDigit(number) {
	var total = 0;
	for (var i=0;i < 13; i++ ) {
		if ( i % 2 ) {
			total += Number(number.charAt(i));
	
		} else {
			var product = 2 * Number(number.charAt(i));
			if (product > 9) {
				total += product - 9;
			} else {
				total += product;
			}
		}
	}
	var remainder = total % 10;
	var checkdigit;
	if ( ! remainder ) {
		checkdigit = 0;
	} else {
		checkdigit = 10 - remainder;
	}
	return checkdigit;
}

//Library Card. Returns false if invalid and barcode if valid.
function validBarcode(codeStr){	
	//alert("HELP"); return false;
	codeStr = codeStr.replace(/\D/g, "");
  var allNumbers=/^\d*$/;
	//var barcodePattern=/^(2|3)1290\d{9}$/;  //This pattern accepts RPL patron and item barcodes only
	var barcodePattern=/^\d{14}$/; //Accepts any fourteen digit patron barcode
	var checkTotal = 0;
	var checkDigit = 0;
  var bEven  = false;
	
	if(codeStr.length != 14){alert("This barcode does not have the correct number of digits!"); return false; }
	if(!allNumbers.test(codeStr)){alert ("The barcode can only contain numerals!"); return false;}
	if(!barcodePattern.test(codeStr)){alert("Invalid barcode."); return false;}
	//alert(codabarCheckDigit(codeStr));
	
	if(codabarCheckDigit(codeStr) == codeStr.charAt(13)){return codeStr;}
	alert("Invalid barcode.");
	return false;
}

//ISBN. Returns false if invalid and formatted ISBN is valid.
function validISBN(isbnStr){
	isbnStr = isbnStr.replace(/-/g, "");
	isbnStr = isbnStr.replace(/ /g, "");
	if (isbnStr.length!=10 && isbnStr.length!=13){
		alert ("Your ISBN entry must be 10 or 13 digits and have no letters except the letter X!");
		return false;
	}
	//validate check digit
	var RefString="1234567890Xx";
	var checkTotal = 0;
	var checkDigit = 0;
	
	if (isbnStr.length==10) {
		var checkDigitMultiplier = 10;
		for (Count=0; Count < isbnStr.length; Count++)  {
			TempChar= isbnStr.substring (Count, Count+1);
			if (RefString.indexOf (TempChar, 0)==-1){alert ("ISBNs contain only spaces, numerals, dashes and Xs!"); return false;}
			if (Count < 9){
				if (TempChar=="X" || TempChar=="x"){alert ("X should only appear in final position"); return false;}
				else {
						checkTotal = checkTotal + (TempChar * checkDigitMultiplier); 
						checkDigit = checkDigitMultiplier--;
						continue;
				}
			}
			if(TempChar=="X" || TempChar=="x"){TempChar = 10;}
			checkDigit = checkTotal + +TempChar;
			if(checkDigit%11 == 0){return isbnStr;}
			else {alert ("That's NOT a valid ISBN"); return false;}
		}
	}
	if (isbnStr.length==13) {
		var checkDigitMultiplier = 1;
		for (Count=0; Count < isbnStr.length; Count++)  {
			TempChar= isbnStr.substring (Count, Count+1);
			if (RefString.indexOf (TempChar, 0)==-1){alert ("ISBNs contain only spaces, numerals, dashes and Xs!"); return false;}
			if (Count < 12){
				if (TempChar=="X" || TempChar=="x"){alert ("X should only appear in final position"); return false;}
				else {
					checkTotal = checkTotal + (TempChar * checkDigitMultiplier); 
					if(checkDigitMultiplier==1){checkDigitMultiplier = 3;}
					else{checkDigitMultiplier = 1;}
					continue;
				}
			}
			if(TempChar=="X" || TempChar=="x"){TempChar = 10;}
			checkDigit = checkTotal + +TempChar;
			if(checkDigit%10 == 0){return isbnStr;}
			else {alert ("That's NOT a valid ISBN"); return false;}
		}
	}
	alert ("Invalid ISBN");
	return false;
}

