/*	Randy Peterman
	10-01-02
	Trim function for removing leading and trailing whitespaces.
	Accepts form element name and string both.
	Returns the trimmed string back to the user.
*/

function trim(inputString) 
	{
	if(inputString.type == "text")
		{
		inputString = inputString.value;
		};
	for (var i=0; i<document.forms[0].length; i++)
		{
		if (document.forms[0].elements[i].name == inputString)
			{
			inputString = document.forms[0].elements[i].value;
			break;
			};
		}
	if (typeof inputString != "string")
		{
		return inputString;
		};
	var retValue = inputString;
	var ch = retValue.substring(0, 1);
	while (ch == " ")
		{
		// Check for spaces at the beginning of the string
		retValue = retValue.substring(1, retValue.length);
		ch = retValue.substring(0, 1);
		};
	ch = retValue.substring(retValue.length-1, retValue.length);
	while (ch == " ") 
		{
		// Check for spaces at the end of the string
		retValue = retValue.substring(0, retValue.length-1);
		ch = retValue.substring(retValue.length-1, retValue.length);
		};
	while (retValue.indexOf("  ") != -1)
		{
		// Note that there are two spaces in the string - look for multiple spaces within the string
		retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length); 
		// Again, there are two spaces in each of the strings
	   };
	return retValue; 
	}
	
/*	Dave O'Hara
	01-20-04
	Toggle for Dynamic tables.
*/
function toggleDynamicTable(iid)
	{
	if (document.getElementById)
	{
		iid = document.getElementById(iid)
		if (iid.style.display == "none" || iid.style.display == "")
			{
			iid.style.display = "block";
			}
		else
			{
			iid.style.display = "none";
			};
	}
	else
	{
		alert('Your browser does not allow for dynamic javascript and is not standards-compliant.\nPlease update your browser to use our site and have it function correctly.');
	}
	}
/*
	Dave O'Hara
	07-28-03
	Toggle for item display in orders.
*/
function toggleItemDisplay(iId)
	{
	if (iId == 0)
		{
		var sSet;
		if (document.getElementById("toggleAll").innerText == "[Collapse All Items]")
			{
			sSet = "none";
			document.getElementById("toggleAll").innerText = "[Uncollapse All Items]";
			}
		else
			{
			sSet = "block";
			document.getElementById("toggleAll").innerText = "[Collapse All Items]";
			};
		var tmpID;
		for(var i = 0;i<document.getElementsByTagName("TR").length;i++)
			{
			if (document.getElementsByTagName("TR").item(i) != null)
				{
				if (document.getElementsByTagName("TR").item(i).style.display == "none" && sSet == "block")
					{
					tmpID = document.getElementsByTagName("TR").item(i).id;
					document.getElementById(tmpID+"-tree").innerHTML = "-";
					document.getElementsByTagName("TR").item(i).style.display = "block";
					}
				else if (document.getElementsByTagName("TR").item(i).style.display == "block" && sSet == "none")
					{
					tmpID = document.getElementsByTagName("TR").item(i).id;
					document.getElementById(tmpID+"-tree").innerHTML = "+";
					document.getElementsByTagName("TR").item(i).style.display = "none";
					};
				}
			};
		}
	else
		{
		for(var t = 0;t<document.getElementsByName(iId).length;t++)
			{
			if (document.getElementsByName(iId).item(t).style.display == "none")
				{
				document.getElementById(iId+"-tree").innerHTML = "-";
				document.getElementsByName(iId).item(t).style.display = "block";
				}
			else
				{
				document.getElementById(iId+"-tree").innerHTML = "+";
				document.getElementsByName(iId).item(t).style.display = "none";
				};
			}
		};
	}
