﻿

function class_DocumentEventsListener(a_event, a_parentObject, a_callback, a_arg1, a_arg2) {
    this.vp_event = a_event;
    this.vp_parentObject = a_parentObject;
    this.vp_callback = a_callback;
    this.vp_arg1 = a_arg1;
    this.vp_arg2 = a_arg2;

    this.f_eventCall = function(a_event)
    {
        this.vp_callback(a_event,this.vp_arg1, this.vp_arg2);
    }
    
};



function class_DocumentEventsManager() 
{
    this.vp_eventsHash = new class_HashTable();
    this.vp_parentObjectHash = new class_HashTable();



    this.f_add = function(a_event, a_parentObject, a_callback, a_arg1, a_arg2) {
        var v_obj = new class_DocumentEventsListener(a_event, a_parentObject, a_callback, a_arg1, a_arg2);
        // add to event hash.
        if (this.vp_eventsHash.f_contains(a_event)) {
            var v_arr = this.vp_eventsHash.f_get(a_event);
            v_arr.push(v_obj);
        }
        else {
            this.vp_eventsHash.f_add(a_event, new Array(v_obj));
            eval("document.on" + a_event + " = m_app.vp_eventManger.f_event");
        }

        // add to parent object hash
        if (this.vp_parentObjectHash.f_contains(a_parentObject)) {
            var v_arr = this.vp_parentObjectHash.f_get(a_parentObject);
            v_arr.push(v_obj);
        }
        else {
            this.vp_parentObjectHash.f_add(a_parentObject, new Array(v_obj));
        }
    };

    this.f_removeByParentObject = function(a_parentObject) {
        if (this.vp_parentObjectHash.f_contains(a_parentObject)) {
            var v_arr = this.vp_parentObjectHash.f_get(a_parentObject);
            for (var v_i = 0; v_i < v_arr.length; v_i++) {
                // find event hash
                if (this.vp_eventsHash.f_contains(v_arr[v_i].vp_event)) {
                    var v_evarr = this.vp_eventsHash.f_get(v_arr[v_i].vp_event);
                    // remove the item from event array
                    f_arrayRemoveByObject(v_evarr, v_arr[v_i]);
                }
            }
            this.vp_parentObjectHash.f_remove(a_parentObject);
        }
    };


    this.f_event = function(a_event) {
        var v_event = a_event ? a_event : (event ? event : (window.event ? window.event : null));
        if (v_event != null) 
        {
            if (m_app.vp_eventManger.vp_eventsHash.f_contains(v_event.type)) {
                var v_arr = m_app.vp_eventManger.vp_eventsHash.f_get(v_event.type);
                for (var v_i = 0; v_i < v_arr.length; v_i++) {
                    v_arr[v_i].f_eventCall(v_event);
                }
            }    
        }
    };


};

