	function tsearch(word, a) {
		var result = [];	
		var len = word.length;
		var min = 0;
		var max = a.length-1;
		var k = Math.floor((min+max)/2);

		if (a.length==0) return [0, -1];

		if (a.length==1) {
			//if (a[0].substr(0, len) != word) return [0, -1];
			if ( isNotEqual(a[0].substr(0, len), word) ) return [0, -1];		
			else return [0, 0];
		}

		
		
//		console.log("==================", word, len, min, max, k);
	
		// Find min.
		var count=0;
		while(min<max) {
			if ((count++)>1000) break;
			
			//if (a[k].substr(0, len) < word) {
			if ( isLess(a[k].substr(0, len), word) ) { 
				min = k;
			} else {
				max = k;
			}		
			k = Math.floor((min+max)/2);
			
		}
		
		//if (min < 0 || a[min].substr(0, len) != word) {
		if (min < 0 || isNotEqual(a[min].substr(0, len), word) ) {
			min++;
		}
		result.push(min);
		
		// Find max
//		min = 0;
		max = a.length-1;
		k = Math.floor((min+max)/2);
		count = 0;
		while(min<max) {
			if ((count++)>1000) break;
			//if (word < a[k].substr(0, len)) {
			if ( isLess(word, a[k].substr(0, len)) ) { 
				max = k;
			} else {
				min = k;
			}		
			k = Math.floor((min+max)/2);
		}
	
		//if (max <0 || a[max].substr(0, len) != word) {
		if (max <0 || isNotEqual(a[max].substr(0, len), word) ) {
			max--;
		}
		result.push(max);
	
//		console.log("min, max, a[k], a[i]", word, result[0], result[1], a[result[0]], a[result[1]]);
		
		if (result[0]>result[1]) return [0, -1];
		return result;
	}
	
	function innerToUpperCase(str) {
		return str.toUpperCase();
	}
	
	function isEqual(str1, str2) {
		return innerToUpperCase(str1) == innerToUpperCase(str2);
	}
	
	function isNotEqual(str1, str2) {
		return innerToUpperCase(str1) != innerToUpperCase(str2);
	}	

	function isLess(str1, str2) {
		return innerToUpperCase(str1) < innerToUpperCase(str2); 
	}
	
	function isGreat(str1, str2) {
		return innerToUpperCase(str1) > innerToUpperCase(str2); 
	}

var suggestSearch = {
  type: null,
  resultSingleArray: [],
  resultDoubleArray: [[],[]],
  searchWords: [],
  hashCheck : [],
  // 検索処理 **********************************
  getData: function(type, word, seriesID, category) {

	
  	
    this.type = type;
    this.resultSingleArray = [];
    this.resultDoubleArray = [[],[]];
    this.searchWords = word.split(/\s/);
    this.hashCheck = [];
    // シリーズ＆型式検索(AND検索) +++++++++++++++++++

    if (type == 0 && !seriesID) {
		var res = tsearch(word.toUpperCase(), CodesKey);
		for (var i=res[0]; i<=res[1]; i++) {
			this.resultDoubleArray[1].push(Codes[i]);
			// シリーズ未登録設定
			for (var p in Codes[i][3])
				this.hashCheck[Codes[i][3][p]] = -1;
		}

        var res = tsearch(word.toUpperCase(), SeriesKey);
		for (var j=res[0]; j<=res[1]; j++) {
			var i = SeriesKey2[j];
//			console.log(i, SeriesKey[j], SeriesHash[SeriesKey2[j]]);
			this.resultDoubleArray[0].push(SeriesHash[i]);
			// シリーズ登録
			this.hashCheck[SeriesHash[i][2]] = 1;
		}

      
      // 未登録シリーズを登録
      for (var h in this.hashCheck)
        if (this.hashCheck[h] == '-1' && SeriesHash[h])
          this.resultDoubleArray[0].push(SeriesHash[h]);
      
      //this.resultDoubleArray[0].sort(function(a, b) { return a[1]-b[1] });
      
      return this.resultDoubleArray;
    }
    // 指定シリーズに該当する型式を取得 +++++++++++++++++++
    else if (type == 0 && seriesID) {
      for (var i in Codes)
        for (var p in Codes[i][3])
          if (Codes[i][3][p] && seriesID == Codes[i][3][p])
            this.resultSingleArray.push(Codes[i]);

      return this.resultSingleArray;
    }
    // サイト内検索 +++++++++++++++++++
    else if (type == 2) {
      var res = tsearch(word.toUpperCase(), SiteWordsKey);
	  for (var i=res[0]; i<=res[1]; i++) {
         this.resultSingleArray.push(SiteWords[i]);
      }
      return this.resultSingleArray;
    }
    // 型式検索 +++++++++++++++++++
    else if (type == 3) {
      var res = tsearch(word.toUpperCase(), CodesKey);
      for (var i=res[0]; i<=res[1]; i++) {
         this.resultSingleArray.push(Codes[i]);
      }

      return this.resultSingleArray;
    }
  },
  // 検索結果判定 **********************************
  searchExc: function(searchQuery) {

    var counter = 0;
    for (var s in this.searchWords) {
      if (!this.searchWords[s]) {
        counter++;
        continue;
      }
      var searchPattern = '^' + this.searchWords[s];
      if (searchQuery.match(new RegExp(searchPattern, 'i'))) {
        counter++;
      }
    }
    return(counter == this.searchWords.length);
  }
}
