
// jQuery plugins

/*  Cycle Lite - http://malsup.com/jquery/cycle/lite/
------------------------------------------------------------------------ */

(function(D){var A="Lite-1.0";D.fn.cycle=function(E){return this.each(function(){E=E||{};if(this.cycleTimeout){clearTimeout(this.cycleTimeout)}this.cycleTimeout=0;this.cyclePause=0;var I=D(this);var J=E.slideExpr?D(E.slideExpr,this):I.children();var G=J.get();if(G.length<2){if(window.console&&window.console.log){window.console.log("terminating; too few slides: "+G.length)}return }var H=D.extend({},D.fn.cycle.defaults,E||{},D.metadata?I.metadata():D.meta?I.data():{});H.before=H.before?[H.before]:[];H.after=H.after?[H.after]:[];H.after.unshift(function(){H.busy=0});var F=this.className;H.width=parseInt((F.match(/w:(\d+)/)||[])[1])||H.width;H.height=parseInt((F.match(/h:(\d+)/)||[])[1])||H.height;H.timeout=parseInt((F.match(/t:(\d+)/)||[])[1])||H.timeout;if(I.css("position")=="static"){I.css("position","relative")}if(H.width){I.width(H.width)}if(H.height&&H.height!="auto"){I.height(H.height)}var K=0;J.css({position:"absolute",top:0,left:0}).hide().each(function(M){D(this).css("z-index",G.length-M)});D(G[K]).css("opacity",1).show();if(D.browser.msie){G[K].style.removeAttribute("filter")}if(H.fit&&H.width){J.width(H.width)}if(H.fit&&H.height&&H.height!="auto"){J.height(H.height)}if(H.pause){I.hover(function(){this.cyclePause=1},function(){this.cyclePause=0})}D.fn.cycle.transitions.fade(I,J,H);J.each(function(){var M=D(this);this.cycleH=(H.fit&&H.height)?H.height:M.height();this.cycleW=(H.fit&&H.width)?H.width:M.width()});J.not(":eq("+K+")").css({opacity:0});if(H.cssFirst){D(J[K]).css(H.cssFirst)}if(H.timeout){if(H.speed.constructor==String){H.speed={slow:600,fast:200}[H.speed]||400}if(!H.sync){H.speed=H.speed/2}while((H.timeout-H.speed)<250){H.timeout+=H.speed}}H.speedIn=H.speed;H.speedOut=H.speed;H.slideCount=G.length;H.currSlide=K;H.nextSlide=1;var L=J[K];if(H.before.length){H.before[0].apply(L,[L,L,H,true])}if(H.after.length>1){H.after[1].apply(L,[L,L,H,true])}if(H.click&&!H.next){H.next=H.click}if(H.next){D(H.next).bind("click",function(){return C(G,H,H.rev?-1:1)})}if(H.prev){D(H.prev).bind("click",function(){return C(G,H,H.rev?1:-1)})}if(H.timeout){this.cycleTimeout=setTimeout(function(){B(G,H,0,!H.rev)},H.timeout+(H.delay||0))}})};function B(J,E,I,K){if(E.busy){return }var H=J[0].parentNode,M=J[E.currSlide],L=J[E.nextSlide];if(H.cycleTimeout===0&&!I){return }if(I||!H.cyclePause){if(E.before.length){D.each(E.before,function(N,O){O.apply(L,[M,L,E,K])})}var F=function(){if(D.browser.msie){this.style.removeAttribute("filter")}D.each(E.after,function(N,O){O.apply(L,[M,L,E,K])})};if(E.nextSlide!=E.currSlide){E.busy=1;D.fn.cycle.custom(M,L,E,F)}var G=(E.nextSlide+1)==J.length;E.nextSlide=G?0:E.nextSlide+1;E.currSlide=G?J.length-1:E.nextSlide-1}if(E.timeout){H.cycleTimeout=setTimeout(function(){B(J,E,0,!E.rev)},E.timeout)}}function C(E,F,I){var H=E[0].parentNode,G=H.cycleTimeout;if(G){clearTimeout(G);H.cycleTimeout=0}F.nextSlide=F.currSlide+I;if(F.nextSlide<0){F.nextSlide=E.length-1}else{if(F.nextSlide>=E.length){F.nextSlide=0}}B(E,F,1,I>=0);return false}D.fn.cycle.custom=function(K,H,I,E){var J=D(K),G=D(H);G.css({opacity:0});var F=function(){G.animate({opacity:1},I.speedIn,I.easeIn,E)};J.animate({opacity:0},I.speedOut,I.easeOut,function(){J.css({display:"none"});if(!I.sync){F()}});if(I.sync){F()}};D.fn.cycle.transitions={fade:function(F,G,E){G.not(":eq(0)").css("opacity",0);E.before.push(function(){D(this).show()})}};D.fn.cycle.ver=function(){return A};D.fn.cycle.defaults={timeout:4000,speed:1000,next:null,prev:null,before:null,after:null,height:"auto",sync:1,fit:0,pause:0,delay:0,slideExpr:null}})(jQuery);

