if(jQuery.browser.webkit){
  jQuery('body').addClass('webkit');
}
if(jQuery.browser.mozilla){
  jQuery('body').addClass('mozilla');
}

jQuery(document).ready(function() {

  jQuery('a.toggle').live('click', function (event) {
    var $this = jQuery(this);
    if ($this.hasClass('disabled')) {
      return;
    }
    $this.toggleClass('open');
    if($this.hasClass('open')) {
      $this.closest('.module').find('.body').slideDown();
    } else {
      $this.closest('.module').find('.body').slideUp();
    }
    event.preventDefault();
  });

  /*
  jQuery('a.toggle.close').live('click', function(){
    jQuery(this).parents('.module').find('.body').slideUp();
    jQuery(this).parents('.module').find('a.open').removeClass('inactive');
    jQuery(this).addClass('inactive');
    event.preventDefault();
  });

  jQuery('a.toggle.open').live('click', function(){
    jQuery(this).parents('.module').find('.body').slideDown();
    jQuery(this).parents('.module').find('a.close').removeClass('inactive');
    jQuery(this).addClass('inactive');
    event.preventDefault();
  });
  */

  jQuery('a.modify').click(function (event) {
    jQuery(this).toggleClass('open');
    if(jQuery(this).hasClass('open')){
      jQuery(this).parents('.module').find('.filters').slideDown(200);
    }else{
      jQuery(this).parents('.module').find('.filters').slideUp(200);
    }

    event.preventDefault();
  });
  jQuery('.filters a.close').click(function(event) {
    jQuery(this).parents('.module').find('.filters').slideUp(300);
    jQuery(this).parents('.module').find('a.modify').removeClass('open');
    //do a fake update

    var clearInterval = setTimeout(function(){
      jQuery('.module').each(function(){
        moduleLoadInit(jQuery(this));
      });
    }, 300);

    //return;
    var clearInterval = setTimeout(function(){
      jQuery('.module').each(function(){
        moduleLoadComplete(jQuery(this));
      });
      jQuery('.save.hidden').removeClass('hidden');
    }, 2500);

    event.preventDefault();
  });

  jQuery('a.manage-columns').click(function (event) {
    jQuery(this).toggleClass('open');
    if(jQuery(this).hasClass('open')){
      jQuery(this).parents('.module').find('.columns').slideDown(200);
    } else {
      jQuery(this).parents('.module').find('.columns').slideUp(300);
    }

    event.preventDefault();
  });

  jQuery('.columns a.close').click(function (event) {
    jQuery(this).parents('.module').find('.columns').slideUp(300);
    jQuery(this).parents('.module').find('a.manage-columns').removeClass('open');
    event.preventDefault();
  });

  if(jQuery('.messages').length){
    jQuery('.messages').css({opacity: 0.1});
    jQuery('.messages').animate({opacity:1.0}, 500);
  }

  jQuery('.messages a.close').live('click', function (event) {
    jQuery(this).parent().fadeOut(100, function () {
      jQuery(this).remove();
    });
    event.preventDefault();
  });

  // reapply in init callback of datatable
  jQuery('input.filter').labelify({labelledClass:'input-inactive'});

  if(jQuery('ul.sortable').length){
    jQuery('ul.sortable').sortable();
  }

  jQuery('.tooltip').tipTip({});

  if(jQuery('#datepicker-from').length){
    var from_options = {};
    var to_options = {};
    if(typeof min_date != 'undefined'){
      from_options.minDate = min_date;
    }
    //var now = new Date();
    //from_options.maxDate = now;
    from_options.onSelect = function(dateText, inst){
      jQuery('#timeFrom').val(dateText);
      jQuery('#datepicker-to').datepicker("option", "minDate", jQuery(this).datepicker("getDate"));
    }
    //to_options.maxDate = now;
    to_options.onSelect = function(dateText, inst){
      jQuery('#timeTo').val(dateText);
      jQuery('#datepicker-from').datepicker("option", "maxDate", jQuery(this).datepicker("getDate"));
    }

    jQuery('#datepicker-from').datepicker(from_options);
    jQuery('#datepicker-to').datepicker(to_options);

    jQuery('#timerange-selector .controls ul a').click(function(event){
      var fromDate;
      var toDate;
      // Offset for UTC
      var timezoneOffset = (new Date()).getTimezoneOffset() * 60000;  // Convert m to ms
      var now = new Date(new Date().getTime() + timezoneOffset);

      switch(jQuery(this).attr('class')){
        case 'today':
          fromDate = now;
          toDate = now;
        break;

        case 'yesterday':
          fromDate = '-1d';
          toDate = '-1d';
        break;

        case 'last-week':
          fromDate = '-1w';
          toDate = now;
        break;

        case 'last-month':
          fromDate = '-1m';
          toDate = now;
        break;

        case 'last-year':
          fromDate = '-1y';
          toDate = now;
          break;

        case 'all-time':
          jQuery('#timeFrom').val("");
          jQuery('#timeTo').val("");
          fromDate = false;
          toDate = false;
          jQuery('#timerange-selector-head h3').text("All time.");
          if(typeof min_date != 'undefined'){
            fromDate = null;
          }
          toDate = now;
        break;

        default:

        break;
      }

      jQuery(document).trigger('onTimeChange', [fromDate, toDate]);
      event.preventDefault();
    });

    jQuery('#timerange-selector a.apply').click(function() {
      jQuery(document).trigger('onTimeChange', [new Date(jQuery('#timeFrom').val()), new Date(jQuery('#timeTo').val())]);
    });

    jQuery(document).bind('onTimeChange', function(event, fromDate, toDate) {
      jQuery('#datepicker-from').datepicker("setDate", fromDate);
      jQuery('#datepicker-to').datepicker("setDate", toDate);
      //go back to the datepicker to get a date object, because we may have passed in relative offsets
      fromDate = jQuery('#datepicker-from').datepicker("getDate");
      toDate = jQuery('#datepicker-to').datepicker("getDate");
      jQuery('#timeFrom').val(jQuery.format.date(fromDate, 'MM/dd/yyyy'));
      jQuery('#timeTo').val(jQuery.format.date(toDate, 'MM/dd/yyyy'));

      if (fromDate.valueOf() && toDate.valueOf()) {
        jQuery('#timerange-selector-head h3').text(jQuery.format.date(fromDate, 'MMM d, yyyy') + ' - ' + jQuery.format.date(toDate, 'MMM d, yyyy'));
      }
      hideTimeRange();
    });
  }
  
  jQuery('#timerange-selector-head').click(function (event) {
    if(jQuery(this).hasClass('open')){
      hideTimeRange();
    }else{
      showTimeRange();
    }
    event.stopPropagation();
  });
  jQuery('#timerange-selector a.close').click(function (event) {
    event.preventDefault();
  });

  jQuery('#navigation > li > a').click(function (event) {
    if(jQuery(this).parent().find('ul').length){
      //do the toggle, and animation
      if(jQuery(this).parent().hasClass('open')){
        jQuery(this).parent().find('ul').slideUp(300);
        jQuery(this).parent().removeClass('open');
      }else{
        jQuery(this).parent().find('ul').slideDown(300);
        jQuery(this).parent().addClass('open');
      }
      event.preventDefault();
    }
  });

  if(jQuery('#appswitcher').length){
    jQuery('#appswitcher').change(function (event) {
      var v = jQuery(this).val();
      if(v) {
        if (v == 'all') {
          window.location = '/analytics/all/';
          event.preventDefault();
          event.stopImmediatePropagation();
        }
      } else {
        event.preventDefault();
        event.stopImmediatePropagation();
      }
    });
  }

/*
  jQuery('.attribute .header > a').click(function (event) {
    jQuery(this).toggleClass('open');
    if(jQuery(this).hasClass('open')){
      jQuery(this).parents('.attribute').find('.body').slideDown(200);
    }else{
      jQuery(this).parents('.attribute').find('.body').slideUp(200);
    }
    event.preventDefault();
  });*/

  //TODO: consolidate these into generic logic
  jQuery('.application .header a.edit').click(function (event) {
    jQuery(this).toggleClass('open');
    if(jQuery(this).hasClass('open')){
      jQuery(this).parents('.application').find('div.edit').slideDown(200);
    }else{
      jQuery(this).parents('.application').find('div.edit').slideUp(200);
    }
    event.preventDefault();
  });

  jQuery('.application .header a.permissions').click(function (event) {
    jQuery(this).toggleClass('open');
    if(jQuery(this).hasClass('open')){
      jQuery(this).parents('.application').find('div.permissions').slideDown(200);
    }else{
      jQuery(this).parents('.application').find('div.permissions').slideUp(200);
  }
    event.preventDefault();
  });

  jQuery('.application .edit a.cancel').click(function(){
    jQuery(this).parents('.application').find('div.edit').slideUp(200);
    jQuery(this).parents('.application').find('.header a.edit').removeClass('open');
  });

  jQuery('.application .permissions a.cancel').click(function(){
    jQuery(this).parents('.application').find('div.permissions').slideUp(200);
    jQuery(this).parents('.application').find('.header a.permissions').removeClass('open');
    //TODO: Henry - implement cleanup for unfished new items
    jQuery(this).parents('.permissions').find('tr.new').remove();
  });

  jQuery('.application .permissions a.add').click(function (event) {
    var tr = jQuery(this).parents('.permissions').find('tbody tr.template').clone();
    tr.removeClass('template');
    tr.addClass('new');
    jQuery(this).parents('.permissions').find('tbody').append(tr);
    tr.find('input').focus();
    event.preventDefault();
  });

  jQuery('a.insufficient-feature-level:not(.save)').live('click', function (event) {
    //window.location = '/index/upgrade';
    event.preventDefault();
  });

  jQuery('a.premium-feature.insufficient-feature-level').tipTip({
    content: "<a href='/index/upgrade/'>Premium feature. Click here to learn more and upgrade.</a>",
    activation: 'click',
    delay: 0
    //keepAlive: true
    //hover: 100
  });

  // Prevent buttons from default behavior
  var preventDefault = function (event) {
    event.preventDefault();
  }
  jQuery('a.button').click(preventDefault);
  jQuery('a.button.link').unbind('click', preventDefault);

  jQuery('a.button.new-app.open').click(function (event) {
    jQuery('#new_app').fadeIn();
    event.preventDefault();
  });

  jQuery('a.button.new-app.cancel').click(function (event) {
    jQuery('#new_app').fadeOut();
    event.preventDefault();
  });

  jQuery('a.enterprise-feature.insufficient-feature-level').tipTip({
    content: "<a href='/index/upgrade/'>Enterprise feature. Click here to learn more and upgrade.</a>",
    activation: 'click',
    delay: 0
  });

});

