/* vim:set ts=2 sw=2 sts=2 ai si nu et ft=javascript ff=dos:

  Last Change: 13-April-2010 20:21:32.
  Author: Technical team.
  Copyright: (C)Anchor Group K.K.

  URL: http://www.anchor-gr.jp/labo.html
  EMAIL: info@anchor-gr.jp

  Filename: smarttab.js

 ---------------------------------------------------------*/
var smartTabVersion = "1.0.0";

/* Global config */

var smartTabLinkDisable = true;
var smartTabActiveClass = "active";
var smartTabDeActiveImageSuffix = "_df";
var smartTabActiveImageSuffix = "_on";
var smartTabImageExt = "(\.(gif|jpe?g|png))";

if(! Array.indexOf) {
  Array.prototype.indexOf = function(o)
  {
    for(var i in this) {
      if(this[i] == o) {
        return i;
      }
    }
    return -1;
  }
}

function smartImageTab(tabclass, selected)
{
  smartTab(tabclass, selected, true);
}

function smartTab(tabclass, selected, imagemode)
{
  var IMGON = smartTabActiveImageSuffix;
  var IMGOFF = smartTabDeActiveImageSuffix;
  var IMGEXT = smartTabImageExt;
  var REG_IMGON = new RegExp(IMGON + IMGEXT + '$');
  var REG_IMGOFF = new RegExp(IMGOFF + IMGEXT + '$');
  var REG_HREF = new RegExp('^[^#]*#(.+)$');

  var IMAGEMODE = imagemode;
  var divs = document.getElementsByTagName("div");
  var tabs = new Array();
  var contents = new Array();

  var css = function(o, v)
  {
    var r = null;
    var cl = "class"; var cln = "className";

    if (typeof(v) == "undefined") {
      r = (o.getAttribute(cl)||o.getAttribute(cln));
    } else {
      (o.setAttribute(cl, v)||o.setAttribute(cln, v));
    }

    return r;
  };

  var image = function(o, on) {
    if (IMAGEMODE) {
      var c = o.childNodes[0];
      var reg = REG_IMGON;
      var img = IMGOFF;

      if (on) { reg = REG_IMGOFF; img = IMGON; };

      if (c.tagName.toLowerCase() == "img") {
        c.src = c.src.replace(reg, img + "$1");
      }
    }
  };

  var active = function(o) {
    css(o, smartTabActiveClass);
    image(o, true);
  };

  var deactive = function(o) {
    css(o, null);
    image(o, false);
  };

  var show = function(o) { o.style.display = "block"; };
  var hidden = function(o) { o.style.display = "none"; };

  var jumpid = function(o)
  {
    if (o.getAttribute("href").match(REG_HREF)) {
      return RegExp.$1;
    } else {
      return;
    }
  };

  var returnfalse = function(e)
  {
    if (e.preventDefault) {
      e.preventDefault();
    } else if (window.event) {
      window.event.returnValue = false;
    }
  };

  var onclick = function(e)
  {
    for (var j=0; j<contents.length; j++) {
      var c = contents[j];

      if (c.id == jumpid(this)) {
        show(c);

        for (var k=0; k<tabs.length; k++) {
          var o = tabs[k];
          var ci = o.childNodes[0];

          if (jumpid(o) == c.id) {
            active(o);
          } else {
            deactive(o);
          }
        }

      } else {
        hidden(c);
      }
    }

    if (smartTabLinkDisable) { returnfalse(e); };
  };

  var attach = function(el, handler)
  {
    if (el.addEventListener) {
      el.addEventListener(
        'click', function(e){ handler.call(this, e);}, false
      );
    } else {
      el.attachEvent(
        'onclick', function(){ handler.call(el, window.event);}
      );
    }
  };

  for (var i=0; i<divs.length; i++) {
    var cls = (css(divs[i])||"").split(" ");

    for (var j=0; j<cls.length; j++) {
      var cl = cls[j];

      if (cl == tabclass) {
        var childs = divs[i].childNodes;

        for (var k=0; k<childs.length; k++) {
          var child = childs[k];

          if ((child.tagName||"").toLowerCase() == "a") {
            if (child.getAttribute("href").match(REG_HREF)) {
              var name = RegExp.$1;

              tabs.push(child);
              if (contents.indexOf(name) == -1) {
                contents.push(document.getElementById(name));

              }
            }
          }
        }
      }
    }
  }

  for (var i=0; i<tabs.length; i++) {
    var name = jumpid(tabs[i]);
    if (name == selected) { active(tabs[i]); };
  }

  for (var i=0; i<contents.length; i++) {
    var o = contents[i];
    (o.id == selected) ? show(o) : hidden(o);
  }

  if (typeof(selected) == "undefined") {
    var id = jumpid(tabs[0]);

    for (var i=0; i<tabs.length; i++) {
      if (jumpid(tabs[i]) == id) {
        active(tabs[i]);
      }
    }

    for (var i=0; i<contents.length; i++) {
      if (contents[i].id == id) {
        show(contents[i]);
        break;
      }
    }
  }

  for (var i=0; i<tabs.length; i++) {
    var el = tabs[i];
    attach(el, onclick);
  }

}


