<!-- Hide from scriptless browsers
snapAddEvent(window, 'load', snapInit);
 
// Global settings
var pageNumber=0;
var lastPageNumber=1;
var pBars=12;
var hasSubmitted = false;
var showButtons=true;
var startPoint;
var endPoint;
var timerStarted = false;
var allowStore=true;
var g_subm = false;
var objectsById=new Object();
var missingObjects=new Object();
var pageContents=new Object();
var dependents=new Object();
var askedCache=new Object();
var showButtonOptions=new Object();
var totalList=new Object();
var cacheSelectOptions=new Object();
var pageMapping=null;
var textSubLookup=null;
var snapVars = new Object();
var usedPatterns = null;
function V102asked(){return (!(!(ans("V101")==1)||ans("V101")==2));}
function V109asked(){return (ans("V101")==2);}
function V11asked(){return (!(ans("V8")==2));}
function V69asked(){return (!(!(cVM("V11",1,2,3,4,5,6))||ans("V8")==2));}
function V70asked(){return (!(!(cVM("V69",1,2))||ans("V8")==2));}
function V18asked(){return (!(ans("V8")==2));}
function V67asked(){return (!(!(cVM("V18",1,2,3,4,5,6))||ans("V8")==2));}
function V68asked(){return (!(!(cVM("V67",1,2))||ans("V8")==2));}
function V19asked(){return (!(ans("V8")==2));}
function V71asked(){return (!(!(cVM("V19",1,2,3,4,5,6))||ans("V8")==2));}
function V72asked(){return (!(!(cVM("V71",1,2))||ans("V8")==2));}
function V20asked(){return (!(ans("V8")==2));}
function V73asked(){return (!(!(cVM("V20",1,2,3,4,5,6))||ans("V8")==2));}
function V74asked(){return (!(!(cVM("V73",1,2))||ans("V8")==2));}
function V21asked(){return (!(ans("V8")==2));}
function V75asked(){return (!(!(cVM("V21",1,2,3,4,5,6))||ans("V8")==2));}
function V76asked(){return (!(!(cVM("V75",1,2))||ans("V8")==2));}
function V22asked(){return (!(ans("V8")==2));}
function V77asked(){return (!(!(cVM("V22",1,2,3,4,5,6))||ans("V8")==2));}
function V78asked(){return (!(!(cVM("V77",1,2))||ans("V8")==2));}
function V23asked(){return (!(ans("V8")==2));}
function V79asked(){return (!(!(cVM("V23",1,2,3,4,5,6))||ans("V8")==2));}
function V80asked(){return (!(!(cVM("V79",1,2))||ans("V8")==2));}
function V24asked(){return (!(ans("V8")==2));}
function V81asked(){return (!(!(cVM("V24",1,2,3,4,5,6))||ans("V8")==2));}
function V82asked(){return (!(!(cVM("V81",1,2))||ans("V8")==2));}
function V25asked(){return (!(ans("V8")==2));}
function V83asked(){return (!(!(cVM("V25",1,2,3,4,5,6))||ans("V8")==2));}
function V84asked(){return (!(!(cVM("V83",1,2))||ans("V8")==2));}
function V26asked(){return (!(ans("V8")==2));}
function V85asked(){return (!(!(cVM("V26",1,2,3,4,5,6))||ans("V8")==2));}
function V86asked(){return (!(!(cVM("V85",1,2))||ans("V8")==2));}
function V27asked(){return (!(ans("V8")==2));}
function V87asked(){return (!(!(cVM("V27",1,2,3,4,5,6))||ans("V8")==2));}
function V88asked(){return (!(!(cVM("V87",1,2))||ans("V8")==2));}
function V110asked(){return (!(ans("V8")==2));}
function V115asked(){return (!(!(cVM("V110",1,2,3,4,5,6))||ans("V8")==2));}
function V116asked(){return (!(!(cVM("V115",1,2))||ans("V8")==2));}
function V111asked(){return (!(ans("V8")==2));}
function V113asked(){return (!(!(cVM("V111",1,2,3,4,5,6))||ans("V8")==2));}
function V114asked(){return (!(!(cVM("V113",1,2))||ans("V8")==2));}
function V28asked(){return (!(ans("V8")==2));}
function V53asked(){return (!(!(ans("V28")>0)||ans("V8")==2));}
function V89asked(){return (!(!(cVM("V28",1,2,3,4,5,6))||ans("V8")==2));}
function V90asked(){return (!(!(cVM("V89",1,2))||ans("V8")==2));}
function V56asked(){return (ans("V36")==17);}
function V120asked(){return (cVR("V119",6));}
function V93asked(){return (!(!(ans("V38")==1)||ans("V38")==2));}
function V39asked(){return (!(!(ans("V38")==1)||ans("V38")==2));}
function V46asked(){return (!(!(cVM("V39",1,2,3,4))||ans("V38")==2));}
function V48asked(){return (!(!(cVM("V39",1,3))||ans("V38")==2));}
function V49asked(){return (!(!(cVM("V39",1,3))||ans("V38")==2));}
function V54asked(){return (!(!(cVM("V39",1,2))||ans("V38")==2));}
function V55asked(){return (!(!(cVR("V39",4))||ans("V38")==2));}
 
function V62valid(code){return (isValidDate("V62", "ID.date"));}
function V106valid(code){return (isValidNum("V106", true, "Q21"));}
 
//text substitution
 
 
function snapVariable(vName, qName, gridFirstVname, inputType, responseType, numCodes, pageNum, askedCalc, validate, mustAns, exclusive, codeLabels, dependents)
{
	this.vName = vName ? vName : null;	//String
	this.qName = qName ? qName : null;  //String
	this.gridFirstVname = gridFirstVname ? gridFirstVname : null;	//String
	this.inputType = inputType ? inputType : null;  //String: "checkbox", "radio", "select", "text",  "hidden" //"textarea" being stated as "text" for now
	this.responseType = responseType ? responseType : null; //String: "Single", "Multiple", "Quantity", "Date", "Time", "Literal", "None"
 
	if (this.gridFirstVname != null)
	{	//grid-first or grid-next, but not grid header.
		var gridName = gridFirstVname + "_GRID";
		var gHeader = snapVars[gridName];
		if (gHeader == null)
		{
			gHeader = new snapVariable(gridName);
			gHeader.gridMembers = new Array();
			gHeader.gridFirstVname = gridFirstVname;
			gHeader.pageNum = pageNum;
		}
		gHeader.gridMembers[gHeader.gridMembers.length] = vName;
		if (askedCalc && !gHeader.askedCalc)
		{
			gHeader.askedCalc = getGridRouting;
		}
	}
 
	this.codeLabels = codeLabels ? codeLabels : null;		//Array
	this.askedCalc = askedCalc ? askedCalc : null;		//Function
	this.validate = validate ? validate : null;		//Function
	this.mustAns = mustAns ? mustAns : false;		//bool
	this.exclusive = exclusive ? exclusive : null;			//Array
	this.numCodes = numCodes ? numCodes : 0; //Number
	this.pageNum = pageNum ? pageNum : 0; //Number
	this.dependents = dependents ? dependents : null;			//Array
	//var pageArray = pageContents[this.pageNum]
	//if (pageArray == null)
	//{pageArray = new Array();
	//	pageContents[this.pageNum] = pageArray;
	//}
	//pageArray[pageArray.length] = vName;
 
	snapVars[vName] = this;
 
	if (!snapVariable.prototype.IsGrid)
	{
		snapVariable.prototype.IsGrid = function(){return (null != this.gridFirstVname);}
	}
}
 
