summaryrefslogtreecommitdiffstats
path: root/apps/contacts/js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/contacts/js')
-rw-r--r--apps/contacts/js/LICENSE.jquery.inview41
-rw-r--r--apps/contacts/js/contacts.js2277
-rw-r--r--apps/contacts/js/expanding.js118
-rw-r--r--apps/contacts/js/jquery.Jcrop.js1765
-rw-r--r--apps/contacts/js/jquery.Jcrop.min.js255
-rw-r--r--apps/contacts/js/jquery.combobox.js158
-rw-r--r--apps/contacts/js/jquery.inview.js134
-rw-r--r--apps/contacts/js/jquery.inview.txt15
-rw-r--r--apps/contacts/js/jquery.multi-autocomplete.js94
-rw-r--r--apps/contacts/js/loader.js86
-rw-r--r--apps/contacts/js/settings.js196
11 files changed, 0 insertions, 5139 deletions
diff --git a/apps/contacts/js/LICENSE.jquery.inview b/apps/contacts/js/LICENSE.jquery.inview
deleted file mode 100644
index 1ed340edbe5..00000000000
--- a/apps/contacts/js/LICENSE.jquery.inview
+++ /dev/null
@@ -1,41 +0,0 @@
-Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales
-
-http://creativecommons.org/licenses/by-nc-sa/2.0/uk/
-
-You are free:
-
- * to copy, distribute, display, and perform the work
- * to make derivative works
-
-
-Under the following conditions:
-
- * Attribution — You must give the original author credit.
- Attribute this work:
- Information
- What does "Attribute this work" mean?
- The page you came from contained embedded licensing metadata,
- including how the creator wishes to be attributed for re-use.
- You can use the HTML here to cite the work. Doing so will
- also include metadata on your page so that others can find the
- original work as well.
-
- * Non-Commercial — You may not use this work for commercial
- purposes.
- * Share Alike — If you alter, transform, or build upon this
- work, you may distribute the resulting work only under a
- licence identical to this one.
-
-With the understanding that:
-
- * Waiver — Any of the above conditions can be waived if you get
- permission from the copyright holder.
- * Other Rights — In no way are any of the following rights
- affected by the license:
- o Your fair dealing or fair use rights;
- o The author's moral rights;
- o Rights other persons may have either in the work itself
- or in how the work is used, such as publicity or privacy rights.
- * Notice — For any reuse or distribution, you must make clear to
- others the licence terms of this work.
-
diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js
deleted file mode 100644
index 09cf26bf7fe..00000000000
--- a/apps/contacts/js/contacts.js
+++ /dev/null
@@ -1,2277 +0,0 @@
-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(/<(.|\n)*?>/g, '');
- return stripped;
-};
-
-OC.Contacts={
- /**
- * Arguments:
- * message: The text message to show.
- * timeout: The timeout in seconds before the notification disappears. Default 10.
- * timeouthandler: A function to run on timeout.
- * clickhandler: A function to run on click. If a timeouthandler is given it will be cancelled.
- * data: An object that will be passed as argument to the timeouthandler and clickhandler functions.
- * cancel: If set cancel all ongoing timer events and hide the notification.
- */
- notify:function(params) {
- var self = this;
- if(!self.notifier) {
- self.notifier = $('#notification');
- }
- if(params.cancel) {
- self.notifier.off('click');
- for(var id in self.notifier.data()) {
- if($.isNumeric(id)) {
- clearTimeout(parseInt(id));
- }
- }
- self.notifier.text('').fadeOut().removeData();
- return;
- }
- self.notifier.text(params.message);
- self.notifier.fadeIn();
- self.notifier.on('click', function() { $(this).fadeOut();});
- var timer = setTimeout(function() {
- if(!self || !self.notifier) {
- var self = OC.Contacts;
- self.notifier = $('#notification');
- }
- self.notifier.fadeOut();
- if(params.timeouthandler && $.isFunction(params.timeouthandler)) {
- params.timeouthandler(self.notifier.data(dataid));
- self.notifier.off('click');
- self.notifier.removeData(dataid);
- }
- }, params.timeout && $.isNumeric(params.timeout) ? parseInt(params.timeout)*1000 : 10000);
- var dataid = timer.toString();
- if(params.data) {
- self.notifier.data(dataid, params.data);
- }
- if(params.clickhandler && $.isFunction(params.clickhandler)) {
- self.notifier.on('click', function() {
- if(!self || !self.notifier) {
- var self = OC.Contacts;
- self.notifier = $(this);
- }
- clearTimeout(timer);
- self.notifier.off('click');
- params.clickhandler(self.notifier.data(dataid));
- self.notifier.removeData(dataid);
- });
- }
- },
- notImplemented:function() {
- OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented'));
- },
- searchOSM:function(obj) {
- var adr = OC.Contacts.propertyContainerFor(obj).find('.adr').val();
- 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();
- }
- adrstr = encodeURIComponent(adrstr);
- var uri = 'http://open.mapquestapi.com/nominatim/v1/search.php?q=' + adrstr + '&limit=10&addressdetails=1&polygon=1&zoom=';
- var newWindow = window.open(uri,'_blank');
- newWindow.focus();
- },
- mailTo:function(obj) {
- var adr = OC.Contacts.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');
- },
- loading:function(obj, state) {
- if(state) {
- $(obj).addClass('loading');
- } else {
- $(obj).removeClass('loading');
- }
- },
- showCardDAVUrl:function(username, bookname){
- $('#carddav_url').val(totalurl + '/' + username + '/' + decodeURIComponent(bookname));
- $('#carddav_url').show();
- $('#carddav_url_close').show();
- },
- loadListHandlers:function() {
- $('.propertylist li a.delete').unbind('click');
- $('.propertylist li a.delete').unbind('keydown');
- var deleteItem = function(obj) {
- obj.tipsy('hide');
- OC.Contacts.Card.deleteProperty(obj, 'list');
- }
- $('.propertylist li a.delete, .addresscard .delete').click(function() { deleteItem($(this)) });
- $('.propertylist li a.delete, .addresscard .delete').keydown(function() { deleteItem($(this)) });
- $('.propertylist li a.mail').click(function() { OC.Contacts.mailTo(this) });
- $('.propertylist li a.mail').keydown(function() { OC.Contacts.mailTo(this) });
- $('.addresscard .globe').click(function() { $(this).tipsy('hide');OC.Contacts.searchOSM(this); });
- $('.addresscard .globe').keydown(function() { $(this).tipsy('hide');OC.Contacts.searchOSM(this); });
- $('.addresscard .edit').click(function() { $(this).tipsy('hide');OC.Contacts.Card.editAddress(this, false); });
- $('.addresscard .edit').keydown(function() { $(this).tipsy('hide');OC.Contacts.Card.editAddress(this, false); });
- $('.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() {
- var deleteItem = function(obj) {
- obj.tipsy('hide');
- OC.Contacts.Card.deleteProperty(obj, 'single');
- }
- var goToUrl = function(obj) {
- var url = OC.Contacts.propertyContainerFor(obj).find('#url').val();
- if(url != '') {
- var newWindow = window.open(url,'_blank');
- newWindow.focus();
- }
- }
-
- $('#identityprops a.delete').click( function() { deleteItem($(this)) });
- $('#identityprops a.delete').keydown( function() { deleteItem($(this)) });
- $('#categories_value a.edit').click( function() { $(this).tipsy('hide');OCCategories.edit(); } );
- $('#categories_value a.edit').keydown( function() { $(this).tipsy('hide');OCCategories.edit(); } );
- $('#url_value a.globe').click( function() { $(this).tipsy('hide');goToUrl($(this)); } );
- $('#url_value a.globe').keydown( function() { $(this).tipsy('hide');goToUrl($(this)); } );
- $('#fn_select').combobox({
- 'id': 'fn',
- 'name': 'value',
- 'classes': ['contacts_property', 'nonempty', 'huge', 'tip', 'float'],
- 'attributes': {'placeholder': t('contacts', 'Enter name')},
- 'title': t('contacts', 'Format custom, Short name, Full name, Reverse or Reverse with comma')});
- $('#bday').datepicker({
- dateFormat : 'dd-mm-yy'
- });
- // Style phone types
- $('#phonelist').find('select.contacts_property').multiselect({
- noneSelectedText: t('contacts', 'Select type'),
- header: false,
- selectedList: 4,
- classes: 'typelist'
- });
- $('#edit_name').click(function(){OC.Contacts.Card.editName()});
- $('#edit_name').keydown(function(){OC.Contacts.Card.editName()});
-
- $('#phototools li a').click(function() {
- $(this).tipsy('hide');
- });
- $('#contacts_details_photo_wrapper').hover(
- function () {
- $('#phototools').slideDown(200);
- },
- function () {
- $('#phototools').slideUp(200);
- }
- );
- $('#phototools').hover(
- function () {
- $(this).removeClass('transparent');
- },
- function () {
- $(this).addClass('transparent');
- }
- );
- $('#phototools .upload').click(function() {
- $('#file_upload_start').trigger('click');
- });
- $('#phototools .cloud').click(function() {
- OC.dialogs.filepicker(t('contacts', 'Select photo'), OC.Contacts.Card.cloudPhotoSelected, false, 'image', true);
- });
- /* 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() {
- OC.Contacts.Card.savePhoto(this);
- $(this).dialog('close');
- }
- },
- {
- text: "Cancel",
- click: function() { $(this).dialog('close'); }
- }
- ] );
-
- // Name has changed. Update it and reorder.
- $('#fn').change(function(){
- var name = $('#fn').val().strip_tags();
- var item = $('.contacts li[data-id="'+OC.Contacts.Card.id+'"]').detach();
- $(item).find('a').html(name);
- OC.Contacts.Card.fn = name;
- OC.Contacts.Contacts.insertContact({contact:item});
- OC.Contacts.Contacts.scrollTo(OC.Contacts.Card.id);
- });
-
- $('#contacts_deletecard').click( function() { OC.Contacts.Card.delayedDelete();return false;} );
- $('#contacts_deletecard').keydown( function(event) {
- if(event.which == 13 || event.which == 32) {
- OC.Contacts.Card.delayedDelete();
- }
- return false;
- });
-
- $('#contacts_downloadcard').click( function() { OC.Contacts.Card.doExport();return false;} );
- $('#contacts_downloadcard').keydown( function(event) {
- if(event.which == 13 || event.which == 32) {
- OC.Contacts.Card.doExport();
- }
- return false;
- });
-
- // Profile picture upload handling
- // New profile picture selected
- $('#file_upload_start').change(function(){
- OC.Contacts.Card.uploadPhoto(this.files);
- });
- $('#contacts_details_photo_wrapper').bind('dragover',function(event){
- $(event.target).addClass('droppable');
- event.stopPropagation();
- event.preventDefault();
- });
- $('#contacts_details_photo_wrapper').bind('dragleave',function(event){
- $(event.target).removeClass('droppable');
- });
- $('#contacts_details_photo_wrapper').bind('drop',function(event){
- event.stopPropagation();
- event.preventDefault();
- $(event.target).removeClass('droppable');
- $.fileUpload(event.originalEvent.dataTransfer.files);
- });
-
- $('#categories').multiple_autocomplete({source: categories});
- $('#contacts_deletecard').tipsy({gravity: 'ne'});
- $('#contacts_downloadcard').tipsy({gravity: 'ne'});
- $('#contacts_propertymenu_button').tipsy();
- $('#contacts_newcontact, #contacts_import, #bottomcontrols .settings').tipsy({gravity: 'sw'});
-
- $('body').click(function(e){
- if(!$(e.target).is('#contacts_propertymenu_button')) {
- $('#contacts_propertymenu_dropdown').hide();
- }
- });
- function propertyMenu(){
- var menu = $('#contacts_propertymenu_dropdown');
- if(menu.is(':hidden')) {
- menu.show();
- menu.find('li').first().focus();
- } else {
- menu.hide();
- }
- }
- $('#contacts_propertymenu_button').click(propertyMenu);
- $('#contacts_propertymenu_button').keydown(propertyMenu);
- function propertyMenuItem(){
- var type = $(this).data('type');
- OC.Contacts.Card.addProperty(type);
- $('#contacts_propertymenu_dropdown').hide();
- }
- $('#contacts_propertymenu_dropdown a').click(propertyMenuItem);
- $('#contacts_propertymenu_dropdown a').keydown(propertyMenuItem);
- },
- Card:{
- update:function(params) { // params {cid:int, aid:int}
- if(!params) { params = {}; }
- $('#contacts li,#contacts h3').removeClass('active');
- console.log('Card, cid: ' + params.cid + ' aid: ' + params.aid);
- var newid, bookid, firstitem;
- if(!parseInt(params.cid) && !parseInt(params.aid)) {
- firstitem = $('#contacts ul').find('li:first-child');
- if(firstitem.length > 0) {
- if(firstitem.length > 1) {
- firstitem = firstitem.first();
- }
- newid = parseInt(firstitem.data('id'));
- bookid = parseInt(firstitem.data('bookid'));
- }
- } else if(!parseInt(params.cid) && parseInt(params.aid)) {
- bookid = parseInt(params.aid);
- newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id'));
- } else if(parseInt(params.cid) && !parseInt(params.aid)) {
- newid = parseInt(params.cid);
- var listitem = OC.Contacts.Contacts.getContact(newid); //$('#contacts li[data-id="'+newid+'"]');
- console.log('Is contact in list? ' + listitem.length);
- if(listitem.length) {
- //bookid = parseInt($('#contacts li[data-id="'+newid+'"]').data('bookid'));
- bookid = parseInt(OC.Contacts.Contacts.getContact(newid).data('bookid'));
- } else { // contact isn't in list yet.
- bookid = 'unknown';
- }
- } else {
- newid = parseInt(params.cid);
- bookid = parseInt(params.aid);
- }
- if(!bookid || !newid) {
- bookid = parseInt($('#contacts h3').first().data('id'));
- newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id'));
- }
- console.log('newid: ' + newid + ' bookid: ' +bookid);
- var localLoadContact = function(newid, bookid) {
- if($('.contacts li').length > 0) {
- $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':newid},function(jsondata){
- if(jsondata.status == 'success'){
- if(bookid == 'unknown') {
- bookid = jsondata.data.addressbookid;
- var contact = OC.Contacts.Contacts.insertContact({
- contactlist:$('#contacts ul[data-id="'+bookid+'"]'),
- data:jsondata.data
- });
- }
- $('#contacts li[data-id="'+newid+'"],#contacts h3[data-id="'+bookid+'"]').addClass('active');
- $('#contacts ul[data-id="'+bookid+'"]').slideDown(300);
- OC.Contacts.Card.loadContact(jsondata.data, bookid);
- OC.Contacts.Contacts.scrollTo(newid);
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
- }
-
- // Make sure proper DOM is loaded.
- if(!$('#card').length && newid) {
- console.log('Loading card DOM');
- $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{requesttoken:requesttoken},function(jsondata){
- if(jsondata.status == 'success'){
- $('#rightcontent').html(jsondata.data.page).ready(function() {
- OC.Contacts.loadHandlers();
- localLoadContact(newid, bookid);
- });
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- } else if(!newid) {
- console.log('Loading intro');
- // 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'));
- }
- });
- }
- else {
- localLoadContact(newid, bookid);
- }
- },
- setEnabled:function(enabled) {
- console.log('setEnabled', enabled);
- $('.contacts_property,.action').each(function () {
- $(this).prop('disabled', !enabled);
- OC.Contacts.Card.enabled = enabled;
- });
- },
- doExport:function() {
- document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id;
- },
- editNew:function(){ // add a new contact
- var book = $('#contacts h3.active');
- var permissions = parseInt(book.data('permissions'));
- if(permissions == 0
- || permissions & OC.Share.PERMISSION_UPDATE
- || permissions & OC.Share.PERMISSION_DELETE) {
- with(this) {
- delete id; delete fn; delete fullname; delete givname; delete famname;
- delete addname; delete honpre; delete honsuf;
- }
- this.bookid = book.data('id');
- OC.Contacts.Card.add(';;;;;', '', '', true);
- } else {
- OC.dialogs.alert(t('contacts', 'You do not have permission to add contacts to ')
- + book.text() + '. ' + t('contacts', 'Please select one of your own address books.'), t('contacts', 'Permission error'));
- }
- return false;
- },
- add:function(n, fn, aid, isnew){ // add a new contact
- console.log('Adding ' + fn);
- aid = aid?aid:$('#contacts h3.active').first().data('id');
- var localAddcontact = function(n, fn, aid, isnew) {
- $.post(OC.filePath('contacts', 'ajax', 'contact/add.php'), { n: n, fn: fn, aid: aid, isnew: isnew },
- function(jsondata) {
- if (jsondata.status == 'success'){
- $('#rightcontent').data('id',jsondata.data.id);
- var id = jsondata.data.id;
- var aid = jsondata.data.aid;
- $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){
- if(jsondata.status == 'success'){
- OC.Contacts.Card.loadContact(jsondata.data, aid);
- var item = OC.Contacts.Contacts.insertContact({data:jsondata.data});
- if(isnew) { // add some default properties
- OC.Contacts.Card.addProperty('EMAIL');
- OC.Contacts.Card.addProperty('TEL');
- $('#fn').focus();
- }
- }
- else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- $('#contact_identity').show();
- $('#actionbar').show();
- }
- else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
-
- if(!$('#card').length) {
- console.log('Loading card DOM');
- $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{'requesttoken': requesttoken},function(jsondata){
- if(jsondata.status == 'success'){
- $('#rightcontent').html(jsondata.data.page).ready(function() {
- OC.Contacts.loadHandlers();
- localAddcontact(n, fn, aid, isnew);
- });
- } else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- } else {
- localAddcontact(n, fn, aid, isnew);
- }
- },
- delayedDelete:function() {
- $('#contacts_deletecard').tipsy('hide');
- var newid = '', bookid;
- var curlistitem = OC.Contacts.Contacts.getContact(this.id);
- curlistitem.removeClass('active');
- var newlistitem = curlistitem.prev('li');
- if(!newlistitem) {
- newlistitem = curlistitem.next('li');
- }
- curlistitem.detach();
- if($(newlistitem).is('li')) {
- newid = newlistitem.data('id');
- bookid = newlistitem.data('bookid');
- }
- $('#rightcontent').data('id', newid);
-
- OC.Contacts.Contacts.deletionQueue.push(parseInt(this.id));
- if(!window.onbeforeunload) {
- window.onbeforeunload = OC.Contacts.Contacts.warnNotDeleted;
- }
-
- with(this) {
- delete id; delete fn; delete fullname; delete shortname; delete famname;
- delete givname; delete addname; delete honpre; delete honsuf; delete data;
- }
-
- if($('.contacts li').length > 0) {
- OC.Contacts.Card.update({cid:newid, aid:bookid});
- } else {
- // load intro page
- $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){
- if(jsondata.status == 'success'){
- id = '';
- $('#rightcontent').html(jsondata.data.page).removeData('id');
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
- OC.Contacts.notify({
- data:curlistitem,
- message:t('contacts','Click to undo deletion of "') + curlistitem.find('a').text() + '"',
- //timeout:5,
- timeouthandler:function(contact) {
- console.log('timeout');
- OC.Contacts.Card.doDelete(contact.data('id'), true, function(res) {
- if(!res) {
- OC.Contacts.Contacts.insertContact({contact:contact});
- } else {
- delete contact;
- }
- });
- },
- clickhandler:function(contact) {
- OC.Contacts.Contacts.insertContact({contact:contact});
- OC.Contacts.notify({message:t('contacts', 'Cancelled deletion of: "') + curlistitem.find('a').text() + '"'});
- window.onbeforeunload = null;
- }
- });
- },
- doDelete:function(id, removeFromQueue, cb) {
- var updateQueue = function(id, remove) {
- if(removeFromQueue) {
- OC.Contacts.Contacts.deletionQueue.splice(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)), 1);
- }
- if(OC.Contacts.Contacts.deletionQueue.length == 0) {
- window.onbeforeunload = null;
- }
- }
-
- if(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)) == -1 && removeFromQueue) {
- console.log('returning');
- updateQueue(id, removeFromQueue);
- if(typeof cb == 'function') {
- cb(true);
- }
- return;
- }
- $.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'), {'id':id},function(jsondata) {
- if(jsondata.status == 'error'){
- OC.Contacts.notify({message:jsondata.data.message});
- if(typeof cb == 'function') {
- cb(false);
- }
- }
- updateQueue(id, removeFromQueue);
- });
- if(typeof cb == 'function') {
- cb(true);
- }
- },
- loadContact:function(jsondata, bookid){
- this.data = jsondata;
- this.id = this.data.id;
- this.bookid = bookid;
- $('#rightcontent').data('id',this.id);
- this.populateNameFields();
- this.loadPhoto();
- this.loadMails();
- this.loadPhones();
- this.loadIMs();
- this.loadAddresses();
- this.loadSingleProperties();
- OC.Contacts.loadListHandlers();
- var note = $('#note');
- if(this.data.NOTE) {
- note.data('checksum', this.data.NOTE[0]['checksum']);
- var textarea = note.find('textarea');
- var txt = this.data.NOTE[0]['value'];
- var nheight = txt.split('\n').length > 4 ? txt.split('\n').length+2 : 5;
- textarea.css('min-height', nheight+'em');
- textarea.attr('rows', nheight);
- textarea.val(txt);
- $('#contact_note').show();
- textarea.expandingTextarea();
- $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide();
- } else {
- note.removeData('checksum');
- note.find('textarea').val('');
- $('#contact_note').hide();
- $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show();
- }
- var permissions = OC.Contacts.Card.permissions = parseInt($('#contacts ul[data-id="' + bookid + '"]').data('permissions'));
- console.log('permissions', permissions);
- this.setEnabled(permissions == 0
- || permissions & OC.Share.PERMISSION_UPDATE
- || permissions & OC.Share.PERMISSION_DELETE);
- },
- loadSingleProperties:function() {
- var props = ['BDAY', 'NICKNAME', 'ORG', 'URL', '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) {
- var propname = props[prop];
- if(this.data[propname] != undefined) {
- $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().hide();
- var property = this.data[propname][0];
- var value = property['value'], checksum = property['checksum'];
-
- if(propname == 'BDAY') {
- var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10));
- value = $.datepicker.formatDate('dd-mm-yy', val);
- }
- var identcontainer = $('#contact_identity');
- identcontainer.find('#'+propname.toLowerCase()).val(value);
- identcontainer.find('#'+propname.toLowerCase()+'_value').data('checksum', checksum);
- identcontainer.find('#'+propname.toLowerCase()+'_label').show();
- identcontainer.find('#'+propname.toLowerCase()+'_value').show();
- } else {
- $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().show();
- }
- }
- },
- populateNameFields:function() {
- var props = ['FN', 'N'];
- // Clear all elements
- $('#ident .propertycontainer').each(function(){
- if(props.indexOf($(this).data('element')) > -1) {
- $(this).data('checksum', '');
- $(this).find('input').val('');
- }
- });
-
- with(this) {
- delete fn; delete fullname; delete givname; delete famname;
- delete addname; delete honpre; delete honsuf;
- }
-
- if(this.data.FN) {
- this.fn = this.data.FN[0]['value'];
- }
- else {
- this.fn = '';
- }
- if(this.data.N == undefined) {
- narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P
- } 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').val(narray.join(';'));
- $('#fn_select option').remove();
- var names = [this.fn, 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($('<option></option>')
- .text(value));
- });
- $('#fn_select').combobox('value', this.fn);
- $('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']);
- if(this.data.FN) {
- $('#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];
- if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) {
- return true;
- }
- }
- }
- return false;
- },
- categoriesChanged:function(newcategories) { // Categories added/deleted.
- categories = $.map(newcategories, function(v) {return v;});
- $('#categories').multiple_autocomplete('option', 'source', categories);
- var categorylist = $('#categories_value').find('input');
- $.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':OC.Contacts.Card.id},function(jsondata){
- if(jsondata.status == 'success'){
- $('#categories_value').data('checksum', jsondata.data.checksum);
- categorylist.val(jsondata.data.value);
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- },
- 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) {
- if(!$(obj).hasClass('contacts_property')) {
- 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.
- OC.Contacts.loading(obj, true);
- var checksum = container.data('checksum');
- var name = container.data('element');
- var fields = container.find('input.contacts_property,select.contacts_property').serializeArray();
- switch(name) {
- case 'FN':
- var nempty = true;
- for(var i in OC.Contacts.Card.data.N[0]['value']) {
- if(OC.Contacts.Card.data.N[0]['value'][i] != '') {
- nempty = false;
- break;
- }
- }
- if(nempty) {
- $('#n').val(fields[0].value + ';;;;');
- OC.Contacts.Card.data.N[0]['value'] = Array(fields[0].value, '', '', '', '');
- setTimeout(function() {OC.Contacts.Card.saveProperty($('#n'))}, 500);
- }
- break;
- }
- var q = container.find('input.contacts_property,select.contacts_property,textarea.contacts_property').serialize();
- if(q == '' || q == undefined) {
- OC.dialogs.alert(t('contacts', 'Couldn\'t serialize elements.'), t('contacts', 'Error'));
- OC.Contacts.loading(obj, 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(OC.filePath('contacts', 'ajax', 'contact/saveproperty.php'),q,function(jsondata){
- if(!jsondata) {
- OC.dialogs.alert(t('contacts', 'Unknown error. Please check logs.'), t('contacts', 'Error'));
- OC.Contacts.loading(obj, false);
- $(obj).removeAttr('disabled');
- OC.Contacts.Card.update({cid:OC.Contacts.Card.id});
- return false;
- }
- if(jsondata.status == 'success'){
- container.data('checksum', jsondata.data.checksum);
- OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
- OC.Contacts.loading(obj, false);
- $(obj).removeAttr('disabled');
- return true;
- }
- else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- OC.Contacts.loading(obj, false);
- $(obj).removeAttr('disabled');
- OC.Contacts.Card.update({cid:OC.Contacts.Card.id});
- return false;
- }
- },'json');
- } else { // add
- console.log('Adding: ' + q);
- $(obj).attr('disabled', 'disabled');
- $.post(OC.filePath('contacts', 'ajax', 'contact/addproperty.php'),q,function(jsondata){
- if(jsondata.status == 'success'){
- container.data('checksum', jsondata.data.checksum);
- // TODO: savePropertyInternal doesn't know about new fields
- //OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
- OC.Contacts.loading(obj, false);
- $(obj).removeAttr('disabled');
- return true;
- }
- else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- OC.Contacts.loading(obj, false);
- $(obj).removeAttr('disabled');
- OC.Contacts.Card.update({cid:OC.Contacts.Card.id});
- return false;
- }
- },'json');
- }
- },
- addProperty:function(type) {
- if(!this.enabled) {
- return;
- }
- switch (type) {
- case 'NOTE':
- $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide();
- $('#note').find('textarea').expandingTextarea().show().focus();
- $('#contact_note').show();
- break;
- case 'EMAIL':
- if($('#emaillist>li').length == 1) {
- $('#emails').show();
- }
- OC.Contacts.Card.addMail();
- break;
- case 'TEL':
- if($('#phonelist>li').length == 1) {
- $('#phones').show();
- }
- OC.Contacts.Card.addPhone();
- break;
- case 'IMPP':
- if($('#imlist>li').length == 1) {
- $('#ims').show();
- }
- OC.Contacts.Card.addIM();
- break;
- case 'ADR':
- if($('addresses>dl').length == 1) {
- $('#addresses').show();
- }
- OC.Contacts.Card.editAddress('new', true);
- break;
- case 'NICKNAME':
- case 'URL':
- 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_dropdown a[data-type="'+type+'"]').parent().hide();
- break;
- }
- },
- deleteProperty:function(obj, type) {
- console.log('deleteProperty');
- if(!this.enabled) {
- return;
- }
- OC.Contacts.loading(obj, true);
- var checksum = OC.Contacts.checksumFor(obj);
- if(checksum) {
- $.post(OC.filePath('contacts', 'ajax', 'contact/deleteproperty.php'),{'id': this.id, 'checksum': checksum },function(jsondata){
- if(jsondata.status == 'success'){
- if(type == 'list') {
- OC.Contacts.propertyContainerFor(obj).remove();
- } else if(type == 'single') {
- var proptype = OC.Contacts.propertyTypeFor(obj);
- OC.Contacts.Card.data[proptype] = null;
- var othertypes = ['NOTE', 'PHOTO'];
- if(othertypes.indexOf(proptype) != -1) {
- OC.Contacts.propertyContainerFor(obj).data('checksum', '');
- if(proptype == 'PHOTO') {
- OC.Contacts.Contacts.refreshThumbnail(OC.Contacts.Card.id);
- OC.Contacts.Card.loadPhoto();
- } else if(proptype == 'NOTE') {
- $('#note').find('textarea').val('');
- $('#contact_note').hide();
- OC.Contacts.propertyContainerFor(obj).hide();
- }
- } else {
- $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide();
- $('dl dd[data-element="'+proptype+'"]').data('checksum', '').find('input').val('');
- }
- $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show();
- OC.Contacts.loading(obj, false);
- } else {
- OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error'));
- OC.Contacts.loading(obj, false);
- }
- }
- else{
- OC.Contacts.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') {
- OC.Contacts.propertyContainerFor(obj).remove();
- } else if(type == 'single') {
- var proptype = OC.Contacts.propertyTypeFor(obj);
- $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide();
- $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show();
- OC.Contacts.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() {
- if(!this.enabled) {
- return;
- }
- var params = {id: this.id};
- /* Initialize the name edit dialog */
- if($('#edit_name_dialog').dialog('isOpen') == true) {
- $('#edit_name_dialog').dialog('moveToTop');
- } else {
- $.getJSON(OC.filePath('contacts', 'ajax', 'editname.php'),{id: this.id},function(jsondata) {
- if(jsondata.status == 'success') {
- $('body').append('<div id="name_dialog"></div>');
- $('#name_dialog').html(jsondata.data.page).find('#edit_name_dialog' ).dialog({
- modal: true,
- closeOnEscape: true,
- title: t('contacts', 'Edit name'),
- height: 'auto', width: 'auto',
- buttons: {
- 'Ok':function() {
- OC.Contacts.Card.saveName(this);
- $(this).dialog('close');
- },
- 'Cancel':function() { $(this).dialog('close'); }
- },
- close: function(event, ui) {
- $(this).dialog('destroy').remove();
- $('#name_dialog').remove();
- },
- open: function(event, ui) {
- // load 'N' property - maybe :-P
- }
- });
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
- },
- saveName:function(dlg) {
- if(!this.enabled) {
- return;
- }
- //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) {
- if(names.indexOf(tmp[name]) == -1) {
- names.push(tmp[name]);
- }
- }
- $.each(names, function(key, value) {
- $('#fn_select')
- .append($('<option></option>')
- .text(value));
- });
-
- if(this.id == '') {
- var aid = $(dlg).find('#aid').val();
- OC.Contacts.Card.add(n.join(';'), $('#short').text(), aid);
- } else {
- OC.Contacts.Card.saveProperty($('#n'));
- }
- },
- loadAddresses:function() {
- $('#addresses').hide();
- $('#addresses dl.propertycontainer').remove();
- var addresscontainer = $('#addresses');
- for(var adr in this.data.ADR) {
- addresscontainer.find('dl').first().clone().insertAfter($('#addresses dl').last()).show();
- addresscontainer.find('dl').last().removeClass('template').addClass('propertycontainer');
- addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']);
- var adrarray = this.data.ADR[adr]['value'];
- var adrtxt = '';
- if(adrarray[0] && adrarray[0].length > 0) {
- adrtxt = adrtxt + '<li>' + adrarray[0].strip_tags() + '</li>';
- }
- if(adrarray[1] && adrarray[1].length > 0) {
- adrtxt = adrtxt + '<li>' + adrarray[1].strip_tags() + '</li>';
- }
- if(adrarray[2] && adrarray[2].length > 0) {
- adrtxt = adrtxt + '<li>' + adrarray[2].strip_tags() + '</li>';
- }
- if((3 in adrarray && 5 in adrarray) && adrarray[3].length > 0 || adrarray[5].length > 0) {
- adrtxt = adrtxt + '<li>' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '</li>';
- }
- if(adrarray[4] && adrarray[4].length > 0) {
- adrtxt = adrtxt + '<li>' + adrarray[4].strip_tags() + '</li>';
- }
- if(adrarray[6] && adrarray[6].length > 0) {
- adrtxt = adrtxt + '<li>' + adrarray[6].strip_tags() + '</li>';
- }
- addresscontainer.find('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]);
- }
- }
- addresscontainer.find('dl').last().find('.adr_type_label').text(types.join('/'));
- addresscontainer.find('dl').last().find('.adr_type').val(ttypes.join(','));
- addresscontainer.find('dl').last().find('.adr').val(adrarray.join(';'));
- addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']);
- }
- if(addresscontainer.find('dl').length > 1) {
- $('#addresses').show();
- }
- return false;
- },
- editAddress:function(obj, isnew){
- if(!this.enabled) {
- return;
- }
- var container = undefined;
- var params = {id: this.id};
- if(obj === 'new') {
- isnew = true;
- $('#addresses dl').first().clone(true).insertAfter($('#addresses dl').last()).show();
- container = $('#addresses dl').last();
- container.removeClass('template').addClass('propertycontainer');
- } else {
- params['checksum'] = OC.Contacts.checksumFor(obj);
- }
- /* Initialize the address edit dialog */
- if($('#edit_address_dialog').dialog('isOpen') == true){
- $('#edit_address_dialog').dialog('moveToTop');
- }else{
- $.getJSON(OC.filePath('contacts', 'ajax', 'editaddress.php'),params,function(jsondata){
- if(jsondata.status == 'success'){
- $('body').append('<div id="address_dialog"></div>');
- $('#address_dialog').html(jsondata.data.page).find('#edit_address_dialog' ).dialog({
- height: 'auto', width: 'auto',
- buttons: {
- 'Ok':function() {
- if(isnew) {
- OC.Contacts.Card.saveAddress(this, $('#addresses dl:last-child').find('input').first(), isnew);
- } else {
- OC.Contacts.Card.saveAddress(this, obj, isnew);
- }
- $(this).dialog('close');
- },
- 'Cancel':function() {
- $(this).dialog('close');
- if(isnew) {
- container.remove();
- }
- }
- },
- close : function(event, ui) {
- $(this).dialog('destroy').remove();
- $('#address_dialog').remove();
- },
- 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 ) {
- 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);
- }
- },
- 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 ) {
- 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(!this.enabled) {
- return;
- }
- if(isnew) {
- container = $('#addresses dl').last();
- obj = container.find('input').first();
- } else {
- checksum = OC.Contacts.checksumFor(obj);
- container = OC.Contacts.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())));
- OC.Contacts.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(!this.enabled) {
- return;
- }
- if(!filelist) {
- OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error'));
- return;
- }
- 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'){
- OC.Contacts.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() {
- var phototools = $('#phototools');
- phototools.find('li a').tipsy('hide');
- phototools.find('li a').tipsy();
- if(this.data.PHOTO) {
- phototools.find('.delete').click(function() {
- $(this).tipsy('hide');
- OC.Contacts.Card.deleteProperty($('#contacts_details_photo'), 'single');
- $(this).hide();
- });
- phototools.find('.edit').click(function() {
- $(this).tipsy('hide');
- OC.Contacts.Card.editCurrentPhoto();
- });
- phototools.find('.delete').show();
- phototools.find('.edit').show();
- } else {
- phototools.find('.delete').hide();
- phototools.find('.edit').hide();
- }
- },
- cloudPhotoSelected:function(path){
- $.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),{'path':path,'id':OC.Contacts.Card.id},function(jsondata){
- if(jsondata.status == 'success'){
- //alert(jsondata.data.page);
- OC.Contacts.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(){
- var self = this;
- var refreshstr = '&refresh='+Math.random();
- $('#phototools li a').tipsy('hide');
- var wrapper = $('#contacts_details_photo_wrapper');
- wrapper.addClass('loading').addClass('wait');
- delete this.photo;
- this.photo = new Image();
- $(this.photo).load(function () {
- $('img.contacts_details_photo').remove()
- $(this).addClass('contacts_details_photo');
- wrapper.css('width', $(this).get(0).width + 10);
- wrapper.removeClass('loading').removeClass('wait');
- $(this).insertAfter($('#phototools')).fadeIn();
- }).error(function () {
- // notify the user that the image could not be loaded
- OC.Contacts.notify({message:t('contacts','Error loading profile picture.')});
- }).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+self.id+refreshstr);
- this.loadPhotoHandlers()
- },
- editCurrentPhoto:function(){
- if(!this.enabled) {
- return;
- }
- $.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){
- if(jsondata.status == 'success'){
- //alert(jsondata.data.page);
- OC.Contacts.Card.editPhoto(jsondata.data.id, jsondata.data.tmp)
- $('#edit_photo_dialog_img').html(jsondata.data.page);
- }
- else{
- wrapper.removeClass('wait');
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- },
- editPhoto:function(id, tmpkey){
- if(!this.enabled) {
- return;
- }
- //alert('editPhoto: ' + tmpkey);
- $.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmpkey':tmpkey,'id':this.id, 'requesttoken':requesttoken},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() {
- if(!this.enabled) {
- return;
- }
- var target = $('#crop_target');
- var form = $('#cropform');
- var wrapper = $('#contacts_details_photo_wrapper');
- var self = this;
- wrapper.addClass('wait');
- form.submit();
- target.load(function(){
- var response=jQuery.parseJSON(target.contents().text());
- if(response != undefined && response.status == 'success'){
- // load cropped photo.
- self.loadPhoto();
- OC.Contacts.Card.data.PHOTO = true;
- }else{
- OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
- wrapper.removeClass('wait');
- }
- });
- OC.Contacts.Contacts.refreshThumbnail(this.id);
- },
- addIM:function() {
- //alert('addMail');
- var imlist = $('#imlist');
- imlist.find('li.template:first-child').clone(true).appendTo(imlist).show().find('a .tip').tipsy();
- imlist.find('li.template:last-child').find('select').addClass('contacts_property');
- imlist.find('li.template:last-child').removeClass('template').addClass('propertycontainer');
- imlist.find('li:last-child').find('input[type="text"]').focus();
- return false;
- },
- loadIMs:function() {
- //console.log('loadIMs');
- $('#ims').hide();
- $('#imlist li.propertycontainer').remove();
- var imlist = $('#imlist');
- for(var im in this.data.IMPP) {
- this.addIM();
- var curim = imlist.find('li.propertycontainer:last-child');
- if(typeof this.data.IMPP[im].label != 'undefined') {
- curim.prepend('<label class="xab">'+this.data.IMPP[im].label+'</label>');
- }
- curim.data('checksum', this.data.IMPP[im]['checksum'])
- curim.find('input[type="text"]').val(this.data.IMPP[im]['value'].split(':').pop());
- for(var param in this.data.IMPP[im]['parameters']) {
- if(param.toUpperCase() == 'PREF') {
- curim.find('input[type="checkbox"]').attr('checked', 'checked')
- }
- else if(param.toUpperCase() == 'TYPE') {
- if(typeof this.data.IMPP[im]['parameters'][param] == 'string') {
- var found = false;
- var imt = this.data.IMPP[im]['parameters'][param];
- curim.find('select.types option').each(function(){
- if($(this).val().toUpperCase() == imt.toUpperCase()) {
- $(this).attr('selected', 'selected');
- found = true;
- }
- });
- if(!found) {
- curim.find('select.type option:last-child').after('<option value="'+imt+'" selected="selected">'+imt+'</option>');
- }
- } else if(typeof this.data.IMPP[im]['parameters'][param] == 'object') {
- for(imtype in this.data.IMPP[im]['parameters'][param]) {
- var found = false;
- var imt = this.data.IMPP[im]['parameters'][param][imtype];
- curim.find('select.types option').each(function(){
- if($(this).val().toUpperCase() == imt.toUpperCase().split(',')) {
- $(this).attr('selected', 'selected');
- found = true;
- }
- });
- if(!found) {
- curim.find('select.type option:last-child').after('<option value="'+imt+'" selected="selected">'+imt+'</option>');
- }
- }
- }
- }
- else if(param.toUpperCase() == 'X-SERVICE-TYPE') {
- curim.find('select.impp').val(this.data.IMPP[im]['parameters'][param].toLowerCase());
- }
- }
- }
- if($('#imlist li').length > 1) {
- $('#ims').show();
- }
- return false;
- },
- addMail:function() {
- var emaillist = $('#emaillist');
- emaillist.find('li.template:first-child').clone(true).appendTo(emaillist).show().find('a .tip').tipsy();
- emaillist.find('li.template:last-child').find('select').addClass('contacts_property');
- emaillist.find('li.template:last-child').removeClass('template').addClass('propertycontainer');
- emaillist.find('li:last-child').find('input[type="email"]').focus();
- emaillist.find('li:last-child').find('select').multiselect({
- noneSelectedText: t('contacts', 'Select type'),
- header: false,
- selectedList: 4,
- classes: 'typelist'
- });
- return false;
- },
- loadMails:function() {
- $('#emails').hide();
- $('#emaillist li.propertycontainer').remove();
- var emaillist = $('#emaillist');
- for(var mail in this.data.EMAIL) {
- this.addMail();
- emaillist.find('li:last-child').find('select').multiselect('destroy');
- var curemail = emaillist.find('li.propertycontainer:last-child');
- if(typeof this.data.EMAIL[mail].label != 'undefined') {
- curemail.prepend('<label class="xab">'+this.data.EMAIL[mail].label+'</label>');
- }
- curemail.data('checksum', this.data.EMAIL[mail]['checksum'])
- curemail.find('input[type="email"]').val(this.data.EMAIL[mail]['value']);
- for(var param in this.data.EMAIL[mail]['parameters']) {
- if(param.toUpperCase() == 'PREF') {
- curemail.find('input[type="checkbox"]').attr('checked', 'checked')
- }
- else if(param.toUpperCase() == 'TYPE') {
- for(etype in this.data.EMAIL[mail]['parameters'][param]) {
- var found = false;
- var et = this.data.EMAIL[mail]['parameters'][param][etype];
- curemail.find('select option').each(function(){
- if($.inArray($(this).val().toUpperCase(), et.toUpperCase().split(',')) > -1) {
- $(this).attr('selected', 'selected');
- found = true;
- }
- });
- if(!found) {
- curemail.find('select option:last-child').after('<option value="'+et+'" selected="selected">'+et+'</option>');
- }
- }
- }
- }
- curemail.find('select').multiselect({
- noneSelectedText: t('contacts', 'Select type'),
- header: false,
- selectedList: 4,
- classes: 'typelist'
- });
- }
- if($('#emaillist li').length > 1) {
- $('#emails').show();
- }
- $('#emaillist li:last-child').find('input[type="text"]').focus();
- return false;
- },
- addPhone:function() {
- var phonelist = $('#phonelist');
- phonelist.find('li.template:first-child').clone(true).appendTo(phonelist); //.show();
- phonelist.find('li.template:last-child').find('select').addClass('contacts_property');
- phonelist.find('li.template:last-child').removeClass('template').addClass('propertycontainer');
- phonelist.find('li:last-child').find('input[type="text"]').focus();
- phonelist.find('li:last-child').find('select').multiselect({
- noneSelectedText: t('contacts', 'Select type'),
- header: false,
- selectedList: 4,
- classes: 'typelist'
- });
- phonelist.find('li:last-child').show();
- return false;
- },
- loadPhones:function() {
- $('#phones').hide();
- $('#phonelist li.propertycontainer').remove();
- var phonelist = $('#phonelist');
- for(var phone in this.data.TEL) {
- this.addPhone();
- var curphone = phonelist.find('li.propertycontainer:last-child');
- if(typeof this.data.TEL[phone].label != 'undefined') {
- curphone.prepend('<label class="xab">'+this.data.TEL[phone].label+'</label>');
- }
- curphone.find('select').multiselect('destroy');
- curphone.data('checksum', this.data.TEL[phone]['checksum'])
- curphone.find('input[type="text"]').val(this.data.TEL[phone]['value']);
- for(var param in this.data.TEL[phone]['parameters']) {
- if(param.toUpperCase() == 'PREF') {
- curphone.find('input[type="checkbox"]').attr('checked', 'checked');
- }
- else if(param.toUpperCase() == 'TYPE') {
- for(ptype in this.data.TEL[phone]['parameters'][param]) {
- var found = false;
- var pt = this.data.TEL[phone]['parameters'][param][ptype];
- curphone.find('select option').each(function() {
- //if ($(this).val().toUpperCase() == pt.toUpperCase()) {
- if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) {
- $(this).attr('selected', 'selected');
- found = true;
- }
- });
- if(!found) {
- curphone.find('select option:last-child').after('<option class="custom" value="'+pt+'" selected="selected">'+pt+'</option>');
- }
- }
- }
- }
- curphone.find('select').multiselect({
- noneSelectedText: t('contacts', 'Select type'),
- header: false,
- selectedList: 4,
- classes: 'typelist'
- });
- }
- if(phonelist.find('li').length > 1) {
- $('#phones').show();
- }
- return false;
- },
- },
- Contacts:{
- contacts:{},
- deletionQueue:[],
- batchnum:50,
- warnNotDeleted:function(e) {
- e = e || window.event;
- var warn = t('contacts', 'Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted.');
- if (e) {
- e.returnValue = String(warn);
- }
- if(OC.Contacts.Contacts.deletionQueue.length > 0) {
- setTimeout(OC.Contacts.Contacts.deleteFilesInQueue, 1);
- }
- return warn;
- },
- deleteFilesInQueue:function() {
- var queue = OC.Contacts.Contacts.deletionQueue;
- if(queue.length > 0) {
- OC.Contacts.notify({cancel:true});
- while(queue.length > 0) {
- var id = queue.pop();
- if(id) {
- OC.Contacts.Card.doDelete(id, false);
- }
- }
- }
- },
- getContact:function(id) {
- if(!this.contacts[id]) {
- this.contacts[id] = $('#contacts li[data-id="'+id+'"]');
- if(!this.contacts[id]) {
- self = this;
- $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){
- if(jsondata.status == 'success'){
- self.contacts[id] = self.insertContact({data:jsondata.data});
- }
- else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
- }
- return this.contacts[id];
- },
- drop:function(event, ui) {
- var dragitem = ui.draggable, droptarget = $(this);
- if(dragitem.is('li')) {
- OC.Contacts.Contacts.dropContact(event, dragitem, droptarget);
- } else {
- OC.Contacts.Contacts.dropAddressbook(event, dragitem, droptarget);
- }
- },
- dropContact:function(event, dragitem, droptarget) {
- if(dragitem.data('bookid') == droptarget.data('id')) {
- return false;
- }
- var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next();
- $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'),
- {
- id: dragitem.data('id'),
- aid: droptarget.data('id')
- },
- function(jsondata){
- if(jsondata.status == 'success'){
- dragitem.attr('data-bookid', droptarget.data('id'))
- dragitem.data('bookid', droptarget.data('id'));
- OC.Contacts.Contacts.insertContact({
- contactlist:droplist,
- contact:dragitem.detach()
- });
- OC.Contacts.Contacts.scrollTo(dragitem.data('id'));
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- },
- dropAddressbook:function(event, dragitem, droptarget) {
- if(confirm(t('contacts', 'Do you want to merge these address books?'))) {
- if(dragitem.data('bookid') == droptarget.data('id')) {
- return false;
- }
- var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next();
- $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'),
- {
- id: dragitem.data('id'),
- aid: droptarget.data('id'),
- isaddressbook: 1
- },
- function(jsondata){
- if(jsondata.status == 'success'){
- OC.Contacts.Contacts.update(); // Easier to refresh the whole bunch.
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- } else {
- return false;
- }
- },
- /**
- * @params params An object with the properties 'contactlist':a jquery object of the ul to insert into,
- * 'contacts':a jquery object of all items in the list and either 'data': an object with the properties
- * id, addressbookid and displayname or 'contact': a listitem to be inserted directly.
- * If 'contactlist' or 'contacts' aren't defined they will be search for based in the properties in 'data'.
- */
- insertContact:function(params) {
- var id, bookid;
- if(!params.contactlist) {
- // FIXME: Check if contact really exists.
- bookid = params.data ? params.data.addressbookid : params.contact.data('bookid');
- id = params.data ? params.data.id : params.contact.data('id');
- params.contactlist = $('#contacts ul[data-id="'+bookid+'"]');
- }
- if(!params.contacts) {
- bookid = params.data ? params.data.addressbookid : params.contact.data('bookid');
- id = params.data ? params.data.id : params.contact.data('id');
- params.contacts = $('#contacts ul[data-id="'+bookid+'"] li');
- }
- var contact = params.data
- ? $('<li data-id="'+params.data.id+'" data-bookid="'+params.data.addressbookid
- + '" role="button"><a href="'+OC.linkTo('contacts', 'index.php')+'&id='
- + params.data.id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')
- + '?id='+params.data.id+') no-repeat scroll 0% 0% transparent;">'
- + params.data.displayname+'</a></li>')
- : params.contact;
- var added = false;
- var name = params.data ? params.data.displayname.toLowerCase() : contact.find('a').text().toLowerCase();
- if(params.contacts) {
- params.contacts.each(function() {
- if ($(this).text().toLowerCase() > name) {
- $(this).before(contact);
- added = true;
- return false;
- }
- });
- }
- if(!added || !params.contacts) {
- params.contactlist.append(contact);
- }
- //this.contacts[id] = contact;
- return contact;
- },
- addAddressbook:function(name, description, cb) {
- $.post(OC.filePath('contacts', 'ajax/addressbook', 'add.php'), { name: name, description: description, active: true },
- function(jsondata) {
- if(jsondata.status == 'success'){
- if(cb && typeof cb == 'function') {
- cb(jsondata.data.addressbook);
- }
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- return false;
- }
- });
- },
- doImport:function(file, aid){
- $.post(OC.filePath('contacts', '', 'import.php'), { id: aid, file: file, fstype: 'OC_FilesystemView' },
- function(jsondata){
- if(jsondata.status != 'success'){
- OC.Contacts.notify({message:jsondata.data.message});
- }
- });
- return false;
- },
- next:function(reverse) {
- var curlistitem = this.getContact(OC.Contacts.Card.id);
- var newlistitem = reverse ? curlistitem.prev('li') : curlistitem.next('li');
- if(newlistitem) {
- curlistitem.removeClass('active');
- OC.Contacts.Card.update({
- cid:newlistitem.data('id'),
- aid:newlistitem.data('bookid')
- });
- }
- },
- previous:function() {
- this.next(true);
- },
- nextAddressbook:function(reverse) {
- console.log('nextAddressbook', reverse);
- var curlistitem = this.getContact(OC.Contacts.Card.id);
- var parent = curlistitem.parent('ul');
- var newparent = reverse
- ? parent.prevAll('ul').first()
- : parent.nextAll('ul').first();
- if(newparent) {
- newlistitem = newparent.find('li:first-child');
- if(newlistitem) {
- parent.slideUp().prev('h3').removeClass('active');
- newparent.slideDown().prev('h3').addClass('active');
- curlistitem.removeClass('active');
- OC.Contacts.Card.update({
- cid:newlistitem.data('id'),
- aid:newlistitem.data('bookid')
- });
- }
- }
- },
- previousAddressbook:function() {
- console.log('previousAddressbook');
- this.nextAddressbook(true);
- },
- // Reload the contacts list.
- update:function(params){
- if(!params) { params = {}; }
- if(!params.start) {
- if(params.aid) {
- $('#contacts h3[data-id="'+params.aid+'"],#contacts ul[data-id="'+params.aid+'"]').remove();
- } else {
- $('#contacts').empty();
- }
- }
- self = this;
- console.log('update: ' + params.cid + ' ' + params.aid + ' ' + params.start);
- var firstrun = false;
- var opts = {};
- opts['startat'] = (params.start?params.start:0);
- if(params.aid) {
- opts['aid'] = params.aid;
- }
- $.getJSON(OC.filePath('contacts', 'ajax', 'contact/list.php'),opts,function(jsondata){
- if(jsondata.status == 'success'){
- var books = jsondata.data.entries;
- $.each(books, function(b, book) {
- if($('#contacts h3[data-id="'+b+'"]').length == 0) {
- firstrun = true;
- if($('#contacts h3').length == 0) {
- $('#contacts').html('<h3 class="addressbook" contextmenu="addressbookmenu" data-id="'
- + b + '" data-permissions="' + book.permissions + '">' + book.displayname
- + '</h3><ul class="contacts hidden" data-id="'+b+'" data-permissions="'
- + book.permissions + '"></ul>');
- } else {
- if(!$('#contacts h3[data-id="' + b + '"]').length) {
- var item = $('<h3 class="addressbook" contextmenu="addressbookmenu" data-id="'
- + b + '" data-permissions="' + book.permissions + '">'
- + book.displayname+'</h3><ul class="contacts hidden" data-id="' + b
- + '" data-permissions="' + book.permissions + '"></ul>');
- var added = false;
- $('#contacts h3').each(function(){
- if ($(this).text().toLowerCase() > book.displayname.toLowerCase()) {
- $(this).before(item).fadeIn('fast');
- added = true;
- return false;
- }
- });
- if(!added) {
- $('#contacts').append(item);
- }
- }
- }
- $('#contacts h3[data-id="'+b+'"]').on('click', function(event) {
- $('#contacts h3').removeClass('active');
- $(this).addClass('active');
- $('#contacts ul[data-id="'+b+'"]').slideToggle(300);
- return false;
- });
- var accept = 'li:not([data-bookid="'+b+'"]),h3:not([data-id="'+b+'"])';
- $('#contacts h3[data-id="'+b+'"],#contacts ul[data-id="'+b+'"]').droppable({
- drop: OC.Contacts.Contacts.drop,
- activeClass: 'ui-state-hover',
- accept: accept
- });
- }
- var contactlist = $('#contacts ul[data-id="'+b+'"]');
- var contacts = $('#contacts ul[data-id="'+b+'"] li');
- for(var c in book.contacts) {
- if(book.contacts[c].id == undefined) { continue; }
- if(!$('#contacts li[data-id="'+book.contacts[c]['id']+'"]').length) {
- var contact = OC.Contacts.Contacts.insertContact({contactlist:contactlist, contacts:contacts, data:book.contacts[c]});
- if(c == self.batchnum-10) {
- contact.bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
- $(this).unbind(event);
- var bookid = $(this).data('bookid');
- var numsiblings = $('.contacts li[data-bookid="'+bookid+'"]').length;
- if (isInView && numsiblings >= self.batchnum) {
- console.log('This would be a good time to load more contacts.');
- OC.Contacts.Contacts.update({cid:params.cid, aid:bookid, start:$('#contacts li[data-bookid="'+bookid+'"]').length});
- }
- });
- }
- }
- }
- });
- if($('#contacts h3').length > 1) {
- $('#contacts li,#contacts h3').draggable({
- distance: 10,
- revert: 'invalid',
- axis: 'y', containment: '#contacts',
- scroll: true, scrollSensitivity: 40,
- opacity: 0.7, helper: 'clone'
- });
- } else {
- $('#contacts h3').first().addClass('active');
- }
- if(opts['startat'] == 0) { // only update card on first load.
- OC.Contacts.Card.update(params);
- }
- } else {
- OC.Contacts.notify({message:t('contacts', 'Error')+': '+jsondata.data.message});
- }
- });
- },
- refreshThumbnail:function(id){
- var item = $('.contacts li[data-id="'+id+'"]').find('a');
- item.html(OC.Contacts.Card.fn);
- item.css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+id+'&refresh=1'+Math.random()+') no-repeat');
- },
- scrollTo:function(id){
- var item = $('#contacts li[data-id="'+id+'"]');
- if(item && $.isNumeric(item.offset().top)) {
- console.log('scrollTo ' + parseInt(item.offset().top));
- $('#contacts').animate({
- scrollTop: parseInt(item.offset()).top-40}, 'slow','swing');
- }
- }
- }
-}
-$(document).ready(function(){
-
- OCCategories.changed = OC.Contacts.Card.categoriesChanged;
- OCCategories.app = 'contacts';
-
- var ninjahelp = $('#ninjahelp');
-
- $('#bottomcontrols .settings').on('click keydown', function() {
- try {
- ninjahelp.hide();
- OC.appSettings({appid:'contacts', loadJS:true, cache:false});
- } catch(e) {
- console.log('error:', e.message);
- }
- });
- $('#bottomcontrols .import').click(function() {
- $('#import_upload_start').trigger('click');
- });
- $('#contacts_newcontact').on('click keydown', OC.Contacts.Card.editNew);
-
- ninjahelp.find('.close').on('click keydown',function() {
- ninjahelp.hide();
- });
-
- $(document).on('keyup', function(event) {
- if(event.target.nodeName.toUpperCase() != 'BODY'
- || $('#contacts li').length == 0
- || !OC.Contacts.Card.id) {
- return;
- }
- //console.log(event.which + ' ' + event.target.nodeName);
- /**
- * To add:
- * Shift-a: add addressbook
- * u (85): hide/show leftcontent
- * f (70): add field
- */
- switch(event.which) {
- case 27: // Esc
- ninjahelp.hide();
- break;
- case 46: // Delete
- if(event.shiftKey) {
- OC.Contacts.Card.delayedDelete();
- }
- break;
- case 40: // down
- case 74: // j
- OC.Contacts.Contacts.next();
- break;
- case 65: // a
- if(event.shiftKey) {
- // add addressbook
- OC.Contacts.notImplemented();
- break;
- }
- OC.Contacts.Card.editNew();
- break;
- case 38: // up
- case 75: // k
- OC.Contacts.Contacts.previous();
- break;
- case 34: // PageDown
- case 78: // n
- // next addressbook
- OC.Contacts.Contacts.nextAddressbook();
- break;
- case 79: // o
- var aid = $('#contacts h3.active').first().data('id');
- if(aid) {
- $('#contacts ul[data-id="'+aid+'"]').slideToggle(300);
- }
- break;
- case 33: // PageUp
- case 80: // p
- // prev addressbook
- OC.Contacts.Contacts.previousAddressbook();
- break;
- case 82: // r
- OC.Contacts.Contacts.update({cid:OC.Contacts.Card.id});
- break;
- case 191: // ?
- ninjahelp.toggle('fast');
- break;
- }
-
- });
-
- //$(window).on('beforeunload', OC.Contacts.Contacts.deleteFilesInQueue);
-
- // Load a contact.
- $('.contacts').keydown(function(event) {
- if(event.which == 13 || event.which == 32) {
- $('.contacts').click();
- }
- });
- $(document).on('click', '#contacts', function(event){
- var $tgt = $(event.target);
- if ($tgt.is('li') || $tgt.is('a')) {
- var item = $tgt.is('li')?$($tgt):($tgt).parent();
- var id = item.data('id');
- var bookid = item.data('bookid');
- item.addClass('active');
- var oldid = $('#rightcontent').data('id');
- if(oldid != 0){
- var olditem = $('.contacts li[data-id="'+oldid+'"]');
- var oldbookid = olditem.data('bookid');
- olditem.removeClass('active');
- if(oldbookid != bookid) {
- $('#contacts h3[data-id="'+oldbookid+'"]').removeClass('active');
- $('#contacts h3[data-id="'+bookid+'"]').addClass('active');
- }
- }
- $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){
- if(jsondata.status == 'success'){
- OC.Contacts.Card.loadContact(jsondata.data, bookid);
- }
- else{
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
- return false;
- });
-
- $('.contacts_property').live('change', function(){
- OC.Contacts.Card.saveProperty(this);
- });
-
- $(function() {
- // Upload function for dropped contact photos files. Should go in the Contacts class/object.
- $.fileUpload = function(files){
- var file = files[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','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) {
- OC.Contacts.Card.editPhoto(response.data.id, response.data.tmp);
- } else {
- OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error'));
- }
- } else {
- OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
- }
- }
- };
-
- fileUpload.onprogress = function(e){
- if (e.lengthComputable){
- var _progress = Math.round((e.loaded * 100) / e.total);
- //if (_progress != 100){
- //}
- }
- };
- xhr.open('POST', OC.filePath('contacts', 'ajax', 'uploadphoto.php')+'?id='+OC.Contacts.Card.id+'&requesttoken='+requesttoken+'&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-File-Size', file.size);
- xhr.setRequestHeader('Content-Type', file.type);
- xhr.send(file);
- }
- });
-
- $(document).bind('drop dragover', function (e) {
- e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
- });
-
- //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
- if(navigator.userAgent.search(/konqueror/i)==-1){
- $('#import_upload_start').attr('multiple','multiple')
- }
- // Import using jquery.fileupload
- $(function() {
- var uploadingFiles = {}, numfiles = 0, uploadedfiles = 0, retries = 0;
- var aid;
-
- $('#import_upload_start').fileupload({
- dropZone: $('#contacts'), // restrict dropZone to contacts list.
- acceptFileTypes: /^text\/(directory|vcard|x-vcard)$/i,
- add: function(e, data) {
- var files = data.files;
- var totalSize=0;
- if(files) {
- numfiles += files.length; uploadedfiles = 0;
- for(var i=0;i<files.length;i++) {
- if(files[i].size ==0 && files[i].type== '') {
- OC.dialogs.alert(t('files', 'Unable to upload your file as it is a directory or has 0 bytes'), t('files', 'Upload Error'));
- return;
- }
- totalSize+=files[i].size;
- }
- }
- if(totalSize>$('#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'));
- numfiles = uploadedfiles = retries = aid = 0;
- uploadingFiles = {};
- return;
- }else{
- if($.support.xhrFileUpload) {
- for(var i=0;i<files.length;i++){
- var fileName = files[i].name;
- var dropTarget;
- if($(e.originalEvent.target).is('h3')) {
- dropTarget = $(e.originalEvent.target).next('ul');
- } else {
- dropTarget = $(e.originalEvent.target).closest('ul');
- }
- if(dropTarget && dropTarget.hasClass('contacts')) { // TODO: More thorough check for where we are.
- aid = dropTarget.attr('data-id');
- } else {
- aid = undefined;
- }
- var jqXHR = $('#import_upload_start').fileupload('send', {files: files[i],
- formData: function(form) {
- var formArray = form.serializeArray();
- formArray['aid'] = aid;
- return formArray;
- }})
- .success(function(result, textStatus, jqXHR) {
- if(result.status == 'success') {
- // import the file
- uploadedfiles += 1;
- } else {
- OC.Contacts.notify({message:jsondata.data.message});
- }
- return false;
- })
- .error(function(jqXHR, textStatus, errorThrown) {
- console.log(textStatus);
- OC.Contacts.notify({message:errorThrown + ': ' + textStatus,});
- });
- uploadingFiles[fileName] = jqXHR;
- }
- } else {
- data.submit().success(function(data, status) {
- response = jQuery.parseJSON(data[0].body.innerText);
- if(response[0] != undefined && response[0].status == 'success') {
- var file=response[0];
- delete uploadingFiles[file.name];
- $('tr').filterAttr('data-file',file.name).data('mime',file.mime);
- var size = $('tr').filterAttr('data-file',file.name).find('td.filesize').text();
- if(size==t('files','Pending')){
- $('tr').filterAttr('data-file',file.name).find('td.filesize').text(file.size);
- }
- FileList.loadingDone(file.name);
- } else {
- OC.Contacts.notify({message:response.data.message});
- }
- });
- }
- }
- },
- fail: function(e, data) {
- console.log('fail');
- OC.Contacts.notify({message:data.errorThrown + ': ' + data.textStatus});
- // TODO: Remove file from upload queue.
- },
- progressall: function(e, data) {
- var progress = (data.loaded/data.total)*50;
- $('#uploadprogressbar').progressbar('value',progress);
- },
- start: function(e, data) {
- $('#uploadprogressbar').progressbar({value:0});
- $('#uploadprogressbar').fadeIn();
- if(data.dataType != 'iframe ') {
- $('#upload input.stop').show();
- }
- },
- stop: function(e, data) {
- // stop only gets fired once so we collect uploaded items here.
- var importFiles = function(aid, fileList) {
- // Create a closure that can be called from different places.
- if(numfiles != uploadedfiles) {
- OC.Contacts.notify({message:t('contacts', 'Not all files uploaded. Retrying...')});
- retries += 1;
- if(retries > 3) {
- numfiles = uploadedfiles = retries = aid = 0;
- uploadingFiles = {};
- $('#uploadprogressbar').fadeOut();
- OC.dialogs.alert(t('contacts', 'Something went wrong with the upload, please retry.'), t('contacts', 'Error'));
- return;
- }
- setTimeout(function() { // Just to let any uploads finish
- importFiles(aid, uploadingFiles);
- }, 1000);
- }
- $('#uploadprogressbar').progressbar('value',50);
- var todo = uploadedfiles;
- $.each(fileList, function(fileName, data) {
- OC.Contacts.Contacts.doImport(fileName, aid);
- delete fileList[fileName];
- numfiles -= 1; uploadedfiles -= 1;
- $('#uploadprogressbar').progressbar('value',50+(50/(todo-uploadedfiles)));
- })
- $('#uploadprogressbar').progressbar('value',100);
- $('#uploadprogressbar').fadeOut();
- setTimeout(function() {
- OC.Contacts.Contacts.update({aid:aid});
- numfiles = uploadedfiles = retries = aid = 0;
- }, 1000);
- }
- if(!aid) {
- // Either selected with filepicker or dropped outside of an address book.
- $.getJSON(OC.filePath('contacts', 'ajax', 'selectaddressbook.php'),{},function(jsondata) {
- if(jsondata.status == 'success') {
- if($('#selectaddressbook_dialog').dialog('isOpen') == true) {
- $('#selectaddressbook_dialog').dialog('moveToTop');
- } else {
- $('#dialog_holder').html(jsondata.data.page).ready(function($) {
- var select_dlg = $('#selectaddressbook_dialog');
- select_dlg.dialog({
- modal: true, height: 'auto', width: 'auto',
- buttons: {
- 'Ok':function() {
- aid = select_dlg.find('input:checked').val();
- if(aid == 'new') {
- var displayname = select_dlg.find('input.name').val();
- var description = select_dlg.find('input.desc').val();
- if(!displayname.trim()) {
- OC.dialogs.alert(t('contacts', 'The address book name cannot be empty.'), t('contacts', 'Error'));
- return false;
- }
- $(this).dialog('close');
- OC.Contacts.Contacts.addAddressbook(displayname, description, function(addressbook) {
- aid = addressbook.id;
- setTimeout(function() {
- importFiles(aid, uploadingFiles);
- }, 500);
- console.log('aid ' + aid);
- });
- } else {
- setTimeout(function() {
- importFiles(aid, uploadingFiles);
- }, 500);
- console.log('aid ' + aid);
- $(this).dialog('close');
- }
- },
- 'Cancel':function() {
- $(this).dialog('close');
- numfiles = uploadedfiles = retries = aid = 0;
- uploadingFiles = {};
- $('#uploadprogressbar').fadeOut();
- }
- },
- close: function(event, ui) {
- // TODO: If numfiles != 0 delete tmp files after a timeout.
- $(this).dialog('destroy').remove();
- }
- });
- });
- }
- } else {
- $('#uploadprogressbar').fadeOut();
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- } else {
- // Dropped on an address book or it's list.
- setTimeout(function() { // Just to let any uploads finish
- importFiles(aid, uploadingFiles);
- }, 1000);
- }
- if(data.dataType != 'iframe ') {
- $('#upload input.stop').hide();
- }
- }
- })
- });
-
- OC.Contacts.loadHandlers();
- OC.Contacts.Contacts.update({cid:id});
-});
diff --git a/apps/contacts/js/expanding.js b/apps/contacts/js/expanding.js
deleted file mode 100644
index 17139f27fff..00000000000
--- a/apps/contacts/js/expanding.js
+++ /dev/null
@@ -1,118 +0,0 @@
-// Expanding Textareas
-// https://github.com/bgrins/ExpandingTextareas
-
-(function(factory) {
- // Add jQuery via AMD registration or browser globals
- if (typeof define === 'function' && define.amd) {
- define([ 'jquery' ], factory);
- }
- else {
- factory(jQuery);
- }
-}(function ($) {
- $.expandingTextarea = $.extend({
- autoInitialize: true,
- initialSelector: "textarea.expanding",
- opts: {
- resize: function() { }
- }
- }, $.expandingTextarea || {});
-
- var cloneCSSProperties = [
- 'lineHeight', 'textDecoration', 'letterSpacing',
- 'fontSize', 'fontFamily', 'fontStyle',
- 'fontWeight', 'textTransform', 'textAlign',
- 'direction', 'wordSpacing', 'fontSizeAdjust',
- 'wordWrap',
- 'borderLeftWidth', 'borderRightWidth',
- 'borderTopWidth','borderBottomWidth',
- 'paddingLeft', 'paddingRight',
- 'paddingTop','paddingBottom',
- 'marginLeft', 'marginRight',
- 'marginTop','marginBottom',
- 'boxSizing', 'webkitBoxSizing', 'mozBoxSizing', 'msBoxSizing'
- ];
-
- var textareaCSS = {
- position: "absolute",
- height: "100%",
- resize: "none"
- };
-
- var preCSS = {
- visibility: "hidden",
- border: "0 solid",
- whiteSpace: "pre-wrap"
- };
-
- var containerCSS = {
- position: "relative"
- };
-
- function resize() {
- $(this).closest('.expandingText').find("div").text(this.value + ' ');
- $(this).trigger("resize.expanding");
- }
-
- $.fn.expandingTextarea = function(o) {
-
- var opts = $.extend({ }, $.expandingTextarea.opts, o);
-
- if (o === "resize") {
- return this.trigger("input.expanding");
- }
-
- if (o === "destroy") {
- this.filter(".expanding-init").each(function() {
- var textarea = $(this).removeClass('expanding-init');
- var container = textarea.closest('.expandingText');
-
- container.before(textarea).remove();
- textarea
- .attr('style', textarea.data('expanding-styles') || '')
- .removeData('expanding-styles');
- });
-
- return this;
- }
-
- this.filter("textarea").not(".expanding-init").addClass("expanding-init").each(function() {
- var textarea = $(this);
-
- textarea.wrap("<div class='expandingText'></div>");
- textarea.after("<pre class='textareaClone'><div></div></pre>");
-
- var container = textarea.parent().css(containerCSS);
- var pre = container.find("pre").css(preCSS);
-
- // Store the original styles in case of destroying.
- textarea.data('expanding-styles', textarea.attr('style'));
- textarea.css(textareaCSS);
-
- $.each(cloneCSSProperties, function(i, p) {
- var val = textarea.css(p);
-
- // Only set if different to prevent overriding percentage css values.
- if (pre.css(p) !== val) {
- pre.css(p, val);
- }
- });
-
- textarea.bind("input.expanding propertychange.expanding", resize);
- resize.apply(this);
-
- if (opts.resize) {
- textarea.bind("resize.expanding", opts.resize);
- }
- });
-
- return this;
- };
-
- $(function () {
- if ($.expandingTextarea.autoInitialize) {
- $($.expandingTextarea.initialSelector).expandingTextarea();
- }
- });
-
-}));
diff --git a/apps/contacts/js/jquery.Jcrop.js b/apps/contacts/js/jquery.Jcrop.js
deleted file mode 100644
index 36f9a0f08f8..00000000000
--- a/apps/contacts/js/jquery.Jcrop.js
+++ /dev/null
@@ -1,1765 +0,0 @@
-/**
- * jquery.Jcrop.js v0.9.9 {{{
- *
- * jQuery Image Cropping Plugin - released under MIT License
- * Author: Kelly Hallman <khallman@gmail.com>
- * http://github.com/tapmodo/Jcrop
- *
- * }}}
- * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * }}}
- */
-
-(function ($) {
-
- $.Jcrop = function (obj, opt) {
- var options = $.extend({}, $.Jcrop.defaults),
- docOffset, lastcurs, ie6mode = false;
-
- // Internal Methods {{{
- function px(n) {
- return parseInt(n, 10) + 'px';
- }
- function cssClass(cl) {
- return options.baseClass + '-' + cl;
- }
- function supportsColorFade() {
- return $.fx.step.hasOwnProperty('backgroundColor');
- }
- function getPos(obj) //{{{
- {
- var pos = $(obj).offset();
- return [pos.left, pos.top];
- }
- //}}}
- function mouseAbs(e) //{{{
- {
- return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])];
- }
- //}}}
- function setOptions(opt) //{{{
- {
- if (typeof(opt) !== 'object') opt = {};
- options = $.extend(options, opt);
-
- $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) {
- if (typeof(options[e]) !== 'function') options[e] = function () {};
- });
- }
- //}}}
- function startDragMode(mode, pos) //{{{
- {
- docOffset = getPos($img);
- Tracker.setCursor(mode === 'move' ? mode : mode + '-resize');
-
- if (mode === 'move') {
- return Tracker.activateHandlers(createMover(pos), doneSelect);
- }
-
- var fc = Coords.getFixed();
- var opp = oppLockCorner(mode);
- var opc = Coords.getCorner(oppLockCorner(opp));
-
- Coords.setPressed(Coords.getCorner(opp));
- Coords.setCurrent(opc);
-
- Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect);
- }
- //}}}
- function dragmodeHandler(mode, f) //{{{
- {
- return function (pos) {
- if (!options.aspectRatio) {
- switch (mode) {
- case 'e':
- pos[1] = f.y2;
- break;
- case 'w':
- pos[1] = f.y2;
- break;
- case 'n':
- pos[0] = f.x2;
- break;
- case 's':
- pos[0] = f.x2;
- break;
- }
- } else {
- switch (mode) {
- case 'e':
- pos[1] = f.y + 1;
- break;
- case 'w':
- pos[1] = f.y + 1;
- break;
- case 'n':
- pos[0] = f.x + 1;
- break;
- case 's':
- pos[0] = f.x + 1;
- break;
- }
- }
- Coords.setCurrent(pos);
- Selection.update();
- };
- }
- //}}}
- function createMover(pos) //{{{
- {
- var lloc = pos;
- KeyManager.watchKeys();
-
- return function (pos) {
- Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
- lloc = pos;
-
- Selection.update();
- };
- }
- //}}}
- function oppLockCorner(ord) //{{{
- {
- switch (ord) {
- case 'n':
- return 'sw';
- case 's':
- return 'nw';
- case 'e':
- return 'nw';
- case 'w':
- return 'ne';
- case 'ne':
- return 'sw';
- case 'nw':
- return 'se';
- case 'se':
- return 'nw';
- case 'sw':
- return 'ne';
- }
- }
- //}}}
- function createDragger(ord) //{{{
- {
- return function (e) {
- if (options.disabled) {
- return false;
- }
- if ((ord === 'move') && !options.allowMove) {
- return false;
- }
-
- // Fix position of crop area when dragged the very first time.
- // Necessary when crop image is in a hidden element when page is loaded.
- docOffset = getPos($img);
-
- btndown = true;
- startDragMode(ord, mouseAbs(e));
- e.stopPropagation();
- e.preventDefault();
- return false;
- };
- }
- //}}}
- function presize($obj, w, h) //{{{
- {
- var nw = $obj.width(),
- nh = $obj.height();
- if ((nw > w) && w > 0) {
- nw = w;
- nh = (w / $obj.width()) * $obj.height();
- }
- if ((nh > h) && h > 0) {
- nh = h;
- nw = (h / $obj.height()) * $obj.width();
- }
- xscale = $obj.width() / nw;
- yscale = $obj.height() / nh;
- $obj.width(nw).height(nh);
- }
- //}}}
- function unscale(c) //{{{
- {
- return {
- x: parseInt(c.x * xscale, 10),
- y: parseInt(c.y * yscale, 10),
- x2: parseInt(c.x2 * xscale, 10),
- y2: parseInt(c.y2 * yscale, 10),
- w: parseInt(c.w * xscale, 10),
- h: parseInt(c.h * yscale, 10)
- };
- }
- //}}}
- function doneSelect(pos) //{{{
- {
- var c = Coords.getFixed();
- if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) {
- Selection.enableHandles();
- Selection.done();
- } else {
- Selection.release();
- }
- Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');
- }
- //}}}
- function newSelection(e) //{{{
- {
- if (options.disabled) {
- return false;
- }
- if (!options.allowSelect) {
- return false;
- }
- btndown = true;
- docOffset = getPos($img);
- Selection.disableHandles();
- Tracker.setCursor('crosshair');
- var pos = mouseAbs(e);
- Coords.setPressed(pos);
- Selection.update();
- Tracker.activateHandlers(selectDrag, doneSelect);
- KeyManager.watchKeys();
-
- e.stopPropagation();
- e.preventDefault();
- return false;
- }
- //}}}
- function selectDrag(pos) //{{{
- {
- Coords.setCurrent(pos);
- Selection.update();
- }
- //}}}
- function newTracker() //{{{
- {
- var trk = $('<div></div>').addClass(cssClass('tracker'));
- if ($.browser.msie) {
- trk.css({
- opacity: 0,
- backgroundColor: 'white'
- });
- }
- return trk;
- }
- //}}}
-
- // }}}
- // Initialization {{{
- // Sanitize some options {{{
- if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) {
- ie6mode = true;
- }
- if (typeof(obj) !== 'object') {
- obj = $(obj)[0];
- }
- if (typeof(opt) !== 'object') {
- opt = {};
- }
- // }}}
- setOptions(opt);
- // Initialize some jQuery objects {{{
- // The values are SET on the image(s) for the interface
- // If the original image has any of these set, they will be reset
- // However, if you destroy() the Jcrop instance the original image's
- // character in the DOM will be as you left it.
- var img_css = {
- border: 'none',
- visibility: 'visible',
- margin: 0,
- padding: 0,
- position: 'absolute',
- top: 0,
- left: 0
- };
-
- var $origimg = $(obj),
- img_mode = true;
-
- if (obj.tagName == 'IMG') {
- // Fix size of crop image.
- // Necessary when crop image is within a hidden element when page is loaded.
- if ($origimg[0].width != 0 && $origimg[0].height != 0) {
- // Obtain dimensions from contained img element.
- $origimg.width($origimg[0].width);
- $origimg.height($origimg[0].height);
- } else {
- // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0).
- var tempImage = new Image();
- tempImage.src = $origimg[0].src;
- $origimg.width(tempImage.width);
- $origimg.height(tempImage.height);
- }
-
- var $img = $origimg.clone().removeAttr('id').css(img_css).show();
-
- $img.width($origimg.width());
- $img.height($origimg.height());
- $origimg.after($img).hide();
-
- } else {
- $img = $origimg.css(img_css).show();
- img_mode = false;
- if (options.shade === null) { options.shade = true; }
- }
-
- presize($img, options.boxWidth, options.boxHeight);
-
- var boundx = $img.width(),
- boundy = $img.height(),
-
-
- $div = $('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({
- position: 'relative',
- backgroundColor: options.bgColor
- }).insertAfter($origimg).append($img);
-
- if (options.addClass) {
- $div.addClass(options.addClass);
- }
-
- var $img2 = $('<div />'),
-
- $img_holder = $('<div />')
- .width('100%').height('100%').css({
- zIndex: 310,
- position: 'absolute',
- overflow: 'hidden'
- }),
-
- $hdl_holder = $('<div />')
- .width('100%').height('100%').css('zIndex', 320),
-
- $sel = $('<div />')
- .css({
- position: 'absolute',
- zIndex: 600
- }).dblclick(function(){
- var c = Coords.getFixed();
- options.onDblClick.call(api,c);
- }).insertBefore($img).append($img_holder, $hdl_holder);
-
- if (img_mode) {
-
- $img2 = $('<img />')
- .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy),
-
- $img_holder.append($img2);
-
- }
-
- if (ie6mode) {
- $sel.css({
- overflowY: 'hidden'
- });
- }
-
- var bound = options.boundary;
- var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({
- position: 'absolute',
- top: px(-bound),
- left: px(-bound),
- zIndex: 290
- }).mousedown(newSelection);
-
- /* }}} */
- // Set more variables {{{
- var bgcolor = options.bgColor,
- bgopacity = options.bgOpacity,
- xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true,
- btndown, animating, shift_down;
-
- docOffset = getPos($img);
- // }}}
- // }}}
- // Internal Modules {{{
- // Touch Module {{{
- var Touch = (function () {
- // Touch support detection function adapted (under MIT License)
- // from code by Jeffrey Sambells - http://github.com/iamamused/
- function hasTouchSupport() {
- var support = {},
- events = ['touchstart', 'touchmove', 'touchend'],
- el = document.createElement('div'), i;
-
- try {
- for(i=0; i<events.length; i++) {
- var eventName = events[i];
- eventName = 'on' + eventName;
- var isSupported = (eventName in el);
- if (!isSupported) {
- el.setAttribute(eventName, 'return;');
- isSupported = typeof el[eventName] == 'function';
- }
- support[events[i]] = isSupported;
- }
- return support.touchstart && support.touchend && support.touchmove;
- }
- catch(err) {
- return false;
- }
- }
-
- function detectSupport() {
- if ((options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport;
- else return hasTouchSupport();
- }
- return {
- createDragger: function (ord) {
- return function (e) {
- e.pageX = e.originalEvent.changedTouches[0].pageX;
- e.pageY = e.originalEvent.changedTouches[0].pageY;
- if (options.disabled) {
- return false;
- }
- if ((ord === 'move') && !options.allowMove) {
- return false;
- }
- btndown = true;
- startDragMode(ord, mouseAbs(e));
- e.stopPropagation();
- e.preventDefault();
- return false;
- };
- },
- newSelection: function (e) {
- e.pageX = e.originalEvent.changedTouches[0].pageX;
- e.pageY = e.originalEvent.changedTouches[0].pageY;
- return newSelection(e);
- },
- isSupported: hasTouchSupport,
- support: detectSupport()
- };
- }());
- // }}}
- // Coords Module {{{
- var Coords = (function () {
- var x1 = 0,
- y1 = 0,
- x2 = 0,
- y2 = 0,
- ox, oy;
-
- function setPressed(pos) //{{{
- {
- pos = rebound(pos);
- x2 = x1 = pos[0];
- y2 = y1 = pos[1];
- }
- //}}}
- function setCurrent(pos) //{{{
- {
- pos = rebound(pos);
- ox = pos[0] - x2;
- oy = pos[1] - y2;
- x2 = pos[0];
- y2 = pos[1];
- }
- //}}}
- function getOffset() //{{{
- {
- return [ox, oy];
- }
- //}}}
- function moveOffset(offset) //{{{
- {
- var ox = offset[0],
- oy = offset[1];
-
- if (0 > x1 + ox) {
- ox -= ox + x1;
- }
- if (0 > y1 + oy) {
- oy -= oy + y1;
- }
-
- if (boundy < y2 + oy) {
- oy += boundy - (y2 + oy);
- }
- if (boundx < x2 + ox) {
- ox += boundx - (x2 + ox);
- }
-
- x1 += ox;
- x2 += ox;
- y1 += oy;
- y2 += oy;
- }
- //}}}
- function getCorner(ord) //{{{
- {
- var c = getFixed();
- switch (ord) {
- case 'ne':
- return [c.x2, c.y];
- case 'nw':
- return [c.x, c.y];
- case 'se':
- return [c.x2, c.y2];
- case 'sw':
- return [c.x, c.y2];
- }
- }
- //}}}
- function getFixed() //{{{
- {
- if (!options.aspectRatio) {
- return getRect();
- }
- // This function could use some optimization I think...
- var aspect = options.aspectRatio,
- min_x = options.minSize[0] / xscale,
-
-
- //min_y = options.minSize[1]/yscale,
- max_x = options.maxSize[0] / xscale,
- max_y = options.maxSize[1] / yscale,
- rw = x2 - x1,
- rh = y2 - y1,
- rwa = Math.abs(rw),
- rha = Math.abs(rh),
- real_ratio = rwa / rha,
- xx, yy, w, h;
-
- if (max_x === 0) {
- max_x = boundx * 10;
- }
- if (max_y === 0) {
- max_y = boundy * 10;
- }
- if (real_ratio < aspect) {
- yy = y2;
- w = rha * aspect;
- xx = rw < 0 ? x1 - w : w + x1;
-
- if (xx < 0) {
- xx = 0;
- h = Math.abs((xx - x1) / aspect);
- yy = rh < 0 ? y1 - h : h + y1;
- } else if (xx > boundx) {
- xx = boundx;
- h = Math.abs((xx - x1) / aspect);
- yy = rh < 0 ? y1 - h : h + y1;
- }
- } else {
- xx = x2;
- h = rwa / aspect;
- yy = rh < 0 ? y1 - h : y1 + h;
- if (yy < 0) {
- yy = 0;
- w = Math.abs((yy - y1) * aspect);
- xx = rw < 0 ? x1 - w : w + x1;
- } else if (yy > boundy) {
- yy = boundy;
- w = Math.abs(yy - y1) * aspect;
- xx = rw < 0 ? x1 - w : w + x1;
- }
- }
-
- // Magic %-)
- if (xx > x1) { // right side
- if (xx - x1 < min_x) {
- xx = x1 + min_x;
- } else if (xx - x1 > max_x) {
- xx = x1 + max_x;
- }
- if (yy > y1) {
- yy = y1 + (xx - x1) / aspect;
- } else {
- yy = y1 - (xx - x1) / aspect;
- }
- } else if (xx < x1) { // left side
- if (x1 - xx < min_x) {
- xx = x1 - min_x;
- } else if (x1 - xx > max_x) {
- xx = x1 - max_x;
- }
- if (yy > y1) {
- yy = y1 + (x1 - xx) / aspect;
- } else {
- yy = y1 - (x1 - xx) / aspect;
- }
- }
-
- if (xx < 0) {
- x1 -= xx;
- xx = 0;
- } else if (xx > boundx) {
- x1 -= xx - boundx;
- xx = boundx;
- }
-
- if (yy < 0) {
- y1 -= yy;
- yy = 0;
- } else if (yy > boundy) {
- y1 -= yy - boundy;
- yy = boundy;
- }
-
- return makeObj(flipCoords(x1, y1, xx, yy));
- }
- //}}}
- function rebound(p) //{{{
- {
- if (p[0] < 0) {
- p[0] = 0;
- }
- if (p[1] < 0) {
- p[1] = 0;
- }
-
- if (p[0] > boundx) {
- p[0] = boundx;
- }
- if (p[1] > boundy) {
- p[1] = boundy;
- }
-
- return [p[0], p[1]];
- }
- //}}}
- function flipCoords(x1, y1, x2, y2) //{{{
- {
- var xa = x1,
- xb = x2,
- ya = y1,
- yb = y2;
- if (x2 < x1) {
- xa = x2;
- xb = x1;
- }
- if (y2 < y1) {
- ya = y2;
- yb = y1;
- }
- return [Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb)];
- }
- //}}}
- function getRect() //{{{
- {
- var xsize = x2 - x1,
- ysize = y2 - y1,
- delta;
-
- if (xlimit && (Math.abs(xsize) > xlimit)) {
- x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit);
- }
- if (ylimit && (Math.abs(ysize) > ylimit)) {
- y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit);
- }
-
- if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) {
- y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale);
- }
- if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) {
- x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale);
- }
-
- if (x1 < 0) {
- x2 -= x1;
- x1 -= x1;
- }
- if (y1 < 0) {
- y2 -= y1;
- y1 -= y1;
- }
- if (x2 < 0) {
- x1 -= x2;
- x2 -= x2;
- }
- if (y2 < 0) {
- y1 -= y2;
- y2 -= y2;
- }
- if (x2 > boundx) {
- delta = x2 - boundx;
- x1 -= delta;
- x2 -= delta;
- }
- if (y2 > boundy) {
- delta = y2 - boundy;
- y1 -= delta;
- y2 -= delta;
- }
- if (x1 > boundx) {
- delta = x1 - boundy;
- y2 -= delta;
- y1 -= delta;
- }
- if (y1 > boundy) {
- delta = y1 - boundy;
- y2 -= delta;
- y1 -= delta;
- }
-
- return makeObj(flipCoords(x1, y1, x2, y2));
- }
- //}}}
- function makeObj(a) //{{{
- {
- return {
- x: a[0],
- y: a[1],
- x2: a[2],
- y2: a[3],
- w: a[2] - a[0],
- h: a[3] - a[1]
- };
- }
- //}}}
-
- return {
- flipCoords: flipCoords,
- setPressed: setPressed,
- setCurrent: setCurrent,
- getOffset: getOffset,
- moveOffset: moveOffset,
- getCorner: getCorner,
- getFixed: getFixed
- };
- }());
-
- //}}}
- // Shade Module {{{
- var Shade = (function() {
- var enabled = false,
- holder = $('<div />').css({
- position: 'absolute',
- zIndex: 240,
- opacity: 0
- }),
- shades = {
- top: createShade(),
- left: createShade().height(boundy),
- right: createShade().height(boundy),
- bottom: createShade()
- };
-
- function resizeShades(w,h) {
- shades.left.css({ height: px(h) });
- shades.right.css({ height: px(h) });
- }
- function updateAuto()
- {
- return updateShade(Coords.getFixed());
- }
- function updateShade(c)
- {
- shades.top.css({
- left: px(c.x),
- width: px(c.w),
- height: px(c.y)
- });
- shades.bottom.css({
- top: px(c.y2),
- left: px(c.x),
- width: px(c.w),
- height: px(boundy-c.y2)
- });
- shades.right.css({
- left: px(c.x2),
- width: px(boundx-c.x2)
- });
- shades.left.css({
- width: px(c.x)
- });
- }
- function createShade() {
- return $('<div />').css({
- position: 'absolute',
- backgroundColor: options.shadeColor||options.bgColor
- }).appendTo(holder);
- }
- function enableShade() {
- if (!enabled) {
- enabled = true;
- holder.insertBefore($img);
- updateAuto();
- Selection.setBgOpacity(1,0,1);
- $img2.hide();
-
- setBgColor(options.shadeColor||options.bgColor,1);
- if (Selection.isAwake())
- {
- setOpacity(options.bgOpacity,1);
- }
- else setOpacity(1,1);
- }
- }
- function setBgColor(color,now) {
- colorChangeMacro(getShades(),color,now);
- }
- function disableShade() {
- if (enabled) {
- holder.remove();
- $img2.show();
- enabled = false;
- if (Selection.isAwake()) {
- Selection.setBgOpacity(options.bgOpacity,1,1);
- } else {
- Selection.setBgOpacity(1,1,1);
- Selection.disableHandles();
- }
- colorChangeMacro($div,0,1);
- }
- }
- function setOpacity(opacity,now) {
- if (enabled) {
- if (options.bgFade && !now) {
- holder.animate({
- opacity: 1-opacity
- },{
- queue: false,
- duration: options.fadeTime
- });
- }
- else holder.css({opacity:1-opacity});
- }
- }
- function refreshAll() {
- options.shade ? enableShade() : disableShade();
- if (Selection.isAwake()) setOpacity(options.bgOpacity);
- }
- function getShades() {
- return holder.children();
- }
-
- return {
- update: updateAuto,
- updateRaw: updateShade,
- getShades: getShades,
- setBgColor: setBgColor,
- enable: enableShade,
- disable: disableShade,
- resize: resizeShades,
- refresh: refreshAll,
- opacity: setOpacity
- };
- }());
- // }}}
- // Selection Module {{{
- var Selection = (function () {
- var awake, hdep = 370;
- var borders = {};
- var handle = {};
- var seehandles = false;
- var hhs = options.handleOffset;
-
- // Private Methods
- function insertBorder(type) //{{{
- {
- var jq = $('<div />').css({
- position: 'absolute',
- opacity: options.borderOpacity
- }).addClass(cssClass(type));
- $img_holder.append(jq);
- return jq;
- }
- //}}}
- function dragDiv(ord, zi) //{{{
- {
- var jq = $('<div />').mousedown(createDragger(ord)).css({
- cursor: ord + '-resize',
- position: 'absolute',
- zIndex: zi
- }).addClass('ord-'+ord);
-
- if (Touch.support) {
- jq.bind('touchstart.jcrop', Touch.createDragger(ord));
- }
-
- $hdl_holder.append(jq);
- return jq;
- }
- //}}}
- function insertHandle(ord) //{{{
- {
- var hs = options.handleSize;
- return dragDiv(ord, hdep++).css({
- top: px(-hhs + 1),
- left: px(-hhs + 1),
- opacity: options.handleOpacity
- }).width(hs).height(hs).addClass(cssClass('handle'));
- }
- //}}}
- function insertDragbar(ord) //{{{
- {
- var s = options.handleSize,
- h = s,
- w = s,
- t = hhs,
- l = hhs;
-
- switch (ord) {
- case 'n':
- case 's':
- w = '100%';
- break;
- case 'e':
- case 'w':
- h = '100%';
- break;
- }
-
- return dragDiv(ord, hdep++).width(w).height(h).css({
- top: px(-t + 1),
- left: px(-l + 1)
- });
- }
- //}}}
- function createHandles(li) //{{{
- {
- var i;
- for (i = 0; i < li.length; i++) {
- handle[li[i]] = insertHandle(li[i]);
- }
- }
- //}}}
- function moveHandles(c) //{{{
- {
- var midvert = Math.round((c.h / 2) - hhs),
- midhoriz = Math.round((c.w / 2) - hhs),
- north = -hhs + 1,
- west = -hhs + 1,
- east = c.w - hhs,
- south = c.h - hhs,
- x, y;
-
- if (handle.e) {
- handle.e.css({
- top: px(midvert),
- left: px(east)
- });
- handle.w.css({
- top: px(midvert)
- });
- handle.s.css({
- top: px(south),
- left: px(midhoriz)
- });
- handle.n.css({
- left: px(midhoriz)
- });
- }
- if (handle.ne) {
- handle.ne.css({
- left: px(east)
- });
- handle.se.css({
- top: px(south),
- left: px(east)
- });
- handle.sw.css({
- top: px(south)
- });
- }
- if (handle.b) {
- handle.b.css({
- top: px(south)
- });
- handle.r.css({
- left: px(east)
- });
- }
- }
- //}}}
- function moveto(x, y) //{{{
- {
- if (!options.shade) {
- $img2.css({
- top: px(-y),
- left: px(-x)
- });
- }
- $sel.css({
- top: px(y),
- left: px(x)
- });
- }
- //}}}
- function resize(w, h) //{{{
- {
- $sel.width(w).height(h);
- }
- //}}}
- function refresh() //{{{
- {
- var c = Coords.getFixed();
-
- Coords.setPressed([c.x, c.y]);
- Coords.setCurrent([c.x2, c.y2]);
-
- updateVisible();
- }
- //}}}
-
- // Internal Methods
- function updateVisible(select) //{{{
- {
- if (awake) {
- return update(select);
- }
- }
- //}}}
- function update(select) //{{{
- {
- var c = Coords.getFixed();
-
- resize(c.w, c.h);
- moveto(c.x, c.y);
- if (options.shade) Shade.updateRaw(c);
-
- if (seehandles) {
- moveHandles(c);
- }
- if (!awake) {
- show();
- }
-
- if (select) {
- options.onSelect.call(api, unscale(c));
- } else {
- options.onChange.call(api, unscale(c));
- }
- }
- //}}}
- function setBgOpacity(opacity,force,now)
- {
- if (!awake && !force) return;
- if (options.bgFade && !now) {
- $img.animate({
- opacity: opacity
- },{
- queue: false,
- duration: options.fadeTime
- });
- } else {
- $img.css('opacity', opacity);
- }
- }
- function show() //{{{
- {
- $sel.show();
-
- if (options.shade) Shade.opacity(bgopacity);
- else setBgOpacity(bgopacity,true);
-
- awake = true;
- }
- //}}}
- function release() //{{{
- {
- disableHandles();
- $sel.hide();
-
- if (options.shade) Shade.opacity(1);
- else setBgOpacity(1);
-
- awake = false;
- options.onRelease.call(api);
- }
- //}}}
- function showHandles() //{{{
- {
- if (seehandles) {
- moveHandles(Coords.getFixed());
- $hdl_holder.show();
- }
- }
- //}}}
- function enableHandles() //{{{
- {
- seehandles = true;
- if (options.allowResize) {
- moveHandles(Coords.getFixed());
- $hdl_holder.show();
- return true;
- }
- }
- //}}}
- function disableHandles() //{{{
- {
- seehandles = false;
- $hdl_holder.hide();
- }
- //}}}
- function animMode(v) //{{{
- {
- if (animating === v) {
- disableHandles();
- } else {
- enableHandles();
- }
- }
- //}}}
- function done() //{{{
- {
- animMode(false);
- refresh();
- }
- //}}}
- /* Insert draggable elements {{{*/
-
- // Insert border divs for outline
- if (options.drawBorders) {
- borders = {
- top: insertBorder('hline'),
- bottom: insertBorder('hline bottom'),
- left: insertBorder('vline'),
- right: insertBorder('vline right')
- };
- }
-
- // Insert handles on edges
- if (options.dragEdges) {
- handle.t = insertDragbar('n');
- handle.b = insertDragbar('s');
- handle.r = insertDragbar('e');
- handle.l = insertDragbar('w');
- }
-
- // Insert side and corner handles
- if (options.sideHandles) {
- createHandles(['n', 's', 'e', 'w']);
- }
- if (options.cornerHandles) {
- createHandles(['sw', 'nw', 'ne', 'se']);
- }
- //}}}
-
- // This is a hack for iOS5 to support drag/move touch functionality
- $(document).bind('touchstart.jcrop-ios',function(e) {
- if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation();
- });
-
- var $track = newTracker().mousedown(createDragger('move')).css({
- cursor: 'move',
- position: 'absolute',
- zIndex: 360
- });
-
- if (Touch.support) {
- $track.bind('touchstart.jcrop', Touch.createDragger('move'));
- }
-
- $img_holder.append($track);
- disableHandles();
-
- return {
- updateVisible: updateVisible,
- update: update,
- release: release,
- refresh: refresh,
- isAwake: function () {
- return awake;
- },
- setCursor: function (cursor) {
- $track.css('cursor', cursor);
- },
- enableHandles: enableHandles,
- enableOnly: function () {
- seehandles = true;
- },
- showHandles: showHandles,
- disableHandles: disableHandles,
- animMode: animMode,
- setBgOpacity: setBgOpacity,
- done: done
- };
- }());
-
- //}}}
- // Tracker Module {{{
- var Tracker = (function () {
- var onMove = function () {},
- onDone = function () {},
- trackDoc = options.trackDocument;
-
- function toFront() //{{{
- {
- $trk.css({
- zIndex: 450
- });
- if (Touch.support) {
- $(document)
- .bind('touchmove.jcrop', trackTouchMove)
- .bind('touchend.jcrop', trackTouchEnd);
- }
- if (trackDoc) {
- $(document)
- .bind('mousemove.jcrop',trackMove)
- .bind('mouseup.jcrop',trackUp);
- }
- }
- //}}}
- function toBack() //{{{
- {
- $trk.css({
- zIndex: 290
- });
- $(document).unbind('.jcrop');
- }
- //}}}
- function trackMove(e) //{{{
- {
- onMove(mouseAbs(e));
- return false;
- }
- //}}}
- function trackUp(e) //{{{
- {
- e.preventDefault();
- e.stopPropagation();
-
- if (btndown) {
- btndown = false;
-
- onDone(mouseAbs(e));
-
- if (Selection.isAwake()) {
- options.onSelect.call(api, unscale(Coords.getFixed()));
- }
-
- toBack();
- onMove = function () {};
- onDone = function () {};
- }
-
- return false;
- }
- //}}}
- function activateHandlers(move, done) //{{{
- {
- btndown = true;
- onMove = move;
- onDone = done;
- toFront();
- return false;
- }
- //}}}
- function trackTouchMove(e) //{{{
- {
- e.pageX = e.originalEvent.changedTouches[0].pageX;
- e.pageY = e.originalEvent.changedTouches[0].pageY;
- return trackMove(e);
- }
- //}}}
- function trackTouchEnd(e) //{{{
- {
- e.pageX = e.originalEvent.changedTouches[0].pageX;
- e.pageY = e.originalEvent.changedTouches[0].pageY;
- return trackUp(e);
- }
- //}}}
- function setCursor(t) //{{{
- {
- $trk.css('cursor', t);
- }
- //}}}
-
- if (!trackDoc) {
- $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);
- }
-
- $img.before($trk);
- return {
- activateHandlers: activateHandlers,
- setCursor: setCursor
- };
- }());
- //}}}
- // KeyManager Module {{{
- var KeyManager = (function () {
- var $keymgr = $('<input type="radio" />').css({
- position: 'fixed',
- left: '-120px',
- width: '12px'
- }),
- $keywrap = $('<div />').css({
- position: 'absolute',
- overflow: 'hidden'
- }).append($keymgr);
-
- function watchKeys() //{{{
- {
- if (options.keySupport) {
- $keymgr.show();
- $keymgr.focus();
- }
- }
- //}}}
- function onBlur(e) //{{{
- {
- $keymgr.hide();
- }
- //}}}
- function doNudge(e, x, y) //{{{
- {
- if (options.allowMove) {
- Coords.moveOffset([x, y]);
- Selection.updateVisible(true);
- }
- e.preventDefault();
- e.stopPropagation();
- }
- //}}}
- function parseKey(e) //{{{
- {
- if (e.ctrlKey || e.metaKey) {
- return true;
- }
- shift_down = e.shiftKey ? true : false;
- var nudge = shift_down ? 10 : 1;
-
- switch (e.keyCode) {
- case 37:
- doNudge(e, -nudge, 0);
- break;
- case 39:
- doNudge(e, nudge, 0);
- break;
- case 38:
- doNudge(e, 0, -nudge);
- break;
- case 40:
- doNudge(e, 0, nudge);
- break;
- case 27:
- if (options.allowSelect) Selection.release();
- break;
- case 9:
- return true;
- }
-
- return false;
- }
- //}}}
-
- if (options.keySupport) {
- $keymgr.keydown(parseKey).blur(onBlur);
- if (ie6mode || !options.fixedSupport) {
- $keymgr.css({
- position: 'absolute',
- left: '-20px'
- });
- $keywrap.append($keymgr).insertBefore($img);
- } else {
- $keymgr.insertBefore($img);
- }
- }
-
-
- return {
- watchKeys: watchKeys
- };
- }());
- //}}}
- // }}}
- // API methods {{{
- function setClass(cname) //{{{
- {
- $div.removeClass().addClass(cssClass('holder')).addClass(cname);
- }
- //}}}
- function animateTo(a, callback) //{{{
- {
- var x1 = parseInt(a[0], 10) / xscale,
- y1 = parseInt(a[1], 10) / yscale,
- x2 = parseInt(a[2], 10) / xscale,
- y2 = parseInt(a[3], 10) / yscale;
-
- if (animating) {
- return;
- }
-
- var animto = Coords.flipCoords(x1, y1, x2, y2),
- c = Coords.getFixed(),
- initcr = [c.x, c.y, c.x2, c.y2],
- animat = initcr,
- interv = options.animationDelay,
- ix1 = animto[0] - initcr[0],
- iy1 = animto[1] - initcr[1],
- ix2 = animto[2] - initcr[2],
- iy2 = animto[3] - initcr[3],
- pcent = 0,
- velocity = options.swingSpeed;
-
- x = animat[0];
- y = animat[1];
- x2 = animat[2];
- y2 = animat[3];
-
- Selection.animMode(true);
- var anim_timer;
-
- function queueAnimator() {
- window.setTimeout(animator, interv);
- }
- var animator = (function () {
- return function () {
- pcent += (100 - pcent) / velocity;
-
- animat[0] = x + ((pcent / 100) * ix1);
- animat[1] = y + ((pcent / 100) * iy1);
- animat[2] = x2 + ((pcent / 100) * ix2);
- animat[3] = y2 + ((pcent / 100) * iy2);
-
- if (pcent >= 99.8) {
- pcent = 100;
- }
- if (pcent < 100) {
- setSelectRaw(animat);
- queueAnimator();
- } else {
- Selection.done();
- if (typeof(callback) === 'function') {
- callback.call(api);
- }
- }
- };
- }());
- queueAnimator();
- }
- //}}}
- function setSelect(rect) //{{{
- {
- setSelectRaw([parseInt(rect[0], 10) / xscale, parseInt(rect[1], 10) / yscale, parseInt(rect[2], 10) / xscale, parseInt(rect[3], 10) / yscale]);
- options.onSelect.call(api, unscale(Coords.getFixed()));
- Selection.enableHandles();
- }
- //}}}
- function setSelectRaw(l) //{{{
- {
- Coords.setPressed([l[0], l[1]]);
- Coords.setCurrent([l[2], l[3]]);
- Selection.update();
- }
- //}}}
- function tellSelect() //{{{
- {
- return unscale(Coords.getFixed());
- }
- //}}}
- function tellScaled() //{{{
- {
- return Coords.getFixed();
- }
- //}}}
- function setOptionsNew(opt) //{{{
- {
- setOptions(opt);
- interfaceUpdate();
- }
- //}}}
- function disableCrop() //{{{
- {
- options.disabled = true;
- Selection.disableHandles();
- Selection.setCursor('default');
- Tracker.setCursor('default');
- }
- //}}}
- function enableCrop() //{{{
- {
- options.disabled = false;
- interfaceUpdate();
- }
- //}}}
- function cancelCrop() //{{{
- {
- Selection.done();
- Tracker.activateHandlers(null, null);
- }
- //}}}
- function destroy() //{{{
- {
- $div.remove();
- $origimg.show();
- $(obj).removeData('Jcrop');
- }
- //}}}
- function setImage(src, callback) //{{{
- {
- Selection.release();
- disableCrop();
- var img = new Image();
- img.onload = function () {
- var iw = img.width;
- var ih = img.height;
- var bw = options.boxWidth;
- var bh = options.boxHeight;
- $img.width(iw).height(ih);
- $img.attr('src', src);
- $img2.attr('src', src);
- presize($img, bw, bh);
- boundx = $img.width();
- boundy = $img.height();
- $img2.width(boundx).height(boundy);
- $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2));
- $div.width(boundx).height(boundy);
- Shade.resize(boundx,boundy);
- enableCrop();
-
- if (typeof(callback) === 'function') {
- callback.call(api);
- }
- };
- img.src = src;
- }
- //}}}
- function colorChangeMacro($obj,color,now) {
- var mycolor = color || options.bgColor;
- if (options.bgFade && supportsColorFade() && options.fadeTime && !now) {
- $obj.animate({
- backgroundColor: mycolor
- }, {
- queue: false,
- duration: options.fadeTime
- });
- } else {
- $obj.css('backgroundColor', mycolor);
- }
- }
- function interfaceUpdate(alt) //{{{
- // This method tweaks the interface based on options object.
- // Called when options are changed and at end of initialization.
- {
- if (options.allowResize) {
- if (alt) {
- Selection.enableOnly();
- } else {
- Selection.enableHandles();
- }
- } else {
- Selection.disableHandles();
- }
-
- Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');
- Selection.setCursor(options.allowMove ? 'move' : 'default');
-
- if (options.hasOwnProperty('trueSize')) {
- xscale = options.trueSize[0] / boundx;
- yscale = options.trueSize[1] / boundy;
- }
-
- if (options.hasOwnProperty('setSelect')) {
- setSelect(options.setSelect);
- Selection.done();
- delete(options.setSelect);
- }
-
- Shade.refresh();
-
- if (options.bgColor != bgcolor) {
- colorChangeMacro(
- options.shade? Shade.getShades(): $div,
- options.shade?
- (options.shadeColor || options.bgColor):
- options.bgColor
- );
- bgcolor = options.bgColor;
- }
-
- if (bgopacity != options.bgOpacity) {
- bgopacity = options.bgOpacity;
- if (options.shade) Shade.refresh();
- else Selection.setBgOpacity(bgopacity);
- }
-
- xlimit = options.maxSize[0] || 0;
- ylimit = options.maxSize[1] || 0;
- xmin = options.minSize[0] || 0;
- ymin = options.minSize[1] || 0;
-
- if (options.hasOwnProperty('outerImage')) {
- $img.attr('src', options.outerImage);
- delete(options.outerImage);
- }
-
- Selection.refresh();
- }
- //}}}
- //}}}
-
- if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection);
-
- $hdl_holder.hide();
- interfaceUpdate(true);
-
- var api = {
- setImage: setImage,
- animateTo: animateTo,
- setSelect: setSelect,
- setOptions: setOptionsNew,
- tellSelect: tellSelect,
- tellScaled: tellScaled,
- setClass: setClass,
-
- disable: disableCrop,
- enable: enableCrop,
- cancel: cancelCrop,
- release: Selection.release,
- destroy: destroy,
-
- focus: KeyManager.watchKeys,
-
- getBounds: function () {
- return [boundx * xscale, boundy * yscale];
- },
- getWidgetSize: function () {
- return [boundx, boundy];
- },
- getScaleFactor: function () {
- return [xscale, yscale];
- },
-
- ui: {
- holder: $div,
- selection: $sel
- }
- };
-
- if ($.browser.msie) {
- $div.bind('selectstart', function () {
- return false;
- });
- }
-
- $origimg.data('Jcrop', api);
- return api;
- };
- $.fn.Jcrop = function (options, callback) //{{{
- {
- var api;
- // Iterate over each object, attach Jcrop
- this.each(function () {
- // If we've already attached to this object
- if ($(this).data('Jcrop')) {
- // The API can be requested this way (undocumented)
- if (options === 'api') return $(this).data('Jcrop');
- // Otherwise, we just reset the options...
- else $(this).data('Jcrop').setOptions(options);
- }
- // If we haven't been attached, preload and attach
- else {
- if (this.tagName == 'IMG')
- $.Jcrop.Loader(this,function(){
- $(this).css({display:'block',visibility:'hidden'});
- api = $.Jcrop(this, options);
- if ($.isFunction(callback)) callback.call(api);
- });
- else {
- $(this).css({display:'block',visibility:'hidden'});
- api = $.Jcrop(this, options);
- if ($.isFunction(callback)) callback.call(api);
- }
- }
- });
-
- // Return "this" so the object is chainable (jQuery-style)
- return this;
- };
- //}}}
- // $.Jcrop.Loader - basic image loader {{{
-
- $.Jcrop.Loader = function(imgobj,success,error){
- var $img = $(imgobj), img = $img[0];
-
- function completeCheck(){
- if (img.complete) {
- $img.unbind('.jcloader');
- if ($.isFunction(success)) success.call(img);
- }
- else window.setTimeout(completeCheck,50);
- }
-
- $img
- .bind('load.jcloader',completeCheck)
- .bind('error.jcloader',function(e){
- $img.unbind('.jcloader');
- if ($.isFunction(error)) error.call(img);
- });
-
- if (img.complete && $.isFunction(success)){
- $img.unbind('.jcloader');
- success.call(img);
- }
- };
-
- //}}}
- // Global Defaults {{{
- $.Jcrop.defaults = {
-
- // Basic Settings
- allowSelect: true,
- allowMove: true,
- allowResize: true,
-
- trackDocument: true,
-
- // Styling Options
- baseClass: 'jcrop',
- addClass: null,
- bgColor: 'black',
- bgOpacity: 0.6,
- bgFade: false,
- borderOpacity: 0.4,
- handleOpacity: 0.5,
- handleSize: 7,
- handleOffset: 5,
-
- aspectRatio: 0,
- keySupport: true,
- cornerHandles: true,
- sideHandles: true,
- drawBorders: true,
- dragEdges: true,
- fixedSupport: true,
- touchSupport: null,
-
- shade: null,
-
- boxWidth: 0,
- boxHeight: 0,
- boundary: 2,
- fadeTime: 400,
- animationDelay: 20,
- swingSpeed: 3,
-
- minSelect: [0, 0],
- maxSize: [0, 0],
- minSize: [0, 0],
-
- // Callbacks / Event Handlers
- onChange: function () {},
- onSelect: function () {},
- onDblClick: function () {},
- onRelease: function () {}
- };
-
- // }}}
-}(jQuery));
diff --git a/apps/contacts/js/jquery.Jcrop.min.js b/apps/contacts/js/jquery.Jcrop.min.js
deleted file mode 100644
index 0c05d67c22d..00000000000
--- a/apps/contacts/js/jquery.Jcrop.min.js
+++ /dev/null
@@ -1,255 +0,0 @@
-/**
- * jquery.Jcrop.min.js v0.9.9 {{{ (build:20120102)
- * jQuery Image Cropping Plugin - released under MIT License
- * Copyright (c) 2008-2012 Tapmodo Interactive LLC
- * https://github.com/tapmodo/Jcrop
- */
-
-(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,lastcurs,ie6mode=false;function px(n){return parseInt(n,10)+'px';}
-function cssClass(cl){return options.baseClass+'-'+cl;}
-function supportsColorFade(){return $.fx.step.hasOwnProperty('backgroundColor');}
-function getPos(obj)
-{var pos=$(obj).offset();return[pos.left,pos.top];}
-function mouseAbs(e)
-{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];}
-function setOptions(opt)
-{if(typeof(opt)!=='object')opt={};options=$.extend(options,opt);$.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e){if(typeof(options[e])!=='function')options[e]=function(){};});}
-function startDragMode(mode,pos)
-{docOffset=getPos($img);Tracker.setCursor(mode==='move'?mode:mode+'-resize');if(mode==='move'){return Tracker.activateHandlers(createMover(pos),doneSelect);}
-var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);}
-function dragmodeHandler(mode,f)
-{return function(pos){if(!options.aspectRatio){switch(mode){case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;}}else{switch(mode){case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;}}
-Coords.setCurrent(pos);Selection.update();};}
-function createMover(pos)
-{var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};}
-function oppLockCorner(ord)
-{switch(ord){case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';}}
-function createDragger(ord)
-{return function(e){if(options.disabled){return false;}
-if((ord==='move')&&!options.allowMove){return false;}
-docOffset=getPos($img);btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};}
-function presize($obj,w,h)
-{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height();}
-if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width();}
-xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);}
-function unscale(c)
-{return{x:parseInt(c.x*xscale,10),y:parseInt(c.y*yscale,10),x2:parseInt(c.x2*xscale,10),y2:parseInt(c.y2*yscale,10),w:parseInt(c.w*xscale,10),h:parseInt(c.h*yscale,10)};}
-function doneSelect(pos)
-{var c=Coords.getFixed();if((c.w>options.minSelect[0])&&(c.h>options.minSelect[1])){Selection.enableHandles();Selection.done();}else{Selection.release();}
-Tracker.setCursor(options.allowSelect?'crosshair':'default');}
-function newSelection(e)
-{if(options.disabled){return false;}
-if(!options.allowSelect){return false;}
-btndown=true;docOffset=getPos($img);Selection.disableHandles();Tracker.setCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Selection.update();Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();e.stopPropagation();e.preventDefault();return false;}
-function selectDrag(pos)
-{Coords.setCurrent(pos);Selection.update();}
-function newTracker()
-{var trk=$('<div></div>').addClass(cssClass('tracker'));if($.browser.msie){trk.css({opacity:0,backgroundColor:'white'});}
-return trk;}
-if($.browser.msie&&($.browser.version.split('.')[0]==='6')){ie6mode=true;}
-if(typeof(obj)!=='object'){obj=$(obj)[0];}
-if(typeof(opt)!=='object'){opt={};}
-setOptions(opt);var img_css={border:'none',visibility:'visible',margin:0,padding:0,position:'absolute',top:0,left:0};var $origimg=$(obj),img_mode=true;if(obj.tagName=='IMG'){if($origimg[0].width!=0&&$origimg[0].height!=0){$origimg.width($origimg[0].width);$origimg.height($origimg[0].height);}else{var tempImage=new Image();tempImage.src=$origimg[0].src;$origimg.width(tempImage.width);$origimg.height(tempImage.height);}
-var $img=$origimg.clone().removeAttr('id').css(img_css).show();$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();}else{$img=$origimg.css(img_css).show();img_mode=false;if(options.shade===null){options.shade=true;}}
-presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);if(options.addClass){$div.addClass(options.addClass);}
-var $img2=$('<div />'),$img_holder=$('<div />').width('100%').height('100%').css({zIndex:310,position:'absolute',overflow:'hidden'}),$hdl_holder=$('<div />').width('100%').height('100%').css('zIndex',320),$sel=$('<div />').css({position:'absolute',zIndex:600}).dblclick(function(){var c=Coords.getFixed();options.onDblClick.call(api,c);}).insertBefore($img).append($img_holder,$hdl_holder);if(img_mode){$img2=$('<img />').attr('src',$img.attr('src')).css(img_css).width(boundx).height(boundy),$img_holder.append($img2);}
-if(ie6mode){$sel.css({overflowY:'hidden'});}
-var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var bgcolor=options.bgColor,bgopacity=options.bgOpacity,xlimit,ylimit,xmin,ymin,xscale,yscale,enabled=true,btndown,animating,shift_down;docOffset=getPos($img);var Touch=(function(){function hasTouchSupport(){var support={},events=['touchstart','touchmove','touchend'],el=document.createElement('div'),i;try{for(i=0;i<events.length;i++){var eventName=events[i];eventName='on'+eventName;var isSupported=(eventName in el);if(!isSupported){el.setAttribute(eventName,'return;');isSupported=typeof el[eventName]=='function';}
-support[events[i]]=isSupported;}
-return support.touchstart&&support.touchend&&support.touchmove;}
-catch(err){return false;}}
-function detectSupport(){if((options.touchSupport===true)||(options.touchSupport===false))return options.touchSupport;else return hasTouchSupport();}
-return{createDragger:function(ord){return function(e){e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;if(options.disabled){return false;}
-if((ord==='move')&&!options.allowMove){return false;}
-btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};},newSelection:function(e){e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return newSelection(e);},isSupported:hasTouchSupport,support:detectSupport()};}());var Coords=(function(){var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos)
-{pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];}
-function setCurrent(pos)
-{pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];}
-function getOffset()
-{return[ox,oy];}
-function moveOffset(offset)
-{var ox=offset[0],oy=offset[1];if(0>x1+ox){ox-=ox+x1;}
-if(0>y1+oy){oy-=oy+y1;}
-if(boundy<y2+oy){oy+=boundy-(y2+oy);}
-if(boundx<x2+ox){ox+=boundx-(x2+ox);}
-x1+=ox;x2+=ox;y1+=oy;y2+=oy;}
-function getCorner(ord)
-{var c=getFixed();switch(ord){case'ne':return[c.x2,c.y];case'nw':return[c.x,c.y];case'se':return[c.x2,c.y2];case'sw':return[c.x,c.y2];}}
-function getFixed()
-{if(!options.aspectRatio){return getRect();}
-var aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha,xx,yy,w,h;if(max_x===0){max_x=boundx*10;}
-if(max_y===0){max_y=boundy*10;}
-if(real_ratio<aspect){yy=y2;w=rha*aspect;xx=rw<0?x1-w:w+x1;if(xx<0){xx=0;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}else if(xx>boundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}else if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}}
-if(xx>x1){if(xx-x1<min_x){xx=x1+min_x;}else if(xx-x1>max_x){xx=x1+max_x;}
-if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xx<x1){if(x1-xx<min_x){xx=x1-min_x;}else if(x1-xx>max_x){xx=x1-max_x;}
-if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}}
-if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;}
-if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;}
-return makeObj(flipCoords(x1,y1,xx,yy));}
-function rebound(p)
-{if(p[0]<0){p[0]=0;}
-if(p[1]<0){p[1]=0;}
-if(p[0]>boundx){p[0]=boundx;}
-if(p[1]>boundy){p[1]=boundy;}
-return[p[0],p[1]];}
-function flipCoords(x1,y1,x2,y2)
-{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2<x1){xa=x2;xb=x1;}
-if(y2<y1){ya=y2;yb=y1;}
-return[Math.round(xa),Math.round(ya),Math.round(xb),Math.round(yb)];}
-function getRect()
-{var xsize=x2-x1,ysize=y2-y1,delta;if(xlimit&&(Math.abs(xsize)>xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit);}
-if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit);}
-if(ymin/yscale&&(Math.abs(ysize)<ymin/yscale)){y2=(ysize>0)?(y1+ymin/yscale):(y1-ymin/yscale);}
-if(xmin/xscale&&(Math.abs(xsize)<xmin/xscale)){x2=(xsize>0)?(x1+xmin/xscale):(x1-xmin/xscale);}
-if(x1<0){x2-=x1;x1-=x1;}
-if(y1<0){y2-=y1;y1-=y1;}
-if(x2<0){x1-=x2;x2-=x2;}
-if(y2<0){y1-=y2;y2-=y2;}
-if(x2>boundx){delta=x2-boundx;x1-=delta;x2-=delta;}
-if(y2>boundy){delta=y2-boundy;y1-=delta;y2-=delta;}
-if(x1>boundx){delta=x1-boundy;y2-=delta;y1-=delta;}
-if(y1>boundy){delta=y1-boundy;y2-=delta;y1-=delta;}
-return makeObj(flipCoords(x1,y1,x2,y2));}
-function makeObj(a)
-{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};}
-return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}());var Shade=(function(){var enabled=false,holder=$('<div />').css({position:'absolute',zIndex:240,opacity:0}),shades={top:createShade(),left:createShade().height(boundy),right:createShade().height(boundy),bottom:createShade()};function resizeShades(w,h){shades.left.css({height:px(h)});shades.right.css({height:px(h)});}
-function updateAuto()
-{return updateShade(Coords.getFixed());}
-function updateShade(c)
-{shades.top.css({left:px(c.x),width:px(c.w),height:px(c.y)});shades.bottom.css({top:px(c.y2),left:px(c.x),width:px(c.w),height:px(boundy-c.y2)});shades.right.css({left:px(c.x2),width:px(boundx-c.x2)});shades.left.css({width:px(c.x)});}
-function createShade(){return $('<div />').css({position:'absolute',backgroundColor:options.shadeColor||options.bgColor}).appendTo(holder);}
-function enableShade(){if(!enabled){enabled=true;holder.insertBefore($img);updateAuto();Selection.setBgOpacity(1,0,1);$img2.hide();setBgColor(options.shadeColor||options.bgColor,1);if(Selection.isAwake())
-{setOpacity(options.bgOpacity,1);}
-else setOpacity(1,1);}}
-function setBgColor(color,now){colorChangeMacro(getShades(),color,now);}
-function disableShade(){if(enabled){holder.remove();$img2.show();enabled=false;if(Selection.isAwake()){Selection.setBgOpacity(options.bgOpacity,1,1);}else{Selection.setBgOpacity(1,1,1);Selection.disableHandles();}
-colorChangeMacro($div,0,1);}}
-function setOpacity(opacity,now){if(enabled){if(options.bgFade&&!now){holder.animate({opacity:1-opacity},{queue:false,duration:options.fadeTime});}
-else holder.css({opacity:1-opacity});}}
-function refreshAll(){options.shade?enableShade():disableShade();if(Selection.isAwake())setOpacity(options.bgOpacity);}
-function getShades(){return holder.children();}
-return{update:updateAuto,updateRaw:updateShade,getShades:getShades,setBgColor:setBgColor,enable:enableShade,disable:disableShade,resize:resizeShades,refresh:refreshAll,opacity:setOpacity};}());var Selection=(function(){var awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;function insertBorder(type)
-{var jq=$('<div />').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;}
-function dragDiv(ord,zi)
-{var jq=$('<div />').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi}).addClass('ord-'+ord);if(Touch.support){jq.bind('touchstart.jcrop',Touch.createDragger(ord));}
-$hdl_holder.append(jq);return jq;}
-function insertHandle(ord)
-{var hs=options.handleSize;return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).width(hs).height(hs).addClass(cssClass('handle'));}
-function insertDragbar(ord)
-{var s=options.handleSize,h=s,w=s,t=hhs,l=hhs;switch(ord){case'n':case's':w='100%';break;case'e':case'w':h='100%';break;}
-return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});}
-function createHandles(li)
-{var i;for(i=0;i<li.length;i++){handle[li[i]]=insertHandle(li[i]);}}
-function moveHandles(c)
-{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=-hhs+1,west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;if(handle.e){handle.e.css({top:px(midvert),left:px(east)});handle.w.css({top:px(midvert)});handle.s.css({top:px(south),left:px(midhoriz)});handle.n.css({left:px(midhoriz)});}
-if(handle.ne){handle.ne.css({left:px(east)});handle.se.css({top:px(south),left:px(east)});handle.sw.css({top:px(south)});}
-if(handle.b){handle.b.css({top:px(south)});handle.r.css({left:px(east)});}}
-function moveto(x,y)
-{if(!options.shade){$img2.css({top:px(-y),left:px(-x)});}
-$sel.css({top:px(y),left:px(x)});}
-function resize(w,h)
-{$sel.width(w).height(h);}
-function refresh()
-{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();}
-function updateVisible(select)
-{if(awake){return update(select);}}
-function update(select)
-{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);if(options.shade)Shade.updateRaw(c);if(seehandles){moveHandles(c);}
-if(!awake){show();}
-if(select){options.onSelect.call(api,unscale(c));}else{options.onChange.call(api,unscale(c));}}
-function setBgOpacity(opacity,force,now)
-{if(!awake&&!force)return;if(options.bgFade&&!now){$img.animate({opacity:opacity},{queue:false,duration:options.fadeTime});}else{$img.css('opacity',opacity);}}
-function show()
-{$sel.show();if(options.shade)Shade.opacity(bgopacity);else setBgOpacity(bgopacity,true);awake=true;}
-function release()
-{disableHandles();$sel.hide();if(options.shade)Shade.opacity(1);else setBgOpacity(1);awake=false;options.onRelease.call(api);}
-function showHandles()
-{if(seehandles){moveHandles(Coords.getFixed());$hdl_holder.show();}}
-function enableHandles()
-{seehandles=true;if(options.allowResize){moveHandles(Coords.getFixed());$hdl_holder.show();return true;}}
-function disableHandles()
-{seehandles=false;$hdl_holder.hide();}
-function animMode(v)
-{if(animating===v){disableHandles();}else{enableHandles();}}
-function done()
-{animMode(false);refresh();}
-if(options.drawBorders){borders={top:insertBorder('hline'),bottom:insertBorder('hline bottom'),left:insertBorder('vline'),right:insertBorder('vline right')};}
-if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');}
-if(options.sideHandles){createHandles(['n','s','e','w']);}
-if(options.cornerHandles){createHandles(['sw','nw','ne','se']);}
-$(document).bind('touchstart.jcrop-ios',function(e){if($(e.currentTarget).hasClass('jcrop-tracker'))e.stopPropagation();});var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360});if(Touch.support){$track.bind('touchstart.jcrop',Touch.createDragger('move'));}
-$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,isAwake:function(){return awake;},setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,setBgOpacity:setBgOpacity,done:done};}());var Tracker=(function(){var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;function toFront()
-{$trk.css({zIndex:450});if(Touch.support){$(document).bind('touchmove.jcrop',trackTouchMove).bind('touchend.jcrop',trackTouchEnd);}
-if(trackDoc){$(document).bind('mousemove.jcrop',trackMove).bind('mouseup.jcrop',trackUp);}}
-function toBack()
-{$trk.css({zIndex:290});$(document).unbind('.jcrop');}
-function trackMove(e)
-{onMove(mouseAbs(e));return false;}
-function trackUp(e)
-{e.preventDefault();e.stopPropagation();if(btndown){btndown=false;onDone(mouseAbs(e));if(Selection.isAwake()){options.onSelect.call(api,unscale(Coords.getFixed()));}
-toBack();onMove=function(){};onDone=function(){};}
-return false;}
-function activateHandlers(move,done)
-{btndown=true;onMove=move;onDone=done;toFront();return false;}
-function trackTouchMove(e)
-{e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return trackMove(e);}
-function trackTouchEnd(e)
-{e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return trackUp(e);}
-function setCursor(t)
-{$trk.css('cursor',t);}
-if(!trackDoc){$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);}
-$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}());var KeyManager=(function(){var $keymgr=$('<input type="radio" />').css({position:'fixed',left:'-120px',width:'12px'}),$keywrap=$('<div />').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys()
-{if(options.keySupport){$keymgr.show();$keymgr.focus();}}
-function onBlur(e)
-{$keymgr.hide();}
-function doNudge(e,x,y)
-{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible(true);}
-e.preventDefault();e.stopPropagation();}
-function parseKey(e)
-{if(e.ctrlKey||e.metaKey){return true;}
-shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:if(options.allowSelect)Selection.release();break;case 9:return true;}
-return false;}
-if(options.keySupport){$keymgr.keydown(parseKey).blur(onBlur);if(ie6mode||!options.fixedSupport){$keymgr.css({position:'absolute',left:'-20px'});$keywrap.append($keymgr).insertBefore($img);}else{$keymgr.insertBefore($img);}}
-return{watchKeys:watchKeys};}());function setClass(cname)
-{$div.removeClass().addClass(cssClass('holder')).addClass(cname);}
-function animateTo(a,callback)
-{var x1=parseInt(a[0],10)/xscale,y1=parseInt(a[1],10)/yscale,x2=parseInt(a[2],10)/xscale,y2=parseInt(a[3],10)/yscale;if(animating){return;}
-var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x=animat[0];y=animat[1];x2=animat[2];y2=animat[3];Selection.animMode(true);var anim_timer;function queueAnimator(){window.setTimeout(animator,interv);}
-var animator=(function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent>=99.8){pcent=100;}
-if(pcent<100){setSelectRaw(animat);queueAnimator();}else{Selection.done();if(typeof(callback)==='function'){callback.call(api);}}};}());queueAnimator();}
-function setSelect(rect)
-{setSelectRaw([parseInt(rect[0],10)/xscale,parseInt(rect[1],10)/yscale,parseInt(rect[2],10)/xscale,parseInt(rect[3],10)/yscale]);options.onSelect.call(api,unscale(Coords.getFixed()));Selection.enableHandles();}
-function setSelectRaw(l)
-{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();}
-function tellSelect()
-{return unscale(Coords.getFixed());}
-function tellScaled()
-{return Coords.getFixed();}
-function setOptionsNew(opt)
-{setOptions(opt);interfaceUpdate();}
-function disableCrop()
-{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');}
-function enableCrop()
-{options.disabled=false;interfaceUpdate();}
-function cancelCrop()
-{Selection.done();Tracker.activateHandlers(null,null);}
-function destroy()
-{$div.remove();$origimg.show();$(obj).removeData('Jcrop');}
-function setImage(src,callback)
-{Selection.release();disableCrop();var img=new Image();img.onload=function(){var iw=img.width;var ih=img.height;var bw=options.boxWidth;var bh=options.boxHeight;$img.width(iw).height(ih);$img.attr('src',src);$img2.attr('src',src);presize($img,bw,bh);boundx=$img.width();boundy=$img.height();$img2.width(boundx).height(boundy);$trk.width(boundx+(bound*2)).height(boundy+(bound*2));$div.width(boundx).height(boundy);Shade.resize(boundx,boundy);enableCrop();if(typeof(callback)==='function'){callback.call(api);}};img.src=src;}
-function colorChangeMacro($obj,color,now){var mycolor=color||options.bgColor;if(options.bgFade&&supportsColorFade()&&options.fadeTime&&!now){$obj.animate({backgroundColor:mycolor},{queue:false,duration:options.fadeTime});}else{$obj.css('backgroundColor',mycolor);}}
-function interfaceUpdate(alt)
-{if(options.allowResize){if(alt){Selection.enableOnly();}else{Selection.enableHandles();}}else{Selection.disableHandles();}
-Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');if(options.hasOwnProperty('trueSize')){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;}
-if(options.hasOwnProperty('setSelect')){setSelect(options.setSelect);Selection.done();delete(options.setSelect);}
-Shade.refresh();if(options.bgColor!=bgcolor){colorChangeMacro(options.shade?Shade.getShades():$div,options.shade?(options.shadeColor||options.bgColor):options.bgColor);bgcolor=options.bgColor;}
-if(bgopacity!=options.bgOpacity){bgopacity=options.bgOpacity;if(options.shade)Shade.refresh();else Selection.setBgOpacity(bgopacity);}
-xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if(options.hasOwnProperty('outerImage')){$img.attr('src',options.outerImage);delete(options.outerImage);}
-Selection.refresh();}
-if(Touch.support)$trk.bind('touchstart.jcrop',Touch.newSelection);$hdl_holder.hide();interfaceUpdate(true);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},getScaleFactor:function(){return[xscale,yscale];},ui:{holder:$div,selection:$sel}};if($.browser.msie){$div.bind('selectstart',function(){return false;});}
-$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options,callback)
-{var api;this.each(function(){if($(this).data('Jcrop')){if(options==='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);}
-else{if(this.tagName=='IMG')
-$.Jcrop.Loader(this,function(){$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);});else{$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);}}});return this;};$.Jcrop.Loader=function(imgobj,success,error){var $img=$(imgobj),img=$img[0];function completeCheck(){if(img.complete){$img.unbind('.jcloader');if($.isFunction(success))success.call(img);}
-else window.setTimeout(completeCheck,50);}
-$img.bind('load.jcloader',completeCheck).bind('error.jcloader',function(e){$img.unbind('.jcloader');if($.isFunction(error))error.call(img);});if(img.complete&&$.isFunction(success)){$img.unbind('.jcloader');success.call(img);}};$.Jcrop.defaults={allowSelect:true,allowMove:true,allowResize:true,trackDocument:true,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:0.6,bgFade:false,borderOpacity:0.4,handleOpacity:0.5,handleSize:7,handleOffset:5,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,fixedSupport:true,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}};}(jQuery)); \ No newline at end of file
diff --git a/apps/contacts/js/jquery.combobox.js b/apps/contacts/js/jquery.combobox.js
deleted file mode 100644
index d9959eb6cde..00000000000
--- a/apps/contacts/js/jquery.combobox.js
+++ /dev/null
@@ -1,158 +0,0 @@
-/**
- * Inspired by http://jqueryui.com/demos/autocomplete/#combobox
- */
-
-(function( $ ) {
- $.widget('ui.combobox', {
- options: {
- id: null,
- name: null,
- showButton: false,
- editable: true
- },
- _create: function() {
- var self = this,
- select = this.element.hide(),
- selected = select.children(':selected'),
- value = selected.val() ? selected.text() : '';
- var input = this.input = $('<input type="text">')
- .insertAfter( select )
- .val( value )
- .autocomplete({
- delay: 0,
- minLength: 0,
- source: function( request, response ) {
- var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
- response( select.children('option').map(function() {
- var text = $( this ).text();
- if ( this.value && ( !request.term || matcher.test(text) ) )
- return {
- label: text.replace(
- new RegExp(
- '(?![^&;]+;)(?!<[^<>]*)(' +
- $.ui.autocomplete.escapeRegex(request.term) +
- ')(?![^<>]*>)(?![^&;]+;)', 'gi'
- ), '<strong>$1</strong>'),
- value: text,
- option: this
- };
- }) );
- },
- select: function( event, ui ) {
- self.input.val($(ui.item.option).text());
- self.input.trigger('change');
- ui.item.option.selected = true;
- self._trigger('selected', event, {
- item: ui.item.option
- });
- },
- change: function( event, ui ) {
- if ( !ui.item ) {
- var matcher = new RegExp( '^' + $.ui.autocomplete.escapeRegex( $(this).val() ) + '$', 'i' ),
- valid = false;
- self.input.val($(this).val());
- //self.input.trigger('change');
- select.children('option').each(function() {
- if ( $( this ).text().match( matcher ) ) {
- this.selected = valid = true;
- return false;
- }
- });
- if ( !self.options['editable'] && !valid ) {
- // remove invalid value, as it didn't match anything
- $( this ).val( "" );
- select.val( "" );
- input.data('autocomplete').term = '';
- return false;
- }
- }
- }
- })
- .addClass('ui-widget ui-widget-content ui-corner-left');
-
- input.data('autocomplete')._renderItem = function( ul, item ) {
- return $('<li></li>')
- .data('item.autocomplete', item )
- .append('<a>' + item.label + '</a>')
- .appendTo( ul );
- };
- $.each(this.options, function(key, value) {
- self._setOption(key, value);
- });
-
- input.dblclick(function() {
- // pass empty string as value to search for, displaying all results
- input.autocomplete('search', '');
- });
-
- if(this.options['showButton']) {
- this.button = $('<button type="button">&nbsp;</button>')
- .attr('tabIndex', -1 )
- .attr('title', 'Show All Items')
- .insertAfter( input )
- .addClass('svg')
- .addClass('action')
- .addClass('combo-button')
- .click(function() {
- // close if already visible
- if ( input.autocomplete('widget').is(':visible') ) {
- input.autocomplete('close');
- return;
- }
-
- // work around a bug (likely same cause as #5265)
- $( this ).blur();
-
- // pass empty string as value to search for, displaying all results
- input.autocomplete('search', '');
- input.focus();
- });
- }
- },
- destroy: function() {
- this.input.remove();
- //this.button.remove();
- this.element.show();
- $.Widget.prototype.destroy.call( this );
- },
- value: function(val) {
- if(val != undefined) {
- this.input.val(val);
- } else {
- return this.input.val();
- }
- },
- _setOption: function( key, value ) {
- switch( key ) {
- case 'id':
- this.options['id'] = value;
- this.input.attr('id', value);
- break;
- case 'name':
- this.options['name'] = value;
- this.input.attr('name', value);
- break;
- case 'attributes':
- var input = this.input;
- $.each(this.options['attributes'], function(key, value) {
- input.attr(key, value);
- });
- break;
- case 'classes':
- var input = this.input;
- $.each(this.options['classes'], function(key, value) {
- input.addClass(value);
- });
- break;
- case 'editable':
- case 'showButton':
- this.options[key] = value;
- break;
- }
- // In jQuery UI 1.8, you have to manually invoke the _setOption method from the base widget
- $.Widget.prototype._setOption.apply( this, arguments );
- // In jQuery UI 1.9 and above, you use the _super method instead
- //this._super( "_setOption", key, value );
- }
- });
-})( jQuery );
diff --git a/apps/contacts/js/jquery.inview.js b/apps/contacts/js/jquery.inview.js
deleted file mode 100644
index 9687cd83368..00000000000
--- a/apps/contacts/js/jquery.inview.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * author Christopher Blum
- * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
- * - forked from http://github.com/zuk/jquery.inview/
- */
-(function ($) {
- var inviewObjects = {}, viewportSize, viewportOffset,
- d = document, w = window, documentElement = d.documentElement, expando = $.expando, isFiring = false, $elements = {};
-
- $.event.special.inview = {
- add: function(data) {
- var inviewObject = { data: data, $element: $(this) }
- inviewObjects[data.guid + "-" + this[expando]] = inviewObject;
- var selector = inviewObject.data.selector,
- $element = inviewObject.$element;
- var hash = parseInt(getHash( data.guid + this[expando]));
- $elements[hash] = selector ? $element.find(selector) : $element;
- },
-
- remove: function(data) {
- try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {}
- try {
- var hash = parseInt(getHash(data.guid + this[expando]));
- delete($elements[hash]);
- } catch (e){}
- }
- };
-
-
- function getHash(str){
- str = str+'';
- var hash = 0;
- if (str.length == 0) return hash;
- for (i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash<<5)-hash)+char;
- hash = hash & hash; // Convert to 32bit integer
- }
- return Math.abs(hash);
- }
-
- function getViewportSize() {
- var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
-
- // if this is correct then return it. iPad has compat Mode, so will
- // go into check clientHeight/clientWidth (which has the wrong value).
- if (!size.height) {
- mode = d.compatMode;
- if (mode || !$.support.boxModel) { // IE, Gecko
- domObject = mode === 'CSS1Compat' ?
- documentElement : // Standards
- d.body; // Quirks
- size = {
- height: domObject.clientHeight,
- width: domObject.clientWidth
- };
- }
- }
-
- return size;
- }
-
- function getViewportOffset() {
- return {
- top: w.pageYOffset || documentElement.scrollTop || (d.body?d.body.scrollTop:0),
- left: w.pageXOffset || documentElement.scrollLeft || (d.body?d.body.scrollLeft:0)
- };
- }
-
- function checkInView() {
- if (isFiring){
- return;
- }
- isFiring = true;
- viewportSize = viewportSize || getViewportSize();
- viewportOffset = viewportOffset || getViewportOffset();
-
- for (var i in $elements) {
- if (isNaN(parseInt(i))) {
- continue;
- }
-
- var $element = $($elements[i]),
- elementSize = { height: $element.height(), width: $element.width() },
- elementOffset = $element.offset(),
- inView = $element.data('inview'),
- visiblePartX,
- visiblePartY,
- visiblePartsMerged;
-
- // Don't ask me why because I haven't figured out yet:
- // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
- // Even though it sounds weird:
- // It seems that the execution of this function is interferred by the onresize/onscroll event
- // where viewportOffset and viewportSize are unset
- if (!viewportOffset || !viewportSize) {
- isFiring = false;
- return;
- }
-
- if (elementOffset.top + elementSize.height > viewportOffset.top &&
- elementOffset.top < viewportOffset.top + viewportSize.height &&
- elementOffset.left + elementSize.width > viewportOffset.left &&
- elementOffset.left < viewportOffset.left + viewportSize.width) {
- visiblePartX = (viewportOffset.left > elementOffset.left ?
- 'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ?
- 'left' : 'both');
- visiblePartY = (viewportOffset.top > elementOffset.top ?
- 'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ?
- 'top' : 'both');
- visiblePartsMerged = visiblePartX + "-" + visiblePartY;
- if (!inView || inView !== visiblePartsMerged) {
- $element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]);
- }
- } else if (inView) {
- $element.data('inview', false).trigger('inview', [false]);
- }
- }
- isFiring = false;
- }
-
- $(w).bind("scroll resize", function() {
- viewportSize = viewportOffset = null;
- });
-
- // Use setInterval in order to also make sure this captures elements within
- // "overflow:scroll" elements or elements that appeared in the dom tree due to
- // dom manipulation and reflow
- // old: $(window).scroll(checkInView);
- //
- // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
- // intervals while the user scrolls. Therefore the inview event might fire a bit late there
- setInterval(checkInView, 250);
-})(jQuery); \ No newline at end of file
diff --git a/apps/contacts/js/jquery.inview.txt b/apps/contacts/js/jquery.inview.txt
deleted file mode 100644
index c53dbd1d97c..00000000000
--- a/apps/contacts/js/jquery.inview.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-jQuery.inview is licensed Attribution-Non-Commercial-Share Alike 2.0 but the
-conditions has been waived by the author in the following tweet:
-
-https://twitter.com/#!/ChristopherBlum/status/148382899887013888
-
-Saying:
-
-Thomas Tanghus @tanghus 18 Dec. 2011
-
-@ChristopherBlum Hi. Is it OK if I use https://github.com/protonet/jquery.inview in ownCloud? Preferably under an AGPL license ;-) owncloud.org
-
-
-Christopher Blum Christopher Blum @ChristopherBlum 18 Dec. 2011
-
-@tanghus Feel free to! :)
diff --git a/apps/contacts/js/jquery.multi-autocomplete.js b/apps/contacts/js/jquery.multi-autocomplete.js
deleted file mode 100644
index 5516a74b039..00000000000
--- a/apps/contacts/js/jquery.multi-autocomplete.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Inspired by http://jqueryui.com/demos/autocomplete/#multiple
- */
-
-(function( $ ) {
- $.widget('ui.multiple_autocomplete', {
- _create: function() {
- var self = this;
- function split( val ) {
- return val.split( /,\s*/ );
- }
- function extractLast( term ) {
- return split( term ).pop();
- }
- function showOptions() {
- if(!self.element.autocomplete('widget').is(':visible') && self.element.val().trim() == '') {
- self.element.autocomplete('search', '');
- }
- }
- //console.log('_create: ' + this.options['id']);
- this.element.bind('click', function( event ) {
- showOptions();
- });
- this.element.bind('input', function( event ) {
- showOptions();
- });
- this.element.bind('blur', function( event ) {
- var tmp = self.element.val().trim();
- if(tmp[tmp.length-1] == ',') {
- self.element.val(tmp.substring(0, tmp.length-1));
- } else {
- self.element.val(tmp);
- }
- if(self.element.val().trim() != '') {
- self.element.trigger('change'); // Changes wasn't saved when only using the dropdown.
- }
- });
- this.element.bind( "keydown", function( event ) {
- if ( event.keyCode === $.ui.keyCode.TAB &&
- $( this ).data( "autocomplete" ).menu.active ) {
- event.preventDefault();
- }
- })
- .autocomplete({
- minLength: 0,
- source: function( request, response ) {
- // delegate back to autocomplete, but extract the last term
- response( $.ui.autocomplete.filter(
- self.options.source, extractLast( request.term ) ) );
- },
- focus: function() {
- // prevent value inserted on focus
- return false;
- },
- select: function( event, ui ) {
- var terms = split( this.value );
- // remove the current input
- terms.pop();
- // add the selected item
- terms.push( ui.item.value );
- // add placeholder to get the comma-and-space at the end
- terms.push( "" );
- this.value = terms.join( ", " );
- return false;
- }
- });
- /*this.button = $( "<button type='button'>&nbsp;</button>" )
- .attr( "tabIndex", -1 )
- .attr( "title", "Show All Items" )
- .insertAfter( this.element )
- .addClass('svg')
- .addClass('action')
- .addClass('combo-button')
- .click(function() {
- // close if already visible
- if ( self.element.autocomplete( "widget" ).is( ":visible" ) ) {
- self.element.autocomplete( "close" );
- return;
- }
-
- // work around a bug (likely same cause as #5265)
- $( this ).blur();
-
- var tmp = self.element.val().trim();
- if(tmp[tmp.length-1] != ',') {
- self.element.val(tmp+', ');
- }
- // pass empty string as value to search for, displaying all results
- self.element.autocomplete( "search", "" );
- self.element.focus();
- });*/
- },
- });
-})( jQuery );
diff --git a/apps/contacts/js/loader.js b/apps/contacts/js/loader.js
deleted file mode 100644
index 3b1f4070485..00000000000
--- a/apps/contacts/js/loader.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-Contacts_Import={
- importdialog: function(filename){
- var path = $('#dir').val();
- $('body').append('<div id="contacts_import"></div>');
- $('#contacts_import').load(OC.filePath('contacts', 'ajax', 'importdialog.php'), {filename:filename, path:path}, function(){Contacts_Import.initdialog(filename);});
- },
- initdialog: function(filename){
- $('#contacts_import_dialog').dialog({
- width : 500,
- close : function() {
- $(this).dialog('destroy').remove();
- $('#contacts_import').remove();
- }
- });
- $('#import_done_button').click(function(){
- $('#contacts_import_dialog').dialog('destroy').remove();
- $('#contacts_import').remove();
- });
- $('#progressbar').progressbar({value: 0});
- $('#startimport').click(function(){
- var filename = $('#filename').val();
- var path = $('#path').val();
- var method = 'old';
- var addressbookid = $('#contacts option:selected').val();
- if($('#contacts option:selected').val() == 'newaddressbook'){
- var method = 'new';
- var addressbookname = $('#newaddressbook').val();
- var addressbookname = $.trim(addressbookname);
- if(addressbookname == ''){
- $('#newaddressbook').css('background-color', '#FF2626');
- $('#newaddressbook').focus(function(){
- $('#newaddressbook').css('background-color', '#F8F8F8');
- });
- return false;
- }
- }
- $('#newaddressbook').attr('readonly', 'readonly');
- $('#contacts').attr('disabled', 'disabled');
- var progresskey = $('#progresskey').val();
- $.post(OC.filePath('contacts', '', 'import.php') + '?progresskey='+progresskey, {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(jsondata){
- if(jsondata.status == 'success'){
- $('#progressbar').progressbar('option', 'value', 100);
- $('#import_done').find('p').html(t('contacts', 'Result: ') + jsondata.data.imported + t('contacts', ' imported, ') + jsondata.data.failed + t('contacts', ' failed.'));
- } else {
- $('#import_done').find('p').html(jsondata.message);
- }
- $('#import_done').show().find('p').addClass('bold');
- $('#progressbar').fadeOut('slow');
- });
- $('#form_container').css('display', 'none');
- $('#progressbar_container').css('display', 'block');
- window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500);
- });
- $('#contacts').change(function(){
- if($('#contacts option:selected').val() == 'newaddressbook'){
- $('#newaddressbookform').slideDown('slow');
- }else{
- $('#newaddressbookform').slideUp('slow');
- }
- });
- },
- getimportstatus: function(progresskey){
- $.get(OC.filePath('contacts', '', 'import.php') + '?progress=1&progresskey=' + progresskey, function(percent){
- $('#progressbar').progressbar('option', 'value', parseInt(percent));
- if(percent < 100){
- window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500);
- }else{
- $('#import_done').css('display', 'block');
- }
- });
- }
-}
-$(document).ready(function(){
- if(typeof FileActions !== 'undefined'){
- FileActions.register('text/vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog);
- FileActions.setDefault('text/vcard','importaddressbook');
- FileActions.register('text/x-vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog);
- FileActions.setDefault('text/x-vcard','importaddressbook');
- };
-}); \ No newline at end of file
diff --git a/apps/contacts/js/settings.js b/apps/contacts/js/settings.js
deleted file mode 100644
index 69cf473e06a..00000000000
--- a/apps/contacts/js/settings.js
+++ /dev/null
@@ -1,196 +0,0 @@
-OC.Contacts = OC.Contacts || {};
-OC.Contacts.Settings = OC.Contacts.Settings || {
- init:function() {
- this.Addressbook.adrsettings = $('.addressbooks-settings').first();
- this.Addressbook.adractions = $('#contacts-settings').find('div.actions');
- console.log('actions: ' + this.Addressbook.adractions.length);
- OC.Share.loadIcons('addressbook');
- },
- Addressbook:{
- showActions:function(act) {
- this.adractions.children().hide();
- this.adractions.children('.'+act.join(',.')).show();
- },
- doActivate:function(id, tgt) {
- var active = tgt.is(':checked');
- console.log('doActivate: ', id, active);
- $.post(OC.filePath('contacts', 'ajax', 'addressbook/activate.php'), {id: id, active: Number(active)}, function(jsondata) {
- if (jsondata.status == 'success'){
- if(!active) {
- $('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove();
- } else {
- OC.Contacts.Contacts.update();
- }
- } else {
- console.log('Error:', jsondata.data.message);
- OC.Contacts.notify(t('contacts', 'Error') + ': ' + jsondata.data.message);
- tgt.checked = !active;
- }
- });
- },
- doDelete:function(id) {
- console.log('doDelete: ', id);
- var check = confirm('Do you really want to delete this address book?');
- if(check == false){
- return false;
- } else {
- $.post(OC.filePath('contacts', 'ajax', 'addressbook/delete.php'), { id: id}, function(jsondata) {
- if (jsondata.status == 'success'){
- $('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove();
- $('.addressbooks-settings tr[data-id="'+id+'"]').remove()
- OC.Contacts.Contacts.update();
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- }
- },
- doEdit:function(id) {
- console.log('doEdit: ', id);
- this.showActions(['active', 'name', 'description', 'save', 'cancel']);
- var name = this.adrsettings.find('[data-id="'+id+'"]').find('.name').text();
- var description = this.adrsettings.find('[data-id="'+id+'"]').find('.description').text();
- var active = this.adrsettings.find('[data-id="'+id+'"]').find(':checkbox').is(':checked');
- console.log('name, desc', name, description);
- this.adractions.find('.active').prop('checked', active);
- this.adractions.find('.name').val(name);
- this.adractions.find('.description').val(description);
- this.adractions.data('id', id);
- },
- doSave:function() {
- var name = this.adractions.find('.name').val();
- var description = this.adractions.find('.description').val();
- var active = this.adractions.find('.active').is(':checked');
- var id = this.adractions.data('id');
- console.log('doSave:', id, name, description, active);
-
- if(name.length == 0) {
- OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error'));
- return false;
- }
- var url;
- if (id == 'new'){
- url = OC.filePath('contacts', 'ajax', 'addressbook/add.php');
- }else{
- url = OC.filePath('contacts', 'ajax', 'addressbook/update.php');
- }
- self = this;
- $.post(url, { id: id, name: name, active: Number(active), description: description },
- function(jsondata){
- if(jsondata.status == 'success'){
- self.showActions(['new',]);
- self.adractions.removeData('id');
- active = Boolean(Number(jsondata.data.addressbook.active));
- if(id == 'new') {
- self.adrsettings.find('table')
- .append('<tr class="addressbook" data-id="'+jsondata.data.addressbook.id+'" data-uri="'+jsondata.data.addressbook.uri+'">'
- + '<td class="active"><input type="checkbox" '+(active ? 'checked="checked"' : '')+' /></td>'
- + '<td class="name">'+jsondata.data.addressbook.displayname+'</td>'
- + '<td class="description">'+jsondata.data.addressbook.description+'</td>'
- + '<td class="action"><a class="svg action globe" title="'+t('contacts', 'Show CardDav link')+'"></a></td>'
- + '<td class="action"><a class="svg action cloud" title="'+t('contacts', 'Show read-only VCF link')+'"></a></td>'
- + '<td class="action"><a class="svg action download" title="'+t('contacts', 'Download')+'" '
- + 'href="'+OC.linkTo('contacts', 'export.php')+'?bookid='+jsondata.data.addressbook.id+'"></a></td>'
- + '<td class="action"><a class="svg action edit" title="'+t('contacts', 'Edit')+'"></a></td>'
- + '<td class="action"><a class="svg action delete" title="'+t('contacts', 'Delete')+'"></a></td>'
- + '</tr>');
- } else {
- var row = self.adrsettings.find('tr[data-id="'+id+'"]');
- row.find('td.active').find('input:checkbox').prop('checked', active);
- row.find('td.name').text(jsondata.data.addressbook.displayname);
- row.find('td.description').text(jsondata.data.addressbook.description);
- }
- OC.Contacts.Contacts.update();
- } else {
- OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
- }
- });
- },
- showLink:function(id, row, link) {
- console.log('row:', row.length);
- row.next('tr.link').remove();
- var linkrow = $('<tr class="link"><td colspan="5"><input style="width: 95%;" type="text" value="'+link+'" /></td>'
- + '<td colspan="3"><button>'+t('contacts', 'Cancel')+'</button></td></tr>').insertAfter(row);
- linkrow.find('input').focus().select();
- linkrow.find('button').click(function() {
- $(this).parents('tr').first().remove();
- });
- },
- showCardDAV:function(id) {
- console.log('showCardDAV: ', id);
- var row = this.adrsettings.find('tr[data-id="'+id+'"]');
- this.showLink(id, row, totalurl+'/'+encodeURIComponent(oc_current_user));
- },
- showVCF:function(id) {
- console.log('showVCF: ', id);
- var row = this.adrsettings.find('tr[data-id="'+id+'"]');
- var link = totalurl+'/'+encodeURIComponent(oc_current_user)+'/'+encodeURIComponent(row.data('uri'))+'?export';
- console.log(link);
- this.showLink(id, row, link);
- }
- }
-};
-
-
-$(document).ready(function() {
- OC.Contacts.Settings.init();
-
- var moreless = $('#contacts-settings').find('.moreless').first();
- moreless.keydown(function(event) {
- if(event.which == 13 || event.which == 32) {
- moreless.click();
- }
- });
- moreless.on('click', function(event) {
- event.preventDefault();
- if(OC.Contacts.Settings.Addressbook.adrsettings.is(':visible')) {
- OC.Contacts.Settings.Addressbook.adrsettings.slideUp();
- OC.Contacts.Settings.Addressbook.adrsettings.prev('dt').hide();
- moreless.text(t('contacts', 'More...'));
- } else {
- OC.Contacts.Settings.Addressbook.adrsettings.slideDown();
- OC.Contacts.Settings.Addressbook.adrsettings.prev('dt').show();
- moreless.text(t('contacts', 'Less...'));
- }
- });
-
- OC.Contacts.Settings.Addressbook.adrsettings.keydown(function(event) {
- if(event.which == 13 || event.which == 32) {
- OC.Contacts.Settings.Addressbook.adrsettings.click();
- }
- });
-
-
- OC.Contacts.Settings.Addressbook.adrsettings.on('click', function(event){
- $('.tipsy').remove();
- var tgt = $(event.target);
- if(tgt.is('a') || tgt.is(':checkbox')) {
- var id = tgt.parents('tr').first().data('id');
- if(!id) {
- return;
- }
- if(tgt.is(':checkbox')) {
- OC.Contacts.Settings.Addressbook.doActivate(id, tgt);
- } else if(tgt.is('a')) {
- if(tgt.hasClass('edit')) {
- OC.Contacts.Settings.Addressbook.doEdit(id);
- } else if(tgt.hasClass('delete')) {
- OC.Contacts.Settings.Addressbook.doDelete(id);
- } else if(tgt.hasClass('globe')) {
- OC.Contacts.Settings.Addressbook.showCardDAV(id);
- } else if(tgt.hasClass('cloud')) {
- OC.Contacts.Settings.Addressbook.showVCF(id);
- }
- }
- } else if(tgt.is('button')) {
- event.preventDefault();
- if(tgt.hasClass('save')) {
- OC.Contacts.Settings.Addressbook.doSave();
- } else if(tgt.hasClass('cancel')) {
- OC.Contacts.Settings.Addressbook.showActions(['new']);
- } else if(tgt.hasClass('new')) {
- OC.Contacts.Settings.Addressbook.doEdit('new');
- }
- }
- });
-});