var ajajUrl="/ajaj.php";
var datagrid;
var fileTableData;
var groupData={};
var tableStore, treeStore, treeModel;
var errorDialog, groupEditDialog, passwordEditDialog, descriptionEditDialog;
var titleEditDialog, ttlEditDialog, newGroupDialog, postCommentDialog;
var fileHash, myplotsw=0;
var statusRequestPeriod=1000;
var statusRequestHandler=null;
var curTime;
var htmlfilename;
function updateUploadStatus(responseObject, func) {
    if (responseObject.state == 'done') {
        UberUpload.stopDataLoop();
        UberUpload.startProgressBar(responseObject.size);
        return false;
    } else if (responseObject.state == 'error') {
        UberUpload.stopDataLoop();
        showError("Ошибка " + responseObject.code);
        return false;
    } else /* if (responseObject.state == 'uploading') */ {
        if (responseObject.size > 0) {
            if (UberUpload.progress_initialized) {
                UberUpload.setProgressStatus(responseObject.uploaded, Math.round(((new Date()).getTime()-curTime)/1000));
            } else {
                UberUpload.progress_initialized = true;
                UberUpload.startProgressBar(responseObject.size);
            }
        }
        return true;
    }
}
function startTheUpload() {
    var filename=trimFileName(document.getElementById('uploadfile').value);
    if (!filename) {
        alert('Вы не выбрали файл для загрузки - это можно сделать нажав кнопку "Обзор".');
        return false;
    }
    var group=document.getElementById('upload-dir');
    if (group != undefined && group.value.length) {
        group = group.value;
    } else {
        group = '';
    }
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "getUpload",
            ghash: group
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                var uid='';
                for(i=0; i<16; ++i){
                    uid+=Math.floor(Math.random()*10);
                }
                var ttl=dijit.byId("ttlSlider").attr("value");
                if (ttl==3) ttl=5;
                else if (ttl==4) ttl=10;
                else if (ttl==5) ttl=20;
                else if (ttl==6) ttl=30;
                var upload={
                    uinfo: responseObject.uinfo,
                    "X-Progress-ID": uid,
                    ttl: ttl
                };
                if (group != '') {
                    upload.group = group;
                }
                var query = "";
                for(key in upload) {
                    if (query!="") query += "&";
                    query += key + "=" + encodeURIComponent(upload[key]);
                }
                document.getElementById('load_filename').innerHTML=htmlfilename=htmlspecialchars(filename);
                document.getElementById('upload_form').style.display='none';
                document.getElementById('progress_bar').style.display='';
                var form = document.getElementById('uu_upload');
                form.setAttribute('action', responseObject.uploadUrl + "?" + query);
                form.submit();
                curTime=(new Date()).getTime();
                var func = function() {
                    dojo.xhrGet({
                        url : responseObject.progressUrl + "?X-Progress-ID=" + encodeURIComponent(uid) + "&" + (new Date()).getTime(),
                        handleAs : "json",
                        headers : {
                            "X-Progress-ID": uid
                        },
                        load: function(responseObject, ioArgs) {
                            if (updateUploadStatus(responseObject, func)) {
                                statusRequestHandler=setTimeout(func, statusRequestPeriod);
                            }
                        },
                        error: function(responseObject) {
                            showError('Ошибка XHR1 '+responseObject);
                            statusRequestHandler=setTimeout(func, statusRequestPeriod);
                            return responseObject;
                        }
                    });
                };
                statusRequestHandler=setTimeout(func, statusRequestPeriod);
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR2 '+responseObject);
            return responseObject;
        }
    });
    return false;
}
function get_file_name() {
    var val = document.getElementById('upfile_0').value;
    if (val) {
        document.getElementById('uploadfile').value = trimFileName(val);
        document.getElementById("upload_button").style.display = '';
    } else {
        document.getElementById('uploadfile').value = '';
        document.getElementById("upload_button").style.display = 'none';
    }
}
function trimFileName(fileName) {
    var index_of_last_slash = fileName.lastIndexOf("\\");

    if(index_of_last_slash < 1){
        index_of_last_slash = fileName.lastIndexOf("/");
    }

    return fileName.slice(index_of_last_slash + 1, fileName.length);
}
function groupEditDialogCheckData() {
    return groupEditDialog.attr('value').group_title!='';
}
function titleEditDialogCheckData() {
    return titleEditDialog.attr('value').file_title!='';
}
function groupEditDialogExecute(values) {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "editGroup",
            ghash : ghash,
            title: values.group1_title,
            description: values.group1_description,
            password: values.group1_password
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                treeStore.fetchItemByIdentity({
                    identity: ghash,
                    onItem: function(groupItem) {
                        dojo.query("#new_group > option[value='"+ghash+"']").empty().addContent(htmlspecialchars(values.group1_title));
                        treeStore.setValue(groupItem, "title", values.group1_title);
                        treeStore.setValue(groupItem, "haspassword", values.group1_password!='');
                        treeStore.setValue(groupItem, "description", values.group1_description);
                        updateGroupTitle2(values.group1_title, values.group1_description, values.group1_password!='');
                    }
                });
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function passwordEditDialogExecute(values) {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "setPasswordForFile",
            hash : fileHash,
            password: values.file_password
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                top.location="/my/"+ghash;
            //                treeStore.fetchItemByIdentity({
            //                    identity: fileHash,
            //                    onItem: function(item) {
            //                        treeStore.setValue(item, "haspassword", false);
            //                    }
            //                });
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function descriptionEditDialogExecute(values) {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "setDescriptionForFile",
            hash : fileHash,
            description: values.file_description
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                top.location="/my/"+ghash;
            //                treeStore.fetchItemByIdentity({
            //                    identity: fileHash,
            //                    onItem: function(fileItem) {
            //                        console.log(fileItem);
            //                        treeStore.setValue(fileItem, "description", values.file_description);
            //                    }
            //                });
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function ttlEditDialogExecute(values) {
    var v=dijit.byId("ttlSlider").attr("value");
    if (v==3) v=5;
    else if (v==4) v=10;
    else if (v==5) v=20;
    else if (v==6) v=30;
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "setTTLForFile",
            hash : fileHash,
            ttl: v
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                top.location="/my/"+ghash;
            //                treeStore.fetchItemByIdentity({
            //                    identity: fileHash,
            //                    onItem: function(fileItem) {
            //                        console.log(fileItem);
            //                        treeStore.setValue(fileItem, "description", values.file_description);
            //                    }
            //                });
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function titleEditDialogExecute(values) {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "renameFile",
            hash : fileHash,
            title: values.file_title
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                top.location="/my/"+ghash;
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function postCommentDialogExecute() {
    var msg=postCommentDialog.attr('value').service_comment;
    if (msg=='') {
        return;
    }
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "postComment",
            comment : msg
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
    return;
}
function showPostComment() {
    //delete group dialog
    if (postCommentDialog==undefined){
        postCommentDialog=new dijit.Dialog({
            title: "Обратная связь",
            draggable: false,
            execute: postCommentDialogExecute,
            content:
            '<table>'+
        '<tr><td><label for="service_comment">Ваш комментарий:</label></td><td><textarea id="service_comment" name="service_comment" dojoType="dijit.form.Textarea" style="width:500px;"></textarea></td></tr>'+
        '<tr><td colspan="2" align="center"><button dojoType="dijit.form.Button" type="submit">Отправить</button></td></tr></table>'
        });
        dojo.body().appendChild(postCommentDialog.domNode);
        postCommentDialog.startup();
    }
    dijit.byId("service_comment").attr("value","");
    postCommentDialog.show();
    return false;
}
function deleteGroup(deleteFiles) {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "deleteGroup",
            ghash : ghash,
            deleteFiles: deleteFiles ? 1 : 0
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                top.location="/my/"+ghash;
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
    return true;
}
function deleteGroupConfirm() {
    if (groupData[ghash]) {
        treeStore.fetchItemByIdentity({
            identity: ghash,
            onItem: function(groupItem) {
                //delete group dialog
                if (deleteGroupDialog==undefined){
                    deleteGroupDialog=new dijit.Dialog({
                        title: "Удаление папки",
                        draggable: false,
                        content:
                        '<table>'+
                    '<tr><td>Удалить папку &laquo;<span id="del_group_title"></span>&raquo; и ее содержимое или удалить только папку?</td></tr>' +
                    '<tr><td align="center"><button dojoType="dijit.form.Button" type="submit" onClick="return deleteGroup(true);">Папку и содержимое</button><button dojoType="dijit.form.Button" type="submit" onClick="return deleteGroup(false);">Только папку</button></td></tr></table>'
                    });
                    dojo.body().appendChild(deleteGroupDialog.domNode);
                    deleteGroupDialog.startup();
                }
                dojo.byId("del_group_title").innerHTML=htmlspecialchars(treeStore.getValue(groupItem, "title"));
                deleteGroupDialog.show();
            }
        });
    } else if (window.confirm("Вы действительно хотите удалить эту папку?")) {
        deleteGroup(false);
    }
    return false;
}
function selectAll(newValue) {
    tableStore.fetch({
        query: datagrid.query,
        newValue: newValue,
        onComplete: function(items, request) {
            for (var i = 0; i < items.length; i++) {
                tableStore.setValue(items[i], "selected", request.newValue);
            }
        }
    });
}
function showGroupEdit() {
    treeStore.fetchItemByIdentity({
        identity: ghash,
        onItem: function(groupItem) {
            //group edit dialog
            if (groupEditDialog==undefined) {
                groupEditDialog=new dijit.Dialog({
                    title: "Редактирование папки",
                    draggable: false,
                    execute: groupEditDialogExecute,
                    content:
                    '<table><tr><td><label for="name">Название:</label></td><td><input dojoType="dijit.form.TextBox" type="text" name="group1_title" id="group1_title" style="width: 500px;"></td></tr>'+
                '<tr><td><label for="group_description">Описание:</label></td><td><textarea id="group1_description" name="group1_description" dojoType="dijit.form.Textarea" style="width:500px;"></textarea></td></tr>'+
                '<tr><td><label for="group_password">Пароль:</label></td><td><input dojoType="dijit.form.TextBox" type="password" name="group1_password" id="group1_password" style="width: 500px;"></td></tr>'+
                '<tr><td colspan="2" align="center"><button dojoType="dijit.form.Button" type="submit" onClick="return groupEditDialogCheckData();">OK</button></td></tr></table>'
                });
                dojo.body().appendChild(groupEditDialog.domNode);
                groupEditDialog.startup();
            }
            dijit.byId("group1_title").attr("value", treeStore.getValue(groupItem, "title"));
            dijit.byId("group1_password").attr("value", treeStore.getValue(groupItem, "haspassword") ? "********" : "");
            dijit.byId("group1_description").attr("value", treeStore.getValue(groupItem, "description"));
            groupEditDialog.show();
        }
    });
    return false;
}
function showError(message) {
    if (errorDialog==undefined) {
        //error dialog
        errorDialog=new dijit.Dialog({
            title: "Ошибка",
            draggable: false,
            content: "<table><tr><td><div id='error-message'></div></td></tr><tr><td colspan='2' align='center'><button dojoType='dijit.form.Button' type='submit'>Ok</button></td></tr></table></div>"
        });
        dojo.body().appendChild(errorDialog.domNode);
        errorDialog.startup();
    }
    dojo.byId("error-message").innerHTML = message;
    errorDialog.show();
}
function showTitleEdit() {
    treeStore.fetchItemByIdentity({
        identity: fileHash,
        onItem: function(item) {
            if (titleEditDialog==undefined) {
                //title edit dialog
                titleEditDialog=new dijit.Dialog({
                    title: "Изменение имени",
                    draggable: false,
                    execute: titleEditDialogExecute,
                    content:
                    '<table>'+
                '<tr><td><label for="file_title">Имя файла:</label></td><td><input dojoType="dijit.form.TextBox" type="text" name="file_title" id="file_title"></td></tr>'+
                '<tr><td colspan="2" align="center"><button dojoType="dijit.form.Button" type="submit" onClick="return titleEditDialogCheckData();">OK</button></td></tr></table>'
                });
                dojo.body().appendChild(titleEditDialog.domNode);
                titleEditDialog.startup();
            }
            dijit.byId("file_title").attr("value",treeStore.getValue(item, "title"));
            titleEditDialog.show();
        }
    });
    return false;
}
function showPasswordEdit() {
    treeStore.fetchItemByIdentity({
        identity: fileHash,
        onItem: function(item) {
            //password edit dialog
            if (passwordEditDialog==undefined) {
                passwordEditDialog=new dijit.Dialog({
                    title: "Изменение пароля",
                    draggable: false,
                    execute: passwordEditDialogExecute,
                    content:
                    '<table>'+
                '<tr><td><label for="file_password">Пароль:</label></td><td><input dojoType="dijit.form.TextBox" type="password" name="file_password" id="file_password"></td></tr>'+
                '<tr><td colspan="2" align="center"><button dojoType="dijit.form.Button" type="submit">OK</button></td></tr></table>'
                });
                dojo.body().appendChild(passwordEditDialog.domNode);
                passwordEditDialog.startup();
            }
            dijit.byId("file_password").attr("value",treeStore.getValue(item, "haspassword") ? "********" : "");
            passwordEditDialog.show();
        }
    });
    return false;
}
function showDescriptionEdit() {
    treeStore.fetchItemByIdentity({
        identity: fileHash,
        onItem: function(item) {
            //description edit dialog
            if (descriptionEditDialog==undefined) {
                descriptionEditDialog=new dijit.Dialog({
                    title: "Изменение описания",
                    draggable: false,
                    execute: descriptionEditDialogExecute,
                    content:
                    '<table>'+
                '<tr><td><label for="file_description">Описание:</label></td><td><textarea id="file_description" name="file_description" dojoType="dijit.form.Textarea" style="width:500px;"></textarea></td></tr>'+
                '<tr><td colspan="2" align="center"><button dojoType="dijit.form.Button" type="submit">OK</button></td></tr></table>'
                });
                dojo.body().appendChild(descriptionEditDialog.domNode);
                descriptionEditDialog.startup();
            }
            dijit.byId("file_description").attr("value", treeStore.getValue(item, "description"));
            descriptionEditDialog.show();
        }
    });
    return false;
}
function showTTLEdit() {
    treeStore.fetchItemByIdentity({
        identity: fileHash,
        onItem: function(item) {
            //ttl edit dialog
            if (ttlEditDialog==undefined) {
                ttlEditDialog=new dijit.Dialog({
                    title: "Изменение времени жизни",
                    draggable: false,
                    execute: ttlEditDialogExecute,
                    content:
                    '<table>'+
                '<tr><td>Через сколько дней после последнего скачивания файл будет удален:</td></tr>'+
                '<tr><td>'+
                '<div id="ttlSlider" dojoType="dijit.form.HorizontalSlider" value="6" minimum="1" maximum="6" discreteValues="6" showButtons="false" style="width:400px; margin: 0 auto;">'+
                '  <ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.5em;font-size:75%;color:gray;">'+
                '    <li>1</li><li>2</li><li>5</li><li>10</li><li>20</li><li>30</li>'+
                '  </ol>'+
                '  <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="6" style="height:5px;"></div>'+
                '</div>'+
                '</td></tr>' +
                '<tr><td style="text-align: center;"><button dojoType="dijit.form.Button" type="submit">OK</button></td></tr></table>'
                });
                dojo.body().appendChild(ttlEditDialog.domNode);
                ttlEditDialog.startup();
            }
            var v=treeStore.getValue(item, "dttl");
            if (v==5) v=3;
            else if (v==10) v=4;
            else if (v==20) v=5;
            else if (v==30) v=6;
            dijit.byId("ttlSlider").attr("value",v);
            ttlEditDialog.show();
        }
    });
    return false;
}
function checkNewGroup() {
    return newGroupDialog.attr('value').group_new!='';
}
function initNewGroupDialog(execute) {
    if (newGroupDialog==undefined) {
        newGroupDialog=new dijit.Dialog({
            title: "Новая папка",
            draggable: false,
            execute: execute,
            content:
            '<table><tr><td><label for="new_group_title">Название:</label></td><td><input dojoType="dijit.form.TextBox" type="text" name="new_group_title" id="new_group_title" style="width: 500px;"></td></tr>'+
        '<tr><td><label for="new_group_description">Описание:</label></td><td><textarea id="new_group_description" name="new_group_description" dojoType="dijit.form.Textarea" style="width: 500px;"></textarea></td></tr>'+
        '<tr><td><label for="new_group_password">Пароль:</label></td><td><input dojoType="dijit.form.TextBox" type="password" name="new_group_password" id="new_group_password" style="width: 500px;"></td></tr>'+
        '<tr><td colspan="2" align="center"><button dojoType="dijit.form.Button" type="submit" onClick="return checkNewGroup();">OK</button></td></tr></table>'
        });
        dojo.body().appendChild(newGroupDialog.domNode);
        newGroupDialog.startup();
    //dijit.byId("new_group_description").attr("style","width:500px;");
    }
}
function showNewGroup() {
    initNewGroupDialog(newGroupExecute);
    dijit.byId("new_group_title").attr("value", "Новая папка");
    dijit.byId("new_group_description").attr("value", "");
    dijit.byId("new_group_password").attr("value", "");
    newGroupDialog.show();
    return false;
}
function showNewUploadGroup() {
    initNewGroupDialog(newUploadGroupExecute);
    dijit.byId("new_group_title").attr("value", "Новая папка");
    dijit.byId("new_group_description").attr("value", "");
    dijit.byId("new_group_password").attr("value", "");
    newGroupDialog.show();
    return false;
}
function newUploadGroupExecute() {
    var v=newGroupDialog.attr('value');
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "createNewGroup",
            title : v.new_group_title,
            password : v.new_group_password,
            description : v.new_group_description
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                var newGroup=document.createElement("option");
                newGroup.value=responseObject.ghash;
                newGroup.appendChild(document.createTextNode(v.new_group_title));
                document.getElementById("upload-dir").appendChild(newGroup);
                newGroup.selected="selected";
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function newGroupExecute() {
    var v=newGroupDialog.attr('value');
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "createNewGroup",
            title : v.new_group_title,
            password : v.new_group_password,
            description : v.new_group_description
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                top.location="/my/"+responseObject.ghash;
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function fileClicked(hash) {
    treeStore.fetchItemByIdentity({
        identity: hash,
        onItem: function(item) {
            fileHash=hash;
            showFileInfoPage(item);
        }
    });
    return false;
}
function titleGetter(index, item) {
    if (item!=null) {
        //        if (this.grid.edit.isEditCell(index, 1)) {
        //            return htmlspecialchars(item.title);
        //        } else {
        title=htmlspecialchars(item.title);
        return '<a title="'+title+'" href="/'+item.hash+'" onClick="return fileClicked(\''+item.hash+'\');">'+title+"</a>";
    //        }
    }
}
function rep(n) {
    var str = "";
    for(var x=0;x<n;x++) 
        str += "0";

    return str;
}
function dateFormatter(inDate) {
    var d=new Date(inDate * 1000);
    var h=d.getHours().toString();
    var m=d.getMinutes().toString();
    var mnt=(d.getMonth()+1).toString();

    return d.getDate().toString()+"/"+
    rep(2-mnt.length)+mnt+"/"+
    d.getFullYear().toString().substr(2)+" "+
    rep(2-h.length)+h+":"+
    rep(2-m.length)+m; //.format("d/mm/yy HH:MM");
}
function sizeFormatter(bytes) {
    if (bytes > 1073741824)
    {
        var b=bytes/1073741824;
        var t=' ГБ';
    }
    else if (bytes > 1048576)
    {
        var b=bytes/1048576;
        var t=' МБ';
    }
    else if (bytes > 1024)
    {
        var b=bytes/1024;
        var t=' КБ';
    }
    else
    {
        var b=bytes;
        var t=' байт';
    }
    return '<span title="'+bytes+' байт">'+(b==bytes ? bytes :  b.toFixed(1)) + t +"</span>";
}
function groupFormatter(group) {
    return '<a href="/my/'+group+'">'+htmlspecialchars(treeStore._itemsByIdentity[group].title)+'</a>';
}
function loadTree() {
    treeStore=new dojo.data.ItemFileWriteStore({
        //        typeMap: {
        //            serialize: function (object){
        //                return object;
        //            }
        //        },
        data: fileTreeData
    });
    treeModel=new dijit.tree.ForestStoreModel({
        store: treeStore,
        query: {
            type:"group"
        },
        rootId: "treeRoot", 
        rootLabel:"Папки", 
        childrenAttrs: ["children"]
    });
    new dijit.Tree({
        showRoot: false,
        model: treeModel,
        //labelAttr: "title",
        getIconClass: function (item, opened){
            if(item.type == "group") {
                if (item.hash=='expire') {
                    return groupData['expire'] ? "dijitBinFull" : "dijitBinEmpty";
                } else if (item.hash=='all') {
                    return "dijitFolderAll";
                } else if (item.hash=='nogroup') {
                    return groupData['nogroup'] ? (opened ? "dijitNoFolderOpened" : "dijitNoFolderClosed") : "dijitNoFolderEmpty";
                } else {
                    return groupData[item.hash] ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitFolderEmpty";
                }
            } else {
                return "dijitLeaf";
            }
        },
        getLabel: function (item) {
            if (item.id == "treeRoot") {
                return "Папки";
            }
            var title=treeStore.getValue(item, "title");
            if (treeStore.getValue(item,"type")=="group") {
                var c=groupData[treeStore.getValue(item, "hash")];
                return c ? title + ": " + c.toString() : title ;
            } else {
                return title;
            }
        },
        //        onOpen: function (item, node){
        //            resizeWidth(true);
        //        },
        //        onClose: function (item, node){
        //            resizeWidth(true);
        //        },
        onClick: function (item){
            if(item) {
                if (treeStore.getValue(item, "type")=="group") {
                    if (isMy) {
                        var newghash=treeStore.getValue(item, "hash");
                        if (typeof fileHash!="undefined" || newghash!=ghash) {
                            fileHash=undefined;
                            ghash=newghash;
                            loadTable();
                        }
                    } else {
                        top.location="/my/"+treeStore.getValue(item, "hash");
                    }
                } else {
                    if (isMy) {
                        var newFileHash=treeStore.getValue(item, "hash");
                        if (newFileHash!=fileHash) {
                            fileHash=newFileHash;
                            showFileInfoPage(item);
                        }
                    } else {
                        top.location="/my/"+treeStore.getValue(item, "ghash");
                    }
                }
            }
        }
    }, "newtree");
//resizeContentPaneHeight();
}
function addFileToGroup(fileghash) {
    if (typeof groupData[fileghash]== "undefined") {
        //this is undefined group
        groupData[fileghash]= 1;
    } else {
        groupData[fileghash]+=1;
    }
}
function updateGroupTitle2(title, description, haspassword) {
    var elem=document.getElementById("groupCaption");
    if (ghash=='nogroup' || ghash=='all' || ghash=='expire') {
        elem.innerHTML=htmlspecialchars(title);
    } else {
        elem.innerHTML='<a href="/'+ghash+'" title="'+htmlspecialchars(description)+'">'+htmlspecialchars(title)+'</a><a title="Редактировать папку" href="#" onclick="return showGroupEdit();" style="margin-left: 10px;"><i class="editIcon"></i></a><a title="Удалить папку" href="#" onClick="return deleteGroupConfirm();" style="margin-left: 20px;"><i class="deleteIcon"></i></a>';
    }
    elem.style.display='';
}
function updateGroupTitle() {
    treeStore.fetchItemByIdentity({
        identity: ghash,
        onItem: function(groupItem) {
            updateGroupTitle2(treeStore.getValue(groupItem, "title"), treeStore.getValue(groupItem, "description"), null);
        }
    });
}
function showDeleteFile() {
    if (window.confirm("Вы действительно хотите удалить этот файл?")) {
        dojo.xhrPost({
            url : ajajUrl,
            handleAs : "json",
            content : {
                func : "deleteFiles",
                files : fileHash
            },
            load: function(responseObject, ioArgs) {
                if (responseObject.error) {
                    showError(responseObject.errorText);
                } else {
                    top.location="/my/"+ghash;
                }
                return responseObject;
            },
            error: function(responseObject) {
                showError('Ошибка XHR');
                return responseObject;
            }
        });
    }
    return false;
}
function showFileInfoPage(item) {
    var title=htmlspecialchars(treeStore.getValue(item,"title"));
    dojo.query("#file").empty().addContent(title).attr("href", "/"+fileHash);
    dojo.query("#linkfilename").empty().addContent(title);

    dojo.query("#fileurl").empty().addContent("http://rapid.ufanet.ru/"+fileHash).attr("href", "/"+fileHash);
    dojo.query(".linkfilehash").empty().addContent(fileHash);
    var pass=treeStore.getValue(item, "haspassword");
    dojo.query("#passset").empty().addContent(pass ? "установлен" : "не установлен");
    dojo.query("#editpass").empty().addContent(pass ? "(изменить)" : "(установить)");
    dojo.query("#desc > p").empty().addContent(htmlspecialchars(treeStore.getValue(item, "description")));
    dojo.query("#editexp").empty().addContent(treeStore.getValue(item, "daystodel").toString());
    dojo.query("#md5md5").empty().addContent(treeStore.getValue(item, "md5"));

    document.getElementById("groupCaption").style.display='none';
    document.getElementById("emptyGroupDiv").style.display='none';
    document.getElementById("expireGroupDiv").style.display='none';
    document.getElementById("centerContent").style.display='none';
    document.getElementById("filelist").style.display='none';
    document.getElementById("fileEdit").style.display='';
}
function initGroupData() {
    var i=fileTreeData.items;
    fileTableData=[];
    for(var item in i) {
        var itemval=i[item];
        if (itemval.type=='file') {
            addFileToGroup(itemval.ghash);
            var newitem={};
            for(var prop in itemval) {
                newitem[prop]=itemval[prop];
            }
            if (newitem.expire=itemval.daystodel<3) {
                addFileToGroup("expire");
            }
            fileTableData.push(newitem);
        } else if (typeof groupData[itemval.hash]=="undefined") {
            //this is undefined group
            groupData[itemval.hash]=0;
        }
    }
    groupData['all']=fileTableData.length;
}
function loadTable() {
    //0`origname`, 1`description`, 2`hash`, 3`size`, 4`haspassword`, 5`downloads`, 6`downloaded`, 7`uploaddate`, 8`lastquery`,
    //9 daystodel, 10 selection
    var i=fileTreeData.items;
    updateGroupTitle();
    document.getElementById("fileEdit").style.display='none';
    var gridContainer = document.getElementById("centerContent");
    if (!groupData[ghash]) {
        document.getElementById("loadGroup").href=(ghash=='nogroup' || ghash=='all') ? '/' : '/?group='+encodeURIComponent(ghash);
        document.getElementById("emptyGroupDiv").style.display=ghash=='expire' ? 'none' : '';
        document.getElementById("expireGroupDiv").style.display=ghash=='expire' ? '' : 'none';
        gridContainer.style.display='none';
        document.getElementById("filelist").style.display='none';
        //        resizeContentPaneHeight();
        return;
    }
    document.getElementById("emptyGroupDiv").style.display='none';
    document.getElementById("expireGroupDiv").style.display='none';
    document.getElementById("filelist").style.display = '';
    document.getElementById("moveGroupImg").style.display = ghash == 'expire' ? 'none' : '';
    document.getElementById("new_group").style.display = ghash == 'expire' ? 'none' : '';
    document.getElementById("actionmove").style.display = ghash == 'expire' ? 'none' : '';

    var q = ghash == 'all' ? {} : (ghash=="expire" ? {
        expire:true
    } : {
        ghash: ghash
    });
    q.type = "file";
    displayGroupColumn = ghash == 'expire';
    if (typeof datagrid != "undefined") {
        datagrid.layout.setColumnVisibility(3, displayGroupColumn);
        datagrid.layout.setColumnVisibility(4, !displayGroupColumn);
        datagrid.layout.setColumnVisibility(7, !displayGroupColumn);
        gridContainer.style.display='';
        datagrid.setQuery(q);
        //        resizeContentPaneHeight();
        return;
    }
    for (var ar=0; ar<fileTableData.length;++ar) {
        fileTableData[ar].selected=false;
    }
    tableStore=new dojo.data.ItemFileWriteStore({
        data: {
            //identifier: "hash",
            items: fileTableData
        }
    });
    datagrid = new dojox.grid.DataGrid({
        structure: [{
            name: " ",
            field: "selected",
            width: "15pt",
            styles: "text-align: center;",
            editable: true,
            type: dojox.grid.cells.Bool
        }, {
            name: "Имя",
            field: "title",
            width: "auto",
            //editable: false,
            get: titleGetter
        }, {
            name: "Размер",
            field: "size",
            width: "55pt",
            styles: "white-space: nowrap; text-align: right;",
            formatter: sizeFormatter
        }, {
            name: "Папка",
            field: "ghash",
            width: "70pt",
            styles: "white-space: nowrap; text-align: center;",
            formatter: groupFormatter
        }, {
            name: "Загружен",
            field: "uploaddate",
            width: "70pt",
            styles: "white-space: nowrap; text-align: center;",
            formatter: dateFormatter
        }, {
            name: "Последнее обращение",
            field: "lastquery",
            width: "105pt",
            styles: "white-space: nowrap; text-align: center;",
            formatter: dateFormatter
        }, {
            name: "До удаления",
            field: "daystodel",
            width: "60pt",
            styles: "white-space: nowrap; text-align: center;"
        //            ,            formatter: daysFormatter
        }, {
            name: "Скачан, раз",
            field: "downloads",
            width: "57pt",
            styles: "text-align: right;"
        }],
        store: tableStore,
        query: q,
        autoHeight: true,
        selectionMode: "none"
    },
    gridContainer
    );
    datagrid.startup();
    //datagrid.setSortIndex(ghash=='expire' ? 1 : 4, ghash=='expire');
    datagrid.setSortIndex(4, false); 
    datagrid.layout.setColumnVisibility(3, displayGroupColumn);
    datagrid.layout.setColumnVisibility(4, !displayGroupColumn);
    datagrid.layout.setColumnVisibility(7, !displayGroupColumn);

    //    datagrid.doApplyCellEditOLD=datagrid.doApplyCellEdit;
    //    datagrid.doApplyCellEdit=function(inValue, inRowIndex, inAttrName){
    //        if (inAttrName=="title"){
    //            if (inValue=='') {
    //                inValue="(без имени)";
    //            }
    //            var item=this.getItem(inRowIndex);
    //            var h=this.store.getValue(item,"hash");
    //            treeStore.fetchItemByIdentity({
    //                identity: h,
    //                onItem: function(treeItem) {
    //                    setTimeout(function(){
    //                        treeStore.setValue(treeItem, "title", inValue);
    //                    },0);
    //                }
    //            });
    //            dojo.xhrPost({
    //                url : ajajUrl,
    //                handleAs : "json",
    //                content : {
    //                    func : "renameFile",
    //                    hash : h,
    //                    title: inValue
    //                },
    //                load: function(responseObject, ioArgs) {
    //                    if (responseObject.error) {
    //                        showError(responseObject.errorText);
    //                    }
    //                    return responseObject;
    //                },
    //                error: function(responseObject) {
    //                    showError('Ошибка XHR');
    //                    return responseObject;
    //                }
    //            });
    //        }
    //        this.doApplyCellEditOLD(inValue, inRowIndex, inAttrName);
    //    };

    gridContainer.style.display='';

    dojo.connect(window, "onresize", function(){
        var mp=dojo.byId("myplot").scrollWidth;
        if (mp!=myplotsw) {
            myplotsw=mp;
            datagrid.resize();
        }
    });
//    resizeContentPaneHeight();
}
//function resizeWidth(resizeNow){
//    if (datagrid) {
//        if (resizeNow) {
//            datagrid.resize();
//        } else {
//            setTimeout(function(){
//                datagrid.resize();
//            },0);
//        }
//    }
//}
//events//
function processFilesAction() {
    var action=document.getElementById('action').value;
    tableStore.fetch({
        query: datagrid.query,
        onComplete: action=="move" ? moveCallback : deleteCallback
    });
}
function htmlspecialchars (string) {
    return string.toString().split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;').split("'").join('&#039;').split('"').join('&#034;');
}
function moveCallback(items, request) {
    var files="";
    var flag=true;
    var new_group=document.getElementById("new_group").value;
    var new_ghash=new_group=="" ? "nogroup" : new_group;
    for (var i=0;i< items.length;++i) {
        var item=items[i];
        if (tableStore.getValue(item, "selected")) {
            //tableStore.setValue(item, "selected", false);
            var item_ghash=tableStore.getValue(item, "ghash");
            if (item_ghash==new_ghash) {
                flag=false;
                continue;
            }
            if (files!="") files+=",";
            var item_hash=tableStore.getValue(item, "hash");
            files+=item_hash;
        //            tableStore.setValue(item, "ghash", new_ghash);
        //            groupData[item_ghash]-=1;
        //            groupData[new_ghash]+=1;
        //            treeStore.fetchItemByIdentity({
        //                identity: item_hash,
        //                onItem: function(treeItem) {
        //                    treeStore.fetchItemByIdentity({
        //                        identity: item_ghash,
        //                        onItem: function(oldParentItem) {
        //                            treeStore.fetchItemByIdentity({
        //                                identity: new_ghash,
        //                                onItem: function(newParentItem) {
        //                                    treeModel.pasteItem(treeItem, oldParentItem, newParentItem, false);
        //                                }
        //                            });
        //                        }
        //                    });
        //                }
        //            });
        }
    }
    if (files=="") {
        if (flag) { 
            alert("Отметьте галочками файлы которые хотите переместить.");
        }
        return;
    }
    //    tableStore.save({});
    //    loadTable();
    //    datagrid.update();
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "moveFilesToGroup",
            files : files,
            ghash : new_group
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            }
            top.location="/my/"+ghash;
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function deleteCallback(items, request) {
    var files="";
    for (var i=0; i < items.length; ++i) {
        var item=items[i];
        if (tableStore.getValue(item, "selected")) {
            if (files!="") files+=",";
            files+=item.hash;
        //            groupData[ghash]-=1;
        //            tableStore.deleteItem(item);
        //            treeStore.fetchItemByIdentity({
        //                identity: item.hash[0],
        //                onItem: function(treeItem) {
        //                    //delete from actual parent
        //                    treeStore.fetchItemByIdentity({
        //                        identity: item.ghash[0],
        //                        onItem: function(oldParentItem) {
        //                            treeModel.pasteItem(treeItem, oldParentItem, null, false);
        //                        }
        //                    });
        //                    //delete from all
        //                    treeStore.fetchItemByIdentity({
        //                        identity: "all",
        //                        onItem: function(oldParentItem) {
        //                            treeModel.pasteItem(treeItem, oldParentItem, null, false);
        //                        }
        //                    });
        //                    //delete from expired
        //                    treeStore.fetchItemByIdentity({
        //                        identity: "expire",
        //                        onItem: function(oldParentItem) {
        //                            if (oldParentItem) {
        //                                treeModel.pasteItem(treeItem, oldParentItem, null, false);
        //                            }
        //                        }
        //                    });
        //                }
        //            });
        }
    }
    if (files=="") {
        alert("Отметьте галочками файлы которые хотите удалить.");
        return;
    }
    //    tableStore.save({});
    //    loadTable();
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "deleteFiles",
            files : files
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            }
            top.location="/my/"+ghash;
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
function listLoadTable() {
    var gridContainer = document.getElementById("centerContent");
    tableStore=new dojo.data.ItemFileReadStore({
        data: listTableData
    });
    datagrid = new dojox.grid.DataGrid({
        structure: [{
            name: "Имя",
            field: "title",
            width: "auto",
            //editable: false,
            get: function(index, item) {
                if (item!=null) {
                    var title=htmlspecialchars(item.title);
                    return '<a title="'+title+'" href="/'+item.hash+'">'+title+"</a>";
                }
            }
        }, {
            name: "Размер",
            field: "size",
            width: "80pt",
            styles: "white-space: nowrap; text-align: right;",
            formatter: sizeFormatter
        }],
        store: tableStore,
        autoHeight: true,
        selectionMode: "none"
    },
    gridContainer
    );
    datagrid.startup();
    datagrid.setSortIndex(0, true);
}
function initLink(hash) {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "getLink",
            hash : hash,
            password : document.getElementById("filePassword").value
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                dojo.query("#save area").attr("href",responseObject.link);
                document.getElementById("save").style.display='';
                document.getElementById("enterpass").style.display='none';
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
    return false;
}
function groupCheckPassword() {
    dojo.xhrPost({
        url : ajajUrl,
        handleAs : "json",
        content : {
            func : "getFilesForGroup",
            ghash: ghash,
            password : dojo.byId("groupPassword").value
        },
        load: function(responseObject, ioArgs) {
            if (responseObject.error) {
                showError(responseObject.errorText);
            } else {
                listTableData=responseObject;
                document.getElementById("enterpass").style.display='none';
                document.getElementById("centerContent").style.display='';
                document.getElementById("groupCaption").style.display='';

                listLoadTable();
            }
            return responseObject;
        },
        error: function(responseObject) {
            showError('Ошибка XHR');
            return responseObject;
        }
    });
}
//******************************************************************************************************
//	Name: ubr_file_upload.js
//	Revision: 3.6
//	Date: 9:26 PM July 24, 2009
//	Link: http://uber-uploader.sourceforge.net
//	Developer Peter Schmandra
//
//	BEGIN LICENSE BLOCK
//	The contents of this file are subject to the Mozilla Public License
//	Version 1.1 (the "License"); you may not use this file except in
//	compliance with the License. You may obtain a copy of the License
//	at http://www.mozilla.org/MPL/
//
//	Software distributed under the License is distributed on an "AS IS"
//	basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
//	the License for the specific language governing rights and
//	limitations under the License.
//
//	Alternatively, the contents of this file may be used under the
//	terms of either the GNU General Public License Version 2 or later
//	(the "GPL"), or the GNU Lesser General Public License Version 2.1
//	or later (the "LGPL"), in which case the provisions of the GPL or
//	the LGPL are applicable instead of those above. If you wish to
//	allow use of your version of this file only under the terms of
//	either the GPL or the LGPL, and not to allow others to use your
//	version of this file under the terms of the MPL, indicate your
//	decision by deleting the provisions above and replace them with the
//	notice and other provisions required by the GPL or the LGPL. If you
//	do not delete the provisions above, a recipient may use your
//	version of this file under the terms of any one of the MPL, the GPL
//	or the LGPL.
//	END LICENSE BLOCK
//***************************************************************************************************************

var UberUpload={
    seconds:0,
    minutes:0,
    hours:0,
    total_upload_size:0,
    total_kbytes:0,
    CPB_loop:false,
    CPB_width:0,
    CPB_bytes:0,
    CPB_time_width:500,
    CPB_time_bytes:100,
    CPB_hold:true,
    CPB_byte_timer:null,
    CPB_status_timer:null,
    BPB_width_inc:0,
    BPB_width_new:0,
    BPB_width_old:0,
    UP_timer:null,
    progress_bar_width:400,
    progress_initialized: false,
    drawStep: 10,

    stopDataLoop:function(){
        UberUpload.CPB_loop = false;
        clearInterval(UberUpload.UP_timer);

        clearTimeout(UberUpload.CPB_byte_timer);
        clearTimeout(UberUpload.CPB_status_timer);
    },

    // Stop the upload
    stopUpload:function(){
        try {
            window.stop();
        } catch(e){
            try {
                document.execCommand("Stop");
            } catch(e){
            }
        }
        UberUpload.stopDataLoop();
        clearTimeout(statusRequestHandler);
    },

    // Make the progress bar smooth
    smoothCedricStatus:function(){
        if(UberUpload.CPB_width < UberUpload.progress_bar_width && !UberUpload.CPB_hold){
            UberUpload.CPB_width = Math.min(UberUpload.CPB_width + UberUpload.drawStep, UberUpload.progress_bar_width);
            
            document.getElementById('upload_status').style.width=UberUpload.CPB_width + "px";
        }

        if(UberUpload.CPB_loop){
            clearTimeout(UberUpload.CPB_status_timer);
            UberUpload.CPB_status_timer = setTimeout("UberUpload.smoothCedricStatus()", UberUpload.CPB_time_width);
        }
    },

    // Make the bytes uploaded smooth
    smoothCedricBytes:function(){
        if(UberUpload.CPB_bytes < UberUpload.total_kbytes && !UberUpload.CPB_hold){
            UberUpload.CPB_bytes = Math.min(UberUpload.CPB_bytes + UberUpload.drawStep, UberUpload.total_kbytes);

            document.getElementById('current_position').innerHTML=UberUpload.CPB_bytes;
        }

        if(UberUpload.CPB_loop){
            clearTimeout(UberUpload.CPB_byte_timer);
            UberUpload.CPB_byte_timer = setTimeout("UberUpload.smoothCedricBytes()", UberUpload.CPB_time_bytes);
        }
    },

    //Start the progress bar
    startProgressBar:function(upload_size){
        UberUpload.total_upload_size = upload_size;
        UberUpload.total_kbytes = Math.round(UberUpload.total_upload_size / 1024);
        UberUpload.CPB_loop = true;
        document.getElementById('total_kbytes').innerHTML=UberUpload.total_kbytes;
        UberUpload.UP_timer = setInterval("UberUpload.getElapsedTime()", 1000);
        UberUpload.smoothCedricBytes();
        UberUpload.smoothCedricStatus();
    },

    // Calculate and display upload information
    setProgressStatus:function(total_bytes_read, lapsed_time){
        var byte_speed = 0;
        var time_remaining = 0;

        if(lapsed_time > 0){
            byte_speed = total_bytes_read / lapsed_time;
        }
        if(byte_speed > 0){
            time_remaining = Math.round((UberUpload.total_upload_size - total_bytes_read) / byte_speed);
        }

        if(byte_speed !== 0){
            var temp_CPB_time_width = Math.round(UberUpload.total_upload_size * UberUpload.drawStep * 1000 / (byte_speed * UberUpload.progress_bar_width));
            var temp_CPB_time_bytes = Math.round(UberUpload.drawStep * 1024000 / byte_speed);

            if(temp_CPB_time_width < 5001){
                UberUpload.CPB_time_width = temp_CPB_time_width;
            }
            if(temp_CPB_time_bytes < 5001){
                UberUpload.CPB_time_bytes = temp_CPB_time_bytes;
            }
        } else {
            UberUpload.CPB_time_width = 500;
            UberUpload.CPB_time_bytes = 100;
        }

        // Calculate percent_complete finished
        var percent_complete = Math.floor(100 * parseInt(total_bytes_read, 10) / parseInt(UberUpload.total_upload_size, 10));
        var progress_bar_status = Math.floor(UberUpload.progress_bar_width * (parseInt(total_bytes_read, 10) / parseInt(UberUpload.total_upload_size, 10)));

        // Calculate time remaining
        var remaining_sec = (time_remaining % 60);
        var remaining_min = (((time_remaining - remaining_sec) % 3600) / 60);
        var remaining_hours = ((((time_remaining - remaining_sec) - (remaining_min * 60)) % 86400) / 3600);

        if(remaining_sec < 10){
            remaining_sec = "0" + remaining_sec;
        }
        if(remaining_min < 10){
            remaining_min = "0" + remaining_min;
        }
        if(remaining_hours < 10){
            remaining_hours = "0" + remaining_hours;
        }

        var est_time_left = remaining_hours + ":" + remaining_min + ":" + remaining_sec;
        var est_speed = Math.round(byte_speed / 1024);
        var current_position = Math.round(total_bytes_read / 1024);

        if(progress_bar_status < UberUpload.CPB_width){
            UberUpload.CPB_hold = true;
        }else{
            UberUpload.CPB_hold = false;
            UberUpload.CPB_width = progress_bar_status;
            UberUpload.CPB_bytes = current_position;
        }
        document.getElementById('upload_status').style.width=progress_bar_status + "px";
        document.getElementById('current_position').innerHTML=current_position;
        document.getElementById('percent_complete').innerHTML=percent_complete + "%";
        document.getElementById('est_time_left').innerHTML=est_time_left;
        document.getElementById('est_speed').innerHTML=est_speed;
    },

    // Calculate the time spent uploading
    getElapsedTime:function(){
        UberUpload.seconds++;

        if(UberUpload.seconds == 60){
            UberUpload.seconds = 0;
            UberUpload.minutes++;
        }

        if(UberUpload.minutes == 60){
            UberUpload.minutes = 0;
            UberUpload.hours++;
        }

        var hr = "" + ((UberUpload.hours < 10) ? "0" : "") + UberUpload.hours;
        var min = "" + ((UberUpload.minutes < 10) ? "0" : "") + UberUpload.minutes;
        var sec = "" + ((UberUpload.seconds < 10) ? "0" : "") + UberUpload.seconds;
        document.getElementById('elapsed_time').innerHTML=hr + ":" + min + ":" + sec;
    }
}