/* This function is used to change the style class of an element */
function swapClass(obj, newStyle) {
    obj.className = newStyle;
}

/* This function is used to set cookies */
function setCookie(name, value, expires, path, domain, secure) {
    document.cookie = name + "=" + escape(value) +
                      ((expires) ? "; expires=" + expires.toGMTString() : "") +
                      ((path) ? "; path=" + path : "") +
                      ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "");
}

/* This function is used to get cookies */
function getCookie(name) {
    var prefix = name + "="
    var start = document.cookie.indexOf(prefix)

    if (start == -1) {
        return null;
    }

    var end = document.cookie.indexOf(";", start + prefix.length)
    if (end == -1) {
        end = document.cookie.length;
    }

    var value = document.cookie.substring(start + prefix.length, end)
    return unescape(value);
}

/* This function is used to delete cookies */
function deleteCookie(name, path, domain) {
    if (getCookie(name)) {
        document.cookie = name + "=" +
                          ((path) ? "; path=" + path : "") +
                          ((domain) ? "; domain=" + domain : "") +
                          "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}

// This function is for stripping leading and trailing spaces
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};

function confirmDelete(obj) {
    var msg = "Are you sure you want to delete this " + obj + "?";
    ans = confirm(msg);
    if (ans) {
        return true;
    } else {
        return false;
    }
}

function highlightFormElements() {
    // add input box highlighting
    addFocusHandlers(document.getElementsByTagName("input"));
    addFocusHandlers(document.getElementsByTagName("textarea"));
}

function addFocusHandlers(elements) {
    for (i = 0; i < elements.length; i++) {
        if (elements[i].type != "button" && elements[i].type != "submit" &&
            elements[i].type != "reset" && elements[i].type != "checkbox" && elements[i].type != "radio") {
            if (!elements[i].getAttribute('readonly') && !elements[i].getAttribute('disabled')) {
                elements[i].onfocus = function() {
                    this.style.backgroundColor = '#ffd';
                    this.select();
                };
                elements[i].onmouseover = function() {
                    this.style.backgroundColor = '#ffd';
                };
                elements[i].onblur = function() {
                    this.style.backgroundColor = '';
                };
                elements[i].onmouseout = function() {
                    this.style.backgroundColor = '';
                };
            }
        }
    }
}

window.onload = function() {
    highlightFormElements();
    if ($('successMessages')) {
        new Effect.Highlight('successMessages');
        // causes webtest exception on OS X : http://lists.canoo.com/pipermail/webtest/2006q1/005214.html
        // window.setTimeout("Effect.DropOut('successMessages')", 3000);
    }
    if ($('errorMessages')) {
        new Effect.Highlight('errorMessages');
    }
};

// Enable scroll to inside scrolling div
// Extending element to allow scrolling on Divs
// following code is MIT licensed (C) Gary Haran 2007

/**
 * Provide the same behavior as window.scrollTo to divs with overflow without removing
 * the ability to scroll a page to a given element.
 */

Element.addMethods({
    scrollTo: function(element, left, top) {
        var element = $(element);
        if (arguments.length == 1) {
            var pos = element.cumulativeOffset();
            window.scrollTo(pos[0], pos[1]);
        } else {
            element.scrollLeft = left;
            element.scrollTop = top;
        }
        return element;
    }
});

/**
 * Effect.Scroll allows you to animate scrolling on a page (or div w/ overflow: scroll || auto)
 */

Effect.Scroll = Class.create();
Object.extend(Object.extend(Effect.Scroll.prototype, Effect.Base.prototype), {
    initialize: function(element) {
        this.element = $(element);
        if (!this.element) throw(Effect._elementDoesNotExistError);
        this.start(Object.extend({x: 0, y: 0}, arguments[1] || {}));
    },
    setup: function() {
        var scrollOffsets = (this.element == window)
                ? document.viewport.getScrollOffsets()
                : Element._returnOffset(this.element.scrollLeft, this.element.scrollTop) ;
        this.originalScrollLeft = scrollOffsets.left;
        this.originalScrollTop = scrollOffsets.top;
    },
    update: function(pos) {
        this.element.scrollTo(Math.round(this.options.x * pos + this.originalScrollLeft), Math.round(this.options.y * pos + this.originalScrollTop));
    }
});
// Show the document's title on the status bar
window.defaultStatus = document.title;

var ModelContainer = Class.create({
    initialize: function(initialValue) {
        Object.Event.extend(this);
        this.value = initialValue;
    },

    get: function() {
        return this.value;
    },

    set: function(newValue) {
        this.value = newValue;
        this.notify("state_change", this.value);
    }
});

document.observe('dom:loaded', function() {
    if ($('loginLink'))
    {
        $('loginLink').observe('click', function() {
            $('loginPane').show();
            $('loginArea').hide();
            $('loginForm').observe('submit', login);
            if (getCookie("username") != null) {
                $("username").value = getCookie("username");
                $("password").focus();
            } else {
                $("username").focus();
            }
        });
    }
    //setup the signup button
    if ($('signupButton')) {
        $('signupButton').observe('click', function() {
            window.location = contextRoot + "/signup.html?location=%2f"
        });
    }
});

function login(event) {
    var username = $('username').getValue();
    var password = $('password').getValue();
    var rememberMe = $('loginRemember').checked;
    UserManager.authenticate(username, password, rememberMe, {
        callback: loginCallback,
        errorHandler: loginCallback
    });
    event.stop();
}

function loginCallback(result) {
    if (result == true) {
        //save the username in the cookie since it was good
        var expires = new Date();
        expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
        setCookie("username", $('username').getValue(), expires, "/");
        if (window.location.pathname.indexOf('login') < 0) {
            window.location = window.location;
        }
        else {
            window.location = "./";
        }

    }
    else {
        var help = new Element('a', {href: contextRoot + "/login.jsp"})
                .update(loginMessages['errors.header.password.mismatch']);
        $('loginError').update(help);
    }
}

// Java-style interpolation of localization strings
// Usage: localize("Hello {0}.", {0: "Adam"})
function localize(message, arguments) {
    var syntax = /(^|.|\r|\n)(\{(\d+)\})/;
    return message.interpolate(arguments, syntax);
}

//session logout handling for dwr
document.observe('dom:loaded', function() {
    dwr.engine.setErrorHandler(globalErrorHandler);
});

var globalErrorHandler = function(msg, exception) {
    if ("java.security.AccessControlException" == exception.javaClassName
            || "org.springframework.security.AccessDeniedException" == exception.javaClassName) {
        //this means the user's session timed out
        //we will redirect them to the current page to make them login again
        window.location = window.location;
    }
    else {
        alert("Unknown global error: " + msg + " this may be a bug in dotSUB");
    }
};

/* For Adam's collapsible pages menu boxes */
document.observe('dom:loaded', function() {
//    Nifty('div.module', 'top');
//    Nifty('div.subBody');
    $$('.module h3').each(function(toggle) {
        toggle.observe("click", function(event) {
            var parent = event.element().up('.module');
            parent.toggleClassName('expanded');
            parent.toggleClassName('collapsed');
            parent.select(".moduleBody").invoke("toggle");
        })
    });
});

function popUp(URL) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + " = window.open( '" + URL + "', '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=500,height=420,left = 455,top = 180');");
}