/*
	Dave O'Hara
	12-23-03
	Toggle for menu nav sections.
*/
function toggleMenuSection(sImg, sID)
	{
	var newImg;
	if (document.getElementById)
		{
		if (document.getElementById(sID).style.display == "none")
			{
			newImg = document.getElementById(sImg).src;
			newImg = newImg.substr(0, newImg.indexOf("arrowrt.gif", 1)) + "arrowdn.gif"
			document.getElementById(sImg).src = newImg;
			document.getElementById(sID).style.display = "";
			/*document.getElementById(sID).parentElement.style.color = "gold";*/
			}
		else
			{
			newImg = document.getElementById(sImg).src;
			newImg = newImg.substr(0, newImg.indexOf("arrowdn.gif", 1)) + "arrowrt.gif"
			document.getElementById(sImg).src = newImg;
			document.getElementById(sID).style.display = "none";
			/*document.getElementById(sID).parentElement.style.color = "white";*/
			};
		}
	else
		{
		alert('Your browser does not allow for dynamic javascript and is not standards-compliant.\nPlease update your browser to use our site and have it function correctly.');
		};
	}
/*
	Trint Ladd
	2-6-2004
	Generic display toggle
	Written specifically for features page, but should be usable anywhere
*/
function toggleDisplay(sID)
{	
	if (document.getElementById)
	{
	if (document.getElementById(sID).style.display == "none")
		document.getElementById(sID).style.display = "block";
	else
		document.getElementById(sID).style.display = "none";
	}
	else
	{
		alert('Your browser does not allow for dynamic javascript and is not standards-compliant.\nPlease update your browser to use our site and have it function correctly.');
	};
}
/*
	Trint Ladd
	6-24-2004
	Toggle display for Partner Portal Islands
	Relies on the existance of a toggle button, 'mini_' + id, and
	a body div, 'body_' + id.
*/
function toggleIslandDisplay(sID)
{
	var mini, body;
	mini = "mini_" + sID;
	body = "body_" + sID;

	if (document.getElementById)
	{
		if (document.getElementById(body).style.display == "none")
		{	document.getElementById(body).style.display = "block";
			document.getElementById(mini).value = " - ";
		}
		else
		{	document.getElementById(body).style.display = "none";
			document.getElementById(mini).value = " + ";
		}
	}
	else
	{
		alert('Your browser does not allow for dynamic javascript and is not standards-compliant.\nPlease update your browser to use our site and have it function correctly.');
	};
}
/*
	Trint Ladd
	6-24-2004
	Toggle display for Partner Portal left side menus
*/
function toggleMenuDisplay(sItemID, sSubMenuID)
{
	if (document.getElementById)
	{
		if (document.getElementById(sSubMenuID).className == "PortalMenuSubHidden")
		{	document.getElementById(sSubMenuID).className = "PortalMenuSub";
			document.getElementById(sItemID).className = "expanded";
		}
		else
		{	document.getElementById(sSubMenuID).className = "PortalMenuSubHidden"
			document.getElementById(sItemID).className = "expandable";
		}
	}
	else
	{
		alert('Your browser does not allow for dynamic javascript and is not standards-compliant.\nPlease update your browser to use our site and have it function correctly.');
	};
	return true;
}

/*
	David O'Hara
	02-16-2004
	Sets focus on a form to the first acceptable element
*/
function setFocus()
{
	for (var i=0; i<document.forms[0].length; i++)
		{
		// catch if element is not going to accept anything.
		if (document.forms[0].elements[i].name != "")
		{
		switch (document.forms[0].elements[i].type)
			{
			// awful hack in place to handle element's hidden parents - Dave 07-01-2004
			case "text":
				if (!document.forms[0].elements[i].disabled && !(document.getElementById(document.forms[0].elements[i].name).parentNode.style.display == "none"))
					{
					document.forms[0].elements[i].focus();
					return true;
					}
				break;
			case "submit":
				if (!document.forms[0].elements[i].disabled && !(document.getElementById(document.forms[0].elements[i].name).parentNode.style.display == "none"))
					{
					document.forms[0].elements[i].focus();
					return true;
					}
				break;
			case "radio":
				if (!document.forms[0].elements[i].disabled && !(document.getElementById(document.forms[0].elements[i].name).parentNode.style.display == "none"))
					{
					document.forms[0].elements[i].focus();
					return true;
					}
				break;
			default:
				/* don't set focus since it won't accept */
					break;
			}
		}
		}
}

