// File picker core Javascript code for Moodle // Author: Dongsheng Cai /** * 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(); */ if (!MOODLE) { var MOODLE = {}; } if (!MOODLE.repository) { MOODLE.repository = {}; } MOODLE.repository.listing = {}; MOODLE.repository.extensions = {}; MOODLE.repository.cache = {}; MOODLE.repository.cache.client_id = {}; /* 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; var id2clientid = {}; var id2itemid = {}; /** * 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_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}}; var el = document.createElement('DIV'); el.id = 'file-picker-'+client_id; el.className = 'file-picker'; this.client_id = client_id; document.body.appendChild(el); MOODLE.repository.api = moodle_cfg.wwwroot+'/repository/repository_ajax.php'; this.filepicker = new YAHOO.widget.Panel('file-picker-' + client_id, { draggable: true, close: true, underlay: 'none', zindex: 666666, monitorresize: false, xy: [50, YAHOO.util.Dom.getDocumentScrollTop()+20] }); var layout = ''; this.filepicker.client_id = client_id; this.filepicker.setHeader(fp_lang['title']); this.filepicker.setBody('
'); 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:'
', gutter: '2'}, {position: 'left', width: 200, resize: true, scroll:true, body:'', gutter: '0 5 0 2', minWidth: 150, maxWidth: 300 }, {position: 'center', body: '
', scroll: true, gutter: '0 2 0 0' } ] }); layout.render(); }); }); if (!YAHOO.env.ua.ie) { var resize = new YAHOO.util.Resize('file-picker-'+client_id, { handles: ['br'], autoRatio: true, proxy: true, status: true, minWidth: 680, minHeight: 400 }); 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 = ''; 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.repository.api+'?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 (data.gsearch) { // will be used to hide header and footer r.gsearch = true; } 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 MOODLE.repository.listing[this.client_id]) { var repo = MOODLE.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.type=='draft' && this.env == 'filemanager') { continue; } 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 MOODLE.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; params['itemid'] = repository_client.fp[client_id].itemid; if (!!page) { // convert page to boolean value params['page']=page; } params['accepted_types'] = r.accepted_types; var trans = YAHOO.util.Connect.asyncRequest('POST', MOODLE.repository.api+'?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]; repo.viewbar.set('disabled', false); 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.iframe) { repository_client.view_iframe(data.client_id); }else if(data.login) { repo.viewbar.set('disabled', true); 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); } } if (data.msg) { repository_client.print_msg(data.msg, data.client_id); } } } repository_client.print_msg = function(msg, client_id) { var panel = new YAHOO.util.Element('panel-'+client_id); panel.get('element').innerHTML = '
'+msg+'
'+panel.get('element').innerHTML; } 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 = "