document.observe('dom:loaded', function() {
    $('termsOfUseLink').observe('click', function(event){
        popUp('/termsOfUse.jsp')
        event.stop();
    });
});

//Functionality for the global search bar
document.observe('dom:loaded', function(event) {
    var liveSearchField = $('livesearch');
    liveSearchField.observe('keypress', function(event) {
        if (event.keyCode == Event.KEY_RETURN) {
            search(this.value);
        }

    });
    liveSearchField.observe('focus', function(event) {
        var whatWasFocused = event.element();
        if (!whatWasFocused.alreadyCleared) {
            whatWasFocused.clear();
            whatWasFocused.alreadyCleared = true;
        }
    });
    $('searchIcon').observe('click', function() {
        search($('livesearch').getValue());
    });
});

function search(query) {
    window.location = contextRoot + '/view/search/?q=' + query;
}

function openInNewWindow(event) {
    var element = event.element();
    event.stop();
    window.open(element.href);
}

var killbackspace = function(event) {
    var element = event.element();
    if (event.keyCode == 8 && (element.type != "textarea" && element.type != "text")) {
        event.stop();
    }

};

function getFormElementFor(configItem) {
    if (configItem.type == "String" || configItem.type == "int" || configItem.type == "InetAddress") {
        var e = new Element('span', {'class': 'configProperty'});
        e.update(messages[configItem.resourceKey]);
        var f;
        if (!configItem.hidden) {
            f = new Element('input', {'type': 'text', 'name': configItem.property, 'class': 'configValue'});
        }
        else {
            f = new Element('input', {'type': 'password', 'name': configItem.property, 'class': 'configValue'});
        }
        if (configItem.value != null && configItem.value != "") {
            f.value = configItem.value;
        }
        e.insert(f);
        return e;
    }
    else {
        return new Element('span', {'class':'fieldError'}).update("Error unsupported type!");
    }
}

function getDisplayElementFor(configItem) {
    if (configItem.type == "String" || configItem.type == "int" || configItem.type == "InetAddress") {
        var e = new Element('span', {'class': 'configProperty'});
        e.update(messages[configItem.resourceKey] + ": ");
        var f = new Element('span', {'class': 'configValue'});
        if (!configItem.hidden) {
            f.update(configItem.value);
        }
        else {
            f.update(messages['displayProject.ingestorHidden']);
        }
        e.insert(f);
        return e;
    }
    else {
        return new Element('span', {'class':'fieldError'}).update("Error unsupported type!");
    }
}

function highlightEndOfField(field) {
    try {
        field.focus();
        field.setSelectionRange(9999, 9999);
    }
    catch(e) {
        var range = field.createTextRange();
        range.collapse(true);
        range.moveEnd('character', 0);
        range.moveStart('character', 0);
        range.select();
    }
}