var timerlen = 1;
var slideAniLen = 500;

var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var moving = new Array();
var dir = new Array();

var message_end_height = new Array();
var message_start_height = 35;
if((navigator.userAgent).indexOf("Safari")>0) message_start_height = 32;
var message_div = new Array();
var message_link_div = new Array();
var message_new = new Array();
var message_div_state = new Array();
var message_border_start_color_R = new Array();
var message_border_start_color_G = new Array();
var message_border_start_color_B = new Array();
var message_border_end_color_R = new Array();
var message_border_end_color_G = new Array();
var message_border_end_color_B = new Array();
var message_border = new Array();
var num_message_divs = 0;


var endorse_div	= new Array();
var endorse_state = new Array();
var endorse_change_state_flag = new Array();
var endorse_flag = new Array();
var endorse_max_row_height = new Array();
var num_endorse_divs = 0;

var endorse_rows_per_page = 0;
var total_pages_endorsements = 0;
var total_pages_endorsed_you = 0;
var total_pages_you_endorsed = 0;

var endorse_page = 1;
var endorse_filter = 0;


var DIV_startheight = new Array();
var DIV_endheight = new Array();



//decimal to hexidecimal conversion function
function d2h(d) {return d.toString(16);}


//hexidecimal to decimal conversion function
function h2d(h) {return parseInt(h,16);}






//--------------------------------------------------------------------------------------
//attach file function allows us to call up a .php file from the 
//server without reloading the current page
//--------------------------------------------------------------------------------------
function attach_file( p_script_url )
{
	// create new script element, set its relative URL, and load it
	script = document.createElement( 'script' );
	script.src = p_script_url;
	document.getElementsByTagName( 'head' )[0].appendChild( script );
}
//--------------------------------------------------------------------------------------





//--------------------------------------------------------------------------------------
//store the rows per page and total pages values for the endorsement table while
//the members/index.php file is loading.
//--------------------------------------------------------------------------------------
function store_endorse_pages(rpp,tpe,tpey,tpye){

	endorse_rows_per_page = rpp;
	total_pages_endorsements = tpe;
	total_pages_endorsed_you = tpey;
	total_pages_you_endorsed = tpye;
	return;
}
//--------------------------------------------------------------------------------------






//--------------------------------------------------------------------------------------
//store the endorseIDs and related information as
//the members/index.php file is loading.
//--------------------------------------------------------------------------------------
function store_endorse_row(objname,state,flag,height){

	endorse_div[num_endorse_divs] = objname;
	endorse_state[num_endorse_divs] = state;
	endorse_change_state_flag[num_endorse_divs] = false;
	endorse_flag[num_endorse_divs] = flag;
	endorse_max_row_height[num_endorse_divs] = height;

	num_endorse_divs++;

	return;
}
//--------------------------------------------------------------------------------------








//--------------------------------------------------------------------------------------
//sets new endorse states based on 
//endorse_page, endorse_filter, endorse_rows_per_page, and endorse_flag[].
//it will also set a endorse_change_state_flag[], if the state of a row has changed
//--------------------------------------------------------------------------------------
function set_new_endorse_states(){

	var rows_selected = 0;
	var filter_matched_flag = false;
	var row_matched_flag = false;
	var rows_filter_matched = 0;

	var first_match = (endorse_page-1)*(endorse_rows_per_page)+1;
	var last_match = (endorse_page)*(endorse_rows_per_page);

	for(var row=0;row<num_endorse_divs;row++)
	{
		//regular rows
		if(row < num_endorse_divs-1)
		{
			filter_matched_flag = false;
			row_matched_flag = false;

			//if the endorse filter is set to 0, "All", then all rows match
			if(endorse_filter==0) { rows_filter_matched++; filter_matched_flag=true; }

			//if the row's endorse flag is 0, "endorsements to and from", then it is always a match
			else if(endorse_flag[row]==0) { rows_filter_matched++; filter_matched_flag=true; }

			//otherwise, the row only matches if it equals the filter state
			else if(endorse_flag[row]==endorse_filter) { rows_filter_matched++; filter_matched_flag=true; }

			if(filter_matched_flag==true)
			{
				//the row is only a match if it falls on this page
				if(rows_filter_matched >= first_match)
				{
					if(rows_filter_matched <= last_match) { row_matched_flag=true; }
				}
			}

			//change the state and the change state flag if neccesary
			if(row_matched_flag==false)
			{
				if(endorse_state[row]==1)
				{
					endorse_state[row] = 0;
					endorse_change_state_flag[row] = true;
				}
			}
			else if(row_matched_flag==true)
			{
				if(endorse_state[row]==0)
				{
					endorse_state[row] = 1;
					endorse_change_state_flag[row] = true;
				}
				rows_selected++;
			}
		}

		//the "no endorsements message" row
		else
		{
			//only display this row, if no rows were selected
			if(rows_selected==0)
			{
				if(endorse_state[row]==0)
				{
					endorse_state[row] = 1;
					endorse_change_state_flag[row] = true;
				}
			}
			else
			{
				if(endorse_state[row]==1)
				{
					endorse_state[row] = 0;
					endorse_change_state_flag[row] = true;
				}
			}
		}
	}
	return;


}
//--------------------------------------------------------------------------------------









