var table = {{ datatable.model_table_setup }}; var indexes = table.initsetup.tableOptions.indexes; var heading_index = indexes.indexOf('heading'); var description_index = indexes.indexOf('description'); var background_colour_index = indexes.indexOf('background_colour'); var start_date_field_index = indexes.indexOf('start_date_field'); var end_date_field_index = indexes.indexOf('end_date_field'); var description = indexes.indexOf('description'); var link_index = -1; if(table.initsetup.tableOptions.row_href) { link_details = table.initsetup.tableOptions.row_href[0]; // The last: the link column is added after the rest, and the heading may be the same column. link_index = table.initsetup.field_ids.lastIndexOf(link_details.column); } $.each(table.data, function( index, card ) { try { var start_date = toISOFormat(card[start_date_field_index]); var end_date = toISOFormat(card[end_date_field_index]); // skip if either date is invalid if (!start_date || !end_date || isNaN(Date.parse(start_date)) || isNaN(Date.parse(end_date))) { return true; // continue } var link = ''; if(link_index >= 0) { // A link column gives [key, text]: the key goes in the url, encoded so it can only be a key. var key = Array.isArray(card[link_index]) ? card[link_index][0] : card[link_index]; link = link_details.html.replace(link_details.var, encodeURIComponent(key)); } // A hex colour, '#' added where it is stored without one; anything else -- blank on many records -- // leaves the entry the calendar's own colour. var colour_match = background_colour_index >= 0 ? /^#?([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(String(card[background_colour_index] || '').trim()) : null; var colour = colour_match ? '#' + colour_match[1] : undefined; var event = { title: card[heading_index], start: start_date, end: end_date, backgroundColor: colour, borderColor: colour, description: card[description], url: link } events.push(event) } catch (e) { return true; // continue on error } });