// Author: Vince Reid, vince@virtualred.net
// Copyright: Internet Business Solutions S.L.
// http://www.virtualred.net
// VirtualMenu: v1.8
var globalsdefined=false; 
var ie,ns6,ns,opera,globmenuid,c1,ie5_5; 

function defineglobals()
{ 
	if(globalsdefined==true) 
		return; 
	
	globalsdefined=true; 
	ie=document.all; 
	ns6=document.getElementById&&!document.all; 
	ns=document.layers; opera=false; 
	ie5_5=false; 
	
	if(ie)
	{ 
		var agent = navigator.userAgent.toLowerCase(); 
		opera = (agent.indexOf("opera") != -1); 
		ie5_5=true;
	} 
	
	globmenuid=1; 
	c1 = new Array();
}; 
	
function a4() 
{ 
	if(ie||ns6) 
		this.style.visibility="visible"; 
	else if(ns) 
		this.visibility="show"; 
}; 

function a7() 
{ 
	if(ie||ns6) 
		this.style.visibility="hidden"; 
	else if(ns) 
		this.visibility="hide";
}; 

function setsubmenu(themenu,mn)
{ 
	var offsetleft = 0; 
	if(ie)
	{ 
		var mnp = mn; 
		do 
		{ 
			offsetleft += mnp.offsetLeft; 
			mnp = mnp.offsetParent; 
		} while (mnp != null); 
		
		mnn = eval(mn.id+"sub"); 
		mnn.style.pixelTop = themenu.offsetTop + 14; 
		mnn.style.pixelLeft = offsetleft; 
		mnn.style.visibility="hidden";
	} else if(ns)
	{
		mnn = eval('document.layers.'+mn.id+"sub"); 
		mnn.left = mn.pageX; mnn.top = mn.pageY-3; 
		mnn.visibility="hide"; 
	} else if(ns6)
	{
		mnn = document.getElementById(mn.id+"sub"); 
		mnn.style.top = mn.offsetTop + 14; 
		mnn.style.left = mn.offsetLeft; 
		mnn.style.visibility="hidden"; 
	} 
	
	mnn.onmouseover=a4; 
	mnn.onmouseout=a7; 
}; 

function menushow(mn)
{ 
	if(ie||ns6)
	{ 
		var mnp = mn; var offsetleft = 0; var offsettop = 0; 
		do 
		{ 
			offsetleft += mnp.offsetLeft; 
			offsettop += mnp.offsetTop; 
			mnp = mnp.offsetParent; 
		} while (mnp != null); 
		
		if(ns6) 
			mnn = document.getElementById(mn.id+'sub'); 
		else 
			mnn = eval(mn.id+"sub"); 
		
		if(ie5_5) 
			offsettop-=1; 
			
		if(opera)
		{ 
			mnn.style.pixelTop = offsettop + 13; 
			mnn.style.pixelLeft = offsetleft;
		} else if(ns6)
		{ 
			mnn.style.top = offsettop + mn.offsetHeight; 
			mnn.style.left = offsetleft;
		} else
		{ 
			mnn.style.pixelTop = offsettop + mn.offsetHeight; 
			mnn.style.pixelLeft = offsetleft;
		} 
		
		mnn.style.visibility="visible";
	} else if(ns)
	{
		mnn = eval(mn+'sub'); 
		mnp=eval(mn+'glob.'+mn); 
		mnn.left = mnp.pageX; 
		mnn.top = mnp.pageY-3; 
		mnn.visibility="show";
	}
}; 

function menuhide(mn)
{
	if(ie)
	{
		mnn = eval(mn.id+"sub"); 
		mnn.style.visibility="hidden";
	} else if(ns)
	{
		mnn = eval(mn+'sub');
		mnn.visibility="hide";
	} else if(ns6)
	{
		mnn = document.getElementById(mn.id+'sub'); 
		mnn.style.visibility="hidden";
	}
}; 
	
