//
// Display the given help page in a separate window
//
var $ = YAHOO.util.Dom.get;

function openHelp(helpPage)
{
    window.open(helpPage, 'manualPopup', 'width=770,height=550,scrollbars=yes,status=yes,resizable=yes');
}


/*
 Runs on a change of a
*/
function handleOnSelectShowHide(sel)
{
    var hideClassName = "dependsOn" + sel.name;
    var showPattern = "showOn" + getSwitchValue(sel);
    var elems = getElementsByClassName(hideClassName, '*', sel.form);

    for (var i = 0; i < elems.length; i++)
    {
        var deps = elems[i];
        if (isContainsClass(deps, showPattern))
        {
            deps.style.display = '';
        }
        else
        {
            deps.style.display = 'none';
        }
    }
}

function getSwitchValue(obj)
{
    if (obj.options)
    {
        var opt = obj.options[obj.selectedIndex];
        //  Special uiSwitch* class prefix
        if (opt.className.indexOf('uiSwitch') != -1)
        {
            var uiSwitch = opt.className.substring(opt.className.lastIndexOf("uiSwitch") + 8);
            return uiSwitch;
        }
        else
        {
            return opt.value;
        }
    }
    else if (obj.type == 'checkbox' || obj.type == 'radio')
    {
        if (obj.checked)
            return obj.value;
        else
            return 'false';
    }
    else
    {
        return obj.value;
    }
}


/*
 Toggles hide / unhide an element. Also attemots to change the "elementId + header" element to have the headerOpened / headerClosed class.
 Also saves the state in a cookie
*/
function toggleElement(elementId, suffix)
{
    var elem = document.getElementById(elementId);
    if (elem)
    {
        if (readFromConglomerateCookie("bamboo.conglomerate.cookie", elementId, '1') == '1')
        {
            elem.style.display = "none";
            var toggler = document.getElementById(elementId + "Toggle");
            if (toggler)
            {
                toggler.innerHTML = "show" + (suffix ? " " + suffix : "");
            }
            //            removeClassName(elementId + 'header', 'headerOpened');
            //            addClassName(elementId + 'header', 'headerClosed');
            saveToConglomerateCookie("bamboo.conglomerate.cookie", elementId, '0');
        }
        else
        {
            elem.style.display = "";
            var toggler = document.getElementById(elementId + "Toggle");
            if (toggler)
            {
                toggler.innerHTML = "hide" + (suffix ? " " + suffix : "");
            }
            //            removeClassName(elementId + 'header', 'headerClosed');
            //            addClassName(elementId + 'header', 'headerOpened');
            eraseFromConglomerateCookie("bamboo.conglomerate.cookie", elementId);
        }
    }
}

function toggleDivsWithCookie(elementShowId, elementHideId)
{
    var elementShow = document.getElementById(elementShowId);
    var elementHide = document.getElementById(elementHideId);
    if (elementShow.style.display == 'none')
    {
        elementHide.style.display = 'none';
        elementShow.style.display = 'block';
        saveToConglomerateCookie("bamboo.viewissue.cong.cookie", elementShowId, '1');
        saveToConglomerateCookie("bamboo.viewissue.cong.cookie", elementHideId, '0');
    }
    else
    {
        elementShow.style.display = 'none';
        elementHide.style.display = 'block';
        saveToConglomerateCookie("bamboo.viewissue.cong.cookie", elementHideId, '1');
        saveToConglomerateCookie("bamboo.viewissue.cong.cookie", elementShowId, '0');
    }
}

/*
 Similar to toggle. Run this on page load.
*/
function restoreDivFromCookie(elementId, cookieName, defaultValue, suffix)
{
    if (defaultValue == null)
        defaultValue = '1';

    var elem = document.getElementById(elementId);
    if (elem)
    {
        if (readFromConglomerateCookie(cookieName, elementId, defaultValue) != '1')
        {
            elem.style.display = "none";
            var toggler = document.getElementById(elementId + "Toggle");
            if (toggler)
            {
                toggler.innerHTML = "show" + (suffix ? " " + suffix : "");
            }
            //            removeClassName(elementId + 'header', 'headerOpened');
            //            addClassName(elementId + 'header', 'headerClosed')
        }
        else
        {
            elem.style.display = "";
            var toggler = document.getElementById(elementId + "Toggle");
            if (toggler)
            {
                toggler.innerHTML = "hide" + (suffix ? " " + suffix : "");
            }
            //            removeClassName(elementId + 'header', 'headerClosed');
            //            addClassName(elementId + 'header', 'headerOpened')
        }
    }
}

