﻿var dbg_off = true;
var dbg_trace = false;
var dbg_error = true;
var dbg_stack = true;

var clicker = false, timer = false;

var testing = document.location.toString().toLowerCase().indexOf("test=true") != -1;

// Cancel bubbling of an event.
function stop_event (evt) {
	enter ("stop_event");
	evt = get_event (evt);
	if (!evt) return leave (false);
	try {evt.cancelBubble = true;} catch(e) {}
	try {evt.returnValue = false;} catch(e) {}
	return leave (false);
}

// Gets the object that fired the event.
function get_obj (evt) {
	return evt && (evt.srcElement || evt.target || false);
}

// Used to digest cookies.
function get_parm(opt, def) {
	if (!opt) return def;
	var s = this.toUpperCase().indexOf(opt.toUpperCase());
	if (s >= 0) s = this.indexOf("=", s);
	if (s < 0) {
		return def;
	} else {
		var l = this.indexOf(";", s);
		if (l < 0) l = this.length;
		return this.substring(s + 1, l);
	}
}
String.prototype.get_parm = get_parm;

// Retrieve a cookie value by name.
function get_cookie (cookie_name, default_value) {
	return document.cookie.get_parm (cookie_name, default_value);
}

// Set a cookie value by name.
function set_cookie (cookie_name, new_value, expires) {
	if (!expires) expires = (new Date((new Date).getUTCFullYear() + 1, 1, 1)).toGMTString();
	document.cookie = cookie_name + "=" + new_value + ";expires=" + expires;
}

// Confirm dialog for event handlers.
function confirm_event(text) {
	var ret = confirm(text);
	if (!ret) stop_event();
	return ret;
}

function getNext (obj, tagName) {
	enter ("getNext");
	tagName = tagName.toLowerCase();
	while (obj && obj != obj.nextSibling)
		if ((obj = obj.nextSibling) && obj.tagName && obj.tagName.toLowerCase() == tagName) return leave (obj);
	leave();
}

function toggleClass (className) {
	enter ("toggleClass");
	if (this.findClass (className))
		return this.removeClass (className);
	else
		return this.addClass (className);
	leave();
}
function findClass (className) {
	enter ("findClass");
	return leave (this && (" " + this + " ").indexOf(" " + className + " ") != -1);
}
function addClass (className ) {
	enter ("addClass");
	return leave (this ? this + " " + className : className);
}
function removeClass (className) {
	enter ("removeClass");
	return leave (this.findClass (className) ? this.replace (className, "").replace ("  ", " ") : this);
}
String.prototype.toggleClass = toggleClass;
String.prototype.findClass = findClass;
String.prototype.addClass = addClass;
String.prototype.removeClass = removeClass;

// Decode a URL string, fixing improper "&" replacements.
function decodeURL (URL) {
	return unescape (URL.replace ("+", " ")).replace ("&", "&");
}

function getFileName (path) {
	enter ("getFileName");
	if (!path) return leave (path);
	var i = path.lastIndexOf ("/") + 1;
	if (i == 0) i = path.lastIndexOf ("\\") + 1;
	var j = path.indexOf ("#") - 1;
	if (j == -2) j = path.indexOf ("?") - 1;
	if (j == -2) j = path.length;
	return leave (path.substr (i, j - i + 1));
}

