/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.commons.calendar.ui.components;
import static org.apache.commons.lang.StringEscapeUtils.escapeJavaScript;
import java.text.DateFormat;
import java.util.Calendar;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.DefaultComponentRenderer;
import org.olat.core.gui.components.form.flexible.impl.Form;
import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
import org.olat.core.gui.render.RenderResult;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.render.URLBuilder;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.StringHelper;
/**
*
* Initial date: 09.04.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class FullCalendarComponentRenderer extends DefaultComponentRenderer {
@Override
public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator,
RenderResult renderResult, String[] args) {
FullCalendarComponent fcC = (FullCalendarComponent)source;
FullCalendarElement fcE = fcC.getCalendarElement();
Form rootForm = fcE.getRootForm();
String id = "o_c".concat(fcC.getDispatchID());
String formId = fcE.getFormDispatchId();
String printId = "fc_p".concat(fcC.getDispatchID());
String configId = "fc_x".concat(fcC.getDispatchID());
String aggregatedId = "fc_g".concat(fcC.getDispatchID());
Calendar cal = Calendar.getInstance(fcC.getTranslator().getLocale());
int firstDay = cal.getFirstDayOfWeek() - 1;
cal = Calendar.getInstance();
cal.setTime(fcC.getCurrentDate());
Calendar calRef = Calendar.getInstance(fcC.getTranslator().getLocale());
calRef.set(Calendar.DATE, 25);
calRef.set(Calendar.MONTH, 11);
calRef.set(Calendar.YEAR, 2013);
String formatted = DateFormat.getDateInstance(DateFormat.SHORT, fcC.getTranslator().getLocale()).format(calRef.getTime());
boolean firstMonth = (formatted.indexOf("12") < formatted.indexOf("25"));
String amFormatted = DateFormat.getTimeInstance(DateFormat.SHORT, fcC.getTranslator().getLocale()).format(calRef.getTime());
boolean ampm = amFormatted.contains("AM") || amFormatted.contains("PM");
sb.append("<script type='text/javascript'>\n")
.append("/* <![CDATA[ */ \n")
.append("jQuery(function() {\n")
.append(" jQuery('#").append(id).append("').fullCalendar( {\n")
.append(" header: {\n")
.append(" left: 'prev,print,next today',\n")
.append(" center: 'title',\n")
.append(" right: 'month,agendaWeek,agendaDay'\n")
.append(" },\n")
.append(" buttonText: {\n")
.append(" today: '").append(escapeJavaScript(translator.translate("cal.thisweek"))).append("',\n")
.append(" month: '").append(escapeJavaScript(translator.translate("cal.month"))).append("',\n")
.append(" day: '").append(escapeJavaScript(translator.translate("cal.day"))).append("',\n")
.append(" week: '").append(escapeJavaScript(translator.translate("cal.week"))).append("',\n")
.append(" print: '").append(escapeJavaScript(translator.translate("print"))).append("'\n")
.append(" },\n")
.append(" monthNames: ").append(getMonthLong(translator)).append(",\n")
.append(" monthNamesShort: ").append(getMonthShort(translator)).append(",\n")
.append(" dayNames: ").append(getDayLong(translator)).append(",\n")
.append(" dayNamesShort: ").append(getDayShort(translator)).append(",\n")
.append(" allDayText:'").append(translator.translate("cal.form.allday")).append("',\n")
.append(" axisFormat:'").append(ampm ? "h(:mm)tt" : "H.mm").append("',\n")
.append(" timeFormat:'").append(ampm ? "h(:mm)tt" : "H.mm").append("',\n")
.append(" titleFormat: {\n")
.append(" month: 'MMMM yyyy',\n")
.append(" week: ").append(firstMonth ? "\"MMM d[ yyyy]{ '—'[ MMM] d yyyy}\"" : "\"d. [ MMM] [ yyyy]{ '—' d. MMM yyyy}\"").append(",\n")
.append(" day: ").append(firstMonth ? "'dddd, MMM d, yyyy'" : "'dddd, d. MMM yyyy'").append("\n")
.append(" },\n")
.append(" columnFormat: {\n")
.append(" month: 'ddd',\n")
.append(" week: ").append(firstMonth ? "'ddd M/d'" : "'ddd d.M.'").append(",\n")
.append(" day: ").append(firstMonth ? "'dddd M/d'" : "'dddd d.M.'").append("\n")
.append(" },\n")
.append(" year:").append(cal.get(Calendar.YEAR)).append(",\n")
.append(" month:").append(cal.get(Calendar.MONTH)).append(",\n")
.append(" date:").append(cal.get(Calendar.DAY_OF_MONTH)).append(",\n")
.append(" firstDay:").append(firstDay).append(",\n")
.append(" defaultView:'").append(fcC.getViewName()).append("',\n")
.append(" weekNumbers: true,\n")
.append(" editable: true,\n")
.append(" selectable: true,\n")
.append(" selectHelper: true,\n")
.append(" eventSources:[");
int count = 0;
for(KalendarRenderWrapper calWrapper: fcC.getCalendars()) {
if(calWrapper.isVisible()) {
String calId = calWrapper.getKalendar().getCalendarID();
String color = calWrapper.getCssClass();
if(StringHelper.containsNonWhitespace(color) && color.startsWith("o_cal_")) {
color = color.substring(6, color.length());
}
if(count++ != 0) sb.append(",");
sb.append("{\n")
.append(" url:'").append(fcC.getMapperUrl()).append("/").append(calId).append(".json',\n")
.append(" color:'").append(color).append("'\n")
.append("}");
}
}
sb.append(" ],\n")
.append(" eventAfterRender: function(event, element, view) {\n")
.append(" element.each(function(index, el) {\n")
.append(" jQuery(el).attr('id', 'o_cev_' + view.name + '_' + event.id);\n")
.append(" });\n")
.append(" },\n")
.append(" viewDisplay: function(view) {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, true, false, false, 'evChangeView',view.name,'start',view.start.getTime());\n")
.append(" },\n")
.append(" eventDrop: function(calEvent, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view) {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, true, false, false, 'evMove',calEvent.id,'dayDelta',dayDelta,'minuteDelta',minuteDelta,'allDay',allDay);\n")
.append(" },\n")
.append(" select: function(startDate, endDate, allDay, jsEvent, view) {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, true, false, false, 'evAdd','new','start',startDate.getTime(),'end',endDate.getTime(),'allDay',allDay);\n")
.append(" },\n")
.append(" eventClick: function(calEvent, jsEvent, view) {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, true, false, false, 'evSelect',calEvent.id,'evDomId','o_cev_' + view.name + '_' + calEvent.id);\n")
.append(" }\n")
.append(" });\n")
//print button
.append(" jQuery('.fc-header-left').append('<span class=\"fc-header-space\"></span><span id=\"").append(printId).append("\" class=\"fc-button fc-button-print fc-state-default fc-corner-left fc-corner-right\">")
.append(" <span title=\"").append(translator.translate("print")).append("\"><i class=\"o_icon o_icon_print\"> </i></span></span>');\n")
.append(" jQuery('.fc-button-print').click(function () {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, false, false, false, 'print','print');\n")
.append(" });\n");
if(fcC.isConfigurationEnabled()) {
//config button
sb.append(" jQuery('.fc-header-left').append('<span class=\"fc-header-space\"></span><span id=\"").append(configId).append("\" class=\"fc-button fc-button-config fc-state-default fc-corner-left fc-corner-right\">")
.append(" <span title=\"").append(translator.translate("cal.configuration.tooltip")).append("\"><i class=\"o_icon o_icon_customize\"> </i></span></span>');\n")
.append(" jQuery('.fc-button-config').click(function () {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, false, false, false, 'config', 'config');\n")
.append(" });\n");
}
if(fcC.isAggregatedFeedEnabled()) {
//aggregated button
sb.append(" jQuery('.fc-header-left').append('<span class=\"fc-header-space\"></span><span id=\"").append(aggregatedId).append("\" class=\"fc-button fc-button-aggregate fc-state-default fc-corner-left fc-corner-right\">")
.append("<span title=\"").append(translator.translate("cal.icalfeed.aggregated.tooltip")).append("\"><i class=\"o_icon o_icon_rss\"> </i></span></span>');\n")
.append(" jQuery('.fc-button-aggregate').click(function () {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt, false, false, false, 'aggregate','aggregate');\n")
.append(" });\n");
}
sb.append("});\n")
.append("/* ]]> */\n")
.append("</script>");
}
private String getDayShort(Translator translator) {
StringBuilder sb = new StringBuilder();
sb.append("['")
.append(escapeJavaScript(translator.translate("day.short.so"))).append("','")
.append(escapeJavaScript(translator.translate("day.short.mo"))).append("','")
.append(escapeJavaScript(translator.translate("day.short.di"))).append("','")
.append(escapeJavaScript(translator.translate("day.short.mi"))).append("','")
.append(escapeJavaScript(translator.translate("day.short.do"))).append("','")
.append(escapeJavaScript(translator.translate("day.short.fr"))).append("','")
.append(escapeJavaScript(translator.translate("day.short.sa"))).append("']");
return sb.toString();
}
private String getDayLong(Translator translator) {
StringBuilder sb = new StringBuilder();
sb.append("['")
.append(escapeJavaScript(translator.translate("cal.sun"))).append("','")
.append(escapeJavaScript(translator.translate("cal.mon"))).append("','")
.append(escapeJavaScript(translator.translate("cal.tue"))).append("','")
.append(escapeJavaScript(translator.translate("cal.wed"))).append("','")
.append(escapeJavaScript(translator.translate("cal.thu"))).append("','")
.append(escapeJavaScript(translator.translate("cal.fri"))).append("','")
.append(escapeJavaScript(translator.translate("cal.sat"))).append("']");
return sb.toString();
}
private String getMonthLong(Translator translator) {
StringBuilder sb = new StringBuilder();
sb.append("['")
.append(escapeJavaScript(translator.translate("month.long.jan"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.feb"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.mar"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.apr"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.mai"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.jun"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.jul"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.aug"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.sep"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.oct"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.nov"))).append("','")
.append(escapeJavaScript(translator.translate("month.long.dec"))).append("']");
return sb.toString();
}
private String getMonthShort(Translator translator) {
StringBuilder sb = new StringBuilder();
sb.append("['")
.append(escapeJavaScript(translator.translate("month.short.jan"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.feb"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.mar"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.apr"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.mai"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.jun"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.jul"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.aug"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.sep"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.oct"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.nov"))).append("','")
.append(escapeJavaScript(translator.translate("month.short.dec"))).append("']");
return sb.toString();
}
}