$.fn.autoclose = function()
{
  return $(this).each(function(){
    if ($(this).find(':checkbox.autoclose').is(':checked'))
    {
      $(this).closest('.slide-panel').hideSheet();
    }
  });
};

$.fn.slideAndFadeOut = function(callback)
{
  return $(this).each(function(){

    var element = $(this);
    element
      .css('min-width', '0')
      .css('min-height', element.height())
      .animate(
        {width: "0"},
        {
          queue: false,
          duration: "normal",
          complete: function(){
            element.remove();
            $('.image-browser').change();

            if (callback)
            {
              callback.call(element);
            }
          }
        })
       .fadeOut()
      .end();
  });
};

function resize_image(user_image, to_size)
{
  user_image.width(to_size).height(to_size * 3/4);
}

function show_image_details(image)
{
  var image_url = image.attr('rel');

  $.get(image_url, null, function(data, status){

    var content = $(data).imageDetailViewer();
    $('.slide-dialog-container').setSheetContent(content);
  });
}

function file_exists(filename)
{
  var file_exists = false;
  $.ajax({
    async: false,
    dataType: "json",
    url: '/image/' + filename + '/exist',
    success: function(data) {
      console.log("File " + filename + " exists? => " +  data);
      file_exists = data;
    }
  });
  return file_exists;
}

function upload_user_image()
{
  var upload = $('.image-upload-container').showSheet();

  var form = upload.find('form');
  form.ajaxForm({
    dataType: 'html',
    beforeSubmit: function()
    {
      //TODO: set upload button to progress animation
      upload.find(':submit').attr('disabled', 'disabled');
      var filename = upload.find(':file').val();

      if (file_exists(filename))
      {
        return this._image_overwritten = confirm("The file already exists, do you want to overwrite the existing file?");
      }
    },
    complete: function(){
      //TODO: set animation back
      form.find(':submit').removeAttr('disabled');
      form.autoclose();
    },
    success: function(data)
    {
      if (!or.admin.has_errors(data))
      {
        form.find('form').resetForm();
        form.find(":file").val("");

        if (!this._image_overwritten) {
          var new_image = $(unescape(data)).hide();

          // resize image based on silder value
          var size = $('.slider').slider('value');
          resize_image(new_image, size);

          new_image.userImage();
//          new_image.hide().insertBefore($('.image-browser .user-image:first')).animate({width: size}, 1500, "linear", function(){
//            $('.image-browser').change();
//          });
          new_image.appendTo($('.image-browser')).fadeIn(function() {
            $('.image-browser').change();
          });
        }
      }
    }
  });
}

function new_album()
{
  $.get("/albums/new", null, function(data, status){
    var content = $("<div></div>").html(data).find('form').ajaxForm({
      dataType: 'json',
      success: function(data, status){
        var album_url = '/albums/' + data.album.permalink_id;
        $('.album-selector').append( $("<option></option>").val(album_url).text(data.album.name) );
        content.autoclose();
      }
    });

    $(".slide-dialog-container").setSheetContent(content);
  });
}

function select_album(callback)
{
  if ($('.album-selector option').size() == 1)
  {
    select_new_album(callback);
  }
  else
  {
    select_existing_album(callback);
  }
}

function select_new_album(callback)
{
  $.get('/albums/new', null, function(data, status){
    var form = $(data).ajaxForm({
      dataType: 'json',
      success: function(data, status){
        var album_url = "/albums/" + data.album.permalink_id;
        $('.album-selector').append( $("<option></option>").val(album_url).text(data.album.name) );
        callback.call(form, album_url);
      }
    });

    $('.slide-dialog-container').setSheetContent(form);
  });
}

function select_existing_album(callback)
{
  $.get('/albums/list', null, function(data, status){

    var form = $(data).submit(function(){
      var selected_album = $(this).find(':selected').val();
      callback.call(form, selected_album);
      return false;
    });
    $('.slide-dialog-container').setSheetContent(form);
  }, "html");
}

function add_images_to_album(images, to_album)
{
  $(images).each(function(i, image){
    add_image_to_album(image, to_album);
  });
  
  //clear checkboxes
  unlock_image_selection(images);
}

function unlock_image_selection(images)
{
  if ($(images).length > 0)
  {
    $('.user-image')
      .find('.toolbar :checkbox')
        .removeAttr('disabled')
        .removeAttr('checked');
  }
}

function lock_image_selection(images)
{
  if ($(images).length == 0)
  {
    alert("No images were selected. Please select at least one image");
    return false;
  }

  $(".user-image").find('.toolbar :checkbox').attr('disabled', true);
  return true;
}

function add_image_to_album(image, to_album)
{
  console.log($(image).attr('rel'));
  console.log(to_album);
  console.log("Adding " + $(image).attr('rel') + " to album " + to_album);

  var post_url = to_album + $(image).attr('rel') + '/add';

  $.ajax({
    async: false,
    url: post_url,
    dataType: "text",
    data: { '_method': 'put', "authenticity_token": form_authenticity_token, 'album_id': to_album},
    type: "POST",
    success: function(data, status){
      if (or.admin.has_errors(data))
      {
        console.log(data);
      }
    }
  });
}

