function FormValidator(j) {
	this.validatorMessages = { 
		'pl': {
			'error': 'Proszę, uzupełnij wymagane pola.',
			'send': {
				1: 'Zapytanie kontaktowe zostało poprawnie wysłane!',
				0: 'Wystąpił błąd, proszę spróbować ponownie.'
			},
			'subscribe': { 
				1: 'Na podany adres email została wysłana wiadomość', 
				0: 'Wystąpił błąd, dane nie zostały wysłane' 
			},
			'unsubscribe': { 
				1: 'Na podany adres email została wysłana wiadomość', 
				0: 'Wystąpił błąd, dane nie zostały wysłane' 
			}
		}
	},
	
    this.validateUserInfoInputs = function(formId) {
        var result = true,
            __this = this;

		j('#' + formId + ' select').each(function(index, object) {
            var required = false;

			if (__this.isDefined(j(object).attr('required'))) {
				required = j(object).attr('required');
			} else return;

			if ((j(object).val() > 0) || (j(object).val().length > 1)) {
				j(object).parent().find('label').css({'color' : null});
			}

			else {
				j(object).parent().find('label').css({'color' : '#DA0000'});
				j(object).bind('click', function() {j('[name=' + object.name + ']').parent().find('label').css({'color' : null});});

				result = false;
			}
		});

        j('#' + formId + ' input').each(function(index, object) {
			if (object.type == 'checkbox') {
				var required = false;

				if (__this.isDefined(j(object).attr('required'))) {
					required = j(object).attr('required');
				} else return;

				if (j(object).attr('checked') == false) {
					j(object).parent().find('label').css({'color' : '#DA0000'});
					j(object).bind('click keydown', function() {j(this).parent().find('label').css({'color' : ''});});

					result = false;
				}
			}

			else if (object.type == 'radio') {
				var required = false;

				if (__this.isDefined(j(object).attr('required'))) {
					required = j(object).attr('required');
				} else return;

				if (j('[name=' + object.name + ']:checked').size() > 0) {
					j('[name=' + object.name + ']:checked').parent().find('label').css({'color' : null});
					j('#' + object.name).css({'color' : null});
					return;
				} else {
					j('[name=' + object.name + ']').parent().find('label').css({'color' : '#DA0000'});
					j('[name=' + object.name + ']').bind('click', function() {j('[name=' + object.name + ']').parent().find('label').css({'color' : null});});

					j('#' + object.name).css({'color' : '#DA0000'});
					j('[name=' + object.name + ']').bind('click', function() {j('#' + object.name).css({'color' : null});});
					result = false;
				}
            }

            else {
				var minLength = 0,
					maxLength = 2048,
					group = '',
					customRegex = '';

				if (__this.isDefined(j(object).attr('minlength'))) {
					minLength = j(object).attr('minlength');
				} else return;

				if (__this.isDefined(j(object).attr('maxlength'))) {
					maxLength = j(object).attr('maxlength');
				} else return;

                if (__this.isDefined(j(object).attr('group'))) {
                    group = j(object).attr('group');
                }
                
                if (__this.isDefined(j(object).attr('rule'))) {
                	var rule = j(object).attr('rule');
                	
                	switch(rule) {
                		case 'email':
                			customRegex = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/;
                		break;
                	}
                }
                                
                if ((minLength > j(object).val().length) || (maxLength < j(object).val().length)) {                	
                	if (group.length > 0) {
                        if (!j('[name=' + group + ']').is(':checked')) {
                            j(this).css({'border-color' : '#4B95C4', 'background' : '#F2F7FB none repeat scroll 0 0'});
                            return;
                        }
                    }
                    
                    j('[name=' + object.name + ']').parent().find('label')
                        .css({'color' : '#DA0000'});

                    j('[name=' + object.name + ']')
						.bind('click keydown', function() {j(this).parent().find('label').css({'color' : ''});});

                    result = false;
                    return;
                }
                
                if (typeof customRegex == 'object') {
            		if(!customRegex.test(j(object).val())) {
                		__this.validatorMessages['pl']['error'] = 'Podano nieprawidłowy adres email.';
            			result = false;
            			return;
                	}
                }
            }
        });

        return result;
    }

    this.validateApplication = function(formId) {
        if (!this.validateUserInfoInputs(formId)) {
            j(document.createElement('div'))
                .html(this.validatorMessages['pl']['error'])
                .dialog(this.dialogOptions);
			return false;
        }

		return true;
    }

    this.runApplication = function(formId) {
		var __this = this;

		if (__this.validateApplication(formId)) {
			j.getJSON("/Rental/send",
				{'data': '{"object":{"companyName":"' + j('#companyName').val() + '",' +
								   '"signboardName": "' + j('#signboardName').val() + '",' +
								   '"leasedArea": "' + j('#leasedArea').val() + '",' +
								   '"activityType": "' + j('#activityType').val() + '",' +
								   '"contactPerson": "' + j('#contactPerson').val() + '",' +
								   '"contactPersonPhone": "' + j('#contactPersonPhone').val() + '"}}'},
				function(json) {
									   
					var result = (json.result) ? 1 : 0;
					
					j(document.createElement('div'))
						.html(__this.validatorMessages['pl']['send'][result])
						.dialog(__this.dialogOptions);
				}
			);
		}
    }

    this.runContactApplication = function(formId) {
		var __this = this;

		if (__this.validateApplication(formId)) {
			j.getJSON("/Question/send",
				{'data': '{"object":{"subject":"' + j('#subject').val() + '",' +
								    '"content": "' + j('#content').val() + '"}}'},
				function(json) {
					
					var result = (json.result) ? 1 : 0;
								    	
					j(document.createElement('div'))
						.html(__this.validatorMessages['pl']['send'][result])
						.dialog(__this.dialogOptions);
				}
			);
		}
    }
    
    this.runNewsletterApplication = function(formId, subscribe) {
    	var __this = this;
    	var action = (subscribe) ? 'subscribe' : 'unsubscribe';
    		 
		if (__this.validateApplication(formId)) {
			j.getJSON("/Subscribers/" + action,
				{'data': '{"object":{"email":"' + j('#email').val() + '"}}'},
				function(json) {	
					
					var result = (json.result) ? 1 : 0;
					
					var message = (json.message) ? json.message : __this.validatorMessages['pl'][action][result];
					
					j(document.createElement('div'))
						.html(message)
						.dialog(__this.dialogOptions);
					
					if(json.result) {
						location.reload(true);
					}
				}
			);
		}
    }

    this.isDefined = function(variable) {
        if (variable == 'undefined') {
            return false;
        }

        return (typeof(variable) == 'undefined') ? false : true;
    }

    this.dialogOptions = {
        modal: true,
        draggable: true,
        resizable: false,
        close: function(event, ui) {j(this).dialog('destroy');},
        buttons: {
            Ok: function() {
                j(this).dialog('destroy');
            }
        }
    }
}

var j = jQuery.noConflict();
var Validator = new FormValidator(j);