/*
 * jQuery Expander plugin
 * Version 0.1.1  (02/02/2008)
 * @requires jQuery v1.1.1+
 *
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */


 (function($) {

   $.fn.expander = function(options) {

     var opts = $.extend({}, $.fn.expander.defaults, options);
     var delayedCollapse;
     return this.each(function() {
       var $this = $(this);
       var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
      	var cleanedTag, startTags, endTags;	
      	var allText = $this.html();
      	var startText = allText.slice(0, o.slicePoint).replace(/(\w)$/,'');
      	startTags = startText.match(/<\w[^>]*>/g);
    	  if (startTags) {startText = allText.slice(0,o.slicePoint + startTags.join('').length).replace(/\w+$/,'');}

      	if (startText.lastIndexOf('<') > startText.lastIndexOf('>') ) {
      	  startText = startText.slice(0,startText.lastIndexOf('<'));
      	}
      	var endText = allText.slice(startText.length);    	  
      	// create necessary expand/collapse elements if they don't already exist
    	  if (!$('span.details', this).length) {
         // end script if text length isn't long enough.
        	if ( endText.replace(/\s+$/,'').split(' ').length < o.widow ) { return; }
        	// otherwise, continue...    
        	if (endText.indexOf('</') > -1) {
          	endTags = endText.match(/<(\/)?[^>]*>/g);
           for (var i=0; i < endTags.length; i++) {

             if (endTags[i].indexOf('</') > -1) {
               var startTag, startTagExists = false;
               for (var j=0; j < i; j++) {
                 startTag = endTags[j].slice(0, endTags[j].indexOf(' ')).replace(/(\w)$/,'$1>');
                 if (startTag == rSlash(endTags[i])) {
                   startTagExists = true;
                 }
               }              
               if (!startTagExists) {
                 startText = startText + endTags[i];
                 var matched = false;
                 for (var s=startTags.length - 1; s >= 0; s--) {
                   if (startTags[s].slice(0, startTags[s].indexOf(' ')).replace(/(\w)$/,'$1>') == rSlash(endTags[i]) 
                   && matched == false) {
                     cleanedTag = cleanedTag ? startTags[s] + cleanedTag : startTags[s];
                     matched = true;
                   }
                 };
               }
             }
           }
           endText = cleanedTag ? cleanedTag + endText : endText;
         }
      	  $this.html([
      		startText,
      		'<a href="#" class="read-more">',
      		  o.expandText,
      		'</a>',
      		'<span class="details">',
      		  endText,
      		'</span>'
      		].join('')
      	  );
       }
    	  $this
  	    .find('span.details').hide()
  	    .end()
  	    .find('a.read-more').click(function() {

  	      $(this).hide()
  	        .next('span.details')[o.expandEffect](o.expandSpeed, function() {
             var $self = $(this);
             $self.css({zoom: ''});
             if (o.collapseTimer) {
               delayedCollapse = setTimeout(function() {  
                 reCollapse($self);
                 },
                 o.collapseTimer
               );

             } 	          
  	        });

         return false;
  	    });
       if (o.userCollapse) {
         $this
         .find('span.details').append(' <a class="re-collapse" href="#">' + o.userCollapseText + '</a>')
         .find('a.re-collapse').click(function() {
           clearTimeout(delayedCollapse);
           var $spanCollapse = $(this).parent();
           reCollapse($spanCollapse);
           return false;
         });
       }

     });
     function reCollapse(el) {
        el.hide()
         .prev('a.read-more').show();
     }
     function rSlash(rString) {
       return rString.replace(/\//,'');
     }
   };
     // plugin defaults
   $.fn.expander.defaults = {
     slicePoint:       0,  // the number of characters at which the contents will be sliced into two parts. 
                             // Note: any tag names in the HTML that appear inside the sliced element before 
                             // the slicePoint will be counted along with the text characters.
     widow:            4,  // a threshold of sorts for whether to initially hide/collapse part of the element's contents. 
                           // If after slicing the contents in two there are fewer words in the second part than 
                           // the value set by widow, we won't bother hiding/collapsing anything.
     expandText:         'read more...', // text displayed in a link instead of the hidden part of the element. 
                                       // clicking this will expand/show the hidden/collapsed text
     collapseTimer:    0, // number of milliseconds after text has been expanded at which to collapse the text again
     expandEffect:     'fadeIn',
     expandSpeed:      '',   // speed in milliseconds of the animation effect for expanding the text
     userCollapse:     true, // allow the user to re-collapse the expanded text.
     userCollapseText: '[collapse expanded text]'  // text to use for the link to re-collapse the text
   };
 })(jQuery);