/* Partner search on Tagoo.ru. http://tagoo.ru/webmaster.php?mode=json_api */

function ajax_loader() {
	this.method = 'GET';
	var xml_http = null;
	this.load = function(url, success, error) {
		if (!xml_http)
			xml_http = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
		if (xml_http) {
			try {
				xml_http.open(this.method, url, true);
				xml_http.onreadystatechange = function() {
					if (xml_http.readyState == 4)
						if (xml_http.status == 200) {
							try { success('('+xml_http.responseText+')'); }
							catch(e) {  error(e.message); }
						} else 
							error('Ajax connection error: ' + (xml_http.statusText || this.statusText));
				}
				xml_http.send(null);
			}
			catch (e) { error('Ajax error: ' + e.message); }
		} else { error('Ajax error request creation'); }
	}
	this.load_script = function(url, onload, charset) {
		var head = document.getElementsByTagName("head")[0];
		var script = document.createElement("script");
		script.src = url;
		if (charset) script.charset = charset;
		var done = false;
		script.onload = script.onreadystatechange = function()
		{
			if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) 
			{
				done = true;
				if (onload instanceof Function)
					onload(typeof(tagoo_json_data) != 'undefined' ? tagoo_json_data : null);
				head.removeChild(script);
			}
		};
		head.appendChild(script);
	}
}

function tagoo_search()
{
	var loader = new ajax_loader();
	var request_url = 'http://tagoo.ru/api_search.php';
	this.load_json = function(arguments, onload) {
		var url = '';
		arguments.seed = Math.round(Math.random()*100000);
		for (var i in arguments)
			url += (url == '' ? '?' : '&') + i + '=' + arguments[i];
		url = request_url + url;
		loader.load_script(url, function(data) { if (onload instanceof Function) onload(data); }, "UTF-8");
	}
}

function tagoo_audio_search()
{
}
tagoo_audio_search.prototype = new tagoo_search();

tagoo_audio_search.prototype.search = function(key, query, on_page, onload, page) {//opt: on_page, onload, page
	var args = {'key': key, 'search': encodeURIComponent(query), 'for': 'audio', 'on_page': on_page};
	if (page && page > 0)
		args.page = page;
	this.load_json(args, onload);
}

function tagoo_video_search()
{
}
tagoo_video_search.prototype = new tagoo_search();

tagoo_video_search.prototype.search = function(key, query, on_page, onload, page) {//opt: on_page, onload, page
	var args = {'key': key, 'search': encodeURIComponent(query), 'for': 'video', 'on_page': on_page};
	if (page && page > 0)
		args.page = page;
	this.load_json(args, onload);
}

function tagoo_init(funcs) {
	tagoo_helpers.add_event(window, 'load', function(){
		if (funcs instanceof Array) {
			for (var i=0; i<funcs.length; ++i) {
				if (funcs[i] instanceof Function)
					funcs[i]();
				else if (funcs[i].length && funcs[i][0] instanceof Function)
					funcs[i][0].apply(this, funcs[i][1] instanceof Array ? funcs[i][1] : [funcs[i][1]]);
			}
		} else
			funcs();
	});
}

var tagoo_trigger_error = false;
function tagoo_error(err)
{
	if (tagoo_langs && tagoo_langs.ru.strings['error_'+err])
		tagoo_trigger_error = err;
}

