//////////////////////////////////////////////////////////////////////////////
//	Jax.Widgets.Form class
//////////////////////////////////////////////////////////////////////////////
Jax.Widgets.Form = function()
{
    // Initialize member variables.
    var m_elements = new Hashtable();
    var m_labels = new Hashtable();
    
    // Delcare class and set instance.
    Jax.oop.declare(Jax.Widgets.Form, Jax.Widgets.Widget);
    this.setInstance();
    
    // Set methods.
    this.setMethod(addInputElement);
    this.setMethod(getElementsById);
    this.setMethod(getElementsByTagName);
    this.setMethod(getImages);
    this.setMethod(getItems);
    this.setMethod(getLabels);
    this.setMethod(getLabelById);
    this.setMethod(submit);
    
    //////////////////////////////////////////////////////////////////////////
    // Class methods definitions
    //////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    //	addInputElement : Adds an input element.
    //
    //	Usage:
    //		addInputElement(fieldType, fieldId, fieldName, fieldValue, fieldSize)
    //////////////////////////////////////////////////////////////////////////
    function addInputElement(fieldType, fieldId, fieldName, fieldValue, fieldSize) {
        var widget = document.createElement("INPUT");
        widget.setAttribute("type", fieldType);
        widget.setAttribute("id", fieldId);
        widget.setAttribute("name", fieldName);
        widget.setAttribute("accept", "text/plain");
        widget.value = (fieldValue) ? fieldValue : "";
        widget.size = (fieldSize) ? fieldSize : 12;
        this.form.appendChild(widget);
        this.items.setItem(fieldId, widget);
        return widget;
    }
    
    //////////////////////////////////////////////////////////////////////////////
    //	getElementsById
    //	
    //	Usage:
    //		getElementsById(elementName)
    //		getElementsById(elementName, useId)
    //////////////////////////////////////////////////////////////////////////////
    function getElementsById(elementName, useId) {
        var tags = ["INPUT", "A", "SELECT", "TEXTAREA"];
        var elements = new Hashtable();
        
        // Locate elements.
        this.form.forEach(function(item) {
            var target = (useId == true) ? item.id : item.name; 
            if (target.indexOf(elementName) != -1)
                elements.push(item);
        });
        
        // Return element set.
        return (elements.length > 0 ) ? elements : null;
    }
    
    //////////////////////////////////////////////////////////////////////////////
    //	getLabels
    //////////////////////////////////////////////////////////////////////////////
    function getLabels() {
        if (m_labels.isEmpty()) {
            var labels = this.form.getElementsByTagName('LABEL');
            for (var ii=0; ii < labels.length; ++ii) {
                m_labels.setItem(labels[ii].htmlFor, labels[ii])
            }
        }
        
        return m_labels;
    }
    
    //////////////////////////////////////////////////////////////////////////////
    //	getLabels
    //////////////////////////////////////////////////////////////////////////////
    function getLabelById(id) {
        var labels = this.getLabels();
        return labels.getItem(id);
    }
    
    //////////////////////////////////////////////////////////////////////////////
    //	getImages(imageName)
    //////////////////////////////////////////////////////////////////////////////
    function getImages(imageName) {
        var images = new Array();
        document.images.forEach(function(image) {
            if ((image.id != null) && (image.id.indexOf(imageName) != -1))
                images.push(image);
        });
        return (images.length > 0) ? images : null;
    }

    //////////////////////////////////////////////////////////////////////////
    //	getElementsByTagName(tagName)
    //////////////////////////////////////////////////////////////////////////
    function getElementsByTagName(tagName) {
        var elements = new Array();
        var tags = (tagName) ? [tagName] : ["INPUT", "A", "SELECT", "TEXTAREA"];
        var widgetForm = this.form;
        
        // Find elements via tag name.
        tags.forEach(function(tag) {
            var elsByTag = widgetForm.getElementsByTagName(tag);
            
            // Copy elements into elementSet.
            for (var ii = 0; ii < elsByTag.length; ++ii) {
                elements.push(elsByTag[ii]);
            }
        });
        
        // Return element set.
        return (elements.length > 0) ? elements : null;
    }
      
    //////////////////////////////////////////////////////////////////////////////
    //  getItems
    //////////////////////////////////////////////////////////////////////////////
    function getItems(elName, widget, useId) {
        var items = new Hashtable();
        var thisCtrl = (Jax.js.isObject(widget)) ? widget : this;
        var matchById = (Jax.js.isBoolean(useId)) ? useId : Jax.js.isBoolean(widget) ? widget : true;
        this.getElementsByTagName().forEach(function(el) {
            var key = (matchById) ? el.id : el.name;
            if (!key.isEmpty()) {
                items.setItem(key, el);
            }
        });
        
        return items;
    }

    //////////////////////////////////////////////////////////////////////////
    //	submit : submits the form.
    //////////////////////////////////////////////////////////////////////////
    function submit() {
        this.form.submit();
    }
}

//////////////////////////////////////////////////////////////////////////////
//	Jax.Widgets.Form enumerators.
//////////////////////////////////////////////////////////////////////////////
Jax.Widgets.Form.BY_ID = true;
Jax.Widgets.Form.BY_NAME = false;
