if(typeof(X2O.X2ORequest) == 'undefined')
{
	throw('Cannot use this file unless you have included /JS/Base.js');
}
if(typeof(X2O.Email) == 'undefined')
{
	throw('Cannot use this file unless you have included /JS/Utils/Email.js');
}
if(typeof(X2O.GetAllRecipesByStyleAndMinimumServingSizeVO) == 'undefined')
{
	throw('Cannot use this file unless you have included /JS/Utils/CustomGetAllRecipesByStyleAndMinimumServingSize.js');
}
if(typeof(X2O.IngredientVO) == 'undefined')
{
	throw('Cannot use this file unless you have included /JS/Utils/IngredientVO.js');
}
if(typeof(X2O.RecipeIngredientVO) == 'undefined')
{
	throw('Cannot use this file unless you have included/JS/Utils/RecipeIngredientVO.js');
}
if(typeof(X2O.RecipeVO) == 'undefined')
{
	throw('Cannot use this file unless you have included /JS/Utils/RecipeVO.js');
}
if(typeof(X2O.StyleVO) == 'undefined')
{
	throw('Cannot use this file unless you have included /JS/Utils/StyleVO.js');
}


function showError(message)
{
	var error_div = document.getElementById('error_message');
	if(error_div)
	{
	    if(error_div.style.display)
	    	error_div.style.display = '';
	    else
	        error_div.style.visibility = 'hidden';
	        
		error_div.innerHTML = 'An error occurred. Sorry about that. <br/>' + message;
	}
}
function hideError()
{
	var em = document.getElementById('error_message');
	if(em)
	{
	    if(em.style.display)
	    {
	    	em.style.display = 'none';
	    }
	    else
	    {
	        em.style.visibility = 'visible';
	    }
	}
}

var current_style_id = X2O.StyleTypes.FRENCH;
var current_style_name = "french";
var current_recipe = null;
var all_styles = null;
var dimmed_screen = document.createElement('div');
var span = document.createElement('span');
var body = null;
		
function s(id, content)
{
	try{
		var obj = document.getElementById(id);
		if(obj)
		{
			obj.innerHTML = content;
		}
		else throw('Cannot get object by id ' + id + '.');
	}
	catch(error)
	{
		throw('Cannot set inner html of element by id  because ' + error);
	}	
}

function setupDimmingElements()
{
	/* set up dimming elements*/
		body = document.getElementById('body');
		if(typeof(dimmed_screen.id) == 'object')
			dimmed_screen.id = 'greyed_out';
		else
			dimmed_screen.setAttribute('id', 'greyed_out');
		
        //span.className = 'centered_bright inline';

		
		
		span.innerHTML = "Loading...";
		dimmed_screen.appendChild(span);
}

function startUp()
{
	try{
		setupDimmingElements();
		toggleGreyOut();
		var myManager = new X2O.X2OManager(); 
		myManager.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, initialize);
		myManager.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
		myManager.login();
	}
	catch(e)
	{
		showError(e);
	}
}
function toggleGreyOut()
{
	var element = document.getElementById('greyed_out');
	if(element)
	{
		body.removeChild(dimmed_screen);
	}
	else
	{
		body.appendChild(dimmed_screen);
	}
}
function showGreyout()
{
	var element = document.getElementById('greyed_out');
	if(!element)
	{
		body.appendChild(dimmed_screen);
	}
}

function hideGreyOut()
{
	var element = document.getElementById('greyed_out');
	if(element)
	{
		body.removeChild(dimmed_screen);
	}
}


function onGeneralFault(obj, message)
{
	hideGreyOut();
	showError(message);
}

function initialize(obj)
{	
	loadAllStyles();
	loadAllForStyle(current_style_id);
}

function loadAllStyles()
{
	all_styles = new X2O.StyleCollectionVO();
	all_styles.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, doneLoadingAllStyles);
	all_styles.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
	all_styles.loadAll();
}