function resolve_menu() {
	enter ("resolve_menu");
	var obj = false, submenu = false, foundit = false, menu = "";
	if (obj = document.getElementById("noScript")) obj.style.display = "none";
	switch (args["index"]) {
		case "1": menu = document.getElementById("ulVisitorMenu"); break;
		case "2": menu = document.getElementById("ulMemberMenu"); break;
		case "3": menu = document.getElementById("ulAdminMenu"); break;
	}
	if (menu) {
		menu = menu.parentNode;
	} else {
		menu = document.getElementById ("leftNavBar");
		if (menu) menu = menu.getElementsByTagName ("LI");
		if (menu.length) menu = menu[0]; else menu = false;
	}
	if (!menu) return leave (false);
	var links = menu.getElementsByTagName ("A");
	var fileName = decodeURI(getFileName(document.URL).toLowerCase());
	menu.style.display = "block";
	menu.className.addClass("selected");
	for (var i = 0; i < links.length; i++) {
		obj = links.item(i);
//		debug (decodeURI(getFileName(obj.href).toLowerCase()) + " = " + fileName + ":  " + (decodeURI(getFileName(obj.href).toLowerCase()) == fileName));
		if (obj.id != "submenu" && decodeURI(getFileName(obj.href).toLowerCase()) == fileName && (!args["type"] || args["type"] == get_args(obj.href)["type"])) {
			obj.className = obj.className.addClass("selected");
			while (obj != obj.parentNode && (obj = obj.parentNode)) {
				if (obj.tagName == "LI") {
					obj.parentNode.style.display = "block";
					if (submenu = obj.getElementsByTagName ("UL")) submenu = submenu.item(0);
					if (submenu) {
						obj.className = obj.className.addClass ("open");
						submenu.style.display = "block";
					}
				}
			}
			foundit = true;
			break;
		}
	}
	if (!foundit) {
	  if (menu = document.getElementById ("leftNavBar")) menu.style.display = "none";
	  if (obj = document.getElementById ("leftBack")) obj.style.display = "block";
	}
	leave();
}

// Emulate the DOM function for collections.
function getElementById (obj, id) {
	enter ("getElementById");
	with (obj) for (var i = 0; i < length; i++)
		if (item(i).id == id) return leave (item(i));
	return leave (false);
}

// Emulate the DOM function for collections, but return only one item.
function getElementByName (obj, id) {
	enter ("getElementByName");
	with (obj) for (var i = 0; i < length; i++)
		if (item(i).name == id) return leave (item(i));
	return leave (false);
}

// Find the parent node of the type requested.
function getParentNodeByType (obj, tag) {
	enter ("getParentNodeByType");
	for (obj = obj.parentNode; obj && obj != obj.parentNode; obj = obj.parentNode)
		if (obj.tagName == tag) return leave (obj);
	return leave (false);
}

// Cross-browser first child reference (except for text nodes).
function getFirstChild(obj) {
	obj = obj.firstChild;
	while (obj && obj.nodeType != 1 && (obj = obj.nextSibling));
	return obj;
}

// Debug field at bottom of page.
var divdbg;
function dbg (text) {
	var t;
	if (!divdbg) {
		divdbg = document.getElementById("ctl00_dbg");
		divdbg.style.display = "";
	}
	if (divdbg && text && (t = divdbg.firstChild || divdbg.appendChild (document.createTextNode(""))))
		t.nodeValue = t.nodeValue + text + "\n";
}

// Scrolling debugger output.  This opens a separate window for output.
// Window will be found if it already exists.
// Window is re-opened if it is closed.  Refreshing the window resets it.
// *** Make sure all explicit calls to this function are removed for production. ***
// Used by the error handler to report errors.  Don't remove that reference.
var dWin = false;
function debug (value, nobr) {
	if (dbg_off) return value;
	if (!dWin || dWin.closed) {
		dWin = open_window ("", "debugger",
			"directories=no,width=350,height=200,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,titlebar=yes,toobar=no");
		if (!dWin) return value;
	}
	with (dWin.document) {
		if (body.childNodes.length == 0) {
			writeln ('<html>');
			writeln ('<head>');
			writeln ('      <title>Information</title>');
			writeln ('      <style>');
			writeln ('              body {font-family:arial;font-size:8pt;background-color:#CC3333;color:#FFFF33;margin:2 2 2 2;}');
			writeln ('      </style>');
			writeln ('</head>');
			writeln ('<body>');
			writeln ('</body>');
			writeln ('</html>');
		}
		body.appendChild (createTextNode (value));
		if (!nobr) body.appendChild (createElement ("br")).scrollIntoView(false);
	}
	return value;
}

