var cbLastTimeout = null;

function cbSetInputSubmit(button, submit)
{

    if (submit == undefined)
        submit = false;

    var jbutton = $(button);

    if (jbutton.attr('cbAction'))
    {
        $('input[id=cbButtonId]').remove();
        $('input[id=cbButtonParameter]').remove();
        $('input[id=cbButtonName]').remove();
        var buttonId = $('<input type="hidden" id="cbButtonId" name="cbButtonId">');
        buttonId.val(button.getAttribute('id'));
        consoleLog('Setting buttonId: ' + buttonId.val());

        var buttonParameter = $('<input type="hidden" id="cbButtonParameter" name="cbButtonParameter">');
        buttonParameter.val(button.getAttribute('parameter'));
        consoleLog('Setting button parameter: ' + buttonParameter.val());

        var buttonName = $('<input type="hidden" id="cbButtonName" name="cbButtonName">');
        consoleLog('Setting button name: ' + button.getAttribute('name'));
        buttonName.val(button.getAttribute('name'));

        var formElement = jbutton.attr('form');
        var form;
        if (formElement==undefined)
        {

            form = jbutton.parents('form:first');
        }
        else
        {
            form = $(formElement);
        }

        form.append(buttonId);
        form.append(buttonName);
        form.append(buttonParameter);


        //alert(form.parent().html());

        var paths = form.attr('action').split('/');//location.pathname.split("/");

        if (paths[1]=='')
        {
            paths[1]=form.attr('cbModuleName');
        }

        paths[2]= jbutton.attr('cbAction');
        var path = '';
        for (var i = 1; i < paths.length; i++)
        {
            path += '/' + paths[i];
        }

        form.attr('action',path);

     
        if (jbutton.attr('confirm'))
        {
            cbConfirm(jbutton);
            return false;
        }
        else if (submit)
        {
            form.submit();
        }
    }
}