function snapVarMask(vName, codeMask, autoAnswer)
{
	var sVar = snapVars[vName];
	if (sVar)
	{
		sVar.codeMask = codeMask ? codeMask : null;
		sVar.autoAnswer = autoAnswer ? autoAnswer : null;
	}
}
function snapVarRotation(vName, type, method, count)
{
	var sVar = snapVars[vName];
	if (sVar)
	{
		sVar.rotType = type; //code or grid
		sVar.rotMethod = method;
		sVar.rotCount = count;
	}
}
function getGridRouting()
{
	var askedVal = false;
	for (var i in this.gridMembers)
	{
		if (!askedVal)
		{
			askedVal = asked(this.gridMembers[i]);
		}
	}
	return askedVal;
}
////////////////////////////////////////////////////////////////////////////////
/***SNAP INIT START***/
function snapInit()
{
	snapQueryString();
	for (var p=1; p<=lastPageNumber; p++)
	{
		snapInclude(snapObject('p_p'+p), false);
	}
	linkButton('b_next', snapNextPage);
	linkButton('b_back', snapBackPage);
	linkButton('b_submit', snapSubmitPage);
	linkButton('b_reset', snapResetPage);
	linkButton('b_restart', snapResetAll);
	linkButton('b_print', snapPrint);
	showButtonOptions['b_reset']='pageNumber>=1&&pageNumber<=lastPageNumber';
	showButtonOptions['b_next']='pageNumber>=1&&pageNumber<=lastPageNumber-1';
	showButtonOptions['b_submit']='pageNumber>=lastPageNumber&&pageNumber<=lastPageNumber';
 
 
	// List of variables that have one or more dependents
	dependents['V101']=new Array("V102","V109");
	dependents['V8']=new Array("V11","V69","V70","V18","V67","V68","V19","V71","V72","V20","V73","V74","V21","V75","V76","V22","V77","V78","V23","V79","V80","V24","V81","V82","V25","V83","V84","V26","V85","V86","V27","V87","V88","V110","V115","V116","V111","V113","V114","V28","V53","V89","V90");
	dependents['V11']=new Array("V69");
	dependents['V69']=new Array("V70");
	dependents['V18']=new Array("V67");
	dependents['V67']=new Array("V68");
	dependents['V19']=new Array("V71");
	dependents['V71']=new Array("V72");
	dependents['V20']=new Array("V73");
	dependents['V73']=new Array("V74");
	dependents['V21']=new Array("V75");
	dependents['V75']=new Array("V76");
	dependents['V22']=new Array("V77");
	dependents['V77']=new Array("V78");
	dependents['V23']=new Array("V79");
	dependents['V79']=new Array("V80");
	dependents['V24']=new Array("V81");
	dependents['V81']=new Array("V82");
	dependents['V25']=new Array("V83");
	dependents['V83']=new Array("V84");
	dependents['V26']=new Array("V85");
	dependents['V85']=new Array("V86");
	dependents['V27']=new Array("V87");
	dependents['V87']=new Array("V88");
	dependents['V110']=new Array("V115");
	dependents['V115']=new Array("V116");
	dependents['V111']=new Array("V113");
	dependents['V113']=new Array("V114");
	dependents['V28']=new Array("V53","V89");
	dependents['V89']=new Array("V90");
	dependents['V36']=new Array("V56");
	dependents['V119']=new Array("V120");
	dependents['V38']=new Array("V93","V39","V46","V48","V49","V54","V55");
	dependents['V39']=new Array("V48","V49","V54","V55","V46");
 
 
	// identify which questions are on each page
	pageContents[1]=new Array("V51","V2","V3","V101","V102","V109","V7","V8","V11","V69","V70","V18","V67","V68","V19","V71","V72","V20","V73","V74","V21","V75","V76","V22","V77","V78","V23","V79","V80","V24","V81","V82","V25","V83","V84","V26","V85","V86","V27","V87","V88","V110","V115","V116","V111","V113","V114","V28","V53","V89","V90","V31","V91","V32","V33","V34","V35","V36","V56","V98","V94","V119","V120","V38","V93","V39","V46","V48","V49","V54","V55","V104","V106","V40");
 
 
new snapVariable("V62", "ID.date", null, "hidden", "D", 1, 1, null, V62valid, false, null, null, null);
new snapVariable("V51", "Q1", null, "radio", "S", 15, 1, null, null, false, null, null, null);
new snapVariable("V2", "N1", null, "none", "N", 0, 1, null, null, false, null, null, null);
new snapVariable("V3", "N2", null, "none", "N", 0, 1, null, null, false, null, null, null);
new snapVariable("V101", "Q2", null, "radio", "S", 2, 1, null, null, true, null, null, dependents['V101']);
new snapVariable("V102", "Q3", null, "text", "L", 1, 1, V102asked, null, true, null, null, null);
new snapVariable("V109", "Q4", null, "text", "L", 1, 1, V109asked, null, true, null, null, null);
new snapVariable("V7", "N3", null, "none", "N", 0, 1, null, null, false, null, null, null);
new snapVariable("V8", "Q5", null, "radio", "S", 2, 1, null, null, false, null, null, dependents['V8']);
new snapVariable("V11", "Q6.a", null, "checkbox", "M", 6, 1, V11asked, null, false, null, null, dependents['V11']);
new snapVariable("V69", "Q6.a.i", null, "checkbox", "M", 2, 1, V69asked, null, true, null, null, dependents['V69']);
new snapVariable("V70", "Q6.a.ii", null, "text", "L", 1, 1, V70asked, null, true, null, null, null);
new snapVariable("V18", "Q6.b", null, "checkbox", "M", 6, 1, V18asked, null, false, null, null, dependents['V18']);
new snapVariable("V67", "Q6.b.i", null, "checkbox", "M", 2, 1, V67asked, null, true, null, null, dependents['V67']);
new snapVariable("V68", "Q6.b.ii", null, "text", "L", 1, 1, V68asked, null, true, null, null, null);
new snapVariable("V19", "Q6.c", null, "checkbox", "M", 6, 1, V19asked, null, false, null, null, dependents['V19']);
new snapVariable("V71", "Q6.c.i", null, "checkbox", "M", 2, 1, V71asked, null, true, null, null, dependents['V71']);
new snapVariable("V72", "Q6.c.ii", null, "text", "L", 1, 1, V72asked, null, true, null, null, null);
new snapVariable("V20", "Q6.d", null, "checkbox", "M", 6, 1, V20asked, null, false, null, null, dependents['V20']);
new snapVariable("V73", "Q6.d.i", null, "checkbox", "M", 2, 1, V73asked, null, true, null, null, dependents['V73']);
new snapVariable("V74", "Q6.d.ii", null, "text", "L", 1, 1, V74asked, null, true, null, null, null);
new snapVariable("V21", "Q6.e", null, "checkbox", "M", 6, 1, V21asked, null, false, null, null, dependents['V21']);
new snapVariable("V75", "Q6.e.i", null, "checkbox", "M", 2, 1, V75asked, null, true, null, null, dependents['V75']);
new snapVariable("V76", "Q6.e.ii", null, "text", "L", 1, 1, V76asked, null, true, null, null, null);
new snapVariable("V22", "Q6.f", null, "checkbox", "M", 6, 1, V22asked, null, false, null, null, dependents['V22']);
new snapVariable("V77", "Q6.f.i", null, "checkbox", "M", 2, 1, V77asked, null, true, null, null, dependents['V77']);
new snapVariable("V78", "Q6.f.ii", null, "text", "L", 1, 1, V78asked, null, true, null, null, null);
new snapVariable("V23", "Q6.g", null, "checkbox", "M", 6, 1, V23asked, null, false, null, null, dependents['V23']);
new snapVariable("V79", "Q6.g.i", null, "checkbox", "M", 2, 1, V79asked, null, true, null, null, dependents['V79']);
new snapVariable("V80", "Q6.g.ii", null, "text", "L", 1, 1, V80asked, null, true, null, null, null);
new snapVariable("V24", "Q6.h", null, "checkbox", "M", 6, 1, V24asked, null, false, null, null, dependents['V24']);
new snapVariable("V81", "Q6.h.i", null, "checkbox", "M", 2, 1, V81asked, null, true, null, null, dependents['V81']);
new snapVariable("V82", "Q6.h.ii", null, "text", "L", 1, 1, V82asked, null, true, null, null, null);
new snapVariable("V25", "Q6.i", null, "checkbox", "M", 6, 1, V25asked, null, false, null, null, dependents['V25']);
new snapVariable("V83", "Q6.i.i", null, "checkbox", "M", 2, 1, V83asked, null, true, null, null, dependents['V83']);
new snapVariable("V84", "Q6.i.ii", null, "text", "L", 1, 1, V84asked, null, true, null, null, null);
new snapVariable("V26", "Q6.j", null, "checkbox", "M", 6, 1, V26asked, null, false, null, null, dependents['V26']);
new snapVariable("V85", "Q6.j.i", null, "checkbox", "M", 2, 1, V85asked, null, true, null, null, dependents['V85']);
new snapVariable("V86", "Q6.j.ii", null, "text", "L", 1, 1, V86asked, null, true, null, null, null);
new snapVariable("V27", "Q6.k", null, "checkbox", "M", 6, 1, V27asked, null, false, null, null, dependents['V27']);
new snapVariable("V87", "Q6.k.i", null, "checkbox", "M", 2, 1, V87asked, null, true, null, null, dependents['V87']);
new snapVariable("V88", "Q6.k.ii", null, "text", "L", 1, 1, V88asked, null, true, null, null, null);
new snapVariable("V110", "Q6.l", null, "checkbox", "M", 6, 1, V110asked, null, false, null, null, dependents['V110']);
new snapVariable("V115", "Q6.l.i", null, "checkbox", "M", 2, 1, V115asked, null, false, null, null, dependents['V115']);
new snapVariable("V116", "Q6.l.ii", null, "text", "L", 1, 1, V116asked, null, false, null, null, null);
new snapVariable("V111", "Q6.m", null, "checkbox", "M", 6, 1, V111asked, null, false, null, null, dependents['V111']);
new snapVariable("V113", "Q6.m.i", null, "checkbox", "M", 2, 1, V113asked, null, false, null, null, dependents['V113']);
new snapVariable("V114", "Q6.m.ii", null, "text", "L", 1, 1, V114asked, null, false, null, null, null);
new snapVariable("V28", "Q6.n", null, "checkbox", "M", 6, 1, V28asked, null, false, null, null, dependents['V28']);
new snapVariable("V53", "Q6.n.a", null, "text", "L", 1, 1, V53asked, null, true, null, null, null);
new snapVariable("V89", "Q6.n.i", null, "checkbox", "M", 2, 1, V89asked, null, true, null, null, dependents['V89']);
new snapVariable("V90", "Q6.n.ii", null, "text", "L", 1, 1, V90asked, null, true, null, null, null);
new snapVariable("V31", "N4", null, "none", "N", 0, 1, null, null, false, null, null, null);
new snapVariable("V91", "N5", null, "none", "N", 0, 1, null, null, false, null, null, null);
new snapVariable("V32", "Q7", null, "radio", "S", 3, 1, null, null, true, null, null, null);
new snapVariable("V33", "Q8", null, "radio", "S", 9, 1, null, null, true, null, null, null);
new snapVariable("V34", "N6", null, "none", "N", 0, 1, null, null, false, null, null, null);
new snapVariable("V35", "Q9", null, "radio", "S", 3, 1, null, null, true, null, null, null);
new snapVariable("V36", "Q10", null, "radio", "S", 17, 1, null, null, true, null, null, dependents['V36']);
new snapVariable("V56", "Q10.a", null, "text", "L", 1, 1, V56asked, null, false, null, null, null);
new snapVariable("V98", "Q11", null, "text", "L", 1, 1, null, null, true, null, null, null);
new snapVariable("V94", "Q12", null, "checkbox", "M", 10, 1, null, null, false, null, null, null);
new snapVariable("V119", "Q13", null, "checkbox", "M", 6, 1, null, null, false, null, null, dependents['V119']);
new snapVariable("V120", "Q13._1", null, "text", "L", 1, 1, V120asked, null, false, null, null, null);
new snapVariable("V38", "Q14", null, "radio", "S", 2, 1, null, null, true, null, null, dependents['V38']);
new snapVariable("V93", "N7", null, "none", "N", 0, 1, V93asked, null, false, null, null, null);
new snapVariable("V39", "Q15", null, "checkbox", "M", 4, 1, V39asked, null, false, null, null, dependents['V39']);
new snapVariable("V46", "Q16", null, "text", "L", 1, 1, V46asked, null, false, null, null, null);
new snapVariable("V48", "Q17.a", "V48", "text", "L", 1, 1, V48asked, null, false, null, null, null);
new snapVariable("V49", "Q17.b", "V48", "text", "L", 1, 1, V49asked, null, false, null, null, null);
new snapVariable("V54", "Q18", null, "text", "L", 1, 1, V54asked, null, false, null, null, null);
new snapVariable("V55", "Q19", null, "text", "L", 1, 1, V55asked, null, false, null, null, null);
new snapVariable("V104", "Q20", null, "radio", "S", 4, 1, null, null, true, null, null, null);
new snapVariable("V106", "Q21", null, "text", "Q", 1, 1, null, V106valid, true, null, null, null);
new snapVariable("V40", "N8", null, "none", "N", 0, 1, null, null, false, null, null, null);
	fStartTimer(1);
 
 
	// check question responses when they change
	for(var i=1; i<=lastPageNumber; i++)
	{
		if (pageContents[i])
		{
			var pageItems = pageContents[i];
			for(var j=0; j<pageItems.length; j++)
			{
				snapHookEvents(pageItems[j]);
			}
		}
	}
 
	// Prepare the first page
	var pleaseWait = snapObject("snapIntro");
	if (pleaseWait != null)
	{  var aParent=pleaseWait.parentNode;
		if (aParent != null)
		{
			aParent.removeChild(pleaseWait);
			objectsById["snapIntro"] = null;
		}
	}
 
snapApplyInitialSubstitutions();
	snapInclude(snapObject('snapbuttons'), true, 'block');
	snapInclude(snapObject('snapDiv'), true, 'block');
	if (lastPageNumber > 1) snapInclude(snapObject('b_progress'), true);
 
	snapNextPage();
}
/***SNAP INIT END***/
function linkButton(name, func)
{	var button = snapObject(name);
	var done = false;
	if (button && button.parentNode)
	{	var bParent = button.parentNode;
		if (bParent && bParent.tagName && ("a" == bParent.tagName.toLowerCase()))
		{	done = true;
			snapAddEvent(bParent, 'keypress',func);
			snapAddEvent(bParent, 'click',func);
		}
	}
	if (!done)
	{	snapAddEvent(button, 'click',func);
	}
}
function snapQueryString()
{
	var query=unescape(location.search.substring(1));
	var pairs=query.split("&");
	for(var i=0; i<pairs.length;i++)
	{	var pos=pairs[i].indexOf('=');
		if (pos>0)
		{	var argName=pairs[i].substring(0,pos);
			var value=pairs[i].substring(pos+1);
			if ((argName=="id") || (argName=="u"))
			{snapSetOpenReply("0",value);
			}
			else if (argName=="p")
			{snapSetOpenReply("0",value);
			}
			else if (argName=="s")
			{snapSetOpenReply("0",value);
			}
		}
	}
}
 
