var object_images = new Array();
var current_image_index = 0;
var current_zoom_level = 'standard';

// function ObjectImage(id, filename, date, credit, description, date_added) {
//
var OCImage = new Class({
  initialize: function(params) {
    $extend(this, params);
  },

  getDateFormatted: function() {
    return this.date.dateFormat(OBJECT_IMAGE.DATE_FORMAT.DATE);
  },

  getDateAddedFormatted: function() {
    return this.date_added.dateFormat(OBJECT_IMAGE.DATE_FORMAT.DATE_ADDED);
  }
});

var ObjectImage = new Class({
  Extends: OCImage,

  getUrl: function() {
    return OBJECT_IMAGE.BASE_URL.STANDARD + "/" + this.filename;
  },

  getFullUrl: function() {
    return OBJECT_IMAGE.BASE_URL.FULL + "/" + this.filename;
  }

});

ObjectImage.getById =  function(id) {
  for(var i=0;i<object_images.length;i++) {
    if(object_images[i].id==id) {
      return object_images[i];
    }
  }
};

var ExhibitionImage = new Class({
  Extends: OCImage,

  getUrl: function() {
    return EXHIBITION_IMAGE.BASE_URL.STANDARD + "/" + this.filename;
  },

  getFullUrl: function() {
    return EXHIBITION_IMAGE.BASE_URL.FULL + "/" + this.filename;
  }

});

ExhibitionImage.getById = function(id) {
  for(var i=0;i<exhibition_images.length;i++) {
    if(exhibition_images[i].id==id) {
      return exhibition_images[i];
    }
  }
};

/*
ObjectImage.prototype.getDateAddedFormatted = function() {
  return this.date_added.dateFormat(OBJECT_IMAGE.DATE_FORMAT.DATE_ADDED);
}

ObjectImage.prototype.getUrl = function() {
  return OBJECT_IMAGE.BASE_URL.STANDARD + "/" + this.filename;
}

ObjectImage.prototype.getFullUrl = function() {
  return OBJECT_IMAGE.BASE_URL.FULL + "/" + this.filename;
}

ObjectImage.getById = function(id) {
  for(var i=0;i<object_images.length;i++) {
    if(object_images[i].id==id) {
      return object_images[i];
    }
  }
}
*/

function showObjectImage(index) {
  if(object_images.length <= index) return;

  current_image_index = index;

  _updateObjectImage();
}

function zoomMainImage(level) {
  current_zoom_level = (typeof level == 'undefined')?'full':'standard';

  _updateObjectImage();
}

function _updateObjectImage() {
  var main_image = document.getElementById("main-image");
  var source = null;

  var img = object_images[current_image_index];

  switch(current_zoom_level) {
    case 'full': source = img.getFullURL(); break;
    default: source = img.getURL(); break;
  }
  main_image.src = source;

  document.getElementById("main-image-filename").innerHTML = img.filename;
  document.getElementById("main-image-credit").innerHTML = img.credit;
  document.getElementById("main-image-description").innerHTML = img.description;
  document.getElementById("main-image-date").innerHTML = img.getDateFormatted();
}


function parseSQLDate(sql_date) {
  var parts = sql_date.split('-');
  var year = parts[0];
  var month = parts[1];
  var day = parts[2];

  var ret = new Date();
  ret.setYear(year);
  ret.setMonth(month-1);
  ret.setDate(day);

  return ret;
}

// This causes text inputs with class text-input-tip to cause their current value 
// to be displayed as a 'tip', like "enter accession number here", which is cleared
// on focus (and restored if user doesn't enter anything)
window.addEvent('domready', function() {
  $$('.text-input-tip').each(function(el) {
    var _orig_value = el.value;

    el.addClass('text-input-tip-active');

    el.addEvent('focus', function(e) {
      if(e && e.target) {
        if(e.target.value==_orig_value) {
          el.removeClass('text-input-tip-active');
          e.target.value = '';
        }
      }
    });

    el.addEvent('blur', function(e) {
      if(e && e.target) {
        if(e.target.value=='') {
          e.target.addClass('text-input-tip-active');
          e.target.value = _orig_value;
        }
      }
    });
  });

  new Asset.css('/css/opencollection-script-only.css');
});

