/*
  JavaScript used for Metric drop-down widget
  
  (C) Copyright 2009, Compete Inc.
  
  Depends on:
    JQuery
  
  Raises a event named metric_selected passing dropbox, metric as event parameters
  ie. Handler signature should be: function handler(event, dropbox, metric)...
  
  The following variables are used by this file:
    metric_load_url
*/

var metric_metadata = null;

/*
 * Initialize Handler
 */ 
$j(document).ready(function() {
  _load_metrics();
});

function get_metric_object(metric_id) {
  return _find_metric_by_id(metric_id);
}

function get_selected_metric(dropdown_div_id) {
  var _item = get_selected_item(dropdown_div_id);
  
  if (_item) {
    return _find_metric(dropdown_div_id, _item.id);
  } else {
    return null;
  }
}

function set_selected_metric(metric1, metric2) {
  // Set the internal metrics
  metric1 = ((metric1 == undefined) || (metric1 == '')) ? null : metric1;
  metric2 = ((metric2 == undefined) || (metric2 == '')) ? null : metric2;

  var _metric1 = get_selected_item('select-metric1');
  var _metric2 = get_selected_item('select-metric2');
  var _sel_metric1_item = (_metric1 != null) ? _metric1.item_id : null;
  var _sel_metric2_item = (_metric2 != null) ? _metric2.item_id : null;
  
  if ((metric1 == _sel_metric1_item) && (metric2 == _sel_metric2_item)) { return false; }
  
  if (metric1 != _sel_metric1_item) {
    _metric1_item = get_item_by_item_id('select-metric1', metric1);
    if (_metric1_item) {
      select_item('select-metric1', _metric1_item.item_id, _metric1_item.group_id);
      _metric_selected_handler(null, 'select-metric1', _metric1_item);
    }
  }
  
  if (metric2 != _sel_metric2_item) {
    if (metric2 == null) {
      clear_selected('select-metric2');
    } else {
      _metric2_item = get_item_by_item_id('select-metric2', metric2);
      if (_metric2_item) {
        select_item('select-metric2', _metric2_item.item_id, _metric2_item.group_id);
        _metric_selected_handler(null, 'select-metric2', _metric2_item);
      }
    }
  }
  
  return true;
}

/*
 * Internal Event handlers
 */ 
function _load_metrics() {
  $j.getJSON(metric_load_url, function(json) {
    metric_metadata = json;
    _build_metric_dropdowns();
  });
}

/*
 * Private functions
 */ 
function _build_metric_dropdowns() {
  // Build each drop down (2 max)
  var _metric_divs = $j('.dropdown');
  var _div_cnt = 1;
  
  // Bind to the selected event
  $j(document).bind('item_selected', _metric_selected_handler);
  
  _metric_divs.each(function() {
    if ((_div_cnt > 2) || (!$j(this).hasClass('metric-selector')) || (this.id == '')) {
      return;
    }
    
    for(var _idx=0; _idx<metric_metadata.metrics.length; _idx++) {
      var _metric = metric_metadata.metrics[_idx];
      var _metric_class = (_metric.is_pro==1) ? 'pro-badge' : '';
      
      // Check if the group exists and create it if it doesn't
      if (!group_exists(this.id, _metric.group)) {
        add_group(this.id,
                  _metric.group_title.replace(/\%\%MODATE\%\%/gi, metric_metadata.latest_month).replace(/\%\%DYDATE\%\%/gi, metric_metadata.latest_day),
                  _metric.group, ((_div_cnt == 1) && (get_group_count(this.id) > 0)) ? 'above' : '');
      }
      
      // dropdown_div_id, item_id, item, item_title, item_class, group_id
      add_list_item(this.id, _metric.id, _metric.title, _metric.title, _metric_class, _metric.group);
    }
    
    if (_div_cnt == 2) { set_default_title(this.id, '<span class="default">Compare Second Metric</span>'); }
    
    _div_cnt++;
  });
  
  // Save and reset the global base and secondary variables to blank strings to force a full refresh
  var _def_metric1 = charted_base_metric;
  var _def_metric2 = charted_secondary_metric;
  charted_base_metric = '';
  charted_secondary_metric = '';
  
  set_selected_metric(_def_metric1, _def_metric2);
}

function _metric_selected_handler(event, dropdown_div_id, item_object) {
  if (!$j('div#' + dropdown_div_id).hasClass('metric-selector')) { return false; }
  
  var _metric = _find_metric(dropdown_div_id, item_object.id);
  var _sel_item = get_item_by_id(dropdown_div_id, item_object.id);
  
  if (dropdown_div_id != 'select-metric2') {
    unhide_group('select-metric2', 'monthly');
    unhide_group('select-metric2', 'daily');
    hide_group('select-metric2', ((_metric.type=='monthly') ? 'daily' : 'monthly'));
    
    enable_all_items();
    disable_item('select-metric2', _sel_item.item_id, _sel_item.group_id);
    clear_selected('select-metric2');
  }
  
  var _metric1 = get_selected_item('select-metric1');
  var _metric2 = get_selected_item('select-metric2');
  
  _metric1 = (_metric1 != null) ? _find_metric('select-metric1', _metric1.id) : null;
  _metric2 = (_metric2 != null) ? _find_metric('select-metric2', _metric2.id) : null;
  var _metric1_ispro = (_metric1) ? _metric1.is_pro : 0;
  var _metric2_ispro = (_metric2) ? _metric2.is_pro : 0;
  var _selected_range = $j.trim($j('.range-selected')[0].innerHTML);
  
  if (((_metric1_ispro == 1) || (_metric2_ispro == 1)) && ($j('#chart-upsell').length > 0)) {
    if ($j('#chart-upsell').hasClass('hidden')) {
      /* This is a hack that's been put in place till Drew can work out a better way to upsell */
      document.location.replace(main_site + '/plans/');
      /*
      $j('#chart-title').addClass('hidden');
      $j('#chart').addClass('hidden');
      $j('#chart-upsell').removeClass('hidden');
      hide_permalink_container();
      */
    }
    
    if (event) { event.stopPropagation(); }
    return;
  } else {
    if (!$j('#chart-upsell').hasClass('hidden')) {
      $j('#chart-title').removeClass('hidden');
      $j('#chart').removeClass('hidden');
      $j('#chart-upsell').addClass('hidden');
    }
  }
  
  if (dropdown_div_id == 'select-metric1') {
    update_metrics(_metric.id);
  } else {
    update_metrics(get_selected_item('select-metric1').item_id, _metric.id);
  }
  
  // Trigger a event to indicate that the metric changed
  $j(document).trigger('metric_selected', [ dropdown_div_id, _metric ]);
  
  if (event) { event.stopPropagation(); }
}

function _find_metric_by_id(item_id) {
  var _metric = null;
  
  if (!metric_metadata) { return _metric; }
  
  $j.each(metric_metadata.metrics, function() {
    _metric = this;
    if (_metric.id == item_id) { return false; } else { _metric = null; }
  });
  
  return _metric;
}

function _find_metric(dropdown_div_id, item_elem_id) {
  var _item = get_item_by_id(dropdown_div_id, item_elem_id);
  
  if (_item) {
    return _find_metric_by_id(_item.item_id);
  } else {
    return null;
  }
}
