//////////////////////////////////////////////////////////////////////////////////
// set functions to work with a forms											//
// writed by Leonid Volkov /leon@catom.com/, Minicy Catom Ltd. /www.catom.com/	//
// updated by Kossovsky Alex feb 2006											//
// updated by Leonid Volkov may 11 2006											//
// v. 3.3, jul 11 2006															//
//////////////////////////////////////////////////////////////////////////////////

/////////// standard trim function - clean spaces, tabs and new line symbols at the beginning and the end of the string ////////
function trim(str)
{
var lead = 0, trail = str.length - 1;
while(str.charCodeAt(lead)  < 33) lead++;
while(str.charCodeAt(trail)  < 33) trail--;
return lead > trail ? '' : str.substring(lead, trail + 1);
}

function notValidCharsInValue(fldValue, fldNotValidChars)
{
var notGoodChars = fldNotValidChars;
var i = 0;
for (i =0; i < fldValue.length; i++)
{
if (notGoodChars.indexOf(fldValue.charAt(i)) != -1)	return true;
}
return false;
}

function ValidCharsInValue(fldValue, fldValidChars)
{
var goodChars = fldValidChars;
var i = 0;

for (i =0; i < fldValue.length; i++)
{
if (goodChars.indexOf(fldValue.charAt(i)) == -1) return false;
}
return true;
}

////////// Check the Search forms //////////////
function checkSearch(frmObj)
{
for (i=0; i<frmObj.length; i++)
{
if (frmObj[i].type.indexOf('text') == 0)
{
frmObj[i].value = trim(frmObj[i].value);
if (frmObj[i].value.length == 0)
{
alert('Please type the keyword to search');
frmObj[i].focus();
return false;
break;
}
}
}
return true;
}

////////// Check all other forms //////////////
/*function isValidEmail(strEmail)
{
if (notValidCharsInValue(strEmail, "!#$%^&*()+=<>?/,\|~`\"[]") || strEmail.indexOf('@') <= 0 || strEmail.indexOf('.') <= 0)
{
alert('Please type a valid e-mail address!');
return false;
}
return true;
}*/

function isValidEmail(strEmail)
{

var goodEmail = strEmail.match(/\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\.info)|(\.sex)|(\.biz)|(\.aero)|(\.coop)|(\.museum)|(\.name)|(\.pro)|(\..{2,2}))$)\b/gi);

apos=strEmail.indexOf("@");
dotpos=strEmail.lastIndexOf(".");
lastpos=strEmail.length-1;
var badEmail = (apos<1 || dotpos-apos<2 || lastpos-dotpos<2)
if (goodEmail && !badEmail)
{
return true;
}
else
{
alert('Please type a valid e-mail address!');
return false;
}
}

function isValidPhone(strPhone)
{
if (!ValidCharsInValue(strPhone, "0123456789()-+ ") || strPhone.length < 6)
{
alert('Please type a valid phone number!');
return false;
}
return true;
}

function isNumber(strNumber)
{
if (!ValidCharsInValue(strNumber, "0123456789 "))
{
alert('Please type a valid number!');
return false;
}
return true;
}

function isHumanName(strName)
{
if (notValidCharsInValue(strName, "0123456789!@#$%^&*()_+=<>?/.,\|~`\"[]"))
{
alert('Please type a valid human name!');
return false;
}
return true;
}

function isValidCVFileName(fileName)
{
var strExt = fileName.substring(fileName.length - 4, fileName.length);
strExt = strExt.toLowerCase();
if (strExt != ".txt" && strExt != ".rtf" && strExt != ".doc" && strExt != ".pdf")
{
alert('Please send a file in one of the following formats: \n \".txt\", \".rtf\", \".doc\", \".pdf\"!');
return false;
}
return true;
}


function isValidPassword(curField)
{
var strValue=curField.value;
if ( notValidCharsInValue(strValue, "!#@$%^&*()_+=<>?/,\|~`\"[]") || strValue.length < 6 ) return false;
return true;
}

function isValidUserName(curField)
{
var strValue=curField.value;
if ( notValidCharsInValue(strValue, "!#@$%^&*()_+=<>?/,\|~`\"[]") || strValue.length < 6 ) return false;
return true;
}

function isValidNickName(curField)
{
var strValue=curField.value;
if ( notValidCharsInValue(strValue, "!#@$%^&*()_+=<>?/,\|~`\"[]") || strValue.length < 6 ) return false;
return true;
}


function containValidChars(curField)
{
var curName = curField.name;
var curFldType = String(curField.getAttribute('fldType')).toUpperCase();

if (curFldType=='EMAIL')
{
return isValidEmail(curField.value);
}
else if (curFldType=='PHONE' || curFldType=='FAX' || curFldType=='MOBILEPHONE' || curFldType=='CELLPHONE')
{
return isValidPhone(curField.value);
}
else if (curFldType=='NUMERIC' || curFldType=='ZIP')
{
return isNumber(curField.value);
}
else if (curFldType=='FIRSTNAME' || curFldType=='FULLNAME' || curFldType=='LASTNAME' || curFldType=='MIDDLENAME')
{
return isHumanName(curField.value);
}
else if (curFldType=='CVFILE')
{
return isValidCVFileName(curField.value);
}
return true;
}