function cbForm(form)
{

    this.form = form;
    this.validate = function()
    {
        var buttonId = $('#cbButtonId').val();
        var button = undefined;
    
        if (buttonId != undefined && $.trim(buttonId).length>0)
            button = $('#'+buttonId);

       
        if (button == undefined || button.attr('cbIgnoreHandler')==undefined || button.attr('cbIgnoreHandler')!='true')
        {
            var handler = $(this.form).attr('cbHandler');

            if (handler != undefined && handler.length>0)
            {
                var rules = window[this.form.id + '_formrules'];
                var options = window[$(this.form).attr('cbFormHandlerOptions')];
                var validate = true;
                if (options.options.validation!=undefined && options.options.validation.onsubmit != undefined && typeof(options.options.validation.onsubmit)=='boolean' && !options.options.validation.onsubmit)
                    validate = false;

                if (!cbFormsHandler.handle(rules,options,this.form,validate))
                    return false;
            }
        } 

       
        
        if (button != undefined && button.attr('cbValidation'))
        {
            try
            {
                var validationFunction = button.attr('cbValidation');
                consoleLog('Validation function found on button: '  + validationFunction );
                var valid = (window[validationFunction](form));
                if (!valid)
                    return false;
            }
            catch(exception)
            {
                consoleLog('Error in validation:' + exception);
                return false;
            }
        }
        

        if ($(this.form).attr('cbValidation'))
        {
            try
            {
                var validationFunction = $(this.form).attr('cbValidation');
                consoleLog('Validation function found: '  + validationFunction );
                var valid = (window[validationFunction](form));
                if (!valid)
                    return false;
            }
            catch(exception)
            {
                consoleLog('Error in validation:' + exception);
                return false;
            }
            
        }
        if ($(this.form).attr('ajax')=='true')
        {
            consoleLog('Submitting form via AJAX');
            this.submitAjax();
            return false;
        }



        var formGuid = $('<input name="cbViewState" type="hidden"/>');
        formGuid.attr('value',$(this.form).attr('cbViewState'));
        $(this.form).append(formGuid);


        if ($(this.form).attr('cbPreSubmit'))
        {
            try
            {
                var preSubmitFunction = $.trim($(this.form).attr('cbPreSubmit'));
                if (preSubmitFunction.length>0)
                {
                    consoleLog('Presubmit function available: ' + preSubmitFunction);
                    if (window[preSubmitFunction]!=undefined)
                    {
                        window[preSubmitFunction]();
                    }
                    else
                    {
                        consoleLog('Function not found.');
                    }

                }
            }
            catch(exception)
            {
                consoleLog('Error in presubmit:' + exception);
                return false;
            }
        }

        return true;
    }

    this.submitAjax = function()
    {
        //var guid = ($('meta[name="cbViewState"]').attr('content'));
        var guid = $(this.form).attr('cbViewState');
        var self = $(this.form);
        
        var buttonId = $('input[id=cbButtonId]',this.form).val();
        var button = undefined;
        if (buttonId != undefined && $.trim(buttonId).length>0 && $('#'+buttonId).length>0)
        {
            button = $('#'+buttonId);
        }

        //ResponseType may be form, text or json
        var responseType = 'form';
        var dataType = null;

        if ($(this.form).attr('ajax_response'))
        {

            responseType = $(this.form).attr('ajax_response');
            if (responseType == 'json')
                dataType = 'json';

        }
        
        if (button != undefined && button.attr('ajax_response'))
        {
            responseType = button.attr('ajax_response');
            if (responseType == 'json')
                dataType = 'json';
                
        }
        
        
        consoleLog('Form responsetype is ' + responseType);

        //alert($(this.form).serialize() + "&cbViewState="+guid);
        //Todo: Place presubmit in beforeSend method
        if ($(this.form).attr('cbPreSubmit'))
        {
            
            try
            {
                var preSubmitFunction = $.trim($(this.form).attr('cbPreSubmit'));
                if (preSubmitFunction.length>0)
                {
                    consoleLog('Presubmit function available: ' + preSubmitFunction);
                    if (window[preSubmitFunction]!=undefined)
                    {
                        window[preSubmitFunction]();
                    }
                    else
                    {
                        consoleLog('Function not found.');
                    }

                }
            }
            catch(exception)
            {
                consoleLog('Error in exception:' + exception);
                return false;
            }            
            
        }

        if ($('input[type=file]',$(this.form)).length==0)
        {
            consoleLog('Regular form, posting via ajax');

            $.ajax({
                url: self.attr('action'),
                type: "POST",
                dataType: dataType,
                beforeSend: function(xhr , s)
                {
                    if ($(form).attr('cbBlockUI') || (button != undefined &&  button.attr('cbBlockUI')))
                    {
                        try
                        {
                            var blockFunction;
                           
                            if (button != undefined && button.attr('cbBlockUI'))
                                blockFunction = button.attr('cbBlockUI');
                            else
                                blockFunction = $(form).attr('cbBlockUI');

                            consoleLog('Block function found: '  + blockFunction );
                            if (window[blockFunction]==undefined)
                            {
                                consoleLog('Block function does not exists');
                                cbForm.performBlockUI(form);
                            }
                            else
                            {
                                window[blockFunction](form);
                            }
                        }
                        catch(exception)
                        {
                            consoleLog('Error in blocking: ' + exception);
                            return false;
                        }                        
                    }
                    else
                    {
                        cbForm.performBlockUI(form);
                    }
                
                   
                
                    //self.html('<img src="/cbjs/spinner.gif">');
                    xhr.setRequestHeader('CB_FORM',self.attr('id'));
                },
                success: function(response)
                {
                    
                    if ($(form).attr('cbUnblockUI') || (button != undefined &&  button.attr('cbUnblockUI')))
                    {
                        try
                        {
                            var blockFunction;
                            if (button != undefined && button.attr('cbUnblockUI'))
                                blockFunction = button.attr('cbUnblockUI');
                            else
                                blockFunction = $(form).attr('cbUnblockUI');
                            
                            consoleLog('Unblock function found: '  + blockFunction );
                            if (window[blockFunction]==undefined)
                            {
                                consoleLog('Unblock function does not exists');
                                $.unblockUI();
                            }
                            else
                            {
                                window[blockFunction](form);
                            }
                        }
                        catch(exception)
                        {
                            consoleLog('Error in blocking: ' + exception);
                            return false;
                        }                        
                    }
                    else
                    {
                        $.unblockUI();
                    }
                
                    
                    


                    if (responseType=='form')
                    {
                        self.after(response).remove();
                    }
                    else
                    {
                        $('input[type=password]', self).val('');
                    }
                    
                    if (button != undefined && button.attr('onsuccess'))
                    {
                        consoleLog('Button onsuccess function found: ' + button.attr('onsuccess'));
                        window[button.attr('onsuccess')](self,response,button)
                        
                    }

                    if (self.attr('onsuccess'))
                    {
                        consoleLog('Onsuccess function found: ' + self.attr('onsuccess'));
                        window[self.attr('onsuccess')](self,response)
                    }

                },

                data: $(this.form).serialize() + "&cbViewState="+guid

            }

            );
        }
        else
        {
            consoleLog('Ajax form contains files');

            //self.post_form(self.attr('action'), function(r){alert('done'); })
            self.ajaxSubmit({
                dataType: dataType,
                beforeSubmit: function(xhr , s)
                {

                    var formGuid = $('<input name="cbViewState" type="hidden"/>');
                    formGuid.attr('value',self.attr('cbViewState'));

                    self.append(formGuid);

                    //Todo: Also remove this field if for some strange reason the form changes from ajax to non-ajax in between requests.
                    if ($('input[name=cbXmlHttpRequest]').length==0)
                    {
                        var cbXmlHttpRequest = $('<input name="cbXmlHttpRequest" type="hidden" value="true"/>');
                        self.append(cbXmlHttpRequest);
                    }
                    //Todo: Also remove this field if for some strange reason the form changes from ajax to non-ajax in between requests.
                    if ($('input[name=cbXmlHttpFormId]').length==0)
                    {
                        var cbXmlHttpFormId = $('<input name="cbXmlHttpFormId" type="hidden" value="true"/>');
                        cbXmlHttpFormId.val(self.attr('id'));
                        self.append(cbXmlHttpFormId);
                    }



                    if ($(form).attr('cbBlockUI') || (button != undefined &&  button.attr('cbBlockUI')))
                    {
                        try
                        {
                            var blockFunction;
                            if (button != undefined && button.attr('cbBlockUI'))
                                blockFunction = button.attr('cbBlockUI');
                            else
                                blockFunction = $(form).attr('cbBlockUI');
                            consoleLog('Block function found: '  + blockFunction );
                            if (window[blockFunction]==undefined)
                            {
                                consoleLog('Block function does not exists');
                                cbForm.performBlockUI(form);
                            }
                            else
                            {
                                window[blockFunction](form);
                            }
                        }
                        catch(exception)
                        {
                            consoleLog('Error in blocking: ' + exception);
                            return false;
                        }                        
                    }
                    else
                    {
                        cbForm.performBlockUI(form);
                    }
                
                    
                //self.html('<img src="/cbjs/spinner.gif">');
                //xhr.setRequestHeader('CB_FORM',self.attr('id'));
                },
                success: function(response)
                {
                    if ($(form).attr('cbUnblockUI') || (button != undefined &&  button.attr('cbUnblockUI')))
                    {
                        try
                        {
                            var blockFunction;
                            if (button != undefined && button.attr('cbUnblockUI'))
                                blockFunction = button.attr('cbUnblockUI');
                            else
                                blockFunction = $(form).attr('cbUnblockUI');
                            consoleLog('Unblock function found: '  + blockFunction );
                            if (window[blockFunction]==undefined)
                            {
                                consoleLog('Unblock function does not exists');
                                $.unblockUI();
                            }
                            else
                            {
                                window[blockFunction](form);
                            }
                        }
                        catch(exception)
                        {
                            consoleLog('Error in blocking: ' + exception);
                            return false;
                        }                        
                    }
                    else
                    {
                        $.unblockUI();
                    }

                    if (responseType=='form')
                    {
                        self.after(response).remove();
                    }
                    else
                    {
                        $('input[type=password]', self).val('');
                    }
                    
                    if (button != undefined && button.attr('onsuccess'))
                    {
                        consoleLog('Button onsuccess function found: ' + button.attr('onsuccess'));
                        window[button.attr('onsuccess')](self,response)
                        
                    }
                    
                    if (self.attr('onsuccess'))
                        window[self.attr('onsuccess')](self,response)

                }
            });
        }
        return false;

    }



};

