Namespace.register("U.MD.DK.C"); //网盘功能使用区域


/**
* 获取目录树的一条线上的所有祖先
* @param  {string}  操作的目录id
* @param  {array}  用户的网盘信息
* @param  {object}  在该目录下操作的文件
* @return  {array}  得到操作权限数组
*/
U.MD.DK.C.getAncestors = function (fileinfo, diskinfo) {
    var _dirinfo = fileinfo, //目录数据
        _ancestors = [] //这里是需要返回的祖先
    ;
    //不断的循环寻找自己的祖先
    while (_dirinfo) {
        _ancestors.push(_dirinfo); //找到后追加
        _dirinfo = U.Json.select(diskinfo.directoryOrFiles, { "UserDirectoryID": _dirinfo.UserDirectoryParentID }, 1)[0]; //设置搜索的目录id为上级的id不断的向上搜索祖先
    }
    return _ancestors; //返回自己的祖先元素
}

/**
* 判断是否具有添加网盘的操作权限 判断是否有添加的权限 和 获取的权限
* @param  {string}  操作的目录id
* @param  {array}  用户的网盘信息
* @return  {array}  文件的权限信息
*            0 目录id
*            1-n 所有涉及到权限信息   (1只允许上传 2只允许下载)
**/
U.MD.DK.C.readWritePermission = function (dirid, diskinfo) {
    var i,
        _permi,
        _dirs = [],
        _returns = [],
        _fileinfo = U.Json.select(diskinfo.directoryOrFiles, { "UserDirectoryID": dirid }, 1)[0] //获取当前操作目录的目录信息
    ;
    //该目录未加载或者该目录id加载的不是目录,如我的协同、最近文件等
    if (_fileinfo) {
        //获取当前操作的目录所有的祖先文件夹
        _dirs = U.MD.DK.C.getAncestors(_fileinfo, diskinfo);
        _returns.push(_dirs);
        //循环所有的祖先集,找出读写权限
        for (i = 0; i < _dirs.length; i++) {
            _permi = _dirs[i].UserDirectoryEncrypt; //获取该目录的操作权限的方式
            if (_permi == "1" || _permi == "2") { //判断是否有上传下载权限
                _returns.push(_permi); break;
            }
        } //获取权限
    }
    return _returns;
}

