2012-11-01 15:31:58 +01:00
var utils = { } ;
/ * *
* utils . isArray
*
* Best guess if object is an array .
* /
utils . isArray = function ( obj ) {
// do an instanceof check first
if ( obj instanceof Array ) {
return true ;
}
// then check for obvious falses
if ( typeof obj !== 'object' ) {
return false ;
}
if ( utils . type ( obj ) === 'array' ) {
return true ;
}
return false ;
2012-11-15 00:28:43 +01:00
} ;
utils . isInt = function ( s ) {
return typeof s === 'number' && ( s . toString ( ) . search ( /^-?[0-9]+$/ ) === 0 ) ;
}
utils . isUInt = function ( s ) {
return typeof s === 'number' && ( s . toString ( ) . search ( /^[0-9]+$/ ) === 0 ) ;
}
2012-11-01 15:31:58 +01:00
/ * *
* utils . type
*
* Attempt to ascertain actual object type .
* /
utils . type = function ( obj ) {
if ( obj === null || typeof obj === 'undefined' ) {
return String ( obj ) ;
}
return Object . prototype . toString . call ( obj )
. replace ( /\[object ([a-zA-Z]+)\]/ , '$1' ) . toLowerCase ( ) ;
} ;
utils . moveCursorToEnd = function ( el ) {
2012-11-22 08:17:57 +01:00
if ( typeof el . selectionStart === 'number' ) {
2012-11-01 15:31:58 +01:00
el . selectionStart = el . selectionEnd = el . value . length ;
2012-11-22 08:17:57 +01:00
} else if ( typeof el . createTextRange !== 'undefined' ) {
2012-11-01 15:31:58 +01:00
el . focus ( ) ;
var range = el . createTextRange ( ) ;
range . collapse ( false ) ;
range . select ( ) ;
}
}
2012-09-17 16:15:31 +02:00
if ( typeof Object . create !== 'function' ) {
2012-10-05 05:05:49 +02:00
Object . create = function ( o ) {
function F ( ) { }
F . prototype = o ;
return new F ( ) ;
} ;
2012-09-17 16:15:31 +02:00
}
2012-11-22 00:24:31 +01:00
Array . prototype . clone = function ( ) {
return this . slice ( 0 ) ;
} ;
2012-09-17 16:15:31 +02:00
Array . prototype . clean = function ( deleteValue ) {
2012-11-22 00:24:31 +01:00
var arr = this . clone ( ) ;
for ( var i = 0 ; i < arr . length ; i ++ ) {
if ( arr [ i ] == deleteValue ) {
arr . splice ( i , 1 ) ;
2012-09-17 16:15:31 +02:00
i -- ;
}
}
2012-11-22 00:24:31 +01:00
return arr ;
2012-09-17 16:15:31 +02:00
} ;
2012-10-05 05:05:49 +02:00
// Keep it DRY ;)
var wrongKey = function ( event ) {
return ( event . type === 'keydown' && ( event . keyCode !== 32 && event . keyCode !== 13 ) ) ;
}
/ * *
* Simply notifier
* Arguments :
* @ param message The text message to show .
* @ param timeout The timeout in seconds before the notification disappears . Default 10.
* @ param timeouthandler A function to run on timeout .
* @ param clickhandler A function to run on click . If a timeouthandler is given it will be cancelled on click .
* @ param data An object that will be passed as argument to the timeouthandler and clickhandler functions .
* @ param cancel If set cancel all ongoing timer events and hide the notification .
* /
OC . notify = function ( params ) {
var self = this ;
if ( ! self . notifier ) {
self . notifier = $ ( '#notification' ) ;
if ( ! self . notifier . length ) {
$ ( '#content' ) . prepend ( '<div id="notification" />' ) ;
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 ( ) {
/ * i f ( ! s e l f | | ! s e l f . n o t i f i e r ) {
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 ( ) {
/ * i f ( ! s e l f | | ! s e l f . n o t i f i e r ) {
var self = OC . Contacts ;
self . notifier = $ ( this ) ;
} * /
clearTimeout ( timer ) ;
self . notifier . off ( 'click' ) ;
params . clickhandler ( self . notifier . data ( dataid ) ) ;
self . notifier . removeData ( dataid ) ;
} ) ;
}
}
2012-10-15 21:33:21 +02:00
var GroupList = function ( groupList , listItemTmpl ) {
2012-10-05 05:05:49 +02:00
this . $groupList = groupList ;
2012-10-23 10:55:18 +02:00
var self = this ;
2012-11-22 19:32:47 +01:00
var numtypes = [ 'category' , 'fav' , 'all' ] ;
2012-10-23 10:55:18 +02:00
this . $groupList . on ( 'click' , 'h3' , function ( event ) {
2012-11-22 19:32:47 +01:00
$ ( '.tipsy' ) . remove ( ) ;
2012-10-23 10:55:18 +02:00
if ( wrongKey ( event ) ) {
return ;
}
2012-11-22 19:32:47 +01:00
console . log ( $ ( event . target ) ) ;
if ( $ ( event . target ) . is ( '.action.delete' ) ) {
var id = $ ( event . target ) . parents ( 'h3' ) . first ( ) . data ( 'id' ) ;
self . deleteGroup ( id , function ( response ) {
if ( response . status !== 'success' ) {
OC . notify ( { message : response . data . message } ) ;
}
} )
} else {
2012-11-23 01:14:45 +01:00
self . selectGroup ( { element : $ ( this ) } ) ;
2012-11-22 19:32:47 +01:00
}
2012-10-23 10:55:18 +02:00
} ) ;
2012-11-22 19:32:47 +01:00
2012-10-15 21:33:21 +02:00
this . $groupListItemTemplate = listItemTmpl ;
this . categories = [ ] ;
2012-10-05 05:05:49 +02:00
}
2012-10-19 22:09:59 +02:00
GroupList . prototype . nameById = function ( id ) {
return this . findById ( id ) . contents ( ) . filter ( function ( ) { return ( this . nodeType == 3 ) ; } ) . text ( ) . trim ( )
}
2012-10-05 05:05:49 +02:00
GroupList . prototype . findById = function ( id ) {
return this . $groupList . find ( 'h3[data-id="' + id + '"]' ) ;
}
2012-10-22 15:35:33 +02:00
GroupList . prototype . isFavorite = function ( contactid ) {
2012-10-23 06:24:22 +02:00
return this . inGroup ( contactid , 'fav' ) ;
}
2012-11-23 01:14:45 +01:00
GroupList . prototype . selectGroup = function ( params ) {
var id , $elem ;
if ( typeof params . id !== 'undefined' ) {
id = params . id ;
$elem = this . findById ( id ) ;
} else if ( typeof params . element !== 'undefined' ) {
id = params . element . data ( 'id' ) ;
$elem = params . element ;
}
2012-11-23 02:25:48 +01:00
if ( ! $elem ) {
self . selectGroup ( 'all' ) ;
return ;
}
2012-11-23 01:14:45 +01:00
console . log ( 'selectGroup' , id , $elem ) ;
this . $groupList . find ( 'h3' ) . removeClass ( 'active' ) ;
$elem . addClass ( 'active' ) ;
2012-12-07 14:47:28 +01:00
if ( id === 'new' ) {
return ;
}
2012-11-23 01:14:45 +01:00
this . lastgroup = id ;
$ ( document ) . trigger ( 'status.group.selected' , {
id : this . lastgroup ,
type : $elem . data ( 'type' ) ,
contacts : $elem . data ( 'contacts' ) ,
} ) ;
2012-10-23 10:55:18 +02:00
}
2012-10-23 06:24:22 +02:00
GroupList . prototype . inGroup = function ( contactid , groupid ) {
var $groupelem = this . findById ( groupid ) ;
2012-10-22 15:35:33 +02:00
var contacts = $groupelem . data ( 'contacts' ) ;
return ( contacts . indexOf ( contactid ) !== - 1 ) ;
}
GroupList . prototype . setAsFavorite = function ( contactid , state , cb ) {
contactid = parseInt ( contactid ) ;
var $groupelem = this . findById ( 'fav' ) ;
var contacts = $groupelem . data ( 'contacts' ) ;
if ( state ) {
OCCategories . addToFavorites ( contactid , 'contact' , function ( jsondata ) {
if ( jsondata . status === 'success' ) {
contacts . push ( contactid ) ;
$groupelem . data ( 'contacts' , contacts ) ;
$groupelem . find ( '.numcontacts' ) . text ( contacts . length ) ;
if ( contacts . length > 0 && $groupelem . is ( ':hidden' ) ) {
$groupelem . show ( ) ;
}
}
if ( typeof cb === 'function' ) {
cb ( jsondata ) ;
} else if ( jsondata . status !== 'success' ) {
OC . notify ( { message : t ( 'contacts' , jsondata . data . message ) } ) ;
}
} ) ;
} else {
OCCategories . removeFromFavorites ( contactid , 'contact' , function ( jsondata ) {
if ( jsondata . status === 'success' ) {
contacts . splice ( contacts . indexOf ( contactid ) , 1 ) ;
//console.log('contacts', contacts, contacts.indexOf(id), contacts.indexOf(String(id)));
$groupelem . data ( 'contacts' , contacts ) ;
$groupelem . find ( '.numcontacts' ) . text ( contacts . length ) ;
if ( contacts . length === 0 && $groupelem . is ( ':visible' ) ) {
$groupelem . hide ( ) ;
}
}
if ( typeof cb === 'function' ) {
cb ( jsondata ) ;
} else if ( jsondata . status !== 'success' ) {
OC . notify ( { message : t ( 'contacts' , jsondata . data . message ) } ) ;
}
} ) ;
}
}
2012-11-01 15:31:58 +01:00
/ * *
* Add one or more contact ids to a group
* @ param contactid An integer id or an array of integer ids .
* @ param groupid The integer id of the group
* @ param cb Optional call - back function
* /
2012-10-05 05:05:49 +02:00
GroupList . prototype . addTo = function ( contactid , groupid , cb ) {
2012-10-22 15:35:33 +02:00
console . log ( 'GroupList.addTo' , contactid , groupid ) ;
2012-10-05 05:05:49 +02:00
var $groupelem = this . findById ( groupid ) ;
var contacts = $groupelem . data ( 'contacts' ) ;
2012-11-01 15:31:58 +01:00
var ids = [ ] ;
2012-10-30 07:03:09 +01:00
if ( ! contacts ) {
console . log ( 'Contacts not found, adding list!!!' ) ;
contacts = [ ] ;
}
2012-10-24 20:31:29 +02:00
var self = this ;
2012-11-01 15:31:58 +01:00
var doPost = false ;
if ( typeof contactid === 'number' ) {
if ( contacts . indexOf ( contactid ) === - 1 ) {
ids . push ( contactid ) ;
doPost = true ;
} else {
if ( typeof cb == 'function' ) {
cb ( { status : 'error' , message : t ( 'contacts' , 'Contact is already in this group.' ) } ) ;
}
}
} else if ( utils . isArray ( contactid ) ) {
$ . each ( contactid , function ( i , id ) {
if ( contacts . indexOf ( id ) === - 1 ) {
ids . push ( id ) ;
}
} ) ;
if ( ids . length > 0 ) {
doPost = true ;
} else {
if ( typeof cb == 'function' ) {
cb ( { status : 'error' , message : t ( 'contacts' , 'Contacts are already in this group.' ) } ) ;
}
}
}
if ( doPost ) {
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'categories/addto.php' ) , { contactids : ids , categoryid : groupid } , function ( jsondata ) {
2012-10-05 05:05:49 +02:00
if ( ! jsondata ) {
if ( typeof cb === 'function' ) {
2012-10-30 07:03:09 +01:00
cb ( { status : 'error' , message : 'Network or server error. Please inform administrator.' } ) ;
2012-10-05 05:05:49 +02:00
}
return ;
}
if ( jsondata . status === 'success' ) {
2012-11-01 15:31:58 +01:00
contacts = contacts . concat ( ids ) . sort ( ) ;
2012-10-05 05:05:49 +02:00
$groupelem . data ( 'contacts' , contacts ) ;
2012-11-23 01:12:53 +01:00
var $numelem = $groupelem . find ( '.numcontacts' ) ;
$numelem . text ( contacts . length ) . switchClass ( '' , 'active' , 200 ) ;
setTimeout ( function ( ) {
$numelem . switchClass ( 'active' , '' , 1000 ) ;
} , 2000 ) ;
2012-10-05 05:05:49 +02:00
if ( typeof cb === 'function' ) {
2012-11-01 15:31:58 +01:00
cb ( { status : 'success' , ids : ids } ) ;
2012-10-24 20:31:29 +02:00
} else {
$ ( document ) . trigger ( 'status.group.contactadded' , {
contactid : contactid ,
groupid : groupid ,
groupname : self . nameById ( groupid ) ,
} ) ;
2012-10-05 05:05:49 +02:00
}
} else {
if ( typeof cb == 'function' ) {
2012-10-30 07:03:09 +01:00
cb ( { status : 'error' , message : jsondata . data . message } ) ;
2012-10-05 05:05:49 +02:00
}
}
} ) ;
}
}
GroupList . prototype . removeFrom = function ( contactid , groupid , cb ) {
console . log ( 'GroupList.removeFrom' , contactid , groupid ) ;
var $groupelem = this . findById ( groupid ) ;
var contacts = $groupelem . data ( 'contacts' ) ;
2012-11-01 15:31:58 +01:00
var ids = [ ] ;
2012-12-10 05:51:35 +01:00
// If it's the 'all' group simply decrement the number
if ( groupid === 'all' ) {
var $numelem = $groupelem . find ( '.numcontacts' ) ;
$numelem . text ( parseInt ( $numelem . text ( ) - 1 ) ) . switchClass ( '' , 'active' , 200 ) ;
setTimeout ( function ( ) {
$numelem . switchClass ( 'active' , '' , 1000 ) ;
} , 2000 ) ;
if ( typeof cb === 'function' ) {
cb ( { status : 'success' , ids : [ id ] } ) ;
}
}
2012-10-05 05:05:49 +02:00
// If the contact is in the category remove it from internal list.
if ( ! contacts ) {
2012-10-30 07:03:09 +01:00
if ( typeof cb === 'function' ) {
cb ( { status : 'error' , message : t ( 'contacts' , 'Couldn\'t get contact list.' ) } ) ;
}
2012-10-05 05:05:49 +02:00
return ;
}
2012-11-01 15:31:58 +01:00
var doPost = false ;
if ( typeof contactid === 'number' ) {
if ( contacts . indexOf ( contactid ) !== - 1 ) {
ids . push ( contactid ) ;
doPost = true ;
} else {
if ( typeof cb == 'function' ) {
cb ( { status : 'error' , message : t ( 'contacts' , 'Contact is not in this group.' ) } ) ;
}
}
} else if ( utils . isArray ( contactid ) ) {
$ . each ( contactid , function ( i , id ) {
if ( contacts . indexOf ( id ) !== - 1 ) {
ids . push ( id ) ;
}
} ) ;
if ( ids . length > 0 ) {
doPost = true ;
} else {
console . log ( contactid , 'not in' , contacts ) ;
if ( typeof cb == 'function' ) {
cb ( { status : 'error' , message : t ( 'contacts' , 'Contacts are not in this group.' ) } ) ;
}
}
}
if ( doPost ) {
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'categories/removefrom.php' ) , { contactids : ids , categoryid : groupid } , function ( jsondata ) {
2012-10-05 05:05:49 +02:00
if ( ! jsondata ) {
if ( typeof cb === 'function' ) {
2012-10-30 07:03:09 +01:00
cb ( { status : 'error' , message : 'Network or server error. Please inform administrator.' } ) ;
2012-10-05 05:05:49 +02:00
}
return ;
}
if ( jsondata . status === 'success' ) {
2012-11-01 15:31:58 +01:00
$ . each ( ids , function ( idx , id ) {
contacts . splice ( contacts . indexOf ( id ) , 1 ) ;
} ) ;
2012-10-05 05:05:49 +02:00
//console.log('contacts', contacts, contacts.indexOf(id), contacts.indexOf(String(id)));
$groupelem . data ( 'contacts' , contacts ) ;
2012-11-23 01:12:53 +01:00
var $numelem = $groupelem . find ( '.numcontacts' ) ;
$numelem . text ( contacts . length ) . switchClass ( '' , 'active' , 200 ) ;
setTimeout ( function ( ) {
$numelem . switchClass ( 'active' , '' , 1000 ) ;
} , 2000 ) ;
2012-10-05 05:05:49 +02:00
if ( typeof cb === 'function' ) {
2012-11-01 15:31:58 +01:00
cb ( { status : 'success' , ids : ids } ) ;
2012-10-05 05:05:49 +02:00
}
} else {
if ( typeof cb == 'function' ) {
2012-10-30 07:03:09 +01:00
cb ( { status : 'error' , message : jsondata . data . message } ) ;
2012-10-05 05:05:49 +02:00
}
}
} ) ;
}
}
GroupList . prototype . removeFromAll = function ( contactid , alsospecial ) {
var self = this ;
var selector = alsospecial ? 'h3' : 'h3[data-type="category"]' ;
$ . each ( this . $groupList . find ( selector ) , function ( i , group ) {
self . removeFrom ( contactid , $ ( this ) . data ( 'id' ) ) ;
} ) ;
}
2012-10-19 22:09:59 +02:00
GroupList . prototype . categoriesChanged = function ( newcategories ) {
console . log ( 'GroupList.categoriesChanged, I should do something' ) ;
}
2012-10-24 20:31:29 +02:00
GroupList . prototype . contactDropped = function ( event , ui ) {
var dragitem = ui . draggable , droptarget = $ ( this ) ;
console . log ( 'dropped' , dragitem ) ;
if ( dragitem . is ( 'tr' ) ) {
console . log ( 'tr dropped' , dragitem . data ( 'id' ) , 'on' , $ ( this ) . data ( 'id' ) ) ;
2012-11-22 19:32:47 +01:00
if ( $ ( this ) . data ( 'type' ) === 'fav' ) {
$ ( this ) . data ( 'obj' ) . setAsFavorite ( dragitem . data ( 'id' ) , true ) ;
} else {
$ ( this ) . data ( 'obj' ) . addTo ( dragitem . data ( 'id' ) , $ ( this ) . data ( 'id' ) ) ;
}
2012-10-24 20:31:29 +02:00
}
}
2012-11-22 19:32:47 +01:00
GroupList . prototype . deleteGroup = function ( groupid , cb ) {
var $elem = this . findById ( groupid ) ;
2012-11-23 01:14:45 +01:00
var $newelem = $elem . prev ( 'h3' ) ;
2012-11-22 19:32:47 +01:00
var name = this . nameById ( groupid ) ;
var contacts = $elem . data ( 'contacts' ) ;
var self = this ;
console . log ( 'delete group' , groupid , contacts ) ;
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'categories/delete.php' ) , { categories : name } , function ( jsondata ) {
if ( jsondata && jsondata . status == 'success' ) {
2012-11-23 01:14:45 +01:00
$ ( document ) . trigger ( 'status.group.groupremoved' , {
groupid : groupid ,
newgroupid : parseInt ( $newelem . data ( 'id' ) ) ,
groupname : self . nameById ( groupid ) ,
contacts : contacts ,
2012-11-22 19:32:47 +01:00
} ) ;
$elem . remove ( ) ;
2012-11-23 01:14:45 +01:00
self . selectGroup ( { element : $newelem } ) ;
2012-11-22 19:32:47 +01:00
} else {
2012-11-23 01:14:45 +01:00
//
2012-11-22 19:32:47 +01:00
}
if ( typeof cb === 'function' ) {
cb ( jsondata ) ;
}
} ) ;
}
2012-12-07 14:47:28 +01:00
GroupList . prototype . editGroup = function ( id ) {
var self = this ;
// NOTE: Currently this only works for adding, not renaming
var saveChanges = function ( $elem , $input ) {
console . log ( 'saveChanges' , $input . val ( ) ) ;
var name = $input . val ( ) . trim ( ) ;
if ( name . length === 0 ) {
return false ;
}
$input . prop ( 'disabled' , true ) ;
$elem . data ( 'name' , '' ) ;
self . addGroup ( { name : name , element : $elem } , function ( response ) {
if ( response . status === 'success' ) {
$elem . prepend ( name ) . removeClass ( 'editing' ) . attr ( 'data-id' , response . id ) ;
$input . next ( '.checked' ) . remove ( )
$input . remove ( )
} else {
$input . prop ( 'disabled' , false ) ;
OC . notify ( { message : response . message } ) ;
}
} ) ;
}
if ( typeof id === 'undefined' ) {
// Add new group
var tmpl = this . $groupListItemTemplate ;
var $elem = ( tmpl ) . octemplate ( {
id : 'new' ,
type : 'category' ,
num : 0 ,
name : '' ,
} ) ;
var $input = $ ( '<input type="text" class="active" /><a class="action checked disabled" />' ) ;
$elem . prepend ( $input ) . addClass ( 'editing' ) ;
$elem . data ( 'contacts' , [ ] ) ;
this . $groupList . find ( 'h3.group[data-type="category"]' ) . first ( ) . before ( $elem ) ;
this . selectGroup ( { element : $elem } ) ;
$input . on ( 'input' , function ( event ) {
if ( $ ( this ) . val ( ) . length > 0 ) {
$ ( this ) . next ( '.checked' ) . removeClass ( 'disabled' ) ;
} else {
$ ( this ) . next ( '.checked' ) . addClass ( 'disabled' ) ;
}
} ) ;
2012-12-07 15:42:42 +01:00
$input . on ( 'keyup' , function ( event ) {
var keyCode = Math . max ( event . keyCode , event . which ) ;
if ( keyCode === 13 ) {
2012-12-07 14:47:28 +01:00
saveChanges ( $elem , $ ( this ) ) ;
2012-12-07 15:42:42 +01:00
} else if ( keyCode === 27 ) {
$elem . remove ( ) ;
2012-12-07 14:47:28 +01:00
}
} ) ;
$input . next ( '.checked' ) . on ( 'click keydown' , function ( event ) {
console . log ( 'clicked' , event ) ;
if ( wrongKey ( event ) ) {
return ;
}
saveChanges ( $elem , $input ) ;
} ) ;
$input . focus ( ) ;
} else if ( utils . isUInt ( id ) ) {
var $elem = this . findById ( id ) ;
var $text = $elem . contents ( ) . filter ( function ( ) { return ( this . nodeType == 3 ) ; } ) ;
var name = $text . text ( ) ;
console . log ( 'Group name' , $text , name ) ;
$text . remove ( ) ;
var $input = $ ( '<input type="text" class="active" value="' + name + '" /><a class="action checked disabled />' ) ;
$elem . prepend ( $input ) . addClass ( 'editing' ) ;
$input . focus ( ) ;
} else {
throw { name : 'WrongParameterType' , message : 'GroupList.editGroup only accept integers.' }
}
}
GroupList . prototype . addGroup = function ( params , cb ) {
console . log ( 'GroupList.addGroup' , params . name ) ;
var name = params . name ;
2012-11-14 15:27:38 +01:00
contacts = [ ] ; // $.map(contacts, function(c) {return parseInt(c)});
2012-10-19 22:09:59 +02:00
var self = this , exists = false ;
self . $groupList . find ( 'h3[data-type="category"]' ) . each ( function ( ) {
if ( $ ( this ) . data ( 'name' ) . toLowerCase ( ) === name . toLowerCase ( ) ) {
exists = true ;
return false ; //break out of loop
}
} ) ;
if ( exists ) {
if ( typeof cb === 'function' ) {
2012-11-14 15:27:38 +01:00
cb ( { status : 'error' , message : t ( 'contacts' , 'A group named {group} already exists' , { group : name } ) } ) ;
2012-10-19 22:09:59 +02:00
}
return ;
}
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'categories/add.php' ) , { category : name } , function ( jsondata ) {
if ( jsondata && jsondata . status == 'success' ) {
var tmpl = self . $groupListItemTemplate ;
2012-12-07 14:47:28 +01:00
var $elem = params . element
? params . element
: ( tmpl ) . octemplate ( {
id : jsondata . data . id ,
type : 'category' ,
num : contacts . length ,
name : name ,
} )
2012-10-19 22:09:59 +02:00
self . categories . push ( { id : jsondata . data . id , name : name } ) ;
2012-10-24 20:31:29 +02:00
$elem . data ( 'obj' , self ) ;
$elem . data ( 'contacts' , contacts ) ;
$elem . data ( 'name' , name ) ;
$elem . data ( 'id' , jsondata . data . id ) ;
2012-10-19 22:09:59 +02:00
var added = false ;
self . $groupList . find ( 'h3.group[data-type="category"]' ) . each ( function ( ) {
if ( $ ( this ) . data ( 'name' ) . toLowerCase ( ) . localeCompare ( name . toLowerCase ( ) ) > 0 ) {
$ ( this ) . before ( $elem ) ;
added = true ;
return false ;
}
} ) ;
if ( ! added ) {
2012-11-14 15:27:38 +01:00
$elem . insertAfter ( self . $groupList . find ( 'h3.group[data-type="category"]' ) . last ( ) ) ;
2012-10-19 22:09:59 +02:00
}
2012-12-07 14:47:28 +01:00
self . selectGroup ( { element : $elem } ) ;
$elem . tipsy ( { trigger : 'manual' , gravity : 'w' , fallback : t ( 'contacts' , 'You can drag groups to\narrange them as you like.' ) } ) ;
$elem . tipsy ( 'show' ) ;
2012-10-19 22:09:59 +02:00
if ( typeof cb === 'function' ) {
2012-11-14 15:27:38 +01:00
cb ( { status : 'success' , id : parseInt ( jsondata . data . id ) , name : name } ) ;
2012-10-19 22:09:59 +02:00
}
} else {
if ( typeof cb === 'function' ) {
2012-11-14 15:27:38 +01:00
cb ( { status : 'error' , message : jsondata . data . message } ) ;
2012-10-19 22:09:59 +02:00
}
}
} ) ;
}
2012-10-15 21:33:21 +02:00
GroupList . prototype . loadGroups = function ( numcontacts , cb ) {
var self = this ;
2012-10-24 20:31:29 +02:00
var acceptdrop = 'tr.contact' ;
2012-10-15 21:33:21 +02:00
var $groupList = this . $groupList ;
var tmpl = this . $groupListItemTemplate ;
2012-10-22 15:35:33 +02:00
2012-10-15 21:33:21 +02:00
tmpl . octemplate ( { id : 'all' , type : 'all' , num : numcontacts , name : t ( 'contacts' , 'All' ) } ) . appendTo ( $groupList ) ;
$ . getJSON ( OC . filePath ( 'contacts' , 'ajax' , 'categories/list.php' ) , { } , function ( jsondata ) {
if ( jsondata && jsondata . status == 'success' ) {
2012-10-23 10:55:18 +02:00
self . lastgroup = jsondata . data . lastgroup ;
2012-10-26 14:03:42 +02:00
self . sortorder = jsondata . data . sortorder . length > 0
? $ . map ( jsondata . data . sortorder . split ( ',' ) , function ( c ) { return parseInt ( c ) } )
: [ ] ;
2012-10-26 01:57:16 +02:00
console . log ( 'sortorder' , self . sortorder ) ;
2012-10-22 15:35:33 +02:00
// Favorites
var contacts = $ . map ( jsondata . data . favorites , function ( c ) { return parseInt ( c ) } ) ;
var $elem = tmpl . octemplate ( {
id : 'fav' ,
type : 'fav' ,
num : contacts . length ,
name : t ( 'contacts' , 'Favorites' )
} ) . appendTo ( $groupList ) ;
2012-10-24 20:31:29 +02:00
$elem . data ( 'obj' , self ) ;
2012-12-07 15:08:25 +01:00
$elem . data ( 'contacts' , contacts ) . find ( '.numcontacts' ) . before ( '<span class="starred action" />' ) ;
2012-10-24 20:31:29 +02:00
$elem . droppable ( {
drop : self . contactDropped ,
2012-11-22 19:33:32 +01:00
activeClass : 'ui-state-active' ,
hoverClass : 'ui-state-hover' ,
2012-10-24 20:31:29 +02:00
accept : acceptdrop
} ) ;
2012-10-22 15:35:33 +02:00
if ( contacts . length === 0 ) {
$elem . hide ( ) ;
}
console . log ( 'favorites' , $elem . data ( 'contacts' ) ) ;
// Normal groups
2012-10-15 21:33:21 +02:00
$ . each ( jsondata . data . categories , function ( c , category ) {
2012-10-19 22:09:59 +02:00
var contacts = $ . map ( category . contacts , function ( c ) { return parseInt ( c ) } ) ;
2012-10-15 21:33:21 +02:00
var $elem = ( tmpl ) . octemplate ( {
2012-10-22 15:35:33 +02:00
id : category . id ,
type : 'category' ,
2012-10-19 22:09:59 +02:00
num : contacts . length ,
2012-10-15 21:33:21 +02:00
name : category . name ,
2012-10-22 15:35:33 +02:00
} ) ;
2012-10-15 21:33:21 +02:00
self . categories . push ( { id : category . id , name : category . name } ) ;
2012-10-24 20:31:29 +02:00
$elem . data ( 'obj' , self ) ;
$elem . data ( 'contacts' , contacts ) ;
$elem . data ( 'name' , category . name ) ;
$elem . data ( 'id' , category . id ) ;
$elem . droppable ( {
drop : self . contactDropped ,
activeClass : 'ui-state-hover' ,
accept : acceptdrop
} ) ;
$elem . appendTo ( $groupList ) ;
} ) ;
2012-10-26 01:57:16 +02:00
var elems = $groupList . find ( 'h3[data-type="category"]' ) . get ( ) ;
elems . sort ( function ( a , b ) {
return self . sortorder . indexOf ( parseInt ( $ ( a ) . data ( 'id' ) ) ) > self . sortorder . indexOf ( parseInt ( $ ( b ) . data ( 'id' ) ) ) ;
} ) ;
$ . each ( elems , function ( index , elem ) {
$groupList . append ( elem ) ;
} ) ;
2012-10-24 20:31:29 +02:00
// Shared addressbook
$ . each ( jsondata . data . shared , function ( c , shared ) {
var sharedindicator = '<img class="shared svg" src="' + OC . imagePath ( 'core' , 'actions/shared' ) + '"'
+ 'title="' + t ( 'contacts' , 'Shared by {owner}' , { owner : shared . userid } ) + '" />'
var $elem = ( tmpl ) . octemplate ( {
id : shared . id ,
type : 'shared' ,
num : '' , //jsondata.data.shared.length,
name : shared . displayname ,
} ) ;
$elem . find ( '.numcontacts' ) . after ( sharedindicator ) ;
$elem . data ( 'obj' , self ) ;
$elem . data ( 'name' , shared . displayname ) ;
$elem . data ( 'id' , shared . id ) ;
2012-10-15 21:33:21 +02:00
$elem . appendTo ( $groupList ) ;
} ) ;
2012-10-26 01:57:16 +02:00
$groupList . sortable ( {
items : 'h3[data-type="category"]' ,
stop : function ( ) {
console . log ( 'stop sorting' , $ ( this ) ) ;
var ids = [ ] ;
$ . each ( $ ( this ) . children ( 'h3[data-type="category"]' ) , function ( i , elem ) {
ids . push ( $ ( elem ) . data ( 'id' ) )
} )
self . sortorder = ids ;
$ ( document ) . trigger ( 'status.groups.sorted' , {
sortorder : self . sortorder . join ( ',' ) ,
} ) ;
} ,
} ) ;
2012-10-23 10:55:18 +02:00
var $elem = self . findById ( self . lastgroup ) ;
$elem . addClass ( 'active' ) ;
$ ( document ) . trigger ( 'status.group.selected' , {
id : self . lastgroup ,
type : $elem . data ( 'type' ) ,
contacts : $elem . data ( 'contacts' ) ,
} ) ;
2012-10-19 22:09:59 +02:00
} // TODO: else
2012-10-15 21:33:21 +02:00
if ( typeof cb === 'function' ) {
cb ( ) ;
}
} ) ;
}
2012-09-17 16:15:31 +02:00
OC . Contacts = OC . Contacts || {
2012-10-05 05:05:49 +02:00
init : function ( id ) {
2012-11-22 00:25:40 +01:00
if ( oc _debug === true ) {
$ ( document ) . ajaxError ( function ( e , xhr , settings , exception ) {
// Don't try to get translation because it's likely a network error.
OC . notify ( {
message : 'error in: ' + settings . url + ', ' + 'error: ' + xhr . responseText ,
} ) ;
2012-10-25 23:15:47 +02:00
} ) ;
2012-11-22 00:25:40 +01:00
}
2012-11-01 02:01:00 +01:00
//if(id) {
2012-10-05 05:05:49 +02:00
this . currentid = parseInt ( id ) ;
console . log ( 'init, id:' , id ) ;
2012-11-01 02:01:00 +01:00
//}
2012-10-05 05:05:49 +02:00
// Holds an array of {id,name} maps
2012-09-17 16:15:31 +02:00
this . scrollTimeoutMiliSecs = 100 ;
this . isScrolling = false ;
this . cacheElements ( ) ;
2012-12-13 02:30:20 +01:00
this . contacts = new OC . Contacts . ContactList (
2012-10-22 15:35:33 +02:00
this . $contactList ,
this . $contactListItemTemplate ,
2012-09-17 16:15:31 +02:00
this . $contactFullTemplate ,
this . detailTemplates
) ;
2012-12-13 02:30:20 +01:00
this . groups = new GroupList ( this . $groupList , this . $groupListItemTemplate ) ;
OCCategories . changed = this . groups . categoriesChanged ;
2012-10-19 22:09:59 +02:00
OCCategories . app = 'contacts' ;
OCCategories . type = 'contact' ;
2012-09-17 16:15:31 +02:00
this . bindEvents ( ) ;
2012-10-05 05:05:49 +02:00
this . $toggleAll . show ( ) ;
2012-11-13 17:01:14 +01:00
this . showActions ( [ 'addcontact' ] ) ;
2012-11-27 02:42:17 +01:00
2012-11-15 06:07:44 +01:00
// Wait 2 mins then check if contacts are indexed.
setTimeout ( function ( ) {
if ( ! is _indexed ) {
OC . notify ( { message : t ( 'contacts' , 'Indexing contacts' ) , timeout : 20 } ) ;
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'indexproperties.php' ) ) ;
} else {
console . log ( 'contacts are indexed.' ) ;
}
} , 10000 ) ;
2012-09-17 16:15:31 +02:00
} ,
loading : function ( obj , state ) {
2012-10-24 20:31:29 +02:00
$ ( obj ) . toggleClass ( 'loading' , state ) ;
2012-09-17 16:15:31 +02:00
} ,
2012-10-05 05:05:49 +02:00
/ * *
* Show / hide elements in the header
* @ param act An array of actions to show based on class name e . g [ 'add' , 'delete' ]
* /
2012-11-13 17:01:14 +01:00
hideActions : function ( ) {
this . showActions ( false ) ;
} ,
2012-10-05 05:05:49 +02:00
showActions : function ( act ) {
this . $headeractions . children ( ) . hide ( ) ;
2012-11-13 17:01:14 +01:00
if ( act && act . length > 0 ) {
this . $headeractions . children ( '.' + act . join ( ',.' ) ) . show ( ) ;
}
2012-10-05 05:05:49 +02:00
} ,
showAction : function ( act , show ) {
2012-10-24 20:31:29 +02:00
this . $headeractions . find ( '.' + act ) . toggle ( show ) ;
2012-10-05 05:05:49 +02:00
} ,
2012-09-17 16:15:31 +02:00
cacheElements : function ( ) {
var self = this ;
this . detailTemplates = { } ;
// Load templates for contact details.
// The weird double loading is because jquery apparently doesn't
// create a searchable object from a script element.
$ . each ( $ ( $ ( '#contactDetailsTemplate' ) . html ( ) ) , function ( idx , node ) {
if ( node . nodeType === Node . ELEMENT _NODE && node . nodeName === 'DIV' ) {
var $tmpl = $ ( node . innerHTML ) ;
self . detailTemplates [ $tmpl . data ( 'element' ) ] = $ ( node . outerHTML ) ;
}
} ) ;
this . $groupListItemTemplate = $ ( '#groupListItemTemplate' ) ;
this . $contactListItemTemplate = $ ( '#contactListItemTemplate' ) ;
this . $contactFullTemplate = $ ( '#contactFullTemplate' ) ;
this . $contactDetailsTemplate = $ ( '#contactDetailsTemplate' ) ;
this . $rightContent = $ ( '#rightcontent' ) ;
this . $header = $ ( '#contactsheader' ) ;
2012-10-05 05:05:49 +02:00
this . $headeractions = this . $header . find ( 'div.actions' ) ;
2012-09-17 16:15:31 +02:00
this . $groupList = $ ( '#grouplist' ) ;
this . $contactList = $ ( '#contactlist' ) ;
this . $contactListHeader = $ ( '#contactlistheader' ) ;
this . $toggleAll = $ ( '#toggle_all' ) ;
2012-10-05 05:05:49 +02:00
this . $groups = this . $headeractions . find ( '.groups' ) ;
this . $ninjahelp = $ ( '#ninjahelp' ) ;
2012-11-15 02:40:47 +01:00
this . $firstRun = $ ( '#firstrun' ) ;
2012-11-13 17:01:14 +01:00
this . $settings = $ ( '#contacts-settings' ) ;
2012-12-03 19:39:28 +01:00
this . $importFileInput = $ ( '#import_fileupload' ) ;
this . $importIntoSelect = $ ( '#import_into' ) ;
2012-10-05 05:05:49 +02:00
} ,
// Build the select to add/remove from groups.
buildGroupSelect : function ( ) {
2012-10-24 20:31:29 +02:00
// If a contact is open we know which categories it's in
2012-10-05 05:05:49 +02:00
if ( this . currentid ) {
2012-12-13 02:30:20 +01:00
var contact = this . contacts . contacts [ this . currentid ] ;
2012-10-05 05:05:49 +02:00
this . $groups . find ( 'optgroup,option:not([value="-1"])' ) . remove ( ) ;
var addopts = '' , rmopts = '' ;
2012-12-13 02:30:20 +01:00
$ . each ( this . groups . categories , function ( i , category ) {
2012-10-05 05:05:49 +02:00
if ( contact . inGroup ( category . name ) ) {
rmopts += '<option value="' + category . id + '">' + category . name + '</option>' ;
} else {
addopts += '<option value="' + category . id + '">' + category . name + '</option>' ;
}
} ) ;
if ( addopts . length ) {
$ ( addopts ) . appendTo ( this . $groups )
. wrapAll ( '<optgroup data-action="add" label="' + t ( 'contacts' , 'Add to...' ) + '"/>' ) ;
}
if ( rmopts . length ) {
$ ( rmopts ) . appendTo ( this . $groups )
. wrapAll ( '<optgroup data-action="remove" label="' + t ( 'contacts' , 'Remove from...' ) + '"/>' ) ;
}
2012-12-13 02:30:20 +01:00
} else if ( this . contacts . getSelectedContacts ( ) . length > 0 ) { // Otherwise add all categories to both add and remove
2012-10-05 05:05:49 +02:00
this . $groups . find ( 'optgroup,option:not([value="-1"])' ) . remove ( ) ;
var addopts = '' , rmopts = '' ;
2012-12-13 02:30:20 +01:00
$ . each ( this . groups . categories , function ( i , category ) {
2012-10-05 05:05:49 +02:00
rmopts += '<option value="' + category . id + '">' + category . name + '</option>' ;
addopts += '<option value="' + category . id + '">' + category . name + '</option>' ;
} ) ;
$ ( addopts ) . appendTo ( this . $groups )
. wrapAll ( '<optgroup data-action="add" label="' + t ( 'contacts' , 'Add to...' ) + '"/>' ) ;
$ ( rmopts ) . appendTo ( this . $groups )
. wrapAll ( '<optgroup data-action="remove" label="' + t ( 'contacts' , 'Remove from...' ) + '"/>' ) ;
2012-11-05 12:39:49 +01:00
} else {
// 3rd option: No contact open, none checked, just show "Add group..."
this . $groups . find ( 'optgroup,option:not([value="-1"])' ) . remove ( ) ;
2012-10-05 05:05:49 +02:00
}
$ ( '<option value="add">' + t ( 'contacts' , 'Add group...' ) + '</option>' ) . appendTo ( this . $groups ) ;
this . $groups . val ( - 1 ) ;
2012-09-17 16:15:31 +02:00
} ,
bindEvents : function ( ) {
var self = this ;
2012-10-22 15:35:33 +02:00
2012-11-05 20:45:08 +01:00
// Should fix Opera check for delayed delete.
$ ( window ) . unload ( function ( ) {
$ ( window ) . trigger ( 'beforeunload' ) ;
} ) ;
2012-10-05 05:05:49 +02:00
// App specific events
2012-09-17 16:15:31 +02:00
$ ( document ) . bind ( 'status.contact.deleted' , function ( e , data ) {
var id = parseInt ( data . id ) ;
console . log ( 'contact' , data . id , 'deleted' ) ;
2012-10-05 05:05:49 +02:00
// update counts on group lists
2012-12-13 02:30:20 +01:00
self . groups . removeFromAll ( data . id , true )
2012-10-05 05:05:49 +02:00
} ) ;
2012-11-13 22:42:55 +01:00
$ ( document ) . bind ( 'status.contact.added' , function ( e , data ) {
self . currentid = parseInt ( data . id ) ;
2012-11-15 20:35:35 +01:00
self . buildGroupSelect ( ) ;
2012-12-11 06:18:57 +01:00
self . hideActions ( ) ;
2012-11-13 22:42:55 +01:00
} ) ;
2012-10-05 05:05:49 +02:00
$ ( document ) . bind ( 'status.contact.error' , function ( e , data ) {
OC . notify ( { message : data . message } ) ;
2012-09-17 16:15:31 +02:00
} ) ;
2012-11-13 22:42:55 +01:00
2012-09-17 16:15:31 +02:00
$ ( document ) . bind ( 'status.contact.enabled' , function ( e , enabled ) {
2012-10-05 05:05:49 +02:00
console . log ( 'status.contact.enabled' , enabled )
2012-12-11 06:18:57 +01:00
/ * i f ( e n a b l e d ) {
2012-12-10 00:02:06 +01:00
self . showActions ( [ 'back' , 'download' , 'delete' , 'groups' ] ) ;
2012-09-17 16:15:31 +02:00
} else {
2012-10-05 05:05:49 +02:00
self . showActions ( [ 'back' ] ) ;
2012-12-11 06:18:57 +01:00
} * /
2012-09-17 16:15:31 +02:00
} ) ;
2012-11-13 22:42:55 +01:00
2012-09-30 06:38:53 +02:00
$ ( document ) . bind ( 'status.contacts.loaded' , function ( e , result ) {
console . log ( 'status.contacts.loaded' , result ) ;
2012-09-17 16:15:31 +02:00
if ( result . status !== true ) {
alert ( 'Error loading contacts!' ) ;
2012-10-05 05:05:49 +02:00
} else {
self . numcontacts = result . numcontacts ;
2012-10-30 07:03:09 +01:00
self . loading ( self . $rightContent , false ) ;
2012-12-13 02:30:20 +01:00
self . groups . loadGroups ( self . numcontacts , function ( ) {
2012-10-30 07:03:09 +01:00
self . loading ( $ ( '#leftcontent' ) , false ) ;
2012-11-01 02:01:00 +01:00
console . log ( 'Groups loaded, currentid' , self . currentid ) ;
2012-10-05 05:05:49 +02:00
if ( self . currentid ) {
self . openContact ( self . currentid ) ;
}
} ) ;
2012-09-17 16:15:31 +02:00
}
2012-10-05 05:05:49 +02:00
} ) ;
2012-11-13 22:42:55 +01:00
2012-10-05 05:05:49 +02:00
$ ( document ) . bind ( 'status.contact.currentlistitem' , function ( e , result ) {
//console.log('status.contact.currentlistitem', result, self.$rightContent.height());
if ( self . dontScroll !== true ) {
if ( result . pos > self . $rightContent . height ( ) ) {
self . $rightContent . scrollTop ( result . pos - self . $rightContent . height ( ) + result . height ) ;
}
else if ( result . pos < self . $rightContent . offset ( ) . top ) {
self . $rightContent . scrollTop ( result . pos ) ;
}
} else {
setTimeout ( function ( ) {
self . dontScroll = false ;
} , 100 ) ;
}
self . currentlistid = result . id
} ) ;
2012-11-23 01:16:46 +01:00
2012-10-05 05:05:49 +02:00
$ ( document ) . bind ( 'status.nomorecontacts' , function ( e , result ) {
console . log ( 'status.nomorecontacts' , result ) ;
2012-11-15 02:40:47 +01:00
self . $contactList . hide ( ) ;
self . $firstRun . show ( ) ;
2012-10-05 05:05:49 +02:00
// TODO: Show a first-run page.
} ) ;
2012-11-23 01:16:46 +01:00
2012-10-05 05:05:49 +02:00
$ ( document ) . bind ( 'status.visiblecontacts' , function ( e , result ) {
console . log ( 'status.visiblecontacts' , result ) ;
// TODO: To be decided.
} ) ;
2012-11-23 01:16:46 +01:00
2012-10-05 05:05:49 +02:00
// A contact id was in the request
$ ( document ) . bind ( 'request.loadcontact' , function ( e , result ) {
console . log ( 'request.loadcontact' , result ) ;
if ( self . numcontacts ) {
self . openContact ( result . id ) ;
} else {
// Contacts are not loaded yet, try again.
console . log ( 'waiting for contacts to load' ) ;
setTimeout ( function ( ) {
$ ( document ) . trigger ( 'request.loadcontact' , {
id : result . id ,
} ) ;
} , 1000 ) ;
}
} ) ;
2012-11-23 01:16:46 +01:00
2012-12-10 00:02:06 +01:00
$ ( document ) . bind ( 'request.contact.setasfavorite' , function ( e , data ) {
var id = parseInt ( data . id ) ;
console . log ( 'contact' , data . id , 'request.contact.setasfavorite' ) ;
2012-12-13 02:30:20 +01:00
self . groups . setAsFavorite ( data . id , data . state ) ;
2012-12-10 00:02:06 +01:00
} ) ;
2012-12-11 04:05:34 +01:00
$ ( document ) . bind ( 'request.contact.export' , function ( e , data ) {
var id = parseInt ( data . id ) ;
console . log ( 'contact' , data . id , 'request.contact.export' ) ;
document . location . href = OC . linkTo ( 'contacts' , 'export.php' ) + '?contactid=' + self . currentid ;
} ) ;
2012-12-10 00:02:06 +01:00
$ ( document ) . bind ( 'request.contact.close' , function ( e , data ) {
var id = parseInt ( data . id ) ;
console . log ( 'contact' , data . id , 'request.contact.close' ) ;
self . closeContact ( id ) ;
} ) ;
2012-12-11 04:05:34 +01:00
$ ( document ) . bind ( 'request.contact.delete' , function ( e , data ) {
var id = parseInt ( data . id ) ;
console . log ( 'contact' , data . id , 'request.contact.delete' ) ;
2012-12-13 02:30:20 +01:00
self . contacts . delayedDelete ( id ) ;
2012-12-11 04:05:34 +01:00
self . $contactList . removeClass ( 'dim' ) ;
2012-12-11 06:18:57 +01:00
self . showActions ( [ 'add' ] ) ;
2012-12-11 04:05:34 +01:00
} ) ;
2012-10-15 21:33:21 +02:00
$ ( document ) . bind ( 'request.select.contactphoto.fromlocal' , function ( e , result ) {
console . log ( 'request.select.contactphoto.fromlocal' , result ) ;
$ ( '#contactphoto_fileupload' ) . trigger ( 'click' ) ;
} ) ;
2012-11-23 01:16:46 +01:00
2012-10-15 21:33:21 +02:00
$ ( document ) . bind ( 'request.select.contactphoto.fromcloud' , function ( e , result ) {
console . log ( 'request.select.contactphoto.fromcloud' , result ) ;
OC . dialogs . filepicker ( t ( 'contacts' , 'Select photo' ) , function ( path ) {
self . cloudPhotoSelected ( self . currentid , path ) ;
} , false , 'image' , true ) ;
} ) ;
2012-11-23 01:16:46 +01:00
2012-10-15 21:33:21 +02:00
$ ( document ) . bind ( 'request.edit.contactphoto' , function ( e , result ) {
console . log ( 'request.edit.contactphoto' , result ) ;
self . editCurrentPhoto ( result . id ) ;
} ) ;
2012-11-23 01:16:46 +01:00
2012-10-05 05:05:49 +02:00
$ ( document ) . bind ( 'request.addressbook.activate' , function ( e , result ) {
console . log ( 'request.addressbook.activate' , result ) ;
2012-12-13 02:30:20 +01:00
self . contacts . showFromAddressbook ( result . id , result . activate ) ;
2012-09-17 16:15:31 +02:00
} ) ;
2012-10-22 15:35:33 +02:00
2012-11-23 01:16:46 +01:00
$ ( document ) . bind ( 'status.contact.removedfromgroup' , function ( e , result ) {
console . log ( 'status.contact.removedfromgroup' , result ) ;
if ( self . currentgroup == result . groupid ) {
2012-12-13 02:30:20 +01:00
self . contacts . hideContact ( result . contactid ) ;
2012-11-23 01:16:46 +01:00
self . closeContact ( result . contactid ) ;
}
} ) ;
$ ( document ) . bind ( 'status.group.groupremoved' , function ( e , result ) {
console . log ( 'status.group.groupremoved' , result ) ;
if ( parseInt ( result . groupid ) === parseInt ( self . currentgroup ) ) {
console . time ( 'hiding' ) ;
2012-12-13 02:30:20 +01:00
self . contacts . showContacts ( [ ] ) ;
2012-11-23 01:16:46 +01:00
console . timeEnd ( 'hiding' ) ;
self . currentgroup = 'all' ;
}
$ . each ( result . contacts , function ( idx , contactid ) {
2012-12-13 02:30:20 +01:00
var contact = self . contacts . findById ( contactid ) ;
2012-11-23 02:25:48 +01:00
console . log ( 'contactid' , contactid , contact ) ;
2012-12-13 02:30:20 +01:00
self . contacts . findById ( contactid ) . removeFromGroup ( result . groupname ) ;
2012-11-23 01:16:46 +01:00
} ) ;
2012-11-22 19:32:47 +01:00
} ) ;
2012-10-24 20:31:29 +02:00
$ ( document ) . bind ( 'status.group.contactadded' , function ( e , result ) {
console . log ( 'status.group.contactadded' , result ) ;
2012-12-13 02:30:20 +01:00
self . contacts . contacts [ parseInt ( result . contactid ) ] . addToGroup ( result . groupname ) ;
2012-10-24 20:31:29 +02:00
} ) ;
2012-10-26 01:57:16 +02:00
// Group sorted, save the sort order
$ ( document ) . bind ( 'status.groups.sorted' , function ( e , result ) {
console . log ( 'status.groups.sorted' , result ) ;
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'setpreference.php' ) , { 'key' : 'groupsort' , 'value' : result . sortorder } , function ( jsondata ) {
if ( jsondata . status !== 'success' ) {
OC . notify ( { message : jsondata ? jsondata . data . message : t ( 'contacts' , 'Network or server error. Please inform administrator.' ) } ) ;
}
} ) ;
} ) ;
2012-10-23 10:55:18 +02:00
// Group selected, only show contacts from that group
$ ( document ) . bind ( 'status.group.selected' , function ( e , result ) {
console . log ( 'status.group.selected' , result ) ;
self . currentgroup = result . id ;
// Close any open contact.
if ( self . currentid ) {
var id = self . currentid ;
self . closeContact ( id ) ;
2012-12-07 15:08:25 +01:00
self . jumpToContact ( id ) ;
2012-10-23 10:55:18 +02:00
}
self . $contactList . show ( ) ;
self . $toggleAll . show ( ) ;
2012-11-13 17:01:14 +01:00
self . showActions ( [ 'addcontact' ] ) ;
2012-10-23 10:55:18 +02:00
if ( result . type === 'category' || result . type === 'fav' ) {
2012-12-13 02:30:20 +01:00
self . contacts . showContacts ( result . contacts ) ;
2012-10-24 20:31:29 +02:00
} else if ( result . type === 'shared' ) {
2012-12-13 02:30:20 +01:00
self . contacts . showFromAddressbook ( self . currentgroup , true , true ) ;
2012-10-23 10:55:18 +02:00
} else {
2012-12-13 02:30:20 +01:00
self . contacts . showContacts ( self . currentgroup ) ;
2012-10-23 10:55:18 +02:00
}
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'setpreference.php' ) , { 'key' : 'lastgroup' , 'value' : self . currentgroup } , function ( jsondata ) {
2012-10-26 01:57:16 +02:00
if ( ! jsondata || jsondata . status !== 'success' ) {
2012-10-26 14:03:42 +02:00
OC . notify ( { message : ( jsondata && jsondata . data ) ? jsondata . data . message : t ( 'contacts' , 'Network or server error. Please inform administrator.' ) } ) ;
2012-10-23 10:55:18 +02:00
}
} ) ;
self . $rightContent . scrollTop ( 0 ) ;
} ) ;
2012-09-17 16:15:31 +02:00
// mark items whose title was hid under the top edge as read
/ * t h i s . $ r i g h t C o n t e n t . s c r o l l ( f u n c t i o n ( ) {
// prevent too many scroll requests;
if ( ! self . isScrolling ) {
self . isScrolling = true ;
var num = self . $contactList . find ( 'tr' ) . length ;
//console.log('num', num);
var offset = self . $contactList . find ( 'tr:eq(' + ( num - 20 ) + ')' ) . offset ( ) . top ;
if ( offset < self . $rightContent . height ( ) ) {
console . log ( 'load more' ) ;
2012-12-13 02:30:20 +01:00
self . contacts . loadContacts ( num , function ( ) {
2012-09-17 16:15:31 +02:00
self . isScrolling = false ;
} ) ;
} else {
setTimeout ( function ( ) {
self . isScrolling = false ;
} , self . scrollTimeoutMiliSecs ) ;
}
//console.log('scroll, unseen:', offset, self.$rightContent.height());
}
} ) ; * /
2012-11-13 17:01:14 +01:00
this . $settings . find ( '.settings' ) . on ( 'click keydown' , function ( event ) {
if ( wrongKey ( event ) ) {
return ;
}
2012-11-14 00:42:02 +01:00
var bodyListener = function ( e ) {
if ( self . $settings . find ( $ ( e . target ) ) . length == 0 ) {
self . $settings . switchClass ( 'open' , '' ) ;
}
}
2012-11-13 17:01:14 +01:00
if ( self . $settings . hasClass ( 'open' ) ) {
2012-11-14 00:42:02 +01:00
self . $settings . switchClass ( 'open' , '' ) ;
$ ( 'body' ) . unbind ( 'click' , bodyListener ) ;
2012-11-13 17:01:14 +01:00
} else {
2012-11-14 00:42:02 +01:00
self . $settings . switchClass ( '' , 'open' ) ;
$ ( 'body' ) . bind ( 'click' , bodyListener ) ;
2012-11-13 17:01:14 +01:00
}
} ) ;
2012-11-05 12:39:12 +01:00
$ ( '#contactphoto_fileupload' ) . on ( 'change' , function ( ) {
self . uploadPhoto ( this . files ) ;
} ) ;
2012-11-14 15:27:38 +01:00
$ ( '#groupactions > .addgroup' ) . on ( 'click keydown' , function ( event ) {
if ( wrongKey ( event ) ) {
return ;
}
2012-12-13 02:30:20 +01:00
self . groups . editGroup ( ) ;
2012-12-07 14:47:28 +01:00
//self.addGroup();
2012-11-14 15:27:38 +01:00
} ) ;
2012-10-05 05:05:49 +02:00
this . $ninjahelp . find ( '.close' ) . on ( 'click keydown' , function ( event ) {
if ( wrongKey ( event ) ) {
return ;
}
self . $ninjahelp . hide ( ) ;
} ) ;
2012-11-01 15:31:58 +01:00
2012-10-05 05:05:49 +02:00
this . $toggleAll . on ( 'change' , function ( ) {
2012-10-30 07:03:09 +01:00
var isChecked = $ ( this ) . is ( ':checked' ) ;
2012-11-15 02:41:52 +01:00
self . setAllChecked ( isChecked ) ;
2012-10-05 05:05:49 +02:00
if ( self . $groups . find ( 'option' ) . length === 1 ) {
self . buildGroupSelect ( ) ;
}
2012-11-13 17:01:14 +01:00
if ( isChecked ) {
2012-12-13 02:32:25 +01:00
self . showActions ( [ 'addcontact' , 'download' , 'groups' , 'delete' , 'favorite' ] ) ;
2012-11-13 17:01:14 +01:00
} else {
self . showActions ( [ 'addcontact' ] ) ;
}
2012-10-05 05:05:49 +02:00
} ) ;
2012-11-01 15:31:58 +01:00
2012-10-05 05:05:49 +02:00
this . $contactList . on ( 'change' , 'input:checkbox' , function ( event ) {
if ( $ ( this ) . is ( ':checked' ) ) {
if ( self . $groups . find ( 'option' ) . length === 1 ) {
self . buildGroupSelect ( ) ;
}
2012-12-11 06:18:57 +01:00
self . showActions ( [ 'addcontact' , 'groups' , 'delete' , 'favorite' ] ) ;
2012-10-05 05:05:49 +02:00
} else if ( self . Contacts . getSelectedContacts ( ) . length === 0 ) {
2012-11-13 17:01:14 +01:00
self . showActions ( [ 'addcontact' ] ) ;
2012-10-05 05:05:49 +02:00
}
} ) ;
2012-11-01 15:31:58 +01:00
2012-10-05 05:05:49 +02:00
this . $groups . on ( 'change' , function ( ) {
var $opt = $ ( this ) . find ( 'option:selected' ) ;
var action = $opt . parent ( ) . data ( 'action' ) ;
2012-11-14 15:27:38 +01:00
var ids , groupName , groupId , buildnow = false ;
2012-10-22 15:35:33 +02:00
2012-11-14 15:27:38 +01:00
// If a contact is open the action is only applied to that,
// otherwise on all selected items.
if ( self . currentid ) {
ids = [ self . currentid , ] ;
buildnow = true
} else {
2012-12-13 02:30:20 +01:00
ids = self . contacts . getSelectedContacts ( ) ;
2012-11-14 15:27:38 +01:00
}
2012-11-15 02:41:52 +01:00
self . setAllChecked ( false ) ;
2012-11-23 01:19:16 +01:00
self . $toggleAll . prop ( 'checked' , false ) ;
2012-11-24 01:40:29 +01:00
if ( ! self . currentid ) {
self . showActions ( [ 'addcontact' ] ) ;
}
2012-11-14 15:27:38 +01:00
if ( $opt . val ( ) === 'add' ) { // Add new group
action = 'add' ;
2012-10-05 05:05:49 +02:00
console . log ( 'add group...' ) ;
self . $groups . val ( - 1 ) ;
2012-11-14 15:27:38 +01:00
self . addGroup ( function ( response ) {
if ( response . status === 'success' ) {
groupId = response . id ;
groupName = response . name ;
2012-12-13 02:30:20 +01:00
self . groups . addTo ( ids , groupId , function ( result ) {
2012-11-14 15:27:38 +01:00
if ( result . status === 'success' ) {
$ . each ( ids , function ( idx , id ) {
// Delay each contact to not trigger too many ajax calls
// at a time.
setTimeout ( function ( ) {
2012-12-13 02:30:20 +01:00
self . contacts . contacts [ id ] . addToGroup ( groupName ) ;
2012-11-14 15:27:38 +01:00
// I don't think this is used...
if ( buildnow ) {
self . buildGroupSelect ( ) ;
2012-10-19 22:09:59 +02:00
}
2012-11-14 15:27:38 +01:00
$ ( document ) . trigger ( 'status.contact.addedtogroup' , {
contactid : id ,
groupid : groupId ,
groupname : groupName ,
} ) ;
} , 1000 ) ;
2012-10-19 22:09:59 +02:00
} ) ;
2012-11-14 15:27:38 +01:00
} else {
2012-12-13 02:30:20 +01:00
// TODO: Use message returned from groups object.
2012-11-14 15:27:38 +01:00
OC . notify ( { message : t ( 'contacts' , t ( 'contacts' , 'Error adding to group.' ) ) } ) ;
}
2012-10-19 22:09:59 +02:00
} ) ;
2012-11-14 15:27:38 +01:00
} else {
OC . notify ( { message : response . message } ) ;
}
2012-10-19 22:09:59 +02:00
} ) ;
2012-10-05 05:05:49 +02:00
return ;
}
2012-11-14 15:27:38 +01:00
groupName = $opt . text ( ) , groupId = $opt . val ( ) ;
2012-10-22 15:35:33 +02:00
2012-11-14 15:27:38 +01:00
console . log ( 'trut' , groupName , groupId ) ;
2012-10-05 05:05:49 +02:00
if ( action === 'add' ) {
2012-12-13 02:30:20 +01:00
self . groups . addTo ( ids , $opt . val ( ) , function ( result ) {
2012-11-01 15:31:58 +01:00
console . log ( 'after add' , result ) ;
if ( result . status === 'success' ) {
$ . each ( result . ids , function ( idx , id ) {
// Delay each contact to not trigger too many ajax calls
// at a time.
setTimeout ( function ( ) {
2012-11-14 15:27:38 +01:00
console . log ( 'adding' , id , 'to' , groupName ) ;
2012-12-13 02:30:20 +01:00
self . contacts . contacts [ id ] . addToGroup ( groupName ) ;
2012-11-01 15:31:58 +01:00
// I don't think this is used...
2012-11-05 12:39:49 +01:00
if ( buildnow ) {
self . buildGroupSelect ( ) ;
}
2012-11-01 15:31:58 +01:00
$ ( document ) . trigger ( 'status.contact.addedtogroup' , {
contactid : id ,
2012-11-14 15:27:38 +01:00
groupid : groupId ,
groupname : groupName ,
2012-11-01 15:31:58 +01:00
} ) ;
} , 1000 ) ;
} ) ;
} else {
2012-11-14 15:27:38 +01:00
var msg = result . message ? result . message : t ( 'contacts' , 'Error adding to group.' ) ;
OC . notify ( { message : msg } ) ;
2012-11-01 15:31:58 +01:00
}
2012-10-05 05:05:49 +02:00
} ) ;
if ( ! buildnow ) {
self . $groups . val ( - 1 ) . hide ( ) . find ( 'optgroup,option:not([value="-1"])' ) . remove ( ) ;
}
} else if ( action === 'remove' ) {
2012-12-13 02:30:20 +01:00
self . groups . removeFrom ( ids , $opt . val ( ) , function ( result ) {
2012-11-01 15:31:58 +01:00
console . log ( 'after remove' , result ) ;
if ( result . status === 'success' ) {
var groupname = $opt . text ( ) , groupid = $opt . val ( ) ;
$ . each ( result . ids , function ( idx , id ) {
2012-12-13 02:30:20 +01:00
self . contacts . contacts [ id ] . removeFromGroup ( groupname ) ;
2012-11-05 12:39:49 +01:00
if ( buildnow ) {
self . buildGroupSelect ( ) ;
}
2012-10-05 05:05:49 +02:00
// If a group is selected the contact has to be removed from the list
$ ( document ) . trigger ( 'status.contact.removedfromgroup' , {
contactid : id ,
2012-11-14 15:27:38 +01:00
groupid : groupId ,
groupname : groupName ,
2012-10-05 05:05:49 +02:00
} ) ;
2012-11-01 15:31:58 +01:00
} ) ;
} else {
2012-11-14 15:27:38 +01:00
var msg = result . message ? result . message : t ( 'contacts' , 'Error removing from group.' ) ;
OC . notify ( { message : msg } ) ;
2012-11-01 15:31:58 +01:00
}
2012-10-05 05:05:49 +02:00
} ) ;
if ( ! buildnow ) {
self . $groups . val ( - 1 ) . hide ( ) . find ( 'optgroup,option:not([value="-1"])' ) . remove ( ) ;
}
} // else something's wrong ;)
2012-11-15 02:41:52 +01:00
self . setAllChecked ( false ) ;
2012-10-05 05:05:49 +02:00
} ) ;
2012-11-01 15:31:58 +01:00
2012-10-05 05:05:49 +02:00
// Contact list. Either open a contact or perform an action (mailto etc.)
2012-09-17 16:15:31 +02:00
this . $contactList . on ( 'click' , 'tr' , function ( event ) {
if ( $ ( event . target ) . is ( 'input' ) ) {
return ;
}
2012-12-09 19:38:43 +01:00
if ( event . ctrlKey || event . metaKey ) {
2012-10-05 05:05:49 +02:00
event . stopPropagation ( ) ;
event . preventDefault ( ) ;
console . log ( 'select' , event ) ;
self . dontScroll = true ;
2012-12-13 02:30:20 +01:00
self . contacts . select ( $ ( this ) . data ( 'id' ) , true ) ;
2012-10-05 05:05:49 +02:00
return ;
}
2012-09-17 16:15:31 +02:00
if ( $ ( event . target ) . is ( 'a.mailto' ) ) {
2012-10-05 05:05:49 +02:00
var mailto = 'mailto:' + $ ( this ) . find ( '.email' ) . text ( ) . trim ( ) ;
console . log ( 'mailto' , mailto ) ;
try {
window . location . href = mailto ;
} catch ( e ) {
alert ( t ( 'contacts' , 'There was an error opening a mail composer.' ) ) ;
}
2012-09-17 16:15:31 +02:00
return ;
}
2012-10-05 05:05:49 +02:00
self . openContact ( $ ( this ) . data ( 'id' ) ) ;
2012-09-17 16:15:31 +02:00
} ) ;
2012-11-15 02:42:33 +01:00
$ ( '.addcontact' ) . on ( 'click keydown' , function ( event ) {
2012-10-05 05:05:49 +02:00
if ( wrongKey ( event ) ) {
return ;
}
2012-09-30 06:38:53 +02:00
console . log ( 'add' ) ;
2012-11-13 17:01:14 +01:00
self . $toggleAll . hide ( ) ;
2012-10-05 05:05:49 +02:00
$ ( this ) . hide ( ) ;
2012-11-15 20:35:35 +01:00
self . currentid = 'new' ;
2012-12-10 00:09:51 +01:00
var props = {
favorite : false ,
2012-12-13 02:30:20 +01:00
groups : self . groups . categories ,
2012-12-10 00:09:51 +01:00
} ;
2012-12-13 02:30:20 +01:00
self . tmpcontact = self . contacts . addContact ( ) ;
2012-11-15 20:35:35 +01:00
self . $rightContent . prepend ( self . tmpcontact ) ;
2012-12-11 06:18:57 +01:00
self . hideActions ( ) ;
2012-09-30 06:38:53 +02:00
} ) ;
2012-11-15 00:28:43 +01:00
2012-11-29 03:10:34 +01:00
this . $settings . find ( 'h3' ) . on ( 'click keydown' , function ( event ) {
2012-11-15 02:42:33 +01:00
if ( wrongKey ( event ) ) {
return ;
}
2012-11-29 03:10:34 +01:00
if ( $ ( this ) . next ( 'ul' ) . is ( ':visible' ) ) {
$ ( this ) . next ( 'ul' ) . slideUp ( ) ;
return ;
}
2012-12-03 19:39:28 +01:00
console . log ( 'settings' ) ;
2012-12-07 14:40:28 +01:00
var $list = $ ( this ) . next ( 'ul' ) ;
if ( $ ( this ) . data ( 'id' ) === 'addressbooks' ) {
console . log ( 'addressbooks' ) ;
if ( ! self . $addressbookTmpl ) {
self . $addressbookTmpl = $ ( '#addressbookTemplate' ) ;
}
$list . empty ( ) ;
2012-12-13 02:30:20 +01:00
$ . each ( self . contacts . addressbooks , function ( id , book ) {
2012-12-07 14:40:28 +01:00
var $li = self . $addressbookTmpl . octemplate ( {
id : id ,
permissions : book . permissions ,
displayname : book . displayname ,
} ) ;
$list . append ( $li ) ;
} ) ;
2012-12-10 20:58:34 +01:00
$list . find ( 'a.action' ) . tipsy ( { gravity : 'w' } ) ;
2012-12-07 14:40:28 +01:00
$list . find ( 'a.action.delete' ) . on ( 'click keypress' , function ( ) {
$ ( '.tipsy' ) . remove ( ) ;
var id = parseInt ( $ ( this ) . parents ( 'li' ) . first ( ) . data ( 'id' ) ) ;
console . log ( 'delete' , id ) ;
var $li = $ ( this ) . parents ( 'li' ) . first ( ) ;
$ . ajax ( {
type : 'POST' ,
url : OC . filePath ( 'contacts' , 'ajax' , 'addressbook/delete.php' ) ,
data : { id : id } ,
success : function ( jsondata ) {
console . log ( jsondata ) ;
if ( jsondata . status == 'success' ) {
2012-12-13 02:30:20 +01:00
self . contacts . unsetAddressbook ( id ) ;
2012-12-07 14:40:28 +01:00
$li . remove ( ) ;
OC . notify ( {
message : t ( 'contacts' , 'Deleting done. Click here to cancel reloading.' ) ,
timeout : 5 ,
timeouthandler : function ( ) {
console . log ( 'reloading' ) ;
window . location . href = OC . linkTo ( 'contacts' , 'index.php' ) ;
} ,
clickhandler : function ( ) {
console . log ( 'reloading cancelled' ) ;
OC . notify ( { cancel : true } ) ;
}
} ) ;
} else {
OC . notify ( { message : jsondata . data . message } ) ;
}
} ,
error : function ( jqXHR , textStatus , errorThrown ) {
OC . notify ( { message : textStatus + ': ' + errorThrown } ) ;
id = false ;
} ,
} ) ;
} ) ;
$list . find ( 'a.action.globe' ) . on ( 'click keypress' , function ( ) {
var id = parseInt ( $ ( this ) . parents ( 'li' ) . first ( ) . data ( 'id' ) ) ;
2012-12-13 02:30:20 +01:00
var book = self . contacts . addressbooks [ id ] ;
2012-12-07 14:40:28 +01:00
var uri = ( book . owner === oc _current _user ) ? book . uri : book . uri + '_shared_by_' + book . owner ;
var link = totalurl + '/' + encodeURIComponent ( oc _current _user ) + '/' + encodeURIComponent ( uri ) ;
var $dropdown = $ ( '<div id="dropdown" class="drop"><input type="text" value="' + link + '" /></div>' ) ;
$dropdown . appendTo ( $ ( this ) . parents ( 'li' ) . first ( ) ) ;
var $input = $dropdown . find ( 'input' ) ;
$input . focus ( ) . get ( 0 ) . select ( ) ;
$input . on ( 'blur' , function ( ) {
$dropdown . hide ( 'blind' , function ( ) {
$dropdown . remove ( ) ;
} ) ;
} ) ;
} ) ;
2012-12-11 05:27:03 +01:00
if ( typeof OC . Share !== 'undefined' ) {
OC . Share . loadIcons ( 'addressbook' ) ;
} else {
$list . find ( 'a.action.share' ) . css ( 'display' , 'none' ) ;
}
2012-12-07 14:40:28 +01:00
} else if ( $ ( this ) . data ( 'id' ) === 'import' ) {
console . log ( 'import' ) ;
$ ( '.import-upload' ) . show ( ) ;
$ ( '.import-select' ) . hide ( ) ;
var addAddressbookCallback = function ( select , name ) {
var id ;
$ . ajax ( {
type : 'POST' ,
async : false ,
url : OC . filePath ( 'contacts' , 'ajax' , 'addressbook/add.php' ) ,
data : { name : name } ,
success : function ( jsondata ) {
console . log ( jsondata ) ;
if ( jsondata . status == 'success' ) {
2012-12-13 02:30:20 +01:00
self . contacts . setAddressbook ( jsondata . data . addressbook ) ;
2012-12-07 14:40:28 +01:00
id = jsondata . data . addressbook . id
} else {
OC . notify ( { message : jsondata . data . message } ) ;
}
} ,
error : function ( jqXHR , textStatus , errorThrown ) {
OC . notify ( { message : textStatus + ': ' + errorThrown } ) ;
id = false ;
} ,
} ) ;
return id ;
}
self . $importIntoSelect . empty ( ) ;
2012-12-13 02:30:20 +01:00
$ . each ( self . contacts . addressbooks , function ( id , book ) {
2012-12-07 14:40:28 +01:00
self . $importIntoSelect . append ( '<option value="' + id + '">' + book . displayname + '</option>' ) ;
} ) ;
self . $importIntoSelect . multiSelect ( {
createCallback : addAddressbookCallback ,
singleSelect : true ,
createText : String ( t ( 'contacts' , 'Add address book' ) ) ,
minWidth : 120 ,
} ) ;
}
2012-11-29 03:10:34 +01:00
$ ( this ) . parents ( 'ul' ) . first ( ) . find ( 'ul:visible' ) . slideUp ( ) ;
2012-12-07 14:40:28 +01:00
$list . toggle ( 'slow' ) ;
2012-11-15 02:42:33 +01:00
} ) ;
this . $header . on ( 'click keydown' , '.back' , function ( event ) {
if ( wrongKey ( event ) ) {
return ;
}
console . log ( 'back' ) ;
self . closeContact ( self . currentid ) ;
self . $toggleAll . show ( ) ;
} ) ;
2012-10-05 05:05:49 +02:00
this . $header . on ( 'click keydown' , '.delete' , function ( event ) {
if ( wrongKey ( event ) ) {
return ;
}
2012-09-17 16:15:31 +02:00
console . log ( 'delete' ) ;
if ( self . currentid ) {
2012-11-15 00:28:43 +01:00
console . assert ( utils . isUInt ( self . currentid ) , 'self.currentid is not an integer' ) ;
2012-12-13 02:30:20 +01:00
self . contacts . delayedDelete ( self . currentid ) ;
2012-10-05 05:05:49 +02:00
} else {
2012-12-13 02:30:20 +01:00
self . contacts . delayedDelete ( self . contacts . getSelectedContacts ( ) ) ;
2012-10-05 05:05:49 +02:00
}
2012-11-15 06:43:22 +01:00
self . showActions ( [ 'addcontact' ] ) ;
2012-10-05 05:05:49 +02:00
} ) ;
2012-11-15 00:28:43 +01:00
2012-10-05 05:05:49 +02:00
this . $header . on ( 'click keydown' , '.download' , function ( event ) {
if ( wrongKey ( event ) ) {
return ;
}
console . log ( 'download' ) ;
2012-12-13 02:32:25 +01:00
document . location . href = OC . linkTo ( 'contacts' , 'export.php' )
+ '?selectedids=' + self . contacts . getSelectedContacts ( ) . join ( ',' ) ;
2012-09-17 16:15:31 +02:00
} ) ;
2012-11-15 00:28:43 +01:00
2012-11-22 05:34:37 +01:00
this . $header . on ( 'click keydown' , '.favorite' , function ( event ) {
2012-10-05 05:05:49 +02:00
if ( wrongKey ( event ) ) {
return ;
}
2012-11-22 05:34:37 +01:00
if ( ! utils . isUInt ( self . currentid ) ) {
return ;
2012-09-17 16:15:31 +02:00
}
2012-12-10 00:02:06 +01:00
// FIXME: This should only apply for contacts list.
2012-12-13 02:30:20 +01:00
var state = self . groups . isFavorite ( self . currentid ) ;
2012-11-22 05:34:37 +01:00
console . log ( 'Favorite?' , this , state ) ;
2012-12-13 02:30:20 +01:00
self . groups . setAsFavorite ( self . currentid , ! state , function ( jsondata ) {
2012-11-22 05:34:37 +01:00
if ( jsondata . status === 'success' ) {
if ( state ) {
2012-12-10 00:02:06 +01:00
self . $header . find ( '.favorite' ) . switchClass ( 'active' , '' ) ;
2012-11-22 05:34:37 +01:00
} else {
2012-12-10 00:02:06 +01:00
self . $header . find ( '.favorite' ) . switchClass ( '' , 'active' ) ;
2012-11-22 05:34:37 +01:00
}
} else {
OC . notify ( { message : t ( 'contacts' , jsondata . data . message ) } ) ;
}
} ) ;
2012-09-17 16:15:31 +02:00
} ) ;
2012-11-15 00:28:43 +01:00
2012-09-17 16:15:31 +02:00
this . $contactList . on ( 'mouseenter' , 'td.email' , function ( event ) {
if ( $ ( this ) . text ( ) . trim ( ) . length > 3 ) {
2012-10-15 21:33:21 +02:00
$ ( this ) . find ( '.mailto' ) . css ( 'display' , 'inline-block' ) ; //.fadeIn(100);
2012-09-17 16:15:31 +02:00
}
} ) ;
this . $contactList . on ( 'mouseleave' , 'td.email' , function ( event ) {
$ ( this ) . find ( '.mailto' ) . fadeOut ( 100 ) ;
} ) ;
2012-10-05 05:05:49 +02:00
2012-12-05 00:59:04 +01:00
// Import using jquery.fileupload
$ ( function ( ) {
var uploadingFiles = { } , numfiles = 0 , uploadedfiles = 0 , retries = 0 ;
var aid , importError = false ;
var $progressbar = $ ( '#import-progress' ) ;
2012-12-05 03:39:16 +01:00
var $status = $ ( '#import-status-text' ) ;
2012-12-05 00:59:04 +01:00
var waitForImport = function ( ) {
if ( numfiles == 0 && uploadedfiles == 0 ) {
$progressbar . progressbar ( 'value' , 100 ) ;
if ( ! importError ) {
2012-12-05 03:39:16 +01:00
OC . notify ( {
message : t ( 'contacts' , 'Import done. Click here to cancel reloading.' ) ,
2012-12-10 00:05:52 +01:00
timeout : 5 ,
2012-12-05 03:39:16 +01:00
timeouthandler : function ( ) {
console . log ( 'reloading' ) ;
window . location . href = OC . linkTo ( 'contacts' , 'index.php' ) ;
} ,
clickhandler : function ( ) {
console . log ( 'reloading cancelled' ) ;
OC . notify ( { cancel : true } ) ;
}
} ) ;
2012-12-05 00:59:04 +01:00
}
retries = aid = 0 ;
$progressbar . fadeOut ( ) ;
2012-12-05 03:39:16 +01:00
setTimeout ( function ( ) {
$status . fadeOut ( 'slow' ) ;
$ ( '.import-upload' ) . show ( ) ;
} , 3000 ) ;
2012-12-05 00:59:04 +01:00
} else {
2012-12-05 03:39:16 +01:00
setTimeout ( function ( ) {
2012-12-05 00:59:04 +01:00
waitForImport ( ) ;
} , 1000 ) ;
}
} ;
var doImport = function ( file , aid , cb ) {
$ . post ( OC . filePath ( 'contacts' , '' , 'import.php' ) , { id : aid , file : file , fstype : 'OC_FilesystemView' } ,
function ( jsondata ) {
if ( jsondata . status != 'success' ) {
importError = true ;
OC . notify ( { message : jsondata . data . message } ) ;
}
if ( typeof cb == 'function' ) {
2012-12-05 03:39:16 +01:00
cb ( jsondata ) ;
2012-12-05 00:59:04 +01:00
}
} ) ;
return false ;
} ;
var importFiles = function ( aid , uploadingFiles ) {
2012-12-05 03:39:16 +01:00
console . log ( 'importFiles' , aid , uploadingFiles ) ;
2012-12-05 00:59:04 +01:00
if ( numfiles != uploadedfiles ) {
OC . notify ( { message : t ( 'contacts' , 'Not all files uploaded. Retrying...' ) } ) ;
retries += 1 ;
if ( retries > 3 ) {
numfiles = uploadedfiles = retries = aid = 0 ;
uploadingFiles = { } ;
$progressbar . 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 ) ;
}
2012-12-05 03:39:16 +01:00
$progressbar . progressbar ( 'value' , 50 ) ;
2012-12-05 00:59:04 +01:00
var todo = uploadedfiles ;
$ . each ( uploadingFiles , function ( fileName , data ) {
2012-12-05 03:39:16 +01:00
$status . text ( t ( 'contacts' , 'Importing from {filename}...' , { filename : fileName } ) ) . fadeIn ( ) ;
doImport ( fileName , aid , function ( response ) {
if ( response . status === 'success' ) {
$status . text ( t ( 'contacts' , '{success} imported, {failed} failed.' ,
{ success : response . data . imported , failed : response . data . failed } ) ) . fadeIn ( ) ;
}
2012-12-05 00:59:04 +01:00
delete uploadingFiles [ fileName ] ;
numfiles -= 1 ; uploadedfiles -= 1 ;
$progressbar . progressbar ( 'value' , 50 + ( 50 / ( todo - uploadedfiles ) ) ) ;
} ) ;
} )
2012-12-05 03:39:16 +01:00
//$status.text(t('contacts', 'Importing...')).fadeIn();
2012-12-05 00:59:04 +01:00
waitForImport ( ) ;
} ;
2012-12-05 03:39:16 +01:00
// Start the actual import.
$ ( '.doImport' ) . on ( 'click keypress' , function ( event ) {
2012-12-05 00:59:04 +01:00
if ( wrongKey ( event ) ) {
return ;
}
aid = $ ( this ) . prev ( 'select' ) . val ( ) ;
$ ( '.import-select' ) . hide ( ) ;
importFiles ( aid , uploadingFiles ) ;
2012-12-03 19:39:28 +01:00
} ) ;
2012-12-05 00:59:04 +01:00
$ ( '#import_fileupload' ) . fileupload ( {
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 ) {
$ . each ( files , function ( i , file ) {
var fileName = file . name ;
console . log ( 'file.name' , file . name ) ;
var jqXHR = $ ( '#import_fileupload' ) . fileupload ( 'send' ,
{
files : file ,
formData : function ( form ) {
var formArray = form . serializeArray ( ) ;
formArray [ 'aid' ] = aid ;
return formArray ;
} } )
. success ( function ( response , textStatus , jqXHR ) {
if ( response . status == 'success' ) {
// import the file
uploadedfiles += 1 ;
} else {
OC . notify ( { message : response . data . message } ) ;
}
return false ;
} )
. error ( function ( jqXHR , textStatus , errorThrown ) {
console . log ( textStatus ) ;
OC . 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 . notify ( { message : response . data . message } ) ;
}
} ) ;
}
}
} ,
fail : function ( e , data ) {
console . log ( 'fail' ) ;
OC . notify ( { message : data . errorThrown + ': ' + data . textStatus } ) ;
// TODO: Remove file from upload queue.
} ,
progressall : function ( e , data ) {
var progress = ( data . loaded / data . total ) * 50 ;
$progressbar . progressbar ( 'value' , progress ) ;
} ,
start : function ( e , data ) {
$progressbar . progressbar ( { value : 0 } ) ;
$progressbar . fadeIn ( ) ;
if ( data . dataType != 'iframe ' ) {
$ ( '#upload input.stop' ) . show ( ) ;
}
} ,
stop : function ( e , data ) {
console . log ( 'stop, data' , data ) ;
// stop only gets fired once so we collect uploaded items here.
$ ( '.import-upload' ) . hide ( ) ;
$ ( '.import-select' ) . show ( ) ;
if ( data . dataType != 'iframe ' ) {
$ ( '#upload input.stop' ) . hide ( ) ;
}
}
} )
} ) ;
2012-12-03 19:39:28 +01:00
$ ( document ) . on ( 'keypress' , function ( event ) {
2012-12-11 17:41:28 +01:00
if ( ! $ ( event . target ) . is ( 'body' ) ) {
2012-10-05 05:05:49 +02:00
return ;
}
2012-12-03 19:39:28 +01:00
var keyCode = Math . max ( event . keyCode , event . which ) ;
2012-10-30 07:03:09 +01:00
// TODO: This should go in separate method
2012-12-03 19:39:28 +01:00
console . log ( event , keyCode + ' ' + event . target . nodeName ) ;
2012-10-05 05:05:49 +02:00
/ * *
* To add :
* Shift - a : add addressbook
* u ( 85 ) : hide / show leftcontent
* f ( 70 ) : add field
* /
2012-12-03 19:39:28 +01:00
switch ( keyCode ) {
2012-10-05 05:05:49 +02:00
case 13 : // Enter?
console . log ( 'Enter?' ) ;
if ( ! self . currentid && self . currentlistid ) {
self . openContact ( self . currentlistid ) ;
}
break ;
case 27 : // Esc
if ( self . $ninjahelp . is ( ':visible' ) ) {
self . $ninjahelp . hide ( ) ;
} else if ( self . currentid ) {
self . closeContact ( self . currentid ) ;
}
break ;
case 46 : // Delete
if ( event . shiftKey ) {
2012-12-13 02:30:20 +01:00
self . contacts . delayedDelete ( self . currentid ) ;
2012-10-05 05:05:49 +02:00
}
break ;
case 40 : // down
case 74 : // j
console . log ( 'next' ) ;
if ( ! self . currentid && self . currentlistid ) {
2012-12-13 02:30:20 +01:00
self . contacts . contacts [ self . currentlistid ] . next ( ) ;
2012-10-05 05:05:49 +02:00
}
break ;
case 65 : // a
if ( event . shiftKey ) {
console . log ( 'add group?' ) ;
break ;
}
self . addContact ( ) ;
break ;
case 38 : // up
case 75 : // k
console . log ( 'previous' ) ;
if ( ! self . currentid && self . currentlistid ) {
2012-12-13 02:30:20 +01:00
self . contacts . contacts [ self . currentlistid ] . prev ( ) ;
2012-10-05 05:05:49 +02:00
}
break ;
case 34 : // PageDown
case 78 : // n
console . log ( 'page down' )
break ;
case 79 : // o
console . log ( 'open contact?' ) ;
break ;
case 33 : // PageUp
case 80 : // p
// prev addressbook
2012-12-13 02:30:20 +01:00
//OC.contacts.contacts.previousAddressbook();
2012-10-05 05:05:49 +02:00
break ;
case 82 : // r
console . log ( 'refresh - what?' ) ;
break ;
case 63 : // ? German.
if ( event . shiftKey ) {
self . $ninjahelp . toggle ( 'fast' ) ;
}
break ;
case 171 : // ? Danish
case 191 : // ? Standard qwerty
2012-10-26 14:03:42 +02:00
self . $ninjahelp . toggle ( 'fast' ) . position ( { my : "center" , at : "center" , of : "#content" } ) ;
2012-10-05 05:05:49 +02:00
break ;
}
} ) ;
2012-10-22 15:35:33 +02:00
2012-12-10 20:58:34 +01:00
// find all with a title attribute and tipsy them
$ ( '.tooltipped.downwards:not(.onfocus)' ) . tipsy ( { gravity : 'n' } ) ;
$ ( '.tooltipped.upwards:not(.onfocus)' ) . tipsy ( { gravity : 's' } ) ;
$ ( '.tooltipped.rightwards:not(.onfocus)' ) . tipsy ( { gravity : 'w' } ) ;
$ ( '.tooltipped.leftwards:not(.onfocus)' ) . tipsy ( { gravity : 'e' } ) ;
$ ( '.tooltipped.downwards.onfocus' ) . tipsy ( { trigger : 'focus' , gravity : 'n' } ) ;
$ ( '.tooltipped.rightwards.onfocus' ) . tipsy ( { trigger : 'focus' , gravity : 'w' } ) ;
2012-09-17 16:15:31 +02:00
} ,
2012-11-14 15:27:38 +01:00
addGroup : function ( cb ) {
var self = this ;
$ ( 'body' ) . append ( '<div id="add_group_dialog"></div>' ) ;
if ( ! this . $addGroupTmpl ) {
this . $addGroupTmpl = $ ( '#addGroupTemplate' ) ;
}
var $dlg = this . $addGroupTmpl . octemplate ( ) ;
$ ( '#add_group_dialog' ) . html ( $dlg ) . dialog ( {
modal : true ,
closeOnEscape : true ,
title : t ( 'contacts' , 'Add group' ) ,
height : 'auto' , width : 'auto' ,
buttons : {
'Ok' : function ( ) {
2012-12-13 02:30:20 +01:00
self . groups . addGroup (
2012-12-07 14:47:28 +01:00
{ name : $dlg . find ( 'input:text' ) . val ( ) } ,
2012-11-14 15:27:38 +01:00
function ( response ) {
if ( typeof cb === 'function' ) {
cb ( response ) ;
} else {
if ( response . status !== 'success' ) {
OC . notify ( { message : response . message } ) ;
}
}
} ) ;
$ ( this ) . dialog ( 'close' ) ;
} ,
'Cancel' : function ( ) {
$ ( this ) . dialog ( 'close' ) ;
return false ;
}
} ,
close : function ( event , ui ) {
$ ( this ) . dialog ( 'destroy' ) . remove ( ) ;
$ ( '#add_group_dialog' ) . remove ( ) ;
} ,
open : function ( event , ui ) {
$dlg . find ( 'input' ) . focus ( ) ;
} ,
} ) ;
} ,
2012-11-15 02:41:52 +01:00
setAllChecked : function ( checked ) {
var selector = checked ? 'input:checkbox:visible:not(checked)' : 'input:checkbox:visible:checked' ;
$ . each ( self . $contactList . find ( selector ) , function ( ) {
$ ( this ) . prop ( 'checked' , checked ) ;
} ) ;
} ,
2012-10-05 05:05:49 +02:00
jumpToContact : function ( id ) {
2012-12-13 02:30:20 +01:00
this . $rightContent . scrollTop ( this . contacts . contactPos ( id ) + 10 ) ;
2012-10-05 05:05:49 +02:00
} ,
closeContact : function ( id ) {
2012-10-24 20:31:29 +02:00
if ( typeof this . currentid === 'number' ) {
2012-12-13 02:30:20 +01:00
var contact = this . contacts . findById ( id ) ;
if ( contact && contact . close ( ) ) {
2012-11-01 02:01:00 +01:00
this . $contactList . show ( ) ;
this . jumpToContact ( id ) ;
}
2012-11-15 20:35:35 +01:00
} else if ( this . currentid === 'new' ) {
this . tmpcontact . remove ( ) ;
this . $contactList . show ( ) ;
2012-10-05 05:05:49 +02:00
}
2012-12-10 00:02:06 +01:00
this . $contactList . removeClass ( 'dim' ) ;
2012-11-15 20:35:35 +01:00
delete this . currentid ;
2012-12-03 19:39:28 +01:00
this . showActions ( [ 'addcontact' ] ) ;
2012-10-05 05:05:49 +02:00
this . $groups . find ( 'optgroup,option:not([value="-1"])' ) . remove ( ) ;
} ,
openContact : function ( id ) {
2012-11-01 02:01:00 +01:00
console . log ( 'Contacts.openContact' , id ) ;
if ( this . currentid ) {
this . closeContact ( this . currentid ) ;
}
2012-10-05 05:05:49 +02:00
this . currentid = parseInt ( id ) ;
2012-12-13 02:30:20 +01:00
console . log ( 'Contacts.openContact, Favorite' , this . currentid , this . groups . isFavorite ( this . currentid ) , this . groups ) ;
2012-11-15 02:41:52 +01:00
this . setAllChecked ( false ) ;
2012-12-10 00:02:06 +01:00
//this.$contactList.hide();
this . $contactList . addClass ( 'dim' ) ;
2012-10-05 05:05:49 +02:00
this . $toggleAll . hide ( ) ;
2012-12-10 00:02:06 +01:00
this . jumpToContact ( this . currentid ) ;
var props = {
2012-12-13 02:30:20 +01:00
favorite : this . groups . isFavorite ( this . currentid ) ,
groups : this . groups . categories ,
2012-12-10 00:02:06 +01:00
} ;
2012-12-13 02:30:20 +01:00
var $contactelem = this . contacts . showContact ( this . currentid , props ) ;
2012-12-10 00:02:06 +01:00
var self = this ;
var $contact = $contactelem . find ( '#contact' ) ;
var adjustElems = function ( ) {
var maxheight = document . documentElement . clientHeight - 200 ; // - ($contactelem.offset().top+70);
console . log ( 'contact maxheight' , maxheight ) ;
$contactelem . find ( 'ul' ) . first ( ) . css ( { 'max-height' : maxheight , 'overflow-y' : 'auto' , 'overflow-x' : 'hidden' } ) ;
} ;
$ ( window ) . resize ( adjustElems ) ;
//$contact.resizable({ minWidth: 400, minHeight: 400, maxHeight: maxheight});
2012-10-05 05:05:49 +02:00
this . $rightContent . prepend ( $contactelem ) ;
2012-12-10 00:02:06 +01:00
adjustElems ( ) ;
2012-10-05 05:05:49 +02:00
} ,
2012-09-17 16:15:31 +02:00
update : function ( ) {
console . log ( 'update' ) ;
} ,
2012-11-05 12:39:12 +01:00
uploadPhoto : function ( filelist ) {
var self = this ;
if ( ! filelist ) {
OC . notify ( { message : t ( 'contacts' , 'No files selected for upload.' ) } ) ;
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 . notify ( {
message : t (
'contacts' ,
'The file you are trying to upload exceed the maximum size for file uploads on this server.' ) ,
} ) ;
return ;
} else {
target . load ( function ( ) {
var response = jQuery . parseJSON ( target . contents ( ) . text ( ) ) ;
if ( response != undefined && response . status == 'success' ) {
console . log ( 'response' , response ) ;
self . editPhoto ( self . currentid , response . data . tmp ) ;
//alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime);
} else {
OC . notify ( { message : response . data . message } ) ;
}
} ) ;
form . submit ( ) ;
}
} ,
2012-10-15 21:33:21 +02:00
cloudPhotoSelected : function ( id , path ) {
var self = this ;
console . log ( 'cloudPhotoSelected, id' , id )
2012-10-22 15:35:33 +02:00
$ . getJSON ( OC . filePath ( 'contacts' , 'ajax' , 'oc_photo.php' ) ,
2012-10-15 21:33:21 +02:00
{ path : path , id : id } , function ( jsondata ) {
if ( jsondata . status == 'success' ) {
//alert(jsondata.data.page);
self . editPhoto ( jsondata . data . id , jsondata . data . tmp )
$ ( '#edit_photo_dialog_img' ) . html ( jsondata . data . page ) ;
}
else {
OC . notify ( { message : jsondata . data . message } ) ;
}
} ) ;
} ,
editCurrentPhoto : function ( id ) {
2012-09-17 16:15:31 +02:00
var self = this ;
2012-10-15 21:33:21 +02:00
$ . getJSON ( OC . filePath ( 'contacts' , 'ajax' , 'currentphoto.php' ) ,
{ id : id } , function ( jsondata ) {
if ( jsondata . status == 'success' ) {
//alert(jsondata.data.page);
self . editPhoto ( jsondata . data . id , jsondata . data . tmp )
$ ( '#edit_photo_dialog_img' ) . html ( jsondata . data . page ) ;
}
else {
OC . notify ( { message : jsondata . data . message } ) ;
}
} ) ;
} ,
editPhoto : function ( id , tmpkey ) {
console . log ( 'editPhoto' , id , tmpkey )
$ ( '.tipsy' ) . remove ( ) ;
// Simple event handler, called from onChange and onSelect
// event handlers, as per the Jcrop invocation above
var showCoords = function ( c ) {
$ ( '#x1' ) . val ( c . x ) ;
$ ( '#y1' ) . val ( c . y ) ;
$ ( '#x2' ) . val ( c . x2 ) ;
$ ( '#y2' ) . val ( c . y2 ) ;
$ ( '#w' ) . val ( c . w ) ;
$ ( '#h' ) . val ( c . h ) ;
} ;
var clearCoords = function ( ) {
$ ( '#coords input' ) . val ( '' ) ;
} ;
2012-10-22 15:35:33 +02:00
2012-10-15 21:33:21 +02:00
var self = this ;
if ( ! this . $cropBoxTmpl ) {
this . $cropBoxTmpl = $ ( '#cropBoxTemplate' ) ;
}
$ ( 'body' ) . append ( '<div id="edit_photo_dialog"></div>' ) ;
var $dlg = this . $cropBoxTmpl . octemplate ( { id : id , tmpkey : tmpkey } ) ;
2012-09-17 16:15:31 +02:00
2012-10-15 21:33:21 +02:00
var cropphoto = new Image ( ) ;
$ ( cropphoto ) . load ( function ( ) {
$ ( this ) . attr ( 'id' , 'cropbox' ) ;
$ ( this ) . prependTo ( $dlg ) . fadeIn ( ) ;
$ ( this ) . Jcrop ( {
onChange : showCoords ,
onSelect : showCoords ,
onRelease : clearCoords ,
maxSize : [ 399 , 399 ] ,
bgColor : 'black' ,
bgOpacity : . 4 ,
boxWidth : 400 ,
boxHeight : 400 ,
setSelect : [ 100 , 130 , 50 , 50 ] //,
//aspectRatio: 0.8
} ) ;
$ ( '#edit_photo_dialog' ) . html ( $dlg ) . dialog ( {
modal : true ,
closeOnEscape : true ,
title : t ( 'contacts' , 'Edit profile picture' ) ,
height : 'auto' , width : 'auto' ,
buttons : {
'Ok' : function ( ) {
self . savePhoto ( $ ( this ) ) ;
$ ( this ) . dialog ( 'close' ) ;
} ,
'Cancel' : function ( ) { $ ( this ) . dialog ( 'close' ) ; }
} ,
close : function ( event , ui ) {
$ ( this ) . dialog ( 'destroy' ) . remove ( ) ;
2012-10-19 22:09:59 +02:00
$ ( '#edit_photo_dialog' ) . remove ( ) ;
2012-10-15 21:33:21 +02:00
} ,
open : function ( event , ui ) {
// Jcrop maybe?
}
} ) ;
} ) . error ( function ( ) {
OC . notify ( { message : t ( 'contacts' , 'Error loading profile picture.' ) } ) ;
} ) . attr ( 'src' , OC . linkTo ( 'contacts' , 'tmpphoto.php' ) + '?tmpkey=' + tmpkey ) ;
} ,
savePhoto : function ( $dlg ) {
var form = $dlg . find ( '#cropform' ) ;
q = form . serialize ( ) ;
console . log ( 'savePhoto' , q ) ;
$ . post ( OC . filePath ( 'contacts' , 'ajax' , 'savecrop.php' ) , q , function ( response ) {
var jsondata = $ . parseJSON ( response ) ;
console . log ( 'savePhoto, jsondata' , typeof jsondata ) ;
if ( jsondata && jsondata . status === 'success' ) {
// load cropped photo.
$ ( document ) . trigger ( 'status.contact.photoupdated' , {
2012-10-22 15:35:33 +02:00
id : jsondata . data . id ,
2012-09-17 16:15:31 +02:00
} ) ;
2012-10-15 21:33:21 +02:00
} else {
if ( ! jsondata ) {
OC . notify ( { message : t ( 'contacts' , 'Network or server error. Please inform administrator.' ) } ) ;
} else {
OC . notify ( { message : jsondata . data . message } ) ;
}
2012-10-05 05:05:49 +02:00
}
2012-09-17 16:15:31 +02:00
} ) ;
} ,
2012-12-05 00:59:04 +01:00
// NOTE: Deprecated
2012-10-25 23:17:29 +02:00
addAddressbook : function ( data , cb ) {
2012-12-05 00:59:04 +01:00
$ . ajax ( {
type : 'POST' ,
async : false ,
url : OC . filePath ( 'contacts' , 'ajax' , 'addressbook/add.php' ) ,
data : { name : data . name , description : data . description } ,
success : function ( jsondata ) {
2012-10-25 23:17:29 +02:00
if ( jsondata . status == 'success' ) {
if ( typeof cb === 'function' ) {
cb ( {
status : 'success' ,
addressbook : jsondata . data . addressbook ,
} ) ;
}
} else {
if ( typeof cb === 'function' ) {
2012-12-05 00:59:04 +01:00
cb ( { status : 'error' , message : jsondata . data . message } ) ;
2012-10-25 23:17:29 +02:00
}
}
2012-12-05 00:59:04 +01:00
} } ) ;
2012-10-25 23:17:29 +02:00
} ,
2012-12-05 00:59:04 +01:00
// NOTE: Deprecated
2012-10-25 03:34:12 +02:00
selectAddressbook : function ( cb ) {
var self = this ;
var jqxhr = $ . get ( OC . filePath ( 'contacts' , 'templates' , 'selectaddressbook.html' ) , function ( data ) {
2012-10-25 23:17:29 +02:00
$ ( 'body' ) . append ( '<div id="addressbook_dialog"></div>' ) ;
var $dlg = $ ( '#addressbook_dialog' ) . html ( data ) . octemplate ( {
2012-10-25 03:34:12 +02:00
nameplaceholder : t ( 'contacts' , 'Enter name' ) ,
descplaceholder : t ( 'contacts' , 'Enter description' ) ,
} ) . dialog ( {
modal : true , height : 'auto' , width : 'auto' ,
title : t ( 'contacts' , 'Select addressbook' ) ,
buttons : {
'Ok' : function ( ) {
aid = $ ( this ) . find ( 'input:checked' ) . val ( ) ;
if ( aid == 'new' ) {
var displayname = $ ( this ) . find ( 'input.name' ) . val ( ) ;
var description = $ ( this ) . find ( 'input.desc' ) . val ( ) ;
if ( ! displayname . trim ( ) ) {
OC . dialogs . alert ( t ( 'contacts' , 'The address book name cannot be empty.' ) , t ( 'contacts' , 'Error' ) ) ;
return false ;
}
console . log ( 'ID, name and desc' , aid , displayname , description ) ;
if ( typeof cb === 'function' ) {
// TODO: Create addressbook
2012-10-25 23:17:29 +02:00
var data = { name : displayname , description : description } ;
self . addAddressbook ( data , function ( data ) {
if ( data . status === 'success' ) {
cb ( {
status : 'success' ,
addressbook : data . addressbook ,
} ) ;
} else {
cb ( { status : 'error' } ) ;
}
} ) ;
2012-10-25 03:34:12 +02:00
}
$ ( this ) . dialog ( 'close' ) ;
} else {
console . log ( 'aid ' + aid ) ;
if ( typeof cb === 'function' ) {
2012-10-25 23:17:29 +02:00
cb ( {
status : 'success' ,
2012-12-13 02:30:20 +01:00
addressbook : self . contacts . addressbooks [ parseInt ( aid ) ] ,
2012-10-25 23:17:29 +02:00
} ) ;
2012-10-25 03:34:12 +02:00
}
$ ( this ) . dialog ( 'close' ) ;
}
} ,
'Cancel' : function ( ) {
$ ( this ) . dialog ( 'close' ) ;
}
} ,
close : function ( event , ui ) {
$ ( this ) . dialog ( 'destroy' ) . remove ( ) ;
2012-10-25 23:17:29 +02:00
$ ( '#addressbook_dialog' ) . remove ( ) ;
2012-10-25 03:34:12 +02:00
} ,
open : function ( event , ui ) {
console . log ( 'open' , $ ( this ) ) ;
var $lastrow = $ ( this ) . find ( 'tr.new' ) ;
2012-12-13 02:30:20 +01:00
$ . each ( self . contacts . addressbooks , function ( i , book ) {
2012-10-25 23:17:29 +02:00
console . log ( 'book' , i , book ) ;
2012-10-25 03:34:12 +02:00
if ( book . owner === OC . currentUser
|| ( book . permissions & OC . PERMISSION _UPDATE
|| book . permissions & OC . PERMISSION _CREATE
|| book . permissions & OC . PERMISSION _DELETE ) ) {
2012-10-25 23:17:29 +02:00
var row = '<tr><td><input id="book_{id}" name="book" type="radio" value="{id}"</td>'
2012-10-25 03:34:12 +02:00
+ '<td><label for="book_{id}">{displayname}</label></td>'
2012-10-25 23:17:29 +02:00
+ '<td>{description}</td></tr>'
var $row = $ ( row ) . octemplate ( {
id : book . id ,
2012-10-25 03:34:12 +02:00
displayname : book . displayname ,
description : book . description
} ) ;
$lastrow . before ( $row ) ;
}
} ) ;
2012-10-25 23:17:29 +02:00
$ ( this ) . find ( 'input[type="radio"]' ) . first ( ) . prop ( 'checked' , true ) ;
$lastrow . find ( 'input.name,input.desc' ) . on ( 'focus' , function ( e ) {
$lastrow . find ( 'input[type="radio"]' ) . prop ( 'checked' , true ) ;
2012-10-25 03:34:12 +02:00
} ) ;
} ,
} ) ;
} ) . error ( function ( ) {
OC . notify ( { message : t ( 'contacts' , 'Network or server error. Please inform administrator.' ) } ) ;
} ) ;
} ,
2012-09-17 16:15:31 +02:00
} ;
( function ( $ ) {
/ * *
* Object Template
* Inspired by micro templating done by e . g . underscore . js
* /
var Template = {
init : function ( options , elem ) {
// Mix in the passed in options with the default options
this . options = $ . extend ( { } , this . options , options ) ;
// Save the element reference, both as a jQuery
// reference and a normal reference
this . elem = elem ;
this . $elem = $ ( elem ) ;
var _html = this . _build ( this . options ) ;
//console.log('html', this.$elem.html());
return $ ( _html ) ;
} ,
// From stackoverflow.com/questions/1408289/best-way-to-do-variable-interpolation-in-javascript
_build : function ( o ) {
2012-10-25 23:18:36 +02:00
var data = this . $elem . attr ( 'type' ) === 'text/template'
? this . $elem . html ( ) : this . $elem . get ( 0 ) . outerHTML ;
return data . replace ( /{([^{}]*)}/g ,
2012-09-17 16:15:31 +02:00
function ( a , b ) {
var r = o [ b ] ;
return typeof r === 'string' || typeof r === 'number' ? r : a ;
}
) ;
} ,
options : {
} ,
} ;
$ . fn . octemplate = function ( options ) {
if ( this . length ) {
var _template = Object . create ( Template ) ;
2012-10-22 15:35:33 +02:00
return _template . init ( options , this ) ;
2012-09-17 16:15:31 +02:00
}
} ;
} ) ( jQuery ) ;
$ ( document ) . ready ( function ( ) {
2012-10-05 05:05:49 +02:00
OC . Contacts . init ( id ) ;
2012-09-17 16:15:31 +02:00
} ) ;