//
// QUOSA Information Manager
// Copyright © 2000-2008 QUOSA, Inc.
// All Rights Reserved.
//
xOrTreeView = function () {
    var x = this; x.subclass = TreeViewEx;
    x.subclass({
        base_dir: ROOT_PATH + "img_php/treeview/",
        img_ext: ".php",
        img_line: "line.php",
        img_list: {
            base: "page.php",
            expanded: "folderopen.php",
            collapsed: "folder.php"
        }
    }); 
    this.className = "xOrTreeView";

    this.openedItemId = null;

    xOrTreeView.qxOrganizer = this;
};

xOrTreeView.prototype = new TreeViewEx;
xOrTreeView.prototype.create = function(parent, flags) {
    this.subclass = TreeViewEx.prototype.create;
    this.subclass(parent, TVS_MANAGEICON | TVS_ITEMICON | TVS_NO_LINES | TVS_EDITABLE | TVS_DND_NOTIFICATION, 0);
    this.addNotifyHandler( [xOrTreeView.xOnTreeViewEvents, this] );
}

xOrTreeView.prototype.xNormalizeNumberOfResults = function (xNumberOfResults) {
    xNumberOfResults = xNumberOfResults.toString(); 
    if (xNumberOfResults.length == 1) return '00' + xNumberOfResults;
    if (xNumberOfResults.length == 2) return '0'  + xNumberOfResults;
    return xNumberOfResults;
}

var xTreeNodes = '';
xOrTreeView.prototype.xGetNodeView = function (xLevel, xNodeObj) {
    var x = this; if (!xIsObject(xNodeObj)) return false;
    var xNodeView = xNodeObj.xGetNodeType();
    var xNodeName = xNodeObj.xGetNodeName();
    var xNodeId   = xNodeObj.xGetNodeId  ();
    switch (xNodeView) {
        case NODE_TYPE_ROOT : 
            xNodeView = '{ level: '+xLevel+', text: "My Articles", data: { view: '+xNodeView+', nid: "'+xNodeId+'"}, img_list: {base:"quosa.php"} }';
            break;
        case NODE_TYPE_GROUP      :
            xNodeView = '{ level: '+xLevel+', text: "'+xNodeName+'", data: { view: '+xNodeView+', nid: "'+xNodeId+'"}, img_list: {base:"searches.php"} }';
            break;      
        case NODE_TYPE_MYSEARCHES :
            xNodeView = '{ level: '+xLevel+', text: "'+xNodeName+'", data: { view: '+xNodeView+', nid: "'+xNodeId+'"}, img_list: {base:"searches.php"} }';
            break;
        case NODE_TYPE_SEARCH     : 
            var xResultSet = xNodeObj.xGetResultsSet();
            if (xIsObject(xResultSet) && xResultSet != null) {
                var xNumResults = xResultSet.xGetNumberOfResults();
                xNodeName = '[' + x.xNormalizeNumberOfResults(xNumResults) + '] ' + xNodeName;
            }
            xNodeView = '{ level: '+xLevel+', text: "'+xNodeName+'", data: { view: '+xNodeView+', nid: "'+xNodeId+'"}, img_list: {base:"search2.php"} }';
            break;
        case NODE_TYPE_MYFOLDERS :
            xNodeView = '{ level: '+xLevel+', text: "'+xNodeName+'", data: { view: '+xNodeView+', nid: "'+xNodeId+'"}, img_list: {base:"folders.php"} }';
            break;
        case NODE_TYPE_FOLDER     : 
            var xResultSet = xNodeObj.xGetResultsSet();
            if (xIsObject(xResultSet) && xResultSet != null) {
                var xNumResults = xResultSet.xGetNumberOfResults();
                xNodeName = '[' + x.xNormalizeNumberOfResults(xNumResults) + '] ' + xNodeName;
            }
            xNodeView = '{ level: '+xLevel+', text: "'+xNodeName+'", data: { view: '+xNodeView+', nid: "'+xNodeId+'"}, img_list: {base:"folder2.php"} }';
            break;
            
        default:
            alert('Invalid Node: ' + xNodeView);
            return false;
    }
    if (xTreeNodes.length > 0) xTreeNodes += ',';
    xTreeNodes += xNodeView;
    return true;
}