function Menu()
{
	Menu.prototype.addMenu = function addMenu(mid, mtext)
	{
		if (c1[mid]) 
			alert('Menu id '+mid+' is already defined as '+c1[mid]); 
			
		if (c0==true)
			alert('You have to define all the main menus before defining the sub menus');
			
		c1[mid]=mid;
		
		if(ie)
		{
			this.d8 += '<td align="'+this.maincalign+'" bgcolor="'+this.maincbgcolor+'" bordercolor="'+this.maincbordercolor+'">';
			this.d8 += '<div id="'+mid+'" onMouseover="menushow(this)" onMouseout="menuhide(this)" STYLE="position:relative; z-index: 6">';
			this.d8 += '<font color="'+this.fontcolor+'" face="'+this.font+'" size="'+this.size+'">'+mtext+'</font></div></td>';
		} else if(ns)
		{
			this.d8 += '<td align="left" bgcolor="'+this.maincbgcolor+'" bordercolor="'+this.maincbordercolor+'">';
			this.d8 += '<ilayer id="'+mid+'glob">'; 
			this.d8 += '<layer id="'+mid+'" bgcolor="'+this.maincbgcolor+'" onmouseover="menushow(\'document.layers.'+mid+'\')" onMouseout="menuhide(\'document.layers.'+mid+'\')">'; 
			this.d8 += '<font color="'+this.fontcolor+'" face="'+this.font+'" size="'+this.size+'">'+mtext+'</font></layer></ilayer></td>\n';
		} else if(ns6)
		{
			this.d8 += '<td align="'+this.maincalign+'" bgcolor="'+this.maincbgcolor+'" bordercolor="'+this.maincbordercolor+'">'; 
			this.d8 += '<div id="'+mid+'" onMouseover="menushow(this)" onMouseout="menuhide(this)" STYLE="position:relative; z-index: 6">'; 
			this.d8 += '<font color="'+this.fontcolor+'" face="'+this.font+'" size="'+this.size+'">'+mtext+'</font></div></td>';
		}
	};
	
	Menu.prototype.addSubMenu = function addSubMenu(mid, mtext, murl)
	
	{ 
		if (c1[mid]==null)
			alert('The menu id ' + mid + ' is not defined');
	
		if(this.g4 != mid)
		{
			if(this.g4!=null)
			{
				if(ns)
					this.d7 += '</table></layer>'; else this.d7 += '</table></div>';
			}
			
			this.g4=mid;
			
			if(ie)
				this.d7 += '<div id="'+mid+'sub" style="position:absolute; z-index:2; visibility: hidden; width:200; height:10;">\n';
			else if(ns6)
				this.d7 += '<div id="'+mid+'sub" style="position:absolute; z-index:2; visibility: hidden;">\n';
			else if(ns)
				this.d7 += '<layer id="'+mid+'sub" visibility="hide">&nbsp;\n'; 
				
			this.d7 += '<table border="'+this.subtborder+'" cellspacing="'+this.subtspacing+'" cellpadding="'+this.subtpadding+'" bgcolor="'+this.subtbgcolor+'">\n';
		} 
		
		this.d7 += '<tr><td align="'+this.subcalign+'" bgcolor="'+this.subcbgcolor+'" bordercolor="'+this.subcbordercolor+'"><font color="'+this.fontcolor+'" face="'+this.font+'" size="'+this.size+'"><img src="images/clearpixel.gif" border="0" width=4 height=10><a style="color: '+this.fontcolor+'; text-decoration: none;" href="'+murl+'">'+mtext+'</a>&nbsp;</font></td></tr>\n';
	};
	
	Menu.prototype.startMenu = function startMenu()
	
	{ 
		if(opera)
			this.d8 += '<div id="vrmenu'+globmenuid+'" STYLE="position:relative">\n'; 
		else if(ie) 
			this.d8 += '<div id="vrmenu'+globmenuid+'" STYLE="position:absolute; width:100; height:10;">\n'; 
		else if(ns6)
			this.d8 += '<div id="vrmenu'+globmenuid+'" STYLE="position:relative;">\n'; 
			
		this.d8 += '<table border="'+this.maintborder+'" cellspacing="'+this.maintspacing+'" cellpadding="'+this.maintpadding+'" bgcolor="'+this.maintbgcolor+'"><tr>\n';
	}; 
	
	Menu.prototype.showMainMenu = function showMainMenu() 
	
	{ 
		if(ie||ns6)
			this.d8 += '</tr></table></div>'; 
		else if(ns)
			this.d8 += '</tr></table></layer>'; 
			
		document.write(this.d8); 
	};
	
	Menu.prototype.showMenu = function showMenu() 
	
	{ 
		if(ie) 
			this.d7 += '</table></div>&nbsp;'; 
		else if(ns6) 
			this.d7 += '</table></div>'; 
		else if(ns) 
			this.d7 += '</table></layer>'; 
			
		document.write(this.d7); 
		
		for(men in c1) 
		{ 
			if(c1[men]!=1) 
			{ 
				if(ie) 
					setsubmenu(eval('document.all.vrmenu'+globmenuid),eval(document.all[men])); 
				else if(ns) 
					setsubmenu(eval('document.layers.'+men+'glob'),eval('document.'+men+'glob.document.'+men)); 
				else if(ns6) 
					setsubmenu(eval(document.getElementById('vrmenu'+globmenuid)),eval(document.getElementById(men))); c1[men]=1;
			} 
		} 
			
			globmenuid++; 
	}; 
		
	Menu.prototype.maintableprops = function(bgcolor,spacing,padding,border)
		
	{ 
		this.maintbgcolor = bgcolor; 
		this.maintspacing = spacing; 
		this.maintpadding = padding; 
		this.maintborder = border; 
	}; 
		
	Menu.prototype.maincellprops = function maincellprops(align,bgcolor,bordercolor)
	{ 
		this.maincalign = align; 
		this.maincbgcolor = bgcolor; 
		this.maincbordercolor = bordercolor; 
	}; 
		
	Menu.prototype.subtableprops = function subtableprops(bgcolor,spacing,padding,border)
		
	{ 
		this.subtbgcolor = bgcolor; 
		this.subtspacing = spacing; 
		this.subtpadding = padding; 
		this.subtborder = border; 
	}; 
		
	Menu.prototype.subcellprops = function subcellprops(align,bgcolor,bordercolor)
	
	{ 
		this.subcalign = align; 
		this.subcbgcolor = bgcolor; 
		this.subcbordercolor = bordercolor; 
	}; 
		
	Menu.prototype.fontdetails = function fontdetails(font,size,color)
		
	{ 
		this.font = font; 
		this.size = size; 
		this.fontcolor = color;
	}; 
		
	defineglobals(); 
	
	this.maintableprops("#cfcfcf",1,2,1); 
	this.maincellprops("center","#cfcfcf","#000000"); 
	this.subtableprops("#cfcfcf",1,2,1); 
	this.subcellprops("left","#eeeeee","#000000"); 
	this.fontdetails("Arial",3,"#000000"); 
	this.g4=null; this.d8 = ""; this.d7 = ""; c0=false; c1['vrmenu'+globmenuid]=1;
}; 

