﻿/// <reference name="MicrosoftAjax.js"/>

/* Property Helper
* --------------------------------------------------
* Usage
* --------------------------------------------------
* How To use
* --------------------------------------------------
* Type.registerNamespace("Samples");
* 
* Samples.Customer = function() {
* }
* Samples.Customer.createProperty("fullName");
* Samples.Customer.registerClass("Samples.Customer");
* -------------------------------------------------- */

Type.prototype._createGetter = function(fieldName) {
    return function() {
        return this[fieldName];
    }
}

Type.prototype._createSetter = function(fieldName) {
    return function(value) {
        this[fieldName] = value;
    }
}

Type.prototype.createProperty = function(propName) {
    var fieldName = '_' + propName;

    var getter = this._createGetter(fieldName);
    var setter = this._createSetter(fieldName);

    this.prototype['get_' + propName] = getter;
    this.prototype['set_' + propName] = setter;
}

/* Event Helper
* --------------------------------------------------
* Usage
* --------------------------------------------------
* How To use
* --------------------------------------------------
* Type.registerNamespace("Samples");
* 
* Samples.Customer = function() {
*     initialize: function() {
*          this._raiseEvent("customerInitialized");
*     }
* }
* Samples.Customer.createEvent("customerInitialized");
* Samples.Customer.registerClass("Samples.Customer");
* -------------------------------------------------- */

Type.prototype._createAddHandler = function(eventName) {
    return function(handler) {
        this.get_events().addHandler(eventName, handler);
    }
}

Type.prototype._createRemoveHandler = function(eventName) {
    return function(handler) {
        this.get_events().removeHandler(eventName, handler);
    }
}

Type.prototype.createEvent = function(eventName, eventArgs) {
    var addHandler = this._createAddHandler(eventName);
    var removeHandler = this._createRemoveHandler(eventName);

    this.prototype['add_' + eventName] = addHandler;
    this.prototype['remove_' + eventName] = removeHandler;

    if (!this.__events) {
        if (!this.inheritsFrom(Sys.Component)) {
            this.prototype.get_events = function() {
                if (!this._events) {
                    this._events = new Sys.EventHandlerList();
                }

                return this._events;
            }
        }

        this.prototype._raiseEvent = function(eventName, eventArgs) {
            var handler = this.get_events().getHandler(eventName);

            if (handler) {
                if (!eventArgs) {
                    eventArgs = Sys.EventArgs.Empty;
                }

                handler(this, eventArgs);
            }
        }

        this.__events = true;
    }
}
 