var ElementToggler = Class.create();
ElementToggler.prototype = {
  initialize: function (options) {
    this.collapsibleElementClass =    options.collapsibleElementClass   || 'collapsible';
    this.collapsibleElementTag =      options.collapsibleElement        || 'div';
    this.collapsibleElementPrefix =   options.collapsibleElementPrefix  || 'sl_';
    this.clickableElementTag =        options.clickableElementTag       || 'div';
    this.clickableElementIDPrefix =   options.clickableElementIDPrefix  || 'd_';
    this.useBlindEffect =             options.useBlind                  || false;
    this.openedInnerHTML =            options.openedInnerHTML           || '<img src="/images/bullet_expanded.gif" />';
    this.closedInnerHTML =            options.closedInnerHTML           || '<img src="/images/bullet_collapsed.gif" />';
    this.replaceClickableHTML =       options.replaceClickableHTML;
    this.elementsClosed =             options.elementsClosed            || true;
    this.toggleAllID =                options.toggleAllID               || 'toggleAll';
    this.cookieName =                 options.cookieName                || 'section_toggle';
    if (!Cookie.get(this.cookieName)) { Cookie.set(this.cookieName, ''); }
  },
  eventElements: function () {
    var _eventElements = [], elements = $$(this.clickableElementTag), fakeThis = this;
    elements.each(function(element) {
      if (element.id.match(fakeThis.clickableElementIDPrefix)) { _eventElements.push(element); }
    });
    return _eventElements;
  },
  collapsibleElements: function() {
    var _collapsibleElements = [], elements = $$(this.collapsibleElementTag), fakeThis = this;
    elements.each(function(element) {
      if (element.id.match(fakeThis.collapsibleElementPrefix)) { _collapsibleElements.push(element); }
    });
    return _collapsibleElements;
  },
  loadToggleInformation: function() {
    this.setClickableElementsToClosedHTML();  
    var availableCollapsibleElements = this.collapsibleElements(), fakeThis = this;
    availableCollapsibleElements.each(function(element) {
      if (fakeThis.elementsClosed) {
        if (Cookie.get(fakeThis.cookieName)) {
          if (Cookie.get(fakeThis.cookieName).match(element.id + ',')) { fakeThis.toggleElement(element, fakeThis.useBlindEffect, false); }
        }
      } else { fakeThis.toggleElement(element, fakeThis.useBlindEffect, true); }    
    });

    //add click event handlers
    var eventElements = this.eventElements();
    eventElements.each(function(element){
      element.useBlind = fakeThis.useBlindEffect;
      element.toggleInstance = fakeThis;
      element.clickableElementIDPrefix = fakeThis.clickableElementIDPrefix;
      Event.observe(element, 'click', function() {
        var this_instance = this, _this = '';
        while (this_instance) {
          if ((this_instance.useBlind == true) || (this_instance.useBlind == false)) {
            _this = this_instance;
            break;
          } else { this_instance = this_instance.parentNode; }
        }
        toToggle = _this.id.replace(_this.clickableElementIDPrefix, '');
        _this.toggleInstance.toggleElement($(toToggle), _this.useBlind, true);
      });   
    });
    if($(this.toggleAllID)){
      $(this.toggleAllID).toggleInstance = this;
      $(this.toggleAllID).innerHTML = this.elementsClosed ? 'Expand All' : 'Collapse All';

      Event.observe($(this.toggleAllID), 'click', function() {
        this.toggleInstance.toggleAllElements(false, true);
        $(this.toggleInstance.toggleAllID).innerHTML = ($(this.toggleInstance.toggleAllID).innerHTML == 'Expand All') ? 'Collapse All' : 'Expand All';
        return false;
      });
    }
  },
  setClickableElementsToClosedHTML: function () {
    var eventElements = this.eventElements(), fakeThis = this;
    eventElements.each(function(element) {
      if (fakeThis.replaceClickableHTML) { element.innerHTML = fakeThis.closedInnerHTML };
    });
  },
  toggleElement: function (element, useBlind, handleCookie) {
    var cssClass = element.style.display == '' ? 'closed' : 'open';
    $(this.clickableElementIDPrefix + element.id).className = cssClass;
    
    useBlind ? (new Effect.toggle(element, 'blind')) : (element.style.display = element.style.display == '' ? 'none' : '');   
    var clickableElementID = this.clickableElementIDPrefix + element.id;
    clickableElement = ($(clickableElementID) !== 'undefined') ? $(clickableElementID) : null;
    
    if (clickableElement) {
      if (element.style.display == '' || element.style.display == null) {
        if (this.replaceClickableHTML) { clickableElement.innerHTML = this.openedInnerHTML };
        if (handleCookie) { Cookie.set(this.cookieName, Cookie.get(this.cookieName) + element.id + ','); }
      } else {
        if (this.replaceClickableHTML) { clickableElement.innerHTML = this.closedInnerHTML; }
        if (handleCookie) { Cookie.set(this.cookieName, Cookie.get(this.cookieName).replace(element.id + ',', '')); }
      }
    } else { element.style.display = ''; }
  },
  resetElement: function(element, handleCookie) {
    element.style.display = 'none';
    var clickableElement = $(this.clickableElementIDPrefix + element.id);
    if (this.replaceClickableHTML) { clickableElement.innerHTML = this.closedInnerHTML };
    if (handleCookie) {
      if (Cookie.get(this.cookieName)) { Cookie.set(this.cookieName, Cookie.get(this.cookieName).replace(element.id + ',', '')); }
    }
  },
  toggleAllElements: function (useBlind, handleCookies) {
    var elements = this.eventElements(), count = 0, fakeThis = this;
    Cookie.set(this.cookieName, '');
    elements.each(function(element) { 
      var realElement = $(element.id.replace(fakeThis.clickableElementIDPrefix, ''));
      // reset element info
      fakeThis.resetElement(realElement, handleCookies);
      if (fakeThis.elementsClosed) { 
        fakeThis.toggleElement(realElement, useBlind, handleCookies); 
      } else {
        var cssClass = 'closed';
        $(element.id).className = cssClass;
      }
    });
    this.elementsClosed = !this.elementsClosed;
  }
};





var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled == 'boolean') { return navigator.cookieEnabled; }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};