function kaprekar() {
    var myText = document.getElementById('inText').value;
    myText = trim(myText);

    var length = myText.length;
	if( length < 3 || length > 4 ) {
	    alert("Your number should be only 3 or 4 digits.");
	    return;
    }

    if( !isInt(myText) ) {
        alert("Your number should be an integer.");
        return;
    }

    if( isRepDigit(myText) ) {
        var message = "Your number should have at least 2 different digits. ";
        message += "Leading zeros are allowed.";
        alert(message);
        return;
    }


    var previousNum = myText;
    var sorted = previousNum.split("").sort().join("");
    var reversed = sorted.split("").reverse().join("");
    var diff = reversed - sorted;
    diff = leftPad( diff.toString(), '0', length );
    var outputText = "";

    do  {
        outputText += reversed + " - " + sorted + " = " + diff + "\n";

        previousNum = diff.toString();
        sorted = previousNum.split("").sort().join("");
        reversed = sorted.split("").reverse().join("");
        diff = reversed - sorted;
        diff = leftPad( diff.toString(), '0', length );

    } while( diff != previousNum );

    var textoutelement = document.getElementById("myTextarea");
    textoutelement.value = outputText;

}

function isInt(x) {
    x = trimLeadingZeroes(x);
    var y = parseInt(x, 10);

    if( isNaN(y) ) {
        return false;
    }

    return ( (x == y) && (x.toString() == y.toString()) );
}

function leftPad(str, padString, length) {
    while (str.length < length) {
        str = padString + str;
    }
    return str;
}

function trim(str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

function trimLeadingZeroes(str) {
    return str.replace(/^00*/, '');
}

function isRepDigit(x) {
    arr = x.split("");
    var a = arr[0];
    for( i = 1; i < arr.length; ++i ) {
        if( arr[i] != a ) {
            return false;
        }
        a = arr[i];
    }
    return true;
}