var tagoo_helpers = {
	mbytes: function(bytes) {
		return Math.round(bytes / 104857.6) / 10;
	},

	cut_string: function(str, number, add) {
		if (!add) add = '...';
		if (!number) number = 30;
		if (str.length > number)
			str = str.substr(0, number)+add;
		return str;
	},

	tagfilter: function(str) {
		if (!(str instanceof String)) {
			if (str)
				str = str.toString();
			else
				return '';
			if (!str.length)
				return str;
		}
		return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
	},
	
	trim: function(str) {
		return str.replace(/(^\s+)|(\s+$)/g, "");
	},
	
	add_event: function(elem, type, handle) {
		if (elem.addEventListener)
			elem.addEventListener(type, handle, false);
		else if (elem.attachEvent)
			elem.attachEvent("on" + type, handle);
	},
	
	get_by_name: function(form, name) {
		for (var i=0; i<form.elements.length; ++i) {
			if (form.elements[i].name == name)
				return form.elements[i];
		}
	},
	
	get_by_tag_name: function(root, tag) {
		for (var i=0; i<root.childNodes.length; ++i) {
			if (root.childNodes[i].tagName == tag.toUpperCase())
				return root.childNodes[i];
			else if (root.childNodes[i].childNodes.length) {
				var el = this.get_by_tag_name(root.childNodes[i], tag);
				if (typeof el == 'object')
					return el;
			}
		}
	},
	
	get_by_class: function(root, className) {
		for (var i=0; i<root.childNodes.length; ++i) {
			if (root.childNodes[i].className == className)
				return root.childNodes[i];
			else if (root.childNodes[i].childNodes.length) {
				var el = this.get_by_class(root.childNodes[i], className);
				if (typeof el == 'object')
					return el;
			}
		}
	},

	create_css: function(arr, add_sel) {
		var ua = navigator.userAgent.toLowerCase();
		var isIE = (/msie/.test(ua)) && !(/opera/.test(ua)) && (/win/.test(ua));
		if (!isIE) {
			var style_node = document.createElement("style");
			style_node.setAttribute("type", "text/css");
			style_node.setAttribute("media", "screen");
			var str = '';
			for (var i=0; i<arr.length; ++i)
				str += ((add_sel || '')+' ')+arr[i][0]+' { '+arr[i][1]+' }'; 
			style_node.appendChild(document.createTextNode(str));
			document.getElementsByTagName("head")[0].appendChild(style_node);
		} else if (isIE && document.styleSheets) {
			var list = document.styleSheets.length == 0 ? 0 : document.styleSheets.length - 1;
			if (!list)
				document.getElementsByTagName("head")[0].appendChild(document.createElement('style'));
			var last_style_node = document.styleSheets[list];
			if (typeof(last_style_node.addRule) == "object")
				for (var i=0; i<arr.length; ++i)
					last_style_node.addRule(((add_sel || '')+' ')+arr[i][0], arr[i][1]);
		}
	},

	create_div: function(opt_text, opt_className) {
		var el = document.createElement("div");
		if (opt_text) el.innerHTML = opt_text;
		if (opt_className) el.className = opt_className;
		return el;
	},

	create_span: function(opt_text, opt_className) {
		var el = document.createElement("span");
		if (opt_text) el.innerHTML = opt_text;
		if (opt_className) el.className = opt_className;
		return el;
	},

	create_ordered_list: function(list_items, opt_className) {
		var el = document.createElement("ol");
		if (opt_className) el.className = opt_className;
		for (var i=0; i<list_items.length; ++i)
			el.appendChild(list_items[i]);
		return el;
	},

	create_list_item: function(opt_text, opt_className) {
		var el = document.createElement("li");
		if (opt_text) el.innerHTML = opt_text;
		if (opt_className) el.className = opt_className;
		return el;
	},
	
	create_form: function(opt_className) {
		var el = document.createElement("form");
		if (opt_className) el.className = opt_className;
		return el;
	},
	
	create_table: function(opt_className) {
		var el = document.createElement("table");
		if (opt_className) el.className = opt_className;
		return el;
	},
	
	create_table_row: function(table, opt_className) {
		var tr = table.insertRow(-1);
		if (opt_className) tr.className = opt_className;
		return tr;
	},
	
	create_table_cell: function(tr, opt_text, opt_className) {
		var td = tr.insertCell(-1);
		if (opt_text) td.appendChild(document.createTextNode(opt_text));
		if (opt_className) td.className = opt_className;
		return td;
	},
	
	create_input: function(opt_name, opt_type, opt_value, opt_className) {
		var el = document.createElement("input");
		el.type = "text";
		if (opt_type) el.type = opt_type;
		if (opt_className) el.className = opt_className; 
		if (opt_name) el.name = opt_name; 
		if (opt_value) el.value = opt_value;
		return el;
	},
	
	create_link: function(href, opt_text, opt_target, opt_className) {
		var el = document.createElement("a");
		el.href = href;
		if (opt_text) el.appendChild(document.createTextNode(opt_text));
		if (opt_className) el.className = opt_className;
		if (opt_target) el.target = opt_target;
		return el;
	},
	
	create_div_link: function(href, opt_text, opt_target, opt_className) {
		var div = this.create_div(null, opt_className);
		var el = document.createElement("a");
		el.href = href;
		if (opt_text) el.appendChild(document.createTextNode(opt_text));
		if (opt_className) el.className = opt_className;
		if (opt_target) el.target = opt_target;
		div.appendChild(el);
		return div;
	},
	
	create_image: function(src, opt_w, opt_h, opt_className) {
		var el = document.createElement("img");
		if (opt_w) el.width = opt_w;
		if (opt_h) el.height = opt_h;
		el.src = src;
		if (opt_className) el.className = opt_className;
		return el;
	},

	remove_child: function(parent, child) {
		parent.removeChild(child);
	},

	set_class: function(el, className) {
		el.className = className;
	}
}


