/**
 * Simple scripts for validating textbox inputs
 * Author: R Kotzé 
 **/
 
 /*
  * Checks if email is valid.
  */
function isValidEmail(email)
{
	var splitted = email.match("^(.+)@(.+)$");
	// Inner function
	function validateResult()	
	{
    	if(splitted == null) 
			return false;
    	if(splitted[1] != null )
    	{
    		var userElements=/^\"?[\w-_\.]*\"?$/;
       	 	if(splitted[1].match(userElements) == null) return false;
    	} //if
    	if(splitted[2] != null)
    	{
    		var domainElements=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
       	 	if(splitted[2].match(domainElements) == null) 
       	 	{
	   	 		var ipElements =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    		if(splitted[2].match(ipElements) == null) return false;
      	 	} //if
      	 	return true;
    	} //if
		return false;
	} //validateResult()
	
	if((email.length > 0) && (!validateResult()))
	{
		alert("Please provide a valid email address");
		return false;
	} //if
	return true;
} //isValidEmail()


/*
 * Checks if phone number is valid. 
 * Displays the field's name if not valid.
 */
function isValidPhoneNo(name, number)
{
	numberLength = 10; // phone number's length
	// First check if all the characters are numeric
	if(!isNumeric(name, number))
		return false;
	// First digit has to be 0
	if(number.charAt(0) != 0)
	{
		alert(name + " number needs to start with a 0");
		return false;
	}
	// Then check length 	
	if((number.length > 0) && (number.length != numberLength))
	{
		alert(name + " number needs to be " + numberLength + " digits long");
		return false;
	} //if
	return true;	
} //isValidPhoneNo()


/*
 * Checks if a field is populated or not. 
 * Displays the field's name if not populated.
 */
function isPopulated(name, fieldValue, field)
{
	if(eval(fieldValue.length) == 0)
	{
	 	alert("Please provide " + name);
	 	return false;
	 } //if
	 return true;
} //isPopulated()


/*
 * Checks if all the characters in a field is alphabetic or not. 
 * Displays the field's name if not alphabetic.
 */
function isAlphabetic(name, fieldValue, nothing)
{
	var wrongCharPos = fieldValue.search("[^A-Za-z ]"); 
	var rightCharPos = fieldValue.search("[A-Za-z]");
	if(nothing)
		rightCharPos = 0;
	
    if(fieldValue.length > 0 &&  wrongCharPos >= 0 || rightCharPos == -1) 
    { 
    	alert("Only alphabetical characters allowed in "+name+ 
    	" (Error with character at position " + eval(wrongCharPos+1)+")"); 
        return false; 
	} //if
	return true;
} //isAlphabetic()


/*
 * Checks if all the characters in a field is numeric or not. 
 * Displays the field's name if not numeric.
 */
function isNumeric(name, fieldValue)
{
	var charpos = fieldValue.search("[^0-9]"); 
	
    if(fieldValue.length > 0 &&  charpos >= 0) 
    { 
    	alert("Only digits allowed in "+name+
		" field (Error with character at position " + eval(charpos+1)+")"); 
        return false; 
	} //if
	return true;
} //isNumeric()


/*
 * Checks if at least one of the two fields (aFieldVal & bFieldVal) is filled in. 
 * Displays their names if both not filled in.
 */
function atLeastOneIsPopulated(aName, aFieldVal, bName, bFieldVal)
{
	if((eval(aFieldVal.length) == 0)&&(eval(bFieldVal.length) == 0))
	{ 
    	alert("Please provide "+aName+" or "+bName); 
        return false; 
	} //if
	return true;
} //atLeastOneIsPopulated()

/*
 * Checks that the two fields have the same value.
 */
function sameValue(aName, aFieldVal, bName, bFieldVal)
{
	if(aFieldVal != bFieldVal)
	{
			alert(aName + " and " + bName + " are not the same");
			return false;
	} //if
	return true;
} //sameValue()

/*
 * Checks that the field is at least minChars characters.
 */
function atLeast(name, fieldValue, minChars)
{
	if(fieldValue.length < minChars)
	{
		alert(name + " must be at least " + minChars + " characters");
		return false;
	} //if
	return true;
 } //atLeast()
 
/*
 * Checks that the first value in a comboBox isn't selected.
 */
function dontSelectFirst(message, comboBox, index)
{
	 if(comboBox.selectedIndex == eval(index))
	 {
		 	alert(message);
			return false;
	 } //if
	 return true;
} //dontSelectFirst()


