// <!--

function create_google_news_search(results, searchForm) {
	var searchOptions = new google.search.DrawOptions();
	google.search.Search.getBranding(document.getElementById("gn_branding"));
	searchOptions.setDrawMode(google.search.SearchControl.DRAW_MODE_TABBED);
	searchOptions.setSearchFormRoot(searchForm);
	var searchControl = new google.search.SearchControl();
	searchControl.addSearcher(new google.search.NewsSearch());
	searchControl.draw(results, searchOptions);
	searchControl.execute("human trafficking");
}

// client-side entry point. daisy_chain is for ugly disgusting but functional chaining of onloads.
function main(daisy_chain) {
	var el = document.getElementById("message");
	if(el != null && el != undefined && el.innerHTML != '') { el.style.display = "block"; }
	if(daisy_chain != undefined) { daisy_chain(); }
	make_goddamn_blue_bottom_go_away();
	enable_banner_hover();
}

function _split_into_basename_plus_extn(s) {
	var k = s.lastIndexOf(".");
	return(new Array(s.substring(0, k), s.substring(k+1, s.length)));
}

function dir(x) {
	var rval = new Array();
	for(blah in x) {
		rval.push(blah);
	}
	return(rval);
}

function _to_hover_image(ev) {
	var img = get_event_source(ev); 
	var fparts = _split_into_basename_plus_extn(img.src);
	if(fparts[0].substr(fparts[0].length-2, 2) != "-h") {
		img.src = fparts[0]+"-h."+fparts[1];
	}
}

function _to_normal_image(ev) {
	var img = get_event_source(ev); 
	var fparts = _split_into_basename_plus_extn(img.src);
	if(fparts[0].substr(fparts[0].length-2, 2) == "-h") {
		img.src = fparts[0].substr(0, fparts[0].length-2)+"."+fparts[1];
	}
}

function get_event_source(ev) {
	if(typeof(event) != "undefined") { return(event.srcElement); } // IE
	return(ev.target); // Firefox et al
}

function add_event_handler(o, event_name, handler) {
	if(o.addEventListener) {
		o.addEventListener(event_name, handler, false);
	} else if(o.attachEvent) {
		o.attachEvent("on"+event_name, handler);
	}
}

function remove_event_handler(o, event_name, handler) {
	if(o.addEventListener) {
		o.removeEventListener(event_name, handler, false);
	} else if(o.attachEvent) {
		o.detachEvent("on"+event_name, handler);
	}
}

function enable_banner_hover() {
	var banner = document.getElementById("banner");
	if (banner) {
		var anchors = banner.getElementsByTagName("a");
		var k,j;
		for(k=0; k < anchors.length; k++) {
			var imgs = anchors[k].getElementsByTagName("img");
			if(imgs.length == 0) continue;
			for(j=0;j<imgs.length;j++) {
				add_event_handler(imgs[j], 'mouseover', _to_hover_image);
				add_event_handler(imgs[j], 'mouseout', _to_normal_image);
			}
		}
	}
}

function news_onload(daisy_chain) {
	google.load("search", "1", { 
		"callback": function() { create_google_news_search(document.getElementById("newsresults"), document.getElementById("news_searchform")); },
		"nocss": true 
	} );
	if(daisy_chain != undefined) { daisy_chain(); }
}

// that's right, we have two *different* ways to do this for IE, and one way for every other browser in
// existence. thanks, MS.
function get_window_dimensions() {
	if (window.innerHeight != undefined) {
		return(new Array(window.innerWidth, window.innerHeight)); // everyone else version
	} else if(document.documentElement.clientHeight != undefined && document.documentElement.clientHeight > 0) {
		// IE6 strict 
		return(new Array(document.documentElement.clientWidth, document.documentElement.clientHeight));
	} else { // IE other.
		return(new Array(document.body.clientWidth, document.body.clientHeight));
	}
}


function get_computed_style(el) {
	var rval = null;
	try {
		if(typeof el.currentStyle != 'undefined') rval = el.currentStyle;
		else rval = document.defaultView.getComputedStyle(el, null);
	} catch(e) {
		/* Debug("get_computed_style barfed"); */
	}
	return(rval);
}

