﻿/**
 * @package LIBERRA
 * @copyright Copyright 2009 Liberra Development Team
 * @author k.hommaru
 */
 //var BASE_URL  = 'http://chiebukuro.yahooapis.jp/Chiebukuro/V1/questionSearch';
var PROXY_URL = './proxy/req';
var API_KEY   = 'qx.Ffyqxg65rgqtfPTTTmkrwxxcEeaCKR_ExwneTQEFsoMCW3EqSZuq4xPJAxNN21d9DW00-';
var BASE_WORD = ['アクセる★ビリー 番組スタッフ ♂'];
var key_number = 0;

/**
 * クラス生成
 */
var Class = {
	create: function() {
		return function() {
      		this.initialize.apply(this, arguments);
    	}
  	}
};

/**
 * 名前空間
 */
var LIBERRA = {
	package   : 'LIBERRA',
	copyright : 'Copyright 2009 Liberra Development Team',
	author    : 'k.hommaru'
}

/**
 * リクエストに対する結果 
 */
LIBERRA.KnowledgeResultSet = Class.create();
LIBERRA.KnowledgeResultSet.prototype = {
	totalResultsAvailable : 0,		// マッチした質問の総数です。
	totalResultsReturned  : 0,		// 返却され、かつマッチした質問の数です。もし有効な結果の合計が少ない場合、要求した結果の数より少ないことがあります。
	firstResultPosition   : 0, 		// 全検索結果の最初のポジションです。
	knowledgeStatus       : null,	// レスポンスの状態やサーバーからのメッセージ
	result                : null,	// クエリーレスポンス
    initialize: function() {
    },
    setTotalResultsAvailable: function(totalResultsAvailable) {
    	this.totalResultsAvailable = totalResultsAvailable;
    },
    getTotalResultsAvailable: function() {
    	return this.totalResultsAvailable;
    },
    setTotalResultsReturned: function(totalResultsReturned) {
    	this.totalResultsReturned = totalResultsReturned;
    },
    getTotalResultsReturned: function() {
    	return this.totalResultsReturned;
    },
	setFirstResultPosition: function(firstResultPosition) {
		this.firstResultPosition = firstResultPosition;
	},
	getFirstResultPosition: function() {
		return this.firstResultPosition;
	},
    setKnowledgeStatus: function(knowledgeStatus) {
        this.knowledgeStatus = knowledgeStatus;
    },
    getKnowledgeStatus: function() {
        return this.knowledgeStatus;
    },
    setResult: function(result) {
        this.result = result;
    },
    getResult: function() {
        return this.result;
    }
};

/**
 * 	レスポンス状態
 */
LIBERRA.KnowledgeStatus = Class.create();
LIBERRA.KnowledgeStatus.prototype = {
	statusCode            : 0,		// 実行結果のステータスです。正常終了の場合は「0」、異常が検出された場合には「-1」を返します。
	error                 : null,	// 異常が検出された場合、エラーの詳細を含みます。
	message               : null,	// エラーメッセージ
    initialize: function() {
    },
	setStatusCode: function (statusCode) {
		this.statusCode = statusCode;
	},
	getStatusCode: function() {
		return this.statusCode;
	},
	setError: function(error) {
		this.error = error;
	},
	getError: function() {
		return this.error;
	},
	setMessage: function(message) {
		this.message = message;
	},
	getMessage: function () {
		return this.message;
	}
};

/**
 * クエリーレスポンス
 */
LIBERRA.KnowledgeResult = Class.create();
LIBERRA.KnowledgeResult.prototype = {
	questions             : null,	// 各個別レスポンス(複数)
    initialize: function() {
    	this.questions = new Array();
    },
	addQuestion: function(question) {
		this.questions.push(question);
	},
	setQuestions: function(questions) {
		this.questions = questions;
	},
	getQuestions: function() {
		return this.questions;
	}
};

/**
 * 各個別レスポンス
 */
