
// creates an XMLHttpRequest instance
function createXMLHttpRequestObject()
{
  // xmlHttp will store the reference to the XMLHttpRequest object
  var xmlHttp;
  // try to instantiate the native XMLHttpRequest object
  try
  {
    // create an XMLHttpRequest object
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    // assume IE6 or older
    try
    {
      xmlHttp = new ActiveXObject("Microsoft.XMLHttp");
    }
    catch(e) { }
  }
  // return the created object or display an error message
  if (!xmlHttp)
    alert("Error creating the XMLHttpRequest object.");
  else 
    return xmlHttp;
}


// returns the value of the cookie name passed to it
function get_cookie(name)
{
	with(document.cookie)
	{
		var regexp=new RegExp("(^|;\\s+)"+name+"=(.*?)(;|$)");
		var hit=regexp.exec(document.cookie);
		if(hit&&hit.length>2) 
		{
			return unescape(hit[2]);
		}
		else return '';
	}
};

// sets the value of the cookie name passed to it
function set_cookie(name,value,days)
{
	if(days)
	{
		var date=new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires="; expires="+date.toGMTString();
	}
	else 
	{
		expires="";
	}
	document.cookie=name+"="+value+expires+"; path=/";
}

// inserts the passed test in to the comment field if it exisits
function insert(text)
{
	var textarea=document.forms.postform.comment;
	if(textarea)
	{
		if(textarea.createTextRange && textarea.caretPos) // IE
		{
			var caretPos=textarea.caretPos;
			caretPos.text=caretPos.text.charAt(caretPos.text.length-1)==" "?text+" ":text;
		}
		else if(textarea.setSelectionRange) // Firefox
		{
			var start=textarea.selectionStart;
			var end=textarea.selectionEnd;
			textarea.value=textarea.value.substr(0,start)+text+textarea.value.substr(end);
			textarea.setSelectionRange(start+text.length,start+text.length);
		}
		else
		{
			textarea.value+=text+" ";
		}
		textarea.focus();
	}
}

// used to highlight a particular post on a thread page
// MAY NOT BE BEING USED
function highlight(post)
{
	var cells=document.getElementsByTagName("td");
	for(var i=0;i<cells.length;i++)
	{
		if(cells[i].className=="highlight")
		{
			cells[i].className="reply";
		}
	}

	var reply=document.getElementById("reply"+post);
	if(reply)
	{
		reply.className="highlight";
/*		var match=/^([^#]*)/.exec(document.location.toString());
		document.location=match[1]+"#"+post;*/
		return false;
	}

	return true;
}

function change_font(object,newfont)
{
	object.style.fontFamily = newfont;
}

function file_input_change(file_object)
{
    var font_menu = document.getElementById("font_menu");
    var backcolor = document.getElementById("backcolor");
    var textcolor = document.getElementById("textcolor");

    if(file_object.value == "")
    {
        if(font_menu)
        {
            font_menu.disabled=false;
        }
        if(backcolor)
        {
            backcolor.disabled=false;
        }
        if(textcolor)
        {
            textcolor.disabled=false;
        }
    }
    else
    {
        if(font_menu)
        {
            font_menu.disabled=true;
        }
        if(backcolor)
        {
            backcolor.disabled=true;
        }
        if(textcolor)
        {
            textcolor.disabled=true;
        }
    }
}

// updates the page to show the style sheets available
function display_stylesheets()
{
    var themerefsin = document.getElementById("themerefsin");
    var themerefsout = document.getElementById("themerefsout");
	var links=document.getElementsByTagName("link");
    var themes="";
	for(var i=0;i<links.length;i++)
	{
		var rel=links[i].getAttribute("rel");
		var title=links[i].getAttribute("title");
		if(rel.indexOf("style")!=-1&&title)
        {
            themes += "<a class='menu_themes' title='Click here to change the theme (style) of the pages on this site to "+title+"' href='javascript:set_stylesheet(\""+title+"\")'>"+title+"</a> ";
        }
	}

    if(themerefsin)
    {
        themerefsin.innerHTML=themes;
    }
    if(themerefsin)
    {
        themerefsout.innerHTML=themes;
    }
}

