/** 
 * @fileoverview Common functions for form validation and submit
 * 
 * @version 0.1
 */

/**
 * Import section for {@link http://javascriptlint.com/ JavaScript Lint}
 */
/*jsl:import ../main/utils.js*/

(function($) {
    $.fn.muaSubmitForm = function( required_fields, own_validator, onsuccess, on_ajax_error, on_validate_false ) {
        if ($(this).is('form'))
            return $.muaSubmitForm(this, required_fields, own_validator, onsuccess, on_ajax_error, on_validate_false);
        else return false;
    };

    $.muaSubmitForm = function (form, required_fields, own_validator, onsuccess, on_ajax_error, on_validate_false) {
        $.muaSubmitForm.status = 0;
        var options = {},
            jform = $(form);
        if (required_fields.constructor == Object && (
				required_fields.required_fields.constructor == Array ||
				typeof(required_fields.required_fields) == 'undefined')	) {
            options           = required_fields;
            required_fields   = options.required_fields;
            own_validator     = options.own_validator;
            onsuccess         = options.onsuccess;
            on_ajax_error     = options.on_ajax_error;
            on_validate_false = options.on_validate_false;
        }

        if (typeof(XSS_CODE) != 'undefined' && XSS_CODE) {
            var jxssfield = $("input[name='xss_code']", jform);
            if (!jxssfield.length) jxssfield = $('<input type="hidden" name="xss_code" value="'+XSS_CODE+'" />').appendTo(jform);
            if (jxssfield.val() != XSS_CODE) jxssfield.val(XSS_CODE);
        }

        options = $.extend({ 
            beforeSubmit:  typeof own_validator == 'function' ? own_validator : validate_form,  // pre-submit callback 
            success:       showResponse,   // post-submit callback 
            error:         submitError,    // post-submit error callback
            dataType: 'json',
            required_fields: required_fields         
        }, options);
        jform.ajaxSubmit(options);
    
        function validate_form (formData, jqForm, opt) {
            var result=true;

            $(':submit', jqForm).enable(false);

            $(".input_error", jqForm).removeClass('input_error');
            $("div.input_error_hint", jqForm).remove();
            $(".red_msg", jqForm).text("");

            if (opt.required_fields && opt.required_fields.constructor === Array) {
                for (var i=0; i < opt.required_fields.length; i++) {
                    var name = "item[" + opt.required_fields[i] +"]";
                    var je = $("input[name='"+name+"'],textarea[name='"+name+"'],select[name='"+name+"']", jqForm).eq(0);
        
                    if (!je.val()) {
                        je.addClass('input_error');
                        result = false;
                    }
                }
			}

            if (!result) {
                $.muaSubmitForm.status = 1;
                jqForm.attr('is_blocked', 0);        
                if ($.isFunction($.blockUI)) jqForm.unblock();
                if ( $.isFunction( $().jMsgHint ) ) {
                    if ($(".red_msg", jqForm).closest('.window').length) {
                        $(".red_msg", jqForm).closest('.window')
                            .jMsgHint('red', $.lang('Fill highlighted fields') );
                    } else {
                        $(".red_msg", jqForm).parent().jMsgHint('red', $.lang('Fill highlighted fields') );
                    }
                } else {
                    $(".red_msg",jqForm).text( $.lang('Fill highlighted fields') );
                }

                $(':submit', jqForm).enable();
                if ($.isFunction(on_validate_false)) on_validate_false(formData, jqForm, opt);
            }
            return result; 
        } 
        
        function showResponse(data, result, jqForm) {
            fill_form_errors(jqForm, data.err_fld);
    
            $(':submit', jqForm).enable();
        
            if (typeof(data) != 'undefined' && data.success == 'nope' && data.status == 'no_session') {

                if ($.isFunction(proc_stat_clear_all)) proc_stat_clear_all();
                if($.isFunction($.alert)){
                   $.alert(data.error,{
                            custom: {
                              ok:  $.lang('Ok')
                            },
                            title: $.lang('Alert!'),  
                            onreturn: function(v){
                               $(document).unbind('ajaxError');
                               parent.location=ROOT_URL+'/';//if (v=='ok') 
                            }
                   });
                }else alert(data.error);
                return false;
            }
           
            if ($.isFunction($.blockUI)) jqForm.unblock();
            
            if(data.err_msg && data.err_msg.match(/^LANG_/)){
                data.err_msg = $.lang(data.err_msg);
            }
            
            if (data.status != '0' ){
                $.muaSubmitForm.status = 2;
                
                for (var name in data.err_fld) {
                    var full_name = (/^item\[/).test(name) ? name : ("item[" + name + "]");
                    if ( data.err_fld[name] ){
                       var jf=$("input[name='"+full_name+"'],textarea[name='"+full_name+"'],select[name='"+full_name+"']",jqForm);
                       jf=$(jf[0]); //just first one
                       jf.addClass('input_error'); 
                       if ( data.err_fld[name].length > 3  ) {
                          if ( jf.next("span").size()>0 ) jf=jf.next("span");
                                // This str is used to hightlight fields that re wrong and to write, after them, explayning messeges
                                jf.after('<div class="input_error_hint">' + data.err_fld[name] +'</div>'); 
                          }
                       }
                }
				
				if ( $.isFunction( $().jMsgHint ) && jqForm.is(':visible') ) {  // MAILUA-3502 added - antonfin
                    if ($(".red_msg", jqForm).closest('.window').length) { 
                        $(".red_msg", jqForm).closest('.window').jMsgHint('red', data.err_msg, {prev_coll: $('.input_error', jqForm)});
					} else {
						$(".red_msg", jqForm).parent().jMsgHint('red', data.err_msg, {prev_coll: $('.input_error', jqForm)});
					}
                } else $(".red_msg", jqForm).text(data.err_msg, {prev_coll: $('.input_error', jqForm)});
            }
              
            if ( typeof(onsuccess)=='function' ){
                onsuccess(data, jqForm);
            }
            jqForm.attr('is_blocked', 0);        
        } 
     
        function submitError(XMLHttpRequest, textStatus, errorThrown){
            $(':submit', form).enable();
            if ($.isFunction($.blockUI)) $(form).unblock();
    
            if ( typeof(on_ajax_error)=='function' ){
                on_ajax_error();
            }else{
              if($.isFunction($.alert)){
                   $.alert($.lang("Some error occured while processing your request.\n Try again or write to administrator via 'Feedback'.")+"["+textStatus+"]", {
                        w: 400
                    });
              }else {
                   alert($.lang("Some error occured while processing your request.\n Try again or write to administrator via 'Feedback'.")+"["+textStatus+"]");
              }
            }
        }
    
        return false;
    };

    function fill_form_errors(form_name, err_fld){
        var jF=$(form_name), err_num, i;
        jF.find('.err').hide();
        for(i in err_fld) {
            err_num = parseInt(err_fld[i], 10);
            if (err_num > 0) {
                $('input[name="item['+i+']"], textarea[name="item['+i+']"], select[name="item['+i+']"]', jF).
					addClass('input_error').parent().find('.err').eq(err_num-1).show(); 
            }
        }
        
    }
    
})(jQuery);

