
var QXSETTINGS_DEFAULT              = 0;
var QXSETTINGS_NAMECONVENSION       = 1;
var QXSETTINGS_VIRTUALLIBRARY       = 2;
var QXSETTINGS_USERPROFILE          = 3;
var QXSETTINGS_DATAFOLDER           = 4;

// VL Permissions
var VL_PERMISSONS_FULLCONTROL       = 0xFF;
var VL_PERMISSONS_VIEW              = 0x01;
var VL_PERMISSONS_CREATE            = (VL_PERMISSONS_VIEW | 0x02);
var VL_PERMISSONS_MODIFY            = (VL_PERMISSONS_VIEW | 0x04);
var VL_PERMISSONS_DELETE            = (VL_PERMISSONS_VIEW | 0x08);


////////////////////////////////////////////////////////////////////////////
// constructor
////////////////////////////////////////////////////////////////////////////
QXOrganizer = function()
{
    this.subclass = VLInterface;
    this.subclass();
    
    this.tv = new VLTreeView({
        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.vlRootItem = null;
    this._lastUpdatedVL = TV_ROOT_ITEM_ID;
    this.className = "QXOrganizer";
    
    this.vlName = '';
    this.folderId = '';
    this.xNodeId = TV_ROOT_ITEM_ID;

    this.isDNDFromSttingsEnabled = false;
    this.isDNDFromSttingsGot = false;
    
    QXOrganizer.qxOrganizer = this;
}
QXOrganizer.prototype = new VLInterface;
QXOrganizer.qxOrganizer = null;

////////////////////////////////////////////////////////////////////////////
// create
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.create = function(parent)
{
    //this.subclass = VLInterface.prototype.create;
    //this.subclass(parent, "qx_interface");
    
    this.tv.create(parent, TVS_MANAGEICON | TVS_ITEMICON | TVS_NO_LINES | TVS_EDITABLE | TVS_DND_NOTIFICATION);
    this.tv.addNotifyHandler( [QXOrganizer.onTreeViewNotify, this] );
    this.vlRootItem = TV_ROOT_ITEM_ID;
}

////////////////////////////////////////////////////////////////////////////
// redirect
QXOrganizer.prototype.setPosition = function(pos) {return this.tv.setPosition(pos);}
QXOrganizer.prototype.itemData = function(itemId, itemData) { return this.tv.itemData(itemId, itemData); }
QXOrganizer.prototype._getVLName = function(itemId) {return this.tv._getVLName(itemId);}
// redirect
////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////
// startPeriodicUpdate
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.startPeriodicUpdate = function(timeOut)
{
    if ( this._updateOrgTimerId )
    {
        clearTimeout(this._updateOrgTimerId);
        this._updateOrgTimerId = null;
    }
    if ( !timeOut )
    {
        timeOut = 60*1000;
    }
    if ( timeOut > 0 )
    {
        this._updateOrgTimerId = setTimeout("QXOrganizer.onPeriodicUpdateTimeOut()", timeOut);
    }
    this.tv.enable(true);
}

////////////////////////////////////////////////////////////////////////////
// onPeriodicUpdateTimeOut
////////////////////////////////////////////////////////////////////////////
QXOrganizer.onPeriodicUpdateTimeOut = function()
{
    var pThis = QXOrganizer.qxOrganizer;
    
    var nextId = pThis.tv.nextItem(pThis._lastUpdatedVL, TVI_FIND_NEXT);
    if ( nextId )
    {
        pThis._lastUpdatedVL = pThis.tv.findItemData(nextId, {type: "vl_root"}, VLTreeView._compareItemsDataByType);
        if ( !pThis._lastUpdatedVL )
        {
            pThis._lastUpdatedVL = TV_ROOT_ITEM_ID;
        }
    }
    else
    {
        pThis._lastUpdatedVL = TV_ROOT_ITEM_ID;
    }
    if ( pThis._lastUpdatedVL == TV_ROOT_ITEM_ID )
    {
        DebugLog.write("Periodic update complete - Re-start timer");
        pThis.startPeriodicUpdate();
    }
    else
    {
        var vlInfo = pThis.tv.itemData(pThis._lastUpdatedVL);
        pThis.tv.enable(false);
        pThis.askServer({
            url: _vlHomePage,
            method: "POST",
            postData: [
                [INPUT_VL_ADDR, vlInfo.vl_addr],
                [INPUT_VL_DOMAIN, vlInfo.vl_domain],
                [INPUT_EMAIL, pThis._cb_srvEnvValues(vlInfo, "user_email")],
                [INPUT_NAME,  pThis._cb_srvEnvValues(vlInfo, "user_name")],
                [INPUT_ACTION, "vl_folders_tree"]
            ],
            func_onload: QXOrganizer.onPeriodicUpdateLoad,
            flags: 0
        });
    }
    
    return true;
}

////////////////////////////////////////////////////////////////////////////
// onPeriodicUpdateLoad
////////////////////////////////////////////////////////////////////////////
QXOrganizer.onPeriodicUpdateLoad = function(req, udata)
{
    if ( req.readyState() != -1 // aborted
         && req.readyState() != 4 ) // completed
    {
        return false;
    }
    
    var pThis = udata.bi;
    pThis.tv.enable(true);
    var retVal = VLInterface.onSendRequestComplete(req, udata);
    pThis.startPeriodicUpdate(100);
    return retVal;
}


////////////////////////////////////////////////////////////////////////////
// buildTree
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.buildTree = function(info)
{
    if ( AP.is_set(info.vl_addr) )
    {
        info.vl_addr = VLCommon.fullSrvAddr(info.vl_addr);
    }

    this.tv.updateTree({
        parent: TV_ROOT_ITEM_ID,
        tree: []
    });

    this._cb_updateVLTree({
        vl_addr: info.vl_addr,
        vl_domain: info.vl_domain,
        rootItem: {
            img_list: {
                base: "vl_root_dis.php"
            },
            text: "Virtual Library",
            columns: {
                0: {
                    text: "Virtual Library",
                    data: null,
                    flags: 0
                }
            },
            data: {
                type: "vl_root",
                vl_addr: info.vl_addr,
                vl_domain: info.vl_domain
            }
        },
        tree: []
    });
    
    this._cb_srvEnvValues(info, "user_email", info.user_email);
    this._cb_srvEnvValues(info, "user_name",  info.user_name);
     
    this.askServer({
        url: _vlHomePage,
        method: "POST",
        postData: [
            [INPUT_VL_ADDR, info.vl_addr],
            [INPUT_VL_DOMAIN, info.vl_domain],
            [INPUT_EMAIL, info.user_email],
            [INPUT_NAME,  info.user_name],
            [INPUT_ACTION, "perform_user_registration"]
        ],
        func_onload: QXOrganizer.onPeriodicUpdateTimeOut,
        flags: 0
    });

    return true;
}

////////////////////////////////////////////////////////////////////////////
// viewSettings
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.viewSettings = function(view)
{
    var xProvider = xGetElementById('xProvider');
    if ( xProvider )
    {
        xProvider.xShowSettings(view);
    }
}

////////////////////////////////////////////////////////////////////////////
// getInstance
////////////////////////////////////////////////////////////////////////////
QXOrganizer.getInstance = function(obj)
{
    for ( var o = obj; o && !(o.instance && QXOrganizer.prototype.isPrototypeOf(o.instance)); o = o.parentNode );
    return (o ? o.instance : null);
}

////////////////////////////////////////////////////////////////////////////
// getDNDFromSttings
////////////////////////////////////////////////////////////////////////////
QXOrganizer.getDNDFromSttings = function ()
{
    if (! this.isDNDFromSttingsGot )
    {
        this.isDNDFromSttingsEnabled = xProvider$().xIsDND2VLEnabled();
        this.isDNDFromSttingsGot = true;
    }
    return this.isDNDFromSttingsEnabled;
}

////////////////////////////////////////////////////////////////////////////
// doDragOver
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.doDragOver = function(xEvent, xCode, xNodeId)
{
    
    var isDNDEnabled = QXOrganizer.getDNDFromSttings();
    var isDNDenabledRP = true;
    var isDNDenabledFile = false;
    var isDNDenabledUK = false;

    var DNDSource = "unknown";

    if (isDNDEnabled)
    {
        isDNDenabledFile = true;
        isDNDenabledUK = true;
    }

    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 (xSelectedElementsString == null) 
    {
        DNDSource = "file";
    }
    else if (xSelectedElementsString.indexOf(DRAGDROP_DATA_TEXT_PREFIX) == 0)
    {
        DNDSource = "result_pane";
    }

    if (!this.tv.enable()
       || (!isDNDenabledRP && DNDSource == "result_pane")
       || (!isDNDenabledFile && DNDSource == "file")
       || (!isDNDenabledUK && DNDSource == "unknown"))
    {
        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;
    }
    
    var x = this; 
    if (xNodeId != null) {        
        var xNodeData  = x.itemData(xNodeId);
        var vlData = x.tv._getVLData(xNodeId);
        if (xNodeData
            && typeof(xNodeData) == 'object'
            && AP.is_set(xNodeData.type)
            && xNodeData.type == 'folder')
        {
            x.vlName = '';
            x.folderId = xNodeData.id;
            x.xNodeId = xNodeId;
            if ( (vlData.access & VL_PERMISSONS_CREATE) == VL_PERMISSONS_CREATE )
            {
                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;
                    }
                }
            }
        }
    }

    if (!isLinkDDAllowed)
    {
        x.vlName = '';
        x.folderId = 0;
        x.xNodeId = TV_ROOT_ITEM_ID;
    }
    //xEvent.dataTransfer.setData('id', 0);
    //xEvent.dataTransfer.setData('folderId', 0);   

    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
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.doDrop = function(xEvent, xCode, xNodeId) {

    var isDNDEnabled = QXOrganizer.getDNDFromSttings();
    var isDNDenabledRP = true;
    var isDNDenabledFile = false;
    var isDNDenabledUK = false;

    var DNDSource = "unknown";

    if (isDNDEnabled)
    {
        isDNDenabledFile = true;
        isDNDenabledUK = true;
    }

    var xSelectedElementsString = xEvent.dataTransfer.getData("text");
    var xSelectedElementsUrl = xEvent.dataTransfer.getData("URL");

    if (xSelectedElementsString != null
        && xSelectedElementsUrl == null
        && AP.validUrl(xSelectedElementsString))
    {
        xSelectedElementsUrl = xSelectedElementsString;
    }

    if (xSelectedElementsString == null) 
    {
        DNDSource = "file";
    }
    else if (xSelectedElementsString.indexOf(DRAGDROP_DATA_TEXT_PREFIX) == 0)
    {
        DNDSource = "result_pane";
    }

    if (!this.tv.enable()
       || (!isDNDenabledRP && DNDSource == "result_pane")
       || (!isDNDenabledFile && DNDSource == "file")
       || (!isDNDenabledUK && DNDSource == "unknown"))
    {
        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;
    }

    var x = this; 
    if (xNodeId != TV_ROOT_ITEM_ID) {        
        var xNodeData  = x.itemData(xNodeId);
        if (xNodeData
            && typeof(xNodeData) == 'object'
            && AP.is_set(xNodeData.type)
            && xNodeData.type == 'folder') {
            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);

                    if (x.xNodeId != TV_ROOT_ITEM_ID && x.folderId > 0)
                    {
                        var vlName = x._getVLName(x.xNodeId);
                        var vlFolderId = x.folderId;
                        var vlInfo = this.tv.getItemVLInfo(x.xNodeId);

                        xProvider$().xPublishToVL(vlName, vlFolderId, sUids, vlInfo.vl_addr, vlInfo.vl_domain);

                        xEvent.returnValue = true;
                        return false;
                    }
                }
                else if (xSelectedElementsUrl != null)
                {
                    if (x.xNodeId != TV_ROOT_ITEM_ID && x.folderId > 0)
                    {
                        var vlName = x._getVLName(x.xNodeId);
                        var vlFolderId = x.folderId;
                        xProvider$().xSaveAndResolveURLToVL(vlName, vlFolderId, xSelectedElementsUrl);
                        xEvent.returnValue = true;
                        return false;
                    }
                }
            }
        }
    }

    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;
}

