// termZones
// code by Bernhard Rieder
// licensed under the Gnu Public License (GPL)
// copyleft 2008


// ========== global variables ==========

var _appid_boss = "Cp.8DQjV34EWZcnE2J30PdVQ6V2mS1P4wT5gU76i0_ZP7A1.WgrcX4OZiIqEyzIp";
var _appid_bing = "C65E00A7BD29398AECFF0CAEA5395773F0C61A25";

var _query;							// stores the search query

var _noResults = 1000;
var _noTerms = 40;
var _shuffleIter = 1000;

var _searchterms = new Object();
var _searchresults = new Array();
var _termlist = new Array();
var _termlist_equ = new Object();
var _termlist_equ_alpha = new Object();
var _cooctermlist = new Array();
var _coocmatrix = new Array();
var _clusters = new Array();
var _distribute = new Array();
var _counter = 0;
var _transcounter = 0;
var _confRelated = 0;

var _scrollproc = null;

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;"]

var _clusterStyles = [	"font-size:10px;color:#777777;",
			   			"font-size:11px;color:#777777;",
			   			"font-size:12px;color:#666666;",
			   			"font-size:13px;color:#666666;",
			   			"font-size:14px;color:#555555;",
			   			"font-size:15px;color:#555555;",
			   			"font-size:16px;color:#444444;",
			   			"font-size:17px;color:#444444;",
			   			"font-size:18px;color:#333333;",
			   			"font-size:19px;color:#333333;",
			   			"font-size:20px;color:#222222;",
			   			"font-size:21px;color:#222222;",
			   			"font-size:22px;color:#000000;",
			   			"font-size:23px;color:#000000;"]

// ========== Functions ==========

$(document).ready(function() {
	
	// position interface in middle of page
	$("#page").css("left",($(window).width()-1000) / 2);
	$("#background").css("left",($(window).width()-1000) / 2);
	$("#screenmsg").css("left",($(window).width()-190) / 2);
	
	// load interface buttons
	
	
	// check for an address bar query
	var _wls = window.location.search;
	
	if(_wls != "") {
		_wls = _wls.substr(1,_wls.length - 1);
		$("#interface_query").val(decodeURIComponent(_wls));
		search(_wls);
	}
	
	/*window.onscroll = function() {
		
		if(_scrollproc != null) {
			window.clearTimeout(_scrollproc);
			_scrollproc = null;
		}
		
		if(_scrollproc == null) {
			
			_scrollproc = window.setTimeout("scrollTo()",100);
		}
	}*/
	
	window.onresize = function() {
		
		// position interface in middle of page
		$("#page").css("left",($(window).width()-1000) / 2);
		$("#background").css("left",($(window).width()-1000) / 2);
		$("#screenmsg").css("left",($(window).width()-190) / 2);
	}
});

/*
function scrollTo() {
	
	var _pos = $("#box_interface").offset().top + $("#box_interface").height() + 10;
	
	var _goto = ($(window).scrollTop() < _pos) ? _pos : $(window).scrollTop();
	
	$("#box_terms").animate({
        "top": _goto
    }, 300);
}
*/


function search(_param){
	
	if(_param == "") { return; }
	
	_query = _param;
	
	screenMsgIn("loading...");
	//$("#interface_loading").css("visibility","visible");
	$("#results").html("");
	$("#box_terms").fadeOut();
	$("#box_results").fadeOut();
	$("#box_clusters").fadeOut();
	setInterface("cloud");
	
	
	_searchresults = new Array();
	_tmptermlist = new Object();
	_termlist = new Array();
	_termlist_equ = new Object();
	_coocmatrix = new Array();
	_clusters = new Array();
	_index = 0;
	_counter = 0;
	_selectedTags = new Array();
	
	
	getBing();
	getDelicious();
}



function getBing() {			// get words from Bing	
	
	_counter++;
	
	_url = "http://api.search.live.net/json.aspx?AppId="+ _appid_bing +
		   "&Market=en-US"+
		   "&Query="+_query+
		   "&Sources=RelatedSearch"+
		   "&JsonType=callback&JsonCallback=?";
    
	$.ajax({
        type: "GET",
        url: _url,
		dataType: "jsonp",
		jsonp: "JsonCallback",
        //data: "name=John&location=Boston",
        success: function(data){
            
			if (typeof(data["SearchResponse"]["RelatedSearch"]) != "undefined") {
				_searchterms.bing = data["SearchResponse"]["RelatedSearch"]["Results"];
			} else {
				_searchterms.bing = new Array();
			}
			
			_counter--;
		
			if(_counter == 0) {
				
				getYahoo();	
			}
        }
    });
}

