function Favourite(url, task) {
  var method;

  window.fave = this;

  if(task == "add-favourite") {
    method = "get";
  } else {
    method = "post";
  }

  this.ui = new Modal('new-favourite');    
  this.ui.retrieveContent(url, method);

}

Favourite.prototype.setFormListener = function() {

  var form = this.ui.element.getElementsByTagName("form")[0];
  var cancelButton = form.getElementsByTagName("a")[0];

  var modal = this.ui;
  Element.extend(form);

  if(!form.hasClassName('sticky-flow')) {
    form.onsubmit = function() {
      modal.setLoadStatus(true);

      new Ajax.Request(form.action,
        {
            method: "post",
            asynchronous:true,
            evalScripts:true,
            parameters:Form.serialize(form)
        });
      return false;
    }
  }

  cancelButton.onclick = function() {
    modal.close();
  }

}

Favourite.prototype.setCloseListener = function() {
  var closeButton = this.ui.element.getElementsByTagName("a")[0];
  var modal = this.ui;
  closeButton.onclick = function() {
    modal.close();
  }
}

function InitializeFavourite(e) {
    e = e || window.event;
    this.element = e.currentTarget || e.srcElement;
    Element.extend(this.element);

    if(this.element.hasClassName('blocked')) {
      return false;
    }

    var availableTask = (this.element.hasClassName('add-favourite') ? 'add-favourite' : 'remove-favourite');
    var fave = new Favourite(this.element.href, availableTask);

    return false;
}


var newFavouriteEvent = Behavior.create({
  onclick: InitializeFavourite
});
Event.addBehavior({ 'a.add-favourite'    : newFavouriteEvent });
Event.addBehavior({ 'a.remove-favourite' : newFavouriteEvent });

var newFavouriteHighlight = Behavior.create({
  initialize: function() {
    this.element.pulsate({ pulses: 3, duration: 1.6 });
  }
});
Event.addBehavior({ 'ul.show-favourite-entity-options' : newFavouriteHighlight });

// for hiding a favourited entity when removing 
function HideRemovedFavourite(entityType, entityID) {
  var favourite = document.getElementById(entityType + "-" + entityID);
  Element.extend(favourite);
  var favouriteOptions = (favourite.next() && favourite.next().hasClassName('favourite-entity-options')) ? favourite.next() : null;
  var elementsToRemove = new Array;
  elementsToRemove.push(favourite);
  if(favouriteOptions) {
    elementsToRemove.push(favouriteOptions);
  } 
  for(var i = 0; i < elementsToRemove.length; i++) {
    var currentElement = elementsToRemove[i];
    (function() {
      currentElement.addClassName('removed');
      currentElement.fade({afterFinish: function() { ResetBragLayout() }});
    })();
  }
  // fix the tiled layout for brags
  function ResetBragLayout() {
    if(entityType == "brag") {
      var brags = document.getElementById('favourite-brags-container').getElementsByTagName('li');
      var favouriteBragCount = 0;
      for(var i = 0; i < brags.length; i++) {
        var currentBrag = brags[i];
        (function() {
          if(!currentBrag.hasClassName("removed")) {
            favouriteBragCount++;
            if(favouriteBragCount % 4 == 0) {
              currentBrag.className = "brag last";
            } else {
              currentBrag.className = "brag";
            }
          }
        })();
      }
    }
  } 
}


var loadFavouriteList = Behavior.create({
    onclick: function() {
      if(this.element.alreadyLoaded != true) {
        var anchor = this.element.href.lastIndexOf('#');
        if(anchor != -1) {
            clean_href = this.element.href.substring(0,anchor);
        } else {
            clean_href = this.element.href;
        }
        new Ajax.Request(clean_href, 
          {
              method: "get",
              asynchronous:true, 
              evalScripts:true
          }
        );
        this.element.alreadyLoaded = true;
      }
      preview_all = false;
      return false;
    }
});
Event.addBehavior({ 'a.fave-has-ajax' : loadFavouriteList });
Event.addBehavior({ 'ol.favourites-pagination a'  : loadFavouriteList });

function toggleFavouriteOptions(button) {
  var button = button;
  var dares = $('favourite-dares');
  var bragsters = $('fan-of');

  function iterateFields(fields) {
    for(var i = 0; i < fields.length; i++) {
      (function() {
        var field = fields[i];
        toggleElement(field);
      })();
    };
  };

  button.onclick = function() {
    if(button.hasClassName('edit-favourite')) {
      if(button.hasClassName('favourite-dare')) {
        entity_id = button.id.replace("open-dare-options-", "");
        target = $("dare-options-" + entity_id);
        toggleElement(target);
      } else if(button.hasClassName('favourite-bragster')) {
        entity_id = button.id.replace("open-bragster-options-", "");
        target = $("bragster-options-" + entity_id);
        toggleElement(target);
      };
    } else if(button.hasClassName("edit-all")) {
      if(!dares.hasClassName("hide")) {
        var fields = dares.select('ul.favourite-entity-options');
        iterateFields(fields);
      } else if(!bragsters.hasClassName("hide")) {
        var fields = bragsters.select('ul.favourite-entity-options');
        iterateFields(fields);
      };
    };
    return false;
  };
};
var toggleFavouriteOptionsListener = Behavior.create({
  initialize: function() { new toggleFavouriteOptions(this.element); }
});
Event.addBehavior({ 'body#manage-favourites a.edit-favourite' : toggleFavouriteOptionsListener });
Event.addBehavior({ 'body#manage-favourites a.edit-all' : toggleFavouriteOptionsListener });

