var alphabet="abcdefghijklmnopqrstuvwxyz";
var markup="<>";

Object.extend(Event, {
    isKey: function(event, keycode){
        return event.keyCode == keycode || event.which == keycode;
    }
});

function getClientDimensions(){
    if (Prototype.Browser.IE){
        return {width: document.body.clientWidth, height: document.body.clientHeight};
    } else{
        return {width: window.innerWidth, height: window.innerHeight};
    }
}

function adjustAbsolute(absoluteDivId, anchorDivId, iframeId){
    /*
        Warning: this won't work if one of absoluteDivId's parents has a 'position:relative' style.
        See http://www.barelyfitz.com/screencast/html-training/css/positioning/
     */
    var ab = $(absoluteDivId);
    var hi = $(iframeId);
    if (ab && hi){
        var dbr = getClientDimensions();
        var del = Element.getDimensions(ab);
        var pos = Element.cumulativeOffset($(anchorDivId));
        if (pos[0] + del.width > dbr.width - 10) pos[0] = dbr.width - del.width - 10;
        if (pos[1] + del.height > dbr.height - 10) pos[1] = dbr.height - del.height - 10;
        hi.style.width = del.width + 'px';
        hi.style.height = del.height + 'px';
        hi.style.left = pos[0] + 'px';
        hi.style.top = pos[1] + 'px';
        hi.style.display = 'block';
        ab.style.left = pos[0] + 'px';
        ab.style.top = pos[1] + 'px';
        ab.style.display = 'block';
    }
}

//position an absolute element in the center of another
function centerPosition(element, frameElement) {
    var framePosition = Element.cumulativeOffset(frameElement);
    var left = framePosition[0] + (frameElement.offsetWidth - element.offsetWidth) / 2;
    var top = framePosition[1] + (frameElement.offsetHeight - element.offsetHeight) / 2;
    element.style.left = left + 'px';
    element.style.top = top + 'px';
}

//position an element relative to another
//values for horizontalAlignment hA: (hA < 0) = left, (hA == 0) = center, (hA > 0) = right
//values for verticalAlignment vA: (vA < 0) = top, (hA == 0) = center, (vA > 0) = bottom
function relativePosition(targetElement, referenceElement, horizontalAlignment, verticalAlignment, horizontalOffset, verticalOffset) {
    if (targetElement && referenceElement) {
        Element.absolutize(targetElement);
        var referenceDimension = Element.getDimensions(referenceElement);
        var referencePosition = Element.cumulativeOffset(referenceElement);

        var referenceLeft;
        if (horizontalAlignment < 0) referenceLeft = referencePosition.left;
        else if (horizontalAlignment > 0) referenceLeft = referencePosition.left + referenceDimension.width;
        else referenceLeft = referencePosition.left + referenceDimension.width / 2;

        var referenceTop;
        if (verticalAlignment < 0) referenceTop = referencePosition.top;
        else if (verticalAlignment > 0) referenceTop = referencePosition.top + referenceDimension.height;
        else referenceTop = referencePosition.top + referenceDimension.height / 2;

        referenceLeft += horizontalOffset;
        referenceTop += verticalOffset;

        targetElement.style.left = referenceLeft + 'px';
        targetElement.style.top = referenceTop + 'px';
    }
}

//scroll inside a component (not a window scroll) up to given target position
function scrollContainerTo(container, target) {
    //var container = document.getElementById(containerId);
    //var target = document.getElementById(targetId);
    var containerTop = Position.positionedOffset(container);
    var targetTop = Position.positionedOffset(target);
    container.scrollTop = targetTop[1] - containerTop[1];
}

function copyToIfBlank(from, to) {
    if (!to.value || to.value == '') to.value = from.value;
}

function copyRichDateToIfBlank(from, to) {
    if (to.component.getSelectedDate() == null) to.component.selectDate(from.component.getSelectedDate());
}

