/******************************************
Name:			smartforms.js
Description:	Smart forms validation using regular expressions
				in a custom form attribute.

				Based loosely around ppk's form validation script concept:
				http://www.quirksmode.org
Date:			23/08/2006
Author:			James Condliffe
******************************************/

function getSelectedRadio(buttonGroup)
{
	// returns the array number of the selected radio button or -1 if no button is selected
	if (document.getElementsByName(buttonGroup)[0])
	{ // if the button group is an array (one button is not an array)
	    for (var i=0; i<document.getElementsByName(buttonGroup).length; i++)
		{
			if (document.getElementsByName(buttonGroup)[i].checked)
			{ 
			    return i;
			}
		}
	}
	else
	{
		if (document.getElementsByName(buttonGroup).checked) { return 0; } // if the one button is checked, return zero
	}
	// if we get to this point, no radio button is selected
	return -1;
}


function validateForms() 
{
	var valForms = document.forms;

    for (var i=0; i<valForms.length; i++ ) 
	{		
		// check to see if we have any validation fields
		var valFields = valForms[i].elements;

		for (var j=0; j<valFields.length; j++)
		{
		    if (valFields[j].getAttribute("validation") || valFields[j].getAttribute("type") == "radio") // a field in the form requires validation
			{
			    //attach an onfocus 
				if (typeof valForms[i].onsubmit != 'function') // only apply this once to each form
				{
					valForms[i].onsubmit = smartValidate;					
					break;
				}
			}
		}
	}
}

