/**
 * This file contains relevant functions for controlling the headerpage portion.
 * Also included here are the All Shows page handler and the All Themes page handler.
 * Regrettable use of global variables established in core.js
 * @TODO There should have been a HeaderPage object. All these functions are methods. It's sad. This is one of the most objectifiable parts of the code.
 */

/*
 * Configuration
 */

var DESCRIPTION_SIZE_MAX 	= 150;
var COLUMNS					= 5;
var ALL_THEMES_COLUMNS		= 5;


/**
 * Function puts data into the headerpage and shows it by pulling it from the database.
 */
function headerPage( aKey )
{
	// Two special cases, and then follow whatever's in the database
	if ( aKey == "shows" )
	{
		$.get("lib/json.php?getAllShows="+aKey, function ( data ) { grandma.handlerMakeShowHeaderPage( data ); } );
	} else if ( aKey == "themes" )
	{
		$.get("lib/json.php?getAllThemes="+aKey, function ( data ) { grandma.handlerMakeThemeHeaderPage( data, "date" ); } );
	} else  if ( aKey == "explore" )
	{
		$.get("lib/json.php?getFeaturedShowsAndThemes=1", function ( data ) { grandma.handlerMakeExploreHeaderPage( data ); } );
	} else
	{
		$.get("lib/json.php?hp=" + aKey, function ( data ) { grandma.headerPageHandler( data ); } );
	}

} // END of headerPage()


/**
 * Handler makes an All Themes headerpage.
 * @param standard json info. If false function uses old data.
 */
function handlerMakeThemeHeaderPage( jsonData, sortBy )
{

	var myThemeData = (jsonData == false) ? allThemesData : eval ( "(" + jsonData + ")" );
	
	// remember what we got back so we can resort it and rewrite make this page again when we sort it differently.
	// @TODO make general request cache
	allThemesData	= myThemeData; // stupid global variable
	
	var myName, myPopulation;
	
	// buffer to hold html
	var myHTML = "";
	
	var mySortedThemes = new Array();
	
	for ( var i in myThemeData[0] )
	{
		
		myName 			= new String(myThemeData[0][i]).trim();
		myPopulation 	= new String(myThemeData[1][i]).trim();
		
		if (myName != "" && myName.indexOf("-") == -1)
		{
			mySortedThemes.push({ 
									"myName"		: myName,
									"myPopulation"	: myPopulation
								});			
		}

	}
	
	mySortedThemes.sort(themesAlphabetically);	
	
	// declare columns
	var myColumns = new Array();
	
	// initialize it
	for ( var i = 0; i < ALL_THEMES_COLUMNS; i++ )
	{
		myColumns[i] = "";
	}
	
	var appropriateColumn; // will select which column data goes
		
	// go through every single last unique tag/theme
	for ( var i in mySortedThemes )
	{

		appropriateColumn = Math.floor( (ALL_THEMES_COLUMNS / mySortedThemes.length) * i); // creep up from 0 to COLUMNS

		myName 			= mySortedThemes[i].myName;
		myPopulation	= mySortedThemes[i].myPopulation;

		myColumns[appropriateColumn] += "<div><a href=\"#commandHeaderPageLink&s="+myName+"\" onclick=\"clickHandler(this); return false;\">" + myName + "</a> ("+myPopulation+")</div>";

	}

	myHTML += "<div id=\"allThemesContainer\">";

	// add columns
	for ( var i in myColumns )
	{
		myHTML += "<div class=\"themeColumn\" id=\"themeColumn-"+i+"\">"+myColumns[i]+"</div>";
	}
	myHTML += "</div>";

	headerPageWrite ("All Themes", myHTML);
};


/** 
  * Makes HTML based on all show data and gives it to the headerPageWrite function.
  */
function handlerMakeShowHeaderPage ( jsonData )
{

	var DESCRIPTION_LENGTH_MAX 	= 150;
	var COLUMNS					= 3;
	

	var myShowData 	= eval ( "(" + jsonData + ")" );
	var myKey, myName, myDescription;
	
	var myHTML = "";	

	// declare columns
	var myColumns = new Array();
	
	// initialize it
	for ( var i = 0; i < COLUMNS; i++ )
	{
		myColumns[i] = "";
	}
	
	var appropriateColumn;
	
	myShowData.sort(showsAlphabetically);
	
	for ( var i in myShowData)
	{

		oneShow = myShowData[i];
				
		if (oneShow.myKey != homePage)
		{
			
			appropriateColumn = Math.floor( (COLUMNS / myShowData.length) * i); // creep up from 0 to 2

			myKey 			= oneShow.myKey;
			myName 			= oneShow.myName;
			myDescription 	= oneShow.myDescription.length > DESCRIPTION_LENGTH_MAX ? oneShow.myDescription.safeTruncate(DESCRIPTION_LENGTH_MAX) + "..." : oneShow.myDescription;
		
			myColumns[appropriateColumn] += "<div><a href=\"#commandHeaderPageLink&s="+oneShow.myKey+"\" onclick=\"clickHandler(this); return false;\">" + myName + "</a>";
			myColumns[appropriateColumn] += "<div>" + myDescription + "</div></div>";

		}
		
	}

	myHTML += "<div id=\"allShowsContainer\">";
	
	// add columns
	for ( var i in myColumns )
	{
		myHTML += "<div class=\"showColumn\" id=\"showColumn-"+i+"\">"+myColumns[i]+"</div>";
	}
	myHTML += "</div>";

	headerPageWrite ("All Shows", myHTML);
		
} // END of handlerMakeShowHeaderPage


/** 
 * Makes the explore page with featured shows and featured themes.
 */
function handlerMakeExploreHeaderPage ( jsonData )
{
	var DESCRIPTION_LENGTH_MAX 	= 150;
	
	var myShowData 	= eval ( "(" + jsonData + ")" );
		
	var myShows = new Array();
	var myThemes = new Array();
	
	var themeHTML = "<h3>Featured Themes <a href=\"#hp=themes\" onclick=\"clickHandler(this); return false\">(all)</a></h3>";
	var showHTML = "<h3>Featured Shows <a href=\"#hp=shows\" onclick=\"clickHandler(this); return false\">(all)</a></h3>";
	var exploreHTML = "";
	
	for ( var i in myShowData )
	{
	
		oneShow = myShowData[i];
	
		if ( oneShow.myType.toLowerCase() == "f" )
		{
			myShows.push(oneShow);
		} else
		{
			myThemes.push(oneShow);
		}
	
	}
	
	myThemes.sort(showsAlphabetically);
	myShows.sort(showsAlphabetically);
	
	for ( var i in myShows )
	{

		oneShow = myShows[i];
				
		if (oneShow.myKey != homePage)
		{
			myKey 			= oneShow.myKey;
			myName 			= oneShow.myName;
			myDescription 	= oneShow.myDescription.length > DESCRIPTION_LENGTH_MAX ? oneShow.myDescription.safeTruncate( DESCRIPTION_LENGTH_MAX) + "..." : oneShow.myDescription;
		}
		
	showHTML += "<div><a href=\"#commandHeaderPageLink&s=" + oneShow.myKey + "\" class=\"header-3\" onclick=\"clickHandler(this); return false;\">" + myName + "</a>";
	showHTML += "<div class=\"paragraph\">" + myDescription + "</div></div>";
	
	}

	
	for ( var i in myThemes)
	{

		oneTheme = myThemes[i];
				
		if (oneTheme.myKey != homePage)
		{
			myKey 			= oneTheme.myKey;
			myName 			= oneTheme.myName;
			myDescription 	= oneTheme.myDescription.length > DESCRIPTION_LENGTH_MAX ? oneTheme.myDescription.substr(0, DESCRIPTION_LENGTH_MAX) + "..." : oneTheme.myDescription;
		}
		
	themeHTML += "<div><a href=\"#commandHeaderPageLink&s=" + oneTheme.myKey + "\" onclick=\"clickHandler(this); return false;\">" + myName + "</a>";
	themeHTML += "<div>" + myDescription + "</div></div>";
	
	}

	exploreHTML = "<div id=\"aLeftColumn\">"+showHTML+"</div><div id=\"aRightColumn\">"+themeHTML+"</div><div id=\"aMiddleColumn\"></div>";
	
	headerPageWrite ("Explore After Ed", exploreHTML);
	
} // END of handlerMakeExploreHeaderPage


function showsAlphabetically (a, b)
{
	
	dA = a.myName.toLowerCase();
	dB = b.myName.toLowerCase();

	if (dA < dB)
	{
		result =  1;
	} else if (dA > dB)
	{
		result =  -1;
	} else
	{
		result = 0;
	}

	result *= -1;

	return result;
	
}

/** 
 * This is a sort function passed to Array.sort()
 */
function themesAlphabetically (a, b)
{
	
		dA = a.myName.toLowerCase();
		dB = b.myName.toLowerCase();

		if (dA < dB)
		{
			result =  1;
		} else if (dA > dB)
		{
			result =  -1;
		} else
		{
			result = 0;
		}

			result *= -1;
	
		return result;

} // END of themesAlphabetically


/** 
 * Clear all the contents from the body portion of the headerPage
 */
function headerPageClear()
{
	
	var myBodyDiv 	= document.getElementById("headerPageContent");
	
	// Remove whats there first
	while ( myBodyDiv.childNodes[0] ) 
	{
	    myBodyDiv.removeChild(myBodyDiv.childNodes[0]);
	}
} // END of headerPageClear()


/** 
  * If the drawer is closed, open it, if it's open, close it. 
  */
function toggleUpperDrawer() 
{

	if ( upperDrawerIsClosed )
	{
		// open drawer
		$("#headerPageContainer").animate( { height: "320px" }, 250 );
		$("#headerPageContainer").addClass( "bottomBorder" ); 
		upperDrawerIsClosed = false;
	} else
	{
		// close drawer
		$("#headerPageContainer").animate( { height: "0px" }, 250, null , headerPageClear );
		$("#headerPageContainer").removeClass( "bottomBorder" ); 
		upperDrawerIsClosed = true;	
	}

	return false;

} // END of toggleUpperDrawer()


/** 
  * Writes to the innerHTML of the hidden portion below the header, and then displays it.
  */
function headerPageWrite ( aTitle, aBody )
{

	headerVisible = true;

	// First remove all the content there
	headerPageClear();


	// write what we gave it
	$("#headerPageTitleText").html(aTitle);
	$("#headerPageContent").append(aBody);
	

	// handle drawer smartl;y
	if (upperDrawerIsClosed)
	{
		toggleUpperDrawer();
	}
	
} // END of headerPageWrite()


/** 
  * Takes the json data from a page header request and gives it to the headerPageWrite function.
  */
function headerPageHandler ( jsonData )
{

	var myHeaderPageData 	= eval ("(" + jsonData + ")");
	headerPageWrite( myHeaderPageData.myTitle, myHeaderPageData.myContent );
		
} // END of headerPageHandler

