﻿/* SNP suggest */
var nwsuggest_callback;
function nwSuggest(options) {
	this.url      = 'http://suggest.fresheye.com/suggest/suggest.cgi';
	this.kw       ='';
	this.dispflg  =true;
	this.prevdata ='';
	this.tempdata ='';
	this.selectflg=false;
	this.formObj  ='';
	this.tgtObj   ='';
	this.rsltObj  ='';
	this.timeout  =false;
	this.cache    =[];
	this.callback;
	var op ={
		snid:'',
		charset:'utf-8',//don't use euc-jp or shift-jis
		formID:'',
		tgtExpr:'',
		tgtID:'suggest',
		rsltID:'suggestarea',
		rsltStyleUse:true,
		rsltStyle:'position:absolute;display:none;border-top:1px solid #ccc;',
		rsltUlStyle:'padding:0;margin:0;',
		rsltLiStyle:'list-style-type:none;padding:3px 5px;border-bottom:1px solid #ccc;border-left:1px solid #ccc;border-right:1px solid #ccc;font-size:75%;background-color:#fff;text-align:left;',
		oddClass:'odd',
		oddStyle:'',
		selectClass:'slct',
		selectStyle:'background-color:#ccc;'
	};
	if(options){
		for(var i in options){
			if(typeof op[i] != 'undefined'){
				op[i] = options[i];
			}
		}
	}
	for(var i in op){
		this[i] = op[i];
	}
	this.checkval = function(t){
		var inputval = t.tgtObj.val();
		if(t.selectflg){
			t.prevdata  = inputval;
			t.selectflg = false;
		}
		if(!t.dispflg){
			t.rsltObj.hide().html('');
			if(t.timeout) clearTimeout(t.timeout);
			if(inputval != t.prevdata){
				t.prevdata = t.kw = inputval;
			}
		}else if(inputval != t.prevdata) {
			if(!inputval){ // when kw is empty
				t.rsltObj.hide().html('');
			}else if(inputval.match(/[\s\u3000]/)==undefined){
				if(t.timeout) clearTimeout(t.timeout);
				t.timeout = setTimeout(function(){t.callsuggest(t,inputval)}, 100);
			}else{ // we can't suggest for more than 2 words
				t.rsltObj.hide().html('');
			}
			t.prevdata = t.kw = inputval;
		}
		setTimeout(function(){t.checkval(t)},100);
	}
	this.init(this);
}
nwSuggest.prototype = {
	init:function(t){
		if(t.snid){
			$(function(){
				t.callback = function(datas){
					t.dispsuggest(t,datas.kw,datas.sg);
					t.addToCache(t,datas.kw,datas.sg);
				};
				if(t.rsltStyleUse){$('head').append('<style type="text/css">#'+t.rsltID+'{'+t.rsltStyle+'}#'+t.rsltID+' li{'+t.rsltLiStyle+'}#'+t.rsltID+' li{zoom:1;vertical-align:bottom;}#'+t.rsltID+' ul{'+t.rsltUlStyle+'}#'+t.rsltID+' .'+t.oddClass+'{'+t.oddStyle+'}#'+t.rsltID+' .'+t.selectClass+'{'+t.selectStyle+'}</style>');}
				$('body').append('<div id="'+t.rsltID+'"></div>');
				t.tgtObj  =(t.tgtExpr)?$(t.tgtExpr+':first'):$('#'+t.tgtID);
				if(t.tgtObj.val()){t.prevdata=t.tgtObj.val();}
				t.formObj =(t.formID)?$('#'+t.formID):(t.formObj=t.tgtObj.parents('form') || t.tgtObj.parents('FORM'));
				t.formObj.attr("autocomplete","off");
				t.rsltObj = $('#'+t.rsltID);
				t.resetPosition(t);
				t.checkval(t);

				$(window)
					.load(function(){t.resetPosition(t)})	// just in case user is changing size of page while loading
					.resize(function(){t.resetPosition(t)});

				t.tgtObj.blur(function(){
					setTimeout(function(){t.rsltObj.hide()}, 200);
				});

				if($.browser.mozilla){
					t.tgtObj.keypress(function(e){t.processKey(t,e)});	// onkeypress repeats arrow keys in Mozilla/Opera
				}else{
					t.tgtObj.keydown(function(e){t.processKey(t,e)});	// onkeydown repeats arrow keys in IE/Safari
				}
			});
		}
	},
	resetPosition:function(t){
		var tgtObj = t.tgtObj;
		var rsltObj = t.rsltObj;
		var offset = tgtObj.offset();
		rsltObj.css({
			top: (offset.top+tgtObj.outerHeight()) + 'px',
			left: offset.left + 'px',
			width:tgtObj.outerWidth()+'px'
		});
	},
	processKey:function(t,e){
		// handling up/down/escape requires results to be visible
		// handling enter/tab requires that AND a result to be selected
		if ((/27$|38$|40$/.test(e.keyCode) && t.rsltObj.is(':visible')) ||
			(/^13$|^9$/.test(e.keyCode) && t.getCurrentResult(t))) {

			if (e.preventDefault) e.preventDefault();
			if (e.stopPropagation) e.stopPropagation();
			e.cancelBubble = true;
			e.returnValue = false;

			switch(e.keyCode) {
				case 38: // up
					t.prevResult(t);
					break;
				case 40: // down
					t.nextResult(t);
					break;
				case 9:  // tab
				case 13: // return
					t.rsltObj.hide();
					t.formObj.submit();
					break;
				case 27: //	escape
					t.rsltObj.hide();
					break;
			}
		}
	},
	getCurrentResult:function(t){
		if(!t.rsltObj.is(':visible')) return false;
		var $currentResult = t.rsltObj.find('li.' + t.selectClass);
		if(!$currentResult.length) $currentResult = false;
		return $currentResult;
	},
	prevResult:function(t){
		var currentResult = t.getCurrentResult(t);
		var val='';
		t.selectflg = true;
		if (currentResult){
			val = currentResult
				.removeClass(t.selectClass)
				.prev()
					.addClass(t.selectClass)
					.text();
			if(val){
				t.tgtObj.val(val);
			}else{
				t.tgtObj.val(t.tempdata);
			}
		}else{
			t.tempdata = t.tgtObj.val();
			t.tgtObj.val(t.rsltObj.find('ul li:last-child').addClass(t.selectClass).text());
		}
	},
	nextResult:function(t){
		var currentResult = t.getCurrentResult(t);
		var val='';
		t.selectflg = true;
		if (currentResult){
			val = currentResult
				.removeClass(t.selectClass)
				.next()
					.addClass(t.selectClass)
					.text();
			if(val){
				t.tgtObj.val(val);
			}else{
				t.tgtObj.val(t.tempdata);
			}
		}else{
			t.tempdata = t.tgtObj.val();
			t.tgtObj.val(t.rsltObj.find('ul li:first-child').addClass(t.selectClass).text());
		}
	},
	selectCurrentResult:function(t){
		var currentResult = t.getCurrentResult(t);
		if (currentResult){
			t.selectflg = true;
			t.tgtObj.val(currentResult.text());
			t.rsltObj.hide();
		}
	},
	addToCache:function(t,q,items){
		if(q){
			t.cache.push({
				q:q,
				items:items
			});
			if(t.cache.length > 20){
				t.cache.splice(0,t.cache.length-20);
			}
		}
	},
	checkCache:function(t,q){
		for (var i = 0; i < t.cache.length; i++){
			if ((t.cache[i]['q'].replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,'&')) == q){
				t.cache.unshift(t.cache.splice(i, 1)[0]);
				return t.cache[0];
			}
		}
		return false;
	},
	callsuggest:function(t,inputval){
		if(t.checkCache(t,inputval)){
			t.dispsuggest(t,inputval,t.checkCache(t,inputval)['items']);
		}else{
			nwsuggest_callback = t.callback;
			$.ajax({
				url: t.url,
				data: {
					"snid": t.snid,
					"kw": inputval
				},
				dataType: "jsonp",
				scriptCharset:'UTF-8',
				cache: true,
				timeout:5000,
				success: function(data, status, xhr) {
				}
			});
		}
	},
	dispsuggest:function(t,kw,datas){
		if(typeof datas == 'undefined'){return false;}
		if(t.kw!=(kw.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,'&'))){return false;}
		var h = '';
		var oddstyle = ['',' class="'+t.oddClass+'"'];
		for(var i=0;i<datas.length;i++){
			h += '<li'+oddstyle[i%2]+'>'+datas[i]['word']+'</li>';
		}
		if(h){
			h = '<ul>'+h+'</ul>';
			t.rsltObj.html(h).show();
			t.rsltObj.find('li')
				.mouseover(function(){
					t.rsltObj.find('li').removeClass(t.selectClass);
					$(this).addClass(t.selectClass).text();
				})
				.click(function(e){
					e.preventDefault(); 
					e.stopPropagation();
					t.selectCurrentResult(t);
					t.formObj.submit();
				});
		}else{
			t.rsltObj.hide().html('');
		}
	}
};

