/* TAGGING DIALOGS */
var Tag = {
  observe: function(anchor) {
    anchor.onclick = function() { Tag.toggle(anchor); return false; }
    return anchor;
  },

  add: function(prefix, tag) {
    var container = $(prefix + '-tags');
    return container ? container.appendChild(this.observe($B('a', {href: '#', id: prefix + '-tag-' + tag.id}, tag.name))) : null
  },

  addCurrent: function(tag) {
    return this.add('current', tag);
  },

  addExisting: function(tag) {
    var anchor = this.add('existing', tag);
    if(anchor && !$('current-tag-' + tag.id)) anchor.addClassName('deleted');
    return anchor;
  },

  toggle: function(anchor) {
    var tag      = this.getTag(anchor);
    var current  = $('current-tag-' + tag.id);
    var existing = $('existing-tag-' + tag.id);
    [current, existing].compact().each(function(anchor) {
      anchor.hasClassName('deleted') ? anchor.removeClassName('deleted') : anchor.addClassName('deleted')
    })
    if(current && current.hasClassName('added') && current.hasClassName('deleted')) {
      current.parentNode.removeChild(current);
    } else if(existing && !current) {
      current = this.addCurrent(tag);
      current.addClassName('added'); 
    }
  },
  
  getTag: function(anchor) {
    return { id: anchor.id.match(/-tag-(\d+)/)[1], name: anchor.innerHTML.strip() };
  },
  
  save: function(baseUrl) {
    var deleted = $$('#current-tags a.deleted').collect(function(anchor) { return Tag.getTag(anchor).id; });
    var added   = $F('new-tag').split(',').collect(function(t) { return t.length > 0 ? t.strip() : null }).compact();
    $$('#current-tags a.added').each(function(anchor) {
      added.push(Tag.getTag(anchor).name);
    });

    $('new-tag').value = '';

    var qs = [(deleted.length == 0) ? null : deleted.toQueryString('delete'),
              (added.length   == 0) ? null : added.toQueryString('add')].compact().join("&");
    if(qs == '') return;

    new Ajax.Request(baseUrl, {parameters: qs + '&_method=put'});
    Dialog.current.close()
  }
}

Dialog.Tag = Class.create();
Object.extend(Object.extend(Dialog.Tag.prototype, Dialog.Base.prototype), {
  existingTags: [],
  currentTags: {},
  
  setContents: function() {
    var cancelButton = $B('a', {className: 'cancel', href: '#'}, 'cancel');
    cancelButton.onclick = function() { Dialog.current.close(); return false; }
    
    var form = $B('form',
      {id: 'tag-edit'}, [
      $B('h3', 'Current Tags'),
      $B('div', {id: 'current-tags', className: 'tag-list'}),
      $B('p', [
        $B('input', {type: 'text', id: 'new-tag'}), 
        $B('input', {type: 'submit', value: 'Save'}), ' or ', cancelButton
      ]),
      $B('h3', 'Existing Tags'),
      $B('div', {id: 'existing-tags', className: 'tag-list'}),
      $B('p', ['Seperate tag names with commas: ', $B('em', "'burning man, festival'")])
    ]);
    
    form.onsubmit = function() { Tag.save(Dialog.current.options.baseUrl); return false; }
    this.dialogBox.appendChild($B('h1', [
      'Edit Tags',
      $B('img', {src:'/images/spinner_mac.gif', id: 'tag-edit-spinner'})
    ]));
    this.dialogBox.appendChild(form);
    
    new Ajax.Request(this.options.baseUrl);
  }
});