// $Id: calendar.js,v 1.9 2009/06/19 09:13:26 vojnovicn Exp $
// requires: yui.dom, common.js, dates.js


Calendar = {
	loc: {
		days: ['M','T','W','T','F','S','S'],
		months: ['January','February','March','April','May','June','July','August','September','October','November','December']
	},
	
	rules: {
		'futureOnly': function(date) {return (date.days > Calendar.today.days)},
		'noPast': function(date) {return (date.days >= Calendar.today.days)},
		'saturdayOnly': function(date) {return (Dates.dowDate(date)==6)}
	},
	
	options: {
		format: 'dd/mm/yyyy',
		range: null,
		rules: ['futureOnly'],
		onclick: null,
		onstart: null
	},
	
	control: null,
	container: null,
	privateIE: null,
	calendarId: null,
	date: null,
	today: null,
	
	open: function(id) {
		this.control = this.getControl(id);
		this.container = YAHOO.util.Dom.getElementsByAttribute({contains: id}, '*', document.getElementById(id))[0];
		this.calendarId = id;
		// ako je IE i ako je privatni smještaj kalendar prikazuj u overlayu
		if(typeof(ANET)!='undefined' && typeof(ANET.utils)!='undefined' && ANET.utils.isIE() && typeof(ANET.Acmd)!='undefined' && ANET.get.runtimeProperty('interface')=='private')
			this.createOverlay(id);
		
		this.today = Dates.currentDate();
		this.date = this.getDateFromControl(this.control);

		if (this.options.onstart!=null)
			this.options.onstart();

		this.draw();
	},
	
	createOverlay: function() {
		if(typeof(YAHOO.anetCalendar) == 'undefined')
			YAHOO.namespace('anetCalendar');
		
		if(typeof(YAHOO.anetCalendar.overlay) == 'undefined') {
			YAHOO.anetCalendar[this.calendarId] = new YAHOO.widget.Overlay('calendarContainer', {
				visible: false,
				context:[this.container,'tl','bl', ['beforeShow', 'windowResize']]
				});
			
			// overlay treba kreirati u formi
			var formObj = this.container.parentNode;
			while (formObj.nodeName.toLowerCase()!='form')
				formObj = formObj.parentNode;
			
			YAHOO.anetCalendar[this.calendarId].setBody(' ');
			YAHOO.anetCalendar[this.calendarId].render(formObj);
		}
		this.privateIE = true;
	},
	
	draw: function() {
		var monthL = Dates.getMonthLength(this.date.month,this.date.year);
   		var range = this.getYearsRange();
   		var date;
   		var content = '';
   
   		content += '<div class="calendar">\n<table>\n';
		
		// header
		content += '<tr valign="middle" class="h">\n<td colspan="6">';
		content += '<a href="#" onclick="Calendar.changeMonth('+(Calendar.date.month-1)+', '+Calendar.date.year+'); return false">&laquo;</a>';
		content += '<select onchange="Calendar.changeMonth(this.value, '+Calendar.date.year+');">';
		for (i=1; i<=this.loc.months.length; i++) {
			content += '<option value="'+i+'"';
			if (i==this.date.month)
				content += ' selected="selected"';
			content += '>'+this.loc.months[i-1]+'</option>';
		}
		content += '</select>';
		content += '<select onchange="Calendar.changeMonth('+Calendar.date.month+', this.value);">';
		
		for (i=range.start; i<=range.end; i++) {
			content += '<option value="'+i+'"';
			if (i==this.date.year)
				content += ' selected="selected"';
			content += '>'+i+'</option>';
		}
		content += '</select>';
		content += '<a href="#" onclick="Calendar.changeMonth('+(Calendar.date.month+1)+', '+Calendar.date.year+'); return false">&raquo;</a></td>';
		content += '<td class="emp"><a href="#" onclick="Calendar.close(); return false;">&times;</a></td></tr>';
	
		content+='<tr class="days">\n';
		for (i=0; i<this.loc.days.length; i++)
			content+=('<td>'+this.loc.days[i]+'</td>');
		content+='</tr>\n';
   
   
		// body
		for (i=1; i!=Dates.dowYMD(this.date.year, this.date.month, 1); i++)
			content+='<td>&nbsp;</td>\n';

		for (i=1; i<=monthL; i++) {
			if (this.isValidDate(new Dates.date(this.date.year, this.date.month, i))) {
				if (this.date.days==Dates.YMDdate2int(this.date.year, this.date.month, i))
					content+='<td class="free selected">';
				else
					content+='<td class="free">';
				
				content+='<a href="#" onclick="Calendar.selectDate('+this.date.year+','+this.date.month+','+i+'); return false;">'+i+'</a></td>\n';
			}
   			else
				content+='<td class="taken">'+i+'</td>\n';
      
			if (Dates.dowYMD(this.date.year, this.date.month, i) == 7 && (i < monthL))
				content+='</tr>\n<tr>\n';
			else if (Dates.dowYMD(this.date.year, this.date.month, i) == 7 ) 
				content+='</tr>\n';
   		}

		if (Dates.dowYMD(this.date.year, this.date.month, monthL) != 7) {
			for (i=Dates.dowYMD(this.date.year, this.date.month, monthL); i<7; i++)
         		content+='<td>&nbsp;</td>\n';
      		content+='<tr>\n';
		}

		content+='</table>\n</div>\n';
		if(this.privateIE){
			var calCont = document.createElement('div');
			calCont.id = 'anetCalendar';
			calCont.innerHTML = content;
			YAHOO.anetCalendar[this.calendarId].setBody(calCont);
			YAHOO.anetCalendar[this.calendarId].show();
		} else {
			this.container.innerHTML = content;
		}
	},
	
	close: function() {
		if(this.privateIE)
			YAHOO.anetCalendar[this.calendarId].hide();
		else
			this.container.innerHTML = '';
	},
	
	selectDate: function(y, m, d) {
		var date = new Dates.date(y, m, d);
		this.setDateInControl(this.control, date);

		if (this.options.onclick!=null)
			this.options.onclick();

		this.close();		
	},
	
	changeMonth: function(m, y) {
		var range = this.getYearsRange();
		
		if (m<=0) {
			m = 12; y--;
		}
		else if (m>=13) {
			m = 1; y++;
		}

		this.date.month = m*1;
		if (y<range.start)
			this.date.year = range.end;
		else if (y>range.end)
			this.date.year = range.start;
		else
			this.date.year = y*1;
			
		this.draw();
	},
	
	getControl: function(id) {
		var container = document.getElementById(id);
		var fields = YAHOO.util.Dom.getElementsByAttribute({control: id}, '*', container);
		
		return fields;
	}, 
	
	getDateFromControl: function(obj) {
		var date;
		// multiple fields control
		if (obj.length == 3) {
			var da = Array();
			for (a in obj)
				da[obj[a].getAttribute('field')] = obj[a].value;
			date = new Dates.date(da['year'], da['month'], da['day']);	
		}
		// single field control
		else {
			var format = this.options.format;
			
			var day = obj[0].value.substring(format.toLowerCase().indexOf('d'), format.toLowerCase().lastIndexOf('d')+1);
			var month = obj[0].value.substring(format.toLowerCase().indexOf('m'), format.toLowerCase().lastIndexOf('m')+1);
			var year = obj[0].value.substring(format.toLowerCase().indexOf('y'), format.toLowerCase().lastIndexOf('y')+1);
		
			if (day>0 && day<32 && month>0 && month<13 && year>0 && year<10000)
				date = new Dates.date(year, month, day);
			else
				date = new Dates.date(this.today.year, this.today.month, this.today.day);
		}
		
		return date;
	},
	
	setDateInControl: function(obj, date) {
		// multiple fields control
		if (obj.length == 3) {
			var da = Array();
			for (a in obj)
				da[obj[a].getAttribute('field')] = obj[a];
			
			da['year'].value = date.year;
			da['month'].value = date.month;
			
			da['day'].options.length = 0;
			for (i=1; i<=31; i++) {
				if (this.isValidDate(new Dates.date(date.year, date.month, i), true)) {
				 	da['day'].options[da['day'].options.length] = new Option(i,i,0);	
				}
			}
			
			da['day'].value = date.day;
		}
		// single field control
		else {
			var value = this.options.format;
			var yearLength = this.options.format.toLowerCase().lastIndexOf('y') - this.options.format.toLowerCase().indexOf('y')+1;
			
			value = value.toLowerCase().replace(/d+/, ((date.day<10) ? '0'+date.day : date.day));
			value = value.toLowerCase().replace(/m+/, ((date.month<10) ? '0'+date.month : date.month));
			value = value.toLowerCase().replace(/y+/, ((yearLength==2) ? ((date.year % 100 < 10) ? '0'+(date.year % 100) : date.year % 100) : date.year));
			
			obj[0].value = value;
		}
	},
	
	isValidDate: function(date, ignoreFuture) {
		var valid = true;
		
		for (a in this.options.rules) {
			if ((ignoreFuture && this.options.rules[a]!='futureOnly') || !ignoreFuture) {
				if (this.rules[this.options.rules[a]] && !this.rules[this.options.rules[a]](date)) {
					valid = false;
				}
			}		
		}
		
		return valid;
	},
	
	getYearsRange: function() {
		var range = new Object;
		
		if (this.options.range!=null) {
			range.start = this.options.range[0];
			range.end = this.options.range[1];
		}
		else if (this.control.length == 3) {
			var da = Array();
			for (a in this.control) {
				if (this.control[a].getAttribute('field')=='year') {
					range.start = this.control[a].options[0].value;
					range.end = this.control[a].options[this.control[a].length-1].value;
				}
			}
		}
		else {
			range.start = this.today.year;
			range.end = this.today.year+2;
		}

		return range;
	},
	
	// custom events
	updateToDate: function(id, offset, id2) {
		var control = this.getControl(id);
		var date = (this.control) ? this.getDateFromControl(this.control) : this.getDateFromControl(this.getControl(id2));
		
		if (this.container.getAttribute('contains') == id)
			return;
			
		if (!offset || offset==null)
			offset = 7;
			
		var newDate = Dates.YMDdate2int(date.year, date.month, date.day) + offset;
		this.setDateInControl(control, Dates.int2date(newDate)); 
	},
	
	clearAllInstances: function(attrs) {
		for (a in attrs) {
			var containers = YAHOO.util.Dom.getElementsByAttribute({contains: attrs[a]}, 'div')
		
			for (b in containers)
				containers[b].innerHTML = '';
		}
	}
}
