cms.form = 
{
    selectOptions : function(fieldId)
    {
        var field = document.getElementById(fieldId);
        if (field.nodeName.toLowerCase() == "select" && field.options.length > 0)
        {
            if (!field.getAttribute("multiple"))
            {
                field.setAttribute("multiple", "multiple");
            }
            for (var iOptions = 0 ; iOptions < field.options.length ; iOptions++)
            {
                field.options[iOptions].selected = true;
            }
        }
    },
    
	getFieldDisabledState : function(field)
	{
        switch (field.nodeName.toLowerCase())
        {
            case 'input':
                switch (field.type)
                {
                    case 'text':
                    case 'file':
                    case 'password':
                        return field.value.length == 0;

                    case 'checkbox':
                    case 'radio':
                        return !field.checked;
                }
                break;

            case 'textarea':
                return field.value.length == 0;
        }
		return true;
	},
	
	toggleFieldDisabled : function(field, disabledState, firstField)
	{
		field.disabled = disabledState;
		
		classNames = field.className.split(" ");
		var className = "";
		for (var iClassNames = 0 ; iClassNames < classNames.length ; iClassNames++)
		{
			if (classNames[iClassNames] != "disabled")
			{
				if (className.length > 0)
				{
					className += " ";
				}
				className += classNames[iClassNames];
			}
		}
		if (disabledState)
		{
			className += " disabled";
		}
		field.className = className;

		if (firstField && !disabledState)
		{
			field.focus();
		}
	},
	
	toggleDisabledState : function()
	{
		var targetFields = this.toggleDisabledState.arguments;
        var disabled = this.getFieldDisabledState(targetFields[0]);

        var toggled = 0;
		for (var iTargetFields = 1 ; iTargetFields < targetFields.length ; iTargetFields++)
		{
			var targetField = document.getElementById(targetFields[iTargetFields]);
		    if (targetField != null)
			{
				this.toggleFieldDisabled(targetField, disabled, toggled++ == 0);
			}
		}
	},

	getFormQueryData : function(formElement, queryData)
	{
		if (!queryData)
		{
			var queryData = new Object();
		}
		var nodeNames = ["input", "select", "textarea", "option"];
		for (var iNodeNames = 0 ; iNodeNames < nodeNames.length ; iNodeNames++)
		{
			var fields = formElement.getElementsByTagName(nodeNames[iNodeNames]);
			for (var iFields = 0 ; iFields < fields.length ; iFields++)
			{
				if (fields[iFields].className.match(/tinymce/))
				{
					var tinyMceField = tinyMCE.get(fields[iFields].name);
					fields[iFields].value = tinyMceField.getContent();
					tinyMCE.execCommand('mceRemoveControl', false, fields[iFields].name);
				}
				queryData[fields[iFields].name] = fields[iFields].value;
			}
		}
		return queryData;
	},

	submitAsHttpRequest : function(formElement, queryData, contentReplaceAncestor, contentReplaceUrl)
	{
		var request = new HttpRequest();
		if (contentReplaceUrl)
		{
			request.setCallback(
				function() { cms.content.replace(formElement, contentReplaceUrl, contentReplaceAncestor); },
				this);
		}
		else
		{
			request.element = (contentReplaceAncestor)? cms.content.getAncestor(formElement, contentReplaceAncestor) : formElement;
			request.setCallback(cms.content.onReplace, cms.content, false);
		}
		request.sendRequest(formElement.action, this.getFormQueryData(formElement, queryData), true);
	},
	
	initInputWithDefault : function(obj, defaultString)
	{
		if (obj.value == '')
		{
			obj.value = defaultString;
		}
		
		cms.event.attach(obj, 'focus', cms.form.clearInputOnFocus, obj);
		cms.event.attach(obj, 'blur', cms.form.setDefaultOnBlur, obj);
		
		// Zorg dat het veld bij submit indien nodig geleegd wordt
		cms.event.attach(obj.form, 'submit', cms.form.clearFormOnSubmit, obj.form);		
	},
	
	clearFormOnSubmit : function()
	{
		var fields = $('input.defaultValue[title != \'\']', this);
		for (iField = 0; iField < fields.length; iField++)
		{
			cms.form.clearInputOnFocus.call(fields[iField]);
		}
	},
	
	clearInputOnFocus : function() 
	{
		if (this.value == this.title)
		{
			this.value = '';
		}
	},
	
	setDefaultOnBlur : function() 
	{
		if (this.value == '')
		{
			this.value = this.title;
		}
	},
	
	processCmsFormResult : function(formId, resultData, callback)
	{
		var fieldElements = resultData.getElementsByTagName('field');
		var fields = {};
		var moduleId = resultData.documentElement.getAttribute('moduleid');
		
		for (iField = 0; iField < fieldElements.length; iField++)
		{
			var field = fieldElements[iField];
			var fieldName = 'cms[cm' + moduleId + '][form][' + field.getAttribute('id') + ']';
			var errorString = field.getElementsByTagName('errorstring');
			
			fields[fieldName] = {value : errorString[0].firstChild.nodeValue}; 
		}
		
		if (form = document.getElementById(formId))
		{
			cms.form.resetCmsErrors(form);
			
			return cms.form.processCmsErrors(form, fields, callback);
		}
	},
	
	resetCmsErrors : function(form)
	{
		var errorFields = $('input.errored', form);
		for (iField = 0; iField < errorFields.length; iField++)
		{
			var field = $(errorFields[iField]);
			var image = $('img#' + field.attr('id') + '_error_image');
			field.removeClass('errored');
			field.css('border-right-width', '1px');
			field.css('float', 'none');
			field.css('width', field.width() + (image.width() + 4));
			image.remove();
		}
	},

	processCmsFormErrors : function(formId, callback)
	{
		var fields = {};
		
		var form = document.getElementById(formId);
		var data = $(form).serializeArray();
		for (k in data)
		{
			// Controleer of er fouten in het formulier staan
			if (data[k]['name'])
			{
				if (matches = data[k]['name'].match(/\[cm([0-9]+)\]\[formerrors\]\[(.+)\]/))
				{
					var moduleId = matches[1];
					var fieldName = 'cms[cm' + moduleId + '][form][' + matches[2] + ']';
					
					fields[fieldName] = data[k];
				}
			}
		}
		
		return cms.form.processCmsErrors(form, fields, callback);
	},
	
	processCmsErrors : function(form, fields, callback)
	{
		if (callback == undefined)
		{
			callback = cms.form.processCmsFormErrorsCallback;
		}
		
		for (fieldName in fields)
		{
			var fieldData = fields[fieldName];
			
			if (form.elements[fieldName])
			{
				var field = form.elements[fieldName];
				if (field && 
					!field.disabled)
				{
					callback.call(cms.form, form, fieldData, field);
				}
			}
			else
			{
				// Sommige velden hebben een extra array laag, kijk of we deze kunnen vinden
				// en ga net zo lang door totdat we geen velden meer vinden
				var subIndex = 0;
				while (field = form.elements[fieldName + '[' + subIndex + ']'])
				{
					callback.call(cms.form, form, fieldData, field);
					subIndex++;
				}
			}
		}			
	},
	
	processCmsFormErrorsCallback : function(form, error, field)
	{
		var field = $(field); 
		
		if (!field.attr('id'))
		{
			field.attr('id', field.attr('name').replace(/[\[\]]/g, '_'));
		}
		
		if (field.attr('type') == 'hidden'
			|| field.attr('type') == 'checkbox'
			|| field.attr('type') == 'radio')
		{
			return false;
		}		
		
		// Maak een afbeelding aan met het fout-icoon
		var image = document.createElement('img');
		image.src = '/images/icon_error.png';
		image.title = error['value'];
		image.className = 'errored';
		image.alt = '';
		image.id = field.attr('id') + '_error_image';
		
		// Voeg de afbeelding toe achter het veld
		field.after(image);
		field.addClass('errored');
		field.css('border-right-width', '0');
		field.css('float', 'left');
		field.css('width', field.width() - 20);
		$(image).bt({
			contentSelector : "$(this).attr('title')",
			strokeWidth: 1,
			fill: 'rgba(106, 0, 0, 1)',
			strokeStyle: '#000000',
			cssStyles: {color: '#ffffff'},
			spikeGirth: 10,
			positions: ['top', 'bottom'],
		});
	}
};

$(document).ready(function() {
	var fields = $('input.defaultValue[title != \'\']');
	
	for (iField = 0; iField < fields.length; iField++)
	{
		cms.form.initInputWithDefault(fields[iField], fields[iField].title);
	}
});
