function c1wc_C1WebChart(context)
{
    this._context = context;
    this.General = function(parameter)
        { c1cb_doCallback(null,context,parameter,function(){ context.argument="general";},c1wc_ReceiveServerData);}
    this.Click = function(event)
        {
            var wcinfo = c1wc_getChartClickInfo(event);
            var parameter = wcinfo.x.toString() + "," + wcinfo.y.toString();
            c1cb_doCallback(null,context,parameter,function(){ context.argument="click";},c1wc_ReceiveServerData);
        }
    this.AxisScroll = function(event)
        {
            var wcinfo = c1wc_getChartClickInfo(event);
            var parameter = wcinfo.x.toString() + "," + wcinfo.y.toString();
            c1cb_doCallback(null,context,parameter,function(){ context.argument="scrollbar";},c1wc_ReceiveServerData);
        }
}

function c1wc_getChartClickInfo(event)
{
    // assumes the event is for chart or chart image map element(s)
    var result = new Object();
    var e = window.event ? window.event : event;
    var el = window.event ? window.event.srcElement : event.target;
    var chartel = c1wc_findChartElement(el);
    var chartpos = c1wc_getElementPosition(chartel);
    result.x = e.clientX - chartpos.x + c1wc_getBrowserScrollX();
    result.y = e.clientY - chartpos.y + c1wc_getBrowserScrollY();
    result.id = el.id;
    result.tagName = el.tagName;
    result.title = el.title;
    result.alt = el.alt;
    result.name = el.name;
    return result;
}

function c1wc_isIE()
{
	return window.navigator.appName.toLowerCase().indexOf('explorer') >= 0;
}

function c1wc_getBrowserScrollX()
{
	if(c1wc_isIE())
	{
		if (document.documentElement && document.documentElement.scrollLeft)
			return document.documentElement.scrollLeft;
		else if (document.body)
			return document.body.scrollLeft;
	}
	else
	{
		return window.pageXOffset;
	}
	return 0;
}

function c1wc_getBrowserScrollY()
{
	if(c1wc_isIE())
	{
		if (document.documentElement && document.documentElement.scrollTop)
			return document.documentElement.scrollTop;
		else if (document.body)
			return document.body.scrollTop;
	}
	else
	{
		return window.pageYOffset;
	}
	return 0;
}


function c1wc_findChartElement(area_or_chart_element)
{
    // finds the chart element from one of its map's area tags
    // or from the chart itself.
    var el = area_or_chart_element;
    if(el.tagName == "AREA")
    {
        el = el.parentNode;
        if(el.tagName == "MAP")
        {
            var cname = el.name;
            if(cname.length > 4 && cname.substr(cname.length-4) == "_MAP")
            {
                cname = cname.substr(0,cname.length-4);
                var nel = el.previousSibling;
                while(nel != null && (nel.tagName != "IMG" || nel.id != cname))
                    nel = nel.previousSibling;
                    
                if(nel.id == cname)
                    el = nel;
            }
        }
    }
    return (el.tagName == "IMG") ? el : area_or_chart_element;
}

function c1wc_getElementPosition(element) {
    var result = new Object();
    result.x = 0;
    result.y = 0;
    result.width = 0;
    result.height = 0;
    if (element.offsetParent) {
        result.x = element.offsetLeft;
        result.y = element.offsetTop;
        var parent = element.offsetParent;
        while (parent) {
            result.x += parent.offsetLeft;
            result.y += parent.offsetTop;
            var parentTagName = parent.tagName.toLowerCase();
            if (parentTagName != "table" &&
                parentTagName != "body" && 
                parentTagName != "html" && 
                parentTagName != "div" && 
                parent.clientTop && 
                parent.clientLeft) {
                result.x += parent.clientLeft;
                result.y += parent.clientTop;
            }
            parent = parent.offsetParent;
        }
    }
    else if (element.left && element.top) {
        result.x = element.left;
        result.y = element.top;
    }
    else {
        if (element.x) {
            result.x = element.x;
        }
        if (element.y) {
            result.y = element.y;
        }
    }
    if (element.offsetWidth && element.offsetHeight) {
        result.width = element.offsetWidth;
        result.height = element.offsetHeight;
    }
    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {
        result.width = element.style.pixelWidth;
        result.height = element.style.pixelHeight;
    }
    return result;
}

function c1wc_removeElementById(id)
{
    var element = document.getElementById(id);
    if (element && element.parentNode && element.parentNode.removeChild)
        element.parentNode.removeChild(element);
}

function c1wc_ReceiveServerData(data, context)
{
    var el = document.getElementById(context.id);
    if (el)
    {
        var res = c1cb__decodeString(data);
        el.src = res[0];
        if(res[1].length > 0)
            el.alt = res[1];
        else
            el.removeAttribute("alt");
        if(res[2].length > 0)
            el.title = res[2];
        else
            el.removeAttribute("title");
        
        var map = document.getElementById(context.id + "_MAP");
        if(map != null)
        {
            if(res[3].length > 0)
                map.innerHTML = res[3];
            else
            {
                el.removeAttribute("usemap");
                c1wc_removeElementById(context.id + "_MAP");
            }
        }
        else
        {
            if(res[3].length > 0)
            {
                var waitCtrl = document.getElementById(context.id + "_wait_ctl");
                if(waitCtrl == null)
                    waitCtrl = el;
                    
                el.setAttribute("usemap", "#" + context.id + "_MAP");
                map = document.createElement("map");
                map.name = context.id + "_MAP";
                map.id = context.id + "_MAP";
                map.innerHTML = res[3];
                
                el.parentNode.insertBefore(map, waitCtrl.nextSibling);
            }    
        }

        if(res[4].length > 0)
        {
            eval(res[4]);
        }
    }
}
