function $(s) {
	
	var p = (arguments[1])? arguments[1] : document;
	var t = 'id';
	var n = false;
	
	if(s.match(/^((#|\.)[^\s]+)\s(.+?)$/gi)) {
		return $(RegExp.$3, $(RegExp.$1, p));
	}
	
	if(s.match(/^\.(\w+)(\[(\d)\])?/)) {
		t = 'class';
		s = RegExp.$1;
		if(RegExp.$2 != "") {
			n = parseInt(RegExp.$3);
		}
	} else if(s.match(/^-(\w+)(\[(\d)\])?/)) {
		t = 'tag';
		s = RegExp.$1;
		if(RegExp.$2 != "") {
			n = parseInt(RegExp.$3);
		}
	} else {
		s = s.replace(/(#)/gi, '');
	}

	if(t == 'id') {
		if(p == document) {
			if(p.getElementById(s))
				return p.getElementById(s);
		} else {
			_e = p.getElementsByTagName('*');
			for(i=0; i<_e.length; i++) {
				if(_e[i].id && _e[i].id == s) {
					return _e[i];
				}
			}
		}
	} else if(t == 'class') {
		_elem = Array();
		_e = p.getElementsByTagName('*');
		_r = new RegExp('(^|\\s)' + s + '(\\s|$)', 'i');
		for(i=0; i<_e.length; i++) {
			if(_e[i].className && _e[i].className.match(_r)) {
				_elem.push(_e[i]);
			}
		}
		if(n !== false) {
			return _elem[n];
		}
		return _elem;
	} else if(t == 'tag') {
		_elem = p.getElementsByTagName(s);
		if(n !== false) {
			return _elem[n];
		}
		return _elem;
	}
	// Tag
	
	// Name
	
	return false;
}
window.onload = function() {
	get_viewport_size();
	
	/* Breadcrumbs */
	if(breadcrumb_trail.length > 0 && $('#breadcrumbs')) {
		breadcrumb_str = "";
		for(b=0; b<breadcrumb_trail.length; b++) {
			breadcrumb_str += " &#187; <a href=\""+ breadcrumb_trail[b][0] +"\">"+ breadcrumb_trail[b][1] +"</a>";
		}
		$('#breadcrumbs').innerHTML += breadcrumb_str;
	}
	
	/* Trigger Menu Drag */
	var ul = document.getElementsByTagName('ul');
	for(i=0; i<ul.length; i++) {
		if(ul.item(i).className && ul.item(i).className.match(/sortable/i)) {
			DragDrop.makeListContainer(ul.item(i));
			ul.item(i).onDragOver = function() { this.style["background"] = "#EEF"; };
			ul.item(i).onDragOut = function() {this.style["background"] = "none"; };
		}
	}
	
	var textarea = $('-textarea');
	for(t=0; t<textarea.length; t++) {
		if(textarea[t].className && textarea[t].className == 'mini_ckeditor') {
			CKEDITOR.replace(textarea[t].id, {
				toolbar_Full: [
					['Bold', 'Italic', 'Underline', 'Strike', 'TextColor', '-', 'JustifyLeft', 'JustifyCenter', '-', 'BulletedList', '-', 'SpecialChar', '-', 'Copy', 'Paste', 'PasteFromWord'],
					'/',
					['Link','Unlink', '-', 'Image'],
					['Undo', 'Redo', '-', 'SelectAll', 'RemoveFormat', '-', 'Source'],
					['About']
				],
				removePlugins: 'elementspath',
				width: 350,
				height: 100
			});
		}
	}
}
var breadcrumb_trail = new Array();

function getStyle(x, styleProp) {
	if (x.currentStyle)
		var y = x.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
	return y;
}

var sm = false;
var n = 0;
function scroll_menu_start() {
	menu = $('#side_menu');
	// menu.className = 'open';
	
	// work out the height
	
	h = 0 - ($('#side_menu_content').offsetHeight);
	
	h += viewport_height;
	
	// Padding / Positioning
	h -= 91;
	h -= 40;
	h -= 5;
	
	// alert(h);
	
	// What about accounting for window scroll?
	
	// Scroll Box Position/Display on larger screens / when already scrolled down the page...
	
	y = (arguments[0])? arguments[0] : -3;
	t = (arguments[1])? arguments[1] : 75;
	scroll_menu_do(y, t);
}

function scroll_menu_reset() {
	menu_content = $('#side_menu_content');
	
	if(getStyle(menu_content, 'display') == 'none') {
		menu_content.style.marginTop = '0px';
		n = 0;
		
		// Hide "Up" Action Box ?
		
		// Re-Set the whole Position
		menu = $('#side_menu');
		menu.style.position = 'absolute';
		menu.style.top = '41px';
	}
}

function scroll_menu_stop() {
	window.clearTimeout(sm);
}

function scroll_menu_do(y, t) {
	n += y;
	if((n < h && y < 0) || (n > 0 && y > 0)) {
		// Break...
		if(y < 0) {
			n = h;
		} else {
			n = 0;
		}
	} else {
		menu = $('#side_menu_content');
		menu.style.marginTop = n +'px';
		sm = window.setTimeout('scroll_menu_do('+ y +', '+ t +')', t);
	}
}

function set_menu_position() {
	
	// Get Mouse Position...
	
	menu = $('#side_menu');
	menu.style.top = '0px';
	menu.style.position = 'fixed';
	
}

function insert_popup_value(v, t) {
	window.parent.document.getElementById(t).value = v;
	if(window.parent.document.getElementById(t).onchange) {
		window.parent.document.getElementById(t).onchange();
	}
	return !window.parent.close_facebox();
}

/* Search/Filter/Sort Results */
function search_pages(form) {
	if(typeof form == "string") {
		var search_str = form;
	} else {
		var search_str = form.search_str.value;
	}
	search_str = search_str.replace(/\s+or\s+/gi, '|');
	search_str = search_str.replace(/\*/g, '.+?');

	var negative_searches = Array();
	if(search_str.match(/"/i)) {
		search_phrase = true;
		var search_terms = Array();
		while(search_str.match(/(\!)?"([^"]+)"/i)) {
			search_terms.push(RegExp.$1 + RegExp.$2);
			search_str = search_str.replace(/"[^"]+"/i, "")
		}
	} else {
		var search_terms = search_str.split(/\s/g);
	}
	for(i in search_terms) {
		if("undefined" != typeof search_terms[i]) {
			if(search_terms[i].match(/^\!(.+?)$/)) {
				search_terms[i] = RegExp.$1;
				negative_searches[i] = true;
			} else {
				negative_searches[i] = false;
			}
			search_terms[i] = new RegExp(search_terms[i], 'i');
		}
	}
	
	var pages = $('view').getElementsByTagName('tr');
	var row_class = 'one';
	for(i=0; i<pages.length; i++) {
		if(pages[i].className == 'heading') {
			row_class = 'one';
		} else {
			var page_details = pages[i].getElementsByTagName('td');
			var matching_all = true;
			for(t in search_terms) {
				str = page_details[1].innerHTML;
				negative_search = negative_searches[t];
				if(negative_search) {
					if(str.match(search_terms[t])) {
						matching_all = false;
						break;
					}
				} else {
					if(!str.match(search_terms[t])) {
						matching_all = false;
						break;
					}
				}
			}
			if(matching_all) {
				pages[i].style.display = '';
				pages[i].className = row_class;
				row_class = (row_class == 'one')? 'two' : 'one';
			} else {
				pages[i].style.display = 'none';
				
			}
		}
	}
	
	/* No Results Found */
	
	return true;
}
function reset_search(form) {
	form.search_str.value = '';
	search_pages(form);
}
function sort_order(id, dir) {
	d = new Date();
	d.setYear(d.getYear() + 1);
	document.cookie = 'sort='+ id + ':' + dir +'; path=/; expires=' + d;
	window.location.reload(true);
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

function url_equal(url1, url2) {
	url1 = url1.replace(/(^https?:\/\/|<\/?multi_domain_\d+>)/g, '');
	url1 = url1.replace(/(^\/+|\/+$)/g, '');
	url2 = url2.replace(/(^https?:\/\/|<\/?multi_domain_\d+>)/g, '');
	url2 = url2.replace(/(^\/+|\/+$)/g, '');
	if(url1 == url2) {
		return true;
	}
	return false;
}

function set_url_value(id, value, display) {
	value_id = id.replace(/\]-display$/, ']');
	display_id = value_id + '-display';
	if(value !== false) {
		// Multi-Domain Bits...
		for(d in multi_domains) {
			dom = multi_domains[d].replace(/^https?:\/\//, '');
			value = value.replace(multi_domains[d], '<multi_domain_' + d + '>');
			value = value.replace(dom, '<multi_domain_' + d + '>');
		}
		$(value_id).value = value;
	}
	if(display) {
		if(arguments[3]) {
			display = display.replace(/^https?:\/\//i, '');
		}
		$(display_id).value = display;
	}
}

var last_obj = false;
function lookup_url(id, obj, blur) {
	eval('if("undefined" != typeof(url_timeout_' + id + ')) { window.clearTimeout(url_timeout_' + id + '); }');
	if(!obj) {
		obj = last_obj;
	}
	last_obj = obj;
	show_all = (arguments[3])? true : false;
	if(obj) {
		search_str = new RegExp(obj.value.replace(/^https?:\/\//i, ''), 'i');
		if(1 || show_all) {
			var exact_matches = new Array();
			var possible_urls = 0;
			div = $('#'+ id +' -div');
			for(i=0; i<div.length; i++) {
				href_parts = div[i].firstChild.innerHTML.split(/\|/g);
				var matches = false;
				for(h=0; h<href_parts.length; h++) {
					if(href_parts[h] && href_parts[h].match(search_str) || show_all) {
						matches = true;
						if(blur) {
							if(url_equal(href_parts[h], obj.value) && obj.value != "") {
								exact_matches.push(div[i]);
							}
						} else {
							break;
						}
					}
				}
				if(matches) {
					possible_urls++;
					div[i].style.display = 'block';
					div[i].onclick = function() { set_url_value(obj.id, this.firstChild.innerHTML.split("|")[0], this.title, true); }
				} else {
					div[i].style.display = 'none';
				}
			}
		} else {
			$('#' + id).style.display = 'none';
			set_url_value(obj.id, false, false);
			return;
		}

		$('#' + id).style.display = 'none';
		is_correct = false;
		if(blur) {
			if(exact_matches.length > 0) {
				is_correct = true;
				if(exact_matches.length == 1) {
					set_url_value(obj.id, exact_matches[0].firstChild.innerHTML.split("|")[0], exact_matches[0].title);
				} else {
					set_url_value(obj.id, exact_matches[0].firstChild.innerHTML.split("|")[0], exact_matches[0].title);
				}
			}
		} else if(possible_urls > 0) {
			is_correct = true;
			$('#' + id).style.display = 'block';
			holder_position = findPos(obj);
			$('#' + id).style.top = (holder_position[1] + 21) + 'px'; 
			$('#' + id).style.left = (holder_position[0] + 4) + 'px'; 
		}
		if(is_correct || obj.value == "") {
			obj.style.borderColor = '#4A7022';
			obj.style.borderStyle = 'solid';
			obj.style.borderWidth = '1px';
			if(obj.value == "") {
				set_url_value(obj.id, obj.value, false);
			}
		} else {
			obj.style.borderColor = '#cc0000';
			obj.style.borderStyle = 'solid';
			obj.style.borderWidth = '1px';
			set_url_value(obj.id, obj.value, false);
		}
	}
}
