
/* START: InventorySchema Validation */
	
	var skuFieldSelected;

	/*
	 * validateSchemaInit
	 * 
	 * initialises InventorySchema validation; sets active InventorySchemaSKU if available
	 */
	function validateSchemaInit()
	{
		var skuFieldSelection = document.getElementsByName('data[InventorySchema][sku_field]');
		
		for(i=0;i<skuFieldSelection.length;i++)
			if(skuFieldSelection[i].checked)
				skuFieldSelected = skuFieldSelection[i];

	}

	/*
	 * validateSchemaFields
	 * 
	 * validates InventorySchema mappings before allowing submit
	 * 
	 * @return boolean Returns true unless validation fails
	 */
	function validateSchemaFields()
	{
		var allowSubmit		= true;
		var schemaFieldTable	= document.getElementById('InventorySchema');
		var schemaFieldRows		= schemaFieldTable.rows;//document.getElementsByName('InventorySchemaRow');
		
		for(x=2;x<schemaFieldRows.length;x++)
		{
			var selectedRowFields	= schemaFieldRows[x].getElementsByTagName('select');
			var selectedRowInputs	= schemaFieldRows[x].getElementsByTagName('input');
			
			var requireElementDisplayName	= false;
			var requireElementDisplayField	= '';
			
			for(y=0;y<selectedRowFields.length;y++)
			{
				if(selectedRowFields[y].name.indexOf(INVENTORY_SCHEMA_FIELD_PARENT) > 0)	{ fieldType = 'parent'; 	}
				if(selectedRowFields[y].name.indexOf(INVENTORY_SCHEMA_FIELD_URL) > 0 )		{ fieldType = 'url';		}
				if(selectedRowFields[y].name.indexOf(INVENTORY_SCHEMA_FIELD) > 0 )			{ fieldType = 'mapping';	}
				
				if(selectedRowFields[y].options[selectedRowFields[y].selectedIndex].value != "")
					validField = validateSchemaField(fieldType,selectedRowFields[y],true,false);
					else
					validField = true;
				
				if(fieldType == 'mapping' && selectedRowFields[y].options[selectedRowFields[y].selectedIndex].value != '')
				{
					requireElementDisplayName	= true;
					requireElementDisplayField	= selectedRowFields[y].options[selectedRowFields[y].selectedIndex].value;
				}
				
				if(!validField){ allowSubmit = false; }
			}
			
			for(z=0;z<selectedRowInputs.length;z++)
			{
				if(selectedRowInputs[z].type == 'radio' && selectedRowInputs[z].checked)
				{
					validField = validateSchemaField('sku',selectedRowInputs[z],true,false)
				}
				else if(requireElementDisplayName && selectedRowInputs[z].type == 'text' && selectedRowInputs[z].name.indexOf("order") == -1)
				{
					
					if(selectedRowInputs[z].value == '')
					{
						alert("Warning!\n---\nYou have mapped a field "+requireElementDisplayField+" but not specified an 'element' and/or 'display' name.\nPlease define an 'element' and/or 'display' name.");
						
						allowSubmit = false;
						
						requireElementDisplayName = false;
					}
				}
				
				if(!validField){ allowSubmit = false; }
			}
		}
		
		return allowSubmit;
	}
	
	/*
	 * validateSchemaField
	 * 
	 * validates an individual InventorySchemaField based on three options; mapping, parent, url & sku
	 * 
	 * @param string	fieldType		The type of InventorySchemaField to validate; mapping, parent, url or sku
	 * @param object	fieldSelect		Reference to the InventorySchemaField being validated;
	 * @param boolean	allowMessage	Flag to determine if we alert the user of any errors
	 * @param boolean	allowReset		Flag to determine if we should reset the active select tag being validated if validation fails
	 * 
	 */
	function validateSchemaField( fieldType, fieldSelect, allowMessage, allowReset )
	{
		if(fieldSelect.tagName == 'SELECT')
		{
			var selectedField = fieldSelect.options[fieldSelect.selectedIndex].value;
		}
		
		if(fieldType == 'parent' || fieldType == 'url')
		{
			validField = false;
			
			var selectedFields = document.getElementsByTagName('select');
			
			for(i=0;i<selectedFields.length;i++)
			{
				if(selectedFields[i].name.indexOf(INVENTORY_SCHEMA_FIELD) != -1 && selectedFields[i] != fieldSelect)
				{
					if(selectedFields[i].options[selectedFields[i].selectedIndex].value == selectedField)
					{
						validField = true;
					}
				}
			}
			
			if(!validField)
			{									
				if(allowMessage)
					alert("Warning!\n---\nYou have chosen a "+fieldType+" field mapping which has not been defined.\nPlease choose another mapping, or create a mapping for field '"+selectedField+"'");
							
				if(allowReset)
					fieldSelect.selectedIndex = 0;
								
				return false;

			}			 		
		
		}else if(fieldType == 'mapping') {
			
			var selectedFields = document.getElementsByTagName('select');
			
			for(i=0;i<selectedFields.length;i++)
			{
				if(selectedFields[i].name.indexOf(INVENTORY_SCHEMA_FIELD) != -1 && selectedFields[i] != fieldSelect)
				{
													
					if(selectedFields[i].options[selectedFields[i].selectedIndex].value == selectedField)
					{
						alert('Field '+i+': '+selectedFields[i].name+' ['+selectedFields[i].options[selectedFields[i].selectedIndex].value+'] => Selected: '+fieldSelect.name+' ['+selectedField+']');
						
						if(allowMessage)
							alert("Warning!\n---\nYou have chosen a field mapping which has already been defined.\nPlease choose another mapping, or modify the existing mapping for field '"+selectedField+"'");
						
						if(allowReset)
							fieldSelect.selectedIndex = 0;
							
						return false;
					}
				}
			}
			
			var selectedRow			= fieldSelect.parentNode.parentNode;
			var selectedRowFields	= selectedRow.getElementsByTagName('input');
						
			for(i=0;i<selectedRowFields.length;i++)
				if(selectedRowFields[i].name == 'data[InventorySchema][sku_field]' && selectedRowFields[i].checked)
					selectedRowFields[i].value = selectedField;
				
			if(allowReset)
				verifyMappingChange(fieldSelect);
			
			fieldSelect.id = fieldSelect.value;
		
		}else if(fieldType == 'sku') {
			
			var selectedRow			= fieldSelect.parentNode.parentNode;
			var selectedRowMapping	= document.getElementsByName('data[InventorySchemaField]['+(selectedRow.sectionRowIndex-2)+'][item_column_name]');
			
			if(selectedRowMapping[0].selectedIndex == 0)
			{
				if(allowMessage)
					alert("Warning!\n---\nYou have chosen a "+fieldType+" field that has not been mapped.\nPlease define an 'element' & 'display' name as well as a field mapping");
			
				if(skuFieldSelected)
					skuFieldSelected.checked = true;
					else
					fieldSelect.checked = false;
			
				return false
				
			}else{ selectedField = selectedRowMapping[0].options[selectedRowMapping[0].selectedIndex].value; }
				
			var selectedRowFields	= selectedRow.getElementsByTagName('input');
			
			for(i=0;i<selectedRowFields.length;i++)
			{
				if(selectedRowFields[i].type == 'text' && selectedRowFields[i].name.indexOf("display_order") == -1)
				{
					if(selectedRowFields[i].value == "")
					{
						if(allowMessage)
							alert("Warning!\n---\nYou have chosen a "+fieldType+" field that has not been mapped.\nPlease define an 'element' & 'display' name as well as a field mapping");
						
						if(skuFieldSelected)
							skuFieldSelected.checked = true;
							else
							fieldSelect.checked = false;
						
						return false;
					}
				}	
			}
			
		}
		
		if(fieldSelect.checked)
		{
			skuFieldSelected = fieldSelect;
			skuFieldSelected.value = selectedField;
		}
		
		return true;
	}
		
	/*
	 * verifyMappingChange
	 * 
	 * checks for any InventorySchemaFields that reference the changing mapping and updates their parent/url field as required
	 * 
	 * @param object fieldSelect Reference to the InventorySchemaField being changed
	 */
	function verifyMappingChange( fieldSelect )
	{
		var selectionFields = document.getElementsByTagName('select');
		var changeCount		= 0;
		
		if(fieldSelect.id == "")
			return true;
		
		for(i=0;i<selectionFields.length;i++)
		{
			if(selectionFields[i].name.indexOf(INVENTORY_SCHEMA_FIELD_PARENT) != -1 || selectionFields[i].name.indexOf(INVENTORY_SCHEMA_FIELD_URL) != -1)
			{
				if(selectionFields[i].options[selectionFields[i].selectedIndex].value == fieldSelect.id)
				{
					changeCount++;
//					var allowChange = confirm("Warning!\n---\nThe mapping for field '"+selectionFields[i].options[selectionFields[i].selectedIndex].value+"' is referenced by another mapping. Do you wish to update ?");
					
//					if(allowChange)
						for(j=0;j<selectionFields[i].length;j++)
							if(selectionFields[i].options[j].value == fieldSelect.options[fieldSelect.selectedIndex].value)
								selectionFields[i].selectedIndex = j;
				}
			}
		}
		
		if(changeCount > 0)
			alert("Warning!\n---\nThe mapping for field '"+fieldSelect.id+"' was referenced by "+changeCount+" mappings which have been updated accordingly");
	}