xOrTreeView.prototype.xBuildNode = function (xLevel, xNodeObj) {
    var x = this; if (x.xGetNodeView(xLevel, xNodeObj) == false) return false;
    var xNumChilds = xNodeObj.xGetNumberOfChildren();
    for (var iIndex = 0; iIndex < xNumChilds; ++iIndex) {
        var xChildNode = xNodeObj.xGetChildNode(iIndex);
        if (xIsObject(xChildNode)) {
            x.xBuildNode(xLevel + 1, xChildNode);
        } else break;
    }
}

xOrTreeView.prototype.xBuildTree = function () { 
    var x = this; var xOrTreeObj = Env$().xGetOrganizerTree();
    var xRootNode = xOrTreeObj.xGetRootNode();
    if (xIsObject(xRootNode)) {
        xTreeNodes = ''; x.xBuildNode(0, xRootNode);
        try {
            eval('xTreeNodes = [' + xTreeNodes + '];' );
            x.qxRootItem = TV_ROOT_ITEM_ID;
            x.updateTree( { parentId: x.qxRootItem, tree: xTreeNodes, flags: 0 } );
            x.expand(x.nextItem(TV_ROOT_ITEM_ID, TVI_FIND_FIRST_CHILD));
        } catch (xException) {
            alert('Failed to build organizer tree.');
        }       
    }
}

xOrTreeView.prototype.xRefreshItem = function(xItemId) {
    var x = this;
    var xTreeObj = Env$().xGetOrganizerTree();
    if (xIsObject(xTreeObj) && xTreeObj != null) 
    {
        var xNodeData  = x.itemData(xItemId);
        if (xNodeData != null
            && typeof(xNodeData) == 'object'
            && AP.is_set(xNodeData.view)
            && (xNodeData.view == NODE_TYPE_FOLDER || xNodeData.view == NODE_TYPE_SEARCH)
           ) 
        {
            var xNodeObj = xTreeObj.xFindNodeById(xNodeData.nid);
            if (xIsObject(xNodeObj) && xNodeObj != null) 
            {
                var xResultSet = xNodeObj.xGetResultsSet();
                if (xIsObject(xResultSet) && xResultSet != null) 
                {
                    var xNumResults = xResultSet.xGetNumberOfResults();
                    var xNodeName = xNodeObj.xGetNodeName();
                    xNodeName = '[' + x.xNormalizeNumberOfResults(xNumResults) + '] ' + xNodeName;
                    x.itemText({itemId: xItemId,text: xNodeName});
                }
            }
        }
    }
}

xOrTreeView.prototype.xRefreshActiveNode = function() {
    var x = this;
    if (x.openedItemId != null)
    {
        x.xRefreshItem(x.openedItemId);
    }
}