function updateOptions(fromSelect, toSelect)
{
    if (fromSelect && toSelect){
        var currentFromValue = fromSelect.value;
        var currentToValue = toSelect.value;
        var from = Math.max(fromSelect.value, fromSelect.options[1].value);
        var to = fromSelect.options[fromSelect.options.length - 1].value;
        var length = to - from + 1;
        toSelect.options.length = 0;
        var option;
        var shift = 0;
        if (fromSelect.selectedIndex == 0)
        {
            option = new Option(fromSelect.options[0].text, fromSelect.options[0].text);
            //toSelect.add(option, null); not supported in IE
            option.selected = true;
            toSelect.options[0] = option;
            shift = 1;
        }
        else
        {
            var value;
            for (var i = 0; i < length; i++)
            {
                value = from + i;
                option = new Option(from + i, from + i);
                if (currentFromValue == value || currentToValue == value && fromSelect.selectedIndex != 0) option.selected = true;
                //toSelect.add(option, null); not supported in IE
                toSelect.options[i + shift] = option;
            }
        }
        
    }
}

function updateSelectOptions(fromSelectId, toSelectId)
{
    var from = document.getElementById(fromSelectId);
    var to = document.getElementById(toSelectId);
    updateOptions(from, to);
}

var minFontSize = 8;
var maxFontSize = 18;

function increaseFontSize(element, recurse) {
    changeFontSize(element, recurse, 1);
}

function decreaseFontSize(element, recurse) {
    changeFontSize(element, recurse, -1);
}

function changeFontSize(element, recurse, step) {
    var newSize = 12;
    if(element.style.fontSize) newSize = parseInt(element.style.fontSize.replace('px',''));
    if(newSize + step >= minFontSize && newSize + step <= maxFontSize) newSize += step;
    element.style.fontSize = newSize + 'px';
    if (recurse) {
        var children = element.childElements();
        for (var i = 0; i < children.length; ++i) changeFontSize(children[i], true, step);
    }
}

function getNamingContainerId(element) {
    //var elementId = element.id;
    var elementId;
    if (typeof element == 'string') elementId = element;
    else elementId = element.id;
    if (elementId == null) return null;
    var lastColonIndex = elementId.lastIndexOf(':');
    return lastColonIndex != -1 ? elementId.substring(0, lastColonIndex) : null;
}

function localId(element) {
    var elementId = element.id;
    if (elementId == null) return null;
    var lastColonIndex = elementId.lastIndexOf(':');
    return lastColonIndex != -1 ? elementId.substring(lastColonIndex + 1) : null;
}

function findSibling(element, siblingId) {
    if (!element) return null;
    var containerId = getNamingContainerId(element);
    return $(containerId + ':' + siblingId);
}

function findOnPath(element, relativeId) {
    if (!element) return null;
    var sibling = findSibling(element, relativeId);
    if (sibling != null) return sibling;
    var namingContainerId = getNamingContainerId(element);
    var targetId = null;
    var target = null;
    while (namingContainerId != null) {
        targetId = namingContainerId + ':' + relativeId;
        target = $(targetId);
        if (target != null) return target;
        namingContainerId = getNamingContainerId(namingContainerId);
    }
    return null;
}

function hideDialogIE6(id){
    if (Prototype.Browser.IE && /MSIE 6\.0/.test(navigator.userAgent)){
        document.getElementById(id).component.hide();
    }
}

function isIE6(){
    return (Prototype.Browser.IE && /MSIE 6\.0/.test(navigator.userAgent));
}

function stopBubble(e){
    if (e && e.stopPropagation) e.stopPropagation();
    else event.cancelBubble = true;
}

function clearDefaultValue(field) {
    if (field.defaultValue == field.value) {
        field.value = '';
        Element.removeClassName(field, 'default-value');
        Element.addClassName(field, 'user-value');
    }
}

function setDefaultValueIfEmpty(field) {
    if (field.value == '') {
        field.value = field .defaultValue;
        Element.removeClassName(field, 'user-value');
        Element.addClassName(field, 'default-value');
    }
}

function selectContent(node) {
    var range = document.createRange();
    range.selectNodeContents(node);
    var selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
}