// sets the current style sheet to the one supplied to the function, also sets a cookie to keep track of the current style
function set_stylesheet(styletitle,norefresh)
{
	set_cookie("style",styletitle,365);

	var links=document.getElementsByTagName("link");
	var found=false;
	for(var i=0;i<links.length;i++)
	{
		var rel=links[i].getAttribute("rel");
		var title=links[i].getAttribute("title");
		if(rel.indexOf("style")!=-1&&title)
		{
			links[i].disabled=true; // IE needs this to work. IE needs to die.
			if(styletitle==title) 
			{ 
				links[i].disabled=false; 
                found=true; 
			}
		}
	}
	if(!found) set_preferred_stylesheet();

}

// sets the default style sheet, and relists all the style sheets available
function set_preferred_stylesheet()
{
	var links=document.getElementsByTagName("link");
	for(var i=0;i<links.length;i++)
	{
		var rel=links[i].getAttribute("rel");
		var title=links[i].getAttribute("title");
		if(rel.indexOf("style")!=-1&&title)
		{
			links[i].disabled=(rel.indexOf("alt")!=-1);
		}
	}
}

// returns the name of the currently selected style sheet (from the page, not from a cookie)
function get_active_stylesheet()
{
	var links=document.getElementsByTagName("link");
	for(var i=0;i<links.length;i++)
	{
		var rel=links[i].getAttribute("rel");
		var title=links[i].getAttribute("title");
		if(rel.indexOf("style")!=-1&&title&&!links[i].disabled)
		{
			return title;
		}
	}
	return null;
}

// returns the name of the preffered style sheet (from the page, not from a cookie)
function get_preferred_stylesheet()
{
	var links=document.getElementsByTagName("link");
	for(var i=0;i<links.length;i++)
	{
		var rel=links[i].getAttribute("rel");
		var title=links[i].getAttribute("title");
		if(rel.indexOf("style")!=-1&&rel.indexOf("alt")==-1&&title)
		{
			return title;
		}
	}
	return null;
}

// shows a prompt to give a reason for applying a ban
function do_ban(el)
{
	var reason=prompt("Give a reason for this ban:");
	if(reason)
    {
        document.location=el.href+"&comment="+encodeURIComponent(reason);
	}
    return false;
}

// log out
function logout()
{
    var loggedin = document.getElementById("loggedin"); 
    var loggedout = document.getElementById("loggedout"); 
    var eulm = document.getElementById("eulm"); 
    var eulm_l = document.getElementById('eulm_l');

    set_cookie('name','','');
    set_cookie('sessionid','','');

    if(loggedin)
    {
        loggedin.style.display="none"; 
    }
    if(loggedout)
    {
        loggedout.style.display="block"; 
    }
    
    if(eulm)
    {
        eulm.style.display="none"; 
    }
    if(eulm_l)
    {
        eulm_l.href='';
    }
}

function set_avatar(avatar_type,avatar_num)
{
    var set_avatar = document.getElementById("set_avatar"+avatar_type+avatar_num);

    if(set_avatar)
    {
        set_avatar.innerHTML='Setting Avatar...';
    }
    
    // send report to server
    var req = createXMLHttpRequestObject();  
    req.open('GET', '../cgi/set_avatar.cgi?avatar_type='+avatar_type+'&avatar_num='+avatar_num, true);  // send data request
    req.onreadystatechange = function (aEvt)  // wait for answer
    {  
        if(req.readyState == 4)  // we got an answer
        {  
            if(req.status == 200)  // is it good or not
            {
                // we got our data, now make use of it 
                if(req.responseText==1) // reported
                {
                    if(set_avatar)
                    {
                        set_avatar.innerHTML='Avatar Set';
                    }
                }
                else
                {
                    if(set_avatar)
                    {
                        set_avatar.innerHTML='Error';
                    }
                }
            }
            else
            {
                if(set_avatar)
                {
                    set_avatar.innerHTML='Error';
                }
            }
        }  
    }  
    req.send(null);  
}

function report(rep_type,rep_tnum,rep_cnum)
{
    var report = document.getElementById("report"+rep_cnum);

    if(rep_type == 'T')
    {
        var confirm_action = confirm("Do you really want to report this entire thread ?");
    }
    else
    {
        var confirm_action = confirm("Do you really want to report this comment ?");
    }
    
    if(confirm_action == true)
    {
        if(report)
        {
            report.innerHTML='Reporting...';
        }
        
        // send report to server
        var req = createXMLHttpRequestObject();  
        req.open('GET', '../cgi/report.cgi?rep_type='+rep_type+'&rep_tnum='+rep_tnum+'&rep_cnum='+rep_cnum, true);  // send data request
        req.onreadystatechange = function (aEvt)  // wait for answer
        {  
            if(req.readyState == 4)  // we got an answer
            {  
                if(req.status == 200)  // is it good or not
                {
                    // we got our data, now make use of it 
                    if(req.responseText==1) // reported
                    {
                        if(report)
                        {
                            report.innerHTML='Reported';
                        }
                    }
                    else if(req.responseText==2) // deleted
                    {
                        if(report)
                        {
                            report.innerHTML='Deleted';
                        }
                    }
                }
                else
                {
                    if(report)
                    {
                        report.innerHTML='Error';
                    }
                }
            }     
        }  
        req.send(null);  
    }
}

