function setFormListeners() {

    var event = YAHOO.util.Event;
    var dom   = YAHOO.util.Dom;

    var e = dom.get('contactEmail');
    var m = dom.get('contactMessage');

    var stopSend = false;

    function isMailValid(email) {
        email = email.replace(/^\s*/, "").replace(/\s*$/, "");
        var reEmail = new RegExp(/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/);
        return reEmail.test(email);
    }

    function isEmpty(msg) {

    	if (msg.length === 0)
    		return true;

    	for (var i=0; i < msg.length; i++) {
    		if (msg.substring(i,i+1) != ' ') {
    		  return false;
            }
    	}

    	return true;
    }
    
    function sendMessage() {
        
        if (stopSend) {
            return;
        }
        
        var ev = _validateMail(e);
        
        var mv = validateMessage(m);
        
        if (!ev || !mv) {            
            return;
        }
        
        Effect.Puff('contactEmail', {duration:0.2}); 
        Effect.Puff('contactMessage', {duration:0.2});                 
                      
        var email  	 = e.value.replace('&', 'and');
		var message  = m.value.replace('&', 'and');
		var postdata = 'email=' + email + '&message=' + message;

		var handleFailure = function(o) {  
		    dom.get('contactFormFeedback').innerHTML = 'Network Problems: Please try later.';
            Effect.Appear("contactFormFeedback", { duration: 0.3 });
		};

		var handleSuccess = function(o) {
			var resp = YAHOO.lang.JSON.parse(o.responseText);
            
			dom.setStyle([e, m], "display", "block");

			stopSend = false;
			
			if (resp.success == 'true') {
                 dom.setStyle('textFeedback', 'display', 'none');
                 dom.setStyle('emailFeedback', 'display', 'none');			
			     e.value = '';
			     m.value = '';
                _setPlaceHolder(e);
                _setPlaceHolder(m);
			} 
			
		    dom.get('contactFormFeedback').innerHTML = resp.message;
		    Effect.Appear("contactFormFeedback", { duration: 0.3 }); 

		}

		var callback = { success: handleSuccess, failure: handleFailure };

        stopSend = true;

		YAHOO.util.Dom.setStyle('sendMessageButton', "disable", "true");
		var request = YAHOO.util.Connect.asyncRequest('POST', '/contactForm/', callback, postdata);
        
    }
    
    function mailOnChange() {
        if (isMailValid(this.value)) {
           dom.setStyle('emailFeedback', 'display', 'block');            
           dom.removeClass('emailFeedback', 'userFeedBackNegative');
           dom.addClass('emailFeedback', 'userFeedbackPositive');
        }
    }
    
    function validateMail() {
        return _validateMail(this);
    }
    
    function _validateMail(emailField) {            
        dom.setStyle('emailFeedback', 'display', 'block');
        _hidePlaceHolder(emailField);        
        var ret;

        if (isMailValid(emailField.value)) {
            dom.removeClass('emailFeedback', 'userFeedBackNegative');
            dom.addClass('emailFeedback', 'userFeedbackPositive');
            ret = true;
        } else {
            dom.removeClass('emailFeedback', 'userFeedbackPositive');
            dom.addClass('emailFeedback', 'userFeedbackNegative');
            ret = false;
        }
        
        _setPlaceHolder(emailField);
        return ret;
    }
    
    
    function messageOnChange() {
        if (!isEmpty(this.value)) {
           dom.setStyle('textFeedback', 'display', 'block');            
           dom.removeClass('textFeedback', 'userFeedBackNegative');
           dom.addClass('textFeedback', 'userFeedbackPositive');
        }
    }
        
    function _validateMessage() {
        return validateMessage(this);
    }
    
    function validateMessage(messageField) {
        dom.setStyle('textFeedback', 'display', 'block');
        _hidePlaceHolder(messageField);
        var ret;
                
        if (isEmpty(messageField.value)) {
            dom.removeClass('textFeedback', 'userFeedbackPositive');
            dom.addClass('textFeedback', 'userFeedbackNegative');
            ret = false;
        } else {
            dom.removeClass('textFeedback', 'userFeedbackNegative');
            dom.addClass('textFeedback', 'userFeedbackPositive');
            ret = true;
        }
        
        _setPlaceHolder(messageField);
        return ret;
    }
    
    /* place holders */
    
    function hidePlaceHolder() {
        _hidePlaceHolder(this);
    }
    
    function _hidePlaceHolder(element) {
        
        if (element.value.toLowerCase() == element.title.toLowerCase()) {
            element.value = '';
            dom.setStyle(element, 'color', '#333');
        }
    }

    function setPlaceHolder() {
        _setPlaceHolder(this);
    }
    
    function _setPlaceHolder(element) {
        if (isEmpty(element.value) || element.value.toLowerCase() == element.title.toLowerCase()) {
            element.value = element.title;
            dom.setStyle(element, 'color', '#ACB9B5');
        } else {
            dom.setStyle(element, 'color', '#333');
        }
    }

    event.addListener('sendMessageButton', 'click', sendMessage);
    event.addListener(e     , 'blur', validateMail);
    event.addListener(m     , 'blur', _validateMessage);
    event.addListener(e     , 'keyup', mailOnChange);
    event.addListener(m     , 'keyup', messageOnChange);
                
    event.addListener([e, m], 'focus', hidePlaceHolder);
    event.addListener([e, m], 'blur' , setPlaceHolder);
    
    //refresh cleaning
    e.value = '';
    m.value = '';
    
    _setPlaceHolder(e);
    _setPlaceHolder(m);
    
}