/**	
 * Enable form validation
 */
 var validator;
function initValidations (formSelector,isAjax,userOptions,ajaxSubmitHandler,ajaxSuccessCallback,ajaxErrorCallback) {
	options = {
			errorClass:'eLabel'
			,errorElement: "div"
			,errorPlacement: 
				function(error, element) {
					label = labelForElement(element);
		 			
			 		if(error.html()){
			 			label.addClass('eLabel');
			 			element.addClass('eInput');
			 			error.attr('field_id',element.attr('id'));
			 			if(element.attr('error') == undefined || element.attr('error') == null){
			 				error.appendTo(element.parent());
			 			} else {
			 				$(element.attr('error')).empty();
			 				error.appendTo($(element.attr('error')));
			 			}
			 		}
			 		else {
			 			label.removeClass('eLabel');
			 			element.removeClass('eInput');
			 		}
				}
			,success: 
				function(error) { 
						element = $("[id='"+error.attr('field_id')+"']");
						element.removeClass('eInput');
						label = labelForElement(element);
		 				label.removeClass('eLabel');
				}
			, submitHandler:
				function(form) {
			 		$('input[type="submit"]').attr('disabled', 'disabled');
			 		form.submit();
				}
		 };
		
		if (isAjax) {
			options.submitHandler =  ajaxSubmitHandler ? ajaxSubmitHandler : 
				function(form) {
		   			$(form).ajaxSubmit({
		   				dataType:  null,
		   				beforeSubmit: 
							function(formData, jqForm, options){
								if(jQuery.isFunction(beforeAjaxSubmit)) 
									beforeAjaxSubmit(formData, jqForm, options);
							},
		   				success: 
		   					function(responseText, statusText){
		   						if(jQuery.isFunction(responseCallback)) 
		   							responseCallback(responseText, statusText, ajaxSuccessCallback, ajaxErrorCallback);
		   					}
		   			});
				}	
		}
		
		options =  $.extend(options,userOptions || {});
		validator = $(formSelector).validate(options);
}


labelForElement = function(element){
	if (element.attr('label'))
		return $('#'+element.attr('label'));
	if (element.attr('question'))
		return $('#'+element.attr('question'));
	if (element.attr('type') == 'radio')
		return $("label[for='" + element.attr('id').replace(element.attr('value'), '') + "']");
	else 
		return $("label[for='" + element.attr('id') + "']");
}

/**
 * Enable submit buttons
 */
function enableButtons(){
	$("input[type='submit']").attr('disabled',false);
}

/*
 * overrides validator custom message function (customized messages)
 */
jQuery.validator.prototype.customMessage = function (elementName,method) {
	el = $("[name='"+elementName+"']",this.currentForm).filter('[type!="hidden"]');
	var messages = el.attr("alt");
	messages = eval("(" + messages + ")");
	method = method.toLowerCase();
	if (messages && messages[method]) {
		//fixed to avoid problems with remote validation and custom messages
		if(messages[method].indexOf("{") > -1) {
			return jQuery.format(messages[method]);
		}
		return messages[method];
	}
	return undefined;
}
		
/*
 * Merrcury validation methods
 */
jQuery.validator.addMethod("password", function( value, element ) {
		var result = this.optional(element) || value.length >= 4 && /^\w+$/.test(value);
		return result;
}, __("Your password must be at least 4 characters long and contains only numbers and characters.",true));

jQuery.validator.addMethod("alphanumeric", function( value, element ) {
		var result = this.optional(element) || /^[\dA-Za-z]+$/.test(value);
		return result;
}, __("Please use only letters and numbers.",true));

jQuery.validator.addMethod("referralcode", function( value, element ) {
		var result = this.optional(element) || /^[\dA-Za-z]+$/.test(value);
		return result;
}, __("The web address that you entered is empty, or contains spaces or invalid characters. Please only use letters or numbers.",true));

jQuery.validator.addMethod("path", function( value, element ) {
	var result = this.optional(element) || /^[\dA-Za-z\_\-]+$/.test(value);
	return result;
}, __("Please use only letters,numbers or underscore.",true));
	
jQuery.validator.addMethod("different", function( value, element, param ) {
		var result = this.optional(element) || value != param;
		return result;
}, __("You have to entry a valid value for this field.",true));

jQuery.validator.addMethod("queue_autocomplete", function( value, element, param ) {
		var result = $('#'+param).val().length > 0;
		return result;
}, __("You have to entry a valid value for this field.",true));

jQuery.validator.addMethod("greater_than", function( value, element, param ) {
		return parseFloat(value) > parseFloat(jQuery(param).val());
}, __("You have to entry a valid value for this field.",true));

jQuery.validator.addMethod("less_than", function( value, element, param ) {
		return parseFloat(value) < parseFloat(jQuery(param).val());
}, __("You have to entry a valid value for this field.",true));