// Languages variables
var tagoo_langs = {
	ru: {
		strings: {
			tagoo_title: "Tagoo.ru - медиа поисковая система",
			search: "Найти!",
			powered_by: "технология",
			add_to_my_site: "Добавить такой же поиск на мой сайт!",
			empty: "К сожалению, ничего не найдено.",
			empty_root: "Не задано, куда вставлять виджет.",
			unknown_root_element: "Не существует элемента с заданным уникальным именем.",
			empty_key: "Задан пустой партнерский ключ.",
			error_auth: "Задан неверный партнерский ключ.",
			error_domain: "Домен не находится в списке допустимых доменов.",
			error_ban: "Вы забанены. <a href=\"http://tagoo.ru/ru/ban.php\">Я не робот!</a>",
			error_self_ban: "Вы заблокировали свой партнерский ключ.",
			error_limit_exceed: "Достигнуто максимальное число запросов в день.",
			error_dont_let: "Партнерский ключ был заблокирован администрацией."
		},
		current_lang: 'ru'
	},
	en: {
		strings: {
			tagoo_title: "Tagoo.ru - media search engine",
			search: "Find!",
			powered_by: "powered by",
			add_to_my_site: "Add this search widget to my site!",
			empty: "Unfortunately nothing was found.",
			empty_root: "There is no root value.",
			unknown_root_element: "Root element is empty.",
			empty_key: "Empty partner key.",
			error_auth: "Not valid partner key.",
			error_domain: "There is no such domain in domain-list.",
			error_ban: "You are banned. <a href=\"http://tagoo.ru/en/ban.php\">I'm not robot!</a>",
			error_self_ban: "You have deactivated you partner key.",
			error_limit_exceed: "Maximum number of queries per day exceed.",
			error_dont_let: "Partner key was disabled by adminitrator."
		},
		current_lang: 'en'
	},
	de: {
		strings: {
			tagoo_title: "Tagoo.ru - Media-Suchmaschine",
			search: "Finden!",
			powered_by: "powered by",
			add_to_my_site: "Add such search widget to my site!",
			empty: "Unfortunately nothing was found.",
			empty_root: "There is no root value.",
			unknown_root_element: "Root element is empty.",
			empty_key: "Empty partner key.",
			error_auth: "Not valid partner key.",
			error_domain: "There is no such domain in domain-list.",
			error_ban: "You are banned. <a href=\"http://tagoo.ru/de/ban.php\">I'm not robot!</a>",
			error_self_ban: "You have disactivated you partner key.",
			error_limit_exceed: "Maximum number of queries per day exceed.",
			error_dont_let: "Partner key was disabled by adminitrator."
		},
		current_lang: 'de'
	}
};

// Styles variables
var tagoo_styles = function() {
	return {
		text_color: "#6C6C6C",
		link_color: "#FD7C11",
		page_found_link_color: "#008800",
		pages_link_color: "#c1c1c1",
		pages_sel_link_color: "#FF9E00",
		pages_hover_link_color: "#fff",
		pages_hover_bg_link_color: "#FF9E00"
	};
};

