/** 
 * @copyright      MOGRA DESIGN .Ltd,
 * @auther         作者名
 * @link           http://www.mogra.co.jp
 * @package        kuchikomi
 * @version        0.5.5
 * @lastupdate     2008/11/13
 */


/**
 * KcBoxを操作するクラス
 * シングルトンクラス
 */
 
var KcPublish = {
	ajax : true,
	//初期設定
	kc_tag_area : 'kc-tag',
	kc_list_area : 'kc-list',
	kc_btn_more : 'kc-btn-more',
	kc_btn_showall : 'kc-btn-showall',
	kc_pulldown_entry_num_start : 6,
	kc_pulldown_entry_num : 5,
	//
	kc_pulldown_addHTML_more : '<a onclick="KcPublish.pulldownRun();" href="javascript:void(0)"><img src="common/images/keyword_btn.jpg" alt="もっと見る" /></a>',
	kc_pulldown_addHTML_top : '<a href="#TOP">トップへ</a>',
	// use template
	kc_tag_tmpl : $.createTemplate('<li class="level{$T.level}"><span id="kc_tc_tag_{$P.id}"><a href="javascript:KcPublish.selectTag({$P.id},\'{$T.name}\');" class="normal">{$T.value}<span class="number">({$T.num})</span></a></span> </li>'),
	kc_entry_tmpl : $.createTemplate('<dt><a href="redirect.php?url={$T[1]}&id={$P.suffix}&p=2" target="_blank">{$T[0]}</a></dt><dd><p class="text">{$T[3]}</p><p class="date">{$T[5]} {$T[2]}</p></dd>'),
	//
	//
	kc_nm_patternDate : /(\d{2,4}).+?(\d{1,2}).+?(\d{1,2}).+?(\d{1,2}).+?(\d{1,2})/,
	kc_new_date : 2*24*60*60*1000,
	kc_today : new Date(),
	//ここから削っていく
	kc_entries : new Array(),
	//バックアップ用
	kc_bk_entries : new Array(),
	kc_tags : new Array(),
	kc_selected_tag : "",
	//仮置
	kc_entry_list : new Array(),
	//
	setTagCloud : function(tags){
		$('#' + this.kc_tag_area).html(this.createTagCloud(tags));
	},
	//タグクラウドの生成
	createTagCloud : function(tags, escape){
		if(typeof(tags) == 'string'){
			return;
		}
		
		this.kc_tags = tags;
		//
		var list = "<ul>";
		for(var i = 0; i < tags.length; i++){
			var obj = {};
			for(var val in tags[i]){
				obj[val] = tags[i][val];
			}
			if(escape){
				obj.name = (encodeURIComponent(obj.name));
			}
			list += this.kc_tag_tmpl.get(obj, {id : i+1}, window);
		}
		list += "</ul>";
		return list;
	},
	/**
	 * このクラスで使用する配列の保存
	 * @param array
	 */
	entriesInit : function(entries){
		this.kc_entry_list = new Array();
		this.kc_entries = entries.concat();
		this.kc_bk_entries = entries.concat();
	},
	callback : function(json){
		eval("var entry_list = " + json);
		KcPublish.kc_entry_list = KcPublish.kc_entry_list.concat(entry_list.entries);
		if(KcPublish.kc_entry_list.length < KcPublish.kc_pulldown_entry_num_start){
			//もし数が足りなかったら
			var arr = KcPublish.kc_entries.splice(0, KcPublish.kc_pulldown_entry_num_start - KcPublish.kc_entry_list.length);
			KcPublish.getEntries(arr, KcPublish.callback);
		}else{
			$('#'+KcPublish.kc_list_area).html(KcPublish.setEntries(KcPublish.kc_entry_list));
		}
		KcPublish.selectBtn();
	},
	/**
	 * エントリーの最初の生成
	 * @param array
	 */
	createEntries : function(entries){
		//２つ複製する
		this.entriesInit(entries);
		var first = this.kc_entries.splice(0, this.kc_pulldown_entry_num_start);
		$('#'+this.kc_list_area).html('');
		this.toggleBtn(this.kc_btn_more, false);
		this.getEntries(first, KcPublish.callback);
	},
	/**
	 * Ajaxで詳細情報
	 * @param array
	 * @param function
	 */
	getEntries : function(entries, callback){
	
		var url = new Array();
		
		for(var i = 0; i < entries.length; i++){
			url.push(entries[i][1]);
		}
		if(this.ajax){
			$.ajax({
							url: "json.php",
							type: "POST",
							data: "entry_url="+url.join(','),
							success: callback,
							error : function(e){
								alert(e);
							}
						});
		}else{
			
			$('#'+KcPublish.kc_list_area).append(KcPublish.setEntries(entries));
			KcPublish.selectBtn();
		}
	},
	/**
	 * 必要なエントリーをまとめて返す
	 * @param array
	 * @return string(html)
	 */
	setEntries : function (entries){
		var entry_list_html = "";
		
		for(var i=0; i < this.kc_pulldown_entry_num_start; i++){
			if(Boolean(entries[i])){
				entry_list_html += this.createEntry( entries[i], i);
			}
		}
		return entry_list_html;
	},
	/**
	 * エントリーの生成
	 * @param array
	 * @param int
	 * @return string(html)
	 */
	createEntry : function (my_entry, id){
		// 投稿日時のフォーマット
		var m = my_entry[2].match(/(\d+)-0?(\d+)-0?(\d+)T(\d+):(\d+):(\d+)/) || my_entry[2].match(/(\d+)-0?(\d+)-0?(\d+) (\d+):(\d+):(\d+)/);
		my_entry[2] = m[1]+'年'+m[2]+'月'+m[3]+'日 '+m[4]+'：'+m[5];

		// 検索語の強調
		my_entry[3] = my_entry[3].replace(eval('/('+this.kc_words+')/gi'),'<strong>$1</strong>');

		// ニュースマーカーの作成
		var is_new = "";
		
		var m = my_entry[2].match(this.kc_nm_patternDate);
		
		if(m){
			var day = new Date(m[1],m[2]-1,m[3],m[4],m[5],0).getTime();
			var kc_nm_today = this.kc_today.getTime();
			
			if((kc_nm_today - day) < this.kc_new_date){
				is_new = ' class="new"';
			}
		}
		//
		// エントリーのHTML
		var li = this.kc_entry_tmpl.get(my_entry, {uid:id, suffix:this.kc_today.getTime(), isnew:is_new}, window);
		//リストの書き出し
		return li;
	},

	/**
	 * 選択タグのエントリーを抽出
	 * @param int
	 * @param string
	 */
	selectTag : function(tag_no, tag_name, escape){
		//var mytag_name = (tag_name);
		if(escape){
			tag_name = decodeURIComponent(tag_name);
		}
		//tag_name = mytag_name;
		//タグが存在するかどうか
		var is_tag = false;
		for(var i=0; i < this.kc_tags.length; i++){
			if(this.kc_tags[i].name == tag_name){
				this.toggleBtn(this.kc_btn_showall, true);
				tag_no = i + 1;
				is_tag = true;
				break;
			}
		}
		
		if(!is_tag){
			//return false;
			tag_name = "";
			this.toggleBtn(this.kc_btn_showall, false);
		}
		
		this.kc_selected_tag = tag_name;
		
		this.toggleBtn(this.kc_btn_more, false);
	
		//初期化
		kc_tag_entries = [];
		
		// 今回のタグを含むエントリーの可視化
		// 今回のタグを含まないエントリーの不可視化
		var re=eval('/'+this.kc_selected_tag+'/');
		
		//タグの色かえ
		for(var i = 0; i < this.kc_tags.length; i++){
		
			var elm = document.getElementById('kc_tc_tag_'+(i+1)).childNodes[0];
			//選択されたのをactiveに。それ以外はnormalに
			if(tag_no == (i + 1)){
				if(elm.getAttribute("class") == "normal"){
					elm.setAttribute("class",'active');
				}else{
					elm.setAttribute("className",'active');
				}
			}else{
				if(elm.getAttribute("class") == "active"){
					elm.setAttribute("class",'normal');
				}else{
					elm.setAttribute("className",'normal');
				}
			}
			
		}
		
		//表示用記事の選別
		this.kc_entries = new Array();
		if(Boolean(tag_name)){
			for(var i = 0, k = 0; i < this.kc_bk_entries.length; i++){
				
				if(this.kc_bk_entries[i][0].toLowerCase().indexOf(this.kc_selected_tag) != -1 
						|| this.kc_bk_entries[i][3].toLowerCase().indexOf(this.kc_selected_tag) != -1){
					
					this.kc_entries.push(this.kc_bk_entries[i]);
					k++;
				}
			}
		}else{
			this.kc_entries = this.kc_bk_entries.concat();
			k = this.kc_bk_entries.length - 1;
		}
		
		
		//最後に設定
		var tag_title = document.getElementById('kc-tag-title');
		if(this.kc_selected_tag == "" || !Boolean(this.kc_selected_tag)){
			this.toggleBtn(this.kc_btn_more, false);
			tag_title.innerHTML = "";
		}else{
			tag_title.innerHTML = this.kc_tags[tag_no - 1].value + "に関するブログ記事一覧";
		}
		
		//Ajax用のコールバック
		var callback = function(json){
			eval("var entry_list = " + json);
			for(var i=0; i < entry_list.entries.length; i++){
				entry_list.entries[i][0] = KcPublish.emphasisTag(entry_list.entries[i][0]);
				entry_list.entries[i][3] = KcPublish.emphasisTag(entry_list.entries[i][3]);
			}
			
			$('#'+KcPublish.kc_list_area).html(KcPublish.setEntries(entry_list.entries));
			KcPublish.selectBtn();
		}
		//PHPにポスト
		this.getEntries(this.kc_entries.splice(0, this.kc_pulldown_entry_num), callback);
		
		
	},
	/**
	 * もっとみる
	 */
	pulldownRun : function(){
		//Ajax用のコールバック
		var callback = function(json){
			var entry_list;
			eval("entry_list = " + json);
			if(Boolean(KcPublish.kc_selected_tag)){
				for(var i=0; i < entry_list.entries.length; i++){
					entry_list.entries[i][0] = KcPublish.emphasisTag(entry_list.entries[i][0]);
					entry_list.entries[i][3] = KcPublish.emphasisTag(entry_list.entries[i][3]);
				}
			}
			$('#'+KcPublish.kc_list_area).append(KcPublish.setEntries(entry_list.entries));
			KcPublish.selectBtn();
		}
		var send_list = this.kc_entries.splice(0, this.kc_pulldown_entry_num);
		//PHPにポスト
		this.getEntries(send_list, callback);
	},
	/**
	 * ボタンの表示非表示
	 * @param string
	 * @param bool
	 */
	toggleBtn : function(id, bool){
		var elm = document.getElementById(id);
		if(bool && Boolean(elm)){
			elm.style.visibility = "visible";
		}else if(!bool && Boolean(elm)){
			elm.style.visibility = "hidden";
		}
	},
	/**
	 *  プルダウントリガーの表示／非表示
	 */
	selectBtn : function(){
		var more=document.getElementById(this.kc_btn_more);
		
		if(more){
			if(this.kc_entries.length > 0){
				kc_pulldown_more_isabled=true;
				more.innerHTML = this.kc_pulldown_addHTML_more;
				kc_pulldown_no=0;
				KcPublish.toggleBtn(this.kc_btn_more, true);
			} else	{
				kc_pulldown_more_isabled=false;
				more.innerHTML = this.kc_pulldown_addHTML_top;
				KcPublish.toggleBtn(this.kc_btn_more, false);
			}
		}
	},
	/**
	 * タグを強調
	 * @param string
	 */
	emphasisTag : function(str){
		return str.replace(eval('/(' + this.kc_selected_tag + ')/gi'),'<em>$1</em>');
	}

}

