=====
CS 328 - Week 14 Lecture 1 - 2025-04-28
=====

=====
TODAY WE WILL
=====
*   announcements
*   START our WHIRLWIND TOUR to client-side JavaScript!!!!!
*   prep for next class

=====
*   should start working on Homework 11!
    *   at-least-1st attempts due by 11:59 pm on Friday, May 2
    *   submit files early and often!

=====
*   zyBooks Chapter 7 - 7.1, 7.7, 7.8, 7.9 - "JavaScript Fundamentals"
    is now available from the course Canvas site
    *   starting that material in class today!
    *   but for full credit, the activities should be completed by
        11:59 pm on Friday, May 9

=====
*   I tried to compile some of the PHP "survival tips" we have
    discovered so far, and these are now posted on the course
    "Selection of PHP References" page:

    *   see: "PHP Survival Tips" link

    *   these may be useful reminders as you are working on
        Homework 11's Problems 1 and 3!
   
=====
INTRO to CLIENT-SIDE JAVASCRIPT
=====
*   FIRST:

    JavaScript != Java !!!!!!!!!!!!

    *   very different languages!
    *   (although JavaScript's name WAS partially to "ride" on
        Java's popularity coattails in the mid-1990s...!)

    *   and both WERE designed with web programming
        considerations in mind

    *   note that while both have control structures
	following C/C++'s { } style,

        we talked about a number of important differences,
	such as (just a FEW of the differences!)
	*   Java being strongly-typed language,
	    JavaScript being a loosely-typed scripting language
	    
        *   Java's objects being class-based
	        (define a class, THEN can create OBJECTS
	        of that class),
            JavaScript using a more prototype-based
	        object system (can just create an object if
	        you wish...!)

        *   newer versions of Java have some support for
	    so-called functional programming -- ONE aspect of
	    this being able to treat functions as first-class
	    objects, able to be passed as arguments and returned
	    by functions --

	    Javacript has better support for such functional
	    programming;

=====
*   SECOND:

    JavaScript CAN be run on the client-tier
    (and that's where JavaScript STARTED)
    *   often called client-side JavaScript
    *   typically executed within a browser

    JavaScript CAN also be run on the application-tier
    (has become a very popular option, also)
    *   often called server-side JavaScript
    *   Node.js is an example of a popular server-side JavaScript
        framework? library?
	*   AFTER CLASS: nodejs.org calls it neither, but rather
	    "an asynchronous event-driven JavaScript runtime [environment]"...!

*   we are focusing on client-side JavaScript in CS 328
    *   we want to see how it can interact with the DOM - Document Object
        Model - to do dynamic things with an executing HTML document
	in a browser!

=====
*   fun fact: JavaScript is an implementation of the ECMAScript
    specification

    *   BUT: the ECMAScript specification does NOT describe the
        DOM (Document Object Model) -- that's standardarized
	by the World Wide Web Consortium (W3C)

        The DOM defines the way in which HTML documents are
	exposed to your script

=====
*   for CS 328, you are expected to use unobtrusive-style JavaScript,
    trying to keep it more separate from the content by limiting it
    to within an HTML document's head element

    *   In particular, you are expected to put your JavaScript script
        elements at the end of an HTML document's head element,
	after its CSS link elements

=====
*   For CS 328, here are the two accepted elements for JavaScript
    embedded within a document's head element:

    really, it is one element! the script element

    *   but for JavaScript code embedded in the head element:

        <script type="text/javascript">
	
           // JavaScript statements here

        </script>

    *   and for JavaScript you are using from an external JavaScript file:

        <script src="file-or-URL.js" type="text/javascript"></script>

        *   that is, when the script element has a src attribute, it will
	    not have content;

        *   but, since script element CAN have content, for strict-style it
	    MUST have an end tag, even when it is referencing an external
	    JavaScript file

        *   [note: adding after class, so you'll find it here if referencing
            this later - it is also mentioned in the Week 14 Lab Exercise
            handout]

            *   NOTE that, for external JavaScripts, it is also USEFUL to add 
                ONE of these ADDITIONAL attributes (written using the 
                course-required strict style):

                async="async"
                defer="defer"

                *   BOTH of these tell the browser it is SAFE to 
                    continue parsing HTML while this external JavaScript is 
                    being downloaded; 

                    (that is, both are assuring the browser you are using 
                    good modern practice of NOT modifying the DOM until the 
                    page is loaded)

                *   async="async" 

                    ...means that this external JavaScript can be downloaded 
                    at the same time as HTML parsing and other JavaScript downloads 
                    
                    (for example, it does not depend on anything from a 
                    previous JavaScript)

                *   defer="defer" 

                    ...means that, while it can be downloaded at the same time 
                    as HTML parsing, the JavaScripts need to be executed 
                    in the order their script elements appear (for example, 
                    because one uses a function from an earlier one)

*   and external JavaScript should be in a file with suffix .js

=====
introductory bits of JS syntax:
=====
*   JS does not require variable names to start with $;
    they CAN, but because that's commonly used in MANY JS libraries,
    it is considered POOR STYLE to start a "plain" JavaScript variable
    with a $

*   It is considered GOOD STYLE to declare variables usiong the keyword
    let or var -- BUT we are in them world of scripting languages,
    so no type is required

    *   the scope can differ based on if you use let or var -- we'll
        tend to use let

        let message;     // declared a variable named message
   
        let count = 0;   // declared a variable named count and initialized it to 0

        // and once declared, can assign and change variables' values

        message = "Moooooo";
        count = "Looky";

*   the DOM (Document Object Model) specifies a JavaScript object
    named document

    your client-side JavaScript can access parts of the currently-executing
    HTML document by using this document object

    *   it's an object! It has data fields/properties and methods/functions!

        *   (and you access an object's data fields/properties and
	    methods/functions as in C++, Java, Python:

	    my_obj.desired_data_field
	    my_obj.desired_method(arg1, arg2, ...)
	    )

    *   and all of the elements within the currently-executing HTML document
        have corresponding JavaScript objects that are descendants
	within the JavaScript document object!

=====
*   One handy method of JavaScript's document object is getElementById:
    it expects the value of an id attribute,
    and returns a reference to the JavaScript DOM object representing
    that particular element within the current document

*   The DOM exposes all of an HTML element's attributes, one way or
    another, and provides data fields/properties and methods for obtaining
    them and even changing them in the current *executing* HTML
    document

    *   for example, for an input with type="text",
        the corresponding DOM object has a data field named value,
	representing the current contents of that textfield

    *   another example: for a non-void element, a data field named
        innerHTML represents its content
	*   (side note: it is considered bad form to set data field innerHTML
	    to anything by plain text content... you SHOULD
	    use methods such as createElement, appendChild, insertBefore,
	    replaceChild, etc. to ADD an element to the document object)

        *********
    *   IMPORTANT gotcha to note: an element's attribute names are
        NOT always the same as the DOM data field names for the
	element's corresponding DOM object -- be careful!

=====
*   NOTE: it is considered very common to directly access
    a JavaScript object's data fields!

    (that is, unlike in C++/Java, you do not just use
    getter/accessors or setter/modifiers to access an object's
    data fields)

    so:
    let t1 = document.getElementById("name-field");

    // t1 now references the object corresponding to the
    //     element in the current document with id="name-field"

    // if the element with id="name-field" happened to be
    //    an input element with type="text", then:

    t1.value = "Looky";   // now Looky is that textfield's content

    *   JavaScript method calls DO need to be followed by () (even if no arguments)

=====
JS anonymous functions
=====
*   a function CAN have a name:

    function looky()
    {
        alert("Looky!");
    }

*   BUT -- JavaScript also supports *anonymous* functions, that
    don't have a name;

*   here's an anonymous function: (just don't GIVE it a name in
    its header -- no name between keyword function and its
    parenthesized parameter list in its header):

    function()
    {
        alert("Called by a function with no name");
    }

*   you can assign a function -- named or anonymous --
    to a variable!

    let looky = function()
                {
		    alert("Called by a function with no name!");
		};

    // looky's value is now a function!

    looky();  // calls that function!

    *   be careful -- at this point, note that:
    
    	looky is an expression whose value is this anonymous function,
	looky() is a CALL to that anonymous function!

        (this will be important in event-driven programming using
	JavaScript!)