/*
 *	jquery.suggest 1.1 - 2007-08-06
 *
 *  modified 2010-03-17
 *  modified 2010-05-18 by yamamoto@team-lab.com
 *	
 *	Uses code and techniques from following libraries:
 *	1. http://www.dyve.net/jquery/?autocomplete
 *	2. http://dev.jquery.com/browser/trunk/plugins/interface/iautocompleter.js	
 *
 *	All the new stuff written by Peter Vulgaris (www.vulgarisoip.com)	
 *	Feel free to do whatever you want with this file
 *
 */
company_map= new Array();

(function($) {

	$.suggest = function(input, options) {

		var $input = $(input).attr("autocomplete", "off");
		var $results = $(document.createElement("ul"));
		
		
		var isfocus = false;
		var intervalId = false;
		var prevVal = '';			// last recorded $input.val()
		var cache = [];				// cache MRU list
		var cacheSize = 0;			// size of cache in chars (bytes?)
		
		var $submitButton = $(options.submitButton);
		
		$results.addClass(options.resultsClass).appendTo('body');
		check_company_validity();

		resetPosition();
		$(window)
			.load(resetPosition)		// just in case user is changing size of page while loading
			.resize(resetPosition);


		$input.blur(function() {
		/*
		プログラミング用にコメントアウト
			setTimeout(function() { $results.hide() }, 200);
			isfocus = false;
			if ($.browser.mozilla || $.browser.opera || $.browser.safari) {
				if (intervalId) {
					clearInterval(intervalId);
					intervalId = false;
				}
			}
			*/
		})
		.focus(function() {
			isfocus = true;
			if ($.browser.mozilla || $.browser.opera || $.browser.safari) {
				intervalId = setInterval(suggest, options.delay);
			}
		});
		
		
		// help IE users if possible
		try {
			$results.bgiframe();
		} catch(e) { }


		// I really hate browser detection, but I don't see any other way
		if ($.browser.mozilla || $.browser.opera) {
			$input.keypress(processKey);
		} else {
			$input.keydown(processKey);		// onkeydown repeats arrow keys in IE/Safari
		}
		
		$input.keyup(check_company_validity);
		$input.blur(check_company_validity);
		$input.focus(check_company_validity);
		
		function check_company_validity(e) {
			if ($input.val() in company_map){
				$submitButton.attr('disabled', '');
				$submitButton.attr('company_id', company_map[$input.val()]);
			}
			else {
				$submitButton.attr('disabled', 'disabled');
				$submitButton.attr('company_id', "");
			}
		}
		
		function suggest() {
			//$('#debug').html($input.val().length);
			if ($input.val() != prevVal) {
				if (!isfocus) {
					return;
				}
				
				var q = $.trim($input.val());

				if (q.length >= options.minchars) {
					cached = checkCache(q);
					if (cached) {
						displayItems(cached['items']);
					} else {
						$.get(options.source, {q: q}, function(txt) {
							$results.hide();
							var items = parseTxt(txt, q);
							displayItems(items);
							addToCache(q, items, txt.length);
						});
					}
				} else {
					$results.hide();
				}
				prevVal = $input.val();
			}
		}

		function resetPosition() {
			// requires jquery.dimension plugin
			var offset = $input.offset();
			$results.css({
				top: (offset.top + input.offsetHeight) + 'px',
				left: offset.left + 'px'
			});
		}
		
		
		function processKey(e) {
			// $('#debug').html($('#debug').html() + "," + e.keyCode);
			// handling up/down/escape requires results to be visible
			// handling enter/tab requires that AND a result to be selected
			if ($.browser.msie) {
				isfocus = true;
			}
			
			if ((/27$|38$|40$/.test(e.keyCode) && $results.is(':visible')) ||
				(/^13$|^9$/.test(e.keyCode) && getCurrentResult())) {
	            
	            if (e.preventDefault)
	                e.preventDefault();
				if (e.stopPropagation)
	                e.stopPropagation();

                e.cancelBubble = true;
                e.returnValue = false;
			
				switch(e.keyCode) {
					case 38: // up
						prevResult();
						scrollToSelection();
						break;
					case 40: // down
						nextResult();
						scrollToSelection();
						break;
					case 9:  // tab
					case 13: // return
						selectCurrentResult();
						break;
					case 27: //	escape
						$results.hide();
						break;
				}
				prevVal = $input.val();
			} else {
				if ($.browser.msie) {
					setTimeout(suggest, 100);
				}
			}
		}
		
		
		function checkCache(q) {
			for (var i = 0; i < cache.length; i++)
				if (cache[i]['q'] == q) {
					cache.unshift(cache.splice(i, 1)[0]);
					return cache[0];
				}
			return false;
		}
		
		function addToCache(q, items, size) {
			while (cache.length && (cacheSize + size > options.maxCacheSize)) {
				var cached = cache.pop();
				cacheSize -= cached['size'];
			}
			
			cache.push({
				q: q,
				size: size,
				items: items
				});
				
			cacheSize += size;
		}
		
		function displayItems(items) {
			
			if (!items)
				return;
				
			if (!items.length) {
				$results.hide();
				return;
			}
			var html = '';
			for (var i = 0; i < items.length; i++){
				html += '<li>' + items[i] + '</li>';
			}
			$results.html(html).show();
			
			$results
				.children('li')
				.mouseover(function() {
					$results.children('li').removeClass(options.selectClass);
					$(this).addClass(options.selectClass);
				})
				.click(function(e) {
					e.preventDefault(); 
					e.stopPropagation();
					selectCurrentResult();
				});
						
		}
		
		function parseTxt(txt, q) {
			
			var items = [];
			var tokens = txt.split(options.delimiter);
			// parse returned data for non-empty items
			for (var i = 0; i < tokens.length; i++) {
				var token = $.trim(tokens[i]);
				if (token) {
					var splt=token.indexOf(options.innerdelimiter);
					var item_id = token.substr(0,splt);
					var item_val= token.substr(splt+1,token.length);
					
					company_map[item_val]=item_id;
					item_val = item_val.replace(
						new RegExp(q, 'ig'), 
						function(q) { return '<span class="' + options.matchClass + '">' + q + '</span>' }
						);
					items[items.length] = item_val;
				}
			}
			
			return items;
		}
		
		
		//スクロール機能を追加
		function scrollToSelection() {
		
			if (!$results.is(':visible'))
				return false;
		
			var $currentResult = getCurrentResult();
			
			if ($results.offset().top > $currentResult.offset().top) {
				$results.scrollTop($currentResult.offset().top-$results.offset().top+$results.scrollTop());
			}
			
			if ($results.offset().top+$results.innerHeight()
			 < $currentResult.offset().top+$currentResult.outerHeight()) {
				$results.scrollTop($currentResult.offset().top-$results.offset().top+$results.scrollTop()
				-$results.innerHeight()+$currentResult.outerHeight());
			}
		
		}
		
		function getCurrentResult() {
		
			if (!$results.is(':visible'))
				return false;
		
			var $currentResult = $results.children('li.' + options.selectClass);
			
			if (!$currentResult.length)
				$currentResult = false;
				
			return $currentResult;

		}
		
		function selectCurrentResult() {
		
			$currentResult = getCurrentResult();
		
			if ($currentResult) {
				$input.val($currentResult.text());
				$results.hide();
				check_company_validity();
				if (options.onSelect)
					options.onSelect.apply($input[0]);
					
			}
		
		}
		
		function nextResult() {
		
			$currentResult = getCurrentResult();
		
			if ($currentResult)
				$currentResult
					.removeClass(options.selectClass)
					.next()
						.addClass(options.selectClass);
			else
				$results.children('li:first-child').addClass(options.selectClass);
		
		}
		
		function prevResult() {
		
			$currentResult = getCurrentResult();
		
			if ($currentResult)
				$currentResult
					.removeClass(options.selectClass)
					.prev()
						.addClass(options.selectClass);
			else
				$results.children('li:last-child').addClass(options.selectClass);
		
		}
	}
	
	$.fn.suggest = function(source, options) {
	
		if (!source)
			return;
	
		options = options || {};
		options.source = source;
		options.delay = options.delay || 250;
		options.resultsClass = options.resultsClass || 'ac_results';
		options.selectClass = options.selectClass || 'ac_over';
		options.matchClass = options.matchClass || 'ac_match';
		options.minchars = options.minchars || 2;
		options.delimiter = options.delimiter || '\n';
		options.innerdelimiter = options.innerdelimiter || ':';
		options.onSelect = options.onSelect || false;
		options.maxCacheSize = options.maxCacheSize || 65536;

		this.each(function() {
			new $.suggest(this, options);
		});

		return this;
		
	};
	
})(jQuery);





