/*
 * jquery.calendar 1.0.0
 * Copyright (c) 2010 Andrea Piccoli
 * 
 * File generated: Mon Mar 15 00:00:00 GMT+01:00 2010
 *
 */
 
(function($){  
	$.fn.extend({  
		calendar: function(options){  
			//selectbox settings   
			var config = {
						calDisplay:			'icon',		// icon / inline
						calDateDefault:	'today',
						calDateMin:			'',
						calDateMax:			'',
						calMonthNames:	['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
						calDayNames:		['S', 'M', 'T', 'W', 'T', 'F', 'S'],
						calDateFormat:	'dd/mm/yyyy',
						calPosTop:			'0px',
						calPosLeft:			'25px',
						calAltField:		'',
						calTarget:			'',
						calCallback:		''
					};  
		
			var options = $.extend(config, options);  
              
			return this.each(function(){  
				var opt = options;  
				var obj = $(this); 
				var ref = obj.attr("id"); 
				var wrp = obj.parent();
				var val;
				var txt = '';
				var now;
				var out;
				
				var d_sel;	// day selected
				var m_sel;	// month selected
				var y_sel;	// year selected
				
				var y_ref;
				var k 	= 19;

				var calFormatNum = function(num) {
					var str = (num < 10) ? '0'+num : num;
					return str;
				};		
				
				var calGetDays = function(y, m) {
					var days = new Date(y, m, 0).getDate()
					return days;
				};
				
				var calPopulate = function(y, m, d) {
					
					var date_now = y +''+ m +''+ d;
					var d_str;
					var d_prv;
					var d_cur;
					var y_inx;	
					
					var date_max = '';
					var d_max;
					var m_max;
					var y_max;
					
					var date_min = '';
					var d_min;
					var m_min;
					var y_min;
					
					var cal	= new Array;
					var c 	= 1;
					var n 	= 1;
					var id	= '';			
					
					if (opt.calDateMin!='' || opt.calDateMax!='')  {
						if (opt.calDateMin!='')  {
							if (opt.calDateMin.substring(0,1) == '-' || opt.calDateMin.substring(0,1) == '+') {
								now			= new Date();
								d_min 		= calFormatNum(now.getDate());
								m_min 		= calFormatNum(now.getMonth()+1);
								y_min 		= now.getFullYear()+Number(opt.calDateMin);
							} else {
								d_min 		= opt.calDateMin.split('/')[0];
								m_min 		= opt.calDateMin.split('/')[1];
								y_min 		= opt.calDateMin.split('/')[2];
							};
							date_min 		= y_min +''+ m_min +''+ d_min;
							if (date_now < date_min) {
								d = d_min;
								m = m_min;
								y = y_min;
								d_sel = d_min;
								m_sel = m_min;
								y_sel = y_min;
							};
						};
						if (opt.calDateMax!='')  {
							if (opt.calDateMax.substring(0,1) == '-' || opt.calDateMax.substring(0,1) == '+') {
								now			= new Date();
								d_max 		= calFormatNum(now.getDate());
								m_max 		= calFormatNum(now.getMonth()+1);
								y_max 		= now.getFullYear()+Number(opt.calDateMax);
							} else {
								d_max 		= opt.calDateMax.split('/')[0];
								m_max 		= opt.calDateMax.split('/')[1];
								y_max 		= opt.calDateMax.split('/')[2];
							};
							date_max 		= y_max +''+ m_max +''+ d_max;
							if (date_now > date_max) {
								d = d_max;
								m = m_max;
								y = y_max;
								d_sel = d_max;
								m_sel = m_max;
								y_sel = y_max;
							};
						};	
					};
					
					d_str	= new Date(Number(y), Number(m)-1, 1).getDay();
					d_cur = calGetDays(Number(y), Number(m));
					
					if (m=='01') {
						d_prv = calGetDays(Number(y)-1, 12);
					} else {
						d_prv = calGetDays(Number(y), Number(m)-1);
					};
					
					// month previous
					for (var i = 0; i < d_str; ++i) {
						id = '';
						id += (m=='01') ? Number(y)-1 :y ;
						id += (m=='01') ? '12': calFormatNum(Number(m)-1);
						id += calFormatNum(d_prv - d_str + i + 1);
						if (date_min!='' && id<date_min) {
							cal[i] = 'blk|' + id + '|' + calFormatNum(d_prv - d_str + i + 1);
						} else {
							cal[i] = 'out|' + id + '|' + calFormatNum(d_prv - d_str + i + 1);
						};
						id = '';
					};
					
					// month current
					for (var i = d_str; i < (d_str + d_cur); ++i) {
						id = '';
						id = y + '' + m + '' + calFormatNum(c);
						if ((date_min!='' && id<date_min) || (date_max!='' && id>date_max)) {
							cal[i] = 'blk|' + id + '|' + calFormatNum(c);
						} else {
							if (d==calFormatNum(c)) {
								cal[i] = 'sel|' + id + '|' + calFormatNum(c);
							} else {	
								cal[i] = 'in|' + id + '|' + calFormatNum(c);
							};
						};
						c++;
						id = '';
					};
					
					// month next
					for (var i = (d_str + d_cur); i < 42; ++i) {
						id = '';
						id += (m=='12') ? Number(y)+1 : Number(y);
						id += (m=='12') ? '01' : calFormatNum(Number(m)+1);
						id += calFormatNum(n);
						if (date_max!='' && id>date_max) {
							cal[i] = 'blk|' + id + '|' + calFormatNum(n);
						} else {
							cal[i] = 'out|' + id + '|' + calFormatNum(n);
						};
						n++;
						id = '';
					};
					
					c	= null;
					n	= null;
					
					// controlas update
					
					// month
					for (var i = 0; i <= 11; ++i) {
						cal_ctrl_m.eq(i).removeClass();
						if ((date_min!='' && y==y_min && i<Number(m_min)-1) || (date_max!='' && y==y_max && i>Number(m_max)-1)) {
							cal_ctrl_m.eq(i).addClass('out');
						} else if (i==(Number(m)-1)) {
							cal_ctrl_m.eq(i).addClass('sel');
						} else {
							cal_ctrl_m.eq(i).addClass('in');
						};
					};	
					cal_m.html(opt.calMonthNames[(Number(m)-1)]);
					
					// year
					y_inx = Math.floor((Number(y_sel)-Number(y_ref))/k);
					for (var i = 0; i <= (k-1); ++i) {
						var x = (Number(y_ref)+(k*y_inx)+i);
						cal_ctrl_y.eq(i).removeClass();
						cal_ctrl_y.eq(i).attr('ref',x);
						cal_ctrl_y.eq(i).html(x);
						if ((date_min!='' && x<y_min) || (date_max!='' && x> y_max)) {
							cal_ctrl_y.eq(i).addClass('out');
						} else if (x==y) {
							cal_ctrl_y.eq(i).addClass('sel');
						} else {
							cal_ctrl_y.eq(i).addClass('in');
						};

					};		
					cal_y.html(y);
					
					// calendar update
					for (var i = 0; i <= (7*6)-1; ++i) {
						cal_cell.eq(i).removeClass('in');
						cal_cell.eq(i).removeClass('out');
						cal_cell.eq(i).removeClass('blk');
						cal_cell.eq(i).removeClass('sel');
						cal_cell.eq(i).addClass((cal[i].split('|'))[0]);
						cal_cell.eq(i).attr("id",(cal[i].split('|'))[1]);
						cal_cell.eq(i).html((cal[i].split('|'))[2]);
					};
				};
				
				// calendar
				
				// head
				txt += '<div class="calendar ' + opt.calDisplay + '" id="' + ref + '-calendar">';
				if (opt.calDisplay == "icon") { 
					txt += '<a class="calendar-icon" title="' + obj.attr("title") + '"></a>';
					txt += '<div class="calendar-div">';
				};
				txt += '<ul class="calendar-nav">';
				if (opt.calDisplay == "icon") { 
					txt += '<li class="calendar-btn now"><span>&bull;</span></li>';
					txt += '<li class="calendar-btn prev"><span>&lsaquo;</span></li>';
				};
				txt += '<li class="calendar-ctrl mm"><span></span>';
				txt += '<ul>';
				for (var i = 1; i <= 12; ++i) {
					txt += '<li ref="' + calFormatNum(i) + '">';
					txt +=	opt.calMonthNames[i-1], 
					txt += '</li>';
				};
				txt += '</ul>';
				txt += '</li>';
				txt += '<li class="calendar-ctrl yy"><span></span>';
				txt += '<ul>';
				txt += '<li class="cmd dw">&lsaquo;</li>';
				
				for (var i = 0; i <= 18; ++i) {
					txt += '<li ref="' + (Number(new Date().getFullYear())+i) + '">';
					txt +=	Number(new Date().getFullYear())+i, 
					txt += '</li>';
				};
				txt += '<li class="cmd up">&rsaquo;</li>';
				txt += '</ul>';
				txt += '</li>';
				if (opt.calDisplay == "inline") { 
					txt += '<li class="calendar-btn now"><span>&bull;</span></li>';
					txt += '<li class="calendar-btn prev"><span>&lsaquo;</span></li>';
				};
				txt += '<li class="calendar-btn next"><span>&rsaquo;</span></li>';
				if (opt.calDisplay == "icon") {
					txt += '<li class="calendar-btn close"><span>&times;</span></li>';
				};
				txt += '</ul>';
				txt += '<div class="calendar-box">';
				txt += '<ul class="calendar-head">';
				for (var i = 1; i <= 7; ++i) {
					txt += '<li>';
					txt +=	opt.calDayNames[i-1],
					txt += '</li>';
				};
				txt += '</ul>';
				
				// days
				for (var i = 1; i <= 6; ++i) {
					txt += '<ul class="calendar-row">';
					txt += '<li class="we"></li>';
					txt += '<li class="wd"></li>';
					txt += '<li class="wd"></li>';
					txt += '<li class="wd"></li>';
					txt += '<li class="wd"></li>';
					txt += '<li class="wd"></li>';
					txt += '<li class="we"></li>';
					txt += '</ul>';
				};
				txt += '</div>';
				txt += '</div>';
				if (opt.calDisplay == "icon") { 
					txt += '</div>';
				};
				
				// remove previus object
				$("#" + ref + "-calendar").remove();
				
				if (opt.calDisplay == "icon") { 
					obj.after(txt);
				} else if (opt.calDisplay == "inline") { 
					if (opt.calTarget != "") {
						obj.find(opt.calTarget).after(txt);
					} else  {
						obj.append(txt);
					};
				};
				
				var cal_cell 		= $("#" + ref + "-calendar .calendar-row li");
				var cal_m 			= $("#" + ref + "-calendar li.calendar-ctrl.mm span");
				var cal_y 			= $("#" + ref + "-calendar li.calendar-ctrl.yy span");
				var cal_ctrl_m 	= $("#" + ref + "-calendar li.calendar-ctrl.mm li[ref]");
				var cal_ctrl_y 	= $("#" + ref + "-calendar li.calendar-ctrl.yy li[ref]");
				
				if (opt.calDisplay == "inline") { 
					if (opt.calDateDefault=='today')  {
							now	= new Date();
							d_sel	= calFormatNum(now.getDate());
							m_sel	= calFormatNum(now.getMonth()+1);
							y_sel	= now.getFullYear(); 
							y_ref	= y_sel;
						} else {
							if (opt.calDateFormat=='dd/mm/yyyy') {
								now 	= opt.calDateDefault.split('/');
								d_sel	= now[0];
								m_sel	= now[1];
								y_sel	= now[2]; 
								y_ref	= y_sel;
							} else if (opt.calDateFormat=='yyyy-mm-dd') {
								now 	= opt.calDateDefault.split('-');
								d_sel	= now[2];
								m_sel	= now[1];
								y_sel	= now[0]; 
								y_ref	= y_sel;
							};
						}; 
						calPopulate(y_sel, m_sel, d_sel);
				};
				
				$("#" + ref + "-calendar .calendar-icon").click(function(){
					val = $("#" + obj.attr("id")).val();
					if ($("#" + ref + "-calendar .calendar-div").css("display")=="none") {
						if (val!='') {
								now 	= val.split('/');
								d_sel	= now[0];
								m_sel	= now[1];
							if (opt.calDateFormat=='dd/mm/yyyy') {
								y_sel	= now[2]; 
								y_ref	= y_sel;
							} else if (opt.calDateFormat=='yyyy-mm-dd') {
								now 	= val.split('-');
								d_sel	= now[2];
								m_sel	= now[1];
								y_sel	= now[0]; 
								y_ref	= y_sel;
							};
						} else {
							if (opt.calDateDefault=='today')  {
								now	= new Date();
								d_sel	= calFormatNum(now.getDate());
								m_sel	= calFormatNum(now.getMonth()+1);
								y_sel	= now.getFullYear(); 
								y_ref	= y_sel;
							} else {
								if (opt.calDateFormat=='dd/mm/yyyy') {
									now 	= opt.calDateDefault.split('/');
									d_sel	= now[0];
									m_sel	= now[1];
									y_sel	= now[2]; 
									y_ref	= y_sel;
								} else if (opt.calDateFormat=='yyyy-mm-dd') {
									now 	= opt.calDateDefault.split('-');
									d_sel	= now[2];
									m_sel	= now[1];
									y_sel	= now[0]; 
									y_ref	= y_sel;
								}; 
							}; 
						};
						calPopulate(y_sel, m_sel, d_sel);
						$("#" + ref + "-calendar-div").css('z-index', 9999);
						$("#" + ref + "-calendar .calendar-div").show();
					} else {
						$("#" + ref + "-calendar .calendar-div").hide();
						$("#" + ref + "-calendar-div").css('z-index', 0);
					};
				});
				
				$("#" + obj.attr("id")).die();
				$("#" + obj.attr("id")).live('focus', function(){$("#" + ref + "-calendar .calendar-icon").click()});
				
				$("#" + ref + "-calendar .calendar-ctrl").hover(
				 function () {
					$(this).find("ul").show();
				  }, 
				  function () {
					$(this).find("ul").hide();
				  }
				);
				
				$("#" + ref + "-calendar .calendar-ctrl.mm li[ref]").click(function(){
					m_sel	= $(this).attr("ref");
					$("#" + ref + "-calendar .calendar-ctrl.mm ul").hide();		
					calPopulate(y_sel, m_sel, d_sel);
				});
				
				$("#" + ref + "-calendar .calendar-ctrl.yy li[ref]").click(function(){
					y_sel	= $(this).attr("ref");
					$("#" + ref + "-calendar .calendar-ctrl.yy ul").hide();		
					calPopulate(y_sel, m_sel, d_sel);
				});
				
				$("#" + ref + "-calendar .calendar-ctrl.yy li.cmd.dw").click(function(){
					y_sel 	= Number(y_sel) - k;
					y_ref 	= Number(y_ref) - k;
					calPopulate(y_sel, m_sel, d_sel);
				});
				
				$("#" + ref + "-calendar .calendar-ctrl.yy li.cmd.up").click(function(){
					y_sel 	= Number(y_sel) + k;
					y_ref 	= Number(y_ref) + k;
					calPopulate(y_sel, m_sel, d_sel);
				});

				$("#" + ref + "-calendar .calendar-btn.now").click(function(){
					now		= new Date();
					d_sel	= calFormatNum(now.getDate());
					m_sel	= calFormatNum(now.getMonth()+1);
					y_sel	= now.getFullYear(); 
					y_ref	= y_sel;
					calPopulate(y_sel, m_sel, d_sel);
				});
				
				$("#" + ref + "-calendar .calendar-btn.prev").click(function(){
					y_sel 	= (m_sel=='01') ? Number(y_sel)-1 : Number(y_sel);
					m_sel 	= (m_sel=='01') ? '12' : calFormatNum(Number(m_sel)-1); 
					calPopulate(y_sel, m_sel, d_sel);
				});
				
				$("#" + ref + "-calendar .calendar-btn.next").click(function(){
					y_sel 	= (m_sel=='12') ? Number(y_sel)+1 : y_sel;
					m_sel 	= (m_sel=='12') ? '01' : calFormatNum(Number(m_sel)+1); 
					calPopulate(y_sel, m_sel, d_sel);
				});
				
				$("#" + ref + "-calendar .calendar-btn.close").click(function(){
					$("#" + ref + "-calendar .calendar-div").hide();
				});
								
				$("#" + ref + "-calendar .calendar-row li").click(function(){
					if ($(this).hasClass('blk')==0) {
						y_sel 	= $(this).attr("id").substring(0,4);
						m_sel 	= $(this).attr("id").substring(4,6);
						d_sel 	= $(this).attr("id").substring(6,8);
						out 		= $(this).attr("id");
						calPopulate(y_sel, m_sel, d_sel);
						$("#" + ref + "-calendar .calendar-div").hide();
						if (opt.calDisplay == "icon") {
							if (opt.calDateFormat=='dd/mm/yyyy') {
								$("#" + obj.attr("id")).val(d_sel +"/"+ m_sel +"/"+ y_sel);
							} else if (opt.calDateFormat=='yyyy-mm-dd') {
								$("#" + obj.attr("id")).val(y_sel +"-"+ m_sel +"-"+ d_sel);
							}; 
						};
						if (opt.calAltField!="") {
							if (opt.calDateFormat=='dd/mm/yyyy') {
								$(opt.calAltField).val(d_sel +"/"+ m_sel +"/"+ y_sel);
							} else if (opt.calDateFormat=='yyyy-mm-dd') {
								$(opt.calAltField).val(y_sel +"-"+ m_sel +"-"+ d_sel);
							}; 
						};
						if (opt.calCallback!="") {
							opt.calCallback.call(output=out);
						};
					};
				}); 
				
				if (opt.calDisplay == "icon") {
					//wrp.mouseleave(function(){$("#" + ref + "-calendar .calendar-icon").click()});
					$("#" + ref + "-calendar .calendar-div").css("top",opt.calPosTop);
					$("#" + ref + "-calendar .calendar-div").css("left",opt.calPosLeft);
				};
				
			});  
		}  
	});  
})(jQuery);
