function ucwords (str) { return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) { return $1.toUpperCase(); }); } String.prototype.strip_tags = function(){ tags = this; stripped = tags.replace(/[\<\>]/gi, ""); return stripped; }; Contacts={ UI:{ notImplemented:function() { OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented')); }, searchOSM:function(obj) { var adr = Contacts.UI.propertyContainerFor(obj).find('.adr').val(); console.log('adr 1: ' + adr); if(adr == undefined) { OC.dialogs.alert(t('contacts', 'Couldn\'t get a valid address.'), t('contacts', 'Error')); return; } // FIXME: I suck at regexp. /Tanghus var adrarr = adr.split(';'); var adrstr = ''; if(adrarr[2].trim() != '') { adrstr = adrstr + adrarr[2].trim() + ','; } if(adrarr[3].trim() != '') { adrstr = adrstr + adrarr[3].trim() + ','; } if(adrarr[4].trim() != '') { adrstr = adrstr + adrarr[4].trim() + ','; } if(adrarr[5].trim() != '') { adrstr = adrstr + adrarr[5].trim() + ','; } if(adrarr[6].trim() != '') { adrstr = adrstr + adrarr[6].trim(); } console.log('adrstr: "' + adrstr + '"'); adrstr = encodeURIComponent(adrstr); console.log('adrstr 2: ' + adrstr); var uri = 'http://open.mapquestapi.com/nominatim/v1/search.php?q=' + adrstr + '&limit=10&addressdetails=1&zoom='; console.log('uri: ' + uri); var newWindow = window.open(uri,'_blank'); newWindow.focus(); }, mailTo:function(obj) { var adr = Contacts.UI.propertyContainerFor($(obj)).find('input[type="email"]').val().trim(); if(adr == '') { OC.dialogs.alert(t('contacts', 'Please enter an email address.'), t('contacts', 'Error')); return; } window.location.href='mailto:' + adr; }, propertyContainerFor:function(obj) { return $(obj).parents('.propertycontainer').first(); }, checksumFor:function(obj) { return $(obj).parents('.propertycontainer').first().data('checksum'); }, propertyTypeFor:function(obj) { return $(obj).parents('.propertycontainer').first().data('element'); }, /*showHideContactInfo:function() { var show = ($('#emaillist li.propertycontainer').length > 0 || $('#phonelist li.propertycontainer').length > 0 || $('#addressdisplay dl.propertycontainer').length > 0); console.log('showHideContactInfo: ' + show); if(show) { $('#contact_communication').show(); } else { $('#contact_communication').hide(); } },*/ /*checkListFor:function(obj) { var type = $(obj).parents('.propertycontainer').first().data('element'); console.log('checkListFor: ' + type); switch (type) { case 'EMAIL': console.log('emails: '+$('#emaillist>li').length); if($('#emaillist li.propertycontainer').length == 0) { $('#emails').hide(); } break; case 'TEL': console.log('phones: '+$('#phonelist>li').length); if($('#phonelist li.propertycontainer').length == 0) { $('#phones').hide(); } break; case 'ADR': console.log('addresses: '+$('#addressdisplay>dl').length); if($('#addressdisplay dl.propertycontainer').length == 0) { $('#addresses').hide(); } break; case 'NICKNAME': case 'ORG': case 'BDAY': break; } },*/ loading:function(obj, state) { if(state) { $(obj).addClass('loading'); } else { $(obj).removeClass('loading'); } }, showCardDAVUrl:function(username, bookname){ $('#carddav_url').val(totalurl + '/' + username + '/' + bookname); $('#carddav_url').show(); $('#carddav_url_close').show(); }, loadListHandlers:function() { //$('.add,.delete').hide(); $('.globe,.mail,.delete,.edit,.tip').tipsy(); /*$('.addresscard,.propertylist li,.propertycontainer').hover( function () { $(this).find('.globe,.mail,.delete,.edit').fadeIn(100); }, function () { $(this).find('.globe,.mail,.delete,.edit').fadeOut(100); } );*/ $('.addresscard,.propertylist li,.propertycontainer').hover( function () { $(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 1.0 }, 200, function() {}); }, function () { $(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 0.1 }, 200, function() {}); } ); }, loadHandlers:function() { //console.log('loadHandlers'); /* $('.formfloat').hover( function () { $(this).find('.add').fadeIn(500); }, function () { $(this).find('.add').fadeOut(500); } );*/ //$('#fn').jec(); $('#fn_select').combobox({ 'id': 'fn', 'name': 'value', 'classes': ['contacts_property', 'huge', 'tip', 'float'], 'attributes': {'placeholder': t('contacts', 'Enter name')}, 'title': t('contacts', 'Format custom, Short name, Full name, Reverse or Reverse with comma')}); //$('.jecEditableOption').attr('title', t('contacts','Custom')); $('#bday').datepicker({ dateFormat : 'dd-mm-yy' }); /*$('#categories_value').find('select').multiselect({ noneSelectedText: t('contacts', 'Select categories'), header: false, selectedList: 6, classes: 'categories' });*/ // Style phone types $('#phonelist').find('select.contacts_property').multiselect({ noneSelectedText: t('contacts', 'Select type'), header: false, selectedList: 4, classes: 'typelist' }); $('#add_email').click(function(){ Contacts.UI.Card.addMail(); }); $('#add_phone').click(function(){ Contacts.UI.Card.addPhone(); }); // $('#add_address').click(function(){ // Contacts.UI.Card.editAddress(); // return false; // }); $('#edit_name').click(function(){ Contacts.UI.Card.editName(); return false; }); /* Initialize the photo edit dialog */ $('#edit_photo_dialog').dialog({ autoOpen: false, modal: true, height: 'auto', width: 'auto' }); $('#edit_photo_dialog' ).dialog( 'option', 'buttons', [ { text: "Ok", click: function() { Contacts.UI.Card.savePhoto(this); $(this).dialog('close'); } }, { text: "Cancel", click: function() { $(this).dialog('close'); } } ] ); $('#categories').multiple_autocomplete({source: categories}); $('.button,.action,.tip').tipsy(); $('#contacts_deletecard').tipsy({gravity: 'ne'}); $('#contacts_downloadcard').tipsy({gravity: 'ne'}); Contacts.UI.loadListHandlers(); }, Card:{ id:'', fn:'', fullname:'', shortname:'', famname:'', givname:'', addname:'', honpre:'', honsuf:'', data:undefined, update:function(id) { // Make sure proper DOM is loaded. var newid; console.log('Card.update(), id: ' + id); console.log('Card.update(), #contacts: ' + $('#contacts li').length); if(id == undefined) { newid = $('#contacts li:first-child').data('id'); } else { newid = id; } if($('#contacts li').length > 0) { $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{},function(jsondata){ if(jsondata.status == 'success'){ $('#rightcontent').html(jsondata.data.page); Contacts.UI.loadHandlers(); if($('#contacts li').length > 0) { //var newid = $('#contacts li:first-child').data('id'); //$('#contacts li:first-child').addClass('active'); $('#leftcontent li[data-id="'+newid+'"]').addClass('active'); console.log('trying to load: ' + newid); $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':newid},function(jsondata){ if(jsondata.status == 'success'){ Contacts.UI.Card.loadContact(jsondata.data); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } if($('#contacts li').length == 0) { // load intro page $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ if(jsondata.status == 'success'){ id = ''; $('#rightcontent').data('id',''); $('#rightcontent').html(jsondata.data.page); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } }, doExport:function() { document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id; //$.get(OC.linkTo('contacts', 'export.php'),{'contactid':this.id},function(jsondata){ //}); }, doImport:function(){ Contacts.UI.notImplemented(); }, add:function(n, fn, aid, isnew){ // add a new contact console.log('Add contact: ' + n + ', ' + fn + ' ' + aid); var card = $('#card')[0]; if(!card) { console.log('Loading proper card DOM'); $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{},function(jsondata){ if(jsondata.status == 'success'){ $('#rightcontent').html(jsondata.data.page); Contacts.UI.loadHandlers(); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } $.post(OC.filePath('contacts', 'ajax', 'addcontact.php'), { n: n, fn: fn, aid: aid }, function(jsondata) { if (jsondata.status == 'success'){ $('#rightcontent').data('id',jsondata.data.id); var id = jsondata.data.id; $.getJSON('ajax/contactdetails.php',{'id':id},function(jsondata){ if(jsondata.status == 'success'){ Contacts.UI.loadHandlers(); Contacts.UI.Card.loadContact(jsondata.data); $('#leftcontent .active').removeClass('active'); var item = '
  • '+Contacts.UI.Card.fn+'
  • '; var added = false; $('#leftcontent ul li').each(function(){ if ($(this).text().toLowerCase() > Contacts.UI.Card.fn.toLowerCase()) { $(this).before(item).fadeIn('fast'); added = true; return false; } }); if(!added) { $('#leftcontent ul').append(item); } if(isnew) { Contacts.UI.Card.addProperty('EMAIL'); Contacts.UI.Card.addProperty('TEL'); Contacts.UI.Card.addProperty('NICKNAME'); Contacts.UI.Card.addProperty('ORG'); Contacts.UI.Card.addProperty('CATEGORIES'); $('#fn').focus(); $('#fn').select(); } } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert(jsondata.data.message); } }); $('#contact_identity').show(); $('#actionbar').show(); // TODO: Add to contacts list. } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert(jsondata.data.message); } }); }, doDelete:function() { $('#contacts_deletecard').tipsy('hide'); OC.dialogs.confirm(t('contacts', 'Are you sure you want to delete this contact?'), t('contacts', 'Warning'), function(answer) { if(answer == true) { $.getJSON('ajax/deletecard.php',{'id':Contacts.UI.Card.id},function(jsondata){ if(jsondata.status == 'success'){ var newid = ''; var curlistitem = $('#leftcontent [data-id="'+jsondata.data.id+'"]'); var newlistitem = curlistitem.prev(); console.log('Previous: ' + newlistitem); if(newlistitem == undefined) { newlistitem = curlistitem.next(); } curlistitem.remove(); if(newlistitem != undefined) { newid = newlistitem.data('id'); } $('#rightcontent').data('id',newid); //$('#rightcontent').empty(); this.id = this.fn = this.fullname = this.shortname = this.famname = this.givname = this.addname = this.honpre = this.honsuf = ''; this.data = undefined; // Load first in list. if($('#contacts li').length > 0) { Contacts.UI.Card.update(newid); } else { // load intro page $.getJSON('ajax/loadintro.php',{},function(jsondata){ if(jsondata.status == 'success'){ id = ''; $('#rightcontent').data('id',''); $('#rightcontent').html(jsondata.data.page); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert(jsondata.data.message); } }); } }); return false; }, loadContact:function(jsondata){ //$('#contact_communication').hide(); this.data = jsondata; this.id = this.data.id; $('#rightcontent').data('id',this.id); console.log('loaded: ' + this.data.FN[0]['value']); this.populateNameFields(); //this.loadCategories(); this.loadPhoto(); this.loadMails(); this.loadPhones(); this.loadAddresses(); this.loadSingleProperties(); if(this.data.NOTE) { $('#note').data('checksum', this.data.NOTE[0]['checksum']); $('#note').find('textarea').val(this.data.NOTE[0]['value']); $('#note').show(); $('#contacts_propertymenu a[data-type="NOTE"]').parent().hide(); } else { $('#note').data('checksum', ''); $('#note').find('textarea').val(''); $('#note').hide(); } }, loadSingleProperties:function() { var props = ['BDAY', 'NICKNAME', 'ORG', 'CATEGORIES']; // Clear all elements $('#ident .propertycontainer').each(function(){ if(props.indexOf($(this).data('element')) > -1) { $(this).data('checksum', ''); $(this).find('input').val(''); $(this).hide(); $(this).prev().hide(); } }); for(var prop in props) { if(this.data[props[prop]] != undefined) { $('#contacts_propertymenu a[data-type="'+props[prop]+'"]').parent().hide(); var property = this.data[props[prop]][0]; var value = property['value'], checksum = property['checksum']; switch(props[prop]) { case 'BDAY': var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10)); value = $.datepicker.formatDate('dd-mm-yy', val); $('#contact_identity').find('#bday').val(value); $('#contact_identity').find('#bday_value').data('checksum', checksum); $('#contact_identity').find('#bday_label').show(); $('#contact_identity').find('#bday_value').show(); break; case 'NICKNAME': $('#contact_identity').find('#nickname').val(value); $('#contact_identity').find('#nickname_value').data('checksum', checksum); $('#contact_identity').find('#nickname_label').show(); $('#contact_identity').find('#nickname_value').show(); break; case 'ORG': $('#contact_identity').find('#org').val(value); $('#contact_identity').find('#org_value').data('checksum', checksum); $('#contact_identity').find('#org_label').show(); $('#contact_identity').find('#org_value').show(); break; case 'CATEGORIES': $('#contact_identity').find('#categories').val(value); $('#contact_identity').find('#categories_value').data('checksum', checksum); $('#contact_identity').find('#categories_label').show(); $('#contact_identity').find('#categories_value').show(); break; } } else { $('#contacts_propertymenu a[data-type="'+props[prop]+'"]').parent().show(); } } }, populateNameFields:function() { this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; var full = ''; var narray = undefined; this.fn = this.data.FN[0]['value']; if(this.data.N == undefined) { narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P full = this.fn; } else { narray = this.data.N[0]['value']; } this.famname = narray[0] || ''; this.givname = narray[1] || ''; this.addname = narray[2] || ''; this.honpre = narray[3] || ''; this.honsuf = narray[4] || ''; if(this.honpre.length > 0) { this.fullname += this.honpre + ' '; } if(this.givname.length > 0) { this.fullname += ' ' + this.givname; } if(this.addname.length > 0) { this.fullname += ' ' + this.addname; } if(this.famname.length > 0) { this.fullname += ' ' + this.famname; } if(this.honsuf.length > 0) { this.fullname += ', ' + this.honsuf; } $('#n').html(this.fullname); $('#fn_select option').remove(); $('#fn_select').combobox('value', this.fn); var names = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; if(this.data.ORG) { names[names.length]=this.data.ORG[0].value; } $.each(names, function(key, value) { $('#fn_select') .append($('') .text(value)); }); $('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']); $('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']); $('#contact_identity').show(); }, hasCategory:function(category) { if(this.data.CATEGORIES) { var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/); for(var c in categories) { var cat = this.data.CATEGORIES[0]['value'][c]; console.log('hasCategory: ' + cat + ' === ' + category + '?'); if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) { console.log('Yes'); return true; } } } return false; }, categoriesChanged:function(newcategories) { // Categories added/deleted. categories = $.map(newcategories, function(v) {return v;}); console.log('categoriesChanged for ' + Contacts.UI.Card.id + ' : ' + categories); $('#categories').multiple_autocomplete('option', 'source', categories); var categorylist = $('#categories_value').find('input'); $.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':Contacts.UI.Card.id},function(jsondata){ if(jsondata.status == 'success'){ console.log('Setting checksum: ' + jsondata.data.checksum + ', value: ' + jsondata.data.value); $('#categories_value').data('checksum', jsondata.data.checksum); categorylist.val(jsondata.data.value); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); }, /*loadCategories:function(){ // On loading contact. var categories = $('#categories_value').find('select'); if(this.data.CATEGORIES) { $('#categories_value').data('checksum', this.data.CATEGORIES[0]['checksum']); } else { $('#categories_value').data('checksum', ''); } categories.find('option').each(function(){ if(Contacts.UI.Card.hasCategory($(this).val())) { $(this).attr('selected', 'selected'); } else { $(this).removeAttr('selected'); } }); categories.multiselect('refresh'); },*/ editNew:function(){ // add a new contact this.id = ''; this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; Contacts.UI.Card.add(t('contacts', 'Contact')+';'+t('contacts', 'New')+';;;', t('contacts', 'New Contact'), '', true); /*$.getJSON(OC.filePath('contacts', 'ajax', 'newcontact.php'),{},function(jsondata){ if(jsondata.status == 'success'){ id = ''; $('#rightcontent').data('id',''); $('#rightcontent').html(jsondata.data.page); //Contacts.UI.Card.editName(); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert(jsondata.data.message); } });*/ }, savePropertyInternal:function(name, fields, oldchecksum, checksum){ // TODO: Add functionality for new fields. console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum); console.log('savePropertyInternal: ' + this.data[name]); var multivalue = ['CATEGORIES']; var params = {}; var value = multivalue.indexOf(name) != -1 ? new Array() : undefined; jQuery.each(fields, function(i, field){ //.substring(11,'parameters[TYPE][]'.indexOf(']')) if(field.name.substring(0, 5) === 'value') { if(multivalue.indexOf(name) != -1) { value.push(field.value); } else { value = field.value; } } else if(field.name.substring(0, 10) === 'parameters') { var p = field.name.substring(11,'parameters[TYPE][]'.indexOf(']')); if(!(p in params)) { params[p] = []; } params[p].push(field.value); } }); for(var i in this.data[name]) { if(this.data[name][i]['checksum'] == oldchecksum) { this.data[name][i]['checksum'] = checksum; this.data[name][i]['value'] = value; this.data[name][i]['parameters'] = params; } } }, saveProperty:function(obj){ // I couldn't get the selector to filter on 'contacts_property' so I filter by hand here :-/ if(!$(obj).hasClass('contacts_property')) { console.log('Filtering out object.' + obj); return false; } if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') { OC.dialogs.alert(t('contacts', 'This property has to be non-empty.'), t('contacts', 'Error')); return false; } container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata. Contacts.UI.loading(container, true); var checksum = container.data('checksum'); var name = container.data('element'); console.log('saveProperty: ' + name); var fields = container.find('input.contacts_property,select.contacts_property').serializeArray(); var q = container.find('input.contacts_property,select.contacts_property,textarea.contacts_property').serialize(); if(q == '' || q == undefined) { console.log('Couldn\'t serialize elements.'); Contacts.UI.loading(container, false); return false; } q = q + '&id=' + this.id + '&name=' + name; if(checksum != undefined && checksum != '') { // save q = q + '&checksum=' + checksum; console.log('Saving: ' + q); $(obj).attr('disabled', 'disabled'); $.post('ajax/saveproperty.php',q,function(jsondata){ if(jsondata.status == 'success'){ container.data('checksum', jsondata.data.checksum); Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); Contacts.UI.loading(container, false); $(obj).removeAttr('disabled'); return true; } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); Contacts.UI.loading(container, false); $(obj).removeAttr('disabled'); return false; } },'json'); } else { // add console.log('Adding: ' + q); $(obj).attr('disabled', 'disabled'); $.post('ajax/addproperty.php',q,function(jsondata){ if(jsondata.status == 'success'){ container.data('checksum', jsondata.data.checksum); // TODO: savePropertyInternal doesn't know about new fields //Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); Contacts.UI.loading(container, false); $(obj).removeAttr('disabled'); return true; } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); Contacts.UI.loading(container, false); $(obj).removeAttr('disabled'); return false; } },'json'); } }, addProperty:function(type){ //var type = $(obj).data('type'); console.log('addProperty:' + type); switch (type) { case 'PHOTO': this.loadPhoto(true); $('#file_upload_form').show(); $('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide(); $('#file_upload_start').trigger('click'); break; case 'NOTE': $('#note').show(); $('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide(); $('#note').find('textarea').focus(); break; case 'EMAIL': if($('#emaillist>li').length == 1) { $('#emails').show(); } Contacts.UI.Card.addMail(); //Contacts.UI.showHideContactInfo(); break; case 'TEL': if($('#phonelist>li').length == 1) { $('#phones').show(); } Contacts.UI.Card.addPhone(); //Contacts.UI.showHideContactInfo(); break; case 'ADR': if($('#addressdisplay>dl').length == 1) { $('#addresses').show(); } Contacts.UI.Card.editAddress('new', true); //Contacts.UI.showHideContactInfo(); break; case 'NICKNAME': case 'ORG': case 'BDAY': case 'CATEGORIES': $('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show(); $('dd[data-element="'+type+'"]').find('input').focus(); $('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide(); break; } }, deleteProperty:function(obj, type){ console.log('deleteProperty, obj: ' + obj.attr('id') + ', container: ' + Contacts.UI.propertyContainerFor(obj).html()); Contacts.UI.loading(obj, true); var checksum = Contacts.UI.checksumFor(obj); console.log('deleteProperty, id: ' + this.id + ', checksum: ' + checksum); if(checksum) { $.getJSON('ajax/deleteproperty.php',{'id': this.id, 'checksum': checksum },function(jsondata){ if(jsondata.status == 'success'){ if(type == 'list') { Contacts.UI.propertyContainerFor(obj).remove(); //Contacts.UI.showHideContactInfo(); //Contacts.UI.checkListFor(obj); } else if(type == 'single') { var proptype = Contacts.UI.propertyTypeFor(obj); console.log('deleteProperty, hiding: ' + proptype); var othertypes = ['NOTE', 'PHOTO']; if(othertypes.indexOf(proptype) != -1) { console.log('NOTE or PHOTO'); Contacts.UI.propertyContainerFor(obj).data('checksum', ''); if(proptype == 'PHOTO') { console.log('Delete PHOTO'); Contacts.UI.Contacts.refreshThumbnail(Contacts.UI.Card.id); Contacts.UI.Card.loadPhoto(); } else if(proptype == 'NOTE') { $('#note').find('textarea').val(''); Contacts.UI.propertyContainerFor(obj).hide(); } } else { $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); $('dl dd[data-element="'+proptype+'"]').data('checksum', ''); $('dl dd[data-element="'+proptype+'"]').find('input').val(''); } $('#contacts_propertymenu a[data-type="'+proptype+'"]').parent().show(); Contacts.UI.loading(obj, false); } else { OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); Contacts.UI.loading(obj, false); } } else{ Contacts.UI.loading(obj, false); OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } else { // Property hasn't been saved so there's nothing to delete. if(type == 'list') { Contacts.UI.propertyContainerFor(obj).remove(); //Contacts.UI.showHideContactInfo(); //Contacts.UI.checkListFor(obj); } else if(type == 'single') { var proptype = Contacts.UI.propertyTypeFor(obj); console.log('deleteProperty, hiding: ' + proptype); $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); $('#contacts_propertymenu a[data-type="'+proptype+'"]').parent().show(); Contacts.UI.loading(obj, false); } else { OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); } } }, editName:function(){ var isnew = (this.id == ''); /* Initialize the name edit dialog */ if($('#edit_name_dialog').dialog('isOpen') == true){ $('#edit_name_dialog').dialog('moveToTop'); }else{ // TODO: If id=='' call addcontact.php (or whatever name) instead and reload view with id. $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editname.php')+'?id='+this.id, function(jsondata){ if(jsondata.status != 'error'){ $('#edit_name_dialog' ).dialog({ modal: (isnew && true || false), closeOnEscape: (isnew == '' && false || true), title: (isnew && t('contacts', 'Add contact') || t('contacts', 'Edit name')), height: 'auto', width: 'auto', buttons: { 'Ok':function() { Contacts.UI.Card.saveName(this); $(this).dialog('destroy').remove(); }, 'Cancel':function() { $(this).dialog('destroy').remove(); } }, close : function(event, ui) { $(this).dialog('destroy').remove(); //return event; }/*, open : function(event, ui) { // load 'N' property - maybe :-P }*/ }); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } }, saveName:function(dlg){ console.log('saveName, id: ' + this.id); var n = new Array($(dlg).find('#fam').val().strip_tags(),$(dlg).find('#giv').val().strip_tags(),$(dlg).find('#add').val().strip_tags(),$(dlg).find('#pre').val().strip_tags(),$(dlg).find('#suf').val().strip_tags()); this.famname = n[0]; this.givname = n[1]; this.addname = n[2]; this.honpre = n[3]; this.honsuf = n[4]; this.fullname = ''; $('#n').val(n.join(';')); if(n[3].length > 0) { this.fullname = n[3] + ' '; } this.fullname += n[1] + ' ' + n[2] + ' ' + n[0]; if(n[4].length > 0) { this.fullname += ', ' + n[4]; } $('#fn_select option').remove(); //$('#fn_select').combobox('value', this.fn); var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; var names = new Array(); for(var name in tmp) { console.log('idx: ' + names.indexOf(tmp[name])); if(names.indexOf(tmp[name]) == -1) { names.push(tmp[name]); } } $.each(names, function(key, value) { $('#fn_select') .append($('') .text(value)); }); if(this.id == '') { var aid = $(dlg).find('#aid').val(); Contacts.UI.Card.add(n.join(';'), $('#short').text(), aid); } else { Contacts.UI.Card.saveProperty($('#n')); } }, loadAddresses:function(){ $('#addresses').hide(); $('#addressdisplay dl.propertycontainer').remove(); for(var adr in this.data.ADR) { $('#addressdisplay dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); $('#addressdisplay dl').last().removeClass('template').addClass('propertycontainer'); $('#addressdisplay dl').last().data('checksum', this.data.ADR[adr]['checksum']); var adrarray = this.data.ADR[adr]['value']; var adrtxt = ''; if(adrarray[0].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[0].strip_tags() + '
  • '; } if(adrarray[1].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[1].strip_tags() + '
  • '; } if(adrarray[2].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[2].strip_tags() + '
  • '; } if(adrarray[3].length > 0 || adrarray[5].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '
  • '; } if(adrarray[4].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[4].strip_tags() + '
  • '; } if(adrarray[6].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[6].strip_tags() + '
  • '; } $('#addressdisplay dl').last().find('.addresslist').html(adrtxt); var types = new Array(); var ttypes = new Array(); for(var param in this.data.ADR[adr]['parameters']) { if(param.toUpperCase() == 'TYPE') { types.push(t('contacts', ucwords(this.data.ADR[adr]['parameters'][param].toLowerCase()))); ttypes.push(this.data.ADR[adr]['parameters'][param]); } } $('#addressdisplay dl').last().find('.adr_type_label').text(types.join('/')); $('#addressdisplay dl').last().find('.adr_type').val(ttypes.join(',')); $('#addressdisplay dl').last().find('.adr').val(adrarray.join(';')); $('#addressdisplay dl').last().data('checksum', this.data.ADR[adr]['checksum']); } if($('#addressdisplay dl').length > 1) { $('#addresses').show(); $('#contact_communication').show(); } Contacts.UI.loadListHandlers(); return false; }, editAddress:function(obj, isnew){ console.log('editAddress'); var container = undefined; var q = q = '?id=' + this.id; if(obj === 'new') { isnew = true; $('#addressdisplay dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); container = $('#addressdisplay dl').last(); container.removeClass('template').addClass('propertycontainer'); Contacts.UI.loadListHandlers(); } else { q = q + '&checksum='+Contacts.UI.checksumFor(obj); } /* Initialize the address edit dialog */ if($('#edit_address_dialog').dialog('isOpen') == true){ $('#edit_address_dialog').dialog('moveToTop'); }else{ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editaddress.php')+q, function(jsondata){ if(jsondata.status != 'error'){ $('#edit_address_dialog' ).dialog({ /*modal: true,*/ height: 'auto', width: 'auto', buttons: { 'Ok':function() { if(isnew) { Contacts.UI.Card.saveAddress(this, $('#addressdisplay dl:last-child').find('input').first(), isnew); } else { Contacts.UI.Card.saveAddress(this, obj, isnew); } $(this).dialog('destroy').remove(); }, 'Cancel':function() { $(this).dialog('destroy').remove(); if(isnew) { container.remove(); } //Contacts.UI.showHideContactInfo(); } }, close : function(event, ui) { //alert('close'); $(this).dialog('destroy').remove(); if(isnew) { container.remove(); } //Contacts.UI.showHideContactInfo(); }, open : function(event, ui) { $( "#adr_city" ).autocomplete({ source: function( request, response ) { $.ajax({ url: "http://ws.geonames.org/searchJSON", dataType: "jsonp", data: { featureClass: "P", style: "full", maxRows: 12, lang: lang, name_startsWith: request.term }, success: function( data ) { response( $.map( data.geonames, function( item ) { /*for(var key in item) { console.log(key + ': ' + item[key]); }*/ return { label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, value: item.name, country: item.countryName } })); } }); }, minLength: 2, select: function( event, ui ) { if(ui.item && $('#adr_country').val().trim().length == 0) { $('#adr_country').val(ui.item.country); } /*log( ui.item ? "Selected: " + ui.item.label : "Nothing selected, input was " + this.value);*/ }, open: function() { $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); }, close: function() { $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); } }); $( "#adr_country" ).autocomplete({ source: function( request, response ) { $.ajax({ url: "http://ws.geonames.org/searchJSON", dataType: "jsonp", data: { /*featureClass: "A",*/ featureCode: "PCLI", /*countryBias: "true",*/ /*style: "full",*/ lang: lang, maxRows: 12, name_startsWith: request.term }, success: function( data ) { response( $.map( data.geonames, function( item ) { for(var key in item) { console.log(key + ': ' + item[key]); } return { label: item.name, value: item.name } })); } }); }, minLength: 2, select: function( event, ui ) { /*if(ui.item) { $('#adr_country').val(ui.item.country); } log( ui.item ? "Selected: " + ui.item.label : "Nothing selected, input was " + this.value);*/ }, open: function() { $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); }, close: function() { $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); } }); } }); } else { alert(jsondata.data.message); } }); } }, saveAddress:function(dlg, obj, isnew){ if(isnew) { container = $('#addressdisplay dl').last(); obj = $('#addressdisplay dl:last-child').find('input').first(); } else { checksum = Contacts.UI.checksumFor(obj); container = Contacts.UI.propertyContainerFor(obj); } var adr = new Array($(dlg).find('#adr_pobox').val().strip_tags(),$(dlg).find('#adr_extended').val().strip_tags(),$(dlg).find('#adr_street').val().strip_tags(),$(dlg).find('#adr_city').val().strip_tags(),$(dlg).find('#adr_region').val().strip_tags(),$(dlg).find('#adr_zipcode').val().strip_tags(),$(dlg).find('#adr_country').val().strip_tags()); $(container).find('.adr').val(adr.join(';')); $(container).find('.adr_type').val($(dlg).find('#adr_type').val()); $(container).find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase()))); Contacts.UI.Card.saveProperty($(container).find('input').first()); var adrtxt = ''; if(adr[0].length > 0) { adrtxt = adrtxt + '
  • ' + adr[0] + '
  • '; } if(adr[1].length > 0) { adrtxt = adrtxt + '
  • ' + adr[1] + '
  • '; } if(adr[2].length > 0) { adrtxt = adrtxt + '
  • ' + adr[2] + '
  • '; } if(adr[3].length > 0 || adr[5].length > 0) { adrtxt = adrtxt + '
  • ' + adr[5] + ' ' + adr[3] + '
  • '; } if(adr[4].length > 0) { adrtxt = adrtxt + '
  • ' + adr[4] + '
  • '; } if(adr[6].length > 0) { adrtxt = adrtxt + '
  • ' + adr[6] + '
  • '; } $(container).find('.addresslist').html(adrtxt); }, uploadPhoto:function(filelist) { if(!filelist) { OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error')); return; } //var file = filelist.item(0); var file = filelist[0]; var target = $('#file_upload_target'); var form = $('#file_upload_form'); var totalSize=0; if(file.size > $('#max_upload').val()){ OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts', 'Error')); return; } else { target.load(function(){ var response=jQuery.parseJSON(target.contents().text()); if(response != undefined && response.status == 'success'){ Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp); //alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime); }else{ OC.dialogs.alert(response.data.message, t('contacts', 'Error')); } }); form.submit(); } }, loadPhotoHandlers:function(){ $('#phototools li a').tipsy(); $('#contacts_details_photo_wrapper').hover( function () { $('#phototools').slideDown(200); }, function () { $('#phototools').slideUp(200); } ); $('#phototools').hover( function () { $(this).removeClass('transparent'); }, function () { $(this).addClass('transparent'); } ); if(this.data.PHOTO) { $('#phototools .delete').click(function() { $(this).tipsy('hide'); Contacts.UI.Card.deleteProperty($('#contacts_details_photo'), 'single'); $(this).hide(); }); $('#phototools .edit').click(function() { $(this).tipsy('hide'); Contacts.UI.Card.editCurrentPhoto(); }); } else { $('#phototools .delete').hide(); $('#phototools .edit').hide(); } $('#phototools .upload').click(function() { $('#file_upload_start').trigger('click'); }); $('#phototools .cloud').click(function() { OC.dialogs.filepicker(t('contacts', 'Select photo'), Contacts.UI.Card.cloudPhotoSelected, false, 'image', true); }); }, cloudPhotoSelected:function(path){ console.log('cloudPhotoSelected: ' + path); $.getJSON('ajax/oc_photo.php',{'path':path,'id':Contacts.UI.Card.id},function(jsondata){ if(jsondata.status == 'success'){ //alert(jsondata.data.page); Contacts.UI.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) $('#edit_photo_dialog_img').html(jsondata.data.page); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); }, loadPhoto:function(force){ //if(this.data.PHOTO||force==true) { $.getJSON('ajax/loadphoto.php',{'id':this.id},function(jsondata){ if(jsondata.status == 'success'){ //alert(jsondata.data.page); $('#contacts_details_photo_wrapper').data('checksum', jsondata.data.checksum); $('#contacts_details_photo_wrapper').html(jsondata.data.page); Contacts.UI.Card.loadPhotoHandlers(); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); $('#file_upload_form').show(); $('#contacts_propertymenu a[data-type="PHOTO"]').parent().hide(); /*} else { $('#contacts_details_photo_wrapper').empty(); $('#file_upload_form').hide(); $('#contacts_propertymenu a[data-type="PHOTO"]').parent().show(); }*/ }, editCurrentPhoto:function(){ $.getJSON('ajax/currentphoto.php',{'id':this.id},function(jsondata){ if(jsondata.status == 'success'){ //alert(jsondata.data.page); Contacts.UI.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) $('#edit_photo_dialog_img').html(jsondata.data.page); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); }, editPhoto:function(id, tmp_path){ //alert('editPhoto: ' + tmp_path); $.getJSON('ajax/cropphoto.php',{'tmp_path':tmp_path,'id':this.id},function(jsondata){ if(jsondata.status == 'success'){ //alert(jsondata.data.page); $('#edit_photo_dialog_img').html(jsondata.data.page); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); if($('#edit_photo_dialog').dialog('isOpen') == true){ $('#edit_photo_dialog').dialog('moveToTop'); } else { $('#edit_photo_dialog').dialog('open'); } }, savePhoto:function(){ var target = $('#crop_target'); var form = $('#cropform'); form.submit(); target.load(function(){ var response=jQuery.parseJSON(target.contents().text()); if(response != undefined && response.status == 'success'){ // load cropped photo. $('#contacts_details_photo_wrapper').html(response.data.page); Contacts.UI.Card.loadPhotoHandlers(); }else{ OC.dialogs.alert(response.data.message, t('contacts', 'Error')); } }); Contacts.UI.Contacts.refreshThumbnail(this.id); }, addMail:function() { //alert('addMail'); $('#emaillist li.template:first-child').clone().appendTo($('#emaillist')).show(); $('#emaillist li.template:last-child').removeClass('template').addClass('propertycontainer'); $('#emaillist li:last-child').find('input[type="email"]').focus(); Contacts.UI.loadListHandlers(); return false; }, loadMails:function() { $('#emails').hide(); $('#emaillist li.propertycontainer').remove(); for(var mail in this.data.EMAIL) { this.addMail(); //$('#emaillist li:first-child').clone().appendTo($('#emaillist')).show(); $('#emaillist li:last-child').data('checksum', this.data.EMAIL[mail]['checksum']) $('#emaillist li:last-child').find('input[type="email"]').val(this.data.EMAIL[mail]['value']); for(var param in this.data.EMAIL[mail]['parameters']) { if(param.toUpperCase() == 'PREF') { $('#emaillist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked') } } } if($('#emaillist li').length > 1) { $('#emails').show(); $('#contact_communication').show(); } $('#emaillist li:last-child').find('input[type="text"]').focus(); Contacts.UI.loadListHandlers(); return false; }, addPhone:function() { $('#phonelist li.template:first-child').clone().appendTo($('#phonelist')); //.show(); $('#phonelist li.template:last-child').find('select').addClass('contacts_property'); $('#phonelist li.template:last-child').removeClass('template').addClass('propertycontainer'); $('#phonelist li:last-child').find('input[type="text"]').focus(); Contacts.UI.loadListHandlers(); $('#phonelist li:last-child').find('select').multiselect({ noneSelectedText: t('contacts', 'Select type'), header: false, selectedList: 4, classes: 'typelist' }); $('#phonelist li:last-child').show(); return false; }, loadPhones:function() { $('#phones').hide(); $('#phonelist li.propertycontainer').remove(); for(var phone in this.data.TEL) { this.addPhone(); $('#phonelist li:last-child').find('select').multiselect('destroy'); $('#phonelist li:last-child').data('checksum', this.data.TEL[phone]['checksum']) $('#phonelist li:last-child').find('input[type="text"]').val(this.data.TEL[phone]['value']); for(var param in this.data.TEL[phone]['parameters']) { if(param.toUpperCase() == 'PREF') { $('#phonelist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); } else if(param.toUpperCase() == 'TYPE') { for(ptype in this.data.TEL[phone]['parameters'][param]) { var pt = this.data.TEL[phone]['parameters'][param][ptype]; $('#phonelist li:last-child').find('select option').each(function(){ //if ($(this).val().toUpperCase() == pt.toUpperCase()) { if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) { $(this).attr('selected', 'selected'); } }); } } } $('#phonelist li:last-child').find('select').multiselect({ noneSelectedText: t('contacts', 'Select type'), header: false, selectedList: 4, classes: 'typelist' }); } if($('#phonelist li').length > 1) { $('#phones').show(); $('#contact_communication').show(); } return false; }, }, Addressbooks:{ droptarget:undefined, overview:function(){ if($('#chooseaddressbook_dialog').dialog('isOpen') == true){ $('#chooseaddressbook_dialog').dialog('moveToTop'); }else{ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(jsondata){ if(jsondata.status != 'error'){ $('#chooseaddressbook_dialog').dialog({ width : 600, close : function(event, ui) { $(this).dialog('destroy').remove(); } }); } else { alert(jsondata.data.message); } }); } }, activation:function(checkbox, bookid) { $.post(OC.filePath('contacts', 'ajax', 'activation.php'), { bookid: bookid, active: checkbox.checked?1:0 }, function(data) { 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(); }, 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(obj, 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(jsondata) { if (jsondata.status == 'success'){ $(obj).closest('tr').remove(); //$('#chooseaddressbook_dialog').dialog('destroy').remove(); Contacts.UI.Contacts.update(); //Contacts.UI.Addressbooks.overview(); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert('Error: ' + data.message); } }); } }, loadImportHandlers:function() { this.droptarget = $('#import_drop_target'); console.log($('#import_drop_target').html()); $(this.droptarget).bind('dragover',function(event){ //console.log('dragover'); $(event.target).addClass('droppable'); event.stopPropagation(); event.preventDefault(); }); $(this.droptarget).bind('dragleave',function(event){ //console.log('dragleave'); $(event.target).removeClass('droppable'); //event.stopPropagation(); //event.preventDefault(); }); $(this.droptarget).bind('drop',function(event){ event.stopPropagation(); event.preventDefault(); console.log('drop'); $(event.target).removeClass('droppable'); $(event.target).html(t('contacts', 'Uploading...')); Contacts.UI.loading(event.target, true); $.fileUpload(event.originalEvent.dataTransfer.files); }); $.fileUpload = function(files){ console.log(files + ', ' + files.length); var file = files[0]; console.log('size: '+file.size+', type: '+file.type); if(file.size > $('#max_upload').val()){ OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); $(Contacts.UI.Addressbooks.droptarget).html(t('contacts', 'Drop a VCF file to import contacts.')); Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); return; } if(file.type.indexOf('text') != 0) { OC.dialogs.alert(t('contacts','You have dropped a file type that cannot be imported: ') + file.type, t('contacts','Wrong file type')); $(Contacts.UI.Addressbooks.droptarget).html(t('contacts', 'Drop a VCF file to import contacts.')); Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); return; } var xhr = new XMLHttpRequest(); if (!xhr.upload) { OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please upload the contacts file to ownCloud and import that way.'), t('contacts', 'Error')) } fileUpload = xhr.upload, xhr.onreadystatechange = function() { if (xhr.readyState == 4){ response = $.parseJSON(xhr.responseText); if(response.status == 'success') { if(xhr.status == 200) { $(Contacts.UI.Addressbooks.droptarget).html(t('contacts', 'Importing...')); Contacts.UI.Addressbooks.doImport(response.data.path, response.data.file); } else { $(Contacts.UI.Addressbooks.droptarget).html(t('contacts', 'Drop a VCF file to import contacts.')); Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error')); } } else { OC.dialogs.alert(response.data.message, t('contacts', 'Error')); } } }; xhr.open("POST", 'ajax/uploadimport.php?file='+encodeURIComponent(file.name), true); xhr.setRequestHeader('Cache-Control', 'no-cache'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('X_FILE_NAME', encodeURIComponent(file.name)); xhr.setRequestHeader('X-File-Size', file.size); xhr.setRequestHeader('Content-Type', file.type); xhr.send(file); } }, importAddressbook:function(object){ var tr = $(document.createElement('tr')) .load(OC.filePath('contacts', 'ajax', 'importaddressbook.php')); $(object).closest('tr').after(tr).hide(); //this.loadImportHandlers(); }, doImport:function(path, file){ var id = $('#importaddressbook_dialog').find('#book').val(); console.log('Selected book: ' + id); $.post(OC.filePath('contacts', '', 'import.php'), { id: id, path: path, file: file, istmpfile: true }, function(jsondata){ if(jsondata.status == 'success'){ Contacts.UI.Addressbooks.droptarget.html(t('contacts', 'Import done. Success/Failure: ')+jsondata.data.imported+'/'+jsondata.data.failed); $('#chooseaddressbook_dialog').find('#close_button').val(t('contacts', 'OK')); Contacts.UI.Contacts.update(); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); }, submit:function(button, bookid){ var displayname = $("#displayname_"+bookid).val().trim(); var active = $("#edit_active_"+bookid+":checked").length; var description = $("#description_"+bookid).val(); if(displayname.length == 0) { OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error')); return false; } 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(jsondata){ if(jsondata.status == 'success'){ $(button).closest('tr').prev().html(jsondata.page).show().next().remove(); Contacts.UI.Contacts.update(); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); }, cancel:function(button, bookid){ $(button).closest('tr').prev().show().next().remove(); } }, Contacts:{ // Reload the contacts list. update:function(){ console.log('Contacts.update, start'); $.getJSON('ajax/contacts.php',{},function(jsondata){ if(jsondata.status == 'success'){ $('#contacts').html(jsondata.data.page); Contacts.UI.Card.update(); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert(jsondata.data.message); } }); setTimeout(Contacts.UI.Contacts.lazyupdate, 500); }, // Add thumbnails to the contact list as they become visible in the viewport. lazyupdate:function(){ $('#contacts li').live('inview', function(){ if (!$(this).find('a').attr('style')) { $(this).find('a').css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat'); } }); }, refreshThumbnail:function(id){ $('#contacts [data-id="'+id+'"]').find('a').css('background','url(thumbnail.php?id='+id+'&refresh=1'+Math.random()+') no-repeat'); } } } } $(document).ready(function(){ Contacts.UI.loadHandlers(); OCCategories.changed = Contacts.UI.Card.categoriesChanged; OCCategories.app = 'contacts'; $('#chooseaddressbook').click(function(){ Contacts.UI.Addressbooks.overview(); return false; }); $('#contacts_newcontact').click(function(){ Contacts.UI.Card.editNew(); }); $('#contacts_deletecard').click(function(){ Contacts.UI.Card.doDelete(); }); // Load a contact. $('#leftcontent li').click(function(){ var id = $(this).data('id'); $(this).addClass('active'); var oldid = $('#rightcontent').data('id'); if(oldid != 0){ $('#leftcontent li[data-id="'+oldid+'"]').removeClass('active'); } $.getJSON('ajax/contactdetails.php',{'id':id},function(jsondata){ if(jsondata.status == 'success'){ Contacts.UI.Card.loadContact(jsondata.data); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); //alert(jsondata.data.message); } }); return false; }); $('#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).find('a').attr('style')) { //alert($(this).data('id') + ' has background: ' + $(this).attr('style')); $(this).find('a').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 } }); // NOTE: For some reason the selector doesn't work when I select by '.contacts_property' too... // I do the filtering in the event handler instead. //$('input[type="text"],input[type="checkbox"],input[type="email"],input[type="tel"],input[type="date"], select').live('change', function(){ $('.contacts_property').live('change', function(){ Contacts.UI.Card.saveProperty(this); }); $('#fn').blur(function(){ if($('#fn').val() == '') { OC.dialogs.alert(t('contacts','The name field cannot be empty. Please enter a name for this contact.'), t('contacts','Name is empty'), function() { $('#fn').focus(); }); $('#fn').focus(); return false; } }); // Name has changed. Update it and reorder. $('#fn').live('change',function(){ var name = $('#fn').val(); var item = $('#contacts [data-id="'+Contacts.UI.Card.id+'"]').clone(); $('#contacts [data-id="'+Contacts.UI.Card.id+'"]').remove(); $(item).find('a').html(name); var added = false; $('#contacts li').each(function(){ if ($(this).text().toLowerCase() > name.toLowerCase()) { $(this).before(item).fadeIn('fast'); added = true; return false; } }); if(!added) { $('#leftcontent ul').append(item); } }); /** * Profile picture upload handling */ // New profile picture selected $('#file_upload_start').live('change',function(){ Contacts.UI.Card.uploadPhoto(this.files); }); $('#contacts_details_photo_wrapper').bind('dragover',function(event){ console.log('dragover'); $(event.target).addClass('droppable'); event.stopPropagation(); event.preventDefault(); }); $('#contacts_details_photo_wrapper').bind('dragleave',function(event){ console.log('dragleave'); $(event.target).removeClass('droppable'); //event.stopPropagation(); //event.preventDefault(); }); $('#contacts_details_photo_wrapper').bind('drop',function(event){ event.stopPropagation(); event.preventDefault(); console.log('drop'); $(event.target).removeClass('droppable'); $.fileUpload(event.originalEvent.dataTransfer.files); }); /** * Upload function for dropped files. Should go in the Contacts class/object. */ $.fileUpload = function(files){ var file = files[0]; console.log('size: '+file.size); if(file.size > $('#max_upload').val()){ OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); return; } if (file.type.indexOf("image") != 0) { OC.dialogs.alert(t('contacts','Only image files can be used as profile picture.'), t('contacts','Wrong file type')); return; } var xhr = new XMLHttpRequest(); if (!xhr.upload) { OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.'), t('contacts', 'Error')) } fileUpload = xhr.upload, xhr.onreadystatechange = function() { if (xhr.readyState == 4){ response = $.parseJSON(xhr.responseText); if(response.status == 'success') { if(xhr.status == 200) { Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp); } else { OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error')); } } else { //alert(xhr.responseText); OC.dialogs.alert(response.data.message, t('contacts', 'Error')); } // stop loading indicator //$('#contacts_details_photo_progress').hide(); } }; fileUpload.onprogress = function(e){ if (e.lengthComputable){ var _progress = Math.round((e.loaded * 100) / e.total); if (_progress != 100){ //$('#contacts_details_photo_progress').text(_progress + '%'); //$('#contacts_details_photo_progress').val(_progress); } } }; // Start loading indicator. //$('#contacts_details_photo_progress').show()(); xhr.open("POST", 'ajax/uploadphoto.php?id='+Contacts.UI.Card.id+'&imagefile='+encodeURIComponent(file.name), true); xhr.setRequestHeader('Cache-Control', 'no-cache'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('X_FILE_NAME', encodeURIComponent(file.name)); //xhr.setRequestHeader("X_FILENAME", file.name); xhr.setRequestHeader('X-File-Size', file.size); xhr.setRequestHeader('Content-Type', file.type); xhr.send(file); } $('body').click(function(e){ if(!$(e.target).is('#contacts_propertymenu_button')) { $('#contacts_propertymenu').hide(); } }); $('#contacts_propertymenu_button').click(function(){ var menu = $('#contacts_propertymenu'); if(menu.is(':hidden')) { menu.show(); menu.find('ul').focus(); } else { menu.hide(); } }); $('#contacts_propertymenu a').click(function(){ var type = $(this).data('type'); Contacts.UI.Card.addProperty(type); $('#contacts_propertymenu').hide(); }); });