function moduleLoadInit($module){
  //cleanup existing

  var $loader = $module.find('.loader');
  if ($loader.length === 0) {
    $module.find('.header h3').parent().append('<span class="loader"></span>');
    $loader = $module.find('.loader');
    $loader.animate({'opacity':1.0}, 500);
  } else {
    $loader.fadeIn(500);
  }
  $module.addClass('loading');

  //add cover, fade in
  var $header = $module.find('.header');
  var $headerCover = $module.find('.header-cover');
  var $body = $module.find('.body').not(':hidden');
  var $bodyCover;
  var $summary = $module.find('.summary').not(':hidden');
  var $summaryCover;

  if ($body.length > 0) {
    $bodyCover = $module.find('.body-cover');
    if ($bodyCover.length === 0) {
      $module.append('<div class="body-cover"></div>');
      $bodyCover = $module.find('.body-cover');
      $bodyCover.height($body.outerHeight());
      $bodyCover.css({'top': $body.position().top, 'opacity': 0.0});
      $bodyCover.animate({'opacity': 1.0}, 500);
    } else {
      $bodyCover.fadeIn(500);
    }
  }

  if ($summary.length > 0) {
    $summaryCover = $module.find('.summary-cover');
    if ($summaryCover.length === 0) {
      $module.append('<div class="summary-cover"></div>');
      $summaryCover = $module.find('.summary-cover');
      $summaryCover.height($summary.outerHeight());
      $summaryCover.css({'top': $summary.position().top, 'opacity': 0.0});
      $summaryCover.animate({'opacity': 1.0}, 500);
    } else {
      $summaryCover.fadeIn(500);
    }
  }

  if ($header.length > 0) {
    if ($headerCover.length === 0) {
      $module.append('<div class="header-cover"></div>');
      $headerCover = $module.find('.header-cover');
      $headerCover.height($header.outerHeight());
      $headerCover.css({'top': $header.position().top, 'opacity':0.0});
      $headerCover.animate({'opacity': 1.0}, 500);
    } else {
      $headerCover.fadeIn(500);
    }
  }

}

