mibu
4/30/2017 - 10:26 AM

js_codeschool.js

/*============================================================
=            JavaScript Best Practices Codeschool            =
============================================================*/
/*==========  “AND” IS USEFUL IN CONTINGENT ASSIGNMENTS  ==========*/
var armoryIsOpen = false;
var isKnight = true;
var weapon = armoryIsOpen && isKnight && armory.retriveSword("Claymore");

/*==========  FALL-THROUGH SWITCH ALLOWS HIERARCHICAL CODE EXECUTION  ==========*/
function ceremonialDagger(knight, rank) {
    this.length = 8;
    this.owner = knight;
    switch (rank) {
        case "King":
            this.diamonds = 1;
        case "High Constable":
            this.amethyst = 2;
        case "Field Marshal":
            this.sapphires = 4;
        case "Captain":
            this.emeralds = 1;
        case "Knight":
            this.rubies = 6;
    }
}
var kingsDagger = new ceremonialDagger("Arthur", "King");

/*==========  Optimized for loop  ==========*/
var list = treasureChest.necklaces;
for (var i = 0, x = treasureChest.necklaces.length; i < x; i++) {
    console.log(list[i]);
};


/*==========  USE A DOCUMENT FRAGMENT TO INSERT ADDITIONS ALL AT ONCE  ==========*/

var list = document.getElementById("kotwList"),
    kotw = ["Jenna Rangespike",
        "Neric Farthing",
        "Darkin Stonefield"
    ],
    fragment = document.createDocumentFragment(),
    element;
for (var i = 0, x = kotw.length; i < x; i++) {
    element = document.createElement("li");
    element.appendChild(document.createTextNode(kotw[i]));
    fragment.appendChild(element);
}
list.appendChild(fragment);

/*==========  CONSOLE.TIME LETS US COMPARE IMPLEMENTATIONS  ==========*/
console.time("Time to add " + firstRegimentNewbs.length + " Knights");
console.timeEnd("Time to add " + firstRegimentNewbs.length + " Knights");

/*==========  SPEED TEST CLASS  ==========*/
function SpeedTest() {
    this.testImplement = testImplement;
    this.testParams = testParams;
    this.repetitions = repetitions || 10000;
    this.average = 0;
}

SpeedTest.prototype = {
    startTest: function() {
        var beginTime, endTime, sumTimes = 0;
        for (var i = 0, x = this.repetitions; i < x; i++) {
            beginTime = +new Date();
            this.testImplement(this.testParams);
            endTime = +new Date();
            sumTimes += endTime - beginTime;
        }
        this.average = sumTimes / this.repetitions;
        return console.log("Average execution across " +
            this.repetitions + ": " +
            this.average);
    }
}

/*==========  Error Handling  ==========*/
try {
    var newHallOfFame = ["Dask Frostring", "Render Tallborn"];
    if (list === undefined) {
        throw new ReferenceError();
    }
    if (list instanceof Array) === false) {
    throw new TypeError();
}
list.concat(newHallOfFame);
} catch (error) {
    if (error instanceof ReferenceError) {
        alert('List doesn\'n exist');
    }
    if (error instanceof TypeError) {
        alert('Alas, \"list\" exists, but is no longer an Array.\n');
    }
}

/*==========  Error Handling #2  ==========*/
function changeInnerHTMLByIdOrExisting(id, update, existing) {
    try {
        var newElement = undefined;
        document.getElementById(id).innerHTML = update;
    } catch (error) {
        try {
            var elements = document.getElementByTagName('*');
            for (var i = 0, x = elements.length; i < x; i++) {
                if (elements[i].innerHTML === existing) {
                    elements[i].innerHTML = update;
                    id = elements[i].id;
                    break;
                }
                if (i === x) {
                    throw new Error("An existing element" +
                        "was not found.");
                }

            }
        } catch (error2) {
            alert(error2.message + "\nCreating new text node.");
            newElement = document.createTextNode(update);

        }
    } finally {
        if (newElement !== undefined) {
            console.log("Returning new" +
                "text node...");
            return newElement;
        }
    }
}


/*-----  End of JavaScript Best Practices Codeschool  ------*/
/*=======================================
=            Decimal Numbers            =
=======================================*/

function tax(price, percent) {
    return parseFloat(price * percent / 100).toFixed(2);
}


typeof NaN; // number
console.log(NaN === NaN); //false
isNaN("42"); //false

function isThisActuallyANumberDontLie(data) {
    return (typeof data === "number" && !isNaN(data));
}

function checkValidZip() {
        var entry = document.getElementById("zip").value;
        var userZip = parseInt(entry);
        try {
            if (isThisActuallyANumberDontLie(userZip)) {
                if (userZip.toFixed(0).length === 5) {
                    return true;
                } else {
                    throw new Error("Nope!");
                }
            } else {
                throw new Error("Nope!");
            }
        } catch (e) {
            if (e.message === "Nope!") {
                alert("Please enter a valid zip, dude.");
                return false;
            }
            // other error responses go here...
        }

    }
    /*-----  End of Decimal Numbers  ------*/
    /*=================================
    =            Namespace            =
    =================================*/

var HOFMASTER = {
    list: ["Jar Treen", "Maximo Rarter", "Pol Grist"],
    hof: document.getElementById("hof"),
    fragment: document.createDocumentFragment(),
    element: undefined,
    displayHOF: function() {
        for (var i = 0, x = this.list.length; i < x; i++) {
            this.element = document.createElement("li");
            this.element.appendChild(document.createTextNode(this.list[i]));
            this.fragment.appendChild(this.element);
        }
        this.hof.appendChild(this.fragment);
    }
    BIOGRAPHIES: {
        "Jar Treen": * some text on Jar * ,
        "Maximo Rarter": * some text on Maximo * ,
        "Pol Grist": * some text on Pol * ,
        list: * some useful list of biography data *
            unfoldBio: function(member) { * adds text from this[member] to some element *
            } * etc *
    }
};

/*-----  End of Namespace  ------*/
/*===============================
=            Modules            =
===============================*/
var ARMORY = (function() {

    var weaponList = [ * list of weapon Objects * ];
    var armorList = [ * list of armor Objects * ];

    var removeWeapon = function(...) {};
    var replaceWeapon = function(...) {};
    var removeArmor = function(...) {};
    var replaceArmor = function(...) {};

    return {
        makeWeaponRequest: function(...) {},
        makeArmorRequest: function(...) {}
    };
})();

ARMORY.makeWeaponRequest("Excalibur");

/*-----  End of Modules  ------*/
/*======================================
=            Global imports            =
======================================*/
var wartime = true;
var ARMORY = (function(war) {
    var weaponList = [ * list of weapon Objects * ];
    var armorList = [ * list of armor Objects * ];
    var removeWeapon = function(...) {};
    var replaceWeapon = function(...) {};
    var removeArmor = function(...) {};
    var replaceArmor = function(...) {};
    return {
        makeWeaponRequest: function(...) {
            if (war) //let civilians have weaponry
        },
        makeArmorRequest: function(...) {}
    };
}(wartime));

ARMORY = (function(oldNS) {
    var oilBarrels = 1000;
    var catapults = ["Stoneslinger",
        "Rockrain",
        "The Giant's Arm"
    ];
    oldNS.assignCatapult = function(regiment) {
        //hooks up a regiment with a sweet catapult     
        //and some oil barrels! 
    };
    return oldNS;
})(ARMORY);




/*-----  End of Global imports  ------*/