function CreateMenu() 
{
	//defines menu items
	mymenu = new Menu
	//defines colour of main table border and positioning
	mymenu.maintableprops("#317891",0,0,0)
	//defines colour of main cells and positioning
	mymenu.maincellprops("left","#317891","#317891")
	//defines colour of sub table cell borders and positioning
	if (ns6) { mymenu.subtableprops("#317891",0,2,0) }
	else { mymenu.subtableprops("#317891",1,1,0) }
	//defines colour of sub cells and positioning
	mymenu.subcellprops("left","#317891","#317891")
	//defines font type, size and colour
	mymenu.fontdetails("Arial",2,"#ffffcc")
	mymenu.startMenu()
	//defines the names of the links
	mymenu.addMenu("products","<b>&nbsp;Products&nbsp;&nbsp;&nbsp;</b>")
	mymenu.addMenu("solutions","<b>&nbsp;Solutions&nbsp;&nbsp;&nbsp;</b>")
	mymenu.addMenu("support","<b>&nbsp;Support&nbsp;&nbsp;&nbsp;</b>")
	mymenu.addMenu("pricing","<b>&nbsp;Pricing&nbsp;&nbsp;&nbsp;</b>")
	mymenu.addMenu("download","<b>&nbsp;Download&nbsp;&nbsp;&nbsp;</b>")
	mymenu.addMenu("order","<b>&nbsp;Order&nbsp;&nbsp;&nbsp;</b>")
	mymenu.addMenu("login","<b>&nbsp;Login&nbsp;</b>")
	mymenu.showMainMenu()
	//defines the drop down links category name - name to appear - URL
	mymenu.addSubMenu("products", "&nbsp;For&nbsp;Excel&nbsp;Users", "http://www.solver.com/exceluse.htm")
	mymenu.addSubMenu("products", "&nbsp;For&nbsp;Developers", "http://www.solver.com/developer.htm")
	mymenu.addSubMenu("products", "&nbsp;Premium&nbsp;Solver", "http://www.solver.com/xlspremsolv.htm")
	mymenu.addSubMenu("products", "&nbsp;Premium&nbsp;Solver&nbsp;Platform", "http://www.solver.com/xlsplatform.htm")
	mymenu.addSubMenu("products", "&nbsp;Risk&nbsp;Solver", "http://www.solver.com/risksolver.htm")
	mymenu.addSubMenu("products", "&nbsp;Risk&nbsp;Solver&nbsp;Engine", "http://www.solver.com/xlsriskeng.htm")
	mymenu.addSubMenu("products", "&nbsp;Solver&nbsp;Platform&nbsp;SDK", "http://www.solver.com/sdkplatform.htm")
	mymenu.addSubMenu("products", "&nbsp;Large-Scale&nbsp;LP/QP&nbsp;Solver", "http://www.solver.com/xlslslpeng.htm")
	mymenu.addSubMenu("products", "&nbsp;Large-Scale&nbsp;GRG&nbsp;Solver", "http://www.solver.com/xlslsgrgeng.htm")
	mymenu.addSubMenu("products", "&nbsp;Large-Scale&nbsp;SQP&nbsp;Solver", "http://www.solver.com/xlslssqpeng.htm")
	mymenu.addSubMenu("products", "&nbsp;KNITRO&nbsp;Solver", "http://www.solver.com/xlsknitroeng.htm")
	mymenu.addSubMenu("products", "&nbsp;MOSEK&nbsp;Solver", "http://www.solver.com/xlsmosekeng.htm")
	mymenu.addSubMenu("products", "&nbsp;XPRESS&nbsp;Solver", "http://www.solver.com/xlsxpresseng.htm")
	mymenu.addSubMenu("products", "&nbsp;OptQuest&nbsp;Solver", "http://www.solver.com/xlsoptqeng.htm")
	//mymenu.addSubMenu("products", "&nbsp;LGO&nbsp;Global&nbsp;Solver", "http://www.solver.com/xlslgoeng.htm")
	mymenu.addSubMenu("products", "&nbsp;Support/Upgrades", "http://www.solver.com/support.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Overview", "http://www.solver.com/solutions.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Finance", "http://www.solver.com/finframe.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Investment", "http://www.solver.com/invframe.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Production", "http://www.solver.com/proframe.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Distribution", "http://www.solver.com/disframe.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Purchasing", "http://www.solver.com/purframe.htm")
	mymenu.addSubMenu("solutions", "&nbsp;Scheduling", "http://www.solver.com/schframe.htm")
	mymenu.addSubMenu("support", "&nbsp;Solver&nbsp;Tutorial", "http://www.solver.com/tutorial.htm")
	mymenu.addSubMenu("support", "&nbsp;FAQs&nbsp;and&nbsp;Hints", "http://www.solver.com/suppfaqhint.htm")
	mymenu.addSubMenu("support", "&nbsp;Recommended&nbsp;Books", "http://www.solver.com/supprecbooks.htm")
	mymenu.addSubMenu("support", "&nbsp;Standard&nbsp;Excel&nbsp;Solver", "http://www.solver.com/suppstdsolver.htm")
	mymenu.addSubMenu("support", "&nbsp;Excel&nbsp;User&nbsp;Guide", "http://www.solver.com/suppxlsguide.htm")
	mymenu.addSubMenu("support", "&nbsp;SDK&nbsp;User&nbsp;Guide", "http://www.solver.com/suppsdkguide.htm")
	mymenu.addSubMenu("support", "&nbsp;Excel&nbsp;Product&nbsp;Support", "http://www.solver.com/supportxls.htm")
	mymenu.addSubMenu("support", "&nbsp;SDK&nbsp;Product&nbsp;Support", "http://www.solver.com/supportdll.htm")
	mymenu.addSubMenu("support", "&nbsp;Consulting&nbsp;Assistance", "http://www.solver.com/suppconsult.htm")
	mymenu.addSubMenu("pricing", "&nbsp;Excel&nbsp;Products", "http://www.solver.com/pricexls.php")
	mymenu.addSubMenu("pricing", "&nbsp;SDK&nbsp;Products", "http://www.solver.com/pricesdk.php")
	mymenu.addSubMenu("pricing", "&nbsp;Support/Upgrades", "http://www.solver.com/pricesupport.php")
	mymenu.addSubMenu("pricing", "&nbsp;Consulting&nbsp;Assistance", "http://www.solver.com/priceconsult.htm")
	mymenu.addSubMenu("pricing", "&nbsp;Flexible&nbsp;Use&nbsp;Licenses", "http://www.solver.com/priceconcurrent.htm")
	//mymenu.addSubMenu("pricing", "&nbsp;Quantity&nbsp;Discounts", "http://www.solver.com/pricequantity.htm")
	mymenu.addSubMenu("pricing", "&nbsp;Competitive&nbsp;Upgrades", "http://www.solver.com/pricecompetitive.php")
	mymenu.addSubMenu("pricing", "&nbsp;Invoicing&nbsp;and&nbsp;Payment", "http://www.solver.com/priceterms.htm")
	mymenu.addSubMenu("pricing", "&nbsp;Academic&nbsp;Prices", "http://www.solver.com/priceacademic.htm")
	mymenu.addSubMenu("pricing", "&nbsp;Distribution&nbsp;Licenses", "http://www.solver.com/pricedistrib.htm")
	mymenu.addSubMenu("download", "&nbsp;Login&nbsp;First", "http://www.solver.com/login.htm")
	mymenu.addSubMenu("download", "&nbsp;Excel&nbsp;Products", "http://www.solver.com/dwnxls.php")
	mymenu.addSubMenu("download", "&nbsp;SDK&nbsp;Products", "http://www.solver.com/dwnsdk.php")
	mymenu.addSubMenu("download", "&nbsp;Free&nbsp;Stuff", "http://www.solver.com/dwnfree.php")
	//mymenu.addSubMenu("order", "&nbsp;Shopping&nbsp;Cart", "http://www.solver.com/ordercart.htm")
	mymenu.addSubMenu("order", "&nbsp;Excel&nbsp;Products", "http://www.solver.com/orderxls.htm")
	mymenu.addSubMenu("order", "&nbsp;SDK&nbsp;Products", "http://www.solver.com/ordersdk.htm")
	mymenu.addSubMenu("login", "&nbsp;Register", "http://www.solver.com/register.htm")
	mymenu.addSubMenu("login", "&nbsp;Login", "http://www.solver.com/login.htm")
	mymenu.addSubMenu("login", "&nbsp;Logout", "http://www.solver.com/logout.php")
	mymenu.addSubMenu("login", "&nbsp;Account", "http://www.solver.com/accountedit.php")
	mymenu.addSubMenu("login", "&nbsp;Password", "http://www.solver.com/chgpassword.htm")
	mymenu.showMenu()
}

