/* * Copyright (C) 1998-2012 by the Free Software Foundation, Inc. * * This file is part of HyperKitty. * * HyperKitty is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * HyperKitty is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * HyperKitty. If not, see . * * Author: Aurelien Bompard */ /* * Generic */ function form_to_json(form) { var form_data = form.serializeArray(); var data = {}; for (input in form_data) { data[form_data[input].name] = form_data[input].value; } return data; } /* * Voting */ function vote(elem) { if ($(elem).hasClass("disabled")) { return; } var value = parseInt($(elem).attr("data-vote")); var form = $(elem).parents("form").first(); var data = form_to_json(form); data['vote'] = value; $.ajax({ type: "POST", url: form.attr("action"), dataType: "json", data: data, success: function(response) { var newcontent = $(response.html); form.replaceWith(newcontent); setup_vote(newcontent); // re-bind events }, error: function(jqXHR, textStatus, errorThrown) { alert(jqXHR.responseText); } }); } function setup_vote(baseElem) { if (!baseElem) { baseElem = document; } $(baseElem).find("a.vote").click(function(e) { e.preventDefault(); vote(this); }); } /* * New messages (or replies) */ function setup_attachments(baseElem) { if (!baseElem) { baseElem = document; } function add_attach_form (e) { e.preventDefault(); var form = $(this).parents("form").first(); form.find(".attach-files-template") .clone().removeClass("attach-files-template") .appendTo(form.find(".attach-files")); form.find(".attach-files span a").click(function (e) { e.preventDefault(); $(this).parent().remove(); if (form.find(".attach-files input").length === 0) { form.find(".attach-files-add").hide(); form.find(".attach-files-first").show(); }; }); form.find(".attach-files-first").hide(); form.find(".attach-files-add").show(); } $(baseElem).find(".attach-files-add").click(add_attach_form); $(baseElem).find(".attach-files-first").click(add_attach_form); } /* * Recent activity bar chart */ function chart(elem_id, data, default_props) { /* Function for grid lines, for x-axis */ function make_x_axis() { return d3.svg.axis() .scale(x) .orient("bottom") .ticks(d3.time.days, 1) } /* Function for grid lines, for y-axis */ function make_y_axis() { return d3.svg.axis() .scale(y) .orient("left") .ticks(5) } if (typeof default_props === "undefined") { default_props = {}; } if (!data) { return; } var props = {width: 250, height: 50}; $.extend(props, default_props); var margin = {top: 0, right: 0, bottom: 0, left: 0}, width = props.width - margin.left - margin.right, height = props.height - margin.top - margin.bottom; var w = Math.floor(width / data.length); var format_in = d3.time.format("%Y-%m-%d"); var format_out = d3.time.format(""); var x = d3.time.scale() .range([0, width]); var y = d3.scale.linear() .range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .orient("bottom") .tickSize(0,0) // change to 2,2 for ticks .tickFormat(format_out) .ticks(d3.time.days, 1); var yAxis = d3.svg.axis() .scale(y) .orient("left") .tickSize(0,0) // change to 4,3 for ticks .ticks("") // change to 2 for y-axis tick labels .tickSubdivide(1); var area = d3.svg.area() .x(function(d) { return x(d.date); }) // .y0(height) .y(function(d) { return y(d.count); }); var svg = d3.select(elem_id).append("svg") .attr("class", "chart-data") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); data.forEach(function(d) { d.date = format_in.parse(d.date); d.count = parseInt(d.count); }); x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.count; })]); /* Draw the grid lines, for x-axis */ svg.append("g") .attr("class", "grid") .attr("Transform", "translate(0, " + height + ")") .call(make_x_axis() .tickSize(height, 0, 0) .tickFormat("") ) /* Draw the grid lines, for y-axis */ svg.append("g") .attr("class", "grid") .call(make_y_axis() .tickSize(-width, 0, 0) .tickFormat("") ) svg.append("g").attr("class", "bars").selectAll("rect") .data(data) .enter().append("rect") .attr("x", function(d) { return x(d.date); }) //.attr("y0", height) .attr("y", function(d) { return y(d.count); }) .attr("width", w) .attr("height", function(d) { return height - y(d.count); }); /* draw x-axis */ svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis) /*.selectAll("text") .attr("y", -5) .attr("x", -30) .attr("transform", function(d) { return "rotate(-90)" });*/ /* Y-axis label */ svg.append("g") .attr("class", "y axis") .call(yAxis) /*.append("text") .attr("transform", "rotate(-90)") .attr("y", 0) .attr("x", 0 - height/2) .attr("dy", "-3em") .style("text-anchor", "middle") .style("fill", "#777") .text("Messages"); */ } /* * Misc. */ function setup_months_list() { var current = $("#months-list li.current").parent().prev(); if (!current.length) { current = 0; // overview or search } else { current = current.prevAll("h3").length; } $("#months-list").accordion({ collapsible: true, active: current }); } function setup_disabled_tooltips(baseElem) { if (!baseElem) { baseElem = document; } $(baseElem).find("a.disabled").tooltip().click(function (e) { e.preventDefault(); }); } function setup_flash_messages() { $('.flashmsgs .alert-success').delay(3000).fadeOut('slow'); } /* * Activate */ $(document).ready(function() { setup_vote(); setup_months_list(); setup_disabled_tooltips(); setup_flash_messages(); setup_attachments(); });