/* ===================================================================
クラス生成
===================================================================  */
var KwdAutoLink = Class.create();
/*@cc_on 
var doc = document;
eval('var document = doc');
@*/

/* ===================================================================
クラス定義
===================================================================  */
KwdAutoLink.prototype = {
	baseurls: new Array(),
	SEPARETE_LENGTH: 200,
	MAX_REQUEST: 50,
	FIRSTMAKE_TIMEOUT_MS: 1000,
	ALLMAKE_TIMEOUT_MS: 9000,
	REQUEST_TIMEOUT_MS: 1000,
	LASTMODIFIED_ERROR_MS: 10000,
	LASTMODIFIED_FIXED_VALUE: '0',
	DOMEIN: 'kwl.nifty.com',
	ID_CHK_MAX: 10,
	className: 'class',
	firstcheck: new Array(),

	initialize: function(){
		var baseurl = 'http://shuncolle.nifty.com/shuncolle/word//*encode_keyword*/.htm';
		kwd_autolink.each(
			function(e,i){
				if (e.baseurl){
					this.baseurls[e.id] = e.baseurl;
				}else{
					this.baseurls[e.id] = baseurl;
				}
			}.bind(this)
		)
	},
	
	startRequest: function(){
		if (typeof(kwd_autolink_wait) != 'undefined' && kwd_autolink_wait == true){
			this.waitInitRequest(0);
		}else{
			kwd_autolink.each(
				function(e,i){
					if($(e.id) != undefined) {
						this.initRequest(e.id);
						throw $break;
					}
				}.bind(this)
			)
		}
		if(!window.opera && navigator.appVersion.match(/\bMSIE\b/)){
			//IEの場合 
			this.className='className';
		}
	},

	unescapeHTML: function(str){
		str = str.replace(new RegExp("&nbsp;","ig")," ");
		var div = document.createElement('div');
		div.innerHTML = str;
		var nodes = div.childNodes;
		var size = nodes.length;
		var newstr = "";
		for(var i = 0; i < size; i++){
			newstr = newstr + nodes[i].nodeValue;
		}
		return newstr;
	},

	waitInitRequest: function(count){
		var retry = false;
		var id = null;
		kwd_autolink.each(
			function(e,i){
				if($(e.id) == undefined) {
					retry = true;
				}else{
					id = e.id;
				}
			}
		)
		if (retry && ++count < this.ID_CHK_MAX){
			setTimeout(function(){this.waitInitRequest(count)}.bind(this), 100);
		}else if(id != null){
			this.initRequest(id);
		}
	},

	initRequest: function(id){
		var script = document.createElement('script');
		script.src = 'http://' + this.DOMEIN + '/kwl/sc/js?init=s';
		script.charset = 'UTF-8';
		$(id).parentNode.insertBefore(script,$(id).nextSibling);
	},
	
	exec: function(){
		kwd_autolink.each(
			function(e,i){
				if($(e.id) == undefined) {
					return;
				}
				var kwd_autolink_flg = 0;
				if(e.adult == 'ok'){
					kwd_autolink_flg |= 2;
				}
				if(e.ng == 'ok'){
					kwd_autolink_flg |= 1;
				}
				
				var kwl_category_flg = '';
				if(e.category){
					kwl_category_flg = e.category;
				}

				var kwl_not_category_flg = '';
				if(e.not_category){
					kwl_not_category_flg = e.not_category;
				}

				var kwl_cache_time = -1;
				if(e.cache_time){
					kwl_cache_time = e.cache_time;
				}

				var idtext = this.unescapeHTML($(e.id).innerHTML.stripTags()); 
				idtext = idtext.replace(new RegExp("(\t|\r|\n|\r\n|(\r|\n|\r\n|) +| +(\r|\n|\r\n|))","ig"),"");
				var idtextLength = idtext.length;
				if (idtextLength == 0){
					return;
				}
	
				var separare_cnt = 0;
				
				if(idtextLength % this.SEPARETE_LENGTH == 0){
					separare_cnt = idtextLength / this.SEPARETE_LENGTH;
				}else{
					separare_cnt = Math.floor(idtextLength / this.SEPARETE_LENGTH + 1);
				}
				if(separare_cnt > this.MAX_REQUEST){
					separare_cnt = this.MAX_REQUEST;
				}
				
				var milliseconds  = (new Date()).getTime();
				this.doRequest(e.id  , kwl_category_flg , kwl_not_category_flg, separare_cnt , milliseconds , 1 , ('0' + kwd_autolink_flg.toString(2)).slice(-2), kwl_cache_time);
			}.bind(this)
		)
	},

	doRequest: function(_id, _kwl_category_flg, _kwl_not_category_flg, _m, _t, _i, _f, _ct){
		if(_i == 2 && ((new Date()).getTime() - _t > this.REQUEST_TIMEOUT_MS)){
			return;
		}
		
		var separatestr = this.unescapeHTML($(_id).innerHTML.stripTags());
		separatestr = separatestr.replace(new RegExp("(\t|\r|\n|\r\n|(\r|\n|\r\n|) +| +(\r|\n|\r\n|))","ig"),"");
		separatestr = separatestr.substr((_i - 1)*(this.SEPARETE_LENGTH),this.SEPARETE_LENGTH).toLowerCase();

		if(_kwl_category_flg != ''){
			_kwl_category_flg = '&c=' + _kwl_category_flg;
		}else{
			_kwl_category_flg = '&c=allcategory';
		}
		if(_kwl_not_category_flg != ''){
			_kwl_not_category_flg = '&nc=' + _kwl_not_category_flg;
		}
		var lm = new Date(document.lastModified).getTime();
		if(document.lastModified == "" || Math.abs(lm - (new Date()).getTime()) < this.LASTMODIFIED_ERROR_MS){
			lm = this.LASTMODIFIED_FIXED_VALUE;
		}
		
		var url = 'http://' + this.DOMEIN + '/kwl/sc/js?id=' + _id + _kwl_category_flg + _kwl_not_category_flg + '&m=' + _m + '&t=' + _t + '&i=' + _i + '&f=' + _f + '&ct=' + _ct + '&lm=' + lm + '&text=' + encodeURIComponent(separatestr);
		var script = document.createElement('script');
		script.src = url;
		script.charset = 'UTF-8';
		$(_id).parentNode.insertBefore(script,$(_id).nextSibling);
	},

	createElement: function(ori_ele, child_ele, keywords_info, _id){
		var after_textnode_cnt=0;
		var nodetext = child_ele.nodeValue;
		var nextElement=child_ele.nextSibling;
		for(var i=0;nextElement != null ;i++){
			if(nextElement.nodeType == 3){
				after_textnode_cnt++;
				nodetext = nodetext + nextElement.nodeValue;
				nextElement=nextElement.nextSibling;
			}else{
				break;
			}
		}
		var lowerNodetext = nodetext.toLowerCase(); 
		var increment_ele_cnt=0;
		var ret = keywords_info.any(
			function(e,k){
				var keyword = e.keyword;
				if(keyword.indexOf(" ",i) > -1){
					var keywordnbsp = keyword.replace(/ /ig,"&nbsp;") ;
					var div = document.createElement('div');
					div.innerHTML = keywordnbsp;
					keywordnbsp = div.childNodes[0].nodeValue;
					
					var index_key = lowerNodetext.indexOf(keyword,i);
					var index_keynbsp = lowerNodetext.indexOf(keywordnbsp,i);
					if(index_key > -1 || index_keynbsp > -1){
						if(index_key == -1 || (index_key > index_keynbsp && index_key != -1 && index_keynbsp != -1)){
							e.keyword = keywordnbsp;
						}
						return true;
					}
				}else if(lowerNodetext.indexOf(keyword) > -1){
					return true;
				}
				return false;
			}
		);
		
		if(!ret){
			return after_textnode_cnt;
		}

		var positionList = new Array();
		var i = 0;
		keywords_info.each(
			function(e,k){ 
				var keyword = e.keyword;
				var keylen = keyword.length;
				var j = lowerNodetext.indexOf(keyword);
				if(j != -1){
					positionList[i++] = {'position':j, 'length':keylen, 'index':k, 'ng':e.ng, 'adult':e.adult};
					
					//キーワードの前の文字列格納
					var tmp = lowerNodetext.substring(0, j);

					//キーワード部分をマッチしないように置き換え
					for (var l = 0; l < keylen; l++){
						tmp += "\t";
					}
					//キーワードの後の文字列格納
					tmp += lowerNodetext.substr(j + keylen);

					lowerNodetext = tmp;
				}
			}.bind(this)
		);

		 positionList.sortBy(function(e,k){return e.index;}).reverse().each(
			function(e,k){
				//配列から削除
				keywords_info.splice(e.index, 1);
			}
		)

		i = 0;
		positionList.sortBy(function(e,k){return e.position;}).each(
			function(e,k){
				var link_before_str = nodetext.substring(i, e.position);
				if(link_before_str.length > 0){
					ori_ele.insertBefore(document.createTextNode(link_before_str), child_ele);
					increment_ele_cnt++;
				}
				
				//リンク作成
				var a = document.createElement('a'); 
				var link_keyword = nodetext.substr(e.position, e.length);
				a.setAttribute('href', this.baseurls[_id].replace('/*encode_keyword*/', encodeURIComponent(link_keyword).replace(/\+/ig,"%20").replace(/%2F/ig,"/").replace(/%C2%A0/ig,"%20")));

				if(e.ng){
					a.setAttribute(this.className, 'keylink_ng');
				}else if(e.adult){
					a.setAttribute(this.className, 'keylink_adult');
				}else{
					a.setAttribute(this.className, 'keylink');
				}
				//キーワード設定
				a.appendChild(document.createTextNode(link_keyword));
				ori_ele.insertBefore(a, child_ele);
				i = e.position + e.length;

				increment_ele_cnt++;
			}.bind(this)
		)
		var link_after_str = nodetext.substr(i, nodetext.length);
		if(link_after_str.length > 0){
			ori_ele.insertBefore(document.createTextNode(link_after_str), child_ele);
			increment_ele_cnt++;
		}

		//子エレメント削除
		var deleteElement=child_ele;
		for(var i=0;i<=after_textnode_cnt;i++){
			var tmpElement = deleteElement.nextSibling;
			ori_ele.removeChild(deleteElement);
			deleteElement = tmpElement;
		}
		return increment_ele_cnt - 1;
	},
	
	makeLink: function(element, keywords_info, _id, _befor_time){
		var length = element.childNodes.length;
		
		for (var i = 0; i < length; i++) {
			var child = element.childNodes.item(i);
			var nodeName = child.nodeName.toUpperCase();
			if(nodeName != 'A' && nodeName != 'SCRIPT' && child.nodeType != 8){
				if(child.hasChildNodes()){
					//再帰処理
					if(!this.makeLink(child, keywords_info, _id, _befor_time)){
						return false;
					}
				}

				if(child.nodeType == 3){
					//エレメント作成
					var cnt = this.createElement(element, child, keywords_info, _id)
					if(cnt > 0){
						if(keywords_info.length == 0){
							return false;
						}
						if(!this.firstcheck[_id]){
						
							if((new Date()).getTime() - _befor_time > this.FIRSTMAKE_TIMEOUT_MS){
								return false;
							}
							this.firstcheck[_id] = true;
						}else if((new Date()).getTime() - _befor_time > this.ALLMAKE_TIMEOUT_MS){
							return false;
						}
						i+=cnt;
						length=element.childNodes.length;
					}
				}
			}
		}
		return true;
	},

	requestDone: function (id,cache,_kwl_keywords_info){
		var element = $(id);
		var size = _kwl_keywords_info.length;
		var befor_time  = (new Date()).getTime();
		if(size > 0){
			this.firstcheck[id] = false;
			this.makeLink(element, _kwl_keywords_info, id, befor_time);
		}
		var img = document.createElement('img');
		img.src = 'http://' + this.DOMEIN + '/kwl/images/impcount.gif?id=' + id + '&url=' + encodeURIComponent(location.href) + '&link_count=' + size + '&cache=' + cache + '&t=' + befor_time;
		img.width = '0';
		img.height= '0';
		img.border= '0';
		element.appendChild(img);
	}
}

/* ===================================================================
生成処理
===================================================================  */
var kwd_cache = false;
kwd_autolink.each(
	function(e,i){
		if(e.cache_time){
			kwd_cache = true;
			throw $break;
		}
	}
)

if(kwd_cache){
	var kwdAutoLink = new KwdAutoLink();
	kwdAutoLink.startRequest();
}else{
	var cookiename = "AutolinkCookieCheck";
	var cookievalue = (new Date()).getTime();
	
	//クッキー作成
	document.cookie = cookiename  + "=" + cookievalue + ";";
	//クッキー取得 
	if(document.cookie.indexOf(cookiename  + "=" + cookievalue) > -1){
		var kwdAutoLink = new KwdAutoLink();
		kwdAutoLink.startRequest();
	}
}
