/** * * JQuery fn.gantt gantt chart plugin v0.2 * Copyright 2011 by Marek Bielańczuk * http://mbielanczuk.com/ * Released under the MIT and GPL Licenses. * * Date: Tue Jun 21 00:18:16 +0200 2011 */ jQuery.fn.gantt = function (options) { var defaults = { source: null, itemsPerPage: 7, months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], dow: ["N", "Pn", "Wt", "Śr", "Cz", "Pt", "So"], startPos: new Date() }; var options = jQuery.extend(defaults, options); var data = null; // Recived data var pageNum = 0; // Current page number var pageCount = 0; // Aviable pages count var rowsOnLastPage = 0; // How many rows on last page var rowsNum = 0; // var hPosition = 0; // Current position on diagram (Horizontal) var dateStart = null; var dateEnd = null; var create = function(jQuerythis) { if (!options.source) return; jQuery.getJSON(options.source, function(rData) { data = rData; rowsNum = data.length; pageCount = Math.ceil(rowsNum/options.itemsPerPage); rowsOnLastPage = rowsNum - (Math.floor(rowsNum/options.itemsPerPage) * options.itemsPerPage); dateStart = tools.getMinDate(); dateEnd = tools.getMaxDate(); var contTable = createContainer(); jQuerythis.append(contTable); fillHollydays(); fillData(); jQuerythis.css({ height: jQuery(".fn-gantt").height() + "px" }); jQuery('.fn-gantt .dataPanel').css({'margin-left': hPosition+'px'}); var d = Math.round((options.startPos/1000 - dateStart/1000) / 86400 )-2; if (d > 0) { navigateTo(-1*d * tools.getCellSize()); } else { repositionLabel(); } }); var createContainer = function() { /* Left panel */ var ganttLeftPanel = jQuery('
') .append(jQuery('') .css("height", tools.getCellSize()*4+"px") .css("width", "100%")); jQuery.each(data, function(i, entry) { if (i >= pageNum*options.itemsPerPage && i < (pageNum*options.itemsPerPage+options.itemsPerPage)) { ganttLeftPanel .append(jQuery('').append(jQuery('').html(entry.name))) .append(jQuery('').append(jQuery('').html(entry.desc))); } }); /* Navigation panel */ var ganttNavigate = jQuery('') .append(jQuery('') .html('<') .click( function () { navigatePage(-1); })) .append(jQuery('') .append(jQuery('') .html(pageNum+1 + ' of ' + pageCount))) .append(jQuery('') .html('>') .click( function () { navigatePage(1); })) .append(jQuery('') .html('|<') .click( function () { navigateTo('begin'); })) .append(jQuery('') .html('<<') .click( function () { navigateTo(tools.getCellSize()*7); })) .append(jQuery('') .html('<') .click( function () { navigateTo(tools.getCellSize()); })) .append(jQuery('') .html('>') .click( function () { navigateTo(tools.getCellSize() * -1); })) .append(jQuery('') .html('>>') .click( function () { navigateTo(tools.getCellSize() * -7); })) .append(jQuery('') .html('>|') .click( function () { navigateTo('end'); })); /* Container */ var gantt = jQuery(''); gantt .append( jQuery('') .append(ganttLeftPanel) .append( jQuery('') .append(createDataContainer()) )) .append(jQuery('') .append(ganttNavigate)); return gantt; }; // Creates Data container with header var createDataContainer = function() { var range = tools.parseDateRange(dateStart, dateEnd); var years = jQuery(""); var year = range[0].getFullYear(); var daysInYear = 0; var months = jQuery(""); var month = range[0].getMonth(); var daysInMonth = 0; var days = jQuery(''); var dow = jQuery(''); var today = new Date(); today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); jQuery.each(range, function(i, rday) { if (rday.getFullYear() != year) { years.append(jQuery('') .css("width", tools.getCellSize()*daysInYear + "px") .append(jQuery("").html(year))); year = rday.getFullYear(); daysInYear = 0; } daysInYear++; if (rday.getMonth() != month) { months.append(jQuery('') .css("width", tools.getCellSize()*daysInMonth + "px") .append(jQuery("").html(options.months[month]))); month = rday.getMonth(); daysInMonth = 0; } daysInMonth++; var day_class = (today - rday == 0) ? ' today' : (options.hollydays && options.hollydays.join().indexOf(rday.getTime())>-1) ? "hollyday" : rday.getDay() == 6 ? "sa" : (rday.getDay() == 0 ? "sn" : "wd"); days.append(jQuery('').html(rday.getDate())); dow.append(jQuery('').html( options.dow[rday.getDay()] )); }); years.append(jQuery('') .css("width", tools.getCellSize()*daysInYear + "px") .append(jQuery("").html(year))); months.append(jQuery('') .css("width", tools.getCellSize()*daysInMonth + "px") .append(jQuery("").html(options.months[month]))); var dataPanel = jQuery("").css("width", range.length*tools.getCellSize()+"px"); dataPanel.append(years); dataPanel.append(months); dataPanel.append(days); dataPanel.append(dow); jQuery.each(data, function(i, entry) { if (i >= pageNum*options.itemsPerPage && i < (pageNum*options.itemsPerPage+options.itemsPerPage)) { var dRow = jQuery('