window.addEvent('domready', function() {

  if($('exhibition-timeline')) {
    var div = $('exhibition-timeline').getParent('div');

    var makeClickHandler = function(direction) {
      return function() {
        var lis = $('exhibition-timeline').getElements('li');
        var li;
        if(direction == 'backward') {
          li = lis[0];
        } else {
          li = lis[lis.length-1];
        }

        var anchor = li.getElement('a');
        if(anchor && anchor.getProperty('href')) {
          var href = anchor.getProperty('href');
          var exhib_id = parseInt(href.substring(new String('/opencollection/exhibitions/').length));

          new Request.JSON({url: OPENCOLLECTION_BASE_URL + '/ajax.php?action=get-exhibition-timeline&direction=' + direction + '&start_id=' + exhib_id, method: 'get', onComplete: function(res) {

            if(res.length < 10) {
              $('exhibition-timeline-button-' + direction).fade(0.5);
            } else {
              $('exhibition-timeline-button-backward').fade(1);
              $('exhibition-timeline-button-forward').fade(1);
            }

            if(!res.length) return;

            var replace_ul = new Element('ul');
            for(var i=0;i<res.length;i++) {
              var li = new Element('li').set('text', res[i].date + ': ');
              if($('comment-item-id') && res[i].id == $('comment-item-id').get('value')) {
                li.set('text', res[i].title);
              } else {
                li.adopt(new Element('a').setProperty('href', OPENCOLLECTION_BASE_URL + '/exhibitions/' + res[i].id).set('text', res[i].title));
              }
              if(res[i].has_images) {
                li.addClass('exhibition-timeline-has-images');
              }
              replace_ul.adopt(li);
            }
            // replace_ul.replaces($('exhibition-timeline'));
            replace_ul.setProperty('id', 'exhibition-timeline');
            var slide_dir = direction=='backward'?'south':'north';
            new SlideTween($('exhibition-timeline'), {direction: slide_dir}).start(replace_ul);


         }}).get();

        }
      }
    };

    var backward_button = new Element('a').setProperty('href', 'javascript:void(0);').adopt(new Element('img').setProperty('src', '/images/icons/arrow_up.png')).addEvent('click', makeClickHandler('backward')).setProperty('id', 'exhibition-timeline-button-backward');
    var forward_button = new Element('a').setProperty('href', 'javascript:void(0);').adopt(new Element('img').setProperty('src', '/images/icons/arrow_down.png')).addEvent('click', makeClickHandler('forward')).setProperty('id', 'exhibition-timeline-button-forward');

    if(div.getElement('a.right-column-more')) {
      backward_button.inject($('exhibition-timeline'), 'before').setStyles({display:'block', textAlign:'center'});
      forward_button.inject(div.getElement('a.right-column-more'), 'before').setStyles({display:'block', textAlign:'center'});
    }
  }

  $$('div.expandable-right-column-list').each(function(expandableListDiv) {
    expandableListDiv.setStyle('padding-bottom', '0.5em');
    var list, label;
    if((list = expandableListDiv.getElement('ul')) && (label = expandableListDiv.getElement('span'))) {
      var icon = new Element('img').setProperty('src','/opencollection/images/pulsing-arrow.gif')
          .setStyle('margin-bottom', '-0.3em').setStyle('margin-left','0.3em');
      label.setStyle('cursor','pointer').adopt(icon);
      var size = list.getSize();
      list.default_height = size.y;
      list.setStyles({height: 0, overflow: 'hidden', marginLeft: 0});
      label.addEvent('click', function(e) {
        var elem = new Element(e.target);
        var list = elem.getParent('div').getElement('ul');
        var is_expanded = parseInt(list.getStyle('height')) > 0;
        if(is_expanded) {
          list.tween('height', 0);
        } else {
          list.tween('height', list.default_height);
        }
      });
    }
  });

  $$('input.tag-ac').each(function(el) {

    el.addEvent('focus', function(el) { el.target.select(); } );
    
    var completer = new Autocompleter.Ajax.Json(el, 
      OPENCOLLECTION_BASE_URL + '/ac_lookup/tags.php',
      {
        postVar: 'q',
        zIndex: 200
      }
    );

  });

  $$('textarea.tag-ac').each(function(el) {

    el.addEvent('focus', function(e) { e.target.select(); } );
  
    el.addEvent('keyup', function(e) {
      var text = e.target.value;
      // var tags = /"?[^"]+"dddd
    });

  });


  $$('.thumb-block-thumb').each(function(el) {
    el.addEvent('mouseover', function(e) {
      if(e.target && e.target.getParent()) {
        var imageDiv = e.target;
        var anchorTag = imageDiv.getParent('a');

        var hoverDiv = false;
        if(!(hoverDiv = imageDiv.getNext())) {

          var hoverHeight = 30; //px
          // var hoverWidth = parseInt(imageDiv.getStyle('width'));
          var hoverWidth = imageDiv.hasClass('thumb-size-150')?150:50;
          // var hoverTop = (parseInt(imageDiv.getStyle('height')) - hoverHeight);
          var hoverTop = (imageDiv.hasClass('thumb-size-150')?150:50) - hoverHeight;
          var hoverLeft = 0;
 
          var title = anchorTag.title?anchorTag.title:'Untitled';
          
          if(hoverWidth < 100) {
            var thumbPadding = 3;
            hoverLeft = hoverWidth + thumbPadding;

            hoverWidth = (hoverWidth + thumbPadding) * 2;
            hoverHeight = parseInt(imageDiv.getStyle('height'));
            hoverTop = 0;

            var maxTitleLength = 50;
            if(title.length > maxTitleLength) 
              title = title.substring(0, maxTitleLength-3) + '...';

          }

          var windowWidth = window.getWidth();
          var rightOfCenter = e.client.x > (1024 / 2);
          if(rightOfCenter) {
            hoverLeft = -1 * hoverWidth - thumbPadding;
          }

          var hoverDiv = new Element('div').set('html', '<p>' + title + '</p>').addClass('thumb-block-hover');
          hoverDiv.setStyle('top', hoverTop + 'px');
          hoverDiv.setStyle('left', hoverLeft + 'px');
          hoverDiv.setStyle('width', hoverWidth + 'px');
          hoverDiv.setStyle('height', hoverHeight + 'px');
          hoverDiv.setStyle('font-size', '14px');
          hoverDiv.setStyle('line-height', '17px');
          hoverDiv.setStyle('opacity', 0);
          hoverDiv.injectAfter(imageDiv);

          anchorTag.title = '';
        }

        var maxOpacity = 0.7;
        if(parseInt(imageDiv.getStyle('width')) < 100) {
          maxOpacity = 0.9;
        }

        hoverDiv.set('tween', {duration:'short'});
        hoverDiv.tween('opacity', maxOpacity);
      }
    });

    el.addEvent('mouseout', function(e) {

      if(e.target && e.target.getParent()) {
        var imageDiv = e.target;
        if(hoverDiv = imageDiv.getNext()) {
          hoverDiv.tween('opacity', 0);
        }
      }
    });
  });

  if($('main-image')) {

    $$('.thumb-block-link').each(function(el) {
      el.addEvent('click', function(e) {
        var ev = new Event(e);

        var el = new Element(e.target);
        if(el.get('tag') == 'img') {
          el = el.getParent('a');
        }
        var id_prop = el.getProperty('id');
        if(id_prop && id_prop.length > 'thumb-block-link-'.length) {
          var id = id_prop.substring('thumb-block-link-'.length);

          var image;
          if(el.hasClass('exhibition-thumb')) {
            image = ExhibitionImage.getById(id);
          } else 
            image = ObjectImage.getById(id);

          // No javascript image data? (probably lib/arch) Just let allow link to navigate normally
          if(!image) return;

          var image_url = image.getUrl();
          if($('main-image').getProperty('src').contains(image_url)) {
            return;
          }

          var completeHandler = function(new_img) {
            $('main-image').getParent('a').setProperty('href', image.getFullUrl());
            $('main-image').getParent('a').setProperty('title', image.caption.strip_tags());

            for(var k in image) {
              if($('image-' + k)) {
                $('image-' + k).set('html', image[k]);
              } 
            }
            if(image['call_number']) {
              $('image-call_number').set('html', ' (' + image['call_number'] + ')');
            }

            $$('a').each(function(el) {
              if(el.getProperty('href')) {
                if(el.getProperty('href').contains('image/')) {
                  var new_url = el.getProperty('href').replace(/image\/\d+/, 'image/' + id);
                  el.setProperty('href', new_url);

                } else if(el.getProperty('href').contains('edit_photo.php?avitar_photo=')) {
                  var new_url = el.getProperty('href').replace(/edit_photo\.php\?avitar_photo=[^&]+/, 'edit_photo.php?avitar_photo=' + image.getUrl());
                  el.setProperty('href', new_url);
                }
              }
            });
          };

          new ImageTween($('main-image'), {onComplete: completeHandler}).start(image.getUrl());
          ev.stop();
        }

      });
    });
  }
});