/*
 Similar to toggle. Run this on page load.
*/
function restoreElement(elementId, suffix)
{
    restoreDivFromCookie(elementId, "bamboo.conglomerate.cookie", '1', suffix);
}

// Cookie handling functions

function saveToConglomerateCookie(cookieName, name, value)
{
    var cookieValue = getCookieValue(cookieName);
    cookieValue = addOrAppendToValue(name, value, cookieValue);

    saveCookie(cookieName, cookieValue, 365);
}

function readFromConglomerateCookie(cookieName, name, defaultValue)
{
    var cookieValue = getCookieValue(cookieName);
    var value = getValueFromCongolmerate(name, cookieValue);
    if (value != null)
    {
        return value;
    }

    return defaultValue;
}

function eraseFromConglomerateCookie(cookieName, name)
{
    saveToConglomerateCookie(cookieName, name, "");
}

function getValueFromCongolmerate(name, cookieValue)
{
    var newCookieValue = null;
    // a null cookieValue is just the first time through so create it
    if (cookieValue == null)
    {
        cookieValue = "";
    }
    var eq = name + "=";
    var cookieParts = cookieValue.split('|');
    for (var i = 0; i < cookieParts.length; i++)
    {
        var cp = cookieParts[i];
        while (cp.charAt(0) == ' ')
        {
            cp = cp.substring(1, cp.length);
        }
        // rebuild the value string exluding the named portion passed in
        if (cp.indexOf(name) == 0)
        {
            return cp.substring(eq.length, cp.length);
        }
    }
    return null;
}

//either append or replace the value in the cookie string
function addOrAppendToValue(name, value, cookieValue)
{
    var newCookieValue = "";
    // a null cookieValue is just the first time through so create it
    if (cookieValue == null)
    {
        cookieValue = "";
    }

    var cookieParts = cookieValue.split('|');
    for (var i = 0; i < cookieParts.length; i++)
    {
        var cp = cookieParts[i];

        // ignore any empty tokens
        if (cp != "")
        {
            while (cp.charAt(0) == ' ')
            {
                cp = cp.substring(1, cp.length);
            }
            // rebuild the value string exluding the named portion passed in
            if (cp.indexOf(name) != 0)
            {
                newCookieValue += cp + "|";
            }
        }
    }

    // always append the value passed in if it is not null or empty
    if (value != null && value != '')
    {
        var pair = name + "=" + value;
        if ((newCookieValue.length + pair.length) < 4020)
        {
            newCookieValue += pair;
        }
    }
    return newCookieValue;
}

function getCookieValue(name, defaultString)
{
    var eq = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++)
    {
        var c = ca[i];
        while (c.charAt(0) == ' ')
        {
            c = c.substring(1, c.length);
        }
        if (c.indexOf(eq) == 0)
        {
            return c.substring(eq.length, c.length);
        }
    }

    return defaultString;
}

function saveCookie(name, value, days)
{
    var ex;
    if (days)
    {
        var d = new Date();
        d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
        ex = "; expires=" + d.toGMTString();
    }
    else
    {
        ex = "";
    }
    document.cookie = name + "=" + value + ex + ";path=" + "/";
}

/*
Reads a cookie. If none exists, then it returns and
*/
function readCookie(name, defaultValue)
{
    var cookieVal = getCookieValue(name);
    if (cookieVal != null)
    {
        return cookieVal;
    }

    // No cookie found, then save a new one as on!
    if (defaultValue)
    {
        saveCookie(name, defaultValue, 365);
        return defaultValue;
    }
    else
    {
        return null;
    }
}