xOrTreeView.xOnTreeViewEvents = function(xParams) {
    var xTreeView = xParams.producer; var x = xParams.subscriber;   
    if ( TVN_DRAGOVER_EVENT(xParams.code) )
    {
        return x.doDragOver(xParams.param.event, xParams.code, xParams.param.item);
    } else
    if ( TVN_DROP_EVENT(xParams.code) )
    {
        return x.doDrop(xParams.param.event, xParams.code, xParams.param.item);
    } else
    if (xParams.code == TVN_ITEMTEXT_CLICKED || xParams.code == TVN_ITEMICON_CLICKED) {
        var xItemId   = xParams.param.item;
        var xItemData = xTreeView.itemData(xItemId); x.smartSelect(xItemId); x.expand(xItemId);
        if (xIsObject(xItemData) && xItemData != null) {
            if (xIsDefined(xItemData.view) && xIsDefined(xItemData.nid)) {
                if (xItemData.view == NODE_TYPE_SEARCH) {
                    xTreeView.openedItemId = xItemId;
                    xTreeView.xOpenSearch(xItemData.nid);
                } else
                if (xItemData.view == NODE_TYPE_FOLDER)
                {
                    xTreeView.openedItemId = xItemId;
                    xTreeView.xOpenFolder(xItemData.nid);
                }
            }
        }       
    } else
    if (xParams.code == TVN_ITEMTEXT_DBLCLICKED || xParams.code == TVN_ITEMICON_DBLCLICKED) {
        var xItemId   = xParams.param.item;
        var xItemData = xTreeView.itemData(xItemId); x.smartSelect(xItemId);
        if (xIsObject(xItemData) && xItemData != null) {
            if (xIsDefined(xItemData.view) && xIsDefined(xItemData.nid)) {
                xTreeView.xOnNodeDoubleClick(xItemData.view, xItemData.nid);
            }
        }           
    } else
    if (xParams.code == TVN_ITEMTEXT_ONCONTEXTMENU
       || xParams.code == TVN_ITEMICON_ONCONTEXTMENU ) {
        var xItemId = xParams.param.item; xTreeView.smartSelect(xItemId);
        var xItemData = xTreeView.itemData(xItemId);
        if (xIsObject(xItemData) && xItemData != null) {
            if (xIsDefined(xItemData.view) && xIsDefined(xItemData.nid)) {
                var xNodeId = xItemData.nid.toString();
                var xEvent  = xParams.param.event;
                xProvider$().xShowNodeContextMenu(xNodeId, xEvent.clientX, xEvent.clientY);
            }           
        }
    } 
    else if (xParams.code == TVN_ITEM_DO_DELETE)
    {
        var xItemId   = ((xParams.code == TVN_ITEM_KEYPRESS) ? xParams.param.item : xParams.param);
        var xItemData = xTreeView.itemData(xItemId);
        if (xIsObject(xItemData) && xItemData != null)
        {
            if (xIsDefined(xItemData.view) && xIsDefined(xItemData.nid))
            {
                var xNodeId = xItemData.nid.toString();
                var xEvent  = xParams.param.event;
                //call delete folder
            }
        }
        return -1;
    }
    else if (xParams.code == TVN_ITEM_DO_INSERT)
    {
        return -1;
    }
    else if (xParams.code == TVN_ITEM_DO_TEXTMODIFY)
    {
        var xItemId   = ((xParams.code == TVN_ITEM_KEYPRESS) ? xParams.param.item : xParams.param);
        var xItemData = xTreeView.itemData(xItemId);
        if (xIsObject(xItemData) && xItemData != null)
        {
            if (xIsDefined(xItemData.view) && xIsDefined(xItemData.nid))
            {
                var xNodeId = xItemData.nid.toString();
                var xEvent  = xParams.param.event;
                //start modify
            }
        }
        return -1;
    }
    else if (xParams.code == TVN_ITEM_EDIT_CONFIRM)
    {
        var xItemId   = xParams.param.item;
        var xItemData = xTreeView.itemData(xItemId);

        if (xIsObject(xItemData) && xItemData != null)
        {
            if (xIsDefined(xItemData.view) && xIsDefined(xItemData.nid))
            {
                var xNodeId = xItemData.nid.toString();
                var xEvent  = xParams.param.event;
                var newText = xParams.param.text;
            }
        }

        return 0;
    }
    else if (xParams.code == TVN_ITEM_EDIT_ESCAPE)
    {
        return 0;
    }

    return 0;
}

xOrTreeView.prototype.xOnNodeDoubleClick = function (xNodeView, sNodeId) {
    xProvider$().xOnNodeDoubleClick(sNodeId);
}

