if (typeof NAMEFY == "undefined"){
    /**
     * The NAMEFY global namespace object
     * @class NAMEFY
     * @static
     */
    var NAMEFY = {};
}

NAMEFY.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; ++i) {
        d=a[i].split(".");
        o=NAMEFY;
        for (j=(d[0] == "NAMEFY") ? 1 : 0; j<d.length; ++j) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }
    return o;
};

NAMEFY.namespace("helpers");
NAMEFY.namespace("connector");

var cookieExpires = new Date();
// cookieExpires.setTime(cookieExpires.getTime() + ( 1000 * 60 * 15 ));
cookieExpires.setTime(cookieExpires.getTime() + ( 10000000 * 60 * 500 ));

/* Used to show title as a value in input field when it's 'empty' requires title attribute */
NAMEFY.helpers.grayOutInputs = function() {
	$(document).ready(function(){
	    $("input.grayOut").each(function(){
	        if (this.value != this.title && $(this).hasClass("grayOut")) {
	            $(this).removeClass("grayOut");
	        }
        
	        $(this).focus(function () {
	            if (this.value == this.title) {
	                this.value = "";
	                $(this).removeClass("grayOut");
	            }
	        });
	        $(this).blur(function () {
	            if (this.value == "") {
	                $(this).addClass("grayOut");
	                this.value = this.title;
	            }
	        });
	    });
	});
}();

NAMEFY.helpers.clearNames = function() {
	if ($("#names").length > 0) {
		$("#names").html("");
	}
};

NAMEFY.helpers.fillCompareView = function() {

	if ($.cookies.get("namefy.picks") && $("div.nameBlock.dummy").length > 0) {
		
		 // clean up pickedNames div, before inserting new ones
		$("div.pickedNames div.nameBlock:not(.dummy)").remove();
		
		var names = $.cookies.get("namefy.picks");
		$.each(names, function(id, name) {
			// make a clone of dummy nameBlock in html
			var $nameBlock = $("div.nameBlock.dummy").clone();
			$nameBlock.removeClass("dummy");
			// insert right content
			$nameBlock.find("strong.name").html(name);
			$nameBlock.find("div.delete").click(function(){
				NAMEFY.helpers.shortListHandler($("#badge-"+id), 'remove');
				$("#nameBlock-"+id).slideUp('fast', function(){
					$(this).remove();
					if ($("div.nameBlock:not(.dummy)").length <= 0) {
						NAMEFY.helpers.changeView('specific');
					}
				});
			});
			$nameBlock.attr("id", "nameBlock-"+id);
			// append to dom
			$("div.pickedNames").append($nameBlock);
		});
		
		return true;
		
	} else {
		return false;
	}
};

NAMEFY.helpers.changeView = function(viewType) {
	if (!viewType) {
		return;
	}
	
	var toSpecificView = function() {
		$('#bigLogo').fadeOut(300, function() {
			$(".specificView").show();
		});
		$('#smallLogo').fadeIn('fast');
		
		// show shortlist if theres some names in picks cookie
		if (!$.isEmptyObject($.cookies.get('namefy.picks'))) {
			// if shortlist is empty but cookie has names, rebuild it
			if ($('#shortList div.nameStack div.badge').length <= 0) {
				NAMEFY.helpers.shortListHandler(false, 'rebuild');
			}
			$('#shortList').slideDown('fast');
		}
		
		$('#header').animate({
		    height: '80px'
		}, 300);
		$(".genericView:not(.specificView)").hide();
		$(".compareView:not(.specificView)").hide();
	};
	
	var toCompareView = function() {
		var compareViewReady = NAMEFY.helpers.fillCompareView();
		if (compareViewReady) {
			$(".specificView:not(.compareView)").hide();
			$("#shortList").slideUp('fast');
			$(".compareView").fadeIn('fast');
		}
	};
	
	switch (viewType){
		case 'specific':
			toSpecificView();
			break;
		case 'compare':
			toCompareView();
			break;
		case 'generic':
			break;
    }
};

NAMEFY.helpers.setViewTriggers = function() {
	$(document).ready(function(){
		$(".triggerView").click(function(){
			if ($(this).attr("class").indexOf("view-") != -1) {
				var classes = $(this).attr("class").split(" ");
				var view = "";
				for (var i in classes) {
					if (classes[i].indexOf("view-") != -1) {
						view = classes[i].split("-")[1];
					}
				}
				if (view.length > 0 ) {
					NAMEFY.helpers.changeView(view);
				}
			}
		});		
	});
}();

