/**
 * @author syurchuk
 *
 * Depends on JQuery 1.4.2
 */


/**
 * Request form
 */

SF.ns('RequestFormValues', {rules: {},
    messages: {},
    countries: {}
});

SF.ns('RequestForm',  function() {

    $(function(){
      if($.browser.msie){
        $('select').focus(function(){
          $(this).parent().parent().addClass('ie_select');
        });
        $('select').blur(function(){
            $(this).parent().parent().removeClass('ie_select');
        });
       }
    });
    

    var links = {},
        partnerForms = [],
        requiredMethod;
    
    if(jQuery.fn.validate != undefined) {
        jQuery.validator.addMethod("listItem", function(value, element) {
            return this.optional(element) || SF.RequestFormValues.countries[value];
        }, "");
        
        //Save original method
        requiredMethod = jQuery.validator.methods['required'];
        
        jQuery.validator.addMethod("required", function(value, element, param) {
            if(value === $(element).attr('title')) {
                value = '';
            }
            return requiredMethod.call(this, value, element, param);
        }, "");
    }
    
    
    
    

    function initValidator(formEl, ajaxSubmit, submitCallback) {
        if(jQuery.fn.validate != undefined) {
            $(formEl).validate({
                rules: SF.RequestFormValues.rules,
                messages: SF.RequestFormValues.messages,
                errorPlacement: function(error, element){
                    //error.insertAfter(element.parent());
                },
                submitHandler: function(form){
                    /*$(".formfield :input").each(function(){
                        fieldLabel = $(this).attr("title");
                        if ($(this).val() == fieldLabel) {
                            $(this).val("");
                        }
                    });*/
                    try {
                       $('#elqCustomerGUID').val(GetElqCustomerGUID());
                    } catch(e) {};
    
                    if(ajaxSubmit && typeof(submitCallback) == 'function') {
                        submitCallback();
                    } else {
                        form.submit();
                    }
                }
            });
        }
    }

    function initForm(formEl, ajaxSubmit, submitCallback) {
        initValidator(formEl, ajaxSubmit, submitCallback);

        //FIXME: Selector ".formfield :input" is needed for compatibility with old forms. Should removed in future
        $(".formfield :input, .form-field :input").focus(function(){
            thisID = $(this).attr('id');
            $(this).parent('div.formfield, div.form-field').addClass("focused");
            fieldLabel = $(this).attr("title");
            if ($(this).val() == fieldLabel) {
                $(this).val("");
            }
        }).blur(function(){
            if (!this.value.length) {
                $(this).val(fieldLabel);
            }
            $(this).parent('div.formfield, div.form-field').removeClass("focused");
        });
        
        /*$(formEl + " .formbutton").click(function(){
            $(formEl + " .formfield :input.required, " + formEl + " .form-field :input").each(function(){
                fieldLabel = $(this).attr("title");
                if ($(this).val() == fieldLabel) {
                    $(this).val("");
                }
            });
        });*/

        //for IE selectors
        var arrSel = $(formEl + " #rf-howdidyouhear select, " + formEl +" select#country, " + formEl +" select#hr");
        for (var i = 0; i < arrSel.length; i++) {
            $(arrSel[i]).IELongDropDown();
        }
    }


    /**
    * Display request form
    *
    * @param {Object} location
    */
    function displayForm(params) {
        var prefix = 'tx_sfform_pi1[aConf]';
        params = params || {};
        params.data = SF.isPlainObject(params.data) ? params.data : {},
        data = {};

        for(var key in params.data) {
            data[prefix + key] = params.data[key];
        }

        //Get form
        $.ajax({
            url: '/index.php',
            dataType: 'text',
            data: SF.extend(false, { "type": 6655}, data),
            success: function(data, status) {
                if (status == 'success') {
                    var a = $('#formWindow');
                    a.addClass('req-popup');
                    var b = a.find('#formContent');
                    b.html(data);
                    //$('#formWindow').find('#formContent').html(data).end().jqmShow();
                    $('#formWindow').jqmShow();
                    $('#retURL').val(params.location);
                    initForm('#requestform', true, function(){
                        $.ajax({
                            type: 'POST',
                            url: '/index.php?type=6655',
                            dataType: 'text',
                            data: $('#requestform').serialize(),
                            success: function(data) {
                        		var base = $('base').attr('href') || '',
                        		    win;

                                data = SF.util.trimToJSON(data);

                                if(data.result.valid === true) {
                                if (data.redirect.indexOf("http:")+1) {
                                    base = '';
                                }
                                    $('#formWindow').jqmHide();
                                    if (params.target == "_blank"){
                                        win = window.open(base + data.redirect)
                                        if(win.innerHeight == 0 && win.innerWidth == 0) {
                                            window.location.href = base + data.redirect;
                                        }
                                    } else {
                                        window.location.href = base + data.redirect;
                                    }
                                } else {
                                    for (var key in data.result.errors) {
                                        var elError = $('[for='+ key +']');
                                        elError.html(data.result.errors[key]);
                                        elError.show();
                                        $('#'+ key +'').focus();
                                    }
                                }
                            }
                        });

                    });
                    $('#requestform input:first-child').blur();


                }
            }
        });
    }


    /**
     * Show form when specified element(s) is(are) clicked
     *
     * @param {Object} selector
     */
    function execAddToLinks() {
        for (var selector in links) {
            $(selector).click(function(selector){
                var urlFunc = links[selector];

                return function(e){

                    var href = $(this).attr('href');
                    var target = $(this).attr('target');
                    var req_form = (this.className !== 'wo_form');
                    var that = this;

                    //Check cookies on client side
                    if(!checkCookies() && req_form) {
                        displayForm({
                            location: href,
                            target: target,
                            data: typeof(urlFunc) === 'function' ? urlFunc.call(that) : {}
                        });

                        return false;
                    } else return true;

                }
            }(selector));
        }
    }


    /**
     * If appropriate cookies are present user doesn't neet to fill form.
     */
    function checkCookies() {
        return $.cookie('sf_registered')
            || ($.cookie('ADMCMD_prev') && $.cookie('ADMCMD_prev').length > 0)
            || $.query.get('ADMCMD_prev').length > 0;
    }


    /**
     * Init difference partner forms
     *
     * @param  formID {Object} selector
     */
    function addInitForm (formID) {
        partnerForms.push(formID);
    }

    function addToLinks(selector, urlFunc) {
        links[selector] = urlFunc;
    }

    SF.addToDOMReady(function() {
        $('#formWindow').jqm({
            onHide: function(hash){
                $('#formWindow').hide();
                $('#formWindow #formContent').html("");
                hash.o.remove();
            }
        });
        $('#formWindow .close-btn').click(function(e){
            $('#formWindow').jqmHide();
        });
        execAddToLinks();
        //init all partners forms
        if((SF.ns('RequestForm')).ready)
            initForm( partnerForms.join(','));
    });

    return {
        initForm: initForm,
        displayForm: displayForm,
        addToLinks: addToLinks,
        addInitForm: addInitForm
    }

}());

