
function wopen(url, name, w, h)
{
  // Fudge factors for window decoration space.
  // In my tests these work well on all platforms & browsers.
  w += 32;
  h += 96;
  wleft = (screen.width - w) / 2;
  wtop = (screen.height - h) / 2;
  // IE5 and other old browsers might allow a window that is
  // partially offscreen or wider than the screen. Fix that.
  // (Newer browsers fix this for us, but let's be thorough.)
  if (wleft < 0)
  {
    w = screen.width;
    wleft = 0;
  }
  if (wtop < 0)
  {
    h = screen.height;
    wtop = 0;
  }
  var win = window.open(url,
    name,
    'width=' + w + ', height=' + h + ', ' +
    'left=' + wleft + ', top=' + wtop + ', ' +
    'location=no, menubar=no, ' +
    'status=no, toolbar=no, scrollbars=no, resizable=no');
  // Just in case width and height are ignored
  win.resizeTo(w, h);
  // Just in case left and top are ignored
  win.moveTo(wleft, wtop);
  win.focus();
}

//***********************************************************************************
function loadpage(pagename) 
{
    try
    {
	    if (pagename == 'home')
            {
		    hidediv('metric');
		    hidediv('pricing');
		    hidediv('whatwedo');
		    showdiv('features');
		    $('#Webinar').css('display', 'block');
	    }
    }
    catch (err)
    {
    }
}

//***********************************************************************************
function submitsearch()
{ 
	document.searchform.submit();
}

//***********************************************************************************
function homeshowtab(tabname)
{
    try
    {
		hidediv('metric');
		hidediv('pricing');
		hidediv('whatwedo');
		hidediv('features');
		showdiv(tabname);
		elem = document.getElementById('metrictab');
		elem.className = 'tab';
		elem = document.getElementById('pricingtab');
		elem.className = 'tab';
		elem = document.getElementById('whatwedotab');
		elem.className = 'tab';
		elem = document.getElementById('featurestab');
		elem.className = 'tab';		
		elem = document.getElementById(tabname + 'tab');
		elem.className = 'activetab';	
    }
    catch (err)
    {
    }
	return tabname;
}

function mouseoverhometab(tabname)
{
    try
    {
	    elem = document.getElementById(tabname + 'tab');
	    elem.className = 'activetab';	
    }
    catch (err)
    {
    }
}

function mouseouthometab(tabname)
{
    try
    {
	    if (tabname != activetab)
            {
		    elem = document.getElementById(tabname + 'tab');
		    elem.className = 'tab';
            }
    }
    catch (err)
    {
    }
}

//***********************************************************************************
function homedropdown(tabname)
{
    try
    {
		path = 'images/rightbar/';
		if (tabname == activedropdown)
        {
			hidediv(tabname + 'div');

			elem = document.getElementById(tabname + 'img');
			elem.src = path + tabname + '.gif';		
			activedropdown = '';
			return '';
		}
		else
        {
			hidediv('productvideodiv');
			hidediv('freetrialdiv');
			hidediv('demodiv');
			showdiv(tabname + 'div');
			elem = document.getElementById('demoimg');
			elem.src = path + 'demo.gif';		
			elem = document.getElementById('freetrialimg');
			elem.src = path + 'freetrial.gif';		
			elem = document.getElementById('productvideoimg');
			elem.src = path + 'productvideo.gif';		
			elem = document.getElementById(tabname + 'img');
			elem.src = path + tabname + 'active.gif';
			activedropdown = tabname;
			return tabname;
		}
    }
    catch (err)
    {
    }
	return '';
}

//***********************************************************************************
function opentip(tipnum)
{
	path = 'images/';
	if (tipnum == activetip)
	{
		hidediv('tip' + tipnum);
		elem = document.getElementById('tipimg' + tipnum);
		elem.src = path + 'stafftipsli.gif';		
		return 0;
	}
	else
	{
		if (activetip != 0)
		{
			hidediv('tip' + activetip);
			elem = document.getElementById('tipimg' + activetip);
			elem.src = path + 'stafftipsli.gif';		
		}
		showdiv('tip' + tipnum);
		elem = document.getElementById('tipimg' + tipnum);
		elem.src = path + 'stafftipsliactive.gif';		
		return tipnum;
	}
}