var tagoo_css = function(styles){
	return [
		['.tagoo_search',  				'border: 1px solid #ccc; padding: 10px; margin: 10px; width: auto; font-size: 12px; font-family: Arial,sans-serif; '],
		['.tagoo_search .hidden',	 	'display: none !important; '],
		['.tagoo_search *',	 			'margin: 0; padding: 0; font-weight: normal; '], 
		['.tagoo_search a', 			'font-weight: normal;'],
		['.tagoo_search form', 			'margin: 0; '],
		['.tagoo_search table', 		'width: 100%; border-collapse:separate;'],
		['.tagoo_search form input', 	'width: 98%; '],
		['.error', 						'color: #900; text-align: center;'],
		['.tagoo_search .search_bar .logo', 	'text-align: right; font-size: 10px; '],
		['.tagoo_search .search_bar .logo a', 	'text-decoration: none; color: #ccc; '],
		['.tagoo_search .search_bar .logo img', 'vertical-align: bottom; '], 
		['.tagoo_search a img', 		'border: 0; float: none;'],
		['.tagoo_search .pages',		'text-align: center; '],
		['.tagoo_search .pages a',		'text-decoration: none; padding: 2px 5px; font-weight: bold;'],
		['.tagoo_search .pages a:hover', 'text-decoration: underline;'],
		['.tagoo_search .body .empty',	'margin: 10px 0; text-align: center; font-size: 15px;'],
		['.tagoo_search .body ol',		'margin: 10px 0; '],
		['.tagoo_search .body table',	'margin: 10px 0; '],
		['.tagoo_search .body li',		'padding: 0 0 10px 0; list-style: none !important; '],
		['.tagoo_search .body td',		'text-align: center; padding: 5px 0;'],
		['.tagoo_search .body .link',	'display: inline !important; '],
		['.tagoo_search .body .page_url a','display: inline !important; '], 
		['.tagoo_search .body .number',	'display:block; float:left; line-height:30px; padding-right:5px;'],
		['.tagoo_search .body .fileinfo','font-size: 9px;'],
		['.tagoo_search .add_site',		'color: #999; font-size: 10px; text-align: center; margin:15px 0 0;'],
		
		['.tagoo_search',  				'color: '+styles['text_color']+';'],
		['.tagoo_search .body .link',	'color: '+styles['link_color']+'; '],
		['.tagoo_search .body .page_url','color: '+styles['page_found_link_color']+'; '], 
		['.tagoo_search .pages a',		'color: '+styles['pages_link_color']+';'],
		['.tagoo_search .pages a.curr',	'color: '+styles['pages_sel_link_color']+'; '],
		['.tagoo_search .pages a:hover','color: '+styles['pages_hover_link_color']+'; '],
		['.tagoo_search .pages a:hover','background-color: '+styles['pages_hover_bg_link_color']+'; ']
	];
}

function tagoo_search_control(root, key, type, options) {//opt: options
	if (!root || !key || !type)
		return false;
	this.root 			= document.getElementById(root);
	this.root_str 		= root;
	this.key 			= key;
	this.search 		= null;
	this.search_type 	= type;
	this.query 			= '';
	this.current_page 	= 1;
	this.on_page 		= 10;
	this.pages 			= 10;
	this.max_page		= 10;
	this.data			= null;
	this.sid			= 0;
	this.lang 			= tagoo_langs.ru;
	this.styles			= tagoo_styles();
	this.opts			= {
		onload: 		null,
		onload_args: 	null,
		onreload: 		null,
		onreload_args: 	null,
		auto_result:	true
	};
	this.stat_loader	= new ajax_loader();
}

tagoo_search_control.prototype.pages_numbers = function() {
	this.query = this.data.query;
	this.on_page = this.data.on_page;
	var pages = Math.floor(this.data.total / this.on_page);
	this.pages = pages > this.max_page ? this.max_page : pages;
	this.sid = this.data.last_sid;
}