cbForm.performBlockUI = function(form)
{
    if (cbForm.blockUI != undefined)
    {
        if (cbForm.blockUI.target != undefined)
            $(cbForm.blockUI.target).block(cbForm.blockUI);
        else
            $.blockUI(cbForm.blockUI);
    }
    else
    {
        $.blockUI(cbForm.blockUIDefaultOptions);
    }    
}

cbForm.numeric =
{
    decimalSeperator: '.',
    digitSeperator: ',',
    digitCount: 3
}

cbForm.setDefaultLanguage = function()
{
      
    var lang = (window.navigator.language);
    if (lang==undefined)
        lang = window.navigator.userLanguage;
    if (lang == undefined)
        lang = 'en';
    $.ajax({
        url: '/cbjs/tokenizer/lang/lang.' + lang + '.json',
        dataType: "json",
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            $.ajax({
                url: '/cbjs/tokenizer/lang/lang.' + lang.substring(0,2) + '.json',
                dataType: "json",
                error: function(XMLHttpRequest, textStatus, errorThrown)
                {
                    $.ajax({
                        url: '/cbjs/tokenizer/lang/lang.en.json',
                        dataType: "json",
                        error: function(XMLHttpRequest, textStatus, errorThrown)
                        {
                            cbForm.loadingLanguage = false;
                           
                            $('input[type!=submit]').live('keypress',function(e){         
                                return cbForm.onEnter(this,e);
                            });

                        },
                        success: function(data){
                         
                            cbForm.messages = data;
                            cbForm.loadingLanguage = false;
                            cbForm.setFormHandlers();

                        }
                    })

                },
                success: function(data){
                 
                    cbForm.messages = data;
                    cbForm.loadingLanguage = false;
                    cbForm.setFormHandlers();



                }
            })
        },
        success: function(data){
             
            cbForm.messages = data;
            cbForm.loadingLanguage = false;
            cbForm.setFormHandlers();


        }
    })

}