//***********************************************************************************
function getElementHeight(Elem) 
{
	if (ns4)
	{
		var elem = getObjNN4(document, Elem);
		return elem.clip.height;
	}
	if (document.getElementById)
	{
		var elem = document.getElementById(Elem);
	}
	else
	{
	    if (document.all)
	    {
		    var elem = document.all[Elem];
	    }
	}
	if (op5)
	{ 
		xPos = elem.style.pixelHeight;
	}
	else
	{
		xPos = elem.offsetHeight;
	}
	return xPos;
}

//***********************************************************************************
function showdiv(id)
{
 	//safe function to show an element with a specified id
    try
    {
        if (document.getElementById)
        { // DOM3 = IE5, NS6
		    document.getElementById(id).style.display = 'block';
	    }
	    else
	    {
		    if (document.layers)
            { // Netscape 4
			    document.id.display = 'block';
		    }
		    else
            { // IE 4
			    document.all.id.style.display = 'block';
		    }
	    }
	}
	catch (err)
    {
    }
}

function hidediv(id)
{
 	//safe function to show an element with a specified id
    try
    {
	    if (document.getElementById)
	    { // DOM3 = IE5, NS6
		    document.getElementById(id).style.display = 'none';
	    }
	    else
	    {
		    if (document.layers)
		    { // Netscape 4
			    document.id.display = 'none';
		    }
		    else
		    { // IE 4
			    document.all.id.style.display = 'none';
		    }
	    }
	}
	catch (err)
    {
    }
}

//***********************************************************************************
function isEmail(s)
{ 
    if (s.trim() == "")
    {
        return false;
    }
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;
    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    {
        i++;
    }
    if ((i >= sLength) || (s.charAt(i) != "@"))
    {
        return false;
    }
    i += 2;
    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    {
        i++;
    }
    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) 
    {
        return false;
    }
    return true;
}

//***********************************************************************************
function validate(myForm)
{
	if (myForm.elements['firstname'].value.trim() == "")
	{
		myForm.elements['firstname'].focus();
		alert("Your first name is required.");
		return false;
	}
	if (myForm.elements['lastname'].value.trim() == "")
	{
		myForm.elements['lastname'].focus();
		alert("Your last name is required.");
		return false;
	}
	if (myForm.elements['phone'].value.trim() == "")
	{
		myForm.elements['phone'].focus();
		alert("Your phone number is required.");
		return false;
	} 
// 	if (myForm.elements['industry'].selectedIndex==0)
//    {
//        alert ( "Please select your Industry." );
//		   myForm.elements['industry'].focus();
//        return false;
//	    }
//	    if (myForm.elements['returnurl'].value.trim() != "whitepaper_marketing_analytics")
//    {
//	 	    if(myForm.elements['how'].selectedIndex==0)
//        {
//   	        alert ( "How did you hear about us?" );
//	    		myForm.elements['how'].focus();
//          	return false;
//		    }
//	    }
	if (!isEmail(myForm.elements['email'].value.trim()))
	{
		myForm.elements['email'].focus();
		alert("Your valid email address is required.");
		return false;
	}
//	    if(myForm.elements['email'].value.trim() != myForm.elements['confirmemail'].value.trim())
//    {
//	    	myForm.elements['email'].focus();
//		    alert("Your email addresses do not match.");
//	    	return false;
//	    }
	return true;
}

//***********************************************************************************
function validateLandingPage(myForm)
{
	if (myForm.elements['firstname'].value.trim() == "")
	{
		myForm.elements['firstname'].focus();
		alert("Your first name is required.");
		return false;
	}
	if (myForm.elements['lastname'].value.trim() == "")
	{
		myForm.elements['lastname'].focus();
		alert("Your last name is required.");
		return false;
	}
	if (myForm.elements['phone'].value.trim() == "")
	{
		myForm.elements['phone'].focus();
		alert("Your phone number is required.");
		return false;
	} 
	if (!isEmail(myForm.elements['email'].value.trim()))
	{
		myForm.elements['email'].focus();
		alert("Your valid email address is required.");
		return false;
	}
	return true;
}