xOrTreeView.prototype.xOpenSearch = function (sSearchId) {  
    sSearchId = sSearchId.toString(); 
    var xTreeObj = Env$().xGetOrganizerTree();
    if (xIsObject(xTreeObj) && xTreeObj != null) {
        var xNodeObj = xTreeObj.xFindNodeById(sSearchId.toString());
        if (xIsObject(xNodeObj) && xNodeObj != null) {
            var xDataFrame = $(xDataFrameInfo.xFrameId);
            if (xDataFrame.xUiMode == xDataFrameUiMode_xDataFrame02)
                xDataFrame.xSetUiMode(xDataFrameUiMode_xDataFrame12);           
            xNodeObj = xTreeObj.xSetActiveNode(sSearchId);
            if (xIsObject(xNodeObj) && xNodeObj != null) {
                var xDataView = $(xDataViewInfo.xFrameId);
                xDataView.xReloadResults();
            }
        }
    }
}

xOrTreeView.prototype.xOpenFolder = function (sFolderId) {  
    sFolderId = sFolderId.toString(); 
    var xTreeObj = Env$().xGetOrganizerTree();
    if (   xIsObject(xTreeObj) 
        && xTreeObj != null )
    {
        var xNodeObj = xTreeObj.xFindNodeById(sFolderId.toString());
        if (   xIsObject(xNodeObj) 
            && xNodeObj != null )
        {
            var xDataFrame = $(xDataFrameInfo.xFrameId);
            if (xDataFrame.xUiMode == xDataFrameUiMode_xDataFrame02)
            {
                xDataFrame.xSetUiMode(xDataFrameUiMode_xDataFrame12);
            }
            xNodeObj = xTreeObj.xSetActiveNode(sFolderId);
            if (   xIsObject(xNodeObj)
                && xNodeObj != null )
            {
                var xDataView = $(xDataViewInfo.xFrameId);
                xDataView.xReloadResults();
            }
        }
    }
}

xOrTreeView.prototype._compareItems_virt = function(itemLeft, itemRight) {
    return this._compareItemsData_virt(itemLeft.data, itemRight.data);
}

xOrTreeView.prototype._compareItemsData_virt = function(dataLeft, dataRight) {
    if ( typeof dataLeft != typeof dataRight )
    {
        return 1;
    }
    if ( typeof dataLeft == 'object' )
    {
        return (dataLeft.nid === dataRight.nid ? 0 : 1);
    }
    return (dataLeft == dataRight ? 0 : 1);
}

xOrTreeView.prototype.xFindNode = function (xNodeId) {
    return this.findItemData(TV_ROOT_ITEM_ID, {nid: xNodeId});
}

////////////////////////////////////////////////////////////////////////////
// getInstance
////////////////////////////////////////////////////////////////////////////
xOrTreeView.getInstance = function(obj)
{
    for ( var o = obj; o && !(o.instance && xOrTreeView.prototype.isPrototypeOf(o.instance)); o = o.parentNode );
    return (o ? o.instance : null);
}

