diff options
Diffstat (limited to 'apps/contacts/js/contacts.js')
-rw-r--r-- | apps/contacts/js/contacts.js | 1289 |
1 files changed, 1289 insertions, 0 deletions
diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js new file mode 100644 index 00000000000..c2130e08b5b --- /dev/null +++ b/apps/contacts/js/contacts.js @@ -0,0 +1,1289 @@ +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() { + Contacts.UI.messageBox(t('contacts', 'Not implemented'), t('contacts', 'Sorry, this functionality has not been implemented yet')); + }, + searchOSM:function(obj) { + var adr = Contacts.UI.propertyContainerFor(obj).find('.adr').val(); + console.log('adr 1: ' + adr); + if(adr == undefined) { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Couldn\'t get a valid address.')); + 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(); + //Contacts.UI.notImplemented(); + }, + mailTo:function(obj) { + var adr = Contacts.UI.propertyContainerFor($(obj)).find('input[type="email"]').val().trim(); + if(adr == '') { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Please enter an email address.')); + 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'); + }, + 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').length == 1) { + $('#emails').hide(); + } + break; + case 'TEL': + console.log('phones: '+$('#phonelist>li').length); + if($('#phonelist>li').length == 1) { + $('#phones').hide(); + } + break; + case 'ADR': + console.log('addresses: '+$('#addressdisplay>dl').length); + if($('#addressdisplay>dl').length == 1) { + $('#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(); + }, + messageBox:function(title, msg) { + //alert(msg); + if($('#messagebox').dialog('isOpen') == true){ + // NOTE: Do we ever get here? + $('#messagebox').dialog('moveToTop'); + }else{ + $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'messagebox.php'), function(){ + $('#messagebox').dialog( + { + autoOpen: true, + title: title, + buttons: [{ + text: "Ok", + click: function() { $(this).dialog("close"); } + }], + close: function(event, ui) { + $(this).dialog('destroy').remove(); + }, + open: function(event, ui) { + $('#messagebox_msg').html(msg); + } + }); + }); + } + }, + loadListHandlers:function() { + //$('.add,.delete').hide(); + $('.globe,.mail,.delete,.edit').tipsy(); + $('.addresscard,.propertylist li,.propertycontainer').hover( + function () { + $(this).find('.globe,.mail,.delete,.edit').fadeIn(100); + }, + function () { + $(this).find('.globe,.mail,.delete,.edit').fadeOut(100); + } + ); + }, + loadHandlers:function() { + console.log('loadHandlers'); + /* + $('.formfloat').hover( + function () { + $(this).find('.add').fadeIn(500); + }, + function () { + $(this).find('.add').fadeOut(500); + } + );*/ + $('#contacts_deletecard').tipsy({gravity: 'ne'}); + $('#contacts_downloadcard').tipsy({gravity: 'ne'}); + $('.button').tipsy(); + $('#fn').jec(); + $('.jecEditableOption').attr('title', t('contacts','Custom')); + $('#fn').tipsy(); + $('#contacts_details_photo_wrapper').tipsy(); + $('#bday').datepicker({ + dateFormat : 'dd-mm-yy' + }); + // Style phone types + $('#phonelist').find('select[class*="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; +// }); + $('#n').click(function(){ + Contacts.UI.Card.editName(); + //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'); } + } + ] ); + Contacts.UI.loadListHandlers(); + }, + Card:{ + id:'', + fn:'', + fullname:'', + shortname:'', + famname:'', + givname:'', + addname:'', + honpre:'', + honsuf:'', + data:undefined, + export:function() { + document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id; + //$.get(OC.linkTo('contacts', 'export.php'),{'contactid':this.id},function(jsondata){ + //}); + }, + delete:function() { + $('#contacts_deletecard').tipsy('hide'); + $.getJSON('ajax/deletecard.php',{'id':this.id},function(jsondata){ + if(jsondata.status == 'success'){ + $('#leftcontent [data-id="'+jsondata.data.id+'"]').remove(); + $('#rightcontent').data('id',''); + //$('#rightcontent').empty(); + this.id = this.fn = this.fullname = this.shortname = this.famname = this.givname = this.addname = this.honpre = this.honsuf = ''; + this.data = undefined; + // Load empty page. + var firstid = $('#contacts li:first-child').data('id'); + console.log('trying to load: ' + firstid); + $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':firstid},function(jsondata){ + if(jsondata.status == 'success'){ + Contacts.UI.Card.loadContact(jsondata.data); + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + } + }); + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + //alert(jsondata.data.message); + } + }); + return false; + }, + loadContact:function(jsondata){ + this.data = jsondata; + this.id = this.data.id; + console.log('loaded: ' + this.data.FN[0]['value']); + this.populateNameFields(); + this.loadPhoto(); + this.loadMails(); + this.loadPhones(); + this.loadAddresses(); + this.loadSingleProperties(); + }, + loadSingleProperties:function() { + var props = ['BDAY', 'NICKNAME', 'ORG']; + // Clear all elements + $('#ident .propertycontainer[class*="propertycontainer"]').each(function(){ + if(props.indexOf($(this).data('element')) > -1) { +// $('#contacts_propertymenu a[data-type="'+$(this).data('element')+'"]').parent().show(); + //console.log($(this).html()); + $(this).data('checksum', ''); + $(this).find('input').val(''); + $(this).hide(); + $(this).prev().hide(); + } + }); + for(var prop in props) { + //console.log('loadSingleProperties: ' + props[prop] + ': ' + this.data[props[prop]]); + 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']; + //console.log('value: ' + property['value']); + //console.log('checksum: ' + property['checksum']); + switch(props[prop]) { + case 'BDAY': + var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10)); + //console.log('Date: ' + val); + value = $.datepicker.formatDate('dd-mm-yy', val); + //console.log('Date: ' + value); + $('#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': + //console.log('NICKNAME: ' + value); + $('#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': + //console.log('ORG: ' + value); + $('#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; + } + } + } + }, + populateNameFields:function() { + this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = '' + var full = ''; + var narray = undefined; + //console.log('splitting: ' + this.data.N[0]['value']); + this.fn = this.data.FN[0]['value']; + //console.log('FN: ' + this.fn) + 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]; + //console.log('famname: ' + this.famname) + 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; + } + //console.log('fullname: ' + this.fullname) + $('#n').html(this.fullname); + $('.jecEditableOption').attr('title', 'Custom'); + $('.jecEditableOption').text(this.fn); + //$('.jecEditableOption').attr('value', 0); + $('#fn').val(0); + $('#full').text(this.fullname); + $('#short').text(this.givname + ' ' + this.famname); + $('#reverse').text(this.famname + ' ' + this.givname); + $('#reverse_comma').text(this.famname + ', ' + this.givname); + $('#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']); + }, + editNew:function(){ // add a new contact + //Contacts.UI.notImplemented(); + //return false; + + $.getJSON('ajax/newcontact.php',{},function(jsondata){ + if(jsondata.status == 'success'){ + id = ''; + $('#rightcontent').data('id',''); + $('#rightcontent').html(jsondata.data.page); + console.log('Trying to open name edit dialog'); + Contacts.UI.Card.editName(); + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + alert(jsondata.data.message); + } + }); + }, + add:function(n, fn, aid){ // add a new contact + //Contacts.UI.notImplemented(); + //return false; + console.log('Add contact: ' + n + ', ' + fn + ' ' + aid); + $.post(OC.filePath('contacts', 'ajax', 'addcontact.php'), { n: n, fn: fn, aid: aid }, + function(jsondata) { + /* + * Arguments: + * jsondata.status + * jsondata.data.id + */ + if (jsondata.status == 'success'){ + $('#rightcontent').data('id',jsondata.data.id); + id = jsondata.data.id; + $('#contact_identity').show(); + $('#actionbar').show(); + // TODO: Add to contacts list. + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + //alert(jsondata.data.message); + } + }); + }, + 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; + } + console.log('saveProperty. ' + $(obj).val()); + if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'This property has to be non-empty.')); + return false; + } + //Contacts.UI.loading(obj, false); + //return false; + container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata. + Contacts.UI.loading(container, true); + //console.log('saveProperty. Container: ' + container.data('checksum')); + var checksum = container.data('checksum'); + var name = container.data('element'); + var q = container.find('input,select').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); + $.post('ajax/saveproperty.php',q,function(jsondata){ + if(jsondata.status == 'success'){ + container.data('checksum', jsondata.data.checksum); + Contacts.UI.loading(container, false); + return true; + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + Contacts.UI.loading(container, false); + return false; + } + },'json'); + } else { // add + console.log('Adding: ' + q); + $.post('ajax/addproperty.php',q,function(jsondata){ + if(jsondata.status == 'success'){ + container.data('checksum', jsondata.data.checksum); + Contacts.UI.loading(container, false); + return true; + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + Contacts.UI.loading(container, false); + return false; + } + },'json'); + } + }, + addProperty:function(obj){ + var type = $(obj).data('type'); + console.log('addProperty:' + type); + switch (type) { + case 'PHOTO': + $('#contacts_propertymenu a[data-type="PHOTO"]').parent().hide(); + $('#file_upload_form').show(); + break; + case 'EMAIL': + //console.log('emails: '+$('#emaillist>li').length); + if($('#emaillist>li').length == 1) { + $('#emails').show(); + } + Contacts.UI.Card.addMail(); + break; + case 'TEL': + //console.log('phones: '+$('#phonelist>li').length); + if($('#phonelist>li').length == 1) { + $('#phones').show(); + } + Contacts.UI.Card.addPhone(); + break; + case 'ADR': + //console.log('addresses: '+$('#addressdisplay>dl').length); + if($('#addressdisplay>dl').length == 1) { + $('#addresses').show(); + } + Contacts.UI.Card.editAddress('new', true); + break; + case 'NICKNAME': + case 'ORG': + case 'BDAY': + $('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show(); + $('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide(); + break; + } + }, + deleteProperty:function(obj, type){ + //console.log('deleteProperty, id: ' + this.id); + Contacts.UI.loading(obj, true); + var checksum = Contacts.UI.checksumFor(obj); + //var checksum = $(obj).parent().data('checksum'); + if(checksum != undefined) { + //alert('deleteProperty: ' + $(obj).val() + ' ' + 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.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 { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org')); + Contacts.UI.loading(obj, false); + } + } + else{ + Contacts.UI.loading(obj, false); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + } + }); + } else { // Property hasn't been saved so there's nothing to delete. + if(type == 'list') { + Contacts.UI.propertyContainerFor(obj).remove(); + 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 { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org')); + } + } + }, + editName:function(){ + console.log('editName, id: ' + this.id); + //console.log('editName'); + /* 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(){ + $('#edit_name_dialog' ).dialog({ + modal: (this.id == '' && true || false), + closeOnEscape: (this.id == '' && false || true), + title: (this.id == '' && 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) { + //alert('close'); + $(this).dialog('destroy').remove(); + //return event; + }/*, + open : function(event, ui) { + // load 'N' property - maybe :-P + }*/ + }); + }); + } + }, + saveName:function(dlg){ + console.log('saveName, id: ' + this.id); + // TODO: Check if new, get address book id and call Contacts.UI.Card.add() + var n = new Array($(dlg).find('#fam').val(),$(dlg).find('#giv').val(),$(dlg).find('#add').val(),$(dlg).find('#pre').val(),$(dlg).find('#suf').val()); + this.famname = n[0]; + this.givname = n[1]; + this.addname = n[2]; + this.honpre = n[3]; + this.honsuf = n[4]; + //alert('saveName: ' + n); + $('#n').val(n.join(';')); + /*$('#card > input').each(function(){ + alert($(this).attr('id') + ' ' + $(this).val()); + });*/ + 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]; + } + $('#short').text(n[1] + ' ' + n[0]); + $('#full').text(this.fullname); + $('#reverse').text(n[0] + ' ' + n[1]); + $('#reverse_comma').text(n[0] + ', ' + n[1]); + //$('#n').html(full); + $('#fn').val(0); + if(this.id == '') { + var aid = $(dlg).find('#aid').val(); + Contacts.UI.Card.add(n, $('#short').text(), aid); + } else { + Contacts.UI.Card.saveProperty($('#n')); + } + }, + loadAddresses:function(){ + $('#addresses').hide(); + $('#addressdisplay dl[class*="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 + '<li>' + adrarray[0].strip_tags() + '</li>'; + } + if(adrarray[1].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[1].strip_tags() + '</li>'; + } + if(adrarray[2].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[2].strip_tags() + '</li>'; + } + if(adrarray[3].length > 0 || adrarray[5].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '</li>'; + } + if(adrarray[4].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[4].strip_tags() + '</li>'; + } + if(adrarray[6].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[6].strip_tags() + '</li>'; + } + $('#addressdisplay dl').last().find('.addresslist').html(adrtxt); + //console.log('ADR: ' + adr); + console.log('checksum: ' + this.data.ADR[adr]['checksum']); + //console.log('type: ' + jQuery.type(this.data.ADR[adr]['value'])); + var types = new Array(); + var ttypes = new Array(); + for(var param in this.data.ADR[adr]['parameters']) { + //console.log('param: ' + param + ': ' + this.data.ADR[adr]['parameters'][param]); + if(param.toUpperCase() == 'TYPE') { + //console.log('param type: ' + jQuery.type(this.data.ADR[adr]['parameters'][param])); + types.push(t('contacts', ucwords(this.data.ADR[adr]['parameters'][param].toLowerCase()))); + ttypes.push(this.data.ADR[adr]['parameters'][param]); + //for(ptype in this.data.ADR[adr]['parameters'][param]) { + // var pt = this.data.ADR[adr]['parameters'][param][ptype]; + // // TODO: Create an array with types, translate, ucwords and join. + //} + } + } + //console.log('# types: ' + types.length); + //console.log('Types:' + types.join('/')); + $('#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(); + } + 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); + } + //console.log('editAddress: checksum ' + checksum); + /* 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(){ + $('#edit_address_dialog' ).dialog({ + /*modal: true,*/ + height: 'auto', width: 'auto', + buttons: { + 'Ok':function() { + console.log('OK:isnew ' + isnew); + console.log('OK:obj ' + obj); + 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(); + } + } + }, + close : function(event, ui) { + //alert('close'); + $(this).dialog('destroy').remove(); + if(isnew) { + container.remove(); + } + }/*, + open : function(event, ui) { + // load 'ADR' property - maybe :-P + }*/ + }); + }); + } + }, + 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(),$(dlg).find('#adr_extended').val(),$(dlg).find('#adr_street').val(),$(dlg).find('#adr_city').val(),$(dlg).find('#adr_region').val(),$(dlg).find('#adr_zipcode').val(),$(dlg).find('#adr_country').val()); + $(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 + '<li>' + adr[0] + '</li>'; + } + if(adr[1].length > 0) { + adrtxt = adrtxt + '<li>' + adr[1] + '</li>'; + } + if(adr[2].length > 0) { + adrtxt = adrtxt + '<li>' + adr[2] + '</li>'; + } + if(adr[3].length > 0 || adr[5].length > 0) { + adrtxt = adrtxt + '<li>' + adr[5] + ' ' + adr[3] + '</li>'; + } + if(adr[4].length > 0) { + adrtxt = adrtxt + '<li>' + adr[4] + '</li>'; + } + if(adr[6].length > 0) { + adrtxt = adrtxt + '<li>' + adr[6] + '</li>'; + } + $(container).find('.addresslist').html(adrtxt); + }, + uploadPhoto:function(filelist) { + if(!filelist) { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts','No files selected for upload.')); + 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()){ + Contacts.UI.messageBox(t('Upload too large'), t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.')); + 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{ + Contacts.UI.messageBox(t('contacts', 'Error'), response.data.message); + } + }); + form.submit(); + } + }, + loadPhoto:function(){ + console.log('loadPhoto: ' + this.data.PHOTO); + if(this.data.PHOTO) { + $('#file_upload_form').show(); + $('#contacts_propertymenu a[data-type="PHOTO"]').parent().hide(); + } else { + $('#file_upload_form').hide(); + $('#contacts_propertymenu a[data-type="PHOTO"]').parent().show(); + } + $.getJSON('ajax/loadphoto.php',{'id':this.id},function(jsondata){ + if(jsondata.status == 'success'){ + //alert(jsondata.data.page); + $('#contacts_details_photo_wrapper').html(jsondata.data.page); + } + else{ + Contacts.UI.messageBox(jsondata.data.message); + } + }); + }, + 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{ + Contacts.UI.messageBox(jsondata.data.message); + } + }); + 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); + }else{ + Contacts.UI.messageBox(t('contacts','Error'), response.data.message); + } + }); + $('#contacts [data-id="'+this.id+'"]').find('a').css('background','url(thumbnail.php?id='+this.id+'&refresh=1'+Math.random()+') no-repeat'); + }, + addMail:function() { + //alert('addMail'); + $('#emaillist li[class*="template"]:first-child').clone().appendTo($('#emaillist')).show(); + $('#emaillist li[class*="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[class*="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']); + //console.log('EMAIL: ' + mail); + //console.log('value: ' + this.data.EMAIL[mail]['value']); + //console.log('checksum: ' + this.data.EMAIL[mail]['checksum']); + for(var param in this.data.EMAIL[mail]['parameters']) { + //console.log('param: ' + param + ': ' + this.data.EMAIL[mail]['parameters'][param]); + if(param.toUpperCase() == 'PREF') { + $('#emaillist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked') + } + } + //console.log('parameters: ' + jQuery.type(this.data.EMAIL[mail]['parameters'])); + } + if($('#emaillist li').length > 1) { + $('#emails').show(); + } + + $('#emaillist li:last-child').find('input[type="text"]').focus(); + Contacts.UI.loadListHandlers(); + return false; + }, + addPhone:function() { + $('#phonelist li[class*="template"]:first-child').clone().appendTo($('#phonelist')); //.show(); + $('#phonelist li[class*="template"]:last-child').find('select').addClass('contacts_property'); + $('#phonelist li[class*="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[class*="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']); + //console.log('TEL: ' + phone); + //console.log('value: ' + this.data.TEL[phone]['value']); + //console.log('checksum: ' + this.data.TEL[phone]['checksum']); + for(var param in this.data.TEL[phone]['parameters']) { + //console.log('param: ' + param + ': ' + this.data.TEL[phone]['parameters'][param]); + if(param.toUpperCase() == 'PREF') { + $('#phonelist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); + } + else if(param.toUpperCase() == 'TYPE') { + //console.log('param type: ' + jQuery.type(this.data.TEL[phone]['parameters'][param])); + 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(){ + //console.log('Test: ' + $(this).val().toUpperCase() + '==' + pt); + if ($(this).val().toUpperCase() == pt) { + //console.log('Selected: ' + pt); + $(this).attr('selected', 'selected'); + } + }); + } + } + } + $('#phonelist li:last-child').find('select').multiselect({ + noneSelectedText: t('contacts', 'Select type'), + header: false, + selectedList: 4, + classes: 'typelist' + }); + //console.log('parameters: ' + jQuery.type(this.data.EMAIL[mail]['parameters'])); + } + if($('#phonelist li').length > 1) { + $('#phones').show(); + } + return false; + }, + }, + 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 { + Contacts.UI.messageBox(t('contacts', 'Error'), data.message); + //alert('Error: ' + data.message); + } + }); + } + }, + import:function(){ + Contacts.UI.notImplemented(); + }, + 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:{ + /** + * Reload the contacts list. + */ + update:function(){ + $.getJSON('ajax/contacts.php',{},function(jsondata){ + if(jsondata.status == 'success'){ + $('#contacts').html(jsondata.data.page); + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'),jsondata.data.message); + //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'); + } + }); + } + } + } +} +$(document).ready(function(){ + + Contacts.UI.loadHandlers(); + + /** + * Show the Addressbook chooser + */ + $('#chooseaddressbook').click(function(){ + Contacts.UI.Addressbooks.overview(); + return false; + }); + + /** + * Open blank form to add new contact. + * FIXME: Load the same page but only show name data and popup the name edit dialog. + * On save load the page again with an id and show all fields. + * NOTE: Or: Load the full page and popup name dialog modal. On success set the newly aquired ID, on + * Cancel or failure give appropriate message and show ... something else :-P + */ + $('#contacts_newcontact').click(function(){ + Contacts.UI.Card.editNew(); +// $.getJSON('ajax/addcontact.php',{},function(jsondata){ +// if(jsondata.status == 'success'){ +// $('#rightcontent').data('id',''); +// $('#rightcontent').html(jsondata.data.page) +// .find('select').chosen(); +// } +// else{ +// Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); +// //alert(jsondata.data.message); +// } +// }); +// return false; + }); + + /** + * Load the details view for a contact. + */ + $('#leftcontent li').live('click',function(){ + var id = $(this).data('id'); + 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{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + //alert(jsondata.data.message); + } + }); + // NOTE: Deprecated. +// $.getJSON('ajax/getdetails.php',{'id':id, 'new':1},function(jsondata){ +// if(jsondata.status == 'success'){ +// $('#rightcontent').data('id',jsondata.data.id); +// $('#rightcontent').html(jsondata.data.page); +// $('#leftcontent li[data-id="'+jsondata.data.id+'"]').addClass('active'); +// //Contacts.UI.loadHandlers(); +// } +// else{ +// Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); +// //alert(jsondata.data.message); +// } +// }); + return false; + }); + + /** + * Delete currently selected contact TODO: and clear page + */ + $('#contacts_deletecard').live('click',function(){ + Contacts.UI.Card.delete(); + }); + + /** + * Add and insert a new contact into the list. + */ + $('#contacts_addcardform input[type="submit"]').live('click',function(){ + $.post('ajax/addcontact.php',$('#contact_identity').serialize(),function(jsondata){ + if(jsondata.status == 'success'){ + $('#rightcontent').data('id',jsondata.data.id); + $('#rightcontent').html(jsondata.data.page); + $('#leftcontent .active').removeClass('active'); + var item = '<li data-id="'+jsondata.data.id+'" class="active"><a href="index.php?id='+jsondata.data.id+'" style="background: url(thumbnail.php?id='+jsondata.data.id+') no-repeat scroll 0% 0% transparent;">'+jsondata.data.name+'</a></li>'; + var added = false; + $('#leftcontent ul li').each(function(){ + if ($(this).text().toLowerCase() > jsondata.data.name.toLowerCase()) { + $(this).before(item).fadeIn('fast'); + added = true; + return false; + } + }); + if(!added) { + $('#leftcontent ul').append(item); + } + } + else{ + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); + //alert(jsondata.data.message); + } + }, 'json'); + 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 + } + }); + + $('.button').tipsy(); + // Triggers invisible file input + $('#contacts_details_photo').live('click', function() { + $('#file_upload_start').trigger('click'); + return false; + }); + + // 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.UI.Card.saveProperty(this); + }); + + // 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').bind('dragover',function(event){ + console.log('dragover'); + $(event.target).css('background-color','red'); + event.stopPropagation(); + event.preventDefault(); + }); + $('#contacts_details_photo').bind('dragleave',function(event){ + console.log('dragleave'); + $(event.target).css('background-color','white'); + //event.stopPropagation(); + //event.preventDefault(); + }); + $('#contacts_details_photo').bind('drop',function(event){ + event.stopPropagation(); + event.preventDefault(); + console.log('drop'); + $(event.target).css('background-color','white') + $.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()){ + Contacts.UI.messageBox(t('contacts','Upload too large'), t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.')); + return; + } + if (file.type.indexOf("image") != 0) { + Contacts.UI.messageBox(t('contacts','Wrong file type'), t('contacts','Only image files can be used as profile picture.')); + return; + } + var xhr = new XMLHttpRequest(); + + if (!xhr.upload) { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.')) + } + 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 { + Contacts.UI.messageBox(t('contacts', 'Error'), xhr.status + ': ' + xhr.responseText); + } + } else { + //alert(xhr.responseText); + Contacts.UI.messageBox(t('contacts', 'Error'), response.data.message); + } + // 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); + } + + $('#contacts_propertymenu a').live('click',function(){ + Contacts.UI.Card.addProperty(this); + }); + + +}); |