cbForm.setLanguage = function()
{
    var lang = $('meta[name=cbLanguage]').attr('value');

    //    if (cbForm.loadingLanguage != undefined && cbForm.loadingLanguage)
    //    {
    //        setTimeout('cbForm.setLanguage(\''+value+'\')', 500);
    //        return;
    //    }
    //    cbForm.loadingLanguage = true;


    if (lang == undefined)
    {
        cbForm.setDefaultLanguage();
    }
    else
    {
          
        $.ajax({
            url: '/cbjs/tokenizer/lang/lang.'+lang+'.json',
            dataType: "json",
            error: function(XMLHttpRequest, textStatus, errorThrown)
            {
                
                cbForm.setDefaultLanguage();
            },
            success: function(data){
             
               
                cbForm.messages = data;
                cbForm.loadingLanguage = false;
                cbForm.setFormHandlers();

            }
        })

    }
    

}

cbForm.setFormHandlers = function()
{   
    $('form[cbviewstate]').each(function(n,e)
    {
        if ($(e).attr('formevents_set')=='true')
            return;
        else 
            $(e).attr('formevents_set','true');
        $('input[type!=submit]',e).live('keypress',function(e){         
            return cbForm.onEnter(this,e);
        });    
    });
 
    $('form[cbHandler]').each(function (n,e)
    {
        if ($(e).attr('formhanlder_set')=='true')
            return;
        else 
            $(e).attr('formhanlder_set','true');
        var h = $(e).attr('cbHandler');
        $.getJSON(h,function(a,b){
            //todo: chicken egg...

            window[e.id + '_formrules']=a;
            //Check if onload validation is necessary and perform rules onload
            var options = window[$(e).attr('cbFormHandlerOptions')];

            var validate = true;
            if (options.options.validation!=undefined && options.options.validation.onload != undefined && typeof(options.options.validation.onload)=='boolean' && !options.options.validation.onload)
                validate = false;

            cbFormsHandler.handle(a,options,e,validate);
        });

        $('input[type=text]',e).live('blur',function(){
            cbFormsHandler.onBlur(this,this.form)
        });
        $('input[type=password]',e).live('blur',function(){
            cbFormsHandler.onBlur(this,this.form)
        });
        $('input[type=radio]',e).live('change',function(){
            cbFormsHandler.onChange(this,this.form)
        });
        $('input[type=checkbox]',e).live('change',function(){
            cbFormsHandler.onChange(this,this.form)
        });
        $('select',e).live('change',function(){
            cbFormsHandler.onChange(this,this.form)
        });
   
        

    });

}


cbForm.setNumeric = function(decimalSeperator, digitSperator, digitCount)
{
   
    cbForm.numeric.decimalSeperator = decimalSeperator;
    cbForm.numeric.digitSeperator = digitSeperator;
    cbForm.numeric.digitCount = digitCount;
}

/**
 *  Currency is always considered to be a positive value.
 */
cbForm.validateCurrency = function(value)
{
    return cbForm.validateNumberic(value, true, 2);
}