//***********************************************************************************
function validatewhitepaper(myForm)
{
	if (myForm.elements['firstname'].value.trim() == "")
	{
		myForm.elements['firstname'].focus();
		alert("Your first name is required.");
		return false;
	}
	if (myForm.elements['lastname'].value.trim() == "")
	{
		myForm.elements['lastname'].focus();
		alert("Your last name is required.");
		return false;
	}
	if (myForm.elements['phone'].value.trim() == "")
	{
		myForm.elements['phone'].focus();
		alert("Your phone number is required.");
		return false;
	} 
	if (!isEmail(myForm.elements['email'].value.trim()))
	{
		myForm.elements['email'].focus();
		alert("Your valid email address is required.");
		return false;
	}
	return true;
}

//***********************************************************************************
function validatenewsletter(myForm)
{
	if (myForm.elements['newsLetterFirstname'].value.trim() == "")
	{
		myForm.elements['newsLetterFirstname'].focus();
		alert("Your first name is required.");
		return false;
	}
	if (myForm.elements['newsLetterLastname'].value.trim() == "")
	{
		myForm.elements['newsLetterLastname'].focus();
		alert("Your last name is required.");
		return false;
	}
	if (myForm.elements['newsLetterCompany'].value.trim() == "")
	{
		myForm.elements['newsLetterCompany'].focus();
		alert("Your company name is required.");
		return false;
	}
	if (!isEmail(myForm.elements['newsLetterEmail'].value.trim()))
	{
		myForm.elements['newsLetterEmail'].focus();
		alert("Your valid email address is required.");
		return false;
	}
	return true;

}
//***********************************************************************************
function validatedemo(myForm){
	if (myForm.elements['demodate'].value.trim() == "")
	{
		myForm.elements['demodate'].focus();
		alert("Demo date is required.");
		return false;
	}
	if (!isEmail(myForm.elements['email'].value.trim()))
	{
		myForm.elements['email'].focus();
		alert("Your valid email address is required.");
		return false;
	}
	return true;
}
//***********************************************************************************
//demodate.value, hour.value, ampm.value, timezone.value

function convertdemodate(thedate, thetime, theampm, thetimezone)
{
// Compute UTC date that the user entered
	/*
	if (theampm == "pm")
	{ 
		thetime = parseInt(thetime) + 12;
	} 
	thetime = parseInt(thetime) + parseInt(thetimezone);
	*/
	var d = new Date(thedate); 
	d.setHours(thetime, 0, 0); 
//	var adjdate = d.getTime(); 
//	adjdate += 3600*1000 * thetimezone; 
//	d.setTime(adjdate); 
	//alert(d.toUTCString()); 
// Get current date plus 24 hours
	var cd = new Date(); 
	var cadjdate = cd.getTime(); 
	cadjdate += 3600*24000; 
	cd.setTime(cadjdate); 
	if (d <= cd)
	{
		alert("You must schedule your demo at least 24 hours in advance.");
		return "";
	}
	return d.getFullYear() + '-' + Right(('0'+(d.getMonth()+1)), 2) + '-' + Right(('0'+(d.getDate())), 2) + 'T' + Right(('0'+(d.getHours())), 2) + ':00:00';
}

/**
 * Prototype function for JavaScript native objects.
 */

/**
 * Trim function for the String object.
 */
String.prototype.trim = function()
{
	return this.ltrim().rtrim();
};

/**
 * Left Trim function for the String object.
 */
String.prototype.ltrim = function() 
{
	return this.replace(/^\s+/,"");
}

/**
 * Right Trim function for the String object
 */
String.prototype.rtrim = function()
{
	return this.replace(/\s+$/,"");
}