/*
 * Used to fill a combobox/select list with an array.
 */
function fillSelectFromArray(selectCtrl, itemArray, goodPrompt, badPrompt, defaultItem) 
{
	var i, j;
	var prompt;

	// empty existing items
	for (i = selectCtrl.options.length; i >= 0; i--) 
	{
		selectCtrl.options[i] = null; 
	}
	prompt = (itemArray != null) ? goodPrompt : badPrompt;
	if (prompt == null) 
	{
		j = 0;
	} else 
	{		
		selectCtrl.options[0] = new Option(prompt);
		j = 1;
	}
	if (itemArray != null) 
	{
		// add new items
		for (i = 0; i < itemArray.length; i++) 
		{
			selectCtrl.options[j] = new Option(itemArray[i][0]);
			if (itemArray[i][1] != null) 
			{
				selectCtrl.options[j].value = itemArray[i][1]; 
			}
			j++;
		}
		// select first item (prompt) for sub list
		selectCtrl.options[0].selected = true;
	}
} //fillSelectFromArray();


/*
 * Test for correct file type by checking the extension.
 * Only going to use for image checking.
 */
function testFileType(fileName, fileTypes, name, gif)
{
	if (!fileName) return true;
		dots = fileName.split(".")
	// get the part after the last period.
	fileType = "." + dots[dots.length-1].toLowerCase();
	if(fileTypes.join(".").indexOf(fileType) == -1)
	{
		var message = name +' has to have a jpg, png';
		if(gif)
			message += ', gif';
		alert(message +' or jpeg extension');
		return false;
	}
	return true;
} //testFileType();


//var reValidString = /^\d*$/;
//var reValidChars = /\d/;
//var reKeyboardChars = /[\x00\x03\x08\x0D\x16\x18\x1A]/;
//var reClipboardChars = /[cvxz]/i;

function checkClipboardCode(objEvent, strKey) 
{
	var reClipboardChars = /[cvxz]/i;
	if(navigator.appVersion.indexOf("Netscape6") != -1) // isNS6	
	   	return objEvent.ctrlKey &&  
        reClipboardChars.test(strKey);
    else
    return false;
}
   
function isValid(strValue) 
{
	var reValidString = /^\d*$/;
	return reValidString.test(strValue) || 
    	strValue.length == 0;
}

function atLeastOneCheckboxChecked()
{
    var inputs = document.getElementsByTagName('input');
    var oneChecked = false;
    checkBoxArray = new Array();
    for (var i = 0;i < inputs.length; i++)
    {
        if((inputs[i].getAttribute('type')=='checkbox')&&(inputs[i].checked))
        {
            oneChecked = true;
            break;
        }
    }
    return oneChecked;
}

function maskPaste(objEvent) 
{
	var strPasteData = window.clipboardData.getData("Text");
    var objInput = objEvent.srcElement;
   
    if (!isValid(strPasteData)) 
	{
       alert("Invalid data");
       
       objInput.focus();
       return false;
    }
}

function maskChange(objEvent) 
{
	var objInput;
            
     if(navigator.appVersion.indexOf("MSIE") != -1) // isIE
       objInput = objEvent.srcElement; 
    else
       objInput = objEvent.target;
             
    if(!isValid(objInput.value)) 
	{
       alert("Invalid data");
       objInput.value = objInput.validValue || "";
       objInput.focus();
       objInput.select(); 
     }else {
       objInput.validValue = objInput.value;
     }
}

function maskKeyPress(objEvent) 
{
    var iKeyCode, strKey, objInput;  
    var reValidChars = /\d/;
	var reKeyboardChars = /[\x00\x03\x08\x0D\x16\x18\x1A]/; 
	
    if(navigator.appVersion.indexOf("MSIE") != -1) // isIE
	{
		iKeyCode = objEvent.keyCode;
        objInput = objEvent.srcElement;
    } else {
       iKeyCode = objEvent.which;
       objInput = objEvent.target;
    }
               
    strKey = String.fromCharCode(iKeyCode);
    if (isValid(objInput.value)) 
	{
		objInput.validValue = objInput.value;
   
      	if (!reValidChars.test(strKey) &&
            !reKeyboardChars.test(strKey) && 
         	!checkClipboardCode(objEvent, strKey)) 
	 	{
        	//alert("Invalid Character Detected!\nKeyCode = " 
           // + iKeyCode + "\nCharacter =" + strKey);
         return false;
		}
   	} else {
      alert("Invalid Data");
      return false;
    }
}