cbForm.validateUnsignedNumeric = function(value, decimals)
{
    return cbForm.validateNumberic(value, true, decimals);
}

cbForm.validateNumeric = function(value, unsigned, decimals)
{
    if (unsigned == undefined)
        unsigned = false;

    

    if ($.trim(value).length==0)
        return true;

    var digitSeperator = cbForm.numeric.digitSeperator.replace('.','\\.');
    var decimalSeperator = cbForm.numeric.decimalSeperator.replace('.','\\.');

    var match = '^';
    if (!unsigned)
        match += '(-){0,1}';
    match += '([0-9]+)(' + digitSeperator;
    for (var i = 0; i < cbForm.numeric.digitCount; i++)
        match  += '[0-9]';
    match += ')*(' + decimalSeperator + '[0-9]){0,1}([0-9]';
    if (decimals == undefined)
        match += '*';
    else
        match += '{0,'+(decimals-1)+'}';
    match += ')$';


    //^(-){0,1}([0-9]+)(,[0-9][0-9][0-9])*(.[0-9]){0,1}([0-9]*)$
    consoleLog('Numeric expression: ' + match);

    var expression = new RegExp(match);
    return expression.test(value);

}

cbForm.validateDutchPostcode = function(value)
{
    if ($.trim(value).length==0)
        return true;
    var expression = new RegExp("^[1-9][0-9]{3}\s?[a-zA-Z]{2}$");
    return expression.test(value);
}

cbForm.validateURL = function(value)
{
    if ($.trim(value).length==0)
        return true;
    var expression = new RegExp("^((http|https)\://)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*$");
    return expression.test(value);

}


cbForm.validateEmail = function(value)
{
    if ($.trim(value).length==0)
        return true;
    //var expression = new RegExp("[\\w-]+@([\\w-]+\\.)+[\\w-]+");
    var expression = new RegExp("^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w]{2,3}$");
    return expression.test(value);

}

cbForm.validateInt = function(value)
{
    if ($.trim(value).length==0)
        return true;
    var expression = new RegExp("^(-){0,1}([0-9]+)$");
    return expression.test(value);

}

cbForm.validateUInt = function(value)
{
    if ($.trim(value).length==0)
        return true;
    var expression = new RegExp("^([0-9]+)$");
    return expression.test(value);
}


cbForm.submitForm = function(form)
{
    var f = new cbForm(form);

    return f.validate();
}

cbForm.submitGetForm = function(form)
{

    if ($(form).attr('cbValidation'))
    {

        var validationFunction = $(form).attr('cbValidation');
        var valid = (window[validationFunction](form));
        if (!valid)
            return false;
    }

    var q = ($(form).serialize());
    var qs = q.split('&');


    var path = '';

    for (var i = 0; i < qs.length; i++)
    {
        var pair = qs[i].split('=');
        path += '/' + pair[0] + '/' + pair[1];
    }
    document.location.href=$(form).attr('action')+path;
    return false;


}

cbForm.blockUIDefaultOptions = 
{
    css:
    {
        border: '0px',
        backgroundColor:   'none',
        margin: '0px',
        padding: '0px',
        left: '0px',
        position: 'fixed',
        top: '10px',
        textAlign: 'center',
        width: '100%'
    },
    overlayCSS:
    {
        backgroundColor: '#000',
        opacity: '0.2'
    },
    message: '<img src="/cbjs/jquery/spinner.gif"/>'
};


cbForm.onEnter = function(control, event)
{
    
    var c = $(control);
    var unicode = event.charCode ? event.charCode : event.keyCode;
    
    if (unicode==13)
    {

        var buttonId = c.attr('cbSubmit');
     
        if (buttonId != undefined && buttonId.length>0 && document.getElementById(buttonId)!=undefined)
        {
            consoleLog('Enter pressed, found buttonId with value ' + buttonId);
            var element = document.getElementById(buttonId);
            consoleLog('Element found, submitting form.');
            cbSetInputSubmit(element, true);
            return false;
        }
        else if (buttonId != undefined && buttonId.length==0)
        {
            consoleLog('Enter pressed and buttonId is empty. return false and taking no action.');
            return false;
        }
        consoleLog('Enter pressed, no target button found');
        
        //todo: handle non-form elements (anchors);
        var form = $(c.attr('form'));
       
        
        var defaultButton = form.attr('cbDefault');
        if (defaultButton!=undefined && defaultButton.length>0 && document.getElementById(defaultButton)!=undefined)
        {
            var d = document.getElementById(defaultButton);
            consoleLog('Found default button');
            cbSetInputSubmit(d, true);
            return false;
        }
        var length = $('*[cbAction]',form).length;

        if (length==0)
        {
            consoleLog('No cb submit buttons found, returning true and submitting form.')
            return true;
        }
        else if (length>1)
        {
            consoleLog('Multiple submit buttons found, returning false and not submitting form');
            return false;
        }
        consoleLog('Single submit button found, triggering event.');
        var button = $('*[cbAction]',form);
        cbSetInputSubmit(button.get(0),true);

        return false;
    }

    return true;
}