// solver.com javascript master control
// 	version 0.6 by Chris of Frontline Systems
//
// 
// a short system to set a cookie when a person visits solver.com.
// it's run if the person doesn't have that particular cookie.
//
// includes Burak GŸrsoy's HTTP.Cookies-1.11

function startupSolverJS() {
//	include_dom('/v65announce.js');
	startupVisitorCookie() ;

// the following calls are for debugging only.
//	clearVisitorCookie();
//	reportOnCookie() ;
//	checkVisitorCookie();
}

function startupVisitorCookie() {
	if ( document.referrer ) { // get HTTP referer
		dr = document.referrer ;
		if(dr.indexOf('solver.com') == -1) { 
			// referral is not from solver.com
			checkVisitorCookie();
		}
	}
}


function timeSieve() {
	var startTime = new Date().getTime();
	var stest = doSieve(16384) ;
//	alert("primes below 256:" + stest );
	var endTime = new Date().getTime();
	var timeElapsed = endTime - startTime ;
	return timeElapsed ;
}

function fillFields() {
	var cookie    = new HTTP.Cookies;
	var fv = cookie.read('firstvisit'); 
	var firstvisitdate = new Date( fv * 1);
	
	var fvd = firstvisitdate.getDate(); // Day of the month (1-31)
    var fvm = firstvisitdate.getMonth() + 1; // Number of month (0-11) + 1
    var fvy = firstvisitdate.getFullYear(); // The four digit year (1970-9999)
	var firstvisitdate = fvm + "/" + fvd + "/" + fvy ;

	document.getElementById('solverid').value = cookie.read('uid'); 
	document.getElementById('firstvisit').value = firstvisitdate ;
	document.getElementById('referrer').value = cookie.read('referer'); 		
	document.getElementById('firstpage').value = cookie.read('landing'); 
	document.getElementById('formpage').value = document.URL; 
}