// Attempt to open a popup window.
function open_window (URL, title, options) {
	if (title != "debugger") enter ("open_window");
	var retval = false;
	try {retval = window.open (URL, title, options);} catch (e) {}
	if (!retval && title != "debugger") alert ("A window was blocked from opening.");
	if (title != "debugger") return leave (retval); else return retval;
}

// Push a function call onto the stack for stack-tracing.
// Call whenever entering a function.
// Syntax:  enter ("function_name");
var Stack = new Array();
function enter (fname) {
	try {
		Stack.push(fname);
		if (dbg_trace) debug (Stack.join(" > "));
	} catch (e) {}
}

// Pop a function call off the stack for stack-tracing.
// Call whenever exiting a function.
// Syntax:  return leave (return_value);
function leave (value) {
	if (Stack.length) Stack.pop ();
	return value;
}

// Error handler.  Reports the error and allows execution to continue.
// Functions can poll and reset error_tripped to check for problems.
// This cannot trap or handle fatal syntax errors.
var error_tripped = false;
function handle_error (msg, url, line) {
//	enter ("handle_error");
	if (dbg_error) debug ('Error:  "' + msg + '" from ' + url + ' line ' + line);  // Do not remove.
	if (dbg_stack) debug ('Stack:  ' + Stack.join(' > '));                     // Do not remove.
	Stack = new Array();
	error_tripped = true;
	return stop_event();
//	return leave(stop_event());
} 

// Touchscreen support.
var scroll_start;
function touch_start(obj, event) {
	scroll_start = obj.scrollTop + event.touches[0].pageY;
	event.preventDefault();
	return false;
}
function touch_move (obj, event) {
	obj.scrollTop = scroll_start - event.touches[0].pageY;
	event.preventDefault();
	return false;
}
function touch_end (obj, event) {
	return true;
}

// Get an event for an event handler.
function get_event (evt) {
	return evt || window.event || false;
}

function click_handler (evt) {
	enter ("click_handler");
	var retval = true;
	evt = get_event (evt);
	if (!evt) return retval;
	var srcElement = get_obj (evt);
	if (!srcElement) return retval;
	var obj, i, q;

	switch (srcElement.tagName) {
		case "A": if (srcElement.href.indexOf (".aspx") != -1) {
				i = document.URL.indexOf ("?");
				q = srcElement.href.indexOf("?");

			//	// Preserve the query string on ASPX pages.  Specify a query string on the link to override. [Is this really needed?]
			//	if (i != -1 && q == -1) srcElement.href += document.URL.substr(i);
				
				// Append the index query argument if missing.
				i = srcElement.href.indexOf ("index=");
				if (i == -1) srcElement.href += (q == -1 ? "?" : "&") + "index=" + document.URL.get_parm ("index", 1);
				break;
			}
	}

	switch (srcElement.id) {
		case "submenu":
			srcElement.parentNode.className = srcElement.parentNode.className.toggleClass("open");
			if (obj = getNext(srcElement, "UL")) obj.style.display = (obj.style.display == "" ? "block" : "");
			retval = false;
			break;
			
		case "goBack" :
		  window.history.back();
			retval = false;
			break;
	}

	// Patch for Android browsers will scroll on tap.  [Disabled due to issues with "normal" browsers]
//	if (srcElement.id == "ctl00_pnlContent" || srcElement.parentNode && srcElement.parentNode.id == "ctl00_pnlContent") {
//		if (evt.y) document.getElementById ("ctl00_pnlContent").scrollTop += (evt.y > 350 ? 200 : -200);
//	}

	if (!retval) stop_event (evt);
	return leave (retval);
}

function fill_entry(srcElement) {
	var attr = new Array();
	var li = srcElement.getElementsByTagName("li");
	for (var i = 0, c, o; i < li.length; i++) {
		c = li[i].className;
		if (c == "photo")
			attr[c] = (o = getFirstChild(li[i])) ? o.src : "";
		else
			attr[c] = (o = li[i].firstChild) ? o.nodeValue : "";
	}
	var div = document.getElementById("viewer");
	var ul = getFirstChild(div);
	li = ul.getElementsByTagName("li");
	for (var i = 0, c, o; i < li.length; i++) {
		c = li[i].className;
		if (c == "photo") {
			if (o = getFirstChild(li[i])) o.src = attr[c];
		} else {
			if (li[i].firstChild)
				li[i].firstChild.nodeValue = attr[c];
			else
				li[i].appendChild(document.createTextNode(attr[c]));
		}
	}
	div.style.display = "block";
}