tagoo_search_control.prototype.render = function(opt_query) {
	tagoo_helpers.create_css(tagoo_css(this.styles), '#'+this.root_str);
	if (opt_query)
		this.query = opt_query;
	this.search = this.search_factory();
	var t = this;
	this.search.search(this.key, opt_query ? opt_query : '', this.on_page, function(data){t.post_render(data);});
}
tagoo_search_control.prototype.set_query = function(query){//opt: query
	if (query) this.query = query;
	var form = tagoo_helpers.get_by_tag_name(this.root, 'form');
	if (form)
		tagoo_helpers.get_by_name(form, 'search').value = tagoo_helpers.tagfilter(this.query);
}
tagoo_search_control.prototype.get_query = function(){
	return this.query;
}
tagoo_search_control.prototype.render_part = function(data){
	this.data = data;
	this.pages_numbers();
	var body = tagoo_helpers.get_by_class(this.root, 'body');
	var footer = tagoo_helpers.get_by_class(this.root, 'pages');
	var add_site = tagoo_helpers.get_by_class(this.root, 'add_site');
	var app = tagoo_helpers.get_by_class(this.root, 'tagoo_search');
	tagoo_helpers.remove_child(app, body);
	tagoo_helpers.remove_child(app, footer);
	tagoo_helpers.remove_child(app, add_site);
	var t = this;
	var l = this.list_factory();
	app.appendChild(l.render());
	var p = new tagoo_paginator(this.pages, this.current_page, function(e, page){t.onclick(e, page);});
	app.appendChild(p.render());
	this.app.appendChild(this.add_to_my_site());
	this.set_query();
	if (this.opts.onreload && this.opts.onreload_args)
	{
		var arr = this.opts.onreload_args;
		arr.push(this);
		this.opts.onreload.apply(this, arr);
	}
	else if (this.opts.onreload)
		this.opts.onreload.apply(this, [this]);
}
// ACTIONS!
tagoo_search_control.prototype.onsubmit = function(e) {
	this.current_page = 1;
	var form = tagoo_helpers.get_by_tag_name(this.root, 'form');
	var query = tagoo_helpers.get_by_name(form, 'search').value;
	this.query = query;
	var t = this;
	if(this.opts.auto_result || !this.opts.auto_result && tagoo_helpers.trim(this.query).length)
		this.search.search(this.key, this.query, this.on_page, function(data){t.render_part(data);});
	e.preventDefault ? e.preventDefault() : e.returnValue = false;
}
tagoo_search_control.prototype.onclick = function(e, page) {// on pages click
	this.current_page = page;
	var t = this;
	this.search.search(this.key, this.query, this.on_page, function(data){t.render_part(data);}, page);
	e.preventDefault ? e.preventDefault() : e.returnValue = false;
}
tagoo_search_control.prototype.onclick_general = function(ctype, target_url) {
	var url = 'http://tagoo.ru/api_stat.php?log='+this.sid+
		'&for='+this.search_type+'&type=json'+
		'&ctype='+ctype+'&key='+this.key+
		'&search='+encodeURIComponent(this.query)+
		'&url='+encodeURIComponent(target_url);
	this.stat_loader.load_script(url);
}
tagoo_search_control.prototype.onclick_page = function(e, url) {// on url to page, where found click
	this.onclick_general.call(this, 'page', url);
}
tagoo_search_control.prototype.submit = function(query) {
	if (query) this.set_query(query);
	var button = tagoo_helpers.get_by_class(this.root, 'submit_btn');
	button.click();
}
tagoo_search_control.prototype.set_options_base = function(options) {
	if (!(options instanceof Object))
		return false;
	if (options.lang && tagoo_langs[options.lang])
		this.lang		= tagoo_langs[options.lang];
	if (options.styles instanceof Object)
	{
		for (prop in options.styles)
			if (prop in this.styles)
				this.styles[prop] = options.styles[prop];
	}
	if (options.max_page && options.max_page > 0)
		this.max_page	= options.max_page;
	if (options.onload && options.onload instanceof Function)
		this.opts.onload			= options.onload;
	if (options.onload_args && options.onload_args instanceof Array)
		this.opts.onload_args		= options.onload_args;
	if (options.onreload && options.onreload instanceof Function)
		this.opts.onreload			= options.onreload;
	if (options.onreload_args && options.onreload_args instanceof Array)
		this.opts.onreload_args		= options.onreload_args;
	if (options.auto_result === false)
		this.opts.auto_result		= false;
}
// Checks
tagoo_search_control.prototype.check_params = function(root, key) {
	if (!root)
	{
		alert(this.lang.strings['empty_root']+' ['+root+']\n Help: '+this.help_url);
		return false;
	}
	var el = document.getElementById(root) || null;
	if (!el)
	{
		alert(this.lang.strings['unknown_root_element']+' ['+root+']\n Help: '+this.help_url);
		return false;
	}
	if (!key)
	{
		var div = tagoo_helpers.create_div(this.lang.strings['empty_key']);
		el.appendChild(div);
		return false;
	}
	return true;
}
tagoo_search_control.prototype.get_empty_obj = function() {
	return {
		render: function(){},
		set_options: function(){},
		get_query: function(){},
		set_query: function(){},
		submit: function(){}
	};
}
tagoo_search_control.prototype.has_errors = function() {
	if (tagoo_trigger_error !== false)
	{
		var div = tagoo_helpers.create_div(this.lang.strings['error_'+tagoo_trigger_error], 'error');
		this.root.appendChild(div);
		return true;
	}
	return false;
}
tagoo_search_control.prototype.add_to_my_site = function() {
	var div = tagoo_helpers.create_div_link("http://tagoo.ru/"+this.lang.current_lang+"/webmaster.php?mode=json_api", this.lang.strings['add_to_my_site'], '_blank', 'add_site');
	return div;
}

