var boxvalue;
function clearbox(box){
	if(!boxvalue){
		boxvalue=box.value;
		box.value='';
	}else if(!box.value){
		box.value=boxvalue;
		boxvalue='';
	}
}

function array_search(needle,haystack){
	for(var i=0;i<haystack.length;i++){
		if(needle==haystack[i])return i;
	}
	return false;
}

function in_array(needle,haystack){
	if(array_search(needle,haystack)!==false)return true;
	else return false;
}

function trim(str,charlist,dir){
  chars=!charlist?[]:charlist.split('');
  chars=chars.concat([' ',"\t"]);
  for(var i=0;i<chars.length;i++){
    if(!dir||dir==1)if(str.indexOf(chars[i])==0)str=str.substring(1,str.length-1);
    if(!dir||dir==2)if(str.lastIndexOf(chars[i])==str.length-1)str=str.substring(0,str.length-1);
  }
  return str;
}

function ltrim(str,charlist){
  return trim(str,charlist,1);
}

function rtrim(str,charlist){
  return trim(str,charlist,2);
}

var Filter=Class.create({
  fields:new Array(),
  classname:'invalid',
  _element:null,
  
  initialize:function(required){
    this.fields=required;
  },

  validate:function(e){
    if(e.srcElement)form=e.srcElement;
    else form=e.target;
    // Clear previous error messages
    // var errors=form.getElementsByTagName('span');
    // for(var i=0;i<errors.length;i++){
      // if(Element.hasClassName(errors[i],this.classname)){
        // Element.remove(errors[i]);
      // }
    // }
    var valid=true;
    for(var i=0;i<form.length;i++){
      this._element=form.elements[i];
      // Check for emptiness in required fields
      var check=array_search(this._element.name,this.fields);
      if(check!==false){
        if(this._element.value.length==0){
          if(
            (this.fields[check]=='state'&&form.elements['country'].value!='US')||
            (this.fields[check]=='province'&&form.elements['country'].value!='CA')
          )continue;
          this._error('Field is required');
          valid=false;
          continue;
        }
      }
      // Simple email validation
      if(this._element.name=='email'){
         if(!this.email(this._element.value)){
          this._error('Invalid email address');
          valid=false;
          continue;
        }
      }
    }
    if(valid)this.js(form);
    e.returnValue=valid;
    return valid;
  },
  
  // http://www.hexillion.com/samples/#Regex
  email:function(address){
    return address.match(/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/)===null?false:true;
  },
  
  label:function(form){
    var labels=form.getElementsByTagName('label');
    var name='Field';
    for(var i=0;i<labels.length;i++){
      if(labels[i].htmlFor==this._element.id)
        name=labels[i].innerHTML;
    }
    return name;
  },
  
  js:function(form){
    if(form.elements['js'])form.elements['js'].value='true';
  },
  
  fill:function(form,values){
    for(var i=0;i<form.length;i++){
      var element=form.elements[i];
      var value=values[element.name]?values[element.name]:'';
      switch(element.type){
        default:element.value=value;break;
        case'submit':case'reset':case'button':continue;break;
        case'checkbox':element.checked=!!value;
      }
    }
  },
  
  _error:function(msg){
    var p=this._element.parentNode.parentNode;
    var errors=p.getElementsByTagName('span');
    var msg=document.createTextNode(msg);
    if(!errors[0].hasClassName(this.classname)){
      var message=document.createElement('span');
      var sub=document.createElement('span');
      Element.addClassName(sub,'error');
      sub.appendChild(msg);
      message.appendChild(sub);
      Element.addClassName(message,this.classname);
      p.insertBefore(message,errors[0]);
    }
    return true;
  }
});

function advance(input){
	if(input.value.length==input.maxLength){
		var elems=input.form.elements;
		for(var i=0;i<=elems.length;i++){
			if(elems[i]==input){
				input.blur();
				while(!elems[i+1].type)i++;
				elems[i+1].focus();
				return;
			}
		}
	}
}

function buynow(e){
  var href;
  if(e.srcElement)href=e.srcElement.href;
  else if (e.target)href=e.target.href;
  window.open(href,'buynow');
  e.returnValue=false;
  return false;
}

var filterform=new Filter([
  'email',  'firstname',     'lastname',
  'country','address[line1]','city',
  'state',  'province',      'postal',
  'message'
]);