function dbcheck_session()
{
    var logouthref = document.getElementById('logouthref');
    var loggedin = document.getElementById("loggedin"); 
    var loggedout = document.getElementById("loggedout"); 

    // Quickly set the menu based on the cookie settings as checking the database on the server can take a few seconds
    if(get_cookie('sessionid')) // session is good
    {
        // show logged in, but disable log out for now
        if(logouthref)
        {
            logouthref.href='';
        }
        if(loggedin)
        {
            loggedin.style.display="block";
        }
        if(loggedout)
        {
            loggedout.style.display="none";
        }
        
        // now check the database to be certain we are using the right details
        var req = createXMLHttpRequestObject();  
        req.open('GET', '../cgi/check_database.cgi?task=session', true);  // send data request
        req.onreadystatechange = function (aEvt)  // wait for answer
        {  
            if(req.readyState == 4)  // we got an answer
            {  
                if(req.status == 200)  // is it good or not
                {
                    // we got our data, now make use of it 
                    if(req.responseText==1) // session is good 
                    {
                        // logged in, for real now so enable log out again
                        if(logouthref)
                        {
                            logouthref.href='javascript:logout()';
                        }
                        if(loggedin)
                        {
                            loggedin.style.display="block"; 
                        }
                        if(loggedout)
                        {
                            loggedout.style.display="none"; 
                        }
                    }
                    else // session is bad
                    {
                        // logged out
                        logout();
                    }
                }
            }  
        };  
        req.send(null);  
    }
    else // session is bad
    {
        // logged out
        logout();
    }
}

function dbcheck_eulm()
{
    var eulm = document.getElementById("eulm"); 
    var eulm_l = document.getElementById('eulm_l');

    if(get_cookie('sessionid')) // session is good
    {
        var req = createXMLHttpRequestObject();  
        req.open('GET', '../cgi/check_database.cgi?task=eulm', true);  // send data request
        req.onreadystatechange = function (aEvt)  // wait for answer
        {  
            if(req.readyState == 4)  // we got an answer
            {  
                if(req.status == 200)  // is it good or not
                {
                    // we got our data, now make use of it 
                    if(req.responseText!='')
                    {
                        if(eulm)
                        {
                            eulm.style.display="block"; 
                        }
                        if(eulm_l)
                        {
                            eulm_l.href='../'+req.responseText;
                        }
                    }
                    else
                    {
                        if(eulm)
                        {
                            eulm.style.display="none"; 
                        }
                        if(eulm_l)
                        {
                            eulm_l.href='';
                        }
                    }
                }
            }  
        };  
        req.send(null);  
    }
}

function do_sidebar_latest()
{
        var sidebar_latest = document.getElementById("sidebar_latest");

        var req = createXMLHttpRequestObject();  
        req.open('GET', '../include/sidebar_latest.html', true);  // send data request
        req.onreadystatechange = function (aEvt)  // wait for answer
        {  
            if(req.readyState == 4)  // we got an answer
            {  
                if(req.status == 200)  // is it good or not
                {
                    // we got our data, now make use of it 
                    if(req.responseText!='')
                    {
                        if(sidebar_latest)
                        {
                            sidebar_latest.innerHTML=req.responseText;
                            smartColumns('sidebar_latest_container','sidebar_latest_icon_frame','sidebar_count',0,3,5);
                        }
                    }
                    else
                    {
                        if(sidebar_latest)
                        {
                            sidebar_latest.innerHTML='Sidebar Latest Error';
                        }
                    }
                }
            }  
        };  
        req.send(null);  
}

