Array.prototype.binarySearch = function binarySearch(find, comparator) {
  var low = 0, high = this.length - 1,
      i, comparison;
  while (low <= high) {
    i = parseInt((low + high) / 2, 10);
    comparison = comparator(this[i], find);
    if (comparison < 0) { low = i + 1; continue; };
    if (comparison > 0) { high = i - 1; continue; };
    return i;
  }
  return null;
};

var blogulu = function() {

	var KEY_UP = 38;
	var KEY_DOWN = 40;

	var blogs = new Array();
	var focused = 0;
	var offset = 3;
	var blogNameTimer = null;
	
	
	var activeWheel = false;
	
	var newBlog = {
			name: '',
			avatar: theme_dir+'/images/blog_available.png',
			url: '#new-blog',
			premium: false,
			mature: false,
			active: true
	};
	
	var filters = {
		mature: false,
		inactive: false,
		premium: true
	}	
	
	/* Lookups fot the topmost blog with the name starting with term */
	function partialLookup(term) {
		function comparator(blog, term) {
			var subBlogName = blog.name.substr(0,term.length).toLowerCase();
			term = term.toLowerCase();
			if (subBlogName == term) return 0;
			else if (subBlogName < term) return -1;
			else return 1;
		}
		if ($.trim(term) == '') return null;
		id = blogs.binarySearch(term,comparator); 
		if (id == null) return null;
		if (id > 0) {
			while (id > 0 && blogs[id - 1].name.toLowerCase().substr(0,term.length) == term) id--;
		}
		return id;
	}
	
	
	function previousBlog(id, n) {
		var cursor;
		n = (n == null ? 1 : n);

		id = Number(id); n = Number(n);
		var on = n;
		cursor = id - 1;
		while (n > 0) {
			if (cursor < 0) {
				cursor = blogs.length + cursor;
			}
			if (checkFilter(cursor)) n--;
			cursor--;			
		}
		cursor++;
		
		//console.log('previous('+String(id)+','+String(on)+') '+String(cursor));
		return Number(cursor);		
	}

	function nextBlog(id, n) {
		var cursor;
		n = (n == null ? 1 : n);

		id = Number(id); n = Number(n);
		var on = n;
		cursor = id + 1;
		while (n > 0) {
			if (cursor >= blogs.length) {
				cursor = cursor - blogs.length;
			} 						
			if (checkFilter(cursor)) n--;
			cursor++;			
		}
		cursor--;
		
		//console.log('next('+String(id)+','+String(on)+') '+String(cursor));
		return Number(cursor);
	}
	
	function checkFilter(id) {
		if (!filters.mature && blogs[id].mature) {
			return false;
		}
		
		if (!filters.inactive && !blogs[id].active) {
			return false;
		}
		
		if (!filters.premium && blogs[id].premium) {
			return false;
		}		
		return true;
	}
	
	function validateBlogname( blogname ) {
		return $.trim(blogName).match(/^[a-zA-Z0-9][a-zA-Z0-9_-]{2,}$/);
	}
	
	function focus(id,create) {
		create = (typeof create == 'undefined' ? create = false : create);
		if (id < 0) {
			id = blogs.length + id;
		}
		if (id >= blogs.length) {
			id = id - blogs.length;
		}
		$('#search')
			.find('.result .icon').attr('src',blogs[id].avatar).end()
			.find('.result input').val(blogs[id].name).end()
			.find('.action').attr('href',blogs[id].url).end()
			.find('#searchform').attr('action',blogs[id].url);
			
		var cursorUp = $('#search').prev();
		var cursorDown = $('#search').next();
		for (var i = 1 ; i <= offset; i++) {
			cursor = previousBlog(id,i);		
			cursorUp = cursorUp
				.find('.icon').attr('src',blogs[cursor].avatar).end()
				.find('.name').text(blogs[cursor].name).end()
				.find('.link').attr('href',blogs[cursor].url).end()				
				.prev();
			
			cursor = nextBlog(id,i);			
			cursorDown = cursorDown
				.find('.icon').attr('src',blogs[cursor].avatar).end()
				.find('.name').text(blogs[cursor].name).end()
				.find('.link').attr('href',blogs[cursor].url).end()				
				.next();
		}
		
		blogName = blogs[id].name;
		focused = id;
	
		if (create) {		
			$('#search')
				.addClass('new')
				.find('.action').text('Îl Vreau!');
			$('body').addClass('new-blog');
			if (validateBlogname(blogName)) {
				$('#search .action').removeClass('disabled');
				$('body').removeClass('new-blog-invalid');
			} else {
				$('#search .action').addClass('disabled');
				$('body').addClass('new-blog-invalid');
			}
			blogs.splice(id,1);
		} else {
			$('body').removeClass('new-blog');
			$('#search .action').removeClass('disabled');
			$('#search')
				.removeClass('new')
				.find('.action').text('Vizitează');
		}
	}
	
	function hKeyDown(event) {
		if (event.keyCode == KEY_UP && activeWheel) {
			focus(previousBlog(focused,1));
			return false;
		}
		if (event.keyCode == KEY_DOWN && activeWheel) {
			if ($('body').hasClass('new-blog')) focused--;
			focus(nextBlog(focused,1));
			return false;
		}
		return true;
	}	

	function hKeyUp(event) {
		if (activeWheel) {
			var content = $('#search .result input').val();
			if (blogName != content || $.trim(content)=='') {
				if (blogNameTimer != null) clearTimeout(blogNameTimer);
				blogNameTimer = setTimeout("$(window).triggerHandler('blogNameChange','"+escape(content)+"');",500);
			}
		}
		return true;
	}

	function hBlogNameChange(event,content) {
		content = unescape(content);
		if (content == $('#search .result input').val()) {
			content = $.trim(content);
			id = partialLookup(content);
			if (id != null && blogs[id].name.toLowerCase() == content.toLowerCase()) {
				focus(id);
			} else {
				newBlog.name = content;
				if (id != null) {
					if (content.toLowerCase() < blogs[id].name.toLowerCase()) blogs.splice(id,0,newBlog);
					else blogs.splice(++id,0,newBlog);
				} else {
					id = 0;
					if (content.toLowerCase() < blogs[blogs.length - 1].name.toLowerCase()) {
						if (content > blogs[0].name) {
							for (var i in blogs) {
								if (i > 0 && blogs[i-1].name.toLowerCase() < content.toLowerCase() && content.toLowerCase() < blogs[i].name.toLowerCase()) {
									id = i;
									break;
								}
							}
						}
						blogs.splice(id,0,newBlog);
					} else {
						id = blogs.length;
						blogs.splice(id,0,newBlog);
					}					
				}
				focus(id,true);
			}
		}
		return true;
	}

	function hCreateBlog(event) {
		$('#search').addClass('new');
		$('body').addClass('new-blog').removeClass('new-blog-invalid');	
		signupForm();
		return false;	
	}

	function hContentLoaded() {
		$(window).bind('blogNameChange',hBlogNameChange);
		$(document).bind('keyup',hKeyUp);
		$(document).bind('keydown',hKeyDown);
		$('#search input')
			.focus(function(){$('#search .marker').fadeIn('slow'); $('#wheel-help').fadeIn('slow'); activeWheel = true; })
			.blur(function(){$('#search .marker').fadeOut('slow'); $('#wheel-help').fadeOut('slow'); activeWheel = false;});
		
		$('#wheel .blog').remove();
		$('#wheel .loading-notice').remove();
		$('#wheel').show();
		$('#wheel li.item').fadeIn('slow');
		$('#teaser').fadeIn('slow');
		$('#new-blog').click(hCreateBlog);
		setTimeout("$('#body  #noutati').fadeIn('def')",300);
		setTimeout("$('#body  #recomandari').fadeIn('def')",600);
		setTimeout("$('#body  #blogroll').fadeIn('def')",900);
		setTimeout("$('#campagna').fadeIn('def',campagna.start)",1200);
		setTimeout("$('#offer').fadeIn('def')",1500);
		$('body').addClass('loaded');
		blogs.splice(0,0,newBlog);
		focus(0,true);
		
	}
	
	function signupForm() {
		$('#search .action').hide();
		$('#signup').hide();
		$('#signup .input').show();
		$('#signup .action').show();
		$('#signup .done').hide();
		$('#signup .message .content').hide();
		$('#wheel-help').fadeOut('fast');
		$('#wheel').animate(
			{marginLeft: '-480px'},
			{
				complete: function(){
					$('#signup').fadeIn('def', function(){
						$('#registrationName').val($('#blogname').val());
						$('#registrationEmail').val('');
						$('#registrationQuiz').val('');
					});
				}
			}
		);
	}
	
	function hSearchFormSubmit() {
		if ($('#searchform').attr('action') == '#new-blog') {
			if (validateBlogname($('#blogname').val()))
				signupForm();
		} else {
			window.location.href = $('#searchform').attr('action'); 
		}
		return false;
	}
	
	function hUpdateFilters(event, newFilters) {
		filters = newFilters;
		hBlogNameChange(null, escape($('#search .result input').val()));
		return false;
	}
	
	$(function(){
		$('#wheel .blog').each(function(){
			blogs.push({
				name: $('.name',this).text(),
				avatar: $('.icon',this).attr('href'),
				url: $('.link',this).attr('href'),
				active: !$(this).hasClass('inactive'),
				mature: $(this).hasClass('mature'),
				premium: $(this).hasClass('premium')
			});
		});
		$(window).bind('load',hContentLoaded);
		$(window).bind('updateFilters',hUpdateFilters);
		$('#search .action').click(hSearchFormSubmit);
		
		$('#wheel .item:nth(0)').css('opacity',0.5);
		$('#wheel .item:nth(6)').css('opacity',0.5);

		$('#wheel .item:nth(1)').css('opacity',0.75);
		$('#wheel .item:nth(5)').css('opacity',0.75);

		//$('#wheel .item:nth(2)').css('opacity',0.9);
		//$('#wheel .item:nth(4)').css('opacity',0.9);


		
		$('#searchform').bind('submit',hSearchFormSubmit);
	});

	return {
		
	};
}();