function Right(str, num)
{
	return str.substring(str.length-num);  // pull out right num
}

/**
 * var str = "This is a {0} string using the {1} method.".format("formatted","inline");
 */
function _StringFormatInline()
{
	var txt = this;
	for (var i=0; i<arguments.length; i++)
	{
		var exp = new RegExp('\\{' + (i) + '\\}','gm');
		txt = txt.replace(exp,arguments[i]);
	}
	return txt;
}

/**
 * var str = String.format("This is a {0} string using the {1} method.","formatted","static");
 */
function _StringFormatStatic()
{
	for (var i=1; i<arguments.length; i++)
	{
		var exp = new RegExp('\\{' + (i-1) + '\\}','gm');
		arguments[0] = arguments[0].replace(exp,arguments[i]);
	}
	return arguments[0];
}

String.prototype.format = _StringFormatInline;

String.format = _StringFormatStatic;

Date.prototype.TimeZoneOffset = function()
{
	var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
	var intOffset = 100; // set initial offset high so it is adjusted on the first attempt
	var intMonth;
	var intHoursUtc;
	var intHours;
	var intDaysMultiplyBy;
	// go through each month to find the lowest offset to account for DST
	for (intMonth=0;intMonth < 12;intMonth++)
	{
		//go to the next month
		dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);
		// To ignore daylight saving time look for the lowest offset. 
		// Since, during DST, the clock moves forward, it'll be a bigger number.
		if (intOffset > (dtDate.getTimezoneOffset() * (-1)))
		{
			intOffset = (dtDate.getTimezoneOffset() * (-1));
		}
	}
	return intOffset < -1 ? intOffset * (-1) : intOffset;
}

Date.prototype.format = function(format)
{
	var returnStr = '';
	var replace = Date.replaceChars;
	for (var i = 0; i < format.length; i++)
	{
		var curChar = format.charAt(i);
		if (replace[curChar])
		{
			returnStr += replace[curChar].call(this);
		}
		else
		{
			returnStr += curChar;
		}
	}
	return returnStr;
};

Date.replaceChars =
{
	shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
	// Day
	d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
	D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
	j: function() { return this.getDate(); },
	l: function() { return Date.replaceChars.longDays[this.getDay()]; },
	N: function() { return this.getDay() + 1; },
	S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
	w: function() { return this.getDay(); },
	z: function() { return "Not Yet Supported"; },
	// Week
	W: function() { return "Not Yet Supported"; },
	// Month
	F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
	m: function() { return (this.getMonth() < 11 ? '0' : '') + (this.getMonth() + 1); },
	M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
	n: function() { return this.getMonth() + 1; },
	t: function() { return "Not Yet Supported"; },
	// Year
	L: function() { return "Not Yet Supported"; },
	o: function() { return "Not Supported"; },
	Y: function() { return this.getFullYear(); },
	y: function() { return ('' + this.getFullYear()).substr(2); },
	// Time
	a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
	A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
	B: function() { return "Not Yet Supported"; },
	g: function() { return this.getHours() == 0 ? 12 : (this.getHours() > 12 ? this.getHours() - 12 : this.getHours()); },
	G: function() { return this.getHours(); },
	h: function() { return (this.getHours() < 10 || (12 < this.getHours() < 22) ? '0' : '') + (this.getHours() < 10 ? this.getHours() + 1 : this.getHours() - 12); },
	H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
	i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
	s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
	// Timezone
	e: function() { return "Not Yet Supported"; },
	I: function() { return "Not Supported"; },
	O: function() { return (this.getTimezoneOffset() < 0 ? '-' : '+') + (this.getTimezoneOffset() / 60 < 10 ? '0' : '') + (this.getTimezoneOffset() / 60) + '00'; },
	T: function() { return "Not Yet Supported"; },
	Z: function() { return this.getTimezoneOffset() * 60; },
	// Full Date/Time
	c: function() { return "Not Yet Supported"; },
	r: function() { return this.toString(); },
	U: function() { return this.getTime() / 1000; }
}