function do_tag_cloud()
{
        var tag_cloud = document.getElementById("tag_cloud");
        var tag_cloud_title = document.getElementById("tag_cloud_title");
        if(document.getElementById("tag_num"))
        {
            var tag_num = document.getElementById("tag_num").innerHTML;
        }

        var req = createXMLHttpRequestObject();  
        if(tag_num > 0)
        {    
            if(tag_cloud_title)
            {
                tag_cloud_title.innerHTML='Thread No. '+tag_num+' Top Tags';
            }
            
            req.open('GET', '../cgi/tag.cgi?task=get_tag&tag_num='+tag_num, true);  // send data request
        }
        else
        {
            if(tag_cloud_title)
            {
                tag_cloud_title.innerHTML='Top Tags Of The Last 7 Days';
            }
            
            req.open('GET', '../include/weekly_taglist.html', true);  // send data request
        }
        req.onreadystatechange = function (aEvt)  // wait for answer
        {  
            if(req.readyState == 4)  // we got an answer
            {  
                if(req.status == 200)  // is it good or not
                {
                    // we got our data, now make use of it 
                    if(req.responseText!='')
                    {
                        if(tag_cloud)
                        {
                            tag_cloud.innerHTML=req.responseText;
                        }
                    }
                    else
                    {
                        if(tag_cloud)
                        {
                            tag_cloud.innerHTML='Tag Cloud Error';
                        }
                    }
                }
            }  
        };  
        req.send(null);  
}

function tagsearch(searchtag)
{
    searchtag.replace(/\\x27/g,'&#39;'); // adjust comma from JS to HTML
    location.href="../../cgi/search.cgi?task=search&searchfor="+searchtag+"&resultpage=0&searchin=threadsubject&searchmethod=searchwholeword&searchby=";
}

function showmessage(icon,title,message)
{
    var msgcont = document.getElementById("msgcont");   
    
    if(msgcont)
    {
        if(message)
        {
            var msghtml = "<div class=\"message_container\">";

            if(icon)
            {
                msghtml += "<span class=\"message_icon\"><img src=\""+icon+"\" height=\"50\" width=\"50\"></span>";
            }
            if(title)
            {
                msghtml += "<span class=\"message_title\">"+title+"<br/></span>";
            }   
            if(message)
            {
                msghtml += "<span class=\"message_message\">"+message+"</span>";
            }
    
            msghtml += "</div>";

            msgcont.innerHTML=msghtml;
        }
    }
}

function check_for_cookies()
{
	if(!navigator.cookieEnabled)
    {
        alert('You appear to have cookies turned off. This website requires the use of cookies.');
    }
}

function updateClock ( )
{
    var currentTime = new Date();

    var day_names = new Array ( );
    day_names[day_names.length] = "Sunday"; 
    day_names[day_names.length] = "Monday";
    day_names[day_names.length] = "Tuesday";
    day_names[day_names.length] = "Wednesday";  
    day_names[day_names.length] = "Thursday";   
    day_names[day_names.length] = "Friday";
    day_names[day_names.length] = "Saturday";

    var currentDay = day_names[currentTime.getUTCDay ( )];
    var currentDate = currentTime.getUTCDate ( );
    var currentMonth = currentTime.getUTCMonth ( ) + 1;
    var currentYear = currentTime.getUTCFullYear ( );
    var currentHours = currentTime.getUTCHours ( );
    var currentMinutes = currentTime.getUTCMinutes ( );
    var currentSeconds = currentTime.getUTCSeconds ( );

    // Pad the minutes and seconds with leading zeros, if required
    currentMinutes = ( currentMinutes < 10 ? "0" : "" ) + currentMinutes;
    currentSeconds = ( currentSeconds < 10 ? "0" : "" ) + currentSeconds;

    // Choose either "AM" or "PM" as appropriate
    var timeOfDay = ( currentHours < 12 ) ? "AM" : "PM";

    // Convert the hours component to 12-hour format if needed
    currentHours = ( currentHours > 12 ) ? currentHours - 12 : currentHours;

    // Convert an hours component of "0" to "12"
    currentHours = ( currentHours == 0 ) ? 12 : currentHours;

  // Compose the string for display
  var currentDateString = currentDay + " " + currentDate + "/" + currentMonth + "/" + currentYear;
  var currentTimeString = currentHours + ":" + currentMinutes + ":" + currentSeconds + " " + timeOfDay;

  // Update the date & time display
  var date_element = document.getElementById("date");
  var time_element = document.getElementById("time")
  
  if(date_element)  
  {
    date_element.firstChild.nodeValue = currentDateString;
  }
  if(time_element)  
  {
    time_element.firstChild.nodeValue = currentTimeString;
  }
}