////////////////////////////////////////////////////////////////////////////
// getVLRoot
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.getVLRoot = function()
{
    return this.vlRootItem;
}

////////////////////////////////////////////////////////////////////////////
// onTreeViewNotify
////////////////////////////////////////////////////////////////////////////
QXOrganizer.onTreeViewNotify = function(xParams)
{
    var tv = xParams.producer;
    var pThis = xParams.subscriber;

    if ( TVN_DRAGOVER_EVENT(xParams.code) )
    {
        return pThis.doDragOver(xParams.param.event, xParams.code, xParams.param.item);
    }
    else if ( TVN_DROP_EVENT(xParams.code) )
    {
        return pThis.doDrop(xParams.param.event, xParams.code, xParams.param.item);
    }
    else if ( xParams.code == TVN_ITEMTEXT_CLICKED
              || xParams.code == TVN_ITEMICON_CLICKED
              || (xParams.code == TVN_ITEM_KEYPRESS && xParams.param.key == KEY_CODE_ENTER) )
    {
        var itemId = xParams.param.item;
        var itemData = tv.itemData(itemId);

        if ( AP.is_set(itemData) && typeof itemData == "object" && AP.is_set(itemData.type) )
        {
            if ( itemData.type == "folder" || itemData.type == "alert" )
            {
                var vlName = pThis._getVLName(itemId);
                var vlFolderId = parseInt(itemData.id);
                var vlInfo = tv.getItemVLInfo(itemId);

                if ( vlName.length && vlFolderId > 0 )
                {
                    var xDataFrame = $(xDataFrameInfo.xFrameId);
                    if (xDataFrame.xUiMode == xDataFrameUiMode_xDataFrame01)
                        xDataFrame.xSetUiMode(xDataFrameUiMode_xDataFrame12);
                    xGetElementById('xProvider').xShowVLFolder(vlName, vlFolderId, vlInfo.vl_addr, vlInfo.vl_domain);
                }
            }
        }
    }
    else if ( xParams.code == TVN_ITEMTEXT_ONCONTEXTMENU
              || xParams.code == TVN_ITEMICON_ONCONTEXTMENU )
    {
        var itemId = xParams.param.item;
        tv.smartSelect(itemId);
        
        var vlInfo = tv.getItemVLInfo(itemId);
        var isLibrary = tv.isLibrary(itemId);
        var isFolder = tv.isFolder(itemId); //  maybe isFolderType need ???
        if ( vlInfo && (isLibrary || isFolder) )
        {
            var vlData = tv._getVLData(itemId);
            var access = vlData.access;
            if ( access )
            {
                var vlName = tv._getVLName(itemId);
                var folderId = -1;
                var folderName = "";
                var parentFolderId = -1;
                
                if ( isFolder )
                {
                    var itemData = pThis.itemData(itemId);
                    folderId = itemData.id;
                    folderName = tv.itemText({itemId: itemId});
                    
                    var parentId = tv.nextItem(itemId, TVI_FIND_PARENT);
                    if ( tv.isFolder(parentId) )
                    {
                        var itemData = pThis.itemData(parentId);
                        parentFolderId = itemData.id;
                    }
                }
                
                var xProvider = xGetElementById('xProvider');
                if (xProvider)
                {
                    var event = xParams.param.event;
                    xProvider.xShowVLContextMenu(
                        vlInfo.vl_addr,
                        vlInfo.vl_domain,
                        vlName,
                        parentFolderId,
                        folderId,
                        folderName,
                        access,
                        event.clientX,
                        event.clientY
                    );
                }
            }
        }
        return -1;
    }

    return 0;
}

