Advertisement
Guest User

Untitled

a guest
Jul 21st, 2013
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 17.34 KB | None | 0 0
  1. <?php
  2.  
  3. // create the shortcode
  4. add_shortcode( 'portfolio_slideshow', 'portfolio_slideshow_pro_shortcode' );
  5.  
  6. // define the shortcode function
  7. function portfolio_slideshow_pro_shortcode( $atts ) {
  8.  
  9.     global $ps_options;
  10.  
  11.     extract( shortcode_atts( array(
  12.         'size' => $ps_options['size'],
  13.         'nowrap' => '',  //kept for compatibility with previous versions of the plugin
  14.         'loop' => $ps_options['loop'],
  15.         'speed' => $ps_options['speed'],
  16.         'delay' => '0',
  17.         'trans' => $ps_options['trans'],
  18.         'centered' => $ps_options['centered'],
  19.         'height'    => '',
  20.         'width' => '',
  21.         'timeout' => $ps_options['timeout'],
  22.         'exclude_featured'  => $ps_options['exclude_featured'],
  23.         'autoplay' => $ps_options['autoplay'],
  24.         'duration'  =>  '',
  25.         'audio' =>  '',
  26.         'audio_loop' => false,
  27.         'showinfo' => $ps_options['showinfo'],
  28.         'showplay' => $ps_options['showplay'],
  29.         'pagerpos' => $ps_options['pagerpos'],
  30.         'metapos' => $ps_options['metapos'],
  31.         'metacontent' => '',
  32.         'slidelinks' => '',
  33.         'post_titles' => '',
  34.         'pagerstyle' => $ps_options['pagerstyle'],
  35.         'togglethumbs' => $ps_options['togglethumbs'],
  36.         'togglestate' => $ps_options['togglestate'],
  37.         'thumbnailsize' => $ps_options['thumbsize'],
  38.         'thumbnailmargin' => $ps_options['thumbnailmargin'],
  39.         'proportionalthumbs' => $ps_options['proportionalthumbs'],
  40.         'video' => false,
  41.         'navpos' => $ps_options['navpos'],
  42.         'fancygrid' => $ps_options['fancygrid'],
  43.         'fullscreen' => $ps_options['fullscreen'],
  44.         'random' => $ps_options['random'],
  45.         'carousel' => '', //kept for compatibility with previous versions of the plugin
  46.         'carouselsize' => $ps_options['carouselsize'],
  47.         'navstyle' => $ps_options['navstyle'],
  48.         'showcaps' => $ps_options['showcaps'],
  49.         'showtitles' => $ps_options['showtitles'],
  50.         'showdesc' => $ps_options['showdesc'],
  51.         'click' => $ps_options['click'],
  52.         'target' => $ps_options['target'],
  53.         'fluid' =>  $ps_options['allowfluid'],
  54.         'crop'  => $ps_options['crop'],
  55.         'slideheight' => '',
  56.         'pagerwidth' => '',
  57.         'class' =>  '',
  58.         'id' => '',
  59.         'limit' => '-1',
  60.         'posttype' => '',
  61.         'order' => 'DESC',
  62.         'orderby' => 'date',
  63.         'taxname' => '',
  64.         'tax' => '',
  65.         'category' => '',
  66.         'tag' => '',
  67.         'exclude' => '',
  68.         'include' => '',
  69.         'ids' => ''
  70.     ), $atts ) );
  71.    
  72.     /* Has a custom post id been declared or should we use current page ID? */
  73.    
  74.     if ( ! $id ) $id = get_the_ID();
  75.     $slideKey = rand(1,999999);
  76.  
  77.     if ( $include ) $include = explode(',', $include);
  78.     if ( $exclude ) $exclude = explode(',', $exclude);
  79.     if ( $ids ) $include = explode(',', $ids);
  80.  
  81.     if ( !$include ) $slidemeta = get_post_meta( $id, '_portfolio_slideshow', true );
  82.  
  83.     if ( $slidemeta ) {
  84.         foreach ( $slidemeta as $item ) {
  85.             if ( !empty( $item['image'] ) ) {
  86.                 $include[] = $item['image'];
  87.             }
  88.  
  89.             if ( !empty( $item['caption'] ) ) {
  90.                 $metacontent[] = $item['caption'];
  91.             } else {
  92.                 $metacontent[] = '';
  93.             }
  94.  
  95.             if ( !empty( $item['url'] ) ) {
  96.                 $slidelinks[] = $item['url'];
  97.             } else {
  98.                 $slidelinks[] = '';
  99.             }
  100.         }
  101.     }
  102.  
  103.     if ( ps_plugin_is_active('portfolio-slideshow-pro-image-taxonomies') && !$posttype ) {
  104.         if ( $category || $tag ) {
  105.             global $include, $post_titles, $metacontent, $slidelinks;
  106.             psp_taxonomy_query( $category, $tag, $limit );
  107.             wp_reset_postdata();
  108.         }
  109.     }
  110.  
  111.     if ( $posttype ) {
  112.         global $include, $post_titles, $slidelinks;
  113.         psp_post_query( $posttype, $taxname, $tax, $category, $tag, $limit, $order, $orderby );
  114.         wp_reset_postdata();
  115.     }
  116.  
  117.     if ( $metacontent && is_string($metacontent) ) $metacontent = explode('@@@', $metacontent);
  118.     if ( $slidelinks && is_string($slidelinks) ) $slidelinks = explode('@@@', $slidelinks);
  119.  
  120.     /* If the exclude_featured attribute is set, get the featured thumb ID and add it to the $exclude string */
  121.     if ( $exclude_featured == "true" && current_theme_supports( 'post-thumbnails' ) ) {
  122.         $featured_id = get_post_thumbnail_id( $id );
  123.         $exclude[] = $featured_id;   
  124.     }
  125.    
  126.     /* Now we exclude any images that have been marked as "exclude" in the Gallery tab */
  127.     $attachments = get_children( array('post_parent' => $id, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'meta_key' => '_ps_exclude_checkbox', 'meta_value' => 'exclude') );
  128.        
  129.     if ( $attachments ) {
  130.         foreach ( $attachments as $attachment ) {
  131.             $exclude[] = $attachment->ID;
  132.         }
  133.     }
  134.    
  135.     /* Turn thumbnail size into array if necessary */
  136.     $thumbnailarray = strpos($thumbnailsize, ',');
  137.     if ( $thumbnailarray ) {
  138.         $thumbnailsize = explode(',', $thumbnailsize);
  139.     } else {
  140.         $newsize[] = $thumbnailsize;
  141.         $newsize[] = $thumbnailsize;
  142.         $thumbnailsize = $newsize;
  143.     }
  144.  
  145.     /* Custom orderby if random == true */
  146.     if ( $random == "true" ) {
  147.         $orderby="rand";
  148.     } else {
  149.         $orderby="menu_order ID";
  150.     }
  151.    
  152.     if ( $include ) {
  153.         $include = preg_replace( '/[^0-9,]+/', '', $include );
  154.         $attachments = array(
  155.             'post_type'      => 'attachment',
  156.             'post_status'    => 'any',
  157.             'post__in'       => $include,
  158.             'posts_per_page' => -1
  159.         );
  160.     } elseif ( $exclude ) {
  161.         $exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
  162.         $attachments = array(
  163.             'order'          => 'ASC',
  164.             'orderby'        => $orderby,
  165.             'post_type'      => 'attachment',
  166.             'post_parent'    => $id,
  167.             'post_mime_type' => 'image',
  168.             'post_status'    => 'any',
  169.             'posts_per_page' => -1,
  170.             'post__not_in'   => $exclude
  171.         );
  172.     } else {
  173.         $attachments = array(
  174.             'order'          => 'ASC',
  175.             'orderby'        => $orderby,
  176.             'post_type'      => 'attachment',
  177.             'post_parent'    => $id,
  178.             'post_mime_type' => 'image',
  179.             'post_status'    => 'any',
  180.             'posts_per_page' => -1
  181.         );
  182.     }
  183.    
  184.     /* The main query */
  185.  
  186.     $psp_query = new WP_Query($attachments);
  187.  
  188.     if ( $include ) {
  189.         // set the menu_order
  190.         psp_set_include_order($psp_query, $include);
  191.            
  192.         // and actually sort the posts in our query
  193.         usort($psp_query->posts, 'psp_menu_order_sort');    
  194.     }
  195.  
  196.     global $ps_count;
  197.     $ps_count = $psp_query->post_count;
  198.  
  199.     /*
  200.      * Overrides
  201.      */
  202.    
  203.     if ( $audio ) { $psaudio = "true"; } else { $psaudio = "false"; }
  204.        
  205.     /* If carousel is true, change the pager option (legacy support) */
  206.     if ( $carousel == "true" ) $pagerstyle = "carousel";
  207.    
  208.     /* If a click target is set, map that to the proper options */
  209.     if ( $target == "current" || $target == "" || $target == "_self" ) {
  210.         $target = "_self";
  211.     } elseif ( $target == "parent" ) {
  212.         $target = "_parent";
  213.     } else {
  214.         $target = "_blank";
  215.     }
  216.    
  217.     /* If fancygrid is active, force the correct options */
  218.     if ( $fancygrid == "true" ) {
  219.         $pagerpos = "top";
  220.         $pagerstyle = "thumbs";    
  221.         $trans = "fade";
  222.         $speed = 100;  
  223.         $togglethumbs = "true";
  224.     }
  225.    
  226.     if ( $crop != "true" ) { $crop = false; }
  227.    
  228.     /* Preserve the nowrap option if people are still using it */
  229.     if ( $nowrap == "false" || $loop == "true" ) { $loop = "true"; } else { $loop = "false"; }
  230.        
  231.     /* Override the per-slide timeout if a full-slideshow duration is set */
  232.     if ( $duration ) { $timeout = ( $duration * 1000 ) / $ps_count; }
  233.            
  234.    
  235.     if ( ! is_feed() && $ps_count != 0 ) {
  236.         $slideshow =
  237.         '<script type="text/javascript">/* <![CDATA[ */ psTimeout['.$slideKey.']='.$timeout.';psAudio['.$slideKey.']='.$psaudio.';psAutoplay['.$slideKey.']='.$autoplay.';psDelay['.$slideKey.']='.$delay.';psTrans['.$slideKey.']=\''.$trans.'\';psLoop['.$slideKey.']='.$loop.';psCarouselSize['.$slideKey.']='.$carouselsize.';psSpeed['.$slideKey.']='.$speed.';psPagerStyle['.$slideKey.']=\''.$pagerstyle.'\';psClickOpens['.$slideKey.']=\''.$click.'\';/* ]]> */</script>';
  238.  
  239.         //wrap the whole thing in a div for styling    
  240.         $slideshow .= '<div id="slideshow-wrapper'.$slideKey.'" class="slideshow-wrapper clearfix';
  241.        
  242.         if ( $centered == "true" ) {
  243.             $slideshow .= " centered";
  244.         }
  245.        
  246.         if ( $fancygrid == "true" ) {
  247.             $slideshow .= " fancygrid";
  248.         }
  249.         if ( $click == "fullscreen" || $fullscreen == "true" ) {
  250.             $slideshow .= " photoswipe";
  251.         }
  252.        
  253.         if ( $togglestate == "open" ) {
  254.             $slideshow .= " toggle-open";
  255.         } else {
  256.             $slideshow .= " toggle-closed";
  257.         }
  258.        
  259.         if ( $fluid == "true" ) {
  260.             $slideshow .= " fluid";
  261.         }
  262.        
  263.         if ( $class ) {
  264.             $slideshow .= " $class";
  265.         }
  266.        
  267.         $slideshow .='"><a id="psprev'.$slideKey.'" href="javascript: void(0);"></a><a id="psnext'.$slideKey.'" href="javascript: void(0);"></a>
  268.         '; 
  269.  
  270.         if ( $navpos == 'top' ) {
  271.             $slideshow .= psp_slideshow_navigation( $slideKey, $ps_count, $navstyle, $pagerstyle, $pagerpos, $togglethumbs, $fullscreen, $showinfo, $showplay );
  272.         }
  273.    
  274.         if ( $pagerpos == 'top' ) {
  275.             $slideshow .= psp_slideshow_pager( $slideKey, $ps_count, $psp_query, $pagerstyle, $carouselsize, $togglethumbs, $proportionalthumbs, $centered, $pagerwidth, $thumbnailmargin, $thumbnailsize );
  276.         }
  277.  
  278.         if ( $metapos == 'top' ) {
  279.             $slideshow .= psp_slideshow_meta( $showtitles, $showcaps, $showdesc, $post_titles, $metacontent, $slideKey, $psp_query, $centered );
  280.         }
  281.        
  282.         $slideshow .= '<div id="portfolio-slideshow'.$slideKey.'" class="portfolio-slideshow';
  283.            
  284.         if ( $ps_options['showloader'] == "true" ) {
  285.             $slideshow .= " showloader";
  286.         }
  287.  
  288.         $slideshow .= '"';
  289.        
  290.         /* An inline style if they need to set a height for the main slideshow container */
  291.        
  292.         if ( $slideheight ) {
  293.             $slideshow .= ' style="min-height:' . $slideheight . 'px !important;"';
  294.         }
  295.        
  296.         $slideshow .='>
  297.         ';
  298.  
  299. } //end ! is_feed()
  300.    
  301.     $slideID = 0;
  302.     //begin the slideshow loop
  303.     while( $psp_query->have_posts() ) : $psp_query->the_post();
  304.         global $post;
  305.         $custom_fields = get_post_custom($id); 
  306.         if ( $slidelinks ) {
  307.             if(isset($slidelinks[$slideID])) :
  308.                 $imagelink = $slidelinks[$slideID];
  309.             endif;
  310.         } else {
  311.             $imagelink = get_post_meta( $post->ID, '_ps_image_link', true );
  312.         }
  313.        
  314.         if ( $width && $height ) {
  315.             $videowidth = $width;
  316.             $videoheight = $height;
  317.         } else {
  318.             $videowidth = '640';
  319.             $videoheight = '360';
  320.         }
  321.        
  322.         if (preg_match('/ww=[0-9]+/i', $imagelink, $ww)) {
  323.             $videowidth = str_replace('ww=','',$ww[0]);
  324.         }
  325.        
  326.         if (preg_match('/wh=[0-9]+/i', $imagelink, $wh)) {
  327.             $videoheight = str_replace('wh=','',$wh[0]);
  328.         }
  329.        
  330.         if (preg_match('%(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $imagelink, $match)) {
  331.        
  332.         $video = true;
  333.              
  334.         $videoembed = '<div class="ps-video-wrapper"><iframe class="ps-video" width="' . $videowidth . '" height="' . $videoheight . '" data-src="http://www.youtube.com/embed/' . $match[1] . '" frameborder="0" allowfullscreen></iframe></div>';
  335.                 }
  336.        
  337.         if (preg_match('%(?:vimeo\.com/(\d+))%i', $imagelink, $match)) {
  338.        
  339.             $video = true;
  340.             $videoembed = '<div class="ps-video-wrapper"><iframe class="ps-video" data-src="http://player.vimeo.com/video/' . $match[1] . '" width="' . $videowidth . '" height="' . $videoheight . '" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>';  
  341.        
  342.         }
  343.            
  344.         $alttext = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );
  345.  
  346.         if ( ! $alttext ) {
  347.             $alttext = $post->post_title;
  348.         }
  349.                
  350.         $slideshow .= '<div class="';
  351.         if ( $slideID != "0" ) { $slideshow .= "not-first "; }
  352.         if ( $loop != "true" && $slideKey == ( $ps_count - 1 ) && $click == "advance" || $click == "none" ) { $slideshow .= "psp-no-click "; }
  353.         $slideshow .= 'slideshow-content';
  354.         $slideshow .= '">
  355.         ';
  356.        
  357.         if ( $ps_count == 1 && $click == "advance" ) $click = "none";
  358.         switch ( $click ) {
  359.        
  360.             case "lightbox" :  
  361.                 $image = psp_resize( $post->ID, '', 1600, 1600, false );
  362.                 $imagelink = $image['url'] . '" class="fancybox" rel="group-'.$slideKey;
  363.  
  364.                 if ( $showcaps == "true" ) {
  365.                     $caption = $post->post_excerpt;
  366.                     $imagelink = $imagelink . '" title="' . $caption . '';
  367.                 }  
  368.  
  369.                 break;
  370.  
  371.             case "openurl" :
  372.                
  373.                 if ( is_array( $slidelinks ) ) {
  374.                     $imagelink = $slidelinks[$slideID];
  375.                 } else {
  376.                     $imagelink = get_post_meta( $post->ID, '_ps_image_link', true );
  377.                 }
  378.                                                        
  379.                 if ( $imagelink ) { $imagelink = $imagelink . '" target="' . $target . '" class="' . $target; } else {
  380.                     $imagelink = 'javascript: void(0);" class="slideshow-next' . $target;
  381.                 }
  382.                
  383.                 break;
  384.                
  385.             case "postlink":
  386.                
  387.                 if ( is_array( $slidelinks ) ) {
  388.                     $imagelink = $slidelinks[$slideID];
  389.                 } else {
  390.                     $imagelink = 'javascript: void(0);" class="slideshow-next';
  391.                 }  
  392.                 break;
  393.  
  394.             case "attachment" :
  395.  
  396.                 $imagelink = get_attachment_link();
  397.  
  398.                 break;
  399.                
  400.             case "fullscreen" :
  401.  
  402.                 $photoswipe_imgsrc = wp_get_attachment_image_src( $post->ID, 'full' );
  403.                 $imagelink = $photoswipe_imgsrc[0] . '" class="ps-photoswipe';
  404.            
  405.                 break;
  406.            
  407.             case "none" :
  408.            
  409.                 $imagelink = 'javascript: void(0);" class="psp-no-click';
  410.                 break; 
  411.            
  412.             default :
  413.                 $imagelink = 'javascript: void(0);" class="slideshow-next';
  414.                 break; 
  415.         }  
  416.  
  417.         if ( $video != true ) {
  418.             $slideshow .= '<a href="' . $imagelink . '">';
  419.         }
  420.  
  421. /*
  422. * This is the part of the loop that actually returns the images
  423. */
  424.             if ( is_feed() ) { /* No slideshow if we're in the feed */
  425.                 $feedimg = wp_get_attachment_image_src( $post->ID, 'large' );      
  426.                 $slideshow .= '<img style="margin-bottom:15px" src="' . $feedimg[0] . '"/><br />';
  427.                
  428.             } else { /* Slideshow output */
  429.            
  430.             $ps_placeholder = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
  431.                                  
  432.             if ( $width || $height ) {
  433.            
  434.             /* Determine if we've got an explicit height or width in the shortcode */
  435.                            
  436.                 if ( ! $width ) { $width = 9999; $crop = false; }
  437.                 if ( ! $height ) { $height = 9999; $crop = false; }
  438.                    
  439.                 $image = psp_resize( $post->ID, '', $width, $height, $crop );
  440.                    
  441.             } elseif ( $size == "custom" ) {
  442.  
  443.                 /* If we're using a defined custom size */
  444.                
  445.                 $image = psp_resize( $post->ID, '', $ps_options['customwidth'], $ps_options['customheight'], $crop );
  446.                                        
  447.             } else {
  448.                
  449.                 /* Otherwise it's just one of the WP defaults, so create an array to match our other formats  */
  450.                                
  451.                 $imgsrc = wp_get_attachment_image_src( $post->ID, $size );
  452.                
  453.                 $image = array(
  454.                     "url" => $imgsrc[0],
  455.                     "width" => $imgsrc[1],
  456.                     "height" => $imgsrc[2]
  457.                 );
  458.  
  459.             }      
  460.                            
  461.             if ( $video == true ) {
  462.                            
  463.                 $slideshow .= $videoembed;
  464.            
  465.             } else { // if it's not a video, return the usual slideshow
  466.            
  467.                 $slideshow .= '<img class="psp-active"';
  468.                
  469.                 if ( $fluid != "true" ) {
  470.                     $slideshow .= ' height="' . $image['height'] . '" width="' . $image['width'] . '"';
  471.                  }
  472.                
  473.                 $slideshow .= ' data-img="' . $image['url'] . '"';
  474.                
  475.                 if ( $slideID < 2 ) {
  476.                     $slideshow .= ' src="' . $image['url'] . '"';
  477.                 } else {
  478.                     $slideshow .= ' src="' . $ps_placeholder . '"';
  479.                 }
  480.                
  481.                 //include the real src attribute for the first two slides only
  482.                                    
  483.                 $slideshow .= ' alt="' . $alttext . '" /><noscript><img src="' . $image['url'] . '" alt="' . $alttext . '" /></noscript>';
  484.            
  485.             } /* End $video == true */
  486.                                                        
  487.             } /* End is_feed determination for slideshow */
  488.  
  489.         /*
  490.         * That's it for the images
  491.         */         
  492.        
  493.         if ( $video != true ) {    
  494.             $slideshow .= "</a>";
  495.         }
  496.        
  497.         if ( $fullscreen == "true" && $click != "fullscreen") {
  498.             $photoswipe_imgsrc = wp_get_attachment_image_src( $post->ID, 'full' );
  499.             $imagelink = $photoswipe_imgsrc[0];
  500.             $slideshow .= '<a href="' . $imagelink . '" class="ps-photoswipe" style="display:none"></a>';
  501.         }      
  502.        
  503.         $slideshow .= '</div><!-- .slideshow-content -->
  504.         ';
  505.    
  506.         $slideID++;
  507.        
  508.         $video = false;        
  509.     endwhile;
  510.     wp_reset_postdata();
  511.     // end slideshow loop
  512.  
  513.     if ( ! is_feed() && $ps_count != 0 ) {
  514.        
  515.         $slideshow .= "</div><!--#portfolio-slideshow-->";
  516.        
  517.         if ( $metapos == 'middle' ) {
  518.             $slideshow .= psp_slideshow_meta( $showtitles, $showcaps, $showdesc, $post_titles, $metacontent, $slideKey, $psp_query, $centered );
  519.         }
  520.  
  521.         if ( $navpos == "middle" ) {
  522.             $slideshow .= psp_slideshow_navigation( $slideKey, $ps_count, $navstyle, $pagerstyle, $pagerpos, $togglethumbs, $fullscreen, $showinfo, $showplay );
  523.         }
  524.        
  525.         if ( $pagerpos == "middle" ) {
  526.             $slideshow .= psp_slideshow_pager( $slideKey, $ps_count, $psp_query, $pagerstyle, $carouselsize, $togglethumbs, $proportionalthumbs, $centered, $pagerwidth, $thumbnailmargin, $thumbnailsize );
  527.         }
  528.  
  529.         if ( $metapos == 'bottom' ) {
  530.             $slideshow .= psp_slideshow_meta( $showtitles, $showcaps, $showdesc, $post_titles, $metacontent, $slideKey, $psp_query, $centered );
  531.         }
  532.  
  533.         if ( $navpos == "bottom" ) {
  534.             $slideshow .= psp_slideshow_navigation( $slideKey, $ps_count, $navstyle, $pagerstyle, $pagerpos, $togglethumbs, $fullscreen, $showinfo, $showplay );
  535.         }
  536.        
  537.         if ( $pagerpos == "bottom" ) {
  538.             $slideshow .= psp_slideshow_pager( $slideKey, $ps_count, $psp_query, $pagerstyle, $carouselsize, $togglethumbs, $proportionalthumbs, $centered, $pagerwidth, $thumbnailmargin, $thumbnailsize );
  539.         }
  540.        
  541.         $slideshow .='</div><!--#slideshow-wrapper-->';
  542.  
  543.     } /* End ! is_feed() */
  544.    
  545.     if ( $audio ) {
  546.         if(!empty($audio_loop) && $audio_loop == true) {
  547.             $slideshow .= do_shortcode("[haiku url=$audio class='portfolio_slideshow_audio' defaultpath=disabled graphical=false loop=true]");
  548.         } else {
  549.             $slideshow .= do_shortcode("[haiku url=$audio class='portfolio_slideshow_audio'  defaultpath=disabled graphical=false loop=false]");
  550.         }  
  551.     }
  552.  
  553.     if ( isset( $slideshow ) ) return $slideshow;   //that's the slideshow
  554.    
  555.    
  556. } //ends the portfolio_shortcode function ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement