var query = ''; // initialize query var
var colSort = 3; // sort by column number 
var colSortOrder = 'DESC'; // column sort order
var mode = 'block';
var nodeLoc = -1; // list location
var node = Array();
var footer = false;
var searchMode = false;
var navLinks = ['showreel_link','recent_link','commercial_link','musicvideo_link','historical_link'];

function Item(ID, stylemode, jobID, title, subtitle, agency, date, url, imgurl, role, footer, awards, pressItem) {

	this.ID = ID;
	this.jobID = jobID;
	this.title = title;
	this.subtitle = subtitle;
	this.agency = agency;
	this.date = date;
	this.url = url;
	this.role = role;
	this.imgurl = imgurl;
	this.awards = awards;
	this.titles = this.title.split("%"); // split title into title, subtitle
	

	
	if(footer) {
		var ItemDisplay, IMGurl;
		IMGurl = (footer == 'mus' || footer == 'com') ? 'direction' : 'design';		
		ItemDisplay = ('<div id="node'+this.ID+'" class="item footer '+stylemode+'"><a class="block" href="javascript:Search(\''+this.url+'\', \'block\');" onClick="Fill(\''+this.url+'\');">');
		ItemDisplay += ('<span class="img"><img onClick="javascript:Search(\''+this.url+'\', \'block\');" src="/global/Thumbnail.php?archive='+IMGurl+'" alt=" " /></span>');
		ItemDisplay += ('<span class="t">'+this.title+'');
		ItemDisplay += ('<span class="a smallcaps">'+agency+'</span>');
		ItemDisplay += ('<span class="awardsln">&nbsp;</span></span>');
		ItemDisplay += ('</a></div>');
	}
	// regular item
	else {
		ItemDisplay = ('<div id="node'+this.ID+'" class="item '+stylemode+' linkEm"><a class="block" href="'+this.url+'">');
		ItemDisplay += ('<span class="img" onClick="location.href=\''+this.url+'\'" ><img src="'+this.imgurl+'" alt=" " /></span>');
		ItemDisplay += ('<span class="t linkEm">'+this.title);
		ItemDisplay += ('<span class="sub">&nbsp;'+this.subtitle.replace("Whats","What&rsquo;s")+'</span>');// has a sub title
		ItemDisplay += ('<span class="awards">'+this.awards+'</span>');
		ItemDisplay += ('<span class="a smallcaps">'+this.agency+'</span>');
		ItemDisplay += ('<span class="awardsln">&nbsp;</span></span>');
		ItemDisplay += ('</a></div>');
	}
	
	this.display = ItemDisplay; // render HTML
}

function SearchMode(mode) {
	searchMode = mode;
}

function clearBottom() {
	return ('<div style="clear:both;width:100%;height:0px;">&nbsp;</div>');
}

function columnSort(a,b) {
	// if sort is ascending
	if(colSortOrder == 'ASC') {	
		if (a[colSort].toLowerCase() < b[colSort].toLowerCase()) return -1; // toLowerCase is used to result in a natural/human sort
		if (a[colSort].toLowerCase() > b[colSort].toLowerCase()) return  1;
	} 
	// if sort is descending
	else  {
		if (a[colSort].toLowerCase() > b[colSort].toLowerCase()) return -1;
		if (a[colSort].toLowerCase() < b[colSort].toLowerCase()) return  1;
	}
	return 0;
}

function parseJobNumber(qry, joblist) {
	parsedContents = new Array();
	for(i=0;i<joblist.length;i++) {
		// match job number
		if(joblist[i][0] == qry) {
			parsedContents[0] = joblist[i]; // populate new array
			break;
		}
	}
	return parsedContents;
}

function parseType(type, joblist) {
	var parsedContents = new Array();
	var j=0; // counter for parsed array
	for(var i=0;i<joblist.length;i++) {
		var listingFlags = joblist[i][7].split("%");
		// match commercials
		if(listingFlags[type] == 1) {
			parsedContents[j] = joblist[i]; // populate new array
			j++;
		}
	}
	return parsedContents;
}

function parseArchive(type, list) {
	parsedContents = new Array();
	var j=0; // counter for parsed array

	if(query == "director" ){
		for(var i=0;i<list.length;i++){
			parsedContents[j] = list[i]; // populate new array
			j++;
		}
	}	
	else {
		for(var i=0;i<list.length;i++) {
			var listingFlags = list[i][7].split("%");
			
			// match archive selection
			if(listingFlags[0] == type || listingFlags[0] == 0) {
				parsedContents[j] = list[i]; // populate new array
				j++;
			}
		}
	}	
	return parsedContents;
}

function parseJSArchive(list){
	parsed = new Array();
}



function parseKeyword(qry, list) {
	
	parsedContents = new Array();
	
	// matches start of strings and start of words
	re = new RegExp("^"+qry+"|[\ ]"+qry+"", "gi"); 
	j=0; // counter for parsed array
	for(i=0;i<list.length;i++) {
		
		// combining titles and subtitles for searching without the split char (%)
		titles_concat = list[i][1]+' '+list[i][2]; 
		
		// combining titles and subtitles for searching without the split char (%)
		titles_concat_disp = list[i][1]+' '+list[i][2]; 
		
		// match title and subtitle
		if(titles_concat.match(re) || titles_concat_disp.match(re)) {
			parsedContents[j] = list[i]; // populate new array
			j++;
		}
		
	}
	return parsedContents;
}

// parse query
function parseContents(query) {
    if(query != '') {
		switch(query){
			case "showreel"			:	return SearchArray.showreel;
			case "recent"				:	return SearchArray.recent;
			case "commercial"		: return SearchArray.commercial;
			case "musicvideo"		: return SearchArray.musicvideo;
			case "historical"		: return SearchArray.historical;
			case "director"			: return SearchArray.director;
			case "press"				: return SearchArray.press;
			default 						:	return parseKeyword(query, SearchArray.all);
		}
	}
}


// Render items due to specific search query
function renderList() {
	var totalLength, node_number, footerTitle, footerUrl;
	var LIST = ''; // list variable to be displayed
	node_number = 0; // starts node number at zero

    // only do the following if there's a query
	if(query) { 
		// item's been sorted
		var parsedContents = parseContents(query);
		// tab highlighting
		for(i=0;i<navLinks.length;i++){
			document.getElementById(navLinks[i]).className = 'inactiveTab';
			if(navLinks[i] == query+"_link"){
				document.getElementById(query+"_link").className = 'activeTab';	
			}
		}

		totalLength = 0;//parsedContents.length; // total elements displayed
		
		// create new nodes every time the search is queried. Would be faster if nodes already existed, but hidden.
		// then, the search would hide/show and change the order of the results.
		for(var i=node_number;i<parsedContents.length;i++)  {

			switch(query){

				case "showreel"   :
				case "recent"     :
				case "commercial" :
				case "musicvideo" :
				case "historical" :
				default					 :
					node[i] = new Item(
					i, 
					mode,
					parsedContents[i][0], 
					parsedContents[i][1], 
					parsedContents[i][2], 
					parsedContents[i][3], 
					'', 
					parsedContents[i][5], 
					parsedContents[i][6],
					'', 
					false, 
					parsedContents[i][4], 
					false);
					LIST += node[i].display;
				break;
				
				
				case "director" :
					node[i] = new Item(
					i, 
					mode,
					parsedContents[i][0], 
					parsedContents[i][1], 
					'', 
					'', 
					'', 
					parsedContents[i][2], 
					parsedContents[i][3],
					'', 
					false, 
					'', 
					false);
					LIST += node[i].display;
				break;

				case "press" :
					node[i] = new Item(
					i, 
					mode + " press",
					parsedContents[i][0], 
					parsedContents[i][1], 
					parsedContents[i][2], 
					parsedContents[i][5], 
					'', 
					parsedContents[i][3], 
					parsedContents[i][4],
					'', 
					false, 
					'', 
					false);
					LIST += node[i].display;				
				break;
				
			}
		}
			
		// add footer to end of section if footer is enabled
		if (footer) {
			switch (footer) {
				case 'des' : footerTitle = 'Design Archive'; 	 footerUrl = 'design archive'; break;
				case 'com' : footerTitle = 'Directing Archive'; footerUrl = 'directing archive'; break;
				case 'mus' : footerTitle = 'Directing Archive'; footerUrl = 'directing archive'; break;
			}
			// create a new node for the footer to be appended at the end
			node[totalLength] = new Item(totalLength, mode, '0000', footerTitle, 'sub sub', '&nbsp;', 'date', footerUrl, 'imgurl', 'role', footer, '');
			LIST += node[totalLength].display; // add to the list
			footer = false; // turn it off after it's been appended  
		}
	
	
		// output a results list if we're in archive mode
		if(searchMode == 'archive') {
			//if(DOM.getElementById('numberOfElements')) DOM.getElementById('numberOfElements').innerHTML = '<strong>'+totalLength+'</strong>&nbsp;Results for &lsquo;<span>'+query+'</span>&rsquo;';// populate header
		}
		
		
		// custom header if we're in a specific section
		var customHeader = false;
		
		var viewcontrol = false;
		
		// assign custom headers, footers if specific queries
		switch(query) {
			case "showreel"   	:
			case "recent"     	:
			case "commercial" 	:
			case "musicvideo" 	:
			case "historical" 	: customHeader = false; viewcontrol = true; break;
			case "director" 		: customHeader = "Directors"; break;
			case "press" 				: customHeader = "Press"; break;
			default 						: customHeader = "Search Query : &lsquo;<span class='query'>"+query+"</span>&rsquo;"; break;
		}
		
		
		if(viewcontrol) document.getElementById('viewcontrol').style.display = "block";
		else						 document.getElementById('viewcontrol').style.display = "none";
		
		if(customHeader){
			document.getElementById('sectionTabs').style.display = 'none';
			document.getElementById('sectionHeader').style.display = 'block';
			document.getElementById('sectionHeader').innerHTML = customHeader;
		} else {
			document.getElementById('sectionHeader').style.display = 'none';
			document.getElementById('sectionTabs').style.display = 'block';		
		}
		
		// if query == director, add a footer to expand the size
		if(query == "director")
		{
			LIST += "<div style=\"height:252px;\">&nbsp;</div>";
		}
		// if query == historic, add a footer to expand the size
		if((query == "historical" && mode == "block") || (query != "historical" && mode == "block"))
		{
			LIST += "<div style=\"height:567px;\">&nbsp;</div>";
		}		
		

		DOM.getElementById('searchContainer').style.display = 'block'; // show the entire search container
		DOM.getElementById('resultlist').innerHTML = LIST + clearBottom(); // populate HTML
		
		if(node[0]) 	DOM.s.c.value = DOM.s.j.value = node[0].url; // if possible search query
		else		DOM.s.j.value = DOM.s.c.value; // else, not a valid query so go to the current project
	}
	else 
	{	
		//DOM.getElementById('numberOfElements').innerHTML = '&nbsp;';
		DOM.getElementById('searchContainer').style.display = 'none';
		DOM.getElementById('resultlist').innerHTML = '';
		DOM.s.j.value = DOM.s.c.value; // set the hidden "current job" element to the ID of the job for quick-jump
	}

	if(!totalLength)
	{
		DOM.s.j.value = DOM.s.c.value = DOM.s.b.value; // jump = current = buffer
	}
}


// switch list mode
function Mode(m) {
	mode = m;
	renderList();
	toggleModeIcons();// color in view icons
}


function fadeOutBG(){
	bgfade = new Animator({
						  duration: 200,
						  onComplete: function() { $("TRANSBACK").style.display = "none"; bgFadeFinished = false ;}
						  });
	
	bgfade.addSubject(new NumericalStyleSubject(
    	$("TRANSBACK"), 'opacity', .90, 0, 4));

	if(bgFadeFinished){
		bgfade.play();
	}
}

var bgFadeFinished = false;

function fadeInBG(){

	$("TRANSBACK").style.display = "block";
		
	bgfade = new Animator({
						  duration: 200,
						  onComplete: function() { bgFadeFinished = true ;}
						  });
	
	bgfade.addSubject(new NumericalStyleSubject(
    	$("TRANSBACK"), 'opacity', 0, .90, 4));

	if(!bgFadeFinished){
		bgfade.play();
	}
}

function hideBG(){
	$("TRANSBACK").style.display = "none";
}



