
var validateForm = function(id,callback){
    try {
	var target = new glow.forms.Form(glow.dom.get(id),{

		onValidate:function(results){

			if(results.errorCount>0){

                                var error = new Object();
				var form = target.formNode;
				var fields = results.fields;

				this.feedback = function(error){
					if(typeof error != "object") return null;
					return {
						name:error.name,
						message:error.message
					}
				};

				var i=0;

				do{
					if(fields[i].result==0){
						// flatten duplicates to report one error at a time.
						var obj = this.feedback(fields[i]);
						error[obj.name]=obj;
					}
					i++;
				} 
				while(i<fields.length)

				if(typeof callback != "function"){
				
					if(error){
	
						var status = form.get(".status");
	
						if(status.length>0)
							status.remove();
	
						status = glow.dom.create('<p class="status"><!--v--></p>').prependTo(form);
	
						form.get("input,textarea").each(function(){
							form.get(this).prev().removeClass("err");
						});
	
						for (var e in error){
							var label = form.get("#"+error[e].name).prev().addClass("err").text().split(":")[0];
							var message = error[e].message.toLowerCase();
							status.prepend('<span class="err">'+label+' '+message+'</span>');
						}
	
					}

                            } else {
					// callback
					
					if(results){
						results.__error = error;
					}

					callback(results);
			   }

				return false;

			}

			return true;

		}

	});

        var form_fields = target.formNode.get("input,textarea,select");

        if (form_fields.length > 0) {

            // Filter out duplicate form fields so that only one error will be output.
            
            var field_names = new Array();
            form_fields = form_fields.filter(function (f) {
                    var keep = true;
                   
                    for (var n = 0; n < field_names.length; n++) {
                        if (field_names[n] == this.name) {
                            keep = false;
                            break;
                        }
                    }

                    if (keep)
                        field_names.push(this.name);

                    return keep;
                }
            );
            
            form_fields.each(function(i){

                    var cls=this.className||false;

                    this.check_length = function(field,form){

                            var count = field.value.length;
                            var counter = form.get(field).next().get(".counter");

                            counter.text(count+"/");
                            glow.events.addListener(field, 'keyup', function (e) {
                                    counter.text(e.attachedTo.value.length+"/");
                            });

                    };

                    if(cls){

                            var spec = new Array(),
                            length,regex;

                            if(/isEmail\b/.test(cls)){
                                    spec.push(["regex", {arg: /@(?!bbc.co.uk).+$/i, message:"NB you cannot use a BBC email address in this form "}]);
                                    spec.push(["isEmail", {message:"must be a valid email address "}]);
                            }

                            if(/isMaxLen-([\d]+)\b/.test(cls)){
                                    length = parseInt(cls.match(/isMaxLen-([\d]+)/)[1]||0);
                                    spec.push(["maxLen",{arg:length, message:"the value is too long "}]);
                                    this.check_length(this,target.formNode);
                            }

                            if(/isMinLen-([\d]+)\b/.test(cls)){
                                    length = parseInt(cls.match(/isMinLen-([\d]+)/)[1]||0);
                                    spec.push(["minLen",{arg:length, message:"the value is too short "}]);
                            }

                            if(/isDate\b/.test(cls)){
                                    regex = /^[\d]{4}\/[\d]{2}\/[\d]{2}$/;
                                    spec.push(["regex",{arg:regex, message:"must be a valid date yyyy/mm/dd "}]);
                            }

                            if(/isNumber\b/.test(cls)){
                                    spec.push(["isNumber", {message:"must be a valid number "}]);
                            }

                            if(/isString\b/.test(cls)){
                                    regex = /^[0-9a-zA-Z\.,'"?@%$£()\-]+$/;
                                    spec.push(["regex",{arg:regex, message:"must be a valid string "}]);
                            }

                            // The order of this seems to matter so always add the 'required' test last.

                            if(/isRequired\b/.test(cls)){
                                if ((this.tagName == "SELECT") || ((this.tagName == "INPUT") && (this.type == "radio")))
                                    spec.push(["required", {message:"please select a value "}]);
                                else if ((this.tagName == "INPUT") && (this.type == "checkbox"))
                                    spec.push(["required", {message:"please tick this box "}]);
                                else
                                    spec.push(["required", {message:"please enter a value "}]);
                            }

                            // process validation tests.
                            if(spec.length > 0){
                                    for (var t = 0; t < spec.length; t++) {
                                            target.addTests(this.name,spec[t]);
                                    }
                            }

                            return;

                    }

            });
        }

    }
    catch (e) {
    }

}