function get_element_dimensions(e) {
	var rval = new Array(-1, -1, -1, -1); 
	if(e.offsetWidth != undefined) { rval[2] = e.offsetWidth; rval[3] = e.offsetHeight; }
	if(e.offsetTop != undefined) { rval[0] = e.offsetLeft; rval[1] = e.offsetTop; }
	return(rval);
}

// FIXME only works on static positioned elements
function get_element_absolute_position(e) {
	var rval = new Array(0, 0);
	while(e != null) {
		if(e.offsetWidth != undefined) {
			rval[0] += e.offsetLeft;
			rval[1] += e.offsetTop;
		}
		e = e.parentNode;
	}
	return rval;
}

function fix_helpout_scroller() {
	document.documentElement.scrollTop = 0;
	document.body.scrollTop = 0;
}

// FIXME those 12 pixels I'm cutting off are totally unaccounted for. I can't find them in any element.
// But if I don't crop them, every page except About creates a vertical scrollbar. I can't find any
// structural distinction between About and everything else, so right now we'll just leave this fucked.
function make_goddamn_blue_bottom_go_away() {
	var windowDims = get_window_dimensions();
	var footer = document.getElementById("footer");
	if(footer) {
		var footerDims = get_element_dimensions(footer);
		var abovefooter = document.getElementById("abovefooter");
		abovefooter.style.minHeight = (windowDims[1] - footerDims[3] - 12)+"px";
	}
}

// logging and utility calls more
CriticalLevel = 0x0001; function Critical(msg) { Log(CriticalLevel, msg); }
ErrorLevel    = 0x0002; function Error(msg) { Log(ErrorLevel, msg); }
WarnLevel     = 0x0004; function Warn(msg) { Log(WarnLevel, msg); }
InfoLevel     = 0x0008; function Info(msg) { Log(InfoLevel, msg); }
TraceLevel    = 0x0010; function Trace(msg) { Log(TraceLevel, msg); }
DebugLevel    = 0x0020; function Debug(msg) { Log(DebugLevel, msg); }
NoiseLevel    = 0x0040; function Noise(msg) { Log(NoiseLevel, msg); }
PerfLevel     = 0x0080; function Perf(msg) { Log(PerfLevel, msg); }

function Log(ll, msg) {
	var gll = ErrorLevel | CriticalLevel | WarnLevel | InfoLevel | DebugLevel | PerfLevel;
	if(typeof(document.globals) != 'undefined') { gll = document.globals.logLevel; }
	if(ll & gll) {
		var el = document.getElementById("debug");
		if(el != null) el.innerHTML += msg + "<br />\n";
	}
}
var re = new RegExp(/^Microsoft Internet Explorer/);
g_InternetExplorer = re.test(navigator.appName); 

function get_style_property_ie(el, prop) { return el.currentStyle[prop]; }
function get_style_property_ff(el, prop) 
{ 
	var s = window.getComputedStyle(el, null);
	var r = s.getPropertyValue(prop); 
	return(r);
}


if(g_InternetExplorer) { get_style_property = get_style_property_ie; } 
else { get_style_property = get_style_property_ff; }

function form_get_data(form) {
	var posttext = "";
	var j, el;
	Trace("+form_get_data");
	for(j = 0; j < form.elements.length; j++) {
		el = form.elements[j];
		if(el == null) continue; // what the hell
		if(el.name == "") continue;
		if(el.type == "file") continue; // do not process file type inputs
		else if(el.type == "checkbox") {
			if(el.checked) {
				posttext += encodeURIComponent(el.name) + "=" + 
					encodeURIComponent(el.value) + "&";
			}
		} else {
			posttext += encodeURIComponent(el.name) + "=" + 
				encodeURIComponent(el.value) + "&";
		}
	}
	if(posttext != "") posttext = posttext.substring(0, posttext.length - 1);
	Noise(" form_get_data: contents: \n"+posttext);
	Trace("-form_get_data");
	return(posttext);
}

function dispatcher_error(o) { 
	Error("Dispatcher Error: "+o.response.errorCode+": "+o.response.message); 
	message(o.response.message);
}

function message(txt) {
	var el = document.getElementById("message");
	if(el) {
		el.innerHTML = txt;
		el.style.display = "block";
	}
}

function spew(o) {
	var s = '';
	for(var x in o) {
		s += x + ", ";
	}
	Debug(s);
}

// -->
