/*
eV.trim(string);
eV.bookmark(title,url)
eV.in_array(array,itemtomatch) = bool
eV.array_search(array,itemtomatch) = int (-1 = not found)
eV.queryStringToArray(querystring) = array
eV.AJAXgetData(dataSource,functionOnComplete) = calls [functionOnComplete](output)
eV.CSVtoArray(data,maxRows) = array
eV.layerPopUpClose(parent,child)
eV.layerPopUp(title,content,id)
eV.mdArrElemToArr(arr,key) = array
eV.arrayToTable(array) = tableString
eV.productPriceInit(formNameRE,elementIdRE,priceDataArr);
eV.productPriceGet(productId)
eV.eventAdd(obj,type,fn); // crossbrowser add event to object
eV.eventRemove(obj,type,fn); // cross browser remove event from object
eV.exitTriggerSet(func); // sets a pop up to display when leaving the site
eV.exitPopUp(file);
eV.browserWindow(targetWindow) // returns object crossbrowser x,y,innerWidth,innerHeight of targetWindow

eV.drag.init(); // once on script
eV.drag.set(buttonElementId,movingElementId); // to set each draggable element


////////// HISTORY ////////////
2/10/2009 mwexler added exitTriggerSet function
2/11/2009 mwexler added exitPopUp, browserWindow functions

*/

