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\-\(\) ]/;
  // console.log(val.length < 1 || ( val.length > 7 && !pattern.test(val) ));
   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();
   // var error_div = parent.find("div#errors");
   $(element).addClass("error");
  /* if ($(element).prev("label").length > 0) {
      $(element).prev("label").addClass("error");
   } else {
      $(element).parents("li").children("label").addClass("error");
   }
   if (error_div.length <= 0) {
      parent.find("div:first").append("<div class=\"error\"><p class=\"large\">Error</p><p>Some information is missing or has not been entered correctly.</p></div>");
   } */
   //console.log(errors);//else {
      //var ul = parent.find("div:first ul:last");
      //if (ul.find("li:contains(" + label + ")").length <= 0) {
      //    ul.append("<li>" + label + "</li>");
      //}
   //}

}


			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");
   /*
   var label = $(element).siblings("label").text();
   var parent = $(element).parents("div.bg");
   var error_div = parent.find("div:first div.error");
   var ul = error_div.find("ul:last");
   var li = ul.find("li:contains(" + label + ")");
   $(element).removeClass("error");
   if ($(element).prev("label").length > 0) {
      $(element).prev("label").removeClass("error");
   } else {
      $(element).parents("li").children("label").removeClass("error");
   }

   error_div.remove();
   */
}