var campagna = function() {
	
	var popedUp = false;
	var badges = 0;
	var el = null; /* currently overlayed element */
	var currentCampaignDescription = '';
	var popupOwner = '';

	function popup(text) {
		if (popedUp) {
			$('#campagna_popup .wrap .text').hide().html('').append(text).fadeIn('def');
		} else {
			$('#campagna_popup').find('.wrap .text').html('').append(text).end().fadeIn('def',function(){ popedUp = true; });
		}	
	}
	
	function close() {
		$('#campagna_popup').fadeOut('def',function(){ popedUp = false; });
	}
	
	function hBadgeChanged(elements) {
		el = elements[Math.floor(badges / 2 + 1) - 1];
		$(el).fadeTo('def',1);
		var url = $('.wrap > a',el).attr('href');		
		for (var id in campaigns) {
			var campaign = campaigns[id];
			if (campaign.url == url) {
				currentCampaignDescription = campaign.description;
				break;
			}
		}
		
		if (popedUp) {
			popup(currentCampaignDescription);
			popupOwner = 'info';
		}		
	}
	
	function slideSetup() {
		if (el) $(el).fadeTo('def',0.3);
	}
	
	function start() {
		for (var id in campaigns) if (typeof campaigns[id] == 'object') {
			var campaign = campaigns[id];
			$('#campagna .list').append(
			'<li class="campaign grid_2">' +
			'	<div class="wrap">'+
			'		<a href="'+campaign.url+'">'+campaign.resource+'</a>'+
			'	</div>'+
			'</li>');			
		}
		
		badges = ($("#campagna .campaign").size() < 5 ? $("#campagna .campaign").size() : 5);
		$("#campagna .container_12").jCarouselLite({
	        btnNext: "#campagna_overlay .next",
	        btnPrev: "#campagna_overlay .prev",
			visible: badges,
			afterEnd: hBadgeChanged,
			beforeStart: slideSetup
	    });
		if (badges % 2 == 0) {
			$("#campagna .container_12").css('left','80px');
		}
		$('#campagna_overlay .next').click();
	}
	
	$(function(){
		$('#campagna_overlay .handler a').click(function(){
			if (popedUp && popupOwner=='header') {
				close();
			} else {
				popup(
					'<p>Echipa <a href="#">blogu.lu</a> îţi aduce mai aproape evenimentele cu ştaif! De acum sunt şi evenimente pe care poţi alege să le susţii şi să le promovezi pe blogu\' tău. Mişcarea e simplă:</p>'+
					'<p>Activezi una sau mai multe campanii propuse.</p>'+
					'<p>Alegi unde în sidebar vrei să apară insigna evenimentului. (apare doar badge-ul fără descriere)</p>'+
					'<p>Susţine-ţi artiştii preferaţi!<br />'+
					'Promoveză-ţi hobby-urile!<br />'+
					'Fii aghiotant de propagandă cu Campaña lateral de la blogu.lu!</p>'
				);				
				popupOwner = 'header';
			}
		});
		
		$('#campagna_overlay .footer .info').click(function(){
			if (popedUp && popupOwner=='info') {
				close();
			} else {				
				popup(currentCampaignDescription);
				popupOwner = 'info';
			}
		});
	});
	
	return {
		start: start
	};
}();

