(function($) {
    var W = window, $W = box.dom(W), D = W.document, $D = box.dom(D), $body = box.dom('body');

    pressCorner.forms = {};

    var getId = function(element) {
        return D.getElementById(element);
    };
    
    /* define a new pattern to check field validity */
    box.addFormPatterns({
        'pwd' : /^[a-zA-Z0-9]{5,}$/,
        'zipcode' : /^[0-9]{5}$/,
        'phoneNumber' : /^[0-9]{10,}$/
    });

    /* class used on dispayed errors */
    var errorCls = 'error';
    pressCorner.forms.errorCls = errorCls;

    /* helpers to manage error display on form validation */
    var addFormError = function(e) {
        box.dom('#' + e.source.id + 'Error').html('<p>' + e.source.msg + '</p>');
    };
    pressCorner.forms.addFormError = addFormError;

    /* @return Element where error have to be displayed */
    var getErrorTarget = function(field) {
        var errorTarget;
        if (field.form === 'setAlerts') {
            if(field.type == 'checkbox') {
                errorTarget = field.dom.eq(0).closest('.checkboxes').prev('.legend');
                if (errorTarget.find('.error').length > 0) {
                    errorTarget.find('.error').remove();
                }
            }
        } else if(field.type == 'radio') {
            errorTarget = field.dom.eq(0).closest('.radios').children('.legend');
        } else if(field.type == 'checkbox') {
            errorTarget = field.dom.eq(0).next('label');
        } else {
            errorTarget = field.dom.parent();
        }
        return errorTarget;
    };
    pressCorner.forms.getErrorTarget = getErrorTarget;

    /* Add an error message on a field */
    var addFieldError = function(e) {
        if (e.source.form !== 'setAlerts') {
            var error = box.dom('#' + e.source.name + 'Error');
            if(error.length) {
                error.html(e.data.message);
            } else {
                pressCorner.forms.getErrorTarget(e.source).addClass(pressCorner.forms.errorCls);
            }
        }
    };
    pressCorner.forms.addFieldError = addFieldError;

    /* Remove an error message on a field */
    var removeFieldError = function(e) {
        box.dom('#' + e.source.name + 'Error').remove();
        pressCorner.forms.getErrorTarget(e.source).removeClass(pressCorner.forms.errorCls);
    };
    pressCorner.forms.removeFieldError = removeFieldError;
    
    var hideTextFieldLabel = function(field, label, defaultValue) {
        field.focus(function() {
            label.hide();
            if($(this).val() === defaultValue) {
                $(this).val = ('');
            }
        }).blur(function() {
            if($(this).val() === '') {
                label.show();
            }
        });
    };
    pressCorner.forms.hideTextFieldLabel = hideTextFieldLabel;
    
    var clearTextField = function(field) {
        var $this = field[0];
        field.focus(function() {
            if($this.value == $this.defaultValue) {
                $this.value = '';
            }
        }).blur(function() {
            var reEmpty = /^\s*$/;
            if (reEmpty.test($this.value)) {
                $this.value = $this.defaultValue;
            }
        });
    };
    pressCorner.forms.clearTextField = clearTextField;
    
    var postAjaxForm = function(e, eventNs) {
        var url = e.source.dom.attr('action'),
                datas = e.source.dom.serialize();
            
        $.ajax({
            cache : false,
            dataType : 'html',
            url : url,
            data : datas,
            type : 'POST',
            success : function(data) {
                box.publish({
                    type : 'ajaxPostSuccess',
                    label : eventNs,
                    data : data,
                    source : e.data.source
                });
            },

            error : function(xhr) {
                box.publish({
                    type : 'error',
                    label : eventNs,
                    data : xhr
                });
            }
        });
    };
    pressCorner.forms.postAjaxForm = postAjaxForm;
    
    $D.ready(function() {
        
        var error = box.get('l10n:errors').required;
        
        if(getId('userConnect')) {
            var $login = $('#login'),
                defaultLogin = $login[0].value,
                $loginLabel = $login.prev('label'),
                $pwd = $('#password'),
                defaultPwd = $pwd[0].value,
                $pwdLabel = $pwd.prev('label');

            if(defaultLogin !== '') {
                $loginLabel.hide();
            }
            if(defaultPwd !== '') {
                $pwdLabel.hide();
            }

            hideTextFieldLabel($login, $loginLabel, defaultLogin);
            hideTextFieldLabel($pwd, $pwdLabel, defaultPwd);
            
            box.get('ui').create('form.userConnect', {
                rootElm : '#userConnect'
            }).mustValidate(function(form) {
                form.field('login').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return error;
                    }
                });
                form.field('password').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return error;
                    }
                });
                return box.get('l10n:errors').forms;
            });
        }
        
        if (getId('mediaSearch')) {
            box.get('ui').create('form.mediaSearch', {
                rootElm : '#mediaSearch'
            }).mustValidate(function(form) {
                form.field('search').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                return box.get('l10n:errors').forms;
            });
        }
        
        if (getId('addBasket')) {
            var $basketName = $('#basketName'),
                defaultValue = $basketName[0].value, 
                $basketNameLabel = $basketName.prev('label');
            
            hideTextFieldLabel($basketName, $basketNameLabel, defaultValue);
        }
        
        if (getId('requestStep1')) {
            
            var products, visuals;                
    
            box.get('ui').create('form.request', {
                rootElm : '#requestStep1'
            }).mustValidate(function(form) {
                
                form.field('productDeliveryWishedDate').mustValidate(function(field) {
                    if (field.isEmpty() && products) {
                        return error;
                    }
                });
                
                form.field('productPhotoDate').mustValidate(function(field) {
                    if (field.isEmpty() && products) {
                        return error;
                    }
                });
                
                form.field('productDeliveryReturnDate').mustValidate(function(field) {
                    if (field.isEmpty() && products) {
                        return error;
                    }
                });

                form.field('visualDeliveryMode').mustValidate(function(field) {
                    if (!field.isChecked() && visuals) {
                        return error;
                    }
                });
                
                form.field('visualDeliveryWishedDate').mustValidate(function(field) {
                    if (field.isEmpty() && visuals) {
                        return error;
                    }
                });
                                
                return box.get('l10n:errors').forms;
            });
                
            $('#requestStep1').find('.more').click(function(e) {
                e.preventDefault();
                var $this = $(this),
                    $text = $this.closest('.text'),
                    count = $text.find('input').length + 1;
                
                if (count <= 4) {
                    $text.append('<input class="dynField" type="text" name="mediaName' + count + '" id="mediaName' + count + '">');
                }
            });
            
            var $form = box.get('ui:form.request'),
                $productFields = $form.dom.find('#productsRequest'),
                $visualsFields = $form.dom.find('#visualsRequest'),
                oEvt = {};
                oEvt.source = box.get('ui:form.request').field('requestType');

            products = $productFields.hasClass('on');
            visuals = $visualsFields.hasClass('on');
            
            var select = function(oEvt) {
                $form.clearErrors();
                box.dom('#requestError').empty();
                if (typeof(oEvt.source) !== 'undefined') {
                    products = (oEvt.source.dom.find('option').eq(oEvt.source.current).attr('id') === 'products');
                } else if (oEvt.originalEvent) {
                    if (oEvt.originalEvent.target) {
                        products = (oEvt.originalEvent.target.value === 'products');
                    } else if (oEvt.originalEvent.srcElement) {
                        //IE8&below
                        products = (oEvt.originalEvent.srcElement.value === 'products');
                    }
                }
                visuals = !products;
                if (products) {
                    $productFields.addClass('on');
                    $visualsFields.removeClass('on');
                } else {
                    $productFields.removeClass('on');
                    $visualsFields.addClass('on');
                };
            };
            
            select(oEvt);
            
            box.subscribe('change>ui:field.select.requestType', function(oEvt) {
                select(oEvt);
            });
            
            //webkit change event fix
            $('#requestType').change(function(oEvt) {
                select(oEvt);
            });
	    
	    $('#productDeliveryWishedDate').datepicker();
			$('#productPhotoDate').datepicker();
			$('#productDeliveryReturnDate').datepicker();
			$('#visualDeliveryWishedDate').datepicker();
        }
        
        if (getId('requestStep2')) {
            box.get('ui').create('form.request', {
                rootElm : '#requestStep2'
            }).mustValidate(function(form) {
                form.field('support').mustValidate(function(field) {
                    if (field.getValue() === '0') {
                        return error;
                    }
                });
                return box.get('l10n:errors').forms;
            });
            
            var url;
            
            box.subscribe({
                name : 'submit>ui:form.request',
                handler : function(e) {
                    e.preventDefault();
                
                    if(e.data.valid === false) {
                        pressCorner.forms.addFormError(e);
                    } else if (typeof(e.data.domEvt) !== 'undefined') {
                        e.data.domEvt.preventDefault();
                        /*pressCorner.forms.postAjaxForm(e, 'request');*/
                        box.get('ui:popin.generic').open({
                            url : e.source.dom.attr('action'),
                            id : 'requestStep2Confirm'
                        });
                    }
                }
            }, {
                name : 'beforeopen>ui:popin.generic.requestStep2Confirm',
                handler : function(oEvt) {
                    oEvt.source.datas.method = 'POST';
                    oEvt.source.datas.params = $('#requestStep2').serialize();
                }
            }, {
                name : 'addtodom>ui:popin.generic.requestStep2Confirm',
                handler : function() {
                    if (!$('#popinConfirmRequestStep2').hasClass('error')) {
                        $('#newOrder').click(function(e) {
                            e.preventDefault();
                            url = $(this).attr('href');
                            box.get('ui:popin.generic').close();
                        });
                    } 
                }
            }, {
                name : 'beforeclose>ui:popin.generic.requestStep2Confirm',
                handler : function(e, oEvt) {
                    if (!$('#popinConfirmRequestStep2').hasClass('error')) {
                        if (typeof(url) === 'undefined') {
                            url = '/';
                        }
                    } else {
                        box.get('ui').destroy('form.request');
                    }
                }
            }, {
                name : 'removefromdom>ui:popin.generic.requestStep2Confirm',
                handler : function() {
                    if (typeof(url) !== 'undefined') {
                        window.location.pathname = url;
                    } else {
                        box.get('ui').create('form.request', {
                            rootElm : '#requestStep2'
                        }).mustValidate(function(form) {
                            form.field('support').mustValidate(function(field) {
                                if (field.getValue() === '0') {
                                    return error;
                                }
                            });
                            return box.get('l10n:errors').forms;
                        });
                    }
                }
            });
        }
        
        if (getId('contact')) {
            box.get('ui').create('form.contact', {
                rootElm : '#contact'
            }).mustValidate(function(form) {
                form.field('contactLastName').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('contactFirstName').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('contactMail').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    } else if (!field.isMatching('email')) {
                        return error;
                    }
                });
                
                form.field('contactPhone').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    } else if (!field.isMatching('phoneNumber')) {
                        return error;
                    }
                });
                
                form.field('contactPosition').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('contactMedia').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                                
                return box.get('l10n:errors').forms;
            });
            
            $('#contactMessage').bind('blur keyup keydown paste', function(e) {
                var value = $(this).val(); 
                
                if (value.length > 1000) {
                    $(this).val(value.slice(0, 1000));
                }
            });
        }
        
        var selected = 0,
            selected1 = 0,
            selected2 = 0;
        if (getId('userAccount')) {
            box.get('ui').create('form.userAccount', {
                rootElm : '#userAccount'
            }).mustValidate(function(form) {
                form.field('userLastName').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userFirstName').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userMail').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    } else if (!field.isMatching('email')) {
                        return error;
                    }
                });
                
                form.field('userPwd').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userPwdConfirm').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    } else if (form.field('userPwd').getValue() !== field.getValue()) {
                        return error;
                    }
                });
                
                form.field('userMedia').mustValidate(function(field) {
                    if (field.getValue() === '0') {
                        return error;
                    }
                });
                
                form.field('userPosition').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userMediaCity').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userMediaCountry').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
          
				form.field('userMediaName0').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
          		  
                form.field('userPhone').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    } else if (!field.isMatching('phoneNumber')) {
                        return error;
                    }
                });
                
                form.field('userZipcode').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    } else if (!field.isMatching('zipcode')) {
                        return error;
                    }
                });
                
                form.field('userCity').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userAddress').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userCountry').mustValidate(function(field) {
                    if (field.isEmpty()) {
                        return error;
                    }
                });
                
                form.field('userLang').mustValidate(function(field) {
                    if (field.getValue() === '0') {
                        return error;
                    }
                });
                
                return box.get('l10n:errors').forms;
            });
        }
        
        if (getId('manageAlerts')) {
            box.get('ui').create('scroll.alerts', {
                rootElm : '#manageAlerts .scrollable',
                buttons : false
            });
            $('#manageAlerts').find('.scrollbar').addClass('dynBgColor2').find('.bar').addClass('dynBgColor1');
        }
        
        box.subscribe({
            name : 'error>ui:field',
            handler : pressCorner.forms.addFieldError
        }, {
            name : 'valid>ui:field',
            handler : pressCorner.forms.removeFieldError
        }, {
            name : 'addtodom>ui:popin.generic.forgetPwd',
            handler : function(oEvt) {
                if (box.get('ui:form.forgetPwd') !== null) {
                    box.get('ui').destroy('form.forgetPwd');
                }
                
                $('#forgetPwd').submit(function(e) {
                    e.preventDefault();
                });
                
                box.get('ui').create('form.forgetPwd', {
                    rootElm : '#forgetPwd'
                }).mustValidate(function(form) {
                    form.field('email').mustValidate(function(field) {
                        if (field.isEmpty()) {
                            return error;
                        } else if (!field.isMatching('email')) {
                            return error;
                        }
                    });
                    return box.get('l10n:errors').forms;
                });
            }
        }, {
            name : 'submit>ui:form.forgetPwd',
            handler : function(e) {
                e.preventDefault();
                
                if(e.data.valid === false) {
                    pressCorner.forms.addFormError(e);
                } else if (typeof(e.data.domEvt) !== 'undefined') {
                   pressCorner.forms.postAjaxForm(e, 'forgetPwd');
                }
            }
        }, {
            name : 'ajaxPostSuccess>forgetPwd',
            handler : function(data) {
                $('#popinContent').html(data.data);
            }
        }, {
            name : 'beforeopen>ui:popin.generic.alerts',
            handler : function(oEvt) {
                oEvt.source.datas.method = 'POST';
                oEvt.source.datas.params = $('#filtersForm').serialize();
            }
        }, {
            name : 'addtodom>ui:popin.generic.alerts',
            handler : function(oEvt) {
                if (box.get('ui:form.setAlerts') !== null) {
                    box.get('ui').destroy('form.setAlerts');
                }
                
                $('#setAlerts').submit(function(e) {
                    e.preventDefault();
                });
                
                box.get('ui').create('form.setAlerts', {
                    rootElm : '#setAlerts'
                }).mustValidate(function(form) {
                    if (box.get('ui:form.setAlerts').dom.find('fieldset').length === 1 ) {
                        for (var i = 0, j = form.fields.length; i < j; i++) {
                            (function(fieldId, i, nbFields){
                                var id = fieldId.split('.')[1];  
                        
                                form.field(id).mustValidate(function(field) {
                                    if (field.isChecked()) {
                                        selected++;
                                    }
                                    if (((i + 1) === nbFields) && (selected === 0)) {
                                        return error;
                                    }
                                }); 
                            })(form.fields[i], i, j);
                        }
                    } else {
                        var fieldset = box.get('ui:form.setAlerts').dom.find('fieldset').eq(0),
                            fields = fieldset.find('input:checkbox'),
                            nbFields = fields.length;
                        for (var i = 0, j = nbFields; i < j; i++) {
                            var fieldId = 'setAlerts.' + fields.eq(i).attr('id');
                            (function(fieldId, i, nbFields){
                                var id = fieldId.split('.')[1];  
                        
                                form.field(id).mustValidate(function(field) {
                                    if (field.isChecked()) {
                                        selected1++;
                                    }
                                    if (((i + 1) === nbFields) && (selected1 === 0)) {
                                        return error;
                                    }
                                }); 
                            })(fieldId, i, j);
                        }
                        
                        fieldset = box.get('ui:form.setAlerts').dom.find('fieldset').eq(1);
                        fields = fieldset.find('input:checkbox');
                        nbFields = fields.length;
                        for (var i = 0, j = nbFields; i < j; i++) {
                            var fieldId = 'setAlerts.' + fields.eq(i).attr('id');
                            (function(fieldId, i, nbFields){
                                var id = fieldId.split('.')[1];  
                        
                                form.field(id).mustValidate(function(field) {
                                    if (field.isChecked()) {
                                        selected2++;
                                    }
                                    if (((i + 1) === nbFields) && (selected2 === 0)) {
                                        return error;
                                    }
                                }); 
                            })(fieldId, i, j);
                        }
                    }
                    return box.get('l10n:errors').forms;
                });
            }
        }, {
            name : 'change>ui:field.checkbox',
            handler : function(e) {
                if (e.source.form === 'setAlerts') {
                    selected = 0;
                    selected1 = 0;
                    selected2 = 0;
                }
            }
        }, {
            name : 'submit>ui:form.setAlerts',
            handler : function(e) {
                e.preventDefault();
                
                if(e.data.valid === false) {
                    pressCorner.forms.addFormError(e);
                } else if (typeof(e.data.domEvt) !== 'undefined') {
                   pressCorner.forms.postAjaxForm(e, 'setAlerts');
                }
            }
        }, {
            name : 'ajaxPostSuccess>setAlerts',
            handler : function(data) {
                $('#popinContent').html(data.data);
            }
        }, {
            name : 'ready>userPanel',
            handler : function() {
                var $basketName = $('#newBasketName'),
                    $label = $basketName.prev('label'),
                    defaultText = $basketName[0].value;
                pressCorner.forms.hideTextFieldLabel($basketName, $label, defaultText);
                
                if (box.get('ui:form.addBasket') !== null) {
                    box.get('ui:form.addBasket').boxDestroy();
                }
                box.get('ui').create('form.addBasket', {
                    rootElm : '#addBasket'
                }).mustValidate(function(form) {
                    form.field('newBasketName').mustValidate(function(field) {
                        if (field.isEmpty()) {
                            return error;
                        }
                    });
                    
                    return box.get('l10n:errors').forms;
                });
            }
        }, {
            name : 'submit>ui:form.addBasket',
            handler : function(e) {
                if((e.data.valid === false)) {
                    pressCorner.forms.addFormError(e);
                } else if (typeof(e.data.domEvt) !== 'undefined') {
                    e.data.domEvt.preventDefault();
                    if ($('#basketList').find('li').length <= 9) {
                        pressCorner.forms.postAjaxForm(e, 'addBasket');
                    }
                }
            }
        }, {
            name : 'error>*',
            handler : function(data) {
                //console.log(data);
            }
        },{
            name : 'submit>ui:form',
            handler : function(e) {
                if(e.data.valid === false) {
                    pressCorner.forms.addFormError(e);
                }
            }
        });
    });


})(jQuery);

