(function($){

    var methods = {

        init: function(options,link) {

            var settings = {
                mandatoryClass: 'mandatory',
                emailClass: 'email',
                integerClass: 'integer',
                success: methods._success,
                successTimeout: 4000
            };
            settings = $.extend({}, settings, options);

            return this.each(function() {
                var $this = $(this);
                var data  = $this.data('rexxForm');
                if(!data) {
                    $this.data('rexxForm', settings);
                }
                if(typeof link != 'undefined' && $(link).length > 0) {
                    if(typeof $(link).attr('rexxform:preselect:interesse') != 'undefined' && $(link).attr('rexxform:preselect:interesse').length > 0) {
                        $this.find('[name=interesse]').val($(link).attr('rexxform:preselect:interesse'));
                    }
                    if(typeof $(link).attr('rexxform:preselect:comment') != 'undefined' && $(link).attr('rexxform:preselect:comment').length > 0) {
                        $this.find('[name=comment]').val($(link).attr('rexxform:preselect:comment'));
                    }
                }
                $this.submit(function(event) {methods.submit(event,$this);});
            });            
        },
        _toogleLoader: function($this) {
        	$this.find('#contactSubmitButton"')
        	     .css('text-align', 'left')
        	     .html('<img src="img/ajax-loader.gif" />');
        	     
        },
        destroy: function() {
            
        },
        submit: function(event,$this) {

            if(typeof event == 'object' && typeof event.preventDefault == 'function') {
                event.preventDefault();
            }
            var settings = $this.data('rexxForm');
            if(!settings || typeof settings == 'undefined' || settings.length) {
                $.error('Is not a rexxForm!');
            }
            if(methods._checkData($this)) {
            	methods._toogleLoader($this);
                methods._send($this);
                methods._gc_track($this);
                methods._piwik_track($this);
            }
        },
        _checkData: function($this) {        	
            var settings = $this.data('rexxForm');
            if(!settings || typeof settings == 'undefined' || settings.length) {
                $.error('Is not a rexxForm!');
            }
            var formData = $this.serializeObject();

            var valide = true;
            var fieldValide;

            $.each(formData, function(key, value) {
                var field = $this.find('[name="'+key+'"]');
                fieldValide = true;
                if(field.hasClass(settings.mandatoryClass)) {
                    if(field.val() == '') {
                        field.addClass('error');
                        field.addClass('madatoryError');
                        valide = fieldValide = false;
                    }
                }
                if(field.hasClass(settings.emailClass)) {
                    if(!field.val().match(/.+@.+\..+/)) {
                        field.addClass('error');
                        field.addClass('emailError');
                        valide = fieldValide = false;
                    }
                }
                if(field.hasClass(settings.integerClass)) {
                    if(!field.val().match(/^[0-9., ]$/)) {
                        field.addClass('error');
                        field.addClass('integerError');
                        valide = fieldValide = false;
                    }
                }
                if(fieldValide) {
                    field.removeClass('error')
                        .removeClass('madatoryError')
                        .removeClass('emailError')
                        .removeClass('integerError')
                        .removeClass('captchaError')
                        .removeClass('captchaMaxError');
                }
            });

            methods.errorAlerts($this);

            return valide;
        },
        _send: function($this) {
            var settings = $this.data('rexxForm');
            if(!settings || typeof settings == 'undefined' || settings.length) {
                $.error('Is not a rexxForm!');
            }
            var formData = $this.serializeObject();
            formData.sid = rexxData.sid;
            var ajaxSettings = {
                type: $this.attr('method'),
                url: '/ajax' + $this.attr('action'),
                data: formData,
                dataType: 'json',
                success: function(data, textStatus, jqXHR) {
                    methods._success($this, data, textStatus, jqXHR);
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    var rexxWindow = $this.parents('.rexxWindow');
                    if(jqXHR.status == 503) {
                        if(rexxWindow.length > 0) {
                            rexxWindow.find('.content').html('<pre>'+jqXHR.responseText+'</pre>');
                        } else {
                            document.write('<pre>'+jqXHR.responseText+'</pre>');
                        }
                    }
                }
            };
            $.ajax(ajaxSettings);
        },
        _success: function($this, data, textStatus, jqXHR) {
            var settings = $this.data('rexxForm');

            if(!settings || typeof settings == 'undefined' || settings.length) {
                $.error('Is not a rexxForm!');
            }
            if(typeof settings.success == 'function' && data.errors == null) {
                settings.success($this, data.html, textStatus, jqXHR);
                methods.errorAlerts($this);
            } else {
                $.each(data.formData, function(key,value) {
                    $this.find('[name="'+key+'"]').val(value)
                        .removeClass('error')
                        .removeClass('madatoryError')
                        .removeClass('emailError')
                        .removeClass('integerError')
                        .removeClass('captchaError')
                        .removeClass('captchaMaxError');
                });
                $.each(data.errors, function(key,value) {
                    $this.find('[name="'+key+'"]').addClass('error');
                    if(value == 'EMPTY') {
                        $this.find('[name="'+key+'"]').addClass('madatoryError');
                    } else if(value == 'EMAIL') {
                        $this.find('[name="'+key+'"]').addClass('emailError');
                    } else if(value == 'INT') {
                        $this.find('[name="'+key+'"]').addClass('integerError');
                    } else if(value == 'CAPTCHA') {
                        $this.find('[name="'+key+'"]').addClass('captchaError');
                    } else if(value == 'CAPTCHA_MAX') {
                        $this.find('[name="'+key+'"]').addClass('captchaMaxError');
                    }
                });
                var rexxWindow = $this.parents('.rexxWindow');

                if(data.html.length > 0 && rexxWindow.length > 0 && ($(data.errors).length <= 0 || typeof data.errors == 'undefined')) {
                    rexxWindow.find('.content').html(data.html);
                }

                if($(data.errors).length > 0) {
                    methods.errorAlerts($this);
                }
                if(rexxWindow.length > 0 && (settings.successTimeout != false || data.timeout != false ) && ($(data.errors).length <= 0 || data.close == 'close')) {
                    var timeout = settings.successTimeout;
                    if(typeof data.timeout != 'undefined') {
                        timeout = data.timeout;
                    }
                    var t = window.setTimeout(function() {$.rexxWindowHide();}, timeout);
                }
            }
        },
        getSettings: function() {
            var settings = $(this).data('rexxForm');
            return settings;
        },
        errorAlerts: function($this) {
            if($this.find('.madatoryError').length) {
                methods._mandatoryError($this);
            } else if($this.find('.emailError').length) {
                methods._emailError($this);
            } else if($this.find('.integerError').length) {
                methods._integerError($this);
            } else if($this.find('.captchaError').length) {
                methods._captchaError($this);
            } else if($this.find('.captchaMaxError').length) {
                methods._captchaMaxError($this);
            }
        },
        _mandatoryError: function($this) {
            if($('#languageLinks .active').attr('id') == 'en') {
                alert('Please fill out all fields marked in red.');
            } else {
                alert('Bitte füllen Sie alle rot markierten Felder aus.');
            }
        },
        _emailError: function($this) {
            if($('#languageLinks .active').attr('id') == 'en') {
                alert('This email address has not the correct format.');
            } else {
                alert('Die eMail-Adresse hat kein gültiges Format.');
            }
        },
        _integerError: function($this) {
            var val = $this.find('.integerError').val();
            if($('#languageLinks .active').attr('id') == 'en') {
                alert('"'+val+'" is not a number.');
            } else {
                alert('"'+val+'" ist keine Zahl.');
            }
        },
        _captchaError: function($this) {
            if($('#languageLinks .active').attr('id') == 'en') {
                alert('Error on captcha-code. Please try again.');
            } else {
                alert('Fehler beim Captcha-Code. Bitte versuchen sie es nocheinmal.');
            }
        },
        _captchaMaxError: function($this) {
            if($('#languageLinks .active').attr('id') == 'en') {
                alert('Maximum input errors at the Captcha code. A new attempt is not possible.');
            } else {
                alert('Maximale Fehleingaben beim Captcha-Code. Ein erneuter Versuch ist nicht möglich.');
            }
        },
        /**
         * Google Conversion Tracken
         */
        _gc_track: function($this) {
        	
        	var iframe = document.createElement("iframe");
        
        	iframe.style.width  = "0px";
        	iframe.style.height = "0px";
        	iframe.src          = 'http://www.rexx-systems.com/ajax/nachricht.php?conversion=1';
 
        	document.body.appendChild(iframe);            
        },
        /**
         * Piwik
         */
        _piwik_track: function() {
            try {         
               var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 7);
               piwikTracker.setCustomUrl(document.URL + "ajax/nachricht.php");
               piwikTracker.setDocumentTitle("Nachricht wurde verschickt!");
               piwikTracker.trackGoal(1);
               piwikTracker.trackPageView();
               piwikTracker.enableLinkTracking();
               console.log("_piwik_track success");
               console.log(piwikTracker);
            }catch(err) {
               console.log("_piwik_track faild");
            }
        }
    };

    $.fn.rexxForm = function(method,link) {

        // Method calling logic
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments, link );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
        }
    };

})(jQuery);
