]> git.mjollnir.org Git - moodle.git/commitdiff
"MDL-18486, compressed file picker js code"
authordongsheng <dongsheng>
Thu, 30 Apr 2009 06:30:05 +0000 (06:30 +0000)
committerdongsheng <dongsheng>
Thu, 30 Apr 2009 06:30:05 +0000 (06:30 +0000)
repository/repository.js
repository/repository.src.js [new file with mode: 0644]

index 9eaec863ef29741980cc3da3ffff669f710e1085..85cc454b0dad82ad4097db576b3602cda9acee11 100644 (file)
@@ -1,1145 +1 @@
-// $Id$
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-//       Don't modify this file unless you know how it works             //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-/**
- * repository_client is a javascript class, it contains several static 
- * methods you can call it directly without creating an instance.
- * If you are going to create a file picker, you need create an instance
- * repo = new repository_client();
- */
-
-var repository_listing = {};
-var cached_client_id = {};
-var file_extensions = {};
-/* when selected a file, filename will be cached in this varible */
-var new_filename = '';
-// will be used by login form
-var cached_id;
-var cached_repo_id;
-// repository_client has static functions
-var repository_client = (function(){
-    // private static field
-    var version = '2.0';
-    var PANEL_BODY_PADDING = (10*2);
-    // private static methods
-    function help() {
-        alert(version);
-    }
-    // a hack to fix ie6 bug
-    function ie6_fix_width(id, width) {
-        if(YAHOO.env.ua.ie == 6){
-            var fp_title = document.getElementById('file-picker-'+id);
-            fp_title.style.width = width;
-        }
-    }
-    function $() {
-        // public methods of filepicker instance
-        this.create_filepicker = function(client_id) {
-            var IE_QUIRKS = (YAHOO.env.ua.ie && document.compatMode == "BackCompat");
-            var IE_SYNC = (YAHOO.env.ua.ie == 6 || (YAHOO.env.ua.ie == 7 && IE_QUIRKS));
-            var btn_listing = {label: fp_lang.listview, value: 'l',
-                onclick: {fn: repository_client.view_as_list, obj:client_id}};
-            var btn_icons = {label: fp_lang.thumbview, value: 't',
-                onclick: {fn: repository_client.view_as_icons, obj:client_id}};
-            document.body.className += ' yui-skin-sam';
-            var el = document.createElement('DIV');
-            el.id = 'file-picker-'+client_id;
-            el.className = 'file-picker';
-            this.client_id = client_id;
-            document.body.appendChild(el);
-            this.filepicker = new YAHOO.widget.Panel('file-picker-' + client_id, {
-                draggable: true,
-                close: true,
-                underlay: 'none',
-                zindex: 666666,
-                xy: [50, YAHOO.util.Dom.getDocumentScrollTop()+20]
-            });
-            var layout = '';
-            this.filepicker.client_id = client_id;
-            this.filepicker.setHeader(fp_lang['title']);
-            this.filepicker.setBody('<div id="layout-'+client_id+'"></div>');
-            this.filepicker.beforeRenderEvent.subscribe(function() {
-                YAHOO.util.Event.onAvailable('layout-'+client_id, function() {
-                    layout = new YAHOO.widget.Layout('layout-'+client_id, {
-                        height: 480, width: 700,
-                        units: [
-                        {position: 'top', height: 32, resize: false,
-                        body:'<div class="yui-buttongroup fp-viewbar" id="repo-viewbar-'+client_id+'"></div><div class="fp-searchbar" id="search-div-'+client_id+'"></div>', gutter: '2'},
-                        {position: 'left', width: 200, resize: true, scroll:true,
-                        body:'<ul class="fp-list" id="repo-list-'+client_id+'"></ul>', gutter: '0 5 0 2', minWidth: 150, maxWidth: 300 },
-                        {position: 'center', body: '<div class="fp-panel" id="panel-'+client_id+'"></div>',
-                        scroll: true, gutter: '0 2 0 0' }
-                        ]
-                    });
-                    layout.render();
-                });
-            });
-            var resize = new YAHOO.util.Resize('file-picker-'+client_id, {
-                handles: ['br'],
-                autoRatio: true,
-                status: true,
-                minWidth: 680,
-                minHeight: 400
-            });
-            ie6_fix_width(client_id, '680px');
-            resize.on('resize', function(args) {
-                var panelHeight = args.height;
-                var headerHeight = this.header.offsetHeight; // Content + Padding + Border
-                var bodyHeight = (panelHeight - headerHeight);
-                var bodyContentHeight = (IE_QUIRKS) ? bodyHeight : bodyHeight - PANEL_BODY_PADDING;
-                YAHOO.util.Dom.setStyle(this.body, 'height', bodyContentHeight + 'px');
-                ie6_fix_width(this.client_id, '680px');
-                if (IE_SYNC) {
-                    this.sizeUnderlay();
-                    this.syncIframe();
-                }
-                layout.set('height', bodyContentHeight);
-                layout.set('width', (args.width - PANEL_BODY_PADDING));
-                layout.resize();
-            }, this.filepicker, true);
-            repository_client.fp[client_id].viewbar = new YAHOO.widget.ButtonGroup({
-                id: 'btngroup-'+client_id,
-                name: 'buttons',
-                disabled: true,
-                container: 'repo-viewbar-'+client_id
-            });
-            repository_client.fp[client_id].viewbar.addButtons([btn_icons, btn_listing]);
-            this.print_listing();
-            this.filepicker.render();
-        }
-        this.init_search = function() {
-            var searchbar = document.getElementById('search-div-'+this.client_id);
-            searchbar.innerHTML = '<input id="search-input-'+this.client_id+'" /><button id="search-btn-'+this.client_id+'">'+fp_lang.federatedsearch+'</button>';
-            var search_btn = new YAHOO.util.Element('search-btn-'+this.client_id);
-            search_btn.client_id = this.client_id;
-            var input_keyword = new YAHOO.util.Element('search-input-'+this.client_id);
-            input_keyword.client_id = this.client_id;
-            search_btn.fnSearch = function(e) {
-                var el = new YAHOO.util.Element('search-input-'+this.client_id)
-                var keyword = el.get('value');
-                var r = repository_client.fp[this.client_id];
-                var params = [];
-                params['s'] = keyword;
-                params['env']=r.env;
-                params['accepted_types'] = r.accepted_types;
-                params['sesskey']=moodle_cfg.sesskey;
-                params['ctx_id']=fp_config.contextid;
-                params['client_id']=this.client_id;
-                repository_client.loading(this.client_id, 'load');
-                var trans = YAHOO.util.Connect.asyncRequest('POST',
-                    moodle_cfg.wwwroot+'/repository/ws.php?action=gsearch', this.search_cb, repository_client.postdata(params));
-            }
-            search_btn.on('contentReady', function() {
-                search_btn.on('click', this.fnSearch, this.input_keyword);
-            });
-            search_btn.search_cb={
-                success: function(o) {
-                    var data = repository_client.parse_json(o.responseText, 'global_search_cb');
-                    var panel = new YAHOO.util.Element('panel-'+data.client_id);
-                    if(!data.list || data.list.length<1){
-                        panel.get('element').innerHTML = fp_lang.noresult;
-                        return;
-                    }
-                    var r = repository_client.fp[data.client_id];
-                    r.view_staus = 0;
-                    r.fs = data.list;
-                    if(r.view_staus) {
-                        repository_client.view_as_list(data.client_id, data.list);
-                    } else {
-                        repository_client.view_as_icons(data.client_id, data.list);
-                    }
-                    var el = new YAHOO.util.Element('search-input-'+data.client_id)
-                    el.set('value', '');
-                }
-            }
-            input_keyword.on('contentReady', function() {
-                var scope = document.getElementById('search-input-'+this.client_id);
-                var k1 = new YAHOO.util.KeyListener(scope, {keys:13}, {fn:function(){this.fnSearch()},scope:search_btn, correctScope: true});
-                k1.enable();
-            });
-        }
-        this.print_listing = function() {
-            var container = new YAHOO.util.Element('repo-list-'+this.client_id);
-            container.set('innerHTML', '');
-            container.on('contentReady', function() {
-                this.init_search();    
-                for(var i in repository_listing[this.client_id]) {
-                    var repo = repository_listing[this.client_id][i];
-                    var support = false;
-                    if(this.env=='editor' && this.accepted_types != '*'){
-                        if(repo.supported_types!='*'){
-                            for (var j in repo.supported_types){
-                                if(mdl_in_array(repo.supported_types[j], this.accepted_types)){
-                                    support = true;
-                                }
-                            }
-                        }
-                    }else{
-                        support = true;
-                    }
-                    if(repo.supported_types == '*' || support){
-                        var li = document.createElement('li');
-                        li.id = 'repo-'+this.client_id+'-'+repo.id;
-                        var icon = document.createElement('img');
-                        icon.src = repo.icon;
-                        icon.width = '16';
-                        icon.height = '16';
-                        var link = document.createElement('a');
-                        link.href = '###';
-                        link.id = 'repo-call-'+this.client_id+'-'+repo.id;
-                        link.appendChild(icon);
-                        link.className = 'fp-repo-name';
-                        link.innerHTML += ' '+repo.name;
-                        link.onclick = function() {
-                            var re = new RegExp("repo-call-(\\w+)-(\\d+)", "i");
-                            var result = this.id.match(re);
-                            var client_id = result[1];
-                            var repo_id = result[2];
-                            // high light currect selected repository
-                            for(var cc in repository_listing[client_id]){
-                                var tmp_id = 'repo-call-'+client_id+'-'+ cc;
-                                var el = document.getElementById(tmp_id);
-                                if(el){
-                                    el.style.background = 'transparent';
-                                }
-                            }
-                            this.style.background = '#CCC';
-                            repository_client.req(client_id, repo_id, '');
-                        }
-                        li.appendChild(link);
-                        container.appendChild(li);
-                        repo = null;
-                    }
-                }
-            }, this, true);
-
-        }
-        this.show = function(){
-            this.print_listing();
-            var panel = new YAHOO.util.Element('panel-'+this.filepicker.client_id);
-            panel.get('element').innerHTML = '';
-            this.filepicker.show();
-        }
-        this.hide = function(){
-            this.filepicker.hide();
-        }
-    }
-    // all filepicker instances
-    $.fp = {};
-    return $;
-})();
-// public static method
-// may be called outside yui
-repository_client.req = function(client_id, id, path, page) {
-    repository_client.loading(client_id, 'load');
-    this.fp[client_id].viewbar.set('disabled', false);
-    var r = repository_client.fp[client_id];
-    var params = [];
-    params['p'] = path;
-    params['env']=r.env;
-    params['sesskey']=moodle_cfg.sesskey;
-    params['ctx_id']=fp_config.contextid;
-    params['client_id'] = client_id;
-    params['repo_id']=id;
-    if (!!page) { // convert page to boolean value
-        params['page']=page;
-    }
-    params['accepted_types'] = r.accepted_types;
-    var trans = YAHOO.util.Connect.asyncRequest('POST', moodle_cfg.wwwroot+'/repository/ws.php?action=list', this.req_cb, this.postdata(params));
-}
-
-repository_client.req_cb = {
-    success: function(o){
-         var data = repository_client.parse_json(o.responseText, 'req_cb');    
-         var repo = repository_client.fp[data.client_id];
-         var panel = new YAHOO.util.Element('panel-'+data.client_id);
-         if(data && data.e) {
-             panel.get('element').innerHTML = data.e;
-             return;
-         }
-         // save data
-         repo.fs = data;
-         if(!data) {
-             return;
-         }else if(data.msg){
-             repository_client.print_msg(data.msg);
-         }else if(data.iframe) {
-             repository_client.view_iframe(data.client_id);
-         }else if(data.login) {
-             repository_client.print_login(data.client_id, data);
-         }else if(data.list) {
-             if(repo.view_status) {
-                 repository_client.view_as_list(data.client_id, data.list);
-             } else {
-                 repository_client.view_as_icons(data.client_id, data.list);
-             }
-         }
-     }
-}
-repository_client.view_iframe = function(client_id) {
-    var fs = repository_client.fp[client_id].fs;
-    var panel = new YAHOO.util.Element('panel-'+client_id);
-    panel.get('element').innerHTML = "<iframe frameborder=\"0\" width=\"98%\" height=\"400px\" src=\""+fs.iframe+"\" />";
-}
-repository_client.req_search_results = function(client_id, id, path, page) {
-    this.fp[client_id].viewbar.set('disabled', false);
-    var r = repository_client.fp[client_id];
-    var params = [];
-    params['p'] = path;
-    params['env']=r.env;
-    params['sesskey']=moodle_cfg.sesskey;
-    params['ctx_id']=fp_config.contextid;
-    params['client_id'] = client_id;
-    params['search_paging']='true';
-    params['repo_id']=id;
-    if (!!page) { // convert page to boolean value
-        params['page']=page;
-    }
-    params['accepted_types'] = r.accepted_types;
-    var trans = YAHOO.util.Connect.asyncRequest('POST', moodle_cfg.wwwroot+'/repository/ws.php?action=search', this.req_cb, this.postdata(params));
-}
-
-repository_client.print_login = function(id, data) {
-    var login = data.login;
-    var panel = new YAHOO.util.Element('panel-'+id);
-    var action = 'login';
-    if (data['login_search_form']) {
-        action='search';
-    }
-    var str = '<div class="fp-login-form" onkeypress="repository_client.login_keypress(event,\''+action+'\')">';
-    var has_pop = false;
-    this.fp[id].login = login;
-    str +='<table width="100%">';
-    for(var k in login) {
-        str +='<tr>';
-        if(login[k].type=='popup') {
-            str += '<td colspan="2"><p class="fp-popup">'+fp_lang.popup+'</p>';
-            str += '<p class="fp-popup"><button onclick="repository_client.popup(\''+id+'\', \''+login[k].url+'\')">'+fp_lang.login+'</button>';
-            str += '</p></td>';
-            has_pop = true;
-        }else if(login[k].type=='textarea') {
-            str += '<td colspan="2"><p><textarea id="'+login[k].id+'" name="'+login[k].name+'"></textarea></p></td>';
-        }else{
-            var label_id = '';
-            var field_id = '';
-            var field_value = '';
-            if(login[k].id) {
-                label_id = ' for="'+login[k].id+'"';
-                field_id = ' id="'+login[k].id+'"';
-            }
-            if (login[k].label) {
-                str += '<td align="right"><label'+label_id+'>'+login[k].label+'</label>&nbsp;</td>';
-            }
-            if(login[k].value) {
-                field_value = ' value="'+login[k].value+'"';
-            }
-            if(login[k].type=='radio'){
-                var list = login[k].value.split('|');
-                var labels = login[k].value_label.split('|');
-                str += '<td align="left">';
-                for(var item in list) {
-                    str +='<input type="'+login[k].type+'"'+' name="'+login[k].name+'"'+
-                        field_id+' value="'+list[item]+'" />'+labels[item]+'<br />'; 
-                }
-                str += '</td>';
-            }else{
-                str += '<td align="left"><input type="'+login[k].type+'"'+' name="'+login[k].name+'"'+field_value+' /></td>';
-            }
-        }
-        str +='</tr>';
-    }
-    str +='</table>';
-    var btn_label = data['login_btn_label']?data['login_btn_label']:fp_lang.submit;
-    if (data['login_search_form']) {
-        str += '<p><input type="button" onclick="repository_client.search(\''+id+'\', \''+data.repo_id+'\')" value="'+btn_label+'" /></p>';
-    } else {
-        if(!has_pop) {
-            str += '<p><input type="button" onclick="repository_client.login(\''+id+'\', \''+data.repo_id+'\')" value="'+btn_label+'" /></p>';
-        }
-    }
-    str += '</div>';
-    panel.get('element').innerHTML = str;
-    cached_id=id;
-    cached_repo_id=data.repo_id;
-}
-repository_client.login = function(id, repo_id) {
-    var params = [];
-    var data = this.fp[id].login;
-    for (var k in data) {
-        if(data[k].type!='popup') {
-            var el = document.getElementsByName(data[k].name)[0];
-            params[data[k].name] = '';
-            if(el.type == 'checkbox') {
-                params[data[k].name] = el.checked;
-            } else {
-                params[data[k].name] = el.value;
-            }
-        }
-    }
-    params['env'] = this.fp[id].env;
-    params['repo_id'] = repo_id;
-    params['client_id'] = id;
-    params['ctx_id'] = fp_config.contextid;
-    params['sesskey'] = moodle_cfg.sesskey;
-    params['accepted_types'] = this.fp[id].accepted_types;
-    this.loading(id, 'load');
-    var trans = YAHOO.util.Connect.asyncRequest('POST',
-            moodle_cfg.wwwroot+'/repository/ws.php?action=sign', this.req_cb, this.postdata(params));
-}
-repository_client.login_keypress = function(evt,action) {
-    evt = (evt) ? evt : ((window.event) ? window.event : "")
-    var key = evt.keyCode?evt.keyCode:evt.which;
-    if(key == 13 || key == 10){
-        if(action=='search'){
-            repository_client.search(cached_id, cached_repo_id);
-        } else {
-            repository_client.login(cached_id, cached_repo_id);
-        }
-    }
-}
-repository_client.search = function(id, repo_id) {
-    var params = [];
-    var data = this.fp[id].login;
-    for (var k in data) {
-        if(data[k].type!='popup') {
-            var el = document.getElementsByName(data[k].name)[0];
-            params[data[k].name] = '';
-            if(el.type == 'checkbox') {
-                params[data[k].name] = el.checked;
-            } else if(el.type == 'radio') {
-                var tmp = document.getElementsByName(data[k].name);
-                for(var i in tmp) {
-                    if (tmp[i].checked) {
-                        params[data[k].name] = tmp[i].value;
-                    }
-                }
-            } else {
-                params[data[k].name] = el.value;
-            }
-        }
-    }
-    params['env'] = this.fp[id].env;
-    params['repo_id'] = repo_id;
-    params['client_id'] = id;
-    params['ctx_id'] = fp_config.contextid;
-    params['sesskey'] = moodle_cfg.sesskey;
-    params['accepted_types'] = this.fp[id].accepted_types;
-    this.loading(id, 'load');
-    var trans = YAHOO.util.Connect.asyncRequest('POST',
-            moodle_cfg.wwwroot+'/repository/ws.php?action=search', this.req_cb, this.postdata(params));
-}
-repository_client.loading = function(id, type, name) {
-    var panel = new YAHOO.util.Element('panel-'+id);
-    panel.get('element').innerHTML = '';
-    var content = document.createElement('div');
-    content.style.textAlign='center';
-    var para = document.createElement('P');
-    var img = document.createElement('IMG');
-    if(type=='load') {
-        img.src = moodle_cfg.pixpath+'/i/loading.gif';
-        para.innerHTML = fp_lang.loading;
-    }else{
-        img.src = moodle_cfg.pixpath+'/i/progressbar.gif';
-        para.innerHTML = fp_lang.copying+' <strong>'+name+'</strong>';
-    }
-    content.appendChild(para);
-    content.appendChild(img);
-    panel.get('element').appendChild(content);
-}
-repository_client.view_as_list = function(client_id, data) {
-    if (typeof client_id == 'object') {
-        // click button
-        client_id = data;
-        list = repository_client.fp[client_id].fs.list;
-    } else if(!data) {
-        // from viewfiles
-        list = repository_client.fp[client_id].fs.list;
-    }else{
-        // from callback 
-        list = data;
-    }
-    var panel = new YAHOO.util.Element('panel-'+client_id);
-    var fp = repository_client.fp[client_id];
-    fp.view_status = 1;
-    fp.viewbar.check(1);
-    repository_client.print_header(client_id);
-    panel.get('element').innerHTML += '<div id="treediv-'+client_id+'"></div>';
-    var tree = new YAHOO.widget.TreeView('treediv-'+client_id);
-    tree.dynload = function (node, fnLoadComplete) {
-        var callback = {
-            success: function(o) {
-                 var json = repository_client.parse_json(o.responseText, 'dynload');    
-                 for(k in json.list) {
-                     repository_client.buildtree(json.client_id, json.list[k], node);
-                 }
-                 o.argument.fnLoadComplete();
-            },
-            failure:function(oResponse) {
-                alert(fp_lang.error+' - |dynload| -');
-                oResponse.argument.fnLoadComplete();
-            },
-            argument:{"node":node, "fnLoadComplete": fnLoadComplete}
-        }
-        var fp = repository_client.fp[node.client_id];
-        var params = [];
-        params['p']=node.path;
-        params['env']=fp.env;
-        params['sesskey']=moodle_cfg.sesskey;
-        params['ctx_id']=fp_config.contextid;
-        params['repo_id']=fp.fs.repo_id;
-        params['client_id']=node.client_id;
-        params['accepted_types']=fp.accepted_types;
-        var trans = YAHOO.util.Connect.asyncRequest('POST',
-                moodle_cfg.wwwroot+'/repository/ws.php?action=list',callback,repository_client.postdata(params));
-    }
-    tree.dynload.client_id = client_id;
-    if(fp.fs.dynload) {
-        tree.setDynamicLoad(tree.dynload, 1);
-    } else {
-    }
-    for(k in list) {
-        repository_client.buildtree(client_id, list[k], tree.getRoot());
-    }
-    tree.draw();
-    tree.subscribe('clickEvent', function(e){
-        if(e.node.isLeaf){
-            repository_client.select_file(e.node.data.filename, e.node.data.value, e.node.data.icon, client_id, e.node.repo_id);
-        }
-    });
-    repository_client.print_footer(client_id);
-}
-repository_client.buildtree = function(client_id, node, level) {
-    var fs = repository_client.fp[client_id].fs;
-    if(node.children) {
-        node.title = '<i><u>'+node.title+'</u></i>';
-    }
-    var info = {
-        label:node.title,
-        title:fp_lang.date+' '+node.date+fp_lang.size+' '+node.size,
-        filename:node.title,
-        value:node.source,
-        icon:node.thumbnail,
-        path:node.path
-    };
-    var tmpNode = new YAHOO.widget.TextNode(info, level, false);
-    var tooltip = new YAHOO.widget.Tooltip(tmpNode.labelElId, {
-        context:tmpNode.labelElId, text:info.title});
-    if(node.repo_id) {
-        tmpNode.repo_id=node.repo_id;
-    }else{
-        tmpNode.repo_id=fs.repo_id;
-    }
-    if(node.children) {
-        if(node.expanded) {
-            tmpNode.expand();
-        }
-        tmpNode.isLeaf = false;
-        tmpNode.client_id = client_id;
-        if (node.path) {
-            tmpNode.path = node.path;
-        } else {
-            tmpNode.path = '';
-        }
-        for(var c in node.children) {
-            this.buildtree(client_id, node.children[c], tmpNode);
-        }
-    } else {
-        tmpNode.isLeaf = true;
-    }
-}
-repository_client.select_file = function(oldname, url, icon, client_id, repo_id) {
-    var thumbnail = document.getElementById('fp-grid-panel-'+client_id);
-    if(thumbnail){
-        thumbnail.style.display = 'none';
-    }
-    var header = document.getElementById('fp-header-'+client_id);
-    header.style.display = 'none';
-    var footer = document.getElementById('fp-footer-'+client_id);
-    footer.style.display = 'none';
-    var pathbar = document.getElementById('path-'+client_id);
-    if(pathbar){
-        pathbar.style.display = 'none';
-    }
-    var panel = new YAHOO.util.Element('panel-'+client_id);
-    var html = '<div class="fp-rename-form">';
-    html += '<p><img src="'+icon+'" /></p>';
-    html += '<p><label for="newname-'+client_id+'">'+fp_lang.saveas+'</label>';
-    html += '<input type="text" id="newname-'+client_id+'" value="" /></p>';
-    html += '<p><input type="hidden" id="fileurl-'+client_id+'" value="'+url+'" />';
-    html += '<input type="button" onclick="repository_client.download(\''+client_id+'\', \''+repo_id+'\')" value="'+fp_lang.downbtn+'" />';
-    html += '<input type="button" onclick="repository_client.viewfiles(\''+client_id+'\')" value="'+fp_lang.cancel+'" /></p>';
-    html += '</div>';
-    panel.get('element').innerHTML += html;
-    /* to deal with double quote, single quote, we need to use javascript change value */
-    document.getElementById('newname-'+client_id).value = oldname;
-    var tree = document.getElementById('treediv-'+client_id);
-    if(tree){
-        tree.style.display = 'none';
-    }
-}
-repository_client.paging = function(client_id, id) {
-    var str = '';
-    this.fp[client_id].view_staus = 0;
-    var fs = this.fp[client_id].fs;
-    if(fs.pages) {
-        str += '<div class="fp-paging" id="paging-'+id+'-"'+client_id+'>';
-        if(!fs.search_result){
-            var action = 'req';
-        } else {
-            var action = 'req_search_results';
-        }
-        str += this.get_page_btn(client_id, action, 1)+'1</a>';
-
-        if (fs.page+2>=fs.pages) {
-            var max = fs.pages;
-        } else {
-            var max = fs.page+2;
-        }
-        if (fs.page-2 >= 3) {
-            str += ' ... ';
-            for(var i=fs.page-2; i<max; i++) {
-                str += this.get_page_btn(client_id, action, i);
-                str += String(i);
-                str += '</a> ';
-            }
-        } else {
-            for(var i = 2; i < max; i++) {
-                str += this.get_page_btn(client_id, action, i);
-                str += String(i);
-                str += '</a> ';
-            }
-        }
-        if (max==fs.pages) {
-            str += this.get_page_btn(client_id, action, fs.pages)+fs.pages+'</a>';
-        } else {
-            str += repository_client.get_page_btn(client_id, action, max)+max+'</a>';
-            str += ' ... '+repository_client.get_page_btn(client_id, action, fs.pages)+fs.pages+'</a>';
-        }
-        str += '</div>';
-    }
-    return str;
-}
-repository_client.get_page_btn = function(client_id, type, page) {
-    var fs = this.fp[client_id].fs;
-    var css = '';
-    if (page == fs.page) {
-        css = 'class="cur_page"';
-    }
-    str = '<a '+css+' onclick="repository_client.'+type+'(\''+client_id+'\','+fs.repo_id+', '+page+', '+page+')" href="###">';
-    return str;
-}
-repository_client.path = function(client_id) {
-    var fs = this.fp[client_id].fs;
-    // if this is listing view
-    if(this.fp[client_id].view_status == 1) {
-        return;
-    }
-    var panel = new YAHOO.util.Element('panel-'+client_id);
-    var p = fs.path;
-    if(p && p.length!=0) {
-        var oDiv = document.createElement('DIV');
-        oDiv.id = "path-"+client_id;
-        oDiv.className = "fp-pathbar";
-        panel.get('element').appendChild(oDiv);
-        for(var i = 0; i < fs.path.length; i++) {
-            var link = document.createElement('A');
-            link.href = "###";
-            link.innerHTML = fs.path[i].name;
-            link.id = 'path-'+client_id+'-'+fs.repo_id;
-            link.path=fs.path[i].path;
-            link.onclick = function() {
-                var re = new RegExp("path-(\\w+)-(\\d+)", "i");
-                var result = this.id.match(re);
-                var client_id = result[1];
-                var repo_id = result[2];
-                repository_client.req(client_id, repo_id, this.path);
-            }
-            var sep = document.createElement('SPAN');
-            sep.innerHTML = '/';
-            oDiv.appendChild(link);
-            oDiv.appendChild(sep);
-        }
-    }
-}
-repository_client.print_header = function(client_id) {
-    var panel = new YAHOO.util.Element('panel-'+client_id);
-    var str = '<div id="fp-header-'+client_id+'">';
-    str += '<div class="fp-toolbar" id="repo-tb-'+client_id+'"></div>';
-    if(this.fp[client_id].fs.pages < 8){
-        str += this.paging(client_id, 'header');
-    }
-    str += '</div>';
-    panel.set('innerHTML', str);
-    this.path(client_id);
-}
-repository_client.view_as_icons = function(client_id, data) {
-    var list = null;
-    if (typeof client_id == 'object') {
-        // click button
-        client_id = data;
-        list = repository_client.fp[client_id].fs.list;
-    } else if(!data) {
-        // from viewfiles
-        list = repository_client.fp[client_id].fs.list;
-    }else{
-        // from callback
-        list = data;
-    }
-    var fp = repository_client.fp[client_id];
-    fp.view_status = 0;
-    fp.viewbar.check(0);
-    var container = document.getElementById('panel-'+client_id);
-    var panel = document.createElement('DIV');
-    panel.id = 'fp-grid-panel-'+client_id;
-    repository_client.print_header(client_id);
-    var count = 0;
-    for(k in list) {
-        // the container
-        var el = document.createElement('div');
-        el.className='fp-grid';
-        // the file name
-        var title = document.createElement('div');
-        title.id = 'grid-title-'+String(count);
-        title.className = 'label';
-        if (list[k].shorttitle) {
-            list[k].title = list[k].shorttitle;
-        }
-        title.innerHTML += '<a href="###"><span>'+list[k].title+"</span></a>";
-        if(list[k].thumbnail_width){
-            el.style.width = list[k].thumbnail_width+'px';
-            title.style.width = (list[k].thumbnail_width-10)+'px';
-        } else {
-            el.style.width = title.style.width = '80px';
-        }
-        var frame = document.createElement('DIV');
-        frame.style.textAlign='center';
-        if(list[k].thumbnail_height){
-            frame.style.height = list[k].thumbnail_height+'px';
-        }
-        var img = document.createElement('img');
-        img.src = list[k].thumbnail;
-        if(list[k].thumbnail_alt) {
-            img.alt = list[k].thumbnail_alt;
-        }
-        if(list[k].thumbnail_title) {
-            img.title = list[k].thumbnail_title;
-        }
-        var link = document.createElement('A');
-        link.href='###';
-        link.id = 'img-id-'+String(count);
-        if(list[k].url) {
-            el.innerHTML += '<p><a target="_blank" href="'+list[k].url+'">'+fp_lang.preview+'</a></p>';
-        }
-        link.appendChild(img);
-        frame.appendChild(link);
-        el.appendChild(frame);
-        el.appendChild(title);
-        panel.appendChild(el);
-        if(list[k].children) {
-            var folder = new YAHOO.util.Element(link.id);
-            folder.path = list[k].path;
-            var el_title = new YAHOO.util.Element(title.id);
-            folder.fs = list[k].children;
-            folder.on('contentReady', function() {
-                this.on('click', function() {
-                    if(fp.fs.dynload) {
-                        var fs = repository_client.fp[client_id].fs;
-                        var params = [];
-                        params['p'] = this.path;
-                        params['env'] = repository_client.fp[client_id].env;
-                        params['repo_id'] = fs.repo_id;
-                        params['ctx_id'] = fp_config.contextid;
-                        params['sesskey']= moodle_cfg.sesskey;
-                        params['accepted_types'] = repository_client.fp[client_id].accepted_types;
-                        params['client_id'] = client_id;
-                        repository_client.loading(client_id, 'load');
-                        var trans = YAHOO.util.Connect.asyncRequest('POST',
-                                moodle_cfg.wwwroot+'/repository/ws.php?action=list', repository_client.req_cb, repository_client.postdata(params));
-                    }else{
-                        repository_client.view_as_icons(client_id, this.fs);
-                    }
-                });
-            });
-            el_title.on('contentReady', function() {
-                this.on('click', function(){
-                    folder.fireEvent('click');
-                });
-            });    
-        } else {
-            var el_title = new YAHOO.util.Element(title.id);
-            var file = new YAHOO.util.Element(link.id);
-            el_title.filename = file.filename = list[k].title;
-            el_title.value = file.value = list[k].source;
-            el_title.icon = file.icon  = list[k].thumbnail;
-            if(fp.fs.repo_id) {
-                el_title.repo_id = file.repo_id = fp.fs.repo_id;
-            }else if(list[k].repo_id) {
-                el_title.repo_id = file.repo_id = list[k].repo_id;
-            }else{
-                el_title.repo_id = file.repo_id = '';
-            }     
-            file.on('contentReady', function() {
-                this.on('click', function() {
-                    repository_client.select_file(this.filename, this.value, this.icon, client_id, this.repo_id);
-                });
-            });
-            el_title.on('contentReady', function() {
-                this.on('click', function() {
-                    repository_client.select_file(this.filename, this.value, this.icon, client_id, this.repo_id);
-                });
-            });
-        }
-        count++;
-    }
-    container.appendChild(panel);
-    repository_client.print_footer(client_id);
-}
-repository_client.print_footer = function(client_id) {
-    var fs = this.fp[client_id].fs;
-    var panel = document.getElementById('panel-'+client_id);
-    var footer = document.createElement('DIV');
-    footer.id = 'fp-footer-'+client_id;
-    footer.innerHTML += this.create_upload_form(client_id);
-    footer.innerHTML += this.paging(client_id, 'footer');
-    panel.appendChild(footer);
-    // add repository manage buttons here
-    var oDiv = document.getElementById('repo-tb-'+client_id);
-    if(!fs.nosearch) {
-        var search = document.createElement('A');
-        search.href = '###';
-        search.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/search.png" /> '+fp_lang.search;
-        oDiv.appendChild(search);
-        search.onclick = function() {
-            repository_client.search_form(client_id, fs.repo_id);
-        }
-    }
-    // weather we use cache for this instance, this button will reload listing anyway
-    if(!fs.norefresh) {
-        var ccache = document.createElement('A');
-        ccache.href = '###';
-        ccache.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/refresh.png" /> '+fp_lang.refresh;
-        oDiv.appendChild(ccache);
-        ccache.onclick = function() {
-            var params = [];
-            params['env']=fs.env;
-            params['sesskey']=moodle_cfg.sesskey;
-            params['ctx_id']=fp_config.contextid;
-            params['repo_id']=fs.repo_id;
-            params['client_id']=client_id;
-            repository_client.loading(client_id, 'load');
-            var trans = YAHOO.util.Connect.asyncRequest('POST',
-                    moodle_cfg.wwwroot+'/repository/ws.php?action=ccache', repository_client.req_cb, repository_client.postdata(params));
-        }
-    }
-    if(fs.manage) {
-        var mgr = document.createElement('A');
-        mgr.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/setting.png" /> '+fp_lang.mgr;
-        mgr.href = fs.manage;
-        mgr.target = "_blank";
-        oDiv.appendChild(mgr);
-    }
-    if(!fs.nologin) {
-        var logout = document.createElement('A');
-        logout.href = '###';
-        logout.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/logout.png" /> '+fp_lang.logout;
-        oDiv.appendChild(logout);
-        logout.onclick = function() {
-            repository_client.logout(client_id, fs.repo_id);
-        }
-    }
-    if(fs.help) {
-        var help = document.createElement('A');
-        help.href = fs.help;
-        help.target = "_blank";
-        help.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/help.png" /> '+fp_lang['help'];
-        oDiv.appendChild(help);
-    }
-}
-
-repository_client.postdata = function(obj) {
-    var str = '';
-    for(k in obj) {
-        if(obj[k] instanceof Array) {
-            for(i in obj[k]) {
-                str += (encodeURIComponent(k) +'[]='+encodeURIComponent(obj[k][i]));
-                str += '&';
-            }
-        } else {
-            str += encodeURIComponent(k) +'='+encodeURIComponent(obj[k]);
-            str += '&';
-        }
-    }
-    return str;
-}
-
-repository_client.stripHTML = function(str){
-    var re= /<\S[^><]*>/g
-    var ret = str.replace(re, "")
-    return ret;
-}
-repository_client.popup = function(client_id, url) {
-    window.open(url,'repo_auth', 'location=0,status=0,scrollbars=0,width=500,height=300');
-    cached_client_id = client_id;
-    return true;
-}
-function repository_callback(id) {
-    repository_client.req(cached_client_id, id, '');
-}
-repository_client.logout = function(client_id, repo_id) {
-    var params = [];
-    params['repo_id'] = repo_id;
-    params['client_id'] = client_id;
-    var trans = YAHOO.util.Connect.asyncRequest('POST', moodle_cfg.wwwroot+'/repository/ws.php?action=logout',
-            repository_client.req_cb, repository_client.postdata(params));
-}
-repository_client.download = function(client_id, repo_id) {
-    var fp = repository_client.fp[client_id];
-    var title = document.getElementById('newname-'+client_id).value;
-    new_filename = title;
-    var file = document.getElementById('fileurl-'+client_id).value;
-    repository_client.loading(client_id, 'download', title);
-    var params = [];
-    if(fp.itemid){
-        params['itemid']=fp.itemid;
-    }
-    params['env']=fp.env;
-    params['file']=file;
-    params['title']=title;
-    params['sesskey']=moodle_cfg.sesskey;
-    params['ctx_id']=fp_config.contextid;
-    params['repo_id']=repo_id;
-    params['client_id']=client_id;
-    var trans = YAHOO.util.Connect.asyncRequest('POST',
-            moodle_cfg.wwwroot+'/repository/ws.php?action=download',
-            repository_client.download_cb,
-            repository_client.postdata(params));
-}
-repository_client.download_cb = {
-    success: function(o) {
-         var data = repository_client.parse_json(o.responseText, 'download_cb');    
-         var panel = new YAHOO.util.Element('panel-'+data.client_id);
-         if(data && data.e) {
-             panel.get('element').innerHTML = data.e;
-             return;
-         }
-         repository_client.end(data.client_id, data);
-    }
-}
-repository_client.end = function(client_id, obj) {
-    var fp = repository_client.fp[client_id];
-    if(fp.env=='filepicker') {
-        fp.target.value = obj['id'];
-    }else if(fp.env=='editor'){
-        if (obj['type'] == 'link') {
-            fp.target.value = obj['url']+'#'+new_filename;
-        } else {
-            fp.target.value = obj['url'];
-        }
-        fp.target.onchange();
-    }
-    fp.formcallback(obj);
-    fp.hide();
-    repository_client.viewfiles(client_id);
-}
-repository_client.viewfiles = function(client_id) {
-     var repo = repository_client.fp[client_id];
-    if(repo.view_status) {
-        repository_client.view_as_list(client_id);
-    } else {
-        repository_client.view_as_icons(client_id);
-    }
-}
-repository_client.create_upload_form = function(client_id) {
-    var str = '';
-    var fs = repository_client.fp[client_id].fs;
-    if(fs.upload) {
-        var id = fs.upload.id+'_'+client_id;
-        str += '<div id="'+id+'_div" class="fp-upload-form">';
-        str += '<form id="'+id+'" onsubmit="return false">';
-        str += '<label for="'+id+'_file">'+fs.upload.label+': </label>';
-        str += '<input type="file" id="'+id+'_file" name="repo_upload_file" />';
-        str += '<p class="fp-upload-btn"><a href="###" onclick="return repository_client.upload(\''+client_id+'\');">'+fp_lang.upload+'</a></p>';
-        str += '</form>';
-        str += '</div>';
-    }
-    return str;
-}
-repository_client.upload = function(client_id) {
-    var fp = repository_client.fp[client_id];
-    var u = repository_client.fp[client_id].fs;
-    var id = u.upload.id+'_'+client_id;
-    var aform = document.getElementById(id);
-    var parent = document.getElementById(id+'_div');
-    var d = document.getElementById(id+'_file');
-    if(d.value!='' && d.value!=null) {
-        var container = document.createElement('DIV');
-        container.id = id+'_loading';
-        container.style.textAlign='center';
-        var img = document.createElement('IMG');
-        img.src = moodle_cfg.pixpath+'/i/progressbar.gif';
-        var para = document.createElement('p');
-        para.innerHTML = fp_lang.uploading;
-        container.appendChild(para);
-        container.appendChild(img);
-        parent.appendChild(container);
-        YAHOO.util.Connect.setForm(aform, true, true);
-
-        var trans = YAHOO.util.Connect.asyncRequest('POST',
-                moodle_cfg.wwwroot+'/repository/ws.php?action=upload&itemid='+fp.itemid
-                    +'&sesskey='+moodle_cfg.sesskey
-                    +'&ctx_id='+fp_config.contextid
-                    +'&repo_id='+u.repo_id
-                    +'&client_id='+client_id,
-                repository_client.upload_cb);
-    }else{
-        alert(fp_lang.filenotnull);
-    }
-}
-repository_client.upload_cb = {
-upload: function(o) {
-        var ret = repository_client.parse_json(o.responseText, 'upload');    
-        client_id = ret.client_id;
-        if(ret && ret.e) {
-            var panel = new YAHOO.util.Element('panel-'+client_id);
-            panel.get('element').innerHTML = ret.e;
-            return;
-        }
-        if(ret) {
-            alert(fp_lang.saved);
-            repository_client.end(client_id, ret);
-        }
-    }
-}
-repository_client.parse_json = function(txt, source) {
-    try {
-        var ret = YAHOO.lang.JSON.parse(txt);
-    } catch(e) {
-        alert(fp_lang.invalidjson+' - |'+source+'| -'+this.stripHTML(txt));
-    }
-    return ret;
-}
-repository_client.search_form = function(client_id, id) {
-    var fp = repository_client.fp[client_id];
-    var params = [];
-    params['env']=fp.env;
-    params['sesskey']=moodle_cfg.sesskey;
-    params['client_id']=client_id;
-    params['ctx_id']=fp_config.contextid;
-    params['repo_id']=id;
-    var trans = YAHOO.util.Connect.asyncRequest('POST',
-            moodle_cfg.wwwroot+'/repository/ws.php?action=searchform',
-            repository_client.search_form_cb,
-            repository_client.postdata(params));
-}
-repository_client.search_form_cb = {
-success: function(o) {
-     var data = repository_client.parse_json(o.responseText, 'search_form_cb');
-     var el = document.getElementById('fp-search-dlg');
-     var fp = repository_client.fp[data.client_id];
-     if(el) {
-         el.innerHTML = '';
-     } else {
-         var el = document.createElement('DIV');
-         el.id = 'fp-search-dlg';
-     }
-     var div1 = document.createElement('DIV');
-     div1.className = 'hd';
-     div1.innerHTML = fp_lang.searching+"\"" + repository_listing[data.client_id][fp.fs.repo_id].name + '"';
-     var div2 = document.createElement('DIV');
-     div2.className = 'bd';
-     var sform = document.createElement('FORM');
-     sform.method = 'POST';
-     sform.id = "fp-search-form";
-     sform.action = moodle_cfg.wwwroot+'/repository/ws.php?action=search';
-     sform.innerHTML = data['form'];
-     div2.appendChild(sform);
-     el.appendChild(div1);
-     el.appendChild(div2);
-     document.body.appendChild(el);
-     var dlg_handler = function() {
-         var client_id=dlg_handler.client_id;
-         repository_client.fp[client_id].viewbar.set('disabled', false);
-         repository_client.loading(client_id, 'load');
-         YAHOO.util.Connect.setForm('fp-search-form', false, false);
-         this.cancel();
-         var url = moodle_cfg.wwwroot+'/repository/ws.php?action=search&env='+dlg_handler.env
-                +'&client_id='+client_id;
-         var trans = YAHOO.util.Connect.asyncRequest('POST', url,
-             repository_client.req_cb);
-     }
-     dlg_handler.client_id = data.client_id;
-     dlg_handler.env = fp.env;
-     var dlg = new YAHOO.widget.Dialog("fp-search-dlg",{
-        postmethod: 'async',
-        draggable: true,
-        width : "30em",
-        fixedcenter : true,
-        zindex: 766667,
-        visible : false,
-        constraintoviewport : true,
-        buttons : [
-        {
-            text:fp_lang.submit,
-            handler: dlg_handler,
-            isDefault:true
-        },
-        {text:fp_lang.cancel,handler:function(){this.cancel()}}
-        ]
-    });
-    dlg.render();
-    dlg.show();
-}
-}
-var mdl_in_array = function(el, arr) {
-    for(var i = 0, l = arr.length; i < l; i++) {
-        if(arr[i] == el) {
-            return true;
-        }
-    }
-    return false;
-}
-
-// will be called by filemanager or htmleditor
-function open_filepicker(id, params) {
-    var r = repository_client.fp[id];
-    if(!r) {
-        // passing parameters
-        r = new repository_client();
-        r.env = params.env;
-        r.target = params.target;
-        if(params.itemid){
-            r.itemid = params.itemid;
-        } else if(tinyMCE && id2itemid[tinyMCE.selectedInstance.editorId]){
-            r.itemid = id2itemid[tinyMCE.selectedInstance.editorId];
-        }
-        // setup callback function
-        if(params.callback) {
-            r.formcallback = params.callback;
-        } else {
-            r.formcallback = function() {};
-        }
-        // write back
-        repository_client.fp[id] = r;
-        // create file picker (html elements and events)
-        r.create_filepicker(id);
-    } else {
-        r.target = params.target;
-        r.show();
-    }
-    if(params.filetype) {
-        if(params.filetype == 'image') {
-            r.accepted_types = file_extensions.image;
-        } else if(params.filetype == 'video' || params.filetype== 'media') {
-            r.accepted_types = file_extensions.media;
-        } else if(params.filetype == 'file') {
-            r.accepted_types = '*';
-        }
-    } else {
-        r.accepted_types = '*';
-    }
-    return r;
-}
+var repository_listing={};var cached_client_id={};var file_extensions={};var new_filename="";var cached_id;var cached_repo_id;var repository_client=(function(){var a="2.0";var d=(10*2);function b(){alert(a)}function c(h,f){if(YAHOO.env.ua.ie==6){var g=document.getElementById("file-picker-"+h);g.style.width=f}}function e(){this.create_filepicker=function(o){var m=(YAHOO.env.ua.ie&&document.compatMode=="BackCompat");var j=(YAHOO.env.ua.ie==6||(YAHOO.env.ua.ie==7&&m));var n={label:fp_lang.listview,value:"l",onclick:{fn:repository_client.view_as_list,obj:o}};var f={label:fp_lang.thumbview,value:"t",onclick:{fn:repository_client.view_as_icons,obj:o}};document.body.className+=" yui-skin-sam";var h=document.createElement("DIV");h.id="file-picker-"+o;h.className="file-picker";this.client_id=o;document.body.appendChild(h);this.filepicker=new YAHOO.widget.Panel("file-picker-"+o,{draggable:true,close:true,underlay:"none",zindex:666666,xy:[50,YAHOO.util.Dom.getDocumentScrollTop()+20]});var l="";this.filepicker.client_id=o;this.filepicker.setHeader(fp_lang.title);this.filepicker.setBody('<div id="layout-'+o+'"></div>');this.filepicker.beforeRenderEvent.subscribe(function(){YAHOO.util.Event.onAvailable("layout-"+o,function(){l=new YAHOO.widget.Layout("layout-"+o,{height:480,width:700,units:[{position:"top",height:32,resize:false,body:'<div class="yui-buttongroup fp-viewbar" id="repo-viewbar-'+o+'"></div><div class="fp-searchbar" id="search-div-'+o+'"></div>',gutter:"2"},{position:"left",width:200,resize:true,scroll:true,body:'<ul class="fp-list" id="repo-list-'+o+'"></ul>',gutter:"0 5 0 2",minWidth:150,maxWidth:300},{position:"center",body:'<div class="fp-panel" id="panel-'+o+'"></div>',scroll:true,gutter:"0 2 0 0"}]});l.render()})});var g=new YAHOO.util.Resize("file-picker-"+o,{handles:["br"],autoRatio:true,status:true,minWidth:680,minHeight:400});c(o,"680px");g.on("resize",function(q){var r=q.height;var p=this.header.offsetHeight;var t=(r-p);var s=(m)?t:t-d;YAHOO.util.Dom.setStyle(this.body,"height",s+"px");c(this.client_id,"680px");if(j){this.sizeUnderlay();this.syncIframe()}l.set("height",s);l.set("width",(q.width-d));l.resize()},this.filepicker,true);repository_client.fp[o].viewbar=new YAHOO.widget.ButtonGroup({id:"btngroup-"+o,name:"buttons",disabled:true,container:"repo-viewbar-"+o});repository_client.fp[o].viewbar.addButtons([f,n]);this.print_listing();this.filepicker.render()};this.init_search=function(){var f=document.getElementById("search-div-"+this.client_id);f.innerHTML='<input id="search-input-'+this.client_id+'" /><button id="search-btn-'+this.client_id+'">'+fp_lang.federatedsearch+"</button>";var g=new YAHOO.util.Element("search-btn-"+this.client_id);g.client_id=this.client_id;var h=new YAHOO.util.Element("search-input-"+this.client_id);h.client_id=this.client_id;g.fnSearch=function(o){var m=new YAHOO.util.Element("search-input-"+this.client_id);var j=m.get("value");var n=repository_client.fp[this.client_id];var p=[];p.s=j;p.env=n.env;p.accepted_types=n.accepted_types;p.sesskey=moodle_cfg.sesskey;p.ctx_id=fp_config.contextid;p.client_id=this.client_id;repository_client.loading(this.client_id,"load");var l=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=gsearch",this.search_cb,repository_client.postdata(p))};g.on("contentReady",function(){g.on("click",this.fnSearch,this.input_keyword)});g.search_cb={success:function(p){var n=repository_client.parse_json(p.responseText,"global_search_cb");var j=new YAHOO.util.Element("panel-"+n.client_id);if(!n.list||n.list.length<1){j.get("element").innerHTML=fp_lang.noresult;return}var m=repository_client.fp[n.client_id];m.view_staus=0;m.fs=n.list;if(m.view_staus){repository_client.view_as_list(n.client_id,n.list)}else{repository_client.view_as_icons(n.client_id,n.list)}var l=new YAHOO.util.Element("search-input-"+n.client_id);l.set("value","")}};h.on("contentReady",function(){var j=document.getElementById("search-input-"+this.client_id);var l=new YAHOO.util.KeyListener(j,{keys:13},{fn:function(){this.fnSearch()},scope:g,correctScope:true});l.enable()})};this.print_listing=function(){var f=new YAHOO.util.Element("repo-list-"+this.client_id);f.set("innerHTML","");f.on("contentReady",function(){this.init_search();for(var m in repository_listing[this.client_id]){var l=repository_listing[this.client_id][m];var o=false;if(this.env=="editor"&&this.accepted_types!="*"){if(l.supported_types!="*"){for(var h in l.supported_types){if(mdl_in_array(l.supported_types[h],this.accepted_types)){o=true}}}}else{o=true}if(l.supported_types=="*"||o){var g=document.createElement("li");g.id="repo-"+this.client_id+"-"+l.id;var n=document.createElement("img");n.src=l.icon;n.width="16";n.height="16";var p=document.createElement("a");p.href="###";p.id="repo-call-"+this.client_id+"-"+l.id;p.appendChild(n);p.className="fp-repo-name";p.innerHTML+=" "+l.name;p.onclick=function(){var s=new RegExp("repo-call-(\\w+)-(\\d+)","i");var j=this.id.match(s);var v=j[1];var r=j[2];for(var u in repository_listing[v]){var t="repo-call-"+v+"-"+u;var q=document.getElementById(t);if(q){q.style.background="transparent"}}this.style.background="#CCC";repository_client.req(v,r,"")};g.appendChild(p);f.appendChild(g);l=null}}},this,true)};this.show=function(){this.print_listing();var f=new YAHOO.util.Element("panel-"+this.filepicker.client_id);f.get("element").innerHTML="";this.filepicker.show()};this.hide=function(){this.filepicker.hide()}}e.fp={};return e})();repository_client.req=function(g,f,d,c){repository_client.loading(g,"load");this.fp[g].viewbar.set("disabled",false);var b=repository_client.fp[g];var e=[];e.p=d;e.env=b.env;e.sesskey=moodle_cfg.sesskey;e.ctx_id=fp_config.contextid;e.client_id=g;e.repo_id=f;if(!!c){e.page=c}e.accepted_types=b.accepted_types;var a=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=list",this.req_cb,this.postdata(e))};repository_client.req_cb={success:function(d){var c=repository_client.parse_json(d.responseText,"req_cb");var b=repository_client.fp[c.client_id];var a=new YAHOO.util.Element("panel-"+c.client_id);if(c&&c.e){a.get("element").innerHTML=c.e;return}b.fs=c;if(!c){return}else{if(c.msg){repository_client.print_msg(c.msg)}else{if(c.iframe){repository_client.view_iframe(c.client_id)}else{if(c.login){repository_client.print_login(c.client_id,c)}else{if(c.list){if(b.view_status){repository_client.view_as_list(c.client_id,c.list)}else{repository_client.view_as_icons(c.client_id,c.list)}}}}}}}};repository_client.view_iframe=function(c){var a=repository_client.fp[c].fs;var b=new YAHOO.util.Element("panel-"+c);b.get("element").innerHTML='<iframe frameborder="0" width="98%" height="400px" src="'+a.iframe+'" />'};repository_client.req_search_results=function(g,f,d,c){this.fp[g].viewbar.set("disabled",false);var b=repository_client.fp[g];var e=[];e.p=d;e.env=b.env;e.sesskey=moodle_cfg.sesskey;e.ctx_id=fp_config.contextid;e.client_id=g;e.search_paging="true";e.repo_id=f;if(!!c){e.page=c}e.accepted_types=b.accepted_types;var a=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=search",this.req_cb,this.postdata(e))};repository_client.print_login=function(b,h){var n=h.login;var a=new YAHOO.util.Element("panel-"+b);var f="login";if(h.login_search_form){f="search"}var m='<div class="fp-login-form" onkeypress="repository_client.login_keypress(event,\''+f+"')\">";var e=false;this.fp[b].login=n;m+='<table width="100%">';for(var g in n){m+="<tr>";if(n[g].type=="popup"){m+='<td colspan="2"><p class="fp-popup">'+fp_lang.popup+"</p>";m+='<p class="fp-popup"><button onclick="repository_client.popup(\''+b+"', '"+n[g].url+"')\">"+fp_lang.login+"</button>";m+="</p></td>";e=true}else{if(n[g].type=="textarea"){m+='<td colspan="2"><p><textarea id="'+n[g].id+'" name="'+n[g].name+'"></textarea></p></td>'}else{var d="";var o="";var q="";if(n[g].id){d=' for="'+n[g].id+'"';o=' id="'+n[g].id+'"'}if(n[g].label){m+='<td align="right"><label'+d+">"+n[g].label+"</label>&nbsp;</td>"}if(n[g].value){q=' value="'+n[g].value+'"'}if(n[g].type=="radio"){var l=n[g].value.split("|");var j=n[g].value_label.split("|");m+='<td align="left">';for(var p in l){m+='<input type="'+n[g].type+'" name="'+n[g].name+'"'+o+' value="'+l[p]+'" />'+j[p]+"<br />"}m+="</td>"}else{m+='<td align="left"><input type="'+n[g].type+'" name="'+n[g].name+'"'+q+" /></td>"}}}m+="</tr>"}m+="</table>";var c=h.login_btn_label?h.login_btn_label:fp_lang.submit;if(h.login_search_form){m+='<p><input type="button" onclick="repository_client.search(\''+b+"', '"+h.repo_id+'\')" value="'+c+'" /></p>'}else{if(!e){m+='<p><input type="button" onclick="repository_client.login(\''+b+"', '"+h.repo_id+'\')" value="'+c+'" /></p>'}}m+="</div>";a.get("element").innerHTML=m;cached_id=b;cached_repo_id=h.repo_id};repository_client.login=function(g,d){var f=[];var e=this.fp[g].login;for(var a in e){if(e[a].type!="popup"){var c=document.getElementsByName(e[a].name)[0];f[e[a].name]="";if(c.type=="checkbox"){f[e[a].name]=c.checked}else{f[e[a].name]=c.value}}}f.env=this.fp[g].env;f.repo_id=d;f.client_id=g;f.ctx_id=fp_config.contextid;f.sesskey=moodle_cfg.sesskey;f.accepted_types=this.fp[g].accepted_types;this.loading(g,"load");var b=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=sign",this.req_cb,this.postdata(f))};repository_client.login_keypress=function(a,c){a=(a)?a:((window.event)?window.event:"");var b=a.keyCode?a.keyCode:a.which;if(b==13||b==10){if(c=="search"){repository_client.search(cached_id,cached_repo_id)}else{repository_client.login(cached_id,cached_repo_id)}}};repository_client.search=function(a,h){var c=[];var e=this.fp[a].login;for(var d in e){if(e[d].type!="popup"){var b=document.getElementsByName(e[d].name)[0];c[e[d].name]="";if(b.type=="checkbox"){c[e[d].name]=b.checked}else{if(b.type=="radio"){var f=document.getElementsByName(e[d].name);for(var g in f){if(f[g].checked){c[e[d].name]=f[g].value}}}else{c[e[d].name]=b.value}}}}c.env=this.fp[a].env;c.repo_id=h;c.client_id=a;c.ctx_id=fp_config.contextid;c.sesskey=moodle_cfg.sesskey;c.accepted_types=this.fp[a].accepted_types;this.loading(a,"load");var j=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=search",this.req_cb,this.postdata(c))};repository_client.loading=function(g,e,d){var b=new YAHOO.util.Element("panel-"+g);b.get("element").innerHTML="";var f=document.createElement("div");f.style.textAlign="center";var a=document.createElement("P");var c=document.createElement("IMG");if(e=="load"){c.src=moodle_cfg.pixpath+"/i/loading.gif";a.innerHTML=fp_lang.loading}else{c.src=moodle_cfg.pixpath+"/i/progressbar.gif";a.innerHTML=fp_lang.copying+" <strong>"+d+"</strong>"}f.appendChild(a);f.appendChild(c);b.get("element").appendChild(f)};repository_client.view_as_list=function(e,d){if(typeof e=="object"){e=d;list=repository_client.fp[e].fs.list}else{if(!d){list=repository_client.fp[e].fs.list}else{list=d}}var b=new YAHOO.util.Element("panel-"+e);var c=repository_client.fp[e];c.view_status=1;c.viewbar.check(1);repository_client.print_header(e);b.get("element").innerHTML+='<div id="treediv-'+e+'"></div>';var a=new YAHOO.widget.TreeView("treediv-"+e);a.dynload=function(j,f){var m={success:function(p){var n=repository_client.parse_json(p.responseText,"dynload");for(k in n.list){repository_client.buildtree(n.client_id,n.list[k],j)}p.argument.fnLoadComplete()},failure:function(n){alert(fp_lang.error+" - |dynload| -");n.argument.fnLoadComplete()},argument:{node:j,fnLoadComplete:f}};var g=repository_client.fp[j.client_id];var l=[];l.p=j.path;l.env=g.env;l.sesskey=moodle_cfg.sesskey;l.ctx_id=fp_config.contextid;l.repo_id=g.fs.repo_id;l.client_id=j.client_id;l.accepted_types=g.accepted_types;var h=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=list",m,repository_client.postdata(l))};a.dynload.client_id=e;if(c.fs.dynload){a.setDynamicLoad(a.dynload,1)}else{}for(k in list){repository_client.buildtree(e,list[k],a.getRoot())}a.draw();a.subscribe("clickEvent",function(f){if(f.node.isLeaf){repository_client.select_file(f.node.data.filename,f.node.data.value,f.node.data.icon,e,f.node.repo_id)}});repository_client.print_footer(e)};repository_client.buildtree=function(j,d,h){var a=repository_client.fp[j].fs;if(d.children){d.title="<i><u>"+d.title+"</u></i>"}var f={label:d.title,title:fp_lang.date+" "+d.date+fp_lang.size+" "+d.size,filename:d.title,value:d.source,icon:d.thumbnail,path:d.path};var b=new YAHOO.widget.TextNode(f,h,false);var e=new YAHOO.widget.Tooltip(b.labelElId,{context:b.labelElId,text:f.title});if(d.repo_id){b.repo_id=d.repo_id}else{b.repo_id=a.repo_id}if(d.children){if(d.expanded){b.expand()}b.isLeaf=false;b.client_id=j;if(d.path){b.path=d.path}else{b.path=""}for(var g in d.children){this.buildtree(j,d.children[g],b)}}else{b.isLeaf=true}};repository_client.select_file=function(h,c,g,d,m){var b=document.getElementById("fp-grid-panel-"+d);if(b){b.style.display="none"}var f=document.getElementById("fp-header-"+d);f.style.display="none";var j=document.getElementById("fp-footer-"+d);j.style.display="none";var l=document.getElementById("path-"+d);if(l){l.style.display="none"}var a=new YAHOO.util.Element("panel-"+d);var e='<div class="fp-rename-form">';e+='<p><img src="'+g+'" /></p>';e+='<p><label for="newname-'+d+'">'+fp_lang.saveas+"</label>";e+='<input type="text" id="newname-'+d+'" value="" /></p>';e+='<p><input type="hidden" id="fileurl-'+d+'" value="'+c+'" />';e+='<input type="button" onclick="repository_client.download(\''+d+"', '"+m+'\')" value="'+fp_lang.downbtn+'" />';e+='<input type="button" onclick="repository_client.viewfiles(\''+d+'\')" value="'+fp_lang.cancel+'" /></p>';e+="</div>";a.get("element").innerHTML+=e;document.getElementById("newname-"+d).value=h;var n=document.getElementById("treediv-"+d);if(n){n.style.display="none"}};repository_client.paging=function(g,f){var e="";this.fp[g].view_staus=0;var b=this.fp[g].fs;if(b.pages){e+='<div class="fp-paging" id="paging-'+f+'-"'+g+">";if(!b.search_result){var d="req"}else{var d="req_search_results"}e+=this.get_page_btn(g,d,1)+"1</a>";if(b.page+2>=b.pages){var a=b.pages}else{var a=b.page+2}if(b.page-2>=3){e+=" ... ";for(var c=b.page-2;c<a;c++){e+=this.get_page_btn(g,d,c);e+=String(c);e+="</a> "}}else{for(var c=2;c<a;c++){e+=this.get_page_btn(g,d,c);e+=String(c);e+="</a> "}}if(a==b.pages){e+=this.get_page_btn(g,d,b.pages)+b.pages+"</a>"}else{e+=repository_client.get_page_btn(g,d,a)+a+"</a>";e+=" ... "+repository_client.get_page_btn(g,d,b.pages)+b.pages+"</a>"}e+="</div>"}return e};repository_client.get_page_btn=function(e,c,d){var a=this.fp[e].fs;var b="";if(d==a.page){b='class="cur_page"'}str="<a "+b+' onclick="repository_client.'+c+"('"+e+"',"+a.repo_id+", "+d+", "+d+')" href="###">';return str};repository_client.path=function(h){var a=this.fp[h].fs;if(this.fp[h].view_status==1){return}var b=new YAHOO.util.Element("panel-"+h);var g=a.path;if(g&&g.length!=0){var d=document.createElement("DIV");d.id="path-"+h;d.className="fp-pathbar";b.get("element").appendChild(d);for(var e=0;e<a.path.length;e++){var f=document.createElement("A");f.href="###";f.innerHTML=a.path[e].name;f.id="path-"+h+"-"+a.repo_id;f.path=a.path[e].path;f.onclick=function(){var m=new RegExp("path-(\\w+)-(\\d+)","i");var j=this.id.match(m);var n=j[1];var l=j[2];repository_client.req(n,l,this.path)};var c=document.createElement("SPAN");c.innerHTML="/";d.appendChild(f);d.appendChild(c)}}};repository_client.print_header=function(c){var a=new YAHOO.util.Element("panel-"+c);var b='<div id="fp-header-'+c+'">';b+='<div class="fp-toolbar" id="repo-tb-'+c+'"></div>';if(this.fp[c].fs.pages<8){b+=this.paging(c,"header")}b+="</div>";a.set("innerHTML",b);this.path(c)};repository_client.view_as_icons=function(j,l){var n=null;if(typeof j=="object"){j=l;n=repository_client.fp[j].fs.list}else{if(!l){n=repository_client.fp[j].fs.list}else{n=l}}var o=repository_client.fp[j];o.view_status=0;o.viewbar.check(0);var b=document.getElementById("panel-"+j);var a=document.createElement("DIV");a.id="fp-grid-panel-"+j;repository_client.print_header(j);var m=0;for(k in n){var e=document.createElement("div");e.className="fp-grid";var q=document.createElement("div");q.id="grid-title-"+String(m);q.className="label";if(n[k].shorttitle){n[k].title=n[k].shorttitle}q.innerHTML+='<a href="###"><span>'+n[k].title+"</span></a>";if(n[k].thumbnail_width){e.style.width=n[k].thumbnail_width+"px";q.style.width=(n[k].thumbnail_width-10)+"px"}else{e.style.width=q.style.width="80px"}var d=document.createElement("DIV");d.style.textAlign="center";if(n[k].thumbnail_height){d.style.height=n[k].thumbnail_height+"px"}var h=document.createElement("img");h.src=n[k].thumbnail;if(n[k].thumbnail_alt){h.alt=n[k].thumbnail_alt}if(n[k].thumbnail_title){h.title=n[k].thumbnail_title}var p=document.createElement("A");p.href="###";p.id="img-id-"+String(m);if(n[k].url){e.innerHTML+='<p><a target="_blank" href="'+n[k].url+'">'+fp_lang.preview+"</a></p>"}p.appendChild(h);d.appendChild(p);e.appendChild(d);e.appendChild(q);a.appendChild(e);if(n[k].children){var c=new YAHOO.util.Element(p.id);c.path=n[k].path;var g=new YAHOO.util.Element(q.id);c.fs=n[k].children;c.on("contentReady",function(){this.on("click",function(){if(o.fs.dynload){var r=repository_client.fp[j].fs;var t=[];t.p=this.path;t.env=repository_client.fp[j].env;t.repo_id=r.repo_id;t.ctx_id=fp_config.contextid;t.sesskey=moodle_cfg.sesskey;t.accepted_types=repository_client.fp[j].accepted_types;t.client_id=j;repository_client.loading(j,"load");var s=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=list",repository_client.req_cb,repository_client.postdata(t))}else{repository_client.view_as_icons(j,this.fs)}})});g.on("contentReady",function(){this.on("click",function(){c.fireEvent("click")})})}else{var g=new YAHOO.util.Element(q.id);var f=new YAHOO.util.Element(p.id);g.filename=f.filename=n[k].title;g.value=f.value=n[k].source;g.icon=f.icon=n[k].thumbnail;if(o.fs.repo_id){g.repo_id=f.repo_id=o.fs.repo_id}else{if(n[k].repo_id){g.repo_id=f.repo_id=n[k].repo_id}else{g.repo_id=f.repo_id=""}}f.on("contentReady",function(){this.on("click",function(){repository_client.select_file(this.filename,this.value,this.icon,j,this.repo_id)})});g.on("contentReady",function(){this.on("click",function(){repository_client.select_file(this.filename,this.value,this.icon,j,this.repo_id)})})}m++}b.appendChild(a);repository_client.print_footer(j)};repository_client.print_footer=function(d){var f=this.fp[d].fs;var a=document.getElementById("panel-"+d);var g=document.createElement("DIV");g.id="fp-footer-"+d;g.innerHTML+=this.create_upload_form(d);g.innerHTML+=this.paging(d,"footer");a.appendChild(g);var b=document.getElementById("repo-tb-"+d);if(!f.nosearch){var l=document.createElement("A");l.href="###";l.innerHTML='<img src="'+moodle_cfg.pixpath+'/a/search.png" /> '+fp_lang.search;b.appendChild(l);l.onclick=function(){repository_client.search_form(d,f.repo_id)}}if(!f.norefresh){var e=document.createElement("A");e.href="###";e.innerHTML='<img src="'+moodle_cfg.pixpath+'/a/refresh.png" /> '+fp_lang.refresh;b.appendChild(e);e.onclick=function(){var n=[];n.env=f.env;n.sesskey=moodle_cfg.sesskey;n.ctx_id=fp_config.contextid;n.repo_id=f.repo_id;n.client_id=d;repository_client.loading(d,"load");var m=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=ccache",repository_client.req_cb,repository_client.postdata(n))}}if(f.manage){var h=document.createElement("A");h.innerHTML='<img src="'+moodle_cfg.pixpath+'/a/setting.png" /> '+fp_lang.mgr;h.href=f.manage;h.target="_blank";b.appendChild(h)}if(!f.nologin){var j=document.createElement("A");j.href="###";j.innerHTML='<img src="'+moodle_cfg.pixpath+'/a/logout.png" /> '+fp_lang.logout;b.appendChild(j);j.onclick=function(){repository_client.logout(d,f.repo_id)}}if(f.help){var c=document.createElement("A");c.href=f.help;c.target="_blank";c.innerHTML='<img src="'+moodle_cfg.pixpath+'/a/help.png" /> '+fp_lang.help;b.appendChild(c)}};repository_client.postdata=function(a){var b="";for(k in a){if(a[k] instanceof Array){for(i in a[k]){b+=(encodeURIComponent(k)+"[]="+encodeURIComponent(a[k][i]));b+="&"}}else{b+=encodeURIComponent(k)+"="+encodeURIComponent(a[k]);b+="&"}}return b};repository_client.stripHTML=function(c){var b=/<\S[^><]*>/g;var a=c.replace(b,"");return a};repository_client.popup=function(b,a){window.open(a,"repo_auth","location=0,status=0,scrollbars=0,width=500,height=300");cached_client_id=b;return true};function repository_callback(a){repository_client.req(cached_client_id,a,"")}repository_client.logout=function(d,b){var c=[];c.repo_id=b;c.client_id=d;var a=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=logout",repository_client.req_cb,repository_client.postdata(c))};repository_client.download=function(g,d){var a=repository_client.fp[g];var f=document.getElementById("newname-"+g).value;new_filename=f;var c=document.getElementById("fileurl-"+g).value;repository_client.loading(g,"download",f);var e=[];if(a.itemid){e.itemid=a.itemid}e.env=a.env;e.file=c;e.title=f;e.sesskey=moodle_cfg.sesskey;e.ctx_id=fp_config.contextid;e.repo_id=d;e.client_id=g;var b=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=download",repository_client.download_cb,repository_client.postdata(e))};repository_client.download_cb={success:function(c){var b=repository_client.parse_json(c.responseText,"download_cb");var a=new YAHOO.util.Element("panel-"+b.client_id);if(b&&b.e){a.get("element").innerHTML=b.e;return}repository_client.end(b.client_id,b)}};repository_client.end=function(c,b){var a=repository_client.fp[c];if(a.env=="filepicker"){a.target.value=b.id}else{if(a.env=="editor"){if(b.type=="link"){a.target.value=b.url+"#"+new_filename}else{a.target.value=b.url}a.target.onchange()}}a.formcallback(b);a.hide();repository_client.viewfiles(c)};repository_client.viewfiles=function(b){var a=repository_client.fp[b];if(a.view_status){repository_client.view_as_list(b)}else{repository_client.view_as_icons(b)}};repository_client.create_upload_form=function(d){var b="";var a=repository_client.fp[d].fs;if(a.upload){var c=a.upload.id+"_"+d;b+='<div id="'+c+'_div" class="fp-upload-form">';b+='<form id="'+c+'" onsubmit="return false">';b+='<label for="'+c+'_file">'+a.upload.label+": </label>";b+='<input type="file" id="'+c+'_file" name="repo_upload_file" />';b+='<p class="fp-upload-btn"><a href="###" onclick="return repository_client.upload(\''+d+"');\">"+fp_lang.upload+"</a></p>";b+="</form>";b+="</div>"}return b};repository_client.upload=function(e){var g=repository_client.fp[e];var l=repository_client.fp[e].fs;var b=l.upload.id+"_"+e;var h=document.getElementById(b);var j=document.getElementById(b+"_div");var f=document.getElementById(b+"_file");if(f.value!=""&&f.value!=null){var a=document.createElement("DIV");a.id=b+"_loading";a.style.textAlign="center";var c=document.createElement("IMG");c.src=moodle_cfg.pixpath+"/i/progressbar.gif";var n=document.createElement("p");n.innerHTML=fp_lang.uploading;a.appendChild(n);a.appendChild(c);j.appendChild(a);YAHOO.util.Connect.setForm(h,true,true);var m=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=upload&itemid="+g.itemid+"&sesskey="+moodle_cfg.sesskey+"&ctx_id="+fp_config.contextid+"&repo_id="+l.repo_id+"&client_id="+e,repository_client.upload_cb)}else{alert(fp_lang.filenotnull)}};repository_client.upload_cb={upload:function(c){var b=repository_client.parse_json(c.responseText,"upload");client_id=b.client_id;if(b&&b.e){var a=new YAHOO.util.Element("panel-"+client_id);a.get("element").innerHTML=b.e;return}if(b){alert(fp_lang.saved);repository_client.end(client_id,b)}}};repository_client.parse_json=function(a,c){try{var b=YAHOO.lang.JSON.parse(a)}catch(d){alert(fp_lang.invalidjson+" - |"+c+"| -"+this.stripHTML(a))}return b};repository_client.search_form=function(e,d){var a=repository_client.fp[e];var c=[];c.env=a.env;c.sesskey=moodle_cfg.sesskey;c.client_id=e;c.ctx_id=fp_config.contextid;c.repo_id=d;var b=YAHOO.util.Connect.asyncRequest("POST",moodle_cfg.wwwroot+"/repository/ws.php?action=searchform",repository_client.search_form_cb,repository_client.postdata(c))};repository_client.search_form_cb={success:function(b){var d=repository_client.parse_json(b.responseText,"search_form_cb");var c=document.getElementById("fp-search-dlg");var g=repository_client.fp[d.client_id];if(c){c.innerHTML=""}else{var c=document.createElement("DIV");c.id="fp-search-dlg"}var f=document.createElement("DIV");f.className="hd";f.innerHTML=fp_lang.searching+'"'+repository_listing[d.client_id][g.fs.repo_id].name+'"';var e=document.createElement("DIV");e.className="bd";var a=document.createElement("FORM");a.method="POST";a.id="fp-search-form";a.action=moodle_cfg.wwwroot+"/repository/ws.php?action=search";a.innerHTML=d.form;e.appendChild(a);c.appendChild(f);c.appendChild(e);document.body.appendChild(c);var j=function(){var n=j.client_id;repository_client.fp[n].viewbar.set("disabled",false);repository_client.loading(n,"load");YAHOO.util.Connect.setForm("fp-search-form",false,false);this.cancel();var l=moodle_cfg.wwwroot+"/repository/ws.php?action=search&env="+j.env+"&client_id="+n;var m=YAHOO.util.Connect.asyncRequest("POST",l,repository_client.req_cb)};j.client_id=d.client_id;j.env=g.env;var h=new YAHOO.widget.Dialog("fp-search-dlg",{postmethod:"async",draggable:true,width:"30em",fixedcenter:true,zindex:766667,visible:false,constraintoviewport:true,buttons:[{text:fp_lang.submit,handler:j,isDefault:true},{text:fp_lang.cancel,handler:function(){this.cancel()}}]});h.render();h.show()}};var mdl_in_array=function(d,a){for(var c=0,b=a.length;c<b;c++){if(a[c]==d){return true}}return false};function open_filepicker(c,b){var a=repository_client.fp[c];if(!a){a=new repository_client();a.env=b.env;a.target=b.target;if(b.itemid){a.itemid=b.itemid}else{if(tinyMCE&&id2itemid[tinyMCE.selectedInstance.editorId]){a.itemid=id2itemid[tinyMCE.selectedInstance.editorId]}}if(b.callback){a.formcallback=b.callback}else{a.formcallback=function(){}}repository_client.fp[c]=a;a.create_filepicker(c)}else{a.target=b.target;a.show()}if(b.filetype){if(b.filetype=="image"){a.accepted_types=file_extensions.image}else{if(b.filetype=="video"||b.filetype=="media"){a.accepted_types=file_extensions.media}else{if(b.filetype=="file"){a.accepted_types="*"}}}}else{a.accepted_types="*"}return a};
\ No newline at end of file
diff --git a/repository/repository.src.js b/repository/repository.src.js
new file mode 100644 (file)
index 0000000..9eaec86
--- /dev/null
@@ -0,0 +1,1145 @@
+// $Id$
+///////////////////////////////////////////////////////////////////////////
+//                                                                       //
+//       Don't modify this file unless you know how it works             //
+//                                                                       //
+///////////////////////////////////////////////////////////////////////////
+/**
+ * repository_client is a javascript class, it contains several static 
+ * methods you can call it directly without creating an instance.
+ * If you are going to create a file picker, you need create an instance
+ * repo = new repository_client();
+ */
+
+var repository_listing = {};
+var cached_client_id = {};
+var file_extensions = {};
+/* when selected a file, filename will be cached in this varible */
+var new_filename = '';
+// will be used by login form
+var cached_id;
+var cached_repo_id;
+// repository_client has static functions
+var repository_client = (function(){
+    // private static field
+    var version = '2.0';
+    var PANEL_BODY_PADDING = (10*2);
+    // private static methods
+    function help() {
+        alert(version);
+    }
+    // a hack to fix ie6 bug
+    function ie6_fix_width(id, width) {
+        if(YAHOO.env.ua.ie == 6){
+            var fp_title = document.getElementById('file-picker-'+id);
+            fp_title.style.width = width;
+        }
+    }
+    function $() {
+        // public methods of filepicker instance
+        this.create_filepicker = function(client_id) {
+            var IE_QUIRKS = (YAHOO.env.ua.ie && document.compatMode == "BackCompat");
+            var IE_SYNC = (YAHOO.env.ua.ie == 6 || (YAHOO.env.ua.ie == 7 && IE_QUIRKS));
+            var btn_listing = {label: fp_lang.listview, value: 'l',
+                onclick: {fn: repository_client.view_as_list, obj:client_id}};
+            var btn_icons = {label: fp_lang.thumbview, value: 't',
+                onclick: {fn: repository_client.view_as_icons, obj:client_id}};
+            document.body.className += ' yui-skin-sam';
+            var el = document.createElement('DIV');
+            el.id = 'file-picker-'+client_id;
+            el.className = 'file-picker';
+            this.client_id = client_id;
+            document.body.appendChild(el);
+            this.filepicker = new YAHOO.widget.Panel('file-picker-' + client_id, {
+                draggable: true,
+                close: true,
+                underlay: 'none',
+                zindex: 666666,
+                xy: [50, YAHOO.util.Dom.getDocumentScrollTop()+20]
+            });
+            var layout = '';
+            this.filepicker.client_id = client_id;
+            this.filepicker.setHeader(fp_lang['title']);
+            this.filepicker.setBody('<div id="layout-'+client_id+'"></div>');
+            this.filepicker.beforeRenderEvent.subscribe(function() {
+                YAHOO.util.Event.onAvailable('layout-'+client_id, function() {
+                    layout = new YAHOO.widget.Layout('layout-'+client_id, {
+                        height: 480, width: 700,
+                        units: [
+                        {position: 'top', height: 32, resize: false,
+                        body:'<div class="yui-buttongroup fp-viewbar" id="repo-viewbar-'+client_id+'"></div><div class="fp-searchbar" id="search-div-'+client_id+'"></div>', gutter: '2'},
+                        {position: 'left', width: 200, resize: true, scroll:true,
+                        body:'<ul class="fp-list" id="repo-list-'+client_id+'"></ul>', gutter: '0 5 0 2', minWidth: 150, maxWidth: 300 },
+                        {position: 'center', body: '<div class="fp-panel" id="panel-'+client_id+'"></div>',
+                        scroll: true, gutter: '0 2 0 0' }
+                        ]
+                    });
+                    layout.render();
+                });
+            });
+            var resize = new YAHOO.util.Resize('file-picker-'+client_id, {
+                handles: ['br'],
+                autoRatio: true,
+                status: true,
+                minWidth: 680,
+                minHeight: 400
+            });
+            ie6_fix_width(client_id, '680px');
+            resize.on('resize', function(args) {
+                var panelHeight = args.height;
+                var headerHeight = this.header.offsetHeight; // Content + Padding + Border
+                var bodyHeight = (panelHeight - headerHeight);
+                var bodyContentHeight = (IE_QUIRKS) ? bodyHeight : bodyHeight - PANEL_BODY_PADDING;
+                YAHOO.util.Dom.setStyle(this.body, 'height', bodyContentHeight + 'px');
+                ie6_fix_width(this.client_id, '680px');
+                if (IE_SYNC) {
+                    this.sizeUnderlay();
+                    this.syncIframe();
+                }
+                layout.set('height', bodyContentHeight);
+                layout.set('width', (args.width - PANEL_BODY_PADDING));
+                layout.resize();
+            }, this.filepicker, true);
+            repository_client.fp[client_id].viewbar = new YAHOO.widget.ButtonGroup({
+                id: 'btngroup-'+client_id,
+                name: 'buttons',
+                disabled: true,
+                container: 'repo-viewbar-'+client_id
+            });
+            repository_client.fp[client_id].viewbar.addButtons([btn_icons, btn_listing]);
+            this.print_listing();
+            this.filepicker.render();
+        }
+        this.init_search = function() {
+            var searchbar = document.getElementById('search-div-'+this.client_id);
+            searchbar.innerHTML = '<input id="search-input-'+this.client_id+'" /><button id="search-btn-'+this.client_id+'">'+fp_lang.federatedsearch+'</button>';
+            var search_btn = new YAHOO.util.Element('search-btn-'+this.client_id);
+            search_btn.client_id = this.client_id;
+            var input_keyword = new YAHOO.util.Element('search-input-'+this.client_id);
+            input_keyword.client_id = this.client_id;
+            search_btn.fnSearch = function(e) {
+                var el = new YAHOO.util.Element('search-input-'+this.client_id)
+                var keyword = el.get('value');
+                var r = repository_client.fp[this.client_id];
+                var params = [];
+                params['s'] = keyword;
+                params['env']=r.env;
+                params['accepted_types'] = r.accepted_types;
+                params['sesskey']=moodle_cfg.sesskey;
+                params['ctx_id']=fp_config.contextid;
+                params['client_id']=this.client_id;
+                repository_client.loading(this.client_id, 'load');
+                var trans = YAHOO.util.Connect.asyncRequest('POST',
+                    moodle_cfg.wwwroot+'/repository/ws.php?action=gsearch', this.search_cb, repository_client.postdata(params));
+            }
+            search_btn.on('contentReady', function() {
+                search_btn.on('click', this.fnSearch, this.input_keyword);
+            });
+            search_btn.search_cb={
+                success: function(o) {
+                    var data = repository_client.parse_json(o.responseText, 'global_search_cb');
+                    var panel = new YAHOO.util.Element('panel-'+data.client_id);
+                    if(!data.list || data.list.length<1){
+                        panel.get('element').innerHTML = fp_lang.noresult;
+                        return;
+                    }
+                    var r = repository_client.fp[data.client_id];
+                    r.view_staus = 0;
+                    r.fs = data.list;
+                    if(r.view_staus) {
+                        repository_client.view_as_list(data.client_id, data.list);
+                    } else {
+                        repository_client.view_as_icons(data.client_id, data.list);
+                    }
+                    var el = new YAHOO.util.Element('search-input-'+data.client_id)
+                    el.set('value', '');
+                }
+            }
+            input_keyword.on('contentReady', function() {
+                var scope = document.getElementById('search-input-'+this.client_id);
+                var k1 = new YAHOO.util.KeyListener(scope, {keys:13}, {fn:function(){this.fnSearch()},scope:search_btn, correctScope: true});
+                k1.enable();
+            });
+        }
+        this.print_listing = function() {
+            var container = new YAHOO.util.Element('repo-list-'+this.client_id);
+            container.set('innerHTML', '');
+            container.on('contentReady', function() {
+                this.init_search();    
+                for(var i in repository_listing[this.client_id]) {
+                    var repo = repository_listing[this.client_id][i];
+                    var support = false;
+                    if(this.env=='editor' && this.accepted_types != '*'){
+                        if(repo.supported_types!='*'){
+                            for (var j in repo.supported_types){
+                                if(mdl_in_array(repo.supported_types[j], this.accepted_types)){
+                                    support = true;
+                                }
+                            }
+                        }
+                    }else{
+                        support = true;
+                    }
+                    if(repo.supported_types == '*' || support){
+                        var li = document.createElement('li');
+                        li.id = 'repo-'+this.client_id+'-'+repo.id;
+                        var icon = document.createElement('img');
+                        icon.src = repo.icon;
+                        icon.width = '16';
+                        icon.height = '16';
+                        var link = document.createElement('a');
+                        link.href = '###';
+                        link.id = 'repo-call-'+this.client_id+'-'+repo.id;
+                        link.appendChild(icon);
+                        link.className = 'fp-repo-name';
+                        link.innerHTML += ' '+repo.name;
+                        link.onclick = function() {
+                            var re = new RegExp("repo-call-(\\w+)-(\\d+)", "i");
+                            var result = this.id.match(re);
+                            var client_id = result[1];
+                            var repo_id = result[2];
+                            // high light currect selected repository
+                            for(var cc in repository_listing[client_id]){
+                                var tmp_id = 'repo-call-'+client_id+'-'+ cc;
+                                var el = document.getElementById(tmp_id);
+                                if(el){
+                                    el.style.background = 'transparent';
+                                }
+                            }
+                            this.style.background = '#CCC';
+                            repository_client.req(client_id, repo_id, '');
+                        }
+                        li.appendChild(link);
+                        container.appendChild(li);
+                        repo = null;
+                    }
+                }
+            }, this, true);
+
+        }
+        this.show = function(){
+            this.print_listing();
+            var panel = new YAHOO.util.Element('panel-'+this.filepicker.client_id);
+            panel.get('element').innerHTML = '';
+            this.filepicker.show();
+        }
+        this.hide = function(){
+            this.filepicker.hide();
+        }
+    }
+    // all filepicker instances
+    $.fp = {};
+    return $;
+})();
+// public static method
+// may be called outside yui
+repository_client.req = function(client_id, id, path, page) {
+    repository_client.loading(client_id, 'load');
+    this.fp[client_id].viewbar.set('disabled', false);
+    var r = repository_client.fp[client_id];
+    var params = [];
+    params['p'] = path;
+    params['env']=r.env;
+    params['sesskey']=moodle_cfg.sesskey;
+    params['ctx_id']=fp_config.contextid;
+    params['client_id'] = client_id;
+    params['repo_id']=id;
+    if (!!page) { // convert page to boolean value
+        params['page']=page;
+    }
+    params['accepted_types'] = r.accepted_types;
+    var trans = YAHOO.util.Connect.asyncRequest('POST', moodle_cfg.wwwroot+'/repository/ws.php?action=list', this.req_cb, this.postdata(params));
+}
+
+repository_client.req_cb = {
+    success: function(o){
+         var data = repository_client.parse_json(o.responseText, 'req_cb');    
+         var repo = repository_client.fp[data.client_id];
+         var panel = new YAHOO.util.Element('panel-'+data.client_id);
+         if(data && data.e) {
+             panel.get('element').innerHTML = data.e;
+             return;
+         }
+         // save data
+         repo.fs = data;
+         if(!data) {
+             return;
+         }else if(data.msg){
+             repository_client.print_msg(data.msg);
+         }else if(data.iframe) {
+             repository_client.view_iframe(data.client_id);
+         }else if(data.login) {
+             repository_client.print_login(data.client_id, data);
+         }else if(data.list) {
+             if(repo.view_status) {
+                 repository_client.view_as_list(data.client_id, data.list);
+             } else {
+                 repository_client.view_as_icons(data.client_id, data.list);
+             }
+         }
+     }
+}
+repository_client.view_iframe = function(client_id) {
+    var fs = repository_client.fp[client_id].fs;
+    var panel = new YAHOO.util.Element('panel-'+client_id);
+    panel.get('element').innerHTML = "<iframe frameborder=\"0\" width=\"98%\" height=\"400px\" src=\""+fs.iframe+"\" />";
+}
+repository_client.req_search_results = function(client_id, id, path, page) {
+    this.fp[client_id].viewbar.set('disabled', false);
+    var r = repository_client.fp[client_id];
+    var params = [];
+    params['p'] = path;
+    params['env']=r.env;
+    params['sesskey']=moodle_cfg.sesskey;
+    params['ctx_id']=fp_config.contextid;
+    params['client_id'] = client_id;
+    params['search_paging']='true';
+    params['repo_id']=id;
+    if (!!page) { // convert page to boolean value
+        params['page']=page;
+    }
+    params['accepted_types'] = r.accepted_types;
+    var trans = YAHOO.util.Connect.asyncRequest('POST', moodle_cfg.wwwroot+'/repository/ws.php?action=search', this.req_cb, this.postdata(params));
+}
+
+repository_client.print_login = function(id, data) {
+    var login = data.login;
+    var panel = new YAHOO.util.Element('panel-'+id);
+    var action = 'login';
+    if (data['login_search_form']) {
+        action='search';
+    }
+    var str = '<div class="fp-login-form" onkeypress="repository_client.login_keypress(event,\''+action+'\')">';
+    var has_pop = false;
+    this.fp[id].login = login;
+    str +='<table width="100%">';
+    for(var k in login) {
+        str +='<tr>';
+        if(login[k].type=='popup') {
+            str += '<td colspan="2"><p class="fp-popup">'+fp_lang.popup+'</p>';
+            str += '<p class="fp-popup"><button onclick="repository_client.popup(\''+id+'\', \''+login[k].url+'\')">'+fp_lang.login+'</button>';
+            str += '</p></td>';
+            has_pop = true;
+        }else if(login[k].type=='textarea') {
+            str += '<td colspan="2"><p><textarea id="'+login[k].id+'" name="'+login[k].name+'"></textarea></p></td>';
+        }else{
+            var label_id = '';
+            var field_id = '';
+            var field_value = '';
+            if(login[k].id) {
+                label_id = ' for="'+login[k].id+'"';
+                field_id = ' id="'+login[k].id+'"';
+            }
+            if (login[k].label) {
+                str += '<td align="right"><label'+label_id+'>'+login[k].label+'</label>&nbsp;</td>';
+            }
+            if(login[k].value) {
+                field_value = ' value="'+login[k].value+'"';
+            }
+            if(login[k].type=='radio'){
+                var list = login[k].value.split('|');
+                var labels = login[k].value_label.split('|');
+                str += '<td align="left">';
+                for(var item in list) {
+                    str +='<input type="'+login[k].type+'"'+' name="'+login[k].name+'"'+
+                        field_id+' value="'+list[item]+'" />'+labels[item]+'<br />'; 
+                }
+                str += '</td>';
+            }else{
+                str += '<td align="left"><input type="'+login[k].type+'"'+' name="'+login[k].name+'"'+field_value+' /></td>';
+            }
+        }
+        str +='</tr>';
+    }
+    str +='</table>';
+    var btn_label = data['login_btn_label']?data['login_btn_label']:fp_lang.submit;
+    if (data['login_search_form']) {
+        str += '<p><input type="button" onclick="repository_client.search(\''+id+'\', \''+data.repo_id+'\')" value="'+btn_label+'" /></p>';
+    } else {
+        if(!has_pop) {
+            str += '<p><input type="button" onclick="repository_client.login(\''+id+'\', \''+data.repo_id+'\')" value="'+btn_label+'" /></p>';
+        }
+    }
+    str += '</div>';
+    panel.get('element').innerHTML = str;
+    cached_id=id;
+    cached_repo_id=data.repo_id;
+}
+repository_client.login = function(id, repo_id) {
+    var params = [];
+    var data = this.fp[id].login;
+    for (var k in data) {
+        if(data[k].type!='popup') {
+            var el = document.getElementsByName(data[k].name)[0];
+            params[data[k].name] = '';
+            if(el.type == 'checkbox') {
+                params[data[k].name] = el.checked;
+            } else {
+                params[data[k].name] = el.value;
+            }
+        }
+    }
+    params['env'] = this.fp[id].env;
+    params['repo_id'] = repo_id;
+    params['client_id'] = id;
+    params['ctx_id'] = fp_config.contextid;
+    params['sesskey'] = moodle_cfg.sesskey;
+    params['accepted_types'] = this.fp[id].accepted_types;
+    this.loading(id, 'load');
+    var trans = YAHOO.util.Connect.asyncRequest('POST',
+            moodle_cfg.wwwroot+'/repository/ws.php?action=sign', this.req_cb, this.postdata(params));
+}
+repository_client.login_keypress = function(evt,action) {
+    evt = (evt) ? evt : ((window.event) ? window.event : "")
+    var key = evt.keyCode?evt.keyCode:evt.which;
+    if(key == 13 || key == 10){
+        if(action=='search'){
+            repository_client.search(cached_id, cached_repo_id);
+        } else {
+            repository_client.login(cached_id, cached_repo_id);
+        }
+    }
+}
+repository_client.search = function(id, repo_id) {
+    var params = [];
+    var data = this.fp[id].login;
+    for (var k in data) {
+        if(data[k].type!='popup') {
+            var el = document.getElementsByName(data[k].name)[0];
+            params[data[k].name] = '';
+            if(el.type == 'checkbox') {
+                params[data[k].name] = el.checked;
+            } else if(el.type == 'radio') {
+                var tmp = document.getElementsByName(data[k].name);
+                for(var i in tmp) {
+                    if (tmp[i].checked) {
+                        params[data[k].name] = tmp[i].value;
+                    }
+                }
+            } else {
+                params[data[k].name] = el.value;
+            }
+        }
+    }
+    params['env'] = this.fp[id].env;
+    params['repo_id'] = repo_id;
+    params['client_id'] = id;
+    params['ctx_id'] = fp_config.contextid;
+    params['sesskey'] = moodle_cfg.sesskey;
+    params['accepted_types'] = this.fp[id].accepted_types;
+    this.loading(id, 'load');
+    var trans = YAHOO.util.Connect.asyncRequest('POST',
+            moodle_cfg.wwwroot+'/repository/ws.php?action=search', this.req_cb, this.postdata(params));
+}
+repository_client.loading = function(id, type, name) {
+    var panel = new YAHOO.util.Element('panel-'+id);
+    panel.get('element').innerHTML = '';
+    var content = document.createElement('div');
+    content.style.textAlign='center';
+    var para = document.createElement('P');
+    var img = document.createElement('IMG');
+    if(type=='load') {
+        img.src = moodle_cfg.pixpath+'/i/loading.gif';
+        para.innerHTML = fp_lang.loading;
+    }else{
+        img.src = moodle_cfg.pixpath+'/i/progressbar.gif';
+        para.innerHTML = fp_lang.copying+' <strong>'+name+'</strong>';
+    }
+    content.appendChild(para);
+    content.appendChild(img);
+    panel.get('element').appendChild(content);
+}
+repository_client.view_as_list = function(client_id, data) {
+    if (typeof client_id == 'object') {
+        // click button
+        client_id = data;
+        list = repository_client.fp[client_id].fs.list;
+    } else if(!data) {
+        // from viewfiles
+        list = repository_client.fp[client_id].fs.list;
+    }else{
+        // from callback 
+        list = data;
+    }
+    var panel = new YAHOO.util.Element('panel-'+client_id);
+    var fp = repository_client.fp[client_id];
+    fp.view_status = 1;
+    fp.viewbar.check(1);
+    repository_client.print_header(client_id);
+    panel.get('element').innerHTML += '<div id="treediv-'+client_id+'"></div>';
+    var tree = new YAHOO.widget.TreeView('treediv-'+client_id);
+    tree.dynload = function (node, fnLoadComplete) {
+        var callback = {
+            success: function(o) {
+                 var json = repository_client.parse_json(o.responseText, 'dynload');    
+                 for(k in json.list) {
+                     repository_client.buildtree(json.client_id, json.list[k], node);
+                 }
+                 o.argument.fnLoadComplete();
+            },
+            failure:function(oResponse) {
+                alert(fp_lang.error+' - |dynload| -');
+                oResponse.argument.fnLoadComplete();
+            },
+            argument:{"node":node, "fnLoadComplete": fnLoadComplete}
+        }
+        var fp = repository_client.fp[node.client_id];
+        var params = [];
+        params['p']=node.path;
+        params['env']=fp.env;
+        params['sesskey']=moodle_cfg.sesskey;
+        params['ctx_id']=fp_config.contextid;
+        params['repo_id']=fp.fs.repo_id;
+        params['client_id']=node.client_id;
+        params['accepted_types']=fp.accepted_types;
+        var trans = YAHOO.util.Connect.asyncRequest('POST',
+                moodle_cfg.wwwroot+'/repository/ws.php?action=list',callback,repository_client.postdata(params));
+    }
+    tree.dynload.client_id = client_id;
+    if(fp.fs.dynload) {
+        tree.setDynamicLoad(tree.dynload, 1);
+    } else {
+    }
+    for(k in list) {
+        repository_client.buildtree(client_id, list[k], tree.getRoot());
+    }
+    tree.draw();
+    tree.subscribe('clickEvent', function(e){
+        if(e.node.isLeaf){
+            repository_client.select_file(e.node.data.filename, e.node.data.value, e.node.data.icon, client_id, e.node.repo_id);
+        }
+    });
+    repository_client.print_footer(client_id);
+}
+repository_client.buildtree = function(client_id, node, level) {
+    var fs = repository_client.fp[client_id].fs;
+    if(node.children) {
+        node.title = '<i><u>'+node.title+'</u></i>';
+    }
+    var info = {
+        label:node.title,
+        title:fp_lang.date+' '+node.date+fp_lang.size+' '+node.size,
+        filename:node.title,
+        value:node.source,
+        icon:node.thumbnail,
+        path:node.path
+    };
+    var tmpNode = new YAHOO.widget.TextNode(info, level, false);
+    var tooltip = new YAHOO.widget.Tooltip(tmpNode.labelElId, {
+        context:tmpNode.labelElId, text:info.title});
+    if(node.repo_id) {
+        tmpNode.repo_id=node.repo_id;
+    }else{
+        tmpNode.repo_id=fs.repo_id;
+    }
+    if(node.children) {
+        if(node.expanded) {
+            tmpNode.expand();
+        }
+        tmpNode.isLeaf = false;
+        tmpNode.client_id = client_id;
+        if (node.path) {
+            tmpNode.path = node.path;
+        } else {
+            tmpNode.path = '';
+        }
+        for(var c in node.children) {
+            this.buildtree(client_id, node.children[c], tmpNode);
+        }
+    } else {
+        tmpNode.isLeaf = true;
+    }
+}
+repository_client.select_file = function(oldname, url, icon, client_id, repo_id) {
+    var thumbnail = document.getElementById('fp-grid-panel-'+client_id);
+    if(thumbnail){
+        thumbnail.style.display = 'none';
+    }
+    var header = document.getElementById('fp-header-'+client_id);
+    header.style.display = 'none';
+    var footer = document.getElementById('fp-footer-'+client_id);
+    footer.style.display = 'none';
+    var pathbar = document.getElementById('path-'+client_id);
+    if(pathbar){
+        pathbar.style.display = 'none';
+    }
+    var panel = new YAHOO.util.Element('panel-'+client_id);
+    var html = '<div class="fp-rename-form">';
+    html += '<p><img src="'+icon+'" /></p>';
+    html += '<p><label for="newname-'+client_id+'">'+fp_lang.saveas+'</label>';
+    html += '<input type="text" id="newname-'+client_id+'" value="" /></p>';
+    html += '<p><input type="hidden" id="fileurl-'+client_id+'" value="'+url+'" />';
+    html += '<input type="button" onclick="repository_client.download(\''+client_id+'\', \''+repo_id+'\')" value="'+fp_lang.downbtn+'" />';
+    html += '<input type="button" onclick="repository_client.viewfiles(\''+client_id+'\')" value="'+fp_lang.cancel+'" /></p>';
+    html += '</div>';
+    panel.get('element').innerHTML += html;
+    /* to deal with double quote, single quote, we need to use javascript change value */
+    document.getElementById('newname-'+client_id).value = oldname;
+    var tree = document.getElementById('treediv-'+client_id);
+    if(tree){
+        tree.style.display = 'none';
+    }
+}
+repository_client.paging = function(client_id, id) {
+    var str = '';
+    this.fp[client_id].view_staus = 0;
+    var fs = this.fp[client_id].fs;
+    if(fs.pages) {
+        str += '<div class="fp-paging" id="paging-'+id+'-"'+client_id+'>';
+        if(!fs.search_result){
+            var action = 'req';
+        } else {
+            var action = 'req_search_results';
+        }
+        str += this.get_page_btn(client_id, action, 1)+'1</a>';
+
+        if (fs.page+2>=fs.pages) {
+            var max = fs.pages;
+        } else {
+            var max = fs.page+2;
+        }
+        if (fs.page-2 >= 3) {
+            str += ' ... ';
+            for(var i=fs.page-2; i<max; i++) {
+                str += this.get_page_btn(client_id, action, i);
+                str += String(i);
+                str += '</a> ';
+            }
+        } else {
+            for(var i = 2; i < max; i++) {
+                str += this.get_page_btn(client_id, action, i);
+                str += String(i);
+                str += '</a> ';
+            }
+        }
+        if (max==fs.pages) {
+            str += this.get_page_btn(client_id, action, fs.pages)+fs.pages+'</a>';
+        } else {
+            str += repository_client.get_page_btn(client_id, action, max)+max+'</a>';
+            str += ' ... '+repository_client.get_page_btn(client_id, action, fs.pages)+fs.pages+'</a>';
+        }
+        str += '</div>';
+    }
+    return str;
+}
+repository_client.get_page_btn = function(client_id, type, page) {
+    var fs = this.fp[client_id].fs;
+    var css = '';
+    if (page == fs.page) {
+        css = 'class="cur_page"';
+    }
+    str = '<a '+css+' onclick="repository_client.'+type+'(\''+client_id+'\','+fs.repo_id+', '+page+', '+page+')" href="###">';
+    return str;
+}
+repository_client.path = function(client_id) {
+    var fs = this.fp[client_id].fs;
+    // if this is listing view
+    if(this.fp[client_id].view_status == 1) {
+        return;
+    }
+    var panel = new YAHOO.util.Element('panel-'+client_id);
+    var p = fs.path;
+    if(p && p.length!=0) {
+        var oDiv = document.createElement('DIV');
+        oDiv.id = "path-"+client_id;
+        oDiv.className = "fp-pathbar";
+        panel.get('element').appendChild(oDiv);
+        for(var i = 0; i < fs.path.length; i++) {
+            var link = document.createElement('A');
+            link.href = "###";
+            link.innerHTML = fs.path[i].name;
+            link.id = 'path-'+client_id+'-'+fs.repo_id;
+            link.path=fs.path[i].path;
+            link.onclick = function() {
+                var re = new RegExp("path-(\\w+)-(\\d+)", "i");
+                var result = this.id.match(re);
+                var client_id = result[1];
+                var repo_id = result[2];
+                repository_client.req(client_id, repo_id, this.path);
+            }
+            var sep = document.createElement('SPAN');
+            sep.innerHTML = '/';
+            oDiv.appendChild(link);
+            oDiv.appendChild(sep);
+        }
+    }
+}
+repository_client.print_header = function(client_id) {
+    var panel = new YAHOO.util.Element('panel-'+client_id);
+    var str = '<div id="fp-header-'+client_id+'">';
+    str += '<div class="fp-toolbar" id="repo-tb-'+client_id+'"></div>';
+    if(this.fp[client_id].fs.pages < 8){
+        str += this.paging(client_id, 'header');
+    }
+    str += '</div>';
+    panel.set('innerHTML', str);
+    this.path(client_id);
+}
+repository_client.view_as_icons = function(client_id, data) {
+    var list = null;
+    if (typeof client_id == 'object') {
+        // click button
+        client_id = data;
+        list = repository_client.fp[client_id].fs.list;
+    } else if(!data) {
+        // from viewfiles
+        list = repository_client.fp[client_id].fs.list;
+    }else{
+        // from callback
+        list = data;
+    }
+    var fp = repository_client.fp[client_id];
+    fp.view_status = 0;
+    fp.viewbar.check(0);
+    var container = document.getElementById('panel-'+client_id);
+    var panel = document.createElement('DIV');
+    panel.id = 'fp-grid-panel-'+client_id;
+    repository_client.print_header(client_id);
+    var count = 0;
+    for(k in list) {
+        // the container
+        var el = document.createElement('div');
+        el.className='fp-grid';
+        // the file name
+        var title = document.createElement('div');
+        title.id = 'grid-title-'+String(count);
+        title.className = 'label';
+        if (list[k].shorttitle) {
+            list[k].title = list[k].shorttitle;
+        }
+        title.innerHTML += '<a href="###"><span>'+list[k].title+"</span></a>";
+        if(list[k].thumbnail_width){
+            el.style.width = list[k].thumbnail_width+'px';
+            title.style.width = (list[k].thumbnail_width-10)+'px';
+        } else {
+            el.style.width = title.style.width = '80px';
+        }
+        var frame = document.createElement('DIV');
+        frame.style.textAlign='center';
+        if(list[k].thumbnail_height){
+            frame.style.height = list[k].thumbnail_height+'px';
+        }
+        var img = document.createElement('img');
+        img.src = list[k].thumbnail;
+        if(list[k].thumbnail_alt) {
+            img.alt = list[k].thumbnail_alt;
+        }
+        if(list[k].thumbnail_title) {
+            img.title = list[k].thumbnail_title;
+        }
+        var link = document.createElement('A');
+        link.href='###';
+        link.id = 'img-id-'+String(count);
+        if(list[k].url) {
+            el.innerHTML += '<p><a target="_blank" href="'+list[k].url+'">'+fp_lang.preview+'</a></p>';
+        }
+        link.appendChild(img);
+        frame.appendChild(link);
+        el.appendChild(frame);
+        el.appendChild(title);
+        panel.appendChild(el);
+        if(list[k].children) {
+            var folder = new YAHOO.util.Element(link.id);
+            folder.path = list[k].path;
+            var el_title = new YAHOO.util.Element(title.id);
+            folder.fs = list[k].children;
+            folder.on('contentReady', function() {
+                this.on('click', function() {
+                    if(fp.fs.dynload) {
+                        var fs = repository_client.fp[client_id].fs;
+                        var params = [];
+                        params['p'] = this.path;
+                        params['env'] = repository_client.fp[client_id].env;
+                        params['repo_id'] = fs.repo_id;
+                        params['ctx_id'] = fp_config.contextid;
+                        params['sesskey']= moodle_cfg.sesskey;
+                        params['accepted_types'] = repository_client.fp[client_id].accepted_types;
+                        params['client_id'] = client_id;
+                        repository_client.loading(client_id, 'load');
+                        var trans = YAHOO.util.Connect.asyncRequest('POST',
+                                moodle_cfg.wwwroot+'/repository/ws.php?action=list', repository_client.req_cb, repository_client.postdata(params));
+                    }else{
+                        repository_client.view_as_icons(client_id, this.fs);
+                    }
+                });
+            });
+            el_title.on('contentReady', function() {
+                this.on('click', function(){
+                    folder.fireEvent('click');
+                });
+            });    
+        } else {
+            var el_title = new YAHOO.util.Element(title.id);
+            var file = new YAHOO.util.Element(link.id);
+            el_title.filename = file.filename = list[k].title;
+            el_title.value = file.value = list[k].source;
+            el_title.icon = file.icon  = list[k].thumbnail;
+            if(fp.fs.repo_id) {
+                el_title.repo_id = file.repo_id = fp.fs.repo_id;
+            }else if(list[k].repo_id) {
+                el_title.repo_id = file.repo_id = list[k].repo_id;
+            }else{
+                el_title.repo_id = file.repo_id = '';
+            }     
+            file.on('contentReady', function() {
+                this.on('click', function() {
+                    repository_client.select_file(this.filename, this.value, this.icon, client_id, this.repo_id);
+                });
+            });
+            el_title.on('contentReady', function() {
+                this.on('click', function() {
+                    repository_client.select_file(this.filename, this.value, this.icon, client_id, this.repo_id);
+                });
+            });
+        }
+        count++;
+    }
+    container.appendChild(panel);
+    repository_client.print_footer(client_id);
+}
+repository_client.print_footer = function(client_id) {
+    var fs = this.fp[client_id].fs;
+    var panel = document.getElementById('panel-'+client_id);
+    var footer = document.createElement('DIV');
+    footer.id = 'fp-footer-'+client_id;
+    footer.innerHTML += this.create_upload_form(client_id);
+    footer.innerHTML += this.paging(client_id, 'footer');
+    panel.appendChild(footer);
+    // add repository manage buttons here
+    var oDiv = document.getElementById('repo-tb-'+client_id);
+    if(!fs.nosearch) {
+        var search = document.createElement('A');
+        search.href = '###';
+        search.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/search.png" /> '+fp_lang.search;
+        oDiv.appendChild(search);
+        search.onclick = function() {
+            repository_client.search_form(client_id, fs.repo_id);
+        }
+    }
+    // weather we use cache for this instance, this button will reload listing anyway
+    if(!fs.norefresh) {
+        var ccache = document.createElement('A');
+        ccache.href = '###';
+        ccache.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/refresh.png" /> '+fp_lang.refresh;
+        oDiv.appendChild(ccache);
+        ccache.onclick = function() {
+            var params = [];
+            params['env']=fs.env;
+            params['sesskey']=moodle_cfg.sesskey;
+            params['ctx_id']=fp_config.contextid;
+            params['repo_id']=fs.repo_id;
+            params['client_id']=client_id;
+            repository_client.loading(client_id, 'load');
+            var trans = YAHOO.util.Connect.asyncRequest('POST',
+                    moodle_cfg.wwwroot+'/repository/ws.php?action=ccache', repository_client.req_cb, repository_client.postdata(params));
+        }
+    }
+    if(fs.manage) {
+        var mgr = document.createElement('A');
+        mgr.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/setting.png" /> '+fp_lang.mgr;
+        mgr.href = fs.manage;
+        mgr.target = "_blank";
+        oDiv.appendChild(mgr);
+    }
+    if(!fs.nologin) {
+        var logout = document.createElement('A');
+        logout.href = '###';
+        logout.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/logout.png" /> '+fp_lang.logout;
+        oDiv.appendChild(logout);
+        logout.onclick = function() {
+            repository_client.logout(client_id, fs.repo_id);
+        }
+    }
+    if(fs.help) {
+        var help = document.createElement('A');
+        help.href = fs.help;
+        help.target = "_blank";
+        help.innerHTML = '<img src="'+moodle_cfg.pixpath+'/a/help.png" /> '+fp_lang['help'];
+        oDiv.appendChild(help);
+    }
+}
+
+repository_client.postdata = function(obj) {
+    var str = '';
+    for(k in obj) {
+        if(obj[k] instanceof Array) {
+            for(i in obj[k]) {
+                str += (encodeURIComponent(k) +'[]='+encodeURIComponent(obj[k][i]));
+                str += '&';
+            }
+        } else {
+            str += encodeURIComponent(k) +'='+encodeURIComponent(obj[k]);
+            str += '&';
+        }
+    }
+    return str;
+}
+
+repository_client.stripHTML = function(str){
+    var re= /<\S[^><]*>/g
+    var ret = str.replace(re, "")
+    return ret;
+}
+repository_client.popup = function(client_id, url) {
+    window.open(url,'repo_auth', 'location=0,status=0,scrollbars=0,width=500,height=300');
+    cached_client_id = client_id;
+    return true;
+}
+function repository_callback(id) {
+    repository_client.req(cached_client_id, id, '');
+}
+repository_client.logout = function(client_id, repo_id) {
+    var params = [];
+    params['repo_id'] = repo_id;
+    params['client_id'] = client_id;
+    var trans = YAHOO.util.Connect.asyncRequest('POST', moodle_cfg.wwwroot+'/repository/ws.php?action=logout',
+            repository_client.req_cb, repository_client.postdata(params));
+}
+repository_client.download = function(client_id, repo_id) {
+    var fp = repository_client.fp[client_id];
+    var title = document.getElementById('newname-'+client_id).value;
+    new_filename = title;
+    var file = document.getElementById('fileurl-'+client_id).value;
+    repository_client.loading(client_id, 'download', title);
+    var params = [];
+    if(fp.itemid){
+        params['itemid']=fp.itemid;
+    }
+    params['env']=fp.env;
+    params['file']=file;
+    params['title']=title;
+    params['sesskey']=moodle_cfg.sesskey;
+    params['ctx_id']=fp_config.contextid;
+    params['repo_id']=repo_id;
+    params['client_id']=client_id;
+    var trans = YAHOO.util.Connect.asyncRequest('POST',
+            moodle_cfg.wwwroot+'/repository/ws.php?action=download',
+            repository_client.download_cb,
+            repository_client.postdata(params));
+}
+repository_client.download_cb = {
+    success: function(o) {
+         var data = repository_client.parse_json(o.responseText, 'download_cb');    
+         var panel = new YAHOO.util.Element('panel-'+data.client_id);
+         if(data && data.e) {
+             panel.get('element').innerHTML = data.e;
+             return;
+         }
+         repository_client.end(data.client_id, data);
+    }
+}
+repository_client.end = function(client_id, obj) {
+    var fp = repository_client.fp[client_id];
+    if(fp.env=='filepicker') {
+        fp.target.value = obj['id'];
+    }else if(fp.env=='editor'){
+        if (obj['type'] == 'link') {
+            fp.target.value = obj['url']+'#'+new_filename;
+        } else {
+            fp.target.value = obj['url'];
+        }
+        fp.target.onchange();
+    }
+    fp.formcallback(obj);
+    fp.hide();
+    repository_client.viewfiles(client_id);
+}
+repository_client.viewfiles = function(client_id) {
+     var repo = repository_client.fp[client_id];
+    if(repo.view_status) {
+        repository_client.view_as_list(client_id);
+    } else {
+        repository_client.view_as_icons(client_id);
+    }
+}
+repository_client.create_upload_form = function(client_id) {
+    var str = '';
+    var fs = repository_client.fp[client_id].fs;
+    if(fs.upload) {
+        var id = fs.upload.id+'_'+client_id;
+        str += '<div id="'+id+'_div" class="fp-upload-form">';
+        str += '<form id="'+id+'" onsubmit="return false">';
+        str += '<label for="'+id+'_file">'+fs.upload.label+': </label>';
+        str += '<input type="file" id="'+id+'_file" name="repo_upload_file" />';
+        str += '<p class="fp-upload-btn"><a href="###" onclick="return repository_client.upload(\''+client_id+'\');">'+fp_lang.upload+'</a></p>';
+        str += '</form>';
+        str += '</div>';
+    }
+    return str;
+}
+repository_client.upload = function(client_id) {
+    var fp = repository_client.fp[client_id];
+    var u = repository_client.fp[client_id].fs;
+    var id = u.upload.id+'_'+client_id;
+    var aform = document.getElementById(id);
+    var parent = document.getElementById(id+'_div');
+    var d = document.getElementById(id+'_file');
+    if(d.value!='' && d.value!=null) {
+        var container = document.createElement('DIV');
+        container.id = id+'_loading';
+        container.style.textAlign='center';
+        var img = document.createElement('IMG');
+        img.src = moodle_cfg.pixpath+'/i/progressbar.gif';
+        var para = document.createElement('p');
+        para.innerHTML = fp_lang.uploading;
+        container.appendChild(para);
+        container.appendChild(img);
+        parent.appendChild(container);
+        YAHOO.util.Connect.setForm(aform, true, true);
+
+        var trans = YAHOO.util.Connect.asyncRequest('POST',
+                moodle_cfg.wwwroot+'/repository/ws.php?action=upload&itemid='+fp.itemid
+                    +'&sesskey='+moodle_cfg.sesskey
+                    +'&ctx_id='+fp_config.contextid
+                    +'&repo_id='+u.repo_id
+                    +'&client_id='+client_id,
+                repository_client.upload_cb);
+    }else{
+        alert(fp_lang.filenotnull);
+    }
+}
+repository_client.upload_cb = {
+upload: function(o) {
+        var ret = repository_client.parse_json(o.responseText, 'upload');    
+        client_id = ret.client_id;
+        if(ret && ret.e) {
+            var panel = new YAHOO.util.Element('panel-'+client_id);
+            panel.get('element').innerHTML = ret.e;
+            return;
+        }
+        if(ret) {
+            alert(fp_lang.saved);
+            repository_client.end(client_id, ret);
+        }
+    }
+}
+repository_client.parse_json = function(txt, source) {
+    try {
+        var ret = YAHOO.lang.JSON.parse(txt);
+    } catch(e) {
+        alert(fp_lang.invalidjson+' - |'+source+'| -'+this.stripHTML(txt));
+    }
+    return ret;
+}
+repository_client.search_form = function(client_id, id) {
+    var fp = repository_client.fp[client_id];
+    var params = [];
+    params['env']=fp.env;
+    params['sesskey']=moodle_cfg.sesskey;
+    params['client_id']=client_id;
+    params['ctx_id']=fp_config.contextid;
+    params['repo_id']=id;
+    var trans = YAHOO.util.Connect.asyncRequest('POST',
+            moodle_cfg.wwwroot+'/repository/ws.php?action=searchform',
+            repository_client.search_form_cb,
+            repository_client.postdata(params));
+}
+repository_client.search_form_cb = {
+success: function(o) {
+     var data = repository_client.parse_json(o.responseText, 'search_form_cb');
+     var el = document.getElementById('fp-search-dlg');
+     var fp = repository_client.fp[data.client_id];
+     if(el) {
+         el.innerHTML = '';
+     } else {
+         var el = document.createElement('DIV');
+         el.id = 'fp-search-dlg';
+     }
+     var div1 = document.createElement('DIV');
+     div1.className = 'hd';
+     div1.innerHTML = fp_lang.searching+"\"" + repository_listing[data.client_id][fp.fs.repo_id].name + '"';
+     var div2 = document.createElement('DIV');
+     div2.className = 'bd';
+     var sform = document.createElement('FORM');
+     sform.method = 'POST';
+     sform.id = "fp-search-form";
+     sform.action = moodle_cfg.wwwroot+'/repository/ws.php?action=search';
+     sform.innerHTML = data['form'];
+     div2.appendChild(sform);
+     el.appendChild(div1);
+     el.appendChild(div2);
+     document.body.appendChild(el);
+     var dlg_handler = function() {
+         var client_id=dlg_handler.client_id;
+         repository_client.fp[client_id].viewbar.set('disabled', false);
+         repository_client.loading(client_id, 'load');
+         YAHOO.util.Connect.setForm('fp-search-form', false, false);
+         this.cancel();
+         var url = moodle_cfg.wwwroot+'/repository/ws.php?action=search&env='+dlg_handler.env
+                +'&client_id='+client_id;
+         var trans = YAHOO.util.Connect.asyncRequest('POST', url,
+             repository_client.req_cb);
+     }
+     dlg_handler.client_id = data.client_id;
+     dlg_handler.env = fp.env;
+     var dlg = new YAHOO.widget.Dialog("fp-search-dlg",{
+        postmethod: 'async',
+        draggable: true,
+        width : "30em",
+        fixedcenter : true,
+        zindex: 766667,
+        visible : false,
+        constraintoviewport : true,
+        buttons : [
+        {
+            text:fp_lang.submit,
+            handler: dlg_handler,
+            isDefault:true
+        },
+        {text:fp_lang.cancel,handler:function(){this.cancel()}}
+        ]
+    });
+    dlg.render();
+    dlg.show();
+}
+}
+var mdl_in_array = function(el, arr) {
+    for(var i = 0, l = arr.length; i < l; i++) {
+        if(arr[i] == el) {
+            return true;
+        }
+    }
+    return false;
+}
+
+// will be called by filemanager or htmleditor
+function open_filepicker(id, params) {
+    var r = repository_client.fp[id];
+    if(!r) {
+        // passing parameters
+        r = new repository_client();
+        r.env = params.env;
+        r.target = params.target;
+        if(params.itemid){
+            r.itemid = params.itemid;
+        } else if(tinyMCE && id2itemid[tinyMCE.selectedInstance.editorId]){
+            r.itemid = id2itemid[tinyMCE.selectedInstance.editorId];
+        }
+        // setup callback function
+        if(params.callback) {
+            r.formcallback = params.callback;
+        } else {
+            r.formcallback = function() {};
+        }
+        // write back
+        repository_client.fp[id] = r;
+        // create file picker (html elements and events)
+        r.create_filepicker(id);
+    } else {
+        r.target = params.target;
+        r.show();
+    }
+    if(params.filetype) {
+        if(params.filetype == 'image') {
+            r.accepted_types = file_extensions.image;
+        } else if(params.filetype == 'video' || params.filetype== 'media') {
+            r.accepted_types = file_extensions.media;
+        } else if(params.filetype == 'file') {
+            r.accepted_types = '*';
+        }
+    } else {
+        r.accepted_types = '*';
+    }
+    return r;
+}