jQuery.fn.hint = function (blurClass) {
  if (!blurClass) { 
    blurClass = 'blur';
  }
    
  return this.each(function () {
    // get jQuery version of 'this'
    var $input = $(this),
    
    // capture the rest of the variable to allow for reuse
      title = $input.attr('title'),
      $form = $(this.form),
      $win = $(window);

    function remove() {
      if ($input.val() === title && $input.hasClass(blurClass)) {
        $input.val('').removeClass(blurClass);
      }
    }

    // only apply logic if the element has the attribute
    if (title) { 
      // on blur, set value to title attr if text is blank
      $input.blur(function () {
        if (this.value === '') {
          $input.val(title).addClass(blurClass);
        }
      }).focus(remove).blur(); // now change all inputs to title
      
      // clear the pre-defined text when form is submitted
      $form.submit(remove);
      $win.unload(remove); // handles Firefox's autocomplete
    }
  });
};

var logged_in = false;
$(document).ready(function(){
	
  //Hide flashes
  hideFlashes();
  
	//Ajax forms	
	jQuery.fn.submitWithAjax = function() {
	  this.submit(function() {
	    $.post(this.action, $(this).serialize(), null, "script");
	    return false;
	  })
	  return this;
	};
	
	//Hijack Ajax forms
	$(".ajaxForm").submitWithAjax();
	
	//Hijack Ajax links
	hijackAjaxLinks();
		
	//Nice checkboxes
  $('input').checkBox();
  initCheckboxAjax();
	
	logged_in = $("#q").hasClass("enable_add");
	
	$(".show_autocomplete").hint();
	$(".show_autocomplete").autocomplete("/autocomplete.js", {
			minChars: 2,
			max: 100,
      formatItem:function(item, index, total, query){
        var add = '<a href="/add-show/' + item.permalink + '" class="add_link"><img src="/images/pixel.gif?1" alt="" width="16" height="16" class="icon plus_button" /></a>';
        var h3 = '<h3><a href="/show/' + item.permalink + '" class="permalink">' + item.title + '</a></h3>';
        var p = '<p>' + item.followers + ' followers | ' + item.episodes + ' episodes</p>';
        if (logged_in)
          return add+h3+p;
        else
          return h3+p;
      },
      formatMatch:function(item) {
        return item.title;
      },
      formatResult:function(item) {
        return item.title;
      },
      dataType:'json',
      parse:function(data) {
        return $.map(data, function(item) {
          if (item)
          {
            return {
              data: item,
              value: item.title,
              result: item.title
            };
          }
        });
      },
      highlight: function(value, term) {
        var value = $(value);
        if (logged_in)
          $(value[0]).bind("click", function(){ window.location = $(this).attr("href"); });
        value.find("a").bind("click", function(){ window.location = $(this).attr("href"); });
        value.find("a.permalink").html(value.find("a.permalink").html().replace(RegExp(term, "gi"), "<strong>" + term + "</strong>"));
        return value;
      }
	});
	
	//Init tooltip
	initTooltip();
	
	//Table sorter
	if ($("#my_shows tbody tr").length > 0)
    initTableSorter();
  
  //Togglers init
  initTogglers();
  
  //Checkbox toggler
  initCheckboxTogglers();
  
  //Top shows checkboxes
  $("#top_shows :checkbox").each(function(){
    var chk = $(this);
    var parent = chk.parents("li");
    chk.is(":checked") ? parent.addClass("selected") : parent.removeClass("selected");
    chk.bind("change", function(){
      parent.hasClass("selected") ? parent.removeClass("selected") : parent.addClass("selected");
    });
  });
  
  //Seen Progress
  renderProgress();
  
  //Settings tabs
  initTabs();
  
  //Facebook like
  initFacebookLike();

});

function hijackAjaxLinks() {
  $("a.ajaxLink").bind("click", function() {
    var link = $(this);
    $("#" + link.attr("rel")).show();
    link.parent().parent().find(".hide_while_loading").hide();
    $.ajax({
      type: "POST",
      url: link.attr("href"),
      dataType: "script",
      success: function(){}
    });
    return false;
  });
}

function initCheckboxAjax()
{  	
  $("input[type=checkbox].ajax").parent().children(".ui-checkbox").click( function(){
    var form = $(this).parent();
    $(form).children("span").hide();
    $(form).children(".ajaxLoader").show();
    form.submit();
  });
}

