// Weeks Per Month
function WPM(y, m) { var DoM, DoW, Thu
  with (new Date(y, m, 0)) { DoM = getDate() ; DoW = getDay() }
  Thu = DoM - (DoW + 3)%7 // Final
  return ((Thu+6)/7)|0 }

/*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.meanfreepath.com */
Date.prototype.getWeek = function (dowOffset) {
	dowOffset = typeof(dowOffset) == 'int' ? dowOffset : 1; //default dowOffset to zero
	var newYear = new Date(this.getFullYear(),0,1);
	var day = newYear.getDay() - dowOffset; //the day of week the year begins on
	day = (day >= 0 ? day : day + 7);
	var daynum = Math.floor((this.getTime() - newYear.getTime() - 
	(this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;
	var weeknum;
	//if the year starts before the middle of a week
	if(day < 4) {
		weeknum = Math.floor((daynum+day-1)/7) + 1;
		if(weeknum > 52) {
			nYear = new Date(this.getFullYear() + 1,0,1);
			nday = nYear.getDay() - dowOffset;
			nday = nday >= 0 ? nday : nday + 7;
			/*if the next year starts before the middle of
 			  the week, it is week #1 of that year*/
			weeknum = nday < 4 ? 1 : 53;
		}
	}
	else {
		weeknum = Math.floor((daynum+day-1)/7);
	}
	return weeknum;
};

function dateOfWeek(wkNum,yrNum){
 	var theDate=Date.UTC(yrNum,0,1);
 	var result=theDate+(wkNum*604800000);
 	var resultDate=new Date(result);

 	var dateNum = resultDate.getDate();
 	var dateDay = resultDate.getDay();
 	var dateMonth = resultDate.getMonth();

 	if(dateDay!==6){
  		result=result-((dateDay+1)*86400000);
  		resultDate=new Date(result);
  		dateNum = resultDate.getDate();
  		dateDay = resultDate.getDay();
  		dateMonth = resultDate.getMonth();
	}

	return dateNum+"/"+dateMonth+"/"+yrNum;
}

var output = "";

var currentDate = null;
var myHref = window.location.href;

var day, week, month, year;
var myArray = myHref.split('/');
var menu, menu_sub;

//output = myArray.length + " ";

if(myArray.length == 10)
{
	//10 2 0 16 03 2011 undefined
	day = (myArray[myArray.length - 1].length > 2) ? "01" : myArray[myArray.length - 1];
	month = myArray[myArray.length - 2];
	year = myArray[myArray.length - 3];
	menu_sub = myArray[myArray.length - 4];
	menu = myArray[myArray.length - 5];
}
else if(myArray.length == 9)
{
  //9 2 0 undefined 2 2011 undefined
	day = "01";
	month = myArray[myArray.length - 1];
	year = myArray[myArray.length - 2];
	menu_sub = myArray[myArray.length - 3];
	menu = myArray[myArray.length - 4];
}
else if(myArray.length == 8)
{
  //8 2 0 undefined undefined undefined 12
	week = myArray[myArray.length - 1].split(':');
	week = parseInt("1"+week[week.length - 1])-100;
	menu_sub = myArray[myArray.length - 2];
	menu = myArray[myArray.length - 3];
}
else if(myArray.length == 6)
{
	//6 2 0 undefined undefined undefined undefined
	menu_sub = 0;
	menu = myArray[myArray.length - 1];
}
else if(myArray.length == 7)
{
	//7 2 10 undefined undefined undefined undefined
	menu_sub = myArray[myArray.length - 1];
	menu = myArray[myArray.length - 2];
}

//output += menu + " " + menu_sub + " " + day + " " + month + " " + year + " " + week;

showDays('calendarWeek', day, month, year, week);

function showDays(node, day, month, year, week){
	var node = document.getElementById(node);
	var data, giorno, mese, anno;

//	if(day == null || month == null || year == null ||!IsNumeric(day) || day<=0 || !IsNumeric(month) || month < 0 || !IsNumeric(year) || year <= 0 )
	if(day == null || month == null || year == null ||!IsNumeric(day) || day<=0 || !IsNumeric(month) || month < 0 || !IsNumeric(year) || year <= 0 )
	{
		data = new Date();
	}
	else
	{
		data = new Date(year, month - 1, day);
	}

	anno = data.getFullYear();

	if(!week)
	{
  	week = data.getWeek();
  	
  	var prev_week = week-1;
  	var next_week = week+1;

		week = null;

		giorno = data.getDate();
		mese = data.getMonth();
	}
	else
	{
		var dateOfWeekResult = dateOfWeek(week, anno);
		var dateArray = dateOfWeekResult.split('/');

		giorno = parseInt(dateArray[0]);
		mese = parseInt(dateArray[1]);

		var prev_week = week-1;
		
		if(prev_week == 0)
		{
			//output +="anno: " + (anno-1);
			prev_week = new Date(anno, 1, 1).getWeek();
		}

	var next_week = week+1;

	}

	currentDate = data;

	
	var mesi = new Array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');
	var settimane = new Array('0','01','02','03','04','05','06','07','08','09');
	var s_prev_week = (prev_week < 10) ? settimane[prev_week] : prev_week;
	var s_next_week = (next_week < 10) ? settimane[next_week] : next_week;
	//node.innerHTML = '<div class="month">'+ mesi[mese] + '<a href="javascript:prevWeek(\'' + node.id  + '\')" class="prev">Settimana Precedente</a>' +' '+ '<a href="javascript:nextWeek(\'' + node.id + '\')" class="next">Settimana Successiva</a>' + '</div>';
	node.innerHTML = output+'<div class="month">'+ mesi[mese] + '<a href="/events/index/'+menu+'/'+menu_sub+'/week:'+s_prev_week+'" class="prev">Settimana Precedente</a>' +' '+ '<a href="/events/index/'+menu+'/'+menu_sub+'/week:'+s_next_week+'" class="next">Settimana Successiva</a>' + '</div>';

	var ulNode = document.createElement('ul');
	var liNode;

	if(week){
		var from = giorno-5;
		var to = giorno+1;
	}else{
		var from = giorno-3;
		var to = giorno+3;
	}
	var selected = '';
	for (var i = from; i<= to; i += 1) 
	{
		if(i===giorno && !week){
			selected = ' selected';
		}else{
			selected = '';
		}
		liNode = document.createElement('li');			
		liNode.innerHTML = '<a href="/events/index/'+menu+'/'+menu_sub+'/'+anno+'/'+showMonth(i, mese, anno)+'/'+showDay(i, mese, anno)+'" >' + showDay(i, mese, anno) + '<span class="dayLabel">' + getDayLabel(i, mese, anno) + '</span></a>';
		liNode.className = 'day'+selected+'';
		ulNode.appendChild(liNode);
	}
	node.appendChild(ulNode);
}

function getNextWeekNumber()
{
	var giorno, mese, anno;

	giorno = currentDate.getDate() + 7;
	mese = currentDate.getMonth();
	anno = currentDate.getFullYear();
	
	switch (mese)
	{
		case 10://novembre
		case 3://aprile
		case 5://giugno
		case 8://settembre
			if(giorno>30){
				giorno -= 30;
				mese += 1;
			}
			break;
		case 1://febbraio
			if((anno - 2008)%4 === 0){
				if(giorno>29){
					giorno -= 29;
					mese += 1;
				}else if(giorno>28){
					giorno -= 28;
					mese += 1;
				}
			}
			break;
		default:
			if(giorno>31){
				giorno -= 31;
				mese += 1;
			}
			break;

		if(mese>11){
			mese = 0;
			anno += 1;
		}
	}
	return new Date(anno, mese, giorno).getWeek();
}

function getPrevWeekNumber()
{
	var giorno, mese, anno;

	giorno = currentDate.getDate() - 7;
	mese = currentDate.getMonth();
	anno = currentDate.getFullYear();

	if(giorno<1){
		mese -= 1;

		if(mese<0){
			mese = 11;
			anno -= 1
		}

		switch (mese){
			case 10://novembre
			case 3://aprile
			case 5://giugno
			case 8://settembre
				giorno += 30;
				break;
	
			case 1://febbraio
				if((anno - 2008)%4 === 0){
					giorno += 29;
				}else{
					giorno += 28;
				}
				break;
			
			default:
				giorno += 31;
				break;
		}
	}
	return new Date(anno, mese, giorno).getWeek();
}


function nextWeek(node)
{
	var giorno, mese, anno;

	giorno = currentDate.getDate() + 7;
	mese = currentDate.getMonth();
	anno = currentDate.getFullYear();
	
	switch (mese)
	{
		case 10://novembre
		case 3://aprile
		case 5://giugno
		case 8://settembre
			if(giorno>30){
				giorno -= 30;
				mese += 1;
			}
			break;
		case 1://febbraio
			if((anno - 2008)%4 === 0){
				if(giorno>29){
					giorno -= 29;
					mese += 1;
				}else if(giorno>28){
					giorno -= 28;
					mese += 1;
				}
			}
			break;
		default:
			if(giorno>31){
				giorno -= 31;
				mese += 1;
			}
			break;

		if(mese>11){
			mese = 0;
			anno += 1;
		}
	}
	showDays(node, giorno, mese + 1, anno);
}

function prevWeek(node)
{
	var giorno, mese, anno;

	giorno = currentDate.getDate() - 7;
	mese = currentDate.getMonth();
	anno = currentDate.getFullYear();

	if(giorno<1){
		mese -= 1;

		if(mese<0){
			mese = 11;
			anno -= 1
		}

		switch (mese){
			case 10://novembre
			case 3://aprile
			case 5://giugno
			case 8://settembre
				giorno += 30;
				break;
	
			case 1://febbraio
				if((anno - 2008)%4 === 0){
					giorno += 29;
				}else{
					giorno += 28;
				}
				break;
			
			default:
				giorno += 31;
				break;
		}
	}
	showDays(node, giorno, mese + 1, anno);
}

function showDay(giorno, mese, anno)
{
	if(giorno<=0){
		mese -= 1;

		if(mese<0){
			mese = 11;
			anno -= 1;
		}
	
		switch (mese){
			case 10://novembre
			case 3://aprile
			case 5://giugno
			case 8://settembre
				giorno += 30;
				break;
	
			case 1://febbraio
				if((anno - 2008)%4 === 0){
					giorno += 29;
				}else{
					giorno += 28;
				}
				break;

				default:
					giorno += 31;
				break;
		}

	}else{
		switch (mese)
		{
			case 10://novembre
			case 3://aprile
			case 5://giugno
			case 8://settembre
			
			if(giorno>30){
				giorno -= 30;
				mese += 1;
			}
			break;
	
			case 1://febbraio
				if((anno - 2008)%4 === 0){
					if(giorno>29){
						giorno -= 29;
						mese += 1;
					}else if(giorno>28){
						giorno -= 28;
						mese += 1;
					}
				}	
				break;

				default:
					if(giorno>31){
						giorno -= 31;
						mese += 1;
					}
					break;
		}
		if(mese > 11){
			mese = 0;
			anno +=1;
		}
	}
	return giorno;
}

function showMonth(giorno, mese, anno)
{
	if(giorno<=0){
		mese -= 1;
		mese = mese % 11;

		switch (mese){
			case 10://novembre
			case 3://aprile
			case 5://giugno
			case 8://settembre
				giorno += 30;
				break;

			case 1://febbraio
				if((anno - 2008)%4 === 0)
				{
					giorno += 29;
				}else{
					giorno += 28;
				}
			break;

			default:
				giorno += 31;
			break;
		}

	}else{
		switch (mese)
		{
			case 10://novembre
			case 3://aprile
			case 5://giugno
			case 8://settembre
				if(giorno>30){
					giorno -= 30;
					mese += 1;
				}
				break;
			case 1://febbraio
				if((anno - 2008)%4 === 0){
					if(giorno>29){
						giorno -= 29;
						mese += 1;
					}else if(giorno>28){
						giorno -= 28;
						mese += 1;
					}
				}
				break;
			default:
				if(giorno>31){
					giorno -= 31;
					mese += 1;
				}
				break;
		}

		if(mese>11){
			mese = 0;
			anno +=1;
		}
	}

	return mese + 1;
}

function getDayLabel(giorno, mese, anno)
{
	var giorni = new Array('Domenica', 'Luned&iacute;', 'Marted&iacute;', 'Mercoled&iacute;', 'Gioved&iacute;', 'Venerd&iacute;', 'Sabato');
	var data = new Date(anno, mese, giorno);

	return giorni[data.getDay()];
}

function IsNumeric(sText)
{
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;

	for (i = 0; i < sText.length && IsNumber == true; i += 1) 
	{ 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1) 
		{
			IsNumber = false;
		}
	}
	return IsNumber;
}