function timestampCookie() {
	var now = new Date().getTime();
	var cookie    = new HTTP.Cookies;
	cookie.write( 'firstvisit', now, '+3y' );
}

function refstampCookie() {
	var dr = document.referrer ;
	var cookie    = new HTTP.Cookies;
	cookie.write( 'referer', dr, '+3y' );
}

function landingstampCookie() {
	var lr =  location.href ;
	var cookie    = new HTTP.Cookies;
	cookie.write( 'landing', lr, '+3y' );
}

function uidstampCookie() {
	var utime = new Date().getTime();
	var sieveMillis = timeSieve();
	var ustring = utime + "0000" + sieveMillis;
	var unum = ustring ;
	var cookie    = new HTTP.Cookies;
	cookie.write( 'uid', unum, '+3y' );
}


function setupVisitorCookie() {	
	refstampCookie();
	uidstampCookie();
	landingstampCookie();
	timestampCookie();
}

function updateVisitorCookie() {		
//	timestampCookie();
// let the original cookie date be the timestamp.
}

function clearVisitorCookie() {
	var cookie    = new HTTP.Cookies;
	cookie.remove( 'firstvisit' );
	cookie.remove( 'uid' );
	cookie.remove( 'referer' );
	cookie.remove( 'landing' );
	alert ("visitor cookies cleared." );
}

