function cd_liveValidate( elem, dict ){
   var field = cd_get_field(elem.attr("name"), dict);
   if (!field) {
      return true;
   }
   var errors = new Array();

   if (typeof field.maxChars != "undefined") {
      var error = is_less_than_x_chars( elem, field.maxChars );
      if( error ){
         errors[errors.length] = error;
      }
   }

   if (typeof field.maxWords != "undefined") {
      var error = is_less_than_x_words( elem, field.maxWords );
      if( error ){
         errors[errors.length] = error;
      }
   }

   if (typeof field.validate != "undefined") {
      if (field.validate.length > 1) {
         for (var i = 0; i < field.validate.length; i++) {
            var error = field.validate[i](elem);
            if( error ){
               errors[errors.length] = error;
            }
         }
      } else {
         var error = field.validate(elem);
         if( error ){
            errors[errors.length] = error;
         }
      }
   }
   if (errors.length == 0) {
      validate_pass(elem);
   } else {
      validate_fail(elem, errors);
   }
   return true;
}

function cd_get_field(name, dict) {
   return $(dict).filter(function () {return this.field == name;})[0];
}

function is_required(element) {

   var val = trim( element.val() );
   return val.length > 0 ? null : "This field is required";
}

function is_less_than_x_chars(element, maxChars) {
   var val = trim( element.val() );
   return val.length <= maxChars ? null : "Please enter fewer than " + maxChars + " characters";
}

function is_less_than_x_words(element, maxWords) {
   var val = trim( element.val() );
   var words = val.split(' ');
   return words.length <= maxWords ? null : "Please enter fewer than " + maxWords + " words";
}

function is_email(element) {
   var val = element.val();
   var pattern = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i;
   return ( pattern.test(val) ) ? null : "Please enter a valid email address";
}

function is_number(element) {
   var val = element.val();
   var pattern = /[^0-9]/;
   return ( val.length < 1 || !pattern.test(val) ) ? null : "Please enter a number";
}

function is_phone_number(element) {
   var val = element.val();
   var pattern = /[^0-9\-\(\) ]/;
   return ( val.length > 7 && !pattern.test(val) ) ? null : "Please enter a valid phone number" ;

}

function trim(val){
   return val.replace(/^\s+|\s+$/g, '');
}

function validate_fail(element, errors) {

   var labelId = element.attr('id') + "_error";
   $("#"+labelId).text( "" );
   for (var i = 0; i < errors.length; i++) {
      $("#"+labelId).html( $("#"+labelId).html() + errors[i] + "<br/>" );
   }
   var label = $(element).siblings("label").text();
   if (element) $(element).addClass("error");
}


			function countChars(y){
				return y.length;
			}

			function countWords(y){
				var r = 0;
				a=y.replace(/\s/g,' ');
				a=a.split(' ');
				for (z=0; z<a.length; z++) {if (a[z].length > 0) r++;}
				return r;
			}

			function bindLimit(el,options) {

				el.bind('keyup blur focus', function(e) {

					if (options.words) {
						cnt=countWords;
						max=options.words;
					} else {
						cnt=countChars;
						max=options.chars;
					}

					el.siblings('.limit').html( cnt( el.val() ) + "/" + max.toString());
					if ( cnt( el.val() ) > max ) {
						el.addClass('error');
					} else {
						el.removeClass('error');
					}
             	});

			}


function validate_pass(element) {

   var labelId = element.attr('id') + "_error";
   $("#"+labelId).text( "" );
   $(element).removeClass("error");

}