////////////////////////////////////////////////////////////////////////////
// createFolder
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.createFolder = function(folderInfo)
{
    var submit_params = [
        [INPUT_ACTION, "folders_add"],
        [INPUT_VL_ADDR, folderInfo.vl_addr],
        [INPUT_VL_DOMAIN, folderInfo.vl_domain],
        [INPUT_VIRTUAL_LIBRARY, folderInfo.vl_name],
        [INPUT_FOLDER_NAME, folderInfo.folder_name],
        [INPUT_EMAIL, this._cb_srvEnvValues(folderInfo, "user_email")],
        [INPUT_NAME,  this._cb_srvEnvValues(folderInfo, "user_name")]
    ];

    if ( folderInfo.folder_id != -1 )
    {
        submit_params.push([INPUT_FOLDERID, folderInfo.folder_id]);
    }

    this.tv.enable(false);
    
    this.askServer({
        url: _vlHomePage,
        method: "POST",
        postData: submit_params,
        func_onload: QXOrganizer.onPeriodicUpdateLoad,
        flags: 0
    });
    
    return true;
}

////////////////////////////////////////////////////////////////////////////
// renameFolder
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.renameFolder = function(folderInfo)
{
    var submit_params = [
        [INPUT_ACTION, "folders_rename"],
        [INPUT_VL_ADDR, folderInfo.vl_addr],
        [INPUT_VL_DOMAIN, folderInfo.vl_domain],
        [INPUT_VIRTUAL_LIBRARY, folderInfo.vl_name],
        [INPUT_FOLDERID, folderInfo.folder_id],
        [INPUT_FOLDER_NAME, folderInfo.folder_name],
        [INPUT_EMAIL, this._cb_srvEnvValues(folderInfo, "user_email")],
        [INPUT_NAME,  this._cb_srvEnvValues(folderInfo, "user_name")]
    ];

    this.tv.enable(false);
    
    this.askServer({
        url: _vlHomePage,
        method: "POST",
        postData: submit_params,
        func_onload: QXOrganizer.onPeriodicUpdateLoad,
        flags: 0
    });
    
    return true;
}

