GOOGLE_API_KEY = 'ABQIAAAAMClxnbZeCBwLN4IyuO-eWhR-tclUnMjyVGwNlpJ5rmQZVRixyBT31LGSJUic-geFYBG_UCm6t3-Kcw';
BING_API_KEY 	= '76EEAE3FF0C13FBC58BD94A3251773C0A0D05C8A';

var $val = '';
var resultMax = 8;
var googleNext = 0;
var yahooNext = 0;
var bingNext = 0;
var nextGoogleSearch = false;
var nextYahooSearch = false;
var nextBingSearch = false;

function startSearch()
{
	$val = $('#query').val();
	
	if($val == '') return;

	$('#bingResults').html('').parent().get(0).scrollTop = 0;
	$('#yahooResults').html('').parent().get(0).scrollTop = 0;
	$('#googleResults').html('');
	$('.searchCol').each(function() {this.scrollTop = 0});
	
	googleNext = yahooNext = bingNext = 0;

	
	googleSearch();
	yahooSearch();
	bingSearch();
}

function googleSearch() 
{
	if(!$('#googleCheckbox').get(0).checked) return;
	
	setLoad('googleCol');
	
	var serviceURI = 'https://ajax.googleapis.com/ajax/services/search/web?v=1.0&hl=de&rsz=large&client=pub-8143471353232664&start=' + googleNext;
	var search = "&q=" + encodeURI($val);
	var fullUri = serviceURI + search + '&key=' + GOOGLE_API_KEY + '&callback=googleProcessResults';
	insertScript(fullUri);
}

function googleProcessResults(json) 
{
	if(typeof json.responseData == 'undefined') return;
	
	var result = json.responseData.results;				
	for(var i in result) 
	{
		$(resultTemplate(result[i].title, result[i].content, result[i].visibleUrl, result[i].url)).appendTo('#googleResults');
	}
	nextGoogleSearch = false;
	remLoad('googleCol');
}

function yahooSearch() 
{
	if(!$('#yahooCheckbox').get(0).checked) return;
	
	setLoad('yahooCol');
	
	var serviceURI = 'https://query.yahooapis.com/v1/public/yql?format=json&lang=de-DE';
	var query = 'select * from search.web(' + yahooNext + ',' + resultMax + ') where query="' + encodeURI($val) + '" and region="de" and lang="de"';
	var search = '&q=' + encodeURI(query);
	var fullUri = serviceURI + search + '&callback=yahooProcessResults';
	insertScript(fullUri);
}

function yahooProcessResults(json) 
{
	if(typeof json.query.results == 'undefined') return;
	
	var result = json.query.results.result;		
	for(var i in result) 
	{
		$(resultTemplate(result[i].title, result[i].abstract, result[i].dispurl, result[i].url)).appendTo('#yahooResults');
	}
	nextYahooSearch = false;
	remLoad('yahooCol');
}

function bingSearch() 
{
	if(!$('#bingCheckbox').get(0).checked) return;
	
	setLoad('bingCol');
	
	var serviceURI = 'http://api.search.live.net/json.aspx?JsonType=callback&sources=web&web.count=' + resultMax;
	var search = '&query=' + encodeURI($val);
	var fullUri = serviceURI + search + '&AppId=' + BING_API_KEY + '&JsonCallback=bingProcessResults';
	
	if(bingNext > 0)
		fullUri += '&web.offset=' + bingNext+1;
	
	insertScript(fullUri);
}

function bingProcessResults(json) 
{
	if(typeof json.SearchResponse.Web.Results == 'undefined') return;
	
	var result = json.SearchResponse.Web.Results;
	for(var i in result) 
	{
		$(resultTemplate(result[i].Title, result[i].Description, result[i].DisplayUrl, result[i].Url)).appendTo('#bingResults');
	}
	nextBingSearch = false;
	remLoad('bingCol');
}

function insertScript(uri)
{
	var head = document.getElementsByTagName('head');
	var script = document.createElement('script');
	script.type = "text/javascript";
	script.src = uri;
	script.charset="utf-8";
	head[0].appendChild(script);
}

function resultTemplate(title, desc, link, url)
{
	return '<li class="result">'
		+	'<h3><a href="' + decodeURI(url) + '" class="title" target="_blank">' + decodeURI(title) + '</a></h3>'
		+	'<p>' + desc + '</p>'
		+	'<a href="' + decodeURI(url) + '" class="link" target="_blank">' + decodeURI(link) + '</a>'
		+	'</li>';
}

function setLoad(col)
{
	$('#' + col).addClass('ajaxLoad');
}

function remLoad(col)
{
	$('#' + col).removeClass('ajaxLoad');
}

function wheel() {
	var g = document.getElementById('googleCol');
	gScT = g.scrollTop;
	gScH = g.scrollHeight - g.clientHeight;
	
	if(g.scrollTop == gScH && !nextGoogleSearch) {
		googleNext += resultMax;
		nextGoogleSearch = true;
		googleSearch();
	}
	
	var y = document.getElementById('yahooCol');
	yScT = y.scrollTop;
	yScH = y.scrollHeight - y.clientHeight;
	
	if(y.scrollTop == yScH && !nextYahooSearch) {
		yahooNext += resultMax;
		nextYahooSearch = true;
		yahooSearch();
	}
	
	var b = document.getElementById('bingCol');
	bScT = b.scrollTop;
	bScH = b.scrollHeight - b.clientHeight;
	
	if(b.scrollTop == bScH && !nextBingSearch) {
		bingNext += resultMax;
		nextBingSearch = true;
		bingSearch();
	}
}

$(window).load(function() { 
	document.getElementById('query').focus() 

	var h = document.body.clientHeight;
	
	var ch = h-$('#resultFrame').offset().top;

	$('#resultFrame').height(ch);
	$('.searchCol').height(ch);
	
	if (window.addEventListener)
	        window.addEventListener('DOMMouseScroll', wheel, false);

	window.onmousewheel = document.onmousewheel = wheel;
});




function utf8_decode (str_data) {
    // Converts a UTF-8 encoded string to ISO-8859-1  
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/utf8_decode    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork    // +   bugfixed by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'    
    var tmp_arr = [],
        i = 0,
        ac = 0,
        c1 = 0,
        c2 = 0,        c3 = 0;
 
    str_data += '';
 
    while (i < str_data.length) {        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if (c1 > 191 && c1 < 224) {            c2 = str_data.charCodeAt(i + 1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i + 1);            c3 = str_data.charCodeAt(i + 2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    } 
    return tmp_arr.join('');
}

function utf8_encode (argString) {
    // Encodes an ISO-8859-1 string to UTF-8  
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/utf8_encode    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // +   bugfixed by: Ulrich
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'    
    
    var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
    var utftext = "",
        start, end, stringl = 0;
 
    start = end = 0;    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
         if (c1 < 128) {
            end++;
        } else if (c1 > 127 && c1 < 2048) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc !== null) {
            if (end > start) {
                utftext += string.slice(start, end);            }
            utftext += enc;
            start = end = n + 1;
        }
    } 
    if (end > start) {
        utftext += string.slice(start, stringl);
    }
     return utftext;
}
