	function get(id, flag, obj) {
		var obj = ("undefined" != typeof obj)? obj : document;
		if(flag == 'id')
			return obj.getElementById(id);
		if(flag == 'tag')
			return obj.getElementsByTagName(id);
		if(flag == 'name')
			return obj.getElementsByName(id);
		if(flag == 'class') {
			if(obj.getElementsByClassName) {
				return obj.getElementsByClassName(id);
			}
			var _elems = new Array(); var _e = 0;
			var all_elems = obj.getElementsByTagName('*');
			var class_regex = new RegExp('(^|\\\s)'+ id +'(\\\s|$)', 'i');
			for(i=0; i<all_elems.length; i++) {
				if(all_elems.item(i).className && all_elems.item(i).className.match(class_regex)) {
					_elems[_e++] = all_elems.item(i);
				}
			}
			return _elems;
		}
	}
	var TAG = 'tag'; var ID = 'id'; var NAME = 'name'; var CLASS = 'class';
		
	function get_position(id) {
		var top = 0;
		var left = 0;
		if(typeof id == "string")
			var obj = get(id, 'id');
		else if(typeof id == "object")
			var obj = id;
		else
			var obj = get('forum', 'id');
		if (obj.offsetParent) {
			left = obj.offsetLeft;
			top = obj.offsetTop;
			while (obj = obj.offsetParent) {
				left += obj.offsetLeft;
				top += obj.offsetTop;
			}
		}
		return Array(top, left);
	}
	
	function show_hide(id) {
		if(obj = document.getElementById(id)) {
			if(arguments[1]) {
				if(arguments[1] == 'auto')
					arguments[1] = "";
				obj.style.display = arguments[1];
			} else {
				obj.style.display = (obj.style.display == 'none')? 'block' : 'none';
			}
		}
	}
	function close_box(id) {
		document.getElementById(id).style.display = 'none';
	}
	
	function show_box(id, position1, position2) {
		if(get(position1, ID))
			var pos = get_position(position1);
		else
			var pos = get_position(position2);
		var obj = document.getElementById(id);
		obj.style.display = 'block';
		obj.style.position = 'absolute';
		obj.style.zIndex = 2000;
		obj.style.top = pos[0] + 'px';
		obj.style.left = pos[1] + 'px';
	}

	function ajax_box() {
		if(get('ajax_box', ID)) {
			get('ajax_box', ID).style.display = "";
			get('ajax_box', ID).innerHTML = "";
		} else {
			var holder = document.createElement('div');
			holder.id = 'ajax_box';
			document.body.appendChild(holder);
		}
		return get('ajax_box', ID);
	}

	var vf_tip = false;
	var vf_tt = false;
	var vf_ttimer = false;

	function enable_tip() {
		vf_tip = true;
		return true;
	}

	function tip(obj, txt) {
		vf_tt = get("tooltip", ID);
		vf_tt.innerHTML = txt;
		vf_ttimer = setTimeout('enable_tip()',400);
		var a = obj.getElementsByTagName('a');
		for(i=0; i<a.length; i++) {
			a.item(i).removeAttribute('title');
		}
		return false;
	}

	function ietruebody() {
		return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
	}

	function positiontip(e) {
		if(vf_tip) {
			var curX = ("undefined" != typeof e)? e.pageX : event.clientX + ietruebody().scrollLeft;
			var curY = ("undefined" != typeof e)? e.pageY : event.clientY + ietruebody().scrollTop;
			vf_tt.style.left = (curX - 20) + "px";
			vf_tt.style.top = (curY + 17) + "px";
			vf_tt.style.display = "block";
		}
	}

	function close_tip() {
		vf_tip = false;
		clearTimeout(vf_ttimer);
		vf_tt.style.display = "none";
	}
	
	document.onmousemove = positiontip;

	vf_characters_allowed = 20000;
	vf_characters_field = false;
	function check_message_length() {
		var allowed_characters = vf_characters_allowed;
		var field = (vf_characters_field)? vf_characters_field : document.post_form.message;
		var user_characters = field.value.length;
		var characters_left = allowed_characters - user_characters;
		if(characters_left < 0) {
			field.value = field.value.substr(0, (allowed_characters - 1));
			characters_left = 0;
		}
		document.getElementById('characters_left').innerHTML = characters_left;
	}

	function add_poll_options() {
		var total_to_add =  parseInt(document.post_form.options_to_add.value);
		if(!isNaN(total_to_add) && (current_options + total_to_add) <= max_options) {
			var options_table = document.getElementById('poll_options');
			var new_option_count = 0;
			while(new_option_count < total_to_add) {
				var option_number = new_option_count + current_options + 1;
				var new_input = document.createElement('input');
				new_input.type = 'text';
				new_input.size = 36;
				new_input.maxlength = 40;
				new_input.name = 'poll_option' + option_number;
				var new_font = document.createElement('font');
				new_font.size = '2';
				new_font.appendChild(document.createTextNode('Option '+ option_number +': '));
				new_font.appendChild(new_input);
				var new_cell = options_table.insertRow(-1).insertCell(-1);
				new_cell.width = '100%';
				new_cell.appendChild(new_font);
				new_option_count++;
			}
			current_options += total_to_add;
		}
		document.post_form.options_to_add.value = 0;
		return true;
	}

	function doMail(h, u) {
		document.write('<a href="mailto:'+u+'@'+h+'">'+u+'@'+h+'</a>');
	}

	function disable() {
		var input = document.getElementsByTagName('input');
		for(i = 0; i<input.length; i ++) {
			if(input.item(i).type == "button" || input.item(i).type == "submit" || input.item(i).type == "reset") {
				input.item(i).style.display  = 'none';
				input.item(i).style.visibility  = 'hidden';
			}
		}
		return true;
	}
	function check_all(req, obj) {
		req = new RegExp(req);
		checkboxes = get('input', TAG);
		for(i=0; i<checkboxes.length; i++) {
			if(checkboxes.item(i).type == 'checkbox' && checkboxes.item(i).name.match(req)) {
				if(obj.checked) {
					checkboxes.item(i).checked = true;
				} else {
					checkboxes.item(i).checked = false;
				}
			}
		}
	}
	function deselect_code(n) {
		var ta = document.getElementById('code-' + n);
		var da = document.getElementById('numcode-' + n);
		da.style.display = 'block';
		ta.style.display = 'none';
	}

	function select_code(n) {
		var ta = document.getElementById('code-' + n);
		var da = document.getElementById('numcode-' + n);
		da.style.display = 'none';
		ta.style.display = 'block';
		ta.focus();
		ta.select();
	}
	
	var vf_stickied = 0;
	function sticky_unsticky(a, mode, url) {
		if(vf_stickied)	{
			mode = vf_stickied;
		}
		if(mode == 1) {
			vf_stickied = 2;
			if(a.firstChild && a.firstChild.alt) {
				a.firstChild.alt = 'Unsticky Topic';
				a.firstChild.src= '/images/global_image.php?image=unsticky_topic&skin=' + vf_skin + "&db=" + vf_conn;
			} else {
				a.innerHTML = 'Unsticky Topic';
			}
			dataRequest(url);
		} else {
			vf_stickied = 1;
			if(a.firstChild && a.firstChild.alt) {
				a.firstChild.alt = 'Sticky Topic';
				a.firstChild.src= '/images/global_image.php?image=sticky_topic&skin=' + vf_skin + "&db=" + vf_conn;
			} else {
				a.innerHTML = 'Sticky Topic';
			}
			dataRequest(url + '/type/2');
		}
	}
	var vf_locked = 0;
	function lock_unlock(a, mode, url) {
		if(vf_locked)	{
			mode = vf_locked;
		}
		if(mode == 1) {
			vf_locked = 2;
			if(a.firstChild && a.firstChild.alt) {
				a.firstChild.alt = 'Unlock Topic';
				a.firstChild.src= '/images/global_image.php?image=unlock_topic&skin=' + vf_skin + "&db=" + vf_conn;
			} else {
				a.innerHTML = 'Unlock Topic';
			}
			dataRequest(url);
		} else {
			vf_locked = 1;
			if(a.firstChild && a.firstChild.alt) {
				a.firstChild.alt = 'Lock Topic';
				a.firstChild.src= '/images/global_image.php?image=lock_topic&skin=' + vf_skin + "&db=" + vf_conn;
			} else {
				a.innerHTML = 'Lock Topic';
			}
			dataRequest(url + '/type/2');
		}
	}
	function pm_buddy(select, input) {
		var buddy = select.options[select.selectedIndex].value;
		if(!input.value.match(new RegExp('(^|,)'+buddy+'(,|$)'))) {
			if(input.value != '' && !input.value.match(/,$/)) {
				input.value += ",";
			}
			input.value += buddy;
		}
		select.selectedIndex = 0;
	}
	function scroll_to(obj_id) {
		if(get(obj_id, ID)) {
			var pos = get_position(obj_id);
			window.scroll(0, pos[0]);
		}
	}
	/* Pagination */
	function page_change(button, direction, prefix, cur, max, show) {
		page_var = ("undefined" != typeof arguments[6])? arguments[6] : 'page';
		var current_page = (location.href.match(new RegExp('page\/([0-9]+)(\/|$|#)')))? RegExp.$1 : 1;
		spacer = "&nbsp;";
		if(direction == 'down') {
			cur -= 2;
		} else if(direction == 'up') {
			cur += 2;
		}
		if(cur <= 0)
			cur = 1;
		else if(cur >= max)
			cur = max ;
		var new_page_str = "";
		for(b=0; b<show; b++) {
			n = cur - b - 1;
			if(n > 0) {
				current_page_str = (current_page == n)? ' class="current_page"' : '';
				if(n == 1) {
					new_page_str = "<a href=\""+ prefix +"\""+ current_page_str +">"+ n +"</a>" + spacer + new_page_str;
				} else if(page_var == 'p') {
					new_page_str = "<a href=\""+ prefix +"/"+ page_var + n +"\""+ current_page_str +">"+ n +"</a>" + spacer + new_page_str;
				} else {
					new_page_str = "<a href=\""+ prefix +"/"+ page_var +"/"+ n +"\""+ current_page_str +">"+ n +"</a>" + spacer + new_page_str;
				}
			}
		}
		current_page_str = (current_page == cur)? ' class="current_page"' : '';
		if(cur == 1) {
			new_page_str += "<a href=\""+ prefix +"\""+ current_page_str +">"+ cur +"</a>";
		} else if(page_var == 'p') {
			new_page_str += "<a href=\""+ prefix +"/"+ page_var + cur +"\""+ current_page_str +">"+ cur +"</a>";
		} else {
			new_page_str += "<a href=\""+ prefix +"/"+ page_var +"/"+ cur +"\""+ current_page_str +">"+ cur +"</a>";
		}
		for(b=0; b<show; b++) {
			n = cur + b + 1;
			if(n <= max) {
				current_page_str = (current_page == n)? ' class="current_page"' : '';
				if(page_var == 'p') {
					new_page_str += spacer +"<a href=\""+ prefix +"/"+ page_var + n +"\""+ current_page_str +">"+ n +"</a>";
				} else {
					new_page_str += spacer +"<a href=\""+ prefix +"/"+ page_var +"/"+ n +"\""+ current_page_str +">"+ n +"</a>";
				}
			}
		}
		if(cur > (show + 1)) {
			new_page_str = "<a onclick=\"page_change(this, 'down', '"+ prefix +"', "+ cur +", "+ max +", "+ show +", '"+ page_var +"');\" style=\"cursor: pointer;\" title=\"Lower Pages\" class=\"lower_pages\">&#171;</a>" + spacer + new_page_str;
		}
		if(cur < (max - show)) {
			new_page_str += spacer + "<a onclick=\"page_change(this, 'up', '"+ prefix +"', "+ cur +", "+ max +", "+ show +", '"+ page_var +"');\" style=\"cursor: pointer;\" title=\"Higher Pages\"class=\"higher_pages\">&#187;</a>";
		}
		if(max > 5) {
			new_page_str += spacer + "<a onclick=\"page_jump(this, '"+ prefix +"', "+ max +", '"+ page_var +"');\" style=\"cursor: pointer;\" title=\"Jump to Page\" class=\"jumpt_to_page\">&bull;</a>";
		}
		button.parentNode.innerHTML = new_page_str;
	}
	function page_jump(obj, prefix, max_pages, page_var) {
		if(get('page_jump_form', ID)) {
			show_hide('ajax_box');
			return false;
		}
		if(typeof obj != "object") {
			obj = get(obj, ID);
		}
		var holder = ajax_box();
		var pos = get_position(obj);
		holder.style.width = '85px';
		holder.style.top = (pos[0] + obj.offsetHeight + 2)+'px';
		holder.style.left = (pos[1] - 97 + obj.offsetWidth)+'px';
		form_str = "<form name=\"page_jump_form\" id=\"page_jump_form\" onsubmit=\"return page_jump_submit('"+ prefix +"', '"+ page_var +"', "+ max_pages +");\" style=\"font-size: 11px;\"><span><div class=\"title\">Go to Page:<br /></div><input type=\"text\" name=\"page_number\" id=\"page_number\" style=\"width: 40px;\" /><input type=\"button\" onclick=\"page_jump_submit('"+ prefix +"', '"+ page_var +"', "+ max_pages +");\" value=\"Go\" style=\"padding: 0px;\" /></span>";
		form_str += "</form>";
		holder.innerHTML = form_str;
	}
	function page_jump_submit(prefix, page_var, max_pages) {
		page = get('page_number', ID).value;
		if(page == '') {
			return show_hide('ajax_box');
		}
		page = parseInt(page);
		if(isNaN(page) || page > max_pages || page < 1) {
			alert('Please enter a valid page number between 1 and ' + max_pages);
		} else {
			if(page != 1) {
				prefix += '/' + page_var + '/' + page;
			}
			location.href = prefix;
		}
		return false;
	}
	
	/* Inline Board Search */
	function search_board(obj, board_id) {
		if(typeof obj != "object") {
			obj = get(obj, ID);
		}
		var holder = ajax_box();
		var pos = get_position(obj);
			holder.style.width = '200px';
			holder.style.top = (pos[0] + obj.offsetHeight + 2)+'px';
			holder.style.left = (pos[1] - 200 + obj.offsetWidth)+'px';
			form_str = "<form name=\"search_popup_form\" method=\"post\" action=\"/action/search\" style=\"width: 200px; float: left;\"><input type=\"hidden\" name=\"board-"+ board_id +"\" value=\"1\"/><span style=\"float: left;\"><span class=\"title\">Search Board</span><br /><input type=\"text\" name=\"search_words\" /><input type=\"submit\" value=\"Search\" /><input type=\"button\" value=\"Cancel\" onclick=\"show_hide('ajax_box');\" /></span>";
			form_str += "</form>";
			holder.style.width = '400px';
			form_str += "<form name=\"topic_order_form\" method=\"post\" action=\"\" style=\"width: 200px; float: left;\"><span style=\"float: left;\"><span class=\"title\">Sort Topics</span><br /><select name=\"order\"><option value=\"\">Sort by</option><option value=\"subject\">Subject</option><option value=\"author\">Author</option><option value=\"started\">Date Started</option><option value=\"replies\">Total Replies</option><option value=\"views\">Total Views</option><option value=\"rating\">Topic Rating</option></select><select name=\"dir\"><option value=\"asc\">Asc.</option><option value=\"desc\">Desc.</option></select><br /><input type=\"submit\" value=\"Sort\" /><input type=\"button\" value=\"Cancel\" onclick=\"show_hide('ajax_box');\" /></span>";

			holder.innerHTML = form_str;
		return false;
	}
	
	/* Topic Ratings */
	function enable_rating(obj) {
		stars = obj.getElementsByTagName('img');
		for(s=0; s<stars.length; s++) {
			stars[s].title = 'Vote '+ (s + 1) +' Star' + ((s > 0)? 's' : '');
			stars[s].style.cursor = 'pointer';
			stars[s].onmouseover = function() {
				if(!this.orig_src)
					this.orig_src = this.src;
				this.src = rating_stars[0];
				walker = this;
				while(walker.previousSibling) {
					walker = walker.previousSibling;
					if(walker.nodeName.toLowerCase() == 'img') {
						if(!walker.orig_src)
							walker.orig_src = walker.src;
						walker.src = rating_stars[0];
					}
				}
				return false;
			};
			stars[s].onmouseout = function() {
				if(this.orig_src)
					this.src = this.orig_src;
				walker = this;
				while(walker.nextSibling) {
					walker = walker.nextSibling;
					if(walker.nodeName.toLowerCase() == 'img') {
						if(walker.orig_src)
							walker.src = walker.orig_src;
					}
				}
				walker = this;
				while(walker.previousSibling) {
					walker = walker.previousSibling;
					if(walker.nodeName.toLowerCase() == 'img') {
						if(walker.orig_src)
							walker.src = walker.orig_src;
					}
				}
				return false;
			};
			stars[s].vote = (s+1);
			stars[s].onclick = function() { cast_rating_vote(this, this.vote); };
		}
	}
	function cast_rating_vote(obj, r) {
		topic = (location.href.match(/\/topic\/(\d+)(\/|$|#)/i))? RegExp.$1 : ((location.href.match(/http:\/\/[^\/]+\/(\w|-|\.)+\/(\d+)(\/|$|#)/i))? RegExp.$2 : 0);
		dataRequest("/action/topic_rating/topic/"+ escape(topic) +"/rating/"+ escape(r));
	}
	function update_rating_scrore(s) {
		stars = get('img', TAG, get('topic_rating', ID));
		for(c=0; c<stars.length; c++) {
			if(c < s) {
				stars[c].src = rating_stars[1];
			} else {
				stars[c].src = rating_stars[2];
			}
			stars[c].onmouseover = function() { return false; }
			stars[c].onmouseout = function() { return false; }
		}
		get('topic_rating', ID).onmouseover = function() { return false; }
	}
	function view_raters(obj) {
		if(typeof obj != "object") {
			obj = get(obj, ID);
		}
		var holder = ajax_box();
		var pos = get_position(obj);
		holder.innerHTML = get('topic_raters', ID).innerHTML;
		holder.style.width = '220px';
		holder.style.top = (pos[0] + obj.offsetHeight + 2)+'px';
		holder.style.left = (pos[1] - 20 + obj.offsetWidth)+'px';
	}