LIBERRA.KnowledgeQuestion = Class.create();
LIBERRA.KnowledgeQuestion.prototype = {
	id                    : null,	// 質問IDです。
	content               : null,	// 質問本文です。
	bestAnswer            : null,	// ベストアンサーです。
	url                   : null,	// 詳細ページのURLです。
	condition             : null,	// 質問の状態です。open：回答受付中の質問 vote：投票受付中の質問 solved：解決済みの質問
	categoryPath          : null,	// 階層表示したカテゴリ名です。区切り文字は「|」です。
	categoryIdPath        : null,	// 階層表示したカテゴリIDです。区切り文字は「|」です。
	ansCount              : null,	// 回答数です。
	postedDate            : null,	// 質問日時です。
	solvedDate            : null,	// 解決日時です。
	postedDevice          : null,	// 投稿の種類（パソコンからの投稿、ケータイからの投稿）です。「mobile」はケータイからの投稿、「pc」はパソコンからの投稿です。
    initialize: function() {
    },
	setId: function(id) {
		this.id = id;
	},
	getId: function() {
		return this.id;
	},
	setContent: function(content) {
		this.content = content;
	},
	getContent: function() {
		return this.content;
	},
	setBestAnswer: function(bestAnswer) {
		this.bestAnswer = bestAnswer;
	},
	getBestAnswer: function() {
		return this.bestAnswer;
	},
	setUrl: function(url) {
		this.url = url;
	},
	getUrl: function() {
		return this.url;
	},
	setCondition: function(condition) {
		this.condition = condition;
	},
	getCondition: function() {
		return this.condition;
	},
	setCategoryPath: function(categoryPath) {
		this.categoryPath = categoryPath;
	},
	getCategoryPath: function() {
		return this.categoryPath;
	},
	setCategoryIdPath: function(categoryIdPath) {
		this.categoryIdPath = categoryIdPath;
	},
	getCategoryIdPath: function() {
		return this.categoryIdPath;
	},
	setAnsCount: function(ansCount) {
		this.ansCount = ansCount;
	},
	getAnsCount: function() {
		return this.ansCount;
	},
	setPostedDate: function(postedDate) {
		this.postedDate = postedDate;
	},
	getPostedDate: function() {
		return this.postedDate;
	},
	setSolvedDate: function(solvedDate) {
		this.solvedDate = solvedDate;
	},
	getSolvedDate: function() {
		return this.solvedDate;
	},
	setPostedDevice: function(postedDevice) {
		this.postedDevice = postedDevice;
	},
	getPostedDevice: function() {
		return this.postedDevice;
	}
};

function loadk(){
	//var kword = BASE_WORD.split(",");
	if (key_number<BASE_WORD.length){
	        loadKnowledge(BASE_WORD[key_number]);
	}
	/*
	
	  for (var k=0; k<BASE_WORD.length ; k++){
	        loadKnowledge(BASE_WORD[k]);
	  }
	
	for(var k in BASE_WORD){
		loadKnowledge(k);
	}
	*/
}


/**
 * 知恵袋検索を実行
 */
function loadKnowledge(keyword) {
	// インプトフィールド内の検索キーワードを取得
	
	//alert(keyword);
	var queryword = keyword;
	
	//var queryword = $('input:[id=queryword]').val();

	// 文字列が空の場合、予め指定した検索キーワードを代入
	//if (!queryword) {
	//	queryword = keyword;
	//}

	try {
		// 通信開始
		$.ajax({
			dataType: 'xml',
			data: {
				'appid': API_KEY,
				'query': queryword,
				'type': 'all',
				'condition': 'all',
				'sort': '-posteddate',
				'posteddevice': 'all',
				'results':6
			},
			cache: false,
			url: PROXY_URL,
			success: parseKnowledge,
			error: errorKnowledge,
			complete: function() {}
		});
	} catch (e) {
		alert(e);
		alert('処理に失敗しました。');
	} finally {}		
}

/**
 * 知恵袋検索結果を解析
 */
