(function($) {

// 初期設定
var options = {
  noteType: "text",
  classNameNotice: "notice",
  classNameBtNext: "noticeNext",
  classNameBtBack: "noticeBack",
  classNameBtExit: "noticeExit",
  classNameTooltip: "tooltip",
  classNameArrow: "arrow",
  htmlBtNext: "next",
  htmlBtBack: "back",
  htmlBtExit: "exit",
  isBtNext: true,
  isBtBack: true,
  isBtExit: true,
  isArrow: true,
  cornerNotice: 32,
  cornerTooltip: 16,
  loop: true
}
var max_zIndex = 999; //ページ内の最大z-index
var query = new Date().getTime(); //ID付加用のクエリ
var firstPosition = {}; //開始前の画面スクロール位置
var BeginnersHelper = function(){};

BeginnersHelper.prototype = {
  counter: 0, //何番目の要素のツールチップを表示しているか
  targets: [], //下記コメントでの"target"の配列

/*
var target = { //dataの中身
  obj: "", //jQueryオブジェクト
  note: "" //ツールチップに表示するテキスト
}
*/

  start: function(data, user_options){
    // 初期設定読み込み
    if(typeof(data)==="object"){
      $.each(user_options,function(key,val){
        if(typeof(user_options[key])===typeof(options[key])){
          options[key] = user_options[key];
        }
      });
    }
    
    $("*", $("body")).each(function(){
      if(typeof($(this).css("zIndex"))==="number" && $(this).css("zIndex") >= max_zIndex){
        max_zIndex = $(this).css("zIndex") + 1;
      }
    });

    for(var i=0;i<data.length;i++){
      var candidate = {};
      if(isDomNode(data[i].obj.get(0))){
        candidate.obj = $(data[i].obj.get(0));
        candidate.note = data[i].note;
        this.targets.push(candidate);
      }
      candidate = null;
    }


    // 現在地取得
    firstPosition = {scrollTop:$(window).scrollTop(),scrollLeft:$(window).scrollLeft()};

    this.show(0);
  },
  show: function(num){
    num = num%this.targets.length;
    if(num < 0){
      num += this.targets.length;
    }
    if(typeof(num)==="number" && num < this.targets.length){
      this.targets[num].obj.notice(this.targets[num].note);
    }
  },
  showNext: function(){
    if(this.counter < this.targets.length-1 || options.loop){
      this.show(++this.counter);
    }
  },
  showBack: function(){
    if(this.counter > 0 || options.loop){
      this.show(--this.counter);
    }
  },
  exit: function(){
    $("#notice"+query).remove();
    $("#tooltip"+query).remove();
    $("#tooltip_arrow"+query).remove();
    $('html').animate(firstPosition,"fast");
    this.counter = 0;
    this.targets = [];
  }
};

$.fn.extend({
  setNote: function(str){
    if(options.noteType==="html"){
      return $(this).html(str);
    }else{
      $("<p>").text(str).appendTo($(this));
      return $(this);
    }
  },
  notice: function(tooltip_text){
    var self = this;

    // 要素の囲い
    $("#notice"+query).remove();
    $("<div id='notice"+query+"' class="+options.classNameNotice+">")
      .css({
        display: "block",
        position: "absolute",
        top: -9999,
        width: this.outerWidth(),
        height: this.outerHeight(),
        zIndex: max_zIndex
      })
      .appendTo("body")
    // 説明文
    $("#tooltip"+query).remove();
    $("<blockquote id='tooltip"+query+"' class='"+options.classNameTooltip+"'>")
      .css({
        position: "absolute",
        top: -9999,
        zIndex: max_zIndex
      })
      .setNote(tooltip_text)
      .appendTo("body");
    // ボタン
    if(options.isBtBack){
      $("<button class='"+options.classNameBtBack+"'>")
        .click(function(){$.beginnersHelper.showBack();})
        .html(options.htmlBtBack)
        .appendTo("#tooltip"+query);
    }
    if(options.isBtExit){
      $("<button class='"+options.classNameBtExit+"'>")
        .click(function(){$.beginnersHelper.exit();})
        .html(options.htmlBtExit)
        .appendTo("#tooltip"+query);
    }
    if(options.isBtNext){
      $("<button class='"+options.classNameBtNext+"'>")
        .click(function(){$.beginnersHelper.showNext();})
        .html(options.htmlBtNext)
        .appendTo("#tooltip"+query);
    }
    $("<div>").css("clear","both").appendTo("#tooltip"+query);
    // ページスクロール
    $('html').animate(
      {scrollTop: self.offset().top - ($(window).height()/2)},
      {duration:'fast',complete:function(){
        $("#notice"+query)
          .hide()
          .css({
            top: self.offset().top - (parseInt($("#notice"+query).css("paddingTop"))+parseInt($("#notice"+query).css("borderTopWidth"))),
            left: self.offset().left - (parseInt($("#notice"+query).css("paddingLeft"))+parseInt($("#notice"+query).css("borderLeftWidth")))
          })
          .fadeIn("fast");
        $("#tooltip"+query)
          .hide()
          .css(tooltipStyle())
          .fadeIn("fast");
      }});
    return this;
  }
});

// DOM Node かどうかの判定
// http://zombiebook.seesaa.net/article/44919023.html
function isDomNode(e){
  if((e && typeof(e.nodeType)=='number') || e===null){
    try{
      e.nodeType = e.nodeType;
    }catch(n){
      return true;
    }
  }
  return false;
}

// ツールチップ表示位置調整
function tooltipStyle(){
  var pos = {
    top: $("#notice"+query).offset().top - $("#tooltip"+query).outerHeight("margin"),
    left: $("#notice"+query).offset().left + ($("#notice"+query).width()/2),
    position: "absolute"
  };
  if(options.isArrow){
    // 説明文ふきだし
    $("#tooltip_arrow"+query).remove();
    $("<span>")
      .addClass(options.classNameArrow)
      .attr("id","tooltip_arrow"+query)
      .appendTo("#tooltip"+query);
  }
  if(pos.top < 10){
    pos.top = $("#notice"+query).offset().top + $("#notice"+query).outerHeight();
    $("#tooltip_arrow"+query).prependTo($("#tooltip"+query));
    $("#tooltip_arrow"+query).addClass("top");
  }else{
    $("#tooltip_arrow"+query).addClass("bottom");
  }
  return pos;
}

$.beginnersHelper = new BeginnersHelper;

})(jQuery);