function checkVisitorCookie() {
	var cookie    = new HTTP.Cookies;
	var uid = cookie.read('referer'); 
	if (uid) {
		updateVisitorCookie() ;
//		reportOnCookie() ;
	} else {
		setupVisitorCookie();
	}
}

function reportOnCookie() {
	var cookie    = new HTTP.Cookies;
	var uid = cookie.read('uid'); 
	var firstvisit = cookie.read('firstvisit'); 
	var firstvisitdate = new Date( firstvisit * 1000);

	var referer = cookie.read('referer'); 
//	alert ("hello again " + uid + ". referer: " + referer );
	alert ("First visit: " + firstvisitdate );
}



// ---------------------------------------------------------
// ---------------------------------------------------------
// INCLUDEs

// ---------------------------------------------------------
// Javascript runtime include code
// 		from http://www.phpied.com/javascript-include/
//
function include_dom(script_filename) {
    var html_doc = document.getElementsByTagName('head').item(0);
    var js = document.createElement('script');
    js.setAttribute('language', 'javascript');
    js.setAttribute('type', 'text/javascript');
    js.setAttribute('src', script_filename);
    html_doc.appendChild(js);
    return false;
}

// Javascript <-> PHP RPC code
// 		from http://www.phpied.com/javascript-include/
//
function include_rpc(script_filename) {
    script_filename += '?' + Math.random(0, 1000) + '=' + Math.random(0, 1000);
    var html_doc = document.getElementsByTagName('head').item(0);
    var js = document.createElement('script');
    js.setAttribute('language', 'javascript');
    js.setAttribute('type', 'text/javascript');
    js.setAttribute('src', script_filename);
    html_doc.appendChild(js);
    return false;
}
// ---------------------------------------------------------


// ---------------------------------------------------------
//	HTTP.Cookies by Burak Gursoy <burak[at]cpan[dot]org>
/*
AUTHOR: Burak GŸrsoy, <burak@cpan.org>
COPYRIGHT: Copyright 2005-2007 Burak GŸrsoy. All rights reserved.
LICENSE: This library is free software; you can redistribute it 
and/or modify it under the terms of the "Artistic License": 
http://dev.perl.org/licenses/artistic.html.
*/

if (!HTTP) var HTTP = {};

HTTP.Cookies = function () {
   this._reset();
}

// expire time calculation
HTTP.Cookies.Date = function () {
   this._init();
}

HTTP.Cookies.VERSION     = '1.11';
HTTP.Cookies.ERRORLEVEL  = 1;
HTTP.Cookies.Date.FORMAT = {
   's' :  1,
   'm' : 60,
   'h' : 60 * 60,
   'd' : 60 * 60 * 24,
   'M' : 60 * 60 * 24 * 30,
   'y' : 60 * 60 * 24 * 365
};

HTTP.Cookies.prototype._reset = function () {
   this['JAR']     = ''; // data cache
   this['CHANGED'] =  0; // cookies altered?
}

// Get the value of the named cookie. Usage: password = cookie.read('password');
HTTP.Cookies.prototype.read = function (name) {
	if(!name) return this._fatal('read', 'Cookie name is missing');
   if(this.CHANGED) this._reset();
   // first populate the internal cache, then return the named cookie
   var value = '';
   this._parse();
   for ( var cookie in this.JAR ) {
      if ( cookie == name ) {
         value = this.JAR[cookie];
         break;
      }
	}
   return value ? value : '';
}

// Create a new cookie or overwrite existing.
// Usage: cookie.write('password', 'secret', '1m');
HTTP.Cookies.prototype.write = function (name, value, expires, path, domain, secure) {
	if(!name) return this._fatal('write', 'Cookie name is missing');
	if(typeof value == 'undefined') value = ''; // workaround
   if (!expires) expires = '';
   if (expires == '_epoch') {
      expires = new Date(0);
   }
   else if (expires != -1) {
      var cdate = new HTTP.Cookies.Date;
      var Now   = new Date;
      Now.setTime(Now.getTime() + cdate.parse(expires));
      expires = Now.toGMTString();
   }
   var extra = '';
   if(expires) extra += '; expires=' + expires;
   if(path   ) extra += '; path='    + path;
   if(domain ) extra += '; domain='  + domain;
   if(secure ) extra += '; secure='  + secure;
   // name can be non-alphanumeric
   var new_cookie  = escape(name) + '=' + escape(value) + extra;
   document.cookie = new_cookie;
   this.CHANGED    = 1; // reset the object in the next call to read()
}

