/* Element component finder functions --------------------*/
var TEXTFIELDS;
var RADIOS;
var CHECKBOXES;
var SELECTS;

function setupFormFields( form )
{
	TEXTFIELDS = getFormTextFields( form );
	RADIOS     = getFormRadioFields( form );
	CHECKBOXES = getFormCheckboxFields( form );
	SELECTS    = getFormSelectFields( form );
}

// Bulk queries of the form elements 

function requiredFilled()
{
	for ( var i = 0; i < TEXTFIELDS.length; i++ )
	{
		if( REQUIRED[ TEXTFIELDS[i].id ] && isEmptyTextField( TEXTFIELDS[i] ) ) 
		{
			TEXTFIELDS[i].focus();
			alert( "\"" + QUESTIONS[ TEXTFIELDS[i].id ] + "\"" + " is required.");
			return false;
		}
	}
	
	for (key in RADIOS)
	{
		if( REQUIRED[ key ] && isEmptyRadioButtonSet( RADIOS[ key ] ) )
		{
			alert( "\"" + QUESTIONS[ key ] + "\"" + " is required.");
			return false;
		}
	}
	
	for (key in CHECKBOXES)
	{
		if ( REQUIRED[ key ] && isBelowMinAllowedClicked( CHECKBOXES[ key ], 1 ) )
		{
			alert( "\"" + QUESTIONS[ key ] + "\"" + " is required.");
			return false;
		}
	} 
	
	for (var i = 0; i < SELECTS.length; i++)
	{
		var key = SELECTS[i].id;
		if ( REQUIRED[ key ] && getSelectedDropdownCount( SELECTS[ i ] ) < 1 )
		{
			alert( "\"" + QUESTIONS[ key ] + "\"" + " is required.");
			return false;
		}
	}
	return true;  
}

function requiredMinFilled()
{
	for (key in CHECKBOXES)
	{
		if( runCheckboxCheck(key) )
		{	
			if ( MIN[ key ] && isBelowMinAllowedClicked( CHECKBOXES[ key ], MIN[ key ] ) )
			{
				alert( "\"" + QUESTIONS[ key ] + "\"" + " requires at least " + MIN[ key ] + " selections.");
				return false;
			}
		}
	} 
	
	for (var i = 0; i < SELECTS.length; i++)
	{
		var key = SELECTS[i].id;
		
		if( runSelectCheck(key) )
		{
			if ( MIN[ key ] &&
			SELECTS[ i ].multiple && 
			getSelectedDropdownCount( SELECTS[ i ] ) < MIN[ key ] )
			{
				alert( "\"" + QUESTIONS[ key ] + "\"" + " requires at least " + MIN[ key ] + " selections.");
				return false;
			}
		}
	}
	
	return true;
}

function requiredMaxFilled()
{
	for (key in CHECKBOXES)
	{
		
		if( runCheckboxCheck(key) )
		{
			if ( MAX[ key ] && isAboveMaxAllowedClicked( CHECKBOXES[ key ], MAX[ key ] ) )
			{
				alert( "\"" + QUESTIONS[ key ] + "\"" + " requires " + MAX[ key ] + " selections or less.");
				return false;
			}
		}
	} 
	
	for (var i = 0; i < SELECTS.length; i++)
	{
		var key = SELECTS[i].id;
		
		if( runSelectCheck(key) )
		{
			if ( MAX[ key ] &&
			SELECTS[ i ].multiple && 
			getSelectedDropdownCount( SELECTS[ i ] ) > MAX[ key ] )
			{
				alert( "\"" + QUESTIONS[ key ] + "\"" + " requires " + MAX[ key ] + " selections or less.");
				return false;
			}
		}
	}
	
	return true;
}

function requiredExactFilled()
{
	for (key in CHECKBOXES)
	{      
		if( runCheckboxCheck(key) )
		{
			if ( EXACT[ key ] &&  
			EXACT[ key ] != getCheckboxClickedCount( CHECKBOXES[ key ] )  )
			{
				alert( "\"" + QUESTIONS[ key ] + "\"" + " requires exactly " + EXACT[ key ] + " selection(s).");
				return false;
			}
		}
	} 
	
	for (var i = 0; i < SELECTS.length; i++)
	{
		var key = SELECTS[i].id;
		
		if( runSelectCheck(key) )
		{
			if ( EXACT[ key ] &&
			SELECTS[ i ].multiple && 
			getSelectedDropdownCount( SELECTS[ i ] ) != EXACT[ key ] )
			{
				alert( "\"" + QUESTIONS[ key ] + "\"" + " requires exactly " + EXACT[ key ] + " selection(s).");
				return false;
			}
		}
	}
	
	return true;
}

function checkResendInviteeEmail()
{
        var failed = [];
        var valid = [];
	var hasResend=false;
        if( window.EMAIL == undefined ){
                return true;
        }
        for( key in EMAIL ){
                if( key.match("resend_[0-9]+_invitee_email" ) ){
			hasResend = true;
                        var textfield = document.getElementById(key);
                        var fieldval = textfield.value.replace(/^\s+|\s+$/g,"");

                        if( fieldval.length < 1 ){
                                textfield.value = "";
                        }
                        else{
                                if( isEmailAddress(fieldval) ){
                                        valid.push(fieldval);
                                }
                                else{
                                        failed.push(fieldval);
                                }
                        }
                }

        }
	if( ! hasResend )
		return true;

        if( failed.length > 0 ){        msg = "The following ";
                if( failed.length == 1 ){
                        msg = msg + "is not a valid email address: ";
                }
                else{
                        msg = msg + "are not a valid email addresses: ";
                }
                msg = msg + "\n" + failed.join(",\n");
                alert(msg.substr(0,msg.length -2 ));
                return false;
        }
        if( valid.length < 1 ){
                alert("A valid email address is required.");
                return false;
        }
        return true;
}

