
function textCounterUpdate(event){
	var e = event.target; // the text field
	var edata = e.value; // field's value
	var elength = edata.length; // field's value length
	var counter = $(e.id+'_counter'); // the char counter
	var total = e.readAttribute('maxlength'); // max length of the field
	if(elength > total){
		e.value = edata.truncate(total,'');
		e.scrollTop = total;
	}else{
		counter.update((total - elength)+' characters left.');
	}
}
function disableSubmit(event){event.target.select('[type="submit"]').each(function(e){e.disabled=true;});}
function imageRollover(event){event.target.src = event.target.readAttribute('src_over');}
function imageRollout(event){event.target.src = event.target.readAttribute('src_out');}

function valuesCheck(event){
	if($('rc_pet_info_name_tag').value.length==0 && !confirm("Are you sure you don't want a name on your pet's tag?")){
		event.stop();
	}
}
function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}
function stripNonNumeric( str )
{
  str += '';
  var rgx = /^\d|\.|-$/;
  var out = '';
  for( var i = 0; i < str.length; i++ )
  {
    if( rgx.test( str.charAt(i) ) ){
      if( !( ( str.charAt(i) == '.' && out.indexOf( '.' ) != -1 ) ||
             ( str.charAt(i) == '-' && out.length != 0 ) ) ){
        out += str.charAt(i);
      }
    }
  }
  return out;
}

function toggleLinkAndDiv( displayDiv, linkDiv, onText, offText )
{
	if ($(displayDiv).visible()) {
		$(displayDiv).hide();
		$(linkDiv).innerHTML = offText;
	} else {
		$(displayDiv).show();
		$(linkDiv).innerHTML = onText;
	}
	return false;
		
}
/*
FYI:
	"restoreAfterFinish" is only used by Scale and all its subclasses and puts the element 
		back where it was the size that it was.

Bugs:
	SlideLeftIn still doesn't work on IE ???

	'delete' does not work on IE

	Cannot set styles of table items in Builder.node due to IE bug

	stray commas after last item in lists causes IE to fail


	Effect.toggle on these effects doesn't seem to work quite right
		(  Effect.toggle('demo-effect-curtainopen','slideleft')  )

	Not allowing Effect.Curtain* to finish before clicking again causes a problem.

	Not allowing MOST effects to finish before clicking again causes a problem.
*/
/* 
Also, these toggles don't seem to work right either
OK:  slideup, slidedown, slideright
NOT: slideleft, curtain
*/

Effect.PAIRS = Object.extend(
Effect.PAIRS, { 
	'slidedown':  ['SlideDownIn',  'SlideDownOut'],
	'slideup':    ['SlideUpIn',    'SlideUpOut'],
	'slideleft':  ['SlideLeftIn',  'SlideLeftOut'],
	'slideright': ['SlideRightIn', 'SlideRightOut'],
	'curtain':    ['CurtainClose', 'CurtainOpen']
}
);

Object.extend(
Effect, {
	_elementIsNotAListError: {
		name: 'ElementIsNotAListError',
		message: 'The specified DOM element is not a list exist, but is required to be for this effect to operate'
	}
}
);

Effect.SlideLeftIn = function(element) {
/* 
	SlideLeftIn need to have the content of the element wrapped in a container element with fixed width!
*/
	element = $(element).cleanWhitespace();
	if ( ! element.effectOn ) {
		element.effectOn = true;
		var elementDimensions = element.getDimensions();
		return new Effect.Parallel ( [
			new Effect.Move(element, 
				Object.extend({ 
					x: -(elementDimensions.width), 
					sync: true, 
					mode: 'relative', 
					beforeStartInternal: function(effect) {
						if(window.opera) effect.element.setStyle({left: ''});
						effect.element.setStyle({left: elementDimensions.width + 'px' });
						effect.element.show();
					}
				}, arguments[1] || {})
			),
			new Effect.Scale(element, 100,
				Object.extend({ scaleContent: false, 
					/* why does the use of sync: true make this flicker? */
					scaleY: false,
					scaleFrom: window.opera ? 0 : 1
				}, arguments[1] || {})
			)
			], Object.extend({
				beforeSetup: function(effect){
					effect.effects[0].element.parentNode.makeClipping();
					effect.effects[0].element.makeClipping();
				},
				afterFinishInternal: function(effect){
					effect.effects[0].element.parentNode.undoClipping();
					effect.effects[0].element.undoClipping();
				},
				afterFinish: function(effect){
//						delete(effect.effects[0].element.effectOn);
					effect.effects[0].element.effectOn = false;
				}
			}, arguments[1] || {})
		);
	}
}

Effect.SlideRightOut = function(element) {
/* 
	SlideRightOut need to have the content of the element wrapped in a container element with fixed width!
*/
	element = $(element).cleanWhitespace();
	var elementDimensions = element.getDimensions();
	return new Effect.Parallel ( [
		new Effect.Move(element, { x: element.getWidth(), sync: true, mode: 'relative' }),
		new Effect.Scale(element, window.opera ? 0 : 1, {	
			sync: true, 
			scaleContent: false, 
			scaleY: false,
			scaleFrom: 100,
			restoreAfterFinish: true
		})
		], Object.extend({ 
			beforeSetup: function(effect){
				effect.effects[0].element.makeClipping();
			},
			afterFinishInternal: function(effect){
				effect.effects[0].element.undoClipping().hide();
			}
		}, arguments[1] || {})
	);
}

/* from SlideUp */
Effect.SlideLeftOut = function(element) {
/*
	SlideLeftOut needs to have the content of the element wrapped in a container element with fixed width
	otherwise any text or images begin to wrap in stange ways!
*/
	element = $(element).cleanWhitespace();
	return new Effect.Scale(element, window.opera ? 0 : 1,
		Object.extend({ 
			scaleContent: false, 
			scaleY: false, 
			scaleMode: 'box',
			scaleFrom: 100,
			restoreAfterFinish: true,
			beforeStartInternal: function(effect) {
				effect.element.makePositioned();
				effect.element.down().makePositioned();
				if(window.opera) effect.element.setStyle({left: ''});
				effect.element.makeClipping().show();
			},  
			afterUpdateInternal: function(effect) {
				effect.element.down().setStyle(
					{right: (effect.dims[1] - effect.element.clientWidth) + 'px' }
				);
			},
			afterFinishInternal: function(effect) {
				effect.element.hide().undoClipping().undoPositioned();
				effect.element.down().undoPositioned();
			}
		}, arguments[1] || {})
	);
}

/* from SlideDown */
Effect.SlideRightIn = function(element) {
/*
	SlideRightIn needs to have the content of the element wrapped in a container element with fixed width!
*/
	element = $(element).cleanWhitespace();
	var elementDimensions = element.getDimensions();
	return new Effect.Scale(element, 100, 
		Object.extend({ 
			scaleContent: false, 
			scaleY: false, 
			scaleFrom: window.opera ? 0 : 1,
			scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
			restoreAfterFinish: true,
			afterSetup: function(effect) {
				effect.element.makePositioned();
				effect.element.down().makePositioned();
				if(window.opera) effect.element.setStyle({left: ''});
				effect.element.makeClipping().setStyle({width: '0px'}).show(); 
			},
			afterUpdateInternal: function(effect) {
				effect.element.down().setStyle({right: (effect.dims[1] - effect.element.clientWidth) + 'px' }); 
			},
			afterFinishInternal: function(effect) {
				effect.element.undoClipping().undoPositioned();
				effect.element.down().undoPositioned();
			}
		}, arguments[1] || {})
	);
}