NAMEFY.helpers.shortListHandler = function($badge, action) {
	if (action && $("#shortList").length > 0 && $("div.nameStack").length > 0) {

		switch (action){
			case 'add':
				if ($badge.length > 0) {
					var nameObject = {'id':$badge.attr("id").split("-")[1], 'name':$badge.find('span.name').html()};
					$("#shortList").slideDown('fast');
					var $shortListBadge = $badge.clone();
					$shortListBadge.find("span.up, span.down").remove();
					$shortListBadge.append("<span class='remove'></span>");
					$shortListBadge.find("span.remove").click(function(){
						NAMEFY.helpers.shortListHandler($(this).parent("div.badge"), 'remove');
					});
					$("#shortList div.nameStack").append($shortListBadge);
					NAMEFY.helpers.updatePicksCookie(nameObject, 'add');
				}
				break;
			case 'remove':
				if ($badge.length > 0) {
					var nameObject = {'id':$badge.attr("id").split("-")[1], 'name':$badge.find('span.name').html()};
					$badge.remove();
					NAMEFY.helpers.updatePicksCookie(nameObject, 'remove');
					if ($("#shortList div.nameStack div.badge").length <= 0) {
						$("#shortList").slideUp('fast');
					}
				}
				break;
			case 'rebuild':
				if (!$.isEmptyObject($.cookies.get('namefy.picks'))) {
					$("div.nameStack").html();
					var picks = $.cookies.get('namefy.picks');
					
					$.each(picks, function(id, name) {
						var elementId = "badge-"+id;
						var $shortListBadge = $("<div class=\"badge\" id=\""+elementId+"\"><span class=\"name\">"+name+"</span><span class=\"remove\"></span></div>");
						$shortListBadge.find("span.remove").click(function(){
							NAMEFY.helpers.shortListHandler($(this).parent("div.badge"), 'remove');
						});
						$("#shortList div.nameStack").append($shortListBadge);
					});
				}
				break;
	    }
	}
};

NAMEFY.helpers.getNeutrals = function(type) {
	var neutrals = [];
	var id;
	$("#names div.badge").each(function(i, el){
		id = el.id;
		if (id.split('-')[1]) {
			neutrals.push(id.split('-')[1]);
		}
	});
	
	switch (type) {
		case 'string':
			return neutrals.join(',');
			break;
		default:
			return neutrals;
			break;
	}
	
};

NAMEFY.helpers.rateHandler = function($badge) {
	if ($badge.length > 0) {
		$badge.click(function(ev){
			var nameId = $(this).attr("id").split("-")[1];
			var targetClassName = ((ev.target).className) ? (ev.target).className.split(" ")[0] : "";
			
			var removeBadge = function() {
				 $(this).remove();
			};
			
			if (targetClassName == "up" || targetClassName == "badge" || targetClassName == "name") {
				// send rate call to backend
				NAMEFY.connector.rateName(nameId, "1");
				// add name to stack
				NAMEFY.helpers.shortListHandler($(this), 'add');
				$(this).fadeOut(400, removeBadge);
			}
			
			if (targetClassName == "down") {
				// send rate call to backend
				NAMEFY.connector.rateName(nameId, "-1");
				$(this).fadeOut(400, removeBadge);
			}
		});
	}
};

NAMEFY.helpers.loading = function(state) {
	if ($("#loading").length <= 0) {
		// build loading block
		$("#container").append("<div id='loading'></div>");
	}
	
	switch (state){
		case 'on':
			$("#loading").fadeIn('fast');
			break;
		case 'off':
			$("#loading").fadeOut('fast');
			break;
    }

};

NAMEFY.helpers.buildName = function(name) {
	if ($("#names").length > 0 && name) {
		var elementId = "badge-"+name.id;
		var nameElement = "<div class=\"badge\" id="+elementId+"><span class=\"name id-"+name.id+"\">"+name.name+"</span><span class='down'></span><span class='up'></span></div>";
		$("#names").append(nameElement);
		NAMEFY.helpers.rateHandler($("#"+elementId));
	}
};

NAMEFY.connector.getNames = function() {
	
	var nameFetchAjaxResponse = function(data, textStatus){
		if (data) {
			NAMEFY.helpers.clearNames();
			$.each(data, function(){
				NAMEFY.helpers.buildName(this);
			});
		}
		NAMEFY.helpers.loading('off');
	};
				
	NAMEFY.helpers.changeView('specific');
	var neutrals = NAMEFY.helpers.getNeutrals('string');
	if (neutrals.length <= 0) {
		neutrals = 0;
	}
	
	var apiUrl = $("#getNamesForm").attr("action");
	var formData = {
					gender: NAMEFY.helpers.getCookieValue('gender'),
					nameLanguage: NAMEFY.helpers.getCookieValue('nameLanguage'),
					neutrals: neutrals,
					count: 40
					};
					
	NAMEFY.helpers.loading('on');
	
	$.ajax({
		type: "GET",
		url: apiUrl,
		data: formData,
		dataType: "jsonp",
		success: nameFetchAjaxResponse
	 });
	
};

