MediaWiki:Common.js/Clases/WikiaShoutBox.js

/** WikiaShoutBox v1.10: Conector para el Widget ShoutBox de Wikia * (C) 2011 Jesús Martínez Novo User:Ciencia_Al_Poder * This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version */ var WikiaShoutBox = { version: '1.10', cookietag: 'WSB', skin: 'oasis', wid: '302', contel: null, focus: false, init: function { if (!window.wgUserName) return; var enabled = false; var expanded = false; var cfg = $.cookies.get(WikiaShoutBox.cookietag); if (cfg) { var cfgvars = cfg.split(':'); enabled = (cfgvars.length >= 1 && cfgvars[0] == '1'); expanded = (cfgvars.length >= 2 && cfgvars[1] == '1'); }		// Si alguien no le funciona, que pruebe a poner wgWidgetShoutBoxId = '1'; en su js		if (typeof window.wgWidgetShoutBoxId == 'string' && !isNaN(window.wgWidgetShoutBoxId)) { WikiaShoutBox.wid = window.wgWidgetShoutBoxId; }		WikiaShoutBox.render; if (enabled) { WikiaShoutBox.start; if (expanded) { WikiaShoutBox.expand; }		}		// Core functions window.WidgetShoutBoxSend = WikiaShoutBox.sendMsg; window.WidgetShoutBoxRemoveMsg = WikiaShoutBox.removeMsg; },	render: function { var fxBtn = function(type, title) { return ''; };		WikiaShoutBox.contel = $(' Chat '+fxBtn('start', 'Mostrar')+fxBtn('stop', 'Ocultar')+			fxBtn('expand', 'Expandir')+fxBtn('collapse', 'Contraer')+fxBtn('edit', 'Configurar')+fxBtn('reload', 'Recargar')+' ').insertAfter('#p-tb'); $('#p-sb').children('h5').click(WikiaShoutBox.widgetBtnClick).children('a.WidgetSprite').not('a.start').css('display','none'); },	widgetBtnClick: function(e) { var tg = e.target; if (!tg) return; if (tg.tagName.toLowerCase == 'img') tg = tg.parentNode; if (tg.tagName.toLowerCase != 'a') return; var cn = tg.className.split(' '); for (var i = 0; i < cn.length; i++) { switch(cn[i]) { case 'start': case 'stop': case 'expand': case 'collapse': case 'edit': case 'reload': WikiaShoutBox[cn[i]]; return false; break; }		}	},	widgetBtnVisible: function(cfg) { for (btn in cfg) { $('#p-sb').children('h5').children('a.'+btn).css('display',cfg[btn]?'':'none'); }	},	start: function { WikiaShoutBox.action('configure'); $.cookies.set(WikiaShoutBox.cookietag, '1'); WikiaShoutBox.widgetBtnVisible({start:false, stop:true, expand:true, edit:true, reload:true}); },	stop: function { WikiaShoutBox.collapse; WikiaShoutBox.widgetBtnVisible({start:true, stop:false, expand:false, collapse:false, edit:false, reload:false}); WikiaShoutBox.contel.children('div').eq(0).empty; $.cookies.del(WikiaShoutBox.cookietag); },	expand: function { WikiaShoutBox.widgetBtnVisible({expand:false, collapse:true}); WikiaShoutBox.contel.addClass('expanded'); $.cookies.set(WikiaShoutBox.cookietag, '1:1'); // Posicionar al final si hay scroll var ul = WikiaShoutBox.contel.children('div').eq(0).find('ul').get(0); if (!ul) return; ul.scrollTop = ul.scrollHeight - ul.offsetHeight + 2; },	collapse: function { WikiaShoutBox.widgetBtnVisible({expand:true, collapse:false}); WikiaShoutBox.contel.removeClass('expanded'); $.cookies.set(WikiaShoutBox.cookietag, '1:0'); },	edit: function { WikiaShoutBox.action('editform'); },	reload: function { WikiaShoutBox.action('configure'); },	action: function(atype, params) { if (!WikiaShoutBox.contel) return; var req = { action: 'ajax', rs: 'WidgetFrameworkAjax', actionType: atype, id: WikiaShoutBox.wid, skin: WikiaShoutBox.skin, cbuser: encodeURIComponent(window.wgUserName) // un ID por usuario, por la caché };		req = $.extend(req, params); WikiaShoutBox.busy(true); $.getJSON(wgScriptPath+wgScript, req, WikiaShoutBox.jsonRcvClosure(atype));

},	jsonRcvClosure: function(pAction) { return function(res) { if (res.success) { WikiaShoutBox[pAction+'Action'](res); } else { WikiaShoutBox.stop; var c = WikiaShoutBox.contel.children('div').eq(0); c.empty; c.append(' Ha ocurrido un error al intentar cargar el chat. Puede ser un problema temporal. Si este chat nunca te ha funcionado puedes ejecutar el asistente para intentar arreglarlo. '); WikiaShoutBox.expand; WikiaShoutBox.widgetBtnVisible({start:false, stop:true, collapse:false}); }			WikiaShoutBox.busy(false); };	},	configureAction: function(res) { if (res.type != 'WidgetShoutBox') { WikiaShoutBox.stop; var c = WikiaShoutBox.contel.children('div').eq(0); c.empty; c.append('Ha ocurrido un error al intentar cargar el chat. El widget retornado es de tipo ['+res.type+']. Puedes probar a ejecutar el asistente para intentar arreglarlo.'); WikiaShoutBox.expand; WikiaShoutBox.widgetBtnVisible({start:false, stop:true, collapse:false}); return; }		var b = res.body; var pos = b.indexOf(' 0) { b = b.substring(0, pos); }		var ul = WikiaShoutBox.contel.children('div').eq(0).html(b).find('ul').get(0); if(WikiaShoutBox.focus) { $('#widget_' + WikiaShoutBox.wid + '_message').focus; WikiaShoutBox.focus = false; }		// Posicionar al final si hay scroll if (!ul) return; ul.scrollTop = ul.scrollHeight - ul.offsetHeight + 2; },	editformAction: function(res) { var b = res.content; WikiaShoutBox.contel.children('div').eq(0).html(b); $('#widget_' + res.id + '_save').click(WikiaShoutBox.editSave); $('#widget_' + res.id + '_cancel').click(WikiaShoutBox.editCancel); },	editSave: function { // get editor fields and add them to AJAX request params var fields = $('#widget_' + WikiaShoutBox.wid + '_editor').serializeArray; var req = {}; for (var i = 0; i < fields.length; i++) { req[fields[i].name] = fields[i].value; }		WikiaShoutBox.action('configure', req); },	editCancel: function { WikiaShoutBox.action('configure'); },	sendMsg: function(wId) { var messageBox = $('#widget_' + wId + '_message'); if (!messageBox.length) { return; }		var message = $.trim(messageBox.attr('value')).replace(new RegExp('\\{\\{', 'g'), '{&#123;').replace(new RegExp('<', 'g'), '&lt;').replace(new RegExp('>', 'g'), '&gt;'); var isMe = false; WikiaShoutBox.focus = true; if (message.length == 0) { WikiaShoutBox.reload; return; }		// Eliminación if (message.indexOf('/me ') == 0) { isMe = true; message = $.trim(message.substr(3)); }		// Codificación if (!isMe && message.charAt(0) == '/') { message = '&#47;'+message.substr(1); }		if (message.charAt(0) == ':') { message = '&#58;'+message.substr(1); }		if (message.indexOf('') == 0) { message = '&#45;'+message.substr(1); }		if (message.length == 0) { WikiaShoutBox.reload; return; }		WikiaShoutBox.action('configure', {message: encodeURIComponent( isMe ? '/me ' + message : message ) }); },	removeMsg: function (wid, mid) { WikiaShoutBox.action('configure', {msgid:mid}); },	busy: function(isBusy) { WikiaShoutBox.contel.children('h5').children('span.status').text(isBusy?' (Cargando...)':''); },	fixConfig: function { if (window.wgWidgetShoutBoxId) { var c = WikiaShoutBox.contel.children('div').eq(0); c.empty; c.append(' En tu archivo js personal está definida la variable wgWidgetShoutBoxId, con valor . ' +			'Para poder continuar y que esta no interfiera con la detección de tu configuración, debes borrar esa línea de tu archivo js personal, que puede estar situado en '+			'este wiki o en Community central. ' +			'Revisa que no esté en ninguna de las dos páginas enlazadas. Si lo está, borra la línea que la contenga, guarda la página y refresca la caché del navegador como se indica en esa misma página. '); c.find('.msg1').append(wgWidgetShoutBoxId.toString).end .find('.msg2').attr('href', wgScriptPath+wgScript+'?title='+encodeURIComponent(wgFormattedNamespaces['2'])+':'+encodeURIComponent(wgUserName.replace(new RegExp('\\s', 'g'), '_'))+'/'+skin+'.js&action=edit').end .find('.msg3').attr('href', 'http://community.wikia.com'+wgScriptPath+wgScript+'?title=User:'+encodeURIComponent(wgUserName.replace(new RegExp('\\s', 'g'), '_'))+'/global.js&action=edit'); WikiaShoutBox.expand; WikiaShoutBox.widgetBtnVisible({start:false, stop:true, collapse:false}); return; }		WikiaShoutBox.busy(true); $.getJSON(wgScriptPath+'/api.php', {action: 'query', meta: 'userinfo', uiprop: 'options', titles: 'User:' + wgUserName.replace(new RegExp('\\s', 'g'), '_')+'/'+skin+'.js', prop: 'info|revisions', intoken: 'edit', rvprop: 'content|timestamp', format: 'json'}, WikiaShoutBox.cbMwConfig); },	cbMwConfig: function(data) { WikiaShoutBox.busy(false); var kTag = 's:4:"type";s:14:"WidgetShoutBox";s:2:"id";i:'; var wCfg = data.query.userinfo.options.widgets; for (var pp in data.query.pages) { WikiaShoutBox._wgPage = data.query.pages[pp]; }		var _tmpCfg = wCfg; var instances = []; // 1. Buscar todas las instancias de WidgetShoutBox while (_tmpCfg.length) { var idx = _tmpCfg.indexOf(kTag); if (idx == -1) { break; }			_tmpCfg = _tmpCfg.substr(idx+kTag.length); instances[instances.length] = _tmpCfg.substr(0, _tmpCfg.indexOf(';')); }		if (instances.length) { // Puede ser que exista, pero tenga el mismo id que otro widget existente. En ese caso tendríamos que agregar uno nuevo // 2. Buscar de las instancias alguno que no esté duplicado for (var i = 0; i < instances.length; i++) { _tmpCfg = wCfg; var sTagId = 's:2:"id";i:'+instances[i]+';'; var found = 0; while (_tmpCfg.length) { var idx = _tmpCfg.indexOf(sTagId); if (idx == -1) { break; }					_tmpCfg = _tmpCfg.substr(idx+sTagId.length); found++; }				if (found == 0) { alert('Error parseando preferencias'); return; } else if (found == 1) { // Parece que es usable WikiaShoutBox.showFixedIdStatus(instances[i]); return; }			}		}

// Si hemos llegado aquí es que no hay ninguno usable. Intentamos añadir uno WikiaShoutBox.busy(true); $.getJSON(wgScriptPath+wgScript, {action: 'ajax', rs: 'WidgetFrameworkAjax', actionType: 'add', index:'302', sidebar:'3', type: 'WidgetShoutBox'}, WikiaShoutBox.addAction); },	addAction: function(res) { var kTag = 'id="widget';		WikiaShoutBox.busy(false);		if (!res.success || !res.widget) {			alert('Error al añadir una nueva instancia de WidgetShoutBox');			return;		}		var idx = res.widget.indexOf(kTag);		var tmpWg = res.widget.substr(idx+kTag.length);		WikiaShoutBox.showFixedIdStatus(tmpWg.substr(0, tmpWg.indexOf('"'))); },	showFixedIdStatus: function(id) { var c = WikiaShoutBox.contel.children('div').eq(0); var pagetext = '// Variable para que funcione el WidgetShoutbox\nwindow.wgWidgetShoutBoxId = \''+id+'\';\n// Fin variable para que funcione el WidgetShoutbox\n'; c.empty; // WikiaShoutBox._wgPage c.append(' Para probar a arreglar el ShoutBox, es necesario que edites tu archivo js personal añadiendo un trozo de código. Pulsa el siguiente botón para abrir tu página js personal donde se añadirá automáticamente al inicio de la misma el código. Tú solo tendrás que guardar. Desde esa página, antes de guardar, podrás probar a abrir de nuevo el ShoutBox y ver si ya se ha solucionado. En ese caso podrás gardar. Si en ese momento sigue sin funcionar, algo más debe estar interfiriendo con el código js y deberías pedir que alguien con conocimientos lo revise.' +			'' +			' ' +			'' +			'' + '<input type="submit" name="wpPreview" value="Añadir código para WidgetShoutBox" />' + '<input type="hidden" name="wpEditToken" value="' + WikiaShoutBox._wgPage.edittoken + '" /> ');		if (typeof WikiaShoutBox._wgPage.missing == 'string') {			c.find('form').eq(0).append('<input type="hidden" name="wpEdittime" value="'+WikiaShoutBox._wgPage.starttimestamp.replace(new RegExp('\\D', 'g'), )+'" />');		} else {			c.find('form').eq(0).append('<input type="hidden" name="wpEdittime" value="'+WikiaShoutBox._wgPage.revisions[0].timestamp.replace(new RegExp('\\D', 'g'), )+'" />');			pagetext += WikiaShoutBox._wgPage.revisions[0]['*'];		}		c.find('textarea').eq(0).val(pagetext);		WikiaShoutBox.expand;			WikiaShoutBox.widgetBtnVisible({start:false, stop:true, collapse:false});		return;	} };

$(WikiaShoutBox.init);