.toggleImg");
+ if( $("#resourcesForGroup_"+group_id).css('height') == '1px' ){
+ toggleImg.html("▼");
+ }else{
+ toggleImg.html("▶");
+ }
+ },
+ /**
+ * Build the header object
+ */
+ defineHeader : function(){
+ this.header = this.containerObj.clone().attr("id","headerCalendar");
+ this.header.find(".listResources").remove();
+ this.header.find(".eventsAndGroupContainer").remove();
+ this.header.find(".eventsContainer").removeClass("y-scroll").addClass("no-scroll");
+ this.header.hide();
+ this.containerObj.append(this.header);
+ },
+ updateScrollWindow: function(){
+ var offset = this.containerObj.offset();
+ var scrollTop = $(window).scrollTop();
+ var scrollLeft = $(".y-scroll").scrollLeft();
+ var headerHeight = this.header.height();
+ // check if floating header should be displayed
+ if( scrollTop > offset.top && (scrollTop < offset.top + this.containerObj.height() - headerHeight)) {
+ this.header.show();
+ this.header.css("top", $(window).scrollTop())
+ $(".no-scroll").scrollLeft( scrollLeft );
+ }
+ else {
+ this.header.hide();
+ }
+ },
+ sub_defineJSEvents: function(){
+ // TO OVERRIDE
+ },
+ defineJSEvents: function(){
+ var calendarObject = this;
+ $(".prev").click(function () {
+ calendarObject.goToPrev();
+ calendarObject.updateScrollWindow();
+ });
+
+ $(".next").click(function () {
+ calendarObject.goToNext();
+ calendarObject.updateScrollWindow();
+ });
+
+ $(".horizontalCalendarContent").keydown(function(event) {
+ switch(event.keyCode) {
+ case 34: // PAGE_DOWN
+ calendarObject.goToPrev();
+ $(".horizontalCalendarContent").focus();
+ break;
+ case 33: //PAGE_UP
+ calendarObject.goToNext();
+ $(".horizontalCalendarContent").focus();
+ break;
+ default:
+ break;
+ };
+ });
+
+ $(".group_left").click(function(){
+ calendarObject.closeGroup( $(this).attr("data-group") );
+ });
+ $(window).scroll(function(){
+ calendarObject.updateScrollWindow();
+ });
+ $(".y-scroll").scroll(function(){
+ $(".no-scroll").scrollLeft( $(this).scrollLeft() );
+ });
+ this.sub_defineJSEvents();
+ }
+});
+
+
+/* TimeLineMonth - VERSION 1.2 */
+
+TimeLineMonth = function(container, month, year, resources, updateCallback) {
+ return this.init(container, month, year, resources, updateCallback);
+};
+TimeLineMonth.prototype = Object.create(TimeLine.prototype);
+
+$.extend(TimeLineMonth.prototype, {
+ // object variables
+ TimeLineClass: 'MONTH',
+ month: '',
+ sub_init: function(month){
+ this.month = month;
+ },
+ nbDays : function(){
+ var bisextile = ( (this.year%4==0 && this.year%100!=0) || this.year%400==0 )?(1):(0);
+ return this.days[this.month][bisextile];
+ },
+ nbSteps: function(){
+ // 1 step par jour
+ return this.nbDays()-1;
+ },
+ firstStep: function(){
+ // commence le 1er du mois
+ return 1;
+ },
+ offset: function(){
+ // décalage pour l'image de fond
+ return new Date(this.year, this.month -1, 1).getDay();
+ },
+ drawElements: function(withCallback) {
+ var largeCalendar, monthLine, calendarHeaders, eventsContainer, headerResources,
+ spanLabelCenter, listResources, indexGroup, group, indexResource,
+ resource, horizontalCalendarContent, lineOfDays, htmlDays,
+ indexDay, day2digits;
+
+ var largeCalendar = this._prepareDrawings(withCallback);
+
+ monthLine = $( document.createElement('div') ).addClass("month");
+ largeCalendar.html(monthLine);
+ monthLine.html("\
+ "+this.months[this.lang][this.month-1]+" "+this.year+"
\
+ ");
+
+ var headerResources = this._drawResourcesIn(largeCalendar);
+
+ eventsContainer = $( document.createElement('div') ).addClass("eventsContainer y-scroll container-grid-"+this.cellWidth);
+ largeCalendar.append(eventsContainer);
+
+ this._setZoomFeatures(largeCalendar, headerResources, eventsContainer);
+
+ spanLabelCenter = $( document.createElement('span') ).addClass("labelCenter").html(this.resourcesColumnHeader[this.lang]);
+ headerResources.html(spanLabelCenter);
+
+ horizontalCalendarContent = $( document.createElement('div') )
+ .addClass("horizontalCalendarContent for"+this.nbDays()+"days")
+ .attr("tabindex", "0");
+ eventsContainer.append(horizontalCalendarContent);
+
+ lineOfDays = $( document.createElement('div') ).addClass("lineOfDays");
+ horizontalCalendarContent.html(lineOfDays);
+
+ htmlDays = "";
+ for(indexDay=1;indexDay<=this.nbDays();indexDay++){
+ day2digits = (indexDay<10)?("0"+indexDay):(indexDay);
+ jsDate = new Date(this.year, this.month -1, indexDay);
+ htmlDays += ""+
+ day2digits+"
"+this.weekDays[this.lang][jsDate.getDay()]+"
";
+ }
+ lineOfDays.html(htmlDays);
+
+ this._drawGridEvents(horizontalCalendarContent);
+ this.defineHeader();
+ this.defineJSEvents();
+
+ if(withCallback == null || withCallback == true){
+ // utiliser le callback pour définir les évènements
+ this.updateCallback();
+ }else{
+ // utiliser les définitions des évènements déjà enregistrées
+ for(var i=0;i\
+ "+this.dateFormat() +"
\
+ ");
+
+ var headerResources = this._drawResourcesIn(largeCalendar);
+
+ eventsContainer = $( document.createElement('div') ).addClass("eventsContainer y-scroll container-grid-"+this.cellWidth+" forWeek");
+ largeCalendar.append(eventsContainer);
+
+ this._setZoomFeatures(largeCalendar, headerResources, eventsContainer);
+
+ spanLabelCenter = $( document.createElement('span') ).addClass("labelCenter").html(this.resourcesColumnHeader[this.lang]);
+ headerResources.html(spanLabelCenter);
+
+ horizontalCalendarContent = $( document.createElement('div') )
+ .addClass("horizontalCalendarContent")
+ .attr("tabindex", "0")
+ .width(this.cellWidth*7);
+ eventsContainer.append(horizontalCalendarContent);
+
+ lineOfDays = $( document.createElement('div') ).addClass("lineOfDays");
+ horizontalCalendarContent.html(lineOfDays);
+
+ htmlDays = "";
+ var currentDay = new Date(this.mondayOfWeek.getTime());
+ // loop on 7 days
+ for(indexDay=1;indexDay<=7;indexDay++){
+ day2digits = (currentDay.getDate()<10)?("0"+currentDay.getDate()):(currentDay.getDate());
+ htmlDays += ""+
+ day2digits+"
"+this.weekDays[this.lang][indexDay%7]+"
";
+ currentDay.setDate(currentDay.getDate() + 1);
+ }
+ lineOfDays.html(htmlDays);
+
+ this._drawGridEvents(horizontalCalendarContent);
+ this.defineHeader();
+ this.defineJSEvents();
+
+ if(withCallback == null || withCallback == true){
+ // utiliser le callback pour définir les évènements
+ this.updateCallback();
+ }else{
+ // utiliser les définitions des évènements déjà enregistrées
+ for(var i=0;i\
+ "+this.weekDays[this.lang][jsDate.getDay()]+
+ " "+this.day + " " + this.months[this.lang][this.month-1]+" "+this.year+"
\
+ ");
+
+ var headerResources = this._drawResourcesIn(largeCalendar);
+
+ eventsContainer = $( document.createElement('div') ).addClass("eventsContainer y-scroll hourContainer container-grid-"+this.cellWidth);
+ largeCalendar.append(eventsContainer);
+
+ this._setZoomFeatures(largeCalendar, headerResources, eventsContainer);
+
+ spanLabelCenter = $( document.createElement('span') ).addClass("labelCenter").html(this.resourcesColumnHeader[this.lang]);
+ headerResources.html(spanLabelCenter);
+
+ horizontalCalendarContent = $( document.createElement('div') )
+ .addClass("horizontalCalendarContent for"+ this.nbHours() +"hours")
+ .attr("tabindex", "0");
+ eventsContainer.append(horizontalCalendarContent);
+
+ lineOfHours = $( document.createElement('div') ).addClass("lineOfHours");
+ horizontalCalendarContent.html(lineOfHours);
+
+ htmlHours = "";
+ for(indexHour=this.firstStep();indexHour"+
+ hour2digits+"h";
+ }
+ lineOfHours.html(htmlHours);
+
+ this._drawGridEvents(horizontalCalendarContent);
+ this.defineHeader();
+ this.defineJSEvents();
+ if(withCallback == null || withCallback == true){
+ // utiliser le callback pour définir les évènements
+ this.updateCallback();
+ }else{
+ // utiliser les définitions des évènements déjà enregistrées
+ for(var i=0;i this.days[this.month][bisextile]){
+ this.day = 1
+ if(this.month == 12){
+ this.month = 1;
+ this.year++;
+ } else{
+ this.month++;
+ }
+ }
+ this.drawElements();
+ },
+
+ goToPrev: function(){
+ this.day--;
+ var bisextile = ( (this.year%4==0 && this.year%100!=0) || this.year%400==0 )?(1):(0);
+ if(this.day == 0){
+ if(this.month == 1){
+ this.month = 12;
+ this.year--;
+ } else{
+ this.month--;
+ }
+ this.day = this.days[this.month][bisextile];
+ }
+
+ this.drawElements();
+ }
+
+});
+
+
+
+
+
+EventCal = function(resourceId, eventId, startDay, endDay, label) {
+ this.init(resourceId, eventId, startDay, endDay, label);
+};
+
+$.extend(EventCal.prototype, {
+ // object variables
+ resourceId: '',
+ eventId: '',
+ startDay: '',
+ endDay: '',
+ label: '',
+ jObject: null,
+ moveHandler: function(eventCal, newResourceId, newStart){
+ //alert("Moved to resource id="+ newResourceId+ ", start = " + newStart );
+ return true;
+ },
+ copyHandler: function(newEventCal, oldEventCal){
+ if(console){
+ console.log("Copie de l'evt="+oldEventCal.resourceId);
+ }
+ newEventCal.eventId = oldEventCal.eventId+1;
+ newEventCal.label = oldEventCal.label + " - Copie";
+ return true;
+ },
+ clickHandler: function(event,eventCal){
+ if(console){
+ console.log("click sur la ressource id="+eventCal.resourceId);
+ }
+ },
+ resizeHandler: function(eventCal, start, length){
+ if(console){
+ console.log("Resize de l'evt \""+eventCal.label+"\"");
+ }
+ return true;
+ },
+ init: function(resourceId, eventId, startDay, endDay, label) {
+ this.resourceId = resourceId;
+ this.eventId = eventId;
+ this.startDay = startDay;
+ this.endDay = endDay;
+ this.label = label;
+ },
+ defineHTMLCompontentsAndJSEvents: function(containerObject){
+ var margin=0, width=0, newStartDay, newEndDay;
+ var $this = this;
+ containerId = containerObject.container;
+ if(containerObject.TimeLineClass == 'MONTH'){
+ margin = containerObject.cellWidth * (this.startDay - 1);
+ width = containerObject.cellWidth * (this.endDay - this.startDay) - 3;
+ }else if(containerObject.TimeLineClass == 'WEEK'){
+ newStartDay = this.startDay - containerObject.mondayOfWeek.getDate();
+ newEndDay = this.endDay - containerObject.mondayOfWeek.getDate();
+ margin = containerObject.cellWidth * (newStartDay);
+ width = containerObject.cellWidth * (newEndDay - newStartDay) - 3;
+ }else if(containerObject.TimeLineClass == 'DAY'){
+ var newStartHour = this.startDay - containerObject.firstStep();
+ var newEndHour = this.endDay - containerObject.firstStep();
+ margin = containerObject.cellWidth * (newStartHour);
+ width = containerObject.cellWidth * (newEndHour - newStartHour) - 3;
+ }
+ // evenement existe déjà ? --> supprimer
+ if( $("#"+containerId).find("#"+this.eventId) ){
+ $("#"+this.eventId).remove();
+ }
+ $("#"+containerId).find("#events_r_"+this.resourceId).append(''+this.label+'
');
+ this.jObject = $("#"+this.eventId);
+
+ $("#"+containerId).find("#"+this.eventId).draggable({
+ containment: 'DOM',
+ revert: 'invalid',
+ zIndex: 999,
+ opacity: 0.5,
+ snap: true,
+ start: function(event, ui) {
+ window["GANTTCALENDAR_DRAG"] = $this;
+ }
+ });
+ $("#"+containerId).find("#"+this.eventId).click(function(event){
+ event.preventDefault();
+ $this.clickHandler(event, $this);
+ return false;
+ });
+
+ var grid_x = containerObject.cellWidth;
+ if(containerObject.TimeLineClass == 'DAY' || containerObject.TimeLineClass == 'WEEK'){
+ grid_x = containerObject.cellWidth/2;
+ }
+ $("#"+containerId).find("#"+this.eventId).resizable({
+ handles: "e, w",
+ grid: [grid_x, 9999],
+ stop: function( event, ui ) {
+ var length = (Math.round(ui.size.width/grid_x)*grid_x) / containerObject.cellWidth;
+ var start = (Math.round(ui.position.left/grid_x)*grid_x) / containerObject.cellWidth;
+ var result = $this.resizeHandler($this, start, length);
+ if(result) {
+ $this.startDay = start + containerObject.firstStep();
+ $this.endDay = $this.startDay + length;
+ }
+ containerObject.drawElements(false);
+ }
+ });
+ return this;
+
+ },
+ drawIn: function(containerObject, onClickHandler, onMoveHandler, onCopyHandler, onResizeHandler) {
+ containerObject.addEvent(this);
+
+ this.moveHandler = onMoveHandler || this.moveHandler;
+ this.copyHandler = onCopyHandler || this.copyHandler;
+ this.clickHandler = onClickHandler || this.clickHandler;
+ this.resizeHandler = onResizeHandler || this.resizeHandler;
+ this.defineHTMLCompontentsAndJSEvents(containerObject);
+ return this;
+ },
+
+ asVector: function(containerObject){
+ var period;
+ if(containerObject.TimeLineClass == 'MONTH'){
+ period = new Vector(this.startDay - 1,this.endDay - this.startDay);
+ }else if(containerObject.TimeLineClass == 'WEEK'){
+ newStartDay = this.startDay - containerObject.mondayOfWeek.getDate();
+ newEndDay = this.endDay - containerObject.mondayOfWeek.getDate();
+ period = new Vector(newStartDay*2,(newEndDay-newStartDay)*2);
+ }else if(containerObject.TimeLineClass == 'DAY'){
+ newStartDay = this.startDay - containerObject.firstStep();
+ newEndDay = this.endDay - containerObject.firstStep();
+ period = new Vector(newStartDay,(newEndDay-newStartDay));
+ }
+ return period;
+ }
+});
+