function fanCalendar(){
	var _self = this;
	
	var months_dict = Array('January','February','March','April','May','June','July','August','September','October','November','December');
	var months_abbr_dict = Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	var months_days = Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var days_dict = Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
	var days_abbr_dict = Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	
	_self.selected_day = 0;
	_self.windowReloadUrl = window.location.href;
	_self.modifyUrl = true;
	
	var current_date = new Date();
	_self.current_day = current_date.getDate();
	_self.current_month = current_date.getMonth() + 1;
	_self.current_year = current_date.getFullYear();
	
	_self.event_id_param = 'fanCalendar_event_id';
	
	fanDeleteCookie('refresh_events');
	
	_self.show_upcoming = function(){
		_self.clearRequestParams();
		_self.setRequestParam('fanCalendar_show', 'upcoming');
		_self.reloadWindow();
	}
	
	_self.show_past = function(){
		_self.clearRequestParams();
		_self.setRequestParam('fanCalendar_show', 'past');
		_self.reloadWindow();
	}
	
	_self.select_day = function(selected_day){
		_self.unselect_day();
		
		if(selected_day != _self.day){
			_self.clearRequestParams(true);
			_self.setRequestParam('fanCalendar_day', selected_day);
			_self.reloadWindow();
		}
		
		var main_day_container = document.getElementById(_self.id_prefix+'day_td_'+selected_day);
		var fanCalendar_day_div_container = document.getElementById(_self.id_prefix+'day_div_container_'+selected_day);
		
		if(fanCalendar_day_div_container){
			var select_foreground = document.createElement('div');
			select_foreground.className = 'fanCalendar_day_foreground';
			fanCalendar_day_div_container.appendChild(select_foreground);
		}
		
		_self.selected_day = selected_day;
	}
	
	_self.unselect_day = function(){
		var fanCalendar_day_div_container = document.getElementById(_self.id_prefix+'day_div_container_'+_self.selected_day);
		
		jQuery(fanCalendar_day_div_container).find(".fanCalendar_day_foreground").remove();
	}
	
	_self.new_event_form = function(event_id, start_day){
		var iframe_elem = document.createElement('iframe');
		iframe_elem.width = 630;
		iframe_elem.height = 450;
		iframe_elem.setAttribute('frameborder', '0');
		iframe_elem.style.border = '0px';
		var window_title = 'New Event';
		
		var start_date = '';
		if(_self.month<10){
			start_date += '0';
		}
		start_date += _self.month + '/';
		
		start_day = parseInt(start_day, 10);
		if(!start_day>0){
			start_day = _self.selected_day;
		}
		if(start_day<10){
			start_date += '0';
		}
		start_date += start_day + '/';
		
		start_date += _self.year;
		
		var frame_src = _self.service_url+'/index.php?what=event&op=new';
		frame_src += "&session_id="+encodeURIComponent(fan_logged_user_session);
		frame_src += "&public_key="+encodeURIComponent(fan_public_key);
		if(fan_admin_mode){
			frame_src += "&admin_key="+encodeURIComponent(fan_admin_key);
		}
		
		frame_src += "&calendar_owner_id="+encodeURIComponent(_self.user_id);
		if(event_id){
			frame_src += "&event_id="+encodeURIComponent(event_id);
			window_title = 'Edit event';
		}
		else{
			frame_src += "&start_date="+encodeURIComponent(start_date);
			frame_src += "&end_date="+encodeURIComponent(start_date);
		}
		
		iframe_elem.src = frame_src;
		
		fan_show_transparent_bg();
		new fan_window(document.body, window_title, iframe_elem, {onclose:_self.refresh_events});
		return false;
	}
	
	_self.manage_attendees = function(event_id){
		var iframe_elem = document.createElement('iframe');
		iframe_elem.width = 410;
		iframe_elem.height = 450;
		iframe_elem.setAttribute('frameborder', '0');
		iframe_elem.style.border = '0px';
		var window_title = 'Manage Attendees';
		
		var frame_src = _self.service_url+'/index.php?what=event&op=manage_guests';
		frame_src += "&session_id="+escape(fan_logged_user_session);
		frame_src += "&public_key="+encodeURIComponent(fan_public_key);
		if(fan_admin_mode){
			frame_src += "&admin_key="+encodeURIComponent(fan_admin_key);
		}
		
		frame_src += "&calendar_owner_id="+escape(_self.user_id);
		frame_src += "&event_id="+escape(event_id);
		
		iframe_elem.src = frame_src;
		
		fan_show_transparent_bg();
		new fan_window(document.body, window_title, iframe_elem, {onclose:_self.refresh_events});
		return false;
	}
	
	_self.comment_form = function(event_id, comment_id){
		var iframe_elem = document.createElement('iframe');
		iframe_elem.width = 420;
		iframe_elem.height = 330;
		iframe_elem.setAttribute('frameborder', '0');
		iframe_elem.style.border = '0px';
		var window_title = 'Comment';
		
		var start_date = '';
		if(_self.month<10){
			start_date += '0';
		}
		start_date += _self.month + '/';
		if(_self.selected_day<10){
			start_date += '0';
		}
		start_date += _self.selected_day + '/';
		start_date += _self.year;
		
		var frame_src = _self.service_url+'/index.php?what=event&op=comment';
		frame_src += "&session_id="+escape(fan_logged_user_session);
		frame_src += "&event_id="+escape(event_id);
		if(comment_id){
			frame_src += "&comment_id="+escape(comment_id);
			window_title = 'Edit your comment';
		}
		
		iframe_elem.src = frame_src;
		
		fan_show_transparent_bg();
		window_obj = new fan_window(document.body, window_title, iframe_elem, {onclose:_self.refresh_events});

		return false;
	}
	
	_self.delete_event = function(event_id){
		if(confirm('Delete Event')){
			var parameters = {
				public_key:fan_public_key,
				what:'event',
				op:'delete',
				event_id:event_id
			}
			
			if(fan_admin_mode){
				parameters.admin_key = fan_admin_key;
			}
			
			fan_make_service_call(parameters, _self.delete_event_callback);
		}
	}
	
	_self.delete_event_callback = function(data){
		if(typeof(data)=='object' && typeof(data.successfull)=='boolean' && data.successfull){
			_self.refresh_events();
		}
		else{
			alert('Failed to delete event');
		}
	}
	
	_self.delete_comment = function(comment_id){
		if(confirm('Delete Comment')){
			var parameters = {
				what:'event',
				op:'delete_comment',
				comment_id:comment_id
			}
			
			fan_make_service_call(parameters, _self.delete_comment_callback);
		}
	}
	
	_self.delete_comment_callback = function(data){
		if(typeof(data)=='object' && typeof(data.successfull)=='boolean' && data.successfull){
			_self.refresh_events();
		}
		else{
			alert('Failed to delete comment');
		}
	}
	
	_self.refresh_events = function(){
		fanSetCookie('refresh_events',1);
		window.location.href = window.location.href;
	}
	
	_self.setRequestParam = function(param, value, unset){
		if(typeof(unset)!='boolean'){
			unset = false;
		}
		
		if(_self.modifyUrl){
			_self.windowReloadUrl = fan_set_url_param(param, value, _self.windowReloadUrl, unset);
		}
		else{
			if(unset){
				fanDeleteCookie(param);
			}
			else{
				fanSetCookie(param,value);
			}
		}
	}
	
	_self.setWindowReloadUrl = function(url){
		_self.windowReloadUrl = url;
	}
	
	_self.reloadWindow = function(){
		if(_self.modifyUrl){
			window.location.href = _self.windowReloadUrl;
		}
		else{
			window.location.href = window.location.href;
		}
	}
	
	_self.display_month_select = function(click_elem){
		if(typeof(click_elem.menu_container)!='object' || !click_elem.menu_container){
			var menu_container = document.createElement('div');
			var menu_container_id = 'fan_pop_menu_container-'+Math.random();
			menu_container.id = menu_container_id;
			menu_container.className = 'fan_menu_container';
			click_elem.parentNode.appendChild(menu_container);
	
			
			//months buttons
			for(var i in months_dict){
				var menu_btn = document.createElement('a');
				menu_btn.innerHTML = months_dict[i];
				menu_container.appendChild(menu_btn);
				menu_btn.title = months_dict[i];
				menu_btn.month_no = parseInt(i)+1;
				menu_btn.onclick = function(){
					_self.set_month(this.month_no);
				}
			}
			
			click_elem.menu_container = menu_container;
		}
		
		click_elem.menu_obj = new fan_menu(click_elem, click_elem.menu_container.id, false, false, true);
	}
	
	_self.set_month = function(month){
		if(_self.month!=month){
			_self.clearRequestParams(true);
			_self.setRequestParam('fanCalendar_month', month);
			_self.reloadWindow();
		}
	}
	
	_self.show_today = function(){
		var today = new Date();
		_self.setRequestParam('fanCalendar_year', today.getFullYear());
		_self.setRequestParam('fanCalendar_month', parseInt(today.getMonth())+1);
		_self.setRequestParam('fanCalendar_day', today.getDate());
		_self.reloadWindow();
	}
	
	_self.display_year_select = function(click_elem){
		if(typeof(click_elem.menu_container)!='object' || !click_elem.menu_container){
			var menu_container = document.createElement('div');
			var menu_container_id = 'fan_pop_menu_container-'+Math.random();
			menu_container.id = menu_container_id;
			menu_container.className = 'fan_menu_container';
			click_elem.parentNode.appendChild(menu_container);
	
			
			//year buttons
			for(var i = _self.year - 3; i <= _self.year + 3; i++){
				var menu_btn = document.createElement('a');
				menu_btn.innerHTML = i;
				menu_container.appendChild(menu_btn);
				menu_btn.title = i;
				menu_btn.year_no = i;
				menu_btn.onclick = function(){
					_self.set_year(this.year_no);
				}
			}
			
			click_elem.menu_container = menu_container;
		}
		
		click_elem.menu_obj = new fan_menu(click_elem, click_elem.menu_container.id, false, false, false);
	}
	
	_self.set_year = function(year){
		if(_self.year!=year){
			_self.clearRequestParams(true);
			_self.setRequestParam('fanCalendar_year', year);
			_self.reloadWindow();
		}
	}
	
	_self.show_today = function(){
		_self.clearRequestParams();
		
		_self.setRequestParam('fanCalendar_year', _self.current_year);
		_self.setRequestParam('fanCalendar_month', _self.current_month);
		_self.setRequestParam('fanCalendar_day', _self.current_day);
		
		_self.reloadWindow();
	}
	
	_self.previous_month = function(){
		_self.clearRequestParams(true);
		var month = _self.month - 1;
		
		if(month==0){
			month = 12;
			_self.setRequestParam('fanCalendar_year', _self.year - 1);
		}
		_self.setRequestParam('fanCalendar_month', month);
		
		_self.reloadWindow();
	}
	
	_self.next_month = function(){
		_self.clearRequestParams(true);
		var month = _self.month + 1;
		
		if(month==13){
			month = 1;
			_self.setRequestParam('fanCalendar_year', _self.year + 1);
		}
		_self.setRequestParam('fanCalendar_month', month);
		
		_self.reloadWindow();
	}
	
	_self.display_location_map = function(lat, lng){
		var frame_src = _self.service_url+'/index.php?what=gmaps&op=view_location';
		frame_src += '&zoom_level=12';
		frame_src += '&lat='+encodeURIComponent(lat);
		frame_src += '&lng='+encodeURIComponent(lng);

		
		var iframe_elem = document.createElement('iframe');
		iframe_elem.width = 500;
		iframe_elem.height = 500;
		iframe_elem.setAttribute('frameborder', '0');
		iframe_elem.style.border = '0px';
		var window_title = 'Event Location Map';
		
		iframe_elem.src = frame_src;
		
		fan_show_transparent_bg();
		new fan_window(document.body, window_title, iframe_elem, {onclose:fan_hide_transparent_bg});
	}
	
	_self.display_search_form = function(){
		var search_form_container = document.createElement('div');
		search_form_container.className = 'fanCalendar_search_form_container fan_container_content';
		var window_title = 'Search Events';
		
		var form_row = document.createElement('div');
		form_row.className= 'fanCalendar_form_row';
		search_form_container.appendChild(form_row);
		
		var form_label = document.createElement('div');
		form_label.className= 'fanCalendar_form_label';
		form_label.innerHTML = 'What';
		form_row.appendChild(form_label);
		
		var search_input = document.createElement('input');
		search_input.type = 'text';
		form_row.appendChild(search_input);
		
		var form_row = document.createElement('div');
		form_row.className= 'fanCalendar_form_row';
		search_form_container.appendChild(form_row);
		
		var form_label = document.createElement('div');
		form_label.className= 'fanCalendar_form_label';
		form_label.innerHTML = 'Category';
		form_row.appendChild(form_label);
		
		var category_select = document.createElement('select');
		var option_elem = document.createElement('option');
		option_elem.value = 0;
		option_elem.innerHTML = 'any';
		category_select.appendChild(option_elem);
		for(var i in _self.categories){
			var option_elem = document.createElement('option');
			option_elem.value = i;
			option_elem.innerHTML = _self.categories[i].name;
			category_select.appendChild(option_elem);
		}
		form_row.appendChild(category_select);
		
		
		var form_row = document.createElement('div');
		form_row.className= 'fanCalendar_form_row';
		search_form_container.appendChild(form_row);
		
		var form_label = document.createElement('div');
		form_label.className= 'fanCalendar_form_label';
		form_label.innerHTML = 'Location';
		form_row.appendChild(form_label);
		
		var location_input = document.createElement('input');
		location_input.type = 'text';
		form_row.appendChild(location_input);
		
		var form_row = document.createElement('div');
		form_row.style.textAlign = 'right';
		search_form_container.appendChild(form_row);
		
		var submit_btn = document.createElement('input');
		submit_btn.type = 'button';
		submit_btn.value = 'Search';
		submit_btn.className = 'fan_default_but';
		submit_btn.style.marginLeft = '10px';
		submit_btn.onclick = function(){
			if(!search_input.value && !location_input.value && jQuery(category_select).val()==0){
				alert('You must enter at least one search criterion');
				search_input.focus();
			}
			else{
				_self.search_events(search_input.value, jQuery(category_select).val(), location_input.value);
			}
		}
		form_row.appendChild(submit_btn);
		
		fan_show_transparent_bg();
		new fan_window(document.body, window_title, search_form_container, {onclose:fan_hide_transparent_bg});
		
		search_input.focus();
	}
	
	_self.search_events = function(keyword, cat_id, location_string){
		_self.clearRequestParams();
		if(keyword){
			_self.setRequestParam('fanCalendar_search', keyword);
		}
		if(location_string){
			_self.setRequestParam('fanCalendar_location', location_string);
		}
		if(cat_id!=0){
			_self.setRequestParam('fanCalendar_cat_id', cat_id);
		}
		
		_self.reloadWindow();
	}
	
	_self.event_details = function(event_id){
		_self.setRequestParam(_self.event_id_param, event_id);
		_self.reloadWindow();
	}
	
	_self.clearRequestParams = function(keep_date){
		if(typeof(keep_date)!='boolean' || !keep_date){
			_self.setRequestParam('fanCalendar_year', '', true);
			_self.setRequestParam('fanCalendar_month', '', true);
			_self.setRequestParam('fanCalendar_day', '', true);
		}
		
		_self.setRequestParam('fanCalendar_search', '', true);
		_self.setRequestParam('fanCalendar_cat_id', '', true);
		_self.setRequestParam(_self.event_id_param, '', true);
		_self.setRequestParam('fanCalendar_show', '', true);
	}
	
	_self.back2calendar = function(){
		_self.setRequestParam(_self.event_id_param, '', true);
		_self.reloadWindow();
	}
}
