/* --------------------------------------------------------------------------------------
 * showpane.js
 * version 2.02
 * Required common.js ver1.60 later
 * @20090413
-------------------------------------------------------------------------------------- */

/* start */
function fncShowPane(targetId, opts){
  new ShowPane(targetId, opts);
}

var ShowPane = function() {this.initialize.apply(this, arguments)}
ShowPane.prototype = {
  TOGGLE_NAME: 'toggle',
  PANE_NAME: 'pane',
  ID_PREFIX: 'sp-',
  TOGGLE_OPEN_CLASS: 'open',
  TOGGLE_CLOSE_CLASS: 'close',
  INITIAL_STATE: 'close',
  IS_SHOW_HIDE_ALL: false,
  SHOW_ALL_CLASS: 'showAll',
  HIDE_ALL_CLASS: 'hideAll',
  DIV_ALL_ID: 'showpaneAll',
  DIV_ALL_POS: 'top',
  SHOW_ALL_HTML: 'Expand All',
  HIDE_ALL_HTML: 'Collapse All',
  IS_COOKIE: false,
  COOKIE_NAME: 'vcomn_showpene',
  COOKIE_DAY: null,
  initialize: function (targetId, opts) {
    opts = opts || {};
    this.opts = {};
    this.opts.openClass = opts.openClass || this.TOGGLE_OPEN_CLASS;
    this.opts.closeClass = opts.closeClass || this.TOGGLE_CLOSE_CLASS;
    this.opts.initialState = opts.initialState || this.INITIAL_STATE;
    this.opts.isShowHideAll = typeof opts.isShowHideAll != 'undefined' ? opts.isShowHideAll : this.IS_SHOW_HIDE_ALL;
    this.opts.showAllClass = typeof opts.showAllClass == 'string' ? opts.showAllClass : this.SHOW_ALL_CLASS;
    this.opts.hideAllClass = typeof opts.hideAllClass == 'string' ? opts.hideAllClass : this.HIDE_ALL_CLASS;
    this.opts.divAllId = typeof opts.divAllId == 'string' ? opts.divAllId : this.DIV_ALL_ID;
    this.opts.divAllPos = opts.divAllPos || this.DIV_ALL_POS;
    this.opts.showAllHtml = opts.showAllHtml || this.SHOW_ALL_HTML;
    this.opts.hideAllHtml = opts.hideAllHtml || this.HIDE_ALL_HTML;
    this.opts.isCookie = typeof opts.isCookie != 'undefined' ? opts.isCookie : this.IS_COOKIE;
    this.opts.cookieName = opts.cookieName || this.COOKIE_NAME;
    this.opts.cookieDay = typeof opts.cookieDay != 'undefined' ? opts.cookieDay : this.COOKIE_DAY;
    this.regexp = new RegExp('^' + this.ID_PREFIX + this.TOGGLE_NAME + '(.*)$');//^)
    this.toggles = [];
    this.parents = [];
    this.searches = VCOMN.getSearchParams() || {};
    if (this.opts.isCookie) {
      this.pathCookies = [];
      var cookie = VCOMN.getCookie(this.opts.cookieName);
      if (cookie) {
        this._cookies = [];
        var pathCookies = cookie.split(';');
        for (var i = 0; i < pathCookies.length; i++) {
          var matches = pathCookies[i].match(/^path=(.*)\&value=(.*)$/);
          if (matches.length != 3) continue;
          if (matches[1] == location.pathname) {
            this._cookies = matches[2].split('-');
          } else {
            this.pathCookies.push(pathCookies[i]);
          }
        }
      }
    }
    for (var key in this.searches) {
      switch (this.searches[key]) {
      case 'o':
        this.searches[key] = this.opts.openClass
        break;
      case 'c':
        this.searches[key] = this.opts.closeClass
        break;
      }
    }
    this._initPane(targetId);
    var dummy = document.body.scrollTop || document.documentElement.scrollTop;
  },
  _initPane: function (targetId) {
    var hashElem = null;
    var hash = location.hash.replace(/^#/, '');
    if (hash) {
      hashElem = document.getElementById(hash);
    }
    var rootElem = targetId ? document.getElementById(targetId) : document;
    var elems = rootElem.getElementsByTagName('*');
    for (var i=0; i < elems.length; i++) {
      this.checker(elems[i]);
    }
    if (this.opts.isShowHideAll) {
      for (var i = 0; i < this.parents.length; i++) {
        var div = document.createElement('DIV');
        if (this.opts.divAllId) {
          div.id = this.opts.divAllId;
          if (this.parents.length > 1) {
            div.id += (i + 1);
          }
        }
        var childOpen = this.parents[i].childs[0].pane.style.display != 'none';
        for (var j = 1; j < this.parents[i].childs.length; j++) {
          if (childOpen != (this.parents[i].childs[j].pane.style.display != 'none')) {
            childOpen = 'no';
            break;
          }
        }
        var span = document.createElement('SPAN');
        var isHideAll = childOpen;
        if (typeof childOpen == 'string') {
          isHideAll = this._cookies && !+this._cookies[this.toggles.length + i];
        }
        span.className = isHideAll ? this.opts.hideAllClass : this.opts.showAllClass;
        span.innerHTML = isHideAll ? this.opts.hideAllHtml : this.opts.showAllHtml;
        this._initAllControl(span, this.parents[i].childs);
        this.parents[i].trigger = span;
        div.appendChild(span);
        if (this.opts.divAllPos == 'top') {
          this.parents[i].elem.parentNode.insertBefore(div, this.parents[i].elem);
        } else {
          this.parents[i].elem.parentNode.insertBefore(div, this.parents[i].elem.nextSibling);
        }
      }
    }
    if (hashElem) {
      var top = VCOMN.cumulativeOffset(hashElem)[1];
      document.body.scrollTop = document.documentElement.scrollTop = top;
    }
  },
  /* check */
  checker: function (elem) {
    if (!elem.id) return;
    var matched = elem.id.match(this.regexp);
    if (matched == null) {
      return;
    }
    this.addEvent(elem, matched[1]);
  },
  /* add mouseEvent */
  addEvent: function (toggleElem, paneSuffix) {
    toggleElem.style.cursor = 'pointer';
    var paneId = this.ID_PREFIX + this.PANE_NAME + paneSuffix;
    var paneElem = document.getElementById(paneId);
    if (!paneElem) return;
    var display;
    if (!this.searches[toggleElem.id] && this._cookies && this._cookies.length >= this.toggles.length) {
      display = this._cookies[this.toggles.length] == '1' ? '' : 'none';
    } else {
      if (this.opts.initialState == 'open') {
        display = (this.searches[toggleElem.id] == this.opts.closeClass ||
          (this.searches[toggleElem.id] != this.opts.openClass && VCOMN.hasClass(toggleElem, this.opts.closeClass))) ? 'none' : '';
      } else {
        display = (this.searches[toggleElem.id] == this.opts.openClass || 
          (this.searches[toggleElem.id] != this.opts.closeClass && VCOMN.hasClass(toggleElem, this.opts.openClass))) ? '' : 'none';
      }
    }
    this.setDisplay(toggleElem, paneElem, display, false);
    toggleElem.onclick = VCOMN.bindFunc(this.setDisplay, this, toggleElem, paneElem, null, true);
    this.toggles.push({elem:toggleElem, pane:paneElem, suffix:paneSuffix});
    var existParent = false;
    for (var i = 0; i < this.parents.length; i++) {
      if (this.parents[i].elem === paneElem.parentNode) {
        existParent = true;
        this.parents[i].childs.push(this.toggles[this.toggles.length - 1]);
        break;
      }
    }
    if (!existParent) {
      this.parents.push({elem: paneElem.parentNode, childs: [this.toggles[this.toggles.length - 1]]});
    }
  },
  setDisplay: function (toggleElem, paneElem, display, isSaveCookie) {
    if (display === null) {
      display = paneElem.style.display == 'none' ? '' : 'none';
    }
    if (display == 'none') {
      VCOMN.removeClass(toggleElem, this.opts.openClass);
      VCOMN.addClass(toggleElem, this.opts.closeClass);
    } else {
      VCOMN.removeClass(toggleElem, this.opts.closeClass);
      VCOMN.addClass(toggleElem, this.opts.openClass);
    }
    paneElem.style.display = display;
    if (isSaveCookie) {
      this.saveCookie();
    }
  },
  _initAllControl: function (triggerElem, targets) {
    triggerElem.style.cursor = 'pointer';
    VCOMN.EventObserve(triggerElem, 'click', VCOMN.bindFunc(this.clickAllControl, this, triggerElem, targets), false);
  },
  clickAllControl: function (triggerElem, targets) {
    var isOpen = VCOMN.hasClass(triggerElem, this.opts.showAllClass);
    VCOMN.addClass(triggerElem, isOpen ? this.opts.hideAllClass : this.opts.showAllClass);
    VCOMN.removeClass(triggerElem, isOpen ? this.opts.showAllClass : this.opts.hideAllClass);
    triggerElem.innerHTML = isOpen ? this.opts.hideAllHtml : this.opts.showAllHtml;
    for (var i = 0; i < targets.length; i++) {
      this.setDisplay(targets[i].elem, targets[i].pane, isOpen ? '' : 'none', false);
    }
    this.saveCookie();
  },
  saveCookie: function () {
    if (!this.opts.isCookie) return;
    var values = [];
    for (var i = 0; i < this.toggles.length; i++) {
      values.push(VCOMN.hasClass(this.toggles[i].elem, this.opts.openClass) ? 1 : 0);
    }
    for (var i = 0; i < this.parents.length; i++) {
      values.push(VCOMN.hasClass(this.parents[i].trigger, this.opts.showAllClass) ? 1 : 0);
    }
    var cookie = 'path=' + location.pathname + '&value=' + values.join('-');
    VCOMN.setCookie(this.opts.cookieName, this.pathCookies.concat([cookie]).join(';'), this.opts.cookieDay, null, '/');
  }
};


