// Effects Plugin for eXeLearning
// By Ignacio Gros (http://www.gros.es/) for eXeLearning (http://exelearning.net/)
// Creative Commons Attribution-ShareAlike (http://creativecommons.org/licenses/by-sa/3.0/)
$exeFX = {
baseClass : "exe",
h2 : "h2",
isOldBrowser : false,
init : function(){
var ie = $exeFX.checkIE();
if ((!isNaN(parseFloat(ie)) && isFinite(ie)) && ie<9) {
$exeFX.isOldBrowser = true;
$exeFX.h2 = "H2";
}
var k = $exeFX.baseClass;
var f = $("."+k+"-fx");
var hasTimeLines = false;
$("."+k+"-fx").each(function(i){
var c = this.className;
if (c.indexOf(" "+k+"-accordion")!=-1) $exeFX.accordion.init(this,i);
else if (c.indexOf(" "+k+"-tabs")!=-1) $exeFX.tabs.init(this,i);
else if (c.indexOf(" "+k+"-paginated")!=-1) $exeFX.paginated.init(this,i);
else if (c.indexOf(" "+k+"-carousel")!=-1) $exeFX.carousel.init(this,i);
else if (c.indexOf(" "+k+"-timeline")!=-1 && document.body.className.indexOf("exe-epub3")!=0) {
$exeFX.timeline.init(this,i);
hasTimeLines = true;
}
});
if (hasTimeLines) {
setTimeout(function(){$.timeliner({});},500);
}
},
hex2rgb : function(h,a){
// h should be #rrggbb
var hex = parseInt(h.substring(1), 16);
var r = (hex & 0xff0000) >> 16;
var g = (hex & 0x00ff00) >> 8;
var b = hex & 0x0000ff;
// return [r, g, b];
var c = "rgb";
if (a) c += "a";
c += "("+r+","+g+","+b+"";
if (a) c+= ","+a;
c += ")";
return c;
},
removeXMLNS : function(t) {
if (document.body.className.indexOf("exe-epub3")==0) {
var xmlnsString = 'h2 xmlns="http://www.w3.org/1999/xhtml"';
var xmlnsStringExp = new RegExp(xmlnsString, 'g');
t = t.replace(xmlnsStringExp, 'h2');
}
return t;
},
rftTitles : function(t) {
// Remove all attributes (except the title)
var div = $("
");
div.html(t);
$("h2",div).each(function() {
var attributes = $.map(this.attributes, function(item) {
return item.name;
});
var title = $(this);
$.each(attributes, function(i, item) {
if (item.toLowerCase()!="title") title.removeAttr(item);
});
});
t = div.html();
// Remove xmlns="http://www.w3.org/1999/xhtml"
t = $exeFX.removeXMLNS(t);
// Replace by
. That's how TinyMCE inserts the title when using the Insert/Edit Attributes option
var s = t.split('<'+$exeFX.h2+' title="');
var n ="";
if (s.length<2) return t;
for (var i=0;i",""+$exeFX.h2+">");
}
return n;
},
noFX : function(e) {
// Wrong HTML (no H2, etc.): No effects or special presentation
e.attr("class","").css("padding","1em");
},
accordion : {
closeBlock : function(aID){
var k = $exeFX.baseClass;
$('.fx-accordion-title',"#"+aID).removeClass('active');
$('.fx-accordion-content',"#"+aID).slideUp(300).removeClass('open');
},
enable : function(x){
var k = $exeFX.baseClass;
var t = $('.fx-accordion-title',x);
// Get the box shadow color
var color = '';
var title = t.eq(0);
if (title.length==1) {
color = title.css("background-color");
if (typeof(color)=="string") {
color = color.replace("rgb(","rgba(").replace(")",",0.5)");
if (color.indexOf("rgba(")==0) x.css("box-shadow","0px 1px 3px "+color);
// Get border color (titles)
color = x.css("background-color");
if (typeof(color)=="string") {
color = color.replace("rgb(","rgba(").replace(")",",0.2)");
if (color.indexOf("rgba(")==0) {
t.each(function(){
this.style.borderColor=color;
});
}
}
}
}
// onclick
t.click(function(e) {
var aID = this.id.split("-")[0];
aID = aID.replace("_","-").replace("_","-");
var currentAttrValue = $(this).attr('href');
// IE7 retrieves link#hash instead of #hash
currentAttrValue = currentAttrValue.split("#");
currentAttrValue = "#"+currentAttrValue[1];
// / IE7
var target = $(e.target);
var targetName;
if ($exeFX.isOldBrowser) targetName = target[0].nodeName;
else targetName = target[0].localName;
if (targetName==$exeFX.h2) target = target.parent();
if(target.is('.active')) {
$exeFX.accordion.closeBlock(aID);
} else {
$exeFX.accordion.closeBlock(aID);
$(this).addClass('active');
$('.'+k+'-accordion ' + currentAttrValue).slideDown(300).addClass('open');
}
e.preventDefault();
});
},
rft : function(e,i){
var html = "";
var h = e.html();
h = $exeFX.rftTitles(h);
var p = h.split('<'+$exeFX.h2+'>');
if (p.length==h.split(''+$exeFX.h2+'>').length) {
for (var x=1; x'+p[x];
}
}
var k = $exeFX.baseClass;
if ($exeFX.isOldBrowser) {
html = html.replace(/\n\n/g, '
\n');
} else {
html = html.replace(/
\n\n/g, '
\n
');
}
// Something went wrong (see #318)
if (html=="") {
$exeFX.noFX(e);
return;
}
html = html + '
';
e.html('\n');
var h2 = $("h2",e);
$(".fx-accordion-content",e).each(function(y){
var id = k+"-accordion-"+i+"-"+y;
this.id = id;
h2.eq(y).wrap('');
});
$exeFX.accordion.enable(e);
},
init : function(x,i){
var e = $(x);
var a = $("h2",e);
if (a.length>0) $exeFX.accordion.rft(e,i);
else $exeFX.noFX(e);
}
},
timeline : {
getColor : function(e){
var c = e.css("color");
if (c.indexOf("rgb")!=0) return c;
return $exe.rgb2hex(c);
},
rft : function(e,i){
var k = $exeFX.baseClass;
var gID = k+"-timeline-"+i;
e.attr("id",gID);
var mainColor = $exeFX.timeline.getColor(e);
var titlesColor = $exe.useBlackOrWhite(mainColor.replace("#",""));
var html = "";
var o = e.html();
var h2 = "";
var _h2 = "
";
var h3 = "";
var _h3 = "";
var oldB = false;
if (o.indexOf("0) {
var partTitle = "";
var partContent = "";
var part = n[i];
var part2 = part.split(_h2);
if (part2.length==2) {
partTitle = part2[0];
partContent = part2[1];
// Count the number of H3 in each content
var p2 = partContent.split(_h3)
if (p2.length==1 || p2.length==0) {
partTitle = "";
partContent = "";
} else {
if (oldB) {
partContent = partContent.replace(/\<\/H3>/g,'
\n
');
partContent = partContent.replace(/\
/g,'
\n\n');
partContent = partContent.replace(/\
/g,'
\n ','');
partContent += '';
partContent = '\n
\n
\n'+partContent+'\n
\n
'
html += partContent;
}
}
}
}
if (html!="") {
e.addClass("fx-timeline-container").css("border-color",mainColor);
var ie = $exeFX.checkIE();
if ((!isNaN(parseFloat(ie)) && isFinite(ie)) && ie<8) {
e.addClass("fx-static-timeline-container");
html = html.replace(/—
'+$exe_i18n.show+'
'+html)
}
$(".fx-timeline-event",e).each(function(z){
this.id = "event-"+e.attr("id")+"-"+z+"EX";
});
$(".fx-timeline-event-trigger",e).each(function(z){
this.id = "event-"+e.attr("id")+"-"+z;
});
}
// Add a STYLE tag HEAD
if (oldB==false) {
var css = "";
$("HEAD").append(css);
}
},
init : function(x,i) {
var e = $(x);
var h2 = $("H2",e);
var h3 = $("H3",e);
if (h2.length>0 && h3.length>0) $exeFX.timeline.rft(e,i);
else $exeFX.noFX(e);
}
},
tabs : {
show : function(gID,id){
var g = $("#"+gID);
$(".fx-tabs li",g).removeClass("fx-current").removeClass("fx-C2");
$("#"+id+"-link").addClass("fx-current fx-C2");
$(".fx-tab-content",g).removeClass("fx-current");
$("#"+id).addClass("fx-current");
},
rft : function(e,i){
var html = "";
var k = $exeFX.baseClass;
var gID = k+"-tabs-"+i;
var h = e.html();
h = $exeFX.rftTitles(h);
var p = h.split('<'+$exeFX.h2+'>');
if (p.length==h.split(''+$exeFX.h2+'>').length) {
for (var x=1; x'+p[x];
}
}
if ($exeFX.isOldBrowser) {
html = html.replace(/\n\n\n\n\n\n';
e.attr("id",gID).html(html);
var ul = '\n';
$(".fx-tab-content",e).each(function(y){
var h2 = $("H2",this).eq(0);
// Default tab title
var t = y+1;
if (h2.length==0) {
// Can't getElementsByTagName("H2") in some ePub readers (xmlns="http://www.w3.org/1999/xhtml"...)
var tit = this.innerHTML.split(">");
if (tit.length>1) tit = tit[1];
tit = tit.split("<");
if (tit.length>1) tit = tit[0];
if (tit.length>0) t = tit;
} else {
// Normal behavior
t = h2.text();
}
var hT = $("SPAN",h2);
if (hT.length==1) {
hT = hT.eq(0).attr("title");
if (hT) {
t = hT;
h2.removeClass("sr-av")
}
}
var id = k+"-tab-"+i+"-"+y;
var c = "";
if (y==0) {
c += ' class="fx-current fx-C2"';
this.className += " fx-current fx-default-panel";
}
ul += '- '+t+'
\n';
this.id = id;
});
ul += '
';
e.prepend(ul);
// onclick
$(".fx-tabs a",e).click(
function(){
var c = this.className;
c = c.split(" ");
for (var i=0;i0) $exeFX.tabs.rft(e,i);
else $exeFX.noFX(e);
}
},
paginated : {
show : function(gID,id,n){
n = parseInt(n);
var g = $("#"+gID);
var lis = $(".fx-pagination li",g);
// Pagination
var l = (lis.length-2);
if (l==1) return false;
var prevLi = $("#"+gID+"-prev");
var prevA = document.getElementById(gID+"-prev-lnk");
var nextLi = $("#"+gID+"-next");
var nextA = document.getElementById(gID+"-next-lnk");
if (!prevA || !nextA) return false;
if (n==0) {
// Prev
prevLi.addClass("fx-disabled");
prevA.className = "fx-disabled-link";
// Next
nextLi.removeClass("fx-disabled");
nextA.className = "exeFXPageLink"+gID+"_"+gID+"-1_1";
} else {
// Prev
prevLi.removeClass("fx-disabled");
prevA.className = "exeFXPageLink"+gID+"_"+gID+"-"+(n-1)+"_"+(n-1);
// Next
if ((n+2)>l) {
nextLi.addClass("fx-disabled");
nextA.className = "fx-disabled-link";
} else {
nextLi.removeClass("fx-disabled");
nextA.className = "exeFXPageLink"+gID+"_"+gID+"-"+(n+1)+"_"+(n+1);
}
}
lis.removeClass("fx-current").removeClass("fx-C1");
$("#"+id+"-link").addClass("fx-current fx-C1");
$(".fx-page-content",g).removeClass("fx-current");
$("#"+id).addClass("fx-current");
},
init : function(x,i){
var e = $(x);
var a = $("h2",e);
if (a.length>0) $exeFX.paginated.rft(e,i);
else $exeFX.noFX(e);
},
rft : function(e,i){
var html = "";
var k = $exeFX.baseClass;
var gID = k+"-paginated-"+i;
var h = e.html();
h = $exeFX.rftTitles(h);
var p = h.split('<'+$exeFX.h2+'>');
if (p.length==h.split(''+$exeFX.h2+'>').length) {
for (var x=1; x'+p[x];
}
}
if ($exeFX.isOldBrowser) {
html = html.replace(/\n\n\n\n\n\n';
e.attr("id",gID).html(html);
var counter = 0;
var hasNext = false;
var ul = '';
e.prepend(ul);
// onclick
$(".fx-pagination a",e).click(
function(){
var a = $(this);
if (a.hasClass("fx-disabled-link")) {
return false;
}
var c = a.attr("class");
c = c.split(" ");
for (var i=0;il) {
nextLi.addClass("fx-disabled");
nextA.className = "fx-disabled-link";
} else {
nextLi.removeClass("fx-disabled");
nextA.className = "exeFXSlideLink"+gID+"_"+gID+"-"+(n+1)+"_"+(n+1);
}
}
lis.removeClass("fx-current").removeClass("fx-C1");
$("#"+id+"-link").addClass("fx-current fx-C1");
$(".fx-carousel-content",g).hide();
$("#"+id).fadeIn("slow",function(){
$exeFX.carousel.isWorking = false;
});
},
init : function(x,i){
var e = $(x);
var a = $("h2",e);
if (a.length>0) $exeFX.carousel.rft(e,i);
else $exeFX.noFX(e);
},
rft : function(e,i){
var html = "";
var k = $exeFX.baseClass;
var gID = k+"-carousel-"+i;
var h = e.html();
h = $exeFX.rftTitles(h);
var p = h.split('<'+$exeFX.h2+'>');
if (p.length==h.split(''+$exeFX.h2+'>').length) {
for (var x=1; x'+p[x];
}
}
if ($exeFX.isOldBrowser) {
html = html.replace(/\n\n\n\n\n\n';
e.attr("id",gID).html(html);
var counter = 0;
var hasNext = false;
var ul = '';
e.append(ul);
// onclick
$(".fx-carousel-pagination a",e).click(
function(){
var a = $(this);
if (a.hasClass("fx-disabled-link")) {
return false;
}
var c = a.attr("class");
c = c.split(" ");
for (var i=0;ii){n(e(this).parents(".fx-timeline-major").find("h3 a",".fx-timeline-minor"),e(this).parents(".fx-timeline-major").find(".fx-timeline-event"))}else{r(e(this).parents(".fx-timeline-major").find(".fx-timeline-minor a"),e(this).parents(".fx-timeline-major").find(".fx-timeline-event"))}return false});e(".fx-timeline-expand").click(function(){if(e(this).hasClass("expanded")){r(e(this).parents(t.timelineContainer).find("h3 a",".fx-timeline-minor"),e(this).parents(t.timelineContainer).find(".fx-timeline-event"));e(this).removeClass("expanded").html(t.expandAllText)}else{n(e(this).parents(t.timelineContainer).find("h3 a",".fx-timeline-minor"),e(this).parents(t.timelineContainer).find(".fx-timeline-event"));e(this).addClass("expanded").html(t.collapseAllText)}return false})})}})(jQuery);