//Create a function that calculates the smart columns
function doResize() 
{ 

    if(document.getElementById('index_container'))
    {
        smartColumns('index_container','index_thumb_frame','index_count',2,3,10);
    }
    if(document.getElementById('sidebar_latest_container'))
    {
        smartColumns('sidebar_latest_container','sidebar_latest_icon_frame','sidebar_count',0,3,5);
    }
}

//Create a function that calculates the smart columns
function smartColumns(str_frame,str_item,str_count,min_margin_width,min_margin_height,max_margin_height) 
{ 

    var obj_frame = document.getElementById(str_frame);

    var item_count = ((document.getElementById(str_count).innerHTML));

    var obj_item = new Array(item_count);
    for(var i=0;i<item_count;i++)
    {
        obj_item[i] = document.getElementById(str_item+i);
    }

    if(obj_frame)
    {
        var frame_width = (obj_frame.offsetWidth); //Get the width of row in pixels
    	var item_left_padding = obj_item[0].style.paddingLeft;
    	var item_right_padding = obj_item[0].style.paddingRight;
    	var item_left_padding = (item_left_padding.substr(0,item_left_padding.length-2))*1;
    	var item_right_padding = (item_right_padding.substr(0,item_right_padding.length-2))*1;
        var item_width = Math.floor(((obj_item[0].offsetWidth+(min_margin_width*2))-(item_left_padding+item_left_padding))+1);
        var no_of_col = Math.floor(frame_width / item_width); //Find how many columns can fit per row / then round it down to a whole number
        
        if(no_of_col > 4)
        {
            no_of_col = 4;
        }
        
        var item_padding = Math.floor((frame_width - (item_width * no_of_col)) / (no_of_col));
        var item_padding_extra = Math.floor(((frame_width - ((item_width + item_padding) * no_of_col)) / 2));
        if(item_padding_extra < 0)
        {
            item_padding_extra = 0;
        }
        
        for(var i=0;i<item_count;i++)
        {
            obj_item[i].style.paddingLeft=Math.floor((item_padding/2)+(item_padding_extra)+(min_margin_width))+'px';
            obj_item[i].style.paddingRight=Math.floor((item_padding/2)+(min_margin_width))+'px';

            var margin_height;
            if((item_padding/2)>max_margin_height)
            {
                margin_height=max_margin_height;
            }
            else if((item_padding/2)<min_margin_height)
            {
                margin_height=min_margin_height;
            }
            else
            {
                margin_height=item_padding/2;
            }
            
            obj_item[i].style.paddingTop=margin_height+'px';
            obj_item[i].style.paddingBottom=margin_height+'px';
        }

        // for debugging
        //alert(frame_width+','+obj_item[0].offsetWidth+','+item_left_padding+','+item_right_padding+','+(obj_item[0].offsetWidth-(item_left_padding + item_right_padding))+','+item_width+','+no_of_col+','+item_padding+','+item_padding_extra);
    }
}	

// this function runs when the page unloads, details below
//
// sets the current style in a cookie
//
window.onunload=function(e)
{
	if(style_cookie)
	{
		var title=get_active_stylesheet();
		set_cookie(style_cookie,title,365);
	}
}

// this function runs when the page loads, details below
//
// inserts text in to any relevant text boxes and highlight accordingly
//
window.onload=function(e)
{
	var match;

    updateClock(); 
    setInterval('updateClock()', 1000 );    
    
    display_stylesheets();
    do_sidebar_latest();
    do_tag_cloud();
    check_for_cookies();
    dbcheck_session();
    dbcheck_eulm();
    showmessage(msg_icon,msg_title,msg_message);
    
    var name_element = document.getElementById('name');
    if(name_element)
    {
        name_element.innerHTML=get_cookie('name');
        name_element.href=name_element.href+get_cookie('name');
    }

    doResize();

	if(match=/#i([0-9]+)/.exec(document.location.toString()))
	{
		if(!document.forms.postform.comment.value)
		{
			insert(">>"+match[1]);
		}
	}

	if(match=/#([0-9]+)/.exec(document.location.toString()))
	{
		highlight(match[1]);
	}
}


if(style_cookie)
{
	var cookie=get_cookie(style_cookie);
	var title=cookie?cookie:get_preferred_stylesheet();
	set_stylesheet(title);
}

