includeScript("_debug");

var bDetected,
    sType,
    sName,
    sVersion,
    sOptions;

/**
 * Initializes the detection process with the given parameters.
 *
 * @param {string} sType - The type of the item to detect. Defaults to "unknown".
 * @param {string} sName - The name of the item to detect. Defaults to "unknown".
 * @param {string} [sVersion] - The version of the item to detect. Optional.
 * @param {string} [sOptions] - Additional options for detection. Optional.
 */
function init(sTypeInput, sNameInput) {
    if (!sTypeInput) _error("No input type.");

    sType = sTypeInput;
    sName = sNameInput;

    sVersion = arguments[2] ? arguments[2] : "";
    sOptions = arguments[3] ? arguments[3] : "";

    bDetected = false;
}

/**
 * Processes the detection result and resets the detection variables.
 * 
 * If a detection has been made (bDetected is true), this function sets the result
 * using the _setResult function with the provided type, name, version, and options.
 * After setting the result, it resets the detection flag (bDetected) to false.
 * 
 * Regardless of whether a detection was made, it resets the sName, sVersion, and sOptions
 * variables to empty strings.
 */
function result() {
    if (bDetected) {
        _setResult(sType, sName, sVersion, sOptions);

        bDetected = false;
    }

    sName = String();
    sVersion = String();
    sOptions = String();

    var resultValue = bDetected;

    bDetected = false;

    return resultValue;
}

/**
 * Gets the primitive value of the current object.
 * @type {string}
 */
String.prototype.append = function() {
    var s = this.valueOf(),
        sep = ",";

    if (arguments.length) {
        if (s) s += sep;
        s += Array.prototype.join.call(arguments, sep);
    }

    return s;
}

/**
 * Append a string with a custom separator.
 * @param {String} sString - String to append.
 * @param {String} [sSep=","] - Separator string.
 * @returns {String} The new string.
 * @global
 * @example
 * sOptions=sOptions.appendS("debug","::");
 */
String.prototype.appendS = function(sString, sSep) {
    var s = this.valueOf(),
        sep = sSep || ",";

    if (sString) {
        if (s) s += sep;
        s += sString;
    }

    return s;
}

String.prototype.addIfNone = function(substring) {
    var s = this.valueOf();

    if (substring && s.indexOf(substring) < 0)
        s += substring;

    return s;
}

/**
 * Pad the start of a line with spaces or the character given.
 * This reimplements missing functionality of the more modern ECMAScript.
 * @param {String or Number} The width desired.
 * @param {Number} [nPad=" "] The padding string. Loops.
 * @returns {String} The new string.
 * @global
 * @example
 * var a = 12; ...; if("aba12" === a.padStart(5,"ab")) ...
 */
String.prototype.padStart = function(targetLength, padString) {
    var s = this.valueOf();

    targetLength = targetLength >> 0; // truncate if number or convert non-number to 0;
    padString = String(padString || ' ');

    if (s.length >= targetLength) {
        return String(s);
    }

    targetLength = targetLength - s.length;
    if (targetLength > padString.length) {
        padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed
    }

    return padString.slice(0, targetLength) + String(s);
}

Number.prototype.padStart = function(targetLength, padString) {
    var s = this.valueOf().toString();

    targetLength = targetLength >> 0; // truncate if number or convert non-number to 0;
    padString = String(padString || ' ');

    if (s.length >= targetLength) {
        return s;
    }

    targetLength = targetLength - s.length;
    if (targetLength > padString.length) {
        padString += padString.repeat(Math.ceil(targetLength / padString.length)); // append to original to ensure we are longer than needed
    }

    return padString.slice(0, targetLength) + s;
}

includeScript("language");