function doneLoadingAllStyles(obj)
{
	all_styles = obj;
	var styles_nav = document.getElementById('styles_nav');
	var items = all_styles.getVOs();
	var i = 0;
	if(all_styles.getCount() > i)
	{
		
		var current_item = items[i];
		if(current_item.getID() == current_style_id)
		{
			current_style_name = current_item.getKeyName();
			updateStyleName(current_style_name);
		}
		while(current_item != null)
		{
			var new_list_element = document.createElement('li');
			var new_link = document.createElement('a');
			if(typeof(new_link.href) == 'object')
				new_link.href = "#";
			else
				new_link.setAttribute("href", "#");
			
			new_link.style_id = current_item.getID();
				
			if(new_link.addEventListener)
			{
				new_link.addEventListener('click',setCurrentStyleEventHandler,false);
			}
			else if(new_link.attachEvent)
			{
				new_link.attachEvent('onclick', setCurrentStyleEventHandler);
			}
			else
			{
				throw('Cannot attach the click event to a link. Please use a more recent browser.');
			}
			
			
			new_link.innerHTML = current_item.getKeyName();
			new_list_element.appendChild(new_link);
			styles_nav.appendChild(new_list_element);
			i++;
			current_item = items[i];
		}
	}
}



function setCurrentStyleEventHandler(evt)
{
	var style_id;
	var ie_var = "srcElement";
	var moz_var = "target";

	evt[moz_var] ? style_id = evt[moz_var]["style_id"] :style_id = evt[ie_var]["style_id"];
	setCurrentStyle(style_id);
	return false;
}

function setCurrentStyle(id)
{
	
	toggleGreyOut();
	hideError();
	var recipes_list = document.getElementById('recipes_list');
	if(!recipes_list)
	{
		showError('Cannot get recipes list element.');
		return;
	}
	recipes_list.innerHTML = '';
	
	var ingredients_list = document.getElementById('current_recipe_ingredients_list');
	if(!ingredients_list)
	{
		showError('Cannot get ingredients list element.');
		return;
	}
	ingredients_list.innerHTML = '';
	
	current_style_id = id;
	var style = new X2O.StyleVO();
	style.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, doneLoadingStyle);
	style.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
	style.loadByID(id);
}

function doneLoadingStyle(obj)
{
	current_style_name = obj.getKeyName();
	updateStyleName(current_style_name);
	loadAllForStyle(obj.getID());
	
}

function updateStyleName(current_style_name)
{
	s('current_style_name', current_style_name.toLowerCase());
}

function loadAllForStyle(current_style_id)
{
	//after we log in, load the first recipe in the first style
	current_recipes = new X2O.RecipeCollectionVO();
	current_recipes.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, doneLoadingRecipe);
	current_recipes.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
	current_recipes.loadAllByRelatedStyleItemID(current_style_id, 0, 1, true);
	
	all_recipes = new X2O.RecipeCollectionVO();
	all_recipes.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, doneLoadingAllRecipesForStyle);
	all_recipes.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
	all_recipes.loadAllByRelatedStyleItemID(current_style_id, -1, -1, false);
}
function loadRecipeByID(id)
{
	toggleGreyOut();
	
	current_recipe = new X2O.RecipeVO();
	current_recipe.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, doneLoadingRecipe);
	current_recipe.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
	current_recipe.loadByID(id, true);
	
}

function doneLoadingAllRecipesForStyle(obj)
{
	try
	{
		if(obj != null && obj.getCount() > 0)
		{
			hideError();
			var items = obj.getVOs();
			var recipes_list = document.getElementById('recipes_list');
			if(!recipes_list)
			{
				throw('Cannot get recipes list element.');
			}
			
			for(var i = 0; i < items.length; i++)
			{
				var current_item = items[i];
				var new_list_element = document.createElement('li');
				var new_link = document.createElement('a');
				if(typeof(new_link.href) == 'object')
					new_link.href = '#';
				else
					new_link.setAttribute("href", "#");
				
				new_link.recipe_id = current_item.getID();
				
				if(new_link.addEventListener)
				{
					new_link.addEventListener('click', setCurrentRecipeEventHandler,false);
				
				}
				else if(new_link.attachEvent)
				{
					new_link.attachEvent('onclick', setCurrentRecipeEventHandler);
				}
				else
				{
					throw('Cannot attach the click event to a link. Please use a more recent browser.');
				}
				
				new_link.innerHTML = current_item.getName();
				new_list_element.appendChild (new_link);
				recipes_list.appendChild(new_list_element);
			}
		}
		else
		{
			var recipes_list = document.getElementById('recipes_list');
			recipes_list.innerHTML = '';
		}
	}
	catch(e)
	{
		showError(e);
	}
	finally
	{
		
		toggleGreyOut();
	}
}