/**
 * 各クチコミクリップ用ラッパークラス
 */
function KcBox() {
	
	var error;
	var kc_tags;
	
	//ここからinit
	this.init = function(){
		
		var window_var = ['kc_name','kc_words','kc_ga=false','kc_alert','kc_nm','kc_nm_targetDays','kc_pulldown','kc_pulldown_entry_num','kc_pulldown_entry_num_start','kc_tc_power','kc_tc_tag_chars','kc_tc_tag_num','kc_tc_min_num','kc_tc_max_num','kc_tc_names','kc_tc_nums','kc_entries']
		
		//kc_のついたグローバル変数をこちらにうつす
		for(var i=0; i < window_var.length; i++){
			this[window_var[i]] = window[window_var[i]];
			window[window_var[i]] = null;
		}
		//ちゃんと読み込めたかどうか
		if(!Boolean(this.kc_name) || !Boolean(this.kc_words) || !Boolean(this.kc_entries)) {
			// 不具合発生時のHTML
			this.error = this.getError("INIT");
			
		}else{
			//タグクラウドの取得
			this.kc_tags = this.parseTagCloud();
		}
		
	};//this.init
	
	this.getError = function(n) {
		switch(n){
		case "INIT":
			return 'サーバメンテナンスのため、このコンテンツは閲覧できません。<br />お手数ですが、しばらく経ってから再度アクセスしてください。';
		case 'TAG':
			return '表示できるタグがありません。';
			break;
		}
		
	};//this.getError
	
	//タグクラウドの解析
	this.parseTagCloud = function(){
	
		// タグ数の再取得
		this.kc_tc_nums = new Array();
		for(var i=0; i < this.kc_entries.length; i++){
		
			var entry_title = this.kc_entries[i][0];
			var entry_body = this.kc_entries[i][3];
			//タグが含まれているかどうか、小文字にして確認
			for(var tag_name in this.kc_tc_names){
				
				var c=0;
				var p=0;
				while((p = entry_title.toLowerCase().indexOf(tag_name,p)) != -1){
					c++;// ※「c=1」で記事単位。
					p++;
				}
				p=0;
				while((p = entry_body.toLowerCase().indexOf(tag_name,p)) != -1){
					c++;// ※「c=1」で記事単位。
					p++;
				}
				if(this.kc_tc_nums[tag_name]){
					this.kc_tc_nums[tag_name] += c;
				}else{
					this.kc_tc_nums[tag_name] = c;
				}
			}
		}
		
		//タグの総数
		var tag_num = 0;
		// 最多タグ
		var tag_most=0;
		//
		for(var tag_name in this.kc_tc_names){
			tag_num++;
			
			if(tag_most < this.kc_tc_nums[tag_name]){
				tag_most = this.kc_tc_nums[tag_name];
			}
		}
		var tc_array = new Array();
		
		if(this.kc_tc_tag_num <= tag_num){
			var i=0;
			var vi=0;
			for(var tag_name in this.kc_tc_names){
				if(!this.kc_tc_nums[tag_name]){
					//エントリーのないタグは無視
					continue;
				}
				var a = this.kc_tc_nums[tag_name] / tag_most;
				a = 6 * a;
				a = Math.floor(a);
				a++;
				vi = i + 1;
				if(a>=6){
					a=6;
				}
				tc_array.push({level:a, name:tag_name, num:this.kc_tc_nums[tag_name], value:this.kc_tc_names[tag_name]});
				i++;
			}
		}//if(this.kc_tc_tag_num <= tag_num){
		if(tc_array.length){
			return tc_array;
		}else{
			return this.getError('TAG');
		}

	};//this.parseTagCloud
	
	this.init();
}

