﻿var HRDBjs = window.HRDBjs || {};

function resetSireDamCssClass() {
    var tdel = document.getElementById(document.getElementById('uxEditTDID').value);
    var sex = tdel.getAttribute('sex');
    setSireDamCssClass(tdel, '', sex);
}

function setSireDamCssClass(obj, suffix, sex) {
    if (sex == 'M')
        obj.className = 'sire';
    else
        obj.className = 'dam';
}


HRDBjs.PedigreeManager = function() {
    var $D = YAHOO.util.Dom;
    var $E = YAHOO.util.Event;

    return {
        init: function(hguid, tableid, pathToRoot, iseditmode, totalGenerations, currentUserName) {
            var tableel = document.getElementById(tableid);
            if (tableel == null)
                return;

            var pdgre = HRDBjs.Pedigree(hguid, tableel, pathToRoot, iseditmode, totalGenerations, currentUserName);
            pdgre.init();
        }
    }
} ();

HRDBjs.Pedigree = function(origHorseGuid, el, pathToRoot, iseditmode, totalGenerations, currentUserName) {
    var $D = YAHOO.util.Dom;
    var $E = YAHOO.util.Event;
    var EditLinkEl = null;
    var PopupHorseName = null;
    var PopupHorseNameHidden = null;
    var PopupHorseGuid = null;
    var PopupEditTD = null;
    var PopupParentHorseGuid = null;
    var ParentHorseGuid = '';
    var ParentHorseName = '';
    var SireDamLabel = null;

    var loadAllHorseParents = function(hguid, exceptCid) {
        // Find all occurances of hguid
        var isHorseTD = function(x) { return x.getAttribute('horseguid') == hguid && x.getAttribute('cid') != exceptCid; };
        var HorseTDs = $D.getElementsBy(isHorseTD, 'td', el);
        var i = 0;

        for (i = 0; i < HorseTDs.length; i++) {
            loadHorseParents(hguid, HorseTDs[i].getAttribute('cid'));
        }
    }

    var loadHorseParents = function(hguid, pid) {
        setProcessing(pid);

        if (hguid == null ||
            hguid == '') {
            clearCells(pid);
        }
        else {
            // Set all children to processing
            HRDB.webservices.horsetypeahead.GetHorseByGuid(hguid, onHorseLookupSuccess, onHorseLookupFailure, pid);
        }
    }

    var onSavePedigree = function() {
        var pHorseName = document.getElementById('uxPopupHorseName').value;

        // Validate horse name before continueing
        validateHorseName(pHorseName);
    }

    var validateHorseName = function(horseName) {
        var ErrorStr = '';

        if (!horseName.IsValidHorseName())
            ErrorStr = ErrorStr + '<li>Horse name is invalid.  It must be no more than 255 characters and contain only text, numbers, dashes, periods, or apostraphes.</li>';

        if (horseName.ContainsDirtyWord())
            ErrorStr = ErrorStr + '<li>Horse name contains an inappropriate word.  Please remove the word to continue.</li>';

        if (ErrorStr != '')
            ErrorStr = '<ul>' + ErrorStr + '</ul>';

        validateHorseNameCallback(ErrorStr);
    }

    var validateHorseNameCallback = function(response) {
        var ValSummary = document.getElementById('uxValidationSummary');
        if (response == '') {
            ValSummary.innerHTML = '';
            var ParentHorseGuid = document.getElementById('uxParentHorseGuid').value;
            var ChildHorseGuid = document.getElementById('uxPopupHorseGuid').value;
            var ChildHorseName = document.getElementById('uxPopupHorseName').value;
            var ChildHorseCntryCd = uxHorseCountryList.GetValue();
            var ChildHorseYOB = uxHorseYOB.GetValue();
            var ChildHorseYOBint = uxHorseYOB.GetValue();
            if (!ChildHorseYOBint)
                ChildHorseYOBint = -1;
            var EditTDID = document.getElementById('uxEditTDID');
            var EditTDEl = document.getElementById(EditTDID.value);
            var ChildHorseSex = EditTDEl.getAttribute('sex');

            if (ChildHorseSex == 'M')
                EditTDEl.className = 'sire';
            else
                EditTDEl.className = 'dam';
            
            // Continue
            HRDB.webservices.horsetypeahead.SavePedigree(ParentHorseGuid, ChildHorseGuid, ChildHorseName, ChildHorseCntryCd, ChildHorseYOBint, ChildHorseSex, currentUserName, onPedigreeSaveSuccess, onPedigreeSaveFailure, EditTDID.value);

            uxEditPopup.Hide();
            // Show the popup for the next guy
            var nextTD = GetNextIncompleteTD(EditTDEl);
            if (nextTD != null)
                HandleEditClick(nextTD);
        }
        else {
            ValSummary.innerHTML = response;
        }
    }



    var onSkip = function() {
        uxEditPopup.Hide();
        var EditTDID = document.getElementById('uxEditTDID');
        var EditTDEl = document.getElementById(EditTDID.value);
        var ChildHorseSex = EditTDEl.getAttribute('sex');
        if (ChildHorseSex == 'M')
            EditTDEl.className = 'sire';
        else
            EditTDEl.className = 'dam';

        var nextTD = GetNextIncompleteTD(EditTDEl);
        if (nextTD != null)
            HandleEditClick(nextTD);
    }

    var GetNextIncompleteTD = function(curTD) {
        if (!curTD)
            return;

        var rowIDs = curTD.getAttribute('cid').split("-");
        var curRow = parseInt(rowIDs[0]);
        var curColumn = parseInt(rowIDs[1]);
        var totalRows = Math.pow(2, totalGenerations);
        var i, j;
        for (j = curColumn; j <= totalGenerations; j++) {
            for (i = curRow + 1; i <= totalRows; i++) {
                var nextTDID = i + '-' + j;
                var isNextTD = function(x) { return x.getAttribute('cid') == i + '-' + j };
                var nextTD = $D.getElementsBy(isNextTD, 'td', el)[0];
                if (nextTD != null) {
                    // Must be editable
                    var EditDiv = $D.getElementsByClassName('pedigree-edit', 'div', nextTD)[0];
                    if (EditDiv && EditDiv.style.visibility == 'visible')
                        return nextTD;
                }
            }
            curRow = 0;
        }

    }

    var onPedigreeSaveSuccess = function(results, EditTDID) {
        var tdel = document.getElementById(EditTDID);
        tdel.setAttribute('horseguid', results.HorseGuid);

        // Update all instances of this horse
        var isCurHorseTD = function(x) { return x.getAttribute('horseguid') == results.HorseGuid; };
        var curHorseTDs = $D.getElementsBy(isCurHorseTD, 'td', el);
        var i = 0;

        for (i = 0; i < curHorseTDs.length; i++) {
            SetHorseDetails(curHorseTDs[i], results.HorseGuid, results.Name, results.BreedCountryCd, results.YearBred, results.HorseIdentifier);
            curHorseTDs[i].setAttribute('horsename', results.Name);
            curHorseTDs[i].setAttribute('yob', results.YearBred);
            //curHorseTDs[i].setAttribute('sex', results.Sex);
            curHorseTDs[i].setAttribute('cntrycd', results.BreedCountryCd);
            loadHorseParents(results.HorseGuid, curHorseTDs[i].getAttribute('cid'));
        }

        // Refresh any other c
        var isParentTD = function(x) { return x.getAttribute('cid') == tdel.getAttribute('pid'); };
        var parentTD = $D.getElementsBy(isParentTD, 'td', el)[0];
        if (parentTD != null)
            loadAllHorseParents(parentTD.getAttribute('horseguid'), parentTD.getAttribute('cid'));
    }

    var onPedigreeSaveFailure = function() {
        alert('An error occurred while attempting to save the pedigree.');
    }


    var onClearClick = function() {
        PopupHorseGuid.value = '';
        PopupHorseName.value = '';
        PopupHorseNameHidden.value = '';
        uxHorseCountryList.SetValue('');
        uxHorseYOB.SetValue('');
    }

    var SetHorseDetails = function(tdel, horseGuid, horseName, cntryCd, yob, horseIdentifier) {
        var sex = tdel.getAttribute('sex');
        if (sex == 'M')
            tdel.className = 'sire';
        else
            tdel.className = 'dam';

        var hName = 'no data found';
        var hCountryCd = '';
        var hYearBred = '';
        if (cntryCd && cntryCd != null && cntryCd != '')
            hCountryCd = ' (' + cntryCd + ')';
        if (yob && yob != null && yob != '')
            hYearBred = yob;
        if (horseName && horseName != null && horseName != '')
            hName = GetHorseDetails(horseGuid, horseName, hCountryCd, hYearBred, horseIdentifier);

        var hDetailDiv = getOrCreate(tdel, 'pedigree-details', 'div');
        hDetailDiv.innerHTML = hName;
    }

    var GetHorseDetails = function(horseGuid, horseName, cntryCd, yob, horseIdentifier) {
        var yobdisp = '';
        if (yob != null & yob != '')
            yobdisp = '<br />' + yob;
        if (iseditmode == '2')
            return '<a href="' + pathToRoot + 'horse/' + horseIdentifier + '">' + horseName + '</a>';
        else
            return '<a href="' + pathToRoot + 'horse/' + horseIdentifier + '">' + horseName + '</a>' + cntryCd + yobdisp;
    }

    var onEditClick = function() {
        var tdel = this.parentNode.parentNode;
        HandleEditClick(tdel);
    }

    var HandleEditClick = function(tdel) {
        tdel.className = 'active';
        var isParentTD = function(x) { return x.getAttribute('cid') == tdel.getAttribute('pid'); };
        var parenttd = $D.getElementsBy(isParentTD, 'td', el)[0];
        if (parenttd != null) {
            uxEditPopup.SetHeaderText(parenttd.getAttribute('horsename'));
            PopupParentHorseGuid.value = cNulls(parenttd.getAttribute('horseguid'));
        }
        else {
            uxEditPopup.SetHeaderText(ParentHorseName);
            PopupParentHorseGuid.value = cNulls(ParentHorseGuid);
        }
        PopupHorseName.value = cNulls(tdel.getAttribute('horsename'));
        PopupHorseNameHidden.value = cNulls(tdel.getAttribute('horsename'));
        PopupHorseGuid.value = cNulls(tdel.getAttribute('horseguid'));
        PopupEditTD.value = cNulls(tdel.getAttribute('id'));
        uxHorseCountryList.SetValue(cNulls(tdel.getAttribute('cntrycd')));
        uxHorseYOB.SetValue(cNulls(tdel.getAttribute('yob')));
        uxEditPopup.ShowAtElementByID(tdel.getAttribute('id'));
        if (tdel.getAttribute('sex') == 'M')
            setInnerText(SireDamLabel, "Sire:");
        else
            setInnerText(SireDamLabel, "Dam:");

        // Set focus to horse name
        setTimeout('document.getElementById(\'uxPopupHorseName\').focus();', 10);
    }

    var clearCells = function(pid) {
        var isPid = function(x) { return x.getAttribute('pid') == pid; };
        var pidcol = $D.getElementsBy(isPid, 'td', el);
        var i = 0;
        for (i = 0; i < pidcol.length; i++) {
            var detailsDiv = getOrCreate(pidcol[i], 'pedigree-details', 'div');
            detailsDiv.innerHTML = "no data found";
            //setInnerText(pidcol[i], "no data found");
            if (pidcol[i].getAttribute('sex') == 'M')
                pidcol[i].className = 'sire';
            else
                pidcol[i].className = 'dam';

            clearCells(pidcol[i].getAttribute('cid'));
        }
    }

    var setProcessing = function(pid) {
        var isPid = function(x) { return x.getAttribute('pid') == pid; };
        var pidcol = $D.getElementsBy(isPid, 'td', el);
        var i = 0;
        for (i = 0; i < pidcol.length; i++) {
            var detailsDiv = getOrCreate(pidcol[i], 'pedigree-details', 'div');
            detailsDiv.innerHTML = "no data found";
            //setInnerText(pidcol[i], " ");
            if (pidcol[i].getAttribute('sex') == 'M')
                pidcol[i].className = 'sire-proc';
            else
                pidcol[i].className = 'dam-proc';

            setProcessing(pidcol[i].getAttribute('cid'));
        }
    }

    var setEditLinks = function(tdel) {
        var EditDiv = $D.getElementsByClassName('pedigree-edit', 'div', tdel)[0];
        if (!EditDiv)
            return;
        var isLink = function(x) { return true; };
        var editlinkel = $D.getElementsBy(isLink, 'a', EditDiv)[0];
        $E.on(editlinkel, "click", onEditClick);
        if (EditDiv) {
            EditDiv.style.visibility = 'visible';
        }
    }

    var onHorseLookupSuccess = function(results, pid) {
        // Get sire
        var isSire = function(x) { return x.getAttribute('sex') == 'M' && x.getAttribute('pid') == pid; };
        var sireTD = $D.getElementsBy(isSire, 'td', el)[0];
        if (sireTD == null)
            return;

        //alert(sireTD.innerHTML);

        sireTD.className = 'sire';
        var sireName = 'no data found';
        var sireCountryCd = '';
        var sireYearBred = '';
        var sireIdentifier = '';
        if (results.SireCountryCd && results.SireCountryCd != null && results.SireCountryCd != '')
            sireCountryCd = ' (' + results.SireCountryCd + ')';
        if (results.SireYearBred && results.SireYearBred != null && results.SireYearBred != '')
            sireYearBred = results.SireYearBred;
        if (results.SireHorseIdentifier && results.SireHorseIdentifier != null && results.SireHorseIdentifier != '')
            sireIdentifier = results.SireHorseIdentifier;
        if (results.SireHorseName && results.SireHorseName != null && results.SireHorseName != '')
            sireName = GetHorseDetails(results.SireHorseGuid, results.SireHorseName, sireCountryCd, sireYearBred, sireIdentifier);

        var SireDetailDiv = getOrCreate(sireTD, 'pedigree-details', 'div');
        setEditLinks(sireTD);
        SireDetailDiv.innerHTML = sireName;

        // Lookup sire details
        var sireHorseGuid = '';
        if (results.SireHorseGuid && results.SireHorseGuid != null && results.SireHorseGuid != '')
            sireHorseGuid = results.SireHorseGuid;
        sireTD.setAttribute('yob', sireYearBred);
        sireTD.setAttribute('horseguid', sireHorseGuid);
        sireTD.setAttribute('horsename', cNulls(results.SireHorseName));
        sireTD.setAttribute('cntrycd', cNulls(results.SireCountryCd));
        loadHorseParents(sireHorseGuid, sireTD.getAttribute('cid'));

        // Get dam
        var isDam = function(x) { return x.getAttribute('sex') == 'F' && x.getAttribute('pid') == pid; };
        var damTD = $D.getElementsBy(isDam, 'td', el)[0];
        damTD.className = 'dam';
        var damName = 'no data found';
        var damCountryCd = '';
        var damYearBred = '';
        var damIdentifier = '';
        if (results.DamCountryCd && results.DamCountryCd != null && results.DamCountryCd != '')
            damCountryCd = ' (' + results.DamCountryCd + ')';
        if (results.DamYearBred && results.DamYearBred != null && results.DamYearBred != '')
            damYearBred = results.DamYearBred;
        if (results.DamHorseIdentifier && results.DamHorseIdentifier != null && results.DamHorseIdentifier != '')
            damIdentifier = results.DamHorseIdentifier;
        if (results.DamHorseName && results.DamHorseName != null && results.DamHorseName != '')
            damName = GetHorseDetails(results.DamHorseGuid, results.DamHorseName, damCountryCd, damYearBred, damIdentifier);
        var DamDetailDiv = getOrCreate(damTD, 'pedigree-details', 'div');
        setEditLinks(damTD);
        DamDetailDiv.innerHTML = damName;
        // Lookup dam details
        var damHorseGuid = '';
        if (results.DamHorseGuid && results.DamHorseGuid != null && results.DamHorseGuid != '')
            damHorseGuid = results.DamHorseGuid;
        damTD.setAttribute('yob', damYearBred);
        damTD.setAttribute('horseguid', damHorseGuid);
        damTD.setAttribute('horsename', cNulls(results.DamHorseName));
        damTD.setAttribute('cntrycd', cNulls(results.DamCountryCd));
        loadHorseParents(damHorseGuid, damTD.getAttribute('cid'));
    }

    var onHorseLookupFailure = function(pid) {
        alert('A failure occurred attempting to look up horse details');
    }

    return {
        init: function() {
            PopupHorseName = document.getElementById('uxPopupHorseName');
            PopupHorseNameHidden = document.getElementById('uxPopupHorseNameHidden');
            PopupHorseGuid = document.getElementById('uxPopupHorseGuid');
            PopupEditTD = document.getElementById('uxEditTDID');
            PopupParentHorseGuid = document.getElementById('uxParentHorseGuid');
            ParentHorseName = el.getAttribute('horsename');
            ParentHorseGuid = el.getAttribute('horseguid');
            SireDamLabel = document.getElementById('uxSireDamLabel');

            // Setup the events on the popup save button
            var SaveButton = document.getElementById('uxSavePedigree');
            $E.on(SaveButton, "click", onSavePedigree);

            // Setup the clear event
            var ClearButton = document.getElementById('uxClearPedigree');
            $E.on(ClearButton, "click", onClearClick);

            // Set the skip event
            var SkipButton = document.getElementById('uxSkipPedigree');
            $E.on(SkipButton, "click", onSkip);

            loadHorseParents(origHorseGuid, '1-0');
        }
    }
}


