Namespace.register("U.MD.DK.M"); //Disk树操作
//disk变量使用区域
//硬盘里面复制粘贴的全局变量。,暂未整理。
//US.disk.DiskDaren = {};

//包含了当前所有用户的硬盘目录文件等数据的信息.
US.disk.Disks = {};
//当前操作用户的网盘数据,相当于US.disk.Disks[userid]。
US.disk.UserDisk = null;

// US.disk.Disks 用户网盘数据前台存储的全局变量 该全局变量为一个数组  
//  US.disk.Disks[userid].directoryOrFiles  0为该userid用户下面的所有网盘目录及文件的数据信息。以数组形式展示  
//  US.disk.Disks[userid].userInfo  用户信息,包含了用户在网盘的信息
//  US.disk.Disks[userid].directoryid 1为当前打开目录的id 
//  US.disk.Disks[userid].currentDirectoryFile 当前打开目录下面所有的文件和文件夹
//  US.disk.Disks[userid].formel   formel为当前网盘用户的弹框,这个是唯一的。
//  US.disk.Disks[userid].operator  使用该用户网盘的用户id,为登录用户的id或者是全0的guid
//例:US.disk.Disks["张三"]; //张三的网盘信息,张三需要用guid表示,US.disk.Disks["95f7bacc-0b3a-4265-a2ea-15e066b97bf7"]
//例:US.disk.Disks["李四"]; //李四的网盘信息,李四需要用guid表示。US.disk.Disks["f6d7a4b6-e34c-4964-beed-24187b2cb1ba"]
//
//disk文件和文件夹实体,US.disk.Disks里面的内容的数据结构。
U.MD.DK.M.entity = function (directoryid, size, parentid, shortname, name, extendtype, serverurl, addtime, iconurl, deep, modifytime, encryt, filetype, descript, groupid, officevalue, userid, usernickname, username, imagehead) {
    this.UserDirectoryID = directoryid;    //文件id或者目录id
    this.UserDirectorySize = size;    //文件大小。
    this.UserDirectoryParentID = parentid;  //父亲id
    this.UserDirectoryName = shortname;   //文件名或者文件夹名,
    this.UserallDirectoryName = name;  //文件名或者文件夹名,会删除不要
    this.UserDirectoryExtendType = extendtype;  //文件扩展名,目录扩展名为folder,加密的目录也有一个标识。
    this.UserFilesServerName = serverurl; //文件服务器链接地址,需要统一加US.FILESYSTEMURL + filesinfo.UserDirectoryUrl   
    this.UserDirectoryAddTime = addtime;  //文件或者文件夹添加时间
    this.UserDirectoryUrl = iconurl; //文件服务器链接地址,缩略图,需要统一加US.FILESYSTEMURL + filesinfo.UserDirectoryUrl   
    this.UserDirectoryDeep = deep; //文件夹深度
    this.UserDirectoryModifyTime = modifytime; //文件或者文件夹修改时间
    this.UserDirectoryEncrypt = encryt;  //文件夹加密
    this.filetype = filetype;  //文件类型,文件夹为1,文件为0
    this.Descript = descript; //文件描述。例如图片,声音,视频的描述
    this.GroupID = groupid;  //群id,用于群文件
    this.UsOffice = officevalue; //文件内容。
    this.UserId = userid; //文件或者文件夹所属用户id
    this.UserNickName = usernickname; //文件或者文件夹所属用户昵称
    this.UserName = username; //文件或者文件夹所属用户账号
    this.UserThumbnailImageHead = imagehead; //文件或者文件夹所属用户头像
    this.Child = null; //文件夹中的子文件夹数组。
    this.Parent = null; //文件或者文件夹的父亲
}

//初始化一级目录的全局变量。即左边树目录结构。
US.disk.initTree = [
        [Guid.newGuid(), 0, US.MYDISK, "最新文档", "最新文档", "folder", null, null, null, 1, null, null, 0, "", true],
        [Guid.newGuid(), 0, US.MYDISK, "我的协同", "我的协同", "folder", null, null, null, 1, null, null, 0, "", true],
        [Guid.newGuid(), 0, US.MYDISK, "他人邀请", "他人邀请", "folder", null, null, null, 1, null, null, 0, "", true],
        [US.MYFOLDERID, 0, US.MYDISK, "电脑", "我的文档", "folder", null, null, null, 1, null, null, 0, ""],
        [US.FTPFOLDERID, 0, US.MYDISK, "ftp", "Ftp文件传输", "folder", null, null, null, 1, null, null, 0, "", ""],
        [US.VIDEOFOLDERID, 0, US.MYDISK, "视频", "在线视频", "folder", null, null, null, 1, null, null, 0, ""],
        [US.IMAGEFOLDERID, 0, US.MYDISK, "相册", "图片、相册", "folder", null, null, null, 1, null, null, 0, ""],
        [US.MUSICEFOLDERID, 0, US.MYDISK, "音乐", "音乐收听", "folder", null, null, null, 1, null, null, 0, ""]
];

