diff --git a/doc/Widgets.md b/doc/Widgets.md
index dcf8dfb48..2c5625156 100644
--- a/doc/Widgets.md
+++ b/doc/Widgets.md
@@ -85,3 +85,10 @@ Some/many of these widgets have restrictions which may restrict the type of page
* style - CSS style string
+* photo_rand - display a random photo from one of your photo albums. Photo permissions are honoured
+ * args:
+ * album - album name (very strongly recommended if you have lots of photos)
+ * scale - typically 0 (original size), 1 (640px), or 2 (320px)
+ * style - CSS style string
+
+
diff --git a/include/widgets.php b/include/widgets.php
index 74bdb5d74..7193850ef 100644
--- a/include/widgets.php
+++ b/include/widgets.php
@@ -810,7 +810,61 @@ function widget_photo($arr) {
$o .= '';
+ . ' src="' . $url . '" alt="' . t('photo/image') . '" />';
+
+ $o .= '';
+
+ return $o;
+}
+
+
+function widget_photo_rand($arr) {
+
+ require_once('include/photos.php');
+ $style = $zrl = false;
+ $params = '';
+ if(array_key_exists('album',$arr) && isset($arr['album']))
+ $album = $arr['album'];
+ else
+ $album = '';
+
+ $channel_id = get_app()->profile_uid;
+ if(! $channel_id)
+ return '';
+
+ $scale = ((array_key_exists('scale',$arr)) ? intval($arr['scale']) : 0);
+
+ $ret = photos_list_photos(array('channel_id' => $channel_id),get_app()->get_observer(),$album);
+
+ $filtered = array();
+ if($ret['success'] && $ret['photos'])
+ foreach($ret['photos'] as $p)
+ if($p['scale'] == $scale)
+ $filtered[] = $p['src'];
+
+ if($filtered) {
+ $e = mt_rand(0,count($filtered)-1);
+ $url = $filtered[$e];
+ }
+
+ if(strpos($url,'http') !== 0)
+ return '';
+
+ if(array_key_exists('style',$arr) && isset($arr['style']))
+ $style = $arr['style'];
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpos($style,'(') !== false)
+ return '';
+
+ $url = zid($url);
+
+ $o = '