﻿var ruler = null;
var dotsChars = "...";
var minDeltaDiff = 5;
var maxTries = 3;

function measureString(text) {
    var ruler = document.getElementById("ruler");
    ruler.innerHTML = text;
    return ruler.offsetWidth;
}
//Optimized trimming algorithm
function trimToPxOpt(text, length, htmlEncode) {
    var trimmed = text;

    var currentMeasure = measureString(text);

    if (currentMeasure > length) {

        trimmed = trimmed + dotsChars;
        var diffDelta = currentMeasure;
        var p = length / currentMeasure;
        var c = trimmed.length * p;
        trimmed = trimmed.substring(0, c) + dotsChars;

        var diff;
        var lastDelta;
        var lastTrimmed = trimmed;
        var tries = 0;

        for (; ; ) {
            currentMeasure = measureString(trimmed);

            diff = currentMeasure - length;
            lastDelta = diffDelta;
            diffDelta = Math.abs(diff);

            if (diffDelta <= minDeltaDiff) {
                break;
            }
            else {
                if (lastDelta < diffDelta) {
                    trimmed = lastTrimmed; //recover backup
                    break;
                } else {
                    if (tries >= maxTries && lastDelta == diffDelta) {
                        break;
                    }
                    else {
                        lastTrimmed = trimmed; //backup

                        if (diff > 0) {
                            trimmed = text.substring(0, trimmed.length - 4) + dotsChars;
                        } else {
                            trimmed = text.substring(0, trimmed.length - 2) + dotsChars;
                        }
                        tries++;
                    }
                }
            }
        }
    }

    if (trimmed.length > text.length) {
        trimmed = text;
    }

    if (htmlEncode) {
        return getHTMLEncode(trimmed);
    } else {
        return trimmed;
    }
}
function trimToPx2(text, length) {
    return trimToPxOpt(text, length, false);
}

function trimToPx(text, length) {
    return trimToPxOpt(text, length, true);
}

function getHTMLEncode(t) {
    var ret =
        t.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    ret = ret.replace(/"/g, "&quot;");

    return ret;
}

function spanTrimToPx(spanId, length) {
    try {
        var spanControl = document.getElementById(spanId);
        spanTrimToPx01(spanControl, length);
    } catch (e) {
        alert("Error " + e.message + "\n" + e.stackTrace);
    }
}

function spanTrimToPx2(spanId, length) {
    try {
        var spanControl = document.getElementById(spanId);
        spanTrimToPx02(spanControl, length);
    } catch (e) {
        alert("Error " + e.message + "\n" + e.stackTrace);
    }
}

function spanTrimToPx01(spanControl, length) {
    try {
        if (spanControl) {
            var text = spanControl.title;
            spanControl.innerHTML = trimToPx(text, length);
        } else {
            //alert(spanId);
        }
    } catch (e) {
        alert("Error " + e.message + "\n" + e.stackTrace);
    }
}

function spanTrimToPx03(spanControl, length) {
    try {
        if (spanControl) {
            if (spanControl.firstChild != null) {
                if (spanControl.firstChild.tagName == 'DIV') {
                    var text = spanControl.firstChild.innerHTML;
                    spanControl.firstChild.innerHTML = trimToPx(text, length);
                }
            }
            else {
                var text = spanControl.innerHTML;
                if (text != null) {
                    spanControl.innerHTML = trimToPx(text, length);
                }
            }
        } else {
            //alert(spanId);
        }
    } catch (e) {
        alert("Error " + e.message + "\n" + e.stackTrace);
    }
}

function spanTrimToPx02(spanControl, length) {
    try {
        if (spanControl) {
            var text = '';
            var part1 = '';
            var part2 = '';
            var part3 = '';

            var breakline = '';

            if (spanControl.firstChild != null) {
                if (spanControl.firstChild.tagName == 'DIV') {
                    text = spanControl.firstChild.innerHTML;

                    if (navigator.appName.indexOf('Explorer') > -1) {
                        breakline = '<BR>';
                        length += 150;
                    }
                    else {
                        breakline = '<br>';
                    }

                    part1 = text.substring(0, text.indexOf(breakline)).replace(breakline, '');
                    text = text.substring(text.indexOf(breakline), text.length).replace(breakline, '');
                    part2 = text.substring(0, text.indexOf(breakline)).replace(breakline, '');
                    text = text.substring(text.indexOf(breakline), text.length).replace(breakline, '');
                    part3 = text;


                    part1 = trimToPx2(part1, length / 2);
                    part2 = trimToPx2(part2, length / 2);
                    part3 = trimToPx2(part3, length);

                    spanControl.firstChild.innerHTML = part1 + ' ' + part2 + breakline + part3;
                }
            }
            else {
                text = spanControl.innerHTML;
                spanControl.innerHTML = trimToPx2(text, length);
            }

        } else {
            //alert(spanId);
        }
    } catch (e) {
        alert("Error " + e.message + "\n" + e.stackTrace);
    }
}