$(function(){
  // 企業検索 (インクリメンタルサーチ) 左
  $("#input_left").suggest("/compare_suggest",{
    onSelect: function() {
			if ($("#submit_left").attr("company_id")!="") {
				var url="/compare/"+$("#submit_left").attr("company_id")+","+company_id_right;
				location.href=url;
			}
		},
		delay: 500,
		minchars: 1,
		resultsClass: 'compare_ac_results',
		submitButton: '#submit_left'
  });
  $("#submit_left").click(function() {
			if ($("#submit_left").attr("company_id")!="") {
				var url="/compare/"+$("#submit_left").attr("company_id")+","+company_id_right;
				location.href=url;
			}
		});
  $("#form_left").submit(function() {
			if ($("#submit_left").attr("company_id")!="") {
				var url="/compare/"+$("#submit_left").attr("company_id")+","+company_id_right;
				location.href=url;
			}
			return false;
		});

  // 企業検索 (インクリメンタルサーチ) 右
  $("#input_right").suggest("/compare_suggest",{
    onSelect: function() {
			if ($("#submit_right").attr("company_id")!="") {
				var url="/compare/"+company_id_left+","+$("#submit_right").attr("company_id");
				location.href=url;
			}
		},
		delay: 500,
		minchars: 1,
		resultsClass: 'compare_ac_results',
		submitButton: '#submit_right'
  });
  $("#submit_right").click(function() {
			if ($("#submit_right").attr("company_id")!="") {
				var url="/compare/"+company_id_left+","+$("#submit_right").attr("company_id");
				location.href=url;
			}
		});
  $("#form_right").submit(function() {
			if ($("#submit_right").attr("company_id")!="") {
				var url="/compare/"+company_id_left+","+$("#submit_right").attr("company_id");
				location.href=url;
			}
			return false;
		});
	
});


