$(document).ready(function() {
  jQuery.ajaxSetup({
    'beforeSend': function(xhr) {
      xhr.setRequestHeader("Accept", "text/javascript");
    }
  });
});

var i18n = {
  // "a=\u00E1 e=\u00E9 i=\u00ED o=\u00F3 u=\u00FA A=\u00C1 E=\u00C9 I=\u00CD O=\u00D3 U=\u00DA"
  t : function(key) {
    return i18n[LOCALE][key];
  },
  'en' : {
    'you_sure' : "Are you sure?"
  },
  'ga' : {
    'you_sure' : "An bhfuil t\u00FA cinnte?"
  }
};

var _gaq = _gaq || [];

var CommentForm = new function() {
  var self = this;
  self.bindSumbit = function() {
    $('form.comment_form').submit(function() {
      $(this).ajaxSubmit({clearForm:true,
        success: function(response) {
          $('#side_comments .no-comments').hide();
          $('#side_comments ol.comments').show().append(response);
          var commentsCount = parseInt($('#comments-count').html()) + 1;
          $('#comments-count').html(commentsCount);
          _gaq.push(['_trackEvent', 'comments', 'created']);
        },
        error:function() {
          $('#comment_body').css('border-color', 'red');
        }});
      return false;
    });
  };
  $(function() {
    self.bindSumbit();
    $('#side_viewer').bind('side-panel-reloaded', self.bindSumbit);
  });
};

var MoreLinkAction = new function() {
  var self = this;
  self.currentPage = 1;
  self.totalPages = 2;
  self.currentPaginationRequest = null;
  self.addMoreResults = function(html) {
    $('#search-results-items').append(html);
    $('#more-link-technology-loading').hide();
    if (self.currentPage < self.totalPages)
      $('a#more-link-technology-link').show();
    // show the more link - bump the page number
  };
  self.abortIfRunning = function() {
    if (self.currentPaginationRequest != null)
      self.currentPaginationRequest.abort();
    self.currentPaginationRequest = null;
  };
  self.bind = function() {
    $('#more-link-technology').bind('more-me', function() {
      if (self.currentPaginationRequest != null)
        return;
      if (self.currentPage == self.totalPages)
        return;
      self.currentPage++;
      $('#more-link-technology-loading').show();
      $('#more-link-technology-link').hide();
      var currentSearchHref = $('#search-tabs .selected a').attr('href');
      if (!currentSearchHref.match(/page=/))
        currentSearchHref = currentSearchHref + "&page=1";
      currentSearchHref = currentSearchHref.replace(/page=\d+/, "page=" + self.currentPage);
      self.currentPaginationRequest = $.get(currentSearchHref.replace('search?', "search/paginate?"), "", function(data) {
        self.addMoreResults(data);
        self.currentPaginationRequest = null;
      }, "html");
      _gaq.push(['_trackPageview', currentSearchHref]);
    });
    $('#search-scroll-pane').scroll(function() {
      var totalHeightOfItemsLoaded = $('#items-index').outerHeight()
      var lowestVisiblePixel = $(this).scrollTop() + $(this).height();
      var halfHeightOfScrollPane = $(this).height() / 2;
      var nearlyAtTheBottom = lowestVisiblePixel + halfHeightOfScrollPane >= totalHeightOfItemsLoaded;
      if (nearlyAtTheBottom)
        $('#more-link-technology').trigger('more-me');
    });
  };
  $(function() {
    self.bind();
    $('a#more-link-technology-link').live('click', function() {
      $('#more-link-technology').trigger('more-me');
      return false;
    });
  });
};