/* END: InventorySchema Validation */


	/*
	 * allowAction
	 * 
	 * generic confirmation request; if confirmed then redirects
	 * 
	 * @param string redirectUrl	CakePHP URL to redirect to on confirmation
	 * @param string confirmMessage	Confirmation message to display
	 */
	function allowAction( redirectUrl, confirmMessage )
	{
		if(confirm(confirmMessage))
			window.location = redirectUrl;

	}
    
    
    /*
     * email validation
     *
     * generic email syntax validation
     *
     * @param string email  Email address to validate
     */
    function validateEmail( emailField )
    {
        var email = document.getElementById(emailField);
        
        var email_regex = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/;
        
        if(!email_regex.test(email.value) || email_regex.test(email.value) == false)
        {
            alert('Please enter a valid email address');
            
            return false;
        }
        else
        {
            return true;
        }
        
    }
    
    function validateForm( form, requiredFields )
    {
        for(i=0; i<requiredFields.length; i++)
        {
            formField = document.getElementById(requiredFields[i]);
            
            if(formField.value == '')
            {
                alert('You must provide a valid ' + formField.title + '.');
                
                return false;
            }
            else if(formField.title.indexOf('Email') >= 0)
            {
                var email_regex = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/;
                
                if(!email_regex.test(formField.value) || email_regex.test(formField.value) == false)
                {
                    alert('You must provide a valid email address.');
                    
                    return false;
                }
            }
        }
        
        return true;
    }