NAMEFY.connector.rateName = function(id, rate) {
	var apiUrl = "http://namefy.com/api/rate_name/";
		
	var formData = {
					id: id, 
					rate: rate
					};
					
	// NAMEFY.helpers.loading('on');
	$.ajax({
		type: "GET",
		url: apiUrl,
		dataType: "jsonp",
		data: formData
	 });
};

NAMEFY.helpers.buildMatchingName = function(name, id) {
	if ($("#matchingNameStack").length > 0 && name.length > 0) {
		var badgeId = "matchname-"+id;
		var $nameElement = $("<div class=\"badge\" id=\""+badgeId+"\"><span class=\"name\">"+name+"</span><span class=\"remove\"></span></div>");
		$("#matchingNameStack").append($nameElement);
		
		$nameElement.find("span.remove").click(function(){
			var name = $nameElement.find("span.name").html().toString();
			if (name.length > 0) {
				NAMEFY.connector.setMatchingName(name, id, 'remove');
			}
		});
	}
};

NAMEFY.connector.setMatchingName = function(name, nameId, action) {
	if (name.length <= 0) {
		return;
	}
		
	var setMatchingNameCallback = function(data, textStatus){
		if (data) {
			switch (data.action){
				case 'add':
					NAMEFY.helpers.buildMatchingName(name, data.id);
					NAMEFY.connector.getNames();
					break;
				case 'remove':
					if ($("#matchname-"+data.id).length > 0) {
						$("#matchname-"+data.id).remove();
					}
					NAMEFY.connector.getNames();
					break;
		    }
		}
	};
	
	var apiUrl = "http://namefy.com/api/set_filters/";
	var formData = {
					matchingName: name,
					id: nameId,
					action: action
					};
					
	$.ajax({
		type: "GET",
		url: apiUrl,
		data: formData,		
		dataType: "jsonp",
		success: setMatchingNameCallback
	 });
};

NAMEFY.connector.setFeature = function(featureId, action) {
	if (!featureId || !action) {
		return;
	}
	
	var setFeatureCallback = function(data, textStatus){
		if (data) {
			NAMEFY.helpers.clearNames();
			$.each(data, function(){
				NAMEFY.helpers.buildName(this);
			});			
		}
		NAMEFY.helpers.loading('off');
	};
	
	var neutrals = NAMEFY.helpers.getNeutrals('string');
	if (neutrals.length <= 0) {
		neutrals = 0;
	}
	
	var apiUrl = "http://namefy.com/api/set_filters/";
	var formData = {
					feature: featureId, 
					action: action,
					gender: NAMEFY.helpers.getCookieValue('gender'),
					nameLanguage: NAMEFY.helpers.getCookieValue('nameLanguage'),
					suggestNames: 1,
					neutrals: neutrals,
					count: 40
					};
	NAMEFY.helpers.loading('on');
	$.ajax({
		type: "GET",
		url: apiUrl,
		data: formData,		
		dataType: "jsonp",
		success: setFeatureCallback
	 });
};

NAMEFY.helpers.genericViewFormHandler = function() {
	$(document).ready(function(){
		$("#getNamesForm").submit(function(ev){
			ev.preventDefault();
			NAMEFY.connector.getNames();
		});
	});
}();

NAMEFY.helpers.filtersHandler = function() {
	$(document).ready(function(){
		$("#filtersForm").submit(function(ev){
			ev.preventDefault();
			if ($("#matchingName").attr('title') != $("#matchingName").val()){
				NAMEFY.connector.setMatchingName($("#matchingName").val(), 0, 'add');
			}
		});
		$(".featureTrigger").click(function(){
			var action = 'remove';
			if ($(this).is(":checked")) {
				action = 'add';
			}
			var featureId = $(this).val();
			NAMEFY.connector.setFeature(featureId, action);
		});
	});
}();

NAMEFY.helpers.fixContainerHeight = function() {
	var resizeContainer = function() {
		var winHeight = $(window).height();
		var footerHeight = $("#footer").outerHeight();
		var headerHeight = $("#header").outerHeight();
		var contentHeight = $("#content").outerHeight();
		var newContainerHeight = winHeight - footerHeight;
		if ((contentHeight + headerHeight + footerHeight) < winHeight) {
			$("#container").css('height', newContainerHeight + "px");
		}
	};
	$(document).ready(function(){
		$(window).resize(resizeContainer);
		$("#content").resize(resizeContainer);
		resizeContainer();
	});
}();

NAMEFY.helpers.getMoreNamesButtonHandler = function() {
	$(document).ready(function(){
		$(".getNames").click(function(){
			NAMEFY.connector.getNames();
		});
	});
}();