var AddToListInlineForm = new function() {
  var self = this;
  self.hasErrors = function(form) {
    var validationError = false;
    form.find('.not-blank').each(function() {
      if ($.trim($(this).val()) == "") {
        $(this).addClass('validation-error');
        validationError = true;
      }
    });
    if (validationError)
      form.find('input:visible').eq(0).focus();
    return validationError;
  };
  self.ajaxifyForms = function() {
    $('.list_to_add_to form').submit(function() {
      var form = $(this);
      if (self.hasErrors(form))
        return false;
      var params = $(this).serialize();
      if (!params.match(/format=/))
        params = params + "&format=js";
      $(this).find('input').attr('disabled', true);
      var formContainer = $(this).parents('dd');
      $.post(form.attr('action'), params, function(html) {
        if (formContainer.find('.none-yet').length == 0 && $.trim(html).length > 0) {
          formContainer.find('div.editable-list').append(", ");
        }
        formContainer.find('.none-yet').remove();
        formContainer.find('div.editable-list').append(html);
        form.find('input').removeAttr('disabled').removeClass('validation-error');
        form.find('fieldset input').val("");
        form.find('fieldset input:visible').eq(0).focus();
        _gaq.push(['_trackEvent', 'user-suggestions', 'created', 'action', form.attr('action')]);
      }, 'html');
      return false;
    });
  };
  self.hoverify = function() {
    $('div#side_details div.add_to_list').hide();
    $('div#side_details div.add_to_list').each(function(i) {
      var dd_parent = $(this).parents('dd').eq(0);
      dd_parent.mouseenter(function(e) {
        if ($(this).find('div.list_to_add_to').css('display') == 'none') {
          $(this).find('div.add_to_list').show();
        }
      });
      dd_parent.mouseleave(function(e) {
        if ($(this).find('div.list_to_add_to').css('display') == 'none') {
          $(this).find('div.add_to_list').hide();
        }
      });
    });
  };
  $(function() {
    $('.add_to_list_inline a').live('click', function() {
      $(this).parent('.add_to_list').hide();
      $(this).parent('.add_to_list').siblings('.list_to_add_to').show();
      $(this).parent('.add_to_list').siblings('.list_to_add_to').find('input:visible').eq(0).focus();
      return false;
    });
    $('.list_to_add_to a.cancel_add_to_list').live('click', function() {
      var list = $(this).parents('.list_to_add_to');
      list.hide();
      list.siblings('.add_to_list').show();
      list.find('input:focused').blur();
      list.find('input').removeAttr('disabled').removeClass('validation-error');
      return false;
    });
    self.hoverify();
    self.ajaxifyForms();
    $('#side_viewer').bind('side-panel-reloaded', self.ajaxifyForms);
    $('#side_viewer').bind('side-panel-reloaded', self.hoverify);
  });
};

var DeleteWithConfirm = new function() {
  $(function() {
    $('a.delete-after-confirm').live('click', function() {
      if (confirm(i18n.t('you_sure'))) {
        $.post($(this).attr('href'), {_method: 'delete'});
        $(this).closest('.has_deleter').remove();
      }
      return false;
    });
  });
};


var DetailsAndCommentsView = new function() {
  var self = this;
  $(function() {
    $('ul#details_and_comments li a').live('click', function() {
      $(this).parents('li').addClass('selected').siblings().removeClass('selected');
      $("div#" + $(this).attr('class')).show().siblings('div').hide();
      return false;
    });
    // self.list = $("ul#details_and_comments");
  });
  self.showComments = function() {
    $('a.side_details').parents('li').removeClass('selected');
    $('a.side_comments').parents('li').addClass('selected');
    $('div#side_details').hide();
    $('div#side_comments').show();
    _gaq.push(['_trackEvent', 'comments', 'show']);
  };
  self.showDetails = function() {
    $('a.side_details').parents('li').addClass('selected');
    $('a.side_comments').parents('li').removeClass('selected');
    $('div#side_details').show();
    $('div#side_comments').hide();
    _gaq.push(['_trackEvent', 'comments', 'hide']);
  };
};

