var $Dev = function(element) {return typeof element == 'string' ? document.getElementById(element) : element;}
var engine = {
	term: null,
	keywords: [],
	// пожалуйста, используйте ваш собственный API KEY
	apikey: "yi8gZ37V34E7drKI3IgrCbn5lmG3QaHG9LNHpuTbBX0_7e1ETzeesOKjKpfenxa3",
	responses: 0,
	
	submit: function() {
		if (!$Dev('btn_go') || $Dev('btn_go').className == 'loader') return;
		var qField = $Dev('form_q'), qSpan = $Dev('span_q');
		
		if (!qField.value.replace(/[\s\t]+/img, '')) {
			alert('Введите какое-нибудь ключевое слово');
			qField.focus();
			qField.select();
			return false;
		}

		$Dev('btn_go').className = 'loader';
		
		with (qSpan.style) {
			width = qField.clientWidth - 10 + 'px';
			marginRight = '10px';
		}
		qSpan.innerHTML = qField.value;
		qField.style.display = 'none';
		qSpan.style.display = 'block';
		
		this.keywords = [];
		this.responses = 0;
		this.term = qField.value;			
		this.get();
		this.getImages();
		return false;
	},
	get: function() {			
		var s = document.createElement('script');
		s.src = "http://boss.yahooapis.com/ysearch/web/v1/"+this.term+
				"?format=json&callback=engine.onGetWebComplete&count=3&view=keyterms&"+
				"appid=" + this.apikey;
		s.type = "text/javascript";
		document.getElementsByTagName("head")[0].appendChild(s);
	},
	getImages: function() {
		var s = document.createElement('script');
		s.src = "http://boss.yahooapis.com/ysearch/images/v1/"+this.term+
				"?format=json&callback=engine.onGetImagesComplete&count=6&view=keyterms&"+
				"dimensions=small&appid=" + this.apikey;
		s.type = "text/javascript";
		document.getElementsByTagName("head")[0].appendChild(s);
	},
	onGetImagesComplete: function(results) {
		if (!results || !results.ysearchresponse) {
			this.responses++;
			this.onWebShow();
			return;
		}

		var response = results.ysearchresponse;
		
		var results = document.createElement('DIV');
			results.className = "results";
		if (!this.responses)
			$Dev('results').innerHTML = "";

		if (response.count > 0) {
			var ul = document.createElement('UL');
			for(var i=0; i<response.count; i++) {
				var li = this.formImage(response.resultset_images[i]);
				if (i%3 == 0) li.style.clear = "both";
				ul.appendChild(li);
			}
			// resultset_images
			// resultset_web
			
			results.innerHTML = "<h3>Результаты поиска картинок:</h3>";
			results.appendChild(ul);
			$Dev('results').appendChild(results);
		}
		
		this.responses++;
		this.onWebShow();
	},
	formImage: function(element) {
		// filename, format, height, mimetype, refererclickurl, refererurl, size, thumbnail_height, thumbnail_url, thumbnail_width, title, url, width
		var li = document.createElement('LI');
		var piclink = document.createElement('A');
			piclink.href = element.refererclickurl;
			piclink.setAttribute("target", "_blank");
			piclink.title = element.abstract;
		var pic = document.createElement('IMG');
			pic.src = element.thumbnail_url;
			pic.alt = element.title;
		var p = document.createElement('P');
		var small = document.createElement('SMALL');
		var url = piclink.cloneNode(true);
			url.innerHTML = element.title;
			
			small.appendChild(url);
			p.appendChild(small);
			piclink.appendChild(pic);
			
			li.appendChild(piclink);
			li.appendChild(p);				
			
		return li;
	},
	onGetWebComplete: function(results) {
		if (!results || !results.ysearchresponse) {
			this.responses++;
			this.onWebShow();
			return;
		}
		
		var response = results.ysearchresponse;
		
		var results = document.createElement('DIV');
			results.className = "results";
		if (!this.responses)
			$Dev('results').innerHTML = "";

		if (response.count > 0) {
			var ol = document.createElement('OL');
			for(var i=0; i<response.count; i++) {
				var li = this.formWeb(response.resultset_web[i]);
				ol.appendChild(li);
			}
			// resultset_images
			// resultset_web
			
			results.innerHTML = "<h3>Результаты поиска сайтов:</h3>";
			results.appendChild(ol);
			$Dev('results').appendChild(results);
		}
		
		this.responses++;
		this.onWebShow();
	},
	onWebShow: function() {
		if (this.responses < 2) return;
		$Dev('btn_go').className = '';
		var qField = $Dev('form_q'), qSpan = $Dev('span_q');
		
		with (qSpan.style) {
			width = '';
			marginRight = '';
		}
		
		this.formKeys();
		qField.style.display = '';
		qSpan.style.display = 'none';
		
		if (!$Dev('results').getElementsByTagName('DIV').length) {
			$Dev('results').innerHTML = "<p>По вашему запросу ничего не найдено. Введите другое ключевое слово.</p>";
		}
		
		qField.focus();
		qField.select();
	},
	formWeb: function(element) {
		// abstract, clickurl, date, dispurl, keyterms.terms, size, title, url
		var li = document.createElement('LI');
		var title = document.createElement('A');
			title.href = element.clickurl;
			title.setAttribute("target", "_blank");
			title.innerHTML = element.title;
		var descr = document.createElement('P');
			descr.innerHTML = element.abstract;
		var small = document.createElement('SMALL');
		var url = title.cloneNode(true);
			url.innerHTML = element.dispurl;
		var small2 = document.createElement('SMALL');
			small2.innerHTML = " &mdash; <em>" + (Math.round((element.size*10)/1024)/10) + "Kb</em>";
			
			small.appendChild(url);
			small.appendChild(small2);
			li.appendChild(title);
			li.appendChild(descr);
			li.appendChild(small);
			
		if (element.keyterms.terms.length) {
			this.keywords = this.keywords.concat(element.keyterms.terms);
		}
		
		return li;
	},
	keyClick: function(key) {
		$Dev('form_q').value = unescape(key);
		$Dev('form_q').focus();
		this.submit();
	},
	filter: function(kw){
		var kw = kw.join(',');
			kw = kw.toLowerCase();
			kw = kw.split(',');
		var kw = kw.sort();
		var count = 0;
		var filtered = [];
		for(var i=0,j=kw.length-1;i<j;i++){
			if(kw[i]!==kw[i+1]){
				filtered.push(count + '|' + kw[i]);
				count = 0;
			}
			count++;
		}
		filtered.sort(function(a,b){
			return parseInt(a) - parseInt(b);
		});
		filtered.reverse();
		filtered = filtered.slice(0,10);
		var toplist = []
		for(var i=0,j=filtered.length;i<j;i++){
			var bits = filtered[i].split('|');
			toplist.push(bits[1]);
			filtered[i] = {term:bits[1],amount:bits[0]};
		}
		return [filtered,toplist];
	},
	formKeys: function() {
		var keys = [], cnt=0;
		var keywords = this.filter(this.keywords)[1];
		
		for(var i in keywords) {
			keys.push("<span class=\"key\" onclick=\"engine.keyClick('"+escape(keywords[i])+"')\">"+keywords[i]+"</span>");
		}
		
		if (!keys.length) return;
		
		var div = document.createElement('DIV');
			div.innerHTML = keys.join(", ");
		var results = document.createElement('DIV');
			results.className = "results";
			results.innerHTML = "<h3>Связанные ключевые слова:</h3>";
			results.appendChild(div);
			
		var childs = $Dev('results').getElementsByTagName('DIV');
		if (childs.length)
			$Dev('results').insertBefore(results, childs[0]);
		else
			$Dev('results').appendChild(results);
	}
};