/**
* 判断是否具有添加网盘的操作权限 判断是否有添加的权限 和 获取的权限
* @param  {string}  操作的目录id
* @param  {array}  用户的网盘信息
* @param  {object}  在该目录下操作的文件
* @return  {array}  得到操作权限数组
*           0 判断该目录是否允许上传  1、自己建立的目录是可以下载的 2、没有限制只允许上传的可以下载
*           1 判断该目录是否允许下载   1、自己建立的目录是可以上传的 2、ftp中没有限制只允许上传的是可以下载
*           2 判断是否具有添加网盘的操作权限 判断是否有添加的权限 和 获取的权限
*           3 获取上传的目录用户对应的临时目录
*           4 判断操作的文件是否有本人有关 包含是本人创建、本人网盘里、在本人创建的群里
*/
U.MD.DK.C.getDirectoryPermissions = function (fileordirid, diskinfo) {
    diskinfo = diskinfo || US.disk.UserDisk; //需要操作的当前用户的网盘信息
    var _isftp, //是否操作ftp
        _ismyself, //是否操作本人网盘内容
        _isuserdisk, //是否在自己的网盘中
        _isgroup, //是否在群里
        _isgroupmain,
        _permissions = { //所有的权限
            "isopen": true, //是否允许打开, 现在所有的文件都有打开权限
            "isupadte": true, //是否允许修改, 只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "isdelete": true, //是否允许删除, 只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "iscopy": true, //是否允许复制,现在所有的文件都有复制权限
            "isshear": true, //是否允许剪切,只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "isencryption": false, //是否允许加密,展示取消这个功能。
            "isreply": true, //是否允许加密,展示取消这个功能。
            "isdownload": true, //是否允许下载,只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "isnew": true, //是否允许新建, 只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "ispaste": true, //是否允许粘贴,只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "isrefresh": true, //是否允许刷新, 现在所有的文件都有刷新权限
            "isupload": true, //是否允许上传,文件夹设置了不允许下载的文件夹和文件夹下的所有文件都不允许下载,其他都有权限
            "isview": true, //是否允许视图切换,所有的文件夹都支持
            "isedit": true //是否允许编辑,只有拥有可修改权限的文本文件才能修改
        },
        _permissioninfo = U.MD.DK.C.readWritePermission(fileordirid, diskinfo), //获取权限
        _dirinfo = _permissioninfo[0][_permissioninfo[0].length - 1], //所操作的文件或者是文件夹所操作的目录
        _currentfileordir = _permissioninfo[0][0], //当前操作的文件或者文件夹
        _readwrite = _permissioninfo.splice(1) //得到文件的读写权限和祖先元素
    ;
    //如果是群、最新文档,协同文档,则没有权限操作
    if (!US.userInfo.userid || _currentfileordir.UserDirectoryID == diskinfo.directoryOrFiles[0].UserDirectoryID || _currentfileordir.UserDirectoryID == diskinfo.directoryOrFiles[1].UserDirectoryID || _currentfileordir.UserDirectoryID == diskinfo.directoryOrFiles[2].UserDirectoryID) {
        _permissions = { //所有的权限
            "isopen": false, //是否允许打开, 现在所有的文件都有打开权限
            "isupadte": false, //是否允许修改, 只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "isdelete": false, //是否允许删除, 只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "iscopy": false, //是否允许复制,现在所有的文件都有复制权限
            "isshear": false, //是否允许剪切,只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "isencryption": false, //是否允许加密,展示取消这个功能。
            "isreply": false, //是否允许加密,展示取消这个功能。
            "isdownload": false, //是否允许上传,只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "isnew": false, //是否允许新建, 只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "ispaste": false, //是否允许粘贴,只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "isrefresh": false, //是否允许刷新, 现在所有的文件都有刷新权限
            "isupload": false, //是否允许下载,文件夹设置了不允许下载的文件夹和文件夹下的所有文件都不允许下载,其他都有权限
            "isview": false, //是否允许视图切换,所有的文件夹都支持
            "isedit": false //是否允许编辑,只有拥有可修改权限的文本文件才能修改
        }
    }
    else if (_currentfileordir.UserDirectoryID == _currentfileordir.GroupID) {
        _permissions = { //所有的权限
            "isopen": false, //是否允许打开, 现在所有的文件都有打开权限
            "isupadte": false, //是否允许修改, 只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "isdelete": false, //是否允许删除, 只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "iscopy": false, //是否允许复制,现在所有的文件都有复制权限
            "isshear": false, //是否允许剪切,只有自己的文件,他人添加文件或者文件夹到我的ftp中,或者是我作为群主的群文件
            "isencryption": false, //是否允许加密,展示取消这个功能。
            "isreply": true, //是否允许加密,展示取消这个功能。
            "isdownload": false, //是否允许上传,只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "isnew": true, //是否允许新建, 只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "ispaste": true, //是否允许粘贴,只有自己的文件夹,或者是任何人的ftp文件夹下及下的文件夹,或者是群里
            "isrefresh": true, //是否允许刷新, 现在所有的文件都有刷新权限
            "isupload": true, //是否允许下载,文件夹设置了不允许下载的文件夹和文件夹下的所有文件都不允许下载,其他都有权限
            "isview": true, //是否允许视图切换,所有的文件夹都支持
            "isedit": true //是否允许编辑,只有拥有可修改权限的文本文件才能修改
        }
    }
    else {
        //在我的ftp中,我可以操作所有人的东西,我具备所有的权限
        _isgroup = _dirinfo.GroupID; //是否是群文件
        _isftp = diskinfo.directoryid == US.FTPFOLDERID; //判断是否为ftp目录下的文件
        _isuserdisk = (diskinfo.userInfo.UserId == diskinfo.operator); //是否是属于自己的网盘
        _isgroupmain = U.Json.select(diskinfo.groups, { "UserDirectoryID": _dirinfo.GroupID, "UserId": diskinfo.operator }).length > 0; //判断自己是否是群主
        _ismyself = _currentfileordir.UserId == diskinfo.operator; //判断是否是操作本人的文件,群里的文件非本人创建的或者不是自己的群都不为自己的文件
        //不是自己的文件,同时不是在ftp,或者不是群主的处理
        if (!_ismyself && !_isftp && !_isgroupmain) {
            _permissions.isupadte = false; //不允许修改
            _permissions.isdelete = false; //不允许删除
            _permissions.isshear = false; //不允许剪切
            _permissions.isencryption = false; //不允许加密
            _permissions.ispaste = false; //不允许粘贴
            _permissions.isedit = false; //不允许编辑
            //如果不是ftp连新建的权限也取消
            if (!_isftp) {
                _permissions.isnew = false; //不允许新建
            }
        }
        //1只允许上传
        if (!_ismyself && _readwrite.indexOf("1") > -1) {
            _permissions.isdownload = false; //不允许下载
            _permissions.copy = false; //不允许复制
            _permissions.isshear = false; //不允许剪切
        }
        //2只允许下载
        if (!_ismyself && _readwrite.indexOf("2") > -1) {
            _permissions.isnew = false; //不允许新建
            _permissions.isupload = false; //不允许上传
            _permissions.ispaste = false; //不允许粘贴

        }
        //如果是文件的话就没有视图模式
        if (fileordirid && fileordirid.filetype == 1) {
            _permissions.isview = false;
        }
        else {
            _permissions.isreply = false;
        }
        if (!diskinfo.pasteDirOrFile) {
            _permissions.ispaste = false; //不允许粘贴
        }
    }
    //选择了多目录的处理
    if (diskinfo.selectElement && diskinfo.selectElement.length > 1) {
        _permissions.isopen = false; //取消同时打开的功能
        _permissions.isupadte = false; //取消修改的功能
    }
    diskinfo.permissions = _permissions; //设置权限
    return _permissions;
}

