var dc = 0;
function dodebug(instr)
{
	var d = document.getElementById('debugbox');
	if (d)
	{
		d.style.height='100px';
			d.style.width='600px';
		d.style.visibility='';
		d.value = dc +':'+instr+'\n'+d.value ;
		dc = dc + 1;
	}
}

function limitTextArea(e)
{
	if (!e) e = window.event;
	var textarea = (e.srcElement?e.srcElement:e.target);
	var maxlength = textarea.getAttribute("maxlength");
	if (textarea.nodeType==3) textarea = textarea.parentNode;
	if (e.type == "keypress")
	{	
		if (textarea.value.length > maxlength)
			textarea.value = textarea.value.substring(0,maxlength);
		if (textarea.value.length==maxlength)
		{
			if (!e.preventDefault)
			{
				e.keyCode=0;
				e.charCode=0;
			}
			if (e.charCode > 0)
				e.preventDefault() ;
		}
	}
	else
		textarea.value = textarea.value.substring(0,maxlength);
}


function resetdebug()
{ var d = document.getElementById('debugbox');
	if (d) d.value = '';
}
function getinchsize(textstr)
{
	var cm = getunits(textstr) == 'cm';
	var textnum = 0;
	textstr = textstr.replace(new RegExp('in','gi'),'');
	textstr = textstr.replace(new RegExp('cm','gi'),'');
	textstr = textstr.replace(new RegExp(' ','gi'),'');
	try
	{
		textnum = Number(textstr);
		if (cm) 
			textnum = textnum / 2.54;	
	}
	finally{
		if (isNaN(textnum)) 
			textnum = parseFloat(textstr);
		if (isNaN(textnum)) textnum = 0;
	
	}
	return textnum;
}

function getunits(textstr)
{
	var cm = (textstr.indexOf('cm') > -1);
	if (cm)
		return 'cm';
	else
		return 'in';
}

function setprecis(value,digits)
{
	value = Math.round(Math.pow(10,digits)*value)*Math.pow(10,-digits);
	result = new String(value);
	index = result.indexOf('.');
	if (index == -1) 
		index = result.indexOf(',');
	if (index > -1) 
		result = result.substr(0,index+digits+1);
	return result;
}
function putunits(value,units)
{
	if (units == 'cm')
		value = value *2.54;
	value = setprecis(value,2);
	return value + ' '+units;
}

function setcmsg(cmsg)
{
	cdiv = document.getElementById('CustomSizeConstraints');
	if (cdiv)
	{
		if ((cdiv.innerHTML) && (cmsg))
			cdiv.innerHTML = cdiv.innerHTML+'<br>';
		if ((cdiv) && (cmsg))
			cdiv.innerHTML = cdiv.innerHTML+ cmsg;
		else
			cdiv.innerHTML = '&nbsp;';
		cdiv.style.color = 'red';
		cdiv.style.fontWeight = 'bold';
	}
	else dodebug('cdiv doesnt exist');
}

function dsize(instr)
{
	return '<span style="color:#000;font-weight:normal;">'+instr.replace(/ /g,'&nbsp;')+'</span>';
}

