//	Miscellaneous	
	
	isEmailAddress = function (emailStr) 
		{
		//	The following pattern is used to check if the entered e-mail address
	 	//	fits the user@domain format.  It also is used to separate the username
	  	//	from the domain.
		var emailPat=/^(.+)@(.+)$/
		
		//	The following string represents the pattern for matching all special
		//	characters.  We don't want to allow special characters in the address. 
		//	These characters include ( ) < > @ , ; : \ " . [ ]    */
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	
		//	The following string represents the range of characters allowed in a 
		//	username or domainname.  It really states which chars aren't allowed. */
		var validChars="\[^\\s" + specialChars + "\]"
		
		//	The following pattern applies if the "user" is a quoted string (in
		//	which case, there are no rules about which characters are allowed
		//	and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
		//	is a legal e-mail address. */
		var quotedUser="(\"[^\"]*\")"
		
		//	The following pattern applies for domains that are IP addresses,
		//	rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
		//	e-mail address. NOTE: The square brackets are required. */
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
		
		//	The following string represents an atom (basically a series of
		//	non-special characters.) */
		var atom=validChars + '+'
		
		//	The following string represents one word in the typical username.
		//	For example, in john.doe@somewhere.com, john and doe are words.
		//	Basically, a word is either an atom or quoted string. */
		var word="(" + atom + "|" + quotedUser + ")"
		
		// The following pattern describes the structure of the user
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
		
		//	The following pattern describes the structure of a normal symbolic
		//	domain, as opposed to ipDomainPat, shown above. */
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
	
		//	Finally, let's start trying to figure out if the supplied address is
		//	valid.
	
		//	Begin with the coarse pattern to simply break up user@domain into
		//	different pieces that are easy to analyze.
		var matchArray=emailStr.match(emailPat)
		if (matchArray==null) 
			{
		  	//	Too many/few @'s or something; basically, this address doesn't
		    //	even fit the general mould of a valid e-mail address.
			return false
			}
		var user=matchArray[1]
		var domain=matchArray[2]
	
		//	See if "user" is valid 
		if (user.match(userPat)==null) 
			{
		    //	User is not valid
		    return false
			}
	
		//	if the e-mail address is at an IP address (as opposed to a symbolic
		//	host name) make sure the IP address is valid.
		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
			}
	
		//	Domain is symbolic name
		
		//	Special handling of localhost situation
		if (domain == "localhost")
			return true;
		
		var domainArray=domain.match(domainPat)
		if (domainArray==null) 
			{
		    return false
			}
	
		//	Domain name seems valid, but now make sure that it ends in a
		//	three-letter word (like com, edu, gov) or a two-letter word,
		//	representing country (uk, nl), and that there's a hostname preceding 
		//	the domain or country.
	
		//	Now we need to break up the domain to get a count of how many atoms
		//	it consists of.
		var atomPat=new RegExp(atom,"g")
		var domArr=domain.match(atomPat)
		var len=domArr.length
		var sfx = domArr [domArr.length-1].toLowerCase()
		if (sfx != "com" && sfx != "net" && sfx != "org" && sfx != "edu" && sfx != "gov" &&
			sfx != "int" && sfx != "mil" && sfx != "arpa" &&
			sfx != "biz" && sfx != "info" && sfx != "name" && sfx != "pro" &&
			sfx != "aero" && sfx != "coop" && sfx != "museum" &&  
			sfx.length != 2)	//	covers .us, .to, .cc, etc.
		    {
			return false
			}
	
		//	Make sure there are at least 2 components in the domain specification.
		if (len < 2) 
			{
			return false
			}
	
		//	If we've gotten this far, everything's probably valid!
		return true;
		};
				
//	Joing mailing list dialog

	showJoinListForm = function (anchor)
		{
		var sheet = $('sheet');
		sheet.style.display = '';
			
		var pos = Position.cumulativeOffset (anchor);
		var right = pos[0] + anchor.offsetWidth;
		var top   = pos[1] + anchor.offsetHeight;
			
		$('joinfn'		).value = '';
		$('joinln'		).value = '';
		$('joinemail'	).value = '';
	
		var f = $('joinListForm');
		f.style.visibility = 'hidden';
		f.style.display = '';
		f.style.top  = top  + 'px';
		f.style.left = (right - f.offsetWidth) + 'px';
		f.style.visibility = 'visible';
			
		};
			
	hideJoinListForm = function ()
		{
		$('sheet'   	).style.display = 'none';
		$('joinListForm').style.display = 'none';
		};
			
	joinListNow = function ()
		{
		var fn = $F('joinfn');
		var ln = $F('joinln');
		var em = $F('joinemail');
			
		if (!(fn || ln))
			{
			alert ('Need your name');
			return;
			}
			
		if ((!em) || (!isEmailAddress(em)))
			{
			alert ('Need your e-mail address');
			return;
			}
			
		hideJoinListForm();
			
		var param = 'ts='+(new Date().getTime());
		param += '&First+Name='+encodeURIComponent(fn);
		param += '&Last+Name='+encodeURIComponent(ln);
		param += '&E-mail+Address='+encodeURIComponent(em);
		param += '&Newsletter=Yes';
			
		var rightNow = new Date();
		//	Get Jan 1
		var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
		//	Get Jan 1 in the local time of this browser
		var temp = date1.toGMTString();											//	e.g., Thu, 1 Jan 2008 22:05:52 GMT
		var date2 = new Date (temp.substring(0, temp.lastIndexOf(" ")-1));
		//	Compute time zone offset on Jan 1 when DST cannot apply	  
		var btzom = (date2 - date1) / (1000 * 60);		//	this is in minutes
			
		param += '&ao_jstzo='+encodeURIComponent(btzom);
	
		$('eyeframe').src = 'http://www.actonsoftware.com/acton/eform/248/001d/d-ext-0001?' + param;
			
		alert (
			'Thank you for joining our mailing list. \n' +
			' \n' + 
			'You will hear from us about a couple of times a month, \n' +
			'usually with tips and tricks for your marketing efforts. \n' +
			' \n' + 
			'Your e-mail address is safe with us. We will never sell, \n' + 
			'rent or share it with any outside company. \n' + 
			' '
			);
		};
		
//	Cookies

	_setCookie = function (name, value, expires, path, domain, secure)
		{
	    document.cookie= name + "=" + escape(value) +
	        ((expires) ? "; expires=" + expires.toGMTString() : "") +
	        ((path)    ? "; path=" + path : "") +
	        ((domain)  ? "; domain=" + domain : "") +
	        ((secure)  ? "; secure" : "");
		};
		
	setCookie = function (name, value)
		{
		_setCookie (name, value, null, '/', null, null);
		};
		
	getCookie = function (name)
		{
	    var dc = document.cookie;
	    var prefix = name + "=";
	    var begin = dc.indexOf("; " + prefix);
	    if (begin == -1)
	    	{
	        begin = dc.indexOf(prefix);
	        if (begin != 0) return null;
	    	}
	    else
	    	{
	        begin += 2;
	    	}
	    var end = document.cookie.indexOf(";", begin);
	    if (end == -1)
	    	{
	        end = dc.length;
	    	}
	    return unescape(dc.substring(begin + prefix.length, end));
		};
	
	deleteCookie = function (name)
		{
		var expirationDate = new Date();
		expirationDate.setYear (expirationDate.getYear() - 1);
		expirationDate = expirationDate.toGMTString();
	    	
	    document.cookie = name + "=; expires=" + expirationDate;
	    document.cookie = name + "=; path=/; expires=" + expirationDate;
		};	
