﻿///<reference name="MicrosoftAjax.js />

Type.registerNamespace("Shopmobbing.Behaviors");

Shopmobbing.Behaviors.EmailValidator = function(element) {

    var elementTagName = element.tagName.toUpperCase();

    if (elementTagName != "INPUT")//TODO: check for type='text'
        throw Error.argument("element", "EmailValidator behavior can be attached only to an input");

    this._isValid = false;
    this._onceValidated = false;
    this._alreadyExistsInDatabase = true;

    //delegates
    this._validateDelegate = null;

    Shopmobbing.Behaviors.EmailValidator.initializeBase(this, [element]);
}

Shopmobbing.Behaviors.EmailValidator.prototype = {

    get_isValid: function() {
        return this.isValidEmail();
    },
    get_alreadyExistsInDatabase: function() {
        return this._alreadyExistsInDatabase;
    },
    set_alreadyExistsInDatabase: function(value) {
        this._alreadyExistsInDatabase = value;
    },

    allValidChars: function(email) {
        var parsed = true;
        var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
        for (var i = 0; i < email.length; i++) {
            var letter = email.charAt(i).toLowerCase();
            if (validchars.indexOf(letter) != -1)
                continue;
            parsed = false;
            break;
        }
        return parsed;
    },

    isValidEmail: function() {
        var email = this.get_element().value;

        if (!this.allValidChars(email)) {
            return false;
        }
        if (email.indexOf("@") < 1) {
            return false;
        } else if (email.lastIndexOf(".") <= email.indexOf("@")) {
            return false;
        } else if (email.indexOf("@") == email.length) {
            return false;
        } else if (email.indexOf("..") >= 0) {
            return false;
        } else if (email.indexOf(".") == email.length - 1) {
            return false;
        }
        return true;
    },

    _validate: function() {
        if (this.get_element().value === "") {
            $(this.get_element()).css("background-color", "");
        }
        else if (this.isValidEmail()) {
            $(this.get_element()).css("background-color", "green");
        }
        else {
            $(this.get_element()).css("background-color", "red");
        }
        if (!this._onceValidated) {
            $(this.get_element()).bind('keyup', this._validateDelegate);
            this._onceValidated = true;
        }
    },

    initialize: function() {
        Shopmobbing.Behaviors.EmailValidator.callBaseMethod(this, "initialize");

        //this._isValidEmail = Function.createDelegate(this, this.isValidEmail);
        this._validateDelegate = Function.createDelegate(this, this._validate);

        $(this.get_element()).one('blur', null, this._validateDelegate);
    },
    dispose: function() {

        Shopmobbing.Behaviors.EmailValidator.callBaseMethod(this, "dispose");
    }
}

Shopmobbing.Behaviors.EmailValidator.registerClass("Shopmobbing.Behaviors.EmailValidator", Sys.UI.Behavior);