MediaWiki:Skin/Projekt:Adventure2/lib.js: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
J* (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
J* (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| (132 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
// A2lib | // A2lib | ||
a2 = {}; | if (window.a2 === undefined) | ||
window.a2 = {}; | |||
a2.events = {}; | a2.events = {}; | ||
a2.virtuals = {}; | |||
a2.errorCount = 0; | |||
a2.EVENT_CHAIN_MAX_LENGTH = 20; | |||
a2.eventChain = []; | |||
a2.clearEventChain = function clearEventChain () { | |||
a2.eventChain = []; | |||
}; | |||
a2.clearScope = function clearScope(sc) { | a2.clearScope = function clearScope(sc) { | ||
delete a2.events[sc]; | delete a2.events[sc]; | ||
delete a2.virtuals[sc]; | |||
}; | }; | ||
a2.registerEventHandler = function registerEventHandler(e) { | a2.registerEventHandler = function registerEventHandler(e) { | ||
var sc = | var sc = e.scope; | ||
if (!a2.events[sc]) | if (!a2.events[sc]) | ||
a2.events[sc]={}; | a2.events[sc]={}; | ||
if (!a2.events[sc][ | for(var i=0; i<e.trigger.length; i++){ | ||
a2.events[sc][e. | var tr = e.trigger[i]; | ||
if (!a2.events[sc][tr]) | |||
a2.events[sc][tr] = []; | |||
a2.events[sc][tr].push(function(real){ | |||
a2.log("run", e.name); | |||
var cond = e.condition(); | |||
a2.debugEventInstance(e.scope, e.name, cond); | |||
if (cond) | |||
e.action(real); | |||
}); | |||
} | |||
}; | |||
a2.log = function () {return;}; | |||
if (window.console && window.console.log && window.console.log.apply) | |||
a2.log = function() { console.log.apply(window.console, arguments) }; | |||
a2.virtualTriggerMap = { | |||
add: [1], | |||
remove: [1], | |||
activate: [1], | |||
apply: [1,0], | |||
combine: [1,1], | |||
enter: [1], | |||
leave: [1] | |||
} | |||
a2.xJoin = function xJoin (z){ | |||
function _xj(arr, vals){ | |||
var ret = []; | |||
for (var i=0; i<arr.length; i++) | |||
for (var j=0; j<vals.length; j++) | |||
ret.push(arr[i].concat(vals[j])); | |||
return ret; | |||
} | |||
var n = [[]]; | |||
for (var i=0; i<z.length; i++) | |||
n = _xj(n,z[i]); | |||
return n; | |||
} | |||
a2.createVirtualTriggers = function createVirtualTriggers (tr) { | |||
var b = tr[0]; | |||
return a2.xJoin($.map(tr, function (val, i) { | |||
if (i>0 && a2.virtualTriggerMap[b] && a2.virtualTriggerMap[b][i-1] && a2.virtuals[val]) | |||
return [[val].concat(a2.virtuals[val])]; | |||
else | |||
return [[val]]; | |||
})); | |||
} | |||
a2.fireEvent = function fireEvent(ev) { | |||
var triggers = a2.createVirtualTriggers(ev); | |||
for (var i=0; i<triggers.length; i++) | |||
a2._fireEvent(triggers[i], ev); | |||
} | |||
a2._fireEvent = function _fireEvent (ev, real) { | |||
a2. | if (a2.eventChain.length >= a2.EVENT_CHAIN_MAX_LENGTH) { | ||
a2. | a2.debugError("Abbruch: zu viele Folge-Ereignisse."); | ||
return; | |||
} | |||
}) | var evstate = a2.stateEncode() + "|" + ev; | ||
if (a2.eventChain.indexOf(evstate) > -1) { | |||
a2.debugError("Abbruch: Ereignis-Rekursion."); | |||
return; | |||
} | |||
a2.eventChain.push(evstate); | |||
if ( | if ( ev[0] == "enter" || ev[0] == "add" || ev[0] == "remove" ) | ||
a2.updateHash() | |||
event = ev.join("."); | |||
a2.log("Fire", event); | a2.log("Fire", event, real); | ||
a2.debugEvent(event); | |||
var e = a2.events; | var e = a2.events; | ||
for(i in e) | for(var i in e) | ||
try { | try { | ||
for(j=0; j<e[i][event].length; j++){ | for(j=0; e[i][event] !== undefined && j<e[i][event].length; j++){ | ||
a2.log("Event", i, event, j, e[i][event][j]); | a2.log("Event", i, event, j, e[i][event][j]); | ||
e[i][event][j](); | e[i][event][j](real); | ||
} | } | ||
} catch (e) { | } catch (e) { | ||
| Zeile 42: | Zeile 115: | ||
} | } | ||
}; | }; | ||
a2.makeUrl = function makeUrl(p){ | |||
var script = mw.config.get("wgScript"); | |||
var page = mw.config.get("wgPageName"); | |||
return [script, page, p].join("/"); | |||
} | |||
a2.updateHash = function updateHash() { | |||
var hash = "#" + a2.crypt(a2.stateEncode(), true); | |||
location.hash = hash; | |||
a2.latestHash = hash; | |||
} | |||
a2.loadPage = function loadPage(n){ | a2.loadPage = function loadPage(n){ | ||
if (isNaN(parseInt(n)) /* || a2.cpage == parseInt(n) */ ) | |||
return; | |||
response = $.ajax({ | |||
url: | |||
var response = $.ajax({ | |||
url: a2.makeUrl(parseInt(n)+"?action=render"), | |||
async: false | async: false | ||
}); | }); | ||
if (response.status != 200) { | |||
a2.debugError("Fehler beim Laden von Seite "+n+": "+response.statusText); | |||
return; | |||
} | |||
a2.fireEvent(["leave",a2.cpage]); | |||
a2.clearScope(":page:"); | |||
a2.cpage = n; | a2.cpage = n; | ||
$content = $(response.responseText) | a2.debugPage(n); | ||
$content.append('<scr'+'ipt type="text/javascript">setTimeout(function(){a2.fireEvent("enter | var $content = $(response.responseText) | ||
$content.append('<scr'+'ipt type="text/javascript">setTimeout(function(){a2.fireEvent(["enter",a2.cpage]); $("#a2loader").hide();}, 100);</scr'+'ipt>'); | |||
$("#a2image").empty().append($content); | $("#a2image").empty().append($content); | ||
| Zeile 59: | Zeile 155: | ||
$("#a2image area").click(function (ev) { | $("#a2image area").click(function (ev) { | ||
a2.fireEvent("click | a2.clearEventChain(); | ||
a2.fireEvent(["click",ev.currentTarget.hash.substr(1)]); | |||
return false; | |||
}); | |||
$(".overlay").css("cursor","pointer").click(function (ev) { | |||
a2.clearEventChain(); | |||
a2.fireEvent(["click",ev.currentTarget.id.split("_")[1]]); | |||
return false; | |||
}); | |||
$("#_l, #_r, #_u, #_d").click(function (ev) { | |||
a2.clearEventChain(); | |||
a2.fireEvent(["click",ev.currentTarget.id]); | |||
return false; | return false; | ||
}); | }); | ||
$("#a2image | |||
$("#a2image img").droppable({ | |||
$(" | drop: function (event, ui) { | ||
var target = a2.ui.getDroparea($(this), ui); | |||
a2.log("drop", target, event, ui); | |||
for (var i=0; i<target.length; i++) { | |||
a2.clearEventChain(); | |||
a2.fireEvent(["apply",ui.draggable.data("item"),target[i].hash.substr(1)]); | |||
} | |||
} | |||
}); | |||
$(".overlay").droppable({ | |||
drop: function (event, ui) { | |||
a2.clearEventChain(); | |||
a2.fireEvent(["apply",ui.draggable.data("item"),this.id.split("_")[1]]); | |||
} | |||
}); | |||
}; | }; | ||
a2.util = { | a2.util = { | ||
print: function (s) { | print: function (s, opts) { | ||
$("#a2text").text(s); | $("#a2text").text(s); | ||
// print options for the ask method | |||
if(opts) { | |||
var functionBuilder = function (target) { | |||
return function () { | |||
a2.util.print(""); | |||
a2.fireEvent(["click", target]); | |||
}; | |||
}; | |||
var ul = $("<ul/>"); | |||
for(var i=0; i<opts.length; i++) { | |||
var li = $("<li class='pseudolink'/>"); | |||
li.click(functionBuilder(opts[i][0])); | |||
li.text(opts[i][1]); | |||
ul.append(li); | |||
} | |||
$("#a2text").append(ul); | |||
} | |||
}, | }, | ||
goto: function (p) { | goto: function (p) { | ||
// prevent side effects | |||
a2.timer.clear(); | |||
// this was for old Widgets! | |||
//$("audio").each(function (a,b) { b.autoplay = false; b.pause(); }); | |||
// stop background noises, keep music | |||
a2.audio.stop("background"); | |||
// actually go to page | |||
a2.loadPage(p); | a2.loadPage(p); | ||
}, | |||
timeoutIsSet: function () { | |||
return ! isNaN(a2.timer.pt); | |||
} | } | ||
}; | }; | ||
| Zeile 82: | Zeile 238: | ||
a2.loadItem = function loadItem(n){ | a2.loadItem = function loadItem(n){ | ||
a2.log("load", n); | a2.log("load", n); | ||
response = $.ajax({ | var response = $.ajax({ | ||
url: " | url: a2.makeUrl("item/"+n+"?action=render"), | ||
async: false | async: false | ||
}); | }); | ||
if (response.status != 200) { | |||
a2.debugError("Fehler beim Laden von Item "+n+": "+response.statusText); | |||
return; | |||
} | |||
a2.clearScope(n); | |||
a2.items[n] = response.responseText; | a2.items[n] = response.responseText; | ||
a2.log(a2.items); | a2.log(a2.items); | ||
a2.renderItems(); | a2.renderItems(); | ||
a2.fireEvent(["add",n]); | |||
}; | }; | ||
a2.renderItems = function renderItems(){ | a2.renderItems = function renderItems(){ | ||
$("#a2items").empty() | $("#a2items, #a2pseudoitems").empty() | ||
for (item in a2.items){ | a2.debugItems(); | ||
$fl=$('<div | for (var item in a2.items){ | ||
if (item[0] == "_") { | |||
// skip "virtual" status items | |||
$("#a2pseudoitems").append(a2.items[item]); | |||
continue; | |||
} | |||
var $flbox=$('<div class="a2itembox" />'); | |||
var $fl=$('<div class="a2item" />'); | |||
$flbox.append($fl); | |||
$fl.append(a2.items[item]); | $fl.append(a2.items[item]); | ||
$("#a2items").append($fl); | $("#a2items").append($flbox); | ||
$fl.click(function () {a2.fireEvent("activate." | $fl.draggable({ | ||
// cursorAt: {top: -5, left: -5}, | |||
revert: true, | |||
zIndex: 10000, | |||
start: function(event, ui) { | |||
ui.helper.bind("click.prevent", function(event) { event.preventDefault(); }); | |||
}, | |||
stop: function(event, ui) { | |||
setTimeout(function(){ui.helper.unbind("click.prevent");}, 300); | |||
} | |||
}); | |||
$fl.data("item",item); | |||
$fl.click(function () { | |||
a2.clearEventChain(); | |||
a2.fireEvent(["activate",$(this).data("item")]); | |||
}); | |||
$fl.droppable({ | |||
drop: function (event, ui) { | |||
a2.clearEventChain(); | |||
a2.fireEvent(["combine",ui.draggable.data("item"),$(this).data("item")]); | |||
return false; | |||
} | |||
}); | |||
a2.log($("#a2items")) | a2.log($("#a2items")) | ||
} | } | ||
} | } | ||
a2.util.add = function (n) { a2. | a2.util.add = function add (i) { | ||
a2.loadItem(i); | |||
}; | |||
a2.util.remove = function remove(i) { | |||
delete a2.items[i]; | |||
delete a2.events[i]; | |||
delete a2.virtuals[i]; | |||
a2.renderItems(); | |||
a2.fireEvent(["remove",i]); | |||
}; | |||
a2.util.removeAll = function removeAll(v) { | |||
for (i in a2.virtuals) | |||
if( a2.virtuals[i].indexOf(v) > -1 ) { | |||
delete a2.items[i]; | |||
delete a2.events[i]; | |||
delete a2.virtuals[i]; | |||
a2.fireEvent(["remove",i]); | |||
} | |||
a2.renderItems(); | |||
} | |||
a2.util.hasVirtual = function hasVirtual (v) { | |||
for (i in a2.virtuals) | |||
if( a2.virtuals[i].indexOf(v) > -1 ) | |||
return i; | |||
return false; | |||
} | |||
a2.ui = {}; | |||
a2.ui.getAreaBox = function getAreaBox (area) { | |||
var $area = $(area); | |||
var shape = $area.attr("shape"); | |||
var p = $area.attr("coords"); | |||
p = p.split(",") | |||
p = $.map(p, function(x){ return parseInt(x);}); | |||
if (shape == "circle"){ | |||
var x1 = p[0] - p[2]; | |||
var y1 = p[1] - p[2]; | |||
var x2 = p[0] + p[2]; | |||
var y2 = p[1] + p[2]; | |||
} else { | |||
var x1 = Infinity; | |||
var y1 = Infinity; | |||
var x2 = -Infinity; | |||
var y2 = -Infinity; | |||
for(var i=0; i<p.length; i=i+2){ | |||
if (p[i] < x1) x1 = p[i]; | |||
if (p[i+1] < y1) y1 = p[i+1]; | |||
if (p[i] > x2) x2 = p[i]; | |||
if (p[i+1] > y2) y2 = p[i+1]; | |||
} | |||
} | |||
return {x1:x1, y1:y1, x2:x2, y2:y2}; | |||
}; | |||
a2.ui.getDroparea = function getDroparea (img, ui) { | |||
var $areas = $("area"); | |||
return $areas.filter(function () { | |||
var b = a2.ui.getAreaBox(this); | |||
var s = 25; // half itemsize | |||
var xm = (b.x1 + b.x2) / 2; | |||
var ym = (b.y1 + b.y2) / 2; | |||
var dx = ui.offset.left - $(img).offset().left + s; | |||
var dy = ui.offset.top - $(img).offset().top + s; | |||
return (b.x1 < dx && dx < b.x2 && | |||
b.y1 < dy && dy < b.y2) || | |||
(dx - s < xm && xm < dx + s && | |||
dy - s < ym && ym < dy + s); | |||
}); | |||
} | |||
a2.stateEncode = function () { | |||
var s = String(a2.cpage); | |||
for (var i in a2.items) | |||
s+="|"+i; | |||
return s | |||
} | |||
a2.stateDecode = function (s) { | |||
a2.clearEventChain(); | |||
var c = s.split("|"); | |||
a2.items = {}; | |||
a2.virtuals = {}; | |||
a2.events = {} | |||
for (var j=1; j<c.length; j++) { | |||
a2.items[c[j]] = "<img src='/images/a/a6/A2loading.gif' alt='Loading …' />"; | |||
} | |||
a2.renderItems(); | |||
for (var j=1; j<c.length; j++) | |||
a2.loadItem(c[j]); | |||
a2.loadPage(parseInt(c[0])); | |||
} | |||
a2.crypt = function crypt (str, encode) { | |||
if (encode){ | |||
var n = Math.floor((Math.random()*9))+1; | |||
out = String(n); | |||
} else { | |||
var n = - parseInt(str.substr(0,1)); | |||
var out = ""; | |||
str = str.substr(1); | |||
} | |||
var chain = "pwoTä7eGNVk1SAldv0mJ9zIöPE4x8rF|B6ybüjZDC5cqfRhOXsQY23iUngLWuMHatK"; | |||
var mk = function(i){ return i % chain.length }; | |||
for (var i=0; i<str.length; i++) { | |||
var c = str.substr(i,1); | |||
var ind = chain.indexOf(c); | |||
if (ind == -1) | |||
out += c; | |||
else | |||
out += chain.substr(mk(ind + n),1); | |||
} | |||
return out; | |||
} | |||
/* DEBUGGER */ | |||
a2.debugEvent = function debugEvent (ev) { | |||
if (!$("#a2dbgBottom").length) | |||
return; | |||
$("#a2dbgEventLog").append($("<li/>").text(ev).append("<ul/>")); | |||
$("#a2dbgBottom:visible").scrollTop($("#a2dbgBottom")[0].scrollHeight); | |||
} | |||
a2.debugEventInstance = function debugEventInstance (sc,n,cond) { | |||
if (!$("#a2dbgBottom").length) | |||
return; | |||
var classname = cond ? "a2fired" : "a2notfired"; | |||
$("#a2dbgEventLog li ul").last().append($("<li/>").text(sc+"->"+n).addClass(classname)); | |||
$("#a2dbgBottom:visible").scrollTop($("#a2dbgBottom")[0].scrollHeight); | |||
} | |||
a2.debugPage = function debugPage (p) { | |||
$("#a2dbgGoto").val(p); | |||
} | |||
a2.debugItems = function debugItems() { | |||
var s = []; | |||
for (i in a2.items) | |||
s.push(i); | |||
$("#a2dbgItems").val(s.join("\n")); | |||
} | |||
a2.debugError = function debugError(text) { | |||
if (!$("#a2dbgBottom").length) | |||
return; | |||
a2.errorCount ++; | |||
$("#a2errorCount").text(a2.errorCount); | |||
$("#a2dbgEventLog").append($("<li/>").text(text).addClass("a2error")); | |||
$("#a2dbgBottom:visible").scrollTop($("#a2dbgBottom")[0].scrollHeight); | |||
} | |||
// provide timer functions | |||
a2.timer = { | |||
time: 0, | |||
pt: NaN, | |||
fn: null, | |||
set: function set(n, fn) { | |||
if (! isNaN(a2.timer.pt)) { | |||
// do not set timer if timer already active | |||
return; | |||
} | |||
a2.timer.time = n; | |||
a2.timer.fn = fn; | |||
a2.timer.pt = setInterval(function () { | |||
a2.timer.time--; | |||
if (a2.timer.time <= 0) { | |||
clearInterval(a2.timer.pt); | |||
a2.timer.pt = NaN; | |||
$("#_t").text("0:00").fadeOut('slow'); | |||
fn(); | |||
return; | |||
} | |||
var sec = a2.timer.time % 60; | |||
if (sec < 10) | |||
sec = "0" + sec; | |||
$("#_t").show().text(String(Math.floor(a2.timer.time / 60)) + ":" + sec ); | |||
}, 1000); | |||
}, | |||
clear: function clear() { | |||
if (! isNaN(a2.timer.pt)) { | |||
clearInterval(a2.timer.pt); | |||
a2.timer.pt = NaN; | |||
$("#_t").fadeOut(); | |||
} | |||
} | |||
}; | |||
// provide audio functions | |||
a2.audio = { | |||
cache: {}, | |||
current: [], | |||
fetch: function fetch(file) { | |||
var data = $.ajax({ | |||
type: "GET", | |||
url: "/api.php", | |||
data: { | |||
action: "parse", | |||
format: "xml", | |||
text: "{{filepath:"+file+"}}" | |||
}, | |||
async: false | |||
}); | |||
var html = $(data.responseText).find("text").text(); | |||
var url = $(html).find("a")[0].href; | |||
return url; | |||
}, | |||
getaudio: function getaudio(file) { | |||
if (a2.audio.cache[file]) { | |||
return a2.audio.cache[file]; | |||
} else { | |||
var url = a2.audio.fetch(file); | |||
a2.audio.cache[file] = url; | |||
return url; | |||
} | |||
}, | |||
play: function play(channel, file) { | |||
var $player = $("#a2audio_channel_"+channel)[0]; | |||
var audiofile = a2.audio.getaudio(file); | |||
if (audiofile != a2.audio.current[channel]) { | |||
$player.pause(); | |||
$player.src = a2.audio.getaudio(file); | |||
$player.load(); | |||
$player.play(); | |||
a2.audio.current[channel] = audiofile; | |||
} | |||
}, | |||
stop: function stop(channel) { | |||
var $player = $("#a2audio_channel_"+channel)[0]; | |||
$player.pause(); | |||
a2.audio.current[channel] = null; | |||
} | |||
} | |||
Aktuelle Version vom 22. Juli 2015, 22:05 Uhr
// A2lib
if (window.a2 === undefined)
window.a2 = {};
a2.events = {};
a2.virtuals = {};
a2.errorCount = 0;
a2.EVENT_CHAIN_MAX_LENGTH = 20;
a2.eventChain = [];
a2.clearEventChain = function clearEventChain () {
a2.eventChain = [];
};
a2.clearScope = function clearScope(sc) {
delete a2.events[sc];
delete a2.virtuals[sc];
};
a2.registerEventHandler = function registerEventHandler(e) {
var sc = e.scope;
if (!a2.events[sc])
a2.events[sc]={};
for(var i=0; i<e.trigger.length; i++){
var tr = e.trigger[i];
if (!a2.events[sc][tr])
a2.events[sc][tr] = [];
a2.events[sc][tr].push(function(real){
a2.log("run", e.name);
var cond = e.condition();
a2.debugEventInstance(e.scope, e.name, cond);
if (cond)
e.action(real);
});
}
};
a2.log = function () {return;};
if (window.console && window.console.log && window.console.log.apply)
a2.log = function() { console.log.apply(window.console, arguments) };
a2.virtualTriggerMap = {
add: [1],
remove: [1],
activate: [1],
apply: [1,0],
combine: [1,1],
enter: [1],
leave: [1]
}
a2.xJoin = function xJoin (z){
function _xj(arr, vals){
var ret = [];
for (var i=0; i<arr.length; i++)
for (var j=0; j<vals.length; j++)
ret.push(arr[i].concat(vals[j]));
return ret;
}
var n = [[]];
for (var i=0; i<z.length; i++)
n = _xj(n,z[i]);
return n;
}
a2.createVirtualTriggers = function createVirtualTriggers (tr) {
var b = tr[0];
return a2.xJoin($.map(tr, function (val, i) {
if (i>0 && a2.virtualTriggerMap[b] && a2.virtualTriggerMap[b][i-1] && a2.virtuals[val])
return [[val].concat(a2.virtuals[val])];
else
return [[val]];
}));
}
a2.fireEvent = function fireEvent(ev) {
var triggers = a2.createVirtualTriggers(ev);
for (var i=0; i<triggers.length; i++)
a2._fireEvent(triggers[i], ev);
}
a2._fireEvent = function _fireEvent (ev, real) {
if (a2.eventChain.length >= a2.EVENT_CHAIN_MAX_LENGTH) {
a2.debugError("Abbruch: zu viele Folge-Ereignisse.");
return;
}
var evstate = a2.stateEncode() + "|" + ev;
if (a2.eventChain.indexOf(evstate) > -1) {
a2.debugError("Abbruch: Ereignis-Rekursion.");
return;
}
a2.eventChain.push(evstate);
if ( ev[0] == "enter" || ev[0] == "add" || ev[0] == "remove" )
a2.updateHash()
event = ev.join(".");
a2.log("Fire", event, real);
a2.debugEvent(event);
var e = a2.events;
for(var i in e)
try {
for(j=0; e[i][event] !== undefined && j<e[i][event].length; j++){
a2.log("Event", i, event, j, e[i][event][j]);
e[i][event][j](real);
}
} catch (e) {
a2.log("Event Exception", e);
}
};
a2.makeUrl = function makeUrl(p){
var script = mw.config.get("wgScript");
var page = mw.config.get("wgPageName");
return [script, page, p].join("/");
}
a2.updateHash = function updateHash() {
var hash = "#" + a2.crypt(a2.stateEncode(), true);
location.hash = hash;
a2.latestHash = hash;
}
a2.loadPage = function loadPage(n){
if (isNaN(parseInt(n)) /* || a2.cpage == parseInt(n) */ )
return;
var response = $.ajax({
url: a2.makeUrl(parseInt(n)+"?action=render"),
async: false
});
if (response.status != 200) {
a2.debugError("Fehler beim Laden von Seite "+n+": "+response.statusText);
return;
}
a2.fireEvent(["leave",a2.cpage]);
a2.clearScope(":page:");
a2.cpage = n;
a2.debugPage(n);
var $content = $(response.responseText)
$content.append('<scr'+'ipt type="text/javascript">setTimeout(function(){a2.fireEvent(["enter",a2.cpage]); $("#a2loader").hide();}, 100);</scr'+'ipt>');
$("#a2image").empty().append($content);
console.log($("#a2image a"));
$("#a2image area").click(function (ev) {
a2.clearEventChain();
a2.fireEvent(["click",ev.currentTarget.hash.substr(1)]);
return false;
});
$(".overlay").css("cursor","pointer").click(function (ev) {
a2.clearEventChain();
a2.fireEvent(["click",ev.currentTarget.id.split("_")[1]]);
return false;
});
$("#_l, #_r, #_u, #_d").click(function (ev) {
a2.clearEventChain();
a2.fireEvent(["click",ev.currentTarget.id]);
return false;
});
$("#a2image img").droppable({
drop: function (event, ui) {
var target = a2.ui.getDroparea($(this), ui);
a2.log("drop", target, event, ui);
for (var i=0; i<target.length; i++) {
a2.clearEventChain();
a2.fireEvent(["apply",ui.draggable.data("item"),target[i].hash.substr(1)]);
}
}
});
$(".overlay").droppable({
drop: function (event, ui) {
a2.clearEventChain();
a2.fireEvent(["apply",ui.draggable.data("item"),this.id.split("_")[1]]);
}
});
};
a2.util = {
print: function (s, opts) {
$("#a2text").text(s);
// print options for the ask method
if(opts) {
var functionBuilder = function (target) {
return function () {
a2.util.print("");
a2.fireEvent(["click", target]);
};
};
var ul = $("<ul/>");
for(var i=0; i<opts.length; i++) {
var li = $("<li class='pseudolink'/>");
li.click(functionBuilder(opts[i][0]));
li.text(opts[i][1]);
ul.append(li);
}
$("#a2text").append(ul);
}
},
goto: function (p) {
// prevent side effects
a2.timer.clear();
// this was for old Widgets!
//$("audio").each(function (a,b) { b.autoplay = false; b.pause(); });
// stop background noises, keep music
a2.audio.stop("background");
// actually go to page
a2.loadPage(p);
},
timeoutIsSet: function () {
return ! isNaN(a2.timer.pt);
}
};
a2.items = {};
a2.loadItem = function loadItem(n){
a2.log("load", n);
var response = $.ajax({
url: a2.makeUrl("item/"+n+"?action=render"),
async: false
});
if (response.status != 200) {
a2.debugError("Fehler beim Laden von Item "+n+": "+response.statusText);
return;
}
a2.clearScope(n);
a2.items[n] = response.responseText;
a2.log(a2.items);
a2.renderItems();
a2.fireEvent(["add",n]);
};
a2.renderItems = function renderItems(){
$("#a2items, #a2pseudoitems").empty()
a2.debugItems();
for (var item in a2.items){
if (item[0] == "_") {
// skip "virtual" status items
$("#a2pseudoitems").append(a2.items[item]);
continue;
}
var $flbox=$('<div class="a2itembox" />');
var $fl=$('<div class="a2item" />');
$flbox.append($fl);
$fl.append(a2.items[item]);
$("#a2items").append($flbox);
$fl.draggable({
// cursorAt: {top: -5, left: -5},
revert: true,
zIndex: 10000,
start: function(event, ui) {
ui.helper.bind("click.prevent", function(event) { event.preventDefault(); });
},
stop: function(event, ui) {
setTimeout(function(){ui.helper.unbind("click.prevent");}, 300);
}
});
$fl.data("item",item);
$fl.click(function () {
a2.clearEventChain();
a2.fireEvent(["activate",$(this).data("item")]);
});
$fl.droppable({
drop: function (event, ui) {
a2.clearEventChain();
a2.fireEvent(["combine",ui.draggable.data("item"),$(this).data("item")]);
return false;
}
});
a2.log($("#a2items"))
}
}
a2.util.add = function add (i) {
a2.loadItem(i);
};
a2.util.remove = function remove(i) {
delete a2.items[i];
delete a2.events[i];
delete a2.virtuals[i];
a2.renderItems();
a2.fireEvent(["remove",i]);
};
a2.util.removeAll = function removeAll(v) {
for (i in a2.virtuals)
if( a2.virtuals[i].indexOf(v) > -1 ) {
delete a2.items[i];
delete a2.events[i];
delete a2.virtuals[i];
a2.fireEvent(["remove",i]);
}
a2.renderItems();
}
a2.util.hasVirtual = function hasVirtual (v) {
for (i in a2.virtuals)
if( a2.virtuals[i].indexOf(v) > -1 )
return i;
return false;
}
a2.ui = {};
a2.ui.getAreaBox = function getAreaBox (area) {
var $area = $(area);
var shape = $area.attr("shape");
var p = $area.attr("coords");
p = p.split(",")
p = $.map(p, function(x){ return parseInt(x);});
if (shape == "circle"){
var x1 = p[0] - p[2];
var y1 = p[1] - p[2];
var x2 = p[0] + p[2];
var y2 = p[1] + p[2];
} else {
var x1 = Infinity;
var y1 = Infinity;
var x2 = -Infinity;
var y2 = -Infinity;
for(var i=0; i<p.length; i=i+2){
if (p[i] < x1) x1 = p[i];
if (p[i+1] < y1) y1 = p[i+1];
if (p[i] > x2) x2 = p[i];
if (p[i+1] > y2) y2 = p[i+1];
}
}
return {x1:x1, y1:y1, x2:x2, y2:y2};
};
a2.ui.getDroparea = function getDroparea (img, ui) {
var $areas = $("area");
return $areas.filter(function () {
var b = a2.ui.getAreaBox(this);
var s = 25; // half itemsize
var xm = (b.x1 + b.x2) / 2;
var ym = (b.y1 + b.y2) / 2;
var dx = ui.offset.left - $(img).offset().left + s;
var dy = ui.offset.top - $(img).offset().top + s;
return (b.x1 < dx && dx < b.x2 &&
b.y1 < dy && dy < b.y2) ||
(dx - s < xm && xm < dx + s &&
dy - s < ym && ym < dy + s);
});
}
a2.stateEncode = function () {
var s = String(a2.cpage);
for (var i in a2.items)
s+="|"+i;
return s
}
a2.stateDecode = function (s) {
a2.clearEventChain();
var c = s.split("|");
a2.items = {};
a2.virtuals = {};
a2.events = {}
for (var j=1; j<c.length; j++) {
a2.items[c[j]] = "<img src='/images/a/a6/A2loading.gif' alt='Loading …' />";
}
a2.renderItems();
for (var j=1; j<c.length; j++)
a2.loadItem(c[j]);
a2.loadPage(parseInt(c[0]));
}
a2.crypt = function crypt (str, encode) {
if (encode){
var n = Math.floor((Math.random()*9))+1;
out = String(n);
} else {
var n = - parseInt(str.substr(0,1));
var out = "";
str = str.substr(1);
}
var chain = "pwoTä7eGNVk1SAldv0mJ9zIöPE4x8rF|B6ybüjZDC5cqfRhOXsQY23iUngLWuMHatK";
var mk = function(i){ return i % chain.length };
for (var i=0; i<str.length; i++) {
var c = str.substr(i,1);
var ind = chain.indexOf(c);
if (ind == -1)
out += c;
else
out += chain.substr(mk(ind + n),1);
}
return out;
}
/* DEBUGGER */
a2.debugEvent = function debugEvent (ev) {
if (!$("#a2dbgBottom").length)
return;
$("#a2dbgEventLog").append($("<li/>").text(ev).append("<ul/>"));
$("#a2dbgBottom:visible").scrollTop($("#a2dbgBottom")[0].scrollHeight);
}
a2.debugEventInstance = function debugEventInstance (sc,n,cond) {
if (!$("#a2dbgBottom").length)
return;
var classname = cond ? "a2fired" : "a2notfired";
$("#a2dbgEventLog li ul").last().append($("<li/>").text(sc+"->"+n).addClass(classname));
$("#a2dbgBottom:visible").scrollTop($("#a2dbgBottom")[0].scrollHeight);
}
a2.debugPage = function debugPage (p) {
$("#a2dbgGoto").val(p);
}
a2.debugItems = function debugItems() {
var s = [];
for (i in a2.items)
s.push(i);
$("#a2dbgItems").val(s.join("\n"));
}
a2.debugError = function debugError(text) {
if (!$("#a2dbgBottom").length)
return;
a2.errorCount ++;
$("#a2errorCount").text(a2.errorCount);
$("#a2dbgEventLog").append($("<li/>").text(text).addClass("a2error"));
$("#a2dbgBottom:visible").scrollTop($("#a2dbgBottom")[0].scrollHeight);
}
// provide timer functions
a2.timer = {
time: 0,
pt: NaN,
fn: null,
set: function set(n, fn) {
if (! isNaN(a2.timer.pt)) {
// do not set timer if timer already active
return;
}
a2.timer.time = n;
a2.timer.fn = fn;
a2.timer.pt = setInterval(function () {
a2.timer.time--;
if (a2.timer.time <= 0) {
clearInterval(a2.timer.pt);
a2.timer.pt = NaN;
$("#_t").text("0:00").fadeOut('slow');
fn();
return;
}
var sec = a2.timer.time % 60;
if (sec < 10)
sec = "0" + sec;
$("#_t").show().text(String(Math.floor(a2.timer.time / 60)) + ":" + sec );
}, 1000);
},
clear: function clear() {
if (! isNaN(a2.timer.pt)) {
clearInterval(a2.timer.pt);
a2.timer.pt = NaN;
$("#_t").fadeOut();
}
}
};
// provide audio functions
a2.audio = {
cache: {},
current: [],
fetch: function fetch(file) {
var data = $.ajax({
type: "GET",
url: "/api.php",
data: {
action: "parse",
format: "xml",
text: "{{filepath:"+file+"}}"
},
async: false
});
var html = $(data.responseText).find("text").text();
var url = $(html).find("a")[0].href;
return url;
},
getaudio: function getaudio(file) {
if (a2.audio.cache[file]) {
return a2.audio.cache[file];
} else {
var url = a2.audio.fetch(file);
a2.audio.cache[file] = url;
return url;
}
},
play: function play(channel, file) {
var $player = $("#a2audio_channel_"+channel)[0];
var audiofile = a2.audio.getaudio(file);
if (audiofile != a2.audio.current[channel]) {
$player.pause();
$player.src = a2.audio.getaudio(file);
$player.load();
$player.play();
a2.audio.current[channel] = audiofile;
}
},
stop: function stop(channel) {
var $player = $("#a2audio_channel_"+channel)[0];
$player.pause();
a2.audio.current[channel] = null;
}
}