// Collectd-web - graph-menu.js
// Copyright (C) 2009-2010  Kenneth Belitzky
//
// This program 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 2 of the License, or (at your option) any later
// version.
//
// This program 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
// this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.


function print_date(in_date) {
    var out_date = in_date.toString("HH:mm MMM d yyyy");
    return out_date;
}

function get_exact_date(in_date) {
    var out_date = Date.parseExact(unescape(in_date), "HH:mm MMM d yyyy");
    return out_date;
}

function get_date_distance(in_start, in_end) {
   var start_millis = in_start.getTime();
   var end_millis = in_end.getTime();
   var millis = end_millis - start_millis;
   return millis;
}

/**
 * Function to make the graph move on the x axis
 * @param menu_element the button of the menu pressed
 * @param
 * the graph to the right and negative values to the left
 * @return
 */
function move_graph(menu_element, direction) {
  var gc_img = $(menu_element).closest('li.gc').find('.gc-img');
  var url = $(gc_img).attr('src');
  var params = get_url_params(url);

    var end = server_now();
    var start = server_now().add(-1).hours();

  if (params.start !== null) { start = get_exact_date(params.start); }
    if (params.end !== null) { end = get_exact_date(params.end); }

    var date_distance = Math.round(get_date_distance(start, end) / 2);

    if (direction) {
        start.add((-1)*date_distance).milliseconds();
        end.add((-1)*date_distance).milliseconds();
    } else {
        start.add(date_distance).milliseconds();
        end.add(date_distance).milliseconds();
    }

    $(gc_img).attr('src', build_url(url, {'start':print_date(start),
                                          'end':print_date(end)
                                         }));
}

function zoom_graph(menu_element, direction) {
  var gc_img = $(menu_element).closest('li.gc').find('.gc-img');
  var url = $(gc_img).attr('src');
  var params = get_url_params(url);

    var zoom_factor = 0.5;

    var end = server_now();
    var start = server_now().add(-1).hours();

  if (params.start !== null) { start = get_exact_date(params.start); }
    if (params.end !== null) { end = get_exact_date(params.end); }

    var date_distance = Math.round(get_date_distance(start, end) * zoom_factor);

    if (direction) {
        start.add((-1)*date_distance).milliseconds();
    } else {
        start.add(date_distance).milliseconds();
    }

    $(gc_img).attr('src', build_url(url, {'start':print_date(start),
                                          'end':print_date(end)
                                         }));
}

function move_selected_graphs (direction) {
    var none_selected = true;
   $('.selectable.selected').each(function(index) {
       none_selected = false;
       move_graph(this,direction);
   });

   //if none of the graphs are selected, then move them all
   if (none_selected) {
       $('.selectable').each(function(index) {
           move_graph(this,direction);
       });
   }
}

function zoom_selected_graphs (direction) {
    var none_selected = true;
   $('.selectable.selected').each(function(index) {
       none_selected = false;
       zoom_graph(this,direction);
   });

   //if none of the graphs are selected, then zoom them all
   if (none_selected) {
       $('.selectable').each(function(index) {
           zoom_graph(this,direction);
       });
   }
}

$(function() {

  $('li.graph-image .ui-icon-triangle-1-w').live('click', function() {
    move_graph(this, true);
  });

  $('li.graph-image .ui-icon-triangle-1-e').live('click', function() {
    move_graph(this, false);
  });

  $('li.graph-image .ui-icon-zoomin').live('click', function() {
    zoom_graph(this, false);
  });

  $('li.graph-image .ui-icon-zoomout').live('click', function() {
    zoom_graph(this, true);
  });

  $('.item-pan-zoom .ui-icon-triangle-1-e').live('click', function() {
    move_selected_graphs(false);
  });

  $('.item-pan-zoom .ui-icon-triangle-1-w').live('click', function() {
    move_selected_graphs(true);
  });

  $('.item-pan-zoom .ui-icon-zoomin').live('click', function() {
    zoom_selected_graphs(false);
  });

  $('.item-pan-zoom .ui-icon-zoomout').live('click', function() {
    zoom_selected_graphs(true);
  });


  $('li.graph-image .ui-icon-close').live('click', function() {
    $(this).closest('li.gc').remove();
  });

  $('li.graph-image .ui-icon-star').live('click', function() {
    var section = $(this).parent().parent().next();
    if ($(section).hasClass('selected')) {
      $(section).removeClass('selected');
    } else {
      $(section).addClass('selected');
    }
  });

  $('li.graph-image .ui-icon-disk').live('click', function() {
    var img_tag = $(this).parent().parent().next().next();
    $("#output-dialog a").each(function() {
      $this = $(this);
      var join_url = $(img_tag).attr('src') + $this.attr('href');
      $this.attr('href', join_url);
    });
    $("#output-dialog").dialog( {
      title : 'Select output format:',
      modal : true
    });
  });
});
