/**
@author djjeck
*/

(function($) {
	if($ == undefined)
		; //TODO
	
	// TODO if($.fn.slidinglabels == undefined)
	// TODO if($.fn.validate == undefined)
	// TODO if($.fn.ajaxForm == undefined)

	if(window.Blacktrend == undefined)
		window.Blacktrend = {};
	
	if(Blacktrend.form == undefined)
		Blacktrend.form = (function() {
			// private
			
			// public
			return {
				registerCallback: function(form, callback) {
if(form == null) {
	// TODO debug: remove
	alert('form is null!\ncallback:\n\n'+callback);
	return;
}
					// TODO use $(form).data('blacktrend_callback');
					if(form.blacktrend_callback == undefined)
						form.blacktrend_callback = new Array();
					form.blacktrend_callback.push(callback);
				},
				submit: function(form) {
					// TODO glasspane w/ ajax gif
					
					// jquery.form
					$(form).ajaxSubmit({
						resetForm: true,
						forceSync: true,
						data: { method: form.id },
						success: function(response, status, XHR, jQueryWrappedForm) {
							//alert(response);
							response = $.parseJSON(response);
							if(form.blacktrend_callback != undefined) {
								for(var i=0; i<form.blacktrend_callback.length; i++)
									form.blacktrend_callback[i](response);
							} else {
								// default success action
								switch(response.status) {
									case 'success':
										alert('Ok');
										break;
									case 'error':
										alert(response.message);
										break;
									default:
										alert('Error in request'); // TODO remove
										break;
								}	
							}
						}
					});
				}
			};
		})();
	
	$(document).ready(function() {
		// form handler
		$('form').not('.validate').submit(function(event) {
			Blacktrend.form.submit(this);
		});
		
		// jquery.slidinglabels
		$('form').slidinglabels({
			className: 'form_slider', // the class you're wrapping the label & input with -> default = slider
			topPosition: '5px', // how far down you want each label to start
			leftPosition: '5px', // how far left you want each label to start
			axis: 'y', // can take 'x' or 'y' for slide direction
			speed: 'fast' // can take 'fast', 'slow', or a numeric value
		});
		
		// source: http://www.robsearles.com/2010/05/27/jquery-validate-url-adding-http/
		jQuery.validator.addMethod("nohttp_url", function(val, elem) {
//alert('nohttp');
			// if no url, don't do anything
			if (val.length == 0) { return true; }

			// if user has not entered http:// https:// or ftp:// assume they mean http://
			if(!/^(https?|ftp):\/\//i.test(val)) {
				val = 'http://'+val; // set both the value
				$(elem).val(val); // also update the form element
			}
			// now check if valid url
			// http://docs.jquery.com/Plugins/Validation/Methods/url
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
			return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(val);
		});
		
		var validate_options = {
			submitHandler: Blacktrend.form.submit //XXX takes only one argument as the form
		};
		
		// jquery.validate
		$('form.validate').not(
			'#form__order_idea__paypal' // no action, real form with post method and user redirection
		).each(function() {
			$(this).validate($.extend(validate_options, {
				errorPlacement: function(error, element) {
					if(element.attr('type') == 'checkbox')
						error.appendTo($(this).find('.error_labels'));
				}
			}));
		});
	});
})(jQuery);
