

var AutoTextBox = new Class({
    
    options: {
        waitingTimeout: 500,
        timerDecrement: 50,
        TextBoxAction: Class.empty
    },
    initialize:function(textbox,options){
        // Add keypress event that calls the onRequestStart function automatically if the space key is pressed
        this.global_submit_timer = null;    
        this.setOptions(options);
        this.textbox = textbox;
        autobox = this;
        textbox.addEvent('keyup',function(e){
            if(e.charCode == 32){
                autobox.options.TextBoxAction.call(autobox,this);
            }else{
                //otherwise  wait for the value of options.waitingTimeout and if there are no actions then call the onRequestStart
                autobox.global_submit_timer = autobox.options.waitingTimeout;
                if(!autobox.countdown_started){
                    autobox.countdown_started = true;
                    autobox.wait_to_call(autobox,
                        function(){
                            autobox.options.TextBoxAction.call(autobox,this);
                        });
                }
            }
        });
        
    },
    wait_to_call:function(auto_box,function_call){

        auto_box.global_submit_timer = auto_box.global_submit_timer - auto_box.options.timerDecrement;
        
        if(auto_box.global_submit_timer > 0){
            var calling_function = function (){
                auto_box.wait_to_call(autobox,function_call);
            }
            calling_function.delay(auto_box.options.timerDecrement,autobox.textbox);
        }else{
            function_call.call(autobox.textbox);
            auto_box.countdown_started = false;
        }
    }
});
AutoTextBox.implement(new Options, new Events);	   





var LockableDivRegion = new Class({
    options: {
	    lockedClass: null,
	    onLockSet: Class.empty,
	    onLockRelease: Class.empty,
	    onClick: Class.empty,
	    childRegion: null
    },
    initialize: function(region,options){
		this.region = region;
		this.setOptions(options);
		this.alreadyLockedFlag = false;    
	},
	lock:function(){
	    if(this.alreadyLockedFlag){return;}
	    this.alreadyLockedFlag = true;
	    var position = this.region.getPosition();
	    var size = this.region.getSize();
	    
	    if(!((position.x == 0 && position.y == 0) || (size.scrollSize.y == 0 && size.scrollSize.x == 0) )){
	        this.lock_pane = new Element('div').inject(document.body);
	        if(this.options.childRegion){
	            this.options.childRegion.inject(this.lock_pane);
	        }
	        this.lock_pane.addClass('ajax_lock_region');
	        
    	    
	        var position = this.region.getPosition();
	        var size = this.region.getSize();
    	    
	        if((position.x == 0 && position.y == 0) || (size.scrollSize.y == 0 && size.scrollSize.x == 0) ){
	            this.region.setStyle('display','block');
	            position = this.region.getPosition();
	            size = this.region.getSize();
                this.region.setStyle('display','none');
	        }
    	    
    	    
	        this.lock_pane.setStyles({
				    'position': 'absolute',
				    'display': 'block',
				    'left': position.x,
				    'z-index': '1000',
				    'top': position.y,
				    'height': size.scrollSize.y,
				    'width': size.scrollSize.x,
				    'opacity':1
			});
			var locker = this;
			this.lock_pane.addEvent('click',function(){
	            locker.fireEvent('onClick');
	        });
	    
	        this.fireEvent('onLockSet');
	    }
	},
	
	unlock:function(){
	    this.alreadyLockedFlag = false;
	    var position = this.region.getPosition();
	    var size = this.region.getSize();
	    if(!((position.x == 0 && position.y == 0) || (size.scrollSize.y == 0 && size.scrollSize.x == 0) )){
	        this.lock_pane.remove();
	        this.fireEvent('onLockRelease');
	    }
	}

});

LockableDivRegion.implement(new Options, new Events);	


var CacdAjaxPageLoader = new Class({
		
		options: {
		    targets: null,
		    onRequestStart: Class.empty,
		    onRequestComplete: Class.empty
	    },
		
		initialize: function(form,options){
			this.form = form;
			this.setOptions(options);
			this.results_pane = new Element('div').inject(document.body);
	        this.results_pane.setStyle('display','none');
		},
		
		execute: function(data){
		
		    this.fireEvent('onRequestStart');
		    
		    var page_loader = this;

		    
		    $each(this.options.targets,function(target){
	            target.addClass('ajax-loading');
	        });
		
		    var page_location = ('' + window.location).split('?')[0];
		    var url = page_location + '?AjaxRequest=true&' + this.form.toQueryString() + '&' + data;
		    var current_results_pane = this.results_pane;
		    
		    new Ajax(url,{
		        data: {'x':'x'},
		        onSuccess: function(page_text) {
			        //var domParser = new CacdDOMParser(page_text);
			        page_text = page_text.replace(/id="/g,'id="loader_');
			        
			        current_results_pane.innerHTML = page_text;
			        /* Substitute target html for corresponding values in the page text */
			        
			        $each(page_loader.options.targets,function(target){
			            results_region = $('loader_'+ target.id);
			            target.removeClass('ajax-loading');
			            if(results_region){
			                result_text = results_region.innerHTML;
			                result_text = result_text.replace(/id="loader_/g,'id="');
			                result_text = result_text.replace(/id=loader_/g,'id=');
			                target.innerHTML = result_text;
			            }
			        });
			        current_results_pane.innerHTML = '';
			        page_loader.fireEvent('onRequestComplete', [results_region]);
		        }
	        }).request();
		
		}
    });
		
CacdAjaxPageLoader.implement(new Options, new Events);	


var CacdDOMParser = new Class({
		
		initialize: function(xmlstring){

			this.nativeparser = this.parseXMLString(xmlstring);
			

		},

		getInnerHTML: function(elementid) {
			if(window.ActiveXObject)
			{
				
				var result = this.getMSInnerHTML(this.nativeparser.nodeFromID(elementid));
				if(!result){this.alertError('unable to find element',elementid);}
				return result;
			}else{
				var result = this.nativeparser.getElementById(elementid);
				if(!result){this.alertError('unable to find element',elementid);}
				return result.innerHTML;
			}

		},

		getMSInnerHTML: function(node){

			var result = [];
			
			for(var i = 0; i < node.childNodes.length; i++){
				result.push(node.childNodes[i].xml);
		      }
			return result.join("");

		},

		parseXMLString : function(str) { 
			      if(window.ActiveXObject)
				{
					var msloader = new ActiveXObject("Microsoft.XMLDOM");
					msloader.async = true;
					msloader.loadXML(str); 
					var err = msloader.parseError;
					if(err.errorCode != 0){
						this.alertError(err.reason,str);
					}
					return msloader;
				}
				else
				{
					var ffloader = new DOMParser();
					var element = ffloader.parseFromString(str, "text/xml"); 
					if(element.firstChild.tagName == 'parsererror'){
						this.alertError(element.firstChild.firstChild.nodeValue,str);
					}
					return element;
				}
		},
		alertError : function(description,context){
			throw new Error('error:' + description + ' context: ' + context);
		}
	});
	
	
	
	var Url = {

    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}