function getDelicious() {				// get words from delicious	
	
	_counter++;
	
	_url = "http://feeds.delicious.com/v2/json/popular/"+ _query.replace(/\s/g,"") +
				   "?count=100"+
				   "&callback=?";
    
	$.ajax({
        type: "GET",
        url: _url,
		dataType: "jsonp",
        //data: "name=John&location=Boston",
        success: function(_delresults){
        	
			var _deltmpterms = new Object();
			var _delterms = new Array();
			
			for (var i = 0; i < _delresults.length; i++) {
				
				for (var j = 0; j < _delresults[i]["t"].length; j++) {
				
					if(typeof(_deltmpterms[_delresults[i]["t"][j]]) == "undefined") {
						_deltmpterms[_delresults[i]["t"][j]] = { "term":_delresults[i]["t"][j], "count":1 }
					} else {
						_deltmpterms[_delresults[i]["t"][j]]["count"]++;
					}
				
				}							
			}
			
			for(var _key in _deltmpterms) {
				_delterms.push(_deltmpterms[_key])
			}
			
			
			_delterms.sort(function(a, b){

				if (a["count"] > b["count"]) {
					return -1;
				} else {
					return 1;
				}
			});
			
			var _stop = (_delterms.length >= 8) ? 8 : _delterms.length;
			
			_searchterms.delicious = _delterms.slice(0,_stop);

			
			_counter--;
		
			if(_counter == 0) {
				
				getYahoo();	
			}
        }
    });			
}

function getYahoo() {
	
	var _tmpresults = _noResults;
	
	for (var i = 0; i < _searchterms.bing.length; i++) {
		
		getResults(0,_searchterms.bing[i]["Title"]);
		
		_tmpresults -= 50; 
	}
	
	for(var _key in _searchterms.delicious) {
		
		getResults(0,_searchterms.delicious[_key]["term"]);
		
		_tmpresults -= 50; 
	}
	
	for(var i = 0; i < _tmpresults; i = i + 50) {
		getResults(i,_query);
	}
}

function getResults(_start,_query) {
	
	_counter++;
	
	_url = "http://boss.yahooapis.com/ysearch/web/v1/" + _query +
		   "?appid=" + _appid_boss +
		   "&count=50"+
		   "&start=" + _start +
		   "&view=keyterms"+
		   "&format=json&callback=?";
		
	$.getJSON(_url, function(data){
		
		
		if (typeof(data["ysearchresponse"]["resultset_web"]) != "undefined") {
		
			var _tmpresults = data["ysearchresponse"]["resultset_web"];
			
			for (var i = 0; i < _tmpresults.length; i++) {
			
				_searchresults.push(_tmpresults[i]);
			}	
		}
		
		_counter--;
		
		if(_counter == 0) {
			
			$("#interface_info").html("loaded " + _searchresults.length + " results")
			
			analyzeResults();	
		}
	});
}

function analyzeResults() {
	
	var _tmptermlist = new Object();
	
	// create list of all words and occurences
	for (var i = 0; i < _searchresults.length; i++) {
		
		if (typeof(_searchresults[i]["keyterms"]["terms"]) != "undefined") {
			
			var _tmpwords = _searchresults[i]["keyterms"]["terms"];
			
			for (var j = 0; j < _tmpwords.length; j++) {
			
				_tmpwords[j] = _tmpwords[j].toLowerCase();
				
				if (_tmpwords[j] != _query) {
					if (typeof(_tmptermlist["x" + _tmpwords[j]]) == "undefined") {
						_tmptermlist["x" + _tmpwords[j]] = new Array;
						_tmptermlist["x" + _tmpwords[j]]["term"] = "x" + _tmpwords[j];
						_tmptermlist["x" + _tmpwords[j]]["counter"] = 1;
						_tmptermlist["x" + _tmpwords[j]]["links"] = new Array;
						_tmptermlist["x" + _tmpwords[j]]["links"].push(_searchresults[i]);
					}
					else {
						_tmptermlist["x" + _tmpwords[j]]["counter"]++;
						_tmptermlist["x" + _tmpwords[j]]["links"].push(_searchresults[i]);
					}
				}
			}
		}
	}
	
	// filter words with lower frequency than _minocc
	for (var _key in _tmptermlist) {
		_termlist.push(_tmptermlist[_key]);
	}
	delete _tmptermlist;	// free up memory
	
	_termlist.sort(sortfunction);
	_termlist = _termlist.slice(0,_noTerms);
	
	
	
	// create cooccurence matrix fill with zeros
	for (var i = 0; i < _termlist.length; i++) {
	
		_termlist[i]["id"] = i;
	
		_coocmatrix[i] = new Array();
	
		_termlist_equ[_termlist[i]["term"]] = i;		// create equivalency list
		
		for (var j = 0; j < _termlist.length; j++) {
	
			_coocmatrix[i][j] = 0;
		}
	}
	
	// fill cooccurence matrix
	
	for (var i = 0; i < _termlist.length; i++) {
		
		var _tmplist = _termlist[i]["links"];
			
		for (var j = 0; j < _tmplist.length; j++) {
			
			var _tmpwords = _tmplist[j]["keyterms"]["terms"];
			
			for (var k = 0; k < _tmpwords.length; k++) {
			
				var _tmpkey = "x" + _tmpwords[k].toLowerCase();
				
				_coocmatrix[i][_termlist_equ[_tmpkey]]++;
				
			}
		}
	}
	
	_cooctermlist = _termlist.slice();
	
	for(var i = 0; i < _coocmatrix.length; i++) {
		_distribute.push(i);
	}
	
	screenMsgOut();
	dispTagcloud();
}




// ----------------------------------------------------------------------
// functions
// ----------------------------------------------------------------------

function sortfunction(a, b){

	if (a["counter"] > b["counter"]) {
		return -1;
	} else {
		return 1;
	}
}

