/** Generic javascript utilities for Feather */

var progressIndicator;

function ajaxRequest(url, target, progress, form) {
    showIndicator(progress, target);
    var updateManager = new YAHOO.ext.UpdateManager(target);
    updateManager.loadScripts = true;
    updateManager.showLoadIndicator = false;
    if (form == null) {
        updateManager.update(url);
    } else {
        updateManager.formUpdate(form, url);
    }
    updateManager.onUpdate.subscribe(removeIndicator);
    return false;
}

function showIndicator(progress, target) {
    if (progress != null && progressIndicator == null) {
        progressIndicator = document.createElement("span");
        progressIndicator.className = 'updating';
        progressIndicator.appendChild(document.createTextNode(decodeURIComponent(progress)));
        var element = document.getElementById(target);
        document.body.insertBefore(progressIndicator, document.body.childNodes[0]);
    }
}

function removeIndicator() {
    if (progressIndicator != null) {
        document.body.removeChild(progressIndicator);
        progressIndicator = null;
    }
}

function ajaxSelectRequest(url, persistent, parameterName, target, progress, select, sep) {
    if (persistent) {
        if ("Not set" == select) {
            select = null;
        }
        if (select != null) {
            var index = url.indexOf("Objects=");
            if (index == -1) {
                if (url.indexOf("?") == -1) {
                    url += "?" + parameterName + "=" + select;
                } else {
                    url += "&" + parameterName + "=" + select;
                }
            } else {
                var objectPart = url.substring(index);
                var endIndex = objectPart.indexOf("&");
                if (endIndex != -1) {
                    url = url.substring(0, index + endIndex) + sep + select + objectPart.substring(endIndex);
                } else {
                    url += sep + select;
                }
            }
        }
    } else {
        url += "&" + parameterName + "=" + select;
    }
    ajaxRequest(url, target, progress);
    return false;
}

function ajaxSelectFilterRequest(url, target, progress, filterID, selected) {
    showIndicator(progress);
    url += "&" + filterID + "=" + selected;
    ajaxRequest(url, target, progress);
    return false;
}

function convertSubmitToButton(id) {
    var element = document.getElementById(id);
    var parent = element.parentNode;

    var name = element.getAttribute("name");
    var newElement;
    try {
        // IE
        var inner = element.outerHTML.replace("type='submit'", "type='button'");
        newElement = document.createElement(inner);
        parent.removeChild(element);
        parent.appendChild(newElement);
    } catch (e) {
        // Others
        element.setAttribute("type", "button");
    }
}

function setDisable(id, disabled, toggle) {
    var element = document.getElementById(id);
    if (element != null) {
        if (toggle) {
            element.disabled = !element.disabled;
        } else {
            element.disabled = disabled;
        }
    }
}

function setVisible(id, visible, animate, duration, onComplete, easingOut, toggle) {
    if (!animate) {
        var plain = document.getElementById(id);
        if (plain != null) {
            plain.style.display = visible ? 'block' : 'none';
        }
        return false;
    }
    var element = YAHOO.ext.Element.get(id);
    if (element != null) {
        if (toggle) {
            element.toggle(animate, duration, onComplete, easingOut);
        } else {
            element.setVisible(visible, animate, duration, onComplete, easingOut);
        }
    }
    return false;
}


function selectMenu(id, index, linkForSelected) {
    var element = document.getElementById(id);
    if (element != null) {
        var current = 0;
        for (var i = 0; i < element.childNodes.length; i++) {
            var child = element.childNodes[i];
            if (child.nodeName == 'LI') {
                if (current == index) {
                    YAHOO.util.Dom.addClass(child, 'selected');
                } else {
                    YAHOO.util.Dom.removeClass(child, 'selected');
                }
                current++;
            }
        }
    }
}

function insertAtCursor(fieldId, text) {
    var field = document.getElementById(fieldId);
    if (field.value != "") {
        text = ", " + text;
    }
    //IE support
    if (document.selection) {
        field.focus();
        sel = document.selection.createRange();
        sel.text = text;
    } //Mozilla/Firefox/Netscape 7+ support
    else if (field.selectionStart || field.selectionStart == '0') {
        var startPos = field.selectionStart;
        var endPos = field.selectionEnd;
        field.value = field.value.substring(0, startPos) + text
                + field.value.substring(endPos, field.value.length);
    } else {
        field.value += text;
    }
}

function killAllOfClass(className) {
    var elements = YAHOO.util.Dom.getElementsByClassName(className);
    for (var i in elements) {
        elements[i].parentNode.removeChild(elements[i]);
    }
}

function split(val) {
    return val.split(/,\s*/);
}

function extractLast(term) {
    return split(term).pop();
}

function autoComplete(element,availableTags) {
    $(element)
        // don't navigate away from the field on tab when selecting an item
            .bind("keydown", function(event) {
        if (event.keyCode === $.ui.keyCode.TAB &&
                $(this).data("autocomplete").menu.active) {
            event.preventDefault();
        }
    })
            .autocomplete({
        minLength: 0,
        source: function(request, response) {
            // delegate back to autocomplete, but extract the last term
            response($.ui.autocomplete.filter(
                    availableTags, extractLast(request.term)));
        },
        focus: function() {
            // prevent value inserted on focus
            return false;
        },
        select: function(event, ui) {
            var terms = split(this.value);
            // remove the current input
            terms.pop();
            // add the selected item
            terms.push(ui.item.value);
            // add placeholder to get the comma-and-space at the end
            terms.push("");
            this.value = terms.join(", ");
            return false;
        }
    });
}
