function rws_date_from_string(date_str){
	var parts = date_str.split(".");
	return new Date(parts[2],parts[1]-1,parts[0]);
}
function rws_null_date(date_obj){
	date_obj.setHours(0);
	date_obj.setMinutes(0);
	date_obj.setSeconds(0);
	date_obj.setMilliseconds(0);
}

function is_string(value){
	return typeof(value) == 'string';
}

jQuery.fn.bindFormValidator = function(config){

		var $our_form = $(this);
		$.form_validator.our_form = $our_form;
		
		if($.datepicker) {
			$.datepicker.setDefaults({
				onClose: function(date,inst) {
						if(!$.form_validator.active){
							$.form_validator.active = true;
							$(inst.input).blur();
						}
					},
				beforeShow: function(input) { $.form_validator.active = false; }
			});
		}
		
		$('.control-error').each(function(){
			var message_error = $.trim($(this).html());
			if(message_error != ""){
				$(this).html('<div class="tooltip tooltip-red"><span class="l">&nbsp;</span><div class="txt"><span>'+message_error+'</span></div><span class="r">&nbsp;</span></div>').show();
			}
		});
		
		var $form_error_field = $('#' + $(this).attr('id') + '-error');
		
		//var locale = getStringManager();
		var locale = new StringManager();
		
		var storage = new Storage();
		$.form_validator.storage = storage;
		$.form_validator.fconfig = config;
		
		$our_form.find('select.v-visitor').livequery('change', function () {
			var conf = eval ('(' + $(this).attr('rel') +')');
			//console.log(conf.visitor);
			$.form_validator.fconfig.visitors[conf.visitor](storage, this);
		});
		$our_form.find('input.v-visitor').livequery('blur', function () {
			//console.log(this);
			var conf = eval ('(' + $(this).attr('rel') +')');
			$.form_validator.fconfig.visitors[conf.visitor](storage, this);
		});

		$.form_validator.date_valid = function(field){
			return $.form_validator.date_error(field) == '';
		}

		$.form_validator.date_error = function(field){
			var conf = eval ('(' + $(field).attr('rel') +')');
			var pattern = /^\d{1,2}\.\d{1,2}\.\d{4}$/;
			if ( $(field).val() != '' && !pattern.test($(field).val()) ) {
				return 'v-date';
			}
			if(conf.pattern != undefined){
				pattern = conf.pattern;
			}
			if ( $(field).val() != '' && !pattern.test($(field).val()) ) {
				return 'v-date-limits';
			}
			if($.datepicker != undefined){
				try{
					var format = $.datepicker._defaults.dateFormat;
					var filled_date = $.datepicker.parseDate( format, $(field).val(), {} );
				}catch(err){
					return 'v-date-limits';
				}
			}
			return '';
		}
		
		$our_form.find('.v-date').livequery('blur', function (e) {
			if($(this).val() == '__.__.____' || $(this).val() == $(this).attr('comment')){
				$(this).val('');
				e.preventDefault();
			}
			var conf = eval ('(' + $(this).attr('rel') +')');
			var error_message = $.form_validator.date_error($(this));
			storage.RemoveError (this, 'v-date-limits');
			storage.RemoveError (this, 'v-date');
			if ( error_message != '' ) {
				storage.AddError (this, error_message);
			} else {
				if (conf.date && conf.date.use_datepicker_limits) {
					var from = conf.date.from;
					var to = conf.date.to;
					var format = $.datepicker._defaults.dateFormat;
					var filled_date = $.datepicker.parseDate( format, $(this).val(), {} );
					if (filled_date != null && !_in_dp_limits(filled_date, from, to)) {
						storage.AddError(this, 'v-date-limits');
					} else {
						storage.RemoveError(this, 'v-date-limits');
					}
				}
				//console.log(storage);
				storage.RemoveError(this, 'v-date');
			}
			$our_form.find('.v-prefered').change();
		});
		
		$our_form.find('.v-prefered').livequery('change', function (e) { //#4836
			 
			var error_message = 'v-prefered';			
			var format = $.datepicker._defaults.dateFormat;

			
			if ($('#trip-type').val() != 'CR'){
				var filled_date = $.datepicker.parseDate( format, $('.v-date:first').val(), {} );
			}
			else{
				var filled_date = $.datepicker.parseDate( format, $('input[name="cr_date[0]"]').val(), {} );
			}
			var arr = Array();
			arr['night']=24;
			arr['morning']=12;
			arr['afternoon']=18;
			arr['evening']=22;
			today = new Date(new Date().toDateString());	
			dt = new Date();
			hour = dt.getHours();
			
			
			if ((filled_date != null) && (filled_date <= today) && (hour >=6) && ($(this).val() != 'not_important')){
				if (arr[$(this).val()]<hour){
					storage.AddError (this, error_message);	
				}
				else{
					storage.RemoveError (this, error_message);	
				}
			}	
			else{
				storage.RemoveError (this, error_message);
			}
		});

		
		$our_form.find('.v-required').livequery('blur', function () {
			//console.log($(this).val());
			var conf = eval ('(' + $(this).attr('rel') +')');
			if(conf != undefined){
				var error = conf.required_error;
			}
			if (error == undefined){
				error = locale.validator['v-required'];
			}
			//console.log($('#ui-datepicker-div:hidden').length);
			if($(this).attr('disabled')){
				storage.RemoveError (this, error);
				return;
			}
			
			if(!$.form_validator.active)
				return;
			//console.log('ok');
			
			if ( $(this).val() == '' || $(this).val() == $(this).attr('comment') ) {
				storage.AddError (this, error);
			} else {
				storage.RemoveError (this, error);
			}
			return;
		});

		
		$our_form.find('.v-pattern').livequery('blur', function () {

			var conf = eval ('(' + $(this).attr('rel') +')');
			var error = conf.pattern_error;
			var error_text;
			if (error == undefined){
				error = locale.validator['v-pattern'];
				error_text = conf.pattern_error_text;
			}
			if($(this).attr('disabled')){
				storage.RemoveError (this, error);
				return;
			}
			if ( !$(this).val().replace(/(^\s+)|(\s+$)/g, "").match(conf.pattern) && $(this).val() != '' && $(this).val() != $(this).attr('comment')){
				
				storage.AddError(this, error, error_text);
			}else{

				storage.RemoveError(this, error);
			}
		});
		
		$our_form.submit(function(e){
			$.form_validator.submit = true;
			if(!storage.isValid()){
				$.form_validator.submit = false;
				e.preventDefault();
			}
		});
		
		function Field(field){
			this.errors = Array();
			this.el = $(field);
			this.name = $(field).attr('name');
			this.conf = eval('(' + $(field).attr('rel') + ')');
			if (this.conf == undefined)
				this.conf = {};
			if (this.conf['id'])
				this.error = $('#' + this.conf['id']);
			else{
				if($(field).attr('name').match(/\[/)){
					newname = $(field).attr('name').replace(/\[/,'').replace(/\]/,'');
					this.error = $('#' + newname + '-error');
				}else
					this.error = $('#' + $(field).attr('name') + '-error');
			}

//			console.log('Field ' + $(field).attr('name') + ' created');
			
			this.AddError = function (error, message) {	
				this.errors[error] = 1;
				this.showError(error, message);
				storage.showError();
			}
			
			this.RemoveError = function (error, message) {
				this.errors[error] = 0;

				if (this.isValid()) {
					if(  error == 'v-visitor' ){
						if ( this.error.attr('normal_error') != undefined && this.error.attr('normal_error') != '' ){
							this.error.text( this.error.attr('normal_error') ).show();
						}else{
							this.error.text('').hide();
						}
					}else{
						if( this.error.attr('field') == this.name ){
							this.error.text('').hide();
							this.error.attr('field', '');
							this.error.attr('normal_error', '');
						}
					}
				}
			}
			
			this.RemoveAllErrors = function (error) {
				this.errors = Array();

				if (this.isValid()) {
					this.error.text('').hide();
				}
			}
			
			this.isValid = function () {
				for (var key in this.errors) {
					if (this.errors[key]) {
						return false;
					}
				}
				return true;				
			}
			
			this.hasGroup = function (group) {
 				if(!this.conf.group){
					this.conf.group = [group]
				}
				return _in_array(group, this.conf.group);
			}
			
			this.showError = function(error, message) {
				var message_error = 'okok';
				//console.log(message);
				if (message == undefined)
					message_error = $.translate(error);
				else
					message_error = $.translate(message);// locale.getString('validator.' + message);
				//console.log(message_error);
				if (error != 'v-visitor'){
					if ( this.error.attr('field') == undefined || this.error.attr('field') == ''){
						this.error.attr('field', this.name);
						this.error.attr('normal_error', message_error);
					}
				}
				if( this.error.text() == '' || message ){
				
	//DF				this.error.text(message_error).show();
				this.error.html('<div class="tooltip tooltip-red"><span class="l">&nbsp;</span><div class="txt"><span>'+message_error+'</span></div><span class="r">&nbsp;</span></div>').show();
				
				}
			}
		}
		
		function Storage(){
			this.fields = Array();
			
			this.AddError = function(field, error, message){
				var group =  $.form_validator.config.group;
				if (!group) 
					group = 'default';
				
				if (!this.fields[group]) {
					this.fields[group] = Array();
				}
				
				if (is_string(field)) {
					field_name = field;
					if (!this.fields[group][field_name]) {
						if (!this.fields[group][field_name]) {
							this.fields[group][field_name] = new Field($('#' + field));
						}
					}
				}
				else {
					field_name = $(field).attr('name');
				}

				//! special case: we don`t want to validate sceleton here
				if (field_name == undefined || field_name.indexOf('[x]')!== -1) {
					//console.log('Skipped:!: ' + field_name);
					return;
				}
				if (!this.fields[group][field_name]) {
					this.fields[group][field_name] = new Field(field);
				}
				
				if (this.fields[group][field_name].hasGroup(group)) {
					this.fields[group][field_name].AddError(error, message);
				} else {
					//console.log("Original group: " + group);
					//console.log( this.fields[group][field_name].conf.group.join('\n'));
				}
			}

			this.RemoveAllErrors = function(field){
				var group =  $.form_validator.config.group;
				if ( !group ) group = 'default';
				if ( !this.fields[group] ) {
					this.fields[group] = Array();
				}
				field_name = $(field).attr('name');				
				if ( !this.fields[group][field_name] ) {
					this.fields[group][field_name] = new Field(field);
				}
				this.fields[group][field_name].RemoveAllErrors();
				this.isValid(true);
			}
			
			this.RemoveError = function(field, error, message){
				var group =  $.form_validator.config.group;
				if ( !group ) group = 'default';
				if ( !this.fields[group] ) {
					this.fields[group] = Array();
				}
				if (is_string(field)) {
					field_name = field;
					if (!this.fields[group][field_name]) {
						if (!this.fields[group][field_name]) {
							this.fields[group][field_name] = new Field($('#' + field));
						}
					}
				}
				else {
					field_name = $(field).attr('name');
				}		
				if ( !this.fields[group][field_name] ) {
					this.fields[group][field_name] = new Field(field);
				}
				this.fields[group][field_name].RemoveError(error, message);
				this.isValid(true);
			}
		
			this.isValid = function (skip_blur) {
				var group =  $.form_validator.config.group;
				if ( !group ) group = 'default';
				if ( !this.fields[group] ) {
					this.fields[group] = Array();
				}
				if (!skip_blur) {
					$our_form.find('.v-required').blur();
					$our_form.find('.v-date').blur();
					$our_form.find('.v-prefered').change();
					$our_form.find('select.v-visitor').change();
					$our_form.find('[type=checkbox].v-visitor').blur();
				}
				for (var key in this.fields[group]) {
					if (!this.fields[group][key].isValid()) {
						//console.log(this.fields[group][key]);
						this.showError();
						return false;
					}
				}
				$form_error_field.text('').hide();
				return true;
			}
			
			this.showError = function () {
				$form_error_field.text( $.translate('form_failed') ).show();
			}
			
			this.Clear = function () {
				this.fields = Array();
			}
		}
		
		function _in_array(needle, haystack) {
		    var found = false, key;
	 	    for (key in haystack) {
	 	        if ( haystack[key] == needle) {
	 	            found = true;
	 	            break;
	 	        }
	 	    }
	 	    return found;
 		}
		
		function _in_dp_limits(filled_date, from, to) {
			//var filled_date = $(date_input).datepicker( 'getDate' );
			min_date = false;
			max_date = false;
			if (from != undefined && from != 0){
				min_date = new Date(from*1000);
			}else{
				if ($.datepicker._defaults.minDate) {
					var inc_days = parseInt($.datepicker._defaults.minDate.replace("d",''));
					var min_date = new Date();// + new Date(0,0,inc_days);
					min_date.setDate(min_date.getDate() + inc_days);
					rws_null_date(min_date);
				}
			}
			if (min_date && (filled_date - min_date) < 0 ) {
				return false;
			};
			if (to != undefined && to != 0){
				max_date = new Date(to*1000);
			}else{
				if ($.datepicker._defaults.maxDate) {
					var inc_days = parseInt($.datepicker._defaults.maxDate.replace("d",''));
					var max_date = new Date();
					max_date.setDate(max_date.getDate() + inc_days);
					rws_null_date(max_date);
				}
			}
			if (max_date && (max_date - filled_date) < 0 ) {
				return false;
			};
			return true;
		}
		return storage;
	};

( function ( $ ) {
	$.form_validator = {};
	$.form_validator.config = {group:false};
	//$.form_validator.field_set_timeout = null;
	//$.form_validator.timeout = new Array;
	$.form_validator.submit = false;
	$.form_validator.active = true;
})(jQuery);


jQuery(function(){
    if(!window.console) {
        window.console = {};
        window.console.log = function(){};
    }
});

$(document).ready(function(){

	$('.tooltip-red').live('click', function(e){
		$(this).parent().html('');
	});
});