function moduleLoadComplete($module){
  $module.find('.body-cover').fadeOut();
  $module.find('.header-cover').fadeOut();
  $module.find('.summary-cover').fadeOut();
  $module.find('.loader').fadeOut();
  $module.removeClass('.loading');
}

function showTimeRange(){
  jQuery('#modal').show();
  jQuery('#timerange-selector').css({'top': (jQuery('#timerange-selector-head').offset().top + 36) + 'px'});
  jQuery('#timerange-selector').slideDown(150, function(){
    jQuery('#timerange-selector-head').addClass('open');
  });
  //add new event listener
  jQuery('#modal').click(function(){
    hideTimeRange();
  });

  jQuery(document).bind('mousedown', function(event){
    var left = jQuery('#timerange-selector').offset().left,
        top = jQuery('#timerange-selector').offset().top,
        x = event.pageX,
        y = event.pageY,
        mousex = x - left,
        mousey = y - top,
        w = jQuery('#timerange-selector').outerWidth(),
        h = jQuery('#timerange-selector').outerHeight();
    if (mousex < 0 || mousex > w || mousey < 0 || mousey > h) {
      hideTimeRange();
    }
  });
}

function hideTimeRange(){
  jQuery(document).unbind('mousedown');
  jQuery('#timerange-selector').slideUp(150, function(){
    jQuery('#timerange-selector-head').removeClass('open');
  });
}