//--------------------------------------------------------------------------------------
//change the endorse table rows display attribute if any change flags are true
//--------------------------------------------------------------------------------------
function update_endorse_table_row_visibility(){

	var endorse_row_color1_R = h2d("FF");
	var endorse_row_color1_G = h2d("FF");
	var endorse_row_color1_B = h2d("FF");

	var endorse_row_color2_R = h2d("CC");
	var endorse_row_color2_G = h2d("CC");
	var endorse_row_color2_B = h2d("CC");

	var color = false;

	//for every row
	for(var row=0;row<num_endorse_divs;row++)
	{
		//get the row object
		var x=document.getElementById('endorseTable').rows[row]

		//if this row will be visible, change its color to the correct color
		if(endorse_state[row]==true)
		{
			//only do regular rows, not the "no endorsements message" row
			if(row < num_endorse_divs-1)
			{
				if(color==false)
				{
					x.style.backgroundColor = "rgb(" + endorse_row_color1_R + "," + endorse_row_color1_G + "," + endorse_row_color1_B + ")";
					color=true;
				}
				else
				{
					x.style.backgroundColor = "rgb(" + endorse_row_color2_R + "," + endorse_row_color2_G + "," + endorse_row_color2_B + ")";
					color=false;
				}
			}
		}

		//if the state of the row has changed
		if(endorse_change_state_flag[row]==true)
		{
			//if the row has changed to visible
			if(endorse_state[row]==true)
			{
				if(navigator.appName=="Microsoft Internet Explorer") x.style.display = "block";
				else x.style.display = "table-row";
			}

			//if the row has changed to hidden
			else if(endorse_state[row]==false)
			{
				x.style.display = "none"
			}
			
			//reset the flag
			endorse_change_state_flag[row]=false;
		}
	}
	return;
}
//--------------------------------------------------------------------------------------








//--------------------------------------------------------------------------------------
//updates the filter navigator at the top of the list
//--------------------------------------------------------------------------------------
function update_endorse_filter_navigator()
{

	//the filter navigator cells
	var cell=document.getElementById('endorseTableFilters').rows[0].cells
	

	if(endorse_filter==0)
	{
		cell[0].innerHTML="<span class=\"orangelink\"><a href=\"javascript:filter('received')\" onClick=\"endorse_filter_request('received'); return false;\">Endorsements Received</a></span>";
		cell[1].innerHTML="<span class=\"bigorangetext\">All Endorsements</span>";
		cell[2].innerHTML="<span class=\"orangelink\"><a href=\"javascript:filter('given')\" onClick=\"endorse_filter_request('given'); return false;\">Endorsements Given</a></span>";
	}
	else if(endorse_filter==-1)
	{
		cell[0].innerHTML="<span class=\"orangelink\"><a href=\"javascript:filter('received')\" onClick=\"endorse_filter_request('received'); return false;\">Endorsements Received</a></span>";
		cell[1].innerHTML="<span class=\"orangelink\"><a href=\"javascript:filter('all')\" onClick=\"endorse_filter_request('all'); return false;\">All Endorsements</a></span>";
		cell[2].innerHTML="<span class=\"bigorangetext\">Endorsements Given</span>";
	}
	else if(endorse_filter==1)
	{
		cell[0].innerHTML="<span class=\"bigorangetext\">Endorsements Received</span>";
		cell[1].innerHTML="<span class=\"orangelink\"><a href=\"javascript:filter('all')\" onClick=\"endorse_filter_request('all'); return false;\">All Endorsements</a></span>";
		cell[2].innerHTML="<span class=\"orangelink\"><a href=\"javascript:filter('given')\" onClick=\"endorse_filter_request('given'); return false;\">Endorsements Given</a></span>";
	}

}
//--------------------------------------------------------------------------------------








