
var winList;
var winCtrl;

// Determine browser and version.

function Browser()
{
    var ua, s, i;

    this.isIE    = false;  // Internet Explorer
    this.isNS    = false;  // Netscape
    this.isOpera = false;  // Opera
    this.version = null;

    ua = navigator.userAgent;
    
    s = "MSIE";
    if ((i = ua.indexOf(s)) >= 0)
    {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    s = "Netscape6/";
    if ((i = ua.indexOf(s)) >= 0)
    {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }
    
    s = "Opera/";
    if ((i = ua.indexOf(s)) >= 0)
    {
        this.isOpera = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    // Treat any other "Gecko" browser as NS 6.1.

    s = "Gecko";
    if ((i = ua.indexOf(s)) >= 0)
    {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
}

var browser = new Browser();

//=============================================================================
// Window Object
//=============================================================================

function Window(el)
{
    var i, mapList, mapName;

    this.frame      = el;
    this.isOpen     = false;
    this.open       = winOpen;
    this.close      = winClose;

    this.frame.parentWindow = this;
}

function winOpen()
{
    if (this.isOpen)
        return;

    this.isOpen = true;

    this.frame.style.visibility = "visible";

    this.mouseClicks=0;     // first click must be ignored in winCheckOutsideClick
}

function winClose()
{
    this.frame.style.visibility = "hidden";
    this.isOpen = false;

    if (this.afterClose)
        this.afterClose();
}

function winSwitch()
{
    if (this.isOpen)
        winClose();
    else
        winOpen();
}


function winCheckOutsideClick(event)
{
    if (browser.isIE)
    {
        x = winCtrl.mainWin.event.x;
        y = winCtrl.mainWin.event.y;
    }
    if (browser.isNS)
    {
        x = event.pageX;
        y = event.pageY;
    }

    for (var sWin in winList)
    {
        if (winList[sWin].isOpen && winList[sWin].bCloseOnOutsideClick)
        {
            if (winList[sWin].mouseClicks>0)
            {
                var nLeft   = parseInt(winList[sWin].frame.style.left,   10);
                var nTop    = parseInt(winList[sWin].frame.style.top,    10);
                var nWidth  = parseInt(winList[sWin].frame.style.width,  10);
                var nHeight = parseInt(winList[sWin].frame.style.height, 10);

                if (x<nLeft || x>nLeft+nWidth || y<nTop-25 || y>nTop+nHeight+30)
                {
                    winList[sWin].close();
                }
            }
            winList[sWin].mouseClicks++;
        }
    }
}

//=============================================================================
// Initialization code.
//=============================================================================

function winInitOne(winId, bCloseOnOutsideClick, winAfterClose)
{
    el=winCtrl.mainDoc.getElementById(winId);

    if (   el
        && el.tagName   == 'DIV'
        && el.className == 'tree-window')
    {
        winList[el.id]=new Window(el);

        winList[el.id].bCloseOnOutsideClick = bCloseOnOutsideClick;
        winList[el.id].afterClose           = winAfterClose;
    }
}

function winInit(p_mainWin)
{
    var elList;

    // Initialize window control object.

    mainWin=p_mainWin;
    mainDoc=p_mainWin.document;

    delete winCtrl;
    winCtrl = new Object();

    winCtrl.mainWin                          = mainWin;
    winCtrl.mainDoc                          = mainWin.document;
    winCtrl.active                           = false;
    winCtrl.mainDoc.onclick                  = winCheckOutsideClick;

    delete winList;
    winList = new Array();

}


//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------

var mainWin;
var mainDoc;

var sImgSrc_Plus;
var sImgSrc_Minus;
var sImgSrc_Nothing;
var sImgSrc_Buttons;

function treeWaitOn(event)
{
    this.style.cursor='wait';
}

function treeWaitOff(event)
{
    this.style.cursor='hand';
    if (this.style.cursor!='hand')
        this.style.cursor='pointer';
}

function treeOnKeyDown(event)
{
    var nKeyCode = event ? event.which : mainWin.event.keyCode;

    if (   nKeyCode==13                             // enter
        || nKeyCode==32                             // space
        || (nKeyCode>=65 && nKeyCode<90)            // A-Z
        || (nKeyCode>=97 && nKeyCode<=122)          // a-z
        || (nKeyCode>=48 && nKeyCode<=57)           // 0-9
       )
    {
        this.click();
    }
    else if (nKeyCode==27)
    {
        sColumn=this.name.substr(3,this.name.length);

        if (winList['DIV_'+sColumn].isOpen)
            winList['DIV_'+sColumn].close();
    }

    return 1;
}

function treeInitializeBase(p_mainWin)
{
    bWinInitialized=1;
    mainWin=p_mainWin;
    mainDoc=p_mainWin.document;
}

function treeInitializeWindow(sColumn, p_nWidth, p_nHeight, sNativeLink)
{
    sImgSrc_Plus        = sNativeLink+"/candidate/images/plus.png";
    sImgSrc_PlusHover   = sNativeLink+"/candidate/images/plus_hover.png";
    sImgSrc_Minus       = sNativeLink+"/candidate/images/minus.png";
    sImgSrc_MinusHover  = sNativeLink+"/candidate/images/minus_hover.png";
    sImgSrc_Nothing     = sNativeLink+"/candidate/images/nothing.png";
    sImgSrc_Buttons     = sNativeLink+"/candidate/images/buttons.png";
    
    var obj=mainDoc.getElementsByName('DS_'+sColumn)[0];

    if (obj && !obj.disabled)                                                   // initialize tree window only if object active
    {
        var nLeft;
        var nTop;
        var nWidth;
        var nHeight;
        
        obj_px=mainDoc.getElementsByName('PX_'+sColumn)[0];
        if (obj_px)
        {
            obj_px.onmousedown  = treeWaitOn;
            obj_px.onmouseup    = treeWaitOff;
            obj_px.onclick      = treeOpen;
            obj_px.style.cursor = 'hand';               // ie
            if (obj_px.style.cursor != 'hand')
                obj_px.style.cursor = 'pointer';        // ns
        }

        obj.onmousedown     = treeWaitOn;
        obj.onmouseup       = treeWaitOff;
        obj.onclick         = treeOpen;
        obj.onkeydown       = treeOnKeyDown;

        obj.style.cursor    = 'hand';                   // ie
        if (obj.style.cursor != 'hand')
            obj.style.cursor = 'pointer';               // ns

        var objTmp=obj;                                                         // calculate nLeft + nTop
        nLeft    = 0;
        nTop     = objTmp.offsetHeight;
        do {                                                                    
            nLeft  += objTmp.offsetLeft;
            nTop   += objTmp.offsetTop;
            objTmp  = objTmp.offsetParent;
        } while (objTmp);

        switch(p_nWidth)                                                        // calculate nWidth
        {
            case -1:    nWidth=mainDoc.body.offsetWidth-nLeft-35;   break;      // maximum width starting vom left side of parent control
            case -2:    nLeft=130;                                              // maximum width + moved to left border
                        nWidth=mainDoc.body.offsetWidth-130;
                        break;
            case  0:    nWidth=obj.offsetWidth+obj_px.offsetWidth;                     break;      // same width as parent control
            default:    nWidth=p_nWidth;                            break;      // individual
        }

        switch(p_nHeight)                                                       // calculate nHeight
        {
            case -1:    nHeight=mainDoc.body.offsetHeight-nTop-35;  break;      // maximum height starting from lower border or parental control
            case -2:    nTop=0;                                                 // maximum height + moved to top border
                        nHeight=mainDoc.body.offsetHeight-nTop-35;  break;
            default:    nHeight=p_nHeight;                          break;      // individual
        }
        
        if (nTop+nHeight>mainDoc.body.offsetHeight-35)                          // move window above obj if it would be below lower border
            nTop=mainDoc.body.offsetHeight-nHeight-35;

       
        var x = mainDoc.getElementById("DIV_"+sColumn);
        
        mainDoc.getElementById("DIV_"+sColumn).style.left   = (nLeft-1) + "px";
        mainDoc.getElementById("DIV_"+sColumn).style.top    = (nTop-3)  + "px";
        mainDoc.getElementById("DIV_"+sColumn).style.width  = (nWidth)  + "px";
        //mainDoc.getElementById("DIV_"+sColumn).style.height = nHeight;

        winInitOne('DIV_'+sColumn, 1, treeAfterClose);

        winList['DIV_'+sColumn].sTreeColumn=sColumn;
    }
}

function treeClick(sID)
{
    if    (mainDoc.getElementById)
    {
        if (mainDoc.getElementById(sID).style.display == 'block')
        {
            mainDoc.getElementById(sID).style.display  = 'none';
            mainDoc.images['IMG_'+sID].src    = sImgSrc_PlusHover;
        } else {
            mainDoc.getElementById(sID).style.display  = 'block';
            mainDoc.images['IMG_'+sID].src             = sImgSrc_MinusHover;
        }
    }
    else if (mainDoc.all)
    {
        if (mainDoc.all[sID].style.display            == 'block')
        {
            mainDoc.all[sID].style.display             = 'none';
            mainDoc.all['IMG_'+sID].src                = sImgSrc_PlusHover;
        } else {
            mainDoc.all[sID].style.display             = 'block';
            mainDoc.all['IMG_'+sID].src                = sImgSrc_MinusHover;
        }
    }
}

function treeImageOver(obj)
{
    if      (obj.src.indexOf(sImgSrc_Plus)!=-1)         obj.src=sImgSrc_PlusHover;
    else if (obj.src.indexOf(sImgSrc_Minus)!=-1)        obj.src=sImgSrc_MinusHover;
}

function treeImageOut(obj)
{
    if      (obj.src.indexOf(sImgSrc_PlusHover)!=-1)    obj.src=sImgSrc_Plus;
    else if (obj.src.indexOf(sImgSrc_MinusHover)!=-1)   obj.src=sImgSrc_Minus;
}   

function treeOpen(event)
{
    sColumn=this.name.substr(3,this.name.length);

    if (!mainDoc.getElementsByName('DS_'+sColumn)[0].disabled)
    {
        for (var sWin in winList)                       // close all exept current
        {
            if (sWin != 'DIV_'+sColumn && winList[sWin].isOpen)
            {
                winList[sWin].close();
            }
        }
        
        if (winList['DIV_'+sColumn])                    // close if opened and vice versa
        {
            if (winList['DIV_'+sColumn].isOpen)
            {
                winList['DIV_'+sColumn].close();
            } else {
                winList['DIV_'+sColumn].open();
            }
        }
    }
}

function treeAfterClose()
{
                                                                                                // find DS_ element in index
    for (i=0; i<mainDoc.DATA.elements.length && mainDoc.DATA.elements[i].name != 'DS_'+this.sTreeColumn; i++);

    if (i<mainDoc.DATA.elements.length)
    {
                                                                                                // find next visible and enabled element
        for (i+=1;i<mainDoc.DATA.elements.length && (mainDoc.DATA.elements[i].type=='hidden' || mainDoc.DATA.elements[i].type=='select-one');i++);

        if (i<mainDoc.DATA.elements.length)                                                     // set focus
        {
            mainDoc.DATA.elements[i].focus();
            mainDoc.DATA.elements[i].select();
        }
    }
}

function treeSubmit(sColumn, nID, sDescription, bWithoutID)
{
    var sSubmitActionOnChange = '';
    var sIdent                = 'submit_action_on_change:';
    
    var sIDValue              = mainDoc.getElementsByName('ID_'+sColumn)[0].value;

    if ( sIDValue.substr(0,sIdent.length) == sIdent )
    {
        sSubmitActionOnChange = sIDValue.substr(sIdent.length);
    }
    
    if (!bWithoutID)
    {
        mainDoc.getElementsByName('ID_'+sColumn)[0].value=nID;
    }
    
    mainDoc.getElementsByName('DS_'+sColumn)[0].value=sDescription;

    if (winList['DIV_'+sColumn])
        winList['DIV_'+sColumn].close();

    if (sDescription != '' && sSubmitActionOnChange != '')
    {
        mainWin.do_submit(sSubmitActionOnChange);
    }
    
    if (mainDoc.getElementsByName('ID_'+sColumn)[0].onchange)
    {
        mainWin.do_submit(document.DATA.DEFAULT_ACTION.value);
    }
}

