/* ------------------------------------------------------------------------
	Class: prettyPhoto
	Use: Lightbox clone for jQuery
	Author: Stephane Caron (http://www.no-margin-for-errors.com)
	Version: 2.5.6
------------------------------------------------------------------------- */
(function($) {
   $.prettyPhoto = {
      version: '2.5.6'
   };

   $.fn.prettyPhoto = function(settings) {
      settings = jQuery.extend({
         animationSpeed: 'fast', /* fast/slow/normal */
         opacity: 0.80, /* Value between 0 and 1 */
         showTitle: true, /* true/false */
         allowresize: true, /* true/false */
         default_width: 500,
         default_height: 344,
         counter_separator_label: '/', /* The separator for the gallery counter 1 "of" 2 */
         theme: 'light_rounded', /* light_rounded / dark_rounded / light_square / dark_square / facebook */
         hideflash: false, /* Hides all the flash object on a page, set to TRUE if flash appears over prettyPhoto */
         wmode: 'opaque', /* Set the flash wmode attribute */
         autoplay: true, /* Automatically start videos: True/False */
         modal: false, /* If set to true, only the close button will close the window */
         changepicturecallback: function(){}, /* Called everytime an item is shown/changed */
         callback: function(){}, /* Called when prettyPhoto is closed */
         markup: '<div class="pp_pic_holder"> \
						<div class="pp_top"> \
							<div class="pp_left"></div> \
							<div class="pp_middle"></div> \
							<div class="pp_right"></div> \
						</div> \
						<div class="pp_content_container"> \
							<div class="pp_left"> \
							<div class="pp_right"> \
								<div class="pp_content"> \
									<div class="pp_loaderIcon"></div> \
									<div class="pp_fade"> \
										<a href="#" class="pp_expand" title="Expand the image">Expand</a> \
										<div class="pp_hoverContainer"> \
											<a class="pp_next" href="#">next</a> \
											<a class="pp_previous" href="#">previous</a> \
										</div> \
										<div id="pp_full_res"></div> \
										<div class="pp_details clearfix"> \
											<a class="pp_close" href="#">Close</a> \
											<p class="pp_description"></p> \
											<div class="pp_nav"> \
												<a href="#" class="pp_arrow_previous">Previous</a> \
												<p class="currentTextHolder">0/0</p> \
												<a href="#" class="pp_arrow_next">Next</a> \
											</div> \
										</div> \
									</div> \
								</div> \
							</div> \
							</div> \
						</div> \
						<div class="pp_bottom"> \
							<div class="pp_left"></div> \
							<div class="pp_middle"></div> \
							<div class="pp_right"></div> \
						</div> \
					</div> \
					<div class="pp_overlay"></div> \
					<div class="ppt"></div>',
         image_markup: '<img id="fullResImage" src="" />',
         flash_markup: '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',
         quicktime_markup: '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>',
         iframe_markup: '<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',
         inline_markup: '<div class="pp_inline clearfix">{content}</div>'
      }, settings);

      // Fallback to a supported theme for IE6
      if($.browser.msie && parseInt($.browser.version) == 6){
         settings.theme = "light_square";
      }

      if($('.pp_overlay').size()==0) _buildOverlay(); // If the overlay is not there, inject it!

      // Global variables accessible only by prettyPhoto
      var doresize = true, percentBased = false, correctSizes,

      // Cached selectors
      $pp_pic_holder, $ppt, $pp_overlay,

      // prettyPhoto container specific
      pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth,

      // Window size
      windowHeight = $(window).height(), windowWidth = $(window).width(),

      //Gallery specific
      setPosition = 0,

      // Global elements
      scrollPos = _getScroll();

      // Window/Keyboard events
      $(window).scroll(function(){
         scrollPos = _getScroll();
         _centerOverlay();
         _resizeOverlay();
      });
      $(window).resize(function(){
         _centerOverlay();
         _resizeOverlay();
      });
      $(document).keydown(function(e){
         if($pp_pic_holder.is(':visible'))
            switch(e.keyCode){
               case 37:
                  $.prettyPhoto.changePage('previous');
                  break;
               case 39:
                  $.prettyPhoto.changePage('next');
                  break;
               case 27:
                  if(!settings.modal)
                     $.prettyPhoto.close();
                  break;
            };
      });

      // Bind the code to each links
      $(this).each(function(){
         $(this).bind('click',function(){
            _self = this; // Fix scoping

            // Find out if the picture is part of a set
            theRel = $(this).attr('rel');
            galleryRegExp = /\[(?:.*)\]/;
            theGallery = galleryRegExp.exec(theRel);

            // Build the gallery array
            var images = new Array(), titles = new Array(), descriptions = new Array();
            if(theGallery){
               $('a[rel*='+theGallery+']').each(function(i){
                  if($(this)[0] === $(_self)[0]) setPosition = i; // Get the position in the set
                  images.push($(this).attr('href'));
                  titles.push($(this).find('img').attr('alt'));
                  descriptions.push($(this).attr('title'));
               });
            }else{
               images = $(this).attr('href');
               titles = ($(this).find('img').attr('alt')) ?  $(this).find('img').attr('alt') : '';
               descriptions = ($(this).attr('title')) ?  $(this).attr('title') : '';
            }
                
            $.prettyPhoto.open(images,titles,descriptions);
            return false;
         });
      });


      /**
		* Opens the prettyPhoto modal box.
		* @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths.
		* @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles.
		* @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions.
		*/
      $.prettyPhoto.open = function(gallery_images,gallery_titles,gallery_descriptions) {
         // To fix the bug with IE select boxes
         if($.browser.msie && $.browser.version == 6){
            $('select').css('visibility','hidden');
         };

         if(settings.hideflash) $('object,embed').css('visibility','hidden'); // Hide the flash

         // Convert everything to an array in the case it's a single item
         images = $.makeArray(gallery_images);
         titles = $.makeArray(gallery_titles);
         descriptions = $.makeArray(gallery_descriptions);

         image_set = ($(images).size() > 0) ?  true : false; // Find out if it's a set

         // Hide the next/previous links if on first or last images.
         _checkPosition($(images).size());

         $('.pp_loaderIcon').show(); // Do I need to explain?

         // Fade the content in
         $pp_overlay.show().fadeTo(settings.animationSpeed,settings.opacity);

         // Display the current position
         $pp_pic_holder.find('.currentTextHolder').text((setPosition+1) + settings.counter_separator_label + $(images).size());

         // Set the description
         if(descriptions[setPosition]){
            $pp_pic_holder.find('.pp_description').show().html(unescape(descriptions[setPosition]));
         }else{
            $pp_pic_holder.find('.pp_description').hide().text('');
         };

         // Set the title
         if(titles[setPosition] && settings.showTitle){
            hasTitle = true;
            $ppt.html(unescape(titles[setPosition]));
         }else{
            hasTitle = false;
         };

         // Get the dimensions
         movie_width = ( parseFloat(grab_param('width',images[setPosition])) ) ? grab_param('width',images[setPosition]) : settings.default_width.toString();
         movie_height = ( parseFloat(grab_param('height',images[setPosition])) ) ? grab_param('height',images[setPosition]) : settings.default_height.toString();

         // If the size is % based, calculate according to window dimensions
         if(movie_width.indexOf('%') != -1 || movie_height.indexOf('%') != -1){
            movie_height = parseFloat(($(window).height() * parseFloat(movie_height) / 100) - 100);
            movie_width = parseFloat(($(window).width() * parseFloat(movie_width) / 100) - 100);
            percentBased = true;
         }

         // Fade the holder
         $pp_pic_holder.fadeIn(function(){
            imgPreloader = "";
            // Inject the proper content
            switch(_getFileType(images[setPosition])){
               case 'image':
                  // Set the new image
                  imgPreloader = new Image();

                  // Preload the neighbour images
                  nextImage = new Image();
                  if(image_set && setPosition > $(images).size()) nextImage.src = images[setPosition + 1];
                  prevImage = new Image();
                  if(image_set && images[setPosition - 1]) prevImage.src = images[setPosition - 1];

                  $pp_pic_holder.find('#pp_full_res')[0].innerHTML = settings.image_markup;
                  $pp_pic_holder.find('#fullResImage').attr('src',images[setPosition]);

                  imgPreloader.onload = function(){
                     // Fit item to viewport
                     correctSizes = _fitToViewport(imgPreloader.width,imgPreloader.height);

                     _showContent();
                  };

                  imgPreloader.onerror = function(){
                     alert('Image cannot be loaded. Make sure the path is correct and image exist.');
                     $.prettyPhoto.close();
                  };

                  imgPreloader.src = images[setPosition];
                  break;

               case 'youtube':
                  correctSizes = _fitToViewport(movie_width,movie_height); // Fit item to viewport

                  movie = 'http://www.youtube.com/v/'+grab_param('v',images[setPosition]);
                  if(settings.autoplay) movie += "&autoplay=1";

                  toInject = settings.flash_markup.replace(/{width}/g,correctSizes['width']).replace(/{height}/g,correctSizes['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);
                  break;

               case 'vimeo':
                  correctSizes = _fitToViewport(movie_width,movie_height); // Fit item to viewport

                  movie_id = images[setPosition];
                  movie = 'http://vimeo.com/moogaloop.swf?clip_id='+ movie_id.replace('http://vimeo.com/','');
                  if(settings.autoplay) movie += "&autoplay=1";

                  toInject = settings.flash_markup.replace(/{width}/g,correctSizes['width']).replace(/{height}/g,correctSizes['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);
                  break;

               case 'quicktime':
                  correctSizes = _fitToViewport(movie_width,movie_height); // Fit item to viewport
                  correctSizes['height']+=15;
                  correctSizes['contentHeight']+=15;
                  correctSizes['containerHeight']+=15; // Add space for the control bar

                  toInject = settings.quicktime_markup.replace(/{width}/g,correctSizes['width']).replace(/{height}/g,correctSizes['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,images[setPosition]).replace(/{autoplay}/g,settings.autoplay);
                  break;

               case 'flash':
                  correctSizes = _fitToViewport(movie_width,movie_height); // Fit item to viewport

                  flash_vars = images[setPosition];
                  flash_vars = flash_vars.substring(images[setPosition].indexOf('flashvars') + 10,images[setPosition].length);

                  filename = images[setPosition];
                  filename = filename.substring(0,filename.indexOf('?'));

                  toInject =  settings.flash_markup.replace(/{width}/g,correctSizes['width']).replace(/{height}/g,correctSizes['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);
                  break;

               case 'iframe':
                  correctSizes = _fitToViewport(movie_width,movie_height); // Fit item to viewport

                  frame_url = images[setPosition];
                  frame_url = frame_url.substr(0,frame_url.indexOf('iframe')-1);

                  toInject = settings.iframe_markup.replace(/{width}/g,correctSizes['width']).replace(/{height}/g,correctSizes['height']).replace(/{path}/g,frame_url);
                  break;

               case 'inline':
                  // to get the item height clone it, apply default width, wrap it in the prettyPhoto containers , then delete
                  myClone = $(images[setPosition]).clone().css({
                     'width':settings.default_width
                     }).wrapInner('<div id="pp_full_res"><div class="pp_inline clearfix"></div></div>').appendTo($('body'));
                  correctSizes = _fitToViewport($(myClone).width(),$(myClone).height());
                  $(myClone).remove();
                  toInject = settings.inline_markup.replace(/{content}/g,$(images[setPosition]).html());
                  break;
            };

            if(!imgPreloader){
               $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;

               // Show content
               _showContent();
            };
         });

      };

      /**
		* Change page in the prettyPhoto modal box
		* @param direction {String} Direction of the paging, previous or next.
		*/
      $.prettyPhoto.changePage = function(direction){
         if(direction == 'previous') {
            setPosition--;
            if (setPosition < 0){
               setPosition = 0;
               return;
            };
         }else{
            if($('.pp_arrow_next').is('.disabled')) return;
            setPosition++;
         };

         // Allow the resizing of the images
         if(!doresize) doresize = true;

         _hideContent(function(){
            $.prettyPhoto.open(images,titles,descriptions)
            });
         $('a.pp_expand,a.pp_contract').fadeOut(settings.animationSpeed);
      };

      /**
		* Closes the prettyPhoto modal box.
		*/
      $.prettyPhoto.close = function(){
         $pp_pic_holder.find('object,embed').css('visibility','hidden');

         $('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animationSpeed);

         $pp_overlay.fadeOut(settings.animationSpeed, function(){
            $('#pp_full_res').html(''); // Kill the opened content

            $pp_pic_holder.attr('style','').find('div:not(.pp_hoverContainer)').attr('style',''); // Reset the width and everything that has been set.
            _centerOverlay(); // Center it

            // To fix the bug with IE select boxes
            if($.browser.msie && $.browser.version == 6){
               $('select').css('visibility','visible');
            };

            // Show the flash
            if(settings.hideflash) $('object,embed').css('visibility','visible');

            setPosition = 0;
            settings.callback();
         });
         doresize = true;
      };

      /**
		* Set the proper sizes on the containers and animate the content in.
		*/
      _showContent = function(){
         $('.pp_loaderIcon').hide();

         // Calculate the opened top position of the pic holder
         projectedTop = scrollPos['scrollTop'] + ((windowHeight/2) - (correctSizes['containerHeight']/2));
         if(projectedTop < 0) projectedTop = 0 + $ppt.height();

         // Resize the content holder
         $pp_pic_holder.find('.pp_content').animate({
            'height':correctSizes['contentHeight']
            },settings.animationSpeed);

         // Resize picture the holder
         $pp_pic_holder.animate({
            'top': projectedTop,
            'left': (windowWidth/2) - (correctSizes['containerWidth']/2),
            'width': correctSizes['containerWidth']
         },settings.animationSpeed,function(){
            $pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(correctSizes['height']).width(correctSizes['width']);

            // Fade the new image
            $pp_pic_holder.find('.pp_fade').fadeIn(settings.animationSpeed);

            // Show the nav
            if(image_set && _getFileType(images[setPosition])=="image") {
               $pp_pic_holder.find('.pp_hoverContainer').show();
            }else{
               $pp_pic_holder.find('.pp_hoverContainer').hide();
            }

            // Show the title
            if(settings.showTitle && hasTitle){
               $ppt.css({
                  'top' : $pp_pic_holder.offset().top - 25,
                  'left' : $pp_pic_holder.offset().left + 20,
                  'display' : 'none'
               });

               $ppt.fadeIn(settings.animationSpeed);
            };

            // Fade the resizing link if the image is resized
            if(correctSizes['resized']) $('a.pp_expand,a.pp_contract').fadeIn(settings.animationSpeed);

            // Callback!
            settings.changepicturecallback();
         });
      };

      /**
		* Hide the content...DUH!
		*/
      function _hideContent(callback){
         // Fade out the current picture
         $pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');
         $pp_pic_holder.find('.pp_fade').fadeOut(settings.animationSpeed,function(){
            $('.pp_loaderIcon').show();

            if(callback) callback();
         });

         // Hide the title
         $ppt.fadeOut(settings.animationSpeed);
      }

      /**
		* Check the item position in the gallery array, hide or show the navigation links
		* @param setCount {integer} The total number of items in the set
		*/
      function _checkPosition(setCount){
         // If at the end, hide the next link
         if(setPosition == setCount-1) {
            $pp_pic_holder.find('a.pp_next').css('visibility','hidden');
            $pp_pic_holder.find('a.pp_arrow_next').addClass('disabled').unbind('click');
         }else{
            $pp_pic_holder.find('a.pp_next').css('visibility','visible');
            $pp_pic_holder.find('a.pp_arrow_next.disabled').removeClass('disabled').bind('click',function(){
               $.prettyPhoto.changePage('next');
               return false;
            });
         };

         // If at the beginning, hide the previous link
         if(setPosition == 0) {
            $pp_pic_holder.find('a.pp_previous').css('visibility','hidden');
            $pp_pic_holder.find('a.pp_arrow_previous').addClass('disabled').unbind('click');
         }else{
            $pp_pic_holder.find('a.pp_previous').css('visibility','visible');
            $pp_pic_holder.find('a.pp_arrow_previous.disabled').removeClass('disabled').bind('click',function(){
               $.prettyPhoto.changePage('previous');
               return false;
            });
         };

         // Hide the bottom nav if it's not a set.
         if(setCount > 1) {
            $('.pp_nav').show();
         }else{
            $('.pp_nav').hide();
         }
      };

      /**
		* Resize the item dimensions if it's bigger than the viewport
		* @param width {integer} Width of the item to be opened
		* @param height {integer} Height of the item to be opened
		* @return An array containin the "fitted" dimensions
		*/
      function _fitToViewport(width,height){
         hasBeenResized = false;

         _getDimensions(width,height);

         // Define them in case there's no resize needed
         imageWidth = width;
         imageHeight = height;

         if( ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allowresize && !percentBased) {
            hasBeenResized = true;
            notFitting = true;

            while (notFitting){
               if((pp_containerWidth > windowWidth)){
                  imageWidth = (windowWidth - 200);
                  imageHeight = (height/width) * imageWidth;
               }else if((pp_containerHeight > windowHeight)){
                  imageHeight = (windowHeight - 200);
                  imageWidth = (width/height) * imageHeight;
               }else{
                  notFitting = false;
               };

               pp_containerHeight = imageHeight;
               pp_containerWidth = imageWidth;
            };

            _getDimensions(imageWidth,imageHeight);
         };

         return {
            width:Math.floor(imageWidth),
            height:Math.floor(imageHeight),
            containerHeight:Math.floor(pp_containerHeight),
            containerWidth:Math.floor(pp_containerWidth) + 40,
            contentHeight:Math.floor(pp_contentHeight),
            contentWidth:Math.floor(pp_contentWidth),
            resized:hasBeenResized
         };
      };

      /**
		* Get the containers dimensions according to the item size
		* @param width {integer} Width of the item to be opened
		* @param height {integer} Height of the item to be opened
		*/
      function _getDimensions(width,height){
         width = parseFloat(width);
         height = parseFloat(height);

         // Get the details height, to do so, I need to clone it since it's invisible
         $pp_details = $pp_pic_holder.find('.pp_details');
         $pp_details.width(width);
         detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom'));
         $pp_details = $pp_details.clone().appendTo($('body')).css({
            'position':'absolute',
            'top':-10000
         });
         detailsHeight += $pp_details.height();
         detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details
         if($.browser.msie && $.browser.version==7) detailsHeight+=8;
         $pp_details.remove();

         // Get the container size, to resize the holder to the right dimensions
         pp_contentHeight = height + detailsHeight;
         pp_contentWidth = width;
         pp_containerHeight = pp_contentHeight + $ppt.height() + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height();
         pp_containerWidth = width;
      }

      function _getFileType(itemSrc){
         if (itemSrc.match(/youtube\.com\/watch/i)) {
            return 'youtube';
         }else if (itemSrc.match(/vimeo\.com/i)) {
            return 'vimeo';
         }else if(itemSrc.indexOf('.mov') != -1){
            return 'quicktime';
         }else if(itemSrc.indexOf('.swf') != -1){
            return 'flash';
         }else if(itemSrc.indexOf('iframe') != -1){
            return 'iframe'
         }else if(itemSrc.substr(0,1) == '#'){
            return 'inline';
         }else{
            return 'image';
         };
      };

      function _centerOverlay(){
         if(doresize) {
            titleHeight = $ppt.height();
            contentHeight = $pp_pic_holder.height();
            contentwidth = $pp_pic_holder.width();

            projectedTop = (windowHeight/2) + scrollPos['scrollTop'] - ((contentHeight+titleHeight)/2);

            $pp_pic_holder.css({
               'top': projectedTop,
               'left': (windowWidth/2) + scrollPos['scrollLeft'] - (contentwidth/2)
            });

            $ppt.css({
               'top' : projectedTop - titleHeight,
               'left': (windowWidth/2) + scrollPos['scrollLeft'] - (contentwidth/2) + 20
            });
         };
      };

      function _getScroll(){
         if (self.pageYOffset) {
            return {
               scrollTop:self.pageYOffset,
               scrollLeft:self.pageXOffset
               };
         } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
            return {
               scrollTop:document.documentElement.scrollTop,
               scrollLeft:document.documentElement.scrollLeft
               };
         } else if (document.body) {// all other Explorers
            return {
               scrollTop:document.body.scrollTop,
               scrollLeft:document.body.scrollLeft
               };
         };
      };

      function _resizeOverlay() {
         windowHeight = $(window).height();
         windowWidth = $(window).width();

         $pp_overlay.css({
            'height':$(document).height()
         });
      };

      function _buildOverlay(){
         // Inject the markup
         $('body').append(settings.markup);

         // Set my global selectors
         $pp_pic_holder = $('.pp_pic_holder');
         $ppt = $('.ppt');
         $pp_overlay = $('div.pp_overlay');

         $pp_pic_holder.attr('class','pp_pic_holder ' + settings.theme); // Set the proper theme

         $pp_overlay
         .css({
            'opacity':0,
            'height':$(document).height()
         })
         .bind('click',function(){
            if(!settings.modal)
               $.prettyPhoto.close();
         });

         $('a.pp_close').bind('click',function(){
            $.prettyPhoto.close();
            return false;
         });

         $('a.pp_expand').bind('click',function(){
            $this = $(this); // Fix scoping

            // Expand the image
            if($this.hasClass('pp_expand')){
               $this.removeClass('pp_expand').addClass('pp_contract');
               doresize = false;
            }else{
               $this.removeClass('pp_contract').addClass('pp_expand');
               doresize = true;
            };

            _hideContent(function(){
               $.prettyPhoto.open(images,titles,descriptions)
               });

            $pp_pic_holder.find('.pp_fade').fadeOut(settings.animationSpeed);

            return false;
         });

         $pp_pic_holder.find('.pp_previous, .pp_arrow_previous').bind('click',function(){
            $.prettyPhoto.changePage('previous');
            return false;
         });

         $pp_pic_holder.find('.pp_next, .pp_arrow_next').bind('click',function(){
            $.prettyPhoto.changePage('next');
            return false;
         });
      };

      _centerOverlay(); // Center it
   };

   function grab_param(name,url){
      name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
      var regexS = "[\\?&]"+name+"=([^&#]*)";
      var regex = new RegExp( regexS );
      var results = regex.exec( url );
      if( results == null )
         return "";
      else
         return results[1];
   }
})(jQuery);


$(document).ready(function(){
   $("a[rel^='prettyPhoto']").prettyPhoto({
      theme:'dark_rounded'
   });
});/* 
 * flowplayer.js 3.2.2. The Flowplayer API
 * 
 * Copyright 2010 Flowplayer Oy
 * 
 * This file is part of Flowplayer.
 * 
 * Flowplayer is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Flowplayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Flowplayer.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Date: 2010-05-20 17:15:38 +0000 (Thu, 20 May 2010)
 * Revision: 480 
 */
(function(){function g(o){console.log("$f.fireEvent",[].slice.call(o))}function k(q){if(!q||typeof q!="object"){return q}var o=new q.constructor();for(var p in q){if(q.hasOwnProperty(p)){o[p]=k(q[p])}}return o}function m(t,q){if(!t){return}var o,p=0,r=t.length;if(r===undefined){for(o in t){if(q.call(t[o],o,t[o])===false){break}}}else{for(var s=t[0];p<r&&q.call(s,p,s)!==false;s=t[++p]){}}return t}function c(o){return document.getElementById(o)}function i(q,p,o){if(typeof p!="object"){return q}if(q&&p){m(p,function(r,s){if(!o||typeof s!="function"){q[r]=s}})}return q}function n(s){var q=s.indexOf(".");if(q!=-1){var p=s.slice(0,q)||"*";var o=s.slice(q+1,s.length);var r=[];m(document.getElementsByTagName(p),function(){if(this.className&&this.className.indexOf(o)!=-1){r.push(this)}});return r}}function f(o){o=o||window.event;if(o.preventDefault){o.stopPropagation();o.preventDefault()}else{o.returnValue=false;o.cancelBubble=true}return false}function j(q,o,p){q[o]=q[o]||[];q[o].push(p)}function e(){return"_"+(""+Math.random()).slice(2,10)}var h=function(t,r,s){var q=this,p={},u={};q.index=r;if(typeof t=="string"){t={url:t}}i(this,t,true);m(("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop").split(","),function(){var v="on"+this;if(v.indexOf("*")!=-1){v=v.slice(0,v.length-1);var w="onBefore"+v.slice(2);q[w]=function(x){j(u,w,x);return q}}q[v]=function(x){j(u,v,x);return q};if(r==-1){if(q[w]){s[w]=q[w]}if(q[v]){s[v]=q[v]}}});i(this,{onCuepoint:function(x,w){if(arguments.length==1){p.embedded=[null,x];return q}if(typeof x=="number"){x=[x]}var v=e();p[v]=[x,w];if(s.isLoaded()){s._api().fp_addCuepoints(x,r,v)}return q},update:function(w){i(q,w);if(s.isLoaded()){s._api().fp_updateClip(w,r)}var v=s.getConfig();var x=(r==-1)?v.clip:v.playlist[r];i(x,w,true)},_fireEvent:function(v,y,w,A){if(v=="onLoad"){m(p,function(B,C){if(C[0]){s._api().fp_addCuepoints(C[0],r,B)}});return false}A=A||q;if(v=="onCuepoint"){var z=p[y];if(z){return z[1].call(s,A,w)}}if(y&&"onBeforeBegin,onMetaData,onStart,onUpdate,onResume".indexOf(v)!=-1){i(A,y);if(y.metaData){if(!A.duration){A.duration=y.metaData.duration}else{A.fullDuration=y.metaData.duration}}}var x=true;m(u[v],function(){x=this.call(s,A,y,w)});return x}});if(t.onCuepoint){var o=t.onCuepoint;q.onCuepoint.apply(q,typeof o=="function"?[o]:o);delete t.onCuepoint}m(t,function(v,w){if(typeof w=="function"){j(u,v,w);delete t[v]}});if(r==-1){s.onCuepoint=this.onCuepoint}};var l=function(p,r,q,t){var o=this,s={},u=false;if(t){i(s,t)}m(r,function(v,w){if(typeof w=="function"){s[v]=w;delete r[v]}});i(this,{animate:function(y,z,x){if(!y){return o}if(typeof z=="function"){x=z;z=500}if(typeof y=="string"){var w=y;y={};y[w]=z;z=500}if(x){var v=e();s[v]=x}if(z===undefined){z=500}r=q._api().fp_animate(p,y,z,v);return o},css:function(w,x){if(x!==undefined){var v={};v[w]=x;w=v}r=q._api().fp_css(p,w);i(o,r);return o},show:function(){this.display="block";q._api().fp_showPlugin(p);return o},hide:function(){this.display="none";q._api().fp_hidePlugin(p);return o},toggle:function(){this.display=q._api().fp_togglePlugin(p);return o},fadeTo:function(y,x,w){if(typeof x=="function"){w=x;x=500}if(w){var v=e();s[v]=w}this.display=q._api().fp_fadeTo(p,y,x,v);this.opacity=y;return o},fadeIn:function(w,v){return o.fadeTo(1,w,v)},fadeOut:function(w,v){return o.fadeTo(0,w,v)},getName:function(){return p},getPlayer:function(){return q},_fireEvent:function(w,v,x){if(w=="onUpdate"){var z=q._api().fp_getPlugin(p);if(!z){return}i(o,z);delete o.methods;if(!u){m(z.methods,function(){var B=""+this;o[B]=function(){var C=[].slice.call(arguments);var D=q._api().fp_invoke(p,B,C);return D==="undefined"||D===undefined?o:D}});u=true}}var A=s[w];if(A){var y=A.apply(o,v);if(w.slice(0,1)=="_"){delete s[w]}return y}return o}})};function b(q,G,t){var w=this,v=null,D=false,u,s,F=[],y={},x={},E,r,p,C,o,A;i(w,{id:function(){return E},isLoaded:function(){return(v!==null&&v.fp_play!=undefined&&!D)},getParent:function(){return q},hide:function(H){if(H){q.style.height="0px"}if(w.isLoaded()){v.style.height="0px"}return w},show:function(){q.style.height=A+"px";if(w.isLoaded()){v.style.height=o+"px"}return w},isHidden:function(){return w.isLoaded()&&parseInt(v.style.height,10)===0},load:function(J){if(!w.isLoaded()&&w._fireEvent("onBeforeLoad")!==false){var H=function(){u=q.innerHTML;if(u&&!flashembed.isSupported(G.version)){q.innerHTML=""}flashembed(q,G,{config:t});if(J){J.cached=true;j(x,"onLoad",J)}};var I=0;m(a,function(){this.unload(function(K){if(++I==a.length){H()}})})}return w},unload:function(J){if(this.isFullscreen()&&/WebKit/i.test(navigator.userAgent)){if(J){J(false)}return w}if(u.replace(/\s/g,"")!==""){if(w._fireEvent("onBeforeUnload")===false){if(J){J(false)}return w}D=true;try{if(v){v.fp_close();w._fireEvent("onUnload")}}catch(H){}var I=function(){v=null;q.innerHTML=u;D=false;if(J){J(true)}};setTimeout(I,50)}else{if(J){J(false)}}return w},getClip:function(H){if(H===undefined){H=C}return F[H]},getCommonClip:function(){return s},getPlaylist:function(){return F},getPlugin:function(H){var J=y[H];if(!J&&w.isLoaded()){var I=w._api().fp_getPlugin(H);if(I){J=new l(H,I,w);y[H]=J}}return J},getScreen:function(){return w.getPlugin("screen")},getControls:function(){return w.getPlugin("controls")._fireEvent("onUpdate")},getLogo:function(){try{return w.getPlugin("logo")._fireEvent("onUpdate")}catch(H){}},getPlay:function(){return w.getPlugin("play")._fireEvent("onUpdate")},getConfig:function(H){return H?k(t):t},getFlashParams:function(){return G},loadPlugin:function(K,J,M,L){if(typeof M=="function"){L=M;M={}}var I=L?e():"_";w._api().fp_loadPlugin(K,J,M,I);var H={};H[I]=L;var N=new l(K,null,w,H);y[K]=N;return N},getState:function(){return w.isLoaded()?v.fp_getState():-1},play:function(I,H){var J=function(){if(I!==undefined){w._api().fp_play(I,H)}else{w._api().fp_play()}};if(w.isLoaded()){J()}else{if(D){setTimeout(function(){w.play(I,H)},50)}else{w.load(function(){J()})}}return w},getVersion:function(){var I="flowplayer.js 3.2.0";if(w.isLoaded()){var H=v.fp_getVersion();H.push(I);return H}return I},_api:function(){if(!w.isLoaded()){throw"Flowplayer "+w.id()+" not loaded when calling an API method"}return v},setClip:function(H){w.setPlaylist([H]);return w},getIndex:function(){return p}});m(("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error,MouseOver,MouseOut").split(","),function(){var H="on"+this;if(H.indexOf("*")!=-1){H=H.slice(0,H.length-1);var I="onBefore"+H.slice(2);w[I]=function(J){j(x,I,J);return w}}w[H]=function(J){j(x,H,J);return w}});m(("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip,playFeed,setKeyboardShortcutsEnabled,isKeyboardShortcutsEnabled").split(","),function(){var H=this;w[H]=function(J,I){if(!w.isLoaded()){return w}var K=null;if(J!==undefined&&I!==undefined){K=v["fp_"+H](J,I)}else{K=(J===undefined)?v["fp_"+H]():v["fp_"+H](J)}return K==="undefined"||K===undefined?w:K}});w._fireEvent=function(Q){if(typeof Q=="string"){Q=[Q]}var R=Q[0],O=Q[1],M=Q[2],L=Q[3],K=0;if(t.debug){g(Q)}if(!w.isLoaded()&&R=="onLoad"&&O=="player"){v=v||c(r);o=v.clientHeight;m(F,function(){this._fireEvent("onLoad")});m(y,function(S,T){T._fireEvent("onUpdate")});s._fireEvent("onLoad")}if(R=="onLoad"&&O!="player"){return}if(R=="onError"){if(typeof O=="string"||(typeof O=="number"&&typeof M=="number")){O=M;M=L}}if(R=="onContextMenu"){m(t.contextMenu[O],function(S,T){T.call(w)});return}if(R=="onPluginEvent"||R=="onBeforePluginEvent"){var H=O.name||O;var I=y[H];if(I){I._fireEvent("onUpdate",O);return I._fireEvent(M,Q.slice(3))}return}if(R=="onPlaylistReplace"){F=[];var N=0;m(O,function(){F.push(new h(this,N++,w))})}if(R=="onClipAdd"){if(O.isInStream){return}O=new h(O,M,w);F.splice(M,0,O);for(K=M+1;K<F.length;K++){F[K].index++}}var P=true;if(typeof O=="number"&&O<F.length){C=O;var J=F[O];if(J){P=J._fireEvent(R,M,L)}if(!J||P!==false){P=s._fireEvent(R,M,L,J)}}m(x[R],function(){P=this.call(w,O,M);if(this.cached){x[R].splice(K,1)}if(P===false){return false}K++});return P};function B(){if($f(q)){$f(q).getParent().innerHTML="";p=$f(q).getIndex();a[p]=w}else{a.push(w);p=a.length-1}A=parseInt(q.style.height,10)||q.clientHeight;E=q.id||"fp"+e();r=G.id||E+"_api";G.id=r;t.playerId=E;if(typeof t=="string"){t={clip:{url:t}}}if(typeof t.clip=="string"){t.clip={url:t.clip}}t.clip=t.clip||{};if(q.getAttribute("href",2)&&!t.clip.url){t.clip.url=q.getAttribute("href",2)}s=new h(t.clip,-1,w);t.playlist=t.playlist||[t.clip];var H=0;m(t.playlist,function(){var J=this;if(typeof J=="object"&&J.length){J={url:""+J}}m(t.clip,function(K,L){if(L!==undefined&&J[K]===undefined&&typeof L!="function"){J[K]=L}});t.playlist[H]=J;J=new h(J,H,w);F.push(J);H++});m(t,function(J,K){if(typeof K=="function"){if(s[J]){s[J](K)}else{j(x,J,K)}delete t[J]}});m(t.plugins,function(J,K){if(K){y[J]=new l(J,K,w)}});if(!t.plugins||t.plugins.controls===undefined){y.controls=new l("controls",null,w)}y.canvas=new l("canvas",null,w);function I(J){if(!w.isLoaded()&&w._fireEvent("onBeforeClick")!==false){w.load()}return f(J)}u=q.innerHTML;if(u.replace(/\s/g,"")!==""){if(q.addEventListener){q.addEventListener("click",I,false)}else{if(q.attachEvent){q.attachEvent("onclick",I)}}}else{if(q.addEventListener){q.addEventListener("click",f,false)}w.load()}}if(typeof q=="string"){var z=c(q);if(!z){throw"Flowplayer cannot access element: "+q}else{q=z;B()}}else{B()}}var a=[];function d(o){this.length=o.length;this.each=function(p){m(o,p)};this.size=function(){return o.length}}window.flowplayer=window.$f=function(){var p=null;var o=arguments[0];if(!arguments.length){m(a,function(){if(this.isLoaded()){p=this;return false}});return p||a[0]}if(arguments.length==1){if(typeof o=="number"){return a[o]}else{if(o=="*"){return new d(a)}m(a,function(){if(this.id()==o.id||this.id()==o||this.getParent()==o){p=this;return false}});return p}}if(arguments.length>1){var t=arguments[1],q=(arguments.length==3)?arguments[2]:{};if(typeof t=="string"){t={src:t}}t=i({bgcolor:"#000000",version:[9,0],expressInstall:"http://static.flowplayer.org/swf/expressinstall.swf",cachebusting:true},t);if(typeof o=="string"){if(o.indexOf(".")!=-1){var s=[];m(n(o),function(){s.push(new b(this,k(t),k(q)))});return new d(s)}else{var r=c(o);return new b(r!==null?r:o,t,q)}}else{if(o){return new b(o,t,q)}}}return null};i(window.$f,{fireEvent:function(){var o=[].slice.call(arguments);var q=$f(o[0]);return q?q._fireEvent(o.slice(1)):null},addPlugin:function(o,p){b.prototype[o]=p;return $f},each:m,extend:i});if(typeof jQuery=="function"){jQuery.fn.flowplayer=function(q,p){if(!arguments.length||typeof arguments[0]=="number"){var o=[];this.each(function(){var r=$f(this);if(r){o.push(r)}});return arguments.length?o[arguments[0]]:new d(o)}return this.each(function(){$f(this,k(q),p?k(p):{})})}}})();(function(){var h=document.all,j="http://www.adobe.com/go/getflashplayer",c=typeof jQuery=="function",e=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,b={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:true,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(window.attachEvent){window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function i(l,f){if(f){for(key in f){if(f.hasOwnProperty(key)){l[key]=f[key]}}}return l}function a(f,n){var m=[];for(var l in f){if(f.hasOwnProperty(l)){m[l]=n(f[l])}}return m}window.flashembed=function(f,m,l){if(typeof f=="string"){f=document.getElementById(f.replace("#",""))}if(!f){return}if(typeof m=="string"){m={src:m}}return new d(f,i(i({},b),m),l)};var g=i(window.flashembed,{conf:b,getVersion:function(){var f;try{f=navigator.plugins["Shockwave Flash"].description.slice(16)}catch(n){try{var l=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");f=l&&l.GetVariable("$version")}catch(m){}}f=e.exec(f);return f?[f[1],f[3]]:[0,0]},asString:function(l){if(l===null||l===undefined){return null}var f=typeof l;if(f=="object"&&l.push){f="array"}switch(f){case"string":l=l.replace(new RegExp('(["\\\\])',"g"),"\\$1");l=l.replace(/^\s?(\d+\.?\d+)%/,"$1pct");return'"'+l+'"';case"array":return"["+a(l,function(o){return g.asString(o)}).join(",")+"]";case"function":return'"function()"';case"object":var m=[];for(var n in l){if(l.hasOwnProperty(n)){m.push('"'+n+'":'+g.asString(l[n]))}}return"{"+m.join(",")+"}"}return String(l).replace(/\s/g," ").replace(/\'/g,'"')},getHTML:function(o,l){o=i({},o);var n='<object width="'+o.width+'" height="'+o.height+'" id="'+o.id+'" name="'+o.id+'"';if(o.cachebusting){o.src+=((o.src.indexOf("?")!=-1?"&":"?")+Math.random())}if(o.w3c||!h){n+=' data="'+o.src+'" type="application/x-shockwave-flash"'}else{n+=' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'}n+=">";if(o.w3c||h){n+='<param name="movie" value="'+o.src+'" />'}o.width=o.height=o.id=o.w3c=o.src=null;o.onFail=o.version=o.expressInstall=null;for(var m in o){if(o[m]){n+='<param name="'+m+'" value="'+o[m]+'" />'}}var p="";if(l){for(var f in l){if(l[f]){var q=l[f];p+=f+"="+(/function|object/.test(typeof q)?g.asString(q):q)+"&"}}p=p.slice(0,-1);n+='<param name="flashvars" value=\''+p+"' />"}n+="</object>";return n},isSupported:function(f){return k[0]>f[0]||k[0]==f[0]&&k[1]>=f[1]}});var k=g.getVersion();function d(f,n,m){if(g.isSupported(n.version)){f.innerHTML=g.getHTML(n,m)}else{if(n.expressInstall&&g.isSupported([6,65])){f.innerHTML=g.getHTML(i(n,{src:n.expressInstall}),{MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title})}else{if(!f.innerHTML.replace(/\s/g,"")){f.innerHTML="<h2>Flash version "+n.version+" or greater is required</h2><h3>"+(k[0]>0?"Your version is "+k:"You have no flash plugin installed")+"</h3>"+(f.tagName=="A"?"<p>Click here to download latest version</p>":"<p>Download latest version from <a href='"+j+"'>here</a></p>");if(f.tagName=="A"){f.onclick=function(){location.href=j}}}if(n.onFail){var l=n.onFail.call(this);if(typeof l=="string"){f.innerHTML=l}}}}if(h){window[n.id]=document.getElementById(n.id)}i(this,{getRoot:function(){return f},getOptions:function(){return n},getConf:function(){return m},getApi:function(){return f.firstChild}})}if(c){jQuery.tools=jQuery.tools||{version:"3.2.0"};jQuery.tools.flashembed={conf:b};jQuery.fn.flashembed=function(l,f){return this.each(function(){$(this).data("flashembed",flashembed(this,l,f))})}}})();