function smartValidate()
{
	var els = this.elements;
	var message = "Please complete or correct the following required fields to continue:\n";
	var fielderrors = "";
	var radioButtonGroupsErrors = "", radioButtonGroupsErrors1 = "", radioButtonGroupsErrors2 = "", radioButtonGroupsErrors3 = "", radioButtonGroupsErrors4 = "", radioButtonGroupsErrors5 = "", radioButtonGroupsErrors6 = "", radioButtonGroupsErrors7 = "", radioButtonGroupsErrors8 = "";

	for (var i=0; i<els.length; i++)
	{
	    var validation;
	    
	    if (validation = els[i].getAttribute("validation"))
		{
            if(validation.indexOf("compare")>-1) // if we're comparing against another field
            {
                // Get the other field's id and compare the two fields values
                var compelelement;
                var arrVal = validation.split(":");
                if(compelement = document.getElementById(arrVal[1]))
                {
                    if(compelement.value != els[i].value)
                    {
                        markInvalid(els[i]);
                        var label = document.getElementById(els[i].id + "_label");
                        var complabel = document.getElementById(compelement.id + "_label");
                        fielderrors += "\n- " + complabel.firstChild.nodeValue + " and " + label.firstChild.nodeValue + " must match";
		                return false;
                    }
                }
            }
            else if (!checkFieldRegex(els[i])) // regular expression validation
			{
				markInvalid(els[i]);
				var label = document.getElementById(els[i].id + "_label");
				fielderrors += "\n- " + label.firstChild.nodeValue;
			}
			else
			{
				markValid(els[i]);
			}
		}
		else if (els[i].getAttribute("type") == "radio")
        {
	        var currentButton = els[i].getAttribute("name");
	        if (currentButton != els[i+ 1].getAttribute("name"))
	        {
	            if (getSelectedRadio("quotes-solution") == -1 || getSelectedRadio("quotes-understand-pricing") == -1 || getSelectedRadio("quotes-requests") == -1 || getSelectedRadio("quotes-delay-reason") == -1 || getSelectedRadio("quotes-services") == -1)
	            {
	                radioButtonGroupsErrors1 = "- Quotation / Tender Response\n";
	            }
	            if (getSelectedRadio("business-analysis-requirements") == -1 || getSelectedRadio("business-analysis-functionality") == -1 || getSelectedRadio("business-analysis-objectives-practices") == -1 || getSelectedRadio("business-analysis-website-developmment") == -1)
	            {
	                radioButtonGroupsErrors2 = "- Business Analysis\n";
	            }
	            if (getSelectedRadio("production-project") == -1 || getSelectedRadio("production-requested-amendments") == -1 || getSelectedRadio("production-queries") == -1 || getSelectedRadio("production-expected-alterations") == -1 || getSelectedRadio("quotes-services") == -1)
	            {
	                radioButtonGroupsErrors3 = "- Production\n";
	            }
	            if (getSelectedRadio("solution-update-delivery-dates") == -1 || getSelectedRadio("solution-deliver-ontime") == -1 || getSelectedRadio("solution-accordance-specification") == -1 || getSelectedRadio("solution-error-free") == -1 || getSelectedRadio("solution-inline-original-quote") == -1)
	            {
	                radioButtonGroupsErrors4 = "- Solution Delivery\n";
	            }
	            if (getSelectedRadio("hosting-website-uptime") == -1 || getSelectedRadio("hosting-website-browsing-performance") == -1 || getSelectedRadio("hosting-website-security") == -1 || getSelectedRadio("hosting-office-hours-response-time") == -1 || getSelectedRadio("hosting-regular-updates") == -1)
	            {
	                radioButtonGroupsErrors5 = "- Hosting\n";
	            }
	            if (getSelectedRadio("maintenance-response-time") == -1 || getSelectedRadio("maintenace-progress-update") == -1 || getSelectedRadio("maintenance-completion") == -1)
	            {
	                radioButtonGroupsErrors6 = "- Maintenance\n";
	            }
	            if (getSelectedRadio("design-work-quality") == -1)
	            {
	                radioButtonGroupsErrors7 = "- Creative/Design\n";
	            }
	            if (getSelectedRadio("majesticcompany-relationship-success") == -1 || getSelectedRadio("majesticcompany-partnership-success") == -1 || getSelectedRadio("majesticcompany-likely-recommend") == -1 || getSelectedRadio("majesticcompany-utilise-future-work") == -1)
	            {
	                radioButtonGroupsErrors8 = "- Majestic in General\n";
	            }
	        }
	    } 
	}
	
	if (fielderrors != "")
	{
		fielderrors = message + fielderrors;
	}
	
	if(radioButtonGroupsErrors1 != "" || radioButtonGroupsErrors2 != "" || radioButtonGroupsErrors3 != "" || radioButtonGroupsErrors4 != "" || radioButtonGroupsErrors5 != "" || radioButtonGroupsErrors6 != "" || radioButtonGroupsErrors7 != "" || radioButtonGroupsErrors8 != "")
	{
	    radioButtonGroupsErrors = "Please answer all questions in the following sections:\n" + radioButtonGroupsErrors1 + radioButtonGroupsErrors2 + radioButtonGroupsErrors3 + radioButtonGroupsErrors4 + radioButtonGroupsErrors5 + radioButtonGroupsErrors6 + radioButtonGroupsErrors7 + radioButtonGroupsErrors8;
	}

	if (fielderrors != "" || radioButtonGroupsErrors != "")
	{
	    if (fielderrors != "")
	    {
	    	alert(fielderrors + "\n\n" + radioButtonGroupsErrors);
	    }
		else
		{
		    alert(radioButtonGroupsErrors);
		}
		return false;
	}
	else
		return true;
}

function checkFieldRegex(field)
{
	// Branch for field types
	if (field.getAttribute("type") == "checkbox")
	{
	    if(field.checked == true)
	        return true;
	    else
	        return false;
	}
	else
	{	
	    // Check against default value if greytext is on
	    if (field.className.indexOf("greytext") > -1 && !isBlank(field.defaultValue) && field.value == field.defaultValue)
		    return false;
    	
	    // Check against regular expression
	    var regex = new RegExp(field.getAttribute("validation") , "i");
	    return regex.test(field.value);
	}
}

/****
Marks a form element invalid
****/
function markInvalid(elem)
{
	// Only mark invalid if it's not a greytext issue
	if (elem.className.indexOf("greytext") == -1)
	    elem.style.backgroundColor='#E7E6D6';
}

/****
Marks a form element valid
*****/
function markValid(elem)
{
	elem.style.backgroundColor='#FFFFFF';
}

addLoadEvent(validateForms);
