// termCloud
// code by Bernhard Rieder
// licensed under the Gnu Public License (GPL)
// copyleft 2008
//
// v0.41 01/02/2009 added regional search
// v0.4 01/02/2009 added "show relations" feature
// v0.3 26/12/2008 added inbound and related features, interface tweaks, bugfixes
// v0.2 25/12/2008 new interface, bugfixes
// v0.1 17/12/2008


// ========== global variables ==========

var _appid = "Cp.8DQjV34EWZcnE2J30PdVQ6V2mS1P4wT5gU76i0_ZP7A1.WgrcX4OZiIqEyzIp";
var _keywords = new Array;
var _keywordsTrans = new Array;
var _results = new Array;
var _query;
var _counter = 0;
var _smallest = 8;
var _norelated = 8;
var _confRelated = 0;
var _selectedTag = -1;

var _styles = ["font-size:10px;color:#777777;",
			   "font-size:12px;color:#777777;",
			   "font-size:14px;color:#666666;",
			   "font-size:16px;color:#666666;",
			   "font-size:18px;color:#555555;",
			   "font-size:20px;color:#555555;",
			   "font-size:22px;color:#444444;",
			   "font-size:24px;color:#444444;",
			   "font-size:26px;color:#333333;",
			   "font-size:28px;color:#333333;",
			   "font-size:30px;color:#222222;",
			   "font-size:32px;color:#222222;",
			   "font-size:34px;color:#000000;",
			   "font-size:36px;color:#000000;"]


// ========== Functions ==========

function init() {
	
	var _wls = window.location.search;
	
	if(_wls != "") {
		
		_wls = _wls.substr(1,_wls.length - 1);

		$("#interface_query").val(decodeURIComponent(_wls));

		search(_wls);
	}
}



function search(_param){
	
	if(_param == "") {
		return;
	}
	
	_query = _param;
	
	$("#interface_loading").css("visibility","visible");
	$("#box_tagcloud").fadeOut("slow");
	$("#results").html("");
	
	_results = new Array;
	_smallest = 8;
	_counter = 0;
	
	getResults(0);
	getResults(50);
	getResults(100);
	getResults(150);
	getResults(200);
}

function getResults(_start) {
	
	_counter++;
	
	var _local = $("#preferences_region").attr("value").split(",");
	
	_url = "http://boss.yahooapis.com/ysearch/web/v1/" + _query +
		   "?appid=" + _appid +
		   "&count=50"+
		   "&start=" + _start +
		   "&view=keyterms"+
		   "&region="+_local[0]+
		   "&lang="+_local[1]+
		   "&format=json&callback=?";
	
	//prompt("",_url);
	
	$.getJSON(_url, function(data){

		var _tmpresults = data["ysearchresponse"]["resultset_web"];
		
		for(var i = 0; i < _tmpresults.length; i++) {
			
			_results.push(_tmpresults[i]);
		}
		
		_counter--;
		
		if(_counter == 0) {
			dispTagcloud();	
		}
	});
}