function showAlert(curField)
{
if ( curField.verefication_alert!=undefined)
{
strAlert = curField.getAttribute('verefication_alert').toString();
alert(strAlert);
}
else
{
strAlert = 'Please provide all required information';
alert(strAlert);
}
}

function checkForm(frmObj)
{
var found;
var i, ii;
var curField, curName, curType;
var isFilled, isRequired;
var passCounter = 0;
var passField1;
var curFldType;
with(frmObj)
{
for (i = 0; i < elements.length; i++)
{
curField = elements[i];
if (curField.disabled || curField.tagName == 'FIELDSET' || curField.tagName == 'OBJECT') continue;
curField.value = trim(curField.value);
curName = curField.name;
curType = curField.type;
isFilled =  trim(curField.value) != '' ? true : false;
isRequired = String(curField.getAttribute('IsMandatory')).toUpperCase() == 'TRUE' ? true : false;
curFldType = String(curField.getAttribute('fldType')).toUpperCase();

if(curType == 'text' && isFilled && !containValidChars(curField))
{
openRelevantTab(curField, frmObj);
curField.focus();
curField.select();
return false;
}
else if (elements[curName].length && isRequired &&  (curType == 'radio' || curType == 'checkbox'))
{
found = 0;
for (ii = 0; ii < elements[curName].length; ii++)
{
if (elements[curName][ii].checked)
{
found = 1;
break;
}
}
if (found == 0)
{
showAlert(curField);
openRelevantTab(curField, frmObj);
elements[curName][0].focus();
//elements[curName][0].click();
return false;
}
}
else if (isRequired && curType == 'select-one')
{
if (curField.selectedIndex == 0)
{
showAlert(curField);
openRelevantTab(curField, frmObj);
curField.focus();
return false;
}
}
else if (isRequired && curType == 'select-multiple')
{
if (curField.selectedIndex == -1)
{
showAlert(curField);
openRelevantTab(curField, frmObj);
curField.focus();
return false;
}
}
else if (isRequired && (curType == 'text' || curType == 'textarea' || curType == 'password'))
{
if (!isFilled)
{
showAlert(curField);
openRelevantTab(curField, frmObj);
curField.focus();
return false;
}
if ( curType == 'text' && curFldType=='USERNAME' && !isValidUserName(curField))
{
alert('Username length have to be more than 6 chars.');
openRelevantTab(curField, frmObj);
curField.focus();
return false;
}
if ((curType == 'password' || curFldType=='PASSWORD') && !isValidPassword(curField))
{
alert('Password length have to be more than 6 chars.');
openRelevantTab(curField, frmObj);
curField.focus();
return false;
}
}
else if (isRequired && curType == 'hidden')
{
if (!isFilled)
{
showAlert(curField);
openRelevantTab(curField, frmObj);
eval(curField.getAttribute('errorEval'));
return false;
}
}
else if(curType == 'file' && isFilled && !containValidChars(curField))
{
openRelevantTab(curField, frmObj);
curField.focus();
curField.select();
return false;
}

if ((curType == 'password' || curFldType=='PASSWORD') && curFldType!='ORIGINALPASSWORD' && passCounter == 0)
{
passCounter++;
passField1 = curField;
}
else if ((curType == 'password' || curFldType=='PASSWORD') && curFldType!='ORIGINALPASSWORD' && passCounter == 1)
{
if (passField1.value != curField.value)
{
alert('The entered passwords do not match.\nPlease re enter them.');
curField.value = "";
openRelevantTab(curField, frmObj);
passField1.focus();
passField1.select();
return false;
}
}

}
}
return true;
}


/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////  MultiFormCheck   //////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
// Check form with one then more check function...

function MultiFormCheck(frmObj)
{
if(CheckBoxesGroup(frmObj) && checkForm(frmObj))
{
return true;
}
else
{
return false;
}
}

/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////  CheckBoxesGroup   //////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
// Checks a group of CHECKBOXES for at least one chosen...

function CheckBoxesGroup(frmObj)
{
var atLeastOneChecked = false;
with(frmObj)
{
for (currCheckBox = 0; currCheckBox < elements.length; currCheckBox++)
{
curField = elements[currCheckBox];
curType = curField.type;
if(curType == 'checkbox')
if(curField.checked && !atLeastOneChecked)
atLeastOneChecked = true;
}
}
if(atLeastOneChecked)
return atLeastOneChecked;
else
{
alert("You have to choose at least one subject.");
return atLeastOneChecked;
}
}




function manualSubmit(frmObj)
{
if(checkForm(frmObj)) frmObj.submit();
}