function otherChecksPassed()
{
        if ( ! checkEmailFields() )
                return false;

        if ( ! checkResendInviteeEmail() )
                return false;

	if ( ! checkRequiredCheckbox() )
                return false;

        return true;
}

//---------------------------------------------------------------------------------

// functions for aggregating similar form element types together

function getFormTextFields( form )
{
	var textFields = new Array();
	for ( var i = 0; i < form.elements.length ; i++ )
	{
		var element = form.elements[i];
		if ( element.tagName.toLowerCase() == "input" && 
		     element.type.toLowerCase() == "text")
		{
			textFields.push( element );
		}
	}
	return textFields;	
}

function getFormRadioFields( form )
{
	var allRadios  = [];
	
	for ( var i = 0; i < form.elements.length ; i++ )
	{
		var element = form.elements[i];
		if ( element.tagName.toLowerCase() == "input" && 
		     element.type.toLowerCase() == "radio")
		{
			if ( ! allRadios[ element.id ] )
			{
				allRadios[ element.id ] = new Array();
			}
			allRadios[ element.id ].push( element );
		}
	}
	return allRadios;	
}

function getFormCheckboxFields( form )
{
	var allCheckboxes  = [];
	
	for ( var i = 0; i < form.elements.length ; i++ )
	{
		var element = form.elements[i];
		if ( element.tagName.toLowerCase() == "input" && 
		     element.type.toLowerCase() == "checkbox")
		{
			if ( ! allCheckboxes[ element.id ] )
			{
				allCheckboxes[ element.id ] = new Array();
			}
			allCheckboxes[ element.id ].push( element );
		}
	}
	return allCheckboxes;	
}

function getFormSelectFields( form )
{
	var allDropdowns  = new Array();
	
	for ( var i = 0; i < form.elements.length ; i++ )
	{
		var element = form.elements[i];
		if ( element.tagName.toLowerCase() == "select" )
		{
			allDropdowns.push( element );
		}
	}
	return allDropdowns;	
}

//--------------------------------------------------------------

/* validation functions ------------------------------------*/
function runCheckboxCheck( key )
{
	if( REQUIRED[key] )
		return true;
	if ( getCheckboxClickedCount( CHECKBOXES[ key ] ) > 0 )
		return true;
		
	return false;
}

function runSelectCheck( key )
{
	if( REQUIRED[key] )
		return true;
			
	if ( getSelectedDropdownCount( SELECTS[ i ] ) > 0 )
		return true;
		
	return false;
}

function isEmptyTextField( textField )
{
	var regex = / |\t/g;
	var val = textField.value.toString().replace(regex, "");
	if ( val.length < 1 )
		return true;
		
	return false;	 
}

function isEmptyRadioButtonSet( radioBtnArray )
{
	for ( var i = 0; i < radioBtnArray.length; i++ )
	{
		if ( radioBtnArray[i].checked )
		{
			return false;
		} 
	}
	return true;
}

function getSelectedDropdownCount( dropdown )
{
	// if it's a regular drop down box
	if ( !dropdown.multiple )
	{
		for ( var i = 0; i < dropdown.options.length; i++ )
		{
			if ( dropdown.options[i].selected )
			{
				if ( i > 0 )
				{
					//since it's not a multiple drop down,
					// we know we can only have one value 
					// chosen, so just go ahead and return
					return 1;
				}
			}
		}
		return 0;
	}
	
	// for multiple select boxes
	var count = 0;
	for ( var i = 0; i < dropdown.options.length; i++ )
	{
		if ( dropdown.options[i].selected )
		{
			count++;
		}	
	}
	
	return count;
}

function isBelowMinAllowedClicked ( cboxBtnArray, minAllowed )
{
	if ( getCheckboxClickedCount( cboxBtnArray ) < minAllowed )
	{
		return true;
	}
	return false;
}

function isAboveMaxAllowedClicked ( cboxBtnArray, maxAllowed )
{
	if ( getCheckboxClickedCount( cboxBtnArray ) > maxAllowed )
	{
		return true;
	}
	return false;
}

function getCheckboxClickedCount( cboxBtnArray )
{
	var count = 0;
	for ( var i = 0; i < cboxBtnArray.length; i++ )
	{
		if ( cboxBtnArray[i].checked )
		{
			count++;
		} 
	}
	return count;
}

function checkEmailFields()
{
	for( key in EMAIL )
	{
		for ( var i = 0; i < TEXTFIELDS.length; i++ )
		{
			if( TEXTFIELDS[i].name == key && ! isEmptyTextField(TEXTFIELDS[i]) )
			{
				if( ! isEmailAddress( TEXTFIELDS[i].value ) )
				{
					alert( "\"" + QUESTIONS[ key ] + "\"" + " requires a valid email address." );
					TEXTFIELDS[i].focus();
					return false;
				}
			}
		}
	}
	return true;
}

function isEmailAddress(email)
{
	var isEmail      = false
	var emailString = new String(email)
	var index = emailString.indexOf("@");
	if (index > 0)
	{
		var periodIndex = emailString.indexOf(".",index);
		if ((periodIndex > index+1) && (emailString.length > periodIndex+1))
			isEmail = true;
	}
	return isEmail;
}

function checkRequiredCheckbox()
{
     theCheckbox = document.getElementById('requiredCheckbox');
     if ( theCheckbox != null ) {
	if ( !theCheckbox.checked ) {
	    if ( requiredCheckboxError != null ) {
	      alert ( requiredCheckboxError );
	      return false;
	    }
	}
      }
      
      return true;
}
//--------------------------------------------------------------------