function parseKnowledge(xml) {
	try {
		var resultSet = new LIBERRA.KnowledgeResultSet();
		
		// 件数解析
		resultSet.setTotalResultsAvailable(
			$(xml).find('ResultSet').attr('totalResultsAvailable')
		);
		resultSet.setTotalResultsReturned(
			$(xml).find('ResultSet').attr('totalResultsReturned')
		);
		resultSet.setFirstResultPosition(
			$(xml).find('ResultSet').attr('firstResultPosition')
		);

		// 構造解析
		$(xml).find('ResultSet').each(function() {
			// レスポンス状態
			var status = new LIBERRA.KnowledgeStatus();
			status.setStatusCode(
				$('Status', this).find('StatusCode').text()
			);
			if (status.getStatusCode() != 0) {
				// TODO エラーコードの取得
				alert('情報を取得できませんでした。');
				return;
			}
			// "レスポンス状態"を追加
			resultSet.setKnowledgeStatus(status);

			// "クエリーレスポンス"を取得
			$('Result', this).each(function() {
				var result = new LIBERRA.KnowledgeResult();
				// "各個別レスポンス"を取得
				$('Question', this).each(function() {
					var question = new LIBERRA.KnowledgeQuestion();
					question.setId(
						$('Id', this).text()
					);
					question.setContent(
						$('Content', this).text()
					);
					question.setBestAnswer(
						$('BestAnswer', this).text()
					);
					question.setUrl(
						$('Url', this).text()
					);
					question.setCondition(
						$('Condition', this).text()
					);
					question.setCategoryPath(
						$('CategoryPath', this).text()
					);
					question.setCategoryIdPath(
						$('CategoryIdPath', this).text()
					);
					question.setAnsCount(
						$('AnsCount', this).text()
					);
					question.setPostedDate(
						$('PostedDate', this).text()
					);
					question.setSolvedDate(
						$('SolvedDate', this).text()
					);
					question.setPostedDevice(
						$('PostedDevice', this).text()
					);
					
					// "クエリーレスポンス"に"各個別レスポンス"を追加
					result.addQuestion(question);
				});
				
				// "クエリーレスポンス"を追加
				resultSet.setResult(result);
			});
		});
		
		showResultSet(resultSet);
	} catch (e) {
		alert('処理に失敗しました。');
	} finally {
		key_number = key_number+1;
		loadk();
	}
	
}

/**
 * 知恵袋検索失敗
 */
function errorKnowledge(xml, status, e) {
	alert(
		xml+'\n'+
		status+'\n'+
		e
	);
	alert('検索に失敗しました。');
}


function showResultSet(resultSet) {
	// 表示中のものを削除
	//$('div:[id=output]').empty();
	//var html = $('div:[id=output]').html(html);
	var html = '';
	
	// 件数表示
	/*
	html += resultSet.getTotalResultsAvailable();
	html += '件中';
	html += resultSet.getFirstResultPosition();
	html += '～';
	html += resultSet.getTotalResultsReturned();
	*/
	// "クエリーレスポンス"を取得
	var result = resultSet.getResult();
	// "各個別レスポンス"を全て取得
	var questions = result.getQuestions();
	
	// 結果表示

	var h_solved = '';
	var h_open = '';

	var len_open = 215;
	var len_solved = 110;
	var str_big ='';
	var str_content ='';
	
	var question;
	var my_condition;
	var my_questionNum;
	
	//var dom_obj = '';
	
	var num_open = 0; 
	for (var i=0; i<questions.length; i++) {
		question = questions[i];
		
		my_condition = question.getCondition();
		my_questionNum = resultSet.getTotalResultsAvailable();

		str_big = question.getContent().substring(0,5);
		str_content = question.getContent().substring(5);
		
			
		if(my_condition == 'solved'){
		
			h_solved = '<p><a target="_blank" href='+question.getUrl()+'>'+textLength(question.getContent(),len_solved )+'</a></p>';

			$('div:[id=outputSolved]').append(h_solved);
		}else if (my_condition == 'open'){

			h_open = '<div><p>'+textLength(str_content,len_open)+'</p><div class="btn"><a target="_blank" href='+question.getUrl()+'>'+'</a></div><div>';

			$('div:[id=output]').append(h_open);

			num_open++;	
		}
	}
	if (num_open==0){
		var dom_obj = document.getElementById('output');
		dom_obj.parentNode.removeChild(dom_obj);
	}
}
function textLength(str,len){
	var trunc = str;
	if (trunc.length > len) {
		trunc = str.substring(0, len)+'...';
	}
	return trunc;
}