function manualReset(frmObj)
{
frmObj.reset();
}
//////////////// if the user check/uncheck 'All' checkbox ////////////////
function switchBoxesGroup(boxObj)
{
var bStatus = boxObj.checked;
var parentObj = boxObj.form[boxObj.name];

for(var i=1; i<parentObj.length; i++)
{
parentObj[i].checked = bStatus;
parentObj[i].disabled = bStatus;
boxObj.value = bStatus ? boxObj.value + arrBoxes[i].value + ', ' : '';
}
boxObj.title = bStatus ? 'Uncheck all' : 'Check all';
if(boxObj.value.length > 0) boxObj.value = boxObj.value.substring(0, boxObj.value.length - 2);
}
//////////////// if the user check/uncheck 'All' checkbox ////////////////
function switchBoxesGroupByContainerId(boxObj, strContainerId)
{
var bStatus = boxObj.checked;
var parentObj = document.getElementById(strContainerId);
var arrBoxes = parentObj.getElementsByTagName('INPUT');

for(var i=1; i<arrBoxes.length; i++)
{
if (arrBoxes[i].type == 'checkbox' && arrBoxes[i].name == boxObj.name )
{
arrBoxes[i].checked = bStatus;
arrBoxes[i].disabled = bStatus;
boxObj.value = bStatus ? boxObj.value + arrBoxes[i].value + ', ' : '';
}
}
boxObj.title = bStatus ? 'Uncheck all' : 'Check all';
if(boxObj.value.length > 0) boxObj.value = boxObj.value.substring(0, boxObj.value.length - 2);
}
//////////////// Setup - called on window.onload in init() function /////////////////////
function buttonsMouseEventHandler()
{
if (!document.layers && document.forms && document.forms.length)
{
var i, ii;
var curElem;
var strTypes = 'button submit reset';
for  (i = 0;i < document.forms.length; i++)
{
for (ii =0; ii < document.forms[i].length; ii++)
{
curElem = document.forms[i][ii];
if (curElem.className && strTypes.indexOf(curElem.type) != -1)
{
curElem.onmouseover = curElem.onfocus = buttonOver;
curElem.onmouseout = curElem.onblur = buttonOut;
}
}
}
}
}
function buttonOver() {if (this.className.indexOf('Over') == -1) this.className += 'Over'}
function buttonOut() {if (this.className.indexOf('Over') != -1) this.className = this.className.substring(0,this.className.indexOf('Over'))}
///////////// set focus to the first text field of the first form on page //////////////
function setFocusToField()
{
if (!document.layers && document.forms && document.forms.length)
{
var frmObj = document.forms[0];
for (i=0; i<frmObj.length; i++)
{
if (frmObj[i].type == 'text' && !frmObj[i].disabled)
{
frmObj[i].focus();
break;
}
}
}
}

////////////// onload function ///////////////////////////////////////
//function init()
//{
//	//buttonsMouseEventHandler();
//	//setFocusToField();
//}
//addEvent function placed in general.js
//addEvent(window, 'load', init);


////////////////////////////////////////////////////////////
// this function toggles tabs and related content divs on same page
////////////////////////////////////////////////////////////

function toggleTab(tabID, objA)
{
//open related div by ID
var arrAllDivs = document.getElementsByTagName('DIV');
for (i=0; i<arrAllDivs.length; i++)
{
if (arrAllDivs[i].id.indexOf('tabDiv_') == 0) arrAllDivs[i].style.display = 'none';
}
document.getElementById('tabDiv_'+tabID).style.display = 'block';

//set current tab selected ( <TD class="this"> )
var objTabTd = objA.parentNode.parentNode.firstChild;
do
{
objTabTd.className="";
objTabTd = objTabTd.nextSibling;
}
while (null != objTabTd)

objA.parentNode.className = "this";
}

////////////////////////////////////////////////////////////
// if we need open a tab immediately onload
// place this JS+ASP code on the page:
// addEvent(window, 'load', function(){toggleTabOnLoad(<%=strCurrentTab%>)});
////////////////////////////////////////////////////////////
function toggleTabOnLoad(tabID)
{
if(document.getElementById('tabA_' + tabID))
{
toggleTab(tabID, document.getElementById('tabA_' + tabID))
}
}

//////////////////////////////////////////////////////////////////////
// if we work with tabs, we must first open the relevant tab
// the function begins work if we have any tab with 'tabDiv_' string in ID
// each div with 'tabDiv_X' string in ID must have related '<a id="tabA_X">' element
//////////////////////////////////////////////////////////////////////
function openRelevantTab(curObj, objForm)
{
var arrDivs = objForm.getElementsByTagName('DIV');
var bTabsFound = false;
var lDivIdNum;
for (i = 0; i < arrDivs.length; i++ )
{
if(arrDivs[i].id.indexOf('tabDiv_') == 0)
{
bTabsFound = true;
break;
}
}
if(bTabsFound)
{
while(curObj.tagName != 'FORM' && curObj.style.display != 'none') curObj = curObj.parentNode;
if(curObj.style.display == 'none' && curObj.id.indexOf('tabDiv_') == 0)
{
lDivIdNum = curObj.id.substring(curObj.id.lastIndexOf('_')+1, curObj.id.length);
toggleTab(lDivIdNum, document.getElementById('tabA_' + lDivIdNum));
}
}
}