//文件类型全局变量。
US.disk.fileType = {
    "image": ["jpg", "gif", "png", "bmp", "jpeg", "JPG", "GIF", "BMP", "PNG", "JPEG"],
    "music": ["mp3"],
    "video": ["wmv", "video", "ogg", "webm", "mp4"],
    "usword": ["uw"],
    "usnav": ["un"],
    "usexcel": ["ue"],
    "text": ["rtf", "mht", "txt", "htm", "html", "wsh", "wsf", "cpp", "c", "css", "txt", "php", "cs", "java", "log", "sql", "jsp"]
}

//全局变量,应用程序类型,包含了应用扩展名,id,中文描述,图标的css名。
US.disk.applicationTypes = {
    "image": {
        //图片类型的后缀
        "types": US.disk.fileType.image,
        //该格式对应在网盘的目录id
        "directoryid": US.IMAGEFOLDERID,
        //格式对应的名字
        "name": "图片",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIT"]
    },
    "music": {
        //音乐类型的后缀
        "types": US.disk.fileType.music,
        //该格式对应在网盘的目录id
        "directoryid": US.MUSICEFOLDERID,
        //格式对应的名字
        "name": "音乐",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIY", "U_MD_DK_RZOY", "U_MD_DK_LCY"]
    },
    "video": {
        //视频类型的后缀
        "types": US.disk.fileType.video,
        //该格式对应在网盘的目录id
        "directoryid": US.VIDEOFOLDERID,
        //格式对应的名字
        "name": "视频",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIS", "U_MD_DK_RZOP", "U_MD_DK_LCP"]
    },
    "uw": {
        //互联办公word文档格式
        "types": US.disk.fileType.usword,
        //该格式对应在网盘的目录id
        "directoryid": US.MYFOLDERID,
        //格式对应的名字
        "name": "文档",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIW", "U_MD_DK_RZOD", "U_MD_DK_LCD"]
    },
    "un": {
        //互联办公word文档格式
        "types": US.disk.fileType.usnav,
        //该格式对应在网盘的目录id
        "directoryid": US.MYFOLDERID,
        //格式对应的名字
        "name": "建站文档",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIW", "U_MD_DK_REODN", "U_MD_DK_LCD"]
    },
    "ue": {
        //互联办公Excel文档格式
        //视频类型的后缀
        "types": US.disk.fileType.usexcel,
        //该格式对应在网盘的目录id
        "directoryid": US.EMPTYGUID,
        //格式对应的名字
        "name": "表格",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIE", "U_MD_DK_RZOE", "U_MD_DK_LCE"]
    },
    "text": {
        //可以通过记事本打开的文件格式
        "types": US.disk.fileType.text,
        //该格式对应在网盘的目录id
        "directoryid": US.EMPTYGUID,
        //格式对应的名字
        "name": "文档",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIT", "U_MD_DK_RZON", "U_MD_DK_LCB"]
    },
    "folder": {
        //文件夹处理,一种是加密文件夹,一种是不加密
        "types": ["folder", "folderencrypt"],
        //该格式对应在网盘的目录id
        "directoryid": US.EMPTYGUID,
        //格式对应的名字
        "name": "文件夹",
        //格式对应的样式
        "classname": ["", "U_MD_DK_RZOW", "U_MD_DK_LCW"]
    },
    "unknownfile": {
        //无法用应用打开的文件类型
        "types": [],
        //该格式对应在网盘的目录id
        "directoryid": US.MYFOLDERID,
        //格式对应的名字
        "name": "文件",
        //格式对应的样式
        "classname": ["U_MD_UI_UP_COIT", "U_MD_DK_RZON", "U_MD_DK_LCB"]
    }
}

/**
*   循环添加文件到全局树里
*   @param  {array} 文件数组
*   @param  {object} 网盘全局信息
*   @param  {object} 添加文件是否具有群id
*/
U.MD.DK.M.entity.add = function (filesinfo, diskinfo, isgroup) {
    var i;
    for (i = 0; i < filesinfo.length; i++) {
        //如果是新建群文件,则通过放在前面,这样的话查询方便
        if (isgroup) {
            diskinfo.directoryOrFiles.splice(7, 0, filesinfo[i]);
        }
        //普通文件添加处理
        else {
            diskinfo.directoryOrFiles.push(filesinfo[i]);
        }

    }
}

