if(!this.JSON || window.navigator.appName === 'Microsoft Internet Explorer' || window.navigator.appCodeName === 'Mozilla'){	// Sort of hack to get around browser with native JSON
JSON = function(){
function f(n){
return n<10?'0'+n:n;}
Date.prototype.toJSON=function(key){
return this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z';};
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
escapeable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
gap,
indent,
meta={
'\b':'\\b',
'\t':'\\t',
'\n':'\\n',
'\f':'\\f',
'\r':'\\r',
'"':'\\"',
'\\':'\\\\'},
rep;
function quote(string){
escapeable.lastIndex=0;
return escapeable.test(string)?
'"'+string.replace(escapeable,function(a){
var c=meta[a];
if(typeof c==='string'){
return c;}
return'\\u'+('0000'+
(+(a.charCodeAt(0))).toString(16)).slice(-4);
})+'"':
'"'+string+'"';}
function str(key,holder){
var i,k,v,length,mind=gap,partial,value=holder[key];
if(value&&typeof value==='object'&&
typeof value.toJSON==='function'){
value=value.toJSON(key);}
if(typeof rep==='function'){
value=rep.call(holder,key,value);}
switch(typeof value){
case'string':
return quote(value);
case'number':
return isFinite(value)?String(value):'null';
case'boolean':
case'null':
return String(value);
case'object':
if(!value){
return'null';}
gap+=indent;
partial=[];
if(typeof value.length==='number'&&
!(value.propertyIsEnumerable('length'))){
length=value.length;
for(i=0;i<length;i+=1){
partial[i]=str(i,value)||'null';}
v=partial.length===0?'[]':
gap?'[\n'+gap+
partial.join(',\n'+gap)+'\n'+
mind+']':
'['+partial.join(',')+']';
gap=mind;
return v;}
if(rep&&typeof rep==='object'){
length=rep.length;
for(i=0;i<length;i+=1){
k=rep[i];
if(typeof k==='string'){
v=str(k,value,rep);
if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}
}else{
for(k in value){
if(Object.hasOwnProperty.call(value,k)){
v=str(k,value,rep);
if(v){
partial.push(quote(k)+(gap?': ':':')+v);}}}}
v=partial.length===0?'{}':
gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
mind+'}':'{'+partial.join(',')+'}';
gap=mind;
return v;}}
return{
stringify:function(value,replacer,space){
var i;
gap='';
indent='';
if(typeof space==='number'){
for(i=0;i<space;i+=1){
indent+=' ';}
}else if(typeof space==='string'){
indent=space;}
rep=replacer;
if(replacer&&typeof replacer!=='function'&&
(typeof replacer!=='object'||
typeof replacer.length!=='number')){
throw new Error('JSON.stringify');}
return str('',{'':value});},

parse:function(text,reviver){
var j;

function walk(holder,key){
var k, v, value = holder[key];
if(value && typeof value==='object'){
for(k in value){
if(Object.hasOwnProperty.call(value, k)){
v = walk(value, k);
if(v !== undefined){value[k] = v;}
else{delete value[k];}}}}
return reviver.call(holder, key, value);}

cx.lastIndex = 0;

if(cx.test(text)){text = text.replace(cx, function(a){return '\\u'+('0000'+ (+(a.charCodeAt(0))).toString(16)).slice(-4);});}

//if(/^[\],:{}\s]*$/.test(
//text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
//replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
//replace(/(?:^|:|,)(?:\s*\[)+/g, '')
//)){
try{
j = eval('(' + text + ')');
return typeof reviver === 'function'? walk({'':j},''): j;}
//}
catch(e){throw new SyntaxError('JSON.parse');}}};}();}

String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g,"");};

var cookies = {
	set: function(name, value, expires, options) {
	if(options === undefined){options = {};}
	var expires_date = new Date();
	if(expires){
	expires_date.setDate(expires_date.getDate() + expires);}
	window.document.cookie = name + '=' + encodeURI(value) + ((expires)? ';expires=' + expires_date.toGMTString(): '') + ((options.path)? ';path=' + options.path: '') + ((options.domain)? ';domain=' + options.domain: '') + ((options.secure)? ';secure': '');},

	get: function(name){
	var start = window.document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if((!start) && (name !== window.document.cookie.substring(0, name.length))){return null;}
	if(start === -1){return null;}
	var end = window.document.cookie.indexOf(';', len);
	if(end === -1){end = window.document.cookie.length;}
	return decodeURI(window.document.cookie.substring(len, end));},

	/*delete: function(name, path, domain){
	if(this.get(name)){window.document.cookie = name + '=' + ((path)? ';path=' + path: '') + (( domain)? ';domain=' + domain: '') + ';expires=Thu, 01-Jan-1970 00:00:01 GMT';}
	},*/

	allowed: function(){
	setCookie('checkCookie', 'test', 1);
	if(this.get('checkCookie')){
	//this.delete('checkCookie');
	return true;}
	return false;}
};

