// Useful JavaScript functions for the KBroker JSP's

// Static variables
var GENERAL_SEARCH_ID = "tx2";

/** ===============================================================================================
 *  getElementsByClassName
 *
 *  Retrieves child elements by class name
 *  Taken from http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
 *  ===============================================================================================
 */
function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^| )"+ className +"( |$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

/** ===============================================================================================
 *  External Links - Adds "Open in New Window" functionality for XHTML code.
 *
 *  target="_blank" is no longer valid for anchors in XHTML strict. Due to this, we are using a
 *  piece of JavaScript to make all links marked with rel="external" to open in a new window.
 *  ===============================================================================================
 */
function externalLinks() {
	var objCurrent, objReplacement;

	if (document.getElementsByTagName) {
		var objAnchors = document.getElementsByTagName("a");
		for (var iCounter=0; iCounter<objAnchors.length; iCounter++) {
			if (objAnchors[iCounter].getAttribute("href") &&objAnchors[iCounter].getAttribute("rel") == "external") {
				objAnchors[iCounter].onclick = function(event){return launchWindow(this, event);}
				objAnchors[iCounter].onkeypress = function(event){return launchWindow(this, event);}

				if (document.replaceChild) {
					objCurrent = objAnchors[iCounter].firstChild;
					if (objCurrent.alt) {  // Image
						objReplacement = objCurrent;
						objReplacement.alt = objCurrent.alt + " (opens in a new window)";
						try {
							objAnchors[iCounter].replaceChild(objReplacement, objCurrent);
						} catch(e) {}
					}
				}
			}
		}
	}
}

/** ===============================================================================================
 *	Launch Window
 *
 *  Opens a new window
 *  ===============================================================================================
 */
function launchWindow(objAnchor, objEvent) {
	var iKeyCode;

	if (objEvent && objEvent.type == "keypress") {
		if (objEvent.keyCode) {
			iKeyCode = objEvent.keyCode;
		} else if (objEvent.which) {
			iKeyCode = objEvent.which;
		}

		if (iKeyCode != 13 && iKeyCode != 32) {
			return true;
		}
	}
	return !window.open(objAnchor);
}

/** ===============================================================================================
 *	goBack
 *
 *  Takes the user back one page in their history (if available)
 *  ===============================================================================================
 */
function goBack() {
  var h = window.history;
  if (h.length) {
  	h.back();
	}
}

/** ===============================================================================================
 *	createCookie
 *
 *  Creates a cookie for the with the specified key/value pair.  It will expire in the set amount
 *  of days
 *  ===============================================================================================
 */
function createCookie(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=/";
}

/** ===============================================================================================
 *	readCookie
 *
 *  Returns the value from the specified cookie
 *  ===============================================================================================
 */
function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for (var i=0; i<ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') {
    	c = c.substring(1,c.length);
    }
    if (c.indexOf(nameEQ) == 0) {
    	return c.substring(nameEQ.length,c.length);
    }
  }
  return null;
}

/** ===============================================================================================
 *	giveFocus
 *
 *  Gives focus to the specified element
 *  ===============================================================================================
 */
function giveFocus(elementId) {
	if (!document.getElementById) return false;
	if (!document.getElementById(elementId)) return false;
	document.getElementById(elementId).focus();
}

/** ===============================================================================================
 *	setDisplayNone
 *
 *  Gives the specified element a CSS style of display: none;
 *  ===============================================================================================
 */
function setDisplayNone(elementId) {
	if (!document.getElementById) return false;
	if (!document.getElementById(elementId)) return false;
	document.getElementById(elementId).style.display = 'none';
}

/** ===============================================================================================
 *	setAllToDisplayNone
 *
 *  Gives the specified elements a CSS style of display: none;
 *  ===============================================================================================
 */
function setAllToDisplayNone(elementIds) {
	if (!document.getElementById) return false;

	for (var i=0; i<elementIds.length; i++) {
		if (!document.getElementById(elementIds[i])) continue;
		document.getElementById(elementIds[i]).style.display = 'none';
	}
}

/** ===============================================================================================
 *	setElementsToDisplayNone
 *
 *  Gives the specified elements a CSS style of display: none;
 *  ===============================================================================================
 */
function setElementsToDisplayNone(elements) {
	for (var i=0; i<elements.length; i++) {
		elements[i].style.display = 'none';
	}
}

function focusGeneralSearch() {
	document.getElementById(GENERAL_SEARCH_ID).focus();
}

function hideElements() {
	setDisplayNone("filterhider");
}

/** ===============================================================================================
 *	clickclear
 *
 *  Clears the text in a field and resores it if no value is entered
 *  ===============================================================================================
 */
function clickclear(thisfield, defaulttext) {
	if (thisfield.value == defaulttext) {
		thisfield.value = "";
	}
}

function clickrecall(thisfield, defaulttext) {
	if (thisfield.value == "") {
		thisfield.value = defaulttext;
	}
}

/** ===============================================================================================
*	goBackLink
*
*  Creates the Go Back link on records
*  ===============================================================================================
*/
function goBackLink() {
	var backLinks =  getElementsByClassName("backlink", "div", document)
	for(var i=0; i<backLinks.length; i++){
		var backLink = document.createElement("a");
 		backLink.href = "javascript:history.go(-1)";
 		backLink.title = "Go back";
 		backLink.innerHTML = "&laquo;&nbsp;Go Back";
 		backLinks[i].appendChild(backLink);
	}
}