2012-05-05 22:56:52 +04:00
OC . Share = {
2012-06-26 03:27:57 +04:00
SHARE _TYPE _USER : 0 ,
SHARE _TYPE _GROUP : 1 ,
2012-08-28 04:05:51 +04:00
SHARE _TYPE _LINK : 3 ,
2012-07-31 18:18:26 +04:00
SHARE _TYPE _EMAIL : 4 ,
2012-07-31 21:06:32 +04:00
itemShares : [ ] ,
2012-06-25 03:16:50 +04:00
statuses : [ ] ,
2012-08-09 01:50:09 +04:00
droppedDown : false ,
2012-06-25 03:16:50 +04:00
loadIcons : function ( itemType ) {
// Load all share icons
$ . get ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { fetch : 'getItemsSharedStatuses' , itemType : itemType } , function ( result ) {
2012-05-05 22:56:52 +04:00
if ( result && result . status === 'success' ) {
2013-03-08 07:30:12 +04:00
$ . each ( result . data , function ( item , data ) {
OC . Share . statuses [ item ] = data ;
var hasLink = data [ 'link' ] ;
2012-10-29 00:01:50 +04:00
// Links override shared in terms of icon display
if ( hasLink ) {
var image = OC . imagePath ( 'core' , 'actions/public' ) ;
} else {
var image = OC . imagePath ( 'core' , 'actions/shared' ) ;
}
2012-08-06 19:27:13 +04:00
if ( itemType != 'file' && itemType != 'folder' ) {
2012-10-29 00:01:50 +04:00
$ ( 'a.share[data-item="' + item + '"]' ) . css ( 'background' , 'url(' + image + ') no-repeat center' ) ;
} else {
2013-03-08 07:30:12 +04:00
var file = $ ( 'tr' ) . filterAttr ( 'data-id' , item ) ;
2012-10-29 00:36:17 +04:00
if ( file . length > 0 ) {
2013-01-26 22:25:15 +04:00
var action = $ ( file ) . find ( '.fileactions .action' ) . filterAttr ( 'data-action' , 'Share' ) ;
2013-02-26 05:20:29 +04:00
var img = action . find ( 'img' ) . attr ( 'src' , image ) ;
2013-01-26 22:25:15 +04:00
action . addClass ( 'permanent' ) ;
2013-02-26 05:52:01 +04:00
action . html ( ' ' + t ( 'core' , 'Shared' ) ) . prepend ( img ) ;
2013-03-08 07:30:12 +04:00
} else {
var dir = $ ( '#dir' ) . val ( ) ;
if ( dir . length > 1 ) {
var last = '' ;
var path = dir ;
// Search for possible parent folders that are shared
while ( path != last ) {
if ( path == data [ 'path' ] ) {
var actions = $ ( '.fileactions .action' ) . filterAttr ( 'data-action' , 'Share' ) ;
$ . each ( actions , function ( index , action ) {
var img = $ ( action ) . find ( 'img' ) ;
if ( img . attr ( 'src' ) != OC . imagePath ( 'core' , 'actions/public' ) ) {
img . attr ( 'src' , image ) ;
$ ( action ) . addClass ( 'permanent' ) ;
$ ( action ) . html ( ' ' + t ( 'core' , 'Shared' ) ) . prepend ( img ) ;
}
} ) ;
2012-10-29 00:01:50 +04:00
}
2013-03-08 07:30:12 +04:00
last = path ;
path = OC . Share . dirname ( path ) ;
2012-10-29 00:01:50 +04:00
}
}
2012-06-25 03:16:50 +04:00
}
2012-05-05 22:56:52 +04:00
}
} ) ;
}
} ) ;
} ,
2012-08-24 23:32:06 +04:00
updateIcon : function ( itemType , itemSource ) {
var shares = false ;
2012-09-19 09:44:15 +04:00
var link = false ;
var image = OC . imagePath ( 'core' , 'actions/share' ) ;
2012-08-24 23:32:06 +04:00
$ . each ( OC . Share . itemShares , function ( index ) {
2012-09-19 09:44:15 +04:00
if ( OC . Share . itemShares [ index ] ) {
if ( index == OC . Share . SHARE _TYPE _LINK ) {
if ( OC . Share . itemShares [ index ] == true ) {
shares = true ;
image = OC . imagePath ( 'core' , 'actions/public' ) ;
link = true ;
return ;
}
} else if ( OC . Share . itemShares [ index ] . length > 0 ) {
shares = true ;
image = OC . imagePath ( 'core' , 'actions/shared' ) ;
}
2012-08-24 23:32:06 +04:00
}
} ) ;
2012-09-19 09:44:15 +04:00
if ( itemType != 'file' && itemType != 'folder' ) {
$ ( 'a.share[data-item="' + itemSource + '"]' ) . css ( 'background' , 'url(' + image + ') no-repeat center' ) ;
2013-01-26 22:25:15 +04:00
} else {
2013-03-08 07:30:12 +04:00
var file = $ ( 'tr' ) . filterAttr ( 'data-id' , String ( itemSource ) ) ;
if ( file . length > 0 ) {
var action = $ ( file ) . find ( '.fileactions .action' ) . filterAttr ( 'data-action' , 'Share' ) ;
var img = action . find ( 'img' ) . attr ( 'src' , image ) ;
if ( shares ) {
action . addClass ( 'permanent' ) ;
2013-03-08 20:29:05 +04:00
action . html ( ' ' + escapeHTML ( t ( 'core' , 'Shared' ) ) ) . prepend ( img ) ;
2013-03-08 07:30:12 +04:00
} else {
action . removeClass ( 'permanent' ) ;
2013-03-08 20:29:05 +04:00
action . html ( ' ' + escapeHTML ( t ( 'core' , 'Share' ) ) ) . prepend ( img ) ;
2013-03-08 07:30:12 +04:00
}
2013-01-26 22:25:15 +04:00
}
2012-09-19 09:44:15 +04:00
}
2012-08-24 23:32:06 +04:00
if ( shares ) {
2013-03-08 07:30:12 +04:00
OC . Share . statuses [ itemSource ] [ 'link' ] = link ;
2012-08-24 23:32:06 +04:00
} else {
delete OC . Share . statuses [ itemSource ] ;
}
} ,
2012-08-22 19:35:30 +04:00
loadItem : function ( itemType , itemSource ) {
2012-06-26 03:27:57 +04:00
var data = '' ;
2012-08-24 18:43:42 +04:00
var checkReshare = true ;
2013-03-08 07:30:12 +04:00
if ( typeof OC . Share . statuses [ itemSource ] === 'undefined' ) {
2012-09-21 14:05:01 +04:00
// NOTE: Check does not always work and misses some shares, fix later
2012-09-09 22:44:08 +04:00
checkShares = true ;
2012-08-22 19:35:30 +04:00
} else {
checkShares = true ;
2012-08-06 21:30:44 +04:00
}
2012-08-24 18:43:42 +04:00
$ . ajax ( { type : 'GET' , url : OC . filePath ( 'core' , 'ajax' , 'share.php' ) , data : { fetch : 'getItem' , itemType : itemType , itemSource : itemSource , checkReshare : checkReshare , checkShares : checkShares } , async : false , success : function ( result ) {
2012-08-21 04:00:29 +04:00
if ( result && result . status === 'success' ) {
data = result . data ;
} else {
data = false ;
}
} } ) ;
2012-06-26 03:27:57 +04:00
return data ;
2012-05-05 22:56:52 +04:00
} ,
2012-08-22 19:35:30 +04:00
share : function ( itemType , itemSource , shareType , shareWith , permissions , callback ) {
$ . post ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { action : 'share' , itemType : itemType , itemSource : itemSource , shareType : shareType , shareWith : shareWith , permissions : permissions } , function ( result ) {
2012-05-05 22:56:52 +04:00
if ( result && result . status === 'success' ) {
if ( callback ) {
callback ( result . data ) ;
}
} else {
2012-09-21 14:05:01 +04:00
OC . dialogs . alert ( result . data . message , t ( 'core' , 'Error while sharing' ) ) ;
2012-05-05 22:56:52 +04:00
}
} ) ;
} ,
2012-08-21 04:00:29 +04:00
unshare : function ( itemType , itemSource , shareType , shareWith , callback ) {
$ . post ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { action : 'unshare' , itemType : itemType , itemSource : itemSource , shareType : shareType , shareWith : shareWith } , function ( result ) {
2012-05-05 22:56:52 +04:00
if ( result && result . status === 'success' ) {
if ( callback ) {
callback ( ) ;
}
} else {
2013-04-09 15:22:34 +04:00
OC . dialogs . alert ( t ( 'core' , 'Error while unsharing' ) , t ( 'core' , 'Error' ) ) ;
2012-05-05 22:56:52 +04:00
}
} ) ;
} ,
2012-08-21 04:00:29 +04:00
setPermissions : function ( itemType , itemSource , shareType , shareWith , permissions ) {
$ . post ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { action : 'setPermissions' , itemType : itemType , itemSource : itemSource , shareType : shareType , shareWith : shareWith , permissions : permissions } , function ( result ) {
2012-05-05 22:56:52 +04:00
if ( ! result || result . status !== 'success' ) {
2013-04-09 15:22:34 +04:00
OC . dialogs . alert ( t ( 'core' , 'Error while changing permissions' ) , t ( 'core' , 'Error' ) ) ;
2012-05-05 22:56:52 +04:00
}
} ) ;
} ,
2012-08-28 04:05:51 +04:00
showDropDown : function ( itemType , itemSource , appendTo , link , possiblePermissions ) {
2012-08-22 19:35:30 +04:00
var data = OC . Share . loadItem ( itemType , itemSource ) ;
var html = '<div id="dropdown" class="drop" data-item-type="' + itemType + '" data-item-source="' + itemSource + '">' ;
2012-11-28 02:01:26 +04:00
if ( data !== false && data . reshare !== false && data . reshare . uid _owner !== undefined ) {
2012-09-21 14:05:01 +04:00
if ( data . reshare . share _type == OC . Share . SHARE _TYPE _GROUP ) {
2013-06-29 15:24:05 +04:00
html += '<span class="reshare">' + t ( 'core' , 'Shared with you and the group {group} by {owner}' , { group : escapeHTML ( data . reshare . share _with ) , owner : escapeHTML ( data . reshare . displayname _owner ) } ) + '</span>' ;
2012-08-21 04:00:29 +04:00
} else {
2013-06-29 15:24:05 +04:00
html += '<span class="reshare">' + t ( 'core' , 'Shared with you by {owner}' , { owner : escapeHTML ( data . reshare . displayname _owner ) } ) + '</span>' ;
2012-08-21 04:00:29 +04:00
}
html += '<br />' ;
}
2012-08-31 03:05:36 +04:00
if ( possiblePermissions & OC . PERMISSION _SHARE ) {
2013-06-25 14:24:14 +04:00
// Determine the Allow Public Upload status.
// Used later on to determine if the
// respective checkbox should be checked or
// not.
var allowPublicUploadStatus = false ;
$ . each ( data . shares , function ( key , value ) {
if ( allowPublicUploadStatus ) {
return true ;
}
allowPublicUploadStatus = ( value . permissions & OC . PERMISSION _CREATE ) ? true : false ;
} ) ;
2012-09-21 13:48:20 +04:00
html += '<input id="shareWith" type="text" placeholder="' + t ( 'core' , 'Share with' ) + '" />' ;
2012-08-23 22:48:35 +04:00
html += '<ul id="shareWithList">' ;
html += '</ul>' ;
2012-08-28 04:05:51 +04:00
if ( link ) {
html += '<div id="link">' ;
2012-09-21 13:48:20 +04:00
html += '<input type="checkbox" name="linkCheckbox" id="linkCheckbox" value="1" /><label for="linkCheckbox">' + t ( 'core' , 'Share with link' ) + '</label>' ;
2012-08-23 22:48:35 +04:00
html += '<br />' ;
2012-08-28 23:10:06 +04:00
html += '<input id="linkText" type="text" readonly="readonly" />' ;
2012-12-05 17:17:21 +04:00
html += '<input type="checkbox" name="showPassword" id="showPassword" value="1" style="display:none;" /><label for="showPassword" style="display:none;">' + t ( 'core' , 'Password protect' ) + '</label>' ;
2012-08-28 23:10:06 +04:00
html += '<div id="linkPass">' ;
2012-09-21 13:48:20 +04:00
html += '<input id="linkPassText" type="password" placeholder="' + t ( 'core' , 'Password' ) + '" />' ;
2012-09-06 00:17:33 +04:00
html += '</div>' ;
2013-06-25 14:24:14 +04:00
html += '<div id="allowPublicUploadWrapper" style="display:none;">' ;
html += '<input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload"' + ( ( allowPublicUploadStatus ) ? 'checked="checked"' : '' ) + ' />' ;
html += '<label for="sharingDialogAllowPublicUpload">' + t ( 'core' , 'Allow Public Upload' ) + '</label>' ;
html += '</div></div>' ;
2013-02-08 14:05:56 +04:00
html += '<form id="emailPrivateLink" >' ;
2013-02-20 21:38:21 +04:00
html += '<input id="email" style="display:none; width:62%;" value="" placeholder="' + t ( 'core' , 'Email link to person' ) + '" type="text" />' ;
2013-02-20 20:07:23 +04:00
html += '<input id="emailButton" style="display:none;" type="submit" value="' + t ( 'core' , 'Send' ) + '" />' ;
2013-02-08 14:05:56 +04:00
html += '</form>' ;
2012-08-23 22:48:35 +04:00
}
2013-06-25 14:24:14 +04:00
2012-09-02 02:53:48 +04:00
html += '<div id="expiration">' ;
2012-09-21 13:48:20 +04:00
html += '<input type="checkbox" name="expirationCheckbox" id="expirationCheckbox" value="1" /><label for="expirationCheckbox">' + t ( 'core' , 'Set expiration date' ) + '</label>' ;
html += '<input id="expirationDate" type="text" placeholder="' + t ( 'core' , 'Expiration date' ) + '" style="display:none; width:90%;" />' ;
2012-07-04 01:00:23 +04:00
html += '</div>' ;
2012-08-23 22:48:35 +04:00
$ ( html ) . appendTo ( appendTo ) ;
// Reset item shares
OC . Share . itemShares = [ ] ;
if ( data . shares ) {
$ . each ( data . shares , function ( index , share ) {
2012-08-28 04:05:51 +04:00
if ( share . share _type == OC . Share . SHARE _TYPE _LINK ) {
2012-11-23 18:51:57 +04:00
OC . Share . showLink ( share . token , share . share _with , itemSource ) ;
2012-07-30 23:30:21 +04:00
} else {
2012-09-09 22:44:08 +04:00
if ( share . collection ) {
2013-01-25 20:40:23 +04:00
OC . Share . addShareWith ( share . share _type , share . share _with , share . share _with _displayname , share . permissions , possiblePermissions , share . collection ) ;
2012-09-09 22:44:08 +04:00
} else {
2013-01-25 20:40:23 +04:00
OC . Share . addShareWith ( share . share _type , share . share _with , share . share _with _displayname , share . permissions , possiblePermissions , false ) ;
2012-09-09 22:44:08 +04:00
}
2012-08-23 22:48:35 +04:00
}
2012-10-04 13:18:37 +04:00
if ( share . expiration != null ) {
2012-09-26 08:04:27 +04:00
OC . Share . showExpirationDate ( share . expiration ) ;
}
2012-08-23 22:48:35 +04:00
} ) ;
}
2013-02-27 20:57:40 +04:00
$ ( '#shareWith' ) . autocomplete ( { minLength : 1 , source : function ( search , response ) {
2012-08-23 22:48:35 +04:00
// if (cache[search.term]) {
// response(cache[search.term]);
// } else {
$ . get ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { fetch : 'getShareWith' , search : search . term , itemShares : OC . Share . itemShares } , function ( result ) {
if ( result . status == 'success' && result . data . length > 0 ) {
response ( result . data ) ;
2012-07-31 18:18:26 +04:00
} else {
2012-08-23 22:48:35 +04:00
// Suggest sharing via email if valid email address
2012-09-12 08:23:45 +04:00
// var pattern = new RegExp(/^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i);
// if (pattern.test(search.term)) {
2012-09-28 21:53:18 +04:00
// response([{label: t('core', 'Share via email:')+' '+search.term, value: {shareType: OC.Share.SHARE_TYPE_EMAIL, shareWith: search.term}}]);
2012-09-12 08:23:45 +04:00
// } else {
2012-09-21 13:48:20 +04:00
response ( [ t ( 'core' , 'No people found' ) ] ) ;
2012-09-12 08:23:45 +04:00
// }
2012-07-31 18:18:26 +04:00
}
2012-08-23 22:48:35 +04:00
} ) ;
// }
} ,
focus : function ( event , focused ) {
event . preventDefault ( ) ;
} ,
select : function ( event , selected ) {
2012-09-26 07:18:36 +04:00
event . stopPropagation ( ) ;
2012-08-24 23:32:06 +04:00
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
2012-08-23 22:48:35 +04:00
var shareType = selected . item . value . shareType ;
var shareWith = selected . item . value . shareWith ;
$ ( this ) . val ( shareWith ) ;
// Default permissions are Read and Share
2012-08-31 03:05:36 +04:00
var permissions = OC . PERMISSION _READ | OC . PERMISSION _SHARE ;
2012-08-24 23:32:06 +04:00
OC . Share . share ( itemType , itemSource , shareType , shareWith , permissions , function ( ) {
2013-01-25 20:40:23 +04:00
OC . Share . addShareWith ( shareType , shareWith , selected . item . label , permissions , possiblePermissions ) ;
2012-08-23 22:48:35 +04:00
$ ( '#shareWith' ) . val ( '' ) ;
2012-08-24 23:32:06 +04:00
OC . Share . updateIcon ( itemType , itemSource ) ;
2012-07-30 23:30:21 +04:00
} ) ;
2012-08-23 22:48:35 +04:00
return false ;
}
2013-03-22 01:41:44 +04:00
} )
// customize internal _renderItem function to display groups and users differently
. data ( "ui-autocomplete" ) . _renderItem = function ( ul , item ) {
2013-03-22 12:59:19 +04:00
var insert = $ ( "<a>" ) . text ( item . label ) ;
2013-03-22 01:41:44 +04:00
if ( item . label . length > 8 && item . label . substr ( item . label . length - 8 ) === ' (group)' ) {
2013-03-22 12:59:19 +04:00
// current label is group - wrap "strong" element
insert = insert . wrapInner ( '<strong>' ) ;
2013-03-22 01:41:44 +04:00
}
return $ ( "<li>" )
2013-03-22 12:59:19 +04:00
. append ( insert )
2013-03-22 01:41:44 +04:00
. appendTo ( ul ) ;
} ;
2012-08-23 22:48:35 +04:00
} else {
2012-09-21 13:48:20 +04:00
html += '<input id="shareWith" type="text" placeholder="' + t ( 'core' , 'Resharing is not allowed' ) + '" style="width:90%;" disabled="disabled"/>' ;
2012-08-23 22:48:35 +04:00
html += '</div>' ;
$ ( html ) . appendTo ( appendTo ) ;
2012-07-30 23:30:21 +04:00
}
2012-08-09 01:50:09 +04:00
$ ( '#dropdown' ) . show ( 'blind' , function ( ) {
OC . Share . droppedDown = true ;
} ) ;
2012-07-31 22:48:19 +04:00
$ ( '#shareWith' ) . focus ( ) ;
2012-05-05 22:56:52 +04:00
} ,
hideDropDown : function ( callback ) {
$ ( '#dropdown' ) . hide ( 'blind' , function ( ) {
2012-08-09 01:50:09 +04:00
OC . Share . droppedDown = false ;
2012-05-05 22:56:52 +04:00
$ ( '#dropdown' ) . remove ( ) ;
2012-08-09 01:50:09 +04:00
if ( typeof FileActions !== 'undefined' ) {
$ ( 'tr' ) . removeClass ( 'mouseOver' ) ;
}
2012-05-05 22:56:52 +04:00
if ( callback ) {
callback . call ( ) ;
}
} ) ;
} ,
2013-01-25 20:40:23 +04:00
addShareWith : function ( shareType , shareWith , shareWithDisplayName , permissions , possiblePermissions , collection ) {
2012-07-31 21:06:32 +04:00
if ( ! OC . Share . itemShares [ shareType ] ) {
OC . Share . itemShares [ shareType ] = [ ] ;
}
OC . Share . itemShares [ shareType ] . push ( shareWith ) ;
2012-09-09 22:44:08 +04:00
if ( collection ) {
if ( collection . item _type == 'file' || collection . item _type == 'folder' ) {
var item = collection . path ;
2012-08-02 02:03:00 +04:00
} else {
2012-09-09 22:44:08 +04:00
var item = collection . item _source ;
2012-08-02 02:03:00 +04:00
}
2012-09-09 22:44:08 +04:00
var collectionList = $ ( '#shareWithList li' ) . filterAttr ( 'data-collection' , item ) ;
if ( collectionList . length > 0 ) {
2013-03-28 00:17:58 +04:00
$ ( collectionList ) . append ( ', ' + shareWithDisplayName ) ;
2012-09-09 22:44:08 +04:00
} else {
2013-01-25 20:40:23 +04:00
var html = '<li style="clear: both;" data-collection="' + item + '">' + t ( 'core' , 'Shared in {item} with {user}' , { 'item' : item , user : shareWithDisplayName } ) + '</li>' ;
2012-09-09 22:44:08 +04:00
$ ( '#shareWithList' ) . prepend ( html ) ;
2012-07-27 18:13:23 +04:00
}
2012-09-09 22:44:08 +04:00
} else {
var editChecked = createChecked = updateChecked = deleteChecked = shareChecked = '' ;
if ( permissions & OC . PERMISSION _CREATE ) {
createChecked = 'checked="checked"' ;
editChecked = 'checked="checked"' ;
2012-07-27 18:13:23 +04:00
}
2012-09-09 22:44:08 +04:00
if ( permissions & OC . PERMISSION _UPDATE ) {
updateChecked = 'checked="checked"' ;
editChecked = 'checked="checked"' ;
2012-07-27 18:13:23 +04:00
}
2012-09-09 22:44:08 +04:00
if ( permissions & OC . PERMISSION _DELETE ) {
deleteChecked = 'checked="checked"' ;
editChecked = 'checked="checked"' ;
2012-07-27 18:13:23 +04:00
}
2012-09-09 22:44:08 +04:00
if ( permissions & OC . PERMISSION _SHARE ) {
shareChecked = 'checked="checked"' ;
}
2013-03-04 03:54:21 +04:00
var html = '<li style="clear: both;" data-share-type="' + escapeHTML ( shareType ) + '" data-share-with="' + escapeHTML ( shareWith ) + '" title="' + escapeHTML ( shareWith ) + '">' ;
2012-09-21 13:48:20 +04:00
html += '<a href="#" class="unshare" style="display:none;"><img class="svg" alt="' + t ( 'core' , 'Unshare' ) + '" src="' + OC . imagePath ( 'core' , 'actions/delete' ) + '"/></a>' ;
2012-10-01 18:04:20 +04:00
if ( shareWith . length > 14 ) {
2013-03-04 03:54:21 +04:00
html += escapeHTML ( shareWithDisplayName . substr ( 0 , 11 ) + '...' ) ;
2012-10-01 18:04:20 +04:00
} else {
2013-03-04 03:54:21 +04:00
html += escapeHTML ( shareWithDisplayName ) ;
2012-10-01 18:04:20 +04:00
}
2012-09-09 22:44:08 +04:00
if ( possiblePermissions & OC . PERMISSION _CREATE || possiblePermissions & OC . PERMISSION _UPDATE || possiblePermissions & OC . PERMISSION _DELETE ) {
if ( editChecked == '' ) {
html += '<label style="display:none;">' ;
} else {
html += '<label>' ;
}
2012-09-21 13:48:20 +04:00
html += '<input type="checkbox" name="edit" class="permissions" ' + editChecked + ' />' + t ( 'core' , 'can edit' ) + '</label>' ;
2012-09-09 22:44:08 +04:00
}
2012-09-21 13:48:20 +04:00
html += '<a href="#" class="showCruds" style="display:none;"><img class="svg" alt="' + t ( 'core' , 'access control' ) + '" src="' + OC . imagePath ( 'core' , 'actions/triangle-s' ) + '"/></a>' ;
2012-09-09 22:44:08 +04:00
html += '<div class="cruds" style="display:none;">' ;
if ( possiblePermissions & OC . PERMISSION _CREATE ) {
2012-09-21 13:48:20 +04:00
html += '<label><input type="checkbox" name="create" class="permissions" ' + createChecked + ' data-permissions="' + OC . PERMISSION _CREATE + '" />' + t ( 'core' , 'create' ) + '</label>' ;
2012-09-09 22:44:08 +04:00
}
if ( possiblePermissions & OC . PERMISSION _UPDATE ) {
2012-09-21 13:48:20 +04:00
html += '<label><input type="checkbox" name="update" class="permissions" ' + updateChecked + ' data-permissions="' + OC . PERMISSION _UPDATE + '" />' + t ( 'core' , 'update' ) + '</label>' ;
2012-09-09 22:44:08 +04:00
}
if ( possiblePermissions & OC . PERMISSION _DELETE ) {
2012-09-21 13:48:20 +04:00
html += '<label><input type="checkbox" name="delete" class="permissions" ' + deleteChecked + ' data-permissions="' + OC . PERMISSION _DELETE + '" />' + t ( 'core' , 'delete' ) + '</label>' ;
2012-09-09 22:44:08 +04:00
}
if ( possiblePermissions & OC . PERMISSION _SHARE ) {
2012-09-21 13:48:20 +04:00
html += '<label><input type="checkbox" name="share" class="permissions" ' + shareChecked + ' data-permissions="' + OC . PERMISSION _SHARE + '" />' + t ( 'core' , 'share' ) + '</label>' ;
2012-09-09 22:44:08 +04:00
}
html += '</div>' ;
html += '</li>' ;
$ ( html ) . appendTo ( '#shareWithList' ) ;
2012-09-19 09:02:57 +04:00
$ ( '#expiration' ) . show ( ) ;
2012-09-09 22:44:08 +04:00
}
2012-05-05 22:56:52 +04:00
} ,
2012-11-23 18:51:57 +04:00
showLink : function ( token , password , itemSource ) {
2012-09-19 09:44:15 +04:00
OC . Share . itemShares [ OC . Share . SHARE _TYPE _LINK ] = true ;
2012-08-28 04:05:51 +04:00
$ ( '#linkCheckbox' ) . attr ( 'checked' , true ) ;
2012-11-23 18:51:57 +04:00
if ( ! token ) {
//fallback to pre token link
var filename = $ ( 'tr' ) . filterAttr ( 'data-id' , String ( itemSource ) ) . data ( 'file' ) ;
var type = $ ( 'tr' ) . filterAttr ( 'data-id' , String ( itemSource ) ) . data ( 'type' ) ;
if ( $ ( '#dir' ) . val ( ) == '/' ) {
var file = $ ( '#dir' ) . val ( ) + filename ;
} else {
var file = $ ( '#dir' ) . val ( ) + '/' + filename ;
}
file = '/' + OC . currentUser + '/files' + file ;
var link = parent . location . protocol + '//' + location . host + OC . linkTo ( '' , 'public.php' ) + '?service=files&' + type + '=' + encodeURIComponent ( file ) ;
} else {
//TODO add path param when showing a link to file in a subfolder of a public link share
var link = parent . location . protocol + '//' + location . host + OC . linkTo ( '' , 'public.php' ) + '?service=files&t=' + token ;
}
2012-08-28 04:05:51 +04:00
$ ( '#linkText' ) . val ( link ) ;
$ ( '#linkText' ) . show ( 'blind' ) ;
2012-12-05 17:17:21 +04:00
$ ( '#linkText' ) . css ( 'display' , 'block' ) ;
2012-08-28 04:05:51 +04:00
$ ( '#showPassword' ) . show ( ) ;
2012-12-05 17:17:21 +04:00
$ ( '#showPassword+label' ) . show ( ) ;
2012-09-01 21:52:12 +04:00
if ( password != null ) {
2012-08-29 22:06:33 +04:00
$ ( '#linkPass' ) . show ( 'blind' ) ;
2012-12-05 17:17:21 +04:00
$ ( '#showPassword' ) . attr ( 'checked' , true ) ;
2012-09-21 13:48:20 +04:00
$ ( '#linkPassText' ) . attr ( 'placeholder' , t ( 'core' , 'Password protected' ) ) ;
2012-08-29 22:06:33 +04:00
}
2012-09-19 09:02:57 +04:00
$ ( '#expiration' ) . show ( ) ;
2013-02-08 14:05:56 +04:00
$ ( '#emailPrivateLink #email' ) . show ( ) ;
$ ( '#emailPrivateLink #emailButton' ) . show ( ) ;
2013-06-25 14:24:14 +04:00
$ ( '#allowPublicUploadWrapper' ) . show ( ) ;
2012-05-05 22:56:52 +04:00
} ,
2012-08-28 04:05:51 +04:00
hideLink : function ( ) {
$ ( '#linkText' ) . hide ( 'blind' ) ;
2012-08-29 22:01:09 +04:00
$ ( '#showPassword' ) . hide ( ) ;
2012-12-05 17:17:21 +04:00
$ ( '#showPassword+label' ) . hide ( ) ;
2012-08-29 22:01:09 +04:00
$ ( '#linkPass' ) . hide ( ) ;
2013-02-08 14:05:56 +04:00
$ ( '#emailPrivateLink #email' ) . hide ( ) ;
$ ( '#emailPrivateLink #emailButton' ) . hide ( ) ;
2013-06-25 14:24:14 +04:00
$ ( '#allowPublicUploadWrapper' ) . hide ( ) ;
2013-02-08 14:05:56 +04:00
} ,
dirname : function ( path ) {
2012-05-05 22:56:52 +04:00
return path . replace ( /\\/g , '/' ) . replace ( /\/[^\/]*$/ , '' ) ;
2012-09-26 08:04:27 +04:00
} ,
showExpirationDate : function ( date ) {
$ ( '#expirationCheckbox' ) . attr ( 'checked' , true ) ;
$ ( '#expirationDate' ) . before ( '<br />' ) ;
$ ( '#expirationDate' ) . val ( date ) ;
$ ( '#expirationDate' ) . show ( ) ;
$ ( '#expirationDate' ) . datepicker ( {
dateFormat : 'dd-mm-yy'
} ) ;
2012-05-05 22:56:52 +04:00
}
}
2011-07-27 05:27:40 +04:00
$ ( document ) . ready ( function ( ) {
2013-03-28 00:18:19 +04:00
2012-11-14 19:47:52 +04:00
if ( typeof monthNames != 'undefined' ) {
2013-02-08 14:05:56 +04:00
$ . datepicker . setDefaults ( {
monthNames : monthNames ,
monthNamesShort : $ . map ( monthNames , function ( v ) { return v . slice ( 0 , 3 ) + '.' ; } ) ,
dayNames : dayNames ,
dayNamesMin : $ . map ( dayNames , function ( v ) { return v . slice ( 0 , 2 ) ; } ) ,
dayNamesShort : $ . map ( dayNames , function ( v ) { return v . slice ( 0 , 3 ) + '.' ; } ) ,
firstDay : firstDay
} ) ;
}
$ ( document ) . on ( 'click' , 'a.share' , function ( event ) {
2012-08-09 01:50:09 +04:00
event . stopPropagation ( ) ;
2012-08-23 07:00:47 +04:00
if ( $ ( this ) . data ( 'item-type' ) !== undefined && $ ( this ) . data ( 'item' ) !== undefined ) {
2012-08-09 01:50:09 +04:00
var itemType = $ ( this ) . data ( 'item-type' ) ;
2012-08-23 07:00:47 +04:00
var itemSource = $ ( this ) . data ( 'item' ) ;
2012-08-09 01:50:09 +04:00
var appendTo = $ ( this ) . parent ( ) . parent ( ) ;
2012-08-28 04:05:51 +04:00
var link = false ;
2012-08-09 01:50:09 +04:00
var possiblePermissions = $ ( this ) . data ( 'possible-permissions' ) ;
2012-08-28 04:05:51 +04:00
if ( $ ( this ) . data ( 'link' ) !== undefined && $ ( this ) . data ( 'link' ) == true ) {
link = true ;
2012-07-04 01:00:23 +04:00
}
2012-08-09 01:50:09 +04:00
if ( OC . Share . droppedDown ) {
2012-08-23 07:00:47 +04:00
if ( itemSource != $ ( '#dropdown' ) . data ( 'item' ) ) {
2012-08-09 01:50:09 +04:00
OC . Share . hideDropDown ( function ( ) {
2012-08-28 04:05:51 +04:00
OC . Share . showDropDown ( itemType , itemSource , appendTo , link , possiblePermissions ) ;
2012-08-09 01:50:09 +04:00
} ) ;
} else {
OC . Share . hideDropDown ( ) ;
}
} else {
2012-08-28 04:05:51 +04:00
OC . Share . showDropDown ( itemType , itemSource , appendTo , link , possiblePermissions ) ;
2012-08-09 01:50:09 +04:00
}
2012-06-25 03:16:50 +04:00
}
} ) ;
2012-08-09 01:50:09 +04:00
$ ( this ) . click ( function ( event ) {
2012-10-08 23:03:16 +04:00
var target = $ ( event . target ) ;
2013-03-28 00:18:19 +04:00
var isMatched = ! target . is ( '.drop, .ui-datepicker-next, .ui-datepicker-prev, .ui-icon' )
2012-10-08 23:37:11 +04:00
&& ! target . closest ( '#ui-datepicker-div' ) . length ;
2012-10-08 23:03:16 +04:00
if ( OC . Share . droppedDown && isMatched && $ ( '#dropdown' ) . has ( event . target ) . length === 0 ) {
2012-08-09 01:50:09 +04:00
OC . Share . hideDropDown ( ) ;
}
} ) ;
2012-05-05 22:56:52 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'mouseenter' , '#dropdown #shareWithList li' , function ( event ) {
2012-05-05 22:56:52 +04:00
// Show permissions and unshare button
2012-07-27 05:56:22 +04:00
$ ( ':hidden' , this ) . filter ( ':not(.cruds)' ) . show ( ) ;
2011-08-10 01:55:51 +04:00
} ) ;
2012-08-23 07:00:47 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'mouseleave' , '#dropdown #shareWithList li' , function ( event ) {
2012-05-05 22:56:52 +04:00
// Hide permissions and unshare button
2012-07-27 05:56:22 +04:00
if ( ! $ ( '.cruds' , this ) . is ( ':visible' ) ) {
$ ( 'a' , this ) . hide ( ) ;
if ( ! $ ( 'input[name="edit"]' , this ) . is ( ':checked' ) ) {
$ ( 'input:[type=checkbox]' , this ) . hide ( ) ;
$ ( 'label' , this ) . hide ( ) ;
}
} else {
$ ( 'a.unshare' , this ) . hide ( ) ;
2011-08-10 01:55:51 +04:00
}
} ) ;
2012-07-27 05:56:22 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'click' , '#dropdown .showCruds' , function ( ) {
2012-07-27 05:56:22 +04:00
$ ( this ) . parent ( ) . find ( '.cruds' ) . toggle ( ) ;
} ) ;
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'click' , '#dropdown .unshare' , function ( ) {
2012-07-03 22:00:09 +04:00
var li = $ ( this ) . parent ( ) ;
2012-08-24 23:32:06 +04:00
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
2012-08-06 22:45:45 +04:00
var shareType = $ ( li ) . data ( 'share-type' ) ;
var shareWith = $ ( li ) . data ( 'share-with' ) ;
2012-08-24 23:32:06 +04:00
OC . Share . unshare ( itemType , itemSource , shareType , shareWith , function ( ) {
2012-07-03 22:00:09 +04:00
$ ( li ) . remove ( ) ;
2012-08-06 22:45:45 +04:00
var index = OC . Share . itemShares [ shareType ] . indexOf ( shareWith ) ;
OC . Share . itemShares [ shareType ] . splice ( index , 1 ) ;
2012-08-24 23:32:06 +04:00
OC . Share . updateIcon ( itemType , itemSource ) ;
2012-09-19 09:02:57 +04:00
if ( typeof OC . Share . statuses [ itemSource ] === 'undefined' ) {
$ ( '#expiration' ) . hide ( ) ;
}
2011-08-03 23:21:53 +04:00
} ) ;
} ) ;
2012-08-23 07:00:47 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'change' , '#dropdown .permissions' , function ( ) {
2012-07-27 05:56:22 +04:00
if ( $ ( this ) . attr ( 'name' ) == 'edit' ) {
2012-08-23 07:00:47 +04:00
var li = $ ( this ) . parent ( ) . parent ( )
2012-07-27 05:56:22 +04:00
var checkboxes = $ ( '.permissions' , li ) ;
var checked = $ ( this ) . is ( ':checked' ) ;
// Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck
$ ( checkboxes ) . filter ( 'input[name="create"]' ) . attr ( 'checked' , checked ) ;
$ ( checkboxes ) . filter ( 'input[name="update"]' ) . attr ( 'checked' , checked ) ;
$ ( checkboxes ) . filter ( 'input[name="delete"]' ) . attr ( 'checked' , checked ) ;
} else {
var li = $ ( this ) . parent ( ) . parent ( ) . parent ( ) ;
var checkboxes = $ ( '.permissions' , li ) ;
// Uncheck Edit if Create, Update, and Delete are not checked
2013-02-08 14:05:56 +04:00
if ( ! $ ( this ) . is ( ':checked' )
&& ! $ ( checkboxes ) . filter ( 'input[name="create"]' ) . is ( ':checked' )
&& ! $ ( checkboxes ) . filter ( 'input[name="update"]' ) . is ( ':checked' )
&& ! $ ( checkboxes ) . filter ( 'input[name="delete"]' ) . is ( ':checked' ) )
{
2012-07-27 05:56:22 +04:00
$ ( checkboxes ) . filter ( 'input[name="edit"]' ) . attr ( 'checked' , false ) ;
// Check Edit if Create, Update, or Delete is checked
2013-02-08 14:05:56 +04:00
} else if ( ( $ ( this ) . attr ( 'name' ) == 'create'
|| $ ( this ) . attr ( 'name' ) == 'update'
|| $ ( this ) . attr ( 'name' ) == 'delete' ) )
{
2012-07-27 05:56:22 +04:00
$ ( checkboxes ) . filter ( 'input[name="edit"]' ) . attr ( 'checked' , true ) ;
}
}
2012-08-31 03:05:36 +04:00
var permissions = OC . PERMISSION _READ ;
2012-07-27 05:56:22 +04:00
$ ( checkboxes ) . filter ( ':not(input[name="edit"])' ) . filter ( ':checked' ) . each ( function ( index , checkbox ) {
permissions |= $ ( checkbox ) . data ( 'permissions' ) ;
} ) ;
2013-02-08 14:05:56 +04:00
OC . Share . setPermissions ( $ ( '#dropdown' ) . data ( 'item-type' ) ,
$ ( '#dropdown' ) . data ( 'item-source' ) ,
$ ( li ) . data ( 'share-type' ) ,
$ ( li ) . data ( 'share-with' ) ,
permissions ) ;
2012-05-05 22:56:52 +04:00
} ) ;
2012-08-23 07:00:47 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'change' , '#dropdown #linkCheckbox' , function ( ) {
2012-07-11 20:18:59 +04:00
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
2012-08-28 04:05:51 +04:00
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
2011-08-03 23:21:53 +04:00
if ( this . checked ) {
2012-08-28 04:05:51 +04:00
// Create a link
2012-11-12 17:44:00 +04:00
OC . Share . share ( itemType , itemSource , OC . Share . SHARE _TYPE _LINK , '' , OC . PERMISSION _READ , function ( data ) {
2012-11-23 18:51:57 +04:00
OC . Share . showLink ( data . token , null , itemSource ) ;
2012-09-19 09:44:15 +04:00
OC . Share . updateIcon ( itemType , itemSource ) ;
2011-08-03 23:21:53 +04:00
} ) ;
} else {
2012-05-05 22:56:52 +04:00
// Delete private link
2012-08-28 04:05:51 +04:00
OC . Share . unshare ( itemType , itemSource , OC . Share . SHARE _TYPE _LINK , '' , function ( ) {
OC . Share . hideLink ( ) ;
2012-09-19 09:44:15 +04:00
OC . Share . itemShares [ OC . Share . SHARE _TYPE _LINK ] = false ;
OC . Share . updateIcon ( itemType , itemSource ) ;
2012-09-19 09:02:57 +04:00
if ( typeof OC . Share . statuses [ itemSource ] === 'undefined' ) {
$ ( '#expiration' ) . hide ( ) ;
}
2011-08-03 23:21:53 +04:00
} ) ;
}
2011-07-27 05:27:40 +04:00
} ) ;
2012-08-23 07:00:47 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'click' , '#dropdown #linkText' , function ( ) {
2011-08-07 23:20:57 +04:00
$ ( this ) . focus ( ) ;
$ ( this ) . select ( ) ;
} ) ;
2012-04-26 18:33:06 +04:00
2013-06-25 14:24:14 +04:00
// Handle the Allow Public Upload Checkbox
$ ( document ) . on ( 'click' , '#sharingDialogAllowPublicUpload' , function ( ) {
// Gather data
var allowPublicUpload = $ ( this ) . is ( ':checked' ) ;
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
var permissions = 0 ;
// Calculate permissions
if ( allowPublicUpload ) {
permissions = OC . PERMISSION _UPDATE + OC . PERMISSION _CREATE + OC . PERMISSION _READ ;
} else {
permissions = OC . PERMISSION _READ ;
}
// Update the share information
OC . Share . share ( itemType , itemSource , OC . Share . SHARE _TYPE _LINK , '' , permissions , function ( data ) {
return ;
} ) ;
} ) ;
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'click' , '#dropdown #showPassword' , function ( ) {
2012-08-28 23:10:06 +04:00
$ ( '#linkPass' ) . toggle ( 'blind' ) ;
2012-12-05 17:17:21 +04:00
if ( ! $ ( '#showPassword' ) . is ( ':checked' ) ) {
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
OC . Share . share ( itemType , itemSource , OC . Share . SHARE _TYPE _LINK , '' , OC . PERMISSION _READ ) ;
2012-12-14 16:13:01 +04:00
} else {
$ ( '#linkPassText' ) . focus ( ) ;
2012-12-05 17:17:21 +04:00
}
2012-08-28 04:05:51 +04:00
} ) ;
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'focusout keyup' , '#dropdown #linkPassText' , function ( event ) {
2012-12-14 16:13:01 +04:00
if ( $ ( '#linkPassText' ) . val ( ) != '' && ( event . type == 'focusout' || event . keyCode == 13 ) ) {
2012-12-04 17:06:44 +04:00
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
2012-12-14 16:25:57 +04:00
OC . Share . share ( itemType , itemSource , OC . Share . SHARE _TYPE _LINK , $ ( '#linkPassText' ) . val ( ) , OC . PERMISSION _READ , function ( ) {
2012-12-14 16:13:01 +04:00
console . log ( "password set to: '" + $ ( '#linkPassText' ) . val ( ) + "' by event: " + event . type ) ;
$ ( '#linkPassText' ) . val ( '' ) ;
$ ( '#linkPassText' ) . attr ( 'placeholder' , t ( 'core' , 'Password protected' ) ) ;
} ) ;
2012-12-04 17:06:44 +04:00
}
2012-08-28 04:05:51 +04:00
} ) ;
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'click' , '#dropdown #expirationCheckbox' , function ( ) {
2012-09-02 02:53:48 +04:00
if ( this . checked ) {
2012-09-26 08:04:27 +04:00
OC . Share . showExpirationDate ( '' ) ;
2012-09-02 02:53:48 +04:00
} else {
2012-09-26 08:09:35 +04:00
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
$ . post ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { action : 'setExpirationDate' , itemType : itemType , itemSource : itemSource , date : '' } , function ( result ) {
if ( ! result || result . status !== 'success' ) {
2013-04-09 15:22:34 +04:00
OC . dialogs . alert ( t ( 'core' , 'Error unsetting expiration date' ) , t ( 'core' , 'Error' ) ) ;
2012-09-26 08:09:35 +04:00
}
$ ( '#expirationDate' ) . hide ( ) ;
} ) ;
2012-09-02 02:53:48 +04:00
}
} ) ;
2013-03-28 00:18:19 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'change' , '#dropdown #expirationDate' , function ( ) {
2012-09-02 02:53:48 +04:00
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
$ . post ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { action : 'setExpirationDate' , itemType : itemType , itemSource : itemSource , date : $ ( this ) . val ( ) } , function ( result ) {
if ( ! result || result . status !== 'success' ) {
2013-04-09 15:22:34 +04:00
OC . dialogs . alert ( t ( 'core' , 'Error setting expiration date' ) , t ( 'core' , 'Error' ) ) ;
2012-09-02 02:53:48 +04:00
}
} ) ;
} ) ;
2012-12-11 02:22:42 +04:00
2013-02-08 14:05:56 +04:00
$ ( document ) . on ( 'submit' , '#dropdown #emailPrivateLink' , function ( event ) {
event . preventDefault ( ) ;
var link = $ ( '#linkText' ) . val ( ) ;
var itemType = $ ( '#dropdown' ) . data ( 'item-type' ) ;
var itemSource = $ ( '#dropdown' ) . data ( 'item-source' ) ;
var file = $ ( 'tr' ) . filterAttr ( 'data-id' , String ( itemSource ) ) . data ( 'file' ) ;
var email = $ ( '#email' ) . val ( ) ;
if ( email != '' ) {
$ ( '#email' ) . attr ( 'disabled' , "disabled" ) ;
$ ( '#email' ) . val ( t ( 'core' , 'Sending ...' ) ) ;
$ ( '#emailButton' ) . attr ( 'disabled' , "disabled" ) ;
2012-12-12 15:34:28 +04:00
2013-02-08 14:05:56 +04:00
$ . post ( OC . filePath ( 'core' , 'ajax' , 'share.php' ) , { action : 'email' , toaddress : email , link : link , itemType : itemType , itemSource : itemSource , file : file } ,
function ( result ) {
$ ( '#email' ) . attr ( 'disabled' , "false" ) ;
$ ( '#emailButton' ) . attr ( 'disabled' , "false" ) ;
if ( result && result . status == 'success' ) {
$ ( '#email' ) . css ( 'font-weight' , 'bold' ) ;
$ ( '#email' ) . animate ( { fontWeight : 'normal' } , 2000 , function ( ) {
$ ( this ) . val ( '' ) ;
} ) . val ( t ( 'core' , 'Email sent' ) ) ;
} else {
OC . dialogs . alert ( result . data . message , t ( 'core' , 'Error while sharing' ) ) ;
}
} ) ;
}
} ) ;
2012-12-11 02:22:42 +04:00
2012-06-25 22:55:49 +04:00
} ) ;