

function Session(cookiesAreWorking, initialUrl, myBase) {
	var me = this;
	cookiesAreWorking = (typeof(cookiesAreWorking) != 'undefined' &&
							cookiesAreWorking);
	var fields = new Array();
	var durations = new Array();
	
	this.set = function(myName, myValue, myDuration) {
		fields[myName] = myValue;
		if(typeof(myDuration) == 'number') {
			durations[myName] = myDuration;
		}
	}

	this.get = function(myName) {
		return fields[myName];
	}

	this.getFieldsFromUrl = function(myUrl) {
		if(debug) logger.dump('getting fields from url:['+myUrl+']');
		// deal with # first
		var split = myUrl.indexOf('#');
		if (split > 0) {
			myUrl = myUrl.substr(0, split);
		}

		var ret = new Array();
		// now look for query fields
		split = myUrl.indexOf('?');
		if (split < 0) {
			return ret;
		}
		// decode it
		myUrl = myUrl;
		// put fields in hash
		myUrl = myUrl.substr(split+1);
		var chunks = myUrl.split("&");
		var last = chunks.length;
		for( var i = 0; i < last; i++) {
			var myChunk = chunks[i];
			var split = myChunk.indexOf('=');
			if (split > 0) {
				myField = myChunk.substr(0,split);
				myValue = myChunk.substr(split+1);
				if(debug) logger.dump('adding myField:['+myField+']=>['+myValue+']');
				ret[myField] = unescape(myValue);
			}
		}
		return ret;
	}

	this.includeSessionVars = function(myTag) {
		if (stepping) { alert('includeSessionVars'); }
		// first set the cookies
		for (var myName in fields) {
			if(typeof(durations[myName]) != 'undefined' && 
				!isNaN(parseInt(durations[myName], 10) ) ) {
				if (debug) logger.dump('setting cookie [' + myName + '] to [' 
									+ fields[myName] + '] duration ['
									+ durations[myName] + ']');
				ck.set(myName, fields[myName], durations[myName]);
			} else {
				if (debug) logger.dump('setting cookie [' + myName + '] to [' 
									+ fields[myName] + ']');
				ck.set(myName, fields[myName]);
			}
		}
		// if we know for a fact that cookies are working then we're done here
		if (stepping) { alert('cookiesAreWorking'); }
		if (cookiesAreWorking) {
			if(debug) logger.dump('cookies work so we\'re done');
			return;
		}
		// else we'll populate any available form fiels or 
		// add it to get url as a get field
		var haveTag = 	(typeof(myTag) != 'undefined');
//alert('type [' + myTag.tagName + '] value [' + myTag.action + ']');

		// testing for form opera 6 reports A href as action so we check 
		// for tagname to be form. ns4 doesn't do tagname so undefined tagname
		// with action also works.
		var isForm = 	(typeof(document.standard) != 'undefined' && haveTag && 
						('FORM' == myTag.tagName || 
							(typeof(myTag.tagName) == 'undefined' && 
							 typeof(myTag.action) != 'undefined' ) ) );
		if (isForm) {
			if(debug) logger.dump('setting form fields');
			for (var myName in fields) {
				if (typeof(document.standard[myName]) == 'undefined') {
					if (debug) logger.dump('skipping undefined field for [' 
							+ myName + '] as [' + fields[myName] + ']');
					continue;
				}
				if (typeof(document.standard[myName].value) != 'string') {
					if (debug) logger.dump('skipping [' + myName + '] as [' 
							+ fields[myName] + '] because form field value type is ['
							+ typeof(document.standard[myName].value) + ']');
					continue;
				}
				if (debug) logger.dump('posting [' + myName + '] as [' 
										+ fields[myName] + ']');
//alert('myName [' + myName + '] myType [' + document.standard[myName].type + '] myValue [' + document.standard[myName].value + ']');
				document.standard[myName].value = fields[myName];
				if (debug) logger.dump('posted [' + myName + '] is [' 
									+ document.standard[myName].value + ']');
			}
			return;
		}

		if (!haveTag || typeof(myTag.href) != 'string') {
			if(debug) logger.dump('no href tag, leaving');
			return;
		}

		var ref = myTag.href;
		// we don't want to mess with javascipt: and complete links
		var re = new RegExp("^(^http)\w?:");
		if (!ref.match(re)) {
			if (debug) logger.dump('skipping non http link[' + ref + ']');
			return;
		}

		// get existing get fields
		var oldFields = me.getFieldsFromUrl(ref);
		// update them with the new ones
		for (var myName in fields) {
			oldFields[myName] = fields[myName];
		}
		// make the new query string
		if (ref.indexOf(myBase) != 0) {
			if (debug) logger.dump('skipping because link[' + ref 
					+ '] is foreign to [' + myBase + ']');
			return;
		}
		if (debug) logger.dump('making query string for [' + ref + ']');
		var suffix = utils.getFromDelimiter(ref, "#", true);
		var base = ref;
		if (suffix) {
			base = utils.getToDelimiter(base, "#");
		}
		base = utils.getToDelimiter(base, "?");
		if (debug) logger.dump('got base [' + base + '] and suffix [' + suffix + ']');
		var concatenator = '?';
		for (var myName in oldFields) {
			var myValue = oldFields[myName];
			if (debug) logger.dump('getting [' + myName + '] as [' 
								+ oldFields[myName] + ']');
			if (typeof(myValue) == 'undefined' || 
				null == myValue || '' == myValue){
				continue;
			}
			if (debug) logger.dump('adding field [' +myName + '] and value [' + myValue + ']');
			base += concatenator + myName + '=' + escape(myValue);
			if (concatenator == '?') {
				concatenator = '&';
			}
			if (debug) logger.dump('now base is [' + base + ']');
		}
		myTag.href = base + suffix;
		if (debug) logger.dump('set href to [' + myTag.href + ']');
	}


	if (typeof(initialUrl) == 'string') {
		fields = me.getFieldsFromUrl(initialUrl);
	}
}
