aboutsummaryrefslogtreecommitdiffstats
path: root/apps/contacts/js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/contacts/js')
-rw-r--r--apps/contacts/js/interface.js155
-rw-r--r--apps/contacts/js/jquery.inview.js118
2 files changed, 272 insertions, 1 deletions
diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js
index ba1c0e536c2..3190efae3cc 100644
--- a/apps/contacts/js/interface.js
+++ b/apps/contacts/js/interface.js
@@ -1,3 +1,130 @@
+Contacts={
+ UI:{
+ showCardDAVUrl:function(username, bookname){
+ $('#carddav_url').val(totalurl + '/' + username + '/' + bookname);
+ $('#carddav_url').show();
+ $('#carddav_url_close').show();
+ },
+ Addressbooks:{
+ overview:function(){
+ if($('#chooseaddressbook_dialog').dialog('isOpen') == true){
+ $('#chooseaddressbook_dialog').dialog('moveToTop');
+ }else{
+ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(){
+ $('#chooseaddressbook_dialog').dialog({
+ width : 600,
+ close : function(event, ui) {
+ $(this).dialog('destroy').remove();
+ }
+ });
+ });
+ }
+ },
+ activation:function(checkbox, bookid)
+ {
+ $.post(OC.filePath('contacts', 'ajax', 'activation.php'), { bookid: bookid, active: checkbox.checked?1:0 },
+ function(data) {
+ /*
+ * Arguments:
+ * data.status
+ * data.bookid
+ * data.active
+ */
+ if (data.status == 'success'){
+ checkbox.checked = data.active == 1;
+ Contacts.UI.Contacts.update();
+ }
+ });
+ },
+ newAddressbook:function(object){
+ var tr = $(document.createElement('tr'))
+ .load(OC.filePath('contacts', 'ajax', 'addbook.php'));
+ $(object).closest('tr').after(tr).hide();
+ /* TODO: Shouldn't there be some kinda error checking here? */
+ },
+ editAddressbook:function(object, bookid){
+ var tr = $(document.createElement('tr'))
+ .load(OC.filePath('contacts', 'ajax', 'editaddressbook.php') + "?bookid="+bookid);
+ $(object).closest('tr').after(tr).hide();
+ },
+ deleteAddressbook:function(bookid){
+ var check = confirm("Do you really want to delete this address book?");
+ if(check == false){
+ return false;
+ }else{
+ $.post(OC.filePath('contacts', 'ajax', 'deletebook.php'), { id: bookid},
+ function(data) {
+ if (data.status == 'success'){
+ $('#chooseaddressbook_dialog').dialog('destroy').remove();
+ Contacts.UI.Contacts.update();
+ Contacts.UI.Addressbooks.overview();
+ } else {
+ alert('Error: ' + data.message);
+ }
+ });
+ }
+ },
+ submit:function(button, bookid){
+ var displayname = $("#displayname_"+bookid).val();
+ var active = $("#edit_active_"+bookid+":checked").length;
+ var description = $("#description_"+bookid).val();
+
+ var url;
+ if (bookid == 'new'){
+ url = OC.filePath('contacts', 'ajax', 'createaddressbook.php');
+ }else{
+ url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php');
+ }
+ $.post(url, { id: bookid, name: displayname, active: active, description: description },
+ function(data){
+ if(data.status == 'success'){
+ $(button).closest('tr').prev().html(data.page).show().next().remove();
+ }
+ });
+ Contacts.UI.Contacts.update();
+ },
+ cancel:function(button, bookid){
+ $(button).closest('tr').prev().show().next().remove();
+ }
+ },
+ Contacts:{
+ update:function(){
+ $.getJSON('ajax/contacts.php',{},function(jsondata){
+ if(jsondata.status == 'success'){
+ $('#contacts').html(jsondata.data.page);
+ }
+ else{
+ alert(jsondata.data.message);
+ }
+ });
+ /*
+ var contactlist = $('#contacts');
+ var contacts = contactlist.children('li').get();
+ //alert(contacts);
+ contacts.sort(function(a, b) {
+ var compA = $(a).text().toUpperCase();
+ var compB = $(b).text().toUpperCase();
+ return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
+ })
+ $.each(contacts, function(idx, itm) { contactlist.append(itm); });
+ */
+ setTimeout(Contacts.UI.Contacts.lazyupdate(), 500);
+ },
+ lazyupdate:function(){
+ //alert('lazyupdate');
+ $('#contacts li').live('inview', function(){
+ if (!$(this).attr('style')) {
+ //alert($(this).data('id') + ' has background: ' + $(this).attr('style'));
+ $(this).css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat');
+ }/* else {
+ alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url'));
+ }*/
+ });
+ }
+ }
+ }
+}
+
$(document).ready(function(){
/*-------------------------------------------------------------------------
* Event handlers
@@ -79,6 +206,11 @@ $(document).ready(function(){
return false;
});
+ $('#chooseaddressbook').click(function(){
+ Contacts.UI.Addressbooks.overview();
+ return false;
+ });
+
$('#contacts_newcontact').click(function(){
$.getJSON('ajax/showaddcard.php',{},function(jsondata){
if(jsondata.status == 'success'){
@@ -110,7 +242,7 @@ $(document).ready(function(){
$('.contacts_property [data-use="edit"]').live('click',function(){
var id = $('#rightcontent').data('id');
- var checksum = $(this).parents('li').first().data('checksum');
+ var checksum = $(this).parents('.contacts_property').first().data('checksum');
$.getJSON('ajax/showsetproperty.php',{'id': id, 'checksum': checksum },function(jsondata){
if(jsondata.status == 'success'){
$('.contacts_property[data-checksum="'+checksum+'"]').html(jsondata.data.page)
@@ -159,4 +291,25 @@ $(document).ready(function(){
});
$('#contacts_addcardform select').chosen();
+
+ $('#contacts li').bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
+ if (isInView) { //NOTE: I've kept all conditions for future reference ;-)
+ // element is now visible in the viewport
+ if (visiblePartY == 'top') {
+ // top part of element is visible
+ } else if (visiblePartY == 'bottom') {
+ // bottom part of element is visible
+ } else {
+ // whole part of element is visible
+ if (!$(this).attr('style')) {
+ //alert($(this).data('id') + ' has background: ' + $(this).attr('style'));
+ $(this).css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat');
+ }/* else {
+ alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url'));
+ }*/
+ }
+ } else {
+ // element has gone out of viewport
+ }
+ });
});
diff --git a/apps/contacts/js/jquery.inview.js b/apps/contacts/js/jquery.inview.js
new file mode 100644
index 00000000000..a38ab164977
--- /dev/null
+++ b/apps/contacts/js/jquery.inview.js
@@ -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); \ No newline at end of file