(function($){
$.fn.icsCalendar = function(options) {

  	var defaults = {
		proxyPath		: "/calendar/proxy.php?path=",
   		eventsHolder	: "#events",
  	};

	var events = [];
	var calendar = this;
	var options = $.extend( defaults, options);
	var callUrl = options.proxyPath + options.icsUrl;
	
	function parseDate( dateStr ) {
		var year = Number(dateStr.substr(0,4));
		var month = Number(dateStr.substr(4,2));
		var day = Number(dateStr.substr(6,2));
		return new Date(year, month-1, day);
	}

	function highlightDays(date) {
        var t = events.length;
		for (var i = 0; i < t; i++) {
			if ( dateHasEvent(date, events[i]) ) {
				return [true,'ui-state-highlight'];
			}
		}
        return [false, ''];
	}
	
	function dateHasEvent( date, evt ) {
		var dateStart = evt.dateStart;
		var dateEnd = evt.dateEnd;
		var duration = dateEnd - dateStart ;
		var dif = date - dateStart;
		return (dif >= 0 && dif < duration);
	}
	
	function monthHasEvent( month, year,  evt ) {
		var isStart = evt.dateStart.getMonth() == month && evt.dateStart.getFullYear() == year;
		var isEnd = evt.dateEnd.getMonth() == month && evt.dateEnd.getFullYear() == year;
		return isStart || isEnd;
	}
	
	function selectDay(dateText, inst) {
		var dateSplit = dateText.split("/");
		var date = new Date(dateSplit[2],dateSplit[1]-1,dateSplit[0]);
		var t = events.length;
		var eventsSelected = [];
		for (var i = 0; i < t; i++) {
			if ( dateHasEvent(date, events[i]) ) {
				eventsSelected.push(events[i]);
			}
		}
		showEvents(eventsSelected);
	}
	
	function changeMonth( year, month ) {
		month--;
		var t = events.length;
		var eventsSelected = [];
		for (var i = 0; i < t; i++) {
			if ( monthHasEvent(month, year, events[i]) ) {
				eventsSelected.push(events[i]);
			}
		}
		showEvents(eventsSelected);
	}
	
	function showEvents( evts ) {
		var total = evts.length;
		var content = "";
		for (var i = 0; i < total; i++) {
			content += '<div class="evento">';
			content += '<h3>' + evts[i].title + '</span>'
			content += '<span class="data">' + datesToString(evts[i]) + '</span>'
			content += evts[i].location ? '<span class="local">' + evts[i].location + '</span>' : '';
			content += evts[i].description  ? '<spac class="url">' + '<a target="_blank" href="' +  evts[i].description + '">' + evts[i].description  + '</a></span>' : ''
		}
		
		$(options.eventsHolder).html(content);
	}
	
	function datesToString( evt ) {
		var months = ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'];
		var dateStart = evt.dateStart;
		var dateEnd = evt.dateEnd;
		var duration = (dateEnd - dateStart) / (3600*1000*24);
		var str = dateStart.getDate() + " de " + months[dateStart.getMonth()];
		if (duration > 1) {
			dateEnd = new Date(dateEnd.getYear(), dateEnd.getMonth(), dateEnd.getDate()-1)
			if (dateEnd.getMonth() == dateStart.getMonth()) {
				str = dateStart.getDate() + " a " + dateEnd.getDate() + " de " + months[dateStart.getMonth()];
			} else {
				str += " a " + dateEnd.getDate() + " de " + months[dateEnd.getMonth()];
			}
		}
		return str;
	}
	
	$.get( callUrl, function (data) {
		mainData = data;
		var items = data.split("BEGIN:VEVENT");
		
		items.shift();
		var total = items.length;
		for (var i = 0; i < total; i++) {
			var evt = {};
			var str = items[i];
			str.replace(/\n\r/,"\n")
			evt.title = str.match(/SUMMARY:([\s\S]*)(?=TRANSP:)/).pop().replace(/\\n/,"\n").replace(/\\/,"");
			evt.description = str.match(/DESCRIPTION:(.+)/) && str.match(/DESCRIPTION:(.+)/).pop().replace(/\\n/,"\n").replace(/\\/,"");
			evt.location = str.match(/LOCATION:(.+)[\n\r]/) && str.match(/LOCATION:(.+)[\n\r]/).pop().replace(/\\n/,"\n").replace(/\\/,"");
			evt.dateStart = parseDate(str.match(/DTSTART;VALUE=DATE:(.+)[\n\r]/).pop());
			evt.dateEnd = parseDate(str.match(/DTEND;VALUE=DATE:(.+)[\n\r]/).pop());
			events.push(evt);
		} 
		calendar.datepicker({
			beforeShowDay		: highlightDays,
			onSelect			: selectDay,
			onChangeMonthYear	: changeMonth
		});
		
		var today = new Date();
		changeMonth( today.getFullYear(), today.getMonth()+1);
		
	});

  	return calendar;
 };
})(jQuery);