remotes/origin/stable
commit
ed2ba4e8e4
After Width: | Height: | Size: 978 B |
After Width: | Height: | Size: 8.0 KiB |
@ -0,0 +1,118 @@ |
||||
/** |
||||
* author Christopher Blum |
||||
* - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
|
||||
* - forked from http://github.com/zuk/jquery.inview/
|
||||
*/ |
||||
(function ($) { |
||||
var inviewObjects = {}, viewportSize, viewportOffset, |
||||
d = document, w = window, documentElement = d.documentElement, expando = $.expando; |
||||
|
||||
$.event.special.inview = { |
||||
add: function(data) { |
||||
inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) }; |
||||
}, |
||||
|
||||
remove: function(data) { |
||||
try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} |
||||
} |
||||
}; |
||||
|
||||
function getViewportSize() { |
||||
var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth }; |
||||
|
||||
// if this is correct then return it. iPad has compat Mode, so will
|
||||
// go into check clientHeight/clientWidth (which has the wrong value).
|
||||
if (!size.height) { |
||||
mode = d.compatMode; |
||||
if (mode || !$.support.boxModel) { // IE, Gecko
|
||||
domObject = mode === 'CSS1Compat' ? |
||||
documentElement : // Standards
|
||||
d.body; // Quirks
|
||||
size = { |
||||
height: domObject.clientHeight, |
||||
width: domObject.clientWidth |
||||
}; |
||||
} |
||||
} |
||||
|
||||
return size; |
||||
} |
||||
|
||||
function getViewportOffset() { |
||||
return { |
||||
top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop, |
||||
left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft |
||||
}; |
||||
} |
||||
|
||||
function checkInView() { |
||||
var $elements = $(), elementsLength, i = 0; |
||||
|
||||
$.each(inviewObjects, function(i, inviewObject) { |
||||
var selector = inviewObject.data.selector, |
||||
$element = inviewObject.$element; |
||||
$elements = $elements.add(selector ? $element.find(selector) : $element); |
||||
}); |
||||
|
||||
elementsLength = $elements.length; |
||||
if (elementsLength) { |
||||
viewportSize = viewportSize || getViewportSize(); |
||||
viewportOffset = viewportOffset || getViewportOffset(); |
||||
|
||||
for (; i<elementsLength; i++) { |
||||
// Ignore elements that are not in the DOM tree
|
||||
if (!$.contains(documentElement, $elements[i])) { |
||||
continue; |
||||
} |
||||
|
||||
var $element = $($elements[i]), |
||||
elementSize = { height: $element.height(), width: $element.width() }, |
||||
elementOffset = $element.offset(), |
||||
inView = $element.data('inview'), |
||||
visiblePartX, |
||||
visiblePartY, |
||||
visiblePartsMerged; |
||||
|
||||
// Don't ask me why because I haven't figured out yet:
|
||||
// viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
|
||||
// Even though it sounds weird:
|
||||
// It seems that the execution of this function is interferred by the onresize/onscroll event
|
||||
// where viewportOffset and viewportSize are unset
|
||||
if (!viewportOffset || !viewportSize) { |
||||
return; |
||||
} |
||||
|
||||
if (elementOffset.top + elementSize.height > viewportOffset.top && |
||||
elementOffset.top < viewportOffset.top + viewportSize.height && |
||||
elementOffset.left + elementSize.width > viewportOffset.left && |
||||
elementOffset.left < viewportOffset.left + viewportSize.width) { |
||||
visiblePartX = (viewportOffset.left > elementOffset.left ? |
||||
'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ? |
||||
'left' : 'both'); |
||||
visiblePartY = (viewportOffset.top > elementOffset.top ? |
||||
'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ? |
||||
'top' : 'both'); |
||||
visiblePartsMerged = visiblePartX + "-" + visiblePartY; |
||||
if (!inView || inView !== visiblePartsMerged) { |
||||
$element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]); |
||||
} |
||||
} else if (inView) { |
||||
$element.data('inview', false).trigger('inview', [false]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
$(w).bind("scroll resize", function() { |
||||
viewportSize = viewportOffset = null; |
||||
}); |
||||
|
||||
// Use setInterval in order to also make sure this captures elements within
|
||||
// "overflow:scroll" elements or elements that appeared in the dom tree due to
|
||||
// dom manipulation and reflow
|
||||
// old: $(window).scroll(checkInView);
|
||||
//
|
||||
// By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
|
||||
// intervals while the user scrolls. Therefore the inview event might fire a bit late there
|
||||
setInterval(checkInView, 250); |
||||
})(jQuery); |
@ -0,0 +1,150 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud - Addressbook |
||||
* |
||||
* @author Jakob Sack |
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
// Init owncloud |
||||
require_once('../../lib/base.php'); |
||||
OC_Util::checkLoggedIn(); |
||||
OC_Util::checkAppEnabled('contacts'); |
||||
|
||||
if(!function_exists('imagecreatefromjpeg')) { |
||||
OC_Log::write('contacts','GD module not installed',OC_Log::ERROR); |
||||
header('Content-Type: image/png'); |
||||
// TODO: Check if it works to read the file and echo the content. |
||||
return 'img/person.png'; |
||||
} |
||||
|
||||
function getStandardImage(){ |
||||
$src_img = imagecreatefrompng('img/person.png'); |
||||
header('Content-Type: image/png'); |
||||
imagepng($src_img); |
||||
imagedestroy($src_img); |
||||
} |
||||
|
||||
|
||||
$id = $_GET['id']; |
||||
|
||||
$l10n = new OC_L10N('contacts'); |
||||
|
||||
$card = OC_Contacts_VCard::find( $id ); |
||||
if( $card === false ){ |
||||
echo $l10n->t('Contact could not be found.'); |
||||
exit(); |
||||
} |
||||
|
||||
$addressbook = OC_Contacts_Addressbook::find( $card['addressbookid'] ); |
||||
if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ |
||||
echo $l10n->t('This is not your contact.'); // This is a weird error, why would it come up? (Better feedback for users?) |
||||
exit(); |
||||
} |
||||
|
||||
$content = OC_VObject::parse($card['carddata']); |
||||
|
||||
// invalid vcard |
||||
if( is_null($content)){ |
||||
echo $l10n->t('This card is not RFC compatible.'); |
||||
exit(); |
||||
} |
||||
|
||||
// define the width and height for the thumbnail |
||||
// note that theese dimmensions are considered the maximum dimmension and are not fixed, |
||||
// because we have to keep the image ratio intact or it will be deformed |
||||
$thumbnail_width = 23; |
||||
$thumbnail_height = 23; |
||||
|
||||
// Photo :-) |
||||
foreach($content->children as $child){ |
||||
if($child->name == 'PHOTO'){ |
||||
foreach($child->parameters as $parameter){ |
||||
if( $parameter->name == 'TYPE' ){ |
||||
$mime = $parameter->value; |
||||
} |
||||
} |
||||
$data = base64_decode($child->value); |
||||
$src_img = imagecreatefromstring($data); |
||||
if ($src_img !== false) { |
||||
//gets the dimmensions of the image |
||||
$width_orig=imageSX($src_img); |
||||
$height_orig=imageSY($src_img); |
||||
$ratio_orig = $width_orig/$height_orig; |
||||
|
||||
if ($thumbnail_width/$thumbnail_height > $ratio_orig) { |
||||
$new_height = $thumbnail_width/$ratio_orig; |
||||
$new_width = $thumbnail_width; |
||||
} else { |
||||
$new_width = $thumbnail_height*$ratio_orig; |
||||
$new_height = $thumbnail_height; |
||||
} |
||||
|
||||
$x_mid = $new_width/2; //horizontal middle |
||||
$y_mid = $new_height/2; //vertical middle |
||||
|
||||
$process = imagecreatetruecolor(round($new_width), round($new_height)); |
||||
if ($process == false) { |
||||
getStandardImage(); |
||||
//echo 'Error creating process image: '.$new_width.'x'.$new_height; |
||||
OC_Log::write('contacts','Error creating process image for '.$id.' '.$new_width.'x'.$new_height,OC_Log::ERROR); |
||||
imagedestroy($process); |
||||
imagedestroy($src_img); |
||||
exit(); |
||||
} |
||||
|
||||
imagecopyresampled($process, $src_img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); |
||||
if ($process == false) { |
||||
getStandardImage(); |
||||
//echo 'Error resampling process image: '.$new_width.'x'.$new_height; |
||||
OC_Log::write('contacts','Error resampling process image for '.$id.' '.$new_width.'x'.$new_height,OC_Log::ERROR); |
||||
imagedestroy($process); |
||||
imagedestroy($src_img); |
||||
exit(); |
||||
} |
||||
$thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height); |
||||
if ($process == false) { |
||||
getStandardImage(); |
||||
//echo 'Error creating thumb image: '.$thumbnail_width.'x'.$thumbnail_height; |
||||
OC_Log::write('contacts','Error creating thumb image for '.$id.' '.$thumbnail_width.'x'.$thumbnail_height,OC_Log::ERROR); |
||||
imagedestroy($process); |
||||
imagedestroy($src_img); |
||||
exit(); |
||||
} |
||||
imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); |
||||
if ($thumb !== false) { |
||||
header('Content-Type: image/png'); |
||||
imagepng($thumb); |
||||
} else { |
||||
getStandardImage(); |
||||
OC_Log::write('contacts','Error resampling thumb image for '.$id.' '.$thumbnail_width.'x'.$thumbnail_height,OC_Log::ERROR); |
||||
//echo 'An error occurred resampling thumb.'; |
||||
} |
||||
imagedestroy($thumb); |
||||
imagedestroy($process); |
||||
imagedestroy($src_img); |
||||
} |
||||
else { |
||||
getStandardImage(); |
||||
} |
||||
exit(); |
||||
} |
||||
} |
||||
getStandardImage(); |
||||
|
||||
// Not found :-( |
||||
//echo $l10n->t('This card does not contain a photo.'); |
Loading…
Reference in new issue