////////////////////////////////////////////////////////////////////////////
// doDragOver 
////////////////////////////////////////////////////////////////////////////
xOrTreeView.prototype.doDragOver = function(xEvent, xCode, xNodeId) 
{
    var x = this; 

    var xSelectedElementsString = xEvent.dataTransfer.getData("text");
    var xSelectedElementsUrl = xEvent.dataTransfer.getData("URL");
    var isLinkDDAllowed = false;

    if (xSelectedElementsString != null
        && xSelectedElementsUrl == null
        && AP.validUrl(xSelectedElementsString))
    {
        xSelectedElementsUrl = xSelectedElementsString;
    }

    if (xCode != TVN_DRAGOVER)
    {        
        var xNodeData = x.itemData(xNodeId);
        if (
            xNodeData != null
            && typeof(xNodeData) == 'object'
            && AP.is_set(xNodeData.view)
           )
        {
            if (xNodeData.view == NODE_TYPE_FOLDER || xNodeData.view == NODE_TYPE_SEARCH)
            {
                var xTreeObj = Env$().xGetOrganizerTree();
                if (xIsObject(xTreeObj) && xTreeObj != null) 
                {
                    var xNodeObj = xTreeObj.xGetActiveNode();
                    if (xIsObject(xNodeObj) && xNodeObj != null) 
                    {
                        if (xNodeObj.xGetNodeId() != xNodeData.nid)
                        {
                            xEvent.returnValue = false;
                            //
                            //xSelectedElementsString: (null || any selected text || our data that starts from DRAGDROP_DATA_TEXT_PREFIX)
                            //if null then possible file, if we set dropEffect = 'none' we will lost onDrop event
                            //if our data then dropEffect = 'copy';
                            //if any text then dropEffect = 'none';
                            //
    
                            if (xSelectedElementsString != null)
                            {
                                if ( xSelectedElementsString.indexOf(DRAGDROP_DATA_TEXT_PREFIX) == 0 )
                                {
                                    xEvent.dataTransfer.dropEffect = 'copy';
                                    xEvent.returnValue = true;
                                    return false; 
                                }
                                else if ( xSelectedElementsUrl == null )
                                {
                                    xEvent.dataTransfer.dropEffect = 'none';
                                    return false; 
                                }
                                else if (xSelectedElementsUrl != null)
                                {
                                    isLinkDDAllowed = true;
                                }
                            }
                        }
                        else if (xSelectedElementsUrl != null)
                        {
                            isLinkDDAllowed = true;
                        }
                    }
                    else if (xSelectedElementsUrl != null)
                    {
                      isLinkDDAllowed = true;
                    }
                }
            }
        }
    }

    // set dropEffect = 'none' for everything except files

    if ( xSelectedElementsString != null )
    {
        if (xSelectedElementsUrl == null)
        {
            xEvent.dataTransfer.dropEffect = 'none';
        }
        else if (isLinkDDAllowed)
        {
            xEvent.dataTransfer.dropEffect = 'link';
            xEvent.returnValue = true;
            return false; 
        }
        else if (! isLinkDDAllowed)
        {
            xEvent.dataTransfer.dropEffect = 'copy';
        }
    }
    xEvent.returnValue = false;
    return false;
}

////////////////////////////////////////////////////////////////////////////
// doDrop
////////////////////////////////////////////////////////////////////////////
xOrTreeView.prototype.doDrop = function(xEvent, xCode, xNodeId) 
{
    var x = this; 
    var xSelectedElementsString = xEvent.dataTransfer.getData("text");
    var xSelectedElementsUrl = xEvent.dataTransfer.getData("URL");
    if (xSelectedElementsString != null
        && xSelectedElementsUrl == null
        && AP.validUrl(xSelectedElementsString))
    {
        xSelectedElementsUrl = xSelectedElementsString;
    }

    if (xCode != TVN_DROP)
    {
        var xNodeData  = x.itemData(xNodeId);
        if (xNodeData != null
            && typeof(xNodeData) == 'object'
            && AP.is_set(xNodeData.view)
            && (xNodeData.view == NODE_TYPE_FOLDER || xNodeData.view == NODE_TYPE_SEARCH)
           ) 
        {
            var xDataView = $(xDataViewInfo.xFrameId);
            if (xDataView)
            {
                if (xSelectedElementsString != null
                    && xSelectedElementsString.indexOf(DRAGDROP_DATA_TEXT_PREFIX) == 0)
                {
                    var sUids = xSelectedElementsString.substring(DRAGDROP_DATA_TEXT_PREFIX.length);

                    xProvider$().xCopyResults(xNodeData.nid, sUids);
                    x.xRefreshItem(xNodeId);

                    xEvent.returnValue = true;
                    return false;
                }
                else if (xSelectedElementsUrl != null)
                {
                    xProvider$().xSaveAndResolveURL(xNodeData.nid, xSelectedElementsUrl);
                    x.xRefreshItem(xNodeId);
                    xEvent.returnValue = true;
                    return false;
                }
            }
        }
    }


    //
    // set dropEffect = 'none' for files, because we can't to do it before. we need to set it here unless we will get cosmetic bug
    //
    if ( xSelectedElementsString == null )
    {
        xEvent.dataTransfer.dropEffect = 'none';
        //there we detect that it is a file.
    }
    else if ( xSelectedElementsUrl != null )
    {
        xEvent.dataTransfer.dropEffect = 'none';
        //there we detect that it is a URL.
    }
    xEvent.returnValue = false;
    return false;
}