////////////////////////////////////////////////////////////////////////////
// deleteFolder
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.deleteFolder = function(folderInfo)
{
    var submit_params = [
        [INPUT_ACTION, "folders_remove"],
        [INPUT_VL_ADDR, folderInfo.vl_addr],
        [INPUT_VL_DOMAIN, folderInfo.vl_domain],
        [INPUT_VIRTUAL_LIBRARY, folderInfo.vl_name],
        [INPUT_FOLDERID, folderInfo.folder_id],
        [INPUT_EMAIL, this._cb_srvEnvValues(folderInfo, "user_email")],
        [INPUT_NAME,  this._cb_srvEnvValues(folderInfo, "user_name")]
    ];

    this.tv.enable(false);
    
    this.askServer({
        url: _vlHomePage,
        method: "POST",
        postData: submit_params,
        func_onload: QXOrganizer.onPeriodicUpdateLoad,
        flags: 0
    });
    
    return true;
}

////////////////////////////////////////////////////////////////////////////
// modalDialog
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.modalDialog = function()
{
    window.showModalDialog("login.html", new Array(this, xGetElementById('xProvider')), "dialogWidth:400px;dialogHeight:300px");
    this._wndRegister = null;
}

////////////////////////////////////////////////////////////////////////////
// logOn
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype.logOn = function(usrName, role)
{
    if ( this._wndRegister )
    {
        if (this._params)
        {
            var xProvider = xGetElementById('xProvider');
            if (xProvider)
            {
                this.email = this._params.param[0][1];
                setTimeout('xProvider.xSetUserCredential("' + this._params.param[0][1] + '","' + this._params.param[1][1] + '",0)', 1);
            }
        }
        this._wndRegister.close();
    }
}

////////////////////////////////////////////////////////////////////////////
// _cb_updateBuiltInAccess
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype._cb_updateBuiltInAccess = function(vlAccess)
{
    this._cb_srvEnvValues(vlAccess, "builtIn_access", vlAccess.access);
}

////////////////////////////////////////////////////////////////////////////
// _cb_updateVLTree
////////////////////////////////////////////////////////////////////////////
QXOrganizer.prototype._cb_updateVLTree = function(vlInfo)
{
    var vlRootId = this.tv.findVLRoot(vlInfo);
    if ( !vlRootId )
    {
        vlRootId = this.tv.insertItem({
            parent: this.getVLRoot(),
            text: vlInfo.rootItem.text,
            data: vlInfo.rootItem.data,
            columns: vlInfo.rootItem.columns,
            img_list: vlInfo.rootItem.img_list,
            flags: TVI_INSERT_LAST_CHILD
        });
    }

    this.tv.updateTree({
        parentId: vlRootId,
        parentItem: vlInfo.rootItem,
        tree: vlInfo.tree
    });
    
    return null;
}