// Tagoo Audio Search
function tagoo_audio_search_control(root, key, options) {//opt: options
	this.lang = (options && options.lang && tagoo_langs[options.lang])  ? tagoo_langs[options.lang] : tagoo_langs.ru;
	this.help_url		= "http://tagoo.ru/"+this.lang.current_lang+"/webmaster.php?mode=json_api"
	if (!this.check_params(root, key))
		return this.get_empty_obj();
	tagoo_search_control.call(this, root, key, 'audio', options);
	if(options) this.set_options(options);
}
tagoo_audio_search_control.prototype = new tagoo_search_control();
tagoo_audio_search_control.prototype.construct = tagoo_audio_search_control; 
tagoo_audio_search_control.prototype.set_options = function(options) {
	this.set_options_base(options);
	if (!(options instanceof Object))
		return false;
	if (options.on_page && options.on_page > 0)
		this.on_page	= options.on_page;
}
tagoo_audio_search_control.prototype.post_render = function(data) {
	if (this.has_errors()) return false;
	var t = this;
	this.data = data;
	this.pages_numbers();
	this.app = tagoo_helpers.create_div(null, 'tagoo_search');
	var s_bar = new tagoo_search_bar(this.lang, this.key, this.search_type, this.query, function(e){t.onsubmit(e);});
	var al = new tagoo_audio_list(this.lang, this.data.data, this.current_page, this.on_page, function(e,  url){t.onclick_page(e, url);});
	var p = new tagoo_paginator(this.pages, this.current_page, function(e, page){t.onclick(e, page);});
	this.app.appendChild(s_bar.render());
	this.app.appendChild(al.render());
	this.app.appendChild(p.render());
	this.app.appendChild(this.add_to_my_site());
	this.root.appendChild(this.app);
	this.set_query();
	if (this.opts.onload && this.opts.onload_args)
	{
		var arr = this.opts.onload_args;
		arr.push(this);
		this.opts.onload.apply(this, arr);
	}
	else if (this.opts.onload)
		this.opts.onload.apply(this, [this]);
}
tagoo_audio_search_control.prototype.search_factory = function() {
	return new tagoo_audio_search();
}
tagoo_audio_search_control.prototype.list_factory = function() {
	var t = this;
	return new tagoo_audio_list(this.lang, this.data.data, this.current_page, this.on_page, function(e, url){t.onclick_page(e, url);}); 
}

// Tagoo Video Search
function tagoo_video_search_control(root, key, options) {//opt: options
	this.lang = (options && options.lang && tagoo_langs[options.lang])  ? tagoo_langs[options.lang] : tagoo_langs.ru;
	this.help_url		= "http://tagoo.ru/"+this.lang.current_lang+"/webmaster.php?mode=json_api"
	if (!this.check_params(root, key))
		return this.get_empty_obj();
	this.cells			= 3;
	this.rows			= 3;
	this.on_page 		= this.cells * this.rows;
	tagoo_search_control.call(this, root, key, 'video', options);
	if(options) this.set_options(options);
}
tagoo_video_search_control.prototype = new tagoo_search_control();
tagoo_video_search_control.prototype.construct = tagoo_video_search_control;
tagoo_video_search_control.prototype.set_options = function(options) {
	this.set_options_base(options);
	if (!(options instanceof Object))
		return false;
	if (options.cells && options.cells > 0 || options.cols && options.cols > 0)
		this.cells	= options.cells || options.cols;
	if (options.rows && options.rows > 0)
		this.rows	= options.rows;
	this.on_page 		= this.cells * this.rows;
}
tagoo_video_search_control.prototype.post_render = function(data) {
	if (this.has_errors()) return false;
	var t = this;
	this.data = data;
	this.pages_numbers();
	this.app = tagoo_helpers.create_div(null, 'tagoo_search');
	var s_bar = new tagoo_search_bar(this.lang, this.key, this.search_type, this.query, function(e){t.onsubmit(e);});
	var vl = new tagoo_video_list(this.lang, this.data.data, this.current_page, function(e, url){t.onclick_page(e, url);}, this.cells, this.rows);
	var p = new tagoo_paginator(this.pages, this.current_page, function(e, page){t.onclick(e, page);});
	this.app.appendChild(s_bar.render());
	this.app.appendChild(vl.render());
	this.app.appendChild(p.render());
	this.app.appendChild(this.add_to_my_site());
	this.root.appendChild(this.app);
	this.set_query();
	if (this.opts.onload && this.opts.onload_args)
	{
		var arr = this.opts.onload_args;
		arr.push(this);
		this.opts.onload.apply(this, arr);
	}
	else if (this.opts.onload)
		this.opts.onload.apply(this, [this]);
}
tagoo_video_search_control.prototype.search_factory = function() {
	return new tagoo_video_search();
}
tagoo_video_search_control.prototype.list_factory = function() {
	var t = this;
	return new tagoo_video_list(this.lang, this.data.data, this.current_page, function(e, url){t.onclick_page(e, url);}, this.cells, this.rows); 
}