function dispTagcloud() {
	
	$("#interface_loading").css("visibility","hidden");
	
	_keywords = new Array;
	_assocwords = new Array;
	
	_lasttag = -1;
	
	for (var i = 0; i < _results.length; i++) {
		
		var _tmpwords = _results[i]["keyterms"]["terms"];
		
					
		try {
			for (var j = 0; j < _tmpwords.length; j++) {
			
				_tmpwords[j] = _tmpwords[j].toLowerCase();
				
				if (_tmpwords[j] != _query) {
					if (typeof(_assocwords["x" + _tmpwords[j]]) == "undefined") {
						_assocwords["x" + _tmpwords[j]] = new Array;
						_assocwords["x" + _tmpwords[j]]["counter"] = 1;
						_assocwords["x" + _tmpwords[j]]["links"] = new Array;
						_assocwords["x" + _tmpwords[j]]["links"].push(_results[i]);
					}
					else {
						_assocwords["x" + _tmpwords[j]]["counter"]++;
						_assocwords["x" + _tmpwords[j]]["links"].push(_results[i]);
					}
				}
			}
		} catch(e) {}
	}
	
	
	var _biggest = 0;
	
	for (var _key in _assocwords) {
		
		if(parseInt(_assocwords[_key]["counter"]) > _biggest) {
			_biggest = _assocwords[_key]["counter"];
		}
		
		if (_assocwords[_key]["counter"] > _smallest) {
			_keywords.push(_assocwords[_key]);
			_keywords[_keywords.length - 1]["term"] = _key.substr(1, _key.length - 1);
		}
	}
	
	_biggest -= _smallest;
	
	var _html = '';
	
	_keywords.sort(keysortfunction);
		
	for (var i = 0; i < _keywords.length; i++) {
		
		_keywordsTrans["x" + _keywords[i]["term"]] = i;	// create translation table
		
		var _tmpsize = _keywords[i]["counter"] - _smallest;
		
		if(_tmpsize != 0) {
			_tmpsize = Math.round(_tmpsize / _biggest * (_styles.length - 1));
		}
		
		_html += '<span class="tag" id="tagspan_' + i + '" onclick="dispResult(' + i + ');" style="' + _styles[_tmpsize] + '">' + _keywords[i]["term"] + '</span>'+
				 '<span class="tag_frequency"> (' + _keywords[i]["counter"]  + ')</span> ';
	}
	
	$("#tagcloud").html(_html);
	$("#box_tagcloud").fadeIn("slow");
}


function keysortfunction(a, b){

	if (a["term"] < b["term"]) {
		return -1;
	}
	else {
		return 1;
	}
}


function resizeTagcloud(_param) {
	
	if (_smallest > 0) {
		_smallest += _param;
	}
	
	$("#results").html("");
	dispTagcloud();
}

function toogleTop(_param) {
	
	$("#box_"+_param).slideToggle();
}

function toogleRelations() {
	
	if(_confRelated == 0) {
		_confRelated = 1;
		$("#toolbar_button_relations").css("background-color","#3399FF");
	} else {
		_confRelated = 0;
		$("#toolbar_button_relations").css("background-color","#ffffff");
	}
	
	if (_selectedTag != -1) {
		dispResult(_selectedTag);
	}
}

function dispResult(_param) {
	
	// decolor all
	for(var i = 0; i < _keywords.length; i++) {
		$("#tagspan_"+i).css("background-color","#ffffff");
	}
	
	$("#tagspan_"+_param).css("background-color","#3399FF");

	_selectedTag = _param;

	var _html = '';
	
	var _links = _keywords[_param]["links"];
	
	var _relatedTerms = new Array;
	
	for (var i = 0; i < _links.length; i++) {

		for(var j = 0; j < _links[i]["keyterms"]["terms"].length; j++) {
			if(typeof(_relatedTerms["x" + _links[i]["keyterms"]["terms"][j]]) == "undefined") {
				_relatedTerms["x" + _links[i]["keyterms"]["terms"][j]] = 1;
			} else {
				_relatedTerms["x" + _links[i]["keyterms"]["terms"][j]]++;
			}
		}
	
		_html += '<div class="res_block" id="res_block_' + _param + '_' + i + '">'+
				 '<div class="res_title">' + _links[i]["title"] + '</div>'+
				 '<div class="res_url" onclick="window.open(\'' + _links[i]["url"] + '\')">' + _links[i]["url"] + '</div>'+
				 '<div class="res_abstract">' + _links[i]["abstract"] + '</div>'+
				 '<div class="res_keyterms">' + _links[i]["keyterms"]["terms"].join(" | ") + '</div>'+
				 '<div class="res_toolbar">'+
				 	 '<span class="toolbar_button" onclick="dispLinkto(' + _param + ',' + i + ')">inbound</span> '+
					 '<span class="toolbar_button" onclick="dispRelated(' + _param + ',' + i + ')">related</span>'+
				 '</div>'+
				 '<div class="res_links" id="res_links_' + _param + '_' + i + '"></div>'+
				 '</div>';	
	}
	
	$("#results").html(_html);
	
	// color very related terms
	if (_confRelated == 1) {
		
		var _relatedList = new Array;
		
		for (var _key in _relatedTerms) {
			_relatedList.push(new Array(_key, _relatedTerms[_key]));
		}
		
		_relatedList.sort(relatedsortfunction);
		_relatedList.reverse();
		
		var _tmp = _norelated;
		
		for (var i = 0; i <= _tmp; i++) {
		
			if (_keywordsTrans[_relatedList[i][0]] != _param) {
				if($("#tagspan_" + _keywordsTrans[_relatedList[i][0]]).length == 1){
					$("#tagspan_" + _keywordsTrans[_relatedList[i][0]]).css("background-color", "#FFCC66")
				} else {
					_tmp++;
				}
			}
		}
	}
}


