/*
---
description: mooReadAll is a plugin designed to cut html string preserving the html structure, without breaking tags. Provides a "read all" link which may call other pages, callback functions, open a layer or show the whole content in the same element.

license: MIT-style

authors:
- abidibo (Otto srl) <abidibo@gmail.com>

requires:
- core/1.3: Core
- core/1-3: Array
- core/1-3: String
- core/1-3: Function 
- core/1-3: Event
- core/1-3: Class
- core/1-3: Element
- core/1-3: Element.Style
- core/1-3: Element.Event
- core/1-3: Element.Dimensions
- core/1-3: Fx.Tween 
- more/1.3: Drag

provides:
- mooReadAll

...

For documentation, demo and download link please visit http://www.abidibo.net/projects/js/mooReadAll

*/
var mooReadAll=new Class({Implements:[Options],options:{words:60,remove_tags:[],display_style:"block",truncate_characters:"...",action_label:"read all",action:"layer",return_label:"back",layer_id:"",layer_width:800,layer_draggable:false,layer_resizable:false,layer_text_resizable:false,link_href:"",link_target:"_blank",callback:null,callback_param:null},initialize:function(a){if(a){this.setOptions(a)}this.max_z_index=this.getMaxZindex();this.max_text_size=22;this.min_text_size=8},setProperties:function(a){var b={words:typeof a.words!="undefined"?a.words.toInt():this.options.words.toInt(),remove_tags:typeOf(a.remove_tags)==="array"||(typeOf(a.remove_tags)==="string"&&a.remove_tags==="all")?a.remove_tags:this.options.remove_tags,truncate_characters:typeOf(a.truncate_characters)==="string"?a.truncate_characters:this.options.truncate_characters,display_style:typeOf(a.display_style)==="string"?a.display_style:this.options.display_style,action:typeOf(a.action)==="string"?a.action:this.options.action,action_label:typeOf(a.action_label)==="string"?a.action_label:this.options.action_label,return_label:typeOf(a.return_label)==="string"?a.return_label:this.options.return_label,link_href:typeOf(a.link_href)==="string"?a.link_href:this.options.link_href,link_target:typeOf(a.link_target)==="string"?a.link_target:this.options.link_target,callback:typeOf(a.callback)==="function"?a.callback:this.options.callback,callback_param:typeof a.callback_param!="undefined"?a.callback_param:this.options.callback_param,layer_id:typeOf(a.layer_id)==="string"?a.layer_id:this.options.layer_id,layer_width:typeof a.layer_width!="undefined"?a.layer_width.toInt():this.options.layer_width.toInt(),layer_draggable:typeOf(a.layer_draggable)==="boolean"?a.layer_draggable:this.options.layer_draggable,layer_resizable:typeOf(a.layer_resizable)==="boolean"?a.layer_resizable:this.options.layer_resizable,layer_text_resizable:typeOf(a.layer_text_resizable)==="boolean"?a.layer_text_resizable:this.options.layer_text_resizable};return b},add:function(c,b){if(typeOf(c)==="string"){this.elements=$$(c)}else{if(typeOf(c)==="elements"){this.elements=c}else{if(typeOf(c)==="element"){this.elements=[c]}else{this.elements=[]}}}for(var a=0;a<this.elements.length;a++){this.apply(this.elements[a],b)}},apply:function(b,d){if(typeOf(d)!=="object"){d={}}var f=this.setProperties(d);var a=b.get("html");this.hideElement(b,f);var c=this.cut(a,f);var e=this.actionLink(b,a,c,f);b.set("html",c);e.inject(b,"bottom");this.showElement(b,f)},hideElement:function(a,b){if(b.display_style=="none"){return 0}else{if(b.display_style=="visible"){a.style.visibility="hidden"}else{a.style.display="none"}}}.protect(),showElement:function(a,b){if(b.display_style=="none"){return 0}if(b.display_style=="visible"){a.style.visibility=b.display_style}else{a.style.display=b.display_style}}.protect(),cut:function(j,c){var b="<([a-zA-Z]+)s?[^>]*?>";var a="</([a-zA-Z]+)>";var h="</?[a-zA-Z]+s?[^>]*?/?>";var o=new RegExp(b);var s=new RegExp(a);var n=new RegExp(b+"|"+a,"g");var l=j.replace(n,"");var r=l.split(" ");if(r.length<=c.words){return j}var d=new RegExp("("+h+")?[^<]*","g");matches=j.match(d);cut_html="";opened_tag=[];var g=0;for(var q=0;q<matches.length;q++){if(matches[q].trim()){var p=matches[q];var e=new RegExp("("+h+")?([^<]*)","g");part_matches=e.exec(p);if(typeof part_matches[1]!="undefined"){var t=part_matches[1];if(tag_match=t.match(o)){tag_name=tag_match[1];if(c.remove_tags.contains(tag_name)||c.remove_tags==="all"){}else{if(tag_name=="img"||tag_name=="br"){cut_html+=t.substr(0,t.length-1)+" />"}else{opened_tag.push(tag_name);cut_html+=t}}}else{if(tag_match=t.match(s)){tag_name=tag_match[1];if(c.remove_tags.contains(tag_name)||c.remove_tags==="all"){}else{opened_tag.pop();cut_html+=t}}}}if(typeof part_matches[2]!="undefined"){var r=part_matches[2].split(" ");var m=/^\s*$/.test(r[0])?true:false;r.erase("");if(/^\s*$/.test(r[0])){r.splice(0,1)}var f=[];if(g+r.length<c.words){cut_html+=part_matches[2];g+=r.length}else{var k=c.words-g;for(var q=0;q<k;q++){f.push(r[q])}if(m){cut_html+=" "}cut_html+=f.join(" ");break}}}}cut_html+=c.truncate_characters;for(var q=opened_tag.length-1;q>=0;q--){cut_html+="</"+opened_tag[q]+">"}if(c.remove_tags==="all"){cut_html+=" "}return cut_html},actionLink:function(b,a,d,g){tag=g.action==="link"?"a":"span";var c=g.action_label;var f=new Element(tag,{"class":"link",html:c});if(g.action==="inplace"){var e=g.return_label;f.addEvent("click",function(){b.set("html",a);if(e){var h=new Element("span",{"class":"link",html:e});h.addEvent("click",function(){b.set("html",d);f.set("html",c);f.inject(b,"bottom")}.bind(this));h.inject(b,"bottom")}}.bind(this))}else{if(g.action==="link"){f.setProperty("href",g.link_href);f.setProperty("target",g.link_target)}else{if(g.action==="callback"){f.addEvent("click",g.callback.bind(this,b,g.callback_param))}else{if(g.action==="layer"){f.addEvent("click",this.showInLayer.bind(this,b,a,g))}}}}return f},showInLayer:function(b,a,c){this.disableObjects();this.renderOverlay(b,a,c)},renderLayer:function(c,b,d){this.layer=new Element("div",{"class":"mra_layer",id:this.layer_id});this.layer.setStyles({position:"absolute",width:d.layer_width,visibility:"hidden","z-index":++this.max_z_index});this.layerTitle(c);this.layerBody(b);this.layer.inject(document.body);this.layer.setStyles({top:this.getViewport().cY-this.layer.getCoordinates().height/2,left:this.getViewport().cX-this.layer.getCoordinates().width/2,visibility:"visible"});if(d.layer_resizable){this.makeResizable()}if(d.layer_text_resizable){this.makeTextResizable()}if(d.layer_draggable){this.makeDraggable()}var a=new Element("div",{"class":"mra_close"});a.inject(this.layer,"top");a.addEvent("click",function(){this.closeLayer()}.bind(this))},layerTitle:function(a){if(typeof a.getProperty("data-title")!="undefined"){var b=new Element("div",{"class":"mra_title"});b.set("html",a.getProperty("data-title"));b.inject(this.layer,"top")}}.protect(),layerBody:function(b){var a=new Element("div",{"class":"mra_layer_body"});a.set("html",b);a.inject(this.layer)}.protect(),closeLayer:function(){this.layer.destroy();this.overlay_anim.start(0.7,0);this.enableObjects()},makeDraggable:function(){var b=new Element("div",{"class":"mra_drag"});b.inject(this.layer,"top");var a=document.getCoordinates();var c=new Drag(this.layer,{handle:b,limit:{x:[0,(a.width-this.layer.getCoordinates().width)],y:[0,]}})}.protect(),makeResizable:function(){var c=new Element("div",{"class":"mra_resize"});c.inject(this.layer,"bottom");var a=$$("body")[0].getSize().y-20;var b=$$("body")[0].getSize().x-20;this.layer.makeResizable({handle:c,limit:{x:[200,b],y:[60,a]}})}.protect(),makeTextResizable:function(){var a=new Element("div",{"class":"mra_text_smaller"});a.addEvent("click",function(){new_size=this.layer.getStyle("font-size").toInt()<(this.min_text_size+1)?this.min_text_size:this.layer.getStyle("font-size").toInt()-1;this.layer.setStyle("font-size",new_size+"px")}.bind(this));a.inject(this.layer,"top");var b=new Element("div",{"class":"mra_text_bigger"});b.addEvent("click",function(){new_size=this.layer.getStyle("font-size").toInt()>(this.max_text_size-1)?this.max_text_size:this.layer.getStyle("font-size").toInt()+1;this.layer.setStyle("font-size",new_size+"px")}.bind(this));b.inject(this.layer,"top")}.protect(),sameDomain:function(c){var a=location.href;local=a.substring(0,a.indexOf(location.pathname));try{c=c.document;return c&&c.URL&&c.URL.indexOf(local)==0}catch(b){return false}}.protect(),disableObjects:function(){for(var a=0;a<window.frames.length;a++){var c=window.frames[a];if(this.sameDomain(c)){var d=c.document.getElementsByTagName("object");for(var b=0;b<d.length;b++){d[b].style.visibility="hidden"}}}$$("object").each(function(e){e.style.visibility="hidden"})}.protect(),enableObjects:function(){for(var a=0;a<window.frames.length;a++){var c=window.frames[a];if(this.sameDomain(c)){var d=c.document.getElementsByTagName("object");for(var b=0;b<d.length;b++){d[b].style.visibility="visible"}}}$$("object").each(function(e){e.style.visibility="visible"})}.protect(),renderOverlay:function(c,b,d){var a=document.getScrollSize();this.overlay=new Element("div",{"class":"mra_overlay"});this.overlay.setStyles({position:"absolute",top:"0px",left:"0px",width:a.x,height:a.y,"z-index":++this.max_z_index,opacity:0});this.overlay.inject(document.body);this.overlay_anim=new Fx.Tween(this.overlay,{property:"opacity"});this.overlay_anim.start(0,0.7).chain(function(){this.renderLayer(c,b,d)}.bind(this));return this}.protect(),getMaxZindex:function(){var a=0;$$("body *").each(function(b){if(b.getStyle("z-index").toInt()){a=Math.max(a,b.getStyle("z-index").toInt())}});return a}.protect(),getViewport:function(){var b,a,d,c,f,e;if(typeof window.innerWidth!="undefined"){b=window.innerWidth,a=window.innerHeight}else{if(typeof document.documentElement!="undefined"&&typeof document.documentElement.clientWidth!="undefined"&&document.documentElement.clientWidth!=0){b=document.documentElement.clientWidth,a=document.documentElement.clientHeight}}c=typeof self.pageYOffset!="undefined"?self.pageYOffset:(document.documentElement&&document.documentElement.scrollTop)?document.documentElement.scrollTop:document.body.clientHeight;d=typeof self.pageXOffset!="undefined"?self.pageXOffset:(document.documentElement&&document.documentElement.scrollTop)?document.documentElement.scrollLeft:document.body.clientWidth;f=d+b/2;e=c+a/2;return{width:b,height:a,left:d,top:c,cX:f,cY:e}}.protect()});