// Delete the named cookie. Usage: cookie.remove('password');
HTTP.Cookies.prototype.remove = function (name, path, domain, secure) {
	if(!name) return this._fatal('remove', 'Cookie name is missing');
   this.write(name, '', '_epoch', path, domain, secure);
}

// cookie.obliterate()
HTTP.Cookies.prototype.obliterate = function () {
   var names = this.names();
   for ( var i = 0; i < names.length; i++ ) {
		if ( !names[i] ) continue;
      this.remove( names[i] );
	}
}

// var cnames = cookie.names()
HTTP.Cookies.prototype.names = function () {
   this._parse();
   var names = [];
   for ( var cookie in this.JAR ) {
		if ( !cookie ) continue;
      names.push(cookie);
	}
	return names;
}

HTTP.Cookies.prototype._parse = function () {
   if(this.JAR) return;
	this.JAR  = {};
   var NAME  = 0; // field id
   var VALUE = 1; // field id
   var array = document.cookie.split(';');
   for ( var element = 0; element < array.length; element++ ) {
      var pair = array[element].split('=');
      pair[NAME] = pair[NAME].replace(/^\s+/, '');
      pair[NAME] = pair[NAME].replace(/\s+$/, '');
      // populate
      this.JAR[ unescape(pair[NAME]) ] = unescape( pair[VALUE] );
   }
}

HTTP.Cookies.prototype._fatal = function (caller, error) {
   var title = 'HTTP.Cookies fatal error';
   switch(HTTP.Cookies.ERRORLEVEL) {
      case 1:
         alert( title + "\n\n"  + caller + ': ' + error );
         break;
      default:
         break;
   }
}

HTTP.Cookies.Date.prototype._fatal = function (caller, error) {
   var title = "HTTP.Cookies.Date fatal error";
   switch(HTTP.Cookies.ERRORLEVEL) {
      case 1:
         alert( title + "\n\n"  + caller + ': ' + error );
         break;
      default:
         break;
   }
}

// HTTP.Cookies.Date Section begins here

HTTP.Cookies.Date.prototype._init = function () {
   this.FORMAT = HTTP.Cookies.Date.FORMAT;
}

HTTP.Cookies.Date.prototype.parse = function (x) {
   if(!x || x == 'now') return 0;
   var NUMBER = 1;
   var LETTER = 2;
   var date = x.match(/^(.+?)(\w)$/i);

   if ( !date ) {
		return this._fatal(
			       'parse',
			       'expires parameter (' + x + ') is not valid'
			    );
	}

   var is_num = this.is_num(  date[NUMBER] );
   var of     = this.is_date( date[NUMBER], date[LETTER] );
   return (is_num && of) ? of : 0;
}

HTTP.Cookies.Date.prototype.is_date = function (num, x) {
   if (!x || x.length != 1) return 0;
   var ar = [];
   return (ar = x.match(/^(s|m|h|d|w|M|y)$/) ) ? num * 1000 * this.FORMAT[ ar[0] ] : 0;
}

HTTP.Cookies.Date.prototype.is_num = function (x) {
   if (x.length == 0) return;
   var ok = 1;
   for (var i = 0; i < x.length; i++) {
      if ( "0123456789.-+".indexOf( x.charAt(i) ) == -1 ) {
         ok--;
         break;
      }
   }
   return ok;
}

//	End HTTP Cookies 1.11   
// ---------------------------------------------------------


// ---------------------------------------------------------
//	Sieve of Eratosthenes from http://tide4javascript.com/?s=Sieve
	// The Sieve of Eratosthenes is a simple, ancient algorithm for
	// finding all prime numbers up to a specified integer, see Wikipedia
	// This implementation is not so simple, but fast

function doSieve(upperlimit) {
	// watch:i,n,sieve
	var MAXN= upperlimit; // maximum value of N
	var P1 = Math.ceil(MAXN/64);
	var P2 = Math.ceil(MAXN/2);
	var P3 = Math.ceil(Math.ceil(Math.sqrt(MAXN))/2);
	var sieve=new Array();
	
	function get(b){
	  return ((sieve[b>>5]>>(b&31))&1);
	}
	
	function make(){
		 var i, j, k;
		 for (k = 1; k <= P3; k++){
			 if (get(k)==0) {
				for(j=2*k+1,i=2*k*(k+1);i<P2;i+=j) {
				  sieve[i>>5]|=1<<(i&31);
				}
			 }
		 }
	}
	   
	function isprime(p) {
		return p==2 || (p>2 && (p&1)==1 && (get((p-1)>>1)==0));
	}
	
	var i, n;
	make();
	for (n = 0, i = 0; i < MAXN; i++){
		if (isprime(i)) n++;
	}
//	alert('The number of primes below '+MAXN + ' is ' + n)
	return n;
}
//	end Sieve
// ---------------------------------------------------------

