
$(document).ready(function() {
    var emptyTexts = new Array();
    
    emptyTexts['email']   = 'e-mailadres';
    emptyTexts['company'] = 'bedrijfsnaam';
    emptyTexts['phone']   = 'telefoonnummer';
    emptyTexts['name']    = 'naam';
    emptyTexts['query']   = '... of zoek'; // site search in text snippet
    
    $('form.validate :input, #search_form :input').bind('click', function() {       
        var inputValue = $(this).val();
        
        // if initial value, clear field
        if (emptyTexts[$(this).attr('name')] && (inputValue == emptyTexts[$(this).attr('name')])) {
            $(this).val('');
        }
    });
    
    $('form.validate :input, #search_form :input').bind('blur', function () {
        
        var inputValue = $(this).val();
               
        // when field is left empty show initial value
        if(emptyTexts[$(this).attr('name')] && inputValue == '') {
            $(this).val(emptyTexts[$(this).attr('name')]);
        }    
    });

    // Valideert een formulierveld
    $('form :input').bind('paste blur', function () {

        var ajaxReturn = "true";
        var text;

        // check field that may not be left empty
        if ($(this).hasClass('NotEmpty') && ajaxReturn == "true") {
            ajaxReturn = $(this).ajaxValidation('notempty');
            if((ajaxReturn == "true") && ($(this).val() == emptyTexts['name'])) {
                ajaxReturn = "false";
            } 
            if((ajaxReturn == "true") && ($(this).val() == emptyTexts['company'])) {
                ajaxReturn = "false";
            } 
            text       = 'Dit veld is verplicht!';
        }        
        // check field that should contain a valid e-mail address
        if(($(this).hasClass('MX')) && ajaxReturn == "true") {
            if($(this).hasClass('NotEmpty')) {
                ajaxReturn = $(this).ajaxValidation('mx');
                text       = 'Vul een geldig e-mailadres in!';        
            } else {
                if(!($(this).val() == emptyTexts[$(this).attr('name')] || $(this).val() == '')) {
                    ajaxReturn = $(this).ajaxValidation('mx');
                    text       = 'Vul een geldig e-mailadres in!';    
                }
            }                          
        }     
        // check field that should contain a phone number
        if ($(this).hasClass('phone') && ajaxReturn == "true") {
            // do we need to check for non empty?
            if($(this).hasClass('NotEmpty')) {
                ajaxReturn = $(this).ajaxValidation('phone');
                text       = 'Vul een geldig telefoonnummer in!';
            } else {
                if(($(this).val() == emptyTexts['phone'])) {
                    ajaxReturn = "false";
                }
            }            
        }
        // check fields where one or another have to be valid
        if ($(this).hasClass('Either')) {
            // only check for second Either field.
            var secondElement = $("input.Either").last();            
            
            //@TODO: the assumption is made that the first field is dealt with 
            // before the second. While ideally you want to do it chronologically.    
            
            if($(this).equals(secondElement)) {
                // check whether at least one of the fields is valid. 
                var firstElement = $("input.Either").first();
                
                var validationType = 'mx'; //@TODO: dynamically assign from class
                
                var ajaxReturn1 = 'true';
                
                if( firstElement.val() == emptyTexts[firstElement.attr('name')] ||
                    firstElement.ajaxValidation(validationType) == 'false') {
                    ajaxReturn1 = 'false';
                } 
                
                validationType = 'phone'; //@TODO: dynamically assign from class
                var ajaxReturn2 = ajaxReturn; // phone is current element
                if( secondElement.val() == emptyTexts[secondElement.attr('name')] ||
                    secondElement.ajaxValidation(validationType) == 'false') {
                    ajaxReturn2 = 'false';
                } 
                ajaxReturn = 'true';
                if((ajaxReturn1 == 'false') && (ajaxReturn2 == 'false')) {
                    ajaxReturn = 'false';                    
                    text = emptyTexts[firstElement.attr('name')] + ' of ' + 
                        emptyTexts[secondElement.attr('name')] + ' moet ingevuld worden.';
                }
            }              
        }         
        // Verwijder de error.
        var fieldname = $(this).attr('id');
        
        $(this).parent().siblings('dt#'+fieldname +'-label').removeClass('error');
        $(this).parent().siblings('dt#'+fieldname +'-label').removeClass('accept');
        
        // tenzij offerteformulier (want die heeft labels) 
        // TODO: make more generic
        if('evisitQuoteForm' !==  $(this).parent().parent().parent().attr('id')) {
            $(this).parent().siblings('dt#'+fieldname +'-label').html('');
        }        

        if (ajaxReturn == 'false') {
            // Voegt een error toe aan het label van het veld.
            $(this).parent().siblings('dt#'+fieldname +'-label').addClass('error');            
            $(this).parent().siblings('dt#'+fieldname +'-label').append('<div class="errorbox">'+ text +'</div>');
        } else {
            $(this).parent().siblings('dt#'+fieldname +'-label').addClass('accept');
        }
    });

    $.fn.ajaxValidation = function(classname, match) {
        var ajaxReturn = $.ajax({
            url:      '/validation/ajax' + classname,
            type:     'POST',
            data:     ({value: $(this).val(), match: match}),
            dataType: 'html',
            async:    false
         }).responseText;
        return ajaxReturn;
    }

    $('form.validate').submit(function(event) {
        
        /* stop form from submitting normally */
        event.preventDefault(); 
        
        // Get form and fields
        var form    = $(this).parent().parent();
        var fields  = form.find('input');
        
        // Validate input
        fields.each(function() {
            $(this).blur();
        });

        // Check for errors
        var error = false;        
        
        form.find('dt').each(function() {
            if ($(this).hasClass('error')) {
                error = true;
            }
        });        

        // No errors, then submit form
        if (!error) {
            /* get some values from elements on the page: */
            var $form = $(this),
                url = $form.attr( 'action' );
                
            var dataString = $(this).serialize();    

            /* Send the data using post and put the results in a div */
            var scope = $(this);
            $.post(url, dataString,
              function(data) {
                  var messageHolder = $('<div></div>').addClass('messageBox');
                  
                  messageHolder.html(data.message);
                  
                  if (!data.success) {
                      messageHolder.addClass('error');
                  }
                  
                  $(scope).empty();
                  $(scope).closest('.block').append(messageHolder);
              }
            );
        }   
        return false;  
    });
    
    // compares two jquery elements
    $.fn.equals = function(compareTo) {        
        if (!compareTo || !compareTo.length || this.length!=compareTo.length)
        {
            return false;
        }
        for (var i=0; i<this.length; i++) {
            if (this[i]!==compareTo[i]) {
                return false;
            }
        }
        return true;
    } 

});