cbFormsHandler = function()
{}


/**
* Handles all actions for a form
*/
cbFormsHandler.onBlur = function(element,form)
{ 
    var rules = window[form.id + '_formrules'];
    var options = window[$(form).attr('cbFormHandlerOptions')];
    var validate = true;
    if (options.options.validation!=undefined && options.options.validation.controls != undefined && typeof(options.options.validation.controls)=='boolean' && !options.options.validation.controls)
        validate = false;

    cbFormsHandler.handle(rules,options,form,validate)
}

/**
* Handles all actions for a form
*/
cbFormsHandler.onChange = function(element,form)
{
    var rules = window[form.id + '_formrules'];
    var options = window[$(form).attr('cbFormHandlerOptions')];
    var validate = true;
    if (options.options.validation!=undefined && options.options.validation.controls != undefined && typeof(options.options.validation.controls)=='boolean' && !options.options.validation.controls)
        validate = false;
    cbFormsHandler.handle(rules,options,form,validate)
}

cbFormsHandler.handle = function(rules,options,form,validate)
{

  

    if (validate == undefined || validate == null)
        validate = true;

    //Todo: remove only validation qtip messages
    if (validate)
        $(document.body).children().qtip('hide').qtip('disable');

    for (var h in rules)
    {
        var item = rules[h];
        if (item.actions!=undefined)
        {
            for (var i = 0; i < item.actions.length; i++)
            {
                var rule = item.actions[i];
                
                if (rule.javascript != undefined && rule.javascript)
                {
                    if (window[rule.condition] != undefined)
                        var result = window[rule.condition]();
                }
                else
                {
                    var calc = new cbCalculator(form);
                    var result = calc.calculate(rule.condition);                    
                }
                
                if (result)
                {
                    if (rule.action.type=='set')
                    {
                        var setValue = calc.calculate(rule.action.value);
                        $('*[name='+h+']').val(setValue);
                    }
                    else if (rule.action.type=='disable')
                    {
                        $('*[name='+h+']').attr('disabled','disabled');
                    }
                    else if (rule.action.type=='show')
                    {
                        var control = rule.action.control;
                        $('#'+control).show();
                    }
                    else if (rule.action.type=='hide')
                    {
                        var control = rule.action.control;
                        $('#'+control).hide();
                    }
                }
                else
                {
                    if (rule.action.type=='disable')
                    {
                        $('*[name='+h+']').removeAttr('disabled');
                    }
                    else if (rule.action.type=='hide')
                    {
                        var control = rule.action.control;
                        $('#'+control).show();
                    }
                    else if (rule.action.type=='show')
                    {
                        var control = rule.action.control;
                        $('#'+control).hide();
                    }
                }
            }
        }
    }

    var fullmessage = new Array();
    if (validate) for (var h in rules)
    {
        var item = rules[h];
        var message = '';
        if (item.datatype != undefined)
        {
            var tmessage = '';
            var element = $('*[name='+h+']');
            var value = $('*[name='+h+']').val();

            var fieldname = "'" + h + "'";
            if (item.fullname != undefined)
                fieldname = item.fullname;


            if (!element.isEmpty())
            {

                if (item.datatype == 'uint' && !cbForm.validateUInt(value))
                    tmessage = cbForm.messages.invalid_uint;
                if (item.datatype == 'int' && !cbForm.validateInt(value))
                    tmessage = cbForm.messages.invalid_int;
                if (item.datatype == 'email' && !cbForm.validateEmail(value))
                    tmessage = cbForm.messages.invalid_email;
                if (item.datatype == 'url' && !cbForm.validateURL(value))
                    tmessage = cbForm.messages.invalid_url;
                if (item.datatype == 'dutch_postcode' && !cbForm.validateDutchPostcode(value))
                    tmessage = cbForm.messages.invalid_dutchpostcode;
            }

            if (tmessage.length>0)
            {
                tmessage = tmessage.replace(/\?/g,fieldname);
                fullmessage.push(tmessage);
                message += tmessage + '<br/>';
            }
        }
        if (item.required != undefined && item.required)
        {
            var e = $('*[name='+h+']');
            var empty;

            if(e.attr('nodeName')=='INPUT')
            {
                if (e.attr('type')=='radio')
                {
                    empty = $('*[name='+h+']:checked').length==0;               
                }
                else
                {
                    empty = e.isEmpty();
                }


            }
            else if (e.attr('nodeName')=='SELECT')
            {
                empty = $.trim(e.val()).length==0;
            }
            else
            {
                empty = $.trim(e.val()).length==0;
            }

            //var value = $('*[name='+h+']').val();
            //var empty = ($('*[name='+h+']').attr('ready')=='true' || $.trim(value).length==0);

            if (empty)
            {
                var fieldname = "'" + h + "'";
                if (item.fullname != undefined)
                    fieldname = item.fullname;
                var tmessage = cbForm.messages.required;//  item.fullname + ' is required';
                tmessage = tmessage.replace(/\?/g,fieldname);
                fullmessage.push(tmessage);
                message += tmessage + '<br/>';
            }
        }
        if (item.validations!=undefined)
        {

            for (var i = 0; i < item.validations.length; i++)
            {
             
                var validation = item.validations[i];
                if (validation.javascript != undefined && validation.javascript)
                {
                    if (window[validation.condition] != undefined)
                        var result = window[validation.condition]();
                }
                else
                {
                    var calc = new cbCalculator(form);
                    var result = calc.calculate(validation.condition);                    
                }
                if (result)
                {
                    var vm = validation.message;
                    if (validation.type!=undefined && validation.type=='object')
                    {
                        vm = eval(vm);
                    }
                    fullmessage.push(vm);
                    message += vm + '<br/>';
                }
            }

        }

        //Flags
        $('#'+h+'_flag').remove();
        
        if (message.length > 0 && options.flags != undefined && typeof(options.flags)=='object')
        {
            var flags = options.flags
            var className = 'aster';
            if (flags.className !=undefined)
                className = flags.className;

            var a = $('<div id="'+h+'_flag" class="'+className+'"/>');
            if (flags.opacity != undefined)
                a.css('opacity',flags.opacity);
            var e = $('*[name='+h+']');
          
            var p = e.position();

            var left = p.left;
            var top = p.top;
       
            if (flags.position=='topright' || flags.position=='bottomright')
            {
                left += e.width();
            }
            if (flags.position=='bottonleft' || flags.position=='bottomright')
            {
                top += e.height();
            }


            if (flags.offsetx!=undefined)
                left += flags.offsetx;
            if (flags.offsety!=undefined)
                top += flags.offsety;
            a.css('left',left+'px');
            a.css('top',top+'px');

            if (flags.container!=undefined)
                $(flags.container).append(a);
            else
                $(document.body).append(a);
        }


        //QTIP tooltip
        if (message.length>0 && options.tooltip != undefined && typeof(options.tooltip)=='boolean' && options.tooltip)
        {
            var ttoptions = {};
            if (options.options != undefined)
            {
                ttoptions = options.options;
            }
            ttoptions.content = message;
            var first = $('*[name='+h+']');
            if (first.attr('type')=='radio')
            {


                if (item.assign != undefined)
                    $('#'+item.assign).qtip(ttoptions);
                else
                    $('*[name='+h+']').qtip(ttoptions);
            }
            else
            {
                $('*[name='+h+']').qtip(ttoptions);
            }
        }
    }

    if (fullmessage.length>0 && options.list != undefined && typeof(options.list)=='object')
    {
       
        var m = '';
        for (var i = 0; i < fullmessage.length; i++)
        {
            m += fullmessage[i] + '<br/>';
        }
        $('#'+options.list.content).html(m);
        $('#'+options.list.container).show();
    }
    //    else
    //    {
    //        $('#'+options.list.container).hide();
    //    }


    if (validate && options.errorHandler != undefined && typeof(options.errorHandler)=='string')
    {
        if (window[options.errorHandler]!=undefined)
            window[options.errorHandler](fullmessage);
    }

    return fullmessage.length == 0;

    
}



