function camelize(string) {
    var a = string.split('_'), i;
    s = [];
    for (i=0; i<a.length; i++){
        s.push(a[i].charAt(0).toUpperCase() + a[i].substring(1));
    }
    s = s.join('');
    return s;
}

/**
 * Mètode que mostra els errors de validació amb Ajax.
 * El paràmetre "section" serveix per a indicar dins
 * de quina capa (mitjançant classe o id) es troben els inputs
 */
function onError(data, section) {
	if ( typeof data.data != 'undefined' ) data = data.data;
    jQuery.each(data, function(model, errors) {
        for (fieldName in this) {
            var element = jQuery((typeof section != 'undefined' ? section + " " : "") + "#" + camelize(model + '_' + fieldName));
            var _insert = jQuery(document.createElement('div'));
			// Si el label està darrera en lloc de davant inserim l'error després del label (bàsicament per als checkbox..)
			if ( jQuery(element).next().is('label') && jQuery(element).next().attr('for') == camelize(model + '_' + fieldName) )
				_insert.insertAfter(element.next());
			else 
				_insert.insertAfter(element);
			_insert.hide().addClass('error-message').text(this[fieldName]).slideDown();
			// afegim la classe .error al div que envolcalli
			jQuery(element).closest("div.text").addClass("error");
        }
    });
};

function removeAllErrors() {
	jQuery(".error-message").slideUp(function() {
		$(this).remove();
	});
}

function onErrorTip(data, section) {
	jQuery.each(data.data, function(model, errors) {
		for (fieldName in this) {
			var element = jQuery((typeof section != "undefined" ? section + " " : "") + "#" + camelize(model + "_" + fieldName));
			var _insert = jQuery(document.createElement("div"));

			if ( jQuery(element).parent().next().is("label") && jQuery(element).parent().next().attr("for") == camelize(model + "_" + fieldName) ){
				_insert.insertAfter(element.parent().next());
			} else {
				_insert.insertAfter(element.parent());
			}
			_insert.hide().addClass("error-message").text(this[fieldName]);
			jQuery(element).closest("div.text").addClass("error");
		}
	});
	jQuery("div.error.text input, div.error.text textarea, div.error.text label, div.error.radio")
		.tipTip({
			"display":".error-message",
			"fadeIn":0,
			"fadeOut":0,
			"delay":0,
			"defaultPosition":"top",
			"maxWidth":"180px",
			"edgeOffset":0
		});

	jQuery("div.error.text input, div.error.text textarea")
		.change(function(){
			$(this).unbind("mouseenter");
			$(this).parents("div.input.text").find("label.inner-label").unbind("mouseenter");
			$("#tiptip_holder").hide();
		})
		.click(function(){
			$(this).unbind("mouseenter");
			$(this).parents("div.input.text").find("label.inner-label").unbind("mouseenter");
			$("#tiptip_holder").hide();	
		})
	;
};

jQuery.fn.flashMessage = function(opts) {
	var $this = jQuery(this);
	var type = opts.type || 'error';
	var text = opts.text || opts;
	var position = opts.position || "prepend";
	var div = jQuery("<div>", {
		"class": "form-message " + (eval("opts.class") || "form-error-message"),
		id: opts.id || "flashMessage"
	}).text(text);
	
	function fadein() {
		eval("$this." + position + "(div.fadeIn())");
	}

	//23 Check for existing flashMessage
	if ( jQuery("#" + (opts.id || "flashMessage")).length > 0 ) {
		jQuery("#" + (opts.id || "flashMessage")).fadeOut(function() {
			jQuery(this).remove();
			//23 Show flashMessage
			fadein();
		});
	} else fadein();
}
