/**
* @author Nivaria Innova Team
*/
function CalendarEvents() {
	this.id = null;
	this.simplefields = new Array();	//Simple fields
	this.year = null;					//Current start year
this.month = null;					//Current start month
this.ctid = null;					//Current calendar type
this.evid = "";						//Current event
this.daysorder = new Array();		//Days order in the calendar
this.queryPage = "";				//Url of events query page for calendar
}

CalendarEvents.prototype = {
	initialize: function(objectId) {
		this.id = objectId;
		//Getting component simple fields values
		ncm.initSimpleFields(CalendarEvents,this);
		this.queryPage = this.simplefields["URL_QUERY"]?this.simplefields["URL_QUERY"]:"";
		//Initialize the component
		var dateobj = new Date(Date());
 if(this.simplefields["YEARTYPE"]==1)
	    this.year = dateobj.getFullYear();                                                                                    
 else
	    this.year = this.simplefields["STARTYEAR"];      
 switch(this.simplefields["MONTHTYPE"]) {
	    case 1:
	      this.month = dateobj.getMonth();
         break;
     case 2:
         this.month = dateobj.getMonth();
         if(this.month>0)
  	       this.month--;                        
         else {
  	       this.month = 11;
             this.year--;
         }
         break;
     case 3:
	      this.month = this.simplefields["STARTMONTH"];            
         break;                              
   }
		  this.ctid = this.simplefields["DEFAULTTYPE"];
		  this.evid = this.simplefields["DEFAULTEVENT"];
		  //Parse the location string of browser 
		  var initParams = ncm.getParametersFromUrl();
		  var dateparts = null;
		  var hasInitParams = false;
		  if(initParams["DATE_FROM"]!=null) {
		 		 dateparts = initParams["DATE_FROM"].split("/");
				if(dateparts!=null && dateparts.length>2) {
					try {
						this.month = parseInt(dateparts[1])-1;
						this.year = parseInt(dateparts[2]);
						hasInitParams = true;
					} catch(mErr) {}	
				}	
		  }
		  if(initParams["CTID"]!=null && initParams["CTID"]!="") {
		 		 this.ctid = parseInt(initParams["CTID"]);
		  }
		  if(initParams["EVID"]!=null) {
		 		 this.evid = initParams["EVID"];
		  }
		  //Bind the event to syncronize with query
		  if(!hasInitParams) {
			  var Me = this;
		 	   var selector = new String("#calendar_layout_");
		 	   selector += this.id;
		 	   $jq(selector).bind(ncm.event_calendarQueryLoaded,function(e,params){
					Me.showCurrentMonthDetails();
		 	   });
		 	   ncm.addEventListener(ncm.event_calendarQueryLoaded,selector);
		  }
   //Draw the calendar
		  this.initDaysOrder();
		  this.drawMonths();
		  this.drawDays();
		  //Set selected day if necessary
		  if(initParams["DATE_FROM"] != null && initParams["DATE_TO"] != null) {
		 		 if(initParams["DATE_FROM"]==initParams["DATE_TO"]) {
					if(dateparts!=null && dateparts.length>2) {
						this.setSelectedDay(parseInt(dateparts[2]),parseInt(dateparts[1]),parseInt(dateparts[0]));
					}
				}
		  }
		  this.drawEvents();
		  this.drawFilter();
		  this.drawLegend();
	},
	
	initDaysOrder: function() {
		var day = this.simplefields["FIRSTDAY"];
		for(var i=0;i<7;i++) {
			if(day>7) day = 1;
			this.daysorder[day-1] = i;
			day++;
		}
	},
	
	drawMonths: function() {
		var selector = new String("#calendar_layout_");
		selector += this.id;
		selector += " table tr td table.";
		selector += CalendarEvents.getProperty("calendar_class");
		selector += " thead.";
		selector += CalendarEvents.getProperty("calendar_head_class");
		selector += " tr.";
		selector += CalendarEvents.getProperty("calendar_month_class");
		selector += " td[colspan='5']";
		var startmonth = this.month;
		var startyear = this.year;
		$jq(selector).each(function(i){
			if(i>0) {
				if(startmonth<11) {
					startmonth++;
				} else {
					startmonth = 0;
					startyear++;
				}
			}
			var monthName = CalendarEvents.months[startmonth];
			monthName += ", ";
			monthName += startyear;
			this.innerHTML = monthName;
		});
	},
	
	drawDays: function() {
		var Me = this;
		var numDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		var selector = new String("#calendar_layout_");
		selector += this.id;
		selector += " table tr td table.";
		selector += CalendarEvents.getProperty("calendar_class");
		selector += " tbody.";
		selector += CalendarEvents.getProperty("calendar_body_class");
		var selector1 = new String("tr.");
		selector1 += CalendarEvents.getProperty("calendar_daysrow_class");
		var selector2 = "td";
		var startmonth = this.month;
		var startyear = this.year;
		var now = new Date();
		$jq(selector).each(function(i){
			if(i>0) {
				if(startmonth<11) {
					startmonth++;
				} else {
					startmonth = 0;
					startyear++;
				}
			}
			if(startmonth==1) {
				if(Me.checkLeapYear(startyear))
					numDays[startmonth]=29;
				else
					numDays[startmonth]=28;		
			}
			var currentday = 1;
			var lastday = numDays[startmonth];
			var firstDate = new Date(startyear,startmonth,currentday);
			var startindex = Me.daysorder[firstDate.getDay()];
			$jq(selector1,this).each(function(j){
				if(j==5) {
					if(currentday<=lastday)
						this.style.display = "";
					else
						this.style.display = "none";	
				}
				$jq(selector2,this).each(function(k){
					if(k<startindex && j==0) {
					} else {
						if(currentday<=lastday) {
							this.setAttribute("id","calday"+Me.id+"_"+currentday+"_"+(startmonth+1)+"_"+startyear);
							var html = "<div class=\"";
							html += CalendarEvents.getProperty("calendar_day_event_class");
							html += "\" id=\"caldayev"+Me.id+"_";
							html += currentday;
							html += "_";
							html += (startmonth+1);
							html += "_";
							html += startyear;
							html +="\"></div>";
							html += currentday;
							this.innerHTML = html;
							if(currentday==now.getDate() && startmonth==now.getMonth() && startyear==now.getFullYear()) {
								this.className = CalendarEvents.getProperty("calendar_day_class_today");
							} 
							currentday++;
						} 
					}
				});
			});
		});
	},
	
	drawEvents: function() {
		var Me = this;
		var jspfile = CalendarEvents.getProperty("jsp");
		if(jspfile=="") jspfile= "components/calendar/events/CalendarEvents.jsp";
		var params = new String("step=0");
		params += this.getRequestParams();
		$jq.ajax({
		  async: true,
		   type: "POST",
		   url: jspfile,
		   data: params,
		   dataType: "json",
		   error: function(request,msg,ex) {
			   ncm.showError(msg,ex,request);
		   },
		   success: function(json) {
				if(json!=null) {
					if(json.keys) {
						for (var i=0; i<json.keys.length; i++) {
							var key = json.keys[i];
							$jq("#calday"+Me.id+"_" + key).attr("class", function(arr){
								if (this.className == CalendarEvents.getProperty("calendar_day_class_today")) 
									return CalendarEvents.getProperty("calendar_day_class_today_event");
								else if(this.className == CalendarEvents.getProperty("calendar_day_class_selected"))
									return CalendarEvents.getProperty("calendar_day_class_selected");
								else
									return CalendarEvents.getProperty("calendar_day_class_event");
							}).attr("title", function(arr){
								var m_title = "";
								if (json[key].length > 0) {
									for (var j = 0; j < json[key].length; j++) {
										m_title += (j > 0 ? ", " : "") + json[key][j].name;
									}
								}
								return m_title;
							}).attr("onclick", function(arr){
								if (json[key].length > 0) {
									var a = key.split("_");
									return "CalendarEvents.get(" + Me.id + ").showDayDetails(" + a[2] + "," + a[1] + "," + a[0] + ");";
								}
								else {
									return "";
								}
							}).attr("onkeypress", function(arr){
								if (json[key].length > 0) {
									var a = key.split("_");
									return "CalendarEvents.get(" + Me.id + ").showDayDetails(" + a[2] + "," + a[1] + "," + a[0] + ");";
								}
								else {
									return "";
								}
							});
							if (!Me.simplefields["HIDEEVENTS"]) {
								var m_html = "";
								for (var j = 0; j < json[key].length; j++) {
									m_html += json[key][j].logo;
									m_html += json[key][j].num;
									m_html += "<br/>";
								}
								$jq("#caldayev"+Me.id+"_" + key).html(m_html);
							}
						}	
					}
				}
		   }
		 });
	},
	
	drawFilter: function() {
		if(this.simplefields["FILTER_MONTH"]) {
			var selector = "#";
			selector += CalendarEvents.getProperty("filter_month_name");
			selector += this.id;
			selector += " option";
			$jq(selector).each(function(i){
				this.innerHTML = CalendarEvents.months[i];
			});	
		}
		if(this.simplefields["FILTER_EVENT"]) {
			this.getEventsForFilter();	
		}
		this.updateFilter();
	},
	
	getEventsForFilter: function() {
		var Me = this;
		var jspfile = CalendarEvents.getProperty("jsp");
		if(jspfile=="") jspfile= "components/calendar/events/CalendarEvents.jsp";
		var params = "step=2";
		params += this.getRequestParams();
		$jq.ajax({
		  async: false,
		   type: "POST",
		   url: jspfile,
		   data: params,
		   dataType: "json",
		   error: function(request,msg,ex) {
			   ncm.showError(msg,ex,request);
		   },
		   success: function(json) {
				var m_html = "";
				var m_all = "";
				if(json!=null) {
					if(json.length>0) {
						for (var i=0; i<json.length; i++) {
							m_all += json[i].ID+":";
							m_html += "<option value=\""+json[i].ID+"\">"+json[i].name+"</option>\n";	
						}	
					}
				}
				m_html = "<option value=\""+m_all+"\" selected=\"selected\">"+CalendarEvents.getProperty("P_ALL_EVENTS")+"</option>\n"+m_html;
				$jq("#"+CalendarEvents.getProperty("filter_event_name")+Me.id).html(m_html);
		   }
		 });
	},
	
	drawLegend: function() {
		if(!this.simplefields["SHOW_LEGEND"] || this.simplefields["HIDEEVENTS"]) return;
		var Me = this;
		var jspfile = CalendarEvents.getProperty("jsp");
		if(jspfile=="") jspfile= "components/calendar/events/CalendarEvents.jsp";
		var params = "step=1";
		params += this.getRequestParams();
		$jq.ajax({
		  async: true,
		   type: "POST",
		   url: jspfile,
		   data: params,
		   dataType: "json",
		   error: function(request,msg,ex) {
			   ncm.showError(msg,ex,request);
		   },
		   success: function(json) {
				var m_html = "";
				if(json!=null) {
					if(json.length>0) {
						for (var i=0; i<json.length; i++) {
							m_html += json[i].logo + " - " + json[i].name + "<br/>\n";	
						}	
					}
				}
				$jq("#"+CalendarEvents.getProperty("legend_id")+Me.id).html(m_html);
		   }
		 });
	 },
	
	updateFilter: function() {
		//Setting filters values
		if(this.simplefields["FILTER_YEAR"])
			$jq("#"+CalendarEvents.getProperty("filter_year_name")+this.id).val(""+this.year);
		if(this.simplefields["FILTER_MONTH"])	
			$jq("#"+CalendarEvents.getProperty("filter_month_name")+this.id+" option[value='"+this.month+"']").attr("selected","selected");
		if(this.simplefields["FILTER_TYPE"])	
			$jq("#"+CalendarEvents.getProperty("filter_calendar_type_name")+this.id+" option[value='"+this.ctid+"']").attr("selected","selected");
		if(this.simplefields["FILTER_EVENT"]) {
			if(this.evid=="")
				$jq("#"+CalendarEvents.getProperty("filter_event_name")+this.id+" option:first").attr("selected","selected");
		}	else
				$jq("#"+CalendarEvents.getProperty("filter_event_name")+this.id+" option[value='"+this.evid+"']").attr("selected","selected");
	},
	
	getRequestParams: function() {
		var params = new String("&objId=");
		params += this.id;
		params += "&issueId="
		params += CalendarEvents.issueId;
		params += "&inPreview="
		params += CalendarEvents.inPreview;
		params += "&ctId="
		params += this.ctid;
		params += "&evIds="
		params += this.evid;
		params += "&month="
		params += this.month;
		params += "&year="
		params += this.year;
		params += "&nummonths="
		params += this.simplefields["NUMMONTHS"];
		params += "&icon="
		params += this.simplefields["SHOW_ICON"];
		params += "&showdetailedev="
		params += this.simplefields["SHOW_DETAILEDEVENTS"];
		params += "&showevnum="
		params += this.simplefields["SHOW_EVENTSNUM"];
		params += "&showother="
		params += this.simplefields["SHOW_OTHERTOTAL"];
		params += "&txtOther="
		params += CalendarEvents.getProperty("P_OTHER");
		params += "&isDef="
		params += (this.ctid==this.simplefields["DEFAULTTYPE"]);
		params += "&pageUrl=";
		params += CalendarEvents.pageUrl;
		return params;
	},
	
	checkLeapYear: function (yyyy) {
		if(yyyy%4==0 && (yyyy%100!=0 || yyyy%400==0)) 
			 return true;
		else
			return false;
	},
	
	cleanCells: function() {
		var selector = new String("#calendar_layout_");
		selector += this.id;
		selector += " table.";
		selector += CalendarEvents.getProperty("calendar_class");
		selector += " tbody tr td";
		$jq(selector).removeAttr("id").html("").attr("class",CalendarEvents.getProperty("calendar_day_class"));
	},
	
	changeMonth: function(val) {
	  if(this.month+val>11) {
	    this.month += val-12;
     this.year++;
 } else {
	    if(this.month+val<0) {
	      this.month += val+12;
         this.year--;
     } else {
	      this.month += val;
     }
 }
 if((this.month>=0 && this.month<12)  && this.year!=0) {
			this.cleanCells();
			this.drawMonths();
			this.drawDays();
			this.drawEvents();
			this.updateFilter();
		}
	},
	
	changeYear: function(val) {
		this.year += val;
		if((this.month>=0 && this.month<12)  && this.year!=0) {
			this.cleanCells();
			this.drawMonths();
			this.drawDays();
			this.drawEvents();
			this.updateFilter();
		}
	},
	
	setMonth: function(mm) {
	  var shift = mm-this.month;
 this.changeMonth(shift);
	},
	
	setCalendarType: function(calId) {
		this.ctid = calId;
		this.evid = "";
		if((this.month>=0 && this.month<12)  && this.year!=0) {
			this.cleanCells();
			this.drawDays();
			this.drawEvents();
			if(this.simplefields["FILTER_EVENT"]) {
				this.getEventsForFilter();	
			}
			this.updateFilter();
			this.drawLegend();			
		}
	},
	
	setCalendarEvent: function(evIds) {
		this.evid = evIds;
		if((this.month>=0 && this.month<12)  && this.year!=0) {
			this.cleanCells();
			this.drawDays();
			this.drawEvents();
			this.updateFilter();
			this.drawLegend();			
		}
	},
	
	showDayDetails: function(yyyy,mm,dd) {
		this.setSelectedDay(yyyy,mm,dd);
		var params = "DATE_FROM="+dd+"/"+mm+"/"+yyyy+"&DATE_TO="+dd+"/"+mm+"/"+yyyy+"&DATE_TYPE=0&DATE_LINK=0&CTID="+this.ctid+"&CTID_TYPE=0&CTID_LINK=0&EVID="+this.evid+"&EVID_TYPE=0&EVID_LINK=0";
		if(this.queryPage!="") {
			window.location.href = this.queryPage+"?"+params; 
		} else {
			ncm.triggerEvent(ncm.event_calendarClick,[params]);	
		}
	},
	
	showCurrentMonthDetails: function() {
		this.setSelectedDay(0,0,0);
		var numDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		if(this.month==1) {
			if(this.checkLeapYear(this.year))
				numDays[this.month]=29;
			else
				numDays[this.month]=28;		
		}
		var params = "DATE_FROM=01/"+((this.month+1)<10?"0":"")+(this.month+1)+"/"+this.year+"&DATE_TO="+numDays[this.month]+"/"+((this.month+1)<10?"0":"")+(this.month+1)+"/"+this.year+"&DATE_TYPE=0&DATE_LINK=0&CTID="+this.ctid+"&CTID_TYPE=0&CTID_LINK=0&EVID="+this.evid+"&EVID_TYPE=0&EVID_LINK=0";
		if (this.queryPage != "") {
			window.location.href = this.queryPage + "?" + params;
		} else {
			ncm.triggerEvent(ncm.event_calendarClick, [params]);
		}			
	},
	
	setSelectedDay: function(yyyy,mm,dd) {
		var Me = this;
		var selector = new String("#calendar_layout_");
		selector += this.id;
		selector += " table tr td table.";
		selector += CalendarEvents.getProperty("calendar_class");
		selector += " tbody.";
		selector += CalendarEvents.getProperty("calendar_body_class");
		selector += " tr.";
		selector += CalendarEvents.getProperty("calendar_daysrow_class");
		selector += " td.";
		selector += CalendarEvents.getProperty("calendar_day_class_selected");
		$jq(selector).attr("class",function(arr){
			var now = new Date();
			if(this.getAttribute("id")=="calday"+Me.id+"_"+now.getDate()+"_"+(now.getMonth()+1)+"_"+now.getFullYear()) {
				return CalendarEvents.getProperty("calendar_day_class_today_event");
			} else {
				return CalendarEvents.getProperty("calendar_day_class_event");
			}
		});
		selector = "#calendar_layout_";
		selector += this.id;
		selector += " #calday";
		selector += this.id;
		selector += "_";
		selector += dd;
		selector += "_";
		selector += mm;
		selector += "_";
		selector += yyyy;
		$jq(selector).attr("class",CalendarEvents.getProperty("calendar_day_class_selected"));
	}
};

CalendarEvents.instances = new Array();
CalendarEvents.properties = new Array();
CalendarEvents.months = new Array();
CalendarEvents.datatype = null;
CalendarEvents.jsp_utils = null;
CalendarEvents.language = null;
CalendarEvents.pageUrl = null;
CalendarEvents.channel = null;
CalendarEvents.inPreview = false;
CalendarEvents.issueId = null;

CalendarEvents.register = function(objectId) {
	var calObject = new CalendarEvents();
	calObject.initialize(objectId);
	CalendarEvents.instances[""+objectId] = calObject;
}

CalendarEvents.getRegistered = function(objectId) {
	return CalendarEvents.instances[""+objectId];
}

CalendarEvents.get = function(objectId) {
	return CalendarEvents.getRegistered(objectId);
}

CalendarEvents.initProperties = function(options) {
	ncm.initProperties(CalendarEvents,options);
	CalendarEvents.months = CalendarEvents.getProperty("LANG_MONTHS").split(",");
}

CalendarEvents.getProperty = function(propName) {
	var res = CalendarEvents.properties[propName];
	if(res==null) res="";
	if(typeof(res)=="undefined") res="";
	return res;
}