﻿/*
	Comsite Ajax Library - http://www.ComSite.org
 	by Jay Kappel, founder of ComSite.

	Permission is freely granted to copy, modify, merge, publish, distribute,
	sublicense, and/or sell copies of this Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL 
	THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
	CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
	DEALINGS IN THE SOFTWARE.
*/

	// Create our Namespace
    var csAjax = {};
    
    csAjax.debug    = false;
    csAjax.version  = '1.0.1';
    
    // Stub out the optional Namespaces
    // That may or may not be used
    csAjax.ctxMenu = {};
    csAjax.ctxMenu.loaded = false;

    csAjax.drag = {};
    csAjax.drag.loaded = false;

    csAjax.editor = {};
    csAjax.editor.loaded = false;

    csAjax.event = {};
    csAjax.event.loaded = false;

    csAjax.hex = {};
    csAjax.hex.loaded = false;

    csAjax.http = {};
    csAjax.http.loaded = false;

    csAjax.page = {};
    csAjax.page.loaded = false;
    
    csAjax.utils = {};
    csAjax.utils.loaded = false;

    csAjax.winBar = {};
    csAjax.winBar.loaded = false;
    
    csAjax.windows = {};
    csAjax.windows.loaded = false;


    // Begin Function Declarations
    csAjax.about = function() {
        alert('Comsite jsAPI v' + dgApi.version + '\n' + dgApi.copyright);
    }    
    
    
    csAjax.instanciate = function() {
        // Use reflection to discover libraries
        // and instanciate them
        var loadData='';
        
        for (lib in csAjax) {
            if (typeof csAjax[lib]=='object') {
                try {
                    if (csAjax[lib].loaded) {
                        if (csAjax.debug) loadData += '<div class=csAjaxComment>csAjax.'+lib+' loaded...</div>';
                        csAjax[lib].instanciate();
                    }
                } catch (e) {
                    // ignore errors
                }
            }
        }
        
        var body = document.getElementsByTagName('body')[0];
        if (body) body.innerHTML = loadData + body.innerHTML;
        
        if (!csAjax.eventTracker('csAjax','afterInstanciate',this)) return;
        return true;
    }
    
    
    csAjax.eventTracker = function(csNamespace, eventTitle, obj, params) {
        /// <summary> this procedure is called from every event in the framework.  Returning false from this fuction will abort the calling function.</summary>
        var bContinue = true;
        
        if (csAjax.debug) {
            if (obj) 
                window.status = 'csAjax.eventTracker: ' + obj.id +', '+eventTitle;
            else
                window.status = 'csAjax.eventTracker: ' + eventTitle;
            
            if (params) window.status += '  Params: '+params;
        }
      
        // Process any registered events
        bContinue = csAjax.events.process(csNamespace, eventTitle, obj, params);
        
        // Process the global event processor
        if (typeof globalEventProcessor == 'function' && bContinue)
            bContinue = globalEventProcessor(csNamespace, eventTitle, obj, params);

        // return the results
        return bContinue;
    }
    
    
    // Handle debug support
    csAjax.debugPrint = function(msg, outputAreaID) {
        if (!csAjax.debug) return;
        
        outputAreaID = outputAreaID || 'ajaxDebugWin';
        var elm = document.getElementById(outputAreaID);
        if (!elm) {
            elm = new csAjax.window({ id: outputAreaID, top: '30%', left: '30%', width: '40%', height: '40%', title: 'Debug' });
            elm.setContent('');
        } else {
            elm = elm.jsWindow;
        }
        
        var txt = elm.getContent();            
        elm.setContent(msg+'<br />'+txt);
    }      
    

	csAjax.insertSupportObj = function(type, filename, options) {
        options = options || {};
        var doc = options.document || document;
		var headID = doc.getElementsByTagName("head")[0];
		var newObj;
		
		switch(type.toLowerCase()) {
			case 'css':
			case 'link':
				newObj= doc.createElement('link');
				if (options.title) newObj.title = options.title;
				newObj.type = 'text/css';
				newObj.rel = 'stylesheet';
				newObj.href = filename;
				newObj.media = 'screen';
				break;
				
			case 'script':
			case 'javascript':
				newObj = doc.createElement('script');
				if (options.title) newObj.title = options.title;
				newObj.type = 'text/javascript';
				newObj.media = 'screen';
				newObj.src = filename;
				break;
		}

		if (newObj) headID.appendChild(newObj);					
	}
	
    
    // *********************************************    
    // **
    // **   Begin the Events Namespace
    // **  
    // *********************************************    
    csAjax.events = {};
    
    csAjax.events.eventSource = {};
    csAjax.events.list = new Array();
    
    csAjax.events.register = function(csNamespace, eventTitle, callBack) {
        var lst = csAjax.events.list;
    
        // Prevent registering events more than once
        csAjax.events.remove(csNamespace, eventTitle, callBack);    
        lst.push({ csNamespace: csNamespace, title: eventTitle, callBack: callBack });
    }
    
    csAjax.events.remove = function(csNamespace, eventTitle, callBack) {
        var lst = csAjax.events.list;

        for (var c=0; c < lst.length; c++) {
            if (lst[c].csNamespace==csNamespace && lst[c].title==eventTitle && lst[c].callBack==callBack) lst.splice(c,1);
        }
    }
    
    csAjax.events.process = function(csNamespace, eventTitle, obj, params) {
        var lst = csAjax.events.list;
        var rslt = true;
        
        // Set the source of the event
        csAjax.events.source=obj;
        
        for (var c=0; c < lst.length; c++) {
            if (csNamespace ==lst[c].csNamespace && eventTitle == lst[c].title) {
                if (csAjax.debug) {
                    if (obj) 
                        window.status = 'csAjax.events.process: ' + obj.id +', '+eventTitle;
                    else
                        window.status = 'csAjax.events.process: ' + eventTitle;

                    if (params) window.status += '  Params: '+params;
                }
                rslt = rslt && lst[c].callBack(obj, params);
            }
        } 
        
        return rslt;   
    }
    
    csAjax.events.debug = function() {
        var lst = csAjax.events.list;
        var sData='csAjax.events.debug: ' + lst.length + '<br>';
        
        for (var c=0; c < lst.length; c++) {
            sData += ' &nbsp; &nbsp; &nbsp; ' + (c+1) + ':';
            sData += ' Namespace: ' + lst[c].csNamespace +', ';
            sData += ' Event Title: ' + lst[c].eventTitle;
            sData += '<br>';
        }    

        var body = document.getElementsByTagName('body')[0];
        if (body) body.innerHTML = sData + body.innerHTML;
    }