//--------------------------------------------------------------------------------------
//updates the pagination navigator at the bottom of the list
//--------------------------------------------------------------------------------------
function update_endorse_pagination_navigator()
{


	//the pagination navigator row
	var row=document.getElementById('endorseTablePage').rows[0]

	//the pagination navigator cell
	var cell=document.getElementById('endorseTablePage').rows[0].cells


	//first see if the navigator should be visible
	if(endorse_state[num_endorse_divs-1]==1)
	{
		//then the "no endorsements" comment is up. Navigator should be hidden.
		row.style.display = "none";
	}
	else
	{
		//navigator should be visible
		if(navigator.appName=="Microsoft Internet Explorer") row.style.display = "block";
		else row.style.display = "table-row";

		if(endorse_filter==0)       { endorse_total_pages = total_pages_endorsements; }
		else if(endorse_filter==-1) { endorse_total_pages = total_pages_you_endorsed; }
		else if(endorse_filter==1)  { endorse_total_pages = total_pages_endorsed_you; }

		
		//change what is displayed in the pagination navigator based on what page we are on
		if(endorse_total_pages==1)
		{
			cell[0].innerHTML="<span class=\"tinytext\">Page " + endorse_page + " of " + endorse_total_pages + "</span>";
		}
		else if(endorse_page==1)
		{
			cell[0].innerHTML="<span class=\"tinytext\"><a href=\"javascript:page('next')\" onClick=\"endorse_page_change_request('next'); return false;\">Next-></a><br>Page " + endorse_page + " of " + endorse_total_pages + "</span>";
		}
		else if(endorse_page==endorse_total_pages)
		{
			cell[0].innerHTML="<span class=\"tinytext\"><a href=\"javascript:page('prev')\" onClick=\"endorse_page_change_request('prev'); return false;\"><-Previous</a><br>Page " + endorse_page + " of " + endorse_total_pages + "</span>";
		}
		else
		{
			cell[0].innerHTML="<span class=\"tinytext\"><a href=\"javascript:page('prev')\" onClick=\"endorse_page_change_request('prev'); return false;\"><-Previous</a> | <a href=\"javascript:page('next')\" onClick=\"endorse_page_change_request('next'); return false;\">Next-></a><br>Page " + endorse_page + " of " + endorse_total_pages + "</span>";
		}
	}
}
//--------------------------------------------------------------------------------------








//--------------------------------------------------------------------------------------
//initiates an endorsement list filter request
//--------------------------------------------------------------------------------------
function endorse_filter_request(type){

	if(type=="all")
	{
		endorse_filter = 0;
		endorse_page = 1;
	}
	else if(type=="given")
	{
		endorse_filter = -1;
		endorse_page = 1;
	}
	else if(type=="received")
	{
		endorse_filter = 1;
		endorse_page = 1;
	}


	set_new_endorse_states();
	update_endorse_filter_navigator();
	update_endorse_table_row_visibility();
	update_endorse_pagination_navigator();

	return;
}
//--------------------------------------------------------------------------------------