//alert('called getbanners');
// only create if not created already
if(typeof eV == "undefined"){
	var eV = {
		test : function(){
			alert('test successful');
		},
		eventAdd: function(obj,type,fn) {
			//eV.eventAdd(window.document.formName.fieldName,'mouseover',function() { alert(true); });
	
			if (obj.attachEvent) {
				obj['e'+type+fn] = fn;
				obj[type+fn] = function() { obj['e'+type+fn](window.event); }
				obj.attachEvent('on'+type,obj[type+fn]);
			} else
			obj.addEventListener(type,fn,false);
		},
		eventRemove: function(obj,type,fn) {
			if (obj.detachEvent) {
				obj.detachEvent('on'+type,obj[type+fn]);
				obj[type+fn] = null;
			} else
			obj.removeEventListener(type,fn,false);
		},
	
		
		trim : function(str) {
			return str.replace(/^\s+|\s+$/,"");
			/*
			str = str.replace(/^\s+/, '');
			for (var i = str.length - 1; i >= 0; i--) {
				if (/\S/.test(str.charAt(i))) {
					str = str.substring(0, i + 1);
					break;
				}
			}
			*/
			return str;
		},
	
		
		bookmark : function(title,url){
			if (window.sidebar) // firefox
				window.sidebar.addPanel(title, url, "");
			else if(window.opera && window.print){ // opera
				var elem = document.createElement('a');
				elem.setAttribute('href',url);
				elem.setAttribute('title',title);
				elem.setAttribute('rel','sidebar');
				elem.click();
			} 
			else if(document.all)// ie
				window.external.AddFavorite(url, title);
		},
		
		in_array : function(arr,matchObj){
			var isInArray = false;
			for(var i=0;i<arr.length;i++){
				if(arr[i] == matchObj){
					isInArray = true;
					break;
				};
			};
			return isInArray;
		},
		
		array_search : function(arr,matchObj){
			var index = -1;
			for(var i=0;i<arr.length;i++){
				if(arr[i] == matchObj){
					index = i;
					break;
				};
			};
			return index;
		},
		
		queryStringToArray : function(querystring){
			var returnArr = Array();
			var qsArr = querystring.split('&');
			for(var i=0;i<qsArr.length;i++){
				var valuePair = qsArr[i];
				var valuePairArr = valuePair.split('=');
				if(valuePairArr.length > 1 && valuePairArr[0].length > 0) returnArr[valuePairArr[0]] = decodeURIComponent(valuePairArr[1]);
			};
			return returnArr;
		},
	
		AJAXgetData : function(dataSource,functionOnComplete){
			var XMLHttpRequestObject = false;
			var returnVal = 'No file';
			if(window.XMLHttpRequest){
				XMLHttpRequestObject = new XMLHttpRequest();
			} else if (window.ActiveXObject){
				XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
			};
			if(XMLHttpRequestObject){
				XMLHttpRequestObject.open("GET", dataSource);
				XMLHttpRequestObject.onreadystatechange = function(){
					//alert('onreadystatechange readystate:' + XMLHttpRequestObject.readyState + ' status:' + XMLHttpRequestObject.status);
					if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200){
						returnVal = XMLHttpRequestObject.responseText;
						eval(functionOnComplete + '(returnVal);');
					// end check ready state and status 
					// end if readystate = 4 or 200
					};
				// end onreadystatechange function
				};
				XMLHttpRequestObject.send(null);
			// end if XMLHttpRequestObject
			};
		// end function
		},
		
		CSVtoArray : function(data,maxRows){
			/* expects new line delim rows, comma delim fields, dquote as text identifier
			returns 2 dim array, first dim = rows, 2nd dim = values */
			// convert "" escapes to \" escapes
			//data= data.replace(/""/g,'\\"');
			var csvArray = Array();
			// c solution: ,(?=([^\"]*"[^"]*")*(?![^"]*"))
			/*
				,						// loop for comma
					(?=					// positive lookahead
						(
							[^\"]*"		// anything but quote repeated, until quote
							[^"]*"		// anything but quote repeated, until quote
						)
						*				// repeated
						(?!				// negative lookahead
								[^"]*"	// anything but quote repeated, until quote
						)
					)
			
			*/
			//var regex = /,(?=([^\"]*"[^"]*")*(?![^"]*"))/;
			//var regex = /(,|,(?=([^\"]*"[^"]*")*(?![^"]*")))/;
			
			//var regex = /,(?=([^"]*"[^"]*")*(?![^"]*"))/;
			
			//var regex = /,(?="[^"]*")/; // working only for quote
			//var regex = /((,(?="[^"]*"))|(,?!"))/;
			// var regex = /,(?=([^']*'[^']*')*(?![^']*'))/; // 4 guys from rolla 
			//var regex = /[ \t\r\n]*(.*?)[ \t\r\n]*=[ \t\r\n]*(\'[^\']*\'|\"[^\"]*\"|[^;]*?)[\t\r\n]*(;|$)/
			
			
			//eval('var regex = /,(?=' + textQualifier + '[^' + textQualifier + ']*' + textQualifier + ')/'); // working only for quote
			
			// start line split by enter
			/*
			var regex = /\n(?<!(\n|,)"[^"]*)/;
			
			//qualify \n that is not preceded by a (  ',"' or '\n"' ) that isnt followed by a '"'"
			
			*/
			// split to array of lines
			var csvArray = (maxRows == null) ? data.split('\n') : data.split('\n',maxRows);
			// begin looping thru lines
			for(i=0;i<csvArray.length;i++){
				// start field split by ,
				var regex = /,(?="[^"]*")/;
				
				var recordArray = csvArray[i].split(regex);
				var newRecordArray = Array();
				
				// now lets split up the remaining items
				for(var ii=0;ii<recordArray.length;ii++){
					var elem = recordArray[ii];
				//	document.writeln('<br>elem:' + elem);
					if(elem.indexOf('"') == 0 && elem.indexOf('"',1) == elem.length-1){
						// this is already a quoted item, just append to array and move on
						newRecordArray[newRecordArray.length] = elem;
						//document.writeln('<br>Fully enclosed quotes:' . elem);
						continue;
					};
					var elemArr = elem.split(',');
					var newElemArr = Array();
					// work backwords and gather all fields until we identify the end of a quoted text identifier field
					for(var iii=elemArr.length-1;iii>=0;iii--){
						var elemItem = elemArr[iii];
						//document.writeln('<br>checking elemItem:' + elemItem);
						if(elemItem.indexOf('"') == elemItem.length-1 && elemArr[0].indexOf('"') == 0 && elemItem.length > 0){
							// found quoted end and quoted beginning
							// last item = quoted string
							//document.writeln('<br>sliced item:' + elemArr.slice(0,iii+1).join(","));
							newElemArr[newElemArr.length] = elemArr.slice(0,iii+1).join(",");
							break;
						} else {
							// not quoted, this is its own element
							//document.writeln('<br>own:' + elemItem);
							newElemArr[newElemArr.length] = elemItem;
						};
					// end elemArr loop
					};
					
					newRecordArray = newRecordArray.concat(newElemArr.reverse());
					
				// end csvArray loop
				};
				// end lfield split by ,
				csvArray[i] = newRecordArray;
			// end of line loop
			};
			return csvArray;
		},
		layerPopUpClose : function(parent,child){
			parent.removeChild(child);
		},
		layerPopUp : function(title,content,id,leftX,topY){
			if(leftX == null) leftX = window.mouseX;
			if(topY == null) topY = window.mouseY;
			// dont double do same id
			if(!window.document.getElementById('customPopUp__' + id)) {
				var bodytag = document.getElementsByTagName('body')[0];
				var popup = window.document.createElement('div');
				popup.setAttribute('id','customPopUp__' + id);
				popup.style.position = "absolute";
				popup.style.zIndex = 999999;
				
				//popup.style.left = '100px';
				//popup.style.top = '100px';
				/*
				 if(this.iex) return (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
				else return window.pageYOffset;
				*/
				//var scrollTop = (document.body.scrollTop != 'undefined') ? document.body.scrollTop : window.pageYOffset;
				//alert(scrollTop);
				//popup.style.top = (200 + scrollTop);
				//popup.style.backgroundColor = "silver";
				//popup.style.border="medium line rgb(255,0,0)";
				//popup.style.textAlign="center";
				//popup.style.margin = "10px";
				//popup.style.padding = "10px";
				var htmlOutput = '';
				
				htmlOutput = htmlOutput + '<table cellpadding=0 cellspacing=0 border=0><tr>';
				htmlOutput = htmlOutput + '<td width=6 height=30 valign=top style="vertical-align: middle"><img src="/sysimages/popup-tl.gif"></td>';
				htmlOutput = htmlOutput + '<td valign=top style="vertical-align: middle">';
				
				htmlOutput = htmlOutput + '<table cellpadding=0 cellspacing=0 border=0 width="100%" height=30 id="eV_layerPopUp_title' + id + '"><tr>';
					htmlOutput = htmlOutput + '<td height=30 background="/sysimages/popup-t.gif" style="vertical-align: middle">';
					htmlOutput = htmlOutput + '<font face=arial,sans-serif size=2 color=white><b>' + title + '</b></font>';
					htmlOutput = htmlOutput + '</td>';
					htmlOutput = htmlOutput + '<td height=30 background="/sysimages/popup-t.gif" align=right style="vertical-align: middle">';
					htmlOutput = htmlOutput + '<a href="javascript:eV.layerPopUpClose(document.getElementsByTagName(\'body\')[0],window.document.getElementById(\'customPopUp__' + id + '\'));"><img src="/sysimages/popup-btn-close.gif" border=0 align=right valign=middle></a>';
					//onClick="document.getElementsByTagName(\'body\')[0].removeChild(window.document.getElementById(\'customPopUp__' + id + '\'));"
					htmlOutput = htmlOutput + '</td>';
				htmlOutput = htmlOutput + '</tr></table>';
				
				htmlOutput = htmlOutput + '</td>';
				htmlOutput = htmlOutput + '<td width=6 height=30 style="vertical-align: middle"><img src="/sysimages/popup-tr.gif"></td>';
				htmlOutput = htmlOutput + '</tr><tr>';
				htmlOutput = htmlOutput + '<td background="/sysimages/popup-l.gif" width=6>&nbsp;</td><td bgcolor="white">' + content + '</td>';
				htmlOutput = htmlOutput + '<td background="/sysimages/popup-r.gif" width=6>&nbsp;</td>';
				htmlOutput = htmlOutput + '</tr><tr>';
				htmlOutput = htmlOutput + '<td width=6 height=4><img src="/sysimages/popup-bl.gif"></td>';
				htmlOutput = htmlOutput + '<td background="/sysimages/popup-b.gif"></td>';
				htmlOutput = htmlOutput + '<td width=6 height=4><img src="/sysimages/popup-br.gif"></td>';
				htmlOutput = htmlOutput + '</tr></table>';
			
				//alert(htmlOutput);
				popup.innerHTML = htmlOutput;
				bodytag.appendChild(popup);
				
				// set as dragable
				eV.drag.init(); // once on script
				eV.drag.set('eV_layerPopUp_title' + id,'customPopUp__' + id); // to set each draggable element
				
				// set location
				popup.style.left = leftX + 'px';
				popup.style.top = topY + 'px';
				//popup.style.left = event.clientX;
				//popup.style.top = event.clientY;
	
				
			};
			return 'customPopUp__' + id;
		},
		
		mdArrElemToArr : function(arr,key){
			var newArr = Array();
			for(var i=0;i<arr.length;i++){
				newArr[i] = arr[i][key];
			};
			return newArr;
		},
		
		
		arrayToTable : function(array){
			// loop thru rows
			var output = '<table border=2>';
			for(var i=0;i<array.length;i++){
				var row = array[i];
				var output = output + '<tr>';
				for(var ii=0;ii<row.length;ii++){
					var cell = row[ii];
					var output = output + '<td valign=top><font size=1>' + cell + '</font></td>';
				};
				var output = output + '</tr>'; 
			};
			output = output + '</table>';
			return output;
		},
		
		
		exitTriggerSet: function(func){
			/* ISSUES:
			back button
			forward button
			page reload
			bookmark
			type in a page
			*/
			/*
			//to use
			//create a function to be called with the trigger is activated. example:
			function popupfunc(){
				alert('leaving site');
			};
			// then call the exitTriggerSet function, referencing the target function
			eV.exitTriggerSet(popupfunc);
			*/
			
			eV.exitTriggerTest = true;
			eV.exitTriggerExec = func;
			eV.eventAdd(window,'unload',function(){if(eV.exitTriggerTest) eV.exitTriggerExec();});
			//eV.eventAdd(document.getElementsByTagName('body')[0],'click',function(e){eV.exitTriggerTest = false;});
			
			eV.eventAdd(window,'load',function(e){
				// set data array for tags. functions
				var tagArr = [
						{tagname : 'a', eventname : 'click'},
						{tagname : 'form', eventname : 'submit'}
				];
				
				
				//alert('-----\nappName:\n' + navigator.appName + '\n-------\nappVersion:\n' + navigator.appVersion + '\n------\nappMinorVersion:\n' + navigator.appMinorVersion + '\n------\nuserAgent:\n' + navigator.userAgent + '\n------\nappCodeName:\n' + navigator.appCodeName + '\n------\nplatform:\n' + navigator.platform);
				
				for(i=0;i<tagArr.length;i++){
					var tag = tagArr[i];
					var as=document.getElementsByTagName(tag.tagname);
					// loop thru tags
					for (ii=0;ii<as.length;ii++) eV.eventAdd(as[ii],tag.eventname,function(e){eV.exitTriggerTest = false;});
				// end for i loop 
				};
				
					// fix forms so submit method can envoke onsubmit functions.
					
				for( var i = 0; i < document.forms.length; i++ ) {
					var theForm = document.forms[i];
					theForm.originalSubmit = theForm.submit;
					theForm.submit = function() {
					  if ( this.onsubmit ) {
						if ( this.onsubmit() != false ) this.originalSubmit();
					  } else {
						this.originalSubmit();
					  }
					 // end submit function
					};
				// end for loop
				};
			// end eV.eventAdd(window,'load',function(e)
			});
		// end function
		},
		
		exitPopUp: function(file){
			// exit pop up that close if calling window doesnt land on same domain
			//alert('exitPopUp start');
			eV.exitTriggerSet(function(){
				//alert('exitTriggetSet function start');
				//var browserWindow = eV.browserWindow();
				/*
				var windowContent = '\n<scri' + 'pt language="javascript" src="/common/fnEtc.js"></scr' + 'ipt>\n<scri' + 'pt language="javascript">\n<!--\nalert(1);\nwindow.moveTo(0,0);\nalert(2);\neV.exitPopUpData = new Object();\nalert(3);\neV.exitPopUpData.width=' + width + ';\neV.exitPopUpData.height=' + height + ';\neV.exitPopUpData.content = decodeURI("' + encodeURI(content) + '");\neV.exitPopUpData.parentx = ' + browserWindow.x + ';\neV.exitPopUpData.parenty = ' + browserWindow.y + ';\neV.exitPopUpTest();//-->\n</script>';
				*/
				//var jsContent = '<!--\nalert(1);\nwindow.moveTo(0,0);\nalert(2.1);\neV.exitPopUpData = new Object();\nalert(3);\neV.exitPopUpData.width=' + width + ';\neV.exitPopUpData.height=' + height + ';\neV.exitPopUpData.content = decodeURI("' + encodeURI(content) + '");\neV.exitPopUpData.parentx = ' + browserWindow.x + ';\neV.exitPopUpData.parenty = ' + browserWindow.y + ';\neV.exitPopUpTest();\n//-->';
				
				//var windowContent = '\n<script language="javascript">\n' + jsContent + '\n</scr' + 'ipt>';
				// ? trick to circumvent some pop up blockers?
				document.domain = document.domain.substring(document.domain.indexOf('.')+1);

				var eVexitPopUp = window.open(file,'eVexitPopUp','width=10,height=10,resizable=0,menubar=0,status=0,directories=0,location=0,toolbar=0,top=' + (screen.height+20) + ', left=' + (screen.width+20));
				window.focus();
				//window.jsContent = jsContent;
				//alert('exitTriggerSet 1.0');
				if(eVexitPopUp) {
					//try{
					//eVexitPopUp.moveTo((screen.width+20),(screen.height+20));
					//eVexitPopUp.resizeTo(10,10);
					//eVexitPopUp.window.eVjsContent = jsContent;
					//alert('exitTriggerSet 2.0');
					
					//var script = eVexitPopUp.document.createElement('script');
					//script.type = 'text/javascript';
					//script.text = jsContent;
					//eVexitPopUp.document.getElementsByTagName('head')[0].addChild(script);
					
					//eV.eventAdd(eVexitPopUp,'load',function(){alert('a');document.getElementById('scriptElem').text = window.eVjsContent;});
					//eVexitPopUp.location.href = '/common/popup.html';
					//if(eVexitPopUp.document.getElementById('scriptElem') && eVexitPopUp.document.getElementById('scriptElem').text == '')  eVexitPopUp.document.getElementById('scriptElem').text = jsContent;
					//windowContent;
					//eV.eventAdd(eVexitPopUp.window,'load',function(){
																	 /*
						alert('onload start');
						var script = document.createElement('script');
						script.type = 'text/javascript';
						script.innerHTML = window.opener.jsContent;
						document.getElementsByTagName('head')[0].addChild(script);
						alert('onload complete');
						*/
					//});
					//alert('exitTriggerSet 3.0');
					/*
					} catch(e){
						// close window if open on error
						if(eVexitPopUp.close) eVexitPopUp.close();
						var error = '';
						for(var err in e) error += err +':' + e[err] + '\n';
						alert('exitTriggerSet catch\n\n' + error);
					};
					*/
				// finish if(eVexitPopUp)
				};
				//alert('exitTriggerSet function complete');
				//alert('content written');
			 });
		},
		
		exitPopUpTest: function(){
			//alert('exitPopUpTest start');
			setTimeout(function(){
				//alert("exitPopUpTest timer");
				//alert(window.location.hostname + '\nvs\n' + window.opener.location.hostname);
				var hostMatch = false;
				try{
					if(window.location.hostname == window.opener.location.hostname) hostMatch = true;
					else hostMatch = false;	
				}
				catch(err) {
					hostMatch = false;
				};
				if(hostMatch){
					// same domain, close
					//alert('exitPopUpTest closing');
					window.close();
				} else {
					//alert('exitPopUpTest sizing');
					// new domain, size and move
					//window.document.write(eV.exitPopUpData.content);
					//window.moveTo(window.popUpData.parentx+100,window.popUpData.parenty+100);
					window.moveTo(100,100);
					window.resizeTo(eV.exitPopUpData.width,eV.exitPopUpData.height); 
					window.focus();
				};
			},100);
		},
		browserWindow : function(){
			var x = false;
			var y = false;
			var innerHeight = false;
			var innerWidth = false;
			var windowObj = window;
			// location
			if (typeof windowObj.screenLeft != "undefined"){ //IE
				x = windowObj.screenLeft;
				y =  windowObj.screenTop;
			}
				else if (typeof windowObj.screenX != "undefined"){ //NS/Moz
				x = windowObj.screenX;
				y = windowObj.screenY;
			};
			
			// dimensions
			if( typeof( windowObj.innerWidth ) == 'number' ) {
				 //Non-IE
					innerWidth = windowObj.innerWidth;
					innerHeight = windowObj.innerHeight;
			  } else if( windowObj.document.documentElement && ( windowObj.document.documentElement.clientWidth || windowObj.document.documentElement.clientHeight ) ) {
					//IE 6+ in 'standards compliant mode'
					innerWidth = windowObj.document.documentElement.clientWidth;
					innerHeight = windowObj.document.documentElement.clientHeight;
			  } else if( windowObj.document.body && ( windowObj.document.body.clientWidth || windowObj.document.body.clientHeight ) ) {
					//IE 4 compatible
					innerWidth = windowObj.document.body.clientWidth;
					innerHeight = windowObj.document.body.clientHeight;
			  };
			  
			  return {'x' : x, 'y' : y, 'innerWidth' : innerWidth, 'innerHeight' : innerHeight};

		},
	
		
		productPriceInit : function(formNameRE,elementIdRE,priceData){
			// send formNameRE as xxx#yyy where # is the productId of the form
			// send targetIdRE as xxx#yyy where # is the productId of the target
			// incoming test
		//alert('\nformNameRE:' + formNameRE + '\nelementIdRE:' + elementIdRE + '\npriceData:' + priceData.length);
			for(var i in priceData){
				var productId = priceData[i].productId;
				var formName = formNameRE.replace('#',productId);
				var elementId = elementIdRE.replace('#',productId);
				if(document[formName] && document[formName].quantity){
					// test
					//alert('form found: ' + formName);
					var formObj = document[formName];
					formObj.elementIdHolder = elementId;
					formObj.formNameHolder = formName;
					formObj.productIdHolder = productId;
					formObj.priceDataHolder = priceData;
					eV.eventAdd(formObj.quantity,'keyup',function(e){
						//var debug = '';
						//for(var i in e.srcElement) debug += '\n' + i + ':' + e.srcElement[i];
						//alert(debug);
						var formObj = null;
						if(e.target) formObj = e.target.form; // FF
						if(e.srcElement) formObj = e.srcElement.form; // IE
						document.getElementById(formObj.elementIdHolder).innerHTML = '$' + eV.productPriceGet(formObj.priceDataHolder,formObj.formNameHolder,formObj.productIdHolder);
						// test
						//alert('quantity for form ' + formObj.formNameHolder + ' called');
					});
					 // loop thru options and apply
					 for(var ii in priceData[i].optionGroupArray){
						 var groupId = priceData[i].optionGroupArray[ii].groupId;
						 var selectName = null;
						 if(formObj['option' + groupId]) selectName = 'option' + groupId;
						 if(formObj['group' + groupId]) selectName = 'group' + groupId;
						 if(selectName){
							 eV.eventAdd(formObj[selectName],'change',function(e){
								//alert('targetHolder:' + e.target.targetHolder + '\n' + 'formNameHolder:' + e.target.formNameHolder + '\n' + 'quantity:' + e.target.value);
								var formObj = null;
								if(e.target) formObj = e.target.form;
								if(e.srcElement) formObj = e.srcElement.form;
								document.getElementById(formObj.elementIdHolder).innerHTML = '$' + eV.productPriceGet(formObj.priceDataHolder,formObj.formNameHolder,formObj.productIdHolder);
							});
							// end if selecName
						 };
						// end optionGroupArray loop
					 };
					 // ok lets call this once to set our price
					 document.getElementById(formObj.elementIdHolder).innerHTML = '$' + eV.productPriceGet(formObj.priceDataHolder,formObj.formNameHolder,formObj.productIdHolder);
					// end if formName && quantity exist 
				};
			// end priceData loop
			};
		// end function
		},
		
		productPriceGet : function(priceData,formName,productId){
			// gathers data from a product form and returns the price
			// must have productPriceGet object set on page via php function eV.productPriceGetJS
			/* 
			---------priceData structure:--------------
			{
				productIndex : {
						productId,
						lowPrice,
						lowFlatPrice,
						priceLevelArray {
							priceLevelIndex : {
								quantity
								price
								price2
								price3
								price4
							};
						};
						optionGroupArray : {
							optionGroupIndex : {
								groupId
								optionArray : {
									optionIndex : {
										price
										value
										priceOption
									};
								};
							};
						};
				};
			};
			-------form structure:----------------
			priceData[priceIndex].optionGroupArray[optionGroupIndex].optionArray[optionIndex].value = 
			form.option#.options[form.option#.selectedIndex].value
			-- OR --
			form.group#.group[form.group#.selectedIndex].value
			form.quantity
			form.productId
			*/
			//var alertData = '';
			
			var formObj = window.document[formName];
			//var target = document.getElementById[targetId];
			
			// find product data in priceData
			var productIndex = -1;
			for(var i in priceData){
				//alertData += '\npriceData[i].productId:' + priceData[i].productId + ' productId:' + productId;
				if(priceData[i].productId == productId){
					productIndex = i;
					break;
				};
			};
			//alertData += '\nproductIndex:' + productIndex;
			
			// preset return val
			returnVal =  false;
			
			// test product index;
			if(productIndex == -1){
				//alert('invalid productId');
				// leaving returnval as false;
			} else {
				// shortcut pricedata for product
				var prodData = priceData[productIndex];
				// get quantity
				var quantity = (isNaN(parseInt(formObj.quantity.value))) ? 0 : parseInt(formObj.quantity.value);
				
				/////// part 1: group options prices /////////////////
				// start groupOptionsPrice
				var groupOptionsPrice = 0;
				// set priceOption - later used to SELECT which price to use in matched price level
				var priceOption = ''; // empty means first price option 'price', all others appended with integer 'price2','price3','price4'
				// get group options prices
				for(var i in prodData.optionGroupArray){
					var optionGroup = prodData.optionGroupArray[i];
					//alertData += '\noption group:' + optionGroup.groupId;
					for(var ii in optionGroup.optionArray){ 
						var loopOptionValue = optionGroup.optionArray[ii].value;
						var loopOptionPriceOption = optionGroup.optionArray[ii].priceOption;
						var loopOptionPrice = optionGroup.optionArray[ii].price;
						var formOptionValue= false;
						if(formObj['option' + optionGroup.groupId]) formOptionValue = formObj['option' + optionGroup.groupId].options[formObj['option' + optionGroup.groupId].selectedIndex].value;
						if(formObj['group' + optionGroup.groupId]) formOptionValue = formObj['group' + optionGroup.groupId].options[formObj['group' + optionGroup.groupId].selectedIndex].value;
						//alertData += '\noption:' + loopOptionValue + ' vs ' + formOptionValue;
						// if this is a currently selected options, effect prices accordingly
						if(formOptionValue == loopOptionValue && !isNaN(loopOptionPrice)) {
							// increment groupOptionsPrice
							groupOptionsPrice += loopOptionPrice;
							// set priceOption
							if(!isNaN(parseInt(loopOptionPriceOption)) && parseInt(loopOptionPriceOption) > 1) priceOption = loopOptionPriceOption;	
						};
							
					};
				};
				
				///////// part 2: base price ///////////////
				// start basePrice as lowFlatPrice
				var basePrice = (isNaN(parseFloat(prodData.lowFlatPrice))) ? 999999 : parseFloat(prodData.lowFlatPrice);
				// qualify bulk price
				var lowLevelQ = 0;
				var priceLevelIndex = -1;
				var lowLevelP = 999999;
				for(var i in prodData.priceLevelArray){
					var priceLevel = prodData.priceLevelArray[i];
					//alertData += '\npriceLevel quantity:' + priceLevel.quantity + ' vs ' + quantity;
					if(!isNaN(parseInt(priceLevel.quantity)) && parseInt(priceLevel.quantity) <= quantity && parseInt(priceLevel.quantity) > lowLevelQ){
						lowLevelQ = parseInt(priceLevel.quantity);
						// set low level price, pull from correct price option considering the priceOption set from optionGroups
						// first fix price option
						if(!eV.in_array(['2','3','4'],priceOption)) priceOption = ''; 
						// now set lowLevelP to the correct price
						lowLevelP = parseFloat(priceLevel['price' + priceOption]);
						priceLevelIndex = i;
					};
				};
				//alertData += '\nlowLevelP:' + lowLevelP;
				// set basePrice to level price, if matched
				if(priceLevelIndex > -1 && !isNaN(lowLevelP) && lowLevelP > 0 && lowLevelP < basePrice) basePrice = lowLevelP;
				// start outputPrice
				var outputPrice = (basePrice + groupOptionsPrice) * quantity;
				
				// assign the price
				// rounds to 2 dec places
				returnVal =  outputPrice.toFixed(2);
			// end if productIndex == -1
			};
			//alert(alertData);
			return returnVal;
		// end function
		},
		
		drag : {
			/* to use drag
			eV.drag.init(); // once on script
			eV.drag.set(buttonElementId,movingElementId); // to set each draggable element
			
			buttonElementId= id of element that when clicked on drags
			movingElementId= id of element that moves when button is clicked on
			movingElement should contain buttonElement
			buttonElement and movingElement could be the same
			*/
			movemouse : function(e)
			{
			  if (eV.drag.isDrag)
			  {
				//document.getElementById(eV.drag.dobj.moveElemId).style.left = '' + (eV.drag.tx + window.mouseX - eV.drag.x) + 'px';
				//document.getElementById(eV.drag.dobj.moveElemId).style.top  = '' + (eV.drag.ty + window.mouseY - eV.drag.y) + 'px';
				document.getElementById(eV.drag.dobj.moveElemId).style.left = '' + (eV.drag.nn6 ? eV.drag.tx + e.clientX - eV.drag.x : eV.drag.tx + event.clientX - eV.drag.x) + 'px';
				document.getElementById(eV.drag.dobj.moveElemId).style.top  = '' + (eV.drag.nn6 ? eV.drag.ty + e.clientY - eV.drag.y : eV.drag.ty + event.clientY - eV.drag.y) + 'px';
				//alert('movemouse setting :' + eV.drag.dobj.moveElemId + ' x:' + document.getElementById(eV.drag.dobj.moveElemId).style.left + ' y:' + document.getElementById(eV.drag.dobj.moveElemId).style.top);
				return false;
			  }
			},
			
			selectmouse : function(e) 
			{
			
			  var fobj       = eV.drag.nn6 ? e.target : event.srcElement;
			  var topelement = eV.drag.nn6 ? "HTML" : "BODY";
			
			  while (fobj.tagName != topelement && fobj.dragMe != true)
			  {
				fobj = eV.drag.nn6 ? fobj.parentNode : fobj.parentElement;
			  }
	
			  if (fobj.dragMe)
			  {
				eV.drag.isDrag = true;
				eV.drag.dobj = fobj;
				eV.drag.tx = parseInt(document.getElementById(eV.drag.dobj.moveElemId).style.left+0);
				eV.drag.ty = parseInt(document.getElementById(eV.drag.dobj.moveElemId).style.top+0);
				eV.drag.x = eV.drag.nn6 ? e.clientX : event.clientX;
				eV.drag.y = eV.drag.nn6 ? e.clientY : event.clientY;
				document.onmousemove=eV.drag.movemouse;
				//alert('selectmouse called: tx:' + eV.drag.tx + ' ty:' + eV.drag.ty + ' x:' + eV.drag.x + ' y:' + eV.drag.y);
				return false;
			  }
			},
			
			init : function(){
				eV.drag.isDrag = false;
				eV.drag.x = null;
				eV.drag.y = null;
				eV.drag.tx = null;
				eV.drag.ty = null;
				eV.drag.dobj = null;
				eV.drag.ie=document.all;
				eV.drag.nn6=document.getElementById&&!document.all;
				onmousedown=eV.drag.selectmouse;
				onmouseup=new Function("eV.drag.isDrag=false");
			},
			
			set : function(clickElementId,moveElementId){
				clickelem = document.getElementById(clickElementId);
				moveelem = document.getElementById(moveElementId);
				clickelem.dragMe = true;
				clickelem.moveElemId = moveElementId;
				//elem.moveElemId = clickElementId;
				//moveelem.style.position = 'relative';
				moveelem.style.position = 'absolute';
				//alert('set complete');
			}
		// end drag
		},
		mousePosition : function(evt){
			/*
			evt = evt || window.event;
			var posArr = new Array(null,null);
			
			//if(evt == null) alert('test');
			if (evt.pageX != null) posArr[0] = evt.pageX;
			else if (evt.clientX != null)
			   posArr[0] =  evt.clientX + (document.documentElement.scrollLeft ?
			   document.documentElement.scrollLeft :
			   document.body.scrollLeft);
			else posArr[0] = null;
			
			if (evt.pageY != null) posArr[1] = evt.pageY;
			else if (evt.clientY != null)
			   posArr[1] = evt.clientY + (document.documentElement.scrollTop ?
			   document.documentElement.scrollTop :
			   document.body.scrollTop);
			else posArr[1] = null;
			*/
			evt = evt || window.event;
			var cursor = {x:0, y:0};
			if (evt.pageX || evt.pageY) {
				cursor.x = evt.pageX;
				cursor.y = evt.pageY;
			} 
			else {
				var de = document.documentElement;
				var b = document.body;
				cursor.x = evt.clientX + 
					(de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
				cursor.y = evt.clientY + 
					(de.scrollTop || b.scrollTop) - (de.clientTop || 0);
			}
	 
			window.mouseX = cursor.x;
			window.mouseY = cursor.y;
		}
	
	};
	
	window.mouseX = 0;
	window.mouseY = 0;
	document.onmousemove = eV.mousePosition;
	
	/*
	data = 'A,B,C,D,E\n"A","B","C","D","E"\nA,B,"C","D",E\n"A",B,"C",D,"E"\n"A,",B",C,",D","E"\n"A","B,x",C,",D","E"';
	//data = '"B,",C,",D"';
	csvArr = eV.CSVtoArray(data);
	
	for(var i=0;i<csvArr.length;i++){
		var record = csvArr[i];
		document.writeln('<br>NEW ROW');
		for(var ii=0;ii<record.length;ii++){
			document.writeln('<br>NEW VALUE:' + i + ':' + record[ii]);
		};
	};
	*/
// end if(typeof eV == "undefined")
};