// -----------------------------------
// startup

startupSolverJS();


// BEGIN WEBSIDESTORY CODE
// COPYRIGHT 1997-2001 WEBSIDESTORY, INC. ALL RIGHTS RESERVED. U.S.PATENT PENDING.
// Privacy notice at: http://websidestory.com/privacy
 var _cp="null"; 		//campaign
 var _acct="WR5109182LWF94EN3"; //account number(s)
 var _pndef="title"; 		//default page name
 var _ctdef="full"; 		//default content category
 var _dlf="n";			//download filter
 var _elf="n";			//exit link filter
 var _epg="n"; 			//event page identifier
 var _hcv=65;			//code version
 var _mn="wp169";		//machine name
 var _gn="phg.hitbox.com";	//gateway name
 var _bn=navigator.appName;if(_bn.substring(0,9)=="Microsoft"){_bn="MSIE";};
 var _bv=(Math.round(parseFloat(navigator.appVersion)*100));if((_bn=="MSIE")&&(parseInt(_bv)==2))_bv=301;
function _wn(_nm){if((_nm.indexOf("NAME")>0&&_nm.indexOf("PUT")>=0)||
 (_nm.indexOf("CONTENT")>=0&&_nm.indexOf("CATEGORY")>0))return true;return false;}
 function _gd(_x,_w){_ed = (_x.lastIndexOf("/"));
 _be = (_w!="full")?(_x.lastIndexOf("/",(_ed-2))):(_x.indexOf("/"));
 _dn = (_be==_ed)?"/":(_x.substring(_be, _ed));return _dn;}
 function _gf(_x){_ed = (_x.length);_be = ((_x.lastIndexOf("/"))+1);
 _fn = (_x.substring(_be, _ed));return _fn;}
 function _vc(_ml){_mll=_ml.length-1;if(_ml.lastIndexOf("/")==_mll){_ml=_ml.substring(0,_mll)}
 if(_ml.indexOf("/")!=0){_ml="/"+_ml;}return _ml;}
 function _ps(_ip,_pml){if(!_ip){_pml=(_wn(_pml))?_gd(location.pathname,_ctdef):_vc(_pml);}
 else{if (_wn(_pml)){if (_pndef=="title"){_pt=document.title; if(_pt!=""){_pml=_pt};}
 else{_pml=_gf(location.pathname);if (_pml==""){_pml=_pndef};}};}return _pml;}
 function _pm(_ml,_fml,_ipn){if(_ml.indexOf(";")!=-1){_nml=_ml.substring(0,(_ml.indexOf(";")));
 _rm=_ml.substring((_ml.indexOf(";")+1),_ml.length);_fml+=_ps(_ipn,_nml)+";";
 _gp=_pm(_rm,_fml,_ipn);return _gp;}else {_fml+=_ps(_ipn,_ml);return _fml;}}
function HitBox(_pn,_mlc,_sv){
 var _rf=escape(document.referrer);_mlc=_pm(_mlc,"",false);_pn=_pm(_pn,"",true);
 if (_sv==10){if
 (document.cookie.indexOf("CP=")!=-1){_ce="y";}else{
 document.cookie="CP=null*; path=/; expires=Wed, 1 Jan 2020 00:00:00 GMT";
 _ce=(document.cookie.indexOf("CP=")!=-1)?"y":"n";};if((_rf=="undefined")||(_rf=="")){_rf="bookmark";};
 _x2="<img src='http://"+_gn+"/HG?hc="+_mn+"&hb="+escape(_acct)+"&n="+escape(_pn);
 _x3="&cd=1&hv=6' border=0 height=1 width=1>";
 _ar="&bn="+escape(_bn)+"&bv="+_bv+"&ce="+_ce+"&ss=na&sc=na&dt=&sv="+_sv+"&con="+escape(_ct);
 _ar+="&vcon="+escape(_mlc)+"&epg="+_epg+"&hp=u&cy=u&ja=na&ln=na&cp="+escape(_cp)+"&pl=&rf="+_rf;
 document.write(_x2+_ar+_x3);}document.write("<\!--");
}
// END WEBSIDESTORY CODE