function reorder_image_in_album(image, to_index)
{
    if (to_index > 0)
    {        
      var album = selected_album();
      var album_image_url = album + image.attr('rel') + '/move';

      console.log("Moving image " + $(image).attr('rel') + " in " + album + " to " + to_index);
      $.post(album_image_url,
      {
          '_method': 'put',
          'authenticity_token': form_authenticity_token,
          'to_index': to_index
      },
      function(data, status){
        console.log(data);
        console.log(status);
      });
      return true;
    }
    return false;
}

function delete_images_from_album(selected_images)
{
  $(selected_images).each(function(i, image){
    delete_image_from_album(image, function(){
      $(image).closest('.user-image').slideAndFadeOut();
    });
  });
}

function delete_image_from_album(image, callback)
{
  var album_image_url = ($(image).attr('rev') || $(image).attr('href')) + '/remove';

  console.log("Destroying relationship " + $(image).attr('rev') + " from " + $(image).attr('rel'));

  $.ajax({
    async: false,
    url: album_image_url,
    dataType: "text",
    data: { '_method': 'delete', "authenticity_token": form_authenticity_token },
    type: "POST",
    success: callback
  });
}

function delete_images_from_account(selected_images)
{
  delete_resources(selected_images, ".user-image", "This cannot be undone! Do you want to remove the " + selected_images.length + " selected images from your account?", function(){
    selected_images.each(function(i, image){
      $(image).closest('.user-image').slideAndFadeOut();
    });
  });
}

function delete_image_from_account(image)
{
  delete_resource(image, ".user-image", "This cannot be undone! Do you want to remove this image from your account?", function() {
    $(image).closest('.user-image').slideAndFadeOut();
  });
}

function delete_album_from_account(album_name, album_url)
{
//  $("<div></div>").text("Are you sure you want to delete the '" + album_name + "' album?")
//    .dialog({modal: true, resizeable: false, title: "Delete Album?"});
  
  $.prompt("Are you sure you want to delete the " + album_name+ " album?",
      { buttons: {Yes: true, No: false}, callback: function(confirmed, promptDialog, f){
        if (confirmed) {
          $.post(album_url,
            {
              '_method': 'delete',
              "authenticity_token": form_authenticity_token
            },
            function(data, status){
              console.log("Redirecting to " + data.redirect_to);
              window.location.href = data.redirect_to;
            },
            "json");
        }
      }
    });
}

function update_album(album_data, status)
{
  console.log(album_data);
  $('.album-name').text(album_data.name);
  album.text(album_data.name);
}

function rename_album(album_url)
{
  if (album_url == "")
  {
    alert("can't rename the All Images item");
    return;
  }

  $.get(album_url + '/edit', null, function(data, status){
    var content = $(data).ajaxForm({
      dataType: 'json',
      success: function(data, status){
        if (!or.admin.has_errors(data))
        {
          console.log("album at "+ album_url +" renamed to " + data.album.name);
          $('.album-name').fadeOut(function(){
            $('.album-selector option[value=' + album_url + ']').text(data.album.name);
            $(this).text(data.album.name).fadeIn();
          });
        }
        content.autoclose();
      }
    });

    $('.slide-dialog-container').setSheetContent(content);
  },
  "html");
}

function update_image_browser_with_album(selected_album)
{
  $('.slide-panel').hideSheet();
  var album_path = selected_album.val();
  if (album_path != "")
  {
    window.location.href = album_path + '/browse';
  }
  else
  {
    window.location.href = "/images/all"
  }
}

function selected_images()
{
  return $(".user-image:has(:checkbox:checked) img[rel]");
}

function selected_album()
{
  return $('#current-album').text();
}

function selected_album_name()
{
  return $('.album-name').text();
}

function reset_action_selector()
{
  $('.album-actions :selected')
      .removeAttr('selected')
      .find(":first-child").attr("selected", "selected");
}

$(function(){
  // page plugin syntax for groups of markup defining controls
  $('.toolbar:has(.album-name)').mainToolbar();
  $(".album-selector").albumSelectionFilter();
  $('.album-actions').albumActions();
  $(".image-browser").imageBrowser();
  $(".image-upload-container, .slide-dialog-container").slidesheet();
});