//--------------------------------------------------------------------------------------
//initiates an endorsement list page change request
//the members/index.php file is loading.
//--------------------------------------------------------------------------------------
function endorse_page_change_request(type){

	if(type=="next")
	{
		if(endorse_filter==0)
		{
			if(endorse_page < total_pages_endorsements)
			{
				endorse_page++;
			}
		}
		else if(endorse_filter==-1)
		{
			if(endorse_page < total_pages_you_endorsed)
			{
				endorse_page++;
			}
		}
		else if(endorse_filter==1)
		{
			if(endorse_page < total_pages_endorsed_you)
			{
				endorse_page++;
			}
		}
	}
	else if(type=="prev")
	{
		if(endorse_page>1)
		{
			endorse_page--;
		}
	}


	set_new_endorse_states();
	update_endorse_table_row_visibility();
	update_endorse_pagination_navigator();

	return;
}
//--------------------------------------------------------------------------------------








//*****************************************************************************************************************
//*****************************************************************************************************************
//*****************************************************************************************************************
//
//Functions above this point are specific to endorsement Divs.
//Functions below this point are specific to message Div sliding.
//
//*****************************************************************************************************************
//*****************************************************************************************************************
//*****************************************************************************************************************






//--------------------------------------------------------------------------------------
//store the messageIDs and related information as
//the members/index.php file is loading.
//--------------------------------------------------------------------------------------
function store_message_id(objname,objname2,newflag){

	message_div[num_message_divs]=objname;
	message_link_div[num_message_divs]=objname2;
	message_new[num_message_divs]=newflag;
	message_div_state[objname]="closed";
	num_message_divs++;
	return;
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//after a page load, check to see if any of the messages don't need an Expand/Collapse link
//--------------------------------------------------------------------------------------
function check_message_links(){

	for(var i=0;i<num_message_divs;i++)
	{

		if(message_new[i]==0)
		{
			message_new[message_div[i]]=false;
		}
		else
		{
			message_new[message_div[i]]=true;
		}
		if(check_hide_message_link(message_div[i]))
		{
			//don't hide the expand/collapse link on new messages
			//clicking that link will tell us if they have looked at the message
			if(message_new[i]==0) hide_message_link(message_div[i],message_link_div[i]);
			
		}
		//we are done with the stored message id, delete it
		delete(message_new[i]);
		delete(message_div[i]);
		delete(message_link_div[i]);
	}
	return;
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//finds the full message height
//sets message_end_height[objname] equal to the full message height and returns the same value
//--------------------------------------------------------------------------------------
function full_message_height(objname){

	obj[objname] = document.getElementById(objname);

	//set the message to the start height
	obj[objname].style.height = message_start_height + "px";

	//expand the message all the way out
	//if(navigator.appName=="Netscape")	obj[objname].style.height = "none";
	if(navigator.appName=="Microsoft Internet Explorer") obj[objname].style.height = "10000px";
	else if((navigator.userAgent).indexOf("Safari")>0) { obj[objname].style.height = "none"; }
	else obj[objname].style.height = "none";

	//read the div height
	message_end_height[objname] = parseInt(obj[objname].scrollHeight);

	//set the height back to message_start_height
	obj[objname].style.height = message_start_height + "px";

	return message_end_height[objname];

}
//--------------------------------------------------------------------------------------






//--------------------------------------------------------------------------------------
//checks if the link should be hidden
//sets message_end_height[objname] via a function call to 'full_message_height'
//--------------------------------------------------------------------------------------
function check_hide_message_link(objname){
	
	obj[objname] = document.getElementById(objname);
	
	if (full_message_height(objname) <= message_start_height) return true;
	else return false;
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//hides the Expand/Collapse link
//--------------------------------------------------------------------------------------
function hide_message_link(objname, objname2){
	
	obj[objname2] = document.getElementById(objname2);

	obj[objname2].style.display = "none";
}
//--------------------------------------------------------------------------------------








//--------------------------------------------------------------------------------------
//start the slide
//This function sets the 'setInterval' which will call 'message_slide_tick()' repeatedly
//--------------------------------------------------------------------------------------
function start_message_slide(objname,objname2,borderdiv,fadeColorStart,fadeColorEnd)
{

	 if(moving[objname]) return;
	 moving[objname] = true;

	 obj[objname] = document.getElementById(objname);
	 obj[objname2] = document.getElementById(objname2);


	 if(message_div_state[objname]=="open")
	 {
		dir[objname] = "up";
	 }
	 if(message_div_state[objname]=="closed")
	 {
		dir[objname] = "down";

		//if this is a small message, remove the link div
		//message_end_height[objname] will be set during this process
		if (check_hide_message_link(objname)) 
		{
			hide_message_link(objname,objname2)
		}
	
		//if this message is new
		if(message_new[objname])
		{
			//need to update the database here
			//to make the message old
			message_border[objname]=borderdiv;
			message_border_start_color_R[objname] = h2d(fadeColorStart.substring(1,3));
			message_border_start_color_G[objname] = h2d(fadeColorStart.substring(3,5));
			message_border_start_color_B[objname] = h2d(fadeColorStart.substring(5,7));
			message_border_end_color_R[objname] = h2d(fadeColorEnd.substring(1,3));
			message_border_end_color_G[objname] = h2d(fadeColorEnd.substring(3,5));
			message_border_end_color_B[objname] = h2d(fadeColorEnd.substring(5,7));
			document.getElementById(message_border[objname]).style.backgroundColor = "rgb(" + message_border_start_color_R[objname] + "," + message_border_start_color_G[objname] + "," + message_border_start_color_B[objname] + ")";
		}
	 }

        startTime[objname] = (new Date()).getTime();
	 timerID[objname] = setInterval('message_slide_tick("'+objname+'");',timerlen);
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//The function that is called repeatedly from the 'setInterval'
//This function does all the work
//--------------------------------------------------------------------------------------
function message_slide_tick(objname){
        var elapsed = (new Date()).getTime() - startTime[objname];

        if (elapsed > slideAniLen)
                end_message_slide(objname)
        else {
		  if(dir[objname] =="down"){
                	var d =Math.round(elapsed / slideAniLen * (message_end_height[objname]-message_start_height))+message_start_height;
			if(message_new[objname])
			{
				var thisColorR=Math.round(elapsed / slideAniLen * (message_border_end_color_R[objname]-message_border_start_color_R[objname]))+message_border_start_color_R[objname];
				var thisColorG=Math.round(elapsed / slideAniLen * (message_border_end_color_G[objname]-message_border_start_color_G[objname]))+message_border_start_color_G[objname];
				var thisColorB=Math.round(elapsed / slideAniLen * (message_border_end_color_B[objname]-message_border_start_color_B[objname]))+message_border_start_color_B[objname];
				if(message_border_end_color_R[objname]<message_border_start_color_R[objname]) thisColorR = message_border_end_color_R[objname] - thisColorR + message_border_start_color_R[objname];
				if(message_border_end_color_G[objname]<message_border_start_color_G[objname]) thisColorG = message_border_end_color_G[objname] - thisColorG + message_border_start_color_G[objname];
				if(message_border_end_color_B[objname]<message_border_start_color_B[objname]) thisColorB = message_border_end_color_B[objname] - thisColorB + message_border_start_color_B[objname];
				document.getElementById(message_border[objname]).style.backgroundColor = "rgb(" + thisColorR + "," + thisColorG + "," + thisColorB + ")";

			}
		  }
                if(dir[objname] == "up"){
			var d =Math.round(elapsed / slideAniLen * (message_end_height[objname]-message_start_height))+message_start_height;
			d = message_end_height[objname] - d + message_start_height;
			if(d<1) d=1;
		  }

                obj[objname].style.height = d + "px";
        }

        return;
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//End the slide and cleanup memory
//--------------------------------------------------------------------------------------
function end_message_slide(objname){
        clearInterval(timerID[objname]);

        if(dir[objname] == "up"){
		message_div_state[objname]="closed";
		obj[objname].style.height = message_start_height + "px";
		 delete(message_end_height[objname]);
	 }

	 if(dir[objname] == "down"){
		message_div_state[objname]="open";
		obj[objname].style.height = message_end_height[objname] + "px";
		if(message_new[objname]) document.getElementById(message_border[objname]).style.backgroundColor = "rgb(" + message_border_end_color_R[objname] + "," + message_border_end_color_G[objname] + "," + message_border_end_color_B[objname] + ")";

		

	        
	 }
	

        delete(moving[objname]);
        delete(timerID[objname]);
        delete(startTime[objname]);
        delete(obj[objname]);
        delete(dir[objname]);
	 delete(message_border_start_color_R[objname]);
	 delete(message_border_start_color_G[objname]);
	 delete(message_border_start_color_B[objname]);
	 delete(message_border_end_color_R[objname]);
	 delete(message_border_end_color_G[objname]);
	 delete(message_border_end_color_B[objname]);
	 delete(message_new[objname]);

        return;
}
//--------------------------------------------------------------------------------------





//*****************************************************************************************************************
//*****************************************************************************************************************
//*****************************************************************************************************************
//
//Functions above this point are specific to message Div sliding.
//Functions below this point are generic div sliding functions.
//
//*****************************************************************************************************************
//*****************************************************************************************************************
//*****************************************************************************************************************





//--------------------------------------------------------------------------------------
//configure the slide_DIV then call start_DIV_slide()
//this is called from a php file
//--------------------------------------------------------------------------------------
function slide_DIV(objname, startH, endH)
{
	//if already sliding, return
        if(moving[objname]) return;
	
		
	//checks
	//sliding down
	if(startH < endH)
	{
		// cannot slide down something that is already visible
	        if(document.getElementById(objname).style.overflow != "hidden") return; 

		obj[objname] = document.getElementById(objname);
		dir[objname] = "down";
	}

	//sliding up
	if(startH > endH)
	{
		// cannot slide up something that is already hidden
	        if(document.getElementById(objname).style.overflow == "hidden") return; 
	
		obj[objname] = document.getElementById(objname);
		dir [objname] = "up";
	}

	DIV_startheight[objname] = startH;
	DIV_endheight[objname] = endH;
        moving[objname] = true;



        start_DIV_slide(objname);
}
//--------------------------------------------------------------------------------------










//--------------------------------------------------------------------------------------
//start the DIV slide
//This function sets the 'setInterval' which will call 'slidetick_DIV()' repeatedly
//--------------------------------------------------------------------------------------
function start_DIV_slide(objname)
{
        
	obj[objname] = document.getElementById(objname);

        startTime[objname] = (new Date()).getTime();



	obj[objname].style.height = DIV_startheight[objname] + "px";

	if(dir[objname] == "up") { obj[objname].style.overflow = "hidden"; }

	timerID[objname] = setInterval('slidetick_DIV("'+objname+'");',timerlen);
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//The function that is called repeatedly from the 'setInterval'
//This function does all the work
//--------------------------------------------------------------------------------------
function slidetick_DIV(objname)
{
        var elapsed = (new Date()).getTime() - startTime[objname];

        if (elapsed > slideAniLen) { end_DIV_slide(objname); }
        else 
	 {
              	var d =Math.round(elapsed / slideAniLen * (DIV_endheight[objname]-DIV_startheight[objname]))+DIV_startheight[objname];	
		       if(d<1) d=1;
                    obj[objname].style.height = d + "px";
        }
        return;
}
//--------------------------------------------------------------------------------------







//--------------------------------------------------------------------------------------
//End the slide and cleanup memory
//--------------------------------------------------------------------------------------
function end_DIV_slide(objname)
{
        clearInterval(timerID[objname]);

        if(dir[objname] == "up")
	{
		obj[objname].style.height = DIV_endheight[objname] + "px";
		delete(DIV_endheight[objname]);
	}

	if(dir[objname] == "down")
	{
		obj[objname].style.overflow = "visible";
		obj[objname].style.height = DIV_endheight[objname] + "px";
	}
	
        delete(moving[objname]);
        delete(timerID[objname]);
        delete(startTime[objname]);
        delete(obj[objname]);
        delete(dir[objname]);
	delete(DIV_startheight[objname]);
	delete(DIV_endheight[objname]);

        return;
}
//--------------------------------------------------------------------------------------