function eraseCookie(name)
{
    saveCookie(name, "", -1);
}
function getElementsByClassName(strClass, strTag, objContElm)
{
    return YAHOO.util.Dom.getElementsByClassName(strClass, strTag, objContElm);
}

function isContainsClass(obj, strClass)
{
    return YAHOO.util.Dom.hasClass(obj, strClass);
}

function addUniversalOnload(myFunction, obj)
{
    if (obj)
    {
        YAHOO.util.Event.addListener(window, "load", myFunction, obj);
    }
    else
    {
        YAHOO.util.Event.addListener(window, "load", myFunction);
    }
}

function attachHandler(object, event, myFunction)
{
    YAHOO.ext.EventManager.addListener(object, event, myFunction, object);
}

function toggleOn(e, toggleGroup_id)
{
    if (e && e.getTarget())
    {
        var source = e.getTarget();
        if (source.className.indexOf("alwaysFollow") != -1)
        {
            return;
        }
    }
    
    var onToggle = document.getElementById(toggleGroup_id + "_toggler_on");
    var offToggle = document.getElementById(toggleGroup_id + "_toggler_off");
    var target = document.getElementById(toggleGroup_id + "_target");
    onToggle.style.display = 'block';
    offToggle.style.display = 'none';
    target.style.display = 'block';
    saveToConglomerateCookie("bamboo.dash.display.toggles", toggleGroup_id, '1');
}

function toggleOff(e, toggleGroup_id)
{
    if (e && e.getTarget())
    {
        var source = e.getTarget();
        if (source.className.indexOf("alwaysFollow") != -1)
        {
            return;
        }
    }

    var onToggle = document.getElementById(toggleGroup_id + "_toggler_on");
    var offToggle = document.getElementById(toggleGroup_id + "_toggler_off");
    var target = document.getElementById(toggleGroup_id + "_target");
    onToggle.style.display = 'none';
    offToggle.style.display = 'block';
    target.style.display = 'none';
    saveToConglomerateCookie("bamboo.dash.display.toggles", toggleGroup_id, '0');
}

function restoreTogglesFromCookie(toggleGroup_id)
{
    var elem = document.getElementById(toggleGroup_id + "_target");
    if (elem)
    {
        if (readFromConglomerateCookie("bamboo.dash.display.toggles", toggleGroup_id, '1') != '1')
        {
            toggleOff(null, toggleGroup_id);
        }
        else
        {
            toggleOn(null, toggleGroup_id);
        }
    }
}

function collapseAll()
{
    var allPlansSection = getEl('allPlansSection');
    var elems = allPlansSection.getChildrenByClassName('projectLabel', 'a');
    for (var i = 0; i < elems.length; i++)
    {
        var planSection = elems[i];
        toggleOff(null, planSection.id);
    }
}

function expandAll()
{
    var allPlansSection = getEl('allPlansSection');
    var elems = allPlansSection.getChildrenByClassName('projectLabel', 'a');
    for (var i = 0; i < elems.length; i++)
    {
        var planSection = elems[i];
        toggleOn(null, planSection.id);
    }
}

// Forms JS
function toggleContainingCheckbox(e, o)
{
    var td = YAHOO.ext.Element.get(o);
    if (e.getTarget().tagName != 'INPUT')
    {
        var inputs = td.getChildrenByTagName('INPUT');
        for (var i = 0; i < inputs.length; i++)
        {
            var input = inputs[i].dom;
            if (input.type == 'checkbox')
            {
                input.checked = !input.checked;
            }
        }
    }
}



// ------------------------------------------------------------------------------------------------- Common Ajax Objects

function ajaxSubmitHandler(e, updateDivId)
{
    e.preventDefault();
    e.stopPropagation();

    var updater = getEl(updateDivId).getUpdateManager();
    var form = e.findTarget(null, 'form');

    updater.formUpdate(form);

    //alert('e: ' + e + ' ctx: ' + updater + ' this: ' + link.href);
}


