Sequenzia/app/views/user/set_avatar.php
2013-10-26 18:06:58 -05:00

114 lines
4.3 KiB
PHP
Executable File

<!--[if lt IE 9]>
<div style="margin-bottom: 1em;"> Setting an avatar with Internet Explorer will not work.</div>
<![endif]-->
<div id="set-avatar" class="page">
<div class="avatar-crop">
<?= $this->imageTag($this->post->sample_url(), ['id' => 'image', 'width' => $this->post->get_sample_width(), 'height' => $this->post->get_sample_height()]) ?>
</div>
<?= $this->formTag([], ['level' => 'member'], function(){ ?>
<?= $this->hiddenFieldTag("post_id", $this->params()->id) ?>
<?php if ($this->params()->user_id) : ?>
<?=$this->hiddenFieldTag("user_id", $this->params()->user_id) ?>
<?php endif ?>
<?=$this->hiddenFieldTag("left", 0) ?>
<?=$this->hiddenFieldTag("right", 0) ?>
<?=$this->hiddenFieldTag("top", 0) ?>
<?=$this->hiddenFieldTag("bottom", 0) ?>
<div width="200px">
<div id="crop-preview-box">
<div class="crop-preview-frame" style="width: <?= CONFIG()->avatar_max_width + 10 ?>px; height: <?= CONFIG()->avatar_max_height + 10 ?>px;">
<div class="crop-preview-frame-inner">
<div id="crop-preview"></div>
</div>
</div>
<div class="avatar-submit">
<?= $this->submitTag($this->t('user_set_avatar')) ?>
</div>
</div>
</div>
<?php }) ?>
<script type="text/javascript" charset="utf-8">
function PositionPreview()
{
var box = $("crop-preview-box");
var image = $("image");
var image_right_outside = image.viewportOffset().left + image.getWidth();
var image_right_inside = image_right_outside - box.getWidth();
var viewport_align = document.viewport.getWidth();
image_right_outside += 5;
image_right_inside -= 5;
/* If the image is narrow enough for us to fit the preview to the right
* without falling off the screen, put it there. */
box.style.left = image_right_outside + "px";
box.style.right = "";
if(box.viewportOffset().left + box.getWidth() < document.viewport.getWidth() - 20)
return;
/* It doesn't fit there. Either attach the preview to the right edge of the
* viewport, or to the right edge of the image (if that's always on-screen). */
box.style.left = "";
box.style.right = "5px";
if(box.viewportOffset().left > image_right_inside)
{
box.style.left = image_right_inside + "px";
box.style.right = "";
}
}
PositionPreview();
Event.observe(window, "resize", function(e) { PositionPreview(); }, false);
function onEndCrop(coords, dimensions) {
$("left").value = (coords.x1 / $("image").width).toFixed(4);
$("right").value = (coords.x2 / $("image").width).toFixed(4);
$("top").value = (coords.y1 / $("image").height).toFixed(4);
$("bottom").value = (coords.y2 / $("image").height).toFixed(4);
}
// example with a preview of crop results, must have minimumm dimensions
var width = $("image").width;
var height = $("image").height;
var options =
{
displayOnInit: true,
onEndCrop: onEndCrop,
previewWrap: 'crop-preview',
minWidth: 1,
minHeight: 1,
resizePreview: function(dim)
{
var max_width = <?= CONFIG()->avatar_max_width ?>;
var max_height = <?= CONFIG()->avatar_max_height ?>;
var width = dim.x;
var height = dim.y;
if(width < max_width) { var scale = max_width / width; width *= scale; height *= scale; }
if(height < max_height) { var scale = max_height / height; width *= scale; height *= scale; }
if(width > max_width) { var scale = max_width / width; width *= scale; height *= scale; }
if(height > max_height) { var scale = max_height / height; width *= scale; height *= scale; }
return { x: Math.round(width), y: Math.round(height) }
}
}
<?php if ($this->user->has_avatar() && $this->post->id == $this->user->avatar_post->id) : ?>
options.onloadCoords = { x1: <?= $this->user->avatar_left ?> * width, y1: <?= $this->user->avatar_top ?> * height,
x2: <?= $this->user->avatar_right ?> * width, y2: <?= $this->user->avatar_bottom ?> * height }
<?php else: ?>
/* Default to a square selection. */
if(width < height)
options.onloadCoords = { x1: width/4, y1: width/4, x2: width*2/4, y2: width*2/4 }
else
options.onloadCoords = { x1: height/4, y1: height/4, x2: height*2/4, y2: height*2/4 }
<?php endif ?>
new Cropper.ImgWithPreview("image", options)
</script>
</div>