try { console.assert(1); } catch(e) { console = { log: function() {}, assert: function() {} } }

// JavaScript Document
var winRef; // this is the variable for the preview window;
var replace = true;
var showAlert = true;
forSubmit = false;
var lineHM = new Object();
var lineToInputMap = new HashMap();
var temp = 0;
var line = 0;
var numChar = 0;
var zero = 0;
var lineLength = 0;
var templateName;

		
function loadOmnitureVar()
{

		//omniture start
		var s_channel="";
		s_events="event4";
		var sku = document.getElementById("catentryId").value;
		var s_products=";" + sku
		//s_eVar15="<c:out value="${tabCount}" escapeXml="false" />";
		//s_eVar16="1"
		//alert("loadOmniture" + s_eVar16);
		
		if (document.domain == 'www.thingsremembered.com')
		{
			var suite="thremmain"
		}
		else
		{
			var suite="devthrem"
		}
		
		
		var occ = document.getElementById("occasionId").value;
		//alert("occ1 : " + occ.value);
		var msgType = document.getElementById("messageTypeId").value;
		
		//alert("msgType1 : " + msgType.value);
		//var msg = document.getElementById("message_1");
		//alert("msg1 : " + msg.value);
		var font = document.getElementById("fontCode").value;
		//alert("font1 : " + font.value);
		
		var msg ="";
		if (numFieldsCtr == 0)
		{
			if (msgType!='DoNotPersonalize') {
				msg = MM_findObj('message_1').value;
			}
		}
		else
		{
			for(var i=0; i<numFieldsCtr; i++){
				tVal = MM_findObj('message_'+ (i+1));
				msg += tVal.value;
			}
		}
		s_linkType='o';
		s_linkName='PersonalizationLayer';s_pageName='PersonalizeItem';
		s_prop7='PersonalizeItem';
		s_eVar15=occasionsHM.get(occ);
		s_eVar16=msgTypeNamesHM.get(msgType);
		s_eVar17=msg;
		s_eVar18=font;
		s_eVar19=document.getElementById("tabCount").value;
		s_eVar20="1";
		s_lnk=s_co(this);
		s_gs(suite);

		
		//omniture end

}

function countText()
	{
	
	var sel = null;
	var theField = document.getElementById("msg_0_0");
	var m_Selection = new Selection(theField); //// Added to keep caret in correct location
	var zoneWidth=50;
	var zoneHeight=4;
	var maxChars = (zoneWidth * zoneHeight) + zoneHeight - 1;
	var maxLines = zoneHeight - 1;
	var maxPerLine = zoneWidth + 1;
	var priceWord = perWord;
	var priceMin = minPrice;
	var priceMax = maxPrice;
	var excludeLength = excludeWord;
	var display = "personalizationCostDiv1";
	var elName = "cusPrice";
	var strTemp = "";
	var strLineCounter = 0;
	var strCharCounter = 0;
	var strTemporary = replaceSubString(theField.value, /(\r\n|\r|\n)/g, "\n");

	var tmpValue = strTemporary;
	tmpValue = replaceEllipsis(strTemporary);
		
	var tmpValue = strTemporary;
		tmpValue = replaceEllipsis(strTemporary);

		//theField.value = strTemporary;
	var tmpSub = "";
	var tmpWord = "";
	var idx =0;

 	var caret = m_Selection.getCaret(); //// Added to keep caret in correct location
		
		for (var i = 0; i < tmpValue.length; i++)
		{
			var strChar = tmpValue.substring(i, i + 1 );
			var strCharTest = tmpValue.substring(i + 1, i + 2);
		
			if (strChar == '\n')
			{
				strTemp += strChar;
				strCharCounter = 0;
				strLineCounter += 1;
			}
			else if (strCharCounter == (maxPerLine-1))
			{
			    //if the last char on the line is space convert it to newline and move caret to nextline
			    if (strChar == ' ')
			    {
			       strTemp += '\n';
 				   strCharCounter = 0;
 				   strLineCounter += 1;
			       caret.start += 1;
				   caret.end += 1;
			    }
				else if (strCharTest != "\n")
				{
					idx = strTemp.lastIndexOf(" ");
					if((idx > 0)||(idx == 0))
					{
						tmpWrd = strTemp.substring(idx+1,strTemp.length);
						tmpWrd = tmpWrd + strChar;
						tmpSub = strTemp.substring(0,idx+1);
						tmpSub = tmpSub+ '\n' + tmpWrd;
						strTemp = tmpSub;
						strCharCounter = tmpWrd.length;
						tmpWrd = "";
						tmpSub = "";
						idx =0;
						//we're appending a new line, so advance the caret position by 1
						caret.start += 1;
						caret.end += 1;
					}
					else
					{
						strTemp += '\n' + strChar;
						strCharCounter = 0;
					}
				}
				else 
				{
					strTemp += strChar;
					strCharCounter = 0;
				}
				strLineCounter += 1;
			}
			else
			{
				strTemp += strChar;
				strCharCounter ++;
			}
		}
	
		strTemp = replaceSubString(strTemp, /\s+(\r\n|\r|\n)/g,"\n");
		if (!(maxChars >= strTemp.length))
		{
			strTemp = strTemp.substring(0, maxChars);
		}
	
		myArr = strTemp.split('\n');
	
		if ((myArr.length-1) > maxLines)
		{
			strTemp = "";
			for (var i = 0; i < maxLines+1; i++)
			{
				if (i == maxLines)
				{
					strTemp += myArr[i];
				}
				else 
				{
					strTemp += myArr[i] + '\n';
				}
			}
		}
		theField.value = strTemp;
		strTemp = replaceSubString(strTemp, /\n/g," ");

		var createYourOwnMsg = document.getElementById("msg_0_0").value;
		var createYourOwnMsgArr = createYourOwnMsg.split("\n");

		var lineArr = new Array();
		for(var i=0; i < zoneHeight; i++)
		{
			lineArr[i] = parseInt(zoneWidth) - parseInt(lineHM[i]);
		}
		
		for(var i=0; i< createYourOwnMsgArr.length; i++)
		{
			//IE keeps the carriage returns after the split on the newline above, which is throwing off our count
			//remove the carriage returns from each line before updating the count.
			
			createYourOwnMsgArr[i] = replaceSubString(createYourOwnMsgArr[i], /\r/g, "");
			
			if(createYourOwnMsgArr[i].length > zoneWidth)
			{
				createYourOwnMsgArr[i] = createYourOwnMsgArr[i].substring(0, zoneWidth);
			}
				lineArr[i] = (zoneWidth - createYourOwnMsgArr[i].length);
		}
		
		m_Selection.setCaret( caret.start, caret.end ); //// Added to keep caret in correct location
	}
function personalizeHover() {
	if (document.all&&document.getElementById) {
		navAt = document.getElementById("personalizePopUp");
		if (browser == "Internet Explorer" && version == "6") {
			$('font').style.visibility = "hidden";
			if ($('color')) { $('color').style.visibility = "hidden"; }
		}
		for (i=0; i<navAt.childNodes.length; i++) {
			node = navAt.childNodes[i];
			if (node.nodeName=="LI") {
				node.onmouseover=function() {
					this.className+=" over";
				};
				node.onmouseout=function() {
					this.className=this.className.replace(" over", "");
					if (browser == "Internet Explorer" && version == "6") {
						$('font').style.visibility = "visible";
						if ($('color')) { $('color').style.visibility = "visible"; }
					}
				};
			}
		}
	}
}


function MM_findObj(n, d) { //v4.01

  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}
var prevMess;
function getMessage()
{
	if (document.getElementById("message_1"))
	{
		document.getElementById("message_1").value = prevMess;
	}
}

function disabledField (field) {
	q = MM_findObj(field);
	if (q!=null) {
		q.disabled = true;
	}
}
function enabledField (field) {
	q = MM_findObj(field);
	if (q!=null) {
		q.disabled = false;
	}
}

function enableFields1(fields) {
	tArr = eval(fields);
	for(x=0;x<tArr.length;x++)
	{
		q = MM_findObj(tArr[x]);
		if (q!=null) {
			q.disabled = false;
		}
	}
}

function hiddenDiv (div, theState) {
	q = MM_findObj(div);
	if(q!=undefined) {
		q.style.display = theState; 
	}
}

function divChange(obj, nextStep, targetArr, targetArr2) {

	if (obj == null || obj.selectedIndex < 0) {
		return;
	}
	var turnOnMe = new String([obj.options[obj.selectedIndex].value]);
	splitString = turnOnMe.split(",");
	var myDiv = MM_findObj(splitString[0]);
	
	//1Custom|1Phrase_select|1Iloveyou|1Happy|1Example|1None
	var tmpE = new String(nextStep);
	splitOff = tmpE.split("|");
	// CHECK IF THERE IS A ENABLE ALL FIELD
	if (splitString[1] == "true"){
			checkNextStep(nextStep, targetArr2);
	}
	// CHECK IF THE FIELDS SHOULD BE DISABLED THIS WOULD BE FROM THE SELECT NO PERSONALIZATION METHOD
	if (splitString.length>2){
		if(splitString[2] == "disable"){
			disableNextStep(nextStep, targetArr2);
		}
	}
	
	dA = eval(targetArr);
	
	//turn off all divs
		for (var i=0; i<=dA.length-1; i++) {
				qV = dA[i];
				var temp = MM_findObj(  dA[i]  );

				if (temp != null) {
					temp.style.display="none";
				}

				try {
					temp = MM_findObj( "btm" + dA[i]);
					temp.style.display="none";
					var tempExample = MM_findObj(  dA[i] + "example");
					tempExample.style.display="none"; 
				} catch (err) {
				};
						
		}
	
	//show selected div
	myDiv.style.display="block";
	var temp = MM_findObj( "btm" + myDiv.id);
	if (temp != null) {
		temp.style.display="block";
	}
	try {
		var myDivExample = MM_findObj(splitString[0] + "example");
		myDivExample.style.display="block";
	} catch (err) {
	}
}
function checkNextStep (nextStep, targetArr) {
	if(nextStep == "all") { //enabled all hidden divs
		for(var i = 0; i <= eval(targetArr).length-1; i++) {
				enabledField(eval(targetArr)[i]);
		}
	} else {
		enableFields = nextStep.split("|");
		for(var i = 0; i <= enableFields.length-1; i++) {
				enabledField(enableFields[i]);
		}					
	}
}
function disableNextStep (nextStep, targetArr) {
	if(nextStep == "all") { //enabled all hidden divs
		for(var i = 0; i <= eval(targetArr).length-1; i++) {
				disabledField(eval(targetArr)[i]);
		}
	} else {
		enableFields = nextStep.split("|");
		for(var i = 0; i <= enableFields.length-1; i++) {
				disabledField(enableFields[i]);
		}					
	}
}
function trunc(obj,  display, origWidth){
		
		display = document.getElementById(display);
		var disp = display.innerHTML;
		var actual = display.innerHTML - obj.value.length;
				
		if (actual < 0 ){
			display.innerHTML = "0";
		} else {
			display.innerHTML = actual;
		}
	return true;
}
function UpdateChars(obj, display, origWidth, nextStep, targetArr, groupName, amount, theForm, arrT){
		// obj = textbox name
		// display = display div name
		// original width = with no text entered what is max length
		// nextStep - nextstep to be enabled, all will do all, multiple like 'data|data|data'
		// targetArr = the reference to the array fields that should be enabled
		//groupname = group of textboxes with a collected amount of space
		//amount = the amount of textboxes grouped together
		//the form name
		//trunc(obj, display, origWidth);
			
		if(nextStep) { 
			checkNextStep(nextStep, targetArr);
		}
		
		if(groupName) {
				var addition = 0;
				var tarr = eval(arrT);
				var tmpVal = "";
				var tmpArry = new Array(amount);
				for (var i=0; i < tarr.length; i++) {
					tmpVal = MM_findObj(groupName+"_"+tarr[i]);
					
					tmp = tmpVal.value.length;
					tmpArry[i] = tmp;
					
					// /*eval("document."+theForm+"."+groupName+"_"+b+".value.length");*/
					addition = addition + tmp;
					
					}
					
				display = document.getElementById(display);
				var total = origWidth-addition;
				var avail = addition - origWidth;
				if(total<0) { 
					
					showText('The text you entered is too long for this item.\n it will be truncated');
					obj.value = obj.value.substring(0,obj.value.length - avail); 
					display.innerHTML = "0";
				} else {
					display.innerHTML = total;
				}
		} else {
		tObj = obj.value.length;
		display = document.getElementById(display);
		var total = origWidth-tObj;
		var avail = addition - origWidth;
		display.innerHTML = total;
				if(total<0) 
				{ 
					showText('The text you entered is too long for this item.\n it will be truncated');
					obj.value = obj.value.substring(0,obj.value.length - avail); 
					//obj.value = obj.value.substring(0,obj.value.length-1); 
					display.innerHTML = "0";
				} else {
					display.innerHTML = total;
				}
		}
		
	}
	
	