var querySet = function() {
var qSet = {};
var query = window.location.search.substring(1);
//if(query != ''){
var pairs = query.split('&');
for (var i=0; i<pairs.length; i+=1) {
var pair = pairs[i].split('=');
qSet[pair[0].toLowerCase()] = pair[1];}
//}
return qSet;}();

var xml = {
	transform: function(xmlDoc, xsltDoc, parentNode){
	if(parentNode.innerHTML !== ''){parentNode.innerHTML = '';}
	if(window.XSLTProcessor){ // --MOZILLA--
	var xsltProcessor = new XSLTProcessor();
	xsltProcessor.importStylesheet(xsltDoc);
	parentNode.appendChild(xsltProcessor.transformToFragment(xmlDoc, document));}
	else{	// --IE--
	var filterXslt = function(){
	var progIDs = ['Msxml2.XSLTemplate.6.0', 'Msxml2.XSLTemplate.3.0'];
	for(var i=0; i<progIDs.length; i+=1){
	try{
	var xmlDOM = new ActiveXObject(progIDs[i]);
	return xmlDOM;}
	catch(ex){}}}();
	filterXslt.stylesheet = xsltDoc;
	var xsltProcess = filterXslt.createProcessor();
	xsltProcess.input = xmlDoc;
	xsltProcess.transform();
	parentNode.innerHTML = xsltProcess.output;}},

	parse: function(txt){
	if(window.DOMParser){ // --MOZILLA--
	var parser = new DOMParser();
	return parser.parseFromString(txt, 'text/xml');}
	else if(window.ActiveXObject){	// --IE--
	var msXmlDoc = function(){
	var progIDs = ['Msxml2.FreeThreadedDOMDocument.6.0', 'Msxml2.FreeThreadedDOMDocument.3.0'];
	for(var i=0; i<progIDs.length; i+=1){
	try{
	var xmlDOM = new ActiveXObject(progIDs[i]);
	return xmlDOM;}
	catch(ex){}}}();
	msXmlDoc.async = false;
	msXmlDoc.preserveWhiteSpace = false;
	msXmlDoc.setProperty('SelectionLanguage', 'XPath');
	msXmlDoc.setProperty('AllowDocumentFunction', true);
	msXmlDoc.loadXML(txt);
	return msXmlDoc;}},

	prefix: null,
	name: null,

	parseQName: function(qName){
	var parsedName = qName.split(':', 2);
	if(parsedName.length === 2){
	xml.prefix = parsedName[0] + ':';
	xml.name = parsedName[1];}
	else if(parsedName.length === 1){
	xml.prefix = '';
	xml.name = parsedName[0];}},

	getNodesByTagNameNS: function(ns, tagName){
	xml.parseQName(tagName);
	if(!this.getElementsByTagNameNS){ // Continuing to enable a crappy browser
	if(xml.prefix !== ''){return this.getElementsByTagName(xml.prefix + xml.name);}
	else{
	var t = [];
	var s = this.getElementsByTagName('*');
	for(var i=0; i<s.length; i+=1){if(s[i].tagName === xml.name){t.push(s[i]);}}}
	return t;}
	else {return this.getElementsByTagNameNS(ns, xml.name);}},

	createNodeNS: function(ns, qName){
	if(!this.createElementNS){return this.createNode(1, qName, ns);}
	else {return this.createElementNS(ns, qName);}},

	createAttrNS: function(ns, qName){
	if(!this.createAttributeNS){return this.createNode(2, qName, ns);}
	else{return this.createAttributeNS(ns, qName);}},

	getAttrNS: function(ns, qName){
	xml.parseQName(qName);
	if(!this.getAttributeNS){return this.getAttribute(xml.prefix + xml.name);}
	else {return this.getAttributeNS(ns, xml.name);}},

	getAttrNodeNS: function(ns, qName){
	xml.parseQName(qName);
	if(!this.getAttributeNodeNS){return this.getAttributeNode(xml.prefix + xml.name);}
	else {return this.getAttributeNodeNS(ns, xml.name);}},

	setAttrNS: function(ns, qName, value){
	xml.parseQName(qName);
	if(!this.setAttributeNS){this.setAttribute(xml.prefix + xml.name, value);}
	else {return this.setAttributeNS(ns, xml.name, value);}},

	setAttrNodeNS: function(ns, attr){
	if(!this.setAttributeNodeNS){return this.setAttributeNode(attr);}
	else{return this.setAttributeNodeNS(ns, attr);}},
	
	replaceSpChar: function(txt){txt.replace(/&\s/g, '&#038;');}
};