function tagoo_search_bar(lang, key, search_type, query, onsubmit) {
	this.key			= key;
	this.search_type	= search_type;
	this.query			= query;
	this.onsubmit		= onsubmit;
	this.lang			= lang;
	this.logo_src		= 'http://tagoo.ru/images/plogo.png';
	this.home_url		= 'http://tagoo.ru/'+this.lang.current_lang+'/?stat=api';
	this.autocomplete	= false;
}
tagoo_search_bar.prototype.render = function() {
	this.top = tagoo_helpers.create_div(null, 'search_bar');
	
	this.form = tagoo_helpers.create_form();
	var t = this;
  	tagoo_helpers.add_event(this.form, 'submit', function(e){ t.onsubmit(e); });
  	
	var key_input = tagoo_helpers.create_input('for', 'hidden', this.search_type);
	var for_input = tagoo_helpers.create_input('key', 'hidden', this.key);
	this.form.appendChild(key_input);
	this.form.appendChild(for_input);
	
	var table = tagoo_helpers.create_table();
	table.setAttribute('cellpadding', '0');
	table.setAttribute('cellspacing', '0');
	var tr = tagoo_helpers.create_table_row(table);
	var cell1 = tagoo_helpers.create_table_cell(tr);
	var search_input = tagoo_helpers.create_input('search', 'text', this.query);
	if (this.autocomplete === false)
		search_input.setAttribute('autocomplete', 'off');
	cell1.appendChild(search_input);
	var cell2 = tagoo_helpers.create_table_cell(tr);
	cell2.setAttribute('width', '100');
	var search_button = tagoo_helpers.create_input('', 'submit', this.lang.strings['search'], 'submit_btn');
	cell2.appendChild(search_button);
	this.form.appendChild(table);
	this.top.appendChild(this.form);
	
	this.logo = tagoo_helpers.create_div(null, 'logo');
	var a = tagoo_helpers.create_link(this.home_url, '', '_blank')
	var span = tagoo_helpers.create_span(this.lang.strings['powered_by']+' ');
	a.appendChild(span);
	var img = tagoo_helpers.create_image(this.logo_src, 53, 18);
	img.setAttribute('alt', 'Tagoo.ru');
	a.appendChild(img);
	this.logo.appendChild(a);
	this.top.appendChild(this.logo);
	return this.top;
}

function tagoo_list(lang, data, page, onclick_page) {
	this.data 			= data;
	this.page 			= --page;
	this.lang 			= lang;
	this.onclick_page	= onclick_page;
}

