/* Form-Errors */
jQuery.fn.formErrors = function(errors) {
	return this.each(function() {
		$(this).clearErrors();
		
		for(elementKey in errors) {
			var html 	= '<ul class="app-error">';
			var error 	= '';
			
			for(errorKey in errors[elementKey]) {
				error += '<li>' + errors[elementKey][errorKey] + '</li>';
			}
			
			html += error;
			html += '</ul>';
			
			if(elementKey == 'form') {
				$(this).prepend(html);
			} else {
				$(this).find('input[name=' + elementKey + ']:first')
					   .parent()
					   .find(':last')
					   .after(html);
			}
		}
	});
};

jQuery.fn.clearErrors = function() {
	return this.each(function() {
		$(this).find('.app-error').remove();
	});
};

/* Editable-Fields */
jQuery.fn.editable = function() {
	return this.each(function() {
		$(this).click(function() {
			if($(this).hasClass('app-save')) {
				var group = this;
				
				$(this).parents('table')
					   .find('input[empty=1], textarea[empty=1]')
					   .val('');
				var values = $(this).removeClass('app-save')
						   .addClass('app-load')
						   .parents('table')
						   .find('tbody')
						   .find('.app-editable input, '
						   + 	 '.app-editable select, '
						   +	 '.app-editable textarea')
						   .serialize();
				var parts = window.location.pathname.split('/');
				if(!parts[3]) parts[3] = "home";
				
				var url = '/' + parts[1] + '/save/' + parts[3];
				
				$.post(
					url,
					values,
					function(json) {
						$(group).removeClass('app-load');
						
						if(json.success) {
							$(group).parents('table')
									.clearErrors()
									.find('tbody .app-editable')
									.find('input, select, textarea')
									.fadeOut('normal', function() {
										var par 	= $(this).parents('.app-editable');
										var value	= (!json.data[$(this).attr('name')]) ? "" : json.data[$(this).attr('name')];
										
										par.find('.app-value')
										   .html(value)
										   .css('display', 'inline');
										   
										par.find('.app-postfix').css('display', 'none');
										if(!json.data[$(this).attr('name')]) {
											par.find('.app-postfix.isEmpty').fadeIn();
										} else {
											par.find('.app-postfix.isNotEmpty').fadeIn();
										}
									});
							$(group).parents('table')
									.find('.app-editable .app-hint').fadeOut();
						} else {
							$(group).removeClass('app-load')
						   			.addClass('app-save')
						   			.parents('table')
						   			.formErrors(json.errors);
						}
					},
					'json'
				);
			} else {
				$(this).addClass('app-save')
					   .parents('table')
						   .find('tbody')
						   .find('.app-editable')
						   .each(function(i) {
						   		if($(this).hasClass('app-save') == true) return;
						   		
						   		var value = $(this).find('.app-value').html();
						   		var css = new Object();
						   		var obj = $('input, '
								   		+ 'select, '
								   		+ 'textarea', this);
						   		
						   		if(!value) {
						   			value = $(this).find('.app-sample').html();
						   			obj.addClass('app-input-shader')
						   			   .attr('empty', '1');
						   			obj.one('focus', function() { $(this).val('').removeClass('app-input-shader').removeAttr('empty'); });
						   		}
						   		
						   		obj.css(css)
						   		   .val(value)
						   		   .fadeIn();
						   		$(this).find('.app-hint').fadeIn();
						   		$(this).find('.app-postfix').css('display', 'none');
						   })
						   .find('.app-value')
						   .css('display', 'none');
			}
		});
		
		$(this).parents('table')
			   .find('tbody')
			   .find('.app-editable input, '
			   + 	 '.app-editable select, '
			   +	 '.app-editable textarea')
			   .each(function(i) {
				   var value = $(this).parent().find('.app-value').html();
					if(!value) {
						$(this).parent().find('.app-postfix.isEmpty').fadeIn();
					} else {
						$(this).parent().find('.app-postfix.isNotEmpty').fadeIn();
					}
			   });
	});
};