// Banner image transition.  [IE only]
var banner_image = false, banner_num = 1;
function init_wipe (img) {
  if (!banner_image) banner_image = img;
  else try {img.filters[0].Play(duration=2);} catch(e) {}
  banner_num = Number(img.src.substr(img.src.length - 6, 2));
}

// Return an array of "args[name] = value" based upon query arguments in "url".
function get_args (url) {
 	var args = [], argvalue, argvalues = [], q = url.indexOf("?");
 	if (q != -1) argvalues = decodeURL(url.substring(q + 1, url.length)).toLowerCase().split("&");
 	for (var i = 0; i < argvalues.length; i++) {
 		argvalue = argvalues[i].split("=");
 		args[argvalue[0]] = argvalue[1];
 	}
 	return args;
}

function timer_handler (evt) {
  if (++timer.banner_timer % 800 == 0) {
    timer.banner_timer = 0;
    if (!timer.banner_image) {
      timer.banner_image = banner_image;
      timer.banner_num = banner_num;
    }
    timer.banner_num = timer.banner_num % 9 + 1;
    document.cookie = "story_banner=" + timer.banner_num;
    if (timer.banner_image) {
      try {timer.banner_image.filters[0].Apply();} catch(e) {}
      timer.banner_image.src = "../media/story_banner0" + timer.banner_num + ".jpg?updated=20100703";
      timer.banner_image.parentNode.href = "../pages/member_story0" + timer.banner_num + ".aspx";
    }
  }
}

function Clicker (handler) {
	document.body.onclick = handler;
}

function Timer (handler, interval) {
	this.Interval = window.setInterval (handler, interval);
	this.banner_num = Number (get_cookie ("story_banner", 1));
	this.banner_timer = Number (get_cookie("banner_timer", 0));
	this.banner_image = document.getElementById ("imgStory");
	if (this.banner_image) {
		this.banner_image.src = "../media/story_banner0" + this.banner_num + ".jpg";
		this.banner_image.parentNode.href = "../pages/member_story0" + this.banner_num + ".aspx";
	}
}

url_anchor_name = "";
function Loader (evt) {
	enter ("Loader");
	clicker = new Clicker (click_handler);
	timer = new Timer (timer_handler, 30);
	try {page_load()} catch (e) {}
	var e, url_anchor_name, a, o;

	// Get anchor reference from URL.
	var url = document.location.toString(),
		q = url.indexOf("?"), 
		s = url.indexOf("#");
	if (s != -1) {
		e = (q > -1 ? q : url.length);
		url_anchor_name = url.substring (s + 1, e - 1);
	}
	if (url_anchor_name && (a = document.getElementsByName (url_anchor_name)) && a.length && (a = a[0]))
		a.scrollIntoView (false); // Scroll to the anchor if present. ["true" will nudge the container]

	// Collapse empty marquee element.
	if ((o = document.getElementsByTagName("MARQUEE")) && o.length && (o = o[0]) && (o.firstChild == null || (o.firstChild.nodeValue).replace(/\s/g, "").length == 0))
		o.style.height = "0%";

	if (testing) dbg("Test = true");
	return leave (true);
}

function Unloader (evt) {
	enter ("Unloader");
	if (timer) document.cookie = "banner_timer=" + timer.banner_timer;
	return leave (true);
}

args = [];
function Initialize() {
	enter ("Initialize");
	window.onload = Loader;
	try { window.onerror = handle_error; } catch (e) { }
	try { window.onunload = Unloader } catch (e) { }
	args = get_args (document.location.toString());
	leave();
}

Initialize();