/**
* 弹出选择网盘还是上传
*
* @param  {string} 文件的后缀
* @return  {object} 
*/
U.MD.DK.C.getIcon = function (extendtype) {
    var i,
        _application = US.disk.applicationTypes //获取所有打开应用的信息
    ;
    //循环信息中找到指定的应用的信息
    for (i in _application) {
        //找到后缀名对应的程序信息
        if (_application[i].types.indexOf(extendtype.toLowerCase()) > -1) {
            return _application[i]; //返回应用的信息
        }
    }
    return _application["unknownfile"]; //如果是本站未知的后缀直接归属于文件
}

/**
* 网盘上传的处理 
* @param  {object} 获取服务器返回值
* @param  {string} 上传文件的唯一识别id
*/
U.MD.DK.C.upload = function (diskinfo) {
    //判断该目录是否允许上传的处理
    if (diskinfo.permissions.isupload) {
        var _groupid,
            _ancestors,
            _directoryid = diskinfo.directoryid,
            _dirinfo = U.Json.select(diskinfo.directoryOrFiles, { "UserDirectoryID": _directoryid })[0]
            ;
        //获取粘贴到制定目录的群id
        _ancestors = U.MD.DK.C.getAncestors(_dirinfo, diskinfo); //获取所有的祖先
        //如果是ftp目录,那么groupid就是用户id
        if (_ancestors[_ancestors.length - 1].UserDirectoryID == US.FTPFOLDERID) {
            _groupid = diskinfo.userInfo.UserId;
        }
        //否则就是对应的群id,如果不存在那么就是""
        else {
            _groupid = _ancestors[_ancestors.length - 1].GroupID || "";
        }
        //调用上传处理
        U.MD.UI.upload(
                       "http://main.1473.cn/USUpfile.ashx?typename=UploadFlashfile&DirectoryId=" + _directoryid + "&Encrypt=" + _groupid + "&UserId=" + US.userInfo.userid + "&IsF=true", //上传的地址
        //上传成功的回调函数
                        function (r, fileinfo) {
                            var _data = r.data  //获取服务器返回值
                            ; //根据文件的唯一识别id获取文件的信息
                            //获取从服务器获取的值,这里加一个错误处理,因为如果后台出现了错误,那么eval的过程就会失败
                            try {
                                _data = eval("0," + _data);
                            }
                            catch (e) { }
                            //文件上传成功
                            if (_data) {
                                U.MD.DK.C.success({
                                    "UserFilesServerName": _data[0], //上传成功后存在fs.1473.cn的地址
                                    "UseFilesServerThumbnailName": _data[1], //如果是图片上传,那么这里有缩略图的地址
                                    "UserFilesID": _data[2], //文件在数据的id
                                    "size": _data[3], //文件的大小
                                    "UserDirectoryEncrypt": _data[4], //文件的加密情况,这里和分组id是一样的
                                    "UserDirectoryID": _data[5], //文件归属的目录id
                                    "UserDirectoryName": fileinfo.name
                                }, _dirinfo, diskinfo);
                            }
                        },
        //得到md5的回调函数
                        function (md5, fileinfo, cb) {
                            //根据用户的md5值判断用户是否需要上传,如果需要上传则需要执行上传处理,如果已经存在后台直接给用户生成文件路径等录入数据库
                            U.A.Request(US.DISK, ["IfFileExistInsertDB", US.userInfo.userid, _directoryid, _groupid, fileinfo.size, md5, U.UF.UP.getFileNameAndExtension(fileinfo.name)[1], fileinfo.name],
                            //判断上传文件是否存在
                            function (r) {
                                var _userid = US.userInfo.userid; //当前登录用户的id 
                                r = r.value;
                                //获取服务器返回的值,如果服务器响应出问题了,eval的时候就会报错。
                                try {
                                    r = eval(r)[0];
                                }
                                catch (e) { }
                                //当用户想上传的文件已经在数据库里存在了,那么后台会执行复制数据的操作。
                                if (r) {
                                    U.MD.DK.C.success({
                                        "UserFilesServerName": r.UserFilesServerName, //上传成功后存在fs.1473.cn的地址
                                        "UseFilesServerThumbnailName": r.UserDirectoryUrl, //如果是图片上传,那么这里有缩略图的地址
                                        "UserFilesID": r.UserDirectoryID, //文件在数据的id
                                        "size": r.UserDirectorySize, //文件的大小
                                        "UserDirectoryEncrypt": r.UserDirectoryEncrypt, //文件的加密情况,这里和分组id是一样的
                                        "UserDirectoryID": r.UserDirectoryParentID, //文件归属的目录id
                                        "UserDirectoryName": r.UserDirectoryName
                                    }, _dirinfo, diskinfo);
                                    cb(false);
                                }
                                //否则调用flash里面的函数执行用户的上传操作。
                                else {
                                    cb(true);
                                }
                            });
                        });
    }
}

