if(!Ustream) var Ustream = {};
if(!Ustream.Components) Ustream.Components = {};


Ustream.Components.LiveSearch = function() {

	this.options = {
		typeIntervalLatency: 160,
		truncateLength: 60
	};

	return this;
}

Ustream.Components.LiveSearch.prototype.toString = function(){ return "liveSearch.js - Predictive search for the featured channels in the header search field."; }

Ustream.Components.LiveSearch.prototype.init = function( options ) {
	this.options = $.extend(this.options, options);
	var that = this;

	$('form.search,form.search input[name=q]').attr('autocomplete','off');

	this.container = $('<div id="LiveSearch"></div>').appendTo('form.search');

	this.currentRequest = false;

	var cancelTimer = 0;
	var blurTimer = 0;
	var keyDownHandler = function(e){
		clearTimeout(cancelTimer);

		switch(e.keyCode){
			case 38:
			case 40:
			case 13:
				if(that.container.css('display') == 'block'){
					var nav = that.keyNavigate(e.keyCode);
					if(nav && e.keyCode == 13)$(e).stopEvent();
				}
			case 16:
			case 17:
			case 18:
			case 13:
			case 33:
			case 34:
			case 35:
			case 36:
			case 37:
			case 39:
			case 45:
			case 144:
			case 145:
			case 19:
				return;
				break;
		}

		cancelTimer = jQuery.later(that,that.options.typeIntervalLatency,'eventKeyDown');
	};

	var blurHandler = function(e){
		clearTimeout(blurTimer);
		blurTimer = jQuery.later(that,'300','eventBlur');
	};

	var focusHandler = function(){
		clearTimeout(blurTimer);
	};

	$('form.search input[name=q]')
		.keydown(keyDownHandler)
		.blur(blurHandler)
		.mouseover(focusHandler);

	this.container.mouseout(blurHandler);
	this.container.mouseover(focusHandler);

	$('form.search input[name=q]').focus(function(){
		focusHandler();
		if (this.value != '') {
			that.container.show();
			$('#chat').css('visibility','hidden');
		}
	});

	return this;
}

Ustream.Components.LiveSearch.prototype.keyNavigate = function( keyCode ){

	if (keyCode == 40) { // le
		if (this.container.find('li.active').length > 0) {
			this.container.find('li.active').removeClass('active').next().addClass('active');
		} else {
			this.container.find('li:first').addClass('active');
		}
	} else if (keyCode == 38) { // fel
		if (this.container.find('li.active').length > 0) {
			this.container.find('li.active').removeClass('active').prev().addClass('active');
		} else {
			this.container.find('li:last').addClass('active');
		}
	} else if (keyCode == 13 && this.container.find('li.active').length > 0) {// enter
		window.location.href = this.container.find('li.active a').attr('href');
	}

	return (this.container.find('li.active').length > 0)?true:false;
}


Ustream.Components.LiveSearch.prototype.eventBlur = function(){
	this.container.find('li.active').removeClass('active');
	this.container.hide();
	$('#chat').css('visibility','visible');
}


Ustream.Components.LiveSearch.prototype.eventKeyDown = function(){
	var that = this;

	if (this.currentRequest) {
		this.currentRequest.abort();
		$('form.search input[name=q]').removeClass('loading');
	}

	if ($('form.search input[name=q]').val() == '') {
		this.container.hide();
		$('#chat').css('visibility','visible');
		$('form.search input[name=q]').removeClass('loading');
		return;
		//this.currentRequest.abort();
	}

	var query = $('form.search input[name=q]').val();

	$('form.search input[name=q]').addClass('loading');

	this.currentRequest = $.ajax({
		type: "GET",
		url: ["/ajax/discovery/search/",query].join(''),
		dataType: "json",
		success: function(response){
			if (response.success) {
				that.eventResult(response, query);
				$('form.search input[name=q]').removeClass('loading');
			} else {

				response.records = [];

				that.eventResult(response, query);
				//that.container.hide();
				//$('#chat').css('visibility','visible');
				$('form.search input[name=q]').removeClass('loading');
			}
		},
		error: function(){
			that.container.hide();
			$('#chat').css('visibility','visible');
			$('form.search input[name=q]').removeClass('loading');
		}
	});
}


Ustream.Components.LiveSearch.prototype.eventResult = function( data,query ){
	var that = this;
	//adatok bepakolasa
	var truncateLength = this.options.truncateLength;
	var highlightSubstr = function( testedStr, searchStr){
		if ( testedStr.length > truncateLength ) {
			testedStr.substring(0, truncateLength);
			var t = testedStr.split((new RegExp(searchStr,"gi")));
			if( t.length > 1 ) {
				var t0 = '...' + t[0].substring(t[0].length - truncateLength/2, t[0].length);
				var t1 = t[1].substring(0, truncateLength/2) + '...';

			} else {
				t0 = '';
				t1 = t[0].substring(0, truncateLength) + '...';
			}
			testedStr = [t0,searchStr,t1].join('')
		}
		var result = testedStr.replace(new RegExp('(\\'+searchStr+')','gi'), '<strong>\$1</strong>')
		return result;
	}

	var output = $('<ul></ul>');
	var items = [];

	var dataLen = data.records.length;
	var records = data.records;

	while( dataLen-- ){ // reverse iteration, display items with unshift
		items.unshift(['<li class="result">','<a href="',records[dataLen].url,'">',
			'<img src="', records[dataLen].picture,'" alt="', records[dataLen].title,'" />',
			(records[dataLen].tagline)?'<span>':'',
			(records[dataLen].tagline)?highlightSubstr(records[dataLen].tagline,query)+'<br />':'',
			(records[dataLen].tagline)?'</span>':'',
			(!records[dataLen].tagline)?'<span>':'',
			(records[dataLen].title)?highlightSubstr(records[dataLen].title,query)+'<br />':'',
			(!records[dataLen].tagline)?'</span>':'',
			(records[dataLen].userName)?highlightSubstr(records[dataLen].userName,query):'',
			'</a>',
			'</li>'
		].join(''))
	}

	items.push('<li><a href="/discovery/live/all?q='+query+'"><em class="live"></em><span>Search Broadcasts</span></a></li>');
	items.push('<li><a href="/discovery/recorded/all?q='+query+'"><em class="recorded"></em><span>Search Recordings</span></a></li>');
	items.push('<li><a href="/discovery/event/all?q='+query+'"><em class="event"></em><span>Search Upcoming</span></a></li>');

	output.html(items.join(''));
	$(this.container).html('');
	$(this.container).append(output);

	this.container.find('li').mouseover( function(e){ $(this).siblings().removeClass('active').end().addClass('active') });
	this.container.find('li').mouseout( function(e){  $(this).removeClass('active') });

	this.container.find('li.active').removeClass('active');

	if (this.container.css('display') != 'block') {
		this.container.show();
		$('#chat').css('visibility','hidden');
	}

}