/**
*   循环添加文件到全局树里
*   @param  {array} 文件数组
*   @param  {object} 制定的文件夹的信息
*/
U.MD.DK.M.entity.addChild = function (filesinfo, dirinfo) {
    //在指定的目录下的文件添子文件或者文件夹
    if (!dirinfo.Child) { //如果有子目录那么就直接添加
        dirinfo.Child = [];
    }
    //循环文件处理
    for (var i = 0; i < filesinfo.length; i++) {
        dirinfo.Child.push(filesinfo[i]);
        filesinfo[i].Parent = dirinfo;
    }
}

/**
*   循环添加文件到全局树里
*   @param  {array} 文件数组
*   @param  {object} 制定文件夹的信息
*   @param  {object} 添加文件是否具有群id
*/
U.MD.DK.M.entity.del = function (filesinfo, diskinfo) {
    var i,
        j,
        _parent,
    //        _delfilesize = 0, //删除的文件大小
    //        _delfilenum = 0, //删除的文件数量
        _diskfileanddir = diskinfo.directoryOrFiles //网盘
    ;
    //文件信息
    for (i = 0; i < filesinfo.length; i++) {
        //网盘所有的文件信息
        for (j = 0; j < _diskfileanddir.length; j++) {
            //找到指定需要删除的文件
            if (_diskfileanddir[j].UserDirectoryID == filesinfo[i].UserDirectoryID) {
                _diskfileanddir.splice(j, 1); //在disk里面删除文件或者文件夹
                break;
            }
        }

        _parent = filesinfo[i].Parent; //获取移除目录的上级目录
        //循环移除子元素
        for (j = 0; j < _parent.Child.length; j++) {
            //找到指定需要删除的文件
            if (_parent.Child[j].UserDirectoryID == filesinfo[i].UserDirectoryID) {
                _parent.Child.splice(j, 1); //在disk里面删除文件或者文件夹
            }
        }
    }
}

/**
*   递归修改所有的子目录文件的Id
*   @param  {array} 文件数组
*   @param  {object} 修改的属性 例:{groupid:a} //修改所有的群id
*/
U.MD.DK.M.recursionUpdateDirectory = function (filesinfo, attribute) {
    //循环所有的文件修改
    for (i = 0; i < filesinfo.length; i++) {
        //修改文件的属性
        U.UF.C.AddObj(filesinfo[i], attribute);
        //如果文件是文件夹,那么查找自己节点元素,不断的递归修改
        if (!filesinfo[i].fileType && filesinfo[i].Child) {
            //递归修改
            U.MD.DK.M.recursionUpdateDirectory(filesinfo[i].Child, attribute);
        }
    }
}

/**
*   用户操作切换,可以查看多个用户的硬盘,所以需要切换。登录用户和非登录用户有不同权限。
*   @param  {string} 用户id
*   @param  {string} 用户名
*   @return {object} 用户在网盘的全局变量。
*/
U.MD.DK.M.diskOperatingSwitch = function (userid, username) {
    userid = userid || US.userInfo.userid; //如果有用户id,则userid为用户id,否则为登录用户id。
    if (userid) {
        var i, _userinfo, //需要返回的用户网盘信息
            _diskinfo = US.disk.Disks; //_UCE为包含了所有用户硬盘信息的集合。
        if (_diskinfo && !_diskinfo[userid]) { //判断用户的网盘信息是否可以通过userid找到
            for (i in _diskinfo) { //循环网盘信息
                if (_diskinfo[i] && _diskinfo[i][1] && _diskinfo[i][1][0] && _diskinfo[i][1][0].UserName == username) { //这里也会有null情况,因为这个变量的定义在U.A.Request之前,所以可能会存在还没有获取数据就在此进入这个函数的情况
                    userid = _diskinfo[i][1][0].UserId;
                }
            }
        }
        US.disk.UserDisk = _diskinfo[userid]; //设置当前使用的网盘用户的信息为得到的用户id
        return _diskinfo[userid];
    }
}

/**
*   通过用户名搜索用户网盘信息
*   @param  {string} 用户名
*   @return {object} 用户在网盘的全局变量。
*/
U.MD.DK.getUserDiskByName = function (username) {
    var i,
        _userdisk, //获取的用户硬盘信息
        _diskinfo = US.disk.Disks; //存储打开用户的网盘的信息
    for (i in _diskinfo) { //循环获取
        _userdisk = _diskinfo[i][1]; //查看用户网盘信息
        if (_userdisk && _userdisk[0].UserName == username) { //判断网盘信息的用户名是否等于传入的用户名
            return _userdisk[0];
        }
    }
    return {};
}