var footer = function() {		
	$(function(){
		$('#footer .termsLink').click(function(event){
			var href = $(event.currentTarget).attr('href');
			$('#terms_popup').css('left',$(event.currentTarget).offset().left - 125);
			if (href=="/termeni-si-conditii-de-utilizare") {
				$('#terms_popup .title').html('Termeni şi condiţii de utilizare');
			}
			if (href== "/politica-de-confidentialitate") {
				$('#terms_popup .title').html('Politica de confidenţialitate');
			}			
			$('#terms_popup .content').empty();
			$.get(href,{},function(data){
				$('#terms_popup .content').html($('.hentry',data).html());	
			});
			
			$('#overlay').fadeIn('def');
			$('#terms_popup').fadeIn('def',function(){
				setTimeout("$(window).trigger('termsVisible')",1000);
			});
			
			return false;
		});
		
		$('#terms_popup .close').click(function(event){
			$('#overlay').fadeOut('def');
			$('#terms_popup').fadeOut('def',function(){
				setTimeout("$(window).trigger('termsHidden')",1000);
			});
			return false;			
		});
		
		$('#overlay').css({
			'position': 'absolute',
			'top': '0',
			'left': '0',
			'width': '100%',
			'height': '100%',
			'z-index': '800',
			'overflow': 'hidden',
			'background': '#1c4a57',
			'opacity': '0.5'
		}).hide();

		function unselectable(selector) {
			return $(selector).addClass('unselectable').attr('unselectable','on');
		}
	
		function selectable(selector) {
			return $(selector).removeClass('unselectable').removeAttr('unselectable');
		}
				
	});
}();

