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 req = {
	urlCharEncode: function(txt){
	var stringEncoded = txt.replace(/^(\s|\t)+|(\s|\t)+$/,'').replace(/&/g, '%26').replace(/\$/g, '%24').replace(/\+/g, '%2B').replace(/,/g, '%2C').replace(/:/g, '%3A').replace(/;/g, '%3B').replace(/\=/g, '%3D').replace(/\?/g, '%3F').replace(/@/g, '%40');
	//.replace(/\//g, '%2F')
	return stringEncoded;},

	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 + '=' + encodeURIComponent(JSON.stringify(valSet[val])) + '&';}}
	return formString.slice(0,-1);},		// removes extra '&' from the end of formString

	getReqExe: function(qString, response, url){
	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('');},

	postReqExe: function(valSet, response, url){	
	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);},

	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));}
};