/**
* checks to make sure that target and other fit within the assigned parameters (and outputs a message if they don't)
* @returns the new area of the label
*/
function checksizes(target,other,targetsize,othersize,longside,shortside,minarea,maxarea,minself,minother,fixit)
{
	var longvar = Math.max(targetsize,othersize);
	var shortvar = Math.min(targetsize,othersize);
	var units = getunits(target.value);
	var otherunits = getunits(other.value);
	var dimension = (target.id == 'customWidth'?'width':'height');
	var suggestion = '';
	var clear = true;
	//dodebug(longvar + ' '+longside+ '|'+shortvar+' '+shortside);
	if (targetsize < minself)
	{	
		if (fixit)
		{
			if (clear) 
				setcmsg('');
			clear = false;
			setcmsg(dsize(putunits(targetsize,units))+' is smaller than minimum '+dimension+' for this label.');
			suggestion = 'This is the minimum charge only, labels can still be printed smaller if desired';
			//dodebug(targetsize+'< minself');
			target.value = putunits(minself,units);
		}
		targetsize = minself;
	} 
	if ((longvar > longside) && (longvar == targetsize))
	{	//dodebug('longvar');
	
		if (fixit)
		{
			if (clear) 
				setcmsg('');
			clear = false;
			setcmsg(dsize(putunits(longvar,units))+' is longer than the longest allowed side '+dsize('('+putunits(longside,units)+')'));
			target.value = putunits(longside,units);
		} 
		if (shortvar >= shortside)
		{
			if (fixit)
			{
				//dodebug('othershort');
				setcmsg(dsize(putunits(shortvar,units))+' is longer than the longest allowed short side '+dsize('('+putunits(shortside,units)+')'));
			
				other.value = putunits(shortside,otherunits);
			}
			othersize = shortside;
		}
	}
	if ((shortvar > shortside) && (shortvar == targetsize))
	{
		if (fixit)
		{
			if (clear) 
				setcmsg('');
			clear = false;
			setcmsg(dsize(putunits(shortvar,units))+' is longer than the longest allowed short side '+dsize('('+putunits(longside,units)+' x '+putunits(shortside,units)+')'));
			//dodebug('shortvar');
			target.value = putunits(shortside,units);
		}
		targetsize = shortside;
		if ((longvar >= longside) )
		{
			//dodebug('otherlong');
			if (fixit)
			{
				setcmsg(dsize(putunits(longvar,units))+' is longer than the longest allowed side '+dsize('('+putunits(longside,units)+')'));
				other.value = putunits(longside,otherunits);
			}
			othersize = longside;
		}
	}
	if ((targetsize * othersize) > maxarea) 
	{	
		if (fixit)
		{
			if (clear) 
				setcmsg('');
			clear = false;
			setcmsg(dsize(putunits(targetsize,units)+ ' x '+putunits(othersize,units))+ dsize(' ('+putunits(targetsize*othersize,units)+'&sup2;)')+' is larger than the allowed area for this label '+dsize('('+(putunits(maxarea,units))+'&sup2;)'));
			suggestion = 'Try reducing your label to fit';
		}
		othersize = Math.max(maxarea/targetsize,minother);
		if (fixit)
			other.value = putunits(othersize,otherunits);
		targetsize = Math.min(maxarea/othersize,(othersize < shortside?longside:shortside));
		if (fixit)
			target.value = putunits(targetsize,units);
	}
	if ((targetsize * othersize) < minarea)
	{	dodebug((targetsize*othersize) +'< minarea');
		if (fixit)
		{
			if (clear) 
				setcmsg('');
			clear = false;
			setcmsg(dsize(putunits(targetsize,units)+ ' x '+putunits(othersize,units))+ dsize(' ('+putunits(targetsize*othersize,units)+'&sup2;)')+' is smaller than the allowed area for this label '+dsize('('+(putunits(minarea,units))+'&sup2;)'));
			suggestion = 'This is the minimum charge only, labels can still be printed smaller if desired';
		}
		othersize = Math.min(minarea/targetsize,(targetsize < shortside?longside:shortside));
		if (fixit)
			other.value = putunits(othersize,otherunits);
		targetsize = Math.max(minarea/othersize,minself);
		if (fixit) 
			target.value = putunits(targetsize,units);
	}
	if (targetsize < minself)
	{	
		dodebug(targetsize+'< minself');
		if (fixit)
			target.value = putunits(minself,units);
		targetsize = minself;
	} 
	if (suggestion) setcmsg(suggestion);
	dodebug('new size: '+targetsize+'x'+othersize);
	return targetsize*othersize;
}
function limitsize(e,longside,shortside,minarea,maxarea,minself,minother,textid1,textid2)
{
	var evt = (e?e:event);
	var target = (evt.target? evt.target:evt.srcElement);
	var text1 = document.getElementById(textid1);
	var text2 = document.getElementById(textid2);
	var other = (target.id == text1.id?text2:text1);
	var units = getunits(target.value);
	var otherunits = getunits(other.value);
	var fixit = evt.type!= 'keyup';
	resetdebug();
	//dodebug(longside+' '+shortside+' '+minarea+' '+maxarea+' '+textid1+' '+textid2+ ' '+target.id+' '+other.id);
	targetsize = getinchsize(target.value);
	othersize = getinchsize(other.value);
	
	//dodebug(targetsize+' '+othersize);
	if (fixit) 
		target.value = putunits(targetsize,units);
	dodebug(e.type);
	var newarea = checksizes(target,other,targetsize,othersize,longside,shortside,minarea,maxarea,minself,minother,fixit);
	updatePrices(Math.max(newarea,minarea),'customSizeLabelPrice');
	//checksizes(other,target,othersize,targetsize,longside,shortside,minarea,maxarea,minother,minself);
	
}

function updatePrices(area,spanClass)
{
	
	var spans = document.getElementsByTagName('SPAN');
	var basePrice;
	if (spans) 
	{
		
		for (var count = 0;count < spans.length;count++)
		{
			
			if ((spans[count].className == spanClass) && (basePrice = spans[count].getAttribute('baseprice')))
			{
				while (spans[count].firstChild)
					spans[count].removeChild(spans[count].lastChild);
			
				spans[count].appendChild(document.createTextNode(roundMoney(area*parseFloat(basePrice))));
			}
			
		}
	}
}

function roundMoney(moneyValue)
{
	//console.debug('money value in ',moneyValue);
	var precision = 2;
	var subst = (precision > -1) ? Math.round(parseFloat(moneyValue) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(moneyValue);
						
						  
	subst = String(subst);
	if (subst != 'NaN')
	{
		var decplace = subst.indexOf('.');
		 if (decplace < 0)
		 {
			decplace = subst.length;
			subst += '.';
		 }
		 while (subst.length < decplace+precision+1)
			subst += '0';
	}
	else subst = '';
	return subst;
						  
}