/**
* 上传成功直接添加 
* @param  {object} 获取服务器返回值
* @param  {string} 上传文件的唯一识别id
*/
U.MD.DK.C.success = function (uploadinfo, dirinfo, diskinfo) {
    var _userinfo = US.userInfo, //上传用户的信息
        _extendtype = U.UF.UP.getFileNameAndExtension(uploadinfo.UserDirectoryName)[1], //上传文件的后缀名
        _img = uploadinfo.UseFilesServerThumbnailName, //上传文件展示到网盘的图片
        _groupid = uploadinfo.GroupID,
    //上传文件成功后,由前端的数据结构生成一个数据实体,实际传参请参考函数里面的数据结构
        _fileinfo = new U.MD.DK.M.entity(
                            uploadinfo.UserFilesID, //上传文件的id
                            uploadinfo.size,  //上传文件的大小
                            uploadinfo.UserDirectoryID,  //上传文件对应的目录id
                            uploadinfo.UserDirectoryName.addEllipsis(20), //上传文件的简写名
                            uploadinfo.UserDirectoryName, //上传文件的名字
                            _extendtype, //上传文件的后缀
                            uploadinfo.UserFilesServerName, //上传文件的服务器地址
                            U.UF.D.toTimeStamp(new Date()), //上传文件成功的时间
                            _img ? _img : U.MD.DK.C.getIcon(_extendtype)[1], //上传文件展示到网盘的图片
                            9999, //上传文件的层次,这里文件是没有层次的,所以以9999区表达
                            null, //文件的修改时间
                            uploadinfo.UserDirectoryEncrypt, //上传文件的加密或者是限制
                            1, //标识该文件在网盘中识别为文件
                            "", //上传文件的描述
                            _groupid, //归属的群id
                            "", //uw office内容
                            _userinfo.UserId, //归属用户的id
                            _userinfo.UserNickName, //归属用户的名字
                            _userinfo.UserName, //归属用户的用户名
                            _userinfo.UserThumbnailImageHead //归属用户的头像
    );
    //如果是上传到网盘的处理
    if (_fileinfo) {
        U.MD.DK.RE.addFileOrFolder([_fileinfo], diskinfo, dirinfo); //添加值
        diskinfo && U.Alert("文件: " + _fileinfo.UserDirectoryName + " 已上传至" + dirinfo.UserallDirectoryName + "目录下");
    }

    return _fileinfo;
}

