// Javascript function library

// Attach events
addEvent(window, 'load', setFocus);
addEvent(window, 'load', linkPreview);


/* http://particletree.com/features/preview-your-links-with-unobtrusive-javascript/ */
// Reusable event attacher - see http://www.onlinetools.org/articles/unobtrusivejavascript/chapter4.html
function addEvent(obj, evType, fn){
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, false);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}

// Set the cursor focus to the first form item
// From: http://javascript.internet.com/forms/form-focus.html
// Modified to skip certain form names.
function setFocus() {

  if (document.forms.length <= 0) {return;}
    
  var f;
  // choose the first form on the page that does not have a special name
  for (f = 0; f < document.forms.length; f++) {
    
    if(document.forms[f].name == "minisearch" || document.forms[f].name == "jumplist") {continue;}
    
    break;
  }

  // if there isnt another one rechoose the first form
  if (f >= document.forms.length) {f=0;}
  
  if (document.forms[f]) {
    var field = document.forms[f];
    var el;
    for (i = 0; i < field.length; i++) {
      el = field.elements[i];
      
      if(!el.type) {continue;}

      
      // Elements of type text, textarea, and select can receive focus ...
      if ((el.type == "text") || (el.type == "textarea") || (el.type.toString().charAt(0) == "s")) {
	// alert(el.attributes.autofocus.value);
	// Some elements can't accept the focus, eg if they're in the following states, so catch any errors that flow from that.
	// if(el.style.visibility=="hidden" || el.style.display=="none" || el.disabled==true) {continue;}
	try {
	  document.forms[f].elements[i].focus();
	  // alert('Set to: ' + document.forms[f].name + document.forms[f].id);
	}
	catch(err) {
	  // It seems the element could not accept the focus.
	  // alert('skipping set focus to ' + el);
	  // Skip this element to try another
	  continue;
	}
	break;
      }
    }
  }
}


function linkPreview(){
	var links = document.getElementsByTagName("a");

	for (i=0; i<links.length; i++){
		var currentLink = links[i];
		var	images = currentLink.getElementsByTagName("img");
		
	 	// Check if the link is an image. We don't want icons next to images.
		if (!images.length){
			var linkHref = currentLink.href;
			checkLinks(linkHref, currentLink);
		}
	}
}
function checkLinks(linkHref, currentLink){
	var linkHrefParts = linkHref.split(".");
	
	// extension is the last element in the LinkSplit array
	var extension = linkHrefParts[linkHrefParts.length - 1];
	
	// In some browsers there is a "/" placed after the link. removes the "/"
	extension = extension.replace("/","");
	
	if( extension in { doc:1, pdf:1, ppt:1, txt:1, xls:1, zip:1 } ){
		append(currentLink, extension );
	}
}
function append(currentLink, extension){
	var span = document.createElement('span');
	span.innerHTML = "<img src=\"/images/fileicons/" + extension + ".gif\"" +
			     " alt=\"[" + extension + "]\"" + 
			     " title=\"[" + extension + "]\"" + 
			     " class=\"extension file-" + extension + "\"" +
			     " width=\"16\" height=\"16\" /> ";
//	currentLink.parentNode.insertBefore(span,currentLink.nextSibling);
	currentLink.parentNode.insertBefore(span,currentLink);
//	span.className = "file-" + extension;
}


// Row locking and striping
// http://www.askthecssguy.com/2006/12/row_locking_with_css_and_javas.html

function addClass(element,value) {
  if (!element.className) {
    element.className = value;
  } else {
    newClassName = element.className;
    newClassName+= " ";
    newClassName+= value;
    element.className = newClassName;
  }
}


function stripeTables() {
	var tbodies = document.getElementsByTagName("tbody");

	for (var i=0; i<tbodies.length; i++) {

	  // If its not a  browse or browseTable class, then skip.
	  if (tbodies[i].parentNode.className.indexOf("browse") == -1) {continue;}

		var rows = tbodies[i].getElementsByTagName("tr");
		if(rows.length <= 0) {return;}
		addClass(rows[0],"headings");
		for (var j=1; j<rows.length; j++) {
		  if (j%2 > 0) {continue;}
		  addClass(rows[j],"blushed");
		}
	}
}

// Adds lock row functionality to table rows.
function lockRow() {
  var tbodies = document.getElementsByTagName("tbody");
  for (var j=0; j<tbodies.length; j++) {

    // If its not a  browse or browseTable class, then skip.
    if (tbodies[j].parentNode.className.indexOf("browse") == -1) {continue;}

    var rows = tbodies[j].getElementsByTagName("tr");
    for (var i=0; i<rows.length; i++) {
      rows[i].oldClassName = rows[i].className;
      rows[i].onclick = function() {
	if (this.className.indexOf("selected") != -1) {
	  this.className = this.oldClassName;
	} else {
	  addClass(this,"selected");
	}
      };
    }
  }
}


// Checkbox toggling
function toggle(name,checkboxElement)
{
    displayValue = (checkboxElement.checked ? '' : 'none');
	var items=document.getElementsByName(name);
	for(var i=0;i<items.length;i++){
		items[i].style.display = displayValue;
	}
}


addEvent(window, 'load', stripeTables);
addEvent(window, 'load', lockRow);