(function($){
  var dragging_user_image = false;
  // control wireups connecting proper events with handling functions
  var image_browser_sorting_options = {
    containment: 'parent',
    items: '.user-image',
    placeholder: 'hilight',
    revert: true,
    //tolerance: 'pointer',
    start: function(event, ui){
      dragging_user_image = true;
      ui.item.css('opacity', .6);
      console.log(ui.item);
      
      ui.placeholder.width( ui.item.width() ).height( ui.item.outerHeight() );
      ui.placeholder.text( placeholderIndex(ui) );
    },
    stop: function(event, ui){
      dragging_user_image = false;
      ui.item.animate({opacity: 1}, 600);

      var items = ui.item.parent().children().not('.toolbar').not('.empty-album');
      var new_index = items.index(ui.item);
      
      var keep_new_order = reorder_image_in_album(ui.item.find('img.main'), new_index);
      if (!keep_new_order)
      {
        $(this).sortable('cancel');
      }
    },
    change: function(event, ui){
      var number = placeholderIndex(ui);
      console.log("Placeholder index calculated: " + number);
      ui.placeholder.text(number);
    }
  };

  function albumItemsFor(image)
  {
    return image.siblings().not(".toolbar").not('.empty-album');
  }
  function placeholderIndex(ui)
  {
    var find_index_for = ui.placeholder;

    //var collection = item.siblings().not(".toolbar").not('.empty-album');
    var collection = albumItemsFor(ui.item);
    return collection.index(find_index_for) + 1;
  }
  var lightbox_options = {
       imageLoading: '/images/plugins/lightbox-ico-loading.gif',
       imageBtnPrev: '/images/plugins/lightbox-btn-prev.gif',
       imageBtnNext: '/images/plugins/lightbox-btn-next.gif',
       imageBtnClose: '/images/plugins/lightbox-btn-close.gif',
       imageBlank: '/images/plugins/lightbox-blank.gif',
       fixedNavigation: false
      };

  $.fn.extend({

    mainToolbar: function(){
      $(this).find('.new-image').click(function(event) { upload_user_image(); return false; });
      $(this).find(".new-album").click(function(event) { new_album(); return false; });
    },
    albumActions: function(){
      
      return $(this).each(function(){
        $(this).submit(function(){ return false; })
            .change(function(){
              var selected_action = $(this).find(":selected");
              console.log("-> selected " + selected_action.val());

              var images = selected_images();
              switch( selected_action.val() ){
                case "add_images_to_album":

                  if (lock_image_selection( images ))
                  {
                    select_album(function(selected_album){
                      add_images_to_album(images, selected_album );
                      $(this).autoclose();
                    });
                  }
                  break;
                case "rename_album":                rename_album( selected_album() ); break;
                case "delete_images_from_album":    delete_images_from_album( images ); break;
                case "delete_images_from_account":  delete_images_from_account( images ); break;
                case "delete_album_from_account":   delete_album_from_account( selected_album_name(), selected_album() ); break;
                default:
                  console.log("Unknown Action: " + selected_action.val());
              };
              reset_action_selector();
            });
      });
    },
    albumSelectionFilter: function(){
      return $(this).each(function(){
        $(this).find("option[value=" + selected_album() + "]").attr('selected', 'selected');
        $(this).submit(function() { return false; })
               .change(function() { update_image_browser_with_album($(this).find(":selected")); });
      });
    },
    userImage: function(){
      return $(this).find('div:has(img.main)').click(function(){
          if (dragging_user_image) return;

          $('.user-image').removeClass('selected');
          $(this).closest('.user-image').addClass('selected');
          show_image_details($(this).find('img.main'));
        });
    },
    imageBrowser: function(){
      return $(this).each(function(){

        $(this).find('.user-image').userImage();

        if ( selected_album() )
        {
          $(this).sortable(image_browser_sorting_options);
        }
        $(this).find(".slider")
          .slider({
            min: 100, max: 300, step: 10,
            slide: function() {
              var slider_value = $(this).slider('value');
              $('.user-image').each(function(){
                resize_image($(this), slider_value);
              });
            }
          });

        //initialize slider position based on the width of a user-image
        if ($('.user-image:first').length > 0)
        {
          $(this).find('.slider').slider('value', $('.user-image:first').width());
        }

        var check_browser_for_content = function() {

          console.log('looking for user images');
          if ($(this).find('.user-image').length > 0)
          {
            $(this).find(".empty-album").fadeOut();
          }
          else
          {
            console.log("No User images found");
            console.log($(this).find('.empty-album'));
            $(this).find('.empty-album').fadeIn();
          }
        };
        $(this).change(check_browser_for_content).change();

      });
    },
    imageDetailViewer: function(){
      return $(this).each(function(){
        
        var form =
            $(this)
            .ajaxForm({
              dataType: 'json',
              success: function(){
                form.autoclose();
              }
            })
            .find('.delete-image-from-album').click(function() {
              console.log(this);
              var $this = $(this);
              delete_image_from_album(this, function(){
                //remove item from list in detail view
                $this.closest('.album').fadeOut(function(){
                  var album_list = $(this).closest('.albums');
                  if (album_list.find('ul').children(':visible').size() == 0){
                    album_list.fadeOut();
                  }
                });
                //if album is currently displayed album, remove from image browser
                var current_album = selected_album();
                if (current_album !== "" && $this.attr('href').match(current_album) != null)
                {
                  var user_image = $('.image-browser .user-image:has(img[rel=' + $this.attr('rel') + '])');
                  user_image.fadeOut(function(){
                    user_image.remove();
                    $('.image-browser').change();
                  });
                }
              });
              return false;
            }).end();
      });
    }
  });

})(jQuery);
