a:9:{s:7:"version";s:5:"0.5.1";s:6:"author";s:13:"Johan Nilsson";s:10:"author_uri";s:25:"http://johan.galaxen.net/";s:11:"description";s:48:"Helps you control how to display a image element";s:4:"type";i:0;s:4:"name";s:9:"glx_image";s:4:"help";s:2320:"
	<h2>glx_image</h2>

	<p>This plugins helps you control how to display a image element based on a article i read at <a href="http://www.1976design.com/blog/archive/2004/07/29/redesign-tag-transform">Dunstans Blog</a></p>

	<h3>Parameters</h3>

	<p>All parameters are optional, except <code>id</code></p>

	<p><strong>id</strong><br />
Image to display<br />
<strong>src</strong><br />
Image to display, if src is used dont use id.<br />
<strong>link</strong><br />
Url (with http://)or just enter <code>large</code> in that case the plugin chose the thumbnail for the given id and place a link to the large version of that image.<br />
Use <code>pop</code> to have images open in a popup instead (requires <a href="http://forum.textpattern.com/viewtopic.php?id=1228">dca_pop</a> plugin)<br />
<strong>linktitle</strong><br />
A title that will be added to the link, when link=&#8221;large&#8221; is used glx_image will automagically add &#8220;Link to a larger version of this image&#8221;<br />
<strong>caption</strong><br />
Caption to display under the image, enter <code>standard</code> to use the one that is stored in the database<br />
<strong>alt</strong><br />
alt text for the image, if no alt is given i uses the one that is stored in the database.<br />
<strong>class</strong><br />
Class to control how to display the image element <code>left</code>, <code>right</code>, <code>center</code> or <code>standalone</code></p>

	<p>Note! When src is used, the link=&#8221;large&#8221; and link=&#8221;pop&#8221; will not work.</p>

	<h3>Example tags</h3>

<code><br />
&lt;txp:glx_image id="1" /&gt;<br />
&lt;txp:glx_image id="1" link="large" caption="standard" class="center" /&gt;<br />
&lt;txp:glx_image src="http://olof.galaxen.net/bilder/fuldans.gif" link="http://olof.galaxen.net/" linktitle="Goto Olofs webpage" caption="A friend of mine is doing the fuldans" class="center" /&gt;<br />
</code>

	<h3>CSS example</h3>

<pre>
<code>
div.image-element div.caption {
padding: 0;
text-align: left;
font-size: x-small;
border-style: none;
text-align: center;
margin: 0 0 20px 0;
}
.right {float: right; position: relative; margin: 0.2em 0.5em 0.5em 1.5em}
.left {float: left; position: relative; margin: 0.5em 1.5em 0.5em 0.5em}
.standalone { width: auto; }
.center { text-align: center;}
</code>
</pre>



 ";s:4:"code";s:2038:"/* 
glx_image v.0.5.1
By Johan Nilsson <http://johan.galaxen.net/>
Last edited 2005-05-10 12.53
*/ 


function glx_image($atts) {
	global $pfr, $img_dir;
	if (is_array($atts))
		extract($atts);

	$captionTag = "";

	$image_id = (!empty ($id)) ? $id : "";
	$src = (!empty ($src)) ? $src : "";
	$link = (!empty ($link)) ? $link : "";
	$linktitle = (!empty ($linktitle)) ? $linktitle : "";
	$my_caption = (!empty ($caption)) ? $caption : "";
	$alt = (!empty ($alt)) ? $alt : "";
	$class = (!empty ($class)) ? ' '.$class : "";
	$debug = (!empty ($debug)) ? $debug : 0;

	$caption_tag = "";
	$link_end = "";
	$link_start = "";

	$rs = safe_row("*", "txp_image", "id='$image_id' limit 1", $debug);
	if ($rs) {
		extract($rs);

		$src = $pfr.$img_dir.'/'.$id.$ext;

		if (!empty ($link)) {
			$linktitle = (!empty ($linktitle)) ? ' title="'.$linktitle.'"' : ' title="Link to a larger version of this image"';
			if ($link == "large") {
				$link = $pfr.$img_dir.'/'.$id.$ext;
				$src = $pfr.$img_dir.'/'.$id.'t'.$ext;
			}
			if ($link == "pop") {
				$src = $pfr.$img_dir.'/'.$id.'t'.$ext;
				$link_start = "<txp:dca_pop id=\"".$id."\">";
				$link_end = "</txp:dca_pop>";
			} else {
				$link_start = "<a href=\"".$link."\"".$linktitle.">";
				$link_end = "</a>";
			}
		}

		if (!empty ($my_caption)) {
			if ($my_caption == "standard") {
				$my_caption = $caption;
			} else {
				$my_caption = $my_caption;
			}
			$caption_tag = '<div class="caption">'.$my_caption.'</div>';
		}
	}

	// For external images
	if (!empty ($my_caption)) {
		$caption_tag = '<div class="caption">'.$my_caption.'</div>';
	}

	if (!empty ($link) && substr($link, 0, 7) == "http://") {
		$linktitle = (!empty ($linktitle)) ? ' title="'.$linktitle.'"' : "";
		$link_start = "<a href=\"".$link."\"".$linktitle.">";
		$link_end = "</a>";
	}

	$out = '<div class="image-element'.$class.'">'.n;
	$out .= $link_start.n;
	$out .= '<img src="'.$src.'" alt="'.$alt.'" />'.n;
	$out .= $link_end.n;
	$out .= $caption_tag.n;
	$out .= '</div>'.n;

	return parse($out);
}
";s:3:"md5";s:32:"8397d1ddd2635bc337fd8a377e6d476e";}