(function($){
  $.fn.linkize = function(settings){

    return $(this).each(function(){
      var link_container = $(this);
      
      //console.log("Linkizing: " + $(this).find('> a').text());
      
      $(this).find('.edit-menu').menufy({ target: '.link-menu', parent: '.bundle' });
      $(this).find('a.edit-link').click(function(event){ return link_dialog(link_container, $(this).attr('href'), "Edit link", edit_link); });
      $(this).find('a.delete-link').bind('click', function(){ delete_link($(this)); return false; });

    });
    
  };
})(jQuery);

var was_dragged = false;
$(function(){

  $('.link').linkize().children('a')
    .click(function(){ 
        console.log("clicked: " + this);
        console.log("-> was dragged: " + was_dragged);

        if (was_dragged){
            was_dragged = false;
            return false;
        }
        return true;
    });

  $('.links').sortable(link_sorting_options);
});


function make_links_sortable_for(bundle){
  $(bundle).find('.links').sortable(link_sorting_options);
}

function move_link(moved_link, to_bundle_id, to_index_in_bundle) {
  console.log("Moving link to index="+ to_index_in_bundle + " in bundle=" + to_bundle_id);
  console.log(moved_link);
  
  $.post(moved_link.attr('rel') + '/move',
    {
      "_method": "post",
      "authenticity_token": form_authenticity_token,
      "display_order": to_index_in_bundle,
      "bundle_id": to_bundle_id
    },
    function(data, status){
      console.log("Moved link");
      console.log(data);
    }
  );
}

function add_link(link_data, status, source, dialog){

  if (!or.admin.has_errors(link_data)) {
    
    var bundle = $('#bundle_' + link_data.link.bundle_id);

    var link = $("<li></li>").addClass('link').hide().appendTo(bundle);
    link.load("/links/" + link_data.link.id, 
      function(){
        link.linkize().fadeIn();
        dialog.dialog('close');
      });
  }
}

function edit_link(link_data, status, source, dialog) {

  if (!or.admin.has_errors(link_data)) {
    dialog.dialog('close');
    
    var link = source.find('a#link_' + link_data.link.id);
    
    link.fadeOut(function(){
      link.attr("href", link_data.link.url);
      link.attr("title", link_data.link.description);
      link.text(link_data.link.display_text);
      
      link.fadeIn();
    });    
  }
}

//TODO: use delete_resource("Are you sure you want to delete this link?", deleted_link, ".link")
function delete_link(deleted_link) {
  if (confirm("Are you sure you want to delete this link?")) {
    $.post(
      deleted_link.attr('rel'), 
      {
        '_method': 'delete',
        "authenticity_token": form_authenticity_token
      }
    );  
    
    deleted_link.closest(".link").fadeOut(function(){
      $(this).remove();
    });
  }
}


var link_selector = "> a";
var start_index;
var start_bundle;

var link_sorting_options = { 
  connectWith: '.links', 
  placeholder: 'ui-state-highlight',
  items: '.link',
  revert: true,
  start: function(event, ui){
    was_dragged = true;
    
    var link = ui.item.find( link_selector );
    start_bundle = get_bundle(link);
    start_index = get_link_index_in_bundle(ui.item, start_bundle);
    
    console.log("Grabbed: " + link.text() + "[" + start_index + "] in bundle " + start_bundle.attr('id'));
    
    $(ui.placeholder).height(ui.item.height()).width(ui.item.width());
    
    $('ul.links')
      .addClass('droppable-link-target')
      .css('min-height', ui.item.height())
      .css('min-width', ui.item.width());

  },
  stop: function(event, ui){

    var link = ui.item.find( link_selector );
          
    var to_bundle = get_bundle(link);
    var to_index = get_link_index_in_bundle(ui.item, to_bundle);
    
    console.log("Dropped: " + link.text() + "[" + to_index + "] in bundle " + to_bundle.attr('id'));
    
    if (start_index == to_index && get_bundle_id(start_bundle) == get_bundle_id(to_bundle)) {
      console.log("not moving link");
    }
    else {
      move_link(link, get_bundle_id(to_bundle), to_index);
    }
    
    $('ul.links')
      .removeClass('droppable-link-target')
      .css('min-height', 'auto')
      .css('min-width', 'auto');

  }
};

function get_link_index_in_bundle(link, bundle){
  return bundle.children().index(link.get(0)) + 1;
}

function get_bundle(for_link){
  var bundle = $(for_link).closest('.links');
  if (bundle.length == 0) {
    return $(for_link).closest('.link-group').find('.links');
  }
  return bundle;
}

function get_bundle_id(for_bundle){
  return for_bundle.attr('id').replace(/bundle_/, '');
}

var link_dialog_options = {dialogClass: 'edit-link', draggable: false, resizable: false, modal: true, width: "360px"};

function link_dialog(source, content_url, title, callback){

  $.get(
    content_url, 
    function(data, textStatus){
      
      var dialog = $("<div></div>")
        .html(data)
        .dialog($.extend(link_dialog_options, {title: title}));
      
      var form = dialog.find('form');
      
      initialize_link_edit_form(form, source);
      
      form.ajaxForm({
        dataType: "json", 
        success: function(data, status){ callback(data, status, source, dialog); }
      });
    },
    'script');
    
    return false;
}


//TODO: Use plugin syntax also
function initialize_link_edit_form(form, source_link) {
  var to_bundle = get_bundle_id(get_bundle(source_link));
  
  console.log("Initializing link edit form");

  form
    .find("input:radio").click(function(){
      form.find('#link_type #' + $(this).val())
        .siblings().hide()
        .end()
      .show();
    });

  form.find('input:hidden[id$=bundle_id]').val(to_bundle);

};