// 
// リンク付リストデータの配列オブジェクトをソートするクラス
//
// 引数：listArray = 対象リンク付リスト(配列)
//      key = キーを格納するプロパティ名
//      reference = 参照キーを格納するプロパティ名
//      terminator = 最後の配列セルのreferenceに格納される終端値
//      targetKey = 参照元セルを検索する際のキー値
//
// 07/10/18 (c) Ohsako,Junichi


// コンストラクタ
var LinkedList =
function (listArray, key, reference, terminator) {

  // インスタンス変数の初期化
  this.listArray = listArray;
  this.key = key;
  this.reference = reference;
  this.terminator = terminator;

  // 対象配列へのアクセサメソッド
  this.getList =
  function() {
    return this.listArray;
  }

  // 参照リンクによるセルのソートを行うメソッド
  this.sortingList =
  function () {
    // 最初に最後のセルを検索
    var targetIndex = this.searchIndex(this.terminator);
    for(var i = 0; i < this.listArray.length; i++) {
      // 検索されたセルを配列から除き配列の最初のセルとして挿入
      this.listArray.unshift(this.listArray.splice(targetIndex, 1)[0]);
      // ひとつ前の参照元セルを検索
      targetIndex = this.searchIndex(this.listArray[0][this.key]);
    }
  }

  // キーの参照元セルを取得するメソッド
  this.searchIndex =
  function (targetKey) {
    // 各セルのキー値照合
    for(var i = 0; i < this.listArray.length; i++) {
      if(this.listArray[i][this.reference] == targetKey) {
        return i;
      }
    }
    return false;
  }
}