// 企業レコメンド（ロボにおまかせ）左
var recommend_list_left=null;
var recommend_list_right=null;
var recommend_next_index_left=0;
var recommend_next_index_right=0;

function set_recommend_list_left(){
	if (recommend_list_left!=null && recommend_list_left.length>0) {
		var c = recommend_list_left[ recommend_next_index_left % recommend_list_left.length ];
		if (c["id"]==company_id_left) {
			recommend_next_index_left+=1;
			set_recommend_list_left();
		}
		else {
			$("#input_left").val( c["name"] );
			$("#submit_left").attr('company_id', c["id"]);
			recommend_next_index_left+=1;
			$("#input_left").keyup();
		}
	}
}

function load_set_recommend_list_left(){
	if (recommend_list_left==null) {
		$.getJSON(
			"/compare_recommend?q="+company_id_right,
			null,
			function(data, status) {
				recommend_list_left = data;
				for (var i=0; i<data.length; i++) {
					var c = data[i];
					company_map[c["name"]]=c["id"];
				}
				set_recommend_list_left();
			}
		);
	}
	else {
		set_recommend_list_left();
	}
}

// 企業レコメンド（ロボにおまかせ）左

function set_recommend_list_right(){
	if (recommend_list_right!=null && recommend_list_right.length>0) {
		var c = recommend_list_right[ recommend_next_index_right % recommend_list_right.length ];
		if (c["id"]==company_id_right) {
			recommend_next_index_right+=1;
			set_recommend_list_right();
		}
		else {
			$("#input_right").val( c["name"] );
			$("#submit_right").attr('company_id', c["id"]);
			recommend_next_index_right+=1;
			$("#input_right").keyup();
		}
	}
}

function load_set_recommend_list_right(){
	if (recommend_list_right==null) {
		$.getJSON(
			"/compare_recommend?q="+company_id_left,
			null,
			function(data, status) {
				recommend_list_right = data;
				for (var i=0; i<data.length; i++) {
					var c = data[i];
					company_map[c["name"]]=c["id"];
				}
				set_recommend_list_right();
			}
		);
	}
	else {
		set_recommend_list_right();
	}

}

