var DIGITS = "0123456789";
var REGULAR_MONTHS = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var LEAP_MONTHS = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function validaData(data) {
	var curDate = new Date();
	var day;
	var month;
	var year;
	if (data.length > 0) {
		if (data.length == 10) {
			compactedDate = data.substring(0, 2) + data.substring(3, 5) + data.substring(6, 10);
		} else {
			if (data.length == 8) {
				if (data.substring(2, 3) == "/") {
					compactedDate = data.substring(0, 2) + data.substring(3, 5) + "20" + data.substring(6, 8);
				} else {
					compactedDate = data;
				}
			} else {
				if (data.length == 6) {
					compactedDate = data.substring(0, 4) + "20" + data.substring(4, 6);
				} else {
					return false;
				}
			}
		}
		if (!validate(compactedDate, DIGITS)) {
			return false;
		}
		if (compactedDate.substring(0, 1) == "0") {
			day = parseInt(compactedDate.substring(1, 2), 10);
		} else {
			day = parseInt(compactedDate.substring(0, 2), 10);
		}
		if (compactedDate.substring(2, 3) == "0") {
			month = parseInt(compactedDate.substring(3, 4), 10);
		} else {
			month = parseInt(compactedDate.substring(2, 4), 10);
		}
		year = parseInt(compactedDate.substring(4, 8), 10);
		if ((month < 1) || (month > 12)) {
			return false;
		}
		if (isLeapYear(year)) {
			if ((day < 1) || (day > LEAP_MONTHS[month - 1])) {
				return false;
			}
		} else {
			if ((day < 1) || (day > REGULAR_MONTHS[month - 1])) {
				return false;
			}
		}
	}
	return true;
}