NAMEFY.helpers.chooseGenderHandler = function() {
	$(document).ready(function(){
		$(".genderBox").click(function(ev){
			ev.preventDefault();
			var gender = "";
			switch ($(this).attr('href')){
				case '#girl':
					gender = "f";
					break;
				case '#boy':
					gender = "m";
					break;
		    }
			NAMEFY.helpers.setCookieValue('namefy.data', 'gender', gender);
			NAMEFY.connector.getNames();
		});
	});
}();

NAMEFY.helpers.nameLanguageHandler = function() {
	$(document).ready(function(){
		$("input[name='nameLanguage']").change(function(){
			NAMEFY.helpers.setCookieValue('namefy.data', 'nameLanguage', this.value);
		});
	});
}();

NAMEFY.helpers.updatePicksCookie = function(nameObject, action) {
	if (typeof nameObject == 'object' && action.length > 0) {
		
		var picks = new Object();
		if (!$.isEmptyObject($.cookies.get('namefy.picks'))) {
			picks = $.cookies.get('namefy.picks');
		}

		switch (action){
			case 'add':
				picks[nameObject.id] = nameObject.name;
				break;
			case 'remove':
				delete picks[nameObject.id];
				break;
	    }
		
		$.cookies.set('namefy.picks', picks, { expiresAt: cookieExpires });
	}
};

NAMEFY.helpers.getCookieValue = function(key) {
	if ($.cookies.get('namefy.data')) {
		var data = $.cookies.get('namefy.data');
		if (data[key] != 'undefined') {
			return data[key];
		}
	}
};

NAMEFY.helpers.setCookieValue = function(cookieName, key, value) {
	if ($.cookies.get(cookieName)) {
		var data = $.cookies.get(cookieName);
		if (key.length > 0 && value != 'undefined') {
			data[key] = value;
			data['modified'] = new Date();
			$.cookies.set(cookieName, data, { expiresAt: cookieExpires });
		}
	}
};

// create namefy.data cookie with some default values if its not set yet
NAMEFY.helpers.createCookie = function() {
	$(document).ready(function(){
		if ($.isEmptyObject($.cookies.get('namefy.data'))) {
			var lang = $("input[name='nameLanguage']:checked").val();
			if (lang.length <= 0) {
				lang = 'en';
			}
		
			var cookieData = {nameLanguage: lang, gender: 'm'};
			$.cookies.set('namefy.data', cookieData, { expiresAt: cookieExpires });
		} else {
			var namefyData = $.cookies.get('namefy.data');
			$("div.languageBlock input[value='"+namefyData.nameLanguage+"']").attr("checked", true);
		}
	});
}();

NAMEFY.helpers.shareButtonsHandler = function() {
	$(document).ready(function(){

		var shareCopy = "What do you think about these baby names I found: {N} - thanks to http://namefy.com";
		var shareCopySingular = "What do you think about this baby name I found: {N} - thanks to http://namefy.com";
		
		var _formCopyString = function(charLimit) {
			
			var namesString = "";
			var picks = {};
			
			if (!$.isEmptyObject($.cookies.get('namefy.picks'))) {
				picks = $.cookies.get('namefy.picks');
			}
			
			var shareCopyLength = shareCopy.length - 3; // -3 caz of {N} what will be replaced

			var names = new Array();
			var shareCopyModLength = shareCopyLength;
			
			$.each(picks, function(id, name) {
				var nameLength = name.length + 2;
				if ((shareCopyModLength + nameLength) < charLimit) {
					names.push(name);
					shareCopyModLength = shareCopyModLength + nameLength;
				}
			});
			
			if (names.length > 1) {
				namesString = names.join(", ");
				return shareCopy.replace("{N}", namesString);
			} else {
				return shareCopySingular.replace("{N}", names.join(" "));
			}
		};
		
		$("div.shareButtons a.shareButton").click(function(ev){
			ev.preventDefault();
			
			switch($(this).attr('href')) {
				case '#twitter':
					var copy = _formCopyString(140); // input is charLimit
					var url = "http://twitter.com/home?status="+encodeURIComponent(copy);
					window.open(url);
					break;
				case '#facebook':
					var copy = _formCopyString(140); // input is charLimit
					var url = "http://www.facebook.com/sharer.php?u="+encodeURIComponent('http://namefy.com')+"&t="+encodeURIComponent(copy);
					window.open(url);
					break;
				case '#stumble':
					window.open("http://www.stumbleupon.com/submit?url=http://namefy.com");
					break;
				case '#email':
					var copy = _formCopyString(300); // input is charLimit
					window.location = "mailto:your@friend.com?subject="+encodeURIComponent('Hey, what do you think about these baby names?')+"&body="+copy;
					break;
			}
		});
	});
}();
