/* =================================================================== *
 * DOM functions													   *
 * =================================================================== */

/* addEvent() adapted from Dustin Diaz
 * http://www.dustindiaz.com/rock-solid-addevent/
 * used to add event listeners to the page
 */

function addEvent(obj,type,fn) {
	if(obj) {
		if (obj.addEventListener) {
			obj.addEventListener( type, fn, false );
			EventCache.add(obj, type, fn);
		}
		else if (obj.attachEvent) {
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
			EventCache.add(obj, type, fn);
		}
		else {
			obj["e"+type+fn] = fn;
			obj["on"+type] = obj["e"+type+fn];
		}
	}
}

var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
addEvent(window,'unload',EventCache.flush); // fixes IE memory leak issues

function preventDefault(e) {
	if (e.preventDefault) {
		e.preventDefault();
	} else {
		e.returnValue = false;
	}
}

function getElementsByClassName(strClass, strTag, objContElm, firstOnly) {
  strTag = strTag || "*";
  objContElm = objContElm || document;    
  var objColl = (strTag == '*' && document.all) ? document.all : objContElm.getElementsByTagName(strTag);
  var arr = (firstOnly) ? false : new Array();                              
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';   
  var arrClass = strClass.split(delim);
  elementsLoop:   
  for (var i = 0, j = objColl.length; i < j; i++) {
    var arrObjClass = objColl[i].className.split(' ');
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (k = 0, l = arrObjClass.length; k < l; k++) {
      for (m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
		  if(firstOnly) {
		  	return objColl[i];
		  } else {
            arr.push(objColl[i]); 
            break comparisonLoop;
		  }
        }
      }
    }
  }
  return arr; 
}

/* =================================================================== *
 * functions to determine which form to submit when "Enter" is pressed *
 * =================================================================== */

var enterSubmit = true;

function resetEnterSubmit() { 
	if (!e) var e = window.event;
	/* this will fire:
	 * - if enter is pressed and enterSubmit = false	(see multiFormSubmit function)
	 * - if focus of a textbox is blurred	(see initMultiForm function)
	 */
	enterSubmit = true;
}

function multiFormSubmit(e) {
	// get event
	if (!e) var e = window.event; // get event
	var charCode = (e.which) ? e.which : e.keyCode; // get keycode

	if(charCode && (charCode == "38" || charCode == "40")) {
		// if up or down arrow is pressed, allow Enter key to work to select from IE AutoComplete dropdown
		enterSubmit = false;
	}
			
 	// if the "Enter" key is pressed
	if(charCode && charCode == "13") {
		if(!enterSubmit) {
			// allow enter to fire once so it can select from autocomplete,
			// then allow enter to submit next time it is pressed
			resetEnterSubmit();
		} else {
			var buttonToClick = null;
			// check if it's on the keyword input box of quick search
			if(quickSearchTextbox && this.id == quickSearchTextbox.id) {
				// and if it is, submit quick search...
				buttonToClick = quickSearchButton;
			} else if(gSearchTextbox && this.id == gSearchTextbox.id) {
				// results page google search...
				buttonToClick = gSearchButton;
			}
			// if we have a button to click, click it! otherwise, just let the browser default action happen
			if(buttonToClick) {
				buttonToClick.click();
				preventDefault(e); // prevents form from being submitted with default button
			}
		}
	}
}

var quickSearchTextbox = null;
var quickSearchButton = null;

var gSearchTextbox = null;
var gSearchButton = null;

function initMultiForm() {
	if(!document.getElementsByTagName) return false;
	if($("searchBar")) {
		var qsInputs = $("searchBar").getElementsByTagName("input");
		for(var i=0;i<qsInputs.length;i++) {
			if(qsInputs[i].type == "text") {
				// detect keydown on textboxes + fire multiFormSubmit
				addEvent(qsInputs[i],"keydown",multiFormSubmit);
				addEvent(qsInputs[i],"blur",resetEnterSubmit); // if you leave the textbox, submit default form
				if(!quickSearchTextbox) {
					// set the var for the quick search textbox
					quickSearchTextbox = qsInputs[i];
				}
			} else if ((qsInputs[i].type == "button" || qsInputs[i].type == "image" || qsInputs[i].type == "submit") && !quickSearchButton) {
				// set the var for the quick search button
				quickSearchButton = qsInputs[i];
			}
		}
	}
	if($("searchBox")) {
		var gsInputs = $("searchBox").getElementsByTagName("input");
		for(var i=0;i<gsInputs.length;i++) {
			if(gsInputs[i].type == "text") {
				// detect keydown on textboxes + fire multiFormSubmit
				addEvent(gsInputs[i],"keydown",multiFormSubmit);
				addEvent(gsInputs[i],"blur",resetEnterSubmit); // if you leave the textbox, submit default form
				if(!gSearchTextbox) {
					// set the var for the site search textbox
					gSearchTextbox = gsInputs[i];
				}
			} else if ((gsInputs[i].type == "button" || gsInputs[i].type == "image" || gsInputs[i].type == "submit") && !gSearchButton) {
				// set the var for the site search button
				gSearchButton = gsInputs[i];
			}
		}
	}
}
addEvent(window,"load",initMultiForm);