/*function textCounter(theField,theCharCounter,theLineCounter,maxChars,maxLines,maxPerLine,nextStep, targetArr)*/
function textCounter(theField,theCharCounter,theLineCounter,maxChars,maxLines,maxPerLine,nextStep,targetArr,priceWord,priceMin,priceMax,excludeLength,display,elName)
{
	
	theField = MM_findObj(theField);	
	theCharCounter = MM_findObj(theCharCounter);
	theLineCounter = MM_findObj(theLineCounter);
	
	if(nextStep) { 
		checkNextStep(nextStep, targetArr);
	}
	var strTemp = "";
	var strLineCounter = 0;
	var strCharCounter = 0;
	


	var strTemporary = replaceSubString(theField.value, /(\r\n|\r|\n)/g,"\n");
	
	theField.value = strTemporary;
	var tmpSub = "";
	var tmpWord = "";
	var idx =0;
	
	for (var i = 0; i < theField.value.length; i++)
	{
		var strChar = theField.value.substring(i, i + 1 );
		var strCharTest = theField.value.substring(i + 1, i + 2);
		
		if (strChar == '\n')
		{
			
			strTemp += strChar;
			strCharCounter = 0;
			strLineCounter += 1;
			
		}
		else if (strCharCounter == (maxPerLine-1))
		{
			if (strCharTest != "\n"){
			//	if(strCharTest == ' ')
			//	{
			//		strTemp += '\n' + strChar;
			//		strCharCounter = 0;
			//	}else{
					
					idx = strTemp.lastIndexOf(" ");
					if((idx>0)||(idx==0)){
						tmpWrd = strTemp.substring(idx+1,strTemp.length);
						
						tmpWrd = tmpWrd + strChar;
						
						tmpSub = strTemp.substring(0,idx+1);
					
						tmpSub = tmpSub+ '\n' + tmpWrd;
										
						strTemp = tmpSub;
					
						strCharCounter = tmpWrd.length;
						tmpWrd = "";
						tmpSub = "";
						idx =0;
					}
					else
					{
						strTemp += '\n' + strChar;
						strCharCounter = 0;
					}
				//}
			} else {
				strTemp += strChar;
				strCharCounter = 0;
			}
			
			strLineCounter += 1;
		}
		else
		{
			strTemp += strChar;
			strCharCounter ++;
		}
	}
	
	strTemp = replaceSubString(strTemp, /(\r\n|\r|\n)/g,"\n");
	if (!(maxChars >= strTemp.length)){
		strTemp = strTemp.substring(0, maxChars);
	}
	
	
	// now check how many lines are there for lines max 2 there should be 1 \n and lines left 3 there should be 2 \n's
	myArr = strTemp.split('\n');
	
	if ((myArr.length-1) > maxLines){
			
			showText('The text you entered is too long for this item.\n it will be truncated');
		// remove last line
		strTemp = "";
		for (var i = 0; i < maxLines+1; i++)
		{
			if (i == maxLines){
			strTemp += myArr[i];
			} else {
			strTemp += myArr[i] + '\n';
			}
		}
	}

	theField.value = strTemp;
	theCharCounter.value = maxChars - strTemp.length;
	
	
	if((maxLines - strLineCounter)<0){
		theLineCounter.value = 0;
	} else {
		theLineCounter.value = maxLines - (myArr.length-1);
	}
	
	if (theCharCounter.value == 0){
		theLineCounter.value = 0;
	}
	//theField.moveStart('character', 1);
   // r.select();
	// theField.select()
	
	// START PRICE CALCULATIONS
	
	
	//theField.value = strTemp;
	
	strTemp = replaceSubString(strTemp, /\n/g," ");
	calcPrice(display, strTemp, excludeLength, priceWord, elName, priceMin, priceMax);
	
		
}
function calcPrice(display, strTemp, excludeLength, priceWord, elName, priceMin, priceMax){


	
	display = document.getElementById(display);
		var myPrc = strTemp.split(' ');
		var qCalc = 0;
		for (i=0; i<myPrc.length; i++)
		{
			var myCarriagePrc = myPrc[i].split('\n');
			for (t=0; t<myCarriagePrc.length; t++)
			{
				var myDotPrc = myCarriagePrc[t].split('.');
				for (x=0; x<myDotPrc.length; x++)
				{
					var myUnderPrc = myDotPrc[x].split('_');
					for (y=0; y<myUnderPrc.length; y++){
						if (myUnderPrc[y].length>excludeLength)
						{
							qCalc++;
						}
					}
				}
			}
			
		}
		
	// calculate # of usable words
	var curPr = (priceWord)*qCalc;
	
//	var curDotPr = (priceWord)*qDotCalc;

//fix for defect 1354 - dont calculate for initial empty spaces and return key
	strTemp = trim(strTemp);
	
	var priceIp = document.getElementById(elName);
	if (curPr>priceMin){
		// display curPr as price.
		if (curPr<priceMax)
		{
				display.innerHTML = displayMonetary(curPr);
				priceIp.value=curPr;
		} 
		else 
		{
				display.innerHTML =displayMonetary(priceMax);
				priceIp.value=priceMax;
		}
	} else {
		// display priceMin as price
		display.innerHTML = displayMonetary(priceMin);
		priceIp.value=priceMin;	
	}
	if(strTemp.length==0){
		display.innerHTML = displayMonetary('0.00');
		priceIp.value=0;	
	}
	
	
}

function displayMonetary(value)
{
	value = new String(value);
	myArr2 = value.split(".");
	
	if (myArr2.length==1){
		value = "$"+value + ".00";
	}else
	  if(myArr2[1].length >1){
		value = "$"+value;
		} else {
		value = "$"+value + "0";
		}
	return value;
}
function replaceSubString(text, expression, value){
  //Uses regular expressions. This code was written for JavaScript 1.2+ browsers
  //Use the replaceSubstring or replaceSubstring2 functions if 1.0 & 1.1 browsers.
    //replaceSubstring("hellothere","l","x") = "hexxothere"
//  var exp = new RegExp(expression)
    var expr = new RegExp(expression)
	return text.replace(expr,value);
}

function isLetter (c){
  return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}

function isDigit (c){
  return ((c >= "0") && (c <= "9"))
}

function isLetterOrDigit (c){
  return (isLetter(c) || isDigit(c))
}




function checkMultiple(obj) {
	
	theValue = [obj.options[obj.selectedIndex].value];
		if(theValue == 1) {
			hiddenDiv('multiple','');
		} else {
			hiddenDiv('multiple','none');
		}
}

function PicChange(obj, ok, loc,location)
{
		  var ok2 = document.getElementById(ok);
          //document.ok2.style.display="";
          var sel = new String(obj.options[obj.selectedIndex].value);
		  spstring = sel.split(",");
		  sel=spstring[0];
		  //location="/wcsstore/TR/images";	
		  if(loc=="fonts")
	          ok2.src = [""+location+"/"+loc+"/"+sel+"_FONT"+".jpg"];
	      else
	      	ok2.src = [""+location+"/"+loc+"/"+sel+".jpg"];
          
}
var previewImg = '';
var personalizationSkippedMessage = '';