function snapMappedPage(page)
{
	if (pageMapping != null)
	{
		if(page>=1 && page<=lastPageNumber)
		{
			page=pageMapping[page];
		}
	}
	return page;
}
 
// System
function snapHookEvents(question)
{
	var items = snapObjectsByName(question);
	var i;
	var item;
	for (i=0; i<items.length; i++)
	{
		item=items[i];
		if (item.type)
		{
			if (item.type=='checkbox' || item.type=='radio')
				snapAddEvent(item, 'click', snapChangeMade);
			else if (item.type=='select-one' || item.type=='select-multiple')
				snapAddEvent(item, 'change', snapChangeMade);
			else if (item.type=='text' || item.type=='textarea')
				snapAddEvent(item, 'blur', snapChangeMade);
		}
	}
}
 
function snapAddEvent(obj, evType, fn)
{
	var result=false;
	if (obj)
	{
		if (obj.attachEvent)
		{
			result=obj.attachEvent("on"+evType, fn);
		} else if (obj.addEventListener)
		{
			obj.addEventListener(evType, fn, true);
			result=true;
		}
	}
	return result;
}
 
function snapGlobalDoc()
{
	return document.forms["SnapForm"].elements;
}
 
function snapObject(id)
{
	var ret = objectsById[id];
	if (ret == null)
	{	if (missingObjects[id] == null)
		{	ret = document.getElementById(id);
			if (ret == null)
			{	missingObjects[id] = true;
			}
			objectsById[id] = ret;
		}
	}
	return ret;
}
 
function snapObjectsByName(name)
{
	return document.getElementsByName(name);
}
 
function snapObjectsByTagName(tagName)
{
	return document.getElementsByTagName(tagName);
}
 
function snapEventOrigin(arg)
{
	if (arg.srcElement)
		return arg.srcElement;
	else if (arg.target)
		return arg.target;
	return null;
}
 
////////////////////////////////////////////////////////////////////////////////
function snapSubmitPage(eventOb)
{
	if (snapIgnoreKey(eventOb)) return true;
 
	var okToSubmit=false;
	if (!hasSubmitted && snapIsIncluded(snapObject('b_submit')))
	{
		var somethingToShow=false;
		var nextPage=pageNumber;
		while(nextPage<=lastPageNumber && snapPageValidationOk(nextPage))
		{
			nextPage++;
			if(nextPage<=lastPageNumber)
			{
				somethingToShow=snapEvalShowPage(nextPage, false);
			}
		}
		if(nextPage > lastPageNumber)
		{
			okToSubmit = true;
			hasSubmitted = true;
			snapShowPage(lastPageNumber);
		}
		if(nextPage<=lastPageNumber)
		{
			snapShowPage(nextPage);
			okToSubmit=false;
		}
	}
 
	if (okToSubmit)
	{
		fEndTimer();
		}
	else if (eventOb)
	{
		if (eventOb.cancelBubble!=null)  eventOb.cancelBubble = true;
		if (eventOb.stopPropagation!=null) eventOb.stopPropagation();
		if (eventOb.returnValue!=null) eventOb.returnValue = false;
		if (eventOb.preventDefault)  eventOb.preventDefault();
	}
 
	return okToSubmit;
}
 
function snapIgnoreKey(eventOb)
{
	var ignore= false;
 	if (eventOb && (eventOb.type.toLowerCase()=="keypress") && (eventOb.keyCode != null))
 	{  if ((eventOb.keyCode!=32) && (eventOb.keyCode!=10))
		{  ignore = true;
			if (eventOb.charCode!=null)
			{  if ((eventOb.charCode==32) || (eventOb.charCode==10))
					ignore = false;
			}
		}
	}
	return ignore;
}
 
function snapEvalShowPage(Pagenum, force)
{
	var postponedItems = new Array(); //lengthy fix for bug in opera9
	var somethingToShow=snapEvalPageRouting(Pagenum, postponedItems);
	if(somethingToShow || force)
	{
		snapShowPage(Pagenum);
		for (var vName in postponedItems)
		{
			snapEvalAskedFor(vName);
		}
	}
	postponedItems = null;
	return somethingToShow;
}
 
