//============================================
// Log
//
var Log = {
    info: function(msg) {
        var log = $('log');
        if (log) log.innerText += msg + "\r\n";
    },
    error: function(msg) {
        var log = $('log');
        if (log) log.innerText += msg + "\r\n";
    },
    debug: function(msg) {
        var log = $('log');
        if (log) log.innerText += msg + "\r\n";
    }
}

//============================================
// Navigating elements
//

// Find first parent with given id.
function findParentWithId(element, id)
{
    while (element)
    {
        if (element.id == id)
            return element;
        element = element.parentElement;
    }
    return null;
}

function findParentWithTagName(element, tagName) 
{
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
        element = element.parentNode;
    return element;
}

function findChildWithId(parent, id) 
{
    var c = parent.childNodes;
    for (var i = 0; i < c.length; i++) 
    {
        if (c[i].id == id)
          return c[i];
        var n = findChildWithId(c[i], id);
        if (!!n)
          return n;
    }
    return null;
}

function findChildWithClassName(element, className)
{
    var child = element.firstChild;
    while (child)
    {
        if (child.className == className)
            return child;

        var result = findChildWithClassName(child, className);
        if (result != null)
            return result;

        child = child.nextSibling;
    }
    return null;
}

// Find first sibling of given element with tagName.
function findNextSiblingTag(element, tagName)
{
    if (!element)
        return null;
    element = element.nextSibling;
    while (element)
    {
        if (element.tagName == tagName)
            return element;
        element = element.nextSibling;
    }
    return null;
}

function getSelectedValue(select)
{
    var opt = select.options[select.selectedIndex];
    if (!opt)
        return null;
    if (opt.getAttribute("noselect"))
        return null;
    if (opt.value)
        return opt.value;
    return opt.text;
}

function getRadioButtonListValue(elm)
{
    var a = elm.getElementsByTagName("INPUT");
    for (var i = 0; i < a.length; i++)
    {
        if (a[i].checked)
            return a[i].value;
    }
    return null;
}

// Find form containing given element.
function getContainingForm(element)
{
    while (element.tagName != "FORM")
        element = element.parentElement;
    return element;
}

// Submit form containing given element.
function submitContainingForm(element)
{
    var form = getContainingForm(element);
    form.submit();
}

// Submit form containing given element.
function submitContainingForm2(element, action)
{
    var form = getContainingForm(element);
    form.action = action;
    form.submit();
}

function validate()
{
    return true;
}

//============================================
// Form validation
// ---------------
//
// Iterates all fields in given form with "required" attribute
// set, and checks if they are filled. If not this function
// displays the associated error labels and returns false.
//
function validateForm(form, errordiv)
{
    var valid = true;
    if (!(!errordiv.innerHTML))
      errordiv.innerHTML = "";
    for (var i=0; i<form.length; i++)
    {
        var element = form.elements[i];
        // check elements with "required" attribute set
        if (element.getAttribute("required") == "true" || element.getAttribute("required") == "yes")
        {
            if (element.tagName == "INPUT" && element.type == "text" && !element.value ||
                element.tagName == "SELECT" && !getSelectedValue(element) ||
                element.tagName == "TEXTAREA" && !element.value)
            {
                // showErrorLabel(element);
                markError(element, errordiv);
                valid = false;
            }
        }
    }
    var a = form.getElementsByTagName("DIV");
    for (var i = 0; i < a.length; i++)
    {
        if (a[i].getAttribute("required"))
        {
            if (a[i].getAttribute("type") == "radiobuttonlist" && !getRadioButtonListValue(a[i]))
            {
                // showErrorLabel(a[i]);
                markError(element, errordiv);
                valid = false;
            }
        }
    }
    return valid;
}

function showErrorLabel(element) 
{
    var label = findNextSiblingTag(element, "SPAN");
    if (label)
        label.style.display = "inline";
}

function markError(element, errordiv) 
{
      var s = element.getAttribute("required-text");
      if (!s) s = "" + element.name + " is required.";
      s += "<br/>";
      errordiv.innerHTML = errordiv.innerHTML + s;
}
