function get_current_order(element_id, tagName) {
    var mUl = document.getElementById(element_id);
    var items = mUl.getElementsByTagName(tagName);
    var order = "";
    for (var i = 0; i < items.length; i++) {
        var id = items[i].id;
        if (id.indexOf("drag_element_") != 0)
            continue;
        order += id.substring("drag_element_".length, id.length);
        if (i != items.length - 1) {
            order += ",";
        }
    }
    return order;
}

function submit_on_enter(myform, e)
{
    var keycode;
    if (window.event)
        keycode = window.event.keyCode;
    else if (e)
        keycode = e.which;
    else return true;

    if (keycode == 13) {
        if (e.stopPropagation) {
            e.stopPropagation();
        } else {
            e.cancelBubble = true;
        }
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
        myform.submit();
        return false;
    }
    return true;
}

function exec_on_enter(exec, e)
{
    var keycode;
    if (window.event)
        keycode = window.event.keyCode;
    else if (e)
        keycode = e.which;
    else return true;

    if (keycode == 13) {
        if (e.stopPropagation) {
            e.stopPropagation();
        } else {
            e.cancelBubble = true;
        }
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
        exec();
        return false;
    }
    return true;
}

function highlight(bodyText, searchTerm, highlightStartTag, highlightEndTag) {
    if (bodyText == null)
        return "";
    // the highlightStartTag and highlightEndTag parameters are optional
    if ((!highlightStartTag) || (!highlightEndTag)) {
        highlightStartTag = "<span class='match'>";
        highlightEndTag = "</span>";
    }

    var newText = "";
    var i = -1;
    var lcSearchTerm = searchTerm.toLowerCase();
    var lcBodyText = bodyText.toLowerCase();

    while (bodyText.length > 0) {
        i = lcBodyText.indexOf(lcSearchTerm, i + 1);
        if (i < 0) {
            newText += bodyText;
            bodyText = "";
        } else {
            // skip anything inside an HTML tag
            if (bodyText.lastIndexOf(">", i) >= bodyText.lastIndexOf("<", i)) {
                // skip anything inside a <script> block
                if (lcBodyText.lastIndexOf("/script>", i) >= lcBodyText.lastIndexOf("<script", i)) {
                    newText += bodyText.substring(0, i) + highlightStartTag + bodyText.substr(i, searchTerm.length) + highlightEndTag;
                    bodyText = bodyText.substr(i + searchTerm.length);
                    lcBodyText = bodyText.toLowerCase();
                    i = -1;
                }
            }
        }
    }

    return newText;
}

function expand(id, h) {
    if (!YAHOO.util.Dom.hasClass(id, 'expand')) {
        (new YAHOO.util.Anim(id, { height: { from: 1, to: h } }, 0.1, YAHOO.util.Easing.easeOut)).animate();
        document.getElementById(id).style.display = '';
        YAHOO.util.Dom.addClass(id, 'expand');
    } else {
        (new YAHOO.util.Anim(id, { height: { to: 1 } }, 0.1, YAHOO.util.Easing.easeOut)).animate();
        YAHOO.util.Dom.removeClass(id, 'expand');
    }
}

function format_text_ads(ad_count){
    // text ads are delimited with "::" and ";;". Also, the ad header is separated from the ad body by " - ".
    for(i=1; i<=ad_count; i++) {
        var zone_txt = document.getElementById('text_ad_'+i).innerHTML;
        if(zone_txt.indexOf('::') < 0)continue;
        var start = zone_txt.indexOf('::');
        var end = zone_txt.indexOf(';;')+2;
        var unformatted_text_ad = zone_txt.substring(start, end);
        var ad_header = unformatted_text_ad.substring(2, unformatted_text_ad.indexOf(" - "));
        var ad_body = unformatted_text_ad.substring(unformatted_text_ad.indexOf(" - ") + 3,(unformatted_text_ad.length-2));
        var formatted_ad = "<dl><dt>"+ad_header+"</dt><dd>"+ad_body+"</dd></dl>";
        document.getElementById('text_ad_'+i).innerHTML = document.getElementById('text_ad_'+i).innerHTML.replace(unformatted_text_ad, formatted_ad);
    }
}

/**
 Sort elements in container.
 className - class name of elements
 tagName - tag name of elements
 root - id of container
 criteria - class name for the element containing string to be used as criteria of sorting
 order - asc or desc
 */
function sort(className, tagName, root, criteria, criteriaTagName, order) {
    var el = YAHOO.util.Dom.getElementsByClassName(className, tagName, root);
    var list = [];
    for (var idx = 0; idx < el.length; ++idx) {
        var text = YAHOO.util.Dom.getElementsByClassName(criteria, criteriaTagName, el[idx])[0].innerHTML;
        list[idx] = [text, el[idx]];
    }
    list.sort();
    if ("desc" == order) {
        list.reverse();
    }
    for (var i = list.length - 2; i >= 0; --i) {
        YAHOO.util.Dom.insertBefore(list[i][1], list[i + 1][1]);
    }
}


if (!Array.indexOf) {
    Array.prototype.indexOf = function(obj) {
        for (var i = 0; i < this.length; i++) {
            if (this[i] == obj) {
                return i;
            }
        }
        return -1;
    }
}

if (!Array.prototype.forEach)
{
    Array.prototype.forEach = function(fun /*, thisp*/)
    {
        var len = this.length;
        if (typeof fun != "function")
            throw new TypeError();

        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
            if (i in this)
                fun.call(thisp, this[i], i, this);
        }
    };
}
if (!String.prototype.trim) {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/, '');
    };
}


var xml2str = function(xmlNode) {
    try {
        // Gecko-based browsers, Safari, Opera.
        return (new XMLSerializer()).serializeToString(xmlNode);
    }
    catch (e) {
        try {
            // Internet Explorer.
            return xmlNode.xml;
        }
        catch (e) {
            //Other browsers without XML Serializer
            alert('Xmlserializer not supported');
        }
    }
    return false;
};
