(function($){$.expander={version:'1.4',defaults:{slicePoint:100,preserveWords:true,widow:4,expandText:'read more',expandPrefix:'&hellip; ',expandAfterSummary:false,summaryClass:'summary',detailClass:'details',moreClass:'read-more',lessClass:'read-less',collapseTimer:0,expandEffect:'fadeIn',expandSpeed:250,collapseEffect:'fadeOut',collapseSpeed:200,userCollapse:true,userCollapseText:'read less',userCollapsePrefix:' ',onSlice:null,beforeExpand:null,afterExpand:null,onCollapse:null}};$.fn.expander=function(options){var meth='init';if(typeof options=='string'){meth=options;options={}}var opts=$.extend({},$.expander.defaults,options),rSelfClose=/^<(?:area|br|col|embed|hr|img|input|link|meta|param).*>$/i,rAmpWordEnd=/(&(?:[^;]+;)?|\w+)$/,rOpenCloseTag=/<\/?(\w+)[^>]*>/g,rOpenTag=/<(\w+)[^>]*>/g,rCloseTag=/<\/(\w+)>/g,rLastCloseTag=/(<\/[^>]+>)\s*$/,rTagPlus=/^<[^>]+>.?/,delayedCollapse;var methods={init:function(){this.each(function(){var i,l,tmp,summTagLess,summOpens,summCloses,lastCloseTag,detailText,$thisDetails,$readMore,openTagsForDetails=[],closeTagsForsummaryText=[],defined={},thisEl=this,$this=$(this),$summEl=$([]),o=$.meta?$.extend({},opts,$this.data()):opts,hasDetails=!!$this.find('.'+o.detailClass).length,hasBlocks=!!$this.find('*').filter(function(){var display=$(this).css('display');return(/^block|table|list/).test(display)}).length,el=hasBlocks?'div':'span',detailSelector=el+'.'+o.detailClass,moreSelector='span.'+o.moreClass,expandSpeed=o.expandSpeed||0,allHtml=$.trim($this.html()),allText=$.trim($this.text()),summaryText=allHtml.slice(0,o.slicePoint);if($.data(this,'expander')){return}$.data(this,'expander',true);$.each(['onSlice','beforeExpand','afterExpand','onCollapse'],function(index,val){defined[val]=$.isFunction(o[val])});summaryText=backup(summaryText);summTagless=summaryText.replace(rOpenCloseTag,'').length;while(summTagless<o.slicePoint){newChar=allHtml.charAt(summaryText.length);if(newChar=='<'){newChar=allHtml.slice(summaryText.length).match(rTagPlus)[0]}summaryText+=newChar;summTagless++}summaryText=backup(summaryText,o.preserveWords);summOpens=summaryText.match(rOpenTag)||[];summCloses=summaryText.match(rCloseTag)||[];tmp=[];$.each(summOpens,function(index,val){if(!rSelfClose.test(val)){tmp.push(val)}});summOpens=tmp;l=summCloses.length;for(i=0;i<l;i++){summCloses[i]=summCloses[i].replace(rCloseTag,'$1')}$.each(summOpens,function(index,val){var thisTagName=val.replace(rOpenTag,'$1');var closePosition=$.inArray(thisTagName,summCloses);if(closePosition===-1){openTagsForDetails.push(val);closeTagsForsummaryText.push('</'+thisTagName+'>')}else{summCloses.splice(closePosition,1)}});closeTagsForsummaryText.reverse();if(!hasDetails){detailText=allHtml.slice(summaryText.length);if(detailText===''||detailText.split(/\s+/).length<o.widow){return}lastCloseTag=closeTagsForsummaryText.pop()||'';summaryText+=closeTagsForsummaryText.join('');detailText=openTagsForDetails.join('')+detailText}else{detailText=$this.find(detailSelector).remove().html();summaryText=$this.html();allHtml=summaryText+detailText;lastCloseTag=''}o.moreLabel=$this.find(moreSelector).length?'':buildMoreLabel(o);if(hasBlocks){detailText=allHtml}summaryText+=lastCloseTag;o.summary=summaryText;o.details=detailText;o.lastCloseTag=lastCloseTag;if(defined.onSlice){tmp=o.onSlice.call(thisEl,o);o=tmp&&tmp.details?tmp:o}var html=buildHTML(o,hasBlocks);$this.html(html);$thisDetails=$this.find(detailSelector);$readMore=$this.find(moreSelector);$thisDetails.hide();$readMore.find('a').unbind('click.expander').bind('click.expander',expand);$summEl=$this.find('div.'+o.summaryClass);if(o.userCollapse&&!$this.find('span.'+o.lessClass).length){$this.find(detailSelector).append('<span class="'+o.lessClass+'">'+o.userCollapsePrefix+'<a href="#">'+o.userCollapseText+'</a></span>')}$this.find('span.'+o.lessClass+' a').unbind('click.expander').bind('click.expander',function(event){event.preventDefault();clearTimeout(delayedCollapse);var $detailsCollapsed=$(this).closest(detailSelector);reCollapse(o,$detailsCollapsed);if(defined.onCollapse){o.onCollapse.call(thisEl,true)}});function expand(event){event.preventDefault();$readMore.hide();$summEl.hide();if(defined.beforeExpand){o.beforeExpand.call(thisEl)}$thisDetails.stop(false,true)[o.expandEffect](expandSpeed,function(){$thisDetails.css({zoom:''});if(defined.afterExpand){o.afterExpand.call(thisEl)}delayCollapse(o,$thisDetails,thisEl)})}})},destroy:function(){if(!this.data('expander')){return}this.removeData('expander');this.each(function(){var $this=$(this),o=$.meta?$.extend({},opts,$this.data()):opts,details=$this.find('.'+o.detailClass).contents();$this.find('.'+o.moreClass).remove();$this.find('.'+o.summaryClass).remove();$this.find('.'+o.detailClass).after(details).remove();$this.find('.'+o.lessClass).remove()})}};if(methods[meth]){methods[meth].call(this)}function buildHTML(o,blocks){var el='span',summary=o.summary;if(blocks){el='div';if(rLastCloseTag.test(summary)&&!o.expandAfterSummary){summary=summary.replace(rLastCloseTag,o.moreLabel+'$1')}else{summary+=o.moreLabel}summary='<div class="'+o.summaryClass+'">'+summary+'</div>'}else{summary+=o.moreLabel}return[summary,'<',el+' class="'+o.detailClass+'"','>',o.details,'</'+el+'>'].join('')}function buildMoreLabel(o){var ret='<span class="'+o.moreClass+'">'+o.expandPrefix;ret+='<a href="#">'+o.expandText+'</a></span>';return ret}function backup(txt,preserveWords){if(txt.lastIndexOf('<')>txt.lastIndexOf('>')){txt=txt.slice(0,txt.lastIndexOf('<'))}if(preserveWords){txt=txt.replace(rAmpWordEnd,'')}return txt}function reCollapse(o,el){el.stop(true,true)[o.collapseEffect](o.collapseSpeed,function(){var prevMore=el.prev('span.'+o.moreClass).show();if(!prevMore.length){el.parent().children('div.'+o.summaryClass).show().find('span.'+o.moreClass).show()}})}function delayCollapse(option,$collapseEl,thisEl){if(option.collapseTimer){delayedCollapse=setTimeout(function(){reCollapse(option,$collapseEl);if($.isFunction(option.onCollapse)){option.onCollapse.call(thisEl,false)}},option.collapseTimer)}}return this};$.fn.expander.defaults=$.expander.defaults})(jQuery);