var req = {
	buildHTMLRequest: function(html, boundary){
	var pxg = '';
	pxg = 'Content-Disposition: form-data; ';
	pxg += 'id="REQUESTENGINE"; ';
	pxg += 'type="HTMLREQUEST"' + '\r\n';
	pxg += "Content-Type: text/html" + '\r\n' + '\r\n';
	pxg += html + '\r\n' + '\r\n';
	var reqpxg = '--' + boundary + '\r\n';
	reqpxg += pxg;
	reqpxg += '--' + boundary + '--' + '\r\n';
	return reqpxg;},

	buildStreamRequest: function(stream, boundary){
	var pxg = '';
	pxg = 'Content-Disposition: form-data; ';
	pxg += 'id="REQUESTENGINE"; ';
	pxg += 'type="STREAMREQUEST"' + '\r\n';
	pxg += "Content-Type: application/octet-stream" + '\r\n' + '\r\n';
	pxg += stream + '\r\n' + '\r\n';
	var reqpxg = '--' + boundary + '\r\n';
	reqpxg += pxg;
	reqpxg += '--' + boundary + '--' + '\r\n';
	return reqpxg;},

	requestBoundary: function(){return '---------------------------' + (new Date()).getTime();},

	setObjType: function(){
	if(window.XMLHttpRequest){return new XMLHttpRequest();}
	else if(window.ActiveXObject){
	try{return new ActiveXObject('Msxml2.XMLHTTP');}
	catch(e1){
	try{return new ActiveXObject('Microsoft.XMLHTTP');}
	catch(e2){
	alert('This site has encountered an issue that will keep you from changing your preferences. Please call to have your preferences changed.');
	return;}}}},

	createFormString: function(valSet){
	var formString = '';
	for(var val in valSet){if(valSet.hasOwnProperty(val)){formString += val + '=' + JSON.stringify(valSet[val]) + '&';}}
	return formString.slice(0,-1);},		// removes extra '&' from the end of formString

	getReqExe: function(qString, response, url, showProgress){
	if(showProgress){req.showProgressImg();}
	if(qString === ''){ qString = 'timestamp=' + (new Date()).getTime(); }
	else{ qString += '&timestamp=' + (new Date()).getTime(); }
	var http = this.setObjType();
	var questionMark = qString !== ''? '?': '';
	http.onreadystatechange = function(){if(http.readyState === 4 && http.status === 200){if(response !== null){response(http);}}};
	http.open('GET', url + questionMark + qString, true);
	http.send('');
	if(showProgress){req.hideProgressImg();}},

	postReqExe: function(valSet, response, url, showProgress){
	if(showProgress){ req.showProgressImg(); }
	var formVals = this.createFormString(valSet);
	var http = this.setObjType();
	http.onreadystatechange = function(){if(http.readyState === 4 && http.status === 200){if(response !== null){response(http);}}};
	http.open('POST', url, true);
	http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
	http.setRequestHeader('Content-length', formVals);
	http.setRequestHeader("Connection", "close");
	http.send(formVals);
	if(showProgress){ req.hideProgressImg(); }},

	keepAlive: function(){ //keep session open as long as browser is open
	var repeat = function(){return window.setTimeout('req.keepAlive();', 60000);};
	req.postReqExe('', repeat, 'SessionExtend.aspx');},

	postHTMLExe: function(html, response, urlqstring){
	if(urlqstring === ''){urlqstring = '?timestamp=' + (new Date()).getTime();}
	else{urlqstring += '&timestamp=' + (new Date()).getTime();}
	var http = this.setObjType();
	var boundary = this.requestBoundary();
	var contentType = "multipart/form-data; boundary=" + boundary;
	http.open("POST", urlqstring, true);
	http.onreadystatechange = function() { if (http.readyState === 4 && http.status === 200) {if(response !== null){response(http);}}};
	http.setRequestHeader("Content-Type", contentType);
	http.send(buildHTMLRequest(html, boundary));},

	postStreamExe: function(stream, response, urlqstring){
	if(urlqstring === ''){urlqstring = '?timestamp=' + (new Date()).getTime();}
	else{ urlqstring += '&timestamp=' + (new Date()).getTime();}
	var http = this.setObjType();
	var boundary = this.requestBoundary();
	var contentType = "multipart/form-data; boundary=" + boundary;
	http.open("POST", urlqstring, true);
	http.onreadystatechange = function() { if (http.readyState === 4 && http.status === 200) {if(response !== null){response(http);}}};
	http.setRequestHeader("Content-Type", contentType);
	http.sendAsBinary(this.buildStreamRequest(stream, boundary));},

	showProgressImg: function(){
	var topPos = 400;
	var leftPos = 600;
	if(window.document.body.clientHeight){
	topPos = (window.document.body.clientHeight - 100) / 2;
	leftPos = (window.document.body.clientWidth - 100) / 2;}
	else if(window.innerHeight){
	topPos = (window.innerHeight - 100) / 2;
	leftPos = (window.innerWidth - 100) / 2;}
	window.document.getElementById('uxProgressIndicator').style.top = topPos+'px';
	window.document.getElementById('uxProgressIndicator').style.left = leftPos+'px';
	window.document.getElementById('uxProgressIndicator').style.display = 'block';},

	hideProgressImg: function(){window.document.getElementById('uxProgressIndicator').style.display = 'none';}
};