var registration = function() {
	
	var lockdown = false;
	
	function hRegistrationResponse(data) {
		var r = eval(data.match(/while\(1\);\/\*JSON\:ENVELOPE\*\/(.*)\/\*JSON\:ENVELOPE\*\//)[1])[0];
		if (r.error) {
			$('#signup .message .content')
				.hide()
				.addClass('error')
				.html(r.error_msg)
				.fadeIn('normal');
			$('#registration_nonce').val(r.nonce);
			$('#quizQuestion').text(r.t1 + ' + ' + r.t2 + '=');
		} else {
			var email = $('#registrationEmail').val();
			var success = 'Felicitări! Tocmai ai creat un nou blog. Verifică-ţi căsuţa de email pentru a-l activa.'; 

			if (email.match(/@gmail\.com$/)) {
				success = 'Felicitări! Tocmai ai creat un nou blog. <a href="http://gmail.com" target="_blank">Verifică-ţi căsuţa de email</a> pentru a-l activa.'
			}

			if (email.match(/@yahoo\.com$/)) {
				success = 'Felicitări! Tocmai ai creat un nou blog. <a href="http://mail.yahoo.com" target="_blank">Verifică-ţi căsuţa de email</a> pentru a-l activa.'
			}			

			if (email.match(/@yahoo\.co\.uk$/)) {
				success = 'Felicitări! Tocmai ai creat un nou blog. <a href="http://mail.yahoo.co.uk" target="_blank">Verifică-ţi căsuţa de email</a> pentru a-l activa.'
			}		
			
			$('#signup .input').hide();
			$('#signup .action').hide();
			$('#signup .done').fadeIn('normal');
			$('#signup .message .content')
				.hide()
				.removeClass('error')
				.html(success)
				.css({marginTop: 64})
				.fadeIn('normal');
		}
		$('#signup .message .content_loading').fadeOut('fast');
		lockdown = false;
	}
	
	function hRegistrationFormReset() {
		$('#signup').fadeOut('def',function(){
			$('#wheel').animate({marginLeft: 0},{
				complete: function() {
					$('#search .action').show();
					$('#blogname').val('');
					$(window).triggerHandler('blogNameChange',escape(''));
				}
			});
		});
	}
	
	function ajaxify(event) {
		if (lockdown) return false;
		lockdown = true;
		$('#signup .message .content_loading').hide().html('Se creaza un blog nou...').fadeIn('fast');
		$.post(signup_url,{
			name: $('#registrationName').val(),
			email: $('#registrationEmail').val(),
			mature: ( $('#matureContent:checked').length ? 'yes' : 'no' ),
			quiz: $('#registrationQuiz').val(),
			registration_nonce: $('#registration_nonce').val(),
			signup_form_id: $('#signup_form_id').val(),
			'_signup_form': $('#_signup_form').val()
		},hRegistrationResponse);
		return false;
	}
	
	$(function(){
		$('#signup form').submit(ajaxify);
 		$.post(signup_url,{},function(data){
			var r = eval(data.match(/while\(1\);\/\*JSON\:ENVELOPE\*\/(.*)\/\*JSON\:ENVELOPE\*\//)[1])[0];
			$('#registration_nonce').val(r.nonce);
			$('#quizQuestion').text(r.t1 + ' + ' + r.t2 + ' =');			
		});
		$('#signup input[type=reset]').click(hRegistrationFormReset);
		$('#signup .done').click(hRegistrationFormReset);
	});
}();

var topbar = function() {
	$(function(){
		$('#loginform .input input')
			.focus(function(){
				$('#loginform label[for='+$(this).attr('id')+']').fadeOut('fast'); 
			})
			.blur(function(){
				if ($(this).val() == '')
					$('#loginform label[for='+$(this).attr('id')+']').fadeIn('fast'); 
			})
			.each(function(){
				if ($(this).val() != '')
					$('#loginform label[for='+$(this).attr('id')+']').hide();
			});
		$('#topbar .filter').change(function(){
			var filters = {};
			 $('#topbar .filter').each(function(){
			 	filters[$(this).attr('id').replace('filter_','')] = $(this).attr('checked');
			 });
			 $(window).trigger('updateFilters',filters);
		});			
	});
	
	return {
		
	}
}();