function snapNextPage(eventOb)
{
	if (snapIgnoreKey(eventOb)) return true;
	if (eventOb && eventOb.preventDefault) eventOb.preventDefault();
 
	var somethingToShow=false;
	var nextPage=pageNumber;
	while(nextPage<lastPageNumber && !somethingToShow && snapPageValidationOk(nextPage))
	{
		nextPage++;
		somethingToShow=snapEvalShowPage(nextPage, nextPage==lastPageNumber);
	}
	return false;
}
 
function snapBackPage(eventOb)
{
	if (snapIgnoreKey(eventOb)) return true;
	if (eventOb && eventOb.preventDefault) eventOb.preventDefault();
 
	var somethingToShow=false;
	var nextPage=pageNumber;
	while(nextPage>1 && !somethingToShow)
	{
		nextPage--;
		somethingToShow=snapEvalShowPage(nextPage, (nextPage==1));
	}
	return false;
}
function TextToHtml(txtValue)
{
	var htmlValue = txtValue.replace(/&/g, "&amp;");
	htmlValue = htmlValue.replace(/[<]/g, "&lt;");
	htmlValue = htmlValue.replace(/\>/g, "&gt;");
	htmlValue = htmlValue.replace(/\r\n/g,"<br>");
	htmlValue = htmlValue.replace(/\n/g, "<br>");
	htmlValue = htmlValue.replace(/\r/g,"<br>");
	htmlValue = htmlValue.replace(/\t/g, "&nbsp;");
	return htmlValue;
}
function snapPrint(eventOb)
{
	if (snapIgnoreKey(eventOb)) return true;
	window.print();
}
function snapResetPage(eventOb)
{
	if (snapIgnoreKey(eventOb)) return true;
	if (eventOb && eventOb.preventDefault) eventOb.preventDefault();
 
	var aPage=snapMappedPage(pageNumber);
	if (pageContents[aPage])
	{
		var changed = false;
		var pageItems = pageContents[aPage];
		for(var i=0; i<pageItems.length; i++)
		{
			var controls = snapObjectsByName(pageItems[i]);
			if (controls && controls.length > 0)
			{
				for(var j=0; j<controls.length; j++)
				{
					var elem = controls[j];
					if (elem && elem.tagName != null)
					{
						var lTagName = elem.tagName.toLowerCase();
						if (lTagName=="input")
						{
							if ((elem.type!= null) && (elem.type.toLowerCase() == 'text'))
							{
								if (elem.value  && elem.value!="")
								{
									elem.value = "";
									changed = true;
								}
							}
							else if (elem.checked)
							{
								elem.checked = false;
								changed = true;
							}
						}
						else if (lTagName=="textarea")
						{
							if (elem.value  && elem.value!="")
							{
								elem.value = "";
								changed = true;
							}
						}
						else if (lTagName=="select")
						{
							if (elem.selectedIndex != null)
							{
								elem.selectedIndex = 0;
							}
							for (var op = 0; op < elem.options.length; op++)
							{
								if (elem.options[op].value > 0 && elem.options[op].selected)
								{
									elem.options[op].selected = false;
									changed = true;
								}
							}
						}
					}
				}
			}
		}
		if (changed)
		{
			snapApplyInitialSubstitutions();
			resetRouting();
			snapEvalPageRouting();
		}
	}
 
	return false;
}
 
function snapResetAll(eventOb)
{
	if (snapIgnoreKey(eventOb)) return true;
	document.forms["SnapForm"].reset();
	snapApplyInitialSubstitutions();
	resetRouting();
	snapEvalPageRouting();
	snapShowPage(1);
}
 
function snapShowPage(target)
{
	if (target>=1 && target<=lastPageNumber)
	{
		snapInclude(snapObject("p_p"+snapMappedPage(pageNumber)), false);
		snapInclude(snapObject("p_p"+snapMappedPage(target)), true, 'block');
		pageNumber=target;
		snapFocusPage(pageNumber);
	}
	if(lastPageNumber>0)
	{
		// buttons -------------------------------------
		// one snapInclude per button, with condition set acccording to user selection
		for (var butn in showButtonOptions)
		{
			snapIncludeBtn(snapObject(butn), eval(showButtonOptions[butn]));
		}
 
 
		// progress bar -------------------------------------
		// can be left in always. Variable 'pBars' indicates number of images
		progress=snapObject("b_progress");
		if (progress)
		{
			var progText = "";
			if (progress.tagName != null && progress.tagName.toLowerCase()=="span")
			{
				progress.firstChild.nodeValue = progText;
			}
			else
			{
				if(progress.src)
				{
					var file=pbRatio(pBars);
					progress.src=progress.src.replace(/\d{2}\.gif/, file+".gif");
				}
				progress.alt=progText;
			}
		}
	}
}
function snapFocusObject(object)
{
	var done = false;
	if (object)
	{
		try
		{
			object.focus();
			done = true;
		}
		catch (e)//hidden control
		{
			done = false;
		}
	}
	return done;
}
function snapFocusPage(page)
{
	var found = false;
	page=snapMappedPage(page);
	if(page>=1 && page<=lastPageNumber)
	{
		if (pageContents[page])
		{
			var pageItems = pageContents[page];
			for(var j=0; j<pageItems.length && !found; j++)
			{
				if (getAsked(pageItems[j]))
				{
					var code =0;
					var codeOb= null;
					do
					{
						code++;
						codeOb = snapObject(pageItems[j]+'_'+code);
						found = snapFocusObject(codeOb);
					}
					while (!found && codeOb != null)
				}
			}
		}
		if (window.scrollTo)
		{  window.scrollTo(0,0);
		}else if (window.scroll)
		{  window.scroll(0,0);
		}
	}
}
function snapShowQuestion(vName)
{
	var control = snapObject(vName + "_1");
	snapFocusObject(control);
 
	var tab = snapObject(vName);
	if (tab)
	{	var offset = findObjY(tab);
		if (window.scrollTo)
		{  window.scrollTo(0,offset);
		}else if (window.scroll)
		{  window.scroll(0,offset);
		}
	}
}
 
function findObjY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{	while (obj.offsetParent)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop = obj.y;
	return curtop;
}
 
//recursivley Invalidate Routing cache for dependents of 'question'
function snapUndoRoutingFor(vName)
{
	if (vName && dependents[vName])
	{
		var undo=dependents[vName];
		for (var i=0; i<undo.length; i++)
		{
			var thisVar = undo[i];
 
			var sVar = snapVars[thisVar];
			if (sVar && sVar.IsGrid())
			{
				var gridOwner = sVar.gridFirstVname;
				gridOwner += "_GRID";
				if (askedCache[gridOwner]!=null)
					delete askedCache[gridOwner];
			}
 
			if (askedCache[thisVar]!=null)
			{
				delete askedCache[thisVar];
				snapUndoRoutingFor(thisVar);
			}
			else if (!sVar.askedCalc)
			{	snapUndoRoutingFor(thisVar);
			}
		}
	}
}
 
function resetRouting()
{
	askedCache = new Object();
}
 
function snapEvalPageRouting(aPage, postponedItems)
{
	var somethingShown=false;
	if (aPage==null)
		aPage=pageNumber;
	aPage=snapMappedPage(aPage);
	if (aPage>=1 && aPage<=lastPageNumber && pageContents[aPage])
	{
		var pageItems=pageContents[aPage];
		for (var i=0; i<pageItems.length; i++)
		{
			if(snapEvalAskedFor(pageItems[i], postponedItems))
			{	somethingShown=true;
			}
		}
	}
	return somethingShown;
}
 