function ajaxClickHandlerForDiv(e, updateDivId)
{

    var updater = getEl(updateDivId).getUpdateManager();
    var link = e.findTarget('internalLink', 'a');

    if (link != null)
    {
        e.preventDefault();
        updater.update(link.href, null, null, true);
    }

}

// This method will leak if used in a reloading panel. Use with care! 
function rewriteForms(el, oResponseObject)
{
    var updater = el.getUpdateManager();
    var forms = el.getChildrenByTagName('form');
    for (var i = 0; i < forms.length; i++)
    {
        forms[i].addManagedListener('submit', ajaxSubmitHandler, el.id);
    }
}

function clearHandlers(el)
{
        // Gets the yuiTooltips and crush, kill and destroy them!
    //var yuiTooltips = YAHOO.util.Dom.getElementsByClassName('yuiTooltips', 'div');
    //for (var i = 0; i < yuiTooltips.length; i++)
    //{
    //    var currentTooltip = YAHOO.ext.Element.get(yuiTooltips[i]);
    //    currentTooltip.removeAllListeners();
    //    currentTooltip.remove();
    //}

    var yuiTooltips =  el.getChildrenByClassName('yuiTooltips', 'div');
    for (var i = 0; i < yuiTooltips.length; i++)
    {
        var currentTooltip = yuiTooltips[i];
        currentTooltip.removeAllListeners();
        currentTooltip.remove();
    }

    var forms = el.getChildrenByTagName('form');
    for (var i = 0; i < forms.length; i++)
    {
        forms[i].removeAllListeners();
    }

    var evented = el.getChildrenByClassName('evented');
    for (var i = 0; i < evented.length; i++)
    {
        evented[i].removeAllListeners();
    }

    return true;
}


function toggleFavourite(url)
{
        var cObj = YAHOO.util.Connect.asyncRequest('POST', url);
        return false;
}

/*
  Toggles the image's icon between having the suffix of '_on' and '_off'. This also clears the title.
*/
function toggleIcon(e)
{
    var dom = e.getTarget();
    if (dom.src)
    {
        if (dom.src.indexOf('_on.') != -1)
        {
            toggleIconOff(dom);
        }
        else if (dom.src.indexOf('_off') != -1)
        {
            toggleIconOn(dom);
        }
    }
}

function toggleIconOff(dom)
{
    dom.src = dom.src.replace('_on.', '_off.');
}

function toggleIconOn(dom)
{
    dom.src = dom.src.replace('_off.', '_on.');
}


YAHOO.ext.UpdateManager.BambooRenderer = function(){};

YAHOO.ext.UpdateManager.BambooRenderer.prototype = {

     render : function(el, response, updateManager, callback){
        el.update(response.responseText, updateManager.loadScripts, callback);
    }
};

function checkFormChanged(form)
{
    var domForm;
    if (form.dom)
    {
        domForm = form.dom;
    }
    else
    {
        domForm = form;
    }

    var textFields = domForm.getElementsByTagName("INPUT");
    for (var i = 0; i < textFields.length; i++)
    {
        var textField = textFields[i];
        if (textField.type == "text"){
            if (textField.value != textField.defaultValue) return true;
        } else if (textField.type == "textarea") {
            if (textField.value != textField.defaultValue) return true;
        } else if (textField.type == "checkbox") {
            if (textField.checked != textField.defaultChecked) return true;
        } else if (textField.type == "radio") {
            if (textField.checked != textField.defaultChecked) return true;
        } else if (textField.type == "password") {
            if (textField.value != textField.defaultValue) return true;
        }
    }

   var selectFields = domForm.getElementsByTagName("select");
    for (var y = 0; y < selectFields.length; y++)
    {
       var mySelect = selectFields[y];
        for (var z=0; z < mySelect.options.length; z++)
        {
            if (mySelect.options[z].defaultSelected) {
               if (!mySelect.options[z].selected) {
                   return true;
               } else {
                   break;
               }
            }
        }
    }

    var textAreas = domForm.getElementsByTagName("textarea");
    for (var x = 0; x < textAreas.length; x++)
    {
       var textArea = textAreas[x];
       if (textArea.value != textArea.defaultValue) return true;
    }

    return false;
};

