function splitValue(value) {
	if(typeof value != "string") value = value.toString();
	var objectName = value.match(/(\.|\#)?[\/\?\.\:=a-z_]+/g);
	var objectId = value.match(/\d+/g);
	return {
		name:objectName,
		id:objectId,
		array:( objectId != parseInt(objectId) && objectId != null )?true:false
	}
}
var isValidDateFormat = function(s,startFromYear){
	var reFormat =  /^([0-9]{2,4}[\.\-\/]{1}){2}([0-9]{2,4})$/i.test(s);

	var f = Date.format; f.toLowerCase();

	var reSeparator = false;
	if(/^\d+\-\d+\-\d+$/i.test(s) && /^\w+\-\w+\-\w+$/i.test(f)) reSeparator = true;
	if(/^\d+\.\d+\.\d+$/i.test(s) && /^\w+\.\w+\.\w+$/i.test(f)) reSeparator = true;
	if(/^\d+\/\d+\/\d+$/i.test(s) && /^\w+\/\w+\/\w+$/i.test(f)) reSeparator = true;

	var y = parseInt(s.substr(f.indexOf('yyyy'),4),10);
	var m = parseInt(s.substr(f.indexOf('mm'),2),10);
	var d = parseInt(s.substr(f.indexOf('dd'),2),10);

	var md = new Date(y,m-1).getDaysInMonth();

	return ( !reFormat || !reSeparator || y<0 || m<1 || m>12 || d<1 || d>md ) ? false : true ;
}

var hotelRoomsControl = function() {
	var v = $('#number_of_rooms').val();
	$('.room:gt('+(v-1)+')').remove();
	while ($('.room').size() < v) {
		$('.room:first').clone().insertAfter('.room:last');
		$('.room:last').fieldNumberControl({'select':'name'},$('.room').size()-1);
	}
}
var calculateCheckoutDate = function(){
	switch($(this).attr('id')){
		case 'hotel_checkout_date':
			var i = new Date.fromString($('#hotel_checkin_date').val());
			var o = new Date.fromString($('#hotel_checkout_date').val());
			$('#hotel_nights').val(parseInt((o-i)/(24*60*60*1000),10));
		break;
		default:
			var d = $('#hotel_checkin_date').val();
			var n = (isValidDateFormat(d)) ? new Date.fromString(d) : new Date();
			var d = n.addDays(parseInt($('#hotel_nights').val()),10).asString();
			$('#hotel_checkout_date').val(d);
		break;
	}
}
var prepereHotelsDatepicker = function(){
	var checkin = $("#hotel_checkin_date").datepicker('getDate');
	return (this.id == "hotel_checkout_date") ? {
		minDate: checkin.addDays(1),
		maxDate: new Date(checkin).addDays(29)
	} : {};
}
var validationOptions = {
	labelErrorClass : 'form-input-error',
	messagesErrorId : 'errors',
	breakChain : true,
	locale : false,
	preAction : function() {}
};
var BA1Validation = {
	groups : {
		travel : {fields:['KrajW','KrajD'],glue:'-'}
	},
	rules : {
		travel : 'Regex(/\(\\w+\)?PL\(\\w+\)?/)'
	},
	messages : {
		travel : 'Przepraszamy, ale przepisy przewoźników nie zezwalają na zakup biletu na trasie, gdzie przynajmniej jednym z krajów nie jest Polska.'
	},
	options : validationOptions
}
var getDataW = function(){
	return $('input[name=DataW]').val();
}
var BA3Validation = {
	rules : {
		DataW : 'Date',
		DataP : ['Date','AfterDate(getDataW(),1)']
	},
	messages : {
		DataW : 'Prosimy podać poprawną datę w formacie RRRR-MM-DD.',
		DataP : {
			Date : 'Prosimy podać poprawną datę w formacie RRRR-MM-DD.',
			AfterDate : 'Data powrotu musi być dalsza od daty wyjazdu.'
		}
	},
	options : validationOptions
}
var FlightsValidation = {
	filters : {
		'*' : 'Trim'
	},
	rules : {
		fly_from_0 : 'Required',
		fly_to_0 : 'Required',
		fly_from_date_0 : 'Date',
		fly_to_date_0 : 'Date'
	},
	messages : {
		fly_from_0 : 'Prosimy podać nazwę miasta wylotu.',
		fly_to_0 : 'Prosimy podać nazwę miasta przylotu.',
		fly_from_date_0 : 'Prosimy podać datę wylotu.',
		fly_to_date_0 : 'Prosimy podać datę powrotu.'
	},
	options : validationOptions
}
var ContactValidation= {
	filters : {
		'*' : 'Trim'
	},
	rules : {
		title : 'Required',
		message : 'Required',
		name : 'Required',
		email : 'EmailAddress',
		phone : 'Required'
	},
	messages : {
		title : 'Prosimy podać temat wiadomości.',
		message : 'Prosimy wpisaćiadomość.',
		name : 'Prosimy podać imię i nazwisko.',
		email : 'Prosimy podać poprawny adres e-mail.',
		phone : 'Prosimy podać numer telefonu.'
	},
	options : validationOptions
};
jQuery.fn.extend({
	/*
	 * FIELD DUPLICATION UTILITIES
	 */
	fieldNumberControl: function(o,i) {
		$this = $(this);
		for(f in o) {
			$(f,$this).each(function(){
				var attr = o[f].split(',');
				for (a in attr) {
					if (typeof $(this).attr(attr[a]) != 'undefined') {
						var attrFullName = $(this).attr(attr[a]);
						var attrSplitted = splitValue(attrFullName);
						var newAttrValue = (attrSplitted.name == null) ? parseInt(attrSplitted.id) + i : attrSplitted.name + parseInt(parseInt(attrSplitted.id) + i) 
						
						//console.log(attrFullName+"\n"+newAttrValue);
						
						$(this).attr(attr[a], newAttrValue);
						//$(this).attr(attr[a], attrName.name + parseInt(attrName.id + i));
					}
				}
			});
		}
		return $this;
	}
});
$(document).ready(function(){
	$('form#qsfFlights .datepicker').datepicker();
	$('form#qsfHotels .datepicker').datepicker({
		numberOfMonths : 2,
		//maxDate : $('#hotel_checkin_date').datepicker('getDate')+'+30d',
		beforeShow : prepereHotelsDatepicker,
		onSelect : function(){
			calculateCheckoutDate.call(this);
		}
	});

	$flights = $('form#qsfFlights');
	if ($flights.size() == 1) {
		$flights.validate(FlightsValidation);
		$('input:radio',$flights).click(function(){
			$('input#onewaytrip',$flights).is(':checked')
				? $('input#fly_to_date').parent().hide()
				: $('input#fly_to_date').parent().show();
		});
	};

	$('form.contact').validate(ContactValidation);

	$('form#ba1').validate(BA1Validation);

	if($('form#ba3').size()>0){
		var $roundtrip = $('.bus-round-trip');
		var $cityswap = $('.bus-city-swap');
		$('input[name=RodzajB]').click(function(){
			$(this).val()=='RT' ? $roundtrip.show() : $roundtrip.hide();
		});
		$('input#Op').click(function(){
			if ($(this).is(':checked')) {
				$('input[name=DataP]').attr('disabled','disabled').val('');
			} else {
				$('input[name=DataP]').removeAttr('disabled');
			}
		});
		$('input#city-swap').click(function(){
			if ($(this).is(':checked')) {
				$('.bus-city-swap').show();
			}else{
				$('.bus-city-swap').hide();
				$('select[name=MiastoZP]').val($('input#defaultTo').val());
				$('select[name=MiastoDoP]').val($('input#defaultFrom').val());
			}
		});
		$('form#ba3').validate(BA3Validation);
		$('form#ba3 .datepicker').datepicker();
	};
	
	var acUrl = ($('form#qsfFlights').size()>0) ? '/bilety-lotnicze/lotnisko/' : '/hotele/znajdz/'; 

	$('input.ac').autocomplete(acUrl,{
		minChars: 2,
		delay: 400,
		matchCase: false,
		matchSubset: true,
		matchContains: false,
		cacheLength: 10,
		max: 100,
		mustMatch: false,
		extraParams: {},
		selectFirst: true,
		formatMatch: null,
		autoFill: false,
		width: 200
	});

	if ($('iframe').size() > 0) {
		$('iframe').before($('<div></div>').attr('id', 'iframe-cover').width(750).height($('iframe').height()).css({
			position: 'absolute',
			background: 'white',
			textAlign: 'center'
		}).html('<strong>Prosimy o chwilę cierpliwości. Trwa ładowanie treści...</strong><br/><br/>Jeśli strona nie chce się otworzyć, prosimy kliknąć <a href="' + $('iframe').attr('src') + '">tutaj</a>.')).load(function(){
			$('#iframe-cover').fadeOut('slow');
		});
	};

	if (typeof $.fn.jmap === 'function') {
		var MapXY = [$('#Latitude').text(), $('#Longitude').text()];
		if (MapXY[0] && MapXY[1]) {
			$('#map .map').jmap('init', {
				'mapCenter': MapXY
			}).jmap('AddMarker', {
				'pointLatLng': MapXY,
				'pointHTML': $('#MapText').html()
			});
		}
	}

	if($('form#qsfHotels').size() != 0) {
		calculateCheckoutDate();
		$('#number_of_rooms').change(hotelRoomsControl).each(hotelRoomsControl);
		$('#hotel_nights').change(calculateCheckoutDate);
	}
	

});