/*
	Trint Ladd
	02-18-2004
	Returns true if s is a valid email address
*/
function isEmail (s)
{
	/* illegal characters: ( ) < > @ , ; : \ " . [ ] */
	var illegalChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"

	/* user@domain format. */
	var emailPat=/^(.+)@(.+)$/

	var matchArray=s.match(emailPat)
	if (matchArray==null)
		return false
 	var user=matchArray[1]
	var domain=matchArray[2]

	/* valid user (excluding dbl quoted) */
	var userPat=new RegExp("^[^" + illegalChars + "]+(\\.[^" + illegalChars + "]*)*$")
	/* valid dbl quoted user */
	var quotedUser=/^\"[^\"]+\"$/
	if (user.match(userPat)==null && user.match(quotedUser)==null)
		return false

	/* You made it this far, user is okay */

	/* IP domain NOTE: The square brackets are required. */
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null)
	{	// this is an IP address
		for (var i=1;i<=4;i++)
		{	if (IPArray[i]>255)
				return false
		}

		return true
	}

	/* Named domain */
	var domainPat=new RegExp("^[^" + illegalChars + "]+(\\.[^" + illegalChars + "]+)+$")
	var domainArray=domain.match(domainPat)
	if (domainArray==null)
		return false

	/* Check for valid suffix: .com, .edu, .uk, etc. This could be made more robust */
	var atomPat=new RegExp("[^" + illegalChars + "]+","g")
	var domArr=domain.match(atomPat)
	var suffix=domArr[domArr.length-1]
	if (suffix.length<2 || suffix.length>4)
		return false

	return true;
}

/*
Trint
2-23-2004
This is specifically for validation on the pricing page.
I've made it more generic so it can be used to check any radio set.
*/
function isChecked(arrRadioSet)
{	//Handle radio sets with only one button
	if(arrRadioSet.checked)
		return true;
	for(i=0; i<arrRadioSet.length; i++)
	{	if(arrRadioSet[i].checked)
			return true;
	}
}

/*
Trint
2-23-2004
Function to open new windows
args:
	URL - duh.
	wintype - the format of window to open
		0 (default) - no window args, acts like target="_blank"
		1 - layout_no_menu style window, 500 x 820
		2 - empty window for screenshots, pdf files, etc.
	optional third argument for name of child window
*/
function openWindow(URL, wintype)
{	var winname, child;
	if(openWindow.arguments.length > 2)
		winname = openWindow.arguments[2];
	else
		winname = "winChild";

	switch(wintype)
	{	case 1: //layout_no_menu
			child = window.open(URL, winname, "height=500,width=820,directories=no,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,titlebar=yes");
			child.focus();
			break;
		case 2: //layout_no_menu
			child = window.open(URL, winname, "height=500,width=700,directories=no,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,titlebar=yes");
			child.focus();
			break;
		case 3: //no resize - redirects
			child = window.open(URL, winname, "height=400,width=500,directories=no,location=no,menubar=no,toolbar=no,resizable=no,scrollbars=no,titlebar=yes");
			child.focus();
			break;
		default:
			child = window.open(URL, winname, "");
			child.focus();
			break;
	}
}


////////////////////////////////////////////////////////////////
// Grab the selected value from a <select> tag.
// Trint Ladd 12-11-2003
function getOptionValue(field)
{	if(field == null || field.length == 0) //No options in the select
		return "";
	var index = field.selectedIndex;
	if(index<0) //Nothing selected
		return "";
	return field.options[index].value;
}