function tagoo_audio_list(lang, data, page, on_page, onclick_page) {
	tagoo_list.call(this, lang, data, page, onclick_page);
	this.on_page = on_page;
}
tagoo_audio_list.prototype = new tagoo_list();
tagoo_audio_list.prototype.render = function() {
	this.body = tagoo_helpers.create_div(null, 'body');
	if (this.data.length)
	{
		var list_items = [], li, a, span, div, item, link_text, info_text, url, p = 0, t = this;
		for (var i=0; i<this.data.length; ++i)
		{
			item = this.data[i];
			if (item.length == undefined)
			{
				li = tagoo_helpers.create_list_item();
				span = tagoo_helpers.create_span((1 + p + this.page * this.on_page)+'. ', 'number');
				li.appendChild(span);
				link_text = '';
				if (item.artist.length && item.title.length)
					link_text = item.artist + ' - ' + item.title;
				else if (item.title.length)
					link_text = item.title;
				else
					link_text = item.file_name;
				link_text = unescape(tagoo_helpers.cut_string(link_text, 60));
				a = tagoo_helpers.create_link(item.file_url, link_text, '_blank', 'link');
				url = item.file_url;
				li.appendChild(a);
				info_text = ' ('+item.fileformat+', '+(item.bitrate/1000)+' Kbps, '+tagoo_helpers.mbytes(item.filesize)+' Mb, '+item.playtime+')'
				span = tagoo_helpers.create_span(info_text, 'fileinfo');
				li.appendChild(span);
				div = tagoo_helpers.create_div_link(item.page_url, tagoo_helpers.cut_string(unescape(item.page_url), 60), '_blank', 'page_url');
				url = item.page_url;
				tagoo_helpers.add_event(div.firstChild, 'click', function(e){ t.onclick_page(e, url); });
				li.appendChild(div);
				
				list_items[p] = li;
				++p; 
				if (p >= this.on_page)
					i = this.data.length;
			}
		}
		var ol = tagoo_helpers.create_ordered_list(list_items);
		this.body.appendChild(ol);
	}
	else
	{
		var div = tagoo_helpers.create_div(this.lang.strings['empty'], 'empty');
		this.body.appendChild(div);
	}
	return this.body;
}
function tagoo_video_list(lang, data, page, onclick_page, cells, rows) {
	tagoo_list.call(this, lang, data, page, onclick_page);
	this.cells = cells;
	this.rows = rows;
}
tagoo_video_list.prototype = new tagoo_list();
tagoo_video_list.prototype.render = function() {
	this.body = tagoo_helpers.create_div(null, 'body');
	if (this.data.length)
	{
		var item, a, tr, td, img, url, add, p = 0, t = this;
		var table = tagoo_helpers.create_table();
		for (var i=0; i<this.data.length; ++i)
		{
			item = this.data[i];
			if (item.length == undefined)
			{
				if (p % this.cells == 0)
					tr = tagoo_helpers.create_table_row(table);
				td = tagoo_helpers.create_table_cell(tr);
				url = item.file_url || item.page_url;
				a = tagoo_helpers.create_link(url, '', '_blank', 'link');
				tagoo_helpers.add_event(a, 'click', function(e){ t.onclick_page(e, url); });
				add = [];
				item.playtime && add.push(item.playtime);
				item.fileformat && add.push(item.fileformat);
				item.filesize && tagoo_helpers.mbytes(add.push(item.filesize));
				if (add.length)
					add = ' ('+add.join(', ')+')';
				else
					add = '';
				a.setAttribute('title', url+add);
				img = tagoo_helpers.create_image(item.thumb, 100, 75);
				a.appendChild(img)
				td.appendChild(a);
				++p; 
				if (p >= this.rows*this.cells)
					i = this.data.length;
			}
		}
		this.body.appendChild(table);
	}
	else
	{
		var div = tagoo_helpers.create_div(this.lang.strings['empty'], 'empty');
		this.body.appendChild(div);
	}
	return this.body;
}
tagoo_paginator = function(pages, current_page, onclick) {
	this.pages_count	= pages;
	this.current_page	= current_page;
	this.onclick		= onclick;
}
tagoo_paginator.prototype.render = function(){
	this.pages = tagoo_helpers.create_div(null, 'pages');
	var a, text;
	if (this.pages_count == 1)
	{
		this.pages.appendChild(document.createTextNode(' '));
		return this.pages;
	}
	for (var i=0; i<this.pages_count; ++i)
	{
		a = tagoo_helpers.create_link('#');
		if (i+1 == this.current_page)
		{
			text = i+1;
			tagoo_helpers.set_class(a, 'curr');
		} else 
			text = i+1;
		a.appendChild(document.createTextNode(text));
		if (this.onclick)
			(function(i, onclick) {
				tagoo_helpers.add_event(a, 'click', function(e){ onclick(e, i); });
			})(i+1, this.onclick);
		this.pages.appendChild(a);
		this.pages.appendChild(document.createTextNode(' '));
	}
	return this.pages;
}