jQuery.validator.addMethod("greater_than_or_equal", function( value, element, param ) {
	return parseFloat(value) >= parseFloat(jQuery(param).val());
}, __("You have to entry a valid value for this field.",true));

jQuery.validator.addMethod("less_than_or_equal", function( value, element, param ) {
	return parseFloat(value) <= parseFloat(jQuery(param).val());
}, __("You have to entry a valid value for this field.",true));

jQuery.validator.addMethod("max_checks", function( value, element, max ) {
	name = $(element).attr('name');
	return max >= $('input[type="checkbox"][name="' + name + '"]:checked').length
}, __("You have selected too many options",true));

jQuery.validator.addMethod("lodging_url", function( value, element, max ) {
	var result = this.optional(element) || /^[\dA-Za-z\-]+$/.test(value);
	return result;
}, __("Wrong lodging URL",true));

jQuery.validator.addMethod("valid_contact", function( value, element, param ) 
		{
	return value == '';
}, __("Your entry is not a valid contact. Please try typing in his/her email address.",true));

jQuery.validator.addMethod("georeference_required", function( value, element, param ) {
	return jQuery(param).val() != '';
}, __("Please let us know where or near where should the lodgings be.",true));

$(document).ready(function(){

	/**
	 * Character Counter for inputs and text areas
	 */
	//$('.countable').each(function(){
		var update_cntr = function(){
			var new_length = $(this).val().length;
			var e = $('#chrcntr_' + $(this).attr('id'));
			
			if(!$(this).attr('asc')){
				new_length = $(this).attr('maxcount') - new_length;
				if(new_length < 0) e.css('color', 'red');
				else e.css('color', '');
			}
			
			e.html( new_length );
		}
		
		$('.countable')
			.live('keyup', update_cntr)
			.live('keydown', update_cntr)
			.live('change', update_cntr)
			.live('mouseup', update_cntr);
		
		$('.countable').keyup();
	//});

});


/**
 * Autocomplete default callbacks
 */
  
  function parseAutocomplete(data) {
		
		return $.map(eval(data), function(row) {
			return {
				data: row,
				value: row.value,
				result: row.value
				}; 
			});
	}
	
	function formatItemAutocomplete(item) {
			return item.value;
	}
	
	function resultAutocomplete(e, item) {
		//TODO:implement function
		console.log(item);
	}
	
	/** 
	* Callback for Queue autocomplete
	*/
	function addToQueue(e,item){
		var id = item.id;
		var targetId = e.target.id.toLowerCase();
		
		$("#" + e.target.id).val('');
		
		if(!id.match(/^\d+$/)){
			id = getRandomId();
		}
		
		createRecipient(e.target.id.toLowerCase(),id,item.value,item.id);
	}
	
	function createRecipient(targetId,optId,optName,optValue){
	
		var hidden = "#queueOptions_" + targetId;
		if($(hidden).val().match(optValue)){
			return true;
		}
		
		$("#queueOptionsCon_" + targetId).append("<span id=\"queueOption_" + optId + "\" class=\"spanName\">" + optName + " <a id=\"queueOptionDel_" + optId + "\" href=\"#1\"><img src=\"" + image("/img/icon/icoDel6.gif") + "\") /></a></span>" );
		$(hidden).val(($(hidden).val() ? $(hidden).val() + "," : $(hidden).val()) + optValue);
		
		$("#queueOptionDel_" + optId).click(function(){
			$("#queueOption_" + optId).remove();
			$(hidden).val($(hidden).val().replace(optValue+',',''));
			$(hidden).val($(hidden).val().replace(','+optValue,''));
			$(hidden).val($(hidden).val().replace(optValue,''));
		});
	}
	
	function isEmail(value){
		return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([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])))\.?$/i.test(value);
	}
	
	function addRecipientVerifyValue(value,targetId){
		value = removeSpaces(value);
		if(/,/.test(value)){
			value = inspectRecipient(value,',',targetId);
		} else if(/;/.test(value)){
			value = inspectRecipient(value,';',targetId);
		} else {
			return true;
		}
		$("#"+targetId).val(value);
	}
	
	function inspectRecipient(value,separator,targetId){
		strings = value.split(separator);
		newVal = new Array();	
		for(i=0;i<strings.length;i++){
			item = removeSpaces(strings[i]);
			if(item.length == 0){
				continue;
			}
			//test email
			if(isEmail(item)){
				createRecipient(targetId.toLowerCase(),getRandomId(),item,item);
			} else {
				newVal.push(item);
			}
		}
		return newVal.join();
	}
	
	function getRandomId(){
		return Math.ceil(100000000*Math.random()) + 100000000;
	}
	
	function removeSpaces(str){
		str = str.replace(/\s+/g," ");
		str = jQuery.trim(str);
		return str;	
	}	