$(function() {
	function ajax_error(XMLHttpRequest, textStatus, errorThrown) {
       	console.log("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown);
    }		
    
    function show_validate(input,xml_field) {
    	xml_field_valid = xml_field.find('valid').text(); 
		xml_field_name = xml_field.find('name').text();
		xml_field_message = xml_field.find('message').text();  	
		
		if(xml_field.find('value').size() > 0) {
			xml_field_value = xml_field.find('value').text(); 
			//console.log(input.attr('type'));						
			/* changing input type=file value is not allowed ! */			
			if(input.attr('type') != 'file') {
				input.val(xml_field_value);				
			} else if (xml_field_value == 'clear') {	 
				 
				 //input.removeAttr('value');	 
							
				/*html = input.parent().html();
 			   	input.parent().html(html);
 			   	input.addClass('changed');
				*/
 			   	/*
				container = input.parent();
				temp = input.detach();
				temp.val('pouet');
				container.append(temp);*/
			}		
		}
		
		if(xml_field_valid != 'valid') {
			input.addClass('error_input');	
			input.closest('fieldset').find('label').addClass('error_title');
			input.closest('fieldset').append('<label class="error_text">' + xml_field_message + '</label>');
		}
    }
    
    function remove_old_errors(form) {
		form.find('.error_text').remove();
		form.find('.error_title').removeClass('error_title');			
		form.find('.error_input').removeClass('error_input');    
    }
	
	function submit_validate(form) {		
		var validate_url = form.find('input[name=validation_url]').val();		
		var validation_lang = form.find('input[name=validation_lang]').val();								
		validate_object = new Object();
		form.find('input.check:not(:disabled),textarea.check:not(:disabled)').each(function(key,value) {
			validate_object[$(this).attr('name')] = {
		    	classes: $(this).attr('class'), 
		    	value: $(this).val(),
		    	table: form.find('input[name=table]').val(),
		    	item_id: form.find('input[name=item_id]').val(),
		    	lang_id: form.find('input[name=lang_id]').val(),
		    	validation_lang: validation_lang
		  	}		
		});		
		var validate_data = $.param(validate_object,false);	
		function validate_ajax(xml) {									
			remove_old_errors(form);
			$(xml).find('field').each(function() {
				input = form.find('input[name=' + $(this).find('name').text() + '],textarea[name=' + $(this).find('name').text() + ']'); 
				show_validate(input,$(this));	
			});			
			
			if($(xml).find('errors').text() == 0) {
				form.submit();
			} 
		}
		$.ajax({
			type: 'POST',
			url: validate_url,
			data: validate_data,
			success: validate_ajax,		
			error:  ajax_error,
			dataType: 'xml'
		});
	}
	
	function check_validate(form) {		
		var validate_url = form.find('input[name=validation_url]').val();					
		var validation_lang = form.find('input[name=validation_lang]').val();					
		validate_object = new Object();
		form.find('input.check.changed:not(:disabled)').each(function(key,value) {
			validate_object[$(this).attr('name')] = {
		    	classes: $(this).attr('class'), 
		    	value: $(this).val(),
		    	table: form.find('input[name=table]').val(),
		    	item_id: form.find('input[name=item_id]').val(),
		    	lang_id: form.find('input[name=lang_id]').val(),
		    	validation_lang: validation_lang
		  	}		
		});		
		var validate_data = $.param(validate_object,false);	

		function validate_ajax(xml) {			
			remove_old_errors(form);
			$(xml).find('field').each(function() {
				input = form.find('input[name=' + $(this).find('name').text() + ']'); 
				show_validate(input,$(this));	
			});			
		}

		$.ajax({
			type: 'POST',
			url: validate_url,
			data: validate_data,
			success: validate_ajax,		
			error:  ajax_error,
			dataType: 'xml'
		});
	}	
	
	/*
	function input_validate(input) {
		
		var validate_url = input.parents('form').find('input[name=validation_url]').val();			
		var name = input.attr('name')
		validate_object = new Object();		
		validate_object[input.attr('name')] = {
		    classes: input.attr('class'), 
		    value: input.val(),
		    table: input.parents('form').find('input[name=table]').val(),
		    item_id: input.parents('form').find('input[name=item_id]').val(),
		    lang_id: input.parents('form').find('input[name=lang_id]').val()
		  }
		var validate_data = $.param(validate_object,false);	
		
		function validate_ajax(xml) {		
			//show_validate(input,$(xml).find('field'));				
			$(xml).find('field').each(function() {
				input = input.parents('form').find('input[name=' + $(this).find('name').text() + ']'); 
				input.parents('fieldset').find('.error_text').remove();
				input.removeClass('error');	
				show_validate(input,$(this))	
			});								
		}		
		
		$.ajax({
			type: 'POST',
			url: validate_url,
			data: validate_data,
			success: validate_ajax,		
			error:  ajax_error,
			dataType: 'xml'
		});
	}	*/
	
	// click on submit button : check the form, submit if ok
	$('.submit_validate').click(function() {   		
		submit_validate($(this).parents('form'));
		return false;
	}); 		
	
	// enter key pressed inside form : check the form, submit if ok
	$('.submit_validate').parents('form.form_login').find('input[name=login_password]').keypress(function(e) {		
		if(e.which == 13) {			
			submit_validate($(this).parents('form.form_login'));
	    	return false;  
		}
	});		
	
	// foreach input marked .check, if changed or clicked and clicked out, we mark it .changed and check the whole form
	$.each($('.submit_validate').parents('form').find('input.check'),function() {
		$(this).change(function() {
  			//input_validate($(this));
  			$(this).addClass('changed');
  			check_validate($(this).parents('form'));
		});
		$(this).blur(function() {
			$(this).addClass('changed');
  			check_validate($(this).parents('form'));
		});
	});		
});
