// add selected rows to cart
// R. White, 2007 January 20

function AddSelectedToCart(xsltselectfile) {
	// initialization is at end of function so methods are defined

	var me = this;

	this.addSelectedToCart = function(data) {
		// get info on selected rows from the XML and call add all to cart

		// if cart is not available, can't do this
		if (! hascookies) {
			alert("Shopping cart is unavailable because your browser has cookies disabled");
			return;
		}

		// Mozilla/IE XSLT processing using Sarissa
		if (!window.XSLTProcessor) {
			alert(noXSLTMessage());
			return;
		}
		var myXslProc = new XSLTProcessor();
		if ((!myXslProc) || (!myXslProc.importStylesheet)) {
			alert(noXSLTMessage());
			return;
		}
		// attach the stylesheet; the required format is a DOM object, and not a string
		myXslProc.importStylesheet(this.xsltselect);

		// do the XSL transform
		// create the XML
		var xml = myXslProc.transformToDocument(data);

		var root;
		for (var i=0; i < xml.childNodes.length; i++) {
			if (xml.childNodes[i].tagName == "select") {
				root = xml.childNodes[i];
				break;
			}
		}
		if (! root) {
			alert("Unable to determine selected items");
			return;
		}

		// process each row
		var cartItems = new Array();
		var dadsItems = new Array();
		var row;
		for (var i=0; i < root.childNodes.length; i++) {
			if (root.childNodes[i].tagName == "row") {
				row = root.childNodes[i];
				var args = new Array();
				for (var j=0; j<row.childNodes.length; j++) {
					args.push(getTextContent(row.childNodes[j]));
				}
				if (args.length == 4) {
					addToCartLists(cartItems, dadsItems, args[0],args[1],args[2],args[3]);
				}
			}
		}
		if (cartItems.length > 0 || dadsItems.length > 0) {
			addCartItems(cartItems, dadsItems);
		}
	};

	// internal methods

	function addToCartLists(cartItems, dadsItems, filename, url, label, naxis) {
		// most of this code borrowed from hlaview.js:xslAddCartItem()
		label = decodeURIComponent(label);

		if (url.match(/stdads_mark=/)) {
			// DADS cart load
			dadsItems.push([filename,label]);
			return;
		}

		// rest of code is for standard file loads

		var flist = filename.split(',');
		if (flist.length == 1) {
			// simple filename
			var dataset = filename;
			if (url.match(/hstonline_mark=/)) {
				var fitsfile = dataset + '.tar';
			} else {
				// normal case: HLA FITS file
				var fitsfile = dataset + '_drz.fits';
			}
		} else {
			// color image -- construct filename
			// combine common prefix with trailing fields from each color
			var f1 = flist[0].split('_');
			var f2 = flist[1].split('_');
			if (flist.length == 2) {
				var f3 = f2;
			} else {
				f3 = flist[2].split('_');
			}
			var lmin = Math.min(f1.length,f2.length,f3.length);
			for (var i=0; i<lmin; i++) {
				if (f1[i] != f2[i] || f1[i] != f3[i]) break;
			}
			dataset = f1.join('_') + '_' + f2.slice(i).join('_');
			if (flist.length > 2) dataset = dataset + '_' + f3.slice(i).join('_');
			fitsfile = 'color_' + dataset + '_sci.fits';
		}
		// replace '&amp;' with '&' in url to get it to match values from
		// other sources
		var ulist = url.split('&amp;');
		if (ulist.length > 1) url = ulist.join('&');

		// convert naxis to estimate of file size
		var filesize = undefined;
		try {
			var a = naxis.split(',');
			filesize = 4*flist.length;
			for (var i=0; i<a.length; i += 1) {
				filesize = filesize * parseInt(a[i],10);
			}
			if (dataset.substring(0,4).toLowerCase() == "hst_") {
				// assume 'hst_' files have error and quality extensions
				filesize = filesize * 3;
			}
			if (filesize==0 || filesize!=filesize) {
				// zero or NaN filesize
				if (label.match(/GRISM$/)) {
					// all grism spectra are the same size
					filesize = 20180.0;
				} else {
					filesize = undefined;
				}
			}
		} catch (e) {
			try {
				if (label.match(/GRISM$/)) {
					// all grism spectra are the same size
					filesize = 20180.0;
				} else {
					filesize = undefined;
				}
			} catch (e) {
			}
		}
		if (filesize===undefined) filesize = "0";
		cartItems.push([dataset,dataset,fitsfile,url,label,filesize]);
	}

	function xslSelectLoaded(data) {
		// Called when XSLT is loaded
		me.xsltselect = data;
	}

	function noXSLTMessage() {
		while (me.output.firstChild) {
			me.output.removeChild(me.output.firstChild);
		}
		var msg = document.createTextNode("Sorry, your browser does not support XSLT -- try Firefox, Safari (version 3), Mozilla (version > 1.3), Internet Explorer, or other compatible browsers.");
		me.output.appendChild(msg);
		return false;
	}

	function makeRequest(url, parameters, doneCallback) {
		// make a synchronous XMLHttpRequest
		var http_request = new XMLHttpRequest();
		var errmsg = alert;
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
		try {
			http_request.open('GET', url + parameters, false);
			http_request.send(null);
			var xmldata = http_request.responseXML;
			if (xmldata) {
				doneCallback(xmldata);
			} else {
				errmsg("Response from '"+url+parameters+"' is not XML?");
			}
		} catch (exceptionId) {
			errmsg("Error on open: "+exceptionId);
		}
	}

	// Complete initialization now that the methods are defined

	this.xsltselect = undefined;
	xsltselectfile = xsltselectfile || "/scripts/getselected.xsl";

	// load the XSLT file
	makeRequest(xsltselectfile, "", xslSelectLoaded);
}