function preview(imgpth,isColorable,attrArr,aLines,scrWidth,scrHeight,aR,isNewPreview,forcePreview)
{
	if (forcePreview == null) {
	    forcePreview = false;
	}
	var urlStr =  new String();
	var aTemp = attrArr[0];
	var aTemplateOverride = attrArr[1];
	var aSurfaceType = attrArr[2];
	var aResolution = attrArr[3];
	var aResolutionOverride = attrArr[4];
	var aFontSize = attrArr[5];
	var aFontSizeOverride = attrArr[6];
	var aPosition = attrArr[7];
	var aPositionOverride = attrArr[8];
	var aQuality = attrArr[9];
	var aQualityOverride = attrArr[10];
	
	selOccasion = MM_findObj("occasionId");	
	if(selOccasion.selectedIndex == 0 && !forcePreview){
		showText('You must select an occasion');
		return;
	} else {
		wrkr = MM_findObj('messageTypeId');	
		var turnOnMe = new String(wrkr.options[wrkr.selectedIndex].value);
		temp='';
		if(turnOnMe == 'DoNotPersonalize') {
			//temp='This Item is not Personalized';
			//personalizationSkippedMessage='This Item is not Personalized';
			showText('This Item is not Personalized');
			return;			
		} else {
			
			if(numFieldsCtr==0){
				tVal = $('message_1');
				if (tVal == null) {
					temp = new String(msgTemplateHM.get(turnOnMe));
				} else {
					temp=tVal.value;
				}
			} else {	
			
				
				var template = new String(msgTemplateHM.get(turnOnMe));
				template = template.replace("&amp;","&");
				template = replaceSubString(template, /(&#039;)/g,"'")
				for(var i=0; i<numFieldsCtr; i++){
					tVal = $('message_'+(i+1));
					tName = $('textName_'+(i+1));
					template = template.replace(":" + tName.value + ":", tVal.value);
					
					//if(i==0){
					//	temp=tVal.value;
					//} else {
					//	temp=temp+'\n'+tVal.value;
					//}
				}
				temp = template;
			}

		}
		
			
		fnt = MM_findObj('font'); // should be font!
		var myFont;
			if(fontCodesHM.containsKey(fnt.options[fnt.selectedIndex].value))
		    {
				myFont = new String(fontCodesHM.get(fnt.options[fnt.selectedIndex].value));
				
		    }
		spstring = 	myFont.split(",");
		var strfont=new String();
		var params ="";
		var char1 = "";
		var char2 = "";
		var char3 = "";
		var isMonogram = false;
		
		var strfont = spstring[3];
		var strLFont = spstring[4];
		var strCFont = spstring[5];
		var strRFont = spstring[6];
		
		if(spstring.length>0)
		{	
			if(strLFont != "null")
				isMonogram = true;
			
			if(strfont==null)
				strfont ="default";
			
		}
		else
			strfont ="default";			
		
		//temp = escape(temp);
		phrsSplit = temp.split("\n"); 
		if(isNewPreview || isMonogram)
			urlStr = "fmt=png-alpha";
	
		
		if(!isMonogram){	
			var phraseLines=0;
			for(var c=0;c<phrsSplit.length;c++)
			{
				phrsSplit[c]=escape(phrsSplit[c]);
				//escape doesnt escape + so manually escape +
				phrsSplit[c]=replaceSubString(phrsSplit[c],/(\+)/g,"%2b");
								
				urlStr = urlStr +"&$phrase"+(c+1)+"="+phrsSplit[c];
				if(!isNewPreview)
					urlStr = urlStr +"%20\\par%20";
				
				phraseLines = c+1;	
			}
			if(isNewPreview){
				while(phraseLines < aLines){
					phraseLines++;
					urlStr = urlStr + "&$phrase"+phraseLines+"=";
				}
			}
		}

		templateName = aTemp;
		if(aTemp == null)
			templateName = "default";
		else
			splt = aTemp.split("_");
			
		//append the background image
		//aSurfaceType="glass3";
		if((aSurfaceType=="") || (typeof(aSurfaceType) == "undefined") || (aSurfaceType=='undefined')){
			aSurfaceType="White";
	
			urlStr = urlStr +"&$red=0&$green=0&$blue=0";	
		}
			
		if(isMonogram) 
		{
			aPosition = aPositionOverride;
			aResolution = aResolutionOverride;
			aFontSize = aFontSizeOverride;
			aQuality = aQualityOverride;
	
			if(aFontSize == "")
				aFontSize = "600";
			
			if(temp.length > 0)
				char1 = temp.charAt(0);
			if(temp.length > 1)
				char2 = temp.charAt(1);
			if(temp.length > 2)
				char3 = temp.charAt(2);	
				
			if(splt.length >1)
			{
				templateName = aTemplateOverride;
				if(templateName == ""){
					if(splt[1] == "engrave")
						templateName = "mono2";
					else if(splt[1] == "etch")
						templateName = "mono2";					
					else if(splt[1] == "embroid")
						templateName = "mono_embossed";
				}
				params="&$Lpos=" + char1 + "&$Cpos=" + char2 + "&$Rpos=" + char3;				
				urlStr = urlStr + params;
				if(!isNewPreview)
					urlStr = urlStr +"&$layer_0_src=ThingsRemembered%2F"+aSurfaceType;
			}
			else
				templateName = "default";	
		}
		else{
			if(!isNewPreview)
				urlStr = urlStr +"&$layer_2_src=ThingsRemembered%2F"+aSurfaceType;
		}
			
		//append the font 
		if(!isMonogram)	
			urlStr = urlStr +"&$font="+strfont;
		else
			urlStr = urlStr + "&$LFont=" + strLFont + "&$CFont=" + strCFont + "&$RFont=" + strRFont;
		
		 var r=new String();
		 var g=new String();
		 var b=new String();
		if(isColorable){
			clr = MM_findObj('color'); // should be color!
			var myColor;
			if(colorCodesHM.containsKey(clr.options[clr.selectedIndex].value))
		    {
				myColor = new String(colorCodesHM.get(clr.options[clr.selectedIndex].value));
				
		    }		
			spstring = 	myColor.split(",");
			
			if(spstring.length>3)
			{
				r=spstring[3];
				g=spstring[4];
				b=spstring[5];
				if(r==null)
					r ="0";
				 else
					r=trim(r);
				if(g==null)
					g ="0";
				else
					g=trim(g);
				if(b==null)
					b ="0";
				else
					b=trim(b);
			}
			else
			{
				r="0";
				g="0";
				b="0";
			}
			
			urlStr = urlStr +"&$red="+r+"&"+"$green="+g+"&$blue="+b;
		}
		else
		{
			if(!(typeof(aR) == "undefined")){
				sp = aR.split(",");
				if(sp.length>=2){
					r=trim(sp[0]);
					g=trim(sp[1]);
					b=trim(sp[2]);
				}
				else
				{
					r="0";
					g="0";
					b="0";
				}
			
				urlStr = urlStr +"&$red="+r+"&"+"$green="+g+"&$blue="+b;
			}
		}
		
		if(isNewPreview){
			if(aQuality == "")
				aQuality = "95";
			if(!aFontSize == "")
				urlStr = urlStr + "&$fs=" + aFontSize;
			urlStr = urlStr + "}&qlt=" + aQuality;
			if(!aPosition == "")
				urlStr = urlStr + "&pos=" + aPosition
			urlStr = urlStr + "&sharpen=1";
			if(!aResolution == "") {
				urlStr = urlStr + "&res=" + aResolution;
			}
		}	
		
		var winHeight = 500;
		var winWidth = 430;
		winTop = (scrHeight-winHeight)/2;
		winLeft = (scrWidth-winWidth)/2;
		//s7d4.scene7.com/ir/render/ThingsRememberedRender/554077_1-600?hei=400&obj=FLOW/MNGRM&decal&src=is{ThingsRemembered/4_lines_narrow?fmt=png-alpha&$phrase1=Happy%20B%27day&$phrase2=&$phrase3=&$phrase4=&$font=Clarendon&$red=192&$green=192&$blue=192&$fs=500}&qlt=95&pos=0,0&sharpen=1&res=58
		//s7d4.scene7.com/ir/render/ThingsRememberedRender/554077_1-600?hei=400&obj=FLOW/MNGRM&decal&src=is{ThingsRemembered/4_lines_narrow?fmt=png-alpha&$phrase1=Happy%20&$phrase2=Birthday&$phrase3=&$phrase4=&$font=Clarendon&$red=192&$green=192&$blue=192&$fs=500}&qlt=95&pos=0,0&sharpen=1&res=58
		//s7d4.scene7.com/ir/render/ThingsRememberedRender/554077_1-600?hei=400&obj=FLOW/MNGRM&decal&src=is{ThingsRemembered/4_lines_narrow?fmt=png-alpha&$red=0&$green=0&$blue=0&$Lpos=H&$Cpos=a&$Rpos=p&$LFont=undefined&$CFont=undefined&$RFont=undefined&$red=0&$green=0&$blue=0&$fs=500}&qlt=95&pos=0,0&sharpen=1&res=75
		//imgpth="//s7d4.scene7.com/ir/render/ThingsRememberedRender/554077_1-600?hei=400&obj=FLOW/MNGRM&decal&src=is{ThingsRemembered/";
		//templateName = "4_lines_narrow";
		//urlStr = "fmt=png-alpha&$phrase1=Happy%20B%27day&$phrase2=&$phrase3=&$phrase4=&$font=Clarendon&$red=192&$green=192&$blue=192&$fs=500}&qlt=95&pos=0,0&sharpen=1&res=58";
		previewImg=imgpth+templateName+"?"+urlStr;
		
		if(!isNewPreview) {
			winRef = window.open("/webapp/wcs/stores/servlet/PersonalizationPopupView?img=" + (imgpth+templateName+"?"+urlStr), 'preview', 'width=' + winWidth + ',height=' + winHeight + ',left = ' + winLeft + ',top = ' + winTop + 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0');
			if (parseInt(navigator.appVersion) >= 4) { 
				winRef.window.focus(); 
			} else {
				winRef.focus();
			}	
			//var imgTarget = document.getElementById('layertarget');
			//imgTarget.src = previewImg;
		} else {
			var imgTarget = document.getElementById('layertarget');
			imgTarget.src = previewImg;
		}
	}
}
function largerPreview() 
{
	var winHeight = 600;
	var winWidth = 650;
	winTop = (screen.height-winHeight)/2;
	winLeft = (screen.width-winWidth)/2;
	if(navigator.appName == "Microsoft Internet Explorer")
	{
	 	previewImg = replaceSubString(previewImg,/(%26)/g,'%2526');
	}
	previewImg = previewImg.substr(previewImg.indexOf('ThingsRemembered'));
	winRef = window.open("/webapp/wcs/stores/servlet/PersonalizationLayerView",'preview', 'width=' + winWidth + ',height=' + winHeight + ',left = ' + winLeft + ',top = ' + winTop + 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0');
}

  function trim(strText) { 
    // this will get rid of leading spaces 
    while (strText.substring(0,1) == ' ') 
        strText = strText.substring(1, strText.length);

    // this will get rid of trailing spaces 
    while (strText.substring(strText.length-1,strText.length) == ' ')
        strText = strText.substring(0, strText.length-1);

   return strText;
} 

function quoteQuote(str)
{
	var newStr = '';
	if (str != null)
	{
		for (var i = 0; i < str.length; i++)
		{
			var c = str.charAt(i);
			if (c == '\'')
			{
				newStr += '\&#39;';
			}
			else
			{
				newStr += c;
			}
		}
	}
	return newStr;
}

function doFocus(no) {
	for(var x=1;x<=no;x++)
	{
		elem =  document.getElementById(x+"phrase");;
		elem.focus();
	}
}



/*
 *	Added for PersonalizationFormView
 *
 */
  	var arr_params = new Array();
  	var arrProductPopMessages = new Array();
	var myHM = new HashMap();
	var msgTemplateHM = new HashMap();
	var msgTypeAttrValuesHM = new HashMap();
	var msgTypeExamplesHM = new HashMap();
	var msgTypeNamesHM = new HashMap();
	var occasionsHM = new HashMap(); //for Omniture
	var createYourOwnMsgTypeId = new String();
	var fontsHM = new HashMap();
	var fontCodesHM = new HashMap();
	var colorsHM = new HashMap();
	var colorCodesHM = new HashMap();
	var tipHM = new HashMap();	
	var numFieldsCtr = 0;

	var jspStoreImageDir;
	var excludeWord = 0.00;
	var perWord = 0.00;
	var minPrice = 0.00;
	var maxPrice = 0.00;
	var zoneHeight;
	var zoneWidth;  
	var personalizationInitialTotal = parseFloat('0.00');
	var setCost = new Object();

  	function execRuleEngine()
	{
		if(document.getElementById("occasionId").selectedIndex == 0)
		{
			document.getElementById("messageTypeId").disabled = true;
			document.getElementById("font").disabled = true;
			if(document.getElementById("color") != null)
			{
				document.getElementById("color").disabled = true;
			}
			document.getElementById("messageTypeDiv1").style.display = "none";
			document.getElementById("messageTypeDiv2").style.display = "none";
			document.getElementById("exampleDiv").style.display = "none";
			////console.log("execRuleEngine():1 persInitTot: " + personalizationInitialTotal + " calcTotPremFontCharges: " + calcTotalPremiumFontCharges());
			document.getElementById("personalizationCostDiv2").innerHTML = displayMonetary(personalizationInitialTotal + calcTotalPremiumFontCharges());	
		}
		else
		{
			if(document.getElementById("messageTypeId").selectedIndex == (document.getElementById("messageTypeId").length - 1))
			{
				document.getElementById("font").disabled = true;
				if(document.getElementById("color") != null)
				{
					document.getElementById("color").disabled = true;
				}
				document.getElementById("messageTypeDiv1").style.display = "none";	
				document.getElementById("messageTypeDiv2").style.display = "none";
				document.getElementById("exampleDiv").style.display = "none";	
				////console.log("execRuleEngine():2 persInitTot: " + personalizationInitialTotal + " calcTotPremFontCharges: " + calcTotalPremiumFontCharges());			
				document.getElementById("personalizationCostDiv2").innerHTML = displayMonetary(personalizationInitialTotal+ calcTotalPremiumFontCharges());	
			}
			else if( (document.getElementById("occasionId").selectedIndex == 16) && (document.getElementById("messageTypeId").value  == 'PopularMessages')&&(initialLoad == 1))
			{
			/*	document.getElementById("messageTypeId").disabled = true;
				document.getElementById("font").disabled = true;
				if(document.getElementById("color") != null)
				{
					document.getElementById("color").disabled = true;
				}
				
				document.getElementById("messageTypeDiv1").style.display = "block";
				document.getElementById("messageTypeDiv1").style.width = "96%";
				document.getElementById("messageTypeDiv2").style.display = "block";
				document.getElementById("exampleDiv").style.display = "block";
				if (document.getElementById("viewPopularMessage")) {
					document.getElementById("viewPopularMessage").disabled = true;
				}
				document.getElementById("message_1").disabled = true;*/
			//	document.getElementById("personalizationCostDiv2").innerHTML = displayMonetary(personalizationInitialTotal);
					initialLoad++;
			}
			else
			{
				document.getElementById("messageTypeId").disabled = false;
				document.getElementById("font").disabled = false;
				if(document.getElementById("color") != null)
				{
					document.getElementById("color").disabled = false;
				}
				document.getElementById("messageTypeDiv1").style.display = "block";
				document.getElementById("messageTypeDiv1").style.width = "96%";
				document.getElementById("messageTypeDiv2").style.display = "block";
				
				document.getElementById("exampleDiv").style.display = "block";
				
				if(document.getElementById("messageTypeId").value  == createYourOwnMsgTypeId || document.getElementById("messageTypeId").value  == 'PopularMessages')
				{
					////console.log("execRuleEngine():3 persInitTot: " + personalizationInitialTotal + " calcTotPremFontCharges: " + calcTotalPremiumFontCharges());
					document.getElementById("personalizationCostDiv2").innerHTML = displayMonetary(personalizationInitialTotal + calcTotalPremiumFontCharges());	
										updateTextCounter();
				}
			}
		}
	}
	
	function clearlistbox(lb){
		try
		{	
			lb.options.length = 0;
		}
		catch(e)
		{
			e;
		}
	}
		var initialLoad = 0;
	function loadPopularMessages(id)
	{  
		var displayedMsgs = false;
		if(myHM.containsKey(id))
		{
			var popMsgArr = myHM.get(id).split("|");
			var popMsgStr = '';		
			if(popMsgArr.length > 0 && popMsgArr[0].length > 0)
			{
				popMsgStr = '<p>Select popular message:	</p>';
				if (IWTSPath) {
				    popMsgStr = popMsgStr + '<tr align="center" id="clickRow"><td><a href="javascript:void(0)" onclick="showIt(\'popMsgScroll\');swapExample(\'popMsgScroll\',\'clickRowText\');">Click here to <span id="clickRowText">see more</span> messages</a></td></tr>';
				}
				popMsgStr = popMsgStr + '<div id=\"popMsgScroll\" style=\"height:120px;  width:375px; overflow:auto;\"><TABLE cellspacing="0" width="358px"><TBODY>';
				
				for(i = 0; i < popMsgArr.length; i++)
				{
					popMsgStr = popMsgStr + "<TR><TD style='border-bottom:1px solid #bbb'>" + popMsgArr[i] + "</TD><TD style='border-bottom:1px solid #bbb; width:35px;' class=tdLast><A href=\"#\" onClick=\"return selectEscapedPopMessage('" + escape(popMsgArr[i]) + "')\">Select</A></TD></TR>";
					displayedMsgs = true;
				}
				popMsgStr = popMsgStr + "</TBODY></TABLE></div>";
				if(document.getElementById("popularMessagesDiv"))
				document.getElementById("popularMessagesDiv").innerHTML = popMsgStr;
				if (IWTSPath) {
					hideIt('popMsgScroll');	
				}
			} 
			if(document.getElementById("messageTypeId").value == 'PopularMessages')
			{
				var lbox = document.getElementById("viewPopularMessage");
				clearlistbox(lbox);
				for(i = 0; i < popMsgArr.length; i++)
				{
					var opt = document.createElement("option");
					//document.getElementById("viewPopularMessage").options.add(opt);
					var t1 =  popMsgArr[i];

					t1 = replaceSubString(popMsgArr[i], /(&amp;)/g,"&");
					t1 = replaceSubString(t1, /(&#039;)/g,"'");
					t1 = replaceSubString(t1, /(&#034;)/g,"\"");
					
					opt.text = t1;
					opt.value = t1;
					opt.title= t1;
				}
			}
		}
		if (id != 'DEFAULT' && !displayedMsgs) {
			loadPopularMessages('DEFAULT');
		}		
	}
		
	function selectEscapedPopMessage(msg) {
		msg = replaceSubString(msg, /%26amp%3B/g, '%26');
		msg = unescape(msg);
	 	var intIndexOfMatch = msg.indexOf("&#039;");
		 // Loop over the string value replacing out each matching
		 // substring.
		 while (intIndexOfMatch != -1){
			 // Relace out the current instance.
			 msg = msg.replace( "&#039;", "'" );
			 // Get the index of any next matching substring.
			 intIndexOfMatch = msg.indexOf("&#039;");
		 }
		 msg = replaceSubString(msg, /&#034;/g, '"');
		 selectPopularMessage(msg);	
		//selectPopularMessage(unescape(msg).replace(/&#039;/, "'"));
		return false;
	}
	
	var IWTSPath;
	
	function selectPopularMessage(msg,fromPageLoad)
	{
		initialLoad++;
	    selectedPopularMsg = msg;
	    var msgTypeChanging = (document.getElementById("messageTypeId").value != 'PopularMessages');
		document.getElementById("messageTypeId").value = 'PopularMessages';
		if (!msgTypeChanging) {
		
		} else if (fromPageLoad) {
			loadMessageType('PopularMessages');
		} else if(firstTimeLoad == 0){
			firstTimeLoad ++;
			loadMessageType('PopularMessages');
		}
		if(document.getElementById("messageTypeDiv1").style.display != "none")
		{
			if(document.getElementById("message_1") != null)
			{
				if(document.getElementById("viewPopularMessage"))
					document.getElementById("viewPopularMessage").value = msg;
				if(!invalidPopMess) {
				document.getElementById("message_1").value = msg;
				updateTextCounter();
				}
			}
		} else {
			lockPopMsg = 1;
			showText('Please select an Occasion');
			
		}
	}
	

	function isDateValid(dtObj,fromLayer)
	{	
		if (dtObj.value == "") {
			if (!fromLayer) {
				showText('Enter date');
				dtObj.blur();
			}
			return false;
		}
		var params = "URL=AjaxSuccessView&errorURL=AjaxFailureView&langId="+ document.getElementById("langId").value + "&storeId=" + document.getElementById("storeId").value + "&dateValue=" + dtObj.value;

		var dateAjax = new Ajax.Request('DateValidator', 
							{
								method: 'post', 
								parameters: params, 
								asynchronous: false
							});
		var r = eval("(" + dateAjax.transport.responseText + ")");

		if (r.status=='Success')
		{
			hideLBModal('dateExample');
			hideIt('layerDateError');
			if (fromLayer) {
				$($('srcDateId').value).value = $('date_layer').value;
			}
			return true;
		}
		else
		{
			//showText('Invalid date. \nPlease enter the date in one of the following formats \n10/11/03 \n10/11/2003 \n10-11-03 \n10-11-2003 \n11 October 2003 \nOctober 11, 2003');
			showLBModal('dateExample');
			document.getElementById("messageTypeDiv3").style.display = "block";
			if (fromLayer) {
				showIt('layerDateError');
			} else {
				dtObj.blur();
				$('srcDateId').value = dtObj.id;
				$('date_layer').value = dtObj.value
			}
			//setTimeout("document.getElementById('" + dtObj.id + "').focus()", 10);
			//setTimeout("document.getElementById('" + dtObj.id + "').select()", 10);
			return false;
		}
	}
	
	function IsNumeric(sText)

	{
	
	   var ValidChars = "0123456789.";
	   var IsNumber=true;
	   var Char;
	
	 
	   for (i = 0; i < sText.length && IsNumber == true; i++) 
	      { 
	      Char = sText.charAt(i); 
	      if (ValidChars.indexOf(Char) == -1) 
	         {
	         IsNumber = false;
	         }
	      }
	   return IsNumber;
	   
	   }
	
	
	function isYearValid(yrObj)
	{
		if(yrObj.value == "") {
			showText('Enter year');
			return false;
			}

		if(!IsNumeric(yrObj.value) || yrObj.value.length != 4) {
			showText('Invalid Year');
			setTimeout("document.getElementById('" + yrObj.id + "').focus()", 10);
			setTimeout("document.getElementById('" + yrObj.id + "').select()", 10);
			return false;
		}
		return true;		
	}
	function displayTip(msgTypeName) {	
		document.getElementById("personalizeTipDiv").innerHTML = getTip(msgTypeName);
		showIt('tipText');
	}
	function getTip(msgType)
	{
		var tip = '';
		if(tipHM.containsKey(msgType))
		{
			tip = tipHM.get(msgType);
		}
		else
		{
			tip = tipHM.get('default');
		}
		tip = '<P align="left">' + tip + '</P>';
		return tip;
	}

	
var fontStore = null; 
var currentZone = null;



function filterFonts(excludeMonogram, onlyMonogram) {
	// save the font options from the select box
	// (should only get stored on first call)
	
	if(!currentZone) currentZone = $j('#tabNum').val();
	
	if (currentZone != $j('#tabNum').val()){
		
		currentZone = $j('#tabNum').val();
		
		fontStore = $j('#font').html();	
	}
	
	if(!fontStore) fontStore = $j('#font').html();
	
	////console.log(' start ' + $j('#font').html());
	////console.log(' fontStore before ' + fontStore);
	
	// save the selected font
	var selectedFont = $j("#font option:selected");
	
	// restore font list
	$j('#font').html(fontStore);
	
	// set selected font
	$j("option[value='" + selectedFont.attr('value') + "']:first").attr('selected', 'selected');
	
	// remove monogram fonts from list
	if(excludeMonogram) {
		////console.log(' in excludeMonogram ');
		var c = $j('#font').children();
		c.filter("option:contains('Monogram')").remove(); 				// filter immediate children
		c.children().filter("option:contains('Monogram')").remove(); 	// filter optgroup children
	}
	  
	// show only monogram fonts
	if(onlyMonogram) {
		////console.log(' in onlyMonogram ');
  		var c = $j('#font').children();
		c.not("option:contains('Monogram'), optgroup").remove();	// filter immediate children
		c.children().not("option:contains('Monogram')").remove();	// filter optgroup children
  	}
	
	// remove empty optgroups
	 $j("#font optgroup").each(function() {
		if($j("option", this).size() < 1) {
			$j(this).remove();
		}
	 });
	 
	 // only one optgroup, move children out of the optgroup and remove the optgroup
	 if($j("#font optgroup").size() == 1) {
		$j("#font optgroup").each(function() {
			$j(this).children().each(function() {
				// move children to top of list
				$j("#font").append($j(this).clone());
			});
			$j(this).remove();
		});
	 }
	
	//var defaultFont = '';
	// mark recommended font
	$j('#font').children("option[value='" + defaultFont + "']").append(" (recommended)");
	$j('#font').children().children("option[value='" + defaultFont + "']").append(" (recommended)");
	
		//console.log('end ' + $j('#font').html());
		//console.log(' fontStore after ' + fontStore);
	// load image of selected font
	loadFontImage($j('#font').val());	  
}
	
    // variable to store selected popular message
	var selectedPopularMsg;

	function priceAttributeInit(priceAttrValues) {
		if (priceAttrValues == null) {
			return;
		}
		var attrValuesArr = priceAttrValues.split('~');
	
		for(i = 0; i < attrValuesArr.length; i+=4)
		{
			if(attrValuesArr[i] == 'false')
			{
				if(attrValuesArr[i+1] == 'EXCLUDEWORD')
				{
					excludeWord = attrValuesArr[i+2];
				}
				else if(attrValuesArr[i+1] == 'PERWORD')
				{
					perWord = attrValuesArr[i+2];
				}
				else if(attrValuesArr[i+1] == 'MININIMUMPRICE')
				{
					minPrice = attrValuesArr[i+2];
				}
				else if(attrValuesArr[i+1] == 'MAXIMUMPRICE')
				{
					maxPrice = attrValuesArr[i+2];
				}
			}
		}
	}

	var intendedType, changeForced = false;
	function forceChange()  {
		document.getElementById("messageTypeId").value = intendedType;
		loadMessageType(intendedType);
		hideLBModal('preselectedChange');
		changeForced = true;
	}
	
	function confirmChange()
	{
		if(IWTSPath)
		{
			if(!(document.getElementById("messageTypeId").value=='PopularMessages') && !changeForced)
			{
				intendedType = document.getElementById("messageTypeId").value
				document.getElementById("messageTypeId").value='PopularMessages';
				lightbox.prototype.hideLBSelects();
				showLBModal('preselectedChange');
				return false;		
			}
			else {
			    loadMessageType(document.getElementById("messageTypeId").value);
				return true;
			}
		}
		else
		{
		    loadMessageType(document.getElementById("messageTypeId").value);
			return true;
		}
	}
	
	var invalidPopMess = false;
	function loadMessageType(msgType, skipFilter, calcOnly)
	{
		
		var msgTypeName = msgTypeNamesHM.get(msgType).toLowerCase();
		document.getElementById("personalizeTipDiv").innerHTML = getTip(msgTypeName);
		document.getElementById("exampleDiv").innerHTML = '';
		
		hideIt('popularMessagesDiv');
		
		//check if msgTypename has monogram in it
		 var monoRe = /monogram/i;
		 var hasMonogram = monoRe.test(msgTypeName);
		
	/*	filterFonts(msgType == createYourOwnMsgTypeId,hasMonogram); 
		
		if(msgType == '607665'){  
		// show monogram and non-monogram fonts for initials
			filterFonts(false,false);		
		} 
		else*/
		if(skipFilter == undefined || !skipFilter) {
		
			//console.log(' before FILTER ' + $j('#font').html());
			if (hasMonogram) {
			   // filter out all but monogram fonts
			   // ****if monogram is select and there are no monogram fonts - diplay all fonts normal, otherwise show the monogram fonts
			   // - this is a fix for the database issues, where monogram is an option but has no fonts assoc with the product ****
				filterFonts(false,true);
				//console.log('has a monogram');
			}
			else{ 
				filterFonts(true,false);
				//console.log('does NOT have monogram');
			}
		}
		
		numFieldsCtr = 0;
		
		calcCurrentFont();  // track font changes
		
		if(msgType == 'DoNotPersonalize')
		{
			document.getElementById("messageTypeDiv1").innerHTML = '<div id="messageTypeDiv2" style="display:none"></div><span id="personalizationCostDiv1" style="display:none">$0.00</span>';
			document.getElementById("messageTypeDiv2").innerHTML = '';
		}
		else if(msgType == 'PopularMessages')
		{
			//var popMsgListHTML = 'Select popular message:<br /><select class="largeSelectBox" id="viewPopularMessage" name="viewPopularMessage" size="5" onChange="selectPopularMessage(this.options[this.selectedIndex].value)">';
			//popMsgListHTML = popMsgListHTML + '</select><input type="hidden" id="textName_1" name="textName_1" value="CUSTOM">';
			//document.getElementById("exampleDiv").innerHTML = popMsgListHTML;
			showIt('popularMessagesDiv');
			loadPopularMessages(document.getElementById('occasionId').value);

			if(IWTSPath) {
				hideIt('exampleDiv');
				//showIt('exampleReplace');
			}
			var maxChars2 = (zoneWidth * zoneHeight) + zoneHeight - 1;
				if ((selectedPopularMsg !=null ) && (selectedPopularMsg.length-1) > maxChars2)
				{
					selectedPopularMsg=null;
					invalidPopMess = true;
				} else {
				    invalidPopMess = false;
				}
			if(IWTSPath)
			{
				var prodPopMsgStr1 = 'Add to or Edit Pre-Selected Message:<br><TEXTAREA class="personalize_textarea" id="message_1" wrap="off" rows="'+zoneHeight+'" cols="'+zoneWidth+'" name="message_1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onKeyUp="updateTextCounter()" onmouseout="updateTextCounter()">'+(selectedPopularMsg==null?"":selectedPopularMsg)+'</TEXTAREA><div id="messageTypeDiv2" style="display:none"></div>Personalization cost for this item <span id="personalizationCostDiv1">$0.00</span>';
			}
			else
			{
				var prodPopMsgStr1 = '<br />Enter/edit text:<br /><TEXTAREA class="personalize_textarea" id="message_1" wrap="off" rows="'+zoneHeight+'" cols="'+zoneWidth+'" name="message_1"  oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false" onKeyUp="updateTextCounter()" onmouseout="updateTextCounter()">'+(selectedPopularMsg==null?"":selectedPopularMsg)+'</TEXTAREA><div id="messageTypeDiv2" style="display:none"></div>Personalization cost for this item <span id="personalizationCostDiv1">$0.00</span>';
			}
				
			var prodPopMsgStr2 = '<DIV id="textCounterDiv" class=personalizeTip></DIV>';
			
			if(calcOnly == undefined || !calcOnly) {
				document.getElementById("messageTypeDiv1").innerHTML = prodPopMsgStr1;
				document.getElementById("messageTypeDiv2").innerHTML = prodPopMsgStr2;
			} else {
				updateTextCounter();
			}
			
			initTextCounter();
			
		}
		else if(msgType == createYourOwnMsgTypeId)
		{
			document.getElementById("messageTypeDiv1").innerHTML = '<input type="hidden" id="textName_1" name="textName_1" value="CUSTOM"><P class=largeText><B>Create Your Own Message</B></P><TEXTAREA class="personalize_textarea" id="message_1" wrap="off" rows="'+zoneHeight+'" cols="'+zoneWidth+'" name="message_1"  oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onKeyUp="updateTextCounter()" onmouseout="updateTextCounter()"></TEXTAREA><div id="messageTypeDiv2" style="display:none"></div><p class="clearLeft">Personalization cost for this item <span id="personalizationCostDiv1">$0.00</span></p><div class="clear"></div>';
			document.getElementById("messageTypeDiv2").innerHTML = '<DIV id="textCounterDiv" class=personalizeTip></DIV>';

			priceAttributeInit(msgTypeAttrValuesHM.get(msgType));
			initTextCounter();
		}
		else
		{
			var msgTypeExample = msgTypeExamplesHM.get(msgType);
			msgTypeExample = msgTypeExample.replace(/&lt;/g,'<').replace(/&gt;/g,'>');

            //var msgTypeExampleHTML = '<div style="padding:0px 10px 3px 0px; display: inline;">Example:</div><div style="padding:0px 10px 3px 0px; display: inline;">'+msgTypeExample+'</div>';
            var msgTypeExampleHTML = '<div style="padding:0px 10px 3px 0px; display: block; float: left;">Example:</div><div style="padding:0px 10px 3px 0px; display: block; float: left;">'+msgTypeExample+'</div>';
			document.getElementById("exampleDiv").innerHTML = msgTypeExampleHTML;

			var inner_html1 = '';
			var inner_html2 = '';
			var inner_html3 = '';
			var display_html = false;
			priceAttributeInit(msgTypeAttrValuesHM.get(createYourOwnMsgTypeId));
			var attrValuesArr = msgTypeAttrValuesHM.get(msgType).split('~');
			//To account for space in each line with constant characters i.e. " & "
			for(i = 1; i <=zoneHeight;i++)
			{
				lineHM[i] = 0;
			}
			lineToInputMap = new HashMap();
			for(i = 0; i < attrValuesArr.length; i+=4)
			{
				line = attrValuesArr[i+3];					
				numChar = attrValuesArr[i+2];
				temp = parseInt(lineHM[line]) + parseInt(numChar);
				lineHM[line]=temp;	
			}
			var lineFlag = 0;
			var totalFields = attrValuesArr.length/4;
			for(i = 0; i < attrValuesArr.length; i+=4)
			{
				
				if(attrValuesArr[i] == 'true')
				{
					var remainingChar =parseInt(zoneWidth) - parseInt(lineHM[attrValuesArr[i+3]]);
					numFieldsCtr++;
					display_html = true;
					inner_html1 = inner_html1 + '<input type="hidden" id="textName_'+numFieldsCtr+'" name="textName_'+numFieldsCtr+'" value="'+attrValuesArr[i+1]+'">';
					inner_html1 = inner_html1 + '<input type="hidden" id="lineNum_'+numFieldsCtr+'" name="lineNum_'+numFieldsCtr+'" value="'+numFieldsCtr+'~'+attrValuesArr[i+3]+'">';		
						
					/*if(attrValuesArr[i+1] == 'Name')
					{
						inner_html1 = inner_html1 + 'Name:<br><input name="message_'+numFieldsCtr+'" id="message_'+numFieldsCtr+'" type="text" class="smallTextBox" maxlength="'+zoneWidth+'" onKeyUp=updateTextFieldCounter(this,"textFieldCounterDiv_'+i+'") onKeyDown=updateTextFieldCounter(this,"textFieldCounterDiv_'+i+'") onChange=updateTextFieldCounter(this,"textFieldCounterDiv_'+i+'") ><br><br>';
						inner_html2 = inner_html2 + '<DIV id="textFieldCounterDiv_'+i+'" class=personalizeTip><P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+zoneWidth+' characters left</P></DIV><br>';
					}
					else */
					if(attrValuesArr[i+1] == 'Date' || attrValuesArr[i+1] == 'Short Date' || attrValuesArr[i+1] == 'Long Date' || attrValuesArr[i+1] == 'Full Date')
					{
					    inner_html1 = inner_html1 + '<div class="clear"></div><div style="width:133px;float:left;">Date:<br><input name="message_'+numFieldsCtr+'" id="message_'+numFieldsCtr+'" type="text" class="smallTextBox" maxlength="'+zoneWidth+'" dtype="date" onBlur=isDateValid(this) oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"   onKeyUp=updateLineCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'",'+attrValuesArr[i+3]+','+totalFields+'); onKeyDown=updateLineCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'",'+attrValuesArr[i+3]+','+totalFields+'); onChange=updateLineCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'",'+attrValuesArr[i+3]+','+totalFields+'); size="18"></div>';
						if(attrValuesArr[i+3] != lineFlag)
						{
							inner_html1 = inner_html1 + '<DIV id="textFieldCounterDiv_'+attrValuesArr[i+3]+'" class=personalizeTip style="float:right;"><P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+remainingChar+' characters left</P></DIV><br><br>';
							lineFlag=attrValuesArr[i+3];
						}
						inner_html3 = inner_html3 + '<b>Valid Date Formats</b><br> 10/11/03, 10/11/2003, 10-11-03 <br>10-11-2003, 11 October 2003 <br>October 11, 2003';
					}
					else if(attrValuesArr[i+1] == 'Year')
					{
						inner_html1 = inner_html1 + '<div style="width:133px;float:left;">Year:<br><input name="message_'+numFieldsCtr+'" id="message_'+numFieldsCtr+'" type="text" class="smallTextBox" maxlength="'+zoneWidth+'" onBlur="isYearValid(this)" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onKeyUp=updateTextFieldCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'") onKeyDown=updateTextFieldCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'") onChange=updateTextFieldCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'") size="18"></div>';
						if(attrValuesArr[i+3] != lineFlag)
						{
							inner_html1 = inner_html1 + '<DIV id="textFieldCounterDiv_'+attrValuesArr[i+3]+'" class=personalizeTip style="float:right;"><P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+remainingChar+' characters left</P></DIV><br><br>';
							lineFlag=attrValuesArr[i+3];
						}
					
					}
					/*else if(attrValuesArr[i+1] == 'Initial')
					{
						inner_html1 = inner_html1 + '<input type="hidden" name="message_'+numFieldsCtr+'" name="message_'+numFieldsCtr+'" value=""><table><tr><td><b>First</b> Initial<br><input name="firstNameInitial" type="text"class="quantityTextBox" maxlength="1" /></td><td><b>Middle</b> Initial<br /><input name="middleNameInitial" type="text" class="quantityTextBox" maxlength="1" /></td><td><b>Last</b> Initial<br /><input name="lastNameInitial" type="text" class="quantityTextBox" maxlength="1" /></td></tr></table><br><br>';
					}*/
					else if(attrValuesArr[i+1] == 'Monogram')
					{
						inner_html1 = inner_html1 + '<input type="hidden" id="message_'+numFieldsCtr+'" name="message_'+numFieldsCtr+'" value=""><br /><table><tr><td><b>First</b> Initial<br><input id="firstNameInitial" name="firstNameInitial" type="text" class="quantityTextBox" maxlength="1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onBlur=concatMonogram("'+numFieldsCtr+'")></td><td><b>Last</b> Initial<br><input id="lastNameInitial" name="lastNameInitial" type="text" class="quantityTextBox" maxlength="1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onBlur=concatMonogram("'+numFieldsCtr+'")></td><td><b>Middle</b> Initial<br><input id="middleNameInitial" name="middleNameInitial" type="text" class="quantityTextBox" maxlength="1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onBlur=concatMonogram("'+numFieldsCtr+'")></td></tr></table>';
					}
					else if(attrValuesArr[i+1] !='' && (attrValuesArr[i+1].indexOf('Monogram')!= -1 || attrValuesArr[i+1].indexOf('Initial') != -1))
					{
						inner_html1 = inner_html1 + '<input type="hidden" id="message_'+numFieldsCtr+'" name="message_'+numFieldsCtr+'" value=""><br /><table><tr><td><b>First</b> Initial<br><input id="firstNameInitial" name="firstNameInitial" type="text" class="quantityTextBox" maxlength="1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onBlur=concatInitials("'+numFieldsCtr+'")></td><td><b>Middle</b> Initial<br><input id="middleNameInitial" name="middleNameInitial" type="text" class="quantityTextBox" maxlength="1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onBlur=concatInitials("'+numFieldsCtr+'")></td><td><b>Last</b> Initial<br><input id="lastNameInitial" name="lastNameInitial" type="text" class="quantityTextBox" maxlength="1" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onBlur=concatInitials("'+numFieldsCtr+'")></td></tr></table>';
					}					
					else
					{
						inner_html1 = inner_html1 +'<div style="width:133px;float:left;">'+ attrValuesArr[i+1] + ':<br /><input id="message_'+numFieldsCtr+'" name="message_'+numFieldsCtr+'" type="text" class="smallTextBox" maxlength="'+zoneWidth+'" oncut="return false" onpaste="return false" oncopy="return false" oncontextmenu="return false"  onKeyUp=updateLineCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'",'+attrValuesArr[i+3]+','+totalFields+'); onKeyDown=updateLineCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'",'+attrValuesArr[i+3]+','+totalFields+');  onFocus=updateLineCounter(this,"textFieldCounterDiv_'+numFieldsCtr+'",'+attrValuesArr[i+3]+','+totalFields+') ></div>'; 
						if(attrValuesArr[i+3] != lineFlag)
						{
							inner_html1 = inner_html1 + '<DIV id="textFieldCounterDiv_'+attrValuesArr[i+3]+'" class=personalizeTip style="float:right;"><P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+remainingChar+' characters left</P></DIV><br><br><div class="clear" style="height:10px"></div>';
							lineFlag=attrValuesArr[i+3];
						}
						else
						{
							inner_html1 = replaceSubString(inner_html1, '<div class="clear" style="height:10px"></div>', '');
						}						
					}
				} else if(attrValuesArr[i] == 'false') {
						numFieldsCtr++;
						inner_html1 = inner_html1 + '<input type="hidden" id="textName_'+numFieldsCtr+'" name="textName_'+numFieldsCtr+'" value="'+attrValuesArr[i+1]+'">';
						inner_html1 = inner_html1 + '<input type="hidden" id="message_'+numFieldsCtr+'" name="message_'+numFieldsCtr+'" value="'+attrValuesArr[i+1]+'">';
				}

				var engraveLine = attrValuesArr[i+3];
				if (!lineToInputMap.containsKey(engraveLine)) {
					lineToInputMap.put(engraveLine, new Vector());
				}
				lineToInputMap.get(engraveLine).addElement("message_"+numFieldsCtr );
			}
			
			
			inner_html1 = inner_html1 + '<div id="messageTypeDiv2" style="display:none"></div><p class="clearLeft">Personalization cost for this item <span id="personalizationCostDiv1">'+calculateCost(numFieldsCtr, msgType)
										+'</span></p><div class="clear"></div>';
			if(display_html == false)
			{
				inner_html = '';
			}
			
			if(calcOnly == undefined || !calcOnly) {
				document.getElementById("messageTypeDiv1").innerHTML = inner_html1;
				document.getElementById("messageTypeDiv2").innerHTML = inner_html2;	
				document.getElementById("messageTypeDiv3").innerHTML = inner_html3;	
			}	
			
			document.getElementById("personalizationCostDiv2").innerHTML = calculateTotalCost(numFieldsCtr, msgType);			
		}
		
		if(calcOnly == undefined || !calcOnly) {
			execRuleEngine();
		}
		
	}	
	
	function calculateCost(ctr, msgType)
	{
		var costBasis;
		if (setCost[msgType]!=null) {
			costBasis = setCost[msgType];
			return displayMonetary(costBasis);
		} else {
			costBasis = (minPrice == 0?perWord:minPrice);
			return displayMonetary(costBasis*ctr);
		}
		
	}

	function calculateTotalCost(ctr, msgType)
	{
		var costBasis;
		if (setCost[msgType] != null) {
			costBasis = setCost[msgType];
			ctr = 1;
		} else {
			costBasis = (minPrice == 0?perWord:minPrice);
		}
		////console.log("calculateTotalCost() - persInitTot: " + personalizationInitialTotal + " costBasis*ctr: " + parseFloat((costBasis*ctr)) + " calcTotPremFontCharges: " + calcTotalPremiumFontCharges());
		return displayMonetary(personalizationInitialTotal + parseFloat((costBasis*ctr)) + calcTotalPremiumFontCharges());
	}
	function getMonetaryValue(pValue) {
		var mValue = 0.00;
		mValue = pValue.substring(1, pValue.length);
		return mValue;
	}	
	function concatInitials(ctr)
	{
		var field = "message_"+ctr;
		document.getElementById(field).value = document.getElementById("firstNameInitial").value + document.getElementById("middleNameInitial").value + document.getElementById("lastNameInitial").value; 
	}
	function concatMonogram(ctr)
	{
		var field = "message_"+ctr;
		document.getElementById(field).value = document.getElementById("firstNameInitial").value + document.getElementById("lastNameInitial").value  + document.getElementById("middleNameInitial").value; 
	}
	
	function checkPersonalized(targetURL) {
		for (var i = 1; i <= 10; i++) {
		  try {
		  	var field = document.getElementById("message_" + i);
			var temp = field.value;
			temp = replaceSubString(field.value, /(\r\n|\r|\n)/g, " ");
			if (temp == ' ')
			{
				
				showLBModal('confirmSubmit2',targetURL);
				return false;
			}
			if (field && document.getElementById("message_" + i).value == '') {
				showLBModal('confirmSubmit2',targetURL);
				return false;
			}
		  } catch (e) {
		  }
		}
		return true;
	}
	
	function changeForSubmit()
	{
		forSubmit = true;
	}
	
	function submitUnpersonalized() {
		document.getElementById("messageTypeId").value = 'DoNotPersonalize';
		confirmChange();
		hideLBModal("confirmSubmit2");
		changeForSubmit();
		buildMessage();
	}
    function buildMessage(conditionalSubmit,targetURL)
    {		
    	var selOccasion = document.getElementById("occasionId");
		if(selOccasion.selectedIndex == 0) {
			showText('You must select an occasion');
			selOccasion.focus();
			return false;
		}
		loadOmnitureVar();
		document.getElementById("personalizationCost").value = getMonetaryValue(document.getElementById("personalizationCostDiv2").innerHTML);

		if(document.getElementById("messageTypeId").value == 'PopularMessages')
		{
			//document.getElementById("messageTypeId").value = createYourOwnMsgTypeId;
		}
		else if(document.getElementById("messageTypeId").value == 'DoNotPersonalize')
		{
			document.getElementById("messageTypeId").value = "";
		}
		
		
		for (var fieldId in document.personalizeForm.elements) {
		  try {
		    var field = document.personalizeForm.elements[fieldId];
			if (field.attributes.dtype && field.attributes.dtype.value.equals('date')) {
				if (!isDateValid(field)) {
					return false;
				}
			}
		  } catch (e) {
		  }
		}
		

    	if (checkPersonalized(targetURL))
    	{
	    		if (forSubmit == true || !conditionalSubmit)
				{
		    		document.getElementById("personalizeForm").submit();
		    		return true;
		    	}
		    	else
		    	{
		    		return false;
		    	}
    	}
	}
	function showText(str)
	{
		document.getElementById("alertText").innerHTML = str;
		showLBModal('selectOccasion');
		return;
	}

	function buildAjaxMessage(targetURL)
    {
    	var selOccasion = document.getElementById("occasionId");
		if(selOccasion.selectedIndex == 0) {
			showText('You must select an occasion');
			selOccasion.focus();
			return false;
		}


		document.getElementById("personalizationCost").value = getMonetaryValue(document.getElementById("personalizationCostDiv1").innerHTML);

		
		if(document.getElementById("messageTypeId").value == 'PopularMessages')
		{
			//document.getElementById("messageTypeId").value = createYourOwnMsgTypeId;
		}
		else if(document.getElementById("messageTypeId").value == 'DoNotPersonalize')
		{
			document.getElementById("messageTypeId").value = "";
		}

    	//if(document.getElementById("personalizationCostDiv2").innerHTML.indexOf("$0.00") != -1)
    	if (!checkPersonalized(targetURL))
    	{
			//hideLBModal('selectOccasion');
			//showLBModal('confirmSubmit', targetURL);
   			return false;				
    	}
    	else
    	{
    		return true;
    	}
	}
	
	function clearFontMaster()
	{
		//set the font master list to be null, so it will be rebuilt on each tab load
			
			fontMaster = null;
			orignalFonts = null;
	
	}
	function confirmClose()
    {
    	if(document.getElementById("personalizationCostDiv2").innerHTML.indexOf("$0.00") != -1)
    	{
    		setDoNotPersonalize();
			return confirm("A personalized gift, is a remembered gift. Are you sure that you do NOT want to give a personalized gift?");
    	}
	}	  	
	
	function initTextCounter()
	{
		if(document.getElementById("textCounterDiv") != null)
		{
			var counterText = '<P><B>Maximum<BR>Engravable Area</B></P>';
			for(var i=0; i < zoneHeight; i++)
			{
				counterText = counterText + '<P align="left">Line ' + (i+1) +':' + zoneWidth +' characters left</P>';
			}
			document.getElementById("textCounterDiv").innerHTML = counterText;
		}
	}

	function replaceEllipsis(elp) {
		return elp.replace("\u2026", "...");
	}

	/// start: http://pastebin.parentnode.org/78
	
	function setCaretTo(obj, pos) {
		if(obj.createTextRange) {
			var range = obj.createTextRange();
			range.move('character', pos);
			range.select();
		} else if(obj.selectionStart) {
			obj.focus();
			obj.setSelectionRange(pos, pos);
		}
	}	
	
	/// end: http://pastebin.parentnode.org/78
//// Added to support caret placment
Selection = function(input){
    this.isTA = (this.input = input).nodeName.toLowerCase() == "textarea";
};
with({o: Selection.prototype}){
    o.setCaret = function(start, end){
        var o = this.input;
        if(Selection.isStandard) {
          try {
            o.setSelectionRange(start, end);
          } catch (err) {
          }
        } else if(Selection.isSupported){
          try {
            var t = this.input.createTextRange();
            end -= start + o.value.slice(start + 1, end).split("\n").length - 1;
            start -= o.value.slice(0, start).split("\n").length - 1;
            t.move("character", start), t.moveEnd("character", end), t.select();
          } catch (err) {
          }
        }
    };
    o.getCaret = function(){
        var o = this.input, d = document;
        if(Selection.isStandard) {
          try {
            return {start: o.selectionStart, end: o.selectionEnd};
          } catch (err) {
            return {start: 0, end: 0 };
          }
        } else if(Selection.isSupported){
          try {
            var s = (this.input.focus(), d.selection.createRange()), r, start, end, value;
            if(s.parentElement() != o)
                return {start: 0, end: 0};
            if(this.isTA ? (r = s.duplicate()).moveToElementText(o) : r = o.createTextRange(), !this.isTA)
                return r.setEndPoint("EndToStart", s), {start: r.text.length, end: r.text.length + s.text.length};
            for(var $ = "[###]"; (value = o.value).indexOf($) + 1; $ += $);
            r.setEndPoint("StartToEnd", s), r.text = $ + r.text, end = o.value.indexOf($);
            s.text = $, start = o.value.indexOf($);
            if(d.execCommand && d.queryCommandSupported("Undo"))
                for(r = 3; --r; d.execCommand("Undo"));
            return o.value = value, this.setCaret(start, end), {start: start, end: end};
          } catch (err) {
            return {start: 0, end: 0};
          }
        }
        return {start: 0, end: 0};
    };
    o.getText = function(){
        var o = this.getCaret();
        return this.input.value.slice(o.start, o.end);
    };
    o.setText = function(text){
        var o = this.getCaret(), i = this.input, s = i.value;
        i.value = s.slice(0, o.start) + text + s.slice(o.end);
        this.setCaret(o.start += text.length, o.start);
    };
    new function(){
        var d = document, o = d.createElement("input"), s = Selection;
        s.isStandard = (document.selection == null);
        s.isSupported = true; //s.isStandard || (o = d.selection) && !!o.createRange();
    };
}
/////
	
	function updateTextCounter()
	{
	
		var sel = null;
		var theField = document.getElementById("message_1");
		var m_Selection = new Selection(theField); //// Added to keep caret in correct location
		//theField.value = replaceEllipsis(theField.value);		
		var maxChars = (zoneWidth * zoneHeight) + zoneHeight - 1;
		var maxLines = zoneHeight - 1;
		var maxPerLine = zoneWidth + 1;
		var priceWord = perWord;
		var priceMin = minPrice;
		var priceMax = maxPrice;
		var excludeLength = excludeWord;
		var display = "personalizationCostDiv1";
		var elName = "cusPrice";
		
		var strTemp = "";
		var strLineCounter = 0;
		var strCharCounter = 0;

		var strTemporary = replaceSubString(theField.value, /(\r\n|\r|\n)/g, "\n");

		var tmpValue = strTemporary;
		tmpValue = replaceEllipsis(strTemporary);

		//theField.value = strTemporary;
		var tmpSub = "";
		var tmpWord = "";
		var idx =0;

	    var caret = m_Selection.getCaret(); //// Added to keep caret in correct location
	
		for (var i = 0; i < tmpValue.length; i++)
		{
			var strChar = tmpValue.substring(i, i + 1 );
			var strCharTest = tmpValue.substring(i + 1, i + 2);
		
			if (strChar == '\n')
			{
				strTemp += strChar;
				strCharCounter = 0;
				strLineCounter += 1;
			}
			else if (strCharCounter == (maxPerLine-1))
			{
			    //if the last char on the line is space convert it to newline and move caret to nextline
			    if (strChar == ' ')
			    {
			       strTemp += '\n';
 				   strCharCounter = 0;
 				   strLineCounter += 1;
			       caret.start += 1;
				   caret.end += 1;
			    }
				else if (strCharTest != "\n")
				{
					idx = strTemp.lastIndexOf(" ");
					if((idx > 0)||(idx == 0))
					{
						tmpWrd = strTemp.substring(idx+1,strTemp.length);
						tmpWrd = tmpWrd + strChar;
						tmpSub = strTemp.substring(0,idx+1);
						tmpSub = tmpSub+ '\n' + tmpWrd;
						strTemp = tmpSub;
						strCharCounter = tmpWrd.length;
						tmpWrd = "";
						tmpSub = "";
						idx =0;
						//we're appending a new line, so advance the caret position by 1
						caret.start += 1;
						caret.end += 1;
					}
					else
					{
						strTemp += '\n' + strChar;
						strCharCounter = 0;
					}
				}
				else 
				{
					strTemp += strChar;
					strCharCounter = 0;
				}
				strLineCounter += 1;
			}
			else
			{
				strTemp += strChar;
				strCharCounter ++;
			}
		}
	
		strTemp = replaceSubString(strTemp, /\s+(\r\n|\r|\n)/g,"\n");
		if (!(maxChars >= strTemp.length))
		{
			strTemp = strTemp.substring(0, maxChars);
		}
	
		myArr = strTemp.split('\n');
	
		if ((myArr.length-1) > maxLines)
		{
			showText('The text you entered is too long for this item.\n it will be truncated');
			strTemp = "";
			for (var i = 0; i < maxLines+1; i++)
			{
				if (i == maxLines)
				{
					strTemp += myArr[i];
				}
				else 
				{
					strTemp += myArr[i] + '\n';
				}
			}
		}
		theField.value = strTemp;
		strTemp = replaceSubString(strTemp, /\n/g," ");

		var createYourOwnMsg = document.getElementById("message_1").value;
		var createYourOwnMsgArr = createYourOwnMsg.split("\n");

		var lineArr = new Array();
		for(var i=0; i < zoneHeight; i++)
		{
			lineArr[i] = zoneWidth;
		}

		for(var i=0; i< createYourOwnMsgArr.length; i++)
		{
			//IE keeps the carriage returns after the split on the newline above, which is throwing off our count
			//remove the carriage returns from each line before updating the count.
			createYourOwnMsgArr[i] = replaceSubString(createYourOwnMsgArr[i], /\r/g, "");
			if(createYourOwnMsgArr[i].length > zoneWidth)
			{
				createYourOwnMsgArr[i] = createYourOwnMsgArr[i].substring(0, zoneWidth);
			}
			
				
			lineArr[i] = (zoneWidth - createYourOwnMsgArr[i].length);
		}
		
		var counterText = '<P><B>Maximum<BR>Engravable Area</B></P>';
		for(var i=0; i < zoneHeight; i++)
		{
			counterText = counterText + '<P align="left">Line ' + (i+1) +':' + lineArr[i] +' characters left</P>'
		}
		if(document.getElementById("textCounterDiv")!=null){
			document.getElementById("textCounterDiv").innerHTML = counterText;
		}
	
		calcPrice(display, strTemp, excludeLength, priceWord, elName, priceMin, priceMax);
//		document.getElementById("personalizationCostDiv2").innerHTML = document.getElementById("personalizationCostDiv1").innerHTML;

		////console.log("updateTextCounter() - persInitTot: " + personalizationInitialTotal + " costDiv1: " + parseFloat(getMonetaryValue(document.getElementById("personalizationCostDiv1").innerHTML)) + " calcTotPremFontCharges: " + calcTotalPremiumFontCharges());
		
		document.getElementById("personalizationCostDiv2").innerHTML = displayMonetary(personalizationInitialTotal + parseFloat(getMonetaryValue(document.getElementById("personalizationCostDiv1").innerHTML)) + calcTotalPremiumFontCharges());
		m_Selection.setCaret( caret.start, caret.end ); //// Added to keep caret in correct location
		calcCurrentFont();
	}
	
	 function testForEnter(eve) 
 	{    
		if (eve.which == 13 || eve.keyCode == 13)
		{   
			forSubmit = false;
	    }
 	} 
 	
	function updateTextFieldCounterAlternate(txtFieldObj, divObj)
	{
		//txtFieldObj.value = replaceEllipsis(txtFieldObj.value);	//This method is just a duplicate method of updateTextFieldCounter for IE7 cursor to work. If you have a function call to replaceEllipsis it will break the cursor on IE7.	
		var txtFieldValue = txtFieldObj.value;
		document.getElementById(divObj).innerHTML = '<P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+(zoneWidth - txtFieldValue.length - lineLength) +' characters left</P>';	
		//lineHM[1] = parseInt(lineHM[1])+parseInt(txtFieldValue.length);
	}	
	
	function updateTextFieldCounter(txtFieldObj, divObj, g)
	{
			txtFieldObj.value = replaceEllipsis(txtFieldObj.value);		
			var txtFieldValue = txtFieldObj.value;
			document.getElementById(divObj).innerHTML = '<P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+(zoneWidth - lineLength - lineHM[1]) +' characters left</P>';	
	}
	
	function updateTextFieldCounterML(txtFieldObj, divObj, lineNumber, elementNumber)
	{
		var cleanedText = replaceEllipsis(txtFieldObj.value);
		if (cleanedText != txtFieldObj.value) {
			txtFieldObj.value = cleanedText;
		}

		var elementsOnLine = lineToInputMap.get(lineNumber).elements();

		var curLineLen = 0;
		var curLineLenExcludingFocus = 0;
		for (var i = 0; i < elementsOnLine.length; i++) {
			if (document.getElementById(elementsOnLine[i]).type != 'hidden') {
				curLineLen += $(elementsOnLine[i]).value.length;
				if ($(elementsOnLine[i]) != txtFieldObj) {
					curLineLenExcludingFocus += $(elementsOnLine[i]).value.length;
				}
			} else {
				curLineLen += lineHM[lineNumber];
				curLineLenExcludingFocus += lineHM[lineNumber];
			}
		}
		if (txtFieldObj == focusedInput) {
			txtFieldObj.maxLength = parseInt(zoneWidth) - curLineLenExcludingFocus;
		}
		
		if(parseInt(zoneWidth) >= curLineLen)
		{
			document.getElementById(divObj).innerHTML = '<P><B>Maximum<BR>Engravable Area</B></P><P align="left">Line 1: '+(zoneWidth - curLineLen) +' characters left</P>';	
		}else
		{
			
			return false;
		}
	}

	var focusedInput;
	function updateLineCounterOnFocus(txtFieldObj, divObj, lineNumber, numInpFields) {
		focusedInput = txtFieldObj;
		updateLineCounter(txtFieldObj, divObj, lineNumber, numInpFields);
	}
	
	function updateLineCounter(txtFieldObj, divObj, lineNumber, numInpFields)
	{
		
		lineLength = 0;
		for(var x=1;x <=numInpFields; x++)
		{
			var txtFieldValue = txtFieldObj.value;
			if(document.getElementById("lineNum_"+x) != null)
			{
				var prevField = document.getElementById("lineNum_"+x);
				var textField = prevField.value;
				var elementNum = textField.substring(0,1);
				if(textField.substring(2,3)==lineNumber)
				{
					
					lineLength = parseInt(lineLength) + document.getElementById("message_"+elementNum).value.length;
					divObj ="textFieldCounterDiv_"+lineNumber;
					updateTextFieldCounterML(txtFieldObj, divObj, lineNumber, elementNum);
						
				}
			}
		}

	}
		
    function loadFontImage(fontDesc)
    {
    
    	//console.log('in load font image');
	    if(fontsHM.containsKey(fontDesc))
	    {
	    	var fontImage = jspStoreImgDir+'images/fonts/'+ fontsHM.get(fontDesc) + '.jpg';
	    	//var fontImage = '<c:out value="${jspStoreImgDir}"/>images/fonts/' + fontsHM.get(fontDesc) + '.jpg';	    	
	    	document.getElementById("fontImageDiv").innerHTML = '<P><IMG  alt="' + fontDesc + '" src="' + fontImage + '" border=0></P>';
	    }
	    var myFont;
		if(fontCodesHM.containsKey(fontDesc))
	    {
			myFont = new String(fontCodesHM.get(fontDesc));
			spstring = 	myFont.split(",");
			document.getElementById("fontCode").value=spstring[0];
			document.getElementById("fontGroup").value=spstring[1];
			document.getElementById("fontOption").value=spstring[2];
			if(spstring.length < 6)// 4 on VM 7 on other environments
			{ document.getElementById("fontCode2").value=spstring[4];  }
			else
			{ document.getElementById("fontCode2").value=spstring[7];  }
			
	    }		
	    
	    
	    calcCurrentFont(); // start tracking font charges
	    // fire whatever calculates the price
	    // this is UGLY, but the only way to tie into the existing code
		var messageTypeId = document.getElementById("messageTypeId").value;
		if(messageTypeId != null){
			if(messageTypeId == createYourOwnMsgTypeId) {
				var m1 = $j('#message_1')
				if(m1.length) {
					updateTextCounter();
				}
			} else {
				loadMessageType(messageTypeId, true, true);
			}
		}
		
	}    
    
   function loadColorImage(colorDesc)
    {
	    if(colorsHM.containsKey(colorDesc))
	    {
	    	var colorImage = jspStoreImgDir+'images/colors/'+ colorsHM.get(colorDesc) + '.jpg';
	    	//var colorImage = '<c:out value="${jspStoreImgDir}"/>images/colors/' + colorsHM.get(colorDesc) + '.jpg';	    	
	    	document.getElementById("colorImageDiv").innerHTML = '<P><IMG  alt="' + colorDesc + '" src="' + colorImage + '"  border=0></P>';
	    }
	    var myColor;
		if(colorCodesHM.containsKey(colorDesc))
	    {
			myColor = new String(colorCodesHM.get(colorDesc));
			spstring = 	myColor.split(",");
			document.getElementById("colorCode").value=spstring[0];
			document.getElementById("colorGroup").value=spstring[1];
			document.getElementById("colorOption").value=spstring[2];
	    }		
    }    		
    
    function showMore(tipKey)
    {
		if(document.getElementById("personalizeTipDiv") != null)
		{
			document.getElementById("personalizeTipDiv").innerHTML = getTip(tipKey);
    	}
    }
    
    function setMonogram(selMsgType)
    {
    	var selMsgTypeName = msgTypeNamesHM.get(selMsgType);
    	if (selMsgTypeName == 'Monogram') {
			if(document.getElementById("message_1") != null) {
				document.getElementById("firstNameInitial").value = document.getElementById("message_1").value.substring(0,1);
				document.getElementById("middleNameInitial").value = document.getElementById("message_1").value.substring(2,3);
				document.getElementById("lastNameInitial").value = document.getElementById("message_1").value.substring(1,2);				
	    	}
    	} else if(selMsgTypeName !='' && (selMsgTypeName.toLowerCase().indexOf('monogram')!= -1 || selMsgTypeName.toLowerCase().indexOf('initial') != -1)) {
			if(document.getElementById("message_1") != null)
			{
				document.getElementById("firstNameInitial").value = document.getElementById("message_1").value.substring(0,1);
				document.getElementById("middleNameInitial").value = document.getElementById("message_1").value.substring(1,2);
				document.getElementById("lastNameInitial").value = document.getElementById("message_1").value.substring(2,3);				
	    		}
		}	

    }
    
function checkBackendInventory(productId, quantity) {
	var params = [];
	params.langId = "<c:out value='${WCParam.langId}'/>";
	params.storeId = "<c:out value='${WCParam.storeId}'/>";
	params.productId = productId;
	params.catEntryId_1 = productId;
	params.skuId = productId;

	params.quantity=quantity;
	
	
		
	dojo.io.bind(
		{
				url: "TRInventoryControllerCmd",
				method: "POST",
				load: function() {} ,
				mimetype: "text/html",
				content: params
		}
	);
}

function setDoNotPersonalize() {
	var msgTypeField = document.getElementById("messageTypeId");
	for (var i = 0; i < msgTypeField.options.length; i++) {
		if (msgTypeField.options[i].value = 'DoNotPersonalize') {
			msgTypeField.selectedIndex = i;
		}
	}
	
	calcCurrentFont();
	document.getElementById("personalizationCost").value = "0";
}

var showingTip = false, leaveTipOn = false;
function toggleTip(evt) {
	if (evt.type == 'click') {
		leaveTipOn = !leaveTipOn;
	}
    if (evt.type == 'mouseout' && !leaveTipOn) {
        hideIt('tipText');
        showingTip = false;
    } else {
        showIt('tipText');
        showingTip = true;
    }

}

var showingWhyTip = false, leaveWhyTipOn = false;
function toggleWhyTip(evt) {
	if (evt == 'click') {
		leaveWhyTipOn = !leaveWhyTipOn;
	}
    if (evt == 'mouseout' && !leaveWhyTipOn) {
        hideIt('whyAskDiv');
        showingWhyTip = false;
    } else {
        showIt('whyAskDiv');
        showingWhyTip = true;
    }

}

var showingFontTip = false;
function toggleFontTip() {
    if (showingFontTip) {
        hideIt('fontTipText');
    } else {
        showIt('fontTipText');
    }
    showingFontTip = !showingFontTip;
}

var showingColorTip = false;
function toggleColorTip() {
    if (showingColorTip) {
        hideIt('colorTipText');
    } else {
        showIt('colorTipText');
    }
    showingColorTip = !showingColorTip;
}

function swapExample(popMsgId,seeMoreText) {
  if ($(seeMoreText).innerHTML == 'see more') {
	showIt(popMsgId);
  	$(seeMoreText).innerHTML = 'hide';
  } else {
	hideIt(popMsgId);
  	$(seeMoreText).innerHTML = 'see more';
  }
}

/////////////////////////////////////////////////////////////
// Premium Font 
/////////////////////////////////////////////////////////////

var FONT_COST_TRACKER = new Array();
var PREMIUM_FONT_COST = 3;






function isPersonalized() {
		for (var i = 1; i <= 10; i++) {
		  try {
		  	var field = document.getElementById("message_" + i);
			var temp = field.value;
			temp = replaceSubString(field.value, /(\r\n|\r|\n)/g, " ");
			if (temp == ' ')
			{
				return false;
			}
			if (field && document.getElementById("message_" + i).value == '') {
				return false;
			}
		  } catch (e) {
		  }
		}
		return true;
	}
	
	
	function resetCosts() {
	
		//alert(FONT_COST_TRACKER);
		
		//alert('resettingCosts');
	
		FONT_COST_TRACKER = new Array();
		fontStore = null;
		
		//alert(FONT_COST_TRACKER);
	
	
	}

/*
 * Update FONT_COST_TRACKER for current font. This function is called each time the user
 * changes the selected font. We determine if the font is premium or not, and mark it
 * appropriately in the FONT_COST_TRACKER.
 */
function calcCurrentFont() {
	var orderItemId 	= $j('#pageNum').val();			// this keeps track of seperate items in the order for quanity > 1
	var physItemId 		= $j('#physicalItemId').val(); 	// the current physical item
	var zoneId 			= $j('#tabNum').val(); 			// the current zone on the physical item
	var selectedFont 	= $j("#font option:selected");	// query for the currently selected font
	var fontIsPremium 	= (selectedFont.hasClass('premium')); 	// determine if the current font is premium
	// FOR FUTURE USE //PREMIUM_FONT_COST	= parseFloat(selectedFont.attr('cost'));
	
	//console.log('font is premium ' + fontIsPremium);
	//console.log("is personalized " + isPersonalized());
	
	// set font
	if(!FONT_COST_TRACKER[orderItemId]) {
		FONT_COST_TRACKER[orderItemId] = new Array();
	}
	if(!FONT_COST_TRACKER[orderItemId][physItemId]) {
		FONT_COST_TRACKER[orderItemId][physItemId] = new Array();
	}
	
	// make sure this is being personalized
	if($j('#messageTypeId').val() == 'DoNotPersonalize') {
		////console.log("is personalized " + !isPersonalized());
		FONT_COST_TRACKER[orderItemId][physItemId][zoneId] = false;
	} else {
		//console.log("setting font is premium to " + fontIsPremium);
		////console.log("is personalized " + !isPersonalized());
		FONT_COST_TRACKER[orderItemId][physItemId][zoneId] = fontIsPremium;
		//console.log("new value for this zone " + FONT_COST_TRACKER[orderItemId][physItemId][zoneId]);
	}
	
	//console.log("physItemId + zoneId: " + physItemId + ' ' +  zoneId);
	
	// toggle message that shows additional charge
	showPremiumMessage(orderItemId, physItemId, zoneId);
}

/*
 * Determines if we should show the "Premium Font Charge: $$$" message on this zone
 */
function showPremiumMessage(orderItemId, physItemId, zoneId) {
	var zones = FONT_COST_TRACKER[orderItemId][physItemId];
	var markZone = -1;
	// we only want to show the message on the first zone on a given physical item
	for(var i = 0; i < zones.length; i++) {
		if(zones[i]) {
			markZone = i;
			break;
		}
	}
	
	// show or hide the message
	if(markZone == zoneId) {
		$j('#fontCostDiv').show();
	} else {
		$j('#fontCostDiv').hide();
	}
}

/*
 * Determines if this physical item has a premium font charge
 */
function physicalItemIsPremium(orderItemId, physItemId) {
	//alert("Physical item # " + physItemId);
	if(FONT_COST_TRACKER[orderItemId] !== undefined) {
		var zones = FONT_COST_TRACKER[orderItemId][physItemId];
		if(!zones) return false;
		for(var i = 0; i < zones.length; i++) {
			//alert("zone" + i + " " + zones[i]);
			if(zones[i]){ 
			//alert("item " + physItemId +"  IS premium " + i + " " + zones[i]);
			//console.log("item " + physItemId +"  IS premium " + i + " " + zones[i]);
			return true;	// return as soon as we find a premium font
			}
		}
	}
	//alert("item " + physItemId +" is not premium ");
	//console.log("item " + physItemId +" is not premium ");
	return false;
}

/**
 * Calculate total charges for Premium Fonts.
 * This function is called whenever a price for personalization is calculated. The result of this
 * function is added to the total personalization cost. 
 */
function calcTotalPremiumFontCharges() {
	var total = 0;
	for(var i = 0; i < FONT_COST_TRACKER.length; i++) { // each item in the order
		var physItems = FONT_COST_TRACKER[i];
		if(physItems !== undefined) {
			for(var j = 0; j < physItems.length; j++) { // each physical piece
				if(j !== undefined) {
						if(physicalItemIsPremium(i, j)) { // check piece for premium fonts
						//console.log("total charge before PFC: " + total);
						total += PREMIUM_FONT_COST;
						//console.log("total charge after PFC: " + total);
					}
				}
			}
		}
	}
	//console.log("calcTotalPremiumFontCharges(): " + total);
	return total;
}

// -------------------------------------------------------------------
// TabNext()
// Function to auto-tab field
// Arguments:
//   obj :  The input object (this)
//   event: Either 'up' or 'down' depending on the keypress event
//   len  : Max length of field - tab when input reaches this length
//   next_field: input object to get focus after this one
// -------------------------------------------------------------------
var field_length=0;
function TabNext(obj,event,len,next_field) {
	if (event == "down") {
		field_length=obj.value.length;
		}
	else if (event == "up") {
		if (obj.value.length != field_length) {
			field_length=obj.value.length;
			if (field_length == len) {
				next_field.focus();
				}
			}
		}
	}