function Custom_GetElementById(elementId) {
    if (document.getElementById) {
        return document.getElementById(elementId);
    }
    else if (document.all) {
        return document.all[elementId];
    }
    else return null;
}

function Custom_GetElementByTagName(element, tagName) {
    var elements = WebForm_GetElementsByTagName(element, tagName);
    if (elements && elements.length > 0) {
        return elements[0];
    }
    else return null;
}

function Custom_GetElementsByTagName(element, tagName) {
    if (element && tagName) {
        if (element.getElementsByTagName) {
            return element.getElementsByTagName(tagName);
        }
        if (element.all && element.all.tags) {
            return element.all.tags(tagName);
        }
    }
    return null;
}

function Custom_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 Custom_GetParentByTagName(element, tagName) {
    var parent = element.parentNode;
    var upperTagName = tagName.toUpperCase();
    while (parent && (parent.tagName.toUpperCase() != upperTagName)) {
        parent = parent.parentNode ? parent.parentNode : parent.parentElement;
    }
    return parent;
}

function Custom_SetElementHeight(element, height) {
    if (element && element.style) {
        element.style.height = height + "px";
    }
}

function Custom_SetElementWidth(element, width) {
    if (element && element.style) {
        element.style.width = width + "px";
    }
}

function Custom_SetElementX(element, x) {
    if (element && element.style) {
        element.style.left = x + "px";
    }
}

function Custom_SetElementY(element, y) {
    if (element && element.style) {
        element.style.top = y + "px";
    }
}

function Custom_GetSpanTextData(spanElement)
{
    if (spanElement.firstChild)
        return spanElement.firstChild.data;
    else
        return '';
}

function Custom_SetSpanTextData(spanElement, value)
{
    if (spanElement.firstChild)
        spanElement.firstChild.data = value;
    else
        spanElement.appendChild(document.createTextNode(value));
}

function Custom_TruncateCellSpan(spanId)
{
	var span = Custom_GetElementById(spanId);
	var cell = span.parentNode;
	var cellWidth = 0;
	
	if (cell.style && cell.style.pixelWidth)
	{
	    cellWidth = cell.style.pixelWidth;
	}
	else
	{
	    var padding = 0;
	    
	    if(cell.parentNode.parentNode.parentNode.cellPadding)
	        padding = cell.parentNode.parentNode.parentNode.cellPadding;
	        
	    cellWidth = cell.offsetWidth - 2 * padding;
	}
	
	if(cellWidth < span.offsetWidth)
	{
	    var fullText = span.innerText;
	    var escapedFullText = fullText.split('\'').join('\\\'');
        
	    var link = document.createElement('a');
	    link.innerText = '...';
	    link.title = span.innerText;
	    link.href = 'javascript:alert(\'' + escapedFullText + '\')';
	    
	    if(span.nextSibling)
	        cell.insertBefore(link, span.nextSibling);
        else	    
	        cell.appendChild(link);
	    
	    var linkWidth = link.offsetWidth;
	    var avalaibleWidth = cellWidth - linkWidth - 6;
	    
	    var borneSup = fullText.length;
	    var borneSupWidth = span.offsetWidth;
	    var borneInf = 0;
	    var borneInfWidth = 0;
	    
	    while(borneSup != borneInf + 1)
	    {
	        var valeurTest = Math.ceil(borneInf + (borneSup - borneInf) * ( (avalaibleWidth - borneInfWidth) / (borneSupWidth - borneInfWidth) ) );
	        if (valeurTest == borneSup)
	            valeurTest = borneSup - 1;
	        else if(valeurTest == borneInf)
	            valeurTest = borneInf + 1;
	            
	        span.innerText = fullText.substring(0, valeurTest);
	        if(span.offsetWidth > avalaibleWidth)
	        {
	            borneSup = valeurTest;
	            borneSupWidth = span.offsetWidth;
	        }   
	        else
	        {
	            borneInf = valeurTest;
	            borneInfWidth = span.offsetWidth;
	        }
	    }
	    
	    span.innerText = fullText.substring(0, borneInf);
	}
}