////////////////////////////////////////////////////////////////////////////////
function snapApplyInitialSubstitutions()
{
	snapIntSubst();
 
	var vName;
	for (vName in textSubLookup)
	{
		var SpanArray = textSubLookup[vName];
		for(var i=0;i<SpanArray.length;i++)
		{
			SpanArray[i].firstChild.nodeValue = snapVarReply(vName);
		}
	}
}
function snapIntSubst()
{
	if (textSubLookup == null)
	{
		textSubLookup = new Object();
		var all_span = snapObjectsByTagName('span');
		var i;
		for(i=0;i<all_span.length;i++)
		{
			if(all_span[i].id)
			{
				var nameLen =  all_span[i].id.indexOf('_reply');
				if (nameLen > 0)
				{
					var newName = all_span[i].id.substr(0, nameLen);
					if (textSubLookup[newName] == null)
					{
						textSubLookup[newName] = new Array();
					}
					var subList = textSubLookup[newName];
					subList[subList.length] = all_span[i];
				}
			}
		}
	}
}
function snapSubstituteText(questionName)
{
	snapIntSubst();
	if (textSubLookup[questionName] != null)
	{
		var subList = textSubLookup[questionName];
		var i;
		for(i=0;i<subList.length;i++)
		{
			if(subList[i].id && (0 == subList[i].id.indexOf(questionName+'_reply')))
			{
				subList[i].firstChild.nodeValue=snapVarReply(questionName);
			}
		}
	}
}
function snapEvalTotals(vName)
{
	var expr=totalList[vName];
	if(expr!=null)
		eval(expr);
}
function totalise()
{	var i=0,j=0,sum=0,varFloat=0,notBlank=false,isZero=false,varString='',srcVar,tarVar;
	var lastValues = new Array();
	var allowNegs=arguments[arguments.length-3];
	var roundNums=arguments[arguments.length-2];
	var cleanNum=arguments[arguments.length-1];
	for (i=0; i<arguments.length-4; i++)
	{	srcVar=snapGlobalDoc()[arguments[i]];
		if (srcVar)
		{	varString = srcVar.value;
			if (cleanNum) varString = cleanNumber(srcVar.value, allowNegs);
			if (roundNums) varString = '' + Math.round(parseFloat(varString));
			varFloat = parseFloat(varString);
			if ((!allowNegs && varFloat < 0) || isNaN(varFloat))
			{	varString='';
				varFloat=0;
			}
			sum += varFloat;
			if (varString == '0') isZero=true;
			if (varString != '') notBlank=true;
			if (lastValues[i] != srcVar.value) srcVar.value = varString;
			lastValues[i] = varString;
		}
	}
	tarVar=snapGlobalDoc()[arguments[arguments.length-4]];
	if (tarVar && ((lastValues[i+1] != sum || lastValues[i+1] != tarVar.value) || sum==0))
	{	if (notBlank)
		{	if (sum > 0 || allowNegs)
				varString = sum;
			else
				isZero ? varString = '0' : varString = '';
			if (roundNums) varString = Math.round(sum);
			tarVar.value = varString;
		}else
		{	tarVar.value = '';
		}
		lastValues[i+1] = tarVar.value;
	}
}
function cleanNumber(varString, allowNegs)
{	var newVarString = "";
	if(allowNegs)
		newVarString=varString.replace(/^[^+\-0-9\.]*([+\-]?\d*\.?\d*).*$/, '$1');
	else
		newVarString=varString.replace(/^[^+0-9\.]*(\+?\d*\.?\d*).*$/, '$1');
	return newVarString;
}
function addSurveyPlus(eTypeStr, eHandler)
{//eventTypeStr, eventHandler, vName1, vName2...vNameN
	if (arguments != null && arguments.length > 2)
	{	var eTypeStr = arguments[0];	//eg "blur", "click".
		var eHandler = arguments[1];	//splus JS function call.
		for (var i=2; i <= arguments.length - 1; i++)
		{	var snapVar = snapGlobalDoc()[arguments[i]];
			if (snapVar)
			{	if (snapVar.length && !(snapVar.type && snapVar.type.indexOf("select") >= 0))
				{//Assign handler to all items in collection. eg. radio buttons in list.
					for (var j=0; j < snapVar.length; j++)
					{	snapAddEvent(snapVar[j], eTypeStr, eHandler);
					}
				}else
				{//Assign handler to single item in list. eg. text box, or single radio button.
					snapAddEvent(snapVar, eTypeStr, eHandler);
				}
			}
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
function snapInclude(obj, show, val)
{	var changed = false;
	if (obj)
	{	if (val == null)
		{	val = '';
		}
		if (!show)
		{	val = 'none';
		}
		if (obj.style.display!=val)
		{	obj.style.display = val;
			changed = true;
		}
	}
	return changed;
}
function snapIncludeBtn(obj, show, val)
{
	snapInclude(obj, show, val);
	if (obj && obj.parentNode)
	{  var bParent = obj.parentNode;
		if (bParent && bParent.tagName && ("a" == bParent.tagName.toLowerCase()))
		{
			snapInclude(bParent, show, val);
		}
	}
}
function snapHide(obj, show)
{
	if (obj)
	{
		obj.style.visibility=show?'visible':'hidden';
	}
}
function snapIsIncluded(obj)
{
	var result=false;
	if (obj)
		result=(obj.style.display!='none');
	return result;
}
// Rotation
function findArrayValue(array, value)
{
	var i;
	for(i=0;i<array.length;i++)
	{
		if(array[i]==value)
			return i;
	}
	return null;
}
 
function snapSwapObs(aCode, newCode)
{
	if(aCode &&  newCode)
	{
		var aParent=aCode.parentNode;
		var newParent=newCode.parentNode;
		if (aParent &&newParent)
		{
			aParent.removeChild(aCode);
			newParent.removeChild(newCode);
			aParent.appendChild(newCode);
			newParent.appendChild(aCode);
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
// Variable No Reply
function snapIsNoReply(vName)
{
	return snapVarReply(vName)=="(no reply)";
}
// Variable No Reply
function snapForceReply(vName, realName)
{
	var result=true;
	if(asked(vName) && snapIsNoReply(vName))
	{
		alert("Please provide an answer for question "+realName+".");
		result=false;
		snapShowQuestion(vName);
	}
	return result;
}
function snapPageValidationOk(page)
{	var result=true;
	page=snapMappedPage(page);
	if(page>=1 && page<=lastPageNumber && pageContents[page])
	{	var pageItems = pageContents[page];
		for(var j=0; j<pageItems.length && result; j++)
		{	var vName = pageItems[j];
			var sVar = snapVars[vName];
			if (sVar)
			{
				if(sVar.validate)
				{	if (asked(vName))
					{result=sVar.validate();
					}
				}
				if(result && sVar.mustAns)
				{	result=snapForceReply(vName, sVar.qName);
				}
			}
		}
	}
	return result;
}
function doAutoAns(vName)
{
	var sVar = snapVars[vName];
	if (sVar && sVar.codeMask)
	{
		var numCodes = sVar.numCodes;
		var selObj = null;
		if (snapIsDropdown(vName))
			selObj = snapObject(vName+'_1');
		var changed = false;
		for(var i=1;i<=numCodes;i++)
		{	var showThisCode=sVar.codeMask(i);
			if (selObj && selObj.options)
			{	var found = false;
				for (var x = 0; x < selObj.options.length && !found; x++)
				{
					if (selObj.options[x].value == i)
					{
						found = true;
						if (selObj.options[x].selected != null)
						{
							if (showThisCode != selObj.options[x].selected)
							{
								changed = true;
								selObj.options[x].selected = showThisCode;
							}
						}
					}
				}
			}
			else
			{
				var codeOb = snapObject(vName+'_'+i);

				if (codeOb && codeOb.checked != null)
				{
					if (showThisCode != codeOb.checked)
					{
						changed = true;
						codeOb.checked = showThisCode;
					}
				}
			}
		}
		if (changed)
			snapOnChange(vName);
	}
}
////////////////////////////////////////////////////////////////////////////////
// Variable Not Asked
function snapEvalAskedFor(vName, postponedItems)
{
	var somethingShown=true;
	var sVar = snapVars[vName];
	var changed = false;
	if(sVar && (sVar.askedCalc || sVar.codeMask))
	{
		var ask=asked(vName);
		somethingShown=ask;
		if(sVar.IsGrid())
		{
			var gridLine=snapObject(vName+'_1');
			while(gridLine!=null && (gridLine.tagName==null || gridLine.tagName.toLowerCase()!='tr'))
				gridLine=gridLine.parentNode;
			if(gridLine!=null)
			{
				snapInclude(gridLine, ask);
			}
			var gridOwner=sVar.gridFirstVname;
			if(gridOwner != vName)
			{
				snapInclude(snapObject(vName+'_SPACER'), ask);
			}
			var gridName = gridOwner +"_GRID";
			if(snapVars[gridName] && snapVars[gridName].askedCalc)
			{
				var gridask=asked(gridName);
				snapInclude(snapObject(gridName), gridask);
				snapInclude(snapObject(gridOwner+'_SPACER'), gridask);
				somethingShown=gridask;
			}
		} else
		{
			if (snapInclude(snapObject(vName), ask))
				changed = true;
			snapInclude(snapObject(vName+'_SPACER'), ask);
		}
		if (!ask && sVar.doAutoAns)
		{
			doAutoAns(vName);
		}
	}
	if(somethingShown && sVar && sVar.codeMask)
	{
		var isCombo = snapIsDropdown(vName);
		var numCodes = sVar.numCodes;
		var i;
		var showThisCode;
		somethingShown=false;
		for(i=1;i<=numCodes;i++)
		{
			showThisCode=sVar.codeMask(i);
			if (isCombo)
			{
				if (snapIncludeCombo(vName, i, showThisCode, postponedItems))
					changed = true;
			}
			else
			{
				var codeObject = snapObject(vName+'c'+i);
				var codeBox = snapObject(vName+'_'+i);
				if(codeObject )
					snapInclude(codeObject, showThisCode);
				else
					snapInclude(codeBox, showThisCode);
				snapHide(snapObject(vName+'g'+i), showThisCode);
				snapHide(snapObject(vName+'v'+i), showThisCode);
				if (!showThisCode)
				{
					if (codeBox && (codeBox.checked))
					{
						codeBox.checked = false;
						changed = true;
					}
				}
			}
			if(showThisCode)
				somethingShown=true;
		}
	}
	if (changed)
		snapOnChange(vName);
	return somethingShown;
}
function snapIncludeCombo(vName, code, showThisCode, postponedItems)
{
	var changed = false;
	var selOb = snapObject(vName + '_1');
	if (selOb && selOb.options)
	{
		var found = false;
		if (showThisCode)
		{
			var removedList = cacheSelectOptions[vName];
			if (removedList)
			{
				for (var i =0; i < removedList.length && !found; i++)
				{
					if (removedList[i].value != null && removedList[i].value == code)
					{
						found = true;
						if (postponedItems)
						{
							postponedItems[vName] = true;
						}
						else
						{
							var option = removedList[i];
							removedList.splice(i, 1);
							var pos = null;
							for (var j =0; j < selOb.options.length && (null == pos); j++)
							{
								if (selOb.options[j].value > option.value || (selOb.options[j].value ==0 && selOb.options[j].text==""))
								{
									pos = selOb.options[j];
								}
							}
							selOb.insertBefore(option, pos );
						}
					}
				}
			}
		}
		else
		{
			for (var i =0; i < selOb.options.length && !found; i++)
			{
				if (selOb.options[i].value == code)
				{
					found = true;
					if (selOb.options[i].selected)
					{
						changed = true;
						try{
						selOb.options[i].selected = false;
						}catch(e)
						{//ie 6 bug?
						}
					}
					if (postponedItems)
					{
						postponedItems[vName] = true;
					}
					else
					{
						var option = selOb.options[i];
						selOb.removeChild(option);
						if (!cacheSelectOptions[vName])
							cacheSelectOptions[vName] = new Array();
						var arr = cacheSelectOptions[vName];
						arr[arr.length] = option;
					}
				}
			}
		}
	}
	return changed;
}
////////////////////////////////////////////////////////////////////////////////
// Variable exclusive
function snapCheckExclusiveOf(sVar, object)
{
	if (object.checked)
	{
		var changed = false;
		var c;
		var excl=sVar.exclusive;
		var code=parseInt(object.id.substr(object.id.indexOf('_')+1), 10);
		var isExclusive=false;
		for (c=0; c<excl.length && !isExclusive; c++)
		{
			if (excl[c]==code)
				isExclusive=true;
		}
		if (isExclusive)
		{
			var codeList=snapObjectsByName(object.name);
			for (c=0; c<codeList.length; c++)
			{
				if (object!=codeList[c] && codeList[c].checked)
				{	codeList[c].checked=false;
					changed = true;
				}
			}
		} else
		{
			for (c=0; c<excl.length; c++)
			{
				code=snapObject(object.name+'_'+excl[c]);
				if (code && code.checked)
				{	code.checked=false;
					changed = true;
				}
			}
		}
		if (changed)
		{
			snapOnChange(object.name);
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
function snapNumCodes(vName)
{
	var result=0;
	var sVar = snapVars[vName];
	if (sVar)
	{
		result = sVar.numCodes;
	}
	return result;
}
function snapIsOpen(vName)
{
	var result = false;
	var sVar = snapVars[vName];
	if (sVar)
	{
		result = sVar.isOpen;
		if (result==null &&sVar.inputType)
		{
			result = (sVar.inputType == "text" || sVar.inputType == "textarea" || sVar.inputType == "hidden");
			sVar.isOpen = result;
		}
	}
	return result;
}
function snapIsClosed(vName)
{
	var result = false;
	var sVar = snapVars[vName];
	if (sVar)
	{
		result = sVar.isClosed;
		if (result==null && sVar.responseType)
		{
			result = (sVar.responseType == "M" || sVar.responseType == "S");
			sVar.isClosed = result;
		}
	}
	return result;
}
function snapIsDropdown(vName)
{
	var result = false;
	var sVar = snapVars[vName];
	if (sVar)
	{
		result = sVar.isDropDown;
		if (result==null && sVar.inputType)
		{
			result = (sVar.inputType == "select");
			sVar.isDropDown = result;
		}
	}
	return result;
}
////////////////////////////////////////////////////////////////////////////////
// Variable response
function snapVarReply(vName)
{
	var result="(no reply)";
	//if (asked(vName))
	{	if(snapIsOpen(vName))
			result=snapOpenReply(vName);
		else if(snapIsClosed(vName))
			result=snapClosedReply(vName);
	}
	return result;
}
// Variable response
function snapVarValue(vName)
{
	var result="";
	var c=1;
	var code=snapObject(vName+'_'+c);
	while(code)
	{
		if(code.options)
		{
			for (var i = 0; i < code.options.length; i++)
			{
				var thisOption=code.options[i];
				if(thisOption!=null && thisOption.selected && thisOption.value!=null && thisOption.value.length>0)
				{
					if(result.length>0)
						result+=';';
					result+=thisOption.value;
				}
			}
		} else
		{
			if((code.checked==null || code.checked) && code.value!=null && code.value.length>0)
			{
				if(result.length>0)
					result+=';';
				result+=code.value;
			}
		}
		c++;
		code=snapObject(vName+'_'+c);
	}
	return result;
}
// Variable response
function snapClosedAns(vName)
{
	var result=null;
	if(asked(vName))
	{
		result=snapVarValue(vName);
	}
	if(result==null)
		result="";
	return result;
}
// Variable response
function snapClosedReply(vName)
{
	var result="(no reply)";
	var response=snapVarValue(vName);
	if(response.length>0)
	{
		var responses=response.split(";");
		var i;
		result="";
		for(i=0;i<responses.length;i++)
		{
			if(i>0)
			{
				if(i<responses.length-1)
					result+=", ";
				else
					result+=" and ";
			}
			result += snapCodeLabel(vName, responses[i]);
		}
	}
	return result;
}
// Variable response
function snapCodeLabel(vName, code)
{
	var result=code;
	var sVar = snapVars[vName];
	if (sVar && sVar.codeLabels)
	{
		if (0 < code && code <= sVar.codeLabels.length)
		{
			result = sVar.codeLabels[code - 1];
		}
	}
	return result;
}
// Variable response
function snapOpenAns(vName)
{
	var reply=""
	if(asked(vName))
	{
		var glovar=snapObject(vName+'_1');
		if(glovar != null && glovar.value!=null)
			reply=glovar.value;
	}
	return reply;
}
// Variable response
function snapOpenReply(vName)
{
	var reply="";
	var glovar=snapObject(vName+'_1');
	if(glovar != null)
	{
		reply=glovar.value;
		if(reply!=null)
		{
			while(reply.length>0 && reply.charAt(reply.length-1)==' ')
				reply=reply.substr(0, reply.length-1);
			while(reply.length>0 && reply.charAt(0)==' ')
				reply=reply.substr(1, reply.length-1);
		}
	}
	if(reply==null || reply.length==0)
		reply="(no reply)";
	return reply;
}
// Variable response
function snapSetOpenReply(vName, value)
{
	var glovar=snapObject(vName+'_1');
	if(glovar != null && glovar.value!=null)
		glovar.value=value;
}
// Variable response
function snapChangeMade(arg)
{
	var origin = snapEventOrigin(arg);
	if (origin)
	{
		snapCheckValueOf(origin);
		snapOnChange(origin.name);
	}
}
function snapOnChange(vName)
{
	if (vName)
	{
		snapUndoRoutingFor(vName);
		snapEvalTotals(vName);
		snapSubstituteText(vName);
		snapEvalPageRouting();
	}
}
// Variable response
// Check syntax of open-ended variables / check exclusive code settings for others
function snapCheckValueOf(object)
{
	if (object.name && object.id)
	{
		var sVar = snapVars[object.name];
		if (sVar && sVar.exclusive)
		{
			if (sVar.inputType == 'checkbox')
			{
				snapCheckExclusiveOf(sVar, object);
			}
			else if (sVar.inputType == 'select')
			{
				snapSelectExclusiveOf(sVar, object);
			}
		}
	}
}
function snapSelectExclusiveOf(sVar,object)
{
	if (nota_dd)
	{
		nota_dd(object, sVar.exclusive);
	}
}
////////////////////////////////////////////////////////////////////////////////
function getAsked(vName)
{
	var isAsked = true;
	if(!vName || vName=="")
	{	isAsked=false;
	} else
	{	var sVar = snapVars[vName];
		if (!sVar)
		{
			isAsked=true;//?
		}
		else if(sVar.askedCalc)
		{
			isAsked=sVar.askedCalc();
		}
		if (isAsked && sVar.codeMask)
		{
			var numCodes=sVar.numCodes;
			var autoReplies=0;
			if (sVar.autoAnswer)
			{
				sVar.doAutoAns = false;
				autoReplies = sVar.autoAnswer;
			}
			var showing = 0;
			for(var i=1;i<=numCodes && (showing <= autoReplies);i++)
			{	var showThisCode=sVar.codeMask(i);
				if (showThisCode)
					showing++;
			}
			if (showing <= autoReplies)
			{
				isAsked = false;
				if (autoReplies > 0)
					sVar.doAutoAns = true;
			}
		}
	}
	return isAsked;
}
function asked(vName)
{
	if (null == askedCache[vName])
	{
		askedCache[vName]=getAsked(vName);
		if (null == askedCache[vName])
		{
			askedCache[vName]= true;
		}
	}
	return askedCache[vName];
}
function noreply(vName)
{
	var isNR = false;
	if (asked(vName))
	{
		if (ans(vName) == "")
		{
			isNR = true;
		}
	}
	return isNR;
}
function ans(vName)
{
	var answer="";
	if(snapIsOpen(vName))
		answer=snapOpenAns(vName);
	else if(snapIsClosed(vName))
		answer=snapClosedAns(vName);
	return answer;
}
function ansAsNum(vName)
{
	return parseFloat(ans(vName));
}
function cVR(vName,value)
{
	var result=false;
	if (asked(vName))
	{
		var glovar=snapObject(vName);
		if(glovar != null)
		{
			var testValue=snapVarValue(vName);
			if((";"+testValue+";").indexOf(";"+value+";")>=0)
			{
				result=true;
			}
		}
	}
	return result;
}
function cVV(name1,name2)
{
	var result=false;
	if (asked(name1) && asked(name2) && !noreply(name1) && !noreply(name2))
	{
		var r1=";"+ans(name1)+";";
		var r2=";"+ans(name2)+";";
		while(r2.length>2&&!result)
		{
			var i=r2.substring(1).indexOf(";")+1;
			if(r1.indexOf(r2.substring(0,i+1))>=0)
				result=true;
			else
				r2=r2.substring(i);
		}
	}
	return result;
}
function cVM(vName)//(, ...)
{	var result=false;
	var numArgs = arguments.length;
	if ((1 < numArgs) && asked(vName))
	{	if (snapIsClosed(vName))
		{	if (snapIsDropdown(vName))
			{	var control = snapObject(vName + '_1');
				if (control && (control.options != null))
				{	if (control.type.toLowerCase()=='select-one')
					{	if (control.options[control.selectedIndex] != null)
						{	var val = control.options[control.selectedIndex].value;
							if (val > 0)
							{	for (var i = 1; (i < numArgs) && !result; i++)
								{	result = (val == arguments[i]);
								}
							}
						}
					}else
					{	for (var opt = 0; !result && (opt < control.options.length); opt++)
						{	if (control.options[opt].selected && (control.options[opt].value>0))
							{	var val = control.options[opt].value;
								for (var i = 1; (i < numArgs) && !result; i++)
								{	result = (val == arguments[i]);
								}
							}
						}
					}
				}
			}else
			{	for (var i = 1; (i < numArgs) && !result; i++)
				{	var requiredCode = snapObject(vName + '_' + arguments[i]);
					if ((null != requiredCode) && (null != requiredCode.checked))
					{	result = (requiredCode.checked == true);
					}
				}
			}
		}else
		{	var answer = ans(vName);
			if (answer!="")
			{	answer = ";"+answer+";";
				for (var i = 1; (i < numArgs) && !result; i++)
				{	if (0 <= answer.indexOf(";"+arguments[i]+";"))
					{	result = true;
					}
				}
			}
		}
	}
	return result;
}
function cInRange(value, minValue, maxValue)
{
	var result=(value!=null && (maxValue!=NaN) && (minValue!=NaN) && (value>=minValue && value<=maxValue)||(value>=maxValue && value<=minValue));
	return result;
}
////////////////////////////////////////////////////////////////////////////////
function codeReply(vName,nameCodes)
{
	var reply="";
	var glovar=snapObject(vName);
	if(glovar != null)
	{
		var first=true;
		var mValue=glovar.value+";";
		while(mValue.length>1)
		{
			var cPos=mValue.indexOf(";");
			if(!first)
			{
				if(cPos==mValue.length-1)
					reply+=" and ";
				else
					reply+=", ";
			}
			reply+=nameCodes[parseInt(mValue.substring(0,cPos), 10)-1];
			first=false;
			mValue=mValue.substring(cPos+1);
		}
	}
	if(reply.length==0)
		reply="(no reply)";
	return reply;
}
 
////////////////////////////////////////////////////////////////////////////////
function fStartTimer(uk)
{
	if (!timerStarted)
	{
		startPoint = new Date();
		var hours = startPoint.getHours();
		var mins = "00" + startPoint.getMinutes();
		var timeValue = ""+hours+":"+mins.substr(mins.length - 2);
		var days = startPoint.getDate();
		var months = startPoint.getMonth() + 1;
		var years = "00" + startPoint.getYear().toString();
		years = years.substr(years.length - 2);
		var dateValue;
		if (uk)
			dateValue = days + "/" + months + "/" + years;
		else
			dateValue = months + "/" + days + "/" + years;
		snapSetOpenReply("0", timeValue);
		snapSetOpenReply("V62", dateValue);
		timerStarted = true;
	}
}
function fEndTimer()
{
	if (timerStarted)
	{
		endPoint = new Date();
		var hours = endPoint.getHours();
		var mins = "00" + endPoint.getMinutes();
		var timeValue = ""+hours+":"+mins.substr(mins.length - 2);
		var durationValue=((endPoint - startPoint) / 60000);
		snapSetOpenReply("0", timeValue);
		snapSetOpenReply("0", durationValue);
		if (snapObject("0_1"))
		{
			var days = endPoint.getDate();
			var months = endPoint.getMonth() + 1;
			var years = "00" + endPoint.getYear().toString();
			years = years.substr(years.length - 2);
			var dateValue;
			if (1)//true=uk,false=usa
				dateValue = days + "/" + months + "/" + years;
			else
				dateValue = months + "/" + days + "/" + years;
			snapSetOpenReply("0", dateValue);
		}
		timerStarted = false;
	}
}
////////////////////////////////////////////////////////////////////////////////
function pbRatio(OutOf)
{
	var result=1;
	if (pageNumber >= lastPageNumber)
		result = OutOf;
	else if (pageNumber <= 1)
		result =1;
	else if (OutOf <= 2)
		result = Math.round(OutOf*pageNumber/lastPageNumber);
	else
		result = 2 + Math.floor((OutOf-2)*(pageNumber-1)/(lastPageNumber-1));
	if (1>result)
		result="01";
	else if (10 > result)
		result = "0" + result;
	else
		result = "" + result;
	return result;
}
////////////////////////////////////////////////////////////////////////////////
// Validation
function isValidNum(vName,allowNegatives,realName)
{
	var isValid=true;
	var locVar=snapObject(vName+ "_1");
	if (locVar != null)
	{
		var numstr=locVar.value;
		if (allowNegatives+""=="undefined" || allowNegatives+""=="null")
			allowNegatives = true;
		numstr+="";
		for(var i=0;i<numstr.length;i++)
		{
			if (!((numstr.charAt(i)>="0")&&(numstr.charAt(i)<="9")||((numstr.charAt(i)==".")&&(numstr.charAt(i+1)!="."))||(numstr.charAt(i)=="-")))
				isValid=false;
			else if((numstr.charAt(i)=="-"&&i!=0)||(numstr.charAt(i)=="-"&&!allowNegatives))
				isValid=false;
		}
		if(!isValid)
		{
			snapFocusObject(locVar);
			alert("Please enter a valid number for question "+realName+".");
		}
	}
	return isValid;
}
// Validation
function RangeCheck(vName,realName,min,max,UiCode)
{
	var isValid=true;
	var locVar=snapObject(vName+ "_1");
	if (locVar != null)
	{
		var numstr=""+locVar.value;
		if (0 < numstr.length)
		{
			var number = parseFloat(numstr);
			if(number<min || number>max || isNaN(number))
			{
				isValid = false;
				snapFocusObject(locVar);
				if ((1 == UiCode) && (min!=max))
				{
					alert("Please give an answer between "+min+" and "+max+" for question "+realName+".");
				} else if (0 != UiCode)
				{
					alert("Please enter a valid number for question "+realName+".");
				}
			}
		}
	}
	return isValid;
}
// Validation
function DateRange(vName,realName,min,max,UiCode)
{
	var varDate = getVarDate(vName,realName);
	var isValid = ("invalid" != varDate);
	if(isValid && ("" != varDate))
	{
		if((varDate.getTime() < min.getTime())||(varDate.getTime() > max.getTime()))
		{
			isValid = false;
			var locVar=snapObject(vName);
			if (locVar != null)
			{
				snapFocusObject(locVar);
			}
			if ((1 == UiCode) && (min.getTime()!=max.getTime()))
			{
				alert("Please give an answer between "+FormatDate(min)+" and "+FormatDate(max)+" for question "+realName+".");
			} else if (0 != UiCode)
			{
				alert("You've entered an invalid date or date format for question "+realName+".\n");
			}
		}
	}
	return isValid;
}
// Validation
function getVarDate(vName,realName)
{
	var indate="";
	var locVar = snapObject(vName+ "_1");
	if (locVar != null)
		indate=locVar.value;
	if(indate==null || indate.length==0)
		return "";
	var punct;
	if(indate.indexOf(".")!=-1)
		punct=".";
	else if(indate.indexOf("-")!=-1)
		punct="-";
	else
		punct="/";
	var day;
	var month;
	var year;
	var warningMessage;
	if (1)//true=uk,false=usa
	{
		day=indate.substring(0,indate.indexOf(punct));
		month=indate.substring(indate.indexOf(punct)+1,indate.lastIndexOf(punct));
		warningMessage = "Please use the DD/MM/YY format.";
	} else
	{
		month=indate.substring(0,indate.indexOf(punct));
		day=indate.substring(indate.indexOf(punct)+1,indate.lastIndexOf(punct));
		warningMessage = "Please use the MM/DD/YY format.";
	}
	year=indate.substring(indate.lastIndexOf(punct)+1,indate.length);
	month = getMonthName(month-1);
	if (year.length == 2)
	{
		if (30 > parseInt(year, 10))
		{
			year = "20"+year;
		} else
		{
			year = "19"+year;
		}
	}
	if (month=="" || year.length != 4 || parseInt(day, 10) > 31)
	{
		snapFocusObject(locVar);
		alert("You've entered an invalid date or date format for question "+realName+".\n"+warningMessage);
		return "invalid";
	}
	if (day.length == 1)
		day = "0" + day;
	var varDate = new Date(Date.parse(month + " " + day + ", " + year));
	var cmpDate1 = day + "/" + month + "/" + year;
	var month2 = getMonthName(varDate.getMonth());
	day = varDate.getDate();
	if (day.toString().length == 1)
	{
		day = "0" + day;
	}
	var cmpDate2 = day + "/" + month2 + "/" + varDate.getFullYear();
	if (cmpDate1 != cmpDate2)
	{
		snapFocusObject(locVar);
		alert("You've entered an invalid date or date format for question "+realName+".\n"+warningMessage);
		return "invalid";
	}
	return varDate;
}
// Validation
function isValidDate(vName,realName)
{
	var varDate = getVarDate(vName,realName);
	return ("invalid" != varDate);
}
// Validation
function TimeRange(vName,realName,min,max,UiCode)
{
	var varTime = getVarTime(vName,realName);
	var isValid = ("invalid" != varTime);
	if(isValid && ("" != varTime))
	{
		if((varTime.getTime() < min.getTime())||(varTime.getTime() > max.getTime()))
		{
			isValid = false;
			var locVar = snapObject(vName);
			snapFocusObject(locVar);
			if ((1 == UiCode) && (min.getTime()!=max.getTime()))
			{
				alert("Please give an answer between "+FormatTime(min)+" and "+FormatTime(max)+" for question "+realName+".");
			} else if (0 != UiCode)
			{
				alert("You've entered an invalid time or time format for question "+realName+".\n");
			}
		}
	}
	return isValid;
}
// Validation
function getVarTime(vName,realName)
{
	var intime="";
	var locVar = snapObject(vName+ "_1");
	if (locVar != null)
		intime=locVar.value;
	if(intime.length==0)
		return "";
	var punct;
	if(intime.indexOf(".")!=-1)
		punct=".";
	else if(intime.indexOf("-")!=-1)
		punct="-";
	else
		punct=":";
	var hour = "00";
	var minute = "00";
	var second = "00";
	var times = intime.split(punct);
	if(times.length >= 1)
		hour = times[0];
	if(times.length >= 2)
		minute = times[1];
	if(times.length >= 3)
		second = times[2];
	if(parseInt(hour, 10) > 23 || parseInt(minute, 10) > 59 || parseInt(second, 10) > 59)
	{
		snapFocusObject(locVar);
		alert("You've entered an invalid time or time format for question "+realName+".\n"+"Please use the hh:mm:ss format.");
		return "invalid";
	}
	if (hour.length == 1)
		hour = "0" + hour;
	if (minute.length == 1)
		minute = "0" + minute;
	if (second.length == 1)
		second = "0" + second;
	var varTime = new Date(Date.parse("1/1/1970 " + hour + ":" + minute + ":" + second));
	var cmpTime1 = hour + ":" + minute + ":" + second;
	hour = varTime.getHours();
	minute = varTime.getMinutes();
	second = varTime.getSeconds();
	if (hour.toString().length == 1)
		hour = "0" + hour;
	if (minute.toString().length == 1)
		minute = "0" + minute;
	if (second.toString().length == 1)
		second = "0" + second;
	var cmpTime2 = hour + ":" + minute + ":" + second;
	if (cmpTime1 != cmpTime2)
	{
		snapFocusObject(locVar);
		alert("You've entered an invalid time or time format for question "+realName+".\n"+"Please use the hh:mm:ss format.");
		return "invalid";
	}
	return varTime;
}
// Validation
function AnswerRange(vName,realName,min, max)
{
	var valid = true;
	var numCodes = snapNumCodes(vName);
	var count = 0;
	if (snapIsDropdown(vName))
	{
		var control = snapObject(vName + '_1');
		if (control && (control.options != null))
		{
			for (var x = 0; (x < control.options.length); x++)
			{
				if (control.options[x].selected && (control.options[x].value>0))
				{	count++;
				}
			}
		}
	}
	else
	{
		for (var x=1; x <= numCodes; x++)
		{
			var codeOb =  snapObject(vName + '_' + x);
			if (codeOb && (codeOb.checked))
			{	count++;
			}
		}
	}
	if (count < min)
	{
		valid = false;
	}
	else if (count > max)
	{
		valid = false;
	}
	if (!valid)
	{
		alert("Question "+realName+" requires between "+min+" and "+max+" replies.");
	}
	return valid;
}
// Validation
function isValidTime(vName,realName)
{
	var varTime = getVarTime(vName,realName);
	return ("invalid" != varTime);
}
// Validation
function ValidationPattern(vName,patternIndex)
{
	var Result=true;
	var locVar = snapObject(vName + "_1");
	var sVar = snapVars[vName];
	var PatternOb = snapGetPattern(patternIndex);
	if (sVar && locVar && PatternOb)
	{
		var realName = sVar.qName ? sVar.qName : vName;
		var indate=locVar.value;
		if(indate!=null && indate.length>0 && indate.search)
		{
			Result=(0<=indate.search(PatternOb.pattern));
			if(!Result)
			{
				alert("You've entered an invalid "+PatternOb.patternName+" for question "+realName+".");
			}
		}
	}
	return Result;
}
function snapGetPattern(patternIndex)
{
	if (!usedPatterns)
	{
		usedPatterns = new Object();
}
	return usedPatterns[patternIndex];
}
function SnapPattern(index, pattern, patternName)
{
	this.pattern = pattern;
	this.patternName = patternName;
	usedPatterns[index] = this;
}
//masking
function VarToNum(vName)
{
	var result = 0;
	if (snapIsOpen(vName))
	{
		var control = snapObject(vName + '_1');
		if (control && (control.value != null))
		{
			result = parseInt(control.value, 10);
		}
	}
	else if (snapIsDropdown(vName))
	{
		var control = snapObject(vName + '_1');
		if (control && (control.options != null))
		{
			var ok = true;
			for (var x = 0; (x < control.options.length) && ok; x++)
			{
				if (control.options[x].selected)
				{
					if (0 == result)
					{
						result = control.options[x].value;
					}
					else
					{
						result = 0;
						ok = false;
					}
				}
			}
		}
	}
	else if (snapIsClosed(vName))
	{
		var numCodes = snapNumCodes(vName);
		var ok = true;
		for (var x = 1; (x <= numCodes) && ok; x++)
		{
			var control = snapObject(vName + '_' + x);
			if (control && control.checked)
			{
				if (0 == result)
				{
					result = control.value;
				}
				else
				{
					result = 0;
					ok = false;
				}
			}
		}
	}
	if (0 == result)
	{
		result = NaN;
	}
	return result;
}
////////////////////////////////////////////////////////////////////////////////
// Date and Time
function FormatDate(Date)
{
	var dateString = "";
	if (1)
	{
		dateString += Date.getDate()+"/";
		dateString += (1 + Date.getMonth());
	} else
	{
		dateString += (1 + Date.getMonth())+"/";
		dateString += Date.getDate();
	}
	dateString += "/" + Date.getYear();
	return dateString;
}
// Date and Time
function FormatTime(Time)
{
	var timeString = "";
	var tempStr = Time.getHours().toString();
	if (tempStr.length == 1)
		tempStr = "0" + tempStr;
	timeString += tempStr + ":";
	tempStr = Time.getMinutes().toString();
	if (tempStr.length == 1)
		tempStr = "0" + tempStr;
	timeString += tempStr + ":";
	tempStr = Time.getSeconds().toString();
	if (tempStr.length == 1)
		tempStr = "0" + tempStr;
	timeString += tempStr;
	return timeString;
}
// Date and Time
function GetToday()
{	var Now = new Date();
	var Today = new Date(Now.getFullYear(), Now.getMonth(), Now.getDate(), 0, 0, 0, 0);
	return Today;
}
// Date and Time
function getMonthName(i)
{
	var month = "";
	switch (i)
	{
	case 0: month="January";break;
	case 1: month="February";break;
	case 2: month="March";break;
	case 3: month="April";break;
	case 4: month="May";break;
	case 5: month="June";break;
	case 6: month="July";break;
	case 7: month="August";break;
	case 8: month="September";break;
	case 9: month="October";break;
	case 10: month="November";break;
	case 11: month="December";break;
	}
	return month;
}
// Date and Time
function GetNow()
{
	var Now = new Date();
	Now.setFullYear(1970, 0, 1);
	return Now;
}
////////////////////////////////////////////////////////////////////////////////
function getLabel(labelArray, orderArray, code)
{
	return labelArray[orderArray[code]];
}
function getValue(orderArray, code)
{
	var val = orderArray[code] + 1;
	var str = "" + val;
	return str;
}
//-->

