/**
 *
 */

var search = {
	resultsPerPage : 10,

	response : null,

	query : '',
	decodedQuery : '',
	queryWords : null,
	market : 'en-US',

    fillSearchBox : function(){
		var qsObj = QueryStringToObject(location.search);
		if (!qsObj.q) return;
		if (qsObj.market) search.market = qsObj.market;

		var contentSearchField = document.getElementById('contentSearchField');
		search.query = qsObj.q = qsObj.q.replace(/\+/g, ' ');

		try {
			search.decodedQuery = decodeURIComponent(search.query);
			search.display=decodeURIComponent(search.query);
		} catch(ex){
			search.decodedQuery = unescape(search.query);
			search.display=unescape(search.query);
		}

		//search.decodedQuery=search.query;
		contentSearchField.value = search.display;
	},

	doSearch : function(){
		search.fillSearchBox();
        search.searchBing();
	},

    searchBing : function(){
		var script = document.createElement('script');
		script.type = 'text/javascript';
		script.charset = 'UTF-8';
		script.src = ['http://api.bing.net/json.aspx?AppId=5921D2F297AC3AE65824780B556772A58D5A345E&Version=2.2&Market=', search.market, '&Sources=web+spell&Web.Count=', search.resultsPerPage,'&JsonType=callback&JsonCallback=search.parseResults&Query=', search.decodedQuery].join('');
		document.body.appendChild(script);
	},

    numberOfResults : 0,

	parseResults : function(response){
		var web, results, resultStr = [], target = ' target="_blank" ';
		search.response = response;
		if (!response.SearchResponse || !response.SearchResponse.Web || !response.SearchResponse.Web.Results || response.SearchResponse.Web.Results.length == 0){
			// no results
			resultStr.push('<div class="noResults"><h1>We did not find any results for <b>', search.query, '</b>.</h1><b>Search tips:</b><ul><li>Ensure words are spelled correctly.</li><li>Try rephrasing keywords or using synonyms.</li><li>Try less specific keywords.</li><li>Make your queries as concise as possible.</li></ul></div>');
		} else {
			// got results
			web = response.SearchResponse.Web;
			//resultStr.push('<div class="resultNum">', (web.Offset + 1).toCommaSeparated(),'-', (web.Offset + search.resultsPerPage).toCommaSeparated(),' of ', web.Total.toCommaSeparated(), ' results</div>');

			results = web.Results;
			resultStr.push('<ul>');
			for (var i=0, leni=results.length; i<leni; i++){
				resultStr.push(
					'<li><h3><a class="title" href="', results[i].Url, '"', target, '>', search.markQuery(results[i].Title), '</a></h3>',
					'<p>', search.markQuery(results[i].Description), '</p>',
					'<span class="displayUrl">', search.markQuery(results[i].DisplayUrl), '</span>');
				if (results[i].CacheUrl){
					resultStr.push('&nbsp;&nbsp;<a class="cache" href="', results[i].CacheUrl, '"', target, '>Cached page</a>');
				}
				resultStr.push('</li>');
                search.numberOfResults++;
                if( search.numberOfResults >= 15 ) {
                    break;
                }
			}
			resultStr.push('</ul>');
		}

		var searchResultsCont = document.getElementById('searchResultsCont');
		searchResultsCont.innerHTML = searchResultsCont.innerHTML + resultStr.join('');
        if( search.numberOfResults < 15 && adfirmativeResults ) {
            search.searchBing();
        }
	},

    parseReadyResults : function(){
		search.fillSearchBox();
        search.parseResults( adfirmativeResults );
	},

	markQuery : function(str){
		if (!str) return;
		if (!search.queryWords){
			search.queryWords = search.decodedQuery.split(/[\s`~!@#\$\^&\*\(\)\-\_\+\=\|\\\[\]\;\:'"\<\>\?\/\,\.]+/);
		}
		for (var i=0, leni=search.queryWords.length; i<leni; i++){
			if (search.queryWords[i].length < 2) continue;
			var re = new RegExp(['(', search.queryWords[i], ')'].join(''), 'ig');
			str = str.replace(re, "<b>$1</b>");
		}
		return str;
	}
};


if( adfirmativeResults ) {
   if (window.attachEvent){
	   window.attachEvent('onload', search.parseReadyResults);
    } else {
	   window.addEventListener('load', search.parseReadyResults, false);
    }
} else if (window.attachEvent){
	window.attachEvent('onload', search.doSearch);
} else {
	window.addEventListener('load', search.doSearch, false);
}

Array.prototype.reverse = function(){
	var arr = [];
	for (var i=this.length-1; i>=0; i--) arr.push(this[i]);
	return arr;
};

String.prototype.reverse = function(){
	return this.split('').reverse().join('');
};

Number.prototype.toCommaSeparated = function(fixed){
	var parts = this.toString().split(".");
	parts[0] = parts[0].reverse().replace(/(\d{3})(?=\d)/g,"$1,").reverse();
	if (parts[1]){
		parts[1] = fixed ? parts[1] ? parts[1].length >= fixed ? parts[1].substring(0,fixed) : parts[1] + "0".times(fixed-parts[1].length) : "0".times(fixed) : parts[1];
		return parts.join(".");
	} else {
		return parts[0];
	}
};

function QueryStringToObject(str, key){
	if (str.indexOf('=') == -1) return null;	// not a query string format
	if (str.indexOf('?') == 0) str = str.substring(1);
	var obj = {}, pairs = str.split('&'), kv;
	for (var i=0, leni=pairs.length; i<leni; i++){
		kv = pairs[i].split('=');
		if (kv.length != 2) continue;
		obj[kv[0]] = kv[1];
	}
	return key ? obj[key] : obj;
}