function initTooltip()
{
  var standard = {tip: 'leftTop', target: 'rightTop', tooltip: 'leftTop'};
  var inverted = {tip: 'rightTop', target: 'leftTop', tooltip: 'rightTop'};

  $(".tip").each(function()
  {
    var index = $(this).parents("td").attr("rel");    
    var content = $('#' + $(this).attr("rel")).html();
    var normal = index > 5 ? false : true;
    if ($(this).hasClass("inverted"))
      normal = false;
      
    $(this).qtip({
      content: content,
      style: {
        width: 300,
        padding: 5,
        background: '#000',
        color: '#fff',
        border: { width: 3, radius: 5, color: '#EC0075' },
        tip: normal ? standard.tip : inverted.tip
      },
      show: { deplay: 0, effect: { length: 0 } },
      hide: "mouseout",
      position: {
        corner: {
           target: normal ? standard.target : inverted.target,
           tooltip: normal ? standard.tooltip : inverted.tooltip
        },
        adjust: { y: 7, x: index > 5 ? -5 : 5 }
      }
    }); //qtip
  }); //each
}

function initTableSorter()
{
	$.tablesorter.defaults.widgets = ['zebra'];
  
	// add parser through the tablesorter addParser method 
  $.tablesorter.addParser({ 
      // set a unique id 
      id: "date", 
      is: function(s) { 
          // return false so this parser is not auto detected 
          return false; 
      }, 
      format: function(s) { 
          // format your data for normalization
          if (s.indexOf(',') > 0)
          {
            var date_string = null;
            var ds = s.replace(/st,|nd,|rd,|th,/,",");
            var parts = ds.split(",");
            var day_month = parts[0];
            var year = parts[1].substring(0,5);
            date_string = day_month + "," + year;
            var d = Date.parse(date_string);
            if (isNaN(d))
              return 9999999999999999999999;
            else
              return d;
          }
          else
            return 9999999999999999999999;
      }, 
      // set type, either numeric or text 
      type: "text"
  });
  
	$("#my_shows").tablesorter(
	{
	  cssAsc: "asc",
	  cssDesc: "desc",
    headers: {
      1: { sorter: "string" }, 
      1: { sorter: false }, 
      2: { sorter: false },
      3: { sorter: "date" },
      4: { sorter: false }
    },
	  sortList: [[0,0]],
	  textExtraction: myTextExtraction,
	  sortMultiSortKey: 'altKey'
  });
  $("#my_shows").bind("sortEnd",function() {
    if ($("th.sort span").attr("style"))
    {
      var style = $("th.sort span").attr("style").replace("_desc", "_small").replace("_asc", "_small");
      var asc = style.replace("_small", "_desc");
      var desc = style.replace("_small", "_asc");
      $("th.sort span").attr("style", style);
      $("th.asc span").attr("style", asc);
      $("th.desc span").attr("style", desc);
    }
  }); 
}


var myTextExtraction = function(node)
{
  return $(node).text();
}

function initTogglers()
{
  $("a.toggler").click( function(){
    var e = $("#" + $(this).attr("rel"));
    e.is(':hidden') ? e.fadeIn(1000) : e.fadeOut(500);
    return false;
  });
}

function initCheckboxTogglers()
{
  $(".toggler:checkbox").each( function() {
      setCheckbox($(this));
    });
  
  $(".toggler:checkbox").change( function(){
    setCheckbox($(this));    
  });
}

function setCheckbox(chk)
{
  var checked = chk.is(':checked');
  
  var checkbox = $("#" + chk.attr("rel") + "");
  var label = checkbox.nextAll("label");
  var ui_checkbox = checkbox.nextAll("span.ui-checkbox");
  
  if (checked)
  {
    label.removeClass("disabled");
    checkbox.removeAttr("disabled");
  }
  else
  {
    label.addClass("disabled");
    checkbox.attr({checked: false, disabled: true});
  }
  
  if (ui_checkbox)
    checkbox.checkBox('reflectUI');
}

function renderProgress()
{
  if ($("#progress").length > 0)
  {
    $.ajax({
      type: "GET",
      url: "/render_progress",
      dataType: "script",
      success: function(){}
    });
  }
}

function hideFlashes()
{
  if ($("#notice").length > 0)
    $("#notice").delay(5000).slideUp();
    
  if ($("#error").length > 0)
    $("#error").delay(10000).slideUp();
}

function initTabs()
{  
  $("#settings ul a").click(function(){
    $("#setting_list li").removeClass("active");
    $(this).parents("li").addClass("active");
    
    var tab_id = "#setting_" + $(this).attr("rel");
    $("#settings_content div.tab").hide();
    $(tab_id).fadeIn();
    
    return false;
  });
}

function initFacebookLike(){
  if ($("#facebook_button").length > 0)
    setTimeout("insertFacebookButton()", 1000);
}

function insertFacebookButton()
{
  var id = $("#facebook_button").text();
  $.ajax({
    type: "GET",
    url: "/facebook_button/" + id,
    dataType: "script",
    success: function(){}
  });
}