/**
 * StopBack
 * @description Prevent from transit a previous page on click stop button
 * @author    Akiyoshi Tanaka <akiyoshi@mindia.jp>
 * @copyright Copyright (c) 2008 Mindia, Inc. (http://mindia.jp)
 * @license   MIT license http://www.opensource.org/licenses/mit-license.php
 */
var Mindia = Mindia || {};
(function(){
  // 監視クラス
  var Observer = function(condition, event, interval){
    var running = false;
    var func = function(){
      if (!running){
        return;
      }
      if (condition()){
        event();
      }else{
        setTimeout(func, interval);
      }
    }
    this.start = function(){
      running = true;
      func();
    }
    this.stop = function(){
      running = false;
    }
  }
  // ダイアログ生成クラス
  var DialogFactory = function(){
    this.createOkCancel = function(init, ok, cancel){
      var dialog = {
        _text: '移動しますか？',
        text: function(str){
          this._text = str;
        },
        open: function(){
          if (window.confirm(this._text)){
            ok(dialog);
          }else{
            cancel(dialog);
          }
        }
      }
      init(dialog);
      return dialog;
    }
  }
  Mindia.StopBack = new (function(){
    // 戻る防止が機能しているときのURLフラグメント
    var editingFragment = 'compose';
    var originalLocation = document.location + '';
    
    var locationObserver;
    var dialog;
    var handler;
    
    // 戻った場合のダイアログ
    var dialogFactory = new DialogFactory();
    dialog = dialogFactory.createOkCancel(
      // 初期化
      function(obj){
        obj.text('編集中のテキストがあります。移動しますか？');
      },
      function(obj){
        // OKならさらに戻る実行
        //location.reload(true); return false;
        history.back();
      },
      function(obj){
        // cancelなら戻ったことをなかったことにする
        history.forward();
        // 再始動
        handler.start();
      }
    );

    var pattern = new RegExp(editingFragment + '$');
    // locationを監視する
    locationObserver = new Observer(function(){
      // locationがcomposeではなくなった＝戻るが押された
      var doc = document.location + '';
      return !doc.match(pattern);
    }, function(){
      // ダイアログをオープン
      location.reload(true); return false;
      //dialog.open();
    }, 500);

    // StopBackの制御オブジェクト
    handler = {
      start: function(){
        // 編集中状態にURLを変更
        document.location = originalLocation + '#' + editingFragment;
        // 変更を監視
        locationObserver.start();
      },
      stop: function(){
        // 監視をやめる
        locationObserver.stop();
        // URLを元に戻す
        document.location.replace(originalLocation + '#');
      }
    };
    this.getHandler = function(){
      return handler;
    }
  });
})();