var SearchControl = new function() {
  var self = this;
  $(function() {
    $('a.search').live('click', function(e) {
      if ($(this).attr("href").match(/q=/)) {
        var query = $(this).attr("href").split("q=")[1].split('&')[0];
        $('#q').val(decodeURIComponent(query.replace(/\+/g, " ")));
      }
      if (!$(this).hasClass('search-tab') || !$(this).closest('li').hasClass("empty")) {
        var searchHref = $(this).attr("href");
        var tabMatches = searchHref.match(/tab=([1-z]+)/);
        var tabToLoad = "tracks";
        if (tabMatches != null)
          tabToLoad = tabMatches[1];
        self.showSearchResult(searchHref, tabToLoad);
        _gaq.push(['_trackPageview', searchHref]);

      }
      e.stopPropagation();
      return false;
    });
  });

  self.updateAdvancedSearchFilters = function() {
    $('.search_option').hide();
    $('.search_options .filter-all').show();
    var visibleFiltersClass = $('#search-tabs .selected').attr('id').replace('search', 'filter');
    $('.search_options .' + visibleFiltersClass).show();
  };
  self.updateTabLinks = function(clickedHref) {
    $.each(['tracks','compositions','images','documents','articles'], function(index, type) {
      var hrefForTab = clickedHref.replace(/tab=(tracks|compositions|images|documents|articles)/, "tab=" + type);
      if (!hrefForTab.match(/tab=[a-z]+/))
        hrefForTab = hrefForTab.replace(/\?/, "?tab=" + type + "&");
      hrefForTab = hrefForTab.replace(/&page=\d+/, "");
      hrefForTab = hrefForTab.replace(/page=\d+&/, "");
      $('#search-' + type + ' a').attr('href', hrefForTab);
    });
  };
  self.showSearchResult = function(searchHref, tab) {
    MoreLinkAction.abortIfRunning();
    self.highlightTab(tab);
    $('#search-results').html('<div class="expand_vertically expand_horizontally info_box loading_info_box"><strong>&nbsp;</strong></div>');
    StackControl.showSearchLevel();
    resize_panel_internals();
    $('#search-results').load(searchHref, '', function() {
      ajax_internal_resize();
      StackControl.highlightCurrentItem($('#side_viewer .header').attr('id'));
      self.updateTabLinks(searchHref);
      MoreLinkAction.bind();
    });
  };
  self.updateCount = function(type, count) {
    var selector = '#search-' + type;
    $(selector + ' .count').html(count);
    if (count == 0)
      $(selector).addClass('empty');
    else
      $(selector).removeClass('empty');
  };
  self.updateSummary = function(message) {
    $('#Right .search_note').replaceWith(message);
  };

  self.highlightTab = function(type) {
    var tabToLoadId = "#search-" + type;
    $('#search-tabs .selected').removeClass('selected');
    $(tabToLoadId).addClass('selected');
    SearchControl.updateAdvancedSearchFilters();
  };
};

