/**
 * FormErrorsHandler
 * @author RoeiTell
 * -----------------
 * 
 * 	@param scheme ?
 * 		-> Array of Objects, {inputName, inputType, contextID}
 * 		-> String, id of a form to scan and fetch
 * 	@param meta Mixed
 * 	@param callback String
 * 
 * API
 * ---
 * 	@public define(Mixed scheme, Mixed meta, String callback)
 * 	@public feed(Array of Strings error)
 * 
 */
function FormErrorsHandler()
{
	var reportUrl 		= 'http://10.0.0.73/forms/report',
		jsonWrapper 	= JSON.stringify,
		maxUrlLength	= 4500;
	
	var formScheme 	= [ ],	// Array of Objects  	** { inputName, inputType, contextID } **
		formData 	= { },	// Object 				** { key:value } **
		formErrors 	= [ ],	// Array of Strings
		metaData	= { },	// Mixed
		callBack	= '';	// String 				** function name **

	/**
	 * PUBLIC
	 */
	this.define = function(/*Object*/ definitions)
	{
		(typeof definitions.scheme == 'string') ? 
				scanForm(definitions.scheme) : formScheme = definitions.scheme;
		metaData	= (definitions.meta) ? definitions.meta : { };
		callBack	= (definitions.callback) ? definitions.callback : ' ';
	}

	this.feed = function(/*Array*/ errors)
	{
		if (errors.length == 0) return true;
		formErrors = errors;
		harvestForm();
		return outputData();
	}
	
	/**
	 * PRIVATE
	 */
	function scanForm(formId)
	{
		for (var iterator = 0; iterator < document.getElementById(formId).elements.length; iterator++)
		{
			if (!document.getElementById(formId).elements[iterator].name) continue;
			formScheme.push({
				inputName:	document.getElementById(formId).elements[iterator].name,
				inputType:	(document.getElementById(formId).elements[iterator].type) ? 
								document.getElementById(formId).elements[iterator].type : 
								document.getElementById(formId).elements[iterator][0].type,
				contextID:	formId
			});
		}
	}

	function harvestForm()
	{
		for (var iterator = 0; iterator < formScheme.length; iterator++)
		{
			var element = document.getElementById(formScheme[iterator].contextID)[formScheme[iterator].inputName];
			formData[formScheme[iterator].inputName] = fetchInputData(element, formScheme[iterator].inputType);
		}
	}

	function fetchInputData(inputElement, inputType)
	{
		var inputData;
		switch (inputType)
		{
		case 'select-one':
		case 'select-multiple':
		case 'select':
			inputData = [ ];
			for (var iterator = 0; iterator < inputElement.options.length; iterator++)
			{
				if (inputElement.options[iterator].selected)
				{
					inputData.push(inputElement.options[iterator].text);
				}
			}
		break;
		case 'radio':
			inputData = [ ];
			for (var iterator = 0; iterator < inputElement.length; iterator++)
			{
				if (inputElement[iterator].checked)
				{
					inputData.push(inputElement[iterator].value);
				}
			}
		break;
		default:
			inputData = inputElement.value;
		}
		return inputData;
	}
	
	function outputData()
	{
		var reportData = jsonWrapper({
			data:	formData,
			errors:	formErrors,
			meta:	metaData
		});

		var url = reportUrl+'?callback='+callBack+'&data='+reportData;
		if (url.length > maxUrlLength)
		{
			url = reportUrl+'?callback='+callBack+'&data='+jsonWrapper(url.length);
		}

		try	{
			var scriptObj = document.createElement("script");
			scriptObj.setAttribute("type", "text/javascript");
			scriptObj.setAttribute("charset", "utf-8");
			scriptObj.setAttribute("src", url);
			document.getElementsByTagName("head").item(0).appendChild(scriptObj);
			return false;
		} catch(e) {
			return true;
		}
	}

}