(function() {
Tapestry.onDOMLoaded = function(callback)
{
	var browser=navigator.appName;
	if (browser!=null && browser.indexOf("Microsoft")>-1){
		// calling the direct callback for ie many many problems with the different onDOMLoad solution
		if (document.loaded) {
			callback();
		} else {
			document.observe("dom:loaded", callback);
		}
	} else {
		document.observe("dom:loaded", callback);
	}
}
	
var orgInitializer = Object.clone(Tapestry.Initializer);

Object.extend(Tapestry.Initializer, {
	validate: function(field, specs) {
		field = $(field);

		if (!field.getFieldEventManager) {
			field.form = field.up("form");
			var hidden = new Element("input", {type: "hidden"});
			field.insert({top: hidden});
			$T(hidden).fieldEventManager = new Tapestry.FieldEventManager(field);
			return orgInitializer.validate.call(this, hidden, specs);
		}

		return orgInitializer.validate.apply(this, arguments);
	}
});

/*var orgShowValidationMessage = Tapestry.FieldEventManager.prototype.showValidationMessage;

Tapestry.FieldEventManager.addMethods({
	showValidationMessage: function(message) {
		var texts = message.split("\u001E");
		message = texts[1] ? texts[1] : texts[0];

		orgShowValidationMessage.call(this, message);
	}
});*/

Tapestry.FieldEventManager.addMethods({
	validateInput: function() {
        if (this.field.disabled) return false;

        if (! this.field.isDeepVisible()) return false;

        var t = $T(this.field);

        if (this.field.hasClassName("control-group")) {
    		var value = this.field.select("input")
    				.map(function(item) {return $F(item)});
        } else {
        	try{
        		var value = $F(this.field);
        	}catch(e){
        		return true;
        	}
        }

        t.validationError = false;

        if (this.requiredCheck)
            this.requiredCheck.call(this, value);

        // Don't try to validate blank values; if the field is required, that error is already
        // noted and presented to the user.

        if (!t.validationError && !isEmptyValue(value))
        {
            var translated = this.translator(value);

            // If Format went ok, perhaps do the other validations.

            if (! t.validationError)
            {
                this.field.fire(Tapestry.FIELD_VALIDATE_EVENT, {
                    value: value,
                    translated: translated
                });
            }
        }

        // Lastly, if no validation errors were found, remove the decorations.

        if (! t.validationError)
            this.removeDecorations();

        return t.validationError;
	}
});

var emailAddrRegex;
Object.extend(Tapestry.Validator, {
	required : function(field, message) {
        $(field).getFieldEventManager().requiredCheck = function(value) {
            if (isEmptyValue(value))
                $(field).showValidationMessage(message);
        };
    },
    email : function(field, message, emailPattern) {
    	if (emailAddrRegex == undefined)
    		emailAddrRegex = new RegExp(emailPattern);

        field.addValidator( function(value) {
            if (!emailAddrRegex.test(value)) {
            	throw message;
            }
        });
    },
    multiemail : function(field, message, emailPattern) {
    	// separate e-mails by commas
    	if (emailAddrRegex == undefined)
    		emailAddrRegex = new RegExp(emailPattern);

    	field.addValidator( function(value) {
			if (!emailAddrRegex.test(value)) {
				throw message;
			}
        });
    },
    alphadigit : function(field, message, numberPattern) {
        var regexp = new RegExp(numberPattern);

        field.addValidator( function(value) {

            if (!regexp.test(value)) {
            	throw message;
            }
        });
    },
    alpha : function(field, message, numberPattern) {
        var regexp = new RegExp(numberPattern);

        field.addValidator( function(value) {

            if (!regexp.test(value)) {
            	throw message;
            }
        });
    },
    digit : function(field, message, numberPattern) {
        var regexp = new RegExp(numberPattern);

        field.addValidator( function(value) {

            if (!regexp.test(value)) {
            	throw message;
            }
        });
    },
    login : function(field, message, pattern) {
        var regexp = new RegExp(pattern);

        field.addValidator( function(value) {
            if (!regexp.test(value)) {
                throw message;
            }
        });
    }
});

function isEmptyValue(value) {
	if (Object.isArray(value)) {
		value = value.join("");
	}

	return value.blank();
}

function trim(s) {
	if (s) {
		return s.replace(/^\s*/, "").replace(/\s*$/, "");
	}
}

})();

