// JavaScript Document


var isOpera = navigator.userAgent.indexOf('Opera')>-1;
var isIE = navigator.userAgent.indexOf('MSIE')>-1;
var isFirefox = navigator.userAgent.indexOf('Firefox')>-1;
var isSafari = navigator.userAgent.indexOf('Safari')>-1;

//alert("Opera: " + isOpera +'\n IE: ' + isIE + '\n Firefox: ' + isFirefox + '\n Safari: ' + isSafari);

var bShiftKey = false;
var bCtrkKey = false;
var bAltKey = false;

function filterAndExecuteOnEnter(event, allowedTypes, functionToExecuteOnEnter){

	// has issues with keyEvents, mut ignore for now
	if(isOpera) return true;

	// need this call to properly set the event variable
	var keyID = getKeyID(event);

	// a hack as Safari and Opera were not paying attention to the stop-bubble effects.
	// Safari and Opera users cannot press enter in a field to submit...
	if(event.keyCode==13&&!isSafari){

		try
			{
				var success = functionToExecuteOnEnter();

				if (!succes){
					if (!isIE) event.preventDefault();
					if (!isIE) event.preventDefault();
					if (!isIE) event.stopPropagation();
					if (isIE||isFirefox||isOpera||isSafari) event.returnValue = false;
					if (isIE||isFirefox||isOpera||isSafari) event.cancelBubble=true;

				}

				return success;
			}	
		catch (e)
			{
				return false;
			}
	}
	return filterKeyStrokes(event, allowedTypes);
}

function filterKeyStrokes(event, allowedTypes){

	var keyID = getKeyID(event);

	var bAllowKeystroke = true;

	// ignore system keys
	// IE and Safari do not fire the onkeypress event for system keys
	// FireFox sets a charCode of 0 for system keys
	// Opera, well... Opera doubles up keyCode values and sets charCode to undefined for everything
	// as such, we cannot support key filtering in opera
	if (isOpera||event.charCode==0) { return true; }

	//alert('keyCode: ' + event.keyCode + '\n charCode: ' + event.charCode);
	switch(allowedTypes.toLowerCase()){
		case 'alpha': // alpha
			bAllowKeystroke = alphaFilter(keyID);
			break;

		case 'numeric': // numeric
			bAllowKeystroke = numericFilter(keyID);
			break;
		
		case 'keyboard': //keyboard
			bAllowKeystroke = keyboardFilter(keyID);
			break;

		case 'date':
			bAllowKeystroke = dateFilter(keyID);
			break;

		case 'phone':
			bAllowKeystroke = phoneFilter(keyID);
			break;

		case 'zipcode':
			bAllowKeystroke = zipCodeFilter(keyID);
			break;

		case 'postalcode':
			bAllowKeystroke = postalCodeFilter(keyID);
			break;

		case 'name': // alpha
			bAllowKeystroke = nameFilter(keyID);
			break;

		case 'username': // alpha
			bAllowKeystroke = userNameFilter(keyID);
			break;

		case 'email': // alpha
			bAllowKeystroke = emailFilter(keyID);
			break;

		default: //all, but why?
			break;
		
	}

	//alert(bAllowKeystroke);
	if (bAllowKeystroke) {
		return true;
	}else{
		//test
		if (!isIE) event.preventDefault();
		if (!isIE) event.preventDefault();
		if (!isIE) event.stopPropagation();
		if (isIE||isFirefox||isOpera||isSafari) event.returnValue = false;
		if (isIE||isFirefox||isOpera||isSafari) event.cancelBubble=true;
		return false;
	}
}

function executeOnMatch(keyEvent, valueToMatch, functionToExecute){
	if (keyEvent==undefined) return false;
	if (functionToExecute==undefined||!functionToExecute) return false;
	if (valueToMatch==undefined || valueToMatch.length==0) return false;
	if(getKeyCode(keyEvent)==valueToMatch) functionToExecute();
}

function getKeyID(event){
	var e = event||window.event;
	var keyID;
	if(isIE||isOpera){
		keyID = e.keyCode;
	}else if(isFirefox||isSafari){
		keyID = e.charCode;
	}
	
	// it is up to the appropriate handler to reset these values after processing the keystroke
	bAltKey = e.altKey;
	bCtrlKey = e.ctrlKey;
	bShiftKey = e.shiftKey;

	return keyID;
}

function alphaFilter(keyID){
	//alert('alphaFilter keyID: ' + keyID);
	// 65 - 90 == upper case alpha; 97 - 122 == lower case alpha, 32 == (space)
	if ((keyID>64&&keyID<91)||(keyID>96&&keyID<123)||keyID==32){
		return true;
	}else{
		return false;
	}
}

function numericFilter(keyID){
	// 48 - 57 == numbers
	if (keyID>47&&keyID<58){
		return true;
	}else{
		return false;
	}	
}

function keyboardFilter(keyID){
	// 32 - 126 are all keyboard characters
	if (keyID>31&&keyID<127){
		return true;
	}else{
		return false;
	}
}

function dateFilter(keyID){
	// numbers and slashes
	// 47 == /
	if (numericFilter(keyID)||keyID==47){
		return true;
	}else{
		return false;
	}
}

function phoneFilter(keyID){
	// 40 == (, 41 == ), 45 == -
	if (numericFilter(keyID)||keyID==40||keyID==41||keyID==45){
		return true;
	}else{
		return false;
	}
}

function zipCodeFilter(keyID){
	// 45 == -
	if (numericFilter(keyID)||keyID==45){
		return true;
	}else{
		return false;
	}
}

function postalCodeFilter(keyID){
	// 32 == (space)
	if (alphaFilter(keyID)||numericFilter(keyID)||keyID==32){
		return true;
	}else{
		return false;
	}
}

function nameFilter(keyID){
	// 45 == -, 39 == ', 32 == (space)
	if (alphaFilter(keyID)||keyID==45||keyID==39||keyID==32){
		return true;
	}else{
		return false;
	}
}

function userNameFilter(keyID){
	// 45 == -, 46 == ., 95 == _
	if (alphaFilter(keyID)||numericFilter(keyID)||keyID==45||keyID==95||keyID==46){
		return true;
	}else{
		return false;
	}
}

function emailFilter(keyID){
	// 64 == @, 46 == ., 95 == _
	if (alphaFilter(keyID)||numericFilter(keyID)||keyID==46||keyID==95||keyID==64||keyID==45){
		return true;
	}else{
		return false;
	}
}