/**
* 拖动选择多个元素的处理 
* @param  {element} 拖动的区域元素
*/
U.MD.DK.C.selectElement = function (el, diskinfo) {
    var i, classname, hoverclass,
        _viewtype = diskinfo.viewtype || "Normal",
        _child = $(el).Child();
    diskinfo.selectElement = []; //清空所有的选择元素
    //如果是在他人邀请 最新文档 我的协同里 则没有拖选按钮
    if (U.Json.select(diskinfo.directoryOrFiles, { "UserDirectoryID": diskinfo.directoryid })[0].GroupID !== true) {
        //普通视图的处理
        if (_viewtype == "Normal") {
            classname = "U_MD_DK_RZO";
            hoverclass = "U_MD_DK_RZO U_MD_DK_RZOI";

        }
        //详细视图的处理
        else {
            classname = "U_MD_DK_RZS U_MD_DK_RZXO";
            hoverclass = "U_MD_DK_RZS U_MD_DK_RZXO U_MD_DK_RZXOO";
        }
        //如果不是空文件状态下的处理
        if (_child[0].className != "U_MD_DK_RZF") {
            //点击的时候循环清空所有元素选择状态
            for (i = 0; i < _child.length; i++) {
                //如果元素状态是选中状态的处理
                if (_child[i].className == hoverclass) {
                    _child[i].className = classname;
                }
            }
            //拖动选择处理
            U.UF.F.dragSelect(el, function (arr) {
                var i,
                _isclass;
                //循环元素的处理
                for (i = 0; i < _child.length; i++) {
                    _isclass = arr.indexOf(_child[i]);
                    //判断元素是否
                    if (_isclass == -1 && _child[i].className == hoverclass) {
                        _child[i].className = classname;
                    }
                    //判断
                    else if (_isclass > -1) {
                        _child[i].className = hoverclass;
                    }
                }
                diskinfo.selectElement = arr; //得到所有的选择元素
            });
        }
    }
}