var StackControl = new function() {
  var self = this;
  var shownMedia = false;
  self.updateFullDetailsVisibility = function() {
    var sideId = $("#side_viewer .header").attr("id");
    var mainId = $(".visible-stack .header").attr("id");
    if (sideId && sideId.replace("side", "main") == mainId)
      $('##side_viewer .show-full-details').hide();
    else
      $('##side_viewer .show-full-details').show();
  };
  self.loadMediaPanel = function(link) {
    $('#search-level, #person-level').hide().removeClass('visible-stack');
    $('#media-level').addClass("visible-stack").show();
    $('#media-level').html('<div class="stack media-detail loading_animation"><strong>&nbsp;</strong></div>');
    $('#media-level').load(link.attr("href"), '', function() {
      ajax_internal_resize();
      self.updateFullDetailsVisibility();
    });
    _gaq.push(['_trackPageview', link.attr('href')]);
    if (link.hasClass('show-comments'))
      DetailsAndCommentsView.showComments();
    if (link.hasClass('show-full-details'))
      link.hide();
    shownMedia = true;
  };
  self.loadPersonPanel = function(link) {
    $('#search-level, #media-level').hide().removeClass('visible-stack');
    $('#person-level').addClass("visible-stack").show();
    $('#person-level').html('<div class="stack media-detail loading_animation"><strong>&nbsp;</strong></div>');
    $('#person-level').load(link.attr("href"), '', function() {
      ajax_internal_resize();
      self.updateFullDetailsVisibility();
    });
    _gaq.push(['_trackPageview', link.attr('href')]);
  };
  self.highlightCurrentItem = function(sidePanelId) {
    var list_panel_id = sidePanelId.replace(/side_panel/, 'list_panel');
    $('#items-index .in-side-panel').removeClass('in-side-panel');
    $('#items-index #' + list_panel_id).addClass('in-side-panel');
  };
  self.loadSidePanel = function(link) {
    var current_side_panel_id = $('#side_viewer .header').attr('id');
    var next_side_panel_id = link.attr('href').replace(/^\//, 'side_panel_').replace(/s\//, '_');
    self.highlightCurrentItem(next_side_panel_id);
    if (current_side_panel_id != next_side_panel_id) {
      var sidePanelHref = link.attr("href") + "/preview";
      $('#side_viewer').html("<div class=\"loading_animation\"><strong>&nbsp;</strong></div>");
      $("#side_viewer").load(sidePanelHref, '', function() {
        $('#side_viewer').trigger('side-panel-reloaded');
        internalResize.fix_header_and_footer_width();
        internalResize.clear_panes();
        internalResize.resize_grab_space();
        internalResize.resize_stretchers('#side_viewer');
        internalResize.reposition_elements();
        internalResize.resize_panes();
        internalResize.resize_info_boxes();
        internalResize.firefox_bug_workaround();
      });
      _gaq.push(['_trackPageview', sidePanelHref]);
      var urlPart = window.location.href.split('#')[0];
      window.location.href = urlPart + '#' + link.attr('href'); 
    }
  };
  self.removeTop = function() {
    if ($('#search-tabs').length == 0)
      window.location = '/';
    if ($('#media-level').hasClass('visible-stack')) {
      $('#media-level').removeClass('visible-stack').hide();
      $('#search-level').addClass("visible-stack").show();
    }
    if ($('#person-level').hasClass('visible-stack')) {
      $('#person-level').removeClass('visible-stack').hide();
      if (shownMedia)
        $('#media-level').addClass("visible-stack").show();
      else
        $('#search-level').addClass("visible-stack").show();
    }
    self.updateFullDetailsVisibility();
  };
  self.showSearchLevel = function() {
    shownMedia = false;
    $('#media-level, #person-level').hide().removeClass('visible-stack');
    $('#search-level').addClass("visible-stack").show();
    self.updateFullDetailsVisibility();
  };
  $(function() {
    $('a.side-preview').live('click', function(e) {
      StackControl.loadSidePanel($(this));
      e.stopPropagation();
      return false;
    });

    $('a.ajax-main-media').live('click', function(e) {
      StackControl.loadMediaPanel($(this));
      e.stopPropagation();
      return false;
    });

    $('a.ajax-main-and-side').live('click', function(e) {
      StackControl.loadMediaPanel($(this));
      StackControl.loadSidePanel($(this));
      e.stopPropagation();
      return false;
    });

    $('a.ajax-submain').live('click', function(e) {
      StackControl.loadPersonPanel($(this));
      e.stopPropagation();
      return false;
    });

    $('a.stack-close').live('click', function(e) {
      StackControl.removeTop();
      DetailsAndCommentsView.showDetails();
      ajax_internal_resize();
      e.stopPropagation();
      return false;
    });

    $('#search-results-items tr:first, #search-results-items li:first').addClass('in-side-panel');
  });
};

var Permalinkable = new function(){
  $(function(){
    var parts = window.location.href.split('#');
    if(parts.length>1){
      var anchorPart = parts[1];
      if(anchorPart.match(/^\/.*/))
        window.location.href =  anchorPart;
    }

  });
};

var SubmitLinkButton = new function() {
  var self = this;
  self.replaceSubmitInputWithStyledLink = function(parent) {
    // Faux-buttons: removes submit buttons from a div called 'save_changes' and replaces them with a link so it can be styled nicer...
    parent.find('div.save_changes input, div.next_screen_button input, div.merge_button input, input.replace').each(function() {
      var text = $(this).attr('value');
      var faux_button = $("<a>").html($('<span>').html(text));
      faux_button.attr('href', '#');
      faux_button.addClass('button icon submit_form');
      if ($(this).parents('div').eq(0).is('.next_screen_button')) {
        faux_button.addClass('icon_right_arrow');
      } else if ($(this).parents('div').eq(0).is('.merge_button')) {
        faux_button.addClass('icon_merge');
      } else if ($(this).parents('div').eq(0).is('.subscribe')) {
        faux_button.addClass('icon_asterix');
      } else if ($(this).parents('div').eq(0).is('.login')) {
        faux_button.addClass('icon_right_arrow_stopped');
      } else if ($(this).parents('div').eq(0).is('.plain_button')) {
        faux_button.removeClass('icon');
      } else {
        faux_button.addClass('icon_save');
      }
      $(this).replaceWith(faux_button);
    });

    // Turns link elements that are styled with a faux button effect submit the form they are within.
    parent.find('a.submit_form').click(function() {
      $(this).parents('form:first').submit();
      return false;
    });
  };
  $(function() {
    self.replaceSubmitInputWithStyledLink($('body'));
    $('#side_viewer').bind('side-panel-reloaded', function() {
      self.replaceSubmitInputWithStyledLink($('#side_viewer'));
    });
  });
};


$(document).ready(function() {
  $("div#Panel tbody td").live('click', function(event) {
    if ($(event.target).is('td')) {
      $(this).parent('tr').find('a:first').click();
    }
  });

  var notifications_closed_count;
  $('#notifications_pane').each(function() {
    notifications_closed_count = 0;
    var jq_obj = $(this);
    if (jq_obj.html() != "") {
      jq_obj.children('div').each(function() {
        var closer = $('<a href="#" class="close icon icon_x stealth_button"><span>Close</span></a>');
        $(this).append(closer);
        closer.click(function() {
          var parent_el = $(this).parents('div').eq(0);
          parent_el.css("display", "none");
          notifications_closed_count++;
          if (notifications_closed_count == $('#notifications_pane>div').size()) {
            $('#notifications_pane').css("display", "none");
          }
        });
      });
      jq_obj.css("display", "block");
    }
  });

  $('table#MergeConflicts tbody tr').each(function() {
    resolve_conflicts(this, 0);
  });

  function resolve_conflicts(row, side) {
    var value = "";
    $(row).find('td div.data').each(function(i) {
      if ($(this).is('.empty')) {
        // Do nothing
      } else if (value == "") {
        value = $(this).html();
      } else if (i == side) {
        value = $(this).html();
      }
    });
    value = value.replace(/\&amp\;/g, "&");
    if (!$(row).find('input, textarea').hasClass("dont-change"))
      $(row).find('input, textarea').val(value);
  }

  $('table#MergeConflicts thead input').change(function() {
    var side = $('table#MergeConflicts thead input:checked').val();
    $('table#MergeConflicts tbody tr').each(function() {
      resolve_conflicts(this, side);
    });
  });

  $('div#Panel table tbody tr:nth-child(2n+1)').addClass('odd_row');


  $('#uploaded-files-chooser li a').click(function() {
    $('#track_uploaded_media_path').val($(this).attr('data:path'));
    $('#uploaded-files-chooser li a.selectedFile').removeClass('selectedFile');
    $(this).addClass('selectedFile');
    return false;
  });
  $('#uploaded-files-chooser a.clear').click(function() {
    $('#track_uploaded_media_path').val('');
    $('#uploaded-files-chooser li a.selectedFile').removeClass('selectedFile');
    return false;
  });

  // Code to autosubmit login on enter
  $('div#Logins form input').keydown(function(e) {
    if (e.keyCode == 13) {
      $(this).parents('form').submit();
    }
  });
});

var Autocompletion = new function() {
  var self = this;
  $(function() {
    self.bind($('body'));
  });
  self.bind = function(selector) {
    selector.find('input.person_autocomplete').autocomplete('/people/autocomplete.js');
    selector.find("input.person_autocomplete").result(function(event, data, formatted) {
      if (data) {
        $(this).closest('fieldset, form').find('input.person_autocomplete_value').val(data[1]);
      }
    });
    selector.find('input.instrument_autocomplete').autocomplete('/instruments.js');
    selector.find("input.instrument_autocomplete").result(function(event, data, formatted) {
      if (data) {
        $(this).closest('fieldset, form').find('input.instrument_autocomplete_value').val(data[1]);
      }
    });
    selector.find('input.composition_autocomplete').autocomplete('/compositions/autocomplete.js');
    selector.find("input.composition_autocomplete").result(function(event, data, formatted) {
      if (data) {
        $(this).closest('fieldset, form').find('input.composition_autocomplete_value').val(data[1]);
      }
    });
    selector.find('#add-keywords-form input#tag').autocomplete('/tags/autocomplete.js');
    selector.find("#add-keywords-form input#tag").result(function(event, data, formatted) {
      if (data) {
        $(this).val(data[0]);
      }
    });
  };
};

function addNestedAttributes(selector) {
  var cloned = $(selector + ' fieldset:last').clone(false);
  var idSalt = new Date().getTime();
  cloned.find("label").each(function() {
    $(this).attr('for', $(this).attr('for').replace(/_\d+_/, "_" + idSalt + "_"));
  });
  cloned.find("input").each(function() {
    $(this).val('');
    $(this).attr('id', $(this).attr('id').replace(/_\d+_/, "_" + idSalt + "_"));
    $(this).attr('name', $(this).attr('name').replace(/\[\d+\]/, "[" + idSalt + "]"));
  });
  cloned.appendTo($(selector));
  Autocompletion.bind(cloned);
}

var AddToPlaylist = new function() {
  var self = this;
  self.bind = function() {
    $('div#AddToPlaylistSelection select option:selected').addClass('default');
    $('a.button.add_to_playlist').click(function(e) {
      self.togglePlaylistSelection();
      return false;
    });

    $('div#AddToPlaylistSelection span.or_cancel_group a').click(function(e) {
      self.togglePlaylistSelection();
      self.cancelNewPlaylistInput();
      return false;
    });

    $('div#AddToPlaylistSelection select').change(function(e) {
      if ($(this).val() === 'new') {
        $(this).val($(this).find('option.default').attr('value'));
        $('#playlist_item_playlist_id').attr('disabled', 'disabled').hide();
        $("#playlist_name").removeAttr('disabled').show().focus();
      }
    });

    $('div#AddToPlaylistSelection a.button').click(function(e) {
      var select_box = $('#playlist_item_playlist_id');
      var input_field = $('#playlist_name');
      if ( ( select_box.is(':disabled') && ( input_field.val() == '' ) ) || ( !(select_box.is(':disabled')) && ( select_box.val() == '' ) ) ) { return false; } // Do nothing if blank value is selected
      $('#AddToPlaylistInProgress, #AddToPlaylistSelection form').toggle();
      $.ajax({
        url: $('div#AddToPlaylistSelection form').attr('action'),
        type: "POST",
        data: $('div#AddToPlaylistSelection form').serialize(),
        success: function(response) {
          if(!(input_field.is(':disabled'))){
            var currentCount = parseInt($('#PlaylistsCount em').html());
            $('#PlaylistsCount em').html(currentCount + 1);
          }
          $('#AddToPlaylistInProgress').hide();
          $('#AddToPlaylistSelection form').show();
          self.cancelNewPlaylistInput();
          self.togglePlaylistSelection();
          $('#TrackPlaylists').replaceWith(response);
        }
      });
      _gaq.push(['_trackEvent', 'playlist', 'add', 'track', $('#playlist_item_track_id').val()]);
      return false;
    });
  };
  self.togglePlaylistSelection = function() {
    $('div#AddToPlaylistSelection').parents('div.footer').eq(0).toggleClass('opened_playlist_select');
  };
  self.cancelNewPlaylistInput = function() {
    $('#playlist_item_playlist_id').removeAttr('disabled').show();
    $("#playlist_name").attr('disabled', 'disabled').hide().val('');
  };

  $(function() {
    self.bind();
    $('#playlist_item_playlist_id').removeAttr('disabled');
    $('#side_viewer').bind('side-panel-reloaded', self.bind);
  });
};