var highlightSearchTerms = function(start_node) {

  var start_node = start_node || $$('body')[0];

  // add highlight spans before any event handlers are applied to elements 
  // because the application of highlights may overwrite said handlers
  if(/(&|\?)(referring-)?q=[^&]+/.test(window.location)) {
    var qs = new QueryString();
    var q = qs['q'] || qs['referring-q'];
    if(q) {
      q = q.replace(/\+/g,' ');
      q = q.replace(/\*/g,'');
      q = q.replace(/"/g,'');
      var terms = q.split(/ /g).include(q);
      // sort terms in reverse order by length
      terms = terms.sort(function(e1, e2) { if(e1.length>e2.length) return -1; else return 1 });
      for(var i=0;i<terms.length;i++) {
        var term = terms[i];

        var regex = new RegExp("(^|>)([^<]*)?(" + term + ")([^>]*)?($|<)","ig"); 
        var replace = '$1$2<span class="searchable-content-highlighted">$3</span>$4$5';
        var elems = start_node.getElements('.searchable-content'); // :$$('.searchable-content');
        // $$('.searchable-content').each(function(el) {
        elems.each(function(el) {
          if(el.get('html')) {
            // var highlighted_html = el.get('html').replace(regex, replace);
            var highlighted_html = el.innerHTML.replace(regex, replace);
            el.set('html', highlighted_html);
          }
        });
      }
    }

    setTimeout(function() {
      start_node.getElements('.searchable-content-highlighted').tween('background-color',['#FFFFFF','#FFC0CB']);

      $$('.searchable-content-highlighted').each(function(el) {
        var li;
        if((li = el.getParent('li')) && li.getStyle('height')!='auto' && li.reveal) {
          li.reveal();
        }
      });

    }, 100);
  }
};


window.addEvent('domready', function() {

  $$('ul.tabs').getElements('li').each(function(el) {
    var a = el.getElement('a');
    a.addEvent('click', function(e) {

      var el = new Element(e.target);
      el.blur();

      if(el.getProperty('id') && el.getProperty('id').indexOf('tab-')===0) {
        var tab_id = el.getProperty('id').substring(4);

        $$('div.tab-content').removeClass('active-tab');
        var tab_content_div;
        if(tab_content_div = $('tab-content-' + tab_id)) {// ).retrieve('tab-content-' + tab_id)) {
          tab_content_div.addClass('active-tab');

        } else {
          var action = 'get-' + tab_id;
          if(!$('tab-content-loading')) {
            var loading_div = (new Element('div')).setProperty('id', 'tab-content-loading').addClass('tab-content-loading').inject($('content-tabs'),'after').setStyle('display','none');
          }
          $('tab-content-loading').setStyle('display','block');
          tab_content_div = (new Element('div')).addClass('tab-content').setProperty('id', 'tab-content-' + tab_id).inject('content-tabs', 'after');
          new Request.HTML({url: OPENCOLLECTION_BASE_URL + '/exhibitions/ajax.php', update: 'tab-content-' + tab_id}).addEvent('success', function(res) {
            $('tab-content-loading').setStyle('display','none'); // removeClass('response-loading');
            $('tab-content-' + tab_id).addClass('active-tab');

            applyLabelListTransforms();
          }).get({id:exhibition.id, action: action});
        }
        $$('li.current-tab').removeClass('current-tab');
        $('tab-' + tab_id).addClass('current-tab');
      }

      var ev = new Event(e);
      ev.stop();
    });
  });

  highlightSearchTerms();

  var getTags = function(text) {

    var reg = /"[^"]+"|[^" ]+/gi;
    var matches = text.match(reg);
    if(matches) {
      var formatted_matches = [];
      for(var i=0;i<matches.length;i++) {
        if(matches[i] && matches[i].test(/[a-z0-9]/i)) {
          formatted_matches.push(new String(matches[i].match(/[^"]+/)).trim());
        }
      }
      matches = formatted_matches;
    } else {
      matches = [];
    }

    return matches;
  };

  // $$('textarea').each(function(el) {
  $$('.tag-input').each(function(el) {

    el.setProperty('autocomplete', 'off');

    el.addEvent('focus', function(e) {
      $$('div.tagging-instructions').each(function(el) {
        if(el.hasChild('tagging-instructions-notice')){
          if(el.getStyle('height') != '216px') {
            var anim = new Fx.Morph(el, {duration: 700});
            anim.start({'height': [0, 216]});
          }
        } else {
          if(el.getStyle('height') != '141px') {
            var anim = new Fx.Morph(el, {duration: 700});
            anim.start({'height': [0, 141]});
          }
        }
      });
    });

    el.addEvent('keyup', function(e) {

      var text = el.value;
      el.suggestsDiv.empty();

      // Update next move text on tag game
      if($('tag-game-action') && $('tag-game-action').hasChild('save-tags-and-move-next')){
        $('tag-game-action').empty();
        $('tag-game-action').set('html', '<span id="disable-until-next-save">Awesome, looks like you are still working on this object.</span>');
      } else if($('tag-game-action') && $('tag-game-action').hasChild('disable-until-next-save') && text=='') {
        $('tag-game-action').empty();
        $('tag-game-action').set('html', '<a href="' + OPENCOLLECTION_BASE_URL + '/tag_game/" id="save-tags-and-move-next">I\'m done with this one. What else ya got?</a>');
      }

      el.cursor_location = el.value.length;

      var matches = getTags(el.value);
      // dbg('cursor loc: "' + el.value.substring(0, el.cursor_location) + '"');
      if(matches.length) {
        // Foreach match, remove enclosing quotes if found
        var activeTag = '' + matches[matches.length-1];


        if(el.value.substring(el.value.length - activeTag.length) == activeTag) {

          el.cursor_location = el.value.length - activeTag.length;

          var suggestions = [];

          if(typeof SUGGEST_TAGS != 'undefined') {
            for(var i=0;i<SUGGEST_TAGS.length;i++) {
              var user_tag = SUGGEST_TAGS[i];
              var max_len = Math.min(user_tag.length, activeTag.length);

              // If typed tag matches auto-complete tag exactly, don't bother showing it
              if(max_len == user_tag.length) continue;

              if(activeTag.substring(0, max_len) == user_tag.substring(0, max_len)) {

                suggestions.push(user_tag);

              }
            }
          }

          if(suggestions.length) {
            el.suggestsDiv.appendText('Suggestions: ');
          }

          for(var i=0;i<suggestions.length;i++) {
            var suggestion = new Element('a').addClass('tag-suggestion').set('html', suggestions[i].replace(/ /g, '&nbsp;')).setProperty('href', '#');
            suggestion.selected_tag_text = suggestions[i];
            suggestion.typed_tag_text = activeTag;
            suggestion.input = el;
            
            suggestion.addEvent('click', function() {
              var t = this.input.value;
              t = t.substring(0, this.input.cursor_location);
              var quote = (this.selected_tag_text.indexOf(' ') >= 0)?'"':'';
              t += quote + this.selected_tag_text + quote + ' ';
              this.input.value = t;

              this.input.focus();
            });
            el.suggestsDiv.adopt(suggestion);
            el.suggestsDiv.appendText(' ');
          }

        }
      }
    });

    if(!el.tagsDiv) {
      el.tagsDiv = new Element("div");
      el.tagsDiv.setStyle('padding-bottom', '0.3em');
      el.parentNode.insertBefore(el.tagsDiv, el);
    }

    if(!el.suggestsDiv) {
      el.suggestsDiv = new Element("div");
      el.suggestsDiv.setStyle('padding-top', '0.3em');
      el.parentNode.appendChild(el.suggestsDiv);
    }

    el.matches = {};
  });

  $$('span#catalog-description').each(function(el) {
    // If previous domready handler added highlight spans to cat. desc, don't ellipse it
    if(!el.getElement('span.searchable-content-highlighted')) {
      var t = el.get('text');
      if(t) {
        var trunc_position = 40;
        if(t.length > trunc_position) {
          var ellipse = new Element('a').setStyle('padding-left', '0.6em').setStyle('font-size', '0.9em').setStyle('font-style', 'italic').set('text', 'read more...').setProperty('href', 'javascript:void(0)');
          ellipse.addEvent('click', function(e) {
            
            var el = new Element(e.target);
            var p = el.getParent();
            p.getElements('span#catalog-description-hidden').each(function(el) { el.setStyle('display', 'inline'); el.fade('in'); });
            el.dispose();
            
          });
          var hiddenText = new Element('span').setProperty('id', 'catalog-description-hidden').setStyle('opacity', 0).setStyle('display', 'none').set('text',t.substring(trunc_position));;
          el.set('html', t.substring(0, trunc_position)).adopt(ellipse).adopt(hiddenText);
        }
      }
    }
    // el.setStyles({height:'3em', display:'block', overflow:'hidden'});
  });

  $$('p#copyright-restricted-note').each(function(el) {
    var show_button = new Element('a').setProperty('href', 'javascript:void(0);').appendText('Why is this image so small? ');
    show_button.span_node = new Element('span').set('html', el.get('html')).setStyles({'opacity': 0, 'display':'none'});
    show_button.addEvent('click', function(e) {
      if(this.span_node.getStyle('opacity') == 0) {
        this.span_node.setStyle('display', 'inline');
        this.span_node.fade('in');
      } else {
        this.span_node.fade('out');
      }
    });

    el.set('text','');
    el.adopt(show_button);
    el.adopt(show_button.span_node);
  });

  if($('top-tagger-email-alert')) {
    $('top-tagger-email-alert').getElements('input[type=submit]').each(function(el) { el.dispose(); });
    $('top-tagger-email-alert').getElements('input[type=checkbox]').each(function(el) { 
      el.addEvent('change', function(e) {
        var el = new Element(e.target);
        new Request.JSON({
          url: OPENCOLLECTION_BASE_URL + '/tag_game/',
          method: 'post'
        }).send('save_email_on_pass=1&is_ajax=1&email_on_pass=' + ($('email_on_pass').getProperty('checked')?'on':'off'));
      });
    });
  }

});

var rewriteTagDeleteLinks = function() {
  $$('a.tag-delete').each(function(el) {
    el.addEvent('click', function(e) {
      var ev = new Event(e);
      ev.stop();

      var el = new Element(e.target);

      // Look for conditions that block user from deleting tag
      var blocking_notice = false;
      // If tag owner (either logged in or anon, override other restrictions
      if(el.getParent('li').hasClass('is-tag-owner')) {

      // Prevent tags with multiple owners from being deleted
      } else if(el.getParent('li').hasClass('multiple-users-tag')) {
        blocking_notice = 'Sorry, this tag can\'t be deleted because it was added by multiple posse members.';

      // Prevent non-logged-in users from deleting tags
      } else if(!user) {
        var r_url = window.location.href.substring(window.location.href.indexOf('brooklynmuseum.org/')+18);
        var item_type = 'object';
        if(window.location.href.indexOf('opencollection/archives')>0)
          item_type = 'archives image';
        if(window.location.href.indexOf('opencollection/exhibitions')>0)
          item_type = 'exhibition';
        blocking_notice = '<a href="/register/?r=' + r_url + '">Join the Posse</a> or <a href="/login/?r=' + r_url + '">log in</a> to delete tags on this ' + item_type + '.';
      }

      // If user can't delete tag, show notice
      if(blocking_notice) {
        if(!$('signup-login-notice-delete-tag')) {
          var notice = new Element('p').setProperty('id','signup-login-notice-delete-tag').addClass('signup-login-notice');
          notice.set('html',blocking_notice);
          var tags_ul = (new Element(e.target)).getParent('ul');
          notice.inject(tags_ul, 'after');
        }
        $('signup-login-notice-delete-tag').set('html',blocking_notice);
        (new Fx.Slide($('signup-login-notice-delete-tag'))).hide().slideIn();
        return;
      }

      var el = e.target;
      var matches = el.href.match(/tag_id=([0-9]+)/);
      if(matches) {
        var tag_id = matches[1];
        var tag_text = el.getPrevious().get('text');
        var context = 'item detail';
        var context_matches = el.href.match(/context=([^&]+)/);
        if(context_matches) {
          context = context_matches[1];
        }

        if(confirm('Are you sure you want to delete the tag ' + tag_text + '?')) {
     
          var options = {
            url: OPENCOLLECTION_BASE_URL + '/user_tags/ajax/',
            data: 'tag-action=delete&tag-id=' + tag_id + '&context=' + context,
            method: 'post', 
            onComplete: function(response) {
              if(response.success) {
                for(var i=0;i<response.tags.length;i++) {
                  var tag = response.tags[i];
                  var is_tag_owner = false;
                  var _tag;
                  var matching_tag_lis = $$('.tag-' + tag.tag_id);
                  if(_tag = matching_tag_lis.getLast()) {
                    if(_tag.hasClass('is-tag-owner')) {
                      is_tag_owner = true;
                    }
                    _tag.dispose();
                  }

                  var is_freeze_tag = window.location.href.indexOf('/freeze_tag') >= 0;
                  if(!is_tag_owner && !is_freeze_tag && $$('ul.tags')) {
                    if(!$('tag-moderation-thanks')) {
                      var thanks = (new Element('div')).setProperty('id','tag-moderation-thanks').set('html','Thanks for cleaning up!  Deleted tags will be moved into <a href="' + OPENCOLLECTION_BASE_URL + '/freeze_tag/start.php">Freeze Tag!</a> for review.  Play the game to decide a tag\'s fate!');
                      thanks.inject($$('ul.tags')[0],'after');

                      (new Fx.Slide(thanks)).slideIn();
                    }
                  }

                  // Update Tags by Posse
                  if($('posse-tags-holder')) {
                    var item_type = $('tag-item-type').getProperty('value');
                    var item_id = $('tag-item-id').getProperty('value');// object?object.id:false;
                    if(item_type && item_id && $('posse-tags-holder'))
                      $('posse-tags-holder').load(OPENCOLLECTION_BASE_URL + '/user_tags/ajax/?action=get-posse-tags-list&item_type=' + item_type + '&item_id=' + item_id);
                  }
                  // Freeze tag matches
                  if($('freeze-tag-matches')) {
                    $('freeze-tag-matches').load(OPENCOLLECTION_BASE_URL + '/user_tags/ajax/?action=get-freeze-tag-matches-list');
                  }
                }
              }
            }
          };
          var post = new Request.JSON(options);
          
          post.send();
        }
      }
      return false;
    });
  });
}

var nav_set_data = [];
var nav_set_index;
var nav_set_preview_index;

var fetchNavSetData = function(start_index) {
  var start_index = (typeof start_index == 'undefined')?0:start_index;

  new Request.JSON({url: OPENCOLLECTION_BASE_URL + '/ajax.php?action=get-nav-set-data&start_index=' + start_index, method: 'get', onComplete: function(res) {
    for(var i=0;i<res.length;i++) {
      nav_set_data[res[i].i] = res[i];
    }

    $('nav-set-next-prev').setStyle('visibility','visible');

    if(nav_set_preview_index == nav_set_data.length-1 || nav_set_index==nav_set_data.length-1) {
      $('nav-set-next').fade(0.5);
    }
  }}).get();
}

var advanceNavSetPreview = function(increment) {
  if(nav_set_preview_index + increment == nav_set_index) increment *= 2;

  if(nav_set_preview_index + increment < 0) return;
  if(nav_set_preview_index + increment >= nav_set_total) return;
  
  var next_item = nav_set_data[nav_set_preview_index+increment];
  if(next_item) {

    nav_set_preview_index += increment;

    var qs = new QueryString();
    var referring_q = qs['q'] || qs['referring-q'];
    var href = OPENCOLLECTION_BASE_URL + '/' + (next_item.type=='archivesimage'?'archives/image':(next_item.type + 's')) + '/' + next_item.id + (nav_set_id?'/set/' + nav_set_id:'') + (referring_q?'?referring-q=' + referring_q:'');

    if(next_item.image_filename) {
      var item_type = next_item.type.replace('image','');
      var img_subfolder = item_type=='artist'?'objects':(item_type + (item_type.substr(item_type.length-1,1)!='s'?'s':''));
      var new_src = OPENCOLLECTION_BASE_URL + '/images/' + img_subfolder + '/size2_sq/' + next_item.image_filename;
      new ImageTween($('nav-set-preview-image'), {transition_type:'slide-left', onComplete: function(img) {
        $('nav-set-preview-image').getParent('a').setProperty('title', next_item.title?next_item.title:'Untitled').setProperty('href', href);
        $('nav-set-preview-label').set('html', (nav_set_preview_index+1) + ' / ' + (new Number(nav_set_total)).numberFormat(0) + ': ' + (next_item.caption?next_item.caption:'Untitled'));
        highlightSearchTerms($('nav-set-preview'));
      }
      }).start(new_src);
      // new SlideTween($('nav-set-preview-image'), {direction: 'east'}).start(new Element('img').setProperty('src', new_src));

      $('nav-set-preview-no-image').setStyle('display', 'none');
      $('nav-set-preview-image').setStyle('display', 'block');

    } else {
      $('nav-set-preview-no-image').set('text', next_item.title);
      $('nav-set-preview-image').getParent('a').setProperty('title', next_item.title).setProperty('href', href);
      $('nav-set-preview-label').set('html', (nav_set_preview_index+1) + ' / ' + (new Number(nav_set_total)).numberFormat(0) + ': ' + (next_item.caption?next_item.caption:'Untitled'));
      
      $('nav-set-preview-no-image').setStyle('display', 'inline');
      $('nav-set-preview-image').setStyle('display', 'none');
      highlightSearchTerms($('nav-set-preview'));
    }

    if(nav_set_preview_index==0 || (nav_set_index==0&&nav_set_preview_index==1)) {
      $('nav-set-previous').fade(0.5);
    } else {
      $('nav-set-previous').fade('show');
    }

    if(nav_set_preview_index==nav_set_data.length-1 || (nav_set_preview_index==nav_set_data.length-2 && nav_set_index==nav_set_data.length-1)) {
      $('nav-set-next').fade(0.5);
    } else {
      $('nav-set-next').fade('show');
    }
    
    // The dom isn't quite ready, so delay a bit before highlighting
    // setTimeout(function() { highlightSearchTerms($('nav-set-preview')); }, 100);
  }

  if(nav_set_preview_index>0 && !nav_set_data[nav_set_preview_index-1]) {
    fetchNavSetData(Math.max(0, nav_set_preview_index-NAV_SET.WIDGET_FETCH_SIZE));
  }
  if(nav_set_preview_index<nav_set_total-1 && !nav_set_data[nav_set_preview_index+1]) {
    fetchNavSetData(nav_set_preview_index+1);
  }
}

window.addEvent('domready', function(e) {
  rewriteTagDeleteLinks();

  if($('nav-set-next')) {
    if(!nav_set_data.length)
      fetchNavSetData(Math.max(0, nav_set_index-Math.round(NAV_SET.WIDGET_FETCH_SIZE/2)));

    $('nav-set-next').addEvent('click', function(e) {
      advanceNavSetPreview(1);
      new Element(e.target).blur();
    });

    $('nav-set-previous').addEvent('click', function(e) {
      new Element(e.target).blur();
      advanceNavSetPreview(-1);
    });

    if(nav_set_index == 0) {
      $('nav-set-previous').fade(0.5);
    }
  }

  $$('#opencollection-top-navigation').each(function(el) {

    var expanded_on_load = true;

    var cookie_pref = 'true';
    if((cookie_pref = Cookie.read('oc_top_nav_expanded')) && cookie_pref=='false') {
      expanded_on_load = false;
    }

    // If we determine user prefers that it be collapsed, collapse it now 
    // (this is redundant because a server-side cookie check does the same thing in ../inc/left_nav..)
    if(!expanded_on_load) {
      $('opencollection-top-nav-secondary').setStyle('height', 0);
    }

    var button = new Element('a').setProperty('href', 'javascript:void(0);').setProperty('id', 'opencollection-nav-expand');
    if(expanded_on_load) {
      button.adopt(new Element('span').appendText('collapse'));
    } else {
      //$('opencollection-top-nav-secondary').setStyle('height', '0px');
      button.adopt(new Element('span').appendText('expand'));
    }
    button.adopt(new Element('img').setProperty('src', OPENCOLLECTION_BASE_URL + '/images/pulsing-arrow.gif'));
    button.addEvent('click', function(e) {
      var el = $('opencollection-nav-expand');
      var secondary_nav = $('opencollection-top-nav-secondary');
      var anim = new Fx.Morph(secondary_nav, {duration: 700});
      if(parseInt(secondary_nav.getStyle('height')) > 0) {
        anim.start({'height': [secondary_nav.getStyle('height'), 0]});
        el.getChildren('span').each(function(el) { el.set('text', 'expand'); });
        Cookie.write('oc_top_nav_expanded', 'false', {path: '/'});

      } else {
        anim.start({'height': [0, 28]});
        el.getChildren('span').each(function(el) { el.set('text', 'collapse'); });
        Cookie.write('oc_top_nav_expanded', 'true', {path: '/'});
      }
      e.target.blur();
    });
    el.insertBefore(button, el.getFirst());
  });

  if($('search-only-exhibitions')) {
    var updateSearchTagsOnly = function(e) {
      if($('search-scope-tags-only')) {
        var el = $('search-only-exhibitions');
        if(el.checked) {
          $('search-scope-tags-only').setProperty('disabled', 'disabled');
        } else {
          $('search-scope-tags-only').removeProperty('disabled');
        }
      }
      if($('search-scope-all')) {
        $('search-scope-all').setProperty('checked', 'checked');
      }
    };
    updateSearchTagsOnly();
    $('search-only-exhibitions').addEvent('change', updateSearchTagsOnly);
  }

  $$('div.tagging-instructions').each(function(el) {
    el.setStyle('height', '0');
    el.setStyle('overflow', 'hidden');
  });


  $$('form.tag-form').each(function(el) {
    el.addEvent('submit', function(e) {

      var options = {
        url: OPENCOLLECTION_BASE_URL + '/user_tags/ajax/', 
        data: el.toQueryString(),
        method: 'post', 
        onComplete: function(response) {
          if(response.success) {
            var is_freeze_tag = window.location.href.indexOf('/freeze_tag') >= 0;

            for(var i=0;i<response.tags.length;i++) {
              var tag = response.tags[i];
              var uls = $$('.tags');
              if(is_freeze_tag) {
                uls = [$('freezetag-add-tag-list')];
              }
              uls.each(function(ul) {

                // Add Tag li under 'Tags'
                var li = new Element('li').addClass('tag-' + tag.tag_id).addClass('is-tag-owner');
                li.set('html', '<a href="' + OPENCOLLECTION_BASE_URL + '/tags/' + tag.tag_text + '" title="Items tagged ' + tag.tag_text + '"' + ($('tag-game-action')?' target="_blank"':'') + '>' + tag.tag_text + '</a>' + ' <a href="' + OPENCOLLECTION_BASE_URL + '/user_tags/delete/?tag_id=' + tag.tag_id + '" class="tag-delete">[x]</a>');
                ul.adopt(li);

                // Update Tags by Posse
                //var item_type = $('tag-item-type').getProperty('value');
                var item_type = el.elements['tag-item-type'].getProperty('value');
                // var item_id = object?object.id:false;
                //var item_id = $('tag-item-id').getProperty('value');// object?object.id:false;
                var item_id = el.elements['tag-item-id'].getProperty('value');
                if(item_type && item_id && $('posse-tags-holder'))
                  $('posse-tags-holder').load(OPENCOLLECTION_BASE_URL + '/user_tags/ajax/?action=get-posse-tags-list&item_type=' + item_type + '&item_id=' + item_id);

                if(is_freeze_tag && $('inline-tag-form')) {
                  $('inline-tag-form').slide('in');
                }
              });
              // Update next move text on tag game
              if($('tag-game-action') && !is_freeze_tag){
                $('tag-game-action').empty();
                $('tag-game-action').set('html', '<a href="' + OPENCOLLECTION_BASE_URL + '/tag_game/" id="save-tags-and-move-next">I\'m done with this one. What else ya got?</a>');
              }
              el.elements['tag-text'].value = '';
            }
          } else {
            alert("Error saving tag: " + response.error);
          }

          rewriteTagDeleteLinks();
        }
      };
      var post = new Request.JSON(options);
      
      if(el.elements['tag-text'].getProperty('value') != el.elements['tag-text'].tip) {
        post.send();
      }

      var ev = new Event(e);
      ev.stop();
      return false;
    });

    setTextInputTip(el.elements['tag-text'], 'enter your own tags');
  });


  $$('.year-range').each(function(el) {

    var type = '';

    var year_begin_input, year_end_input;
    var inputs = el.getChildren();
    for(var i=0;i<inputs.length;i++) {
      inputs[i].type = 'hidden';

      if(inputs[i].name.indexOf('object') >= 0) {
        type = 'object';

      } else if(inputs[i].name.indexOf('exhibition') >= 0) {
        type = 'exhibition';
      }

      if(inputs[i].name.indexOf('end') > 0) {
        year_end_input = inputs[i];

      } else if(inputs[i].name.indexOf('begin') > 0) {
        year_begin_input = inputs[i];
      }
    }

    var year_steps;
    switch(type) {
      case 'object':
        year_steps = OBJECT_SEARCH_YEAR_MAX - OBJECT_SEARCH_YEAR_MIN;
        break;
      case 'exhibition':
        year_steps = EXHIBITION_SEARCH_YEAR_MAX - EXHIBITION_SEARCH_YEAR_MIN;
        break;
    }

    el.empty();
    el.adopt(year_begin_input);
    el.adopt(year_end_input);

    el.addClass('multi-slider');

    var first_knob = new Element('div').addClass('multi-slider-knob').setStyle('position', 'relative').setStyle('left', '0px');
    var second_knob = new Element('div').addClass('multi-slider-knob');
    el.adopt(first_knob);
    el.adopt(second_knob);

    var slider = new MultiSlider(el, first_knob, { 
      steps: year_steps, 
      knobheight: 18, 
      onChange: function(step){
        var min_year = this.min_value + step.minpos;
        var max_year = this.min_value + step.maxpos;

        this.year_begin_input.value = min_year;
        this.year_end_input.value = max_year;

        this.label.setRange(min_year, max_year);
      }
    }, second_knob);


    slider.year_begin_input = year_begin_input;
    slider.year_end_input = year_end_input;

    var label = new Element('div').setStyle('position', 'relative').setStyle('bottom', '16px');
    label.showSuffix = true;
    label.setRange = function(min_year, max_year) {

      var showSuffix1 = this.showSuffix && (min_year < 0 || max_year < 0);
      var showSuffix2 = this.showSuffix;

      var min_year_display = min_year < 0?(Math.abs(min_year) + " BC"):(min_year + (showSuffix1?" AD":''));
      var max_year_display = max_year < 0?(Math.abs(max_year) + " BC"):(max_year + (showSuffix2?" AD":''));

      this.set('text',min_year_display + ' to ' + max_year_display);
    }
    el.adopt(label);

    slider.label = label;

    var year_steps;
    switch(type) {
      case 'object':
        slider.min_value = OBJECT_SEARCH_YEAR_MIN;
        slider.max_value = OBJECT_SEARCH_YEAR_MAX;
        slider.label.setRange(OBJECT_SEARCH_YEAR_MIN, OBJECT_SEARCH_YEAR_MAX);
        break;
      case 'exhibition':
        slider.min_value = EXHIBITION_SEARCH_YEAR_MIN;
        slider.max_value = EXHIBITION_SEARCH_YEAR_MAX;
        slider.label.showSuffix = false;
        slider.label.setRange(EXHIBITION_SEARCH_YEAR_MIN, EXHIBITION_SEARCH_YEAR_MAX);
        break;
    }

  });

  // For XHTML compliance we use rel="new_window" in place of target="_blank"
  $$('a[rel=new_window]').each(function(el) {
    el.setProperty('target', '_blank');
  });
});


var setTextInputTip = function(el, tip) {
  el.addClass('text-input-tip-active');
  el.setProperty('value', tip);

  el.tip = tip;

  el.addEvent('focus', function(e) {
    if(e && e.target) {
      try {

        if(el.getProperty('value') == el.tip) {
          el.removeClass('text-input-tip-active');
          el.setProperty('value', '');
        }
      } catch(e) {
      }
    }
  });

  el.addEvent('blur', function(e) {
    if(e && e.target) {
      if(el && el.getProperty('value') == '') {
        el.addClass('text-input-tip-active');
        el.setProperty('value', el.tip);
      }
    }
  });
}

var applyShareByEmailAjaxRewrite = function() {
  $$('#opencollection-share-by-email').each(function(el) {
    el.removeEvents('submit').addEvent('submit', function(e) {

      var options = {
        data: el.toQueryString(),
        method: 'post', 
        onSuccess: function(response) {
          response = Json.evaluate(response);
          if(response.success) {
            $('opencollection-share-by-email-message').set('html', 'Your message has been sent');
            $('opencollection-share-by-email').fade('out');
            $('opencollection-share-by-email-message').adopt(new Element('a').set('text', 'Click here to send this to someone else').setProperty('href', 'javascript:void(0);').addEvent('click', function() { 
              $('opencollection-share-by-email').getElements('input[type=text]').each(function(el) {
                el.value = '';
              });
              $('opencollection-share-by-email').fade('in');
              $('opencollection-share-by-email-message').set('html', 'Enter another friend\'s email address:');
            }).set('styles', {display:'block','margin-top':'1em'}));

          } else {
            $('opencollection-share-by-email-message').set('html', 'There was an error sending your message: <br/>').adopt(new Element('span').setStyle('color', '#900').set('text', response.message));
          }
        }
      };
      var post = new Ajax(OPENCOLLECTION_BASE_URL + '/share/ajax/', options);
      
      post.request();

      var ev = new Event(e);
      ev.stop();
      return false;
    });
  });
}

window.addEvent('domready', applyShareByEmailAjaxRewrite);


/* comments */

window.addEvent('domready', function(){

    if($defined($('comment-text'))){
    var item_type_name = $('comment-item-type').get('value').replace('_', ' ');
    setTextInputTip($('comment-text'), 'comment on this ' + item_type_name);

    if($('comment-valuation-warning')) {
      $('comment-text').addEvent('focus', function(e) {
        if($('comment-valuation-warning').getStyle('display') != 'block') {
          $('comment-valuation-warning').setStyle('display','block');
          (new Fx.Slide($('comment-valuation-warning'))).hide().slideIn();
        }
      });
    }
    /*
    $('comment-text').addEvent('focus', function(){
      var textarea = $('comment-text');
      if(/^comment on this \w+/.test(textarea.value)) textarea.value = '';
      textarea.setStyle('color','#333333');
    });
    */
  } // end comment-text code

  if($defined($('see-all-comments'))){
    $('see-all-comments').addEvent('click', function(e){

      if($('all-comments').getStyle('display') != 'block'){

        var win_scroll_height = window.getScroll()['y'];
        var text_top = $('main-text').getCoordinates()['top'];
        if(win_scroll_height > text_top){
          var diff = win_scroll_height - text_top;
          $('all-comments').setStyle('top', (diff+5)+'px');
        }else{
          $('all-comments').setStyle('top', '0px');
        }

        $('all-comments').setStyle('display','block');
      }else{
        $('all-comments').setStyle('display','none');
      }

    });

    $('all-comments-close').addEvent('click', function(e){
      $('all-comments').setStyle('display','none');
    });

  }

  if($defined($('comment-form'))){
    $('comment-feedback-block').setStyle('height','0px');
    $('comment-form').addEvent('submit',function(e){
      e.stop();
      var args = {
        'comment_text': $('comment-text').value,
        'comment_item_type': $('comment-item-type').value,
        'comment_item_id':$('comment-item-id').value
      };
      if($defined($('comment-user-name'))){
        args['comment_user_name'] = $('comment-user-name').value;
      }
      if($defined($('comment-email'))) {
        args['comment_email'] = $('comment-email').value;
      }
      var r = new Request.JSON({url: '/opencollection/comments/ajax.php', secure: false, onComplete: function(result){

        if(result.success){

          if($('comment-valuation-warning')) {
            (new Fx.Slide($('comment-valuation-warning'))).hide();
          }

          if($('comment-email'))
            $('comment-subscribe-input').set('value', $('comment-email').get('value')).removeClass('text-input-tip-active');

          var textarea = $('comment-text');
          textarea.value = 'comment on this object';
          textarea.setStyle('color','#999999');
          if($defined($('comment-block'))){
            $('comment-block-container').setStyle('display','block');
          }
          $('comment-subscribe-block').setStyle('display','block');
          $('exclude-comment-id').setProperty('value',result.comment_id);
          var thank_fx = new Fx.Morph($('comment-feedback-block'), {transition: Fx.Transitions.Sine.easeOut});
          var subscribe_fx = new Fx.Morph($('comment-subscribe-block'), {transition: Fx.Transitions.Sine.easeOut});
          var thx_text = '<div style="padding-top:1em;color:#ff0099;">Thank you for your comment. Comments are moderated and will be displayed shortly.<br/><br/>Would you like to know if someone responds to your comment?<br/>Subscribe to this comment thread below.</div>';
          if($('comment-feedback-block').getStyle('height') != '0px'){
            thank_fx.start({'height': [$('comment-feedback-block').getStyle('height'),0]}).chain(function(){
              $('comment-feedback-block').set('html',thx_text);
              var fb_size = $('comment-feedback-block').getScrollSize();
              thank_fx.start({'height': [0,fb_size.y]});
            });
            subscribe_fx.start({'height': [$('comment-feedback-block').getStyle('height'),0]});
          }else{
            $('comment-feedback-block').set('html', thx_text);
            var fb_size = $('comment-feedback-block').getScrollSize();
            thank_fx.start({'height': [0,fb_size.y]});
            var sub_size = $('comment-subscribe-block').getScrollSize();
            subscribe_fx.start({'height': [0,sub_size.y]});
          }

        }else{

          var comment_error = result.comment_error?result.comment_error:'Please enter text into the comment box before submitting your comment.';
          $('comment-feedback-block').set('html','<div style="padding-top:1em;color:#ff0099;">' + comment_error + '</div>');
          var thank_fx = new Fx.Morph($('comment-feedback-block'), {transition: Fx.Transitions.Sine.easeOut});
          var subscribe_fx = new Fx.Morph($('comment-subscribe-block'), {transition: Fx.Transitions.Sine.easeOut});
          if($('comment-feedback-block').getStyle('height') == '0px'){
            var fb_size = $('comment-feedback-block').getScrollSize();
            thank_fx.start({'height': [0,fb_size.y]});
            var sub_size = $('comment-subscribe-block').getScrollSize();
            subscribe_fx.start({'height': [0,sub_size.y]});
          }

        } // end if(result.success=='true')

      }}).get(args);
    });
  } // end comment-form code

  if($defined($('comment-subscribe-block'))){

    $('comment-subscribe-block').setStyle('height','0px');
    if(user && user.email) {
      $('comment-subscribe-input').set('value', user.email);
      
    } else {
      setTextInputTip($('comment-subscribe-input'), 'email address');
    }

    $('comment-subscribe-form').addEvent('submit',function(e){
      e.stop();
      var args = {
        'item_type': $('subscribe-item-type').value,
        'item_id':$('subscribe-item-id').value,
        'email':$('comment-subscribe-input').value,
        'exclude_comment_id':$('exclude-comment-id').value,
        'action':'comment_subscribe'
      };
      var r = new Request.JSON({url: '/opencollection/comments/email_subscribe_ajax.php', secure: false, 
        onComplete: function(result){
          var thank_fx = new Fx.Morph($('subscribe-feedback-block'), {transition: Fx.Transitions.Sine.easeOut});
          if($('subscribe-feedback-block').getStyle('height') != '0px'){
            thank_fx.start({'height': [$('subscribe-feedback-block').getStyle('height'),0]}).chain(function(){
              $('subscribe-feedback-block').set('html',result.message);
              var fb_size = $('subscribe-feedback-block').getScrollSize();
              thank_fx.start({'height': [0,fb_size.y]});
            });
          }else{
            $('subscribe-feedback-block').set('html',result.message);
            var fb_size = $('subscribe-feedback-block').getScrollSize();
            thank_fx.start({'height': [0,fb_size.y]});
          }
          $('subscribe-feedback-block').addClass('pink');
        }
      }).get(args);
    }); // end submit code

  } // end comment-subscribe-block code

  applyLabelListTransforms();
});

var applyLabelListTransforms = function() {
  $$('a.label-more-link').each(function(el) {
    
    var li = el.getParent('li');
    li.toggle = function() {
      var expanded_height = (li.getElement('div').getSize().y + 30) + 'px';
      if(this.li.getStyle('height') != expanded_height) {
        this.li.store('contracted_height', this.li.getStyle('height'));
        this.li.tween('height', this.li.getStyle('height'), expanded_height);
        this.li.getElement('a.label-more-link').set('text', 'less');
      } else {
        this.li.tween('height', this.li.getStyle('height'), this.li.retrieve('contracted_height'));
        this.li.getElement('a.label-more-link').set('text', 'more');
      }
    
    }; 
    el.li = li;
    el.addEvent('click', li.toggle);
    
  });
}

function favorite(action, iid, itype){
  var args = {
    'action': action,
    'item_id': iid,
    'item_type': itype
  }
  var r = new Request.JSON({url: '/opencollection/favorites/ajax.php', secure: false, onComplete: function(res){
      if(res.success){
        $('favorite-button').setStyle('font-style', 'italic');
        if(res.result == 'added'){
          $('favorite-button').set('html','<a href="javascript:favorite(\'remove-favorite\', '+iid+', \''+itype+'\');"><img src="/images/icons/famfamfam_silk/heart.png" alt=""/> In My Favorites</a>');
        }else if(res.result == 'removed'){
          $('favorite-button').set('html','<a href="javascript:favorite(\'add-favorite\', '+iid+', \''+itype+'\');"><img src="/images/icons/famfamfam_silk/heart_add.png" alt=""/> Add To Favorites</a>');
        }
      }else{
        alert(res.result);
      }
    }
  }).get(args);
}

function add_to_set(){
  $('add-to-sets-set-list').setStyle('display', 'block');
}

function create_new_set(){
  $('available-sets').setStyle('display', 'none');
  $('choose-a-set').setStyle('display', 'none');
  $('view-user-sets-msg').setStyle('display', 'none');
  $('create-a-set').setStyle('display', 'block');
  $('make-a-new-set').setStyle('display', 'block');
}

function hide_set_list(){
  $('add-to-sets-set-list').setStyle('display', 'none');
  if($defined($('make-a-new-set'))){
    $('make-a-new-set').setStyle('display', 'none');
  }
  if($defined($('create-a-set'))){
    $('create-a-set').setStyle('display', 'none');
  }
  if($defined($('choose-a-set'))){
    $('choose-a-set').setStyle('display', 'block');
  }
  if($defined($('available-sets'))){
    $('available-sets').setStyle('display', 'block');
  }
}

function login_pop(action) {
  var pop = $('login-pop');

  var r_url = window.location.href;
  var login_url = '/login/?r=' + escape(r_url);
  var register_url = '/register/index.php?r=' + escape(r_url);

  if(pop.getStyle('display') == 'none'){
    if(action == 'favorite'){
      var html = 'Want to favorite? Please <a href="' + register_url + '">join</a> the <a href="/community/posse/">Posse</a>, or <a href="' + login_url + '">log in</a>.';
      var pos = $('favorite-button').getPosition();
    }else if(action == 'avitar'){
      var html = 'Want to add this image as your avatar? Please <a href="' + register_url + '">join</a> the <a href="/community/posse/">Posse</a>, or <a href="' + login_url + '">log in</a>.';
      var pos = $('avitar-button').getPosition();
    }
    pop.set('html', html);
    pop.setStyle('left', pos['x']-50)
    pop.setStyle('display','block');
  }else{
    pop.setStyle('display','none');
  }
}

function toggle_posse_tags(ul_number){
    if(posseFxOpen==0){
      posseFxArray[ul_number].toggle();
      posseFxOpen = ul_number;
    } else if(posseFxOpen==ul_number) {
      posseFxArray[ul_number].toggle();
      posseFxOpen = 0;
    } else {
      posseFxArray[posseFxOpen].toggle();
      posseFxArray[ul_number].toggle();
      posseFxOpen = ul_number;
    }
}



var ImageTween = new Class({
  Implements: Options,

  options: {
    tween_dimensions: true,
    transition_type: 'fade',
    z_index: 1000,
    onComplete: function() {}
  },

  initialize: function(img, options) {
    this.setOptions(options);
    this.img = img;

    // getCoordinates seems to fail in IE6, so if coords can't be determined, simply hide and fade in
    if(this.img.getCoordinates().left == 0) {
      this.options.transition_type = 'fade-in';

    } else {
      if(!this.img.tween_holder) {
        this.img.tween_holder = new Element('div').setStyles($extend(this.img.getStyles(), this.img.getCoordinates())).setStyle('position','absolute');

        this.img.overlay_img = this.img.clone().setStyles({
          position:'relative',
          zIndex:this.options.z_index
        }).fade('hide');
        document.body.adopt(this.img.tween_holder);
        this.img.tween_holder.adopt(this.img.overlay_img);
      }
    }

    if(this.img.loading_div) {
      this.loading_div = this.img.loading_div;
    } else {
      var loading_div_style = $extend(this.img.getCoordinates(), {position:'absolute',zIndex:this.options.z_index+1,backgroundColor:'#FFF'});
      // this.img.loading_div = this.loading_div = (new Element('div').set('html', 'Loading...')).fade('hide').inject(document.body, 'bottom');
      this.img.loading_div = (new Element('div')).set('html', 'Loading...').setStyle('opacity', 0);
      this.loading_div = this.img.loading_div;
      document.body.adopt(this.img.loading_div);
      this.loading_div.default_height = 20;
      loading_div_style.height = this.loading_div.default_height + 'px';
      this.loading_div.setStyles(loading_div_style)
    }
    var loading_div_top = this.img.getCoordinates().top + this.img.getCoordinates().height - this.loading_div.default_height;
    this.loading_div.setStyle('top', loading_div_top + 'px');
  },

  start: function(end_src) {
    this.loading_div.fade(0.5);
    
    if(this.options.transition_type == 'fade-in') {
      new Asset.image(end_src, {
        onload: function(new_img) { 
          this.img_tween.loading_div.fade('out');

          this.img = this.img_tween.img;

          this.img.fade('hide');
          this.img.src = new_img.src;
          this.img.fade('in');

          this.img_tween.options.onComplete(this.img)
        }
      }).img_tween = this;

    } else if(this.options.transition_type == 'fade') {
      new Asset.image(end_src, {
        onload: function(new_img) { 
          this.img_tween.loading_div.fade('out');

          this.img = this.img_tween.img;

          this.img.overlay_img.setProperty('src', this.img.getProperty('src'));
          this.img.overlay_img.fade('show');
          this.img.fade('hide');

          var prev_width = this.img.width;
          var prev_height = this.img.height;
          // this.img.setStyles({width: prev_width + 'px !important', height: prev_height + 'px !important'});
          this.img.setProperty('src', new_img.getProperty('src'));

          if(this.img_tween.options.tween_dimensions) {
            new Fx.Morph(this.img.overlay_img).start({width: [prev_width, new_img.width], height: [prev_height, new_img.height]});
            new Fx.Morph(this.img).start({width: [prev_width, new_img.width], height: [prev_height, new_img.height]});
          }

          this.img.overlay_img.fade('out');
          this.img.fade('in');

          this.img_tween.options.onComplete(this.img)
        }
      }).img_tween = this;
    } else if(this.options.transition_type == 'slide-left') {
      new Asset.image(end_src, {
        onload: function(new_img) { 
          this.img_tween.loading_div.fade('out');

          this.img = this.img_tween.img;

          this.img.overlay_img.setProperty('src', this.img.getProperty('src'));
          this.img.overlay_img.fade('show');
          this.img.fade('hide');

          var prev_width = this.img.width;
          var prev_height = this.img.height;
          // this.img.setStyles({width: prev_width + 'px !important', height: prev_height + 'px !important'});
          this.img.setProperty('src', new_img.getProperty('src'));

          if(this.img_tween.options.tween_dimensions) {
            new Fx.Morph(this.img.overlay_img).start({width: [prev_width, new_img.width], height: [prev_height, new_img.height]});
            new Fx.Morph(this.img).start({width: [prev_width, new_img.width], height: [prev_height, new_img.height]});
          }

          this.img.overlay_img.fade('out');
          this.img.fade('in');

          this.img_tween.options.onComplete(this.img)
        }
      }).img_tween = this;
    }
  }
});

/*
 *  Replaces an element with another element using a sliding effect
 *  Usage: 
 *    new SlideTween(original_elem, {direction:'west'}).start(replacing_elem);
 */
var SlideTween = new Class({
  Implements: Options,

  options: {
    tween_dimensions: true,
    direction: 'north',
    z_index: 1000,
    onComplete: function() {}
  },

  initialize: function(elem, options) {
    this.setOptions(options);
    this.elem = elem;

    var size = this.elem.getSize();
    this.container = new Element('div');
    this.container.setStyle('width', size.x);
    this.container.setStyle('height', size.y);
    this.container.setStyle('overflow', 'hidden');
    this.container.replaces(this.elem);
    this.container.adopt(this.elem);
  },

  start: function(replace_elem) {
    if(this.options.direction == 'north') {
      var size = this.elem.getSize();
      this.container.adopt(replace_elem);
      this.elem.tween('margin-top', -1*size.y);

    } else if(this.options.direction == 'south') {
      // Elem must be in DOM to get size
      this.elem.getParent().adopt(replace_elem);
      var size = replace_elem.getSize();
      replace_elem.setStyle('margin-top', -1*size.y);
      this.container.grab(replace_elem, 'top');
      replace_elem.tween('margin-top', 0);

    } else if(this.options.direction == 'east') {
      this.elem.getParent().adopt(replace_elem);
      var size = replace_elem.getSize();
      replace_elem.setStyles({position: 'relative', width: size.x, left: -1*size.x});
      this.container.grab(replace_elem, 'top');
      this.elem.setStyles({position: 'relative', clear:'both',top: -1*size.y});
      this.elem.tween('left', size.x);
      replace_elem.tween('left', 0);

    } else if(this.options.direction == 'west') {
      this.elem.getParent().adopt(replace_elem);
      var size = this.elem.getSize();
      replace_elem.setStyles({position: 'relative', clear:'both', width: size.x, left: size.x, top: -1*this.elem.getSize().y});
      this.elem.setStyles({position: 'relative', width: size.x});
      this.container.adopt(replace_elem);
      replace_elem.tween('left', 0);
      this.elem.tween('left', -1*size.x);
    }

    if(this.options.tween_dimensions) {
      var size = replace_elem.getSize();
      var _slide_tween = this;
      new Fx.Morph(this.container, {
        onComplete: function() { 
          _slide_tween.elem = replace_elem;
          _slide_tween.elem.setStyles({position: 'static'});
          _slide_tween.elem.replaces(_slide_tween.container);
        }
      }).start({width: size.x, height: size.y});
    }
  }
});



String.implement({
  strip_tags: function() {
    return this.replace(/(<\/?[^>]+>)/gi, '');
  }
});

//var console = (typeof console == 'undefined')?{log:function(){}}:console;

var QueryString = new Class({ 
  initialize: function() { 
    $A(location.search.replace(/^\?/,'').split('&')).each(function(s){ 
      this[s.split('=')[0]] = unescape(s.split('=')[1]); 
    }.bind(this));
  }
});



Number.implement({

  /*
  Property: numberFormat
    Format a number with grouped thousands.

  Arguments:
    decimals, optional - integer, number of decimal percision; default, 2
    dec_point, optional - string, decimal point notation; default, '.'
    thousands_sep, optional - string, grouped thousands notation; default, ','

  Returns:
    a formatted version of number.

  Example:
    >(36432.556).numberFormat()  // returns 36,432.56
    >(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
  */

  numberFormat : function(decimals, dec_point, thousands_sep) {
    decimals = Math.abs(decimals) + 1 ? decimals : 2;
    dec_point = dec_point || '.';
    thousands_sep = thousands_sep || ',';
  
    var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[3] as decimals
    var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
    return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + 
        (decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
  }

});
