
function xmlCreateHandler() { 		
	
    xmlHandler = null;
    if (window.XMLHttpRequest) {
        xmlHandler = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlHandler = new ActiveXObject("Microsoft.XMLHTTP");
    }
	
    return xmlHandler;
	
} 	
	
function AjaxCall(url, doFunction, requestHeader, postData, ASynchronous) {
			
    if (!requestHeader) {
        requestHeader = 'GET';
    }
		
    var myHandler = xmlCreateHandler();
    myHandler.onreadystatechange = function() {
		
        if (myHandler.readyState == 4) {
            doFunction(myHandler.responseText);
        }
    };
		
    if (!postData) {
        postData = null;
    }
		
    myHandler.open(requestHeader, url);
		
    myHandler.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');

    if (requestHeader == 'POST') {
        myHandler.setRequestHeader('Content-Type', 'Application/x-www-form-urlencoded');
    }
		
    myHandler.send(postData);
	
}
	
/*
* ajax functionality object; provides cross-browser, ajax related properties and methods.
* @class ajax object
* @constructor
* @param {jQuery} $ The jQuery object
*/
var ajax = ( function ($) {
	
		
    /**
    * @namespace Private properties, mainly css identifiers and url's; when identifiers or uri's change, only change here.
    */
    var config = {
        ajaxLoader : 'ajax_loader',
        loaderImg : '/img/css/ajaxloader/ajax-loader.gif'
    },

    /**
    * @namespace Private methods
    */
    privs = {

        /**
        * Returns an HTML Object for a dynamic loader
        * @return Object DOM API
        * @private
        */
        createXMLHandler : function () {
            xmlHandler = null;
            if (window.XMLHttpRequest) {
                xmlHandler = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                xmlHandler = new ActiveXObject("Microsoft.XMLHTTP");
            }

            return xmlHandler;
        },

        /**
        * Returns an HTML Object for a dynamic loader
        * @return Object ajaxLoader
        * @private
        */
        createLoader : function () {
				
            var ajaxLoader = document.createElement('div');
            ajaxLoader.id = config.ajaxLoader;
		
            var loader = new Image();
            loader.src = config.loaderImg;
		
            ajaxLoader.appendChild(loader);
				
            return ajaxLoader;
        }
		
    };
		
		
    /**
    * @namespace Public methods
    * @scope ajax
    */
    return {

        /**
        * handles static Ajax Request to the server/domain.
        * 
        * @type Object
        * @param {String} url The URL for the requested data;
        * @param {Function} doFunction The function to nitiate after a successful data upload;
        * @param {String} requestHeader The type of Request, default is set to GET;
        * @param {}
        */
        call : function (url, doFunction, requestHeader, postData, ASynchronous) {

            if (!requestHeader) {
                requestHeader = 'GET';
            }

            var myHandler = privs.createXMLHandler();
            myHandler.onreadystatechange = function () {

                if (myHandler.readyState == 4) {
                    doFunction(myHandler.responseText);
                }
            };

            if (!postData) {
                postData = null;
            }

            myHandler.open(requestHeader, url);

            myHandler.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');

            if (requestHeader == 'POST') {
                myHandler.setRequestHeader('Content-Type', 'Application/x-www-form-urlencoded');
            }

            myHandler.send(postData);

        },

        /**
        * Writes an ajaxLoader HTML Object to the DOM tree, at a static position.
        *
        * TODO: ajaxLoader needs more flexible position-parameters
        * TODO: parent element needs to be one of users choice
        *
        * @type Object
        * @param {String} event The event that triggered this function.
        */
        addStaticLoader : function (event) {
				
            event = event || window.event;
				
            var ajaxLoader = privs.createLoader(),
            obj = event.target || event.srcElement,
            parent = obj.parentNode;
							
            ajaxLoader.style.left = obj.offsetLeft - 36 + 'px';
            ajaxLoader.style.top = '15px';
								
            parent.appendChild(ajaxLoader);
				
            //check for ie
            if ($.browser.msie) {
                ajaxLoader.style.display = 'block';
					
            } else {
                $(ajaxLoader).fadeIn(400);
            }
        },
			
			
        /**
        * Writes an ajaxLoader HTML Object to the DOM tree, bound to the position of the cursor.
        *
        * NOTE: can only be applied to mouse events
        *
        * @type Object
        * @param {String} event The mouseevent that triggered this function.
        */
        addFlexLoader : function (event) {

            var ajaxLoader = privs.createLoader();
				
            document.body.onmousemove = function (event) {

                var loaderPos = document.getElementById(config.ajaxLoader);

                event = (event) ? event : window.event;
                loaderPos.style.left = event.clientX + 'px';
                loaderPos.style.top = event.clientY + 'px';
					
                document.body.appendChild(ajaxLoader);
					
					
                //check for ie
                if ($.browser.msie) {
                    ajaxLoader.style.display = 'block';
						
                } else {
                    $(ajaxLoader).fadeIn(400);
                }
            };
        },
			
			
        /**
	        * Removes the ajaxLoader HTML Object from the screen.
			*
	        * @type Object
	        */
        removeLoader : function () {
            var loader = document.getElementById(config.ajaxLoader);
            //check for ie
            if ($.browser.msie) {
                $(loader).remove();
					
            } else {
                $(loader).fadeOut(400, function () {
                    $(this).remove();
                });
            }
			
        }
		
    };
	
})(jQuery);	
	
	
