/**
 *  クロスブラウザ対応 イベントハンドラ追加メソッド
 *  遅延ロード ver.
 */
var addListener = function(target, type, handler) {
  if (target.addEventListener) {
    addListener = function(target, type, handler) {
      target.addEventListener(type, handler, false);
    };
  } else {
    addListener = function(target, type, handler) {
      //target.attachEvent('on' + type, handler);
      target.attachEvent('on' + type, function() {
        handler.apply(target, arguments);
      });
    };
  }

  addListener(target, type, handler);
};

/**
 *  クロスブラウザ対応 イベントハンドラ削除メソッド
 *  遅延ロード ver.
 */
var removeListener = function(target, type, handler) {
  if (target.removeEventListener) {
    removeListener = function(target, type, handler) {
      target.removeEventListener(type, handler, false);
    };
  } else {
    removeListener = function(target, type, handler) {
      target.detachEvent('on' + type, handler);
    };
  }
  removeListener(target, type, handler);
};

// _____________________________________________________________________________
//

(function(){

  /**
   * smart rollover
   */
  var smartRollover = function() {
    var default_suffix = '_off';
    var replace_suffix = '_on';
    var swap_images = [];
    var preloads = [];

    if(document.getElementsByTagName) {
      var images = document.getElementsByTagName('img');
      for(var i=0, l=images.length; i < l; i++) {
        var img = images[i];
        if(img.getAttribute('src').match(default_suffix + '.')) {
          swap_images.push(img);
        }
      }

      var inputs = document.getElementsByTagName('input');
      for(i=0, l=inputs.length; i < l; i++) {
        var input = inputs[i];
        if(input.getAttribute('type') == 'image' && input.getAttribute('src').match(default_suffix + '.')) {
          swap_images.push(input);
        }
      }

      for(i=0, l=swap_images.length; i < l; i++) {
        var img = swap_images[i];
        // preload swap images
        preloads.push(new Image());
        preloads[preloads.length-1].src = img.getAttribute('src').replace(default_suffix + '.', replace_suffix + '.');

        // swap event handler
        img.onmouseover = function() {
          this.setAttribute('src', this.getAttribute('src').replace(default_suffix + '.', replace_suffix + '.'));
        }
        img.onmouseout = function() {
          var class_names = this.className.
                                 replace( /(?:^[\x09\x0A\x0C\x0D\x20]+)|(?:[\x09\x0A\x0C\x0D\x20]+$)/g, '').
                                 split( /[\x09\x0A\x0C\x0D\x20]+/ );
          var isOn = false;
          for (var i in class_names) {
            if (class_names[i].indexOf('on') >= 0) {
              isOn = true;
              break;
            }
          }
          if (!isOn) {
            this.setAttribute('src', this.getAttribute('src').replace(replace_suffix + '.', default_suffix + '.'));
          }
        }
      }
    }
  };


  /**
   *  smooth scroll
   */
  var setSmoothScroll = function() {
    var targetClass = 'ss';
    var pattern = /\#[a-zA-Z0-9_-]+/;
    var d = document;

    // click event-handler
    var smoothScroll = function(anchor) {
      var targetObj = d.getElementById(anchor.name);
      if (targetObj == null || targetObj == undefined) {
        return false;
      }

      // move point
      var end = targetObj.offsetTop;
      var docHeight = d.documentElement.scrollHeight;
      var winHeight = window.innerHeight || d.documentElement.clientHeight
      if (docHeight - winHeight < end ){
        end = docHeight - winHeight;
      }

      // current point
      var start = window.pageYOffset || d.documentElement.scrollTop || d.body.scrollTop || 0;

      // move direction
      var direction = end < start ? 'up' : 'down';

      // scroll
      var doScroll = function(start, end, direction) {
        setTimeout (function() {
          if (direction == 'up' && start >= end) {
            start = start - (start - end) / 20 - 1;
            window.scrollTo(0, start);
            doScroll(start, end, direction);
          } else if (direction == 'down' && start <= end) {
            start = start + (end - start) / 20 + 1;
            window.scrollTo(0, start);
            doScroll(start, end, direction);
          } else {
            scrollTo(0, end);
          }
          return false;
        }, 10);
      };
      doScroll(start, end, direction);
    };

    var anchors = d.getElementsByTagName('a');
    for (var i = 0, l = anchors.length; i < l; i++) {
      var anchor = anchors[i];
      if ((anchor.getAttribute('class') == targetClass || anchor.getAttribute('className') == targetClass)
      &&  pattern.test(anchor.href)
      &&  anchor.href.replace(pattern, '') == location.href.replace(pattern, '')) {
        anchor.name = anchor.href.replace(/.*\#/, '');
        anchor.href = 'javascript:void(0);';

        addListener(anchor, 'click', function() {
          smoothScroll(this);
        });
      }
    }
  };


  /**
   * [for IE6]
   * fix PNG Images
   */
  var fixPng = function() {
    if(typeof DD_belatedPNG != 'undefined') {

      // fix smart RollOver
      var oldFixPng = DD_belatedPNG.fixPng;
      DD_belatedPNG.fixPng = function(el) {
        oldFixPng(el);
        if(el.vml && el.vml.image.fill.getAttribute('src').match(/_off\./)) {
          el.vml.image.shape.attachEvent('onmouseenter', function() {
            var image = el.vml.image.fill;
            image.setAttribute('src', image.getAttribute('src').replace('_off.', '_on.'));
          });
          el.vml.image.shape.attachEvent('onmouseleave', function() {
            var class_names = el.className.
                                 replace( /(?:^[\x09\x0A\x0C\x0D\x20]+)|(?:[\x09\x0A\x0C\x0D\x20]+$)/g, '').
                                 split( /[\x09\x0A\x0C\x0D\x20]+/ );
            var isOn = false;
            for (var i in class_names) {
              if (class_names[i].indexOf('on') >= 0) {
                isOn = true;
                break;
              }
            }
            if (!isOn) {
              var image = el.vml.image.fill;
              image.setAttribute('src', image.getAttribute('src').replace('_on.', '_off.'));
            }
          });
        }
      };

      // fix PNG images
      DD_belatedPNG.fix('img, .png');
    }
  };


  // _____________________________________________________________________________
  //

  /**
   * initialize page
   */
  addListener(window, 'load', function() {
    smartRollover();
    setSmoothScroll();
    fixPng();
  });

})();