/*
*   For user picker - when you click "Check All' all the select boxes are changed
*/
    var selectedBoxes = [];

    function setCheckboxes()
    {
        var numelements = document.selectorform.elements.length;
        var item0 = document.selectorform.elements[0];
        var item1;

        for (var i=1 ; i < numelements ; i++)
        {
            item1 = document.selectorform.elements[i];
            item1.checked = item0.checked;
            if (!selectedBoxes[item1.name])
                selectedBoxes[item1.name] = [];
            selectedBoxes[item1.name][item1.value] = item1.checked;
        }
    }

/**
 * Checks if the form has changed. If it hasn't then returns to the URL. If it has, submits the form with the returnUrl set to the URL
 * @param elem
 * @param contextPath
 * @param url
 */
function submitFormIfChanged(elem, contextPath, url)
{
    var theForm = elem.form ? elem.form : elem;

    if(checkFormChanged(theForm)) {
        theForm.action = theForm.action + '?returnUrl=' + url;
        theForm.submit();
    }
    else
    {
        location.href = contextPath + url;
    }
}

/*
*  For User Picker - checkboxes are named after users so by compiling a list of all selected checkboxes
*   we have a list of users (comma seperated)
*/
    function getEntityNames()
    {
        var numelements = document.selectorform.elements.length;
        var item;
        var checkedList = "";

        var sep = "";
        for (var i = 0 ; i < numelements ; i++)
        {
            item = document.selectorform.elements[i];
            if (item != null && item.type == "checkbox" && item.name != "all" && item.checked == true)
            {
                var itemValue = item.value;
                itemValue = itemValue.replace(/\\/g, "\\\\").replace(/,/g, "\\,");
                checkedList  = checkedList + sep + itemValue;
                sep = ", ";
            }
        }

        return checkedList;
    }

/*
*   For User Picker - takes comma seperated list of users and places them in specified field.
*/
   function addUsers(commaDelimitedUserNames, fieldID)
    {
        var element = document.getElementById(fieldID);
        var currentUsers = element.value;
        if (currentUsers != null && currentUsers != ""){
            element.value = currentUsers + ", " + commaDelimitedUserNames;
        } else {
            element.value = commaDelimitedUserNames;
        }
    }

var STATUS_PREFIX = 'statusSection';
var BUILD_NUM_PREFIX = 'latestBuildNumber';
var REASON_PREFIX = 'reasonSummary';
var DURATION_PREFIX = 'durationSummary';
var LAST_BUILT = 'lastBuiltSummary';
var TESTCOUNT_PREFIX = 'testSummary';
var PLAN_PROPS = [BUILD_NUM_PREFIX, REASON_PREFIX, DURATION_PREFIX, TESTCOUNT_PREFIX, LAST_BUILT];

function updatePlan(plan)
{
    try
    {
        var planKey = plan.planKey;
        for (var i = 0; i < PLAN_PROPS.length; i++)
        {
            var propPrefix = PLAN_PROPS[i];
            var elem = $(propPrefix + planKey);
            if (BUILD_NUM_PREFIX == propPrefix)
            {
                // Update the status
                var planKeySection = YAHOO.util.Dom.getAncestorByClassName(elem, "planKeySection");
                planKeySection.className = "planKeySection";
                YAHOO.util.Dom.addClass(planKeySection, plan.statusClass);
            }
            elem.innerHTML = plan[propPrefix];
        }
        var statusSection = $(STATUS_PREFIX + planKey);
        var images = statusSection.getElementsByTagName("IMG");
        if (images && images.length > 0)
        {
            var statusIcon = images[0];
            var newPath = YAHOO.bamboo.contextPath + plan.statusIconPath;
            if (newPath != statusIcon.src)
            {
                statusIcon.src = newPath;
                statusIcon.title = plan.statusText;
            }
        }

        // Update the tooltip
        var tooltip = YAHOO.bamboo.tooltips["allreasonForBuild" + planKey + "Tooltip"];
        if (tooltip)
        {
            tooltip.cfg.setProperty("text", plan.reasonSummaryTooltip);
        }

        // Update favourites
        var favouritesIcon = $('all_favouriteIconFor_' + planKey);
        if (favouritesIcon)
        {
            if (plan.favourite && "true" == plan.favourite)
            {
                toggleIconOn(favouritesIcon);
            }
            else
            {
                toggleIconOff(favouritesIcon);
            }
        }

        if (plan.allowStop && "true" == plan.allowStop)
        {
            $('allstopBuild:' + planKey).style.display = '';
            $('allbuildBuild:' + planKey).style.display = 'none';
        }
        else
        {
            $('allstopBuild:' + planKey).style.display = 'none';
            $('allbuildBuild:' + planKey).style.display = '';
        }
    }
    catch(ex)
    {
        // Do nudda
    }
}

