Ozein.Favorite = Class.create();
Ozein.Favorite.prototype = {
  addMode: 1,
  eliminateMode: 2,
  maxMullerCnt: 50,
  initialize: function(node, options) {
    this.node = node;
    this.setOptions(options);
    //balloonの使用判定
    var cookie = new Ozein.Cookie(null);
    this.options.useBalloon = cookie.getCookie('c_tou_fav_balloon')?false:true;

    if(!this.options.balloon) return;
    if(!this.options.balloonBody) {
      this.options.balloonBody = this.options.balloon;
    }
    this.balloon = new Ozein.WindowBox($(this.options.balloon));
    this.currentBalloon = this.balloon;
    var nodes = document.getElementsByAttribute('ozein_favorite', '*', this.node);
    for(var i=0;i<nodes.length;i++) {
      Event.observe(nodes[i],'click',this.click.bindAsEventListener(this,nodes[i]));
    }
    mode = node.getAttribute('ozein_favorite_mode');
    if(mode == 2 && replaceAlt) {
      replaceAlt("out");
    } else if(mode == 1 && replaceAlt) {
      replaceAlt("in");
    }
    this.mullerCnt = this.options.mullerCnt;
  },
  setOptions: function(options) {
    this.options = {
      balloon: null,       //balloonのid
      balloonBody: null,   //balloon内部のhtmlを書き換えるid
      useBalloon: true,    //balloonを使うかどうか
      balloonOffsetX: -150,
      balloonOffsetY: -420,
      errorballoonOffsetX: -130,
      errorballoonOffsetY: -220,
      balloonZindex: 1000,
      mullerCnt: 0
    }
    Object.extend(this.options, options || {});
  },
  click: function(e, node) {
    if(!this.options.balloon) Event.stop(e);
    var mode = node.getAttribute('ozein_favorite_mode');
    var pos = [Event.pointerX(e),Event.pointerY(e)];
    var addAfter = "";
    var eliminateAfter = "";
    if ( (addFunc = node.getAttribute('onAddAfter')) ) {
      eval('addAfter = function(){'+addFunc+'}.bind(this)');
    }
    if ( (eliFunc = node.getAttribute('onEliminateAfter')) ) {
      eval('eliminateAfter = function(){'+eliFunc+'}.bind(this)');
    }
    if(mode == this.addMode) {
        this.insertKininaru(node, addAfter,pos);
    } else if(mode == this.eliminateMode) {
        this.removeKininaru(node,eliminateAfter,pos);
    }
    Event.stop(e);
  },
  showBalloon: function(x,y) {
    this.currentBalloon.windowBox.style.left = x + "px";
    this.currentBalloon.windowBox.style.top = y + "px";
    this.currentBalloon.windowBox.style.zIndex = this.options.balloonZindex;
    new Effect.Appear(this.currentBalloon.windowBox);
    var currentPos = Position.realOffset(document.getElementsByTagName('body')[0])[1];
    if(currentPos > y) {
       new Effect.ScrollTo(this.balloon.windowBox);
    }
  },
  closeBalloon: function() {
    if ($(this.options.balloon)) $(this.options.balloon).hide();
  },
  insertKininaru: function(node, func, pos) {
    count = new Number($('compare_count').value);
    if((count + 1) > 40){
       alert('40件以上選択は出来ません');
       return;
    }
    if(this.options.useBalloon) {
      this.changeBalloon(1);
      var x = (pos[0] + this.options.balloonOffsetX);
      var y = (pos[1] + this.options.balloonOffsetY);
      $('balloonFavMsg').innerHTML = 'お気に入りに登録しました。';
      $('favBlnHed').className = 'hed';
      this.showBalloon(x,y);
    }
    //お気に入りデータ登録
    var b = node.getAttribute('ozein_favorite');
    var dt = new Date();
    var url = '/Bukkensearch/compare' + '/compare_bid/' + b + '/compare_status/' + 1 + '/compare_mode/' + 1 + '/salt/' + dt.getTime();
    var beacon = new Ozein.Beacon(null, {"url":url,"salt":""});
    beacon.send();
    
    //グローバルヘッダの更新
    this.incrementCount();
    node.setAttribute('ozein_favorite_mode', this.eliminateMode);
    if(func) {
        func();
    }
  },
  insertMylist : function(pos) {
    if(!$('gFavoriteNum')) {
        return;
    }
    nowCnt = $('gFavoriteNum').innerHTML.replace('件', '');
    if(nowCnt=='') {
        nowCnt = 0;
    }
    $('gFavoriteNum').innerHTML = new Number(nowCnt)  + 1 +  '件';
    $('favCnt').innerHTML = new Number(nowCnt)  + 1;
  },
  removeKininaru: function(node,func, pos) {
    var ans = confirm('お気に入りから削除してもよろしいですか？');
    if(!ans) return;
    if(this.options.useBalloon) {
      this.changeBalloon(1);
      var x = (pos[0] + this.options.balloonOffsetX);
      var y = (pos[1] + this.options.balloonOffsetY);
      $('balloonFavMsg').innerHTML = 'お気に入りから削除しました。';
      $('favBlnHed').className = 'hed del';
      this.showBalloon(x,y);
    }
    var dt = new Date();
    var b = node.getAttribute('ozein_favorite');
    var url = '/Bukkensearch/compare' + '/compare_bid/' + b + '/compare_status/' + 0 + '/compare_mode/' + 1 + '/salt/' + dt.getTime();
    var beacon = new Ozein.Beacon(null, {"url":url,"salt":""});
    beacon.send();
    node.setAttribute('ozein_favorite_mode', this.addMode);
    //グローバルヘッダの更新
    this.decrementCount();
    if(func) func();
  },
  disableBalloon:function() {
    this.options.useBalloon = false;
  },
  enableBalloon:function() {
    this.options.useBalloon = true;
  },
  incrementCount: function(i) {
    if(!i) i = 1;
    this.mullerCnt += i;
    //グローバルヘッダの更新
    if($('gFavoriteNum')){
        $('gFavoriteNum').innerHTML = new Number(this.mullerCnt) +  '件';
    }
  },
  decrementCount: function(i) {
    if(!i) i = 1;
    this.mullerCnt -= i;
    if($('gFavoriteNum')){
      $('gFavoriteNum').innerHTML = new Number(this.mullerCnt) +  '件';
    }
  },
  getMullerCount: function() {
    return this.mullerCnt;
  },
  //バルーンの中身を変更する 1:正常 2:異常
  changeBalloon: function(mode) {
    if(mode == 1) {
      this.currentBalloon = this.balloon;
    } else {
      $(this.options.balloon).hide();
      this.currentBalloon = this.balloon;
    }
  },
  ////////////////////////////////////////////
  /**
  * お気に入りへ追加
  */
  modifyFavorite: function(b) {
      if(!b) return ;
      this._clearBalloon(b);
      //トラッキング
      value = $('favorite'+ b).getAttribute('ozein_uacct_favorite');
      array = value.split(';');
      _uacct = array[0];
      if (array[1]) {
          _udn = array[1].split('=')[1];
      }
      if (array[1]) {
          _ulink = array[2].split('=')[1];
      }
      urchinTracker('favorite_window');
      //site catalyst
      var s = s_gi(s_account);
      s.linkTrackVars="products,events,evar31";
      s.linkTrackEvents = "event9";
      s.events="event9";
      var bid = "" + b;
      s.products="';03_" + b + ";;;;evar30=" + bid.substr(0, 5) + "|evar31=base';";
      s.tl(this, "o","event9");
      //一覧表示からの場合
      $('favorite'+ b).ozein_favorite_mode = 2;
      if($('em'+ b)) {
          $('em'+ b).innerHTML = new Number($('em'+b).innerHTML) + 1;
      }
      $('favorite'+b).className = 'addFin';
      $('favorite'+b).title = '登録済み';
      $('favorite'+b).innerHTML = '登録済み';
      $('compare_count').value = new Number($('compare_count').value) + 1;

  },
  /**
  * お気に入りへ追加（物件詳細）
  */
  modifyFavoriteDetail: function(b) {
      if(!b) return ;
      //トラッキング
      value = $('favorite'+ b).getAttribute('ozein_uacct_favorite');
      array = value.split(';');
      _uacct = array[0];
      if (array[1]) {
          _udn = array[1].split('=')[1];
      }
      if (array[1]) {
          _ulink = array[2].split('=')[1];
      }
      urchinTracker('favorite_window');
      //site catalyst
      var s = s_gi(s_account);
      s.linkTrackVars="products,events,evar30,evar31";
      s.linkTrackEvents = "event9";
      s.events="event9";
      var bid = "" + b;
      s.products="';03_" + b + ";;;;evar30=" + bid.substr(0, 5) + "|evar31=base';";
      s.tl(this, "o","event9");
      this._clearBalloon(b);
      $('addCmpLst').removeChild($('favorite'+b));
      $('compare_count').value = new Number($('compare_count').value) + 1;
      $('addCmpLst').innerHTML="<span class=\"on\">お気に入り登録済み</span>";
  },
  /**
  * お気に入り削除
  */
  modifyNonFavorite: function(b) {
      if(!b) return ;
      this._clearBalloon(b);
      $('favorite'+ b).ozein_favorite_mode = 1;
      //一覧表示からの場合
      if($('em'+ b)) {
          $('em'+ b).innerHTML = new Number($('em'+b).innerHTML) - 1;
      }
      $('favorite'+b).className = 'add';
      $('favorite'+b).title = '登録する';
      $('favorite'+b).innerHTML = '登録する';
      $('compare_count').value = new Number($('compare_count').value) - 1;
  },
  /**
  * 登録バルーンを閉じる
  */   
  _clearBalloon: function(b) {
      $('favCnt').innerHTML = Ozein.Invoker.var_stock['fd'].getMullerCount();
  }
  ////////////////////////////////////////////
}