/**
 * @return 0 if equal, positive if date1 > date2, negative if date1 < date2.
 * @param {Object} date1
 * @param {Object} date2
 * @param {Object} portion
 */
Date.Compare = function(date1, date2, portion)
{
    // compare(date1: Date, date2: Date?, portion: String?); (hide source)
	// Extra step required in copy for IE - see #3112
	date1 = new Date(Number(date1));
	date2 = new Date(Number(date2 || new Date()));
	if (portion !== "undefined")
	{
		if (portion == "date")
		{
			// Ignore times and compare dates.
			date1.setHours(0, 0, 0, 0);
			date2.setHours(0, 0, 0, 0);
		}
		else
		{
		    if (portion == "time")
		    {
			    // Ignore dates and compare times.
			    date1.setFullYear(0, 0, 0);
			    date2.setFullYear(0, 0, 0);
		    }
		}
	}
	if (date1 > date2)
	{
	    return 1;
	} // int
	if (date1 < date2)
	{
	    return -1;
	} // int
	return 0; // int
}

/**
 * Event function helpers
 */

/**
 * Adds an handler to window on load event
 * @param {Object} fn Function to add to the window onload event
 */
function addLoadEvent(fn)
{
  var oldonload = window.onload;
  if (typeof window.onload != 'function')
  {
    window.onload = fn;
  }
  else
  {
    window.onload = function()
    {
      oldonload();
      fn();
    }
  }
}

/**
 * Adds a handler for an event on a dom object
 * @param {Object} obj Dom object which to attach the vent
 * @param {String} eventName Name of the event to attach
 * @param {Object} fn Function to attach to the event
 */
function addEvent(obj, eventName, fn)
{
	if (obj.addEventListener)
	{
  	    obj.addEventListener(eventName, fn, false);
    }
    else
    {
  	    if (obj.attachEvent)
  	    {
  		    obj["e" + eventName + fn] = fn;
  		    obj[eventName + fn] = function()
  		    {
  			    obj["e" + eventName + fn](window.event);
  		    }
  		    obj.attachEvent("on" + eventName, obj[eventName + fn]);
  	    }
    }
}

/**
 * Removes a hanlder for an event on a dom object
 * @param {Object} obj Dom object to which the event is attached
 * @param {String} eventName Name of the event to remove
 * @param {Object} fn Function to remove from the event
 * removeEvent( obj, 'mouseover', function );
 */
function removeEvent(obj, eventName, fn)
{
	if (obj.removeEventListener)
	{
    	obj.removeEventListener(type, fn, false);
    }
    else
    {
  	    if (obj.detachEvent)
  	    {
  		    obj.detachEvent("on" + type, obj[type + fn]);
  		    obj[type + fn] = null;
  		    obj["e" + type + fn] = null;
  	    }
    }
}

/*
	function newsletterForm_OnSubmit()
	{
		$("#newsletterFormSubmit").attr("disabled", "true");
		
		// validate form
		var contactForm = document.getElementById("newsletterform");
		var valid = validatenewsletter(contactForm);
		if(!valid)
		{
			$("#newsletterFormSubmit").removeAttr("disabled");
			return false;
		}

		var email = document.getElementById("newsLetterEmail");
		var firstname = document.getElementById("newsLetterFirstname");
		var lastname = document.getElementById("newsLetterLastname");
		var company = document.getElementById("newsLetterCompany");
		
		var url = "/fwTrackInWaveForm.aspx";

		var leadXml = "<leadDetail>" +
			"<email>" + email.value +"</email>" +
			"<first_name>" + firstname.value + "</first_name>" +
			"<last_name>" + lastname.value + "</last_name>" +
			"<bus_name>" + company.value + "</bus_name>" +
			"<udf3_c>Newsletter</udf3_c>" +
			"</leadDetail>";

		fwTrackInWave(url, leadXml);
	
		$("#newsletterFormSubmit").removeAttr("disabled");
		
		return true;
	}
*/