/**********************************/
/** Cool IT Challenge javascript files, except jQuery library itself. **/
/** Last updated: 004 June 2009 **/

/**********************************/
/** 1. Handle cookies  -- MOVED TO ANOTHER FILE, TO BE **/
/** LOADED JUST BEFORE THE WEBPAGE IS COMPLETE - NOT IN **/
/** THE HTML HEAD. **/



/**********************************/
/** 2. http://coolit.greenpeace.org/js/common.js **/

$(function() {
/**
 * Cake SQL Log (app debug mode)
 */
	if ($('.cake-sql-log').length > 0) {
		$('.cake-sql-log').hide();
		$('<a href="#">Toggle Sql Log</a>')
			.insertBefore($('.cake-sql-log'))
			.click(function() {
				$('.cake-sql-log').toggle();
				return false;
			});
	}
/**
 * Hint for input fields (text)
 * @credit http://remysharp.com/2007/01/25/jquery-tutorial-text-box-hints/
 */
	$.fn.hint = function (blurClass) {
		if (!blurClass) { 
			blurClass = 'blur';
		}
		return this.each(function () {
			var $$ = $(this); 
			var title = $$.attr('title'); 
			if (title) { 
				$$.blur(function () {
					if ($$.val() == '') {
						$$.val(title).addClass(blurClass);
					}
				})
				.focus(function () {
					if ($$.val() == title && $$.hasClass(blurClass)) {
						$$.val('').removeClass(blurClass);
					}
				})
				.parents('form:first').submit(function () {
					if ($$.val() == title && $$.hasClass(blurClass)) {
						$$.val('').removeClass(blurClass);
					}
				}).end()
				.blur();
				if ($.browser.mozilla && !$$.attr('autocomplete')) {
					setTimeout(function () {
						if ($$.val() == title) $$.val('');
						$$.blur();
					}, 10);
				}
			}
		});
	};
	$('.hint').hint();
/**
 * Slick annimation -  Slide, fade and toggle (and make cofee if you're nice)
 */
	jQuery.fn.slideFadeToggle = function(speed, easing, callback) {
		return this.animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback); 
	};
/** 
 * Toogles
 * How it works: a.toggle#<id> closes/open .toggle_wrapper#wrapper_<id> easy hey ?
 */
	$(".toggle.close").each(function() {
		$(".toggle_wrapper#wrapper_"+$(this).attr("id")).hide();
	})

	$('a.toggle').click(function() {
		$(".toggle_wrapper#wrapper_"+$(this).attr("id")).slideFadeToggle(300);
		if($('a.toggle#'+$(this).attr("id")).hasClass("close")) {
			$('a.toggle#'+$(this).attr("id")).addClass("open").removeClass("close");
		} else {
			$('a.toggle#'+$(this).attr("id")).addClass("close").removeClass("open");
		}
		return false;
	});
});

/**********************************/
/** 3. http://coolit.greenpeace.org/js/japp.js **/

jQuery.extend({
	processCakeResponse: function(json) {
		if (!json.error && json.redirect) {
			window.location = json.redirect;
		}

		return json;
	},

	validateCakeForm: function(formId, validationRules) {
		var form = $('#' + formId);
		var validation = { rules: {}, messages: {} };

		if (validationRules) {
			for (var key in validationRules) {
				if (typeof validationRules[key] != 'object' || typeof validationRules[key].length == 'undefined') {
					validationRules[key] = $.makeArray(validationRules[key]);
				}

				$(validationRules[key]).each(function() {
					var rule = this;

					elements = key.split('.');
					if (elements.length == 2) {
					    key = 'data[' + elements[0] + '][' + elements[1] + ']';
					}

					ruleName = rule.rule;
					value = rule.value || true;

					if (typeof validation.rules[key] == 'undefined') {
						validation.rules[key] = {};
					}

					if (typeof validation.messages[key] == 'undefined') {
						validation.messages[key] = {};
					}

					validation.rules[key][ruleName] = value;
					validation.messages[key][ruleName] = rule.message || 'Please specify a valid value';
				});
			}
		}

		var success = form.validate(jQuery.extend({
			debug: false,
			errorPlacement: function(error, element) {
				error.appendTo(element.parent());
			}
		}, validation || {})).form();

		return success;
	},

	processCakeForm: function(formId, validationRules, onSuccess, url, contentId) {
		success = $.validateCakeForm(formId, validationRules);
		if (success) {
			var form = $('#' + formId);
			var inputs = [];
			$(':input', form).each(function() {
				if (this.id.charAt(this.id.length - 1) != '_') {
					inputs.push(this.name + "=" + encodeURIComponent(this.value));
				}
			});
			$.postCake(url || form.attr('action'), inputs.join('&'), onSuccess, contentId);
		}

		return success;
	},

	postCake: function(url, data, onSuccess, contentId) {
		contentId = contentId || 'general_msg';

		if (typeof onSuccess != 'function' && typeof onSuccess != 'object') {
			onSuccess = false;
		}

		var options = {
			url: url,
			dataType: 'json',
			error: function (xhr, desc, exceptionobj) {
				alert('There has been an error: ' + xhr.responseText);
			},
			success : function (json) {
				json.success = (typeof json.success == 'undefined' ? true : json.success);

				if (json.success && typeof onSuccess == 'function') {
					onSuccess(json);
				}

				if (!json.message && json.responseText) {
					json.message = json.responseText;
				}

				if (typeof onSuccess == 'object') {
					if (typeof onSuccess.container != 'undefined') {
						$(onSuccess.container).load(onSuccess.url, function() {
							if (json.message) {
								$.renderCakeMessage(contentId, json.message, json.success);
							}
						});
					} else if (typeof onSuccess.url != 'undefined') {
						window.location.href = onSuccess.url;
					}

					if (typeof onSuccess.callback == 'function') {
						onSuccess.callback(json);
					}
				} else if ($('#' + contentId).length > 0 && json.message) {
					$.renderCakeMessage(contentId, json.message, json.success);
				}

				$.processCakeResponse(json);
			}
		}

		if (data) {
			options = $.extend(options, {
				type: 'POST',
				data: data
			});
		}

		$('#' + contentId).removeClass().html('').show();

		// $.blockUI();
		$.ajax(options);
	},

	renderCakeMessage: function (containerId, message, slideUp) {
		$('#' + containerId)
			.html(message)
			.animate({opacity: 1.0}, 3000);
	}
});