function resizeBGFade(){

	// resize to fit height of body
	var transback = $("TRANSBACK");
	var size = $("outerpattern");
	
	

	if(transback) {
		transback.style.height = eval(size.offsetHeight) + "px";
		
	}
	else if(transback) {
		transback.style.height = "0px";
	}
	
	
}


function toggleModeIcons()
{
	var modes = ['block','list']
	if(DOM.getElementById('view'+mode))
	{	
		for(var i=0;i<2;i++)
		{
			if(mode == modes[i]) { DOM.getElementById('view'+modes[i]).style.display = 'none'; }
			else { DOM.getElementById('view'+modes[i]).style.display = 'block'; }
		}
	}
}

// switch list mode (internal version)
function ModeInternal(m) {
	mode = m;
	toggleModeIcons();// color in view icons
}


// fills the query box with the clicked section
function Fill(q)
{
	DOM.s.qry.value = q;
}

function Pop(contents, header){
	
	var LIST = '';
	
    query = " ";
	
	mode = searchMode;

	hideBG();
	
	node = Array();
	
	for(var i = 0; i < contents.length; i++) {
		node[i] = new Item(
			i,
			mode,
			contents[i][0],
			contents[i][1],
			contents[i][2],
			contents[i][3],
			'',
			contents[i][5], 
			contents[i][6],
			'', 
			false, 
			contents[i][4],
			false
		);
		LIST += node[i].display;
			
	}
	

	
	renderList();

	DOM.getElementById('sectionHeader').innerHTML = header;
	DOM.getElementById('searchContainer').style.display = 'block'; // show the entire search container
	DOM.getElementById('resultlist').innerHTML = LIST;  // populate HTML

	fadeInBG();
}


function Search(searchQuery, newMode)
{	

	mode = newMode ? newMode : mode;
	
	var showList;

	if(searchQuery == '-')
	{
		query = false;
		showList = false;
	}
	else if(searchQuery)
	{
		hideBG();
		showList = true;
	}
	else
	{		
		searchQuery = false
		showList = false;
	}
	
	if(showList) // if a query is legit, show the list
	{
		query = searchQuery;
		
		// only sort by date if in list mode (from the nav block)
		if(searchMode == 'list')
		{	
			mode = 'list';
			Sort(4, 'INIT');
			searchMode = false;
		}
		else if(searchQuery)
		{
			mode = 'block';
			renderList();
		}
		// hide press iframe
		if(DOM.getElementById('pressbody') || DOM.getElementById('creditsbody')) 
		{
	  		 view(null, null, null); 
		}
		
		if(DOM.getElementById('clientlist'))
		{	
			DOM.getElementById('clientlist').style.display = "none";  
		}
		
		fadeInBG();
		
	}
	else
	{
		fadeOutBG();
		query = false; 
		DOM.s.qry.value='';
		renderList();
	}
	toggleModeIcons();
}

function moveFooter() 
{	

	var containerElement, listElement, footerElement, footerSpacer, topOffset, containerHeight, listHeight;


	containerElement 	= DOM.getElementById('outerpattern');
	listElement 			= DOM.getElementById('searchContainer');
	footerElement 		= DOM.getElementById('footer');
	footerSpacer 			= DOM.getElementById('footerspc');
	
	topOffset = 102; // top of work list
	
	// get heights
	containerHeight = eval(containerElement.offsetHeight - footerElement.offsetHeight);
	listHeight = eval(listElement.offsetHeight + topOffset);
	if(listHeight > containerHeight)
	{
		containerElement.style.height = listHeight + 100+ "px";
		//footerSpacer.style.height = listHeight-containerHeight + 16 + "px";
		
	}
	else
	{
		//footerSpacer.style.height = "8px";
	}
	

	// top offset
	footerElement.style.top = '200px';
	
	// resize background 
	resizeBGFade();	
}





function Sort(col, order)
{
	
	if(order == 'INIT') 
	{
	 	colSortOrder = 'DESC';
	}
	else if(colSort == col && colSortOrder == order) // alternate if same option is selected
	{
	   colSortOrder = (order == 'ASC' ? 'DESC' : 'ASC');
	}
	else
	{
	   colSortOrder = order;	
	}
	colSort = col;
	renderList();
}