function relatedsortfunction(a, b){

	if (a[1] < b[1]) {
		return -1;
	}
	else {
		return 1;
	}
}


function dispLinkto(_kw,_el) {
	
	//http://search.yahooapis.com/SiteExplorerService/V1/inlinkData?appid=YahooDemo&query=http://search.yahoo.com&results=2&output=json
	
	_url = "http://search.yahooapis.com/SiteExplorerService/V1/inlinkData"+
		   "?appid=" + _appid +
		   "&query=" + _keywords[_kw]["links"][_el]["url"] +
		   "&results=10"+
		   "&omit_inlinks=domain"+
		   "&output=json&callback=?";
	
	/*
	_url = "http://boss.yahooapis.com/ysearch/web/v1/link:" + _keywords[_kw]["links"][_el]["url"] +
		   "?appid=" + _appid +
		   "&count=5"+
		   "&start=0"+
		   "&view=keyterms"+
		   "&format=json&callback=?";
	*/
	
	window.scrollTo(0,$("#res_block_" + _kw + "_" + _el).offset().top);
	$("#res_links_" + _kw + "_" + _el).slideUp();
	
	$.getJSON(_url, function(data){
		
		var _html = '';
	
		var _inlinks = data["ResultSet"]["Result"];
		
		for (var i = 0; i < _inlinks.length; i++) {
		
			_html += '<div class="res_links_block">';
			_html += '<div class="res_links_title">' + _inlinks[i]["Title"] + '</div>';
			_html += '<div class="res_links_url" onclick="window.open(\'' + _inlinks[i]["Url"] + '\')">' + _inlinks[i]["Url"] + '</div>';
			//_html += '<div class="res_links_abstract">' + _links[i]["abstract"] + '</div>';
			//_html += '<div class="res_links_keyterms">' + _links[i]["keyterms"]["terms"].join(" | ") + '</div>';
			_html += '</div>';
		}
		
		$("#res_links_" + _kw + "_" + _el).html(_html);
		$("#res_links_" + _kw + "_" + _el).slideDown();
	});
}

function dispRelated(_kw,_el) {
	
	//http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Earth%20Day
	
	_url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0"+
		   "&q=related:" + _keywords[_kw]["links"][_el]["url"] +
		   "&rsz=large"+
		   "&callback=?";
	
	/*
	_url = "http://boss.yahooapis.com/ysearch/web/v1/link:" + _keywords[_kw]["links"][_el]["url"] +
		   "?appid=" + _appid +
		   "&count=5"+
		   "&start=0"+
		   "&view=keyterms"+
		   "&format=json&callback=?";
	*/
	
	window.scrollTo(0,$("#res_block_" + _kw + "_" + _el).offset().top);
	$("#res_links_" + _kw + "_" + _el).slideUp();
	
	//prompt("",_url);
	
	$.getJSON(_url, function(data){
		var _html = '';
	
		var _related = data["responseData"]["results"];
		
		for (var i = 0; i < _related.length; i++) {
		
			_html += '<div class="res_links_block">';
			_html += '<div class="res_links_title">' + _related[i]["title"] + '</div>';
			_html += '<div class="res_links_url" onclick="window.open(\'' + _related[i]["url"] + '\')">' + _related[i]["url"] + '</div>';
			//_html += '<div class="res_links_abstract">' + _links[i]["abstract"] + '</div>';
			//_html += '<div class="res_links_keyterms">' + _links[i]["keyterms"]["terms"].join(" | ") + '</div>';
			_html += '</div>';	
		}
		
		$("#res_links_" + _kw + "_" + _el).html(_html);
		$("#res_links_" + _kw + "_" + _el).slideDown();
	});
}