function setCurrentRecipeEventHandler(evt)
{
	var recipe_id;
	var ie_var = "srcElement";
	var moz_var = "target";

	evt[moz_var] ? recipe_id = evt[moz_var]["recipe_id"] :recipe_id= evt[ie_var]["recipe_id"];
	loadRecipeByID(recipe_id);
	return false;
}

function doneLoadingRecipe(obj)
{
	var toggle_grey_out = false;
	try
	{
		
		if(obj != null)
		{
			hideError();
			if(typeof(obj.getCount) == 'function')
			{
				current_recipe = obj.getItemAt(0);
			}
			else
			{
				toggle_grey_out = true;
				current_recipe = obj;
			}
			
			s('current_recipe_name', current_recipe.getName());
			s('current_instructions', current_recipe.getInstructions());
			var i = 0;
			var ingredients_list = document.getElementById('current_recipe_ingredients_list');
			if(!ingredients_list)
			{
				throw('Cannot find ingredients list element.');
			}
			if(!current_recipe.RelatedRecipeIngredientsCollection)
			{
				ingredients_list.innerHTML = '';
			}
			else
			{
				
				ingredients_list.innerHTML = '';
				var ingredients = current_recipe.RelatedRecipeIngredientsCollection.getVOs() || null;
				
				if(ingredients.length > i)
				{
					
					var current_item = ingredients[i];
					
					while(current_item != null)
					{
						var new_list_element = document.createElement('li');
						new_list_element.innerHTML = current_item.getAmount() + ' ' + current_item.RelatedIngredientItem.getName();
						ingredients_list.appendChild(new_list_element);
						i++;
						current_item = ingredients[i];
					}
				}
			}
			s('serving_size_info', current_recipe.getServingSize());
			var recipe_image = document.getElementById('current_recipe_image');
			if(!recipe_image)
			{
				throw ('Cannot get recipe image element.');
			}
			recipe_image.src = X2O.X2OManager.assetsURL + current_recipe.getPicture();
		}
		else throw('There aren\'t any recipes for this style yet, sorry!');
	}
	catch(e)
	{
		showError(e);
	}
	finally
{	
		if(toggle_grey_out)
		{
			toggleGreyOut();
		}
	}
}

function showEmailMessage(m,className)
{
	var em = document.getElementById('email_message');
	if(!em)
	{
		showError('Cannot get e-mail message element.');
		return;
	}
	
	em.className = className;
	em.innerHTML = m;
	em.style.display = '';
}

function hideEmailMessage()
{	
	var em = document.getElementById('email_message');
	if(!em)
	{
		showError('Cannot get e-mail message element.');
		return;
	}
	
	em.innerHTML = '';
	em.style.display = '';
}

function sendRecipeToAFriend()
{
	try
	{
		var persons_name = document.getElementById('friends_name');
		var persons_email = document.getElementById('friends_email');
		if(!persons_name || !persons_email)
		{
			showError('Cannot get name or email element.');
			return;
		}
		if(persons_email.value == '')
		{
			throw('Email address is a required field.');
			
		}
		else
		{
			hideEmailMessage();
		}
		var my_email = new X2O.Email();
		my_email.setFromAddress('info@wearemammoth.com');
		my_email.setFromName('Recipe Bar');
		my_email.setSendToAddress(persons_email.value)
		if(persons_name.value)
		{
			my_email.setSendToName(persons_name.value);
		}
		
		my_email.setSubject('Recipe for ' + current_recipe.getName());
		my_email.setBody(current_recipe.getInstructions());
		my_email.setIsHTMLMessage(true);
		my_email.addEventListener(X2O.X2OEvent.LOAD_COMPLETE, afterEmail);
		my_email.addEventListener(X2O.X2OEvent.FAULT_EVENT, onGeneralFault);
		my_email.sendEmail();
	}
	catch(e)
	{
		showEmailMessage(e, 'important');
	}
}

function afterEmail(obj)
{
	showEmailMessage('Email successfully sent!', 'success');
	setTimeout( hideEmailMessage, 1000);
}