/*
	Dave O'Hara
	04-02-04
	Used by the payment pages to stop multiple submits.
*/
function frmPaymentSubmit(btnDIV)
	{
	if (bBeenSubmitted == 1)
		{
		alert("You order has been submitted for processing, please be patient.");
		return false;
		}
	else
		{
		btnDIV.innerHTML = "<p class=\"paySubmit\">Processing Order...</p>";
		bBeenSubmitted = 1;
		return true;
		};
	}

/*
	Dave O'Hara
	05-03-04
	Used by the download page to validate info.
*/
function dlInfoValidate(form)
	{
	var retVal = true;
	for (var i=0;i<form.length;i++)
	{
		var elem = form.elements[i];
		switch (elem.type)
			{
			case "hidden": // do nothing, skip.
				break;
			case "text":
				switch (elem.name)
					{
					case "email":
						if (!isEmail(elem.value))
						{
						alert('Please enter a valid email address.');
						elem.select();
						retVal = false;
						}
						break;
					case "name":
						if (elem.value == "" && elem.value.length >= 10)
						{
						alert('Please enter your full name.');
						elem.select();
						retVal = false;
						}
						break;
					}
				break;
			case "select-one":
				if (elem.value == -1)
					{
					alert("Please select a country.");
					elem.focus();
					retVal = false;
					}
				break;
			default:
				break;
			}
		// use this to break out early for errors.
		if (retVal == false)
			return false;
	}
	return retVal;
	}
	
function toggleVisibility(element)
	{
	for (var i=0; i<element.length; i++)
		{
		if (element[i].value == element[element.selectedIndex].value)
			document.getElementById("value_"+element[i].value).style.display = "block";
		else
			document.getElementById("value_"+element[i].value).style.display = "none";
		};
	}
function validate(regex, e)
	{
	var key;
	if (e.which == null)
		key = e.keyCode;
	else
		key = e.which;
	switch (regex)
		{
		case "int":
			if (key >= 48 && key <= 57 || key == 8) //allow backspace
				return true;
			else
				return false;
		default: //same as text - always true
			return true;
		}
	}
	
	
	
  // this function is needed to work around 
  // a bug in IE related to element attributes
  function hasClass(obj) {
     var result = false;
     if (obj.getAttributeNode("class") != null) {
         result = obj.getAttributeNode("class").value;
     }
     return result;
  }   

 function stripe(id) {

    // the flag we'll use to keep track of 
    // whether the current row is odd or even
    var even = false;
  
    // if arguments are provided to specify the colours
    // of the even & odd rows, then use the them;
    // otherwise use the following defaults:
    var evenColor = arguments[1] ? arguments[1] : "#fff";
    var oddColor = arguments[2] ? arguments[2] : "#ECF5FA";
  
    // obtain a reference to the desired table
    // if no such table exists, abort
    var table = document.getElementById(id);
    if (! table) { return; }
    
    // by definition, tables can have more than one tbody
    // element, so we'll have to get the list of child
    // &lt;tbody&gt;s 
    var tbodies = table.getElementsByTagName("tbody");

    // and iterate through them...
    for (var h = 0; h < tbodies.length; h++) {
    
     // find all the &lt;tr&gt; elements... 
      var trs = tbodies[h].getElementsByTagName("tr");
      
      // ... and iterate through them
      for (var i = 0; i < trs.length; i++) {

        // avoid rows that have a class attribute
        // or backgroundColor style
        if (! hasClass(trs[i]) &&
            ! trs[i].style.backgroundColor) {
 		  
          // get all the cells in this row...
          var tds = trs[i].getElementsByTagName("td");
        
          // and iterate through them...
          for (var j = 0; j < tds.length; j++) {
        
            var mytd = tds[j];

            // avoid cells that have a class attribute
            // or backgroundColor style
            if (! hasClass(mytd) &&
                ! mytd.style.backgroundColor) {
        
              mytd.style.backgroundColor =
                even ? evenColor : oddColor;
            
            }
          }
        }
        // flip from odd to even, or vice-versa
        even =  ! even;
      }
    }
  }