function Countdown(){
  var that = this;
  that.interval = null;
  that.seconds_init = 301;
  that.seconds = that.seconds_init;
  that.interval = setInterval(function(){that.update.apply(that)}, 1000);
  that.update();
  jQuery(document).bind('stopCountdown', function () {
    that.interval = clearInterval(that.interval);
  });
  jQuery(document).bind('startCountdown', function () {
    that.interval = setInterval(function () {
      that.update.apply(that);
    }, 1000);
  });
  jQuery(document).bind('resetCountdown', function () {
    that.seconds = that.seconds_init;
  });


}

Countdown.prototype.update = function(){
  this.seconds--;
  if(this.seconds <= 0){
    jQuery(document).trigger("countdownComplete");
    this.seconds = this.seconds_init;
  }
  var min = pad(Math.floor(this.seconds / 60), 2);
  var sec = pad(this.seconds%60, 2);
  jQuery('#countdown-time').text(min+':'+sec);
}

function pad(number, length) {
  var str = '' + number;
  while (str.length < length) {
    str = '0' + str;
  }
  return str;
}

function htmlForAttributeList(list, containerIdFn) {
  var output = [];
  jQuery.each(list, function(i, attr) {
    output.push('<div class="attribute" id="');
    output.push(containerIdFn(i));
    output.push('"><div class="header"><a href="#">');
    output.push(attr);
    output.push('<span></span></a></div><div class="body"></div></div>')
  });
  return output.join("");
}

function htmlForAttributeValues(value_pairs, chartContainerId) {
  if(value_pairs == null || value_pairs.length === 0) {
    return "No values for this attribute."
  }
  
  var total = 0;
  jQuery.each(value_pairs, function(i, pair) {
    total += pair.count;
  });
      
  var output = ['<div class="line" style="min-height: 400px; height: 100%;"><div class="unit size3of4"><div id="'];
  output.push(chartContainerId);
  output.push('"></div></div><div class="unit size1of4 lastUnit" style="overflow: auto"><table><thead><tr><th>Value</th><th>Occurrences</th><th>% of total</th></tr></thead><tbody>');
    
  jQuery.each(value_pairs, function(i, pair) {
    output.push('<tr><td>');
    output.push(value_pairs[i].attribute_value);
    output.push('</td><td>');
    output.push(value_pairs[i].count);
    output.push('</td><td>');
    output.push(Math.round((value_pairs[i].count / total)*100));
    output.push('%</td></tr>');
  });
  output.push('<tr><td><b>Total</b></td><td><b>');
  output.push(total);
  output.push('</b></td><td></td></tr></tbody></table></div></div>')
  return output.join("");
}

