function CAHelper()
{
    var waiter;
    var from;
    var to;
    this.init = Init;
    this.call = CallBack;
    this.complete = Complete;
    this.unescape = UnEscape;
    this.setFromTo = FromTo;
    this.getFrom = GetFrom;
    this.getTo = GetTo;
    
    function FromTo(f, t)
    {
     from = f;
     to = t;
    }
    
    function GetFrom(){return from;}
    function GetTo(){return to;}
    
    function CallBack(elem, ids)
    {
     Init();
     var xml = grabData(ids);
     elem.Callback(xml);
    }
    
    function UnEscape(s)
    {
        s=s.replace(/&amp;/g,'&'); 
        s=s.replace(/&gt;/g,'>');
        s=s.replace(/&lt;/g,'<');
        return s;
    }

    function Complete()
    {
        waiter.hide();
    }
    
    function Init()
    {
     waiter = new Waiter();
     waiter.init('Callback in progress!');
     waiter.show();
    }
    
    function grabData(controlsids)
    {
	    var xml = "<?xml version=\"1.0\"?><root>";
	    var currEl;
	    var currVal;
	    for(i = 0; i < controlsids.length; i++)
	    {
	        currEl = $(controlsids[i]);

		    if(currEl.type == 'checkbox')
			    currVal = currEl.checked;
		    else if(currEl.nodeName == 'TABLE')
		        currVal = getVal(currEl);
		    else
			    currVal = currEl.value;
		    xml += "<control id=\"" + controlsids[i] + "\">" + currVal + "</control>";
	    }
	    xml += "</root>";
	    return xml;
    }

    function getVal(el)
    {
        var inputs = el.getElementsByTagName('input');
        var i=0;
        var ret = '';
        for(;i<inputs.length;i++)
        {
            if(inputs[i].checked)
                ret = inputs[i].value;
        }
        return ret;
    }

    function findElement(parentEl, searchedElId)
    {
	    var element;
	    var childs = parentEl.childNodes;
	    if(childs == null || childs == 'undefined' || childs.length == 0) return null;
	    var i;
	    var temp;
	    for(i = 0; i < childs.length; i++)
	    {
		    if(childs[i].id == searchedElId)
		    {
			    element = childs[i];
			    break;
		    }
		    else
		    {
			    temp = findElement(childs[i], searchedElId);
			    if(temp != null && temp != 'undefined')
			    {
				    element = temp;
				    break;
			    }
		    }
	    }	
	    return element;
    }
}
function $(element)
{
 return document.getElementById(element);
}

function Waiter()
{
    var waitElement;
    var scrollX, scrollY = -1;
    var waitMsg = '';
    
    this.init = Init;
    this.show = ShowWaitElement;
    this.hide = HideWaitElement;
    this.msg = SetMsg;
    
    function Init(msg)
    {
        waitMsg = msg;
        CreateWaitElement();
        if (window.addEventListener) {
        window.addEventListener('scroll', MoveWaitElement, false);
        window.addEventListener('resize', MoveWaitElement, false);
        }
        else if (window.attachEvent) {
        window.attachEvent('onscroll', MoveWaitElement);
        window.attachEvent('onresize', MoveWaitElement);
        }
    }
    function MoveWaitElement() 
    {
	    var scrollYT, scrollXT;
	    if (!waitElement)
		    CreateWaitElement();
	    if (typeof(window.pageYOffset) == "number") { 
		    scrollYT = window.pageYOffset; 
		    scrollXT = window.pageXOffset; 
	    } 
	    else if (document.body && document.documentElement && document.documentElement.scrollTop) { 
		    scrollYT = document.documentElement.scrollTop; 
		    scrollXT = document.body.scrollLeft;
	    }
	    else if (document.body && typeof(document.body.scrollTop) == "number") { 
		    scrollYT = document.body.scrollTop; 
		    scrollXT = document.body.scrollLeft; 
	    } 
	    if (scrollX != scrollXT || scrollY != scrollYT) {
		    scrollX = scrollXT;
		    scrollY = scrollYT;
		    var width = document.body.clientWidth;
		    waitElement.style.top = scrollYT + "px";
		    waitElement.style.right = -scrollXT +  "px";
	    }
    }
    function CreateWaitElement()
    {
	    var elem = $('__AjaxCall_Wait');
	    if (!elem) {
	    elem = document.createElement("div");
	    elem.id = '__AjaxCall_Wait';
	    elem.style.position = 'absolute';
	    elem.style.height = 17;
	    elem.style.paddingLeft = "3px";
	    elem.style.paddingRight = "3px";
	    elem.style.fontSize = "11px";
	    elem.style.fontFamily = 'Arial, Verdana, Tahoma';
	    elem.style.border = "#000000 1px solid";
	    elem.style.backgroundColor = "DimGray";
	    elem.style.color = "#ffffff";
	    elem.innerHTML = waitMsg;//'Waiting for data ...';
	    elem.style.visibility = 'hidden';
	    document.body.insertBefore(elem, document.body.firstChild);
	    }
	    waitElement = elem;
    }
    function SetMsg(msg)
    {
    	if (waitElement)
	     waitElement.innerHTML = msg;
    }
    function HideWaitElement()
    {
    	if (waitElement)
	    {
		    waitElement.style.visibility = 'hidden';
	    }
    }
    function ShowWaitElement()
    {
	    if (waitElement)
	    {
		    waitElement.style.visibility = 'visible';
		    MoveWaitElement();
	    }
    }
}
