﻿// ====================================================================================================
//
//          Page: JAVASCRIPT SMART TEXTBOX FUNCTIONS
//        Author: Michael Marzilli   ( http://www.linkedin.com/in/michaelmarzilli )
//       Created: Sep 29, 2011
//
//	Minify with: http://sundgaard.dk/javascript-minify.aspx
//
// VERS 1.0.000 : Sep 29, 2011 : Original File Created.
//
// ====================================================================================================


var blnSTBshift = false;

function STB_KeyDown(obj)
{
	var e = window.event;
	if (e != null)
		blnSTBshift = (e.altKey || e.ctrlKey || e.shiftKey);
	else
		blnSTBshift = false;
}
function STB_GetTBcursor(obj)
{
	var i = -1;

	if (typeof obj.selectionStart == 'number' && !document.selection)
	{
		i = obj.selectionStart;
	} else if (document.selection) {

		try
		{
			var range = document.selection.createRange();
			var stored_range = range.duplicate();
			stored_range.moveToElementText(obj);
			stored_range.setEndPoint('EndToEnd', range);
			obj.selectionStart = stored_range.text.length - range.text.length;
			i = obj.selectionStart + range.text.length;
		} catch (Error) {
			if (document.selection && obj.createTextRange)
			{
				sel = document.selection;
				if (sel)
				{
					r2 = sel.createRange();
					rng = obj.createTextRange();
					try
					{
						rng.setEndPoint('EndToStart', r2);
						i = rng.text.length;
					} catch (Error) {
						i = obj.selectionStart;
					}
				}
			}
		}
	}

	return i;
}
function STB_SetTBcursor(obj, pos)
{
	if (obj.setSelectionRange)
	{
		obj.focus();
		obj.setSelectionRange(pos, pos);
	}
	else if (obj.createTextRange)
	{
		var range = obj.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}
function STB_ValidateInput(obj, ttype, bForce, bMan, iMin, iMinVal, iMaxVal, sKeyUp)
{
	var isValid   = true;
	var strType   = ttype.toUpperCase();
	var strImg    = obj.id;
	var strErr    = obj.id;
	var strInput  = obj.value;
	var strPatrn  = '';
	var strError  = '';
	var intCursor = STB_GetTBcursor(obj);
	var strIcon   = '';

	var e = window.event;

	strImg = strImg.replace('txtSmartTextBox', 'imgSmartTextBox');
	strErr = strErr.replace('txtSmartTextBox', 'lblSmartTextBox');

	var objImg = getObjectElementByID('', strImg);
	var objErr = getObjectElementByID('', strErr);

	if (objImg != null)
		if (bMan == 'true')
			strIcon = 'Images/img_status_warn.png';
		else
			strIcon = 'Images/Empty.png';

	if (!blnSTBshift)
	{
		strInput = strInput.replace('<', '[');
		strInput = strInput.replace('>', ']');
		obj.value = strInput;
		STB_SetTBcursor(obj, intCursor);
	}

	if (strType == 'MIXED')
	{
		if (objImg != null && strInput != '')
			if (strInput.length >= iMin)
				strIcon = 'Images/Okay16.png';
			else
				strIcon = 'Images/Cancel16.png';
			if (sKeyUp != '')
				eval(sKeyUp);
		objImg.src = strIcon;
		return;
	}
	if (strType == 'UPPER')
		strInput = strInput.toUpperCase();
	if (strType == 'LOWER')
		strInput = strInput.toLowerCase();

	switch (strType)
	{
		case 'ALPHA':
			strPatrn = '[a-zA-Z ]*';
			strError = '(Must be Text/Letters Only)';
			break;
		case 'UPPER':
			strPatrn = '[a-zA-Z ]*';
			strError = '(Must be Text/Letters Only)';
			break;
		case 'LOWER':
			strPatrn = '[a-zA-Z ]*';
			strError = '(Must be Text/Letters Only)';
			break;
		case 'INT':
			strPatrn = '[0-9]*';
			strError = '(Must be a whole Number)';
			break;
		case 'DECIMAL':
			strPatrn = '[0-9]*\\.?[0-9]*';
			strError = '(Must be a decimal Number)';
			break;
		case 'DATE':
			strPatrn = '[0-2]?[1-9](/|-)[0-3]?[0-9](/|-)[1-2][0-9][0-9][0-9]';
			strError = '(Must be a valid Date)';
			break;
		case 'PHONE':
			strPatrn = '\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})';
			strError = '(Must be a valid Phone Number)';
			break;
		case 'EMAIL':
			strPatrn = '[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}';
			strError = '(Must be a valid Email Address)';
			break;
	}

	if (bForce == 'true' && (strType == 'ALPHA' || strType == 'UPPER' || strType == 'LOWER' || strType == 'INT' || strType == 'DECIMAL' || strType == 'PHONE' || strType == 'EMAIL'))
	{
		try
		{
			if (strType == 'PHONE') {
				var regT = new RegExp('[()0-9 -]*', 'g');
				var regR = new RegExp('^[^()0-9 -]*$', 'g');
			} else if (strType == 'DECIMAL') {
				var regT = new RegExp('^' + strPatrn + '$', 'g');
				var regR = new RegExp('[^0-9.]*', 'g');
			} else if (strType == 'EMAIL') {
				var regT = new RegExp('^' + strPatrn + '$', 'g');
				var regR = new RegExp('[^a-zA-Z0-9@._-]*', 'g');
			} else {
				var regT = new RegExp('^' + strPatrn + '$', 'g');
				var regR = new RegExp(strPatrn.replace('[', '[^'), 'g');
			}
			if (!regT.test(strInput))
			{
				if (intCursor < strInput.length)
					intCursor--;

				strInput = strInput.replace(regR, '');
			}
			if (!blnSTBshift)
				obj.value = strInput;
		} catch (error)
		{
			// Doing Nothing
		}
	}

	try
	{
		if (objImg != null && strInput != '')
			strIcon = 'Images/Okay16.png';

		if (strPatrn != '')
		{
			var reg = new RegExp('^' + strPatrn + '$', 'g');
			if (!reg.test(strInput))
				isValid = false;
		}

		if (strType == 'DATE')
		{
			try
			{
				var sd = strInput.split('/');
				var m = sd[0];
				var d = sd[1];
				var y = sd[2];

				m++; m--;
				d++; d--;
				y++; y--;

				if (m < 1 || m > 12)
					isValid = false;
				if (d < 1)
					isValid = false;
				if (d > 31)
					isValid = false;
				if ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30)
					isValid = false;
				if (m == 2 && ((y % 4 == 0 && d > 29) || (y % 4 != 0 && d > 28)))
					isValid = false;
			} catch (error)
			{
				isValid = false;
			}
		}

	} catch (error)
	{
		isValid = false;
	}

	if (strInput.length < iMin)
	{
		isValid = false;
		if (iMin > 1)
			strError = '(Need at least ' + iMin + ' characters.)';

		if (strInput == '')
		{
			if (iMin == 1)
			{
				strIcon = 'Images/img_status_warn.png';
				strError   = '';
			}
		}
	}
	
	if (strType == 'INT')
	{
		var n = parseInt(strInput);

		if (n < iMinVal || n > iMaxVal)
		{
			strError = '(Must be a number between ' + iMinVal + ' and ' + iMaxVal + ')';
			isValid  = false;
		}
	}

	if (strType == 'DECIMAL')
	{
		var n = parseFloat(strInput);

		if (n < iMinVal || n > iMaxVal)
		{
			strError = '(Must be a number between ' + iMinVal + ' and ' + iMaxVal + ')';
			isValid = false;
		}
	}

	if (objImg != null)
		if (!isValid && strInput != '')
			strIcon = 'Images/Cancel16.png';

	if (objErr != null)
		if (!isValid)
			objErr.innerText = strError;
		else
			objErr.innerText = '';

	objImg.src = strIcon;

	if (bForce == 'true')
	{
		if ((e.keyCode != 16 && e.keyCode != 17 && e.keyCode != 18 && !blnSTBshift) ||
		    (e.keyCode != 16 && e.keyCode != 17 && e.keyCode != 18 &&
				 e.keyCode != 33 && e.keyCode != 34 && e.keyCode != 35 && e.keyCode != 36 &&
		     e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40 && 
				 blnSTBshift))
			STB_SetTBcursor(obj, intCursor);
		if  (e.keyCode != 33 && e.keyCode != 34 && e.keyCode != 35 && e.keyCode != 36 &&
		     e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40)
			blnSTBshift = false;
	}

	if (sKeyUp != '')
		eval(sKeyUp);
}