function updatePlans(sinceSystemTime)
{
    // Define the callbacks for the asyncRequest
    var callbacks = {

        success : function (o) {

            if (!YAHOO.bamboo.reloadDashboard) return; // do nudda 

            // Process the JSON data returned from the server
            var holder;
            try {
                var output = YAHOO.lang.JSON.parse(o.responseText);
                holder = output.holder;

                if (holder.plans && holder.plans.plan)
                {
                    var plans = holder.plans.plan;
                    var plan;
                    for (var i = 0; i < plans.length; i++)
                    {
                        plan = plans[i];
                        updatePlan(plan);
                    }
                }
            }
            catch (x) {
                //alert("JSON Parse failed! " + x + "\n" + o.responseText);
            }

            var currentTime = 0;
            //var currentTime = holder.currentTime;
            setTimeout("updatePlans(" + currentTime +");", 20000);
            document.getElementById("ajaxErrorHolder").style.display = "none"; // hide error message jsut in case its visible
        },

        failure : function (o) {
            if (!YAHOO.util.Connect.isCallInProgress(o)) {
                document.getElementById("ajaxErrorHolder").style.display = "block";
            }
        },

        timeout : 60000
    };

    // Make the call to the server for JSON data
    if (!sinceSystemTime) sinceSystemTime = 0;
    YAHOO.util.Connect.asyncRequest('GET',YAHOO.bamboo.contextPath + "/ajax/viewPlanUpdates.action?sinceSystemTime=" + sinceSystemTime, callbacks);
}

function reloadPanel(id, url, reloadEvery, previousText)
{
    // Define the callbacks for the asyncRequest
    var callbacks = {

        success : function (o) {
            var reponseText = o.responseText;

            if (!previousText || previousText != reponseText)
            {
                // only update if the previous response is different
                var elem = document.getElementById(id);
                elem.innerHTML = reponseText;
            }
            setTimeout(function() {reloadPanel(id, url, reloadEvery, reponseText);}, reloadEvery * 1000);
        },

        failure : function (o) {
            // Do nothing, stop relaoding
        },

        timeout : 60000
    };

    YAHOO.util.Connect.asyncRequest('GET', url, callbacks);
}


function deleteConfirmation(e, text)
{
    if (!confirm('Please confirm that you are about to \n' + text))
    {
        YAHOO.util.Event.stopEvent(e);
    }
}

function addConfirmationToLinks()
{
    var elems = getElementsByClassName('requireConfirmation', 'a');

    for (var i = 0; i < elems.length; i++)
    {
        var deps = elems[i];
        var text = deps.title;
        YAHOO.util.Event.addListener(deps, "click", deleteConfirmation, text);
    }
}

function selectFirstFieldOfForm(e, formId)
{
     try
     {
        var form = $(formId);
        if (form && form.elements)
        {
            var elems = form.elements;
            for (var i = 0; i < elems.length; i++)
            {
                var elem = elems[i];
                if (elem.type != 'hidden')
                {
                        elem.focus();
                        break;
                }
            }
        }
    }
    catch (exception)
    {
        // if the form is inside a yui tab layout, it will try to do this for every tab on page load.
        // IE doesn't like this (can't focus on a control which is not visible i.e. hidden in the tabs)
    }
}

