2010-07-01 19:48:07 -04:00
< ? php
2016-01-24 08:30:57 -05:00
require_once ( " include/Contact.php " );
2016-07-09 14:09:09 -04:00
require_once ( 'include/Probe.php' );
2010-07-01 19:48:07 -04:00
2017-01-09 07:14:55 -05:00
function profiles_init ( App $a ) {
2013-01-03 12:47:45 -05:00
nav_set_selected ( 'profiles' );
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2013-01-03 12:47:45 -05:00
return ;
}
if (( $a -> argc > 2 ) && ( $a -> argv [ 1 ] === " drop " ) && intval ( $a -> argv [ 2 ])) {
$r = q ( " SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is-default` = 0 LIMIT 1 " ,
intval ( $a -> argv [ 2 ]),
intval ( local_user ())
);
2016-12-20 04:10:33 -05:00
if ( ! dbm :: is_result ( $r )) {
2013-01-03 12:47:45 -05:00
notice ( t ( 'Profile not found.' ) . EOL );
2016-02-17 02:08:28 -05:00
goaway ( 'profiles' );
2013-01-03 12:47:45 -05:00
return ; // NOTREACHED
}
2014-03-09 04:19:14 -04:00
2013-01-03 12:47:45 -05:00
check_form_security_token_redirectOnErr ( '/profiles' , 'profile_drop' , 't' );
// move every contact using this profile as their default to the user default
$r = q ( " UPDATE `contact` SET `profile-id` = (SELECT `profile`.`id` AS `profile-id` FROM `profile` WHERE `profile`.`is-default` = 1 AND `profile`.`uid` = %d LIMIT 1) WHERE `profile-id` = %d AND `uid` = %d " ,
intval ( local_user ()),
intval ( $a -> argv [ 2 ]),
intval ( local_user ())
);
2014-03-09 04:19:14 -04:00
$r = q ( " DELETE FROM `profile` WHERE `id` = %d AND `uid` = %d " ,
2013-01-03 12:47:45 -05:00
intval ( $a -> argv [ 2 ]),
intval ( local_user ())
);
if ( $r )
2016-02-17 02:08:28 -05:00
info ( t ( 'Profile deleted.' ) . EOL );
2013-01-03 12:47:45 -05:00
2016-02-17 02:08:28 -05:00
goaway ( 'profiles' );
2013-01-03 12:47:45 -05:00
return ; // NOTREACHED
}
if (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] === 'new' )) {
2014-03-09 04:19:14 -04:00
2013-01-03 12:47:45 -05:00
check_form_security_token_redirectOnErr ( '/profiles' , 'profile_new' , 't' );
$r0 = q ( " SELECT `id` FROM `profile` WHERE `uid` = %d " ,
intval ( local_user ()));
$num_profiles = count ( $r0 );
$name = t ( 'Profile-' ) . ( $num_profiles + 1 );
$r1 = q ( " SELECT `name`, `photo`, `thumb` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1 " ,
intval ( local_user ()));
2014-03-09 04:19:14 -04:00
2013-01-03 12:47:45 -05:00
$r2 = q ( " INSERT INTO `profile` (`uid` , `profile-name` , `name`, `photo`, `thumb`)
VALUES ( % d , '%s' , '%s' , '%s' , '%s' ) " ,
intval ( local_user ()),
dbesc ( $name ),
dbesc ( $r1 [ 0 ][ 'name' ]),
dbesc ( $r1 [ 0 ][ 'photo' ]),
dbesc ( $r1 [ 0 ][ 'thumb' ])
);
$r3 = q ( " SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile-name` = '%s' LIMIT 1 " ,
intval ( local_user ()),
dbesc ( $name )
);
info ( t ( 'New profile created.' ) . EOL );
if ( count ( $r3 ) == 1 )
2016-02-17 02:08:28 -05:00
goaway ( 'profiles/' . $r3 [ 0 ][ 'id' ]);
2014-03-09 04:19:14 -04:00
2016-02-17 02:08:28 -05:00
goaway ( 'profiles' );
2014-03-11 18:52:32 -04:00
}
2013-01-03 12:47:45 -05:00
if (( $a -> argc > 2 ) && ( $a -> argv [ 1 ] === 'clone' )) {
2014-03-09 04:19:14 -04:00
2013-01-03 12:47:45 -05:00
check_form_security_token_redirectOnErr ( '/profiles' , 'profile_clone' , 't' );
$r0 = q ( " SELECT `id` FROM `profile` WHERE `uid` = %d " ,
intval ( local_user ()));
$num_profiles = count ( $r0 );
$name = t ( 'Profile-' ) . ( $num_profiles + 1 );
$r1 = q ( " SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
intval ( local_user ()),
intval ( $a -> argv [ 2 ])
);
2016-12-19 08:42:20 -05:00
if ( ! dbm :: is_result ( $r1 )) {
2013-01-03 12:47:45 -05:00
notice ( t ( 'Profile unavailable to clone.' ) . EOL );
killme ();
return ;
}
unset ( $r1 [ 0 ][ 'id' ]);
$r1 [ 0 ][ 'is-default' ] = 0 ;
2014-03-11 18:52:32 -04:00
$r1 [ 0 ][ 'publish' ] = 0 ;
$r1 [ 0 ][ 'net-publish' ] = 0 ;
2013-01-03 12:47:45 -05:00
$r1 [ 0 ][ 'profile-name' ] = dbesc ( $name );
dbesc_array ( $r1 [ 0 ]);
2014-03-11 18:52:32 -04:00
$r2 = dbq ( " INSERT INTO `profile` (` "
. implode ( " `, ` " , array_keys ( $r1 [ 0 ]))
. " `) VALUES (' "
. implode ( " ', ' " , array_values ( $r1 [ 0 ]))
2013-01-03 12:47:45 -05:00
. " ') " );
$r3 = q ( " SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile-name` = '%s' LIMIT 1 " ,
intval ( local_user ()),
dbesc ( $name )
);
info ( t ( 'New profile created.' ) . EOL );
2016-12-19 08:42:20 -05:00
if (( dbm :: is_result ( $r3 )) && ( count ( $r3 ) == 1 ))
2016-02-17 02:08:28 -05:00
goaway ( 'profiles/' . $r3 [ 0 ][ 'id' ]);
2014-03-09 04:19:14 -04:00
2016-02-17 02:08:28 -05:00
goaway ( 'profiles' );
2014-03-09 04:19:14 -04:00
2013-01-03 12:47:45 -05:00
return ; // NOTREACHED
}
if (( $a -> argc > 1 ) && ( intval ( $a -> argv [ 1 ]))) {
$r = q ( " SELECT id FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $a -> argv [ 1 ]),
intval ( local_user ())
);
2016-12-20 04:10:33 -05:00
if ( ! dbm :: is_result ( $r )) {
2013-01-03 12:47:45 -05:00
notice ( t ( 'Profile not found.' ) . EOL );
killme ();
return ;
}
profile_load ( $a , $a -> user [ 'nickname' ], $r [ 0 ][ 'id' ]);
}
2015-01-09 18:34:08 -05:00
2016-02-07 09:11:34 -05:00
2013-01-03 12:47:45 -05:00
}
2015-01-25 07:19:37 -05:00
function profile_clean_keywords ( $keywords ) {
$keywords = str_replace ( " , " , " " , $keywords );
$keywords = explode ( " " , $keywords );
$cleaned = array ();
foreach ( $keywords as $keyword ) {
$keyword = trim ( strtolower ( $keyword ));
2015-01-25 19:07:15 -05:00
$keyword = trim ( $keyword , " # " );
2015-01-25 07:19:37 -05:00
if ( $keyword != " " )
$cleaned [] = $keyword ;
}
$keywords = implode ( " , " , $cleaned );
return $keywords ;
}
2017-01-09 07:14:55 -05:00
function profiles_post ( App $a ) {
2010-07-01 19:48:07 -04:00
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2010-08-19 07:59:31 -04:00
notice ( t ( 'Permission denied.' ) . EOL );
2010-07-01 19:48:07 -04:00
return ;
}
2010-08-09 00:03:08 -04:00
$namechanged = false ;
2011-01-20 18:30:45 -05:00
call_hooks ( 'profile_post' , $_POST );
2010-09-26 20:24:20 -04:00
if (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] !== " new " ) && intval ( $a -> argv [ 1 ])) {
2010-08-09 00:03:08 -04:00
$orig = q ( " SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
2010-07-01 19:48:07 -04:00
intval ( $a -> argv [ 1 ]),
2010-11-24 19:35:35 -05:00
intval ( local_user ())
2010-07-01 19:48:07 -04:00
);
2010-08-09 00:03:08 -04:00
if ( ! count ( $orig )) {
2010-08-19 07:59:31 -04:00
notice ( t ( 'Profile not found.' ) . EOL );
2010-07-01 19:48:07 -04:00
return ;
}
2014-03-09 04:19:14 -04:00
2012-03-12 16:17:37 -04:00
check_form_security_token_redirectOnErr ( '/profiles' , 'profile_edit' );
2014-03-11 18:52:32 -04:00
2010-08-09 00:03:08 -04:00
$is_default = (( $orig [ 0 ][ 'is-default' ]) ? 1 : 0 );
2010-07-01 19:48:07 -04:00
$profile_name = notags ( trim ( $_POST [ 'profile_name' ]));
if ( ! strlen ( $profile_name )) {
2014-08-20 19:00:56 -04:00
notice ( t ( 'Profile Name is required.' ) . EOL );
2010-07-01 19:48:07 -04:00
return ;
}
2014-03-11 18:52:32 -04:00
2015-05-22 12:53:18 -04:00
$dob = $_POST [ 'dob' ] ? escape_tags ( trim ( $_POST [ 'dob' ])) : '0000-00-00' ; // FIXME: Needs to be validated?
2015-01-09 18:34:08 -05:00
2015-05-22 12:53:18 -04:00
$y = substr ( $dob , 0 , 4 );
if (( ! ctype_digit ( $y )) || ( $y < 1900 ))
$ignore_year = true ;
else
$ignore_year = false ;
if ( $dob != '0000-00-00' ) {
if ( strpos ( $dob , '0000-' ) === 0 ) {
$ignore_year = true ;
$dob = substr ( $dob , 5 );
}
$dob = datetime_convert ( 'UTC' , 'UTC' ,(( $ignore_year ) ? '1900-' . $dob : $dob ),(( $ignore_year ) ? 'm-d' : 'Y-m-d' ));
if ( $ignore_year )
$dob = '0000-' . $dob ;
}
2015-10-25 04:15:36 -04:00
2010-07-01 19:48:07 -04:00
$name = notags ( trim ( $_POST [ 'name' ]));
2010-08-09 00:03:08 -04:00
2012-08-19 17:39:43 -04:00
if ( ! strlen ( $name )) {
$name = '[No Name]' ;
}
2010-08-09 00:03:08 -04:00
if ( $orig [ 0 ][ 'name' ] != $name )
$namechanged = true ;
2012-04-13 00:10:32 -04:00
2012-08-19 17:39:43 -04:00
2011-01-18 22:25:28 -05:00
$pdesc = notags ( trim ( $_POST [ 'pdesc' ]));
2010-07-01 19:48:07 -04:00
$gender = notags ( trim ( $_POST [ 'gender' ]));
$address = notags ( trim ( $_POST [ 'address' ]));
$locality = notags ( trim ( $_POST [ 'locality' ]));
$region = notags ( trim ( $_POST [ 'region' ]));
$postal_code = notags ( trim ( $_POST [ 'postal_code' ]));
$country_name = notags ( trim ( $_POST [ 'country_name' ]));
2015-01-25 07:19:37 -05:00
$pub_keywords = profile_clean_keywords ( notags ( trim ( $_POST [ 'pub_keywords' ])));
$prv_keywords = profile_clean_keywords ( notags ( trim ( $_POST [ 'prv_keywords' ])));
2010-08-19 08:29:43 -04:00
$marital = notags ( trim ( $_POST [ 'marital' ]));
2012-06-02 05:30:26 -04:00
$howlong = notags ( trim ( $_POST [ 'howlong' ]));
2010-08-10 01:58:58 -04:00
2010-12-04 01:46:42 -05:00
$with = (( x ( $_POST , 'with' )) ? notags ( trim ( $_POST [ 'with' ])) : '' );
2012-06-02 05:30:26 -04:00
if ( ! strlen ( $howlong ))
$howlong = '0000-00-00 00:00:00' ;
else
$howlong = datetime_convert ( date_default_timezone_get (), 'UTC' , $howlong );
2015-01-09 18:34:08 -05:00
2010-12-04 01:46:42 -05:00
// linkify the relationship target if applicable
2012-04-13 00:58:15 -04:00
$withchanged = false ;
2010-12-04 01:46:42 -05:00
if ( strlen ( $with )) {
if ( $with != strip_tags ( $orig [ 0 ][ 'with' ])) {
2012-04-13 00:58:15 -04:00
$withchanged = true ;
2010-12-04 01:46:42 -05:00
$prf = '' ;
$lookup = $with ;
2011-02-25 15:12:25 -05:00
if ( strpos ( $lookup , '@' ) === 0 )
$lookup = substr ( $lookup , 1 );
$lookup = str_replace ( '_' , ' ' , $lookup );
if ( strpos ( $lookup , '@' ) || ( strpos ( $lookup , 'http://' ))) {
2010-12-04 01:46:42 -05:00
$newname = $lookup ;
2016-07-09 14:09:09 -04:00
$links = @ Probe :: lrdd ( $lookup );
2010-12-04 01:46:42 -05:00
if ( count ( $links )) {
foreach ( $links as $link ) {
if ( $link [ '@attributes' ][ 'rel' ] === 'http://webfinger.net/rel/profile-page' ) {
2016-06-10 05:24:38 -04:00
$prf = $link [ '@attributes' ][ 'href' ];
2010-12-04 01:46:42 -05:00
}
}
}
}
else {
$newname = $lookup ;
2012-09-29 19:55:40 -04:00
/* if ( strstr ( $lookup , ' ' )) {
2010-12-04 01:46:42 -05:00
$r = q ( " SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $newname ),
intval ( local_user ())
);
}
else {
$r = q ( " SELECT * FROM `contact` WHERE `nick` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $lookup ),
intval ( local_user ())
);
2012-09-29 19:55:40 -04:00
} */
2014-03-09 04:19:14 -04:00
2012-09-29 19:55:40 -04:00
$r = q ( " SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $newname ),
intval ( local_user ())
);
if ( ! $r ) {
$r = q ( " SELECT * FROM `contact` WHERE `nick` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $lookup ),
intval ( local_user ())
);
2010-12-04 01:46:42 -05:00
}
2016-12-14 03:41:33 -05:00
if ( dbm :: is_result ( $r )) {
2010-12-04 01:46:42 -05:00
$prf = $r [ 0 ][ 'url' ];
$newname = $r [ 0 ][ 'name' ];
}
}
2015-01-09 18:34:08 -05:00
2010-12-04 01:46:42 -05:00
if ( $prf ) {
$with = str_replace ( $lookup , '<a href="' . $prf . '">' . $newname . '</a>' , $with );
2011-02-25 15:12:25 -05:00
if ( strpos ( $with , '@' ) === 0 )
$with = substr ( $with , 1 );
2010-12-04 01:46:42 -05:00
}
}
else
$with = $orig [ 0 ][ 'with' ];
}
2010-07-10 19:47:10 -04:00
$sexual = notags ( trim ( $_POST [ 'sexual' ]));
2016-09-25 11:28:00 -04:00
$xmpp = notags ( trim ( $_POST [ 'xmpp' ]));
2010-07-01 19:48:07 -04:00
$homepage = notags ( trim ( $_POST [ 'homepage' ]));
2014-06-22 03:44:59 -04:00
if (( strpos ( $homepage , 'http' ) !== 0 ) && ( strlen ( $homepage ))) {
2016-06-10 05:24:38 -04:00
// neither http nor https in URL, add them
$homepage = 'http://' . $homepage ;
2014-01-12 03:16:46 -05:00
}
2012-06-02 23:58:20 -04:00
$hometown = notags ( trim ( $_POST [ 'hometown' ]));
2010-07-10 19:47:10 -04:00
$politic = notags ( trim ( $_POST [ 'politic' ]));
$religion = notags ( trim ( $_POST [ 'religion' ]));
2012-06-25 00:16:55 -04:00
$likes = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'likes' ])));
$dislikes = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'dislikes' ])));
2012-04-10 19:31:49 -04:00
$about = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'about' ])));
$interest = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'interest' ])));
$contact = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'contact' ])));
$music = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'music' ])));
$book = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'book' ])));
$tv = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'tv' ])));
$film = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'film' ])));
$romance = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'romance' ])));
$work = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'work' ])));
$education = fix_mce_lf ( escape_tags ( trim ( $_POST [ 'education' ])));
2010-08-20 01:04:18 -04:00
$hide_friends = (( $_POST [ 'hide-friends' ] == 1 ) ? 1 : 0 );
2010-07-01 19:48:07 -04:00
2015-10-25 04:15:36 -04:00
set_pconfig ( local_user (), 'system' , 'detailled_profile' , (( $_POST [ 'detailled_profile' ] == 1 ) ? 1 : 0 ));
2012-04-13 00:10:32 -04:00
$changes = array ();
2012-04-29 04:42:48 -04:00
$value = '' ;
2012-04-13 00:10:32 -04:00
if ( $is_default ) {
2012-04-29 04:42:48 -04:00
if ( $marital != $orig [ 0 ][ 'marital' ]) {
2012-04-29 05:11:33 -04:00
$changes [] = '[color=#ff0000]♥[/color] ' . t ( 'Marital Status' );
2012-04-29 04:42:48 -04:00
$value = $marital ;
}
if ( $withchanged ) {
2012-05-25 03:42:38 -04:00
$changes [] = '[color=#ff0000]♥[/color] ' . t ( 'Romantic Partner' );
2012-04-29 04:42:48 -04:00
$value = strip_tags ( $with );
2012-06-25 00:16:55 -04:00
}
if ( $likes != $orig [ 0 ][ 'likes' ]) {
$changes [] = t ( 'Likes' );
$value = $likes ;
}
if ( $dislikes != $orig [ 0 ][ 'dislikes' ]) {
$changes [] = t ( 'Dislikes' );
$value = $dislikes ;
}
2012-04-29 04:42:48 -04:00
if ( $work != $orig [ 0 ][ 'work' ]) {
$changes [] = t ( 'Work/Employment' );
}
if ( $religion != $orig [ 0 ][ 'religion' ]) {
$changes [] = t ( 'Religion' );
$value = $religion ;
}
if ( $politic != $orig [ 0 ][ 'politic' ]) {
$changes [] = t ( 'Political Views' );
$value = $politic ;
}
if ( $gender != $orig [ 0 ][ 'gender' ]) {
$changes [] = t ( 'Gender' );
$value = $gender ;
}
if ( $sexual != $orig [ 0 ][ 'sexual' ]) {
$changes [] = t ( 'Sexual Preference' );
$value = $sexual ;
}
2016-09-25 11:28:00 -04:00
if ( $xmpp != $orig [ 0 ][ 'xmpp' ]) {
$changes [] = t ( 'XMPP' );
$value = $xmpp ;
}
2012-04-29 04:42:48 -04:00
if ( $homepage != $orig [ 0 ][ 'homepage' ]) {
$changes [] = t ( 'Homepage' );
$value = $homepage ;
}
if ( $interest != $orig [ 0 ][ 'interest' ]) {
$changes [] = t ( 'Interests' );
$value = $interest ;
}
2012-05-25 18:56:18 -04:00
if ( $address != $orig [ 0 ][ 'address' ]) {
$changes [] = t ( 'Address' );
// New address not sent in notifications, potential privacy issues
// in case this leaks to unintended recipients. Yes, it's in the public
// profile but that doesn't mean we have to broadcast it to everybody.
}
if ( $locality != $orig [ 0 ][ 'locality' ] || $region != $orig [ 0 ][ 'region' ]
2012-04-29 04:49:54 -04:00
|| $country_name != $orig [ 0 ][ 'country-name' ]) {
2012-04-29 04:42:48 -04:00
$changes [] = t ( 'Location' );
2012-05-25 18:56:18 -04:00
$comma1 = ((( $locality ) && ( $region || $country_name )) ? ', ' : ' ' );
$comma2 = (( $region && $country_name ) ? ', ' : '' );
$value = $locality . $comma1 . $region . $comma2 . $country_name ;
2012-04-29 04:42:48 -04:00
}
2012-04-13 00:10:32 -04:00
2012-04-29 04:42:48 -04:00
profile_activity ( $changes , $value );
2012-04-13 00:10:32 -04:00
2014-03-09 04:19:14 -04:00
}
$r = q ( " UPDATE `profile`
2010-07-01 19:48:07 -04:00
SET `profile-name` = '%s' ,
`name` = '%s' ,
2011-01-18 22:25:28 -05:00
`pdesc` = '%s' ,
2010-07-01 19:48:07 -04:00
`gender` = '%s' ,
2010-07-10 19:47:10 -04:00
`dob` = '%s' ,
2010-07-01 19:48:07 -04:00
`address` = '%s' ,
`locality` = '%s' ,
`region` = '%s' ,
`postal-code` = '%s' ,
`country-name` = '%s' ,
`marital` = '%s' ,
2010-12-04 01:46:42 -05:00
`with` = '%s' ,
2012-06-02 05:30:26 -04:00
`howlong` = '%s' ,
2010-07-10 19:47:10 -04:00
`sexual` = '%s' ,
2016-09-25 11:28:00 -04:00
`xmpp` = '%s' ,
2010-07-01 19:48:07 -04:00
`homepage` = '%s' ,
2012-06-02 23:58:20 -04:00
`hometown` = '%s' ,
2010-07-10 19:47:10 -04:00
`politic` = '%s' ,
`religion` = '%s' ,
2011-03-14 03:28:49 -04:00
`pub_keywords` = '%s' ,
`prv_keywords` = '%s' ,
2012-06-25 00:16:55 -04:00
`likes` = '%s' ,
`dislikes` = '%s' ,
2010-07-10 19:47:10 -04:00
`about` = '%s' ,
`interest` = '%s' ,
`contact` = '%s' ,
`music` = '%s' ,
`book` = '%s' ,
`tv` = '%s' ,
`film` = '%s' ,
`romance` = '%s' ,
`work` = '%s' ,
2010-08-20 01:04:18 -04:00
`education` = '%s' ,
2011-06-19 19:47:03 -04:00
`hide-friends` = % d
2014-03-09 04:19:14 -04:00
WHERE `id` = % d AND `uid` = % d " ,
2010-07-01 19:48:07 -04:00
dbesc ( $profile_name ),
dbesc ( $name ),
2011-01-18 22:25:28 -05:00
dbesc ( $pdesc ),
2010-07-01 19:48:07 -04:00
dbesc ( $gender ),
2010-07-10 19:47:10 -04:00
dbesc ( $dob ),
2010-07-01 19:48:07 -04:00
dbesc ( $address ),
dbesc ( $locality ),
dbesc ( $region ),
dbesc ( $postal_code ),
dbesc ( $country_name ),
dbesc ( $marital ),
2010-12-04 01:46:42 -05:00
dbesc ( $with ),
2012-06-02 05:30:26 -04:00
dbesc ( $howlong ),
2010-07-10 19:47:10 -04:00
dbesc ( $sexual ),
2016-09-25 11:28:00 -04:00
dbesc ( $xmpp ),
2010-07-01 19:48:07 -04:00
dbesc ( $homepage ),
2012-06-02 23:58:20 -04:00
dbesc ( $hometown ),
2010-07-10 19:47:10 -04:00
dbesc ( $politic ),
dbesc ( $religion ),
2011-03-14 03:28:49 -04:00
dbesc ( $pub_keywords ),
dbesc ( $prv_keywords ),
2012-06-25 00:16:55 -04:00
dbesc ( $likes ),
dbesc ( $dislikes ),
2010-07-01 19:48:07 -04:00
dbesc ( $about ),
2010-07-10 19:47:10 -04:00
dbesc ( $interest ),
dbesc ( $contact ),
dbesc ( $music ),
dbesc ( $book ),
dbesc ( $tv ),
dbesc ( $film ),
dbesc ( $romance ),
dbesc ( $work ),
dbesc ( $education ),
2010-08-20 01:04:18 -04:00
intval ( $hide_friends ),
2010-07-01 19:48:07 -04:00
intval ( $a -> argv [ 1 ]),
2012-04-13 00:10:32 -04:00
intval ( local_user ())
2010-07-01 19:48:07 -04:00
);
if ( $r )
2011-05-23 05:39:57 -04:00
info ( t ( 'Profile updated.' ) . EOL );
2010-07-09 06:10:28 -04:00
2010-08-09 00:03:08 -04:00
if ( $namechanged && $is_default ) {
2015-07-14 16:24:43 -04:00
$r = q ( " UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `self` = 1 AND `uid` = %d " ,
dbesc ( $name ),
2010-08-09 00:03:08 -04:00
dbesc ( datetime_convert ()),
2010-11-24 19:35:35 -05:00
intval ( local_user ())
2010-08-09 00:03:08 -04:00
);
2014-03-09 04:19:14 -04:00
$r = q ( " UPDATE `user` set `username` = '%s' where `uid` = %d " ,
2013-04-04 18:10:14 -04:00
dbesc ( $name ),
intval ( local_user ())
);
2010-08-09 00:03:08 -04:00
}
2010-08-20 01:04:18 -04:00
2010-08-19 07:59:31 -04:00
if ( $is_default ) {
2016-01-24 08:30:57 -05:00
$location = formatted_location ( array ( " locality " => $locality , " region " => $region , " country-name " => $country_name ));
2015-01-09 18:34:08 -05:00
2016-05-05 06:02:51 -04:00
q ( " UPDATE `contact` SET `about` = '%s', `location` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `self` AND `uid` = %d " ,
2015-01-09 18:34:08 -05:00
dbesc ( $about ),
2015-02-04 04:43:30 -05:00
dbesc ( $location ),
2015-01-25 07:19:37 -05:00
dbesc ( $pub_keywords ),
2015-01-25 07:22:25 -05:00
dbesc ( $gender ),
2015-01-09 18:34:08 -05:00
intval ( local_user ())
);
2010-08-19 07:59:31 -04:00
// Update global directory in background
$url = $_SESSION [ 'my_url' ];
2016-12-20 05:36:03 -05:00
if ( $url && strlen ( get_config ( 'system' , 'directory' ))) {
2016-08-01 01:48:43 -04:00
proc_run ( PRIORITY_LOW , " include/directory.php " , $url );
2016-12-20 05:36:03 -05:00
}
2011-10-20 08:43:33 -04:00
require_once ( 'include/profile_update.php' );
profile_change ();
2016-05-05 09:08:05 -04:00
// Update the global contact for the user
update_gcontact_for_user ( local_user ());
2010-08-19 07:59:31 -04:00
}
2010-07-01 19:48:07 -04:00
}
}
2016-02-07 09:11:34 -05:00
2012-04-29 04:42:48 -04:00
function profile_activity ( $changed , $value ) {
2012-04-13 00:10:32 -04:00
$a = get_app ();
if ( ! local_user () || ! is_array ( $changed ) || ! count ( $changed ))
return ;
if ( $a -> user [ 'hidewall' ] || get_config ( 'system' , 'block_public' ))
return ;
if ( ! get_pconfig ( local_user (), 'system' , 'post_profilechange' ))
return ;
require_once ( 'include/items.php' );
$self = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( local_user ())
);
if ( ! count ( $self ))
return ;
$arr = array ();
2016-03-20 10:01:50 -04:00
$arr [ 'guid' ] = get_guid ( 32 );
2015-10-25 04:15:36 -04:00
$arr [ 'uri' ] = $arr [ 'parent-uri' ] = item_new_uri ( $a -> get_hostname (), local_user ());
2012-04-13 00:10:32 -04:00
$arr [ 'uid' ] = local_user ();
$arr [ 'contact-id' ] = $self [ 0 ][ 'id' ];
$arr [ 'wall' ] = 1 ;
$arr [ 'type' ] = 'wall' ;
$arr [ 'gravity' ] = 0 ;
$arr [ 'origin' ] = 1 ;
$arr [ 'author-name' ] = $arr [ 'owner-name' ] = $self [ 0 ][ 'name' ];
$arr [ 'author-link' ] = $arr [ 'owner-link' ] = $self [ 0 ][ 'url' ];
$arr [ 'author-avatar' ] = $arr [ 'owner-avatar' ] = $self [ 0 ][ 'thumb' ];
$arr [ 'verb' ] = ACTIVITY_UPDATE ;
$arr [ 'object-type' ] = ACTIVITY_OBJ_PROFILE ;
2015-10-25 04:15:36 -04:00
2012-04-13 00:10:32 -04:00
$A = '[url=' . $self [ 0 ][ 'url' ] . ']' . $self [ 0 ][ 'name' ] . '[/url]' ;
$changes = '' ;
$t = count ( $changed );
$z = 0 ;
foreach ( $changed as $ch ) {
if ( strlen ( $changes )) {
if ( $z == ( $t - 1 ))
2012-04-29 04:42:48 -04:00
$changes .= t ( ' and ' );
2012-04-13 00:10:32 -04:00
else
$changes .= ', ' ;
}
$z ++ ;
$changes .= $ch ;
}
2015-10-25 04:15:36 -04:00
$prof = '[url=' . $self [ 0 ][ 'url' ] . '?tab=profile' . ']' . t ( 'public profile' ) . '[/url]' ;
2012-04-13 00:10:32 -04:00
2012-04-29 04:42:48 -04:00
if ( $t == 1 && strlen ( $value )) {
2012-05-03 20:19:53 -04:00
$message = sprintf ( t ( '%1$s changed %2$s to “%3$s”' ), $A , $changes , $value );
2012-05-18 20:55:11 -04:00
$message .= " \n \n " . sprintf ( t ( ' - Visit %1$s\'s %2$s' ), $A , $prof );
2012-04-29 04:42:48 -04:00
}
else
$message = sprintf ( t ( '%1$s has an updated %2$s, changing %3$s.' ), $A , $prof , $changes );
2015-10-25 04:15:36 -04:00
$arr [ 'body' ] = $message ;
2012-04-13 00:10:32 -04:00
$arr [ 'object' ] = '<object><type>' . ACTIVITY_OBJ_PROFILE . '</type><title>' . $self [ 0 ][ 'name' ] . '</title>'
. '<id>' . $self [ 0 ][ 'url' ] . '/' . $self [ 0 ][ 'name' ] . '</id>' ;
2012-04-13 00:38:40 -04:00
$arr [ 'object' ] .= '<link>' . xmlify ( '<link rel="alternate" type="text/html" href="' . $self [ 0 ][ 'url' ] . '?tab=profile' . '" />' . " \n " );
2012-04-13 00:10:32 -04:00
$arr [ 'object' ] .= xmlify ( '<link rel="photo" type="image/jpeg" href="' . $self [ 0 ][ 'thumb' ] . '" />' . " \n " );
$arr [ 'object' ] .= '</link></object>' . " \n " ;
$arr [ 'last-child' ] = 1 ;
$arr [ 'allow_cid' ] = $a -> user [ 'allow_cid' ];
$arr [ 'allow_gid' ] = $a -> user [ 'allow_gid' ];
$arr [ 'deny_cid' ] = $a -> user [ 'deny_cid' ];
$arr [ 'deny_gid' ] = $a -> user [ 'deny_gid' ];
$i = item_store ( $arr );
2016-12-20 05:56:34 -05:00
if ( $i ) {
2016-08-01 01:48:43 -04:00
proc_run ( PRIORITY_HIGH , " include/notifier.php " , " activity " , $i );
2016-12-20 05:56:34 -05:00
}
2012-04-13 00:10:32 -04:00
}
2010-07-01 19:48:07 -04:00
2016-02-07 09:11:34 -05:00
2017-01-09 07:14:55 -05:00
function profiles_content ( App $a ) {
2011-01-18 22:25:28 -05:00
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2013-01-12 07:58:54 -05:00
notice ( t ( 'Permission denied.' ) . EOL );
return ;
}
2010-10-31 19:38:22 -04:00
$o = '' ;
2010-07-09 19:28:50 -04:00
2010-10-31 19:40:09 -04:00
if (( $a -> argc > 1 ) && ( intval ( $a -> argv [ 1 ]))) {
2010-07-01 19:48:07 -04:00
$r = q ( " SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $a -> argv [ 1 ]),
2010-11-24 19:35:35 -05:00
intval ( local_user ())
2010-07-01 19:48:07 -04:00
);
2016-12-20 04:10:33 -05:00
if ( ! dbm :: is_result ( $r )) {
2010-08-19 07:59:31 -04:00
notice ( t ( 'Profile not found.' ) . EOL );
2010-07-01 19:48:07 -04:00
return ;
}
2010-11-16 00:06:44 -05:00
require_once ( 'include/profile_selectors.php' );
2010-07-01 19:48:07 -04:00
2012-04-10 21:08:06 -04:00
$a -> page [ 'htmlhead' ] .= replace_macros ( get_markup_template ( 'profed_head.tpl' ), array (
2016-12-19 08:26:13 -05:00
'$baseurl' => App :: get_baseurl ( true ),
2012-04-10 21:08:06 -04:00
));
2012-07-28 11:57:16 -04:00
$a -> page [ 'end' ] .= replace_macros ( get_markup_template ( 'profed_end.tpl' ), array (
2016-12-19 08:26:13 -05:00
'$baseurl' => App :: get_baseurl ( true ),
2012-07-28 11:57:16 -04:00
));
2012-04-10 21:08:06 -04:00
2011-05-11 07:37:13 -04:00
$opt_tpl = get_markup_template ( " profile-hide-friends.tpl " );
2010-07-11 05:52:47 -04:00
$hide_friends = replace_macros ( $opt_tpl , array (
2014-06-27 12:12:15 -04:00
'$yesno' => array (
'hide-friends' , //Name
t ( 'Hide contacts and friends:' ), //Label
!! $r [ 0 ][ 'hide-friends' ], //Value
'' , //Help string
array ( t ( 'No' ), t ( 'Yes' )) //Off - On strings
),
2011-05-24 19:30:52 -04:00
'$desc' => t ( 'Hide your contact/friend list from viewers of this profile?' ),
2011-04-07 21:00:35 -04:00
'$yes_str' => t ( 'Yes' ),
'$no_str' => t ( 'No' ),
2010-07-11 05:52:47 -04:00
'$yes_selected' => (( $r [ 0 ][ 'hide-friends' ]) ? " checked= \" checked \" " : " " ),
'$no_selected' => (( $r [ 0 ][ 'hide-friends' ] == 0 ) ? " checked= \" checked \" " : " " )
));
2015-10-25 04:15:36 -04:00
$personal_account = ! ( in_array ( $a -> user [ " page-flags " ],
array ( PAGE_COMMUNITY , PAGE_PRVGROUP )));
2012-04-10 21:08:06 -04:00
2015-10-25 04:15:36 -04:00
$detailled_profile = ( get_pconfig ( local_user (), 'system' , 'detailled_profile' ) AND $personal_account );
2012-04-10 21:08:06 -04:00
2011-07-25 23:59:25 -04:00
$f = get_config ( 'system' , 'birthday_input_format' );
if ( ! $f )
$f = 'ymd' ;
2010-07-10 10:09:57 -04:00
2010-07-01 19:48:07 -04:00
$is_default = (( $r [ 0 ][ 'is-default' ]) ? 1 : 0 );
2011-05-11 07:37:13 -04:00
$tpl = get_markup_template ( " profile_edit.tpl " );
2010-07-01 19:48:07 -04:00
$o .= replace_macros ( $tpl , array (
2015-10-25 04:15:36 -04:00
'$personal_account' => $personal_account ,
'$detailled_profile' => $detailled_profile ,
'$details' => array (
2016-06-10 05:24:38 -04:00
'detailled_profile' , //Name
t ( 'Show more profile fields:' ), //Label
$detailled_profile , //Value
'' , //Help string
array ( t ( 'No' ), t ( 'Yes' )) //Off - On strings
),
'$multi_profiles' => feature_enabled ( local_user (), 'multi_profiles' ),
'$form_security_token' => get_form_security_token ( " profile_edit " ),
'$form_security_token_photo' => get_form_security_token ( " profile_photo " ),
'$profile_clone_link' => (( feature_enabled ( local_user (), 'multi_profiles' )) ? 'profiles/clone/' . $r [ 0 ][ 'id' ] . '?t=' . get_form_security_token ( " profile_clone " ) : " " ),
'$profile_drop_link' => 'profiles/drop/' . $r [ 0 ][ 'id' ] . '?t=' . get_form_security_token ( " profile_drop " ),
'$profile_action' => t ( 'Profile Actions' ),
'$banner' => t ( 'Edit Profile Details' ),
'$submit' => t ( 'Submit' ),
'$profpic' => t ( 'Change Profile Photo' ),
'$viewprof' => t ( 'View this profile' ),
'$editvis' => t ( 'Edit visibility' ),
'$cr_prof' => t ( 'Create a new profile using these settings' ),
'$cl_prof' => t ( 'Clone this profile' ),
'$del_prof' => t ( 'Delete this profile' ),
2014-07-03 12:39:22 -04:00
'$lbl_basic_section' => t ( 'Basic information' ),
'$lbl_picture_section' => t ( 'Profile picture' ),
'$lbl_location_section' => t ( 'Location' ),
'$lbl_preferences_section' => t ( 'Preferences' ),
'$lbl_status_section' => t ( 'Status information' ),
'$lbl_about_section' => t ( 'Additional information' ),
'$lbl_interests_section' => t ( 'Interests' ),
2016-06-10 05:24:38 -04:00
'$lbl_personal_section' => t ( 'Personal' ),
'$lbl_relation_section' => t ( 'Relation' ),
'$lbl_miscellaneous_section' => t ( 'Miscellaneous' ),
2014-06-27 19:31:11 -04:00
'$lbl_profile_photo' => t ( 'Upload Profile Photo' ),
2011-04-08 02:10:43 -04:00
'$lbl_gender' => t ( 'Your Gender:' ),
'$lbl_marital' => t ( '<span class="heart">♥</span> Marital Status:' ),
'$lbl_sexual' => t ( 'Sexual Preference:' ),
'$lbl_ex2' => t ( 'Example: fishing photography software' ),
2016-06-10 05:24:38 -04:00
2010-07-19 22:09:58 -04:00
'$disabled' => (( $is_default ) ? 'onclick="return false;" style="color: #BBBBFF;"' : '' ),
2016-12-19 08:26:13 -05:00
'$baseurl' => App :: get_baseurl ( true ),
2010-07-01 19:48:07 -04:00
'$profile_id' => $r [ 0 ][ 'id' ],
2016-06-10 05:24:38 -04:00
'$profile_name' => array ( 'profile_name' , t ( 'Profile Name:' ), $r [ 0 ][ 'profile-name' ], t ( 'Required' ), '*' ),
'$is_default' => $is_default ,
2010-08-19 07:59:31 -04:00
'$default' => (( $is_default ) ? '<p id="profile-edit-default-desc">' . t ( 'This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet.' ) . '</p>' : " " ),
2016-06-10 05:24:38 -04:00
'$name' => array ( 'name' , t ( 'Your Full Name:' ), $r [ 0 ][ 'name' ]),
'$pdesc' => array ( 'pdesc' , t ( 'Title/Description:' ), $r [ 0 ][ 'pdesc' ]),
2010-07-10 10:09:57 -04:00
'$dob' => dob ( $r [ 0 ][ 'dob' ]),
2010-07-11 05:52:47 -04:00
'$hide_friends' => $hide_friends ,
2016-06-10 05:24:38 -04:00
'$address' => array ( 'address' , t ( 'Street Address:' ), $r [ 0 ][ 'address' ]),
'$locality' => array ( 'locality' , t ( 'Locality/City:' ), $r [ 0 ][ 'locality' ]),
'$region' => array ( 'region' , t ( 'Region/State:' ), $r [ 0 ][ 'region' ]),
'$postal_code' => array ( 'postal_code' , t ( 'Postal/Zip Code:' ), $r [ 0 ][ 'postal-code' ]),
'$country_name' => array ( 'country_name' , t ( 'Country:' ), $r [ 0 ][ 'country-name' ]),
2010-08-19 07:59:31 -04:00
'$age' => (( intval ( $r [ 0 ][ 'dob' ])) ? '(' . t ( 'Age: ' ) . age ( $r [ 0 ][ 'dob' ], $a -> user [ 'timezone' ], $a -> user [ 'timezone' ]) . ')' : '' ),
2010-07-01 19:48:07 -04:00
'$gender' => gender_selector ( $r [ 0 ][ 'gender' ]),
'$marital' => marital_selector ( $r [ 0 ][ 'marital' ]),
2016-06-10 05:24:38 -04:00
'$with' => array ( 'with' , t ( " Who: \x28 if applicable \x29 " ), strip_tags ( $r [ 0 ][ 'with' ]), t ( 'Examples: cathy123, Cathy Williams, cathy@example.com' )),
'$howlong' => array ( 'howlong' , t ( 'Since [date]:' ), ( $r [ 0 ][ 'howlong' ] === '0000-00-00 00:00:00' ? '' : datetime_convert ( 'UTC' , date_default_timezone_get (), $r [ 0 ][ 'howlong' ]))),
2010-07-10 10:09:57 -04:00
'$sexual' => sexpref_selector ( $r [ 0 ][ 'sexual' ]),
2016-06-10 05:24:38 -04:00
'$about' => array ( 'about' , t ( 'Tell us about yourself...' ), $r [ 0 ][ 'about' ]),
2016-09-25 11:28:00 -04:00
'$xmpp' => array ( 'xmpp' , t ( 'XMPP (Jabber) address:' ), $r [ 0 ][ 'xmpp' ], t ( " The XMPP address will be propagated to your contacts so that they can follow you. " )),
2016-06-10 05:24:38 -04:00
'$homepage' => array ( 'homepage' , t ( 'Homepage URL:' ), $r [ 0 ][ 'homepage' ]),
'$hometown' => array ( 'hometown' , t ( 'Hometown:' ), $r [ 0 ][ 'hometown' ]),
'$politic' => array ( 'politic' , t ( 'Political Views:' ), $r [ 0 ][ 'politic' ]),
'$religion' => array ( 'religion' , t ( 'Religious Views:' ), $r [ 0 ][ 'religion' ]),
'$pub_keywords' => array ( 'pub_keywords' , t ( 'Public Keywords:' ), $r [ 0 ][ 'pub_keywords' ], t ( " \x28 Used for suggesting potential friends, can be seen by others \x29 " )),
'$prv_keywords' => array ( 'prv_keywords' , t ( 'Private Keywords:' ), $r [ 0 ][ 'prv_keywords' ], t ( " \x28 Used for searching profiles, never shown to others \x29 " )),
'$likes' => array ( 'likes' , t ( 'Likes:' ), $r [ 0 ][ 'likes' ]),
'$dislikes' => array ( 'dislikes' , t ( 'Dislikes:' ), $r [ 0 ][ 'dislikes' ]),
'$music' => array ( 'music' , t ( 'Musical interests' ), $r [ 0 ][ 'music' ]),
'$book' => array ( 'book' , t ( 'Books, literature' ), $r [ 0 ][ 'book' ]),
'$tv' => array ( 'tv' , t ( 'Television' ), $r [ 0 ][ 'tv' ]),
'$film' => array ( 'film' , t ( 'Film/dance/culture/entertainment' ), $r [ 0 ][ 'film' ]),
'$interest' => array ( 'interest' , t ( 'Hobbies/Interests' ), $r [ 0 ][ 'interest' ]),
'$romance' => array ( 'romance' , t ( 'Love/romance' ), $r [ 0 ][ 'romance' ]),
'$work' => array ( 'work' , t ( 'Work/employment' ), $r [ 0 ][ 'work' ]),
'$education' => array ( 'education' , t ( 'School/education' ), $r [ 0 ][ 'education' ]),
'$contact' => array ( 'contact' , t ( 'Contact information and Social Networks' ), $r [ 0 ][ 'contact' ]),
2010-07-01 19:48:07 -04:00
));
2011-01-20 18:30:45 -05:00
$arr = array ( 'profile' => $r [ 0 ], 'entry' => $o );
call_hooks ( 'profile_edit' , $arr );
2010-07-01 19:48:07 -04:00
return $o ;
}
2015-10-25 04:15:36 -04:00
2014-06-27 19:30:10 -04:00
//Profiles list.
2010-07-01 19:48:07 -04:00
else {
2015-10-25 04:15:36 -04:00
2014-06-27 19:30:10 -04:00
//If we don't support multi profiles, don't display this list.
if ( ! feature_enabled ( local_user (), 'multi_profiles' )){
$r = q (
" SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`=1 " ,
local_user ()
);
2016-12-14 03:41:33 -05:00
if ( dbm :: is_result ( $r )){
2014-06-27 19:30:10 -04:00
//Go to the default profile.
2016-02-17 02:08:28 -05:00
goaway ( 'profiles/' . $r [ 0 ][ 'id' ]);
2014-06-27 19:30:10 -04:00
}
}
2015-10-25 04:15:36 -04:00
2012-06-18 15:18:43 -04:00
$r = q ( " SELECT * FROM `profile` WHERE `uid` = %d " ,
2010-11-24 19:35:35 -05:00
local_user ());
2016-12-14 03:41:33 -05:00
if ( dbm :: is_result ( $r )) {
2015-10-25 04:15:36 -04:00
2011-05-11 07:37:13 -04:00
$tpl = get_markup_template ( 'profile_entry.tpl' );
2016-12-20 15:15:53 -05:00
$profiles = '' ;
foreach ( $r as $rr ) {
2016-06-10 05:24:38 -04:00
$profiles .= replace_macros ( $tpl , array (
2016-12-20 15:15:53 -05:00
'$photo' => $a -> remove_baseurl ( $rr [ 'thumb' ]),
'$id' => $rr [ 'id' ],
'$alt' => t ( 'Profile Image' ),
2011-04-13 00:21:33 -04:00
'$profile_name' => $rr [ 'profile-name' ],
2016-12-20 15:15:53 -05:00
'$visible' => (( $rr [ 'is-default' ]) ? '<strong>' . t ( 'visible to everybody' ) . '</strong>'
2016-02-17 02:08:28 -05:00
: '<a href="' . 'profperm/' . $rr [ 'id' ] . '" />' . t ( 'Edit visibility' ) . '</a>' )
2010-07-01 19:48:07 -04:00
));
}
2016-06-10 05:24:38 -04:00
$tpl_header = get_markup_template ( 'profile_listing_header.tpl' );
$o .= replace_macros ( $tpl_header , array (
2016-12-20 15:15:53 -05:00
'$header' => t ( 'Edit/Manage Profiles' ),
'$chg_photo' => t ( 'Change profile photo' ),
'$cr_new' => t ( 'Create New Profile' ),
2016-06-10 05:24:38 -04:00
'$cr_new_link' => 'profiles/new?t=' . get_form_security_token ( " profile_new " ),
2016-12-20 15:15:53 -05:00
'$profiles' => $profiles
2016-06-10 05:24:38 -04:00
));
2010-07-01 19:48:07 -04:00
}
return $o ;
}
2016-02-07 09:11:34 -05:00
2011-05-23 05:39:57 -04:00
}