function validate(data, digit) {
	for (var i = 0; i < data.length; i++) {
		if (digit.indexOf(data.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
}

function isLeapYear(any) {
	return ((((any % 4) == 0) && !((any % 100) == 0)) || (((any % 4) == 0) && ((any % 400) == 0)));
}

function actualitzaData(dies) {
	var anada = $("input#dia_anada").val();
	var tornada = $("input#dia_tornada").val();
	var dia = getToday();
	var i = dies;
	if ((tornada == "") || (tornada == null)) {
		if ((anada == "") || (anada == null)) {
			anada = dia;
			tornada = getNextDate(anada, i);
		} else {
			anada = parseDate(anada);
			tornada = getNextDate(anada, i);
		}
	} else {
		if ((anada == "") || (anada == null)) {
			anada = getNextDate(dia, i);
			tornada = parseDate(tornada);
		} else {
			anada = parseDate(anada);
			tornada = parseDate(tornada);
			if ((getDays(anada, tornada) < i) || (getDays(anada, tornada) > i)) {
				tornada = getNextDate(anada, i);
			}
		}
	}
	if (!validaData(anada) || (getDays(anada, dia) > 0)) {
		anada = dia;
	}
	if (!validaData(tornada) || (getDays(tornada, dia) > 0)) {
		tornada = getNextDate(tornada, i);
	}
	var fiAnada = getNextDate(anada, 180);
	var fiTornada = getNextDate(tornada, 180);
	$("#dia_anada").datepicker("option", "maxDate", fiAnada).val(anada);
	$("#dia_tornada").datepicker("option", "minDate", tornada).datepicker("option", "maxDate", fiTornada).val(tornada);
}

function getNextDate(data, dies) {
	var day;
	var month;
	var year;
	var aux = "";
	if (data.substring(0, 1) == "0") {
		day = parseInt(data.substring(1, 2), 10);
	} else {
		day = parseInt(data.substring(0, 2), 10);
	}
	if (data.substring(3, 4) == "0") {
		month = parseInt(data.substring(4, 5), 10) - 1;
	} else {
		month = parseInt(data.substring(3, 5), 10) - 1;
	}
	year = parseInt(data.substring(6, 10), 10);
	var actualDate = new Date(year, month, day);
	var millis = actualDate.getTime() + 12 * 60 * 60 *1000 + dies * 24 * 60 * 60 * 1000;
	actualDate.setTime(millis);
	var nDay = new Number(actualDate.getDate());
	var nMonth = new Number(actualDate.getMonth()) + 1;
	var nYear = new Number(actualDate.getFullYear());
	if (nYear < 1000) {
		nYear += 1900;
	}
	if (nDay < 10) {
		aux = "0" + nDay.toString() + "/";
	} else {
		aux = nDay.toString() + "/";
	}
	if (nMonth < 10) {
		aux = aux + "0" + nMonth.toString() + "/";
	} else {
		aux = aux + nMonth.toString() + "/";
	}
	aux = aux + nYear.toString();
	return aux;
}

function getDays(data1, data2) {
	var actualDate1, actualDate2;
	var millis1, millis2;
	var day1, day2;
	var month1, month2;
	var year1, year2;
	if (!data2) {
		actualDate1 = new Date();
		actualDate1 = new Date(actualDate1.getFullYear(), actualDate1.getMonth(), actualDate1.getDate());
		millis1 = actualDate1.getTime();
		data2 = data1;
	} else {
		if (data1.substring(0, 1) == "0") {
			day1 = parseInt(data1.substring(1, 2), 10);
		} else {
			day1 = parseInt(data1.substring(0, 2), 10);
		}
		if (data1.substring(3, 4) == "0") {
			month1 = parseInt(data1.substring(4, 5), 10) - 1;
		} else {
			month1 = parseInt(data1.substring(3, 5), 10) - 1;
		}
		year1 = parseInt(data1.substring(6, 10), 10);
		actualDate1 = new Date(year1, month1, day1);
		millis1 = actualDate1.getTime();
	}
	if (data2.substring(0, 1) == "0") {
		day2 = parseInt(data2.substring(1, 2), 10);
	} else {
		day2 = parseInt(data2.substring(0, 2), 10);
	}
	if (data2.substring(3, 4) == "0") {
		month2 = parseInt(data2.substring(4, 5), 10) - 1;
	} else {
		month2 = parseInt(data2.substring(3, 5), 10) - 1;
	}
	year2 = parseInt(data2.substring(6, 10), 10);
	actualDate2 = new Date(year2, month2, day2);
	millis2 = actualDate2.getTime();
	var dif = millis2 - millis1;
	var days = dif / (24 * 60 * 60 * 1000);
	var result = "" + days;
	if (result.indexOf(".") != -1) {
		var resp = result.substring(result.indexOf(".") + 1, result.indexOf(".") + 2);
		if (parseInt(resp, 10) > 5) {
			days = Math.ceil(days);
		} else {
			days = Math.floor(days);
		}
	}
	return days;
}

function getToday() {
	var data = new Date();
	var cadena = data.getDate() + "/" + eval(data.getMonth() + 1) + "/" + data.getFullYear();
	return parseDate(cadena);
}

function parseDate(data) {
	var date = new Date();
	var anyActual = date.getFullYear();
	var dataAux = data;
	if (data.length == 10) {
		dataAux = data;
	} else {
		var n = data.indexOf("/");
		if (n == -1) {
			if (data.length == 8) {
				if (data.substring(2, 3) == "/") {
					dataAux = data.substring(0, 6) + "20" + data.substring(6, 8);
				} else {
					dataAux = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + data.substring(4, 8);
				}
			} else {
				if (data.length == 6) {
					var anyInici = "20";
					var any = data.substring(4, 6);
					if (any >= (""+anyActual).substring(2, 4)) {
						anyInici = "19"
					}
					dataAux = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + anyInici + data.substring(4, 6);
				}
			}
		} else {
			n = dataAux.indexOf("/");
			var dia = dataAux.substring(0, n) + "/";
			if (n == 1) {
				dia = "0" + dia;
			}
			dataAux = dataAux.substring(n + 1);
			n = dataAux.indexOf("/");
			var mes = dataAux.substring(0, n);
			dataAux = dataAux.substring(n + 1);
			if (n == 1) {
				dia = dia + "0" + mes;
			} else {
				dia = dia + mes;
			}
			if (dataAux.length == 2) {
				var anyInici = "20";
				if (dataAux >= (""+anyActual).substring(2, 4)) {
					anyInici = "19"
				}
				dataAux = dia + "/" + anyInici + dataAux;
			} else {
				dataAux = dia + "/" + dataAux;
			}
		}
	}
	return dataAux;
}
