From 5c0e135fe98fc91cee32e065c81e7a440c25ee2c Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 14 Sep 2011 19:33:42 -0700 Subject: [PATCH 01/69] diaspora protocol changes --- include/diaspora.php | 170 +++++++++++++++++++++++++------------------ mod/receive.php | 34 ++++++--- 2 files changed, 123 insertions(+), 81 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 6d070ecba4..2145ca56cc 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -5,34 +5,52 @@ require_once('include/items.php'); require_once('include/bb2diaspora.php'); require_once('include/contact_selectors.php'); + +function diaspora_dispatch_public($msg) { + + $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `uid` FROM `contact` WHERE `network` = '%s' AND `addr` = '%s' ) ", + dbesc(NETWORK_DIASPORA), + dbesc($msg['author']) + ); + if(count($r)) { + foreach($r as $rr) { + diaspora_dispatch($rr,$msg); + } + } +} + + + function diaspora_dispatch($importer,$msg) { + $ret = 0; + $parsed_xml = parse_xml_string($msg['message'],false); $xmlbase = $parsed_xml->post; if($xmlbase->request) { - diaspora_request($importer,$xmlbase->request); + $ret = diaspora_request($importer,$xmlbase->request); } elseif($xmlbase->status_message) { - diaspora_post($importer,$xmlbase->status_message); + $ret = diaspora_post($importer,$xmlbase->status_message); } elseif($xmlbase->comment) { - diaspora_comment($importer,$xmlbase->comment,$msg); + $ret = diaspora_comment($importer,$xmlbase->comment,$msg); } elseif($xmlbase->like) { - diaspora_like($importer,$xmlbase->like,$msg); + $ret = diaspora_like($importer,$xmlbase->like,$msg); } elseif($xmlbase->retraction) { - diaspora_retraction($importer,$xmlbase->retraction,$msg); + $ret = diaspora_retraction($importer,$xmlbase->retraction,$msg); } elseif($xmlbase->photo) { - diaspora_photo($importer,$xmlbase->photo,$msg); + $ret = diaspora_photo($importer,$xmlbase->photo,$msg); } else { logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true)); } - return; + return $ret; } function diaspora_get_contact_by_handle($uid,$handle) { @@ -106,16 +124,14 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { $b64url_data = base64url_encode($b64_data); - $b64url_stripped = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); - $lines = str_split($b64url_stripped,60); - $data = implode("\n",$lines); - $data = $data . (($data[-1] != "\n") ? "\n" : '') ; + $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); + $type = 'application/atom+xml'; $encoding = 'base64url'; $alg = 'RSA-SHA256'; - $signable_data = $data . '.' . base64url_encode($type) . "\n" . '.' - . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n"; + $signable_data = $data . '.' . base64url_encode($type) . '.' + . base64url_encode($encoding) . '.' . base64url_encode($alg) ; $signature = rsa_sign($signable_data,$prvkey); $sig = base64url_encode($signature); @@ -157,7 +173,7 @@ $magic_env = <<< EOT base64url RSA-SHA256 - $data + $data $sig @@ -185,50 +201,67 @@ EOT; function diaspora_decode($importer,$xml) { + $public = false; $basedom = parse_xml_string($xml); - $atom = $basedom->children(NAMESPACE_ATOM1); + $children = $basedom->children(NAMESPACE_DIASPORA_PROTOCOL); - // Diaspora devs: This is kind of sucky - 'encrypted_header' does not belong in the atom namespace + if($children->header) { + $public = true; + $author_link = str_replace('acct:','',$children->author_id); + } + else { - $encrypted_header = json_decode(base64_decode($atom->encrypted_header)); + $encrypted_header = json_decode(base64_decode($children->encrypted_header)); - $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key); - $ciphertext = base64_decode($encrypted_header->ciphertext); + $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key); + $ciphertext = base64_decode($encrypted_header->ciphertext); - $outer_key_bundle = ''; - openssl_private_decrypt($encrypted_aes_key_bundle,$outer_key_bundle,$importer['prvkey']); + $outer_key_bundle = ''; + openssl_private_decrypt($encrypted_aes_key_bundle,$outer_key_bundle,$importer['prvkey']); - $j_outer_key_bundle = json_decode($outer_key_bundle); + $j_outer_key_bundle = json_decode($outer_key_bundle); - $outer_iv = base64_decode($j_outer_key_bundle->iv); - $outer_key = base64_decode($j_outer_key_bundle->key); + $outer_iv = base64_decode($j_outer_key_bundle->iv); + $outer_key = base64_decode($j_outer_key_bundle->key); - $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv); + $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv); - $decrypted = pkcs5_unpad($decrypted); + $decrypted = pkcs5_unpad($decrypted); - /** - * $decrypted now contains something like - * - * - * 8e+G2+ET8l5BPuW0sVTnQw== - * UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU= - * - * Ryan Hughes - * acct:galaxor@diaspora.pirateship.org - * - * - */ + /** + * $decrypted now contains something like + * + * + * 8e+G2+ET8l5BPuW0sVTnQw== + * UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU= - logger('decrypted: ' . $decrypted, LOGGER_DEBUG); - $idom = parse_xml_string($decrypted,false); +***** OBSOLETE - $inner_iv = base64_decode($idom->iv); - $inner_aes_key = base64_decode($idom->aes_key); + * + * Ryan Hughes + * acct:galaxor@diaspora.pirateship.org + * - $author_link = str_replace('acct:','',$idom->author->uri); +***** CURRENT + + * acct:galaxor@diaspora.priateship.org + +***** END DIFFS + + * + */ + + logger('decrypted: ' . $decrypted, LOGGER_DEBUG); + $idom = parse_xml_string($decrypted,false); + + $inner_iv = base64_decode($idom->iv); + $inner_aes_key = base64_decode($idom->aes_key); + + $author_link = str_replace('acct:','',$idom->author_id); + + } $dom = $basedom->children(NAMESPACE_SALMON_ME); @@ -262,8 +295,8 @@ function diaspora_decode($importer,$xml) { // and transport whitespace mangling, and base64 wrapping rules. Guess what? PHP and Ruby // use different linelengths for base64 output. - $lines = str_split($data,60); - $data = implode("\n",$lines); +// $lines = str_split($data,60); + // $data = implode("\n",$lines); // stash away some other stuff for later @@ -273,22 +306,25 @@ function diaspora_decode($importer,$xml) { $encoding = $base->encoding; $alg = $base->alg; - // I can't even begin to tell you how sucky this is. Please read the spec. - $signed_data = $data . (($data[-1] != "\n") ? "\n" : '') . '.' . base64url_encode($type) . "\n" . '.' . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n"; + $signed_data = $data . '.' . base64url_encode($type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($alg); // decode the data $data = base64url_decode($data); - // Now pull out the inner encrypted blob - $inner_encrypted = base64_decode($data); + if($public) { + $inner_decrypted = $data; + } + else { - $inner_decrypted = - $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv); + // Decode the encrypted blob - $inner_decrypted = pkcs5_unpad($inner_decrypted); + $inner_encrypted = base64_decode($data); + $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv); + $inner_decrypted = pkcs5_unpad($inner_decrypted); + } if(! $author_link) { logger('mod-diaspora: Could not retrieve author URI.'); @@ -321,7 +357,6 @@ function diaspora_decode($importer,$xml) { } - function diaspora_request($importer,$xml) { $sender_handle = unxmlify($xml->sender_handle); @@ -332,7 +367,6 @@ function diaspora_request($importer,$xml) { $contact = diaspora_get_contact_by_handle($importer['uid'],$sender_handle); - if($contact) { // perhaps we were already sharing with this person. Now they're sharing with us. @@ -408,8 +442,7 @@ function diaspora_post($importer,$xml) { if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { logger('diaspora_post: Ignoring this author.'); - http_status_exit(202); - // NOTREACHED + return 202; } $message_id = $diaspora_handle . ':' . $guid; @@ -493,8 +526,7 @@ function diaspora_comment($importer,$xml,$msg) { if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { logger('diaspora_comment: Ignoring this author.'); - http_status_exit(202); - // NOTREACHED + return 202; } $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", @@ -535,7 +567,7 @@ function diaspora_comment($importer,$xml,$msg) { } } - if(! rsa_verify($author_signed_data,$author_signature,$key,'sha')) { + if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) { logger('diaspora_comment: verification failed.'); return; } @@ -548,7 +580,7 @@ function diaspora_comment($importer,$xml,$msg) { $key = $msg['key']; - if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha')) { + if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) { logger('diaspora_comment: owner verification failed.'); return; } @@ -633,8 +665,7 @@ function diaspora_photo($importer,$xml,$msg) { if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { logger('diaspora_photo: Ignoring this author.'); - http_status_exit(202); - // NOTREACHED + return 202; } $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", @@ -686,8 +717,7 @@ function diaspora_like($importer,$xml,$msg) { if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { logger('diaspora_like: Ignoring this author.'); - http_status_exit(202); - // NOTREACHED + return 202; } $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", @@ -743,7 +773,7 @@ function diaspora_like($importer,$xml,$msg) { } } - if(! rsa_verify($author_signed_data,$author_signature,$key,'sha')) { + if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) { logger('diaspora_like: verification failed.'); return; } @@ -756,7 +786,7 @@ function diaspora_like($importer,$xml,$msg) { $key = $msg['key']; - if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha')) { + if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) { logger('diaspora_like: owner verification failed.'); return; } @@ -877,7 +907,7 @@ function diaspora_retraction($importer,$xml) { } } - http_exit_status(202); + return 202; // NOTREACHED } @@ -1044,7 +1074,7 @@ function diaspora_send_followup($item,$owner,$contact) { else $signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr; - $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha')); + $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')); $msg = replace_macros($tpl,array( '$guid' => xmlify($item['guid']), @@ -1131,7 +1161,7 @@ function diaspora_send_relay($item,$owner,$contact) { else $signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr; - $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha')); + $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')); q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", intval($item['id']), @@ -1145,7 +1175,7 @@ function diaspora_send_relay($item,$owner,$contact) { // sign it - $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha')); + $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')); $msg = replace_macros($tpl,array( '$guid' => xmlify($item['guid']), diff --git a/mod/receive.php b/mod/receive.php index 34128518b5..72e2903483 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -12,18 +12,26 @@ require_once('include/diaspora.php'); function receive_post(&$a) { - if($a->argc != 3 || $a->argv[1] !== 'users') - http_status_exit(500); + $public = false; - $guid = $a->argv[2]; + if(($a->argc == 2) && ($a->argv[1] === 'public')) { + $public = true; + } + else { - $r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1", - dbesc($guid) - ); - if(! count($r)) - http_status_exit(500); + if($a->argc != 3 || $a->argv[1] !== 'users') + http_status_exit(500); - $importer = $r[0]; + $guid = $a->argv[2]; + + $r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1", + dbesc($guid) + ); + if(! count($r)) + http_status_exit(500); + + $importer = $r[0]; + } // It is an application/x-www-form-urlencoded @@ -41,9 +49,13 @@ function receive_post(&$a) { if(! is_array($msg)) http_status_exit(500); - diaspora_dispatch($importer,$msg); + $ret = 0; + if($public) + diaspora_dispatch_public($msg); + else + $ret = diaspora_dispatch($importer,$msg); - http_status_exit(200); + http_status_exit(($ret) ? $ret : 200); // NOTREACHED } From 80f94bb12bd6d445554579def2bec0de333e4fb2 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 15 Sep 2011 17:47:16 -0700 Subject: [PATCH 02/69] federation friday update --- boot.php | 2 +- include/diaspora.php | 23 +++++------------------ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/boot.php b/boot.php index a9cfb7cac0..6ee649230a 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1103' ); +define ( 'FRIENDIKA_VERSION', '2.2.1104' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1087 ); diff --git a/include/diaspora.php b/include/diaspora.php index 2145ca56cc..4b1cc333bd 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -115,7 +115,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { $outer_iv = random_string(16); $b_outer_iv = base64_encode($outer_iv); - $handle = 'acct:' . $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); $padded_data = pkcs5_pad($msg,16); $inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv); @@ -126,7 +126,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { $b64url_data = base64url_encode($b64_data); $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); - $type = 'application/atom+xml'; + $type = 'application/xml'; $encoding = 'base64url'; $alg = 'RSA-SHA256'; @@ -140,10 +140,7 @@ $decrypted_header = <<< EOT $b_inner_iv $b_inner_aes_key - - {$user['username']} - $handle - + $handle EOT; @@ -204,7 +201,7 @@ function diaspora_decode($importer,$xml) { $public = false; $basedom = parse_xml_string($xml); - $children = $basedom->children(NAMESPACE_DIASPORA_PROTOCOL); + $children = $basedom->children('https://joindiaspora.com/protocol'); if($children->header) { $public = true; @@ -288,16 +285,6 @@ function diaspora_decode($importer,$xml) { // strip whitespace so our data element will return to one big base64 blob $data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$base->data); - // Add back the 60 char linefeeds - - // This completely violates the entire principle of salmon magic signatures, - // which was to have a message signing format that was completely ambivalent to linefeeds - // and transport whitespace mangling, and base64 wrapping rules. Guess what? PHP and Ruby - // use different linelengths for base64 output. - -// $lines = str_split($data,60); - // $data = implode("\n",$lines); - // stash away some other stuff for later @@ -347,7 +334,7 @@ function diaspora_decode($importer,$xml) { if(! $verify) { logger('mod-diaspora: Message did not verify. Discarding.'); - http_status_exit(400); +// http_status_exit(400); } logger('mod-diaspora: Message verified.'); From 9c3503a706d445bcbf7a14c2adcd8d344df3e46b Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 16 Sep 2011 06:49:24 -0700 Subject: [PATCH 03/69] update timestamp on activity change (comment/like) --- include/items.php | 7 +++++++ mod/item.php | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/include/items.php b/include/items.php index facd8b2d4d..735adc7170 100644 --- a/include/items.php +++ b/include/items.php @@ -865,6 +865,13 @@ function item_store($arr,$force_parent = false) { intval($current_post) ); + // update the timestamp on the parent + + q("UPDATE `item` set `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), + intval($parent_id) + ); + if($dsprsig) { q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", intval($current_post), diff --git a/mod/item.php b/mod/item.php index 025a12a323..38f4c20401 100644 --- a/mod/item.php +++ b/mod/item.php @@ -803,6 +803,12 @@ function item_post(&$a) { // NOTREACHED } + // update the timestamp on the parent + + q("UPDATE `item` set `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), + intval($parent) + ); $datarray['id'] = $post_id; $datarray['plink'] = $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id; From 5a6a3cab8ee6b5c979b7c51112bb2c86915ac207 Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 16 Sep 2011 14:46:04 -0700 Subject: [PATCH 04/69] may fix diaspora send --- boot.php | 2 +- include/diaspora.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/boot.php b/boot.php index 6ee649230a..07bde38281 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1104' ); +define ( 'FRIENDIKA_VERSION', '2.2.1105' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1087 ); diff --git a/include/diaspora.php b/include/diaspora.php index 4b1cc333bd..5e4301e78c 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -165,15 +165,15 @@ EOT; $magic_env = <<< EOT - + $encrypted_header - + base64url RSA-SHA256 $data $sig - + EOT; logger('diaspora_msg_build: magic_env: ' . $magic_env, LOGGER_DATA); From d7243be2eaab96f56ae639b1afe823a1646811f4 Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 16 Sep 2011 14:51:25 -0700 Subject: [PATCH 05/69] log the D* publc messages --- include/diaspora.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index 5e4301e78c..0436673ea5 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -8,15 +8,18 @@ require_once('include/contact_selectors.php'); function diaspora_dispatch_public($msg) { - $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `uid` FROM `contact` WHERE `network` = '%s' AND `addr` = '%s' ) ", + $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) ", dbesc(NETWORK_DIASPORA), dbesc($msg['author']) ); if(count($r)) { foreach($r as $rr) { + logger('diaspora_public: delivering to: ' . $rr['username']); diaspora_dispatch($rr,$msg); } } + else + logger('diaspora_public: no subscribers'); } From 6c4ad7df3aebec13406de129bec9e14db7bb2eea Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 16 Sep 2011 14:57:41 -0700 Subject: [PATCH 06/69] public D* post fix --- include/diaspora.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index 0436673ea5..313324a16a 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -208,7 +208,7 @@ function diaspora_decode($importer,$xml) { if($children->header) { $public = true; - $author_link = str_replace('acct:','',$children->author_id); + $author_link = str_replace('acct:','',$children->header->author_id); } else { From ce77c7287e8f6bf721c823290ff939b9ab5764e9 Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 16 Sep 2011 15:40:34 -0700 Subject: [PATCH 07/69] show real profile link location on hover --- include/conversation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 6aad2485a7..4398d6a5c1 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -211,7 +211,7 @@ function conversation(&$a, $items, $mode, $update) { $o .= replace_macros($tpl,array( '$id' => $item['item_id'], - '$linktitle' => sprintf( t('View %s\'s profile'), $profile_name), + '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), '$profile_url' => $profile_link, '$item_photo_menu' => item_photo_menu($item), '$name' => $profile_name, @@ -486,8 +486,8 @@ function conversation(&$a, $items, $mode, $update) { $tmp_item = replace_macros($template,array( '$id' => $item['item_id'], - '$linktitle' => sprintf( t('View %s\'s profile'), $profile_name), - '$olinktitle' => sprintf( t('View %s\'s profile'), $owner_name), + '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), + '$olinktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), '$to' => t('to'), '$wall' => t('Wall-to-Wall'), '$vwall' => t('via Wall-To-Wall:'), From 5f4ab62fe330a714777fecae88465e83331abed1 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 18 Sep 2011 00:16:18 -0700 Subject: [PATCH 08/69] fix bbcode image size --- boot.php | 2 +- include/bbcode.php | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/boot.php b/boot.php index 07bde38281..e073aee688 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1105' ); +define ( 'FRIENDIKA_VERSION', '2.2.1106' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1087 ); diff --git a/include/bbcode.php b/include/bbcode.php index 3886af37dc..3d6b907a68 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -113,6 +113,9 @@ function bbcode($Text,$preserve_nl = false) { // Check for [quote] text $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text); + // [img=widthxheight]image source[/img] + $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '', $Text); + // Images // [img]pathtoimage[/img] $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '' . t('Image/photo') . '', $Text); @@ -125,8 +128,6 @@ function bbcode($Text,$preserve_nl = false) { $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '', $Text); - // [img=widthxheight]image source[/img] - $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '', $Text); if (get_pconfig(local_user(), 'oembed', 'use_for_youtube' )==1){ // use oembed for youtube links From 309df8417206ed934961a1e2f26b2ca4e57418b3 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 18 Sep 2011 00:19:19 -0700 Subject: [PATCH 09/69] again fix bbcode image sizes --- include/bbcode.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/bbcode.php b/include/bbcode.php index 3d6b907a68..cbe19de54a 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -114,7 +114,7 @@ function bbcode($Text,$preserve_nl = false) { $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text); // [img=widthxheight]image source[/img] - $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '', $Text); + $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '', $Text); // Images // [img]pathtoimage[/img] From da05ef2ae48beb0f3475cc705fde9a69e5947426 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 18 Sep 2011 04:34:17 -0700 Subject: [PATCH 10/69] rfc2047 encode notification email headers --- include/EmailNotification.php | 7 +++++++ include/email.php | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/EmailNotification.php b/include/EmailNotification.php index 78912c0b96..8861e8f5d8 100644 --- a/include/EmailNotification.php +++ b/include/EmailNotification.php @@ -1,4 +1,7 @@ Date: Sun, 18 Sep 2011 06:20:18 -0700 Subject: [PATCH 11/69] bug #157 - allow deleted group to be revived, but warn of side effects --- include/group.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/include/group.php b/include/group.php index d92e24e205..4f3d5ee919 100644 --- a/include/group.php +++ b/include/group.php @@ -6,8 +6,26 @@ function group_add($uid,$name) { $ret = false; if(x($uid) && x($name)) { $r = group_byname($uid,$name); // check for dups - if($r !== false) + if($r !== false) { + + // This could be a problem. + // Let's assume we've just created a group which we once deleted + // all the old members are gone, but the group remains so we don't break any security + // access lists. What we're doing here is reviving the dead group, but old content which + // was restricted to this group may now be seen by the new group members. + + $z = q("SELECT * FROM `group` WHERE `id` = %d LIMIT 1", + intval($r) + ); + if(count($z) && $z[0]['deleted']) { + $r = q("UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1", + intval($uid), + dbesc($name) + ); + notice( t('A deleted group with this name was revived. Existing item permissions may apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL); + } return true; + } $r = q("INSERT INTO `group` ( `uid`, `name` ) VALUES( %d, '%s' ) ", intval($uid), From e2e29b2deafffb98d156fb3f726a3968b3492522 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 18 Sep 2011 17:16:02 -0700 Subject: [PATCH 12/69] only header encode if necessary --- boot.php | 2 +- include/email.php | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index e073aee688..6e78b21f63 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1106' ); +define ( 'FRIENDIKA_VERSION', '2.2.1107' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1087 ); diff --git a/include/email.php b/include/email.php index b340845490..3e6a8186d8 100644 --- a/include/email.php +++ b/include/email.php @@ -169,6 +169,17 @@ function email_get_part($mbox,$uid,$p,$partno) { function email_header_encode($in_str, $charset) { $out_str = $in_str; + $need_to_convert = false; + + for($x = 0; $x < strlen($in_str); $x ++) { + if((ord($in_str[$x]) == 0) || ((ord($in_str[$x]) > 128))) { + $need_to_convert = true; + } + } + + if(! $need_to_convert) + return $in_str; + if ($out_str && $charset) { // define start delimimter, end delimiter and spacer From 8bf6a29d4e05af5d461da3f01999785dc12ee7da Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 18 Sep 2011 19:04:11 -0700 Subject: [PATCH 13/69] optimise the commented date view --- boot.php | 4 +- database.sql | 1 + include/items.php | 6 ++- mod/item.php | 11 +++-- mod/network.php | 110 ++++++++++++++-------------------------------- update.php | 19 +++++++- 6 files changed, 65 insertions(+), 86 deletions(-) diff --git a/boot.php b/boot.php index 6e78b21f63..226bc3d019 100644 --- a/boot.php +++ b/boot.php @@ -7,9 +7,9 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1107' ); +define ( 'FRIENDIKA_VERSION', '2.3.1108' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1087 ); +define ( 'DB_UPDATE_VERSION', 1088 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index ff339929ea..444b05faa9 100644 --- a/database.sql +++ b/database.sql @@ -174,6 +174,7 @@ CREATE TABLE IF NOT EXISTS `item` ( `thr-parent` char(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `owner-name` char(255) NOT NULL, diff --git a/include/items.php b/include/items.php index 735adc7170..b433381a74 100644 --- a/include/items.php +++ b/include/items.php @@ -717,6 +717,7 @@ function item_store($arr,$force_parent = false) { $arr['owner-avatar'] = ((x($arr,'owner-avatar')) ? notags(trim($arr['owner-avatar'])) : ''); $arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert()); $arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert()); + $arr['commented'] = datetime_convert(); $arr['received'] = datetime_convert(); $arr['changed'] = datetime_convert(); $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : ''); @@ -865,9 +866,10 @@ function item_store($arr,$force_parent = false) { intval($current_post) ); - // update the timestamp on the parent + // update the commented timestamp on the parent - q("UPDATE `item` set `changed` = '%s' WHERE `id` = %d LIMIT 1", + q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), dbesc(datetime_convert()), intval($parent_id) ); diff --git a/mod/item.php b/mod/item.php index 38f4c20401..cad72122b8 100644 --- a/mod/item.php +++ b/mod/item.php @@ -501,6 +501,7 @@ function item_post(&$a) { $datarray['author-avatar'] = $author['thumb']; $datarray['created'] = datetime_convert(); $datarray['edited'] = datetime_convert(); + $datarray['commented'] = datetime_convert(); $datarray['received'] = datetime_convert(); $datarray['changed'] = datetime_convert(); $datarray['uri'] = $uri; @@ -561,9 +562,9 @@ function item_post(&$a) { $r = q("INSERT INTO `item` (`guid`, `uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, - `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`, + `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `commented`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`, `tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark` ) - VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d )", + VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d )", dbesc($datarray['guid']), intval($datarray['uid']), dbesc($datarray['type']), @@ -578,6 +579,7 @@ function item_post(&$a) { dbesc($datarray['author-avatar']), dbesc($datarray['created']), dbesc($datarray['edited']), + dbesc($datarray['commented']), dbesc($datarray['received']), dbesc($datarray['changed']), dbesc($datarray['uri']), @@ -803,9 +805,10 @@ function item_post(&$a) { // NOTREACHED } - // update the timestamp on the parent + // update the commented timestamp on the parent - q("UPDATE `item` set `changed` = '%s' WHERE `id` = %d LIMIT 1", + q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), dbesc(datetime_convert()), intval($parent) ); diff --git a/mod/network.php b/mod/network.php index 438b3417d7..5faeee453b 100644 --- a/mod/network.php +++ b/mod/network.php @@ -315,44 +315,27 @@ function network_content(&$a, $update = 0) { else { // Normal conversation view - // Show conversation by activity date - if($order === 'post') { - $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid` - FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` - WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `item`.`parent` = `item`.`id` - $sql_extra - ORDER BY `item`.`created` DESC LIMIT %d ,%d ", - intval(local_user()), - intval($a->pager['start']), - intval($a->pager['itemspage']) - ); - } - else { - // $order === 'comment' - // First fetch a known number of parent items + if($order === 'post') + $ordering = "`created`"; + else + $ordering = "`commented`"; + + // Fetch a page full of parent items for this page + + $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid` + FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` + WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 + AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `item`.`parent` = `item`.`id` + $sql_extra + ORDER BY `item`.$ordering DESC LIMIT %d ,%d ", + intval(local_user()), + intval($a->pager['start']), + intval($a->pager['itemspage']) + ); - $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid` - FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` - , (SELECT `_com`.`parent`,max(`_com`.`created`) as `created` - FROM `item` AS `_com` - WHERE `_com`.`uid`=%d AND - (`_com`.`parent`!=`_com`.`id` OR `_com`.`id` NOT IN (SELECT `__com`.`parent` FROM `item` as `__com` WHERE `__com`.`parent`!=`__com`.`id`)) - GROUP BY `_com`.`parent` ORDER BY `created` DESC) AS `com` - WHERE `item`.`id`=`com`.`parent` AND - `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - $sql_extra - ORDER BY `com`.`created` DESC LIMIT %d ,%d ", - intval(local_user()), - intval(local_user()), - intval($a->pager['start']), - intval($a->pager['itemspage']) - ); - } // Then fetch all the children of the parents that are on this page $parents_arr = array(); @@ -363,48 +346,21 @@ function network_content(&$a, $update = 0) { $parents_arr[] = $rr['item_id']; $parents_str = implode(', ', $parents_arr); - if($order === 'post') { - // parent created order - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, - `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`, - `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, - `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` - FROM `item`, (SELECT `p`.`id`,`p`.`created` FROM `item` AS `p` WHERE `p`.`parent`=`p`.`id`) as `parentitem`, `contact` - WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 - AND `contact`.`id` = `item`.`contact-id` - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `item`.`parent` = `parentitem`.`id` AND `item`.`parent` IN ( %s ) - $sql_extra - ORDER BY `parentitem`.`created` DESC, `item`.`gravity` ASC, `item`.`created` ASC ", - intval(local_user()), - dbesc($parents_str) - ); - } - else { - // $order === 'comment' - - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, - `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`, - `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, - `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` - FROM `item`, `contact`, - (SELECT `_com`.`parent`,max(`_com`.`created`) as `created` - FROM `item` AS `_com` - WHERE `_com`.`uid`=%d AND - (`_com`.`parent`!=`_com`.`id` OR `_com`.`id` NOT IN (SELECT `__com`.`parent` FROM `item` as `__com` WHERE `__com`.`parent`!=`__com`.`id`)) - GROUP BY `_com`.`parent` ORDER BY `created` DESC) AS `com` - WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 - AND `contact`.`id` = `item`.`contact-id` - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `item`.`parent` = `com`.`parent` AND `item`.`parent` IN ( %s ) - $sql_extra - ORDER BY `com`.`created` DESC, `item`.`gravity` ASC, `item`.`created` ASC ", - intval(local_user()), - intval(local_user()), - dbesc($parents_str) - ); - } - } + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, + `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`, + `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, + `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` + FROM `item`, (SELECT `p`.`id`,`p`.`created`,`p`.`commented` FROM `item` AS `p` WHERE `p`.`parent`=`p`.`id`) as `parentitem`, `contact` + WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 + AND `contact`.`id` = `item`.`contact-id` + AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `item`.`parent` = `parentitem`.`id` AND `item`.`parent` IN ( %s ) + $sql_extra + ORDER BY `parentitem`.$ordering DESC, `item`.`gravity` ASC, `item`.`created` ASC ", + intval(local_user()), + dbesc($parents_str) + ); + } } // Set this so that the conversation function can find out contact info for our wall-wall items diff --git a/update.php b/update.php index f94e78d727..82ae058729 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Sun, 18 Sep 2011 19:53:45 -0700 Subject: [PATCH 14/69] account expiration structures --- boot.php | 2 +- database.sql | 3 +++ include/api.php | 2 +- include/auth.php | 4 ++-- mod/openid.php | 2 +- update.php | 9 ++++++++- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/boot.php b/boot.php index 226bc3d019..c73ab3d6ea 100644 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once("include/pgettext.php"); define ( 'FRIENDIKA_VERSION', '2.3.1108' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1088 ); +define ( 'DB_UPDATE_VERSION', 1089 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index 444b05faa9..ba52d9f35d 100644 --- a/database.sql +++ b/database.sql @@ -413,6 +413,9 @@ CREATE TABLE IF NOT EXISTS `user` ( `pwdreset` char(255) NOT NULL, `maxreq` int(11) NOT NULL DEFAULT '10', `expire` int(11) unsigned NOT NULL DEFAULT '0', + `account_expired` tinyint( 1 ) NOT NULL DEFAULT '0', + `account_expires_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `expire_notification_sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `allow_cid` mediumtext NOT NULL, `allow_gid` mediumtext NOT NULL, `deny_cid` mediumtext NOT NULL, diff --git a/include/api.php b/include/api.php index 5d008c2909..74b4aaf6e1 100644 --- a/include/api.php +++ b/include/api.php @@ -55,7 +55,7 @@ // process normal login request $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) - AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1", + AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", dbesc(trim($user)), dbesc(trim($user)), dbesc($encrypted) diff --git a/include/auth.php b/include/auth.php index b7b96bdc0b..1f16b35047 100644 --- a/include/auth.php +++ b/include/auth.php @@ -49,7 +49,7 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p } $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` - FROM `user` WHERE `uid` = %d LIMIT 1", + FROM `user` WHERE `uid` = %d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", intval($_SESSION['uid']) ); @@ -186,7 +186,7 @@ else { $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) - AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1", + AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", dbesc(trim($_POST['openid_url'])), dbesc(trim($_POST['openid_url'])), dbesc($encrypted) diff --git a/mod/openid.php b/mod/openid.php index 3c32931471..b8734f0234 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -56,7 +56,7 @@ function openid_content(&$a) { $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` - FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1", + FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", dbesc($_SESSION['openid']) ); if(! count($r)) { diff --git a/update.php b/update.php index 82ae058729..6101efea6d 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Sun, 18 Sep 2011 20:17:44 -0700 Subject: [PATCH 15/69] build diaspora public (batch) message --- boot.php | 1 + include/diaspora.php | 46 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/boot.php b/boot.php index c73ab3d6ea..3e9596ac33 100644 --- a/boot.php +++ b/boot.php @@ -164,6 +164,7 @@ define ( 'ACTIVITY_OBJ_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'photo' ); define ( 'ACTIVITY_OBJ_P_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'profile-photo' ); define ( 'ACTIVITY_OBJ_ALBUM', NAMESPACE_ACTIVITY_SCHEMA . 'photo-album' ); define ( 'ACTIVITY_OBJ_EVENT', NAMESPACE_ACTIVITY_SCHEMA . 'event' ); +define ( 'ACTIVITY_OBJ_TAGTERM', NAMESPACE_DFRN . '/tagterm' ); /** * item weight for query ordering diff --git a/include/diaspora.php b/include/diaspora.php index 313324a16a..a6f3002b9d 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -103,6 +103,52 @@ function get_diaspora_key($uri) { } +function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) { + $a = get_app(); + + logger('diaspora_pubmsg_build: ' . $msg, LOGGER_DATA); + + + $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + + $b64_data = base64_encode($msg); + $b64url_data = base64url_encode($b64_data); + + $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); + + $type = 'application/xml'; + $encoding = 'base64url'; + $alg = 'RSA-SHA256'; + + $signable_data = $data . '.' . base64url_encode($type) . '.' + . base64url_encode($encoding) . '.' . base64url_encode($alg) ; + + $signature = rsa_sign($signable_data,$prvkey); + $sig = base64url_encode($signature); + +$magic_env = <<< EOT + + +
+ $handle +
+ + base64url + RSA-SHA256 + $data + $sig + +
+EOT; + + logger('diaspora_pubmsg_build: magic_env: ' . $magic_env, LOGGER_DATA); + return $magic_env; + +} + + + + function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { $a = get_app(); From 672ecc7f7d2e17b0d35eccc94e6fa1b5eef0d108 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 18 Sep 2011 22:42:47 -0700 Subject: [PATCH 16/69] more tag infrastructure --- boot.php | 2 +- database.sql | 1 + images/icons.png | Bin 11885 -> 12389 bytes update.php | 5 ++++- view/theme/duepuntozero/style.css | 1 + view/theme/greenzero/greenicons.png | Bin 11888 -> 12317 bytes view/theme/loozah/style.css | 1 + 7 files changed, 8 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index 3e9596ac33..d312682ac7 100644 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once("include/pgettext.php"); define ( 'FRIENDIKA_VERSION', '2.3.1108' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1089 ); +define ( 'DB_UPDATE_VERSION', 1090 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index ba52d9f35d..b1580ec2cc 100644 --- a/database.sql +++ b/database.sql @@ -407,6 +407,7 @@ CREATE TABLE IF NOT EXISTS `user` ( `blocked` tinyint(1) unsigned NOT NULL DEFAULT '0', `blockwall` tinyint(1) unsigned NOT NULL DEFAULT '0', `hidewall` tinyint(1) unsigned NOT NULL DEFAULT '0', + `blocktags` tinyint(1) unsigned NOT NULL DEFAULT '0', `notify-flags` int(11) unsigned NOT NULL DEFAULT '65535', `page-flags` int(11) unsigned NOT NULL DEFAULT '0', `prvnets` tinyint(1) NOT NULL DEFAULT '0', diff --git a/images/icons.png b/images/icons.png index 494555aa69a9f3aec25a566b1bb6bedad46e2e05..dd3af3aee3b9c2e1269e9e82c8c9742bb988df15 100644 GIT binary patch literal 12389 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 X1do|Pbpdho00000NkvXXu0mjfc&TV* literal 11885 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 ra!YQ>Ex9GPSNl00000NkvXXu0mjfHo-Hx delta 11873 zcmV-nE}qeyVDMa!SAPHpbV*G`2ipe{7bq4?{i{X*03ZNKL_t(|+U=cpcvMyT_&<00 zq)tdk2tD+!2}QuN3hGi^L15i=v7l%Gu`Hl23SUJ96am>qq(l)LVgq5NDHstn^aPMl zq=XU(2`Q6g=H5H?{Qj6pGLuemclF2nJoC)Vz2`l*oX>sFd4J#c%o!;r6d^0%1foNl zVzr$o)L^2->BMX>qdHXt0)WV{NQ!O6L|dXkpUaNz%SmW6Qlg%cdGv(XmwAkl!v@q# zXU|u&1VE2_{!#B^{2pY>)~zBeB!si)&Jh(AMNv@^$4;FB;JK%t{$1S*U5On^tO8>M zJ_P1&7mtBuPXVLius)(Rv@~#~phGfXnT@Ea+;3aY=Hr z=$?|o-sEJ)q@>i@Kzl&+fbw$lKAJ1^E*CDno(T_3s#AZ#d#{Tp9+`YuAY}AuD^#nM zK8G(>(SP!p=fu8WPIC0{VTx6iPrvw*sQ6}dYS9#c-G2uT(xuOh;^6k5YCLx1*&T$V z&{6)q#gMi%Fj&}}^tl8O{d|Hb+h=TG~=w3 zVF?Z6nqpJkM1+Nb*9VWw>m(+o6?wU?dL3kI+AdL0kWW;U1xc&B>KD;HC57%wy3>73 z3V;|B0Do6y@b&^dD(%<1T$sH%7-`Pjlvl*0<(i0Gd~1vdnn^c3Z2#<@LCLM3&80$$NuXUP=90eTEGP^B^<3bjKxbnca ziD?jqqS^>CX|R^$;r6P&m&d{R{Cv*m<=1(D?YlEXZf-6S5fNy$TC`eCwN|gp!d;H^ z0BP@-y}pJ7mVl@UzUtt7;*rUcqKO9}!W_!nlvhMe@YMuoo!#nkNkosgVm+{*VrwDB zNPi8h;&lSxjeq@16bK!0O zpyex*4-((v>l;4ez|0*Sn7QMU&pZ101kreQ2l1-`=%xgZ3&KOZq^53Q{P?F?`Q;j3 zcy=0TTlWxd3_~k4SVCjbNg;$9qtJSc#D6!ALTKEzR=zv^XL0=aaV!=KVPRqDbUKVi z^RIFtJwTE`+FK2TwZRt%;bRX>k{m8q6$q~sz87CyElMRpd_n=gWN#$r%sKFS$uDx66*RMBryB$fA5Z)4yB-}0+I=zdW zoYORlj}EHr-y44rg~i3J_-GmZ2MlK4{(Z#8#u6DBNoZ&&k|g1BIj`Eu@A+z$s5~a@ z0n#22$-b|mJ5U#Vl|fwa-s_?aLVu&qz?H&x_uWI-k*>p_chYU#MNV#m15+T`e@2OkXF^5k+{p?qTqs*dK zXITT~v(G-O_Cff|U;ZN1wO{AOfLHHAr)`1WByrmx`eU=@a9h7W;&cikB7b8jEiFaT zXwho5=yW{Uiv5b=1JH{dtjz4moy`T__zL&}MYY=q4UeE>w?wd6QJpSA!y|AiG6tg& zjZRPBuAMn>DjU^qoaZco2g6gsVS)-`|re36@*%acz&8MOVa zx87p@{P_Z)w*9&ga|nu};PN<-@KSWqj^1FvZnvY;>2SNU4I5HWP=MF#B{nvel9G~gOIDqnKAy%=RpnfEHv9Lb<5f#Bo6X3wj1U5s%Y{R= zUzSz79Qek7GzJj9@nF3m41})?x_3UBD=r1X%J5yhmZ{9p<=+L2}Oh*Ht)o5{fofH%l;PJ?Kg%cqJ2M->k zw6qi<1lify*njPI-0qqkk9`>jNlQy3FE5wO%uI4~bGdNg0=c=l6ciNTa5%v0x#TXk zrq6Z3SGHXOsV48ZF8BZ*dtj1OlXqO3)CayLOO}ZBTekQb@yO5QoH~Zf=^H1jP8S6^ z=X_nbE;xMUbU28JiV515-uqjr;I%9%5Vk+q{HNgxTI6|7d?{%EeyYCSkqSG8ll#~zp@z4OuB zIsr_1#w=p4PpTJu0Gqe`fFZs$*Z1g-yQGk;!#`78c#+5k4GD>`psF%XxfGY%jb5ii ze{TxGrOK$PLeFkp*zxW9TF>Y7nq#EbVExLZK4ZO_Bs)8skdP2$Sq|DB5)u;hy{7#d zEm~wn#_n*S$|_E0DPG~ExVV^tf&y$d8;YX%9SC1n>Tp!=6+JonK560;V|j1syG(py z4635wa=CE2TzEVlgx6c``0+|pZF{?BV%9TM_9egIo8MGcP4tLF7dVL}M zwcXF4+=$}?u6(?D~(nImThaKz@~^AC$_tuMZ53jme_%^G%R@2x;l z4kafKVz-rIiEc<)>TSuAC8AhWe~BD?2V=&Jsq>+&ZR~fIMY`Pm8&^si>8iumWA9#R$t8HY0z@E);~$tL zU5bfv&CK#x8DNSy)_WeGd;G!mLkLvzP7+9nhWbf8D#YZ9_PA zYZ0wFUB})no6GB{4|HX6xjEi4C!;Kf{6XSd)mql8My^qhFi0RfLlNi+jnGnBT2QBA znCQghm-;dF9YT<9wt(SCu zZ~W_D;K?t zc3_E2V0XrTV&kI;3Dx5)X;iDC+jE>=H%IcvJ7(7FgpOrpi=8{SbH1R2=f;n|Yyf|+ zQ?tHWvqq$D`w4(9ZChWGwfikgjTc#@2$7Zw@$o8&i6*2PqR(Z6fBNdiR_oRY5g)IT zlw_9bt5;N5D1P3&8ST-dgvv4+oeo1x3=y3>6WzT##;B;E@}jl@>3`w|))bZhFUd}4 zhIr_^C+XI#Goe~DtLA@!A;yg3qD-SfE%@c`?f9|wx00iRH3uM`e~w8Vi8q;QgsBXq`s!C6hXHI|wMs;M{WVQ&HqhzN7>#I5CWKy( zB1uTGv4q`tBN4aVCS7d+g%Cj=dRet~@pY*Hw)wo5P|n%0bc-gl|5oWzbk0r4th0Qh z8SO;T?mW;y`)9h7v*9$h<5sjL4X$D*6X!g~Ypq_W*Kr#>f7_zgds{gBv~(%(JvDn$ zP|!TR_qUQJ(Be&+b5f+IrP41ci@r%kBqZdJn4~gt_#skLQ|UK8jVW_Zikd8;fI9Wd z%2n3ixL|>3H)js9r%z*-WqvUlNsEhPYl8;tmn3X17w+6#tZUa&w0gDp6)YJ}r!V|e z2IJK>ZiXR|f8zMt2e6+iCG(}7bXeQB&g=Mh@wcM*=R(dc&P3BMwAS*ovKNY?^n464 zW;7vs&aFPd{SV!b*Xc!L)S(YI@Xr_L@xY-c>pX7QL$N~AX)ren$J{uq;?*qtvaWsZ zFN>?hCue0Z6y*R;e>;m+sfUS=${;7l7jlWW_(CV?e}~K*E{exwHZx;+Ruu>(ke-?2 z%U{-|4={Dk$)K+HyXDJ8qm&eiiiFG*& ztCZ;j3>rC=#KF&0(O);WFFC1weK#sV-&#~8Z125?-Ql3HVMD@Z%-|10hDebXOZiQb z?RKIM9>m~sVRN|<4hKb>HsQ3{swE>eHI>z?SCf&E0l+uke8cM1tJ$?{SM83K+s)dw ze`^^vY7~z?`Y6knFGp3?a!YtQAeMo&=#hB@!i25nnCM;m9u%9-Z{gViPxH#XQ&{lT zVvKPibf0x=t;c$6=6u3hN8rd)iRjdT<(=M^j)^QG+#V!J!sGDLf8yYJowx0SJZam< zsf_&OQSy|$;GLfO--mw}e=7oKW0y&%e__}0c-%vh4&d!oS%8@fiiPFrQCKX8S-Pqp z8R=1&q5u^@0aL~2Iey>*^`$%{q0|WP2=i`f#56;QuJtd4by}4=x|LR~uyzS)#3!AOZB*b(eU!<$WZ-IubV?K7I59`aYf{ z0j&9a8H4tX6n2-)4?Vw<>Kf}6e`gk8{Zk3C#MXJe|95(}$SC@m#Hgk~x=W zet3yH?;ps7c4M%+6h1w>k`lL_6`dDK0J@?gA)@+i$43{ePqSd64;>R!`VK!t>Y;eD zh$1n{jJ3#2R!$M9QKY6>DN=-pGD}iwx*DVpuySfA00vJv#JZ)v&k6BSe?j^H_FcPZ zsnKAKjpdfX!B1yFL4i0hbt>J@pJ#v5rgVJzX&Nj3!4u}9o!>`}ho)F>1H^+LsrrFoO*&^Ej^ zzmy)wqKhEb99!eVws7%6pHX2O3t3oh=~i@JD6Q~+uPmDMbk%3we*$Dx8q8Q8#nRLy z1|`9yVL2?Flup0C6;{uxDxku5-zlQ9zSQR=QXk*+p>;ES@MRoYS5+S{7Zws}Hsg$s z$7nQGbi1-Fwm<(o9ry3&a99{ECr_qPfFb%Y`#PpZ|mu6cn&=<3{ee=N|68 z_g)SiI#jEN+~)IMf1*!xPn;e%=|%f_>859y@UQ2PbXp2`=hFWlgV@)1bC7c5Ii1Ah zdnfYty2W&gY|HqU|Bfj>l&4;wSSx&K&U7K4D#5L~aXUN=dG+2Juj9#0lR3ZUB>G4L z8l#S;gHPvsd575k z*|sXjdwlHUZ0otY)~=$`FN911eUS;136`eDlN4VBQCW;0c8KNEbFf6IsH$2`brt$z zdwluljP&nn)c5Li=%S*q7!2j*T`reM{rlf({nJmJuvmznKAk4bnw4LOR6 zxQOl@OCw`L9v_^{YahLVqd?)@giPs;R#R$iz(2qJ03N3otzJUXX~64cZqAZwP4h29 zcSz=DVc-RgPU7g2^q~C?x0CyydJst`@zsl;(m13Mf9K^3OnCj7^6q%n;kQt8g0DSP zU;XcVWVc-BJ=G*7nJR7agQcisq^m@cg~fE3B79Coql66Jo|2Bm*VEF!f91HKirC)D zZwY-?Ffpk=iSbWVtM7=2fbejl{WEM_E|*w4WeRcIwvinhi)H$BnkOU#ALGIWbS@XN z$@HHJe>T&gK?6pO8bxMiCeJ_rJfWeXRl49nD>kO*s31#raZ7fM)@;wwbl&YXk10RQ z;N@qhA)k{`KE7BlPc^Jfr0;=u3k=}~ew@CUN%1vjQ6^7$9;elTTlNr{7#kEvGwKZ7 zKJhLzItiUtkK5y7%&hT2alh~0T!-VlJtzj)e@lOzH0se&RgU%kyYEw-0}=$F#R7dg zMg_wM<=t}HVGEz6Mv+itVo;QYBofFv97R&6_;QG<)0g`A!ZPN5Cz-Kexz9tcr0*Lf zbi!>g5N5OS%l7T!o0&7|ykP@sXebR|dyURXNkKO=|KddvfBZO3RmIV+-LDQ`TwEM? zf8TvK>({Sm*|KFcYt{@QL={IQa$FP9;nvQ~`S*P0-a7+>q-W~O|3_%ca0++j;#^Z) zqcuA=V=oQ#7XFer9F0!G`p+}<5AY7~#n;@jhv%m}PkX7AwBK{MN~4cE`n&*mq1lsC zyT4yglOYK#dg#q6^*z_|31V++#<1Cce`UlQ_oLBit9Zw@5Av#<-`v(ONw5BW8Y4!H zVA3>m zPrM@LKl>(O562254cTk55H1gm@2fuFzqrS2-Uwa5<~P^!@%#^Y{N0H`j!8}Oc-%w2 zX=BU=;MEq-O1oV9#lRPb@-V?ufyWNH0Qje4jU3d7PuAyMt89vyT(@kjI zT3Ru0o@k$uLF1?>1aR!O+ZcG$O;y4%I~OgY&6i)I2@faljyvcU9W7OtiW@Ov1igFr z=EfUu1YqRIkrWpflbD!Tf9nnOcsxW#Mlxi`5FUEyA@08WZnRo$ouQXKN7H%bo@co$ z{&pT%KaR7X9Ve`frCwd>)tFuKL(i|I2M<3jzMA_vTD=A|An7FxF}{XeFm*n{-&<%d0ae^Q9y&t#C1Rf#|o zEPp18LpkvFatjIZQLJB@NPJX9YXqj&q{OsZ^^3Om56YmFdAy&$`YHo2T)^$|P*_@u zqj__bwrz3h^~fhrV%oM1OHmPKosLr@MsU|lFG*K>GJ@4=<=C-fBqSsd6BASa$q3!` z;)~6zxZcu*56^tbf16X^AiP5q7pDC3A5Hulhc^(C-x=}BE}H$h4ae`>BSk;gQpjg* zpq20{9>Us1vU}!MT1m}<;((?`p}|Q~|Jj#Wze~yeR+gK04;6=21!sO<{rj{^Gf@;F z=DeN7jO7>nV?Z+&lfv+RR#v837(cudQ^z;LYz{UBffEa+f6O^4YSW+bOnkMI5lTx- z#oBk@rTMO1wAX484hO<&#a&c{&EcTf?Zz4vh4X<27(8y=uRa-}z5(ZUU-jYGE4zs7 z6Hl9mx>B5#k7U$wY}k(f_^gwc&%7xXyt5FkNrT(&qS1gB9K2^9=F?sTHgtw2v zUFu@l}Ppev&RwM%TD|^c|>Fv+R5J$fGhR~BI2`Mc_QdMMw0asEI*NqrKLhIJQ%5`d>Z2fA8fTVr|YhoL6(pGa(fx)FrtM z@PR)z_zmzj2U9LqsijMD3t%?T6qw7wl$HO@i&9)dnDv)GZAAznGM0{H>C#m!NK;4} zzLe49`!T*>LjAko|4|vT|6y@UZ0}mbGPTLvoF!sw-VWAWx2*p9qrz?gMgg}19RLTA z1#AJ{f9HMMPOA3uK$m1K@E|b5zvT!pgo7!i0cBbNOM!jBFu=yal+I9mv<|bm4~Uh1(^1jf{NuK^C{4by@dk z?9qRS<+DGe-;)FC2jQr&MZnlPN-gGn+qkkXI=Upc1x|7>#RDv(OR@ua!%y!RU`_yh z%Ybb_4`3CL7zoL*VZ+MPR3#-Pc)ea$u3Rau1j4%N9eC$JHhjB5j2bnH^gZb$^+>9* zf3DuW|G+H+hS0G^RMm;N@BWRbMhf7`$R zFmFto$nGO~qGyL#Ns^>;k~$9V2Yf=`ehH`-mNIHnhqLN}!e{!zQLQqjjv9&|!vwS}I?leJSrC-iPYkk`?9Pq6Q zFo02Ei+JBQP6reKf1yiq3Gg+r5YU%B1awJ`1m*%efE$2aehc^x2UAuDhA>i7Q-iwP zl`B^Y?-j0uP@j4?e7k`oXRPepxr^(r>&VN~=2ctQOVcKh*ddXHv;ILKe|+_kIe)W| zaS7#@En5~N%knlwQ4Y$o>{V6u#aCZ_bq#>cW-C=ywHN@c#;i4J8s78B2)$0yBJk4K z98Z`&lpHx1VfJ#gEq%G#M@Bycz~KAt=ZLl9X3lteEH6!)K%wkr z@uG#K?@8yt!2{LSXKFN>mD86ZNfN^*edilz^czHyB#}7m-MT%_fA`*tlV$m+q9{MA zs+zAT%Ga_iZyq;p+z+xWZwchUy~$ww>D!K-=gx#GB%15!wX1KcRo5 z^tjW|z-%~WKZ93s<5+DyUmJV?rr1!fAJwb8j8piwm)J@O4-Mzw65l!!UB+~$)Lu$N zm~R;sgQTyBh`35ne=gW-gK$)Nx0_gx-wY=j1H0o# zKa-u$(Zfesym%Qqc2um7e8j5dQ>JGLh##=?#rKj3w%e7bQvY}{V$v3Bj)%;5X( zr%B@`J_~sGFeD{ip6N{wp3d~nJMXlWW%+wmRsSu^vZ^S`c12OXkY#zls;aAHS&ml} zvL6dWKNzK7Xe>O!Nhn2F~qa^Nm?p$pgh%7o|vkpjabXoiT8Lk|hbUEN@a2WvwjBrGBfIswm1n ze_587D~i%uRn-9=kEiFRO`FOW`_qQ#yM}5*LJ#B~L^uVl8YPer+MGC33_o7nbA502>{9<2(2dvO28;+-MKgLG zZajV+m%WtGrs3tf}`zn0P>{XU~fw%lI!%GsEd}WIg z)mLBjXjz)_0ZUUppkwcQ%ilZpzBg#hxb)MtRiQIqUdUqc;>GP{Sx&dvY}@U2`#8JZ zo?x@t=Gbhu6L!0Og)GYns;UlhyWMRzZQ2yngXlu_aZcgV_G@+vx3#{Rt`Qwrf3;;b zv**td8#Zj%cU`ltj{qO-x?ux&DRV$JmFaKqwN`3=V**8cFB0B3A_zX=6nKTeS)>HO z=S8>#BH)Kb!Xpqaf!E>1qxc?lXOV(e2%jYks588A1Vwu<()`8*w)a{q`Gd^9P)mKK zqHLC~noP%F|CsP^Kp`->Qi-Ade{xTjTS9N`i&zWCxu6TKY67oNKS10LmBIJjU+#!R z>Q(M~_Ku)3dP_r^wMgLG?U`_EK=+%N2x)0P5ETXb_N}mjt5(6tk+6I@^y>$Qv!I`E zzs+WAsj6zJq9_w)%$Om75f44|&@4q!ewJnVW|zx#qsQZEw|VpCDr@S>e`jq6R?Ysb zi!R(?7H$uK%U$B!YyaqCUw{>4VjOC@7&*Sl!)U;9LB_G#x;3zl?Y-7YeRka?&is@` zv%W1UwU;8C0!@hTZ!xq+4H}yZuj;|0xDg&vK2ruL|14=Gv}T_*)raZP7h+kJ%DHAflAMg7J*ulY+AL)`D0z6d>ga*1K zkA?LJ@0G3le5Lw9y!T~$?Ibh%u;JRZ-D-+lL8VYR8m75UXgA1ce8Ax*++e=V@R*IKF9&Vk}= z+9{g#ZApo<1ZSbjxs@ks)X|0crdpl*;&{!u?%}P`ne>E*hI2OU6ixaz4}=fkePAp( z9$%cVE(kLmWey0y`#L{-alnT_SKuQKru-vdZ1_4|k_muN_|tSr{+#gtjNCF{2%9$j z#F>Jk+Q-1rQCD`Le@b1o-EKdjD9RpLmY3as|NRqWS&o%ud9mB=4)u6Ex1^?~=3Qx8 zH`G7%zBbu)!v?9>&Vl0e_s5C3xe4|&r93e8kt<5YZTR6EjGaR`{rz#8-PVd-H*5&5 z>wVi!MujZ~#`@!XHA7eth%QUX?JTo^FZ(pU>XNgsvnT~Ak+b)>5_Z{&WP}_~AZ%59w&2MK5C^OQ{=vbN+W&as zV9Ip5B$wiwpr8QHb{Uy_MgQg0Wn}JucREvgI+iPm19s~4pE%1!Cl>xZ&hH#9s*l3K z+kTKbf2ZCe;>~fFeb9Jw9BrQJ#=+Zus9ziTEaCfH!gQ=EG6wApW6&-dgZA(kv|KB(i4=ie1!WB{fNuG0W;3d9}zjO$q25=?^ZOG;9G=m(!p3iy#Pl4=dr*J zf0_Dux5wX}DVj0!a!)R;VE4?BW??h0HPinGe*lg_yTK0`ErGwGVH#Sdq2+IAXc^!f z`ODUB{f6ojMC6_};(AXT*FasurJh)WNi7n>^r3B{`!s4}d8%o`wWj(V1L(JE1Mq`4 z86CHvp%D^|khsOa?Qa#l4yel#dZVTBG<8a}_e#Q|dHhmO%ouGN-zFqMYTvM(q>nT` ze}1j0ey0HX$8}@N;Jc;9>>S*JCJ@50wT=m!N<)cH_W8>3(y&VowY3Nz+9|Rv-6A?- zY-ApGt*L&WqVsz!wDbd3m)wGeG`yVheI4cA^NEAf1Ce~UKt=CvL_=+;H^k7#+s4*P zW4;?=Qt;mHNpN?tEbyF{)5KY)9fe%Uf2uWzTyNp5ujcCV9Ql#!f7+;OO}a+rrXit` zhR8ncBigizF*cyoEz|v`9tp8K;uly?6sF0iO6(rho9ir8433Lxq565j!E4R<+ZAaH z+QUGHx~yNIY{knbzNr#N-o8Ejb33S zDhYCgkV-VLO=A^``-!+)nixV`N6!1p(0e0G+@*MhN9q&ZQ)(I79EaCIfwK^=*UJgp zY5sj~gRq}070zM@`9I}YJ*BQETk8w1V@NH!$Nisap;S49!eNgD4bGb4YoA&C|kbdscDz%m`0(UW{>$N%2Kgz6-sm9>{)Pv zI25+kbimQBGJF8aiu_|9f7RRW;F zazeHM9n$dDdkmOH`7hG81XZ@j?NypdKWoo&Bl@FYI|^<;<{H4@&aACoWktT%JSp_& zUu-9CG--_FJ1S-{X(SDjMw5B1$$ozTz7LE&<##UXf^chv2aI30e{3x_4G`)L^$gIu zfOO!T{|L=}@1AJyApaIGzR{tBiq#pkK!`R(KfvX2@%_agIiH_{Mz5h|R15Ty9z%?I zkpDQ|fb(}>YsTL&fJ^Y~9D{Z-FxKzc)(ByM_Y1Ii37(z!W>5im?~lPvn71({;7tYl ze&abD9zwgin`rI;e-ZADzdu^ie_S9mR9@K}JeY9mLbZ*p&Jqr9K0wjF{BuI}klXcK zllFh=j4o6gkCBErDEm84@3kiUjeEfWdlBn;py>^?`5D1MymumTU;D#m^r zm*Bat92`H)8xwgUyfOXVyClx;Fr+p6**W2j3*I#k+G!n@e@!z(j8}WBFgs_Tc5eyL zD}NZwe~x(}q(wyk>>XL;Z#|#pURyH3b3|REXq48)*+tEaaUoiF6s7J1@;1Na6W5yX zH|_-oe(|T*>ReoA37&D)?I`K0*{?NdI;Is!^X@q1`oPbx1Vnt(f(LI3(>&$X>kfzS zb6#JazF|n@e}0Wo*HJxgokzMSNS`F_gZlW;r!;!aVaICg_1Bv2cVq#}#BT{V`mIYC z5aS=G9S6Pyo>+osNp%&CjzNE;p6jw?G5h8$&mtfXumZ(E{>Q~^9U3MMncZH4*~rGN zwo2V+7yUvxb&Stl(iat4FtG9tTBqR)?)U^@$D_Zw^O|Ho`xhB`-np~4>a!szu bZ&Cgql{kg)4HN7X00000NkvXXu0mjfZ%=`A diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css index 8636f1085e..d9b0b6f2ec 100644 --- a/view/theme/loozah/style.css +++ b/view/theme/loozah/style.css @@ -2732,6 +2732,7 @@ a.mail-list-link { .off { background-position: 0px -48px; } .starred { background-position: -16px -48px; } .unstarred { background-position: -32px -48px; } +.tagged { background-position: -48px -48px; } .icon.dim { opacity: 0.3;filter:alpha(opacity=30); } From 2aef98f71d95ba5c2caae7637002daef0bce6de5 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 01:17:12 -0700 Subject: [PATCH 17/69] cripple account when expired --- addon/facebook/facebook.php | 21 ++++++++++++++++----- include/diaspora.php | 2 +- include/poller.php | 5 +++-- mod/dfrn_notify.php | 5 +++-- mod/pubsub.php | 4 ++-- mod/receive.php | 2 +- mod/salmon.php | 4 ++-- 7 files changed, 28 insertions(+), 15 deletions(-) diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php index fe348f689e..3268cb254f 100644 --- a/addon/facebook/facebook.php +++ b/addon/facebook/facebook.php @@ -139,6 +139,12 @@ function fb_get_self($uid) { function fb_get_friends($uid) { + $r = q("SELECT `id` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1", + intval($uid) + ); + if(! count($r)) + return; + $access_token = get_pconfig($uid,'facebook','access_token'); $no_linking = get_pconfig($uid,'facebook','no_linking'); @@ -808,8 +814,18 @@ function fb_consume_all($uid) { } function fb_consume_stream($uid,$j,$wall = false) { + $a = get_app(); + + $user = q("SELECT `nickname`, `blockwall` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1", + intval($uid) + ); + if(! count($user)) + return; + + $my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname']; + $no_linking = get_pconfig($uid,'facebook','no_linking'); if($no_linking) return; @@ -818,11 +834,6 @@ function fb_consume_stream($uid,$j,$wall = false) { intval($uid) ); - $user = q("SELECT `nickname`, `blockwall` FROM `user` WHERE `uid` = %d LIMIT 1", - intval($uid) - ); - if(count($user)) - $my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname']; $self_id = get_pconfig($uid,'facebook','self_id'); if(! count($j->data) || (! strlen($self_id))) diff --git a/include/diaspora.php b/include/diaspora.php index a6f3002b9d..3c28373eac 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -8,7 +8,7 @@ require_once('include/contact_selectors.php'); function diaspora_dispatch_public($msg) { - $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) ", + $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) AND `account_expired` = 0 ", dbesc(NETWORK_DIASPORA), dbesc($msg['author']) ); diff --git a/include/poller.php b/include/poller.php index e80b696bf8..dbae1deec9 100644 --- a/include/poller.php +++ b/include/poller.php @@ -86,11 +86,12 @@ function poller_run($argv, $argc){ // and which have a polling address and ignore Diaspora since // we are unable to match those posts with a Diaspora GUID and prevent duplicates. - $contacts = q("SELECT `id` FROM `contact` + $contacts = q("SELECT `contact`.`id` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != '' AND `network` != '%s' $sql_extra - AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()", + AND `self` = 0 AND `contact`.`blocked` = 0 AND `contact`.`readonly` = 0 + AND `user`.`account_expired` = 0 ORDER BY RAND()", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND), dbesc(NETWORK_DIASPORA) diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index 84cb2fc165..d174c87ee6 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -72,7 +72,7 @@ function dfrn_notify_post(&$a) { FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `user`.`nickname` = '%s' $sql_extra LIMIT 1", + AND `user`.`nickname` = '%s' AND `user`.`account_expired` = 0 $sql_extra LIMIT 1", dbesc($a->argv[1]) ); @@ -829,7 +829,8 @@ function dfrn_notify_content(&$a) { } $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` - WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `user`.`nickname` = '%s' $sql_extra LIMIT 1", + WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `user`.`nickname` = '%s' + AND `user`.`account_expired` = 0 $sql_extra LIMIT 1", dbesc($a->argv[1]) ); diff --git a/mod/pubsub.php b/mod/pubsub.php index 4dff5d531a..b2f0069271 100644 --- a/mod/pubsub.php +++ b/mod/pubsub.php @@ -44,7 +44,7 @@ function pubsub_init(&$a) { $subscribe = (($hub_mode === 'subscribe') ? 1 : 0); - $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1", dbesc($nick) ); if(! count($r)) @@ -99,7 +99,7 @@ function pubsub_post(&$a) { $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : ''); $contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0 ); - $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1", dbesc($nick) ); if(! count($r)) diff --git a/mod/receive.php b/mod/receive.php index 72e2903483..950bf0bd38 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -24,7 +24,7 @@ function receive_post(&$a) { $guid = $a->argv[2]; - $r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `guid` = '%s' AND `account_expired` = 0 LIMIT 1", dbesc($guid) ); if(! count($r)) diff --git a/mod/salmon.php b/mod/salmon.php index 0264e820db..6172d17a1d 100644 --- a/mod/salmon.php +++ b/mod/salmon.php @@ -25,12 +25,12 @@ function salmon_post(&$a) { $xml = file_get_contents('php://input'); - logger('mod-salmon: new salmon ' . $xml); + logger('mod-salmon: new salmon ' . $xml, LOGGER_DATA); $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : ''); $mentions = (($a->argc > 2 && $a->argv[2] === 'mention') ? true : false); - $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1", dbesc($nick) ); if(! count($r)) From 0a30a91b14c8887db668d74759953405f02d4e65 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 02:13:59 -0700 Subject: [PATCH 18/69] basic zot discovery framework --- mod/hostxrd.php | 3 ++- mod/xrd.php | 1 + view/xrd_host.tpl | 13 +++++++++++++ view/xrd_person.tpl | 11 +++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/mod/hostxrd.php b/mod/hostxrd.php index c7861d26d0..1cc18da7a6 100644 --- a/mod/hostxrd.php +++ b/mod/hostxrd.php @@ -4,7 +4,8 @@ function hostxrd_init(&$a) { header('Access-Control-Allow-Origin: *'); header("Content-type: text/xml"); $tpl = file_get_contents('view/xrd_host.tpl'); - echo str_replace(array('$zroot','$domain'),array(z_root(),z_path()),$tpl); + echo str_replace(array( + '$zroot','$domain','$zot_post'),array(z_root(),z_path(),z_root() . '/post'),$tpl); session_write_close(); exit(); diff --git a/mod/xrd.php b/mod/xrd.php index fcec74336e..dae6e4828b 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -45,6 +45,7 @@ function xrd_init(&$a) { '$profile_url' => $a->get_baseurl() . '/profile/' . $r[0]['nickname'], '$hcard_url' => $a->get_baseurl() . '/hcard/' . $r[0]['nickname'], '$atom' => $a->get_baseurl() . '/dfrn_poll/' . $r[0]['nickname'], + '$zot_post' => $a->get_baseurl() . '/post/' . $r[0]['nickname'], '$photo' => $a->get_baseurl() . '/photo/profile/' . $r[0]['uid'] . '.jpg', '$dspr' => $dspr, '$salmon' => $a->get_baseurl() . '/salmon/' . $r[0]['nickname'], diff --git a/view/xrd_host.tpl b/view/xrd_host.tpl index f1d9707d57..ee687ffa9d 100644 --- a/view/xrd_host.tpl +++ b/view/xrd_host.tpl @@ -9,4 +9,17 @@ + + + + + + + + diff --git a/view/xrd_person.tpl b/view/xrd_person.tpl index fd11ad600d..7373499bf5 100644 --- a/view/xrd_person.tpl +++ b/view/xrd_person.tpl @@ -5,6 +5,17 @@ $accturi $profile_url + + + + + + Date: Mon, 19 Sep 2011 03:30:59 -0700 Subject: [PATCH 19/69] Check all keys before use --- include/conversation.php | 3 ++- mod/dfrn_notify.php | 20 ++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 4398d6a5c1..7cea54db5c 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -485,6 +485,7 @@ function conversation(&$a, $items, $mode, $update) { $tmp_item = replace_macros($template,array( + '$body' => $body, '$id' => $item['item_id'], '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), '$olinktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), @@ -498,7 +499,6 @@ function conversation(&$a, $items, $mode, $update) { '$osparkle' => $osparkle, '$sparkle' => $sparkle, '$title' => $item['title'], - '$body' => $body, '$ago' => ((($item['app']) && ($item['id'] == $item['parent'])) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])), '$lock' => $lock, '$location' => $location, @@ -514,6 +514,7 @@ function conversation(&$a, $items, $mode, $update) { '$like' => $like, '$dislike' => $dislike, '$comment' => $comment + )); diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index d174c87ee6..bd665c208b 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -807,7 +807,7 @@ function dfrn_notify_content(&$a) { intval(time() + 90 ) ); - logger('dfrn_notify: challenge=' . $hash ); + logger('dfrn_notify: challenge=' . $hash, LOGGER_DEBUG ); $sql_extra = ''; switch($direction) { @@ -841,14 +841,18 @@ function dfrn_notify_content(&$a) { $encrypted_id = ''; $id_str = $my_id . '.' . mt_rand(1000,9999); - if((($r[0]['duplex']) && strlen($r[0]['prvkey'])) || (! strlen($r[0]['pubkey']))) { - openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']); - openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']); - } - else { - openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']); - openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']); + if(strlen($r[0]['prvkey']) || strlen($r[0]['pubkey'])) { + if(($r[0]['duplex']) || (! strlen($r[0]['pubkey']))) { + openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']); + openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']); + } + else { + openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']); + openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']); + } } + else + $status = 1; $challenge = bin2hex($challenge); $encrypted_id = bin2hex($encrypted_id); From 97deaa31187868e200988a3fcd3722c49760fd4d Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 03:36:41 -0700 Subject: [PATCH 20/69] resume strict verification of Diaspora messages --- include/diaspora.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index 3c28373eac..425bc722fc 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -383,7 +383,7 @@ function diaspora_decode($importer,$xml) { if(! $verify) { logger('mod-diaspora: Message did not verify. Discarding.'); -// http_status_exit(400); + http_status_exit(400); } logger('mod-diaspora: Message verified.'); From ca7180851545d6d75bcb63a5285222c002267951 Mon Sep 17 00:00:00 2001 From: Fabio Comuni Date: Mon, 19 Sep 2011 14:43:17 +0200 Subject: [PATCH 21/69] IT: missing email templates --- view/it/wall_received_html_body_eml.tpl | 24 ++++++++++++++++++++++++ view/it/wall_received_text_body_eml.tpl | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 view/it/wall_received_html_body_eml.tpl create mode 100644 view/it/wall_received_text_body_eml.tpl diff --git a/view/it/wall_received_html_body_eml.tpl b/view/it/wall_received_html_body_eml.tpl new file mode 100644 index 0000000000..cdc05cfa38 --- /dev/null +++ b/view/it/wall_received_html_body_eml.tpl @@ -0,0 +1,24 @@ + + + + Messaggio da Friendika + + + + + + + + + + + + + + + + + +
Friendika
$from ha scritto sulla tua bacheca.
$from
$body
Vai su $siteurl per vedere o cancellare il post.
Grazie,
L'amministratore di $sitename
+ + \ No newline at end of file diff --git a/view/it/wall_received_text_body_eml.tpl b/view/it/wall_received_text_body_eml.tpl new file mode 100644 index 0000000000..327557ea1e --- /dev/null +++ b/view/it/wall_received_text_body_eml.tpl @@ -0,0 +1,18 @@ + +Caro $username, + + '$from' ha scritto sulla tua bacheca. + +----- +$body +----- + +Vai su $siteurl per vedere o cancellare il post: + +$display + +Grazie, + L'amministratore di $sitename + + + From a810d2a993fb0d5d778cf56f9cdea151ecdec341 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 16:39:23 -0700 Subject: [PATCH 22/69] put profile photo on photos page --- boot.php | 2 +- mod/photos.php | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index d312682ac7..f7c9d39d23 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.3.1108' ); +define ( 'FRIENDIKA_VERSION', '2.3.1109' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1090 ); diff --git a/mod/photos.php b/mod/photos.php index b74ca85d71..7b660bfa3d 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -34,12 +34,14 @@ function photos_init(&$a) { $a->data['albums'] = $albums; $o .= '

' . $a->data['user']['username'] . '

'; + $o .= '
' . $a->data['user']['username'] . '
'; + $o .= '

' . '' . t('Photo Albums') . '

'; $o .= '
    '; foreach($albums as $album) { - // don't show contact photos. We once trasnlated this name, but then you could still access it under + // don't show contact photos. We once translated this name, but then you could still access it under // a different language setting. Now we store the name in English and check in English (and translated for legacy albums). if((! strlen($album['album'])) || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos'))) From d6d24f3b6a2fcd853387ff5338a89687e498300c Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 16:51:52 -0700 Subject: [PATCH 23/69] personal notes going to wall instead of PN in dispy --- view/theme/dispy/jot.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/theme/dispy/jot.tpl b/view/theme/dispy/jot.tpl index d5e81a925d..f6bf91ffa2 100644 --- a/view/theme/dispy/jot.tpl +++ b/view/theme/dispy/jot.tpl @@ -9,7 +9,7 @@
    - + From 63277b57fc6557c5f59fefd1ae738ad3c3e2a9f1 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 19:46:18 -0700 Subject: [PATCH 24/69] template escapes --- include/conversation.php | 10 +++++----- include/template_processor.php | 20 +++++++++++++++++++- mod/message.php | 16 ++++++++-------- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 7cea54db5c..b7fba91541 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -485,7 +485,7 @@ function conversation(&$a, $items, $mode, $update) { $tmp_item = replace_macros($template,array( - '$body' => $body, + '$body' => template_escape($body), '$id' => $item['item_id'], '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), '$olinktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), @@ -494,18 +494,18 @@ function conversation(&$a, $items, $mode, $update) { '$vwall' => t('via Wall-To-Wall:'), '$profile_url' => $profile_link, '$item_photo_menu' => item_photo_menu($item), - '$name' => $profile_name, + '$name' => template_escape($profile_name), '$thumb' => $profile_avatar, '$osparkle' => $osparkle, '$sparkle' => $sparkle, - '$title' => $item['title'], + '$title' => template_escape($item['title']), '$ago' => ((($item['app']) && ($item['id'] == $item['parent'])) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])), '$lock' => $lock, - '$location' => $location, + '$location' => template_escape($location), '$indent' => $indent, '$owner_url' => $owner_url, '$owner_photo' => $owner_photo, - '$owner_name' => $owner_name, + '$owner_name' => template_escape($owner_name), '$plink' => get_plink($item), '$edpost' => $edpost, '$star' => $star, diff --git a/include/template_processor.php b/include/template_processor.php index dc5c24de3e..90452daca1 100644 --- a/include/template_processor.php +++ b/include/template_processor.php @@ -196,8 +196,26 @@ $os=$s; $count++; $s = str_replace($this->search,$this->replace, $s); } - return $s; + return template_unescape($s); } } $t = new Template; + + + + +function template_escape($s) { + + return str_replace(array('$','{{'),array('!_Doll^Ars1Az_!','!_DoubLe^BraceS4Rw_!'),$s); + + +} + +function template_unescape($s) { + + return str_replace(array('!_Doll^Ars1Az_!','!_DoubLe^BraceS4Rw_!'),array('$','{{'),$s); + + + +} diff --git a/mod/message.php b/mod/message.php index 165d638141..e031cdafad 100644 --- a/mod/message.php +++ b/mod/message.php @@ -159,10 +159,10 @@ function message_content(&$a) { '$from_url' => $a->get_baseurl() . '/redir/' . $rr['contact-id'], '$sparkle' => ' sparkle', '$from_photo' => $rr['thumb'], - '$subject' => (($rr['mailseen']) ? $rr['title'] : '' . $rr['title'] . ''), + '$subject' => template_escape((($rr['mailseen']) ? $rr['title'] : '' . $rr['title'] . '')), '$delete' => t('Delete conversation'), - '$body' => $rr['body'], - '$to_name' => $rr['name'], + '$body' => template_escape($rr['body']), + '$to_name' => template_escape($rr['name']), '$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A')) )); } @@ -221,14 +221,14 @@ function message_content(&$a) { } $o .= replace_macros($tpl, array( '$id' => $message['id'], - '$from_name' =>$message['from-name'], + '$from_name' => template_escape($message['from-name']), '$from_url' => $from_url, '$sparkle' => $sparkle, '$from_photo' => $message['from-photo'], - '$subject' => $message['title'], - '$body' => smilies(bbcode($message['body'])), + '$subject' => template_escape($message['title']), + '$body' => template_escape(smilies(bbcode($message['body']))), '$delete' => t('Delete message'), - '$to_name' => $message['name'], + '$to_name' => template_escape($message['name']), '$date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A') )); @@ -240,7 +240,7 @@ function message_content(&$a) { '$header' => t('Send Reply'), '$to' => t('To:'), '$subject' => t('Subject:'), - '$subjtxt' => $message['title'], + '$subjtxt' => template_escape($message['title']), '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ', '$yourmessage' => t('Your message:'), '$select' => $select, From c2ccb78869b8dfbbbaa124c81d717e1edff56304 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 19:51:14 -0700 Subject: [PATCH 25/69] template escapes --- include/conversation.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index b7fba91541..a4069c9fdb 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -214,18 +214,18 @@ function conversation(&$a, $items, $mode, $update) { '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), '$profile_url' => $profile_link, '$item_photo_menu' => item_photo_menu($item), - '$name' => $profile_name, + '$name' => template_escape($profile_name), '$sparkle' => $sparkle, '$lock' => $lock, '$thumb' => $profile_avatar, - '$title' => $item['title'], - '$body' => $body, + '$title' => template_escape($item['title']), + '$body' => template_escape($body), '$ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])), - '$location' => $location, + '$location' => template_escape($location), '$indent' => '', '$owner_url' => $owner_url, '$owner_photo' => $owner_photo, - '$owner_name' => $owner_name, + '$owner_name' => template_escape($owner_name), '$star' => $star, '$drop' => $drop, '$conv' => '' . t('View in context') . '' From 660787916ef33e8efc6d03ad1f74e1c74eb7feaf Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 20:24:32 -0700 Subject: [PATCH 26/69] template escapes --- boot.php | 10 +++++----- mod/photos.php | 34 +++++++++++++++++----------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/boot.php b/boot.php index f7c9d39d23..ea2d9df9d9 100644 --- a/boot.php +++ b/boot.php @@ -954,16 +954,16 @@ EOT; $tpl = get_markup_template('profile_vcard.tpl'); $o .= replace_macros($tpl, array( - '$fullname' => $fullname, - '$pdesc' => $pdesc, + '$fullname' => template_escape($fullname), + '$pdesc' => template_escape($pdesc), '$tabs' => $tabs, '$photo' => $photo, '$connect' => $connect, - '$location' => $location, + '$location' => template_escape($location), '$gender' => $gender, '$pubkey' => $pubkey, - '$marital' => $marital, - '$homepage' => $homepage, + '$marital' => template_escape($marital), + '$homepage' => template_escape($homepage), '$diaspora' => $diaspora_vcard )); diff --git a/mod/photos.php b/mod/photos.php index 7b660bfa3d..72f2abd56c 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -889,9 +889,9 @@ function photos_content(&$a) { '$nickname' => $a->data['user']['nickname'], '$newalbum' => t('New album name: '), '$existalbumtext' => t('or existing album name: '), - '$albumselect' => $albumselect, + '$albumselect' => template_escape($albumselect), '$permissions' => t('Permissions'), - '$aclselect' => (($visitor) ? '' : populate_acl($a->user, $celeb)), + '$aclselect' => (($visitor) ? '' : template_escape(populate_acl($a->user, $celeb))), '$uploader' => $ret['addon_text'], '$default' => (($ret['default_upload']) ? $default_upload : ''), '$uploadurl' => $ret['post_url'] @@ -932,7 +932,7 @@ function photos_content(&$a) { $o .= replace_macros($edit_tpl,array( '$nametext' => t('New album name: '), '$nickname' => $a->data['user']['nickname'], - '$album' => $album, + '$album' => template_escape($album), '$hexalbum' => bin2hex($album), '$submit' => t('Submit'), '$dropsubmit' => t('Delete Album') @@ -957,8 +957,8 @@ function photos_content(&$a) { '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], '$phototitle' => t('View Photo'), '$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.jpg', - '$imgalt' => $rr['filename'], - '$desc'=> $rr['desc'] + '$imgalt' => template_escape($rr['filename']), + '$desc'=> template_escape($rr['desc']) )); } @@ -1132,16 +1132,16 @@ function photos_content(&$a) { $edit_tpl = get_markup_template('photo_edit.tpl'); $edit = replace_macros($edit_tpl, array( '$id' => $ph[0]['id'], - '$album' => $ph[0]['album'], + '$album' => template_escape($ph[0]['album']), '$newalbum' => t('New album name'), '$nickname' => $a->data['user']['nickname'], '$resource_id' => $ph[0]['resource-id'], '$capt_label' => t('Caption'), - '$caption' => $ph[0]['desc'], + '$caption' => template_escape($ph[0]['desc']), '$tag_label' => t('Add a Tag'), '$tags' => $link_item['tag'], '$permissions' => t('Permissions'), - '$aclselect' => populate_acl($ph[0]), + '$aclselect' => template_escape(populate_acl($ph[0])), '$help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'), '$item_id' => ((count($linked_items)) ? $link_item['id'] : 0), '$submit' => t('Submit'), @@ -1287,11 +1287,11 @@ function photos_content(&$a) { $comments .= replace_macros($template,array( '$id' => $item['item_id'], '$profile_url' => $profile_link, - '$name' => $profile_name, + '$name' => template_escape($profile_name), '$thumb' => $profile_avatar, '$sparkle' => $sparkle, - '$title' => $item['title'], - '$body' => bbcode($item['body']), + '$title' => template_escape($item['title']), + '$body' => template_escape(bbcode($item['body'])), '$ago' => relative_date($item['created']), '$indent' => (($item['parent'] != $item['item_id']) ? ' comment' : ''), '$drop' => $drop, @@ -1306,18 +1306,18 @@ function photos_content(&$a) { $photo_tpl = get_markup_template('photo_view.tpl'); $o .= replace_macros($photo_tpl, array( '$id' => $ph[0]['id'], - '$album' => array($album_link,$ph[0]['album']), + '$album' => array($album_link,template_escape($ph[0]['album'])), '$tools' => $tools, '$lock' => $lock, '$photo' => $photo, '$prevlink' => $prevlink, '$nextlink' => $nextlink, '$desc' => $ph[0]['desc'], - '$tags' => $tags, + '$tags' => template_escape($tags), '$edit' => $edit, '$likebuttons' => $likebuttons, - '$like' => $like, - '$dislike' => $dislike, + '$like' => template_escape($like), + '$dislike' => template_escape($dislike), '$comments' => $comments, '$paginate' => $paginate, )); @@ -1365,9 +1365,9 @@ function photos_content(&$a) { '$phototitle' => t('View Photo'), '$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.jpg', '$albumlink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($rr['album']), - '$albumname' => $rr['album'], + '$albumname' => template_escape($rr['album']), '$albumalt' => t('View Album'), - '$imgalt' => $rr['filename'] + '$imgalt' => template_escape($rr['filename']) )); } From d653d922b117cb123268e0b7f7b584e86482f5a7 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 21:24:16 -0700 Subject: [PATCH 27/69] sorting through key issue --- mod/dfrn_notify.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index bd665c208b..870e4f2fba 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -841,18 +841,18 @@ function dfrn_notify_content(&$a) { $encrypted_id = ''; $id_str = $my_id . '.' . mt_rand(1000,9999); - if(strlen($r[0]['prvkey']) || strlen($r[0]['pubkey'])) { - if(($r[0]['duplex']) || (! strlen($r[0]['pubkey']))) { - openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']); - openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']); - } - else { - openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']); - openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']); - } + $prv_key = trim($r[0]['prvkey']); + $pub_key = trim($r[0]['pubkey']); + $dplx = intval($r[0]['duplex']); + + if((($dplx) && (strlen($prv_key))) || ((strlen($prv_key)) && (!(strlen($pub_key))))) { + openssl_private_encrypt($hash,$challenge,$prv_key); + openssl_private_encrypt($id_str,$encrypted_id,$prv_key); + } + else { + openssl_public_encrypt($hash,$challenge,$pub_key); + openssl_public_encrypt($id_str,$encrypted_id,$pub_key); } - else - $status = 1; $challenge = bin2hex($challenge); $encrypted_id = bin2hex($encrypted_id); From 8a11cec61a87600273f1349e3d112e7fc1e65486 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 19 Sep 2011 22:21:55 -0700 Subject: [PATCH 28/69] allow setting all the bookmarked URL fields via script/API --- mod/parse_url.php | 121 +++++++++++++++++++++++++++----------------- view/jot-header.tpl | 2 +- 2 files changed, 75 insertions(+), 48 deletions(-) diff --git a/mod/parse_url.php b/mod/parse_url.php index 79c336ddcc..89ef24f876 100644 --- a/mod/parse_url.php +++ b/mod/parse_url.php @@ -5,13 +5,21 @@ require_once('library/HTMLPurifier.auto.php'); function parse_url_content(&$a) { - logger('parse_url: ' . $_GET['url']); + $text = null; - $url = trim(hex2bin($_GET['url'])); + if(x($_GET,'binurl')) + $url = trim(hex2bin($_GET['binurl'])); + else + $url = trim($_GET['url']); + + if($_GET['title']) + $title = strip_tags(trim($_GET['title'])); + + if($_GET['desc']) + $text = strip_tags(trim($_GET['desc'])); logger('parse_url: ' . $url); - $text = null; $template = "
    %s%s
    "; @@ -25,6 +33,20 @@ function parse_url_content(&$a) { killme(); } + if($url && $title && $text) { + + $text = '

    ' . $text . '

    '; + $title = str_replace(array("\r","\n"),array('',''),$title); + + $result = sprintf($template,$url,($title) ? $title : $url,$text); + + logger('parse_url (unparsed): returns: ' . $result); + + echo $result; + killme(); + } + + if($url) { $s = fetch_url($url); } else { @@ -39,10 +61,12 @@ function parse_url_content(&$a) { killme(); } - if(strpos($s,'')) { - $title = substr($s,strpos($s,'<title>')+7,64); - if(strpos($title,'<') !== false) - $title = strip_tags(substr($title,0,strpos($title,'<'))); + if(! $title) { + if(strpos($s,'<title>')) { + $title = substr($s,strpos($s,'<title>')+7,64); + if(strpos($title,'<') !== false) + $title = strip_tags(substr($title,0,strpos($title,'<'))); + } } $config = HTMLPurifier_Config::createDefault(); @@ -69,48 +93,51 @@ function parse_url_content(&$a) { } } - $divs = $dom->getElementsByTagName('div'); - if($divs) { - foreach($divs as $div) { - $class = $div->getAttribute('class'); - if($class && (stristr($class,'article') || stristr($class,'content'))) { - $items = $div->getElementsByTagName('p'); - if($items) { - foreach($items as $item) { - $text = $item->textContent; - if(stristr($text,'<script')) { - $text = ''; - continue; - } - $text = strip_tags($text); - if(strlen($text) < 100) { - $text = ''; - continue; - } - $text = substr($text,0,250) . '...' ; - break; - } - } - } - if($text) - break; - } - } if(! $text) { - $items = $dom->getElementsByTagName('p'); - if($items) { - foreach($items as $item) { - $text = $item->textContent; - if(stristr($text,'<script')) - continue; - $text = strip_tags($text); - if(strlen($text) < 100) { - $text = ''; - continue; + $divs = $dom->getElementsByTagName('div'); + if($divs) { + foreach($divs as $div) { + $class = $div->getAttribute('class'); + if($class && (stristr($class,'article') || stristr($class,'content'))) { + $items = $div->getElementsByTagName('p'); + if($items) { + foreach($items as $item) { + $text = $item->textContent; + if(stristr($text,'<script')) { + $text = ''; + continue; + } + $text = strip_tags($text); + if(strlen($text) < 100) { + $text = ''; + continue; + } + $text = substr($text,0,250) . '...' ; + break; + } + } + } + if($text) + break; + } + } + + if(! $text) { + $items = $dom->getElementsByTagName('p'); + if($items) { + foreach($items as $item) { + $text = $item->textContent; + if(stristr($text,'<script')) + continue; + $text = strip_tags($text); + if(strlen($text) < 100) { + $text = ''; + continue; + } + $text = substr($text,0,250) . '...' ; + break; } - $text = substr($text,0,250) . '...' ; - break; } } } @@ -119,7 +146,7 @@ function parse_url_content(&$a) { $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />'; } - $title = str_replace("\n",'',$title); + $title = str_replace(array("\r","\n"),array('',''),$title); $result = sprintf($template,$url,($title) ? $title : $url,$text); diff --git a/view/jot-header.tpl b/view/jot-header.tpl index 6195c5bbc6..eb74c31dad 100644 --- a/view/jot-header.tpl +++ b/view/jot-header.tpl @@ -142,7 +142,7 @@ function initEditor(cb){ if(reply && reply.length) { reply = bin2hex(reply); $('#profile-rotator').show(); - $.get('parse_url?url=' + reply, function(data) { + $.get('parse_url?binurl=' + reply, function(data) { tinyMCE.execCommand('mceInsertRawHTML',false,data); $('#profile-rotator').hide(); }); From 9edf15d3ef0548a35862fab37eee1fd310705285 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 01:49:08 -0700 Subject: [PATCH 29/69] structures for batch mode (Diaspora/zot) --- boot.php | 2 +- database.sql | 1 + include/Scrape.php | 5 +++- include/diaspora.php | 11 +++---- include/network.php | 71 +++++++++++++++++++++++++++++++++----------- mod/follow.php | 5 ++-- update.php | 10 ++++++- 7 files changed, 75 insertions(+), 30 deletions(-) diff --git a/boot.php b/boot.php index ea2d9df9d9..b38855f358 100644 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once("include/pgettext.php"); define ( 'FRIENDIKA_VERSION', '2.3.1109' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1090 ); +define ( 'DB_UPDATE_VERSION', 1091 ); define ( 'EOL', "<br />\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index b1580ec2cc..cb73f732b8 100644 --- a/database.sql +++ b/database.sql @@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS `contact` ( `alias` char(255) NOT NULL, `pubkey` text NOT NULL, `prvkey` text NOT NULL, + `batch` char(255) NOT NULL, `request` text NOT NULL, `notify` text NOT NULL, `poll` text NOT NULL, diff --git a/include/Scrape.php b/include/Scrape.php index 58468a40d0..0115bf2e71 100644 --- a/include/Scrape.php +++ b/include/Scrape.php @@ -496,8 +496,10 @@ function probe_url($url, $mode = PROBE_NORMAL) { } if($diaspora && $diaspora_base && $diaspora_guid) { - if($mode == PROBE_DIASPORA || ! $notify) + if($mode == PROBE_DIASPORA || ! $notify) { $notify = $diaspora_base . 'receive/users/' . $diaspora_guid; + $batch = $diaspora_base . 'receive/public' ; + } if(strpos($url,'@')) $addr = str_replace('acct:', '', $url); } @@ -675,6 +677,7 @@ function probe_url($url, $mode = PROBE_NORMAL) { $result['nick'] = $vcard['nick']; $result['url'] = $profile; $result['addr'] = $addr; + $result['batch'] = $batch; $result['notify'] = $notify; $result['poll'] = $poll; $result['request'] = $request; diff --git a/include/diaspora.php b/include/diaspora.php index 425bc722fc..94c4e30988 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -68,6 +68,7 @@ function diaspora_get_contact_by_handle($uid,$handle) { } function find_diaspora_person_by_handle($handle) { + $update = false; $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1", dbesc(NETWORK_DIASPORA), dbesc($handle) @@ -75,18 +76,14 @@ function find_diaspora_person_by_handle($handle) { if(count($r)) { // update record occasionally so it doesn't get stale $d = strtotime($r[0]['updated'] . ' +00:00'); - if($d < strtotime('now - 14 days')) { - q("delete from fcontact where id = %d limit 1", - intval($r[0]['id']) - ); - } - else + if($d > strtotime('now - 14 days')) return $r[0]; + $update = true; } require_once('include/Scrape.php'); $r = probe_url($handle, PROBE_DIASPORA); if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) { - add_fcontact($r); + add_fcontact($r,$update); return ($r); } return false; diff --git a/include/network.php b/include/network.php index deb257ff3d..ec99d1e0dc 100644 --- a/include/network.php +++ b/include/network.php @@ -701,24 +701,59 @@ function parse_xml_string($s,$strict = true) { return $x; }} -function add_fcontact($arr) { +function add_fcontact($arr,$update = false) { - $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`, - `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` ) - values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", - dbesc($arr['url']), - dbesc($arr['name']), - dbesc($arr['photo']), - dbesc($arr['request']), - dbesc($arr['nick']), - dbesc($arr['addr']), - dbesc($arr['notify']), - dbesc($arr['poll']), - dbesc($arr['confirm']), - dbesc($arr['network']), - dbesc($arr['alias']), - dbesc($arr['pubkey']), - dbesc(datetime_convert()) - ); + if($update) { + $r = q("UPDATE `fcontact` SET + `name` = '%s', + `photo` = '%s', + `request` = '%s', + `nick` = '%s', + `addr` = '%s', + `batch` = '%s', + `notify` = '%s', + `poll` = '%s', + `confirm` = '%s', + `alias` = '%s', + `pubkey` = '%s', + `updated` = '%s' + WHERE `url` = '%s' AND `network` = '%s' LIMIT 1", + dbesc($arr['name']), + dbesc($arr['photo']), + dbesc($arr['request']), + dbesc($arr['nick']), + dbesc($arr['addr']), + dbesc($arr['batch']), + dbesc($arr['notify']), + dbesc($arr['poll']), + dbesc($arr['confirm']), + dbesc($arr['network']), + dbesc($arr['alias']), + dbesc($arr['pubkey']), + dbesc(datetime_convert()), + dbesc($arr['url']), + dbesc($arr['network']) + ); + } + else { + $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`, + `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` ) + values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", + dbesc($arr['url']), + dbesc($arr['name']), + dbesc($arr['photo']), + dbesc($arr['request']), + dbesc($arr['nick']), + dbesc($arr['addr']), + dbesc($arr['batch']), + dbesc($arr['notify']), + dbesc($arr['poll']), + dbesc($arr['confirm']), + dbesc($arr['network']), + dbesc($arr['alias']), + dbesc($arr['pubkey']), + dbesc(datetime_convert()) + ); + } return $r; } diff --git a/mod/follow.php b/mod/follow.php index df4d2e630a..77c8ae18f3 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -100,14 +100,15 @@ function follow_post(&$a) { $new_relation = CONTACT_IS_FOLLOWER; // create contact record - $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`, + $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `batch`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`, `writable`, `blocked`, `readonly`, `pending` ) - VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", + VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", intval(local_user()), dbesc(datetime_convert()), dbesc($ret['url']), dbesc($ret['addr']), dbesc($ret['alias']), + dbesc($ret['batch']), dbesc($ret['notify']), dbesc($ret['poll']), dbesc($ret['name']), diff --git a/update.php b/update.php index 94d0b6274a..c5752e4e72 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ <?php -define( 'UPDATE_VERSION' , 1090 ); +define( 'UPDATE_VERSION' , 1091 ); /** * @@ -753,3 +753,11 @@ function update_1088() { function update_1089() { q("ALTER TABLE `user` ADD `blocktags` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `hidewall` "); } + +function update_1090() { + q("ALTER TABLE `contact` ADD `batch` char(255) NOT NULL AFTER `prvkey` "); + + q("UPDATE `contact` SET `batch` = concat(substring_index(`url`,'/',3),'/receive/public') WHERE `network` = 'dspr' "); + +} + From 119cd9c0cee5e416199da900016609259598cb0b Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 04:07:24 -0700 Subject: [PATCH 30/69] more multiline regex fixes --- include/bbcode.php | 10 +++++----- mod/item.php | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/bbcode.php b/include/bbcode.php index cbe19de54a..9abc7c4396 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -43,11 +43,11 @@ function bbcode($Text,$preserve_nl = false) { // Perform URL Search - $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/", '$1<a href="$2" target="external-link">$2</a>', $Text); + $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="external-link">$2</a>', $Text); - $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/m", '<a href="$1" target="external-link">$1</a>', $Text); - $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/m", '<a href="$1" target="external-link">$2</a>', $Text); - //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/m", '<a href="$1" target="_blank">$2</a>', $Text); + $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="external-link">$1</a>', $Text); + $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="external-link">$2</a>', $Text); + //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text); // Perform MAIL Search @@ -95,7 +95,7 @@ function bbcode($Text,$preserve_nl = false) { // $Text = str_replace("[*]", "<li>", $Text); // Check for font change text - $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/m","<span style=\"font-family: $1;\">$2</span>",$Text); + $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text); // Declare the format for [code] layout diff --git a/mod/item.php b/mod/item.php index cad72122b8..e5d4eea820 100644 --- a/mod/item.php +++ b/mod/item.php @@ -336,9 +336,9 @@ function item_post(&$a) { // embedded bookmark in post? convert to regular url and set bookmark flag $bookmark = 0; - if(preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/m",$body,$match)) { + if(preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",$body,$match)) { $bookmark = 1; - $body = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/m",'[url=$1]$2[/url]',$body); + $body = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$body); } @@ -346,7 +346,7 @@ function item_post(&$a) { * Fold multi-line [code] sequences */ - $body = preg_replace('/\[\/code\]\s*\[code\]/m',"\n",$body); + $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body); /** * Look for any tags and linkify them From deeae7bdb5dffcdb8f11a604d7ca3078cfadf754 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 15:23:36 -0700 Subject: [PATCH 31/69] diaspora markdown changes, parse_url format change --- boot.php | 2 +- include/bb2diaspora.php | 27 +++++---------------------- library/markdown.php | 2 +- view/theme/dispy/jot-header.tpl | 2 +- 4 files changed, 8 insertions(+), 25 deletions(-) diff --git a/boot.php b/boot.php index b38855f358..61384a4276 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.3.1109' ); +define ( 'FRIENDIKA_VERSION', '2.3.1110' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1091 ); diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 5b240bdd24..3d6408bcfe 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -3,30 +3,14 @@ require_once("include/oembed.php"); require_once('include/event.php'); - - +require_once('library/markdown.php'); +require_once('include/html2bbcode.php'); function diaspora2bb($s) { - // bug #127 - $s = preg_replace('/\[(.+?)\]\((.+?)[^\\\]_(.+?)\)/','[$1]($2\\_$3)',$s); - - - $s = str_replace(array('\\**','\\__','\\*','\\_'), array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'),$s); - $s = preg_replace("/\*\*\*(.+?)\*\*\*/", '[b][i]$1[/i][/b]', $s); - $s = preg_replace("/\_\_\_(.+?)\_\_\_/", '[b][i]$1[/i][/b]', $s); - $s = preg_replace("/\*\*(.+?)\*\*/", '[b]$1[/b]', $s); - $s = preg_replace("/\_\_(.+?)\_\_/", '[b]$1[/b]', $s); - $s = preg_replace("/\*(.+?)\*/", '[i]$1[/i]', $s); - $s = preg_replace("/\_(.+?)\_/", '[i]$1[/i]', $s); - - $s = str_replace(array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'), array('**','__','*','_'), $s); - $s = preg_replace('/\!\[(.+?)\]\((.+?)\)/','[img]$2[/img]',$s); - $s = preg_replace('/\[(.+?)\]\((.+?)\)/','[url=$2]$1[/url]',$s); $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s); - - - $s = escape_tags($s); + $s = Markdown($s); + $s = html2bbcode($s); return $s; } @@ -188,8 +172,7 @@ function bb2diaspora($Text,$preserve_nl = false) { $Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text); - $Text = preg_replace('/\[(.*?)\\\\_(.*?)\]\((.*?)\)/ism','[$1_$2]($3)',$Text); - $Text = preg_replace('/\[(.*?)\\\\\*(.*?)\]\((.*?)\)/ism','[$1*$2]($3)',$Text); + $Text = preg_replace('/\[(.*?)\]\((.*?)\\\\_(.*?)\)/ism','[$1]($2_$3)',$Text); call_hooks('bb2diaspora',$Text); diff --git a/library/markdown.php b/library/markdown.php index d51dceecaf..343153186a 100644 --- a/library/markdown.php +++ b/library/markdown.php @@ -1528,7 +1528,7 @@ class Markdown_Parser { | <\?.*?\?> | <%.*?%> # processing instruction | - <[/!$]?[-a-zA-Z0-9:]+ # regular tags + <[/!$]?[-a-zA-Z0-9:_]+ # regular tags (?> \s (?>[^"\'>]+|"[^"]*"|\'[^\']*\')* diff --git a/view/theme/dispy/jot-header.tpl b/view/theme/dispy/jot-header.tpl index 1555950561..dd07dc318a 100644 --- a/view/theme/dispy/jot-header.tpl +++ b/view/theme/dispy/jot-header.tpl @@ -163,7 +163,7 @@ function initEditor(cb) { if(reply && reply.length) { reply = bin2hex(reply); $('#profile-rotator').show(); - $.get('parse_url?url=' + reply, function(data) { + $.get('parse_url?binurl=' + reply, function(data) { tinyMCE.execCommand('mceInsertRawHTML',false,data); $('#profile-rotator').hide(); }); From 1c8e89bd032d15cdabca98d5ae9c8032ed3dd497 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 16:31:45 -0700 Subject: [PATCH 32/69] social bookmark API, oexchange enhancements --- include/text.php | 57 +++++++++++++++++++++++++++++++++++++++++++++++ mod/parse_url.php | 25 ++++++++++++++++----- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/include/text.php b/include/text.php index 501121c802..9ed6d23bfb 100644 --- a/include/text.php +++ b/include/text.php @@ -922,3 +922,60 @@ function base64url_decode($s) { function cc_license() { return '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>'; } + +if (!function_exists('str_getcsv')) { + function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') { + if (is_string($input) && !empty($input)) { + $output = array(); + $tmp = preg_split("/".$eol."/",$input); + if (is_array($tmp) && !empty($tmp)) { + while (list($line_num, $line) = each($tmp)) { + if (preg_match("/".$escape.$enclosure."/",$line)) { + while ($strlen = strlen($line)) { + $pos_delimiter = strpos($line,$delimiter); + $pos_enclosure_start = strpos($line,$enclosure); + if ( + is_int($pos_delimiter) && is_int($pos_enclosure_start) + && ($pos_enclosure_start < $pos_delimiter) + ) { + $enclosed_str = substr($line,1); + $pos_enclosure_end = strpos($enclosed_str,$enclosure); + $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end); + $output[$line_num][] = $enclosed_str; + $offset = $pos_enclosure_end+3; + } else { + if (empty($pos_delimiter) && empty($pos_enclosure_start)) { + $output[$line_num][] = substr($line,0); + $offset = strlen($line); + } else { + $output[$line_num][] = substr($line,0,$pos_delimiter); + $offset = ( + !empty($pos_enclosure_start) + && ($pos_enclosure_start < $pos_delimiter) + ) + ?$pos_enclosure_start + :$pos_delimiter+1; + } + } + $line = substr($line,$offset); + } + } else { + $line = preg_split("/".$delimiter."/",$line); + + /* + * Validating against pesky extra line breaks creating false rows. + */ + if (is_array($line) && !empty($line[0])) { + $output[$line_num] = $line; + } + } + } + return $output; + } else { + return false; + } + } else { + return false; + } + } +} \ No newline at end of file diff --git a/mod/parse_url.php b/mod/parse_url.php index 89ef24f876..a238ecb2f9 100644 --- a/mod/parse_url.php +++ b/mod/parse_url.php @@ -3,9 +3,14 @@ require_once('library/HTML5/Parser.php'); require_once('library/HTMLPurifier.auto.php'); +function arr_add_hashes(&$item,$k) { + $item = '#' . $item; +} + function parse_url_content(&$a) { $text = null; + $str_tags = ''; if(x($_GET,'binurl')) $url = trim(hex2bin($_GET['binurl'])); @@ -15,8 +20,16 @@ function parse_url_content(&$a) { if($_GET['title']) $title = strip_tags(trim($_GET['title'])); - if($_GET['desc']) - $text = strip_tags(trim($_GET['desc'])); + if($_GET['description']) + $text = strip_tags(trim($_GET['description'])); + + if($_GET['tags']) { + $arr_tags = str_getcsv($_GET['tags']); + if(count($arr_tags)) { + array_walk($arr_tags,'arr_add_hashes'); + $str_tags = '<br />' . implode(' ',$arr_tags) . '<br />'; + } + } logger('parse_url: ' . $url); @@ -38,7 +51,7 @@ function parse_url_content(&$a) { $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />'; $title = str_replace(array("\r","\n"),array('',''),$title); - $result = sprintf($template,$url,($title) ? $title : $url,$text); + $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; logger('parse_url (unparsed): returns: ' . $result); @@ -57,7 +70,7 @@ function parse_url_content(&$a) { logger('parse_url: data: ' . $s, LOGGER_DATA); if(! $s) { - echo sprintf($template,$url,$url,''); + echo sprintf($template,$url,$url,'') . $str_tags; killme(); } @@ -80,7 +93,7 @@ function parse_url_content(&$a) { $dom = @HTML5_Parser::parse($s); if(! $dom) { - echo sprintf($template,$url,$url,''); + echo sprintf($template,$url,$url,'') . $str_tags; killme(); } @@ -148,7 +161,7 @@ function parse_url_content(&$a) { $title = str_replace(array("\r","\n"),array('',''),$title); - $result = sprintf($template,$url,($title) ? $title : $url,$text); + $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; logger('parse_url: returns: ' . $result); From f681535ccfd09efa3d1ec1a88fe12583bc3ad225 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 16:57:05 -0700 Subject: [PATCH 33/69] oexchange updates to new bookmark API --- mod/oexchange.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mod/oexchange.php b/mod/oexchange.php index 1a990c64f1..53dce6446a 100644 --- a/mod/oexchange.php +++ b/mod/oexchange.php @@ -28,9 +28,16 @@ function oexchange_content(&$a) { return; } - $url = (((x($_GET,'url')) && strlen($_GET['url'])) ? notags(trim($_GET['url'])) : ''); + $url = (((x($_GET,'url')) && strlen($_GET['url'])) + ? urlencode(notags(trim($_GET['url']))) : ''); + $title = (((x($_GET,'title')) && strlen($_GET['title'])) + ? '&title=' . urlencode(notags(trim($_GET['title']))) : ''); + $description = (((x($_GET,'description')) && strlen($_GET['description'])) + ? '&description=' . urlencode(notags(trim($_GET['description']))) : ''); + $tags = (((x($_GET,'tags')) && strlen($_GET['tags'])) + ? '&tags=' . urlencode(notags(trim($_GET['tags']))) : ''); - $s = fetch_url($a->get_baseurl() . '/parse_url&url=' . $url); + $s = fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags); if(! strlen($s)) return; From 38444aedd732d65b2df57c9ebce712dfd53fbf4d Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 17:56:44 -0700 Subject: [PATCH 34/69] improvements to Twitter probe --- include/Scrape.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/Scrape.php b/include/Scrape.php index 0115bf2e71..fd41b7bc64 100644 --- a/include/Scrape.php +++ b/include/Scrape.php @@ -534,6 +534,9 @@ function probe_url($url, $mode = PROBE_NORMAL) { else $poll = $tapi . '?screen_name=' . $tid; $profile = 'http://twitter.com/#!/' . $tid; + $vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid; + $vcard['nick'] = $tid; + $vcar['fn'] = $tid . '@twitter'; } if(! x($vcard,'fn')) From 8294dde936349a58e2c1a974768f5662f2ca9c2e Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 17:59:18 -0700 Subject: [PATCH 35/69] typo in Twitter probe update --- include/Scrape.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Scrape.php b/include/Scrape.php index fd41b7bc64..a55608c2d5 100644 --- a/include/Scrape.php +++ b/include/Scrape.php @@ -536,7 +536,7 @@ function probe_url($url, $mode = PROBE_NORMAL) { $profile = 'http://twitter.com/#!/' . $tid; $vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid; $vcard['nick'] = $tid; - $vcar['fn'] = $tid . '@twitter'; + $vcard['fn'] = $tid . '@twitter'; } if(! x($vcard,'fn')) From 9115e9c90b749e1739d412df2d63ae96e0b89b3e Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Tue, 20 Sep 2011 18:07:33 -0700 Subject: [PATCH 36/69] no need to scrape Twitter profile photo from page - it's no longer there. --- include/Scrape.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/include/Scrape.php b/include/Scrape.php index a55608c2d5..2af02fff5e 100644 --- a/include/Scrape.php +++ b/include/Scrape.php @@ -249,20 +249,6 @@ function scrape_feed($url) { return $ret; - $items = $dom->getElementsByTagName('img'); - - // get img elements (twitter) - - if($items) { - foreach($items as $item) { - $x = $item->getAttribute('id'); - if($x === 'profile-image') { - $ret['photo'] = $item->getAttribute('src'); - } - } - } - - $head = $dom->getElementsByTagName('base'); if($head) { foreach($head as $head0) { From 11ca81adbaa033123ca1aa2c354fb3be6f5225d0 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Wed, 21 Sep 2011 05:43:26 -0700 Subject: [PATCH 37/69] keychecks --- include/bb2diaspora.php | 4 ++++ mod/dfrn_notify.php | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 3d6408bcfe..c72c784453 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -11,6 +11,10 @@ function diaspora2bb($s) { $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s); $s = Markdown($s); $s = html2bbcode($s); + +// $s = preg_replace('/\[url=(.+?)\<em\>(.+?)\]/ism','[url=$1_$2]',$s); +// $s = preg_replace('/\[url=(.+?)\<\/em\>(.+?)\]/ism','[url=$1_$2]',$s); + return $s; } diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index 870e4f2fba..23bdd7388e 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -849,10 +849,12 @@ function dfrn_notify_content(&$a) { openssl_private_encrypt($hash,$challenge,$prv_key); openssl_private_encrypt($id_str,$encrypted_id,$prv_key); } - else { + elseif(strlen($pub_key)) { openssl_public_encrypt($hash,$challenge,$pub_key); openssl_public_encrypt($id_str,$encrypted_id,$pub_key); } + else + $status = 1; $challenge = bin2hex($challenge); $encrypted_id = bin2hex($encrypted_id); From c63adcfae061809ce25217207f638b1e6c1d1bee Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Wed, 21 Sep 2011 07:09:37 -0700 Subject: [PATCH 38/69] bug #159 multiple definition of string_plural_form function when changing languages --- include/pgettext.php | 10 +- util/po2php.php | 11 +- view/cs/strings.php | 2 +- view/de/strings.php | 8 +- view/es/strings.php | 536 ++++++++++++++++++++++++++++++++++++++++- view/fr/strings.php | 2 +- view/it/strings.php | 2 +- view/pt-br/strings.php | 2 +- view/ru/strings.php | 2 +- 9 files changed, 551 insertions(+), 24 deletions(-) diff --git a/include/pgettext.php b/include/pgettext.php index 49f1007370..c7fc586982 100644 --- a/include/pgettext.php +++ b/include/pgettext.php @@ -90,8 +90,11 @@ if(! function_exists('load_translation_table')) { function load_translation_table($lang) { global $a; - if(file_exists("view/$lang/strings.php")) + if(file_exists("view/$lang/strings.php")) { include("view/$lang/strings.php"); + } + else + $a->strings = array(); }} // translate string if translation exists @@ -110,12 +113,13 @@ function t($s) { if(! function_exists('tt')){ function tt($singular, $plural, $count){ - + global $lang; $a = get_app(); if(x($a->strings,$singular)) { $t = $a->strings[$singular]; - $k = string_plural_select($count); + $f = 'string_plural_select_' . str_replace('-','_',$lang); + $k = $f($count); return is_array($t)?$t[$k]:$t; } diff --git a/util/po2php.php b/util/po2php.php index 1a86bb38d0..c703172af7 100644 --- a/util/po2php.php +++ b/util/po2php.php @@ -10,7 +10,14 @@ function po2php_run($argv, $argc) { $pofile = $argv[1]; $outfile = dirname($pofile)."/strings.php"; - + + if(strstr($outfile,'util')) + $lang = 'en'; + else + $lang = str_replace('-','_',basename(dirname($pofile))); + + + if (!file_exists($pofile)){ print "Unable to find '$pofile'\n"; return; @@ -37,7 +44,7 @@ function po2php_run($argv, $argc) { $match=Array(); preg_match("|nplurals=([0-9]*); *plural=(.*)[;\\\\]|", $l, $match); $cond = str_replace('n','$n',$match[2]); - $out .= 'function string_plural_select($n){'."\n"; + $out .= 'function string_plural_select_' . $lang . '($n){'."\n"; $out .= ' return '.$cond.';'."\n"; $out .= '}'."\n"; } diff --git a/view/cs/strings.php b/view/cs/strings.php index 38f3041b79..0c7d0d7bd8 100644 --- a/view/cs/strings.php +++ b/view/cs/strings.php @@ -1,6 +1,6 @@ <?php -function string_plural_select($n){ +function string_plural_select_cs($n){ return ($n==1) ? 0 : ($n>=2 && $n<=4) ? 1 : 2; } ; diff --git a/view/de/strings.php b/view/de/strings.php index affae0bfe7..f46580e551 100644 --- a/view/de/strings.php +++ b/view/de/strings.php @@ -1,6 +1,6 @@ <?php -function string_plural_select($n){ +function string_plural_select_de($n){ return ($n != 1); } ; @@ -380,8 +380,8 @@ $a->strings["View New Items"] = "Neue Einträge anzeigen"; $a->strings["View Any Items"] = "Alle Einträge anzeigen"; $a->strings["View Starred Items"] = "Gesternte Einträge anzeigen"; $a->strings["Warning: This group contains %s member from an insecure network."] = array( - 0 => "Warnung: Diese Gruppe beinhaltet %s Mitglied aus unsicheren Netzwerken.", - 1 => "Warnung: Diese Gruppe beinhaltet %s Mitglieder aus unsicheren Netzwerken.", + 0 => "", + 1 => "", ); $a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."; $a->strings["No such group"] = "Es gibt keine solche Gruppe"; @@ -603,7 +603,7 @@ $a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert."; $a->strings["Clear"] = "löschen"; $a->strings["Debugging"] = "Protokoll führen"; $a->strings["Log file"] = "Protokolldatei"; -$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas index.php."; +$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas indes.php."; $a->strings["Log level"] = "Protokollevel"; $a->strings["Close"] = "Schließen"; $a->strings["FTP Host"] = "FTP Host"; diff --git a/view/es/strings.php b/view/es/strings.php index 8e7a8fe112..4044755a54 100644 --- a/view/es/strings.php +++ b/view/es/strings.php @@ -1,20 +1,17 @@ <?php -function string_plural_select($n){ - return ($n != 1); -} ; $a->strings["Not Found"] = "No se ha encontrado"; -$a->strings["Page not found."] = "Página no encontrada."; +$a->strings["Page not found."] = "Página no encontrada."; $a->strings["Permission denied"] = "Permiso denegado"; $a->strings["Permission denied."] = "Permiso denegado."; -$a->strings["Create a New Account"] = "Crea una nueva cuenta"; +$a->strings["Create a New Account"] = "Crear una nueva cuenta"; $a->strings["Register"] = "Registrarse"; $a->strings["Nickname or Email address: "] = "Apodo o dirección de email: "; -$a->strings["Password: "] = "Contraseña: "; +$a->strings["Password: "] = "Contraseña: "; $a->strings["Login"] = "Acceder"; $a->strings["Nickname/Email/OpenID: "] = "Apodo/Email/OpenID: "; -$a->strings["Password (if not OpenID): "] = "Contraseña (si no OpenID): "; +$a->strings["Password (if not OpenID): "] = "Contraseña (si no OpenID): "; $a->strings["Forgot your password?"] = "¿Olvidó la contraseña?"; $a->strings["Password Reset"] = "Resetear la contraseña"; $a->strings["Logout"] = "Salir"; @@ -34,7 +31,7 @@ $a->strings["No contacts"] = "Nigún contacto"; $a->strings["Contacts"] = "Contactos"; $a->strings["View Contacts"] = "Ver contactos"; $a->strings["Search"] = "Busca"; -$a->strings["No profile"] = "Nigún perfil"; +$a->strings["No profile"] = "Nigún perfil"; $a->strings["Connect"] = "Conecta"; $a->strings["Location:"] = "Ubicación:"; $a->strings[", "] = ", "; @@ -329,9 +326,9 @@ $a->strings["Please login to confirm introduction."] = "Inicia sesión para conf $a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Inicio de sesión con la identificación incorrecta. Entra en <strong>este</ strong> perfil."; $a->strings["[Name Withheld]"] = "[Nombre oculto]"; $a->strings["Introduction received at "] = "Presentación recibida en"; -$a->strings["Friend/Connection Request"] = "Solicitud de Amistad/Conexión"; +$a->strings["Friend/Connection Request"] = "Solicitud de Amistad/Conexión"; $a->strings["Please answer the following:"] = "Por favor responda lo siguiente:"; -$a->strings["Does \$name know you?"] = "\$name te conoce?"; +$a->strings["Does \$name know you?"] = "$name te conoce?"; $a->strings["Add a personal note:"] = "Agregar una nota personal:"; $a->strings["Please enter your profile address from one of the following supported social networks:"] = "Por favor, introduzca su dirección de perfil de uno de las siguientes redes sociales soportadas:"; $a->strings["Friendika"] = "Friendika"; @@ -577,3 +574,522 @@ $a->strings["%d Contact"] = array( 0 => "%d Contacto", 1 => "%d Contactos", ); +$a->strings["Post successful."] = ""; +$a->strings["Contact settings applied."] = ""; +$a->strings["Contact update failed."] = ""; +$a->strings["Repair Contact Settings"] = ""; +$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working."] = ""; +$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = ""; +$a->strings["Name"] = ""; +$a->strings["Account Nickname"] = ""; +$a->strings["@Tagname - overrides Name/Nickname"] = ""; +$a->strings["Account URL"] = ""; +$a->strings["Friend Request URL"] = ""; +$a->strings["Friend Confirm URL"] = ""; +$a->strings["Notification Endpoint URL"] = ""; +$a->strings["Poll/Feed URL"] = ""; +$a->strings["Help:"] = ""; +$a->strings["Help"] = ""; +$a->strings["File exceeds size limit of %d"] = ""; +$a->strings["File upload failed."] = ""; +$a->strings["Friend suggestion sent."] = ""; +$a->strings["Suggest Friends"] = ""; +$a->strings["Suggest a friend for %s"] = ""; +$a->strings["Status"] = ""; +$a->strings["Profile"] = ""; +$a->strings["Photos"] = ""; +$a->strings["Events"] = ""; +$a->strings["Personal Notes"] = ""; +$a->strings["Create New Event"] = ""; +$a->strings["Previous"] = ""; +$a->strings["Next"] = ""; +$a->strings["l, F j"] = ""; +$a->strings["Edit event"] = ""; +$a->strings["hour:minute"] = ""; +$a->strings["Event details"] = ""; +$a->strings["Format is %s %s. Starting date and Description are required."] = ""; +$a->strings["Event Starts:"] = ""; +$a->strings["Finish date/time is not known or not relevant"] = ""; +$a->strings["Event Finishes:"] = ""; +$a->strings["Adjust for viewer timezone"] = ""; +$a->strings["Description:"] = ""; +$a->strings["Share this event"] = ""; +$a->strings["everybody"] = ""; +$a->strings["Image file is empty."] = ""; +$a->strings["Public access denied."] = ""; +$a->strings["Access to this item is restricted."] = ""; +$a->strings["Comment"] = ""; +$a->strings["Not available."] = ""; +$a->strings["Community"] = ""; +$a->strings["Post to Email"] = ""; +$a->strings["Attach file"] = ""; +$a->strings["Public post"] = ""; +$a->strings["Welcome home %s."] = ""; +$a->strings["Please confirm your introduction/connection request to %s."] = ""; +$a->strings["Confirm"] = ""; +$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = ""; +$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = ""; +$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = ""; +$a->strings["Does %s know you?"] = ""; +$a->strings["Diaspora"] = ""; +$a->strings["- please share from your own site as noted above"] = ""; +$a->strings["Your Identity Address:"] = ""; +$a->strings["Proceed with Installation"] = ""; +$a->strings["Your Friendika site database has been installed."] = ""; +$a->strings["Proceed to registration"] = ""; +$a->strings["Friendika Social Network"] = ""; +$a->strings["Installation"] = ""; +$a->strings["In order to install Friendika we need to know how to connect to your database."] = ""; +$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = ""; +$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = ""; +$a->strings["Database Server Name"] = ""; +$a->strings["Database Login Name"] = ""; +$a->strings["Database Login Password"] = ""; +$a->strings["Database Name"] = ""; +$a->strings["Please select a default timezone for your website"] = ""; +$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = ""; +$a->strings["Error: mb_string PHP module required but not installed."] = ""; +$a->strings["l F d, Y \\@ g:i A"] = ""; +$a->strings["Time Conversion"] = ""; +$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = ""; +$a->strings["Converted localtime: %s"] = ""; +$a->strings["UTC time: %s"] = ""; +$a->strings["Please select your timezone:"] = ""; +$a->strings["[Embedded content - reload page to view]"] = ""; +$a->strings["Profile Match"] = ""; +$a->strings["No keywords to match. Please add keywords to your default profile."] = ""; +$a->strings["No matches"] = ""; +$a->strings["Pending Friend/Connect Notifications"] = ""; +$a->strings["Friend Suggestion"] = ""; +$a->strings["suggested by %s"] = ""; +$a->strings["Sharer"] = ""; +$a->strings["%d invitation available"] = array( + 0 => "", + 1 => "", +); +$a->strings["Find People With Shared Interests"] = ""; +$a->strings["Privacy Unavailable"] = ""; +$a->strings["Private communications are not available for this contact."] = ""; +$a->strings["Suggest friends"] = ""; +$a->strings["Network type: %s"] = ""; +$a->strings["Profile Visibility"] = ""; +$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = ""; +$a->strings["Contact Information / Notes"] = ""; +$a->strings["Online Reputation"] = ""; +$a->strings["Occasionally your friends may wish to inquire about this person's online legitimacy."] = ""; +$a->strings["You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them."] = ""; +$a->strings["Please take a moment to elaborate on this selection if you feel it could be helpful to others."] = ""; +$a->strings["Visit %s's profile [%s]"] = ""; +$a->strings["Repair contact URL settings"] = ""; +$a->strings["Repair contact URL settings (WARNING: Advanced)"] = ""; +$a->strings["View conversations"] = ""; +$a->strings["No valid account found."] = ""; +$a->strings["Password reset request issued. Check your email."] = ""; +$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = ""; +$a->strings["Your password has been reset as requested."] = ""; +$a->strings["Your new password is"] = ""; +$a->strings["Save or copy your new password - and then"] = ""; +$a->strings["click here to login"] = ""; +$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = ""; +$a->strings["Forgot your Password?"] = ""; +$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = ""; +$a->strings["Nickname or Email: "] = ""; +$a->strings["Reset"] = ""; +$a->strings["Failed to connect with email account using the settings provided."] = ""; +$a->strings["Account settings"] = ""; +$a->strings["Plugin settings"] = ""; +$a->strings["Normal Account"] = ""; +$a->strings["This account is a normal personal profile"] = ""; +$a->strings["Soapbox Account"] = ""; +$a->strings["Automatically approve all connection/friend requests as read-only fans"] = ""; +$a->strings["Community/Celebrity Account"] = ""; +$a->strings["Automatically approve all connection/friend requests as read-write fans"] = ""; +$a->strings["Automatic Friend Account"] = ""; +$a->strings["Automatically approve all connection/friend requests as friends"] = ""; +$a->strings["OpenID:"] = ""; +$a->strings["(Optional) Allow this OpenID to login to this account."] = ""; +$a->strings["Publish your default profile in your local site directory?"] = ""; +$a->strings["Publish your default profile in the global social directory?"] = ""; +$a->strings["Hide your contact/friend list from viewers of your default profile?"] = ""; +$a->strings["Hide profile details and all your messages from unknown viewers?"] = ""; +$a->strings["or"] = ""; +$a->strings["Your Identity Address is"] = ""; +$a->strings["Export Personal Data"] = ""; +$a->strings["Password Settings"] = ""; +$a->strings["New Password:"] = ""; +$a->strings["Confirm:"] = ""; +$a->strings["Leave password fields blank unless changing"] = ""; +$a->strings["Basic Settings"] = ""; +$a->strings["Full Name:"] = ""; +$a->strings["Email Address:"] = ""; +$a->strings["Your Timezone:"] = ""; +$a->strings["Default Post Location:"] = ""; +$a->strings["Use Browser Location:"] = ""; +$a->strings["Display Theme:"] = ""; +$a->strings["Security and Privacy Settings"] = ""; +$a->strings["Maximum Friend Requests/Day:"] = ""; +$a->strings["(to prevent spam abuse)"] = ""; +$a->strings["(click to open/close)"] = ""; +$a->strings["Allow friends to post to your profile page:"] = ""; +$a->strings["Automatically expire posts after days:"] = ""; +$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = ""; +$a->strings["Notification Settings"] = ""; +$a->strings["Send a notification email when:"] = ""; +$a->strings["You receive an introduction"] = ""; +$a->strings["Your introductions are confirmed"] = ""; +$a->strings["Someone writes on your profile wall"] = ""; +$a->strings["Someone writes a followup comment"] = ""; +$a->strings["You receive a private message"] = ""; +$a->strings["Email/Mailbox Setup"] = ""; +$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = ""; +$a->strings["Last successful email check:"] = ""; +$a->strings["Email access is disabled on this site."] = ""; +$a->strings["IMAP server name:"] = ""; +$a->strings["IMAP port:"] = ""; +$a->strings["Security:"] = ""; +$a->strings["None"] = ""; +$a->strings["Email login name:"] = ""; +$a->strings["Email password:"] = ""; +$a->strings["Reply-to address:"] = ""; +$a->strings["Send public posts to all email contacts:"] = ""; +$a->strings["Advanced Page Settings"] = ""; +$a->strings["View Conversations"] = ""; +$a->strings["View New Items"] = ""; +$a->strings["View Any Items"] = ""; +$a->strings["View Starred Items"] = ""; +$a->strings["View Bookmarks"] = ""; +$a->strings["Saved Searches"] = ""; +$a->strings["Remove term"] = ""; +$a->strings["Warning: This group contains %s member from an insecure network."] = array( + 0 => "", + 1 => "", +); +$a->strings["Private messages to this group are at risk of public disclosure."] = ""; +$a->strings["Contact: "] = ""; +$a->strings["Private messages to this person are at risk of public disclosure."] = ""; +$a->strings["Invalid contact."] = ""; +$a->strings["Save"] = ""; +$a->strings["Welcome to Friendika"] = ""; +$a->strings["New Member Checklist"] = ""; +$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = ""; +$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = ""; +$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = ""; +$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = ""; +$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = ""; +$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = ""; +$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = ""; +$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = ""; +$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = ""; +$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = ""; +$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = ""; +$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = ""; +$a->strings["Item not available."] = ""; +$a->strings["Item was not found."] = ""; +$a->strings["Create a group of contacts/friends."] = ""; +$a->strings["Group Name: "] = ""; +$a->strings["Click on a contact to add or remove."] = ""; +$a->strings["Group Editor"] = ""; +$a->strings["Members"] = ""; +$a->strings["All Contacts"] = ""; +$a->strings["Invalid profile identifier."] = ""; +$a->strings["Profile Visibility Editor"] = ""; +$a->strings["Visible To"] = ""; +$a->strings["All Contacts (with secure profile access)"] = ""; +$a->strings["An invitation is required."] = ""; +$a->strings["Invitation could not be verified."] = ""; +$a->strings["That doesn't appear to be your full (First Last) name."] = ""; +$a->strings["Membership on this site is by invitation only."] = ""; +$a->strings["Your invitation ID: "] = ""; +$a->strings["This is Friendika version"] = ""; +$a->strings["running at web location"] = ""; +$a->strings["Shared content within the Friendika network is provided under the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0 license</a>"] = ""; +$a->strings["Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn more about the Friendika project."] = ""; +$a->strings["Bug reports and issues: please visit"] = ""; +$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - dot com"] = ""; +$a->strings["Installed plugins/addons/apps"] = ""; +$a->strings["No installed plugins/addons/apps"] = ""; +$a->strings["Administrator@"] = ""; +$a->strings["%s posted to your profile wall at %s"] = ""; +$a->strings["You may visit them online at %s"] = ""; +$a->strings["Upload File:"] = ""; +$a->strings["Upload Profile Photo"] = ""; +$a->strings["Upload"] = ""; +$a->strings["skip this step"] = ""; +$a->strings["select a photo from your photo albums"] = ""; +$a->strings["Crop Image"] = ""; +$a->strings["Please adjust the image cropping for optimum viewing."] = ""; +$a->strings["Done Editing"] = ""; +$a->strings["Please enter a link URL:"] = ""; +$a->strings["D, d M Y - g:i A"] = ""; +$a->strings["Site"] = ""; +$a->strings["Users"] = ""; +$a->strings["Plugins"] = ""; +$a->strings["Update"] = ""; +$a->strings["Logs"] = ""; +$a->strings["User registrations waiting for confirmation"] = ""; +$a->strings["Administration"] = ""; +$a->strings["Summary"] = ""; +$a->strings["Registered users"] = ""; +$a->strings["Pending registrations"] = ""; +$a->strings["Version"] = ""; +$a->strings["Active plugins"] = ""; +$a->strings["Site settings updated."] = ""; +$a->strings["Closed"] = ""; +$a->strings["Requires approval"] = ""; +$a->strings["Open"] = ""; +$a->strings["File upload"] = ""; +$a->strings["Policies"] = ""; +$a->strings["Advanced"] = ""; +$a->strings["Site name"] = ""; +$a->strings["Banner/Logo"] = ""; +$a->strings["System language"] = ""; +$a->strings["System theme"] = ""; +$a->strings["Maximum image size"] = ""; +$a->strings["Register policy"] = ""; +$a->strings["Register text"] = ""; +$a->strings["Allowed friend domains"] = ""; +$a->strings["Allowed email domains"] = ""; +$a->strings["Block public"] = ""; +$a->strings["Force publish"] = ""; +$a->strings["Global directory update URL"] = ""; +$a->strings["Block multiple registrations"] = ""; +$a->strings["OpenID support"] = ""; +$a->strings["Gravatar support"] = ""; +$a->strings["Fullname check"] = ""; +$a->strings["UTF-8 Regular expressions"] = ""; +$a->strings["Show Community Page"] = ""; +$a->strings["Enable OStatus support"] = ""; +$a->strings["Enable Diaspora support"] = ""; +$a->strings["Only allow Friendika contacts"] = ""; +$a->strings["Verify SSL"] = ""; +$a->strings["Proxy user"] = ""; +$a->strings["Proxy URL"] = ""; +$a->strings["Network timeout"] = ""; +$a->strings["%s user blocked"] = array( + 0 => "", + 1 => "", +); +$a->strings["%s user deleted"] = array( + 0 => "", + 1 => "", +); +$a->strings["User '%s' deleted"] = ""; +$a->strings["User '%s' unblocked"] = ""; +$a->strings["User '%s' blocked"] = ""; +$a->strings["select all"] = ""; +$a->strings["User registrations waiting for confirm"] = ""; +$a->strings["Request date"] = ""; +$a->strings["Email"] = ""; +$a->strings["Deny"] = ""; +$a->strings["Block"] = ""; +$a->strings["Unblock"] = ""; +$a->strings["Register date"] = ""; +$a->strings["Last login"] = ""; +$a->strings["Last item"] = ""; +$a->strings["Account"] = ""; +$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = ""; +$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = ""; +$a->strings["Plugin %s disabled."] = ""; +$a->strings["Plugin %s enabled."] = ""; +$a->strings["Disable"] = ""; +$a->strings["Enable"] = ""; +$a->strings["Toggle"] = ""; +$a->strings["Log settings updated."] = ""; +$a->strings["Clear"] = ""; +$a->strings["Debugging"] = ""; +$a->strings["Log file"] = ""; +$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = ""; +$a->strings["Log level"] = ""; +$a->strings["Close"] = ""; +$a->strings["FTP Host"] = ""; +$a->strings["FTP Path"] = ""; +$a->strings["FTP User"] = ""; +$a->strings["FTP Password"] = ""; +$a->strings["Access to this profile has been restricted."] = ""; +$a->strings["Tips for New Members"] = ""; +$a->strings["Welcome "] = ""; +$a->strings["Please upload a profile photo."] = ""; +$a->strings["This site is not configured to allow communications with other networks."] = ""; +$a->strings["No compatible communication protocols or feeds were discovered."] = ""; +$a->strings["An author or name was not found."] = ""; +$a->strings["No browser URL could be matched to this address."] = ""; +$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = ""; +$a->strings["No installed applications."] = ""; +$a->strings["Hide your contact/friend list from viewers of this profile?"] = ""; +$a->strings["Edit Profile Details"] = ""; +$a->strings["View this profile"] = ""; +$a->strings["Create a new profile using these settings"] = ""; +$a->strings["Clone this profile"] = ""; +$a->strings["Delete this profile"] = ""; +$a->strings["Profile Name:"] = ""; +$a->strings["Your Full Name:"] = ""; +$a->strings["Title/Description:"] = ""; +$a->strings["Your Gender:"] = ""; +$a->strings["Birthday (%s):"] = ""; +$a->strings["Street Address:"] = ""; +$a->strings["Locality/City:"] = ""; +$a->strings["Postal/Zip Code:"] = ""; +$a->strings["Country:"] = ""; +$a->strings["Region/State:"] = ""; +$a->strings["<span class=\"heart\">♥</span> Marital Status:"] = ""; +$a->strings["Who: (if applicable)"] = ""; +$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = ""; +$a->strings["Sexual Preference:"] = ""; +$a->strings["Homepage URL:"] = ""; +$a->strings["Political Views:"] = ""; +$a->strings["Religious Views:"] = ""; +$a->strings["Public Keywords:"] = ""; +$a->strings["Private Keywords:"] = ""; +$a->strings["Example: fishing photography software"] = ""; +$a->strings["(Used for suggesting potential friends, can be seen by others)"] = ""; +$a->strings["(Used for searching profiles, never shown to others)"] = ""; +$a->strings["Tell us about yourself..."] = ""; +$a->strings["Hobbies/Interests"] = ""; +$a->strings["Contact information and Social Networks"] = ""; +$a->strings["Musical interests"] = ""; +$a->strings["Books, literature"] = ""; +$a->strings["Television"] = ""; +$a->strings["Film/dance/culture/entertainment"] = ""; +$a->strings["Love/romance"] = ""; +$a->strings["Work/employment"] = ""; +$a->strings["School/education"] = ""; +$a->strings["Change profile photo"] = ""; +$a->strings["Create New Profile"] = ""; +$a->strings["visible to everybody"] = ""; +$a->strings["Edit visibility"] = ""; +$a->strings["Normal site view"] = ""; +$a->strings["View all site entries"] = ""; +$a->strings["Site Directory"] = ""; +$a->strings["Gender: "] = ""; +$a->strings["No entries (some entries may be hidden)."] = ""; +$a->strings["You have no more invitations available"] = ""; +$a->strings["You will need to supply this invitation code: \$invite_code"] = ""; +$a->strings["%1\$s is now friends with %2\$s"] = ""; +$a->strings["Site public key not available in contact record for URL %s."] = ""; +$a->strings["Updating contacts"] = ""; +$a->strings["Install Facebook connector for this account."] = ""; +$a->strings["Remove Facebook connector"] = ""; +$a->strings["Link all your Facebook friends and conversations"] = ""; +$a->strings["Do not link your Facebook profile wall posts - as these could be visible to people that would not be able to see them on Facebook."] = ""; +$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = ""; +$a->strings["View on Friendika"] = ""; +$a->strings["Facebook post failed. Queued for retry."] = ""; +$a->strings["Generate new key"] = ""; +$a->strings["Widgets key"] = ""; +$a->strings["Widgets available"] = ""; +$a->strings["Connect on Friendika!"] = ""; +$a->strings["Impressum"] = ""; +$a->strings["Site Owner"] = ""; +$a->strings["Email Address"] = ""; +$a->strings["Postal Address"] = ""; +$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = ""; +$a->strings["Site Owners Profile"] = ""; +$a->strings["Notes"] = ""; +$a->strings["OEmbed settings updated"] = ""; +$a->strings["Use OEmbed for YouTube videos"] = ""; +$a->strings["URL to embed:"] = ""; +$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = ""; +$a->strings["We could not contact the StatusNet API with the Path you entered."] = ""; +$a->strings["StatusNet settings updated."] = ""; +$a->strings["Globally Available StatusNet OAuthKeys"] = ""; +$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = ""; +$a->strings["Provide your own OAuth Credentials"] = ""; +$a->strings["Cancel Connection Process"] = ""; +$a->strings["Current StatusNet API is"] = ""; +$a->strings["Cancel StatusNet Connection"] = ""; +$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = ""; +$a->strings["Allow posting to StatusNet"] = ""; +$a->strings["Send public postings to StatusNet by default"] = ""; +$a->strings["API URL"] = ""; +$a->strings["Consumer Secret"] = ""; +$a->strings["Consumer Key"] = ""; +$a->strings["Post to Wordpress"] = ""; +$a->strings["WordPress Post Settings"] = ""; +$a->strings["Enable WordPress Post Plugin"] = ""; +$a->strings["WordPress username"] = ""; +$a->strings["WordPress password"] = ""; +$a->strings["WordPress API URL"] = ""; +$a->strings["Post to WordPress by default"] = ""; +$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = ""; +$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = ""; +$a->strings["Piwik Base URL"] = ""; +$a->strings["Site ID"] = ""; +$a->strings["Show opt-out cookie link?"] = ""; +$a->strings["Twitter settings updated."] = ""; +$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = ""; +$a->strings["Allow posting to Twitter"] = ""; +$a->strings["Send public postings to Twitter by default"] = ""; +$a->strings["Consumer key"] = ""; +$a->strings["Consumer secret"] = ""; +$a->strings["j F, Y"] = ""; +$a->strings["j F"] = ""; +$a->strings["Age:"] = ""; +$a->strings["<span class=\"heart\">♥</span> Status:"] = ""; +$a->strings["Religion:"] = ""; +$a->strings["About:"] = ""; +$a->strings["Hobbies/Interests:"] = ""; +$a->strings["Contact information and Social Networks:"] = ""; +$a->strings["Musical interests:"] = ""; +$a->strings["Books, literature:"] = ""; +$a->strings["Television:"] = ""; +$a->strings["Film/dance/culture/entertainment:"] = ""; +$a->strings["Love/Romance:"] = ""; +$a->strings["Work/employment:"] = ""; +$a->strings["School/education:"] = ""; +$a->strings["OStatus"] = ""; +$a->strings["RSS/Atom"] = ""; +$a->strings["Zot!"] = ""; +$a->strings["Starts:"] = ""; +$a->strings["Finishes:"] = ""; +$a->strings["(no subject)"] = ""; +$a->strings["bytes"] = ""; +$a->strings["Select an alternate language"] = ""; +$a->strings["Sharing notification from Diaspora network"] = ""; +$a->strings["link"] = ""; +$a->strings["[Relayed] Comment authored by %s from network %s"] = ""; +$a->strings["End this session"] = ""; +$a->strings["Sign in"] = ""; +$a->strings["Home Page"] = ""; +$a->strings["Create an account"] = ""; +$a->strings["Help and documentation"] = ""; +$a->strings["Addon applications, utilities, games"] = ""; +$a->strings["Search site content"] = ""; +$a->strings["Conversations on this site"] = ""; +$a->strings["People directory"] = ""; +$a->strings["Conversations from your friends"] = ""; +$a->strings["Your posts and conversations"] = ""; +$a->strings["Friend requests"] = ""; +$a->strings["Private mail"] = ""; +$a->strings["Manage other pages"] = ""; +$a->strings["Manage/edit profiles"] = ""; +$a->strings["Manage/edit friends and contacts"] = ""; +$a->strings["Admin"] = ""; +$a->strings["Site setup and configuration"] = ""; +$a->strings["never"] = ""; +$a->strings["From: "] = ""; +$a->strings["Image/photo"] = ""; +$a->strings["Visible to everybody"] = ""; +$a->strings["show"] = ""; +$a->strings["don't show"] = ""; +$a->strings["View status"] = ""; +$a->strings["View profile"] = ""; +$a->strings["View photos"] = ""; +$a->strings["View recent"] = ""; +$a->strings["Send PM"] = ""; +$a->strings["event"] = ""; +$a->strings["View %s's profile"] = ""; +$a->strings["%s from %s"] = ""; +$a->strings["See more posts like this"] = ""; +$a->strings["See all %d comments"] = ""; +$a->strings["Select"] = ""; +$a->strings["toggle star status"] = ""; +$a->strings["Delete Selected Items"] = ""; +$a->strings["Visible to <strong>everybody</strong>"] = ""; +$a->strings["Please enter a YouTube link:"] = ""; +$a->strings["Please enter a video(.ogg) link/URL:"] = ""; +$a->strings["Please enter an audio(.ogg) link/URL:"] = ""; +$a->strings["Where are you right now?"] = ""; +$a->strings["Enter a title for this item"] = ""; +$a->strings["Set title"] = ""; +$a->strings["Delete this item?"] = ""; +$a->strings["g A l F d"] = ""; diff --git a/view/fr/strings.php b/view/fr/strings.php index cbed6eec46..654fba019c 100644 --- a/view/fr/strings.php +++ b/view/fr/strings.php @@ -1,6 +1,6 @@ <?php -function string_plural_select($n){ +function string_plural_select_fr($n){ return ($n != 1); } ; diff --git a/view/it/strings.php b/view/it/strings.php index 7d6c2e704f..3a0aed70f4 100644 --- a/view/it/strings.php +++ b/view/it/strings.php @@ -1,6 +1,6 @@ <?php -function string_plural_select($n){ +function string_plural_select_it($n){ return ($n != 1); } ; diff --git a/view/pt-br/strings.php b/view/pt-br/strings.php index 4df7930410..0cf143db49 100644 --- a/view/pt-br/strings.php +++ b/view/pt-br/strings.php @@ -1,6 +1,6 @@ <?php -function string_plural_select($n){ +function string_plural_select_pt_br($n){ return ($n > 1); } ; diff --git a/view/ru/strings.php b/view/ru/strings.php index 97904f0946..4578c37e89 100644 --- a/view/ru/strings.php +++ b/view/ru/strings.php @@ -1,6 +1,6 @@ <?php -function string_plural_select($n){ +function string_plural_select_ru($n){ return ($n%10==1 && $n%100!=11 ? 0 : $n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? 1 : 2); } ; From 030e1e82c32a3061abf71ffb90e65f2b9197d8a4 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Wed, 21 Sep 2011 15:37:16 -0700 Subject: [PATCH 39/69] finish up ability to switch languages without function collision --- boot.php | 2 +- include/pgettext.php | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index 61384a4276..d068122eda 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.3.1110' ); +define ( 'FRIENDIKA_VERSION', '2.3.1111' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1091 ); diff --git a/include/pgettext.php b/include/pgettext.php index c7fc586982..83e76ba9d6 100644 --- a/include/pgettext.php +++ b/include/pgettext.php @@ -119,6 +119,8 @@ function tt($singular, $plural, $count){ if(x($a->strings,$singular)) { $t = $a->strings[$singular]; $f = 'string_plural_select_' . str_replace('-','_',$lang); + if(! function_exists($f)) + $f = 'string_plural_select_default'; $k = $f($count); return is_array($t)?$t[$k]:$t; } @@ -128,4 +130,13 @@ function tt($singular, $plural, $count){ } else { return $singular; } -}} \ No newline at end of file +}} + +// provide a fallback which will not collide with +// a function defined in any language file + +if(! function_exists('string_plural_select_default')) { +function string_plural_select_default($n) { + return ($n != 1); +}} + From 542aa22eb94e0f20806552b83cec2e46cf3b6f1b Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Wed, 21 Sep 2011 16:00:17 -0700 Subject: [PATCH 40/69] provide ability to unset session language --- include/text.php | 6 ++++++ index.php | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/text.php b/include/text.php index 9ed6d23bfb..37af65c70d 100644 --- a/include/text.php +++ b/include/text.php @@ -847,10 +847,16 @@ function lang_selector() { $o .= '<form action="" method="post" ><select name="system_language" onchange="this.form.submit();" >'; $langs = glob('view/*/strings.php'); if(is_array($langs) && count($langs)) { + $langs[] = ''; if(! in_array('view/en/strings.php',$langs)) $langs[] = 'view/en/'; asort($langs); foreach($langs as $l) { + if($l == '') { + $default_selected = ((! x($_SESSION,'language')) ? ' selected="selected" ' : ''); + $o .= '<option value="" ' . $default_selected . '>' . t('default') . '</option>'; + continue; + } $ll = substr($l,5); $ll = substr($ll,0,strrpos($ll,'/')); $selected = (($ll === $lang) ? ' selected="selected" ' : ''); diff --git a/index.php b/index.php index 80e8ca3b02..17d250e5fb 100644 --- a/index.php +++ b/index.php @@ -84,8 +84,12 @@ session_start(); * We have to do it here because the session was just now opened. */ -if(x($_POST,'system_language')) - $_SESSION['language'] = $_POST['system_language']; +if(array_key_exists('system_language',$_POST)) { + if(strlen($_POST['system_language'])) + $_SESSION['language'] = $_POST['system_language']; + else + unset($_SESSION['language']); +} if((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) { $lang = $_SESSION['language']; load_translation_table($lang); From 9161d1832ee60aa177d8d66352de40e9aab901b6 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Wed, 21 Sep 2011 17:37:02 -0700 Subject: [PATCH 41/69] allow one to toggle into and out of photo edit mode for an entire album --- mod/photos.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mod/photos.php b/mod/photos.php index 72f2abd56c..424cc17b74 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1009,8 +1009,9 @@ function photos_content(&$a) { break; } } - $prevlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] ; - $nextlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] ; + $edit_suffix = ((($cmd === 'edit') && ($can_post)) ? '/edit' : ''); + $prevlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix; + $nextlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix; } @@ -1033,7 +1034,7 @@ function photos_content(&$a) { if($can_post && ($ph[0]['uid'] == $owner_uid)) { $tools = array( - 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/edit', t('Edit photo')), + 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? t('View photo') : t('Edit photo'))), 'profile'=>array($a->get_baseurl() . '/profile_photo/use/'.$ph[0]['resource-id'], t('Use as profile photo')), ); From a6edf2f71cdb8640ad9f9bee3f237684bd8530db Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Wed, 21 Sep 2011 18:02:54 -0700 Subject: [PATCH 42/69] don't reply to remote facebook conversations if linking is disabled --- addon/facebook/facebook.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php index 3268cb254f..37f26807c9 100644 --- a/addon/facebook/facebook.php +++ b/addon/facebook/facebook.php @@ -488,7 +488,9 @@ function facebook_post_hook(&$a,&$b) { if($b['prvnets'] && $b['private']) return; - if($b['parent']) { + $linking = ((get_pconfig(local_user(),'facebook','no_linking')) ? 0 : 1); + + if(($b['parent']) && ($linking)) { $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($b['parent']), intval(local_user()) From d6b446d63ffe589429394b5937b67ec666bbe219 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Thu, 22 Sep 2011 04:11:39 -0700 Subject: [PATCH 43/69] starting the big delivery shakeup --- boot.php | 2 +- database.sql | 4 +- include/delivery.php | 147 ++++++++++++++++++++++++------------------- include/diaspora.php | 70 ++++++++++++--------- include/items.php | 9 ++- include/notifier.php | 35 ++++++++--- include/poller.php | 12 +++- include/queue.php | 3 +- update.php | 11 +++- 9 files changed, 183 insertions(+), 110 deletions(-) diff --git a/boot.php b/boot.php index d068122eda..26b5401185 100644 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once("include/pgettext.php"); define ( 'FRIENDIKA_VERSION', '2.3.1111' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1091 ); +define ( 'DB_UPDATE_VERSION', 1092 ); define ( 'EOL', "<br />\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index cb73f732b8..08d02d67e6 100644 --- a/database.sql +++ b/database.sql @@ -469,7 +469,8 @@ CREATE TABLE IF NOT EXISTS `queue` ( `network` CHAR( 32 ) NOT NULL, `created` DATETIME NOT NULL , `last` DATETIME NOT NULL , -`content` MEDIUMTEXT NOT NULL +`content` MEDIUMTEXT NOT NULL, +`batch` TINYINT( 1 ) NOT NULL DEFAULT '0' ) ENGINE = MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `pconfig` ( @@ -534,6 +535,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` ( `request` CHAR( 255 ) NOT NULL, `nick` CHAR( 255 ) NOT NULL , `addr` CHAR( 255 ) NOT NULL , +`batch` CHAR( 255) NOT NULL, `notify` CHAR( 255 ) NOT NULL , `poll` CHAR( 255 ) NOT NULL , `confirm` CHAR( 255 ) NOT NULL , diff --git a/include/delivery.php b/include/delivery.php index 18ef09a312..706c07b3b8 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -31,7 +31,7 @@ function delivery_run($argv, $argc){ $a->set_baseurl(get_config('system','url')); - logger('delivery: invoked: ' . print_r($argv,true)); + logger('delivery: invoked: ' . print_r($argv,true), LOGGER_DEBUG); $cmd = $argv[1]; $item_id = intval($argv[2]); @@ -145,6 +145,7 @@ function delivery_run($argv, $argc){ $public_message = true; // fill this in with a single salmon slap if applicable + $slap = ''; require_once('include/group.php'); @@ -195,8 +196,6 @@ function delivery_run($argv, $argc){ $public_message = false; // private recipients, not public } - $conversant_str = intval($contact_id); - $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0", intval($contact_id) ); @@ -204,62 +203,10 @@ function delivery_run($argv, $argc){ if(count($r)) $contact = $r[0]; - - $feed_template = get_markup_template('atom_feed.tpl'); - $mail_template = get_markup_template('atom_mail.tpl'); - - $atom = ''; - $slaps = array(); - $hubxml = feed_hublinks(); - $birthday = feed_birthday($owner['uid'],$owner['timezone']); - - if(strlen($birthday)) - $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>'; - - $atom .= replace_macros($feed_template, array( - '$version' => xmlify(FRIENDIKA_VERSION), - '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ), - '$feed_title' => xmlify($owner['name']), - '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) , - '$hub' => $hubxml, - '$salmon' => '', // private feed, we don't use salmon here - '$name' => xmlify($owner['name']), - '$profile_page' => xmlify($owner['url']), - '$photo' => xmlify($owner['photo']), - '$thumb' => xmlify($owner['thumb']), - '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) , - '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) , - '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) , - '$birthday' => $birthday - )); - - foreach($items as $item) { - if(! $item['parent']) - continue; - - // private emails may be in included in public conversations. Filter them. - if(($public_message) && $item['private']) - continue; - - $item_contact = get_item_contact($item,$icontacts); - if(! $item_contact) - continue; - - $atom .= atom_entry($item,'text',$item_contact,$owner,true); - - if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) - $slaps[] = atom_entry($item,'html',$item_contact,$owner,true); - } - - $atom .= '</feed>' . "\r\n"; - - logger('notifier: ' . $atom, LOGGER_DATA); - logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA); - require_once('include/salmon.php'); if($contact['self']) @@ -271,6 +218,55 @@ function delivery_run($argv, $argc){ case NETWORK_DFRN : logger('notifier: dfrndelivery: ' . $contact['name']); + + $feed_template = get_markup_template('atom_feed.tpl'); + $mail_template = get_markup_template('atom_mail.tpl'); + + $atom = ''; + + + $birthday = feed_birthday($owner['uid'],$owner['timezone']); + + if(strlen($birthday)) + $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>'; + + $atom .= replace_macros($feed_template, array( + '$version' => xmlify(FRIENDIKA_VERSION), + '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ), + '$feed_title' => xmlify($owner['name']), + '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) , + '$hub' => $hubxml, + '$salmon' => '', // private feed, we don't use salmon here + '$name' => xmlify($owner['name']), + '$profile_page' => xmlify($owner['url']), + '$photo' => xmlify($owner['photo']), + '$thumb' => xmlify($owner['thumb']), + '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) , + '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) , + '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) , + '$birthday' => $birthday + )); + + foreach($items as $item) { + if(! $item['parent']) + continue; + + // private emails may be in included in public conversations. Filter them. + if(($public_message) && $item['private']) + continue; + + $item_contact = get_item_contact($item,$icontacts); + if(! $item_contact) + continue; + + $atom .= atom_entry($item,'text',$item_contact,$owner,true); + + } + + $atom .= '</feed>' . "\r\n"; + + logger('notifier: ' . $atom, LOGGER_DATA); + $deliver_status = dfrn_deliver($owner,$contact,$atom); logger('notifier: dfrn_delivery returns ' . $deliver_status); @@ -299,7 +295,25 @@ function delivery_run($argv, $argc){ // only send salmon if public - e.g. if it's ok to notify // a public hub, it's ok to send a salmon - if((count($slaps)) && ($public_message) && (! $expire)) { + if(($public_message) && (! $expire)) { + $slaps = array(); + + foreach($items as $item) { + if(! $item['parent']) + continue; + + // private emails may be in included in public conversations. Filter them. + if(($public_message) && $item['private']) + continue; + + $item_contact = get_item_contact($item,$icontacts); + if(! $item_contact) + continue; + + if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) + $slaps[] = atom_entry($item,'html',$item_contact,$owner,true); + } + logger('notifier: slapdelivery: ' . $contact['name']); foreach($slaps as $slappy) { if($contact['notify']) { @@ -393,12 +407,17 @@ function delivery_run($argv, $argc){ break; case NETWORK_DIASPORA : - logger('delivery: diaspora deliver: ' . $contact['name']); + if($public_message) + $loc = 'public batch ' . $contact['batch']; + else + $loc = $contact['name']; + + logger('delivery: diaspora batch deliver: ' . $loc); if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; - if(! $contact['pubkey']) + if((! $contact['pubkey']) && (! $public_message)) break; if($target_item['verb'] === ACTIVITY_DISLIKE) { @@ -406,23 +425,23 @@ function delivery_run($argv, $argc){ break; } elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { - logger('delivery: diaspora retract: ' . $contact['name']); + logger('delivery: diaspora retract: ' . $loc); // diaspora delete, - diaspora_send_retraction($target_item,$owner,$contact); + diaspora_send_retraction($target_item,$owner,$contact,$public_message); break; } elseif($target_item['parent'] != $target_item['id']) { - logger('delivery: diaspora relay: ' . $contact['name']); + logger('delivery: diaspora relay: ' . $loc); // we are the relay - send comments, likes and unlikes to our conversants - diaspora_send_relay($target_item,$owner,$contact); + diaspora_send_relay($target_item,$owner,$contact,$public_message); break; } elseif(($top_level) && (! $walltowall)) { // currently no workable solution for sending walltowall - logger('delivery: diaspora status: ' . $contact['name']); - diaspora_send_status($target_item,$owner,$contact); + logger('delivery: diaspora status: ' . $loc); + diaspora_send_status($target_item,$owner,$contact,$public_message); break; } diff --git a/include/diaspora.php b/include/diaspora.php index 94c4e30988..80fbff8d61 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -108,8 +108,10 @@ function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) { $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - $b64_data = base64_encode($msg); - $b64url_data = base64url_encode($b64_data); +// $b64_data = base64_encode($msg); +// $b64url_data = base64url_encode($b64_data); + + $b64url_data = base64url_encode($msg); $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); @@ -125,7 +127,7 @@ function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) { $magic_env = <<< EOT <?xml version='1.0' encoding='UTF-8'?> -<diaspora xmlns="https://joindiaspora.org/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" > +<diaspora xmlns="https://joindiaspora.com/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" > <header> <author_id>$handle</author_id> </header> @@ -146,9 +148,12 @@ EOT; -function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { +function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey,$public = false) { $a = get_app(); + if($public) + return diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey); + logger('diaspora_msg_build: ' . $msg, LOGGER_DATA); $inner_aes_key = random_string(32); @@ -211,7 +216,7 @@ EOT; $magic_env = <<< EOT <?xml version='1.0' encoding='UTF-8'?> -<diaspora xmlns="https://joindiaspora.org/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" > +<diaspora xmlns="https://joindiaspora.com/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" > $encrypted_header <me:env> <me:encoding>base64url</me:encoding> @@ -289,7 +294,7 @@ function diaspora_decode($importer,$xml) { ***** CURRENT - * <author_id>acct:galaxor@diaspora.priateship.org</author_id> + * <author_id>galaxor@diaspora.priateship.org</author_id> ***** END DIFFS @@ -424,13 +429,16 @@ function diaspora_request($importer,$xml) { return; } - $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) - VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ", + $batch = (($ret['batch']) ? $ret['batch'] : implode('/', array_slice(explode('/',$ret['url']),0,3)) . '/receive/public'); + + $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) + VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ", intval($importer['uid']), dbesc($ret['network']), dbesc($ret['addr']), datetime_convert(), dbesc($ret['url']), + dbesc($batch), dbesc($ret['name']), dbesc($ret['nick']), dbesc($ret['photo']), @@ -980,7 +988,7 @@ function diaspora_unshare($me,$contact) { -function diaspora_send_status($item,$owner,$contact) { +function diaspora_send_status($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); @@ -1022,19 +1030,19 @@ function diaspora_send_status($item,$owner,$contact) { logger('diaspora_send_status: ' . $owner['username'] . ' -> ' . $contact['name'] . ' base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - $return_code = diaspora_transmit($owner,$contact,$slap); + $return_code = diaspora_transmit($owner,$contact,$slap,$public_batch); if(count($images)) { - diaspora_send_images($item,$owner,$contact,$images); + diaspora_send_images($item,$owner,$contact,$images,$public_batch); } return $return_code; } -function diaspora_send_images($item,$owner,$contact,$images) { +function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) { $a = get_app(); if(! count($images)) return; @@ -1066,14 +1074,14 @@ function diaspora_send_images($item,$owner,$contact,$images) { logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - diaspora_transmit($owner,$contact,$slap); + diaspora_transmit($owner,$contact,$slap,$public_batch); } } -function diaspora_send_followup($item,$owner,$contact) { +function diaspora_send_followup($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); @@ -1121,13 +1129,13 @@ function diaspora_send_followup($item,$owner,$contact) { logger('diaspora_followup: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } -function diaspora_send_relay($item,$owner,$contact) { +function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { $a = get_app(); @@ -1223,15 +1231,15 @@ function diaspora_send_relay($item,$owner,$contact) { logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } -function diaspora_send_retraction($item,$owner,$contact) { +function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); @@ -1243,30 +1251,32 @@ function diaspora_send_retraction($item,$owner,$contact) { '$handle' => $myaddr )); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } -function diaspora_transmit($owner,$contact,$slap) { +function diaspora_transmit($owner,$contact,$slap,$public_batch) { $a = get_app(); - - post_url($contact['notify'] . '/',$slap); + $logid = random_string(4); + logger('diaspora_transmit: ' . $logid . ' ' . (($public_batch) ? $contact['batch'] : $contact['notify'])); + post_url((($public_batch) ? $contact['batch'] : $contact['notify']) . '/',$slap); $return_code = $a->get_curl_code(); - logger('diaspora_transmit: returns: ' . $return_code); + logger('diaspora_transmit: ' . $logid . ' returns: ' . $return_code); if(! $return_code) { logger('diaspora_transmit: queue message'); // queue message for redelivery - q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`) + q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`,`batch`) VALUES ( %d, '%s', '%s', '%s') ", intval($contact['id']), dbesc(datetime_convert()), dbesc(datetime_convert()), - dbesc($slap) + dbesc($slap), + intval($public_batch) ); } diff --git a/include/items.php b/include/items.php index b433381a74..da5a18cad8 100644 --- a/include/items.php +++ b/include/items.php @@ -1615,13 +1615,18 @@ function lose_follower($importer,$contact,$datarray,$item) { } -function subscribe_to_hub($url,$importer,$contact) { +function subscribe_to_hub($url,$importer,$contact,$submode = 'subscribe') { if(is_array($importer)) { $r = q("SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer['uid']) ); } + + // Diaspora has different message-ids in feeds than they do + // through the direct Diaspora protocol. If we try and use + // the feed, we'll get duplicates. So don't. + if((! count($r)) || $contact['network'] === NETWORK_DIASPORA) return; @@ -1631,7 +1636,7 @@ function subscribe_to_hub($url,$importer,$contact) { $verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string()); - $params= 'hub.mode=subscribe&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token; + $params= 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token; logger('subscribe_to_hub: subscribing ' . $contact['name'] . ' to hub ' . $url . ' with verifier ' . $verify_token); diff --git a/include/notifier.php b/include/notifier.php index 6ac882c199..748d15743a 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -409,6 +409,8 @@ function notifier_run($argv, $argc){ foreach($r as $contact) { if((! $mail) && (! $fsuggest) && (! $followup) && (! $contact['self'])) { + if(($contact['network'] === NETWORK_DIASPORA) && ($public_message)) + continue; q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )", dbesc($cmd), intval($item_id), @@ -583,9 +585,19 @@ function notifier_run($argv, $argc){ break; case NETWORK_DIASPORA: require_once('include/diaspora.php'); + if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; + // special handling for followup to public post + // all other public posts processed as public batches further below + + if($public_message) { + if($followup) + diaspora_send_followup($target_item,$owner,$contact, true); + break; + } + if(! $contact['pubkey']) break; @@ -643,17 +655,25 @@ function notifier_run($argv, $argc){ if($public_message) { - $r = q("SELECT `id`, `name` FROM `contact` - WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 - AND `rel` != %d order by rand() ", - dbesc(NETWORK_DFRN), + $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s' + AND `uid` = %d AND `rel` != %d ORDER BY rand() ", dbesc(NETWORK_DIASPORA), intval($owner['uid']), intval(CONTACT_IS_SHARING) ); + + $r2 = q("SELECT `id`, `name`,`network` FROM `contact` + WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 + AND `rel` != %d order by rand() ", + dbesc(NETWORK_DFRN), + intval($owner['uid']), + intval(CONTACT_IS_SHARING) + ); + + $r = array_merge($r2,$r1); if(count($r)) { - logger('pubdeliver: ' . print_r($r,true)); + logger('pubdeliver: ' . print_r($r,true), LOGGER_DEBUG); // throw everything into the queue in case we get killed @@ -669,9 +689,10 @@ function notifier_run($argv, $argc){ foreach($r as $rr) { - /* Don't deliver to folks who have already been delivered to */ + // except for Diaspora batch jobs + // Don't deliver to folks who have already been delivered to - if(in_array($rr['id'],$conversants)) { + if(($rr['network'] !== NETWORK_DIASPORA) && (in_array($rr['id'],$conversants))) { logger('notifier: already delivered id=' . $rr['id']); continue; } diff --git a/include/poller.php b/include/poller.php index dbae1deec9..fd2a0af8f9 100644 --- a/include/poller.php +++ b/include/poller.php @@ -138,6 +138,8 @@ function poller_run($argv, $argc){ if((datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) || $force) $hub_update = true; } + else + $hub_update = false; /** * Based on $contact['priority'], should we poll this site now? Or later? @@ -473,21 +475,25 @@ function poller_run($argv, $argc){ consume_feed($xml,$importer,$contact,$hub,1); + $hubmode = 'subscribe'; + if($contact['network'] === NETWORK_DFRN || $contact['blocked'] || $contact['readonly']) + $hubmode = 'unsubscribe'; - if((strlen($hub)) && ($hub_update) && (($contact['rel'] == CONTACT_IS_FRIEND) || (($contact['network'] === NETWORK_OSTATUS) && (! $contact['readonly'])))) { - logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']); + if((strlen($hub)) && ($hub_update) && ($contact['rel'] != CONTACT_IS_FOLLOWER)) { + logger('poller: hub ' . $hubmode . ' : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']); $hubs = explode(',', $hub); if(count($hubs)) { foreach($hubs as $h) { $h = trim($h); if(! strlen($h)) continue; - subscribe_to_hub($h,$importer,$contact); + subscribe_to_hub($h,$importer,$contact,$hubmode); } } } } + $updated = datetime_convert(); $r = q("UPDATE `contact` SET `last-update` = '%s', `success_update` = '%s' WHERE `id` = %d LIMIT 1", diff --git a/include/queue.php b/include/queue.php index 5119a65d8c..d312b50f5a 100644 --- a/include/queue.php +++ b/include/queue.php @@ -123,6 +123,7 @@ function queue_run($argv, $argc){ } $data = $qi[0]['content']; + $public = $qi[0]['batch']; $contact = $c[0]; $owner = $u[0]; @@ -155,7 +156,7 @@ function queue_run($argv, $argc){ case NETWORK_DIASPORA: if($contact['notify']) { logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']); - $deliver_status = diaspora_transmit($owner,$contact,$data); + $deliver_status = diaspora_transmit($owner,$contact,$data,$public); if($deliver_status == (-1)) update_queue_time($q_item['id']); diff --git a/update.php b/update.php index c5752e4e72..2f9277dae6 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ <?php -define( 'UPDATE_VERSION' , 1091 ); +define( 'UPDATE_VERSION' , 1092 ); /** * @@ -761,3 +761,12 @@ function update_1090() { } +function update_1091() { + + // catch a few stragglers that may have crept in before we added this on remote connects + q("UPDATE `contact` SET `batch` = concat(substring_index(`url`,'/',3),'/receive/public') WHERE `network` = 'dspr' AND `batch` = '' "); + q("ALTER TABLE `queue` ADD `batch` TINYINT( 1 ) NOT NULL DEFAULT '0' "); + q("ALTER TABLE `fcontact` ADD `batch` char(255) NOT NULL AFTER `addr` "); + +} + From fda9e6f2527bbc2156ad3283f3ad0d94ae8226e1 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Thu, 22 Sep 2011 17:35:49 -0700 Subject: [PATCH 44/69] increase pcre backtrack limit --- boot.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index 26b5401185..118b4d69ae 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.3.1111' ); +define ( 'FRIENDIKA_VERSION', '2.3.1112' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1092 ); @@ -185,7 +185,9 @@ define ( 'GRAVITY_COMMENT', 6); function startup() { error_reporting(E_ERROR | E_WARNING | E_PARSE); set_time_limit(0); - ini_set('pcre.backtrack_limit', 250000); + + // This has to be quite large to deal with embedded private photos + ini_set('pcre.backtrack_limit', 350000); if (get_magic_quotes_gpc()) { From a2b2318106be9b133a7265697dc8776bcc248839 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Thu, 22 Sep 2011 20:03:09 -0700 Subject: [PATCH 45/69] provide permission error vs "not found" for protected photos --- mod/photos.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mod/photos.php b/mod/photos.php index 424cc17b74..7141919b0f 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -984,7 +984,15 @@ function photos_content(&$a) { ); if(! count($ph)) { - notice( t('Photo not available') . EOL ); + $ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' + LIMIT 1", + intval($owner_uid), + dbesc($datum) + ); + if(count($ph)) + notice( t('Permission denied. Access to this item may be restricted.')); + else + notice( t('Photo not available') . EOL ); return; } From 3a2bf8ab7ced5f7cc88f8f48b372a0ad08735ed9 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Fri, 23 Sep 2011 03:12:31 -0700 Subject: [PATCH 46/69] w3c compliance fixes, owner attribution on likes defaulting to local owner, not item creator --- addon/facebook/facebook.php | 2 +- addon/statusnet/statusnet.php | 2 +- addon/twitter/twitter.php | 2 +- include/conversation.php | 2 +- include/group.php | 8 ++++---- mod/editpost.php | 2 +- mod/like.php | 27 ++++++++++++++++++++++++--- mod/network.php | 2 ++ view/like.tpl | 4 ++-- 9 files changed, 37 insertions(+), 14 deletions(-) diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php index 37f26807c9..7ffdaffac5 100644 --- a/addon/facebook/facebook.php +++ b/addon/facebook/facebook.php @@ -463,7 +463,7 @@ function facebook_jot_nets(&$a,&$b) { if(intval($fb_post) == 1) { $fb_defpost = get_pconfig(local_user(),'facebook','post_by_default'); $selected = ((intval($fb_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '<div class="profile-jot-net"><input type="checkbox" name="facebook_enable"' . $selected . 'value="1" /> ' + $b .= '<div class="profile-jot-net"><input type="checkbox" name="facebook_enable"' . $selected . ' value="1" /> ' . t('Post to Facebook') . '</div>'; } } diff --git a/addon/statusnet/statusnet.php b/addon/statusnet/statusnet.php index 0c0f4ced7b..25b5210842 100644 --- a/addon/statusnet/statusnet.php +++ b/addon/statusnet/statusnet.php @@ -129,7 +129,7 @@ function statusnet_jot_nets(&$a,&$b) { if(intval($statusnet_post) == 1) { $statusnet_defpost = get_pconfig(local_user(),'statusnet','post_by_default'); $selected = ((intval($statusnet_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '<div class="profile-jot-net"><input type="checkbox" name="statusnet_enable"' . $selected . 'value="1" /> ' + $b .= '<div class="profile-jot-net"><input type="checkbox" name="statusnet_enable"' . $selected . ' value="1" /> ' . t('Post to StatusNet') . '</div>'; } } diff --git a/addon/twitter/twitter.php b/addon/twitter/twitter.php index b1c8a0a897..51b55fd0a2 100644 --- a/addon/twitter/twitter.php +++ b/addon/twitter/twitter.php @@ -66,7 +66,7 @@ function twitter_jot_nets(&$a,&$b) { if(intval($tw_post) == 1) { $tw_defpost = get_pconfig(local_user(),'twitter','post_by_default'); $selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . 'value="1" /> ' + $b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . ' value="1" /> ' . t('Post to Twitter') . '</div>'; } diff --git a/include/conversation.php b/include/conversation.php index a4069c9fdb..b8364ad3b5 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -730,7 +730,7 @@ function status_editor($a,$x, $notes_cid = 0) { if($mail_enabled) { $selected = (($pubmail_enabled) ? ' checked="checked" ' : ''); - $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> ' + $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> ' . t("Post to Email") . '</div>'; } diff --git a/include/group.php b/include/group.php index 4f3d5ee919..edc3de76c9 100644 --- a/include/group.php +++ b/include/group.php @@ -164,7 +164,7 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0 $createtext = t('Create a new group'); $linktext= t('Everybody'); - $selected = (($group_id == 0) ? ' class="group-selected" ' : ''); + $selected = (($group_id == 0) ? ' group-selected' : ''); $o .= <<< EOT <div id="group-sidebar"> @@ -172,7 +172,7 @@ $o .= <<< EOT <div id="sidebar-group-list"> <ul id="sidebar-group-ul"> - <li class="sidebar-group-li" ><a href="$every" class="sidebar-group-element" $selected >$linktext</a></li> + <li class="sidebar-group-li" ><a href="$every" class="sidebar-group-element$selected" >$linktext</a></li> EOT; @@ -185,13 +185,13 @@ EOT; if(count($r)) { foreach($r as $rr) { - $selected = (($group_id == $rr['id']) ? ' class="group-selected" ' : ''); + $selected = (($group_id == $rr['id']) ? ' group-selected' : ''); $o .= ' <li class="sidebar-group-li">' . (($edit) ? "<a href=\"group/{$rr['id']}\" title=\"" . t('Edit') . "\" class=\"groupsideedit\" ><img src=\"images/spencil.gif\" alt=\"" . t('Edit') . "\"></a> " : "") . (($cid) ? '<input type="checkbox" class="' . (($selected) ? 'ticked' : 'unticked') . '" onclick="contactgroupChangeMember(' . $rr['id'] . ',' . $cid . ');return true;" ' . ((in_array($rr['id'],$member_of)) ? ' checked="checked" ' : '') . '/>' : '') - . "<a href=\"$each/{$rr['id']}\" class=\"sidebar-group-element\" $selected >{$rr['name']}</a></li>\r\n"; + . "<a href=\"$each/{$rr['id']}\" class=\"sidebar-group-element" . $selected ."\" >{$rr['name']}</a></li>\r\n"; } } $o .= " </ul>\r\n </div>"; diff --git a/mod/editpost.php b/mod/editpost.php index c396ee44b0..bceb9250a2 100644 --- a/mod/editpost.php +++ b/mod/editpost.php @@ -71,7 +71,7 @@ function editpost_content(&$a) { if($mail_enabled) { $selected = (($pubmail_enabled) ? ' checked="checked" ' : ''); - $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> ' + $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> ' . t("Post to Email") . '</div>'; } diff --git a/mod/like.php b/mod/like.php index 2876302122..95bedcc20f 100644 --- a/mod/like.php +++ b/mod/like.php @@ -55,6 +55,22 @@ function like_content(&$a) { return; } + $remote_owner = null; + + if(! $item['wall']) { + // The top level post may have been written by somebody on another system + $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($item['contact-id']), + intval($item['uid']) + ); + if(! count($r)) + return; + if(! $r[0]['self']) + $remote_owner = $r[0]; + } + + // this represents the post owner on this system. + $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` WHERE `contact`.`self` = 1 AND `contact`.`uid` = %d LIMIT 1", intval($owner_uid) @@ -67,6 +83,11 @@ function like_content(&$a) { return; } + if(! $remote_owner) + $remote_owner = $owner; + + + // This represents the person posting if((local_user()) && (local_user() == $owner_uid)) { $contact = $owner; @@ -137,9 +158,9 @@ EOT; $arr['gravity'] = GRAVITY_LIKE; $arr['parent'] = $item['id']; $arr['parent-uri'] = $item['uri']; - $arr['owner-name'] = $owner['name']; - $arr['owner-link'] = $owner['url']; - $arr['owner-avatar'] = $owner['thumb']; + $arr['owner-name'] = $remote_owner['name']; + $arr['owner-link'] = $remote_owner['url']; + $arr['owner-avatar'] = $remote_owner['thumb']; $arr['author-name'] = $contact['name']; $arr['author-link'] = $contact['url']; $arr['author-avatar'] = $contact['thumb']; diff --git a/mod/network.php b/mod/network.php index 5faeee453b..c168f96ebb 100644 --- a/mod/network.php +++ b/mod/network.php @@ -132,6 +132,7 @@ function network_content(&$a, $update = 0) { $star = ((x($_GET,'star')) ? intval($_GET['star']) : 0); $bmark = ((x($_GET,'bmark')) ? intval($_GET['bmark']) : 0); $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment'); + $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0); if(($a->argc > 2) && $a->argv[2] === 'new') @@ -195,6 +196,7 @@ function network_content(&$a, $update = 0) { . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '') . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '') . ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '') + . ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '') . "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n"; } diff --git a/view/like.tpl b/view/like.tpl index ce5af04cef..f4f2e1671f 100644 --- a/view/like.tpl +++ b/view/like.tpl @@ -1,6 +1,6 @@ <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id"> - <a href="#" class="icon like"title="$likethis" onclick="dolike($id,'like'); return false"></a> + <a href="#" class="icon like" title="$likethis" onclick="dolike($id,'like'); return false"></a> <a href="#" class="icon dislike" title="$nolike" onclick="dolike($id,'dislike'); return false"></a> - <a href="#" class="icon recycle wall-item-share-buttons" title="$share"onclick="jotShare($id); return false"></a> + <a href="#" class="icon recycle wall-item-share-buttons" title="$share" onclick="jotShare($id); return false"></a> <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" /> </div> From 477ba8e574994b2e8ec4ea5694dab0a92e0c004d Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Fri, 23 Sep 2011 04:47:36 -0700 Subject: [PATCH 47/69] like the jquery license but better --- LICENSE | 379 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 375 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 33579fe080..b514011c8f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,8 +1,9 @@ -The Friendika project is distributed under the following license terms: +Friendika - Copyright 2010, 2011 the Friendika Project -* This software is provided for any use with no license terms or restrictions. - -No guarantee is provided. Use at your own risk. +Friendika is released under six licenses: Public Domain, Anarchy, Beerware, +MIT, BSD, and GPL. You may pick the license that best suits your needs. You do +not need to do anything special to choose one license or another and you do +not need inform anybody of your decision. Components packaged with this software may fall under different license terms. @@ -23,3 +24,373 @@ Facebook SDK - Apache Addons, plugins, and themes may also be provided under their own license terms. +The text of all appropriate Friendika Project licenses are provided below. + +---- +Public Domain +---- + +This work is released into the public domain. + + +---- +Anarchy license +---- + +The Friendika project is distributed under the following license terms: + +* This software is provided for any use with no license terms or restrictions. + +No guarantee is provided. Use at your own risk. + + +---- +Beerware License +---- + +Mike Macgirvin wrote a lot of this stuff. He had help from other people +"the Friendika Project" who also wrote stuff. As long as you retain this +notice you can do whatever you want with this stuff. If we meet some day, +and you think this stuff is worth it, you can buy Mike Macgirvin or any +other people in the Friendika Project a beer in return. + +[Mike prefers dopplebocks.] + + +---- +MIT License +---- + +Copyright (c) 2010, 2011 the Friendika Project + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---- +BSD License +---- + +Copyright (c) 2010,2011 the Friendika Project + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the <organization> nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY the Friendika Project ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +---- +GPL License +---- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code s you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. From 7ea6b0a1264ec0c1cdb18a82b6a4f11e570f0e83 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Fri, 23 Sep 2011 05:03:12 -0700 Subject: [PATCH 48/69] fix message ordering glitch on network page --- mod/network.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/network.php b/mod/network.php index c168f96ebb..dd22e7d5b5 100644 --- a/mod/network.php +++ b/mod/network.php @@ -358,7 +358,7 @@ function network_content(&$a, $update = 0) { AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `item`.`parent` = `parentitem`.`id` AND `item`.`parent` IN ( %s ) $sql_extra - ORDER BY `parentitem`.$ordering DESC, `item`.`gravity` ASC, `item`.`created` ASC ", + ORDER BY `parentitem`.$ordering DESC, `parentitem`.`id` ASC, `item`.`gravity` ASC, `item`.`created` ASC ", intval(local_user()), dbesc($parents_str) ); From d04e2dbde7108cc5a1274a809324390dfad4dea4 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Fri, 23 Sep 2011 05:43:10 -0700 Subject: [PATCH 49/69] proofread edits --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index b514011c8f..a9afe21b98 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ Friendika - Copyright 2010, 2011 the Friendika Project Friendika is released under six licenses: Public Domain, Anarchy, Beerware, MIT, BSD, and GPL. You may pick the license that best suits your needs. You do not need to do anything special to choose one license or another and you do -not need inform anybody of your decision. +not to need inform anybody of your decision. Components packaged with this software may fall under different license terms. From 37dfe555dc0e8cae7c1690bc9c7b3196882ef139 Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Fri, 23 Sep 2011 06:03:04 -0700 Subject: [PATCH 50/69] thanks akron... --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index a9afe21b98..6baae790a2 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ Friendika - Copyright 2010, 2011 the Friendika Project Friendika is released under six licenses: Public Domain, Anarchy, Beerware, MIT, BSD, and GPL. You may pick the license that best suits your needs. You do not need to do anything special to choose one license or another and you do -not to need inform anybody of your decision. +not need to inform anybody of your decision. Components packaged with this software may fall under different license terms. From b13f81bdc5ec11af4c982d78f066102b9626a99a Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Sat, 24 Sep 2011 05:30:15 -0700 Subject: [PATCH 51/69] . --- LICENSE | 396 -------------------------------------------------- addon/LICENSE | 10 -- boot.php | 2 +- 3 files changed, 1 insertion(+), 407 deletions(-) delete mode 100644 LICENSE delete mode 100644 addon/LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 6baae790a2..0000000000 --- a/LICENSE +++ /dev/null @@ -1,396 +0,0 @@ -Friendika - Copyright 2010, 2011 the Friendika Project - -Friendika is released under six licenses: Public Domain, Anarchy, Beerware, -MIT, BSD, and GPL. You may pick the license that best suits your needs. You do -not need to do anything special to choose one license or another and you do -not need to inform anybody of your decision. - -Components packaged with this software may fall under different license terms. - -cropper - BSD -TwitterOAuth - BSD -markdown - BSD -slinky - BSD -ajax-upload - MIT -simplepie - MIT -LightOpenID - MIT -HTML5 - MIT -jQuery - MIT -TinyMCE - LGPL -phpsec - LGPL -HTMLPurifer - LGPL -Facebook SDK - Apache - -Addons, plugins, and themes may also be provided under their own license terms. - - -The text of all appropriate Friendika Project licenses are provided below. - ----- -Public Domain ----- - -This work is released into the public domain. - - ----- -Anarchy license ----- - -The Friendika project is distributed under the following license terms: - -* This software is provided for any use with no license terms or restrictions. - -No guarantee is provided. Use at your own risk. - - ----- -Beerware License ----- - -Mike Macgirvin wrote a lot of this stuff. He had help from other people -"the Friendika Project" who also wrote stuff. As long as you retain this -notice you can do whatever you want with this stuff. If we meet some day, -and you think this stuff is worth it, you can buy Mike Macgirvin or any -other people in the Friendika Project a beer in return. - -[Mike prefers dopplebocks.] - - ----- -MIT License ----- - -Copyright (c) 2010, 2011 the Friendika Project - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ----- -BSD License ----- - -Copyright (c) 2010,2011 the Friendika Project - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the <organization> nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY the Friendika Project ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ----- -GPL License ----- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code s you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. diff --git a/addon/LICENSE b/addon/LICENSE deleted file mode 100644 index 02cff93203..0000000000 --- a/addon/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -Friendika addons/plugins license terms are under the control of the project -author or authors. - -Developers are free to set their own license terms on addons/plugins as -standalone works. These license terms apply only to the covered addon or -plugin. - -Addons/plugins may be licensed under copyleft or other license terms. Although -these projects may require Friendika to operate, no addon or plugin may -mandate any changes to the Friendika project license. diff --git a/boot.php b/boot.php index 118b4d69ae..a3a5683a79 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.3.1112' ); +define ( 'FRIENDIKA_VERSION', '2.3.1113' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1092 ); From 6a9e22550d82595c4341290ca26e3afc5fe6300f Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Sat, 24 Sep 2011 05:45:34 -0700 Subject: [PATCH 52/69] . --- include/text.php | 3 --- mod/display.php | 2 -- mod/friendika.php | 2 -- mod/network.php | 1 - mod/profile.php | 1 - mod/register.php | 3 +-- mod/search.php | 1 - 7 files changed, 1 insertion(+), 12 deletions(-) diff --git a/include/text.php b/include/text.php index 37af65c70d..cc18181631 100644 --- a/include/text.php +++ b/include/text.php @@ -925,9 +925,6 @@ function base64url_decode($s) { return base64_decode(strtr($s,'-_','+/')); } -function cc_license() { -return '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>'; -} if (!function_exists('str_getcsv')) { function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') { diff --git a/mod/display.php b/mod/display.php index 52a84e755e..281ce1dd41 100644 --- a/mod/display.php +++ b/mod/display.php @@ -114,8 +114,6 @@ function display_content(&$a) { } - $o .= cc_license(); - return $o; } diff --git a/mod/friendika.php b/mod/friendika.php index d0e709c753..c5d7de59fe 100644 --- a/mod/friendika.php +++ b/mod/friendika.php @@ -42,8 +42,6 @@ function friendika_content(&$a) { $o .= t('This is Friendika version') . ' ' . FRIENDIKA_VERSION . ' '; $o .= t('running at web location') . ' ' . z_root() . '</p><p>'; - $o .= t('Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>') . '</p><p>'; - $o .= t('Please visit <a href="http://project.friendika.com">Project.Friendika.com</a> to learn more about the Friendika project.') . '</p><p>'; $o .= t('Bug reports and issues: please visit') . ' ' . '<a href="http://bugs.friendika.com">Bugs.Friendika.com</a></p><p>'; diff --git a/mod/network.php b/mod/network.php index dd22e7d5b5..63d344db38 100644 --- a/mod/network.php +++ b/mod/network.php @@ -374,7 +374,6 @@ function network_content(&$a, $update = 0) { if(! $update) { $o .= paginate($a); - $o .= cc_license(); } return $o; diff --git a/mod/profile.php b/mod/profile.php index 2dd5df7585..b09251cd52 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -238,7 +238,6 @@ function profile_content(&$a, $update = 0) { if(! $update) { $o .= paginate($a); - $o .= cc_license(); } return $o; diff --git a/mod/register.php b/mod/register.php index 5fceebd4bd..85e1f9faa0 100644 --- a/mod/register.php +++ b/mod/register.php @@ -501,8 +501,7 @@ function register_content(&$a) { } - $license = cc_license(); - + $license = ''; $o = get_markup_template("register.tpl"); $o = replace_macros($o, array( diff --git a/mod/search.php b/mod/search.php index d22fea6ffc..d150b2e1e4 100644 --- a/mod/search.php +++ b/mod/search.php @@ -145,7 +145,6 @@ function search_content(&$a) { $o .= conversation($a,$r,'search',false); $o .= paginate($a); - $o .= cc_license(); return $o; } From 634e52a6717753eb6742a23e60bf88bf0809968f Mon Sep 17 00:00:00 2001 From: Devlon Duthie <duthied@gmail.com> Date: Sat, 24 Sep 2011 23:54:23 -0500 Subject: [PATCH 53/69] added testbubble mai, and modified some core fle to add classes --- images/logo.png | Bin 0 -> 9787 bytes view/theme/testbubble/calendar.png | Bin 0 -> 3779 bytes view/theme/testbubble/connect.png | Bin 0 -> 443 bytes view/theme/testbubble/groups.png | Bin 0 -> 911 bytes view/theme/testbubble/icons.png | Bin 0 -> 22600 bytes view/theme/testbubble/icons.svg | 1442 ++++++++++ view/theme/testbubble/jot-header.tpl | 251 ++ view/theme/testbubble/jot.tpl | 75 + view/theme/testbubble/login-bg.gif | Bin 0 -> 237 bytes view/theme/testbubble/lrarrow.gif | Bin 0 -> 236 bytes view/theme/testbubble/mail_head.tpl | 7 + view/theme/testbubble/menu-user-pin.jpg | Bin 0 -> 385 bytes view/theme/testbubble/menu-user-pin.png | Bin 0 -> 276 bytes view/theme/testbubble/nav.tpl | 55 + view/theme/testbubble/next.png | Bin 0 -> 891 bytes view/theme/testbubble/notifications.png | Bin 0 -> 2253 bytes view/theme/testbubble/photo-menu.jpg | Bin 0 -> 2801 bytes view/theme/testbubble/photo_view.tpl | 40 + view/theme/testbubble/photography.png | Bin 0 -> 766 bytes view/theme/testbubble/premium.png | Bin 0 -> 2317 bytes view/theme/testbubble/prev.png | Bin 0 -> 853 bytes view/theme/testbubble/profile_tabs.tpl | 9 + view/theme/testbubble/search.png | Bin 0 -> 808 bytes view/theme/testbubble/search_item.tpl | 40 + view/theme/testbubble/star.png | Bin 0 -> 2129 bytes view/theme/testbubble/style.css | 3225 +++++++++++++++++++++++ view/theme/testbubble/user.png | Bin 0 -> 664 bytes view/theme/testbubble/wall_item.tpl | 51 + view/theme/testbubble/wallwall_item.tpl | 51 + 29 files changed, 5246 insertions(+) create mode 100644 images/logo.png create mode 100644 view/theme/testbubble/calendar.png create mode 100644 view/theme/testbubble/connect.png create mode 100644 view/theme/testbubble/groups.png create mode 100644 view/theme/testbubble/icons.png create mode 100644 view/theme/testbubble/icons.svg create mode 100644 view/theme/testbubble/jot-header.tpl create mode 100644 view/theme/testbubble/jot.tpl create mode 100644 view/theme/testbubble/login-bg.gif create mode 100644 view/theme/testbubble/lrarrow.gif create mode 100644 view/theme/testbubble/mail_head.tpl create mode 100644 view/theme/testbubble/menu-user-pin.jpg create mode 100644 view/theme/testbubble/menu-user-pin.png create mode 100644 view/theme/testbubble/nav.tpl create mode 100644 view/theme/testbubble/next.png create mode 100644 view/theme/testbubble/notifications.png create mode 100644 view/theme/testbubble/photo-menu.jpg create mode 100644 view/theme/testbubble/photo_view.tpl create mode 100644 view/theme/testbubble/photography.png create mode 100644 view/theme/testbubble/premium.png create mode 100644 view/theme/testbubble/prev.png create mode 100644 view/theme/testbubble/profile_tabs.tpl create mode 100644 view/theme/testbubble/search.png create mode 100644 view/theme/testbubble/search_item.tpl create mode 100644 view/theme/testbubble/star.png create mode 100644 view/theme/testbubble/style.css create mode 100644 view/theme/testbubble/user.png create mode 100644 view/theme/testbubble/wall_item.tpl create mode 100644 view/theme/testbubble/wallwall_item.tpl diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b977b697a56c9c942315152e7ec5e7b9d5dc515 GIT binary patch literal 9787 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 V%$d3T`%(Y^002ovPDHLkV1kc_;hq2h literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/calendar.png b/view/theme/testbubble/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..705a75b8a8646ce86030c5ee5220bde99490bff4 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/connect.png b/view/theme/testbubble/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..b76fc13dce9eee21d5a9449f80e21444c801cabe GIT binary patch literal 443 zcmV;s0Yv_ZP)<h;3K|Lk000e1NJLTq000mG000gM1^@s6CNG?d00004b3#c}2nYxW zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10XRuSK~yM_rIN8O1W^=*zyGcsD!Z8#5+$NgZ-`Q&RC@=l7KMsL z!VBm`LeyS>!~>``3MAvsy{nQinWJDuHZx1&Pfqp!=gT=cM`lKyLI}%}9ZNh)BkQeJ zD-LE{Z8zYYZ2}8steO=om6>6HveX4oNah=j<f<}cW<$&S=aXLVxm)KCo#1l~CW=B& zwf=7a&}666$^HQ#0p4o?-uw9w{85bg2B5x?W!Y4W{@je2Ue8xv0AR#9ol0~8Ldd5< z*Upu1Nz&LdV^sn(T>|4kQ32q`FWJ0A6G+T71AW8BLI{g#n%)co^zxF;6@}Xd-KJ@J z*f;V#UviF9U;=aoESTAybB*10yM6x+81~9Q^J{Dah|#Y}+9^vDFbnMc2B?x^%wK^~ l;NdT49F&>aKJXyv-~)f?rYbayUt9nH002ovPDHLkV1mQvvw#2q literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/groups.png b/view/theme/testbubble/groups.png new file mode 100644 index 0000000000000000000000000000000000000000..a65a7218c93c372404e70bd45434ffc2c915b1d3 GIT binary patch literal 911 zcmV;A191F_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#F-b&0RCwBKQ(0_GVH7@h-{)@Abd*w4 zkwzkAsHzaDNQosu#rELAlSIS|B19wzuM*<P5{ZO2d&JfU>V-&!NoiH9r8AZ;Q?uyY zd*}YnKdnf_O}@;{{QvpR`M&R5fPWr_VSwXU5Jdq9AuK{^ZeHFHi&gHiEh{bv0<bJw zzW3jU9!?gEh-s@@R$iE1T}7r=Rg$P{2bN{-o*<bZU?~$VqFn`^2N4g8MUS3Vv^{ye zF`XXV<vKRlwgnMG=Xj1i8+BcaVc5xr<&ilEf)eBTKEGqfcBgUC!lu5y-WvQrVOu6+ z+a}mn1Pnt5S&?~$W#-VPWdfuG&+~ZNadYdYgYE54Q~7-M`Sz`wA7b|@b#--FL)Sq^ zXqpO&Bta||^QeUK^poSd?a!XB?eFhB9(5fFfd!g+{o2*$0|yVkP*jCTSSZUfL`?IW zWkzy5%B54#IYdNtS9jNX)XG&vU2ssdp=*H5;@DVbc*&AwpJ_on9v@6BNIV!A7-+{t z>Uo@=pCqWjLW63RWr-#LUeO2i1PX=1Aa=?$ENU#IQz<Q(OzzZmmCC;FI?i17Pki<B z5<g5c5~`|N9+gHZief?2^zXTRmh|>?&m0{cuErSAPzw#!rm!4)gc8WNZ{4Upb@JG{ zwd*!?8M+ZjqC`zAHZ(NeIe+fVffXxSKDchwqp~m+a2*S5(*#wLwsC7#x2(B*@%%YS z6!h=k(sup)#3zg^ho<HGdb^tlDXAYncE|Sa+yC<In~oU_5cHow7<k}&1(mCvQF+Pt ze$B-3L6RjlGcx4lb3e`Ec)>)I7=dRY@I8f)@ay8HrNf=c*HvN32j3s31i$!^(V=;c z69uZBL#HP;3_Fxc)F|A_B4QlgynZ#ib<571PafW@A<<~DCO+%kSSE9YR}@(^3<Hf* z%DK|)upUAZ0$nn~5b%Q{WOHLSZsxN?M^AU+jZs7oqLUXSiQsp@pre1kF#KUc+%&pv zln=>JhKH|h2mvvU$Ri3&+oQW3snnOMAn=v!&x}?ol~_WH!jSGmfU>f_@2An1>s{}Y lC#akN_anq}ybHet7yy>`LZi9QUkv~N002ovPDHLkV1hz7sXPDx literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/icons.png b/view/theme/testbubble/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..57c4bfb052cc88631ebd1b594c1fc65e60b25f21 GIT binary patch literal 22600 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 Z35YtjseLCWAsYfd>MGjGg-Vve{{^8j-Bthq literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/icons.svg b/view/theme/testbubble/icons.svg new file mode 100644 index 0000000000..b435ba6653 --- /dev/null +++ b/view/theme/testbubble/icons.svg @@ -0,0 +1,1442 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="250" + height="200" + id="svg3403" + version="1.1" + inkscape:version="0.48.1 r9760" + sodipodi:docname="icons.svg" + inkscape:export-filename="/home/fabio/public_html/friendika/view/theme/dispy/icons.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs3405"> + <filter + color-interpolation-filters="sRGB" + inkscape:collect="always" + id="filter4064"> + <feBlend + inkscape:collect="always" + mode="lighten" + in2="BackgroundImage" + id="feBlend4066" /> + </filter> + <inkscape:path-effect + effect="gears" + id="path-effect4050" + is_visible="true" + teeth="10" + phi="10" /> + <inkscape:path-effect + effect="gears" + id="path-effect3436" + is_visible="true" + teeth="10" + phi="10" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.9899495" + inkscape:cx="43.010429" + inkscape:cy="-67.661177" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false" + inkscape:window-width="1534" + inkscape:window-height="1067" + inkscape:window-x="104" + inkscape:window-y="63" + inkscape:window-maximized="0"> + <inkscape:grid + type="xygrid" + id="grid4016" + empspacing="5" + visible="true" + enabled="false" + snapvisiblegridlinesonly="false" + spacingx="20px" + spacingy="20px" + dotted="false" + units="px" + originx="50px" + originy="200px" /> + <inkscape:grid + type="xygrid" + id="grid4018" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="false" + color="#ff0000" + opacity="0.1254902" + empcolor="#ff0000" + empopacity="0.25098039" + originy="200px" + spacingx="22px" + spacingy="22px" /> + </sodipodi:namedview> + <metadata + id="metadata3408"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Livello 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-852.36218)"> + <rect + style="fill:#2e3436;fill-opacity:1;stroke:none;display:inline" + id="rect4007" + width="44" + height="132" + x="1.5883562e-17" + y="852.36218" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <g + id="ico_dir" + transform="matrix(0.43114968,0,0,0.43114968,-178.47604,867.63556)" + style="stroke:#888a85;display:inline" + inkscape:label="#g3846"> + <rect + ry="6" + rx="6" + y="18.790752" + x="417.14285" + height="44.285713" + width="44.285713" + id="rect3820" + style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + inkscape:connector-curvature="0" + style="fill:#2e3436;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 449.12191,27.281249 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z" + id="path3830" /> + <path + id="path3832" + d="m 431.26477,26.924106 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z" + style="fill:#2e3436;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path3822" + d="M 439.46875,29.78125 C 437.00319,29.78125 435,31.784443 435,34.25 c 0,2.465557 2.00319,4.46875 4.46875,4.46875 2.46556,0 4.46875,-2.003193 4.46875,-4.46875 0,-2.465557 -2.00319,-4.46875 -4.46875,-4.46875 z m 0,8.9375 c -6.2132,0 -11.25,6.862234 -11.25,15.34375 0,0.239102 0.0233,0.482318 0.0313,0.71875 l 22.4375,0 c 0.008,-0.236432 0.0313,-0.479648 0.0313,-0.71875 0,-8.481516 -5.0368,-15.34375 -11.25,-15.34375 z" + style="fill:#2e3436;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + </g> + <g + id="ico_search" + transform="matrix(0.43114968,0,0,0.43114968,-201.41936,889.63556)" + style="stroke:#888a85;display:inline" + inkscape:label="#g3852"> + <rect + style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3837" + width="44.285713" + height="44.285713" + x="470.35715" + y="18.790752" + rx="6" + ry="6" /> + <path + inkscape:connector-curvature="0" + id="path3839" + d="m 477.97758,26.469174 c -3.64342,3.88426 -3.47037,9.984211 0.41389,13.627637 3.52011,3.301856 8.87059,3.441123 12.55302,0.54905 -0.17428,0.682501 0.0188,1.431563 0.57086,1.949383 l 13.7666,12.913032 c 0.80813,0.75802 2.06896,0.717682 2.82698,-0.09044 l 0.68414,-0.729357 c 0.75802,-0.808126 0.71768,-2.06896 -0.0904,-2.82698 l -13.7666,-12.913032 c -0.55205,-0.51782 -1.31192,-0.66264 -1.98188,-0.445086 2.65077,-3.859767 2.16978,-9.190402 -1.35033,-12.492258 -3.88426,-3.643426 -9.9828,-3.426204 -13.62623,0.458055 z" + style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + transform="translate(-0.21428562,-0.35714286)" + d="m 492.49999,33.612183 c 0,4.043513 -3.27792,7.321428 -7.32143,7.321428 -4.04352,0 -7.32143,-3.277915 -7.32143,-7.321428 0,-4.043514 3.27791,-7.321429 7.32143,-7.321429 4.04351,0 7.32143,3.277915 7.32143,7.321429 z" + sodipodi:ry="7.3214288" + sodipodi:rx="7.3214288" + sodipodi:cy="33.612183" + sodipodi:cx="485.17856" + id="path3844" + style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /> + </g> + <g + inkscape:label="#g3852" + style="stroke:#888a85;display:inline" + transform="matrix(0.43114968,0,0,0.43114968,-201.41936,845.63556)" + id="ico_logout"> + <rect + ry="6" + rx="6" + y="18.790752" + x="470.35715" + height="44.285713" + width="44.285713" + id="rect3995" + style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:#555753;fill-opacity:1;stroke:#888a85;stroke-width:2.31938004" + d="M 504.69787,28.735741 480.30214,53.131477" + id="path4003" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path4005" + d="M 504.69787,53.131473 480.30214,28.735746" + style="fill:#555753;fill-opacity:1;stroke:#888a85;stroke-width:2.31938004" /> + </g> + <g + inkscape:label="#g3846" + style="stroke:#d3d7cf;display:inline" + transform="matrix(0.43114968,0,0,0.43114968,-156.47604,867.63556)" + id="ico_dir_on"> + <rect + style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4011" + width="44.285713" + height="44.285713" + x="417.14285" + y="18.790752" + rx="6" + ry="6" /> + <path + id="path4013" + d="m 449.12191,27.281249 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z" + style="fill:#2e3436;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + style="fill:#2e3436;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 431.26477,26.924106 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z" + id="path4015" /> + <path + style="fill:#2e3436;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 439.46875,29.78125 C 437.00319,29.78125 435,31.784443 435,34.25 c 0,2.465557 2.00319,4.46875 4.46875,4.46875 2.46556,0 4.46875,-2.003193 4.46875,-4.46875 0,-2.465557 -2.00319,-4.46875 -4.46875,-4.46875 z m 0,8.9375 c -6.2132,0 -11.25,6.862234 -11.25,15.34375 0,0.239102 0.0233,0.482318 0.0313,0.71875 l 22.4375,0 c 0.008,-0.236432 0.0313,-0.479648 0.0313,-0.71875 0,-8.481516 -5.0368,-15.34375 -11.25,-15.34375 z" + id="path4017" + inkscape:connector-curvature="0" /> + </g> + <g + inkscape:label="#g3852" + style="stroke:#d3d7cf;display:inline" + transform="matrix(0.43114968,0,0,0.43114968,-179.41936,889.63556)" + id="ico_search_on"> + <rect + ry="6" + rx="6" + y="18.790752" + x="470.35715" + height="44.285713" + width="44.285713" + id="rect4021" + style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 477.97758,26.469174 c -3.64342,3.88426 -3.47037,9.984211 0.41389,13.627637 3.52011,3.301856 8.87059,3.441123 12.55302,0.54905 -0.17428,0.682501 0.0188,1.431563 0.57086,1.949383 l 13.7666,12.913032 c 0.80813,0.75802 2.06896,0.717682 2.82698,-0.09044 l 0.68414,-0.729357 c 0.75802,-0.808126 0.71768,-2.06896 -0.0904,-2.82698 l -13.7666,-12.913032 c -0.55205,-0.51782 -1.31192,-0.66264 -1.98188,-0.445086 2.65077,-3.859767 2.16978,-9.190402 -1.35033,-12.492258 -3.88426,-3.643426 -9.9828,-3.426204 -13.62623,0.458055 z" + id="path4023" + inkscape:connector-curvature="0" /> + <path + sodipodi:type="arc" + style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4025" + sodipodi:cx="485.17856" + sodipodi:cy="33.612183" + sodipodi:rx="7.3214288" + sodipodi:ry="7.3214288" + d="m 492.49999,33.612183 c 0,4.043513 -3.27792,7.321428 -7.32143,7.321428 -4.04352,0 -7.32143,-3.277915 -7.32143,-7.321428 0,-4.043514 3.27791,-7.321429 7.32143,-7.321429 4.04351,0 7.32143,3.277915 7.32143,7.321429 z" + transform="translate(-0.21428562,-0.35714286)" /> + </g> + <g + id="ico_logout_on" + transform="matrix(0.43114968,0,0,0.43114968,-179.41936,845.63556)" + style="stroke:#d3d7cf;display:inline" + inkscape:label="#g3852"> + <rect + style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4029" + width="44.285713" + height="44.285713" + x="470.35715" + y="18.790752" + rx="6" + ry="6" /> + <path + inkscape:connector-curvature="0" + id="path4031" + d="M 504.69787,28.735741 480.30214,53.131477" + style="fill:#555753;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.31938004" /> + <path + style="fill:#555753;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.31938004" + d="M 504.69787,53.131473 480.30214,28.735746" + id="path4033" + inkscape:connector-curvature="0" /> + </g> + <g + inkscape:label="#g3852" + style="stroke:#888a85;display:inline;filter:url(#filter4064)" + transform="matrix(0.43114968,0,0,0.43114968,-201.41936,911.63556)" + id="g4040"> + <rect + ry="6" + rx="6" + y="18.790752" + x="470.35715" + height="44.285713" + width="44.285713" + id="rect4042" + style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:1.66475451;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + d="m 484.90604,52.679071 c 0,0 -0.72327,1.028211 -2.88202,1.697409 -0.63474,-0.494653 -1.23439,-1.034334 -1.79294,-1.613646 0.43889,-2.217071 1.3855,-3.044283 1.3855,-3.044283 l 2.04237,-1.648571 c -0.73879,-0.915258 -1.3342,-1.946011 -1.75793,-3.043257 l -2.44847,0.945549 c 0,0 -1.18951,0.40671 -3.32932,-0.320779 -0.22277,-0.773276 -0.39067,-1.56235 -0.50204,-2.359331 1.65823,-1.535673 2.91028,-1.648499 2.91028,-1.648499 l 2.62132,-0.133248 c -0.0597,-1.174706 0.0645,-2.358577 0.36658,-3.495332 l -2.53663,-0.674208 c 0,0 -1.20139,-0.37014 -2.50493,-2.216441 0.2743,-0.756533 0.60227,-1.4936 0.98062,-2.20383 2.24419,-0.267701 3.32343,0.376954 3.32343,0.376954 l 2.19901,1.432971 c 0.64217,-0.985455 1.43848,-1.870246 2.35108,-2.612309 l -1.65589,-2.03644 c 0,0 -0.75438,-1.005609 -0.72373,-3.265497 0.66659,-0.45082 1.36515,-0.854347 2.08871,-1.206542 1.97294,1.102524 2.46715,2.258424 2.46715,2.258424 l 0.93675,2.451844 c 1.09876,-0.419794 2.26306,-0.667544 3.43754,-0.731472 l -0.14265,-2.620822 c 0,0 -0.0192,-1.25697 1.3339,-3.067245 0.80426,0.02709 1.6066,0.111239 2.39899,0.251604 0.94809,2.051624 0.66849,3.277254 0.66849,3.277254 l -0.6833,2.534196 c 1.13566,0.306213 2.22322,0.790136 3.21097,1.428761 l 1.42508,-2.204138 c 0,0 0.72327,-1.028211 2.88202,-1.697409 0.63474,0.494653 1.23439,1.034334 1.79294,1.613646 -0.43889,2.217071 -1.3855,3.044283 -1.3855,3.044283 l -2.04237,1.648571 c 0.73879,0.915258 1.3342,1.946011 1.75793,3.043257 l 2.44847,-0.945549 c 0,0 1.18951,-0.40671 3.32932,0.320779 0.22277,0.773276 0.39067,1.56235 0.50204,2.359331 -1.65823,1.535673 -2.91028,1.648499 -2.91028,1.648499 l -2.62132,0.133248 c 0.0597,1.174706 -0.0645,2.358577 -0.36658,3.495332 l 2.53663,0.674208 c 0,0 1.20139,0.37014 2.50493,2.216441 -0.2743,0.756533 -0.60227,1.4936 -0.98062,2.20383 -2.24419,0.267701 -3.32343,-0.376954 -3.32343,-0.376954 l -2.19901,-1.432971 c -0.64217,0.985455 -1.43848,1.870246 -2.35108,2.612309 l 1.65589,2.03644 c 0,0 0.75438,1.005609 0.72373,3.265497 -0.66659,0.45082 -1.36515,0.854347 -2.08871,1.206542 -1.97294,-1.102524 -2.46715,-2.258424 -2.46715,-2.258424 l -0.93675,-2.451844 c -1.09876,0.419794 -2.26306,0.667544 -3.43754,0.731472 l 0.14265,2.620822 c 0,0 0.0192,1.25697 -1.3339,3.067245 -0.80426,-0.02709 -1.6066,-0.111239 -2.39899,-0.251604 -0.94809,-2.051624 -0.66849,-3.277254 -0.66849,-3.277254 l 0.6833,-2.534196 c -1.13566,-0.306213 -2.22322,-0.790136 -3.21097,-1.428761 l -1.42508,2.204138" + id="path4048" + inkscape:connector-curvature="0" + inkscape:path-effect="#path-effect4050" + inkscape:original-d="M 484.55417,49.762303 492.5,40.933609 504.27158,48.879434" /> + </g> + <g + id="g4068" + transform="matrix(0.43114968,0,0,0.43114968,-179.41936,911.63556)" + style="stroke:#d3d7cf;display:inline;filter:url(#filter4064)" + inkscape:label="#g3852"> + <rect + style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4070" + width="44.285713" + height="44.285713" + x="470.35715" + y="18.790752" + rx="6" + ry="6" /> + <path + inkscape:original-d="M 484.55417,49.762303 492.5,40.933609 504.27158,48.879434" + inkscape:path-effect="#path-effect4050" + inkscape:connector-curvature="0" + id="path4072" + d="m 484.90604,52.679071 c 0,0 -0.72327,1.028211 -2.88202,1.697409 -0.63474,-0.494653 -1.23439,-1.034334 -1.79294,-1.613646 0.43889,-2.217071 1.3855,-3.044283 1.3855,-3.044283 l 2.04237,-1.648571 c -0.73879,-0.915258 -1.3342,-1.946011 -1.75793,-3.043257 l -2.44847,0.945549 c 0,0 -1.18951,0.40671 -3.32932,-0.320779 -0.22277,-0.773276 -0.39067,-1.56235 -0.50204,-2.359331 1.65823,-1.535673 2.91028,-1.648499 2.91028,-1.648499 l 2.62132,-0.133248 c -0.0597,-1.174706 0.0645,-2.358577 0.36658,-3.495332 l -2.53663,-0.674208 c 0,0 -1.20139,-0.37014 -2.50493,-2.216441 0.2743,-0.756533 0.60227,-1.4936 0.98062,-2.20383 2.24419,-0.267701 3.32343,0.376954 3.32343,0.376954 l 2.19901,1.432971 c 0.64217,-0.985455 1.43848,-1.870246 2.35108,-2.612309 l -1.65589,-2.03644 c 0,0 -0.75438,-1.005609 -0.72373,-3.265497 0.66659,-0.45082 1.36515,-0.854347 2.08871,-1.206542 1.97294,1.102524 2.46715,2.258424 2.46715,2.258424 l 0.93675,2.451844 c 1.09876,-0.419794 2.26306,-0.667544 3.43754,-0.731472 l -0.14265,-2.620822 c 0,0 -0.0192,-1.25697 1.3339,-3.067245 0.80426,0.02709 1.6066,0.111239 2.39899,0.251604 0.94809,2.051624 0.66849,3.277254 0.66849,3.277254 l -0.6833,2.534196 c 1.13566,0.306213 2.22322,0.790136 3.21097,1.428761 l 1.42508,-2.204138 c 0,0 0.72327,-1.028211 2.88202,-1.697409 0.63474,0.494653 1.23439,1.034334 1.79294,1.613646 -0.43889,2.217071 -1.3855,3.044283 -1.3855,3.044283 l -2.04237,1.648571 c 0.73879,0.915258 1.3342,1.946011 1.75793,3.043257 l 2.44847,-0.945549 c 0,0 1.18951,-0.40671 3.32932,0.320779 0.22277,0.773276 0.39067,1.56235 0.50204,2.359331 -1.65823,1.535673 -2.91028,1.648499 -2.91028,1.648499 l -2.62132,0.133248 c 0.0597,1.174706 -0.0645,2.358577 -0.36658,3.495332 l 2.53663,0.674208 c 0,0 1.20139,0.37014 2.50493,2.216441 -0.2743,0.756533 -0.60227,1.4936 -0.98062,2.20383 -2.24419,0.267701 -3.32343,-0.376954 -3.32343,-0.376954 l -2.19901,-1.432971 c -0.64217,0.985455 -1.43848,1.870246 -2.35108,2.612309 l 1.65589,2.03644 c 0,0 0.75438,1.005609 0.72373,3.265497 -0.66659,0.45082 -1.36515,0.854347 -2.08871,1.206542 -1.97294,-1.102524 -2.46715,-2.258424 -2.46715,-2.258424 l -0.93675,-2.451844 c -1.09876,0.419794 -2.26306,0.667544 -3.43754,0.731472 l 0.14265,2.620822 c 0,0 0.0192,1.25697 -1.3339,3.067245 -0.80426,-0.02709 -1.6066,-0.111239 -2.39899,-0.251604 -0.94809,-2.051624 -0.66849,-3.277254 -0.66849,-3.277254 l 0.6833,-2.534196 c -1.13566,-0.306213 -2.22322,-0.790136 -3.21097,-1.428761 l -1.42508,2.204138" + style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:1.66475451;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + </g> + <g + id="g4074" + transform="matrix(0.43114968,0,0,0.43114968,-201.41936,933.6356)" + style="stroke:#888a85;display:inline;filter:url(#filter4064)" + inkscape:label="#g3852"> + <rect + style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4076" + width="44.285713" + height="44.285713" + x="470.35715" + y="18.790752" + rx="6" + ry="6" /> + <path + style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:0.79446769;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + d="m 871.875,46.1875 c -1.86715,0.0095 -3.39179,1.39545 -3.65625,3.1875 -0.13267,-0.238038 -0.39472,-0.407705 -0.6875,-0.40625 L 860.21875,49 c -0.42864,0.0022 -0.75216,0.352585 -0.75,0.78125 l 0,0.375 c 0.002,0.428643 0.35273,0.783324 0.78125,0.78125 l 0.71875,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.04661 -0.0143,-0.115964 -0.0313,-0.15625 l 1.25,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.05736 -0.006,-0.140333 -0.0313,-0.1875 l 2.1875,0 c 0.29284,-0.0015 0.55725,-0.166865 0.6875,-0.40625 0.28274,1.789274 1.85161,3.165775 3.71875,3.15625 2.0603,-0.01052 3.69802,-1.720959 3.6875,-3.78125 -0.0105,-2.060291 -1.68969,-3.698024 -3.75,-3.6875 z" + transform="matrix(2.3193801,0,0,2.3193801,-1519.671,-74.824492)" + id="path3839-4" + inkscape:connector-curvature="0" /> + </g> + <g + inkscape:label="#g3852" + style="stroke:#d3d7cf;display:inline;filter:url(#filter4064)" + transform="matrix(0.43114968,0,0,0.43114968,-179.41936,933.6356)" + id="g4106"> + <rect + ry="6" + rx="6" + y="18.790752" + x="470.35715" + height="44.285713" + width="44.285713" + id="rect4108" + style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path4110" + transform="matrix(2.3193801,0,0,2.3193801,-1519.671,-74.824492)" + d="m 871.875,46.1875 c -1.86715,0.0095 -3.39179,1.39545 -3.65625,3.1875 -0.13267,-0.238038 -0.39472,-0.407705 -0.6875,-0.40625 L 860.21875,49 c -0.42864,0.0022 -0.75216,0.352585 -0.75,0.78125 l 0,0.375 c 0.002,0.428643 0.35273,0.783324 0.78125,0.78125 l 0.71875,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.04661 -0.0143,-0.115964 -0.0313,-0.15625 l 1.25,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.05736 -0.006,-0.140333 -0.0313,-0.1875 l 2.1875,0 c 0.29284,-0.0015 0.55725,-0.166865 0.6875,-0.40625 0.28274,1.789274 1.85161,3.165775 3.71875,3.15625 2.0603,-0.01052 3.69802,-1.720959 3.6875,-3.78125 -0.0105,-2.060291 -1.68969,-3.698024 -3.75,-3.6875 z" + style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:0.79446769;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:connector-curvature="0" /> + </g> + <g + id="g4031-9" + transform="matrix(0.45818575,0.68148541,-0.68148541,0.45818575,-2.7897502,485.71067)" + style="display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + sodipodi:type="arc" + style="fill:#555753;fill-opacity:1;stroke:none" + id="path4002-3" + sodipodi:cx="559.67499" + sodipodi:cy="21.754047" + sodipodi:rx="0.88388348" + sodipodi:ry="0.88388348" + d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z" + transform="matrix(2.8,0,0,2.8,-999.63682,-35.444974)" /> + <path + transform="matrix(2.1,0,0,2.1,-600.17454,-24.194616)" + d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z" + sodipodi:ry="0.88388348" + sodipodi:rx="0.88388348" + sodipodi:cy="21.754047" + sodipodi:cx="559.67499" + id="path4004-9" + style="fill:#555753;fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#555753;fill-opacity:1;stroke:none" + id="path4006-4" + sodipodi:cx="559.67499" + sodipodi:cy="21.754047" + sodipodi:rx="0.88388348" + sodipodi:ry="0.88388348" + d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z" + transform="matrix(2.2,0,0,2.2,-671.07968,-28.226177)" /> + <path + style="fill:none;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 563.21055,31.653543 4.41942,-6.187185 -7.6014,-6.187184" + id="path4010-56" + inkscape:connector-curvature="0" /> + <path + transform="matrix(2.4,0,0,2.4,-780.18625,-20.379394)" + d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z" + sodipodi:ry="0.88388348" + sodipodi:rx="0.88388348" + sodipodi:cy="21.754047" + sodipodi:cx="559.67499" + id="path4008-8" + style="fill:#555753;fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + <path + style="fill:none;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 567.45319,25.466358 7.6014,-4.065864" + id="path4012-5" + inkscape:connector-curvature="0" /> + </g> + <path + style="fill:none;stroke:#555753;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + d="m 218.00001,881.25007 -5.8125,0 0,9.1875 10.53125,0 0,-5.2187" + id="rect4432" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4387-8" + width="14.5" + height="9" + x="173.12502" + y="858.11218" + rx="2.9268293" + ry="2.9268293" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:type="arc" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="path4391-3" + sodipodi:cx="408.8125" + sodipodi:cy="220.26843" + sodipodi:rx="2.6875" + sodipodi:ry="2.71875" + d="m 411.5,220.26843 a 2.6875,2.71875 0 1 1 -5.375,0 2.6875,2.71875 0 1 1 5.375,0 z" + transform="matrix(1.1489362,0,0,1.1489362,-286.13697,609.51131)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:#555753;stroke-width:0.47366244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + d="m 242.44524,860.13287 c -0.98011,0 -1.77562,0.6006 -1.77562,1.3586 l 0,1.5632 c 0,0.7581 0.79551,1.3733 1.77562,1.3733 l 4.53349,0 c 0.98012,0 1.77562,-0.6152 1.77562,-1.3733 l 0,-1.5632 c 0,-0.758 -0.7955,-1.3586 -1.77562,-1.3586 l -4.53349,0 z m 0.41557,1.0372 3.70235,0 c 0.51967,0 0.94448,0.2879 0.94448,0.6574 l 0,0.8912 c 0,0.3695 -0.42481,0.672 -0.94448,0.672 l -3.70235,0 c -0.51966,0 -0.94447,-0.3025 -0.94447,-0.672 l 0,-0.8912 c 0,-0.3695 0.42481,-0.6574 0.94447,-0.6574 z" + id="rect4397-0" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path4418-4" + d="m 232.97199,860.13287 c -0.98011,0 -1.77562,0.6006 -1.77562,1.3586 l 0,1.5632 c 0,0.7581 0.79551,1.3733 1.77562,1.3733 l 4.53349,0 c 0.98012,0 1.77562,-0.6152 1.77562,-1.3733 l 0,-1.5632 c 0,-0.758 -0.7955,-1.3586 -1.77562,-1.3586 l -4.53349,0 z m 0.41557,1.0372 3.70236,0 c 0.51966,0 0.94447,0.2879 0.94447,0.6574 l 0,0.8912 c 0,0.3695 -0.42481,0.672 -0.94447,0.672 l -3.70236,0 c -0.51966,0 -0.94447,-0.3025 -0.94447,-0.672 l 0,-0.8912 c 0,-0.3695 0.42481,-0.6574 0.94447,-0.6574 z" + style="fill:#ffffff;fill-opacity:1;stroke:#555753;stroke-width:0.47366244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#555753;stroke-width:0.47366244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4395-0" + width="6.7246785" + height="1.6362466" + x="236.7028" + y="861.57312" + rx="1.0135853" + ry="0.81812328" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#555753;fill-opacity:1;stroke:none;display:inline" + id="rect4416-1" + width="14.495689" + height="6.5407376" + x="132.5179" + y="901.32971" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <text + xml:space="preserve" + style="font-size:5.54432058px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans" + x="139.36653" + y="900.60059" + id="text4406-9" + sodipodi:linespacing="100%" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"><tspan + sodipodi:role="line" + id="tspan4408-6" + x="139.36653" + y="900.60059">You</tspan><tspan + sodipodi:role="line" + x="139.36653" + y="906.1449" + id="tspan4410-2" + style="fill:#eeeeec">Tube</tspan></text> + <path + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + d="m 118.03127,895.15627 0,0.3125 c 0,1.2601 -0.0643,3.4345 -0.35937,5.75 l -1.5625,1e-4 c -0.80183,0.011 -1.64766,4.0737 -1.60938,8.0625 l 8.25,0 c -0.057,-5.5479 1.56902,-11.5211 1.75,-5.6563 0.21453,6.9525 1.74237,-5.1823 1.75,-8.4687 z" + id="rect4428-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csccccscc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + d="m 124.78127,905.73727 -1.9375,-0.063" + id="path4440-4" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + d="m 117.59377,901.20597 6.4375,0" + id="path4442-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4446-9" + width="1.0625" + height="0.375" + x="115.28126" + y="908.11218" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="906.51843" + x="115.34376" + height="0.375" + width="1.0625" + id="rect4448-3" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4450-6" + width="1.0625" + height="0.375" + x="115.50001" + y="904.89343" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="903.42468" + x="115.81251" + height="0.375" + width="1.0625" + id="rect4452-0" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4454-5" + width="1.0625" + height="0.375" + x="116.21876" + y="902.17468" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="900.17468" + x="118.50001" + height="0.375" + width="1.0625" + id="rect4456-0" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4458-2" + width="1.0625" + height="0.375" + x="118.68751" + y="898.70593" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="897.20593" + x="118.75001" + height="0.375" + width="1.0625" + id="rect4460-9" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4462-4" + width="1.0625" + height="0.375" + x="118.75001" + y="895.79968" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="908.11218" + x="120.84376" + height="0.375" + width="1.0625" + id="rect4464-3" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4466-5" + width="1.0625" + height="0.375" + x="120.90627" + y="906.51843" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="904.89343" + x="121.06252" + height="0.375" + width="1.0625" + id="rect4468-1" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4470-7" + width="1.0625" + height="0.375" + x="121.37502" + y="903.42468" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="902.17468" + x="121.78127" + height="0.375" + width="1.0625" + id="rect4472-4" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4474-3" + width="1.0625" + height="0.375" + x="124.06252" + y="900.17468" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="898.70593" + x="124.25002" + height="0.375" + width="1.0625" + id="rect4476-1" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="rect4478-4" + width="1.0625" + height="0.375" + x="124.31252" + y="897.20593" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="895.79968" + x="124.31252" + height="0.375" + width="1.0625" + id="rect4480-6" + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <g + style="display:inline" + id="g4507-4" + transform="matrix(0.92823291,-0.48059851,0.48059851,0.92823291,-312.89954,806.76727)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + sodipodi:nodetypes="csc" + inkscape:connector-curvature="0" + id="path4491-2" + d="m 310.75659,223.79453 c 0.76095,-0.8373 1.2453,-2.02269 1.2453,-3.35786 0,-1.33796 -0.48156,-2.54257 -1.2453,-3.38009" + style="fill:none;stroke:#555753;stroke-width:0.35579938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.47089946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 311.49266,224.75938 c 1.00712,-1.10816 1.64816,-2.67702 1.64816,-4.44411 0,-1.77079 -0.63735,-3.36509 -1.64816,-4.47354" + id="path4496-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csc" /> + <path + sodipodi:nodetypes="csc" + inkscape:connector-curvature="0" + id="path4498-6" + d="m 312.78041,226.18348 c 1.3429,-1.47763 2.19766,-3.56956 2.19766,-5.9258 0,-2.36118 -0.84984,-4.48703 -2.19766,-5.96505" + style="fill:none;stroke:#555753;stroke-width:0.62789989;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + sodipodi:nodetypes="ccccccc" + inkscape:connector-curvature="0" + id="path4500-4" + d="m 309.34375,224.125 0,-7.375 -3.78125,2.07812 -3.4375,-0.10937 0,3.46875 3.4375,-0.125 z" + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + </g> + <path + sodipodi:type="arc" + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="path4515-2" + sodipodi:cx="284.78726" + sodipodi:cy="220.62782" + sodipodi:rx="7.4246211" + sodipodi:ry="7.4246211" + d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z" + transform="translate(-224.73743,661.76263)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + d="m 53.15626,883.15627 c 1.94168,0.712 4.31843,1.1563 6.90625,1.1563 2.58782,0 4.96457,-0.4443 6.90625,-1.1563" + id="path4517-8" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:nodetypes="csc" + inkscape:connector-curvature="0" + id="path4528-8" + d="m 60.45665,888.82867 c 0.71191,-1.9416 1.15625,-4.3184 1.15625,-6.9062 0,-2.5878 -0.44434,-4.9646 -1.15625,-6.9063" + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <text + xml:space="preserve" + style="font-size:3.72799897px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#555753;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans" + x="51.803352" + y="859.21899" + id="text4532-2" + sodipodi:linespacing="100%" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"><tspan + sodipodi:role="line" + id="tspan4534-8" + x="51.803352" + y="859.21899" + style="font-weight:bold;fill:#555753;-inkscape-font-specification:Liberation Sans Bold">Lorem Ip</tspan></text> + <path + style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + d="m 52.25001,862.61227 15.25,0" + id="path4536-8" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path4538-8" + d="m 52.25001,864.86227 15.25,0" + style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + d="m 52.25001,867.11227 15.25,0" + id="path4540-6" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.82322329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + d="m 242.49116,907.21887 5.125,-5.125 -5.125,-5.0937" + id="rect4544-3" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + id="path4549-8" + d="m 237.98183,907.21887 -5.125,-5.125 5.125,-5.0937" + style="fill:none;stroke:#555753;stroke-width:0.82322329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <g + style="display:inline" + id="g4213" + transform="translate(49.48448,-140.79121)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + sodipodi:type="star" + style="fill:#555753;fill-opacity:1;stroke:none" + id="path4802" + sodipodi:sides="8" + sodipodi:cx="98.48214" + sodipodi:cy="-10.267858" + sodipodi:r1="9.1071424" + sodipodi:r2="8.4139032" + sodipodi:arg1="-1.5707963" + sodipodi:arg2="-1.1780972" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 98.48214,-19.375 6.43972,2.66742 2.66742,6.439723 -2.66742,6.4397218 -6.439721,2.6674201 -6.439722,-2.6674204 -2.66742,-6.4397225 2.667421,-6.439722 z" + transform="matrix(0.92307692,0.3846154,-0.3846154,0.92307692,-44.340246,974.7537)" /> + <path + transform="matrix(0.74691191,0.31121331,-0.31121331,0.74691191,-26.237457,980.1736)" + d="m 98.48214,-19.375 6.43972,2.66742 2.66742,6.439723 -2.66742,6.4397218 -6.439721,2.6674201 -6.439722,-2.6674204 -2.66742,-6.4397225 2.667421,-6.439722 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="-1.1780972" + sodipodi:arg1="-1.5707963" + sodipodi:r2="8.4139032" + sodipodi:r1="9.1071424" + sodipodi:cy="-10.267858" + sodipodi:cx="98.48214" + sodipodi:sides="8" + id="path4804" + style="fill:none;stroke:#d3d7cf;stroke-width:2.47171569;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="star" /> + <path + style="fill:none;stroke:#555753;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + d="m 53.26552,1056.9525 -5.5,6.2008 5.5,6.2009" + id="rect4806" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <path + id="path4812" + d="m 67.781143,1069.3407 5.46875,-6.2009 -5.46875,-6.1736" + style="fill:none;stroke:#555753;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + </g> + <path + style="fill:#555753;fill-opacity:1;stroke:none;display:inline" + id="path4257" + d="m 115.39024,855.00555 c 0.0904,0.0266 0.18708,0.0371 0.27111,0.0797 0.24682,0.12501 0.80382,0.53514 1.00046,0.67918 0.72548,0.53142 1.43751,1.08068 2.14837,1.63134 1.22364,0.99003 2.36274,2.09287 3.41202,3.2665 0.43117,0.4822 1.01205,1.207 1.42675,1.7166 0.97898,1.2314 2.022,2.4234 2.86791,3.7533 0.20576,0.2994 0.39551,0.6797 0.65579,0.9028 -0.10862,-0.1107 -0.10877,-0.099 0.0344,-0.01 0.19118,0.1291 -1.63528,2.8328 -1.82646,2.7036 l 0,0 c -0.18814,-0.022 -0.0511,0 -0.37755,-0.1793 -0.55628,-0.365 -1.09599,-0.7525 -1.61517,-1.1691 -1.27322,-1.0021 -2.36476,-2.2048 -3.47982,-3.3749 -1.53016,-1.5621 -3.0115,-3.1717 -4.57958,-4.6966 -0.94249,-1.01074 -1.92636,-2.0326 -2.54392,-3.28422 -0.14292,-0.18424 2.46273,-2.20539 2.60565,-2.02115 z" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#555753;fill-opacity:1;stroke:none;display:inline" + id="path4259" + d="m 112.109,867.43007 c 0.0548,-0.091 0.10266,-0.1866 0.16432,-0.2731 0.23235,-0.3261 0.52565,-0.6137 0.79275,-0.9102 0.42229,-0.4689 0.38553,-0.4337 0.82852,-0.9537 1.44214,-1.6363 3.06836,-3.0981 4.69856,-4.5425 1.63203,-1.40989 3.17698,-2.9167 4.78859,-4.3486 0.46305,-0.4369 0.97793,-0.80137 1.52221,-1.12653 0.15824,-0.21119 3.14491,2.0267 2.98666,2.23789 l 0,0 c -0.2952,0.52243 -0.62275,1.02042 -1.01852,1.47475 -0.88192,1.11919 -1.78212,2.22369 -2.79371,3.23049 -0.29346,0.2921 -0.60222,0.5684 -0.90606,0.8497 -0.31321,0.2899 -0.63003,0.5759 -0.94504,0.8639 -1.67153,1.4209 -3.37366,2.8163 -5.22715,3.9963 -0.49876,0.3405 -0.57121,0.3777 -1.0203,0.7266 -0.39341,0.3057 -0.75974,0.6889 -1.26518,0.7962 -0.14292,0.1842 -2.74857,-1.8369 -2.60565,-2.0212 z" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + d="m 135.39024,855.00555 c 0.0904,0.027 0.18708,0.037 0.27111,0.08 0.24682,0.125 0.80382,0.5352 1.00046,0.6792 0.72548,0.5314 1.43751,1.0807 2.14837,1.6314 1.22364,0.99 2.36274,2.0928 3.41202,3.26652 0.43117,0.4822 1.01205,1.207 1.42675,1.7166 0.97898,1.2314 2.022,2.4234 2.86791,3.7533 0.20576,0.2994 0.39551,0.6797 0.65579,0.9028 -0.10862,-0.1107 -0.10877,-0.099 0.0344,-0.01 0.19118,0.1291 -1.63528,2.8328 -1.82646,2.7036 l 0,0 c -0.18814,-0.022 -0.0511,0 -0.37755,-0.1793 -0.55628,-0.365 -1.09599,-0.7525 -1.61517,-1.1691 -1.27322,-1.0021 -2.36476,-2.2048 -3.47982,-3.3749 -1.53016,-1.5621 -3.0115,-3.1717 -4.57958,-4.6966 -0.94249,-1.01082 -1.92636,-2.03262 -2.54392,-3.28432 -0.14292,-0.1842 2.46273,-2.2054 2.60565,-2.0211 z" + id="path4263" + style="fill:#d3d7cf;fill-opacity:1;stroke:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + d="m 132.109,867.43017 c 0.0548,-0.091 0.10266,-0.1866 0.16432,-0.2731 0.23235,-0.3261 0.52565,-0.6137 0.79275,-0.9102 0.42229,-0.4689 0.38553,-0.4337 0.82852,-0.9537 1.44214,-1.6363 3.06836,-3.0981 4.69856,-4.5425 1.63203,-1.40992 3.17698,-2.91672 4.78859,-4.34862 0.46305,-0.4369 0.97793,-0.8014 1.52221,-1.1266 0.15824,-0.2112 3.14491,2.0267 2.98666,2.2379 l 0,0 c -0.2952,0.5224 -0.62275,1.0204 -1.01852,1.4748 -0.88192,1.11922 -1.78212,2.22372 -2.79371,3.23052 -0.29346,0.2921 -0.60222,0.5684 -0.90606,0.8497 -0.31321,0.2899 -0.63003,0.5759 -0.94504,0.8639 -1.67153,1.4209 -3.37366,2.8163 -5.22715,3.9963 -0.49876,0.3405 -0.57121,0.3777 -1.0203,0.7266 -0.39341,0.3057 -0.75974,0.6889 -1.26518,0.7962 -0.14292,0.1842 -2.74857,-1.8369 -2.60565,-2.0212 z" + id="path4265" + style="fill:#d3d7cf;fill-opacity:1;stroke:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <g + style="display:inline" + id="g4283" + transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,294.0656)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + sodipodi:nodetypes="ccccccc" + inkscape:connector-curvature="0" + id="path4269" + d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z" + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none" /> + <path + inkscape:connector-curvature="0" + id="path4271" + d="m -44.467884,1124.9404 4.644661,0" + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + d="m -42.239747,1107.2336 0,17.6813" + id="path4275" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path4279" + d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z" + style="fill:#555753;stroke:#555753;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" /> + <rect + ry="0.42804927" + rx="0.37616169" + y="1105.3309" + x="-44.73621" + height="1.8614606" + width="5.1800866" + id="rect4281" + style="fill:#555753;fill-opacity:1;stroke:none" /> + </g> + <rect + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + id="rect4290" + width="3.5355339" + height="1.8561553" + x="174.89275" + y="859.06403" + rx="1" + ry="1" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" + d="m 214.75589,862.65317 c 3.31942,-0.632 4.06019,-2.1721 5.3033,-4.08897 0.42304,-0.6524 -0.64726,-2.63586 0,-3.13491 0.10703,-0.0825 0.93192,0 1.06066,0 2.52315,0 1.41421,3.50161 1.41421,4.77048 0,0.2317 -0.47723,0.6815 -0.17677,0.6815 2.44972,0 2.94209,0.3603 4.41942,1.4993 0.0697,0.054 0.31741,3.8443 0.17677,3.9527 -0.26074,0.201 -0.49042,0.5145 -0.7071,0.6815 -0.13627,0.105 0.38563,0.7684 0.17677,1.0904 -0.17664,0.2724 -0.85358,0.8061 -1.23743,0.9541 -0.36233,0.1398 -0.89015,0 -1.23744,0.1363 -1.96875,0.759 -2.1166,-0.9523 -3.18198,-1.363 -0.34866,-0.1344 -0.63592,-0.1088 -1.06066,-0.2726 -0.99671,-0.3842 -3.88909,0.6704 -3.88909,-0.2726 0,-1.2852 -0.2556,-3.5996 -1.06066,-4.6342 z" + id="path4292" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path4294" + d="m 205.42921,862.12677 c -3.31942,0.632 -4.06019,2.1721 -5.3033,4.089 -0.42304,0.6524 0.64726,2.6358 0,3.1349 -0.10703,0.082 -0.93192,0 -1.06066,0 -2.52315,0 -1.41421,-3.5016 -1.41421,-4.7705 0,-0.2317 0.47723,-0.6815 0.17677,-0.6815 -2.44972,0 -2.94209,-0.3603 -4.41942,-1.4993 -0.0697,-0.054 -0.31741,-3.84428 -0.17677,-3.95268 0.26074,-0.201 0.49042,-0.5145 0.7071,-0.6815 0.13627,-0.105 -0.38563,-0.7684 -0.17677,-1.0904 0.17664,-0.2724 0.85358,-0.8061 1.23743,-0.9541 0.36233,-0.1398 0.89015,0 1.23744,-0.1363 1.96875,-0.759 2.1166,0.9523 3.18198,1.363 0.34866,0.1344 0.63592,0.1088 1.06066,0.2726 0.99671,0.3842 3.88909,-0.6704 3.88909,0.2726 0,1.2852 0.2556,3.59958 1.06066,4.63418 z" + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + transform="translate(-204.73743,661.76269)" + d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z" + sodipodi:ry="7.4246211" + sodipodi:rx="7.4246211" + sodipodi:cy="220.62782" + sodipodi:cx="284.78726" + id="path4298" + style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + sodipodi:type="arc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:nodetypes="csc" + inkscape:connector-curvature="0" + id="path4300" + d="m 73.15626,883.15627 c 1.94168,0.712 4.31843,1.1563 6.90625,1.1563 2.58782,0 4.96457,-0.4443 6.90625,-1.1563" + style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline" + d="m 80.45665,888.82867 c 0.71191,-1.9416 1.15625,-4.3184 1.15625,-6.9062 0,-2.5878 -0.44434,-4.9646 -1.15625,-6.9063" + id="path4302" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + transform="translate(-184.73743,661.76263)" + d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z" + sodipodi:ry="7.4246211" + sodipodi:rx="7.4246211" + sodipodi:cy="220.62782" + sodipodi:cx="284.78726" + id="path4306" + style="fill:none;stroke:#555753;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + sodipodi:type="arc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + d="m 94.285536,887.89997 11.048544,-11.0485" + id="path4308" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#555753;stroke:none;display:inline" + id="rect4310" + width="3.3587573" + height="12.020815" + x="115.93771" + y="876.12292" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + y="876.12292" + x="120.53392" + height="12.020815" + width="3.3587573" + id="rect4312" + style="fill:#555753;stroke:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#555753;stroke:none;display:inline" + d="m 134.32248,876.12297 11.31371,6.0104 -11.31371,6.0104 z" + id="rect4314" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <g + style="display:inline" + transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,313.68781)" + id="g4317" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none" + d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z" + id="path4319" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + d="m -44.467884,1124.9404 4.644661,0" + id="path4321" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path4323" + d="m -42.239747,1107.2336 0,17.6813" + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <path + style="fill:#555753;stroke:#555753;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" + d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z" + id="path4325" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <rect + style="fill:#555753;fill-opacity:1;stroke:none" + id="rect4327" + width="5.1800866" + height="1.8614606" + x="-44.73621" + y="1105.3309" + rx="0.37616169" + ry="0.42804927" /> + </g> + <g + style="display:inline" + id="g4329" + transform="matrix(0.24508333,0.24508333,-0.24508333,0.24508333,458.00011,612.37085)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + sodipodi:nodetypes="ccccccc" + inkscape:connector-curvature="0" + id="path4331" + d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z" + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none" /> + <path + inkscape:connector-curvature="0" + id="path4333" + d="m -44.467884,1124.9404 4.644661,0" + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + d="m -42.239747,1107.2336 0,17.6813" + id="path4335" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path4337" + d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z" + style="fill:#555753;stroke:#555753;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" /> + <rect + ry="0.42804927" + rx="0.37616169" + y="1105.3309" + x="-44.73621" + height="1.8614606" + width="5.1800866" + id="rect4339" + style="fill:#555753;fill-opacity:1;stroke:none" /> + </g> + <g + id="layer1-2" + transform="matrix(0.03334717,0,0,0.03334717,191.57984,885.59897)" + style="fill:#555753;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + id="path11522" + style="fill:#555753;fill-opacity:1" + d="m 264.62704,45.67985 56.31152,-101.021534 0.2677,36.946034 118.51291,-0.267671 c 21.1765,-2.244605 39.74272,-10.852596 53.18801,-27.040291 C 449.99593,42.074998 437.6363,104.18491 348.60347,104.22236 l -27.39721,0 -0.2677,41.05114 -56.31152,-99.59365 z M 128.9798,105.11479 C 65.618201,85.84639 36.055796,7.7860213 7.07577,-47.220709 c 13.282679,12.076484 38.139773,29.363022 52.577167,29.364467 27.689982,0.06456 55.380063,0.116317 83.070083,0.174562 l 83.88712,0 -0.26776,122.43949 -0.26771,0.35698 -97.09487,0 z M 2.5,-79.206629 42.995596,-161.8012 3.5060915,-183.49253 l 118.3343785,0 57.2039,103.877161 -38.79429,-23.228801 c -12.44295,26.27544 -24.88589,52.550878 -37.32884,78.826316 C 88.601045,-24.268303 74.280847,-24.518751 59.960649,-24.769199 32.037317,-31.279427 12.61125,-53.254123 2.5,-79.206629 z m 395.45406,53.939396 -52.29561,-96.380927 105.66215,-63.98618 51.13531,102.449252 c 1.54832,24.517706 -38.03694,58.635841 -62.6066,58.370427 l -41.89525,-0.452572 z M 88.64259,-250.78088 l 53.98405,-80.90589 c 52.35957,-19.50079 82.68955,22.59846 101.8318,49.13587 l -50.86768,97.63029 -104.94817,-65.86027 z m 204.54178,43.54987 c -10.85783,-25.59753 -25.36515,-54.87764 -43.50654,-80.336 -16.24176,-22.7925 -35.86597,-42.67852 -50.7326,-51.5631 l 136.53974,-0.26767 c 24.52088,2.20137 36.43539,16.49668 49.43976,36.05358 l 19.63307,34.53651 30.34224,-19.3654 -57.11457,101.73554 -123.15347,0.26768 38.55237,-21.06114 z" + inkscape:connector-curvature="0" /> + </g> + <path + style="fill:none;stroke:#555753;display:inline" + d="m 219.92452,876.86347 1.33532,1.5307 -5.05101,4.4063 4.00584,4.592 5.05101,-4.4063 1.29423,1.4837 1.19091,-7.757 z" + id="rect4425" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#555753;fill-opacity:1;stroke:none;display:inline" + id="rect4564-9" + width="10.935946" + height="7.925663" + x="71.833412" + y="900.66992" + rx="1.9019035" + ry="2.3056474" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#555753;stroke-width:0.69802254;display:inline" + id="rect4566-9" + width="7.7661061" + height="7.5413885" + x="73.447395" + y="896.3468" + rx="1.9019035" + ry="2.3056474" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + ry="2.3056474" + rx="1.9019035" + y="900.66992" + x="92.208412" + height="7.925663" + width="10.935946" + id="rect4506" + style="fill:#555753;fill-opacity:1;stroke:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.69802254;display:inline" + d="m 108.78126,899.75007 0,-1.0938 c 0,-1.2773 -0.8526,-2.3124 -1.90625,-2.3124 l -3.96875,0 c -1.05366,0 -1.90625,1.0351 -1.90625,2.3124 l 0,2.9376" + id="rect4508" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssssc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#555753;stroke:none;display:inline" + id="rect4514" + width="19.512196" + height="19.512196" + x="150.24391" + y="892.60608" + rx="2.9268293" + ry="2.9268293" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + ry="2.9268293" + rx="2.9268293" + y="892.60608" + x="170.24391" + height="19.512196" + width="19.512196" + id="rect4516" + style="fill:#555753;stroke:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + ry="2.3056474" + rx="1.9019035" + y="900.66992" + x="151.83342" + height="7.925663" + width="10.935946" + id="rect4518" + style="fill:#eeeeec;fill-opacity:1;stroke:none;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + ry="2.3056474" + rx="1.9019035" + y="896.3468" + x="153.4474" + height="7.5413885" + width="7.7661061" + id="rect4520" + style="fill:none;stroke:#eeeeec;stroke-width:0.69802254;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#eeeeec;fill-opacity:1;stroke:none;display:inline" + id="rect4522" + width="10.935946" + height="7.925663" + x="172.20842" + y="900.66992" + rx="1.9019035" + ry="2.3056474" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:nodetypes="cssssc" + inkscape:connector-curvature="0" + id="path4524" + d="m 188.78127,899.75007 0,-1.0938 c 0,-1.2773 -0.85259,-2.3124 -1.90625,-2.3124 l -3.96875,0 c -1.05365,0 -1.90625,1.0351 -1.90625,2.3124 l 0,2.9376" + style="fill:none;stroke:#eeeeec;stroke-width:0.69802254;display:inline" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + d="m 61.2575,895.73577 c -0.85405,0.9453 -1.14575,2.2161 -0.88721,3.3884 l -8.17918,8.1791 c -0.14244,0.1425 -0.12201,0.3935 0.0507,0.5661 l 2.21807,2.2181 c 0.17268,0.1727 0.42791,0.1974 0.57035,0.055 l 8.13693,-8.1369 c 1.26093,0.3161 2.65155,-0.016 3.63762,-1.0013 0.66189,-0.6619 1.02334,-1.5095 1.09849,-2.3744 l -2.11666,2.1167 -3.2405,-0.8746 -0.87454,-3.2405 2.14201,-2.1419 c -0.88104,0.066 -1.74292,0.4331 -2.41663,1.1068 -0.0467,0.047 -0.0968,0.09 -0.13942,0.1395 z" + id="path4529" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccsssscscccccsc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#555753;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:none;display:inline" + d="m 201.14016,895.80807 -8.25003,8.25 -0.94202,3.5156 2.58822,2.5882 3.10935,-0.8332 10.50754,-10.5075 -2e-5,-2.3881 -1.69404,-1.694 -1.94401,0 -9.97205,9.972 3e-5,1.972 0.61101,0.611 1.73597,0 9.36804,-9.368" + id="path3395" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:#555753;stroke:none;display:inline" + id="rect3397" + width="19.512196" + height="19.512196" + x="210.24391" + y="892.60608" + rx="2.9268293" + ry="2.9268293" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:none;stroke:#eeeeec;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + d="m 214.67284,895.14537 c 7.11789,-1.5098 3.04383,2.9586 9.72807,1.6024 0.48786,-0.099 0.94287,0.3982 0.94287,0.8928 0,0 0,6.7482 0,6.9956 0,0.2473 -0.31338,0.7228 -0.94287,0.8928 -6.70194,1.3208 -2.58353,-3.1887 -9.72807,-1.6024 -0.39933,0.17 -0.94286,-0.3982 -0.94286,-0.8928 l 0,-6.9955 c 0,-0.4947 0.45501,-0.776 0.94286,-0.8929 z" + id="rect3409" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccscccssc" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="fill:none;stroke:#eeeeec;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + id="rect4190" + width="1.125" + height="16.3125" + x="212.62502" + y="894.73718" + ry="0.40000001" + rx="0.40000001" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:export-ydpi="90" + inkscape:export-xdpi="90" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + transform="translate(-224.73743,701.76263)" + d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z" + sodipodi:ry="7.4246211" + sodipodi:rx="7.4246211" + sodipodi:cy="220.62782" + sodipodi:cx="284.78726" + id="path4020" + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1.62554049;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="path4022" + sodipodi:cx="284.78726" + sodipodi:cy="220.62782" + sodipodi:rx="7.4246211" + sodipodi:ry="7.4246211" + d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z" + transform="matrix(0.61517998,0,0,0.61517998,-115.14559,786.66463)" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:export-ydpi="90" + inkscape:export-xdpi="90" + inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png" + sodipodi:type="arc" + style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + id="path4024" + sodipodi:cx="284.78726" + sodipodi:cy="220.62782" + sodipodi:rx="7.4246211" + sodipodi:ry="7.4246211" + d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z" + transform="translate(-204.73743,701.76269)" /> + <g + inkscape:label="#g3852" + style="stroke:#888a85;display:inline;filter:url(#filter4064)" + transform="matrix(0.43114968,0,0,0.43114968,-201.41936,955.6356)" + id="g3139"> + <rect + ry="6" + rx="6" + y="18.790752" + x="470.35715" + height="44.285713" + width="44.285713" + id="rect3141" + style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + </g> + <g + id="g3145" + transform="matrix(0.43114968,0,0,0.43114968,-179.41936,955.6356)" + style="stroke:#d3d7cf;display:inline;filter:url(#filter4064)" + inkscape:label="#g3852"> + <rect + style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3147" + width="44.285713" + height="44.285713" + x="470.35715" + y="18.790752" + rx="6" + ry="6" /> + </g> + <text + xml:space="preserve" + style="font-size:17.09149551px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#888a85;fill-opacity:1;stroke:none;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" + x="5.6234956" + y="979.64215" + id="text3151" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3153" + x="5.6234956" + y="979.64215">?</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3155" + y="979.64215" + x="27.623495" + style="font-size:17.09149551000000145px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d3d7cf;fill-opacity:1;stroke:none;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" + xml:space="preserve"><tspan + y="979.64215" + x="27.623495" + id="tspan3157" + sodipodi:role="line">?</tspan></text> + </g> +</svg> diff --git a/view/theme/testbubble/jot-header.tpl b/view/theme/testbubble/jot-header.tpl new file mode 100644 index 0000000000..1555950561 --- /dev/null +++ b/view/theme/testbubble/jot-header.tpl @@ -0,0 +1,251 @@ + +<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script> +<script language="javascript" type="text/javascript"> + +var editor=false; +var textlen = 0; + +function initEditor(cb) { + if (editor==false) { + $("#profile-jot-text-loading").show(); + tinyMCE.init({ + theme : "advanced", + mode : "specific_textareas", + editor_selector: /(profile-jot-text|prvmail-text)/, + plugins : "bbcode,paste,fullscreen,autoresize", + theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code,fullscreen", + theme_advanced_buttons2 : "", + theme_advanced_buttons3 : "", + theme_advanced_toolbar_location : "top", + theme_advanced_toolbar_align : "center", + theme_advanced_blockformats : "blockquote,code", + //theme_advanced_resizing : true, + //theme_advanced_statusbar_location : "bottom", + paste_text_sticky : true, + entity_encoding : "raw", + add_unload_trigger : false, + remove_linebreaks : false, + force_p_newlines : false, + force_br_newlines : true, + forced_root_block : '', + convert_urls: false, + content_css: "$baseurl/view/custom_tinymce.css", + theme_advanced_path : false, + setup : function(ed) { + //Character count + ed.onKeyUp.add(function(ed, e) { + var txt = tinyMCE.activeEditor.getContent(); + textlen = txt.length; + if(textlen != 0 && $('#jot-perms-icon').is('.unlock')) { + $('#profile-jot-desc').html(ispublic); + } + else { + $('#profile-jot-desc').html(' '); + } + + if(textlen <= 140) { + $('#character-counter').removeClass('red'); + $('#character-counter').removeClass('orange'); + $('#character-counter').addClass('grey'); + } + if((textlen > 140) && (textlen <= 420)) { + $('#character-counter').removeClass('grey'); + $('#character-counter').removeClass('red'); + $('#character-counter').addClass('orange'); + } + if(textlen > 420) { + $('#character-counter').removeClass('grey'); + $('#character-counter').removeClass('orange'); + $('#character-counter').addClass('red'); + } + $('#character-counter').text(textlen); + }); + ed.onInit.add(function(ed) { + ed.pasteAsPlainText = true; + $("#profile-jot-text-loading").hide(); + $("#profile-jot-submit-wrapper").show(); + $("#profile-upload-wrapper").show(); + $("#profile-attach-wrapper").show(); + $("#profile-link-wrapper").show(); + $("#profile-youtube-wrapper").show(); + $("#profile-video-wrapper").show(); + $("#profile-audio-wrapper").show(); + $("#profile-location-wrapper").show(); + $("#profile-nolocation-wrapper").show(); + $("#profile-title-wrapper").show(); + $("#profile-jot-plugin-wrapper").show(); + $("#character-counter").show(); + if (typeof cb!="undefined") cb(); + }); + } + }); + editor = true; + // setup acl popup + $("a#jot-perms-icon").fancybox({ + 'transitionIn' : 'none', + 'transitionOut' : 'none' + }); + } else { + if (typeof cb!="undefined") cb(); + } +} // initEditor +</script> +<script type="text/javascript" src="include/ajaxupload.js" ></script> +<script> + var ispublic = '$ispublic'; + $(document).ready(function() { + /* enable tinymce on focus */ + $("#profile-jot-text").focus(function(){ + if (editor) return; + $(this).val(""); + initEditor(); + }); + var uploader = new window.AjaxUpload( + 'wall-image-upload', + { action: 'wall_upload/$nickname', + name: 'userfile', + onSubmit: function(file,ext) { $('#profile-rotator').show(); }, + onComplete: function(file,response) { + tinyMCE.execCommand('mceInsertRawHTML',false,response); + $('#profile-rotator').hide(); + } + } + ); + var file_uploader = new window.AjaxUpload( + 'wall-file-upload', + { action: 'wall_attach/$nickname', + name: 'userfile', + onSubmit: function(file,ext) { $('#profile-rotator').show(); }, + onComplete: function(file,response) { + tinyMCE.execCommand('mceInsertRawHTML',false,response); + $('#profile-rotator').hide(); + } + } + ); + $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() { + var selstr; + $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() { + selstr = $(this).text(); + $('#jot-perms-icon').removeClass('unlock').addClass('lock'); + $('#jot-public').hide(); + $('.profile-jot-net input').attr('disabled', 'disabled'); + }); + if(selstr == null) { + $('#jot-perms-icon').removeClass('lock').addClass('unlock'); + $('#jot-public').show(); + $('.profile-jot-net input').attr('disabled', false); + } + + }).trigger('change'); + + }); + + function deleteCheckedItems() { + var checkedstr = ''; + + $('.item-select').each( function() { + if($(this).is(':checked')) { + if(checkedstr.length != 0) { + checkedstr = checkedstr + ',' + $(this).val(); + } + else { + checkedstr = $(this).val(); + } + } + }); + $.post('item', { dropitems: checkedstr }, function(data) { + window.location.reload(); + }); + } + + function jotGetLink() { + reply = prompt("$linkurl"); + if(reply && reply.length) { + reply = bin2hex(reply); + $('#profile-rotator').show(); + $.get('parse_url?url=' + reply, function(data) { + tinyMCE.execCommand('mceInsertRawHTML',false,data); + $('#profile-rotator').hide(); + }); + } + } + + function jotGetVideo() { + reply = prompt("$utubeurl"); + if(reply && reply.length) { + tinyMCE.execCommand('mceInsertRawHTML',false,'[youtube]' + reply + '[/youtube]'); + } + } + + function jotVideoURL() { + reply = prompt("$vidurl"); + if(reply && reply.length) { + tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]'); + } + } + + function jotAudioURL() { + reply = prompt("$audurl"); + if(reply && reply.length) { + tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]'); + } + } + + + function jotGetLocation() { + reply = prompt("$whereareu", $('#jot-location').val()); + if(reply && reply.length) { + $('#jot-location').val(reply); + } + } + + function jotTitle() { + reply = prompt("$title", $('#jot-title').val()); + if(reply && reply.length) { + $('#jot-title').val(reply); + } + } + + function jotShare(id) { + $('#like-rotator-' + id).show(); + $.get('share/' + id, function(data) { + if (!editor) $("#profile-jot-text").val(""); + initEditor(function(){ + tinyMCE.execCommand('mceInsertRawHTML',false,data); + $('#like-rotator-' + id).hide(); + $(window).scrollTop(0); + }); + }); + } + + function linkdropper(event) { + var linkFound = event.dataTransfer.types.contains("text/uri-list"); + if(linkFound) + event.preventDefault(); + } + + function linkdrop(event) { + var reply = event.dataTransfer.getData("text/uri-list"); + event.target.textContent = reply; + event.preventDefault(); + if(reply && reply.length) { + $('#profile-rotator').show(); + $.get('parse_url?url=' + reply, function(data) { + if (!editor) $("#profile-jot-text").val(""); + initEditor(function(){ + tinyMCE.execCommand('mceInsertRawHTML',false,data); + $('#profile-rotator').hide(); + }); + }); + } + } + + function jotClearLocation() { + $('#jot-coord').val(''); + $('#profile-nolocation-wrapper').hide(); + } + + $geotag + +</script> + diff --git a/view/theme/testbubble/jot.tpl b/view/theme/testbubble/jot.tpl new file mode 100644 index 0000000000..0e930208a5 --- /dev/null +++ b/view/theme/testbubble/jot.tpl @@ -0,0 +1,75 @@ + +<div id="profile-jot-wrapper" > + <div id="profile-jot-banner-wrapper"> + <div id="profile-jot-desc" > </div> + <div id="character-counter" class="grey" style="display: none;">0</div> + <div id="profile-rotator-wrapper" style="display: $visitor;" > + <img id="profile-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display:none;" /> + </div> + </div> + + <form id="profile-jot-form" action="$action" method="post" > + <input type="hidden" name="type" value="wall" /> + <input type="hidden" name="profile_uid" value="$profile_uid" /> + <input type="hidden" name="return" value="$return_path" /> + <input type="hidden" name="location" id="jot-location" value="$defloc" /> + <input type="hidden" name="coord" id="jot-coord" value="" /> + <input type="hidden" name="title" id="jot-title" value="" /> + <input type="hidden" name="post_id" value="$post_id" /> + + <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" /> + <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea> + {{ if $content }}<script>initEditor();</script>{{ endif }} + + <div id="profile-upload-wrapper" class="jot-tool" style="display: none;" > + <div id="wall-image-upload-div" ><a onclick="return false;" id="wall-image-upload" class="icon border camera" title="$upload"></a></div> + </div> + <div id="profile-attach-wrapper" class="jot-tool" style="display: none;" > + <div id="wall-file-upload-div" ><a href="#" onclick="return false;" id="wall-file-upload" class="icon border attach" title="$attach"></a></div> + </div> + <div id="profile-link-wrapper" class="jot-tool" style="display: none;" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" > + <a id="profile-link" class="icon border link" title="$weblink" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></a> + </div> + <div id="profile-youtube-wrapper" class="jot-tool" style="display: none;" > + <a id="profile-youtube" class="icon border youtube" title="$youtube" onclick="jotGetVideo(); return false;"></a> + </div> + <div id="profile-video-wrapper" class="jot-tool" style="display: none;" > + <a id="profile-video" class="icon border video" title="$video" onclick="jotVideoURL(); return false;"></a> + </div> + <div id="profile-audio-wrapper" class="jot-tool" style="display: none;" > + <a id="profile-audio" class="icon border audio" title="$audio" onclick="jotAudioURL(); return false;"></a> + </div> + <div id="profile-location-wrapper" class="jot-tool" style="display: none;" > + <a id="profile-location" class="icon border globe" title="$setloc" onclick="jotGetLocation(); return false;"></a> + </div> + <div id="profile-nolocation-wrapper" class="jot-tool" style="display: none;" > + <a id="profile-nolocation" class="icon border noglobe" title="$noloc" onclick="jotClearLocation(); return false;"></a> + </div> + <div id="profile-title-wrapper" class="jot-tool" style="display: none;" > + <a id="profile-title" class="icon border article" title="$title" onclick="jotTitle(); return false;"></a> + </div> + + <div id="profile-jot-submit-wrapper" style="display:none;padding-left: 400px;"> + <input type="submit" id="profile-jot-submit" name="submit" value="$share" /> + <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" > + <a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon $lockstate" title="$permset"></a>$bang</div> + </div> + + <div id="profile-jot-plugin-wrapper" style="display: none;"> + $jotplugins + </div> + <div id="profile-jot-tools-end"></div> + + <div style="display: none;"> + <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;"> + $acl + <hr style="clear:both"/> + <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle" /> + <div id="profile-jot-email-end"></div> + $jotnets + </div> + </div> + +<div id="profile-jot-end"></div> +</form> +</div> diff --git a/view/theme/testbubble/login-bg.gif b/view/theme/testbubble/login-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..cde836c893f64bcfec04b9c817e3371ff122fe19 GIT binary patch literal 237 zcmV<J022R4Nk%w1VGsZi0K@<Q?d|R1;o{25%KZHN{%H*VYY@`X(*O4G|Ml+G)z#6& zyzubw&CSjE`T5=5-Tq?(-qOnX@94+N&Bw>b{bmUKcqz}))c5uC(7v?)v4a2P)ZNa- z@$&T2)z|&~{r~^}A^8LV00000EC2ui01yBW000GQ;3tk`X`bk)Wk@<6#nZYULKH{p zEx|?+kif!I0vIL|#ZMubBmjWH2OtmxIFVa~6JQ7!1CK!f5W#StOTv&C3=E8h2vI1s n+#cd5;2fT3B_0kF0v!+!GARoV78n&7dMN`JIW(4+BOw4gP{MS* literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/lrarrow.gif b/view/theme/testbubble/lrarrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa26769446d0c934b42ede073b15e7b792c519a5 GIT binary patch literal 236 zcmZ?wbhEHbRA5kGSj4~}At9lzu5M~->f+)O92}en1ByRc7#SGY8FUzc0Hl_Id1J+{ zJO2!r%ogV^SXEQa=X0R+0=r)0iixMy=XibSd-HJLLWA|wtsiI{^mqNlTimR;mSuu! z`^pstJ13hgZ<(LBS~_Lwp0lQ&KkUxm%b#lGH~szxi>VrAyB=5kn3H_w_tS*j`sV!V zrk3Wm_Ku1+v+kbMzS4+^StYvd85xrj_-mtLVyAmc<OT$m%@cETFbvMNO<u?Dw^1&9 ii_v!1aD%OTbkr1Qn9kgP^w`XtQ>r3oF9>ilSOWk7D_}7I literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/mail_head.tpl b/view/theme/testbubble/mail_head.tpl new file mode 100644 index 0000000000..89615cbd03 --- /dev/null +++ b/view/theme/testbubble/mail_head.tpl @@ -0,0 +1,7 @@ +<h3>$messages</h3> + +<ul class="tabs-wrapper"> +<li><a href="message" class="tabs">$inbox</a></li> +<li><a href="message/sent" class="tabs">$outbox</a></li> +<li><a href="message/new" class="tabs">$new</a></li> +</ul> diff --git a/view/theme/testbubble/menu-user-pin.jpg b/view/theme/testbubble/menu-user-pin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26449569f40425feda7ce4986e1935b4a67076d1 GIT binary patch literal 385 zcmex=<NpH&0WUXCHwH#VMg|WcWcdG&LD;z{HL)Z$MWH;iBtya7(>LJ%Z3brsW+o;O z0s<BwV&!0EWnp3EVrOUL;Njxo;pXDz=H(L-;N=tK<K`9+6A%;@5fv5X;TM+>6Oj-S z5fuR$!pIEN!@|nR%E~Fi%grl7GWdUhL6C!igMo*cQHg;`kdaxC@&6G9F|hj?kO4D0 zP+UoX0ca!8(Qp|?CT11}RyIK)MRrHSz(k-LQIOYB024D%SX>Y&jv~PbwD12dkj+2_ zvmk>#!}N~gJ*B%@y6YT;gydRoMhD3xvih4@Kir$MLU@5~^Uuh%)Ox?j37$JRdX8kK Zcl($$OlaY6yuN=|Q1|jygZ=++0szW8M1TMQ literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/menu-user-pin.png b/view/theme/testbubble/menu-user-pin.png new file mode 100644 index 0000000000000000000000000000000000000000..6becfbb663c2726e085edfb5d6bfb42e06a35398 GIT binary patch literal 276 zcmV+v0qg#WP)<h;3K|Lk000e1NJLTq000aC000OG1^@s6&Ey{O0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUywn;=mRCwB4kV_82FbqT+w-uii7huIL z;3#Q(y7orw*>M68Y6%I?#i>L`8rhD=9xJZvx)?%mpipRxF(yrmAChtI3C$~cOeu{@ z>KF9~j_{quhI@tJEFw4Jfrkl}7R5x-+*057M;V6UL2<!OH|<~rw{T+vj)fDtdM-F) z@$=s2Q<6C-YsA@Yv7JGq1kMI(%~i~zMf2y7(KO9d&*J8C-IMi0+qNhDJ{AQw@7MjW a00RIAA5ln%G~8+c0000<MNUMnLSTY<m~U_Z literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/nav.tpl b/view/theme/testbubble/nav.tpl new file mode 100644 index 0000000000..f19ed2da16 --- /dev/null +++ b/view/theme/testbubble/nav.tpl @@ -0,0 +1,55 @@ +$langselector + +<span id="banner">$banner</span> + +<div id="user-menu" > + <a id="user-menu-label" onclick="openClose('user-menu-popup'); return false" href="$nav.home.0">$sitelocation</a> + + <ul id="user-menu-popup" + onmouseover="if (typeof tmenu != 'undefined') clearTimeout(tmenu); openMenu('user-menu-popup')" + onmouseout="tmenu=setTimeout('closeMenu(\'user-menu-popup\');',200)"> + + {{ if $nav.register }}<li><a id="nav-register-link" class="nav-commlink $nav.register.2" href="$nav.register.0" title="$nav.register.1">$nav.register.1</a></li>{{ endif }} + + {{ if $nav.home }}<li><a id="nav-home-link" class="nav-commlink $nav.home.2" href="$nav.home.0">$nav.home.1</a></li>{{ endif }} + + {{ if $nav.network }}<li><a id="nav-network-link" class="nav-commlink $nav.network.2" href="$nav.network.0">$nav.network.1</a></li>{{ endif }} + + {{ if $nav.community }} + <li><a id="nav-community-link" class="nav-commlink $nav.community.2" href="$nav.community.0" title="$nav.community.3" >$nav.community.1</a></li> + {{ endif }} + + <li><a id="nav-search-link" class="nav-link $nav.search.2" href="$nav.search.0" title="$nav.search.1">$nav.search.1</a></li> + <li><a id="nav-directory-link" class="nav-link $nav.directory.2" href="$nav.directory.0" title="$nav.directory.1">$nav.directory.1</a></li> + + {{ if $nav.notifications }}<li><a id="nav-notify-link" class="nav-commlink nav-sep $nav.notifications.2" href="$nav.notifications.0">$nav.notifications.1</a></li>{{ endif }} + {{ if $nav.messages }}<li><a id="nav-messages-link" class="nav-commlink $nav.messages.2" href="$nav.messages.0">$nav.messages.1</a></li>{{ endif }} + {{ if $nav.contacts }}<li><a id="nav-contacts-link" class="nav-commlink $nav.contacts.2" href="$nav.contacts.0">$nav.contacts.1</a></li>{{ endif }} + + {{ if $nav.profiles }}<li><a id="nav-profiles-link" class="nav-commlink nav-sep $nav.profiles.2" href="$nav.profiles.0">$nav.profiles.1</a></li>{{ endif }} + {{ if $nav.settings }}<li><a id="nav-settings-link" class="nav-commlink $nav.settings.2" href="$nav.settings.0">$nav.settings.1</a></li>{{ endif }} + + {{ if $nav.manage }}<li><a id="nav-manage-link" class="nav-commlink $nav.manage.2" href="$nav.manage.0">$nav.manage.1</a></li>{{ endif }} + + {{ if $nav.admin }}<li><a id="nav-admin-link" class="nav-commlink $nav.admin.2" href="$nav.admin.0">$nav.admin.1</a></li>{{ endif }} + + <li><a id="nav-help-link" class="nav-link $nav.help.2" href="$nav.help.0" title="$nav.help.1">$nav.help.1</a></li> + + {{ if $nav.login }}<li><a id="nav-login-link" class="nav-link $nav.login.2" href="$nav.login.0" title="$nav.login.1">$nav.login.1</a></li> {{ endif }} + {{ if $nav.logout }}<li><a id="nav-logout-link" class="nav-commlink nav-sep $nav.logout.2" href="$nav.logout.0">$nav.logout.1</a></li> {{ endif }} + </ul> + + <div id="notifications"> + {{ if $nav.network }}<a id="net-update" class="nav-ajax-update" href="$nav.network.0" title="$nav.network.1"></a>{{ endif }} + {{ if $nav.home }}<a id="home-update" class="nav-ajax-update" href="$nav.home.0" title="$nav.home.1"></a>{{ endif }} + {{ if $nav.notifications }}<a id="notify-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }} + {{ if $nav.messages }}<a id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }} + </div> + +</div> + + +{{ if $nav.apps }}<a id="nav-apps-link" class="nav-link $nav.apps.2" href="$nav.apps.0" title="$nav.apps.1">$nav.apps.1</a>{{ endif }} + + + diff --git a/view/theme/testbubble/next.png b/view/theme/testbubble/next.png new file mode 100644 index 0000000000000000000000000000000000000000..353e2e72a6513fac3f3775b347354a4fbbb7c622 GIT binary patch literal 891 zcmV->1BCpEP)<h;3K|Lk000e1NJLTq000*N001Wl1^@s6<WSQM00004b3#c}2nYxW zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10{BTpK~zYIrPIG}8)Y2F@%Qs2xc-si8n@yPU|?WiWFk${f*_?X zkoFoZandar`5#zVSi0Wi4Uuc=#Ex@;q|$X_j})j719Re9h4@E~v$-z=O%%1Z@3H$# z);*tleZKd|j}j5e<?_{kCAu#{8Bxy_@?d>^<1w$f)Y{tG8_)l4Jq6x*Y3~WKzU_Hl zXIfnUb<$cJ0s}0dW8b#z+|;-TUys@UFpPRr7ibZFNyyAkTcFiUyl0S`5BuGnNelFQ z@4mmM;9+7?)b%jxHA<yY))ZGF!s6oM?6tRxKLRTT?>q^6(XD#D-b)H<fFKA4&7;;T zP&L38(%F>J7wEGeK@bcI`Qj>~HVq0E)0s=#mSts(Z~)hJ`-LlS-3PW3c_mBecx-`w z`GM=Y{X)KI0ky;exG}Ea75qZMJw(+F3+lrPl!%Oc%d)H#I^F<oCsv5s&t>OIl}aTX zJNeo2JTD^FcY#JCuH>WcX}jh)PTFYlvt?OU3MEyP+)50?UM_R_PNh-_jc|bF<>gCr zZ)U5&vO)ak=27c2WBfwFCh%!uSjnA<@biMpxh<4@k`S#;j02R*<*S1@`V*KN6AQ=w zTZS#$wsV6xswTi7YImZ^ZQIU;QO^hFld?)=$$0WfU_@=KuRjWm@KULi4g1|4BN!ev zkDq-7Flz#*v#A|~>jrSOdDL1Bf?xm%*Z&3F02UHiQJaN)@f?OR*Wa?N3`!a(Su&V- ztB@~RuIu(MJ{)>1mStto@is6u3`36P1zZPi7{Ikr@GH3EIBAsBfSZY|sCpq^yf+Gl z3uo>)PP%*At^pq#OuS93?|PmWjSJ~1;D!l&j(1Pn-URT92@EiE`1|1p3cgQFirPWU zVSrgJd}EOFJMHd@@B79u{C_N05;D7;liruU@BcFi44?(|!^mAxKXp!eUrYl7=u9fJ z1so39+wHWwpHB+|%p4pX^nd&HseAma`G-<c1XWeSx6R|$cl-PMBQJ=_`VVK<WtUF) Rcnkml002ovPDHLkV1o5coE!iE literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/notifications.png b/view/theme/testbubble/notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f6a90e81cbb8b5b46a56733f2debfa2d58b042 GIT binary patch literal 2253 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 bVBG%$7_*g*yMvrZ00000NkvXXu0mjfWB5)i literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/photo-menu.jpg b/view/theme/testbubble/photo-menu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b96a96fa1542ddde6c4f9ad30f2a366138e9ceed GIT binary patch literal 2801 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 E03U43umAu6 literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/photo_view.tpl b/view/theme/testbubble/photo_view.tpl new file mode 100644 index 0000000000..4582751c60 --- /dev/null +++ b/view/theme/testbubble/photo_view.tpl @@ -0,0 +1,40 @@ +<div id="live-display"></div> +<h3><a href="$album.0">$album.1</a></h3> + +<div id="photo-edit-link-wrap"> +{{ if $tools }} +<a id="photo-edit-link" href="$tools.edit.0">$tools.edit.1</a> +- +<a id="photo-toprofile-link" href="$tools.profile.0">$tools.profile.1</a> +{{ endif }} +{{ if $lock }} - <img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,'photo$id');" /> {{ endif }} +</div> + +<div id="photo-photo"> + {{ if $prevlink }}<div id="photo-prev-link"><a href="$prevlink.0">$prevlink.1</a></div>{{ endif }} + <a href="$photo.href" title="$photo.title"><img src="$photo.src" /></a> + {{ if $nextlink }}<div id="photo-next-link"><a href="$nextlink.0">$nextlink.1</a></div>{{ endif }} +</div> + +<div id="photo-photo-end"></div> +<div id="photo-caption" >$desc</div> +{{ if $tags }} +<div id="in-this-photo-text">$tags.0</div> +<div id="in-this-photo">$tags.1</div> +{{ endif }} +{{ if $tags.2 }}<div id="tag-remove"><a href="$tags.2">$tags.3</a></div>{{ endif }} + +{{ if $edit }}$edit{{ endif }} + +{{ if $likebuttons }} +<div id="photo-like-div"> + $likebuttons + $like + $dislike +</div> +{{ endif }} + +$comments + +$paginate + diff --git a/view/theme/testbubble/photography.png b/view/theme/testbubble/photography.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec919f2b3cf1d4d782a0b3009f8f7654cceca94 GIT binary patch literal 766 zcmV<a0s;MrP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!ph-kQRCwByQ%P$SK@@)7T}!VM2F4gB zD#R#p%fvv;B_eo9Tyls<jqy*22mJ@)K}JOoJSlS(1;fN3L`4FkG34SwFyO`D0%~UK zt-5`$X27dH_?W4x?|pA=V2pv30`fdJ5YEz4ePpb1`01YA<(x2B9>{n0m-7A{r3b^q zdtKs^k7=4<7zP-D@4<GXX#zlS`&M<jR(p6Sj>3M%EFeo$1yK}37>1CfYCTozT(i;q zoTRCKGZrq+pWoP6zXo}B#Bm*PYzab86cor&K>ZbHcS7iBbRbF88opgICMS-zIA^Yl z&UVjPaIRA%Qz$^uNF<6PXtz7iY_=$CXf#?sneTgUp%8%U*uXdgW?5KUw>~oL3uIXa z%IykK22x5L0MA8MEcQVk3eY8)CS%krQ~FFqAt<BnJC$hRU5aAORvVb-`QUmUaK^E& z1mXmn6{p$E>DkvaGiN@bKw)+D)q&-u#Y2{584P);%Atj&=w4A|DJUgF*GVakk5AMt z%wM_>T^l|-JNFI1Fkh}LAEb=PM>}J=rXz3<Fhx$a=a_yJLZvcx6CL05@B;C6>iCHd z#33&E5L}J|(h+)*IEe@oEDmt*?v0aE$3`LoI)6uOtvs&}5{J0tV>>9|Tfk^^woRKz zOXKQ>W-7W~-c?SAhW0(FFFqRhy7gs#bMxb*=LJB+NtFcGwZZdna(eE)v0x3lXdwj) z!%lU3`&ac@{V@bV0epnxIC@GViFF_7%xozW49`uJCNVz<02fP-iHze?32Ey$;$)br zfh$V?rL=#W)2HU%Tb3CoG3uxcEL<YVQQdYl1Q+^_-iVXLk^aT8H%3RtFVh!z6$6!M wXW-u~L;OIzL#&a&ep;~q6zKFs8h->B0FuEU_j}EX-v9sr07*qoM6N<$g2<sz)&Kwi literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/premium.png b/view/theme/testbubble/premium.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad601c0f1e3db18b9a8f4add6865bf6ad78611c GIT binary patch literal 2317 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 literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/prev.png b/view/theme/testbubble/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae6022af5701934cfa5e3e7391fcab8827398c0 GIT binary patch literal 853 zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq000*N001Wl1^@s6<WSQM00004b3#c}2nYxW zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10@6uDK~zYIwU^6M6JZdAPfs$F5N={h*;_t>Rchfa8%+jGL}bvC z!sTpv4;QRc?x=t;3715SXsPjjc>vkC(XGl=2q7WUE(lZtA=4q!%lS`zr>kfB?;c`i zG!mw1s!OX&eG2UB4C-R$agW+G5{t#ws1dlX>z<a@=2;L2D-H;YE)>tX|2r4}82%z$ z_m7mhuIrwbHs1_@Pz~8P<%r;E2Qa|&qpr*i!_YuH4dQMmEir=Pnj40pL9wR*ID!GZ zvaG2WqOz2Mdj#@KE}IWCGdsdd;DiwTCYR0kq*AFY0Mvw=rm2EB4&bIEmiVn#^X-8F z;Lw_zrl~HkF2+F!3o?G^Rhzp<M@KixA6Cu01hxP~1mO2x&8P1N1Hge#u?&365lj35 zMOVnOto3Tg6`7l+sV=W9O^U$4$6DYDcpwmPFRw06fVfu#wv}KlFi?7-fk420s?$FK z;I;t#X=}3(N+y#v!9XeV)1Cft0DX>F;?G-~g<vw7{3}QTu7!n#s~~<T(0<X}O~H6P zE&>C90>vH{=)P)h?~Pb2wk8Gdz=4C8eP!fbwB27X7yuLko;YZ<BD>>*gM)2#!&$K( z33TW4+qviU8YuC{GcUoE5NI#ti<|S2NTgK^XJ-EW>(4y^Q;uq;i=HM`Y_NB?lp1Lg zvPKeh=wAD0GMVj;cK=;4%?RLKQ0#fbFj_=#0EkATg^m*^2LQ~93|z%$wG0m2=h0}i z(9!NUL<UTkpxEi5p`m6Ge4jzm(Ezxd%V(<^96Ccw2K``42@I~}3L8)N8#pdSWz*kz zNbgMlZqf7y0L!xSu$4Oi<^=F-UY|A>4u^e!AoJa*YcXPa4W`hs?TQR~Q1=R5w&m)z zbOatd&i(vn-TOHJq|@oG^|fp-nC1`D5NNXTf1>IoT2Wn|GY!FaV_={!z)*%ke3qFl fcGGxbEb;vxK8sTe6HUu~00000NkvXXu0mjf@o{<! literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/profile_tabs.tpl b/view/theme/testbubble/profile_tabs.tpl new file mode 100644 index 0000000000..c236490b28 --- /dev/null +++ b/view/theme/testbubble/profile_tabs.tpl @@ -0,0 +1,9 @@ + +<div class="tabs-wrapper" > + <a href="$url" id="profile-tab-status-link" class="tabs {{if $activetab==posts}}active{{endif}}" >$status</a> + <a href="$url?tab=profile" id="profile-tab-profile-link" class="tabs {{if $activetab==profile}}active{{endif}}" >$profile</a> + <a href="$phototab" id="profile-tab-photos-link" class="tabs {{if $activetab==photos}}active{{endif}}" >$photos</a> + {{ if $events }}<a href="events" id="profile-tab-events-link" class="tabs {{if $activetab==events}}active{{endif}}" >$events</a>{{ endif }} + {{ if $notes }}<a href="notes" id="profile-tab-notes-link" class="tabs {{if $activetab==notes}}active{{endif}}" >$notes</a>{{ endif }} +<div class="tabs-end"></div> +</div> diff --git a/view/theme/testbubble/search.png b/view/theme/testbubble/search.png new file mode 100644 index 0000000000000000000000000000000000000000..51c428594b9a8d78f10e1968c1cdcdd236c9fcc0 GIT binary patch literal 808 zcmV+@1K0eCP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!%1J~)RCwBCQcX|PP!zrGdwuV<Qy2(# zU|@hm1M(s9Yt2Rzqgyv15j7DLS4PDjKq9V4*cx@gN@H}v#)TR*G0MW2pe7RIMk5;q zhWVh(bUM?%dS5{VX>-z#ci(yEo^v6JA`M|pPToF#<nX|3XGf;c*4iAUTT=Oy(=?Mx zIVr<1K-YE9G!6d0)MjUV{Kn|q%NKWaq6t+fLkZPt70O-(Jg<@qLOJBFyK_Mpf|PPM z!TkKYky|&f%@_t{oU`~ORpk3sD3!{v?rwnVmWndcx^ubQN{A$Q=r#e7q5s&gcrD3f zJ=nGlmT7_z0+_*o5DFUJxJiUTm_}8zihL&lUH<*+U_&wqmSqB}P@>|3Km<VJZ-82@ zrWBo}l#T|q0CqM(1!u%gSRhOR1m*v|LW#zqX?U{oLA7EUl!C8nu#JBNxRIk|&iO8v zDXLIP1$w~+M|J2A*_#A4g((?hI%3yi6ca?i&{(yG23Lqq_7Lbjef_J78T*S1_ksh* zr{g%U3}#>*iIdtUxOi#o1NIi`x)v`gBX`2&2H2K>gfLoDjr9*R&HI|_1^#0MEUE#S znwmP4Y-q5)E`CnqSfRd6=~80e7#TH4sDadjS|zP%!9WyM&)GJA9f7}0sRS}HF(KMA z9bs2@uUjk>%tAgV%H<NlIjHPE(Dmc|g)0k-Up{59cdA+<L{COC9Oi;O1(10)$|-E6 z3(<#YN0<l?v82*O9KC;cdU)yQcgOcJ&SC-9)>ffd%zrEv3&#|Jwza7dQHNlND#Ar1 z5GP6-?x_d&rq8(Ux+s@Qkk4fyn_U5XKTS^#_D49fWkL~TGbVKtG<5dayoCe{3A@f2 z8o6vgc{DSKgC(p)9V9#tP39S$QXON#iHUGT!x|1*HAYbLVXKvIh&SnU=Iz+k>(ARe mI<qQ8#thlh+xPyD00RKpwlM>Izspeo0000<MNUMnLSTXz;bRm4 literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/search_item.tpl b/view/theme/testbubble/search_item.tpl new file mode 100644 index 0000000000..39c74ef817 --- /dev/null +++ b/view/theme/testbubble/search_item.tpl @@ -0,0 +1,40 @@ +<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" > + <div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" > + <div class="wall-item-info" id="wall-item-info-$id"> + <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id" + onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')" + onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)"> + <a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id"> + <img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a> + <span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span> + <div class="wall-item-photo-menu" id="wall-item-photo-menu-$id"> + <ul> + $item_photo_menu + </ul> + </div> + </div> + <div class="wall-item-photo-end"></div> + <div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div> + </div> + <div class="wall-item-lock-wrapper">$lock</div> + <div class="wall-item-tools" id="wall-item-tools-$id"> + $drop + </div> + <div class="wall-item-content" id="wall-item-content-$id" > + <div class="wall-item-title" id="wall-item-title-$id">$title</div> + <div class="wall-item-title-end"></div> + <div class="wall-item-body" id="wall-item-body-$id" >$body</div> + </div> + <div class="wall-item-author"> + <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a> + <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div> + + </div> + + </div> + <div class="wall-item-wrapper-end"></div> +</div> + +<div class="wall-item-outside-wrapper-end$indent" ></div> + <div class="wall-item-conv" id="wall-item-conv-$id" >$conv</div> + diff --git a/view/theme/testbubble/star.png b/view/theme/testbubble/star.png new file mode 100644 index 0000000000000000000000000000000000000000..a327ba14e462a494523d9d5be1195989b08b36ad GIT binary patch literal 2129 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 literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/style.css b/view/theme/testbubble/style.css new file mode 100644 index 0000000000..218a3cc8db --- /dev/null +++ b/view/theme/testbubble/style.css @@ -0,0 +1,3225 @@ +/* + style.css + TestBubble + + Created by Anne Walk and Devlon Duthie on 2011-09-24. + Based loosely on the Dipsy theme. +*/ +/* ========== */ +/* = Colors + +Red links - #b20202 +Red link hover - #db0503 +Red Gradients (buttons and other gradients) - #b20202 and #d60808 + +Grey text - #626262 +Grey Gradients (buttons and other gradients) - #bdbdbd and #a2a2a2 + +Dark Grey Gradients - #7c7d7b and #555753 + +You can switch out the colors of header, buttons and links by using a find and replace in your text editor. + + = */ +/* ========== */ + +body { + margin: 0px; + padding: 0px; + font-family: freesans,helvetica,arial,clean,sans-serif; + font-size: 15px; + color: #626262; + width: 100%; +} + +img { border: 0 none; max-width: 550px; } + +a { color: #b20202; text-decoration: none; margin-bottom:1px;} +a:hover { color: #db0503; padding-bottom: 0px;} + +h3 > a, h4 > a { + font-size: 18px; + color: #626262; +} + +h3 { + margin: 0px; + margin-bottom: 5px; + font-size: 18px; + color: #626262; +} + +h2 { + color: #626262; +} + +p { + + max-width: 600px; +} + +label { + font-variant:small-caps; +} + +li { + list-style: none; +} + +.required { display: inline; color: #b20202; } +.fakelink { color: #b20202; cursor: pointer; } +.fakelink :hover { color: #db0503; } + +input[type=text] { + border: 2px solid #b0b0b0; + padding: 2px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} + +input[type=submit] { + margin-top: 10px; + border: none; + font-size: 0.9em; + display: inline; + padding: 5px 5px 5px 5px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color:#efefef; + text-align: center; +} + +input[type=submit]:hover { + border: none; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + color: #efefef; +} +input[type=submit]:active { + position:relative; + top:1px; +} + +.smalltext { font-size: 0.7em } + +::selection { background:#fdf795; color: #000; /* Safari and Opera */ } +::-moz-selection { background:#fdf795; color: #000; /* Firefox */ } + +section { + margin: 10px 11% 0px 11%; + font-size: 0.9em; + line-height: 1.2em; + padding-right: 230px; +} + +/* ========= */ +/* = Login = */ +/* ========= */ + +#login-name-wrapper { + vertical-align: middle; + margin: auto; +} + +#login-name-wrapper input { + width: 120px; + margin-left: 20px; +} + +#login-password-wrapper { + vertical-align: middle; + margin: auto; +} + +#login-extra-links { + width: 110px; + margin-top: 20px; + border: none; + font-size: 0.9em; + padding: 5px 0px 5px 5px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color:#efefef; + text-align: center; +} + +#login-extra-links:hover { + border: none; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + color: #efefef; +} + +#login-extra-links:active { + position:relative; + top:1px; +} + +#login-extra-links a { + color: #efefef; + text-align: center; +} + +#login-extra-filler { + display: none; +} + +#login-extra-links a { margin-right: 20px; } + +/* ========= */ +/* = Panel = */ +/* ========= */ + +#panel { + position: absolute; + font-size:0.8em; + -webkit-border-radius: 5px ; + -moz-border-radius: 5px; + border-radius: 5px; + border: 1px solid #494948; + background-color: #2e3436; + opacity:50%; + color: #eeeeec; + padding:1em; + z-index: 200; + -moz-box-shadow: 7px 7px 12px #434343; + -webkit-box-shadow: 7px75px 12px #434343; + box-shadow: 7px 7px 10px #434343; +} + +/* ========= */ +/* = Pager = */ +/* ========= */ + +.pager { + padding-top: 30px; + display:block; + clear: both; + text-align: center; +} + +.pager a { + color: #626262; +} + +.pager span { padding: 4px; margin:4px; } +.pager_current { background-color: #b20202; color: #ffffff; } + +/* ======= */ +/* = Nav = */ +/* ======= */ + +nav { + height: 50px; + display: block; + position: relative; + padding: 0px 10%; + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) ); + background:-moz-linear-gradient( center top, #7c7d7b 5%, #555753 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7c7d7b', endColorstr='#555753'); + background-color:#7c7d7b; + border-bottom: 1px solid #494948; +} +nav a { text-decoration: none; color: #eeeeec; border:0px;} +nav a:hover { text-decoration: none; color: #eeeeec; border:0px;} + +nav #banner { + display: block; + position: absolute; + margin-left: 20px; + margin-top: 5px; + padding-bottom:5px; +} +nav #banner #logo-text a { + display: hidden; + font-size: 40px; + font-weight: bold; + margin-left: 3px; +} + +nav #user-menu { + display: block; + width: 250px; + float: right; + margin-right:15px; + margin-top: 10px; + padding: 3px; + position: relative; + vertical-align: middle; + background:-webk/* margin-right:10px;*/it-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) ); + background:-moz-linear-gradient( center top, #797979 5%, #898988 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988'); + background-color:#898988; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color:#efefef; + text-decoration:none; + text-align: center; + border: 1px solid #9a9a9a; +} + +nav #user-menu-label:after{ + content: url("menu-user-pin.png") no-repeat; + padding-left: 15px; +} + +nav #user-menu-label { + vertical-align: middle; + font-size: 12px; + padding: 5px; + text-align: center; +} + +ul#user-menu-popup { + display: none; + position: absolute; + background:-webk/* margin-right:10px;*/it-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) ); + background:-moz-linear-gradient( center top, #797979 5%, #898988 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988'); + background-color:#898988; + width: 100%; + padding: 10px 0px; + margin: 0px; + top: 20px; + left: 0px; + border: 1px solid #9a9a9a; + border-top: none; + -webkit-border-radius: 0px 0px 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + border-radius: 0px 0px 5px 5px; + -moz-box-shadow: 5px 5px 10px #242424; + -webkit-box-shadow: 5px 5px 10px #242424; + box-shadow: 5px 5px 10px #242424; + z-index: 10000; +} + +ul#user-menu-popup li { display: block; } +ul#user-menu-popup li a { display: block; padding: 5px; } +ul#user-menu-popup li a:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) ); + background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202'); + background-color:#d60808; +} + +ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:inset; } + +/* ============= */ +/* = Notifiers = */ +/* ============= */ + +#notifications { + height: 20px; + position: absolute; + top:32px; left: 600px; +} +.nav-ajax-update { + width: 30px; + height: 19px; + background: transparent url('notifications.png') 0px 0px no-repeat; + color: #ffffff; + font-weight: bold; + font-size: 0.8em; + padding-top: 0.2em; + text-align: center; + float: left; + margin-right: -4px; + display: none; +} +#net-update { background-position: 0px 0px; } +#mail-update { background-position: -30px 0px; } +#notify-update { background-position: -60px 0px; } +#home-update { background-position: -90px 0px; } + +#lang-select-icon { + cursor: pointer; + position: absolute; + left: 5px; + top: 5px; +} + +#language-selector { + position: absolute; + top: 0; + left: 16px; +} + +/* =================== */ +/* = System Messages = */ +/* =================== */ + +#sysmsg_info, #sysmsg { + position:fixed; + bottom: 0px; right:20%; + -moz-box-shadow: 7px 7px 12px #434343; + -webkit-box-shadow: 7px75px 12px #434343; + box-shadow: 7px 7px 10px #434343; + padding: 10px; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + -webkit-border-radius: 5px 5px 0px 0px; + -moz-border-radius: 5px 5px 0px 0px; + border-radius: 5px 5px 0px 0px; + border: 1px solid #da2c2c; + border-bottom:0px; + padding-bottom: 50px; + z-index: 1000; + color: #efefef; + font-style: bold; +} + +#sysmsg_info br, +#sysmsg br { + display:block; + margin:2px 0px; + border-top: 1px solid #dddddd; +} + +/* ================= */ +/* = Aside/Sidebar = */ +/* ================= */ + +aside { + position: absolute; + width: 260px; + right: 11%; + font-size: 0.8em; + font-style: bold; +} + +aside a{ + padding-bottom: 5px; + +} + +.vcard { + font-size: 1em; + font-variant:small-caps; +} + +.marital { + font-size: 1em; + font-variant:small-caps; +} + +.homepage-label { + font-size: 1em; + font-variant:small-caps; +} + +.vcard .fn { + font-size: 1.4em; + font-weight: bold; + border-bottom: none; + padding-top: 10px; +} + +.vcard #profile-photo-wrapper { + margin: 10px 0px; + padding: 12px; + width: 175px; + background-color: #f3f3f3; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +aside h4 { font-size: 1.3em; } + +aside #viewcontacts { + text-align: center; + font-weight: bold; + font-variant:small-caps; + font-size: 1.1em; + padding-top: 5px; +} + +#viewcontacts a{ + color: #898989; +} + +#profile-extra-links ul { margin-left: 0px; padding-left: 0px; list-style: none; } + +#dfrn-request-link { + -moz-box-shadow:inset 0px 1px 0px 0px #a65151; + -webkit-box-shadow:inset 0px 1px 0px 0px #a65151; + box-shadow:inset 0px 1px 0px 0px #a65151; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) ); + background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202'); + background-color:#d60808; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + border:1px solid #fc5656; + display:inline-block; + color:#f0e7e7; + font-family:Trebuchet MS; + font-size:19px; + font-weight:bold; + text-align: center; + padding:10px; + width: 185px; + text-decoration:none; + text-shadow:1px 1px 0px #b36f6f; +} + +#dfrn-request-link:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#dfrn-request-link:active { + position:relative; + top:1px; +} + +#dfrn-request-intro { + width: 600px; +} + +#netsearch-box { + background-color: #f6f6f6; + padding: 10px 10px 10px 20px; +} + +h3#search:before { + content: url("search.png"); + padding-right: 10px; + vertical-align: middle; +} + +#network-new-link { + background-color: #f3f3f3; + border: 1px solid #cdcdcd; + margin-bottom: 10px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} + +#group-sidebar { + vertical-align: middle; + margin: auto; + margin-top: 20px; + padding-bottom: 10px; +} + +#sidebar-group-list { + margin-left: 30px; + margin-right: 30px; +} + +#sidebar-group-list > a{ + padding-bottom: 10px; +} + +.widget { + margin-top: 20px; + -moz-box-shadow: 1px 2px 6px 0px #959494; + -webkit-box-shadow: 1px 2px 6px 0px #959494; + box-shadow: 1px 2px 6px 0px #959494; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f8f8f8), color-stop(1, #f6f6f6) ); + background:-moz-linear-gradient( center top, #f8f8f8 5%, #f6f6f6 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f6f6f6'); + background-color:#f8f8f8; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + border:1px solid #eee; + color:#e6e6e6; + text-shadow:-1px 0px 0px #bdbdbd; + border: 1px solid #cdcdcd; +} + +#sidebar-new-group { + padding:7px; + width: 165px; + margin: auto; + margin-left: 40px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + display:inline-block; + color:#efefef; + text-decoration:none; + text-align: center; +} + +#sidebar-new-group:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#sidebar-new-group:active { + position:relative; + top:1px; +} + +#sidebar-new-group a { + color: #efefef; + font-size: 14px; + text-align: center; + margin: auto; +} + +ul .sidebar-group-li{ + list-style: none; + font-size: 1.2em; + padding-bottom: 5px; +} + +ul .sidebar-group-li img{ + display: none; +} + +.widget h3{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f0edf0), color-stop(1, #e2e2e2) ); + background:-moz-linear-gradient( center top, #f0edf0 5%, #e2e2e2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0edf0', endColorstr='#e2e2e2'); + background-color:#f0edf0; + -moz-border-radius:5px 5px 0px 0px; + -webkit-border-radius:5px 5px 0px 0px; + border-radius:5px 5px 0px 0px; + border:1px solid #e2e2e2; + border-bottom: 1px solid #cdcdcd; + padding-top:5px; + padding-bottom: 5px; + vertical-align: baseline; + text-align: center; + text-shadow:-1px 0px 0px #bdbdbd; +} + +#group-sidebar h3:before{ + content: url("groups.png"); + padding-right: 10px; + vertical-align: middle; +} + +#saved-search-list{ + margin-top: 15px; + padding-bottom: 20px; +} + +.saved-search-li { + list-style: none; + font-size: 1.2em; +} + +.saved-search-li .icon { + margin-right: 5px; +} + +/** +* contacts block +*/ +.contact-block-img { + width: 42px; + height: 42px; + padding-right: 2px; +} +.contact-block-div { + float: left; +} + +.contact-block-textdiv { width: 150px; height: 34px; float: left; } +#contact-block-end { clear: both; } + +/* ======= */ +/* = Jot = */ +/* ======= */ + +#profile-jot-text_tbl { margin-bottom: 10px; } +#profile-jot-text_ifr { width: 99.9%!important } +#profile-jot-submit-wrapper { +} + +#profile-jot-perms, #profile-jot-submit { + width: 60px; + font-size: 12px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + display:inline-block; + color:#efefef; + text-decoration:none; + text-align: center; +} + +#profile-jot-perms { + overflow: hidden; + border: 0px; + margin-left:10px; +} + +#jot-perms-perms .icon { + height: 1px; +} + +#profile-jot-submit { + float: left; + margin-right: 10px; + border: 0px; + margin-top: 0px; +} + +#profile-jot-perms:hover, #profile-jot-submit:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} +#profile-jot-perms:active, #profile-jot-submit:active { + position:relative; + top:1px; +} + +#character-counter { + float: left; padding: 8px 10px; +} +#profile-rotator-wrapper { + float: right; +} + +.jot-tool { + float: left; + margin-right: 5px; +} +#profile-jot-tools-end, +#profile-jot-banner-end { clear: both; } + +#profile-jot-email-wrapper { + margin: 10px 10% 0px 10%; + border: 1px solid #eeeeee; + border-bottom: 0px; +} +#profile-jot-email-label { background-color: #555753; color: #ccccce; padding: 5px;} +#profile-jot-email { margin: 5px; width: 98%; } + +#profile-jot-networks { + margin: 0px 10%; + border: 1px solid #eeeeee; + border-top: 0px; + border-bottom: 0px; + padding: 5px; +} +#profile-jot-acl-wrapper { + margin: 0px 10px; + border: 1px solid #eeeeee; + border-top: 0px; + display:block!important; +} +#group_allow_wrapper, +#group_deny_wrapper, +#acl-permit-outer-wrapper { width: 47%; float: left; } + +#contact_allow_wrapper, +#contact_deny_wrapper, +#acl-deny-outer-wrapper { width: 47%; float: right; } + +#acl-permit-text {background-color: #555753; color: #ccccce; padding: 5px; float: left;} +#jot-public {background-color: #555753; color: #ff0000; padding: 5px; float: left;} +#acl-deny-text {background-color: #555753; color: #ccccce; padding: 5px; float: left;} + +#acl-permit-text-end, +#acl-deny-text-end { clear: both; } +#profile-jot-wrapper { + margin-top: 0px; + padding-top: 0px; +} + +profile-jot-banner-wrapper { + padding: 0px; + margin: 0px; +} + +.contact-h4 { + font-size: 1.2em; +} + +/* ======== */ +/* = Tabs = */ +/* ======== */ + +.tabs-wrapper { + width: 450px; + list-style: none; + padding: 10px; + margin: 0px 0px 10px 0px; + border-bottom: 1px solid #efefef; +} +.tabs-wrapper li { display: inline;} + +.tabs { + padding: 5px 10px 5px 10px; + margin-right: 5px; + font-style: bold; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color:#efefef; + text-decoration:none; + text-align: center; +} + +.tabs:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + color:#efefef; + padding: 5px 10px 5px 10px; + margin-right: 5px; +} +.tabs:active { + position:relative; + top:1px; + color:#efefef; + padding: 5px 10px 5px 10px; + margin-right: 5px; +} + +a.active { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + color:#efefef; + padding: 5px 10px 5px 10px; + margin-right: 5px; +} + +/* ========= */ +/* = Posts = */ +/* ========= */ + +.wall-item-outside-wrapper { + margin-top: 50px; +} +.wall-item-outside-wrapper-end { clear: both;} +.wall-item-content-wrapper { position: relative; max-width: 95%; } +.wall-item-photo-menu { display: none;} +.wall-item-photo-menu-button { + display:none; + text-indent: -99999px; + background: #eeeeee url("menu-user-pin.png") no-repeat 75px center; + position: absolute; + overflow: hidden; + height: 20px; width: 90px; + top: 85px; left: 0px; + -webkit-border-radius: 0px 0px 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + border-radius: 0px 0px 5px 5px; +} + +.wall-item-info { float: left; width: 140px; } +.wall-item-photo-wrapper { + width: 80px; height: 80px; + position: relative; + padding: 5px; + background-color: #eeeeee; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.wall-item-tools { + filter: alpha(opacity=60); + opacity: 0.7; + -webkit-transition: all 0.25s ease-in-out; + -moz-transition: all 0.25s ease-in-out; + -o-transition: all 0.25s ease-in-out; + -ms-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + margin-left: 140px; + margin-top: 10px; + padding-bottom: 6px; +} + +.wall-item-tools:hover { + filter: alpha(opacity=100); + opacity: 1; + -webkit-transition: all 0.25s ease-in-out; + -moz-transition: all 0.25s ease-in-out; + -o-transition: all 0.25s ease-in-out; + -ms-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + margin-left: 140px; +} + +.wall-item-outside-wrapper.comment .wall-item-tools { + margin: 5px 5px 10px 60px; + float: left; +} + +.wall-item-like-buttons { + float: left; +} +.wall-item-like-buttons a.icon { + float: left; + margin-right: 5px; + display: inline; +} +.wall-item-links-wrapper { + width: 20px; + float: left; +} +.wall-item-delete-wrapper { + float: left; +} +.wall-item-links-wrapper a.icon { + float: left; + margin-right: 5px; + display: inline; +} +.pencil { + float: left; +} + +.star-item { + margin-left: 5px; + margin-right: 2px; + float: left; +} +.wall-item-title { font-size: 1.2em; font-weight: bold;} +.wall-item-body { margin-left: 140px; padding-right: 20px; } +.wall-item-body p { + max-width: 600px; + font-size: 0.8em; +} +.wall-item-lock-wrapper { float: right; } +.wall-item-dislike, +.wall-item-like, +.wall-item-author { + clear: left; + font-size: 0.9em; + margin: 4px 0px 0px 140px; + font-variant:small-caps; +} + +.wall-item-author a { + color: #898989; +} + +.wall-item-ago { display: inline; padding-left: 10px; color: #898989;} +.wall-item-wrapper-end { clear:both; } +.wall-item-location { + margin-top:5px; + width: 100px; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; +} + +.wall-item-location .icon { float: left; } +.wall-item-location > a { + margin-left: 25px; + font-size: 0.9em; + display: block; + font-variant:small-caps; + color: #898989; +} + +.wall-item-location .smalltext { margin-left: 25px; font-size: 0.9em; display: block;} +.wall-item-location > br { display: none; } +.wall-item-conv a{ + font-size: 0.9em; + color: #898989; + font-variant:small-caps; +} + +.wallwall .wwto { + left: -10px; + margin: 0; + position: absolute; + top: 65px; + width: 30px; + z-index: 10001; + width: 30px; + height: 30px; +} + +.wallwall .wwto img { width: 30px!important; height: 30px!important;} +.wallwall .wall-item-photo-end { clear: both; } +.wall-item-arrowphoto-wrapper { + position: absolute; + left: 20px; + top: 70px; + z-index: 10002; +} + +.wall-item-photo-menu { + min-width: 92px; + color: #2e3436; + border-top: 0px; + background: #eeeeee; + border-right: 1px solid #dddddd; + border-left: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + position: absolute; + left: -2px; top: 101px; + display: none; + z-index: 10000; + -webkit-border-radius: 0px 5px 5px 5px; + -moz-border-radius: 0px 5px 5px 5px; + border-radius: 0px 5px 5px 5px; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.wall-item-photo-menu-button { + border-right: 1px solid #dddddd; + border-left: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.fakelink wall-item-photo-menu-button { + -webkit-border-radius: 0px 5px 5px 5px; + -moz-border-radius: 0px 5px 5px 5px; + border-radius: 0px 5px 5px 5px; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.wall-item-photo-menu ul { margin:0px; padding: 0px; list-style: none } +.wall-item-photo-menu li a { white-space: nowrap; display: block; padding: 5px 2px; color: #2e3436; } +.wall-item-photo-menu li a:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + order-bottom: none; +} + +.icon.drop, +.icon.drophide { float: left; } +#item-delete-selected { overflow: auto; width: 100%;} +.wall-item-outside-wrapper { + max-width: 90%; + border-bottom: 1px solid #dedede; + margin-top: 20px; +} + +/* ============ */ +/* = Comments = */ +/* ============ */ + + .ccollapse-wrapper { + font-size: 0.9em; + color: #898989; + margin-left: 80px; + font-variant:small-caps; +} + +.wall-item-outside-wrapper.comment { margin-left: 80px; } +.wall-item-outside-wrapper.comment .wall-item-photo { width: 40px!important; height: 40px!important;} +.wall-item-outside-wrapper.comment .wall-item-photo-wrapper {width: 40px; height: 40px; } +.wall-item-outside-wrapper.comment .wall-item-photo-menu-button { + width: 50px; + top: 45px; + background-position: 35px center; +} +.wall-item-outside-wrapper.comment .wall-item-info { width: 60px; } +.wall-item-outside-wrapper.comment .wall-item-body { margin-left: 60px; max-width: 600px;} +.wall-item-outside-wrapper.comment .wall-item-author { margin-left: 60px;} + +.wall-item-outside-wrapper.comment .wall-item-photo-menu { + min-width: 50px; + top: 60px; +} +.icollapse-wrapper { + font-size: 0.9em; + color: #898989; + font-variant:small-caps; +} + +.comment-wwedit-wrapper, +.comment-edit-wrapper { margin: 30px 0px 0px 80px;} +.comment-wwedit-wrapper img, +.comment-edit-wrapper img { width: 20px; height: 20px; } +.comment-edit-photo-link { float: left; width: 40px;} +.comment-edit-text-empty { + width: 80%; + height: 20px; + border: 0px; + color: #babdb6; + -webkit-transition: all 0.5s ease-in-out; + -moz-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; + -ms-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.comment-edit-text-empty:hover { color: #999999;} +.comment-edit-text-full { width: 80%; height: 6em; + -webkit-transition: all 0.5s ease-in-out; + -moz-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; + -ms-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.comment-edit-submit-wrapper { width: 80%; margin-left: 40px; text-align: right; } +.comment-edit-submit { + height: 22px; + background-color: #a2a2a2; + color: #eeeeec; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + border: 0px; +} + +.comment-edit-submit:hover { + background-color: #b20202; +} + +.comment-edit-submit:active { + background-color: #b20202; +} + +#item-delete-selected-desc { + color: #898989; +} + +/** + * item text style + **/ +.wall-item-body code { + border-color: #CCCCCC; + border-style: solid; + border-width: 1px 1px 1px 10px; + display: block; + padding-left: 10px; +} + +/* =========== */ +/* = Profile = */ +/* =========== */ + +.advanced-profile-content { + margin-top: 5px; + margin-bottom: 10px; + margin-left: 30px; + width: 60%; +} + +.advanced-profile-label { + margin-top: 10px; + margin-bottom: 0px; + padding-bottom: 5px; + font-size: 18px; + font-variant:small-caps; +} + +div[id$="wrapper"] { height: 100%;} +div[id$="wrapper"] br { clear: left; } +#advanced-profile-with { margin-left: 20px;} + +#profile-listing-desc { + float: left; + display: inline; + padding: 5px 10px 5px 10px; + width: 150px; + margin-bottom:20px; + margin-top: 20px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + display:inline-block; + color:#efefef; + font-style: bold; + text-align: center; +} + +#profile-listing-desc:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#profile-listing-desc:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#profile-listing-desc a { + color: #efefef; +} + +#profile-listing-new-link-wrapper { + float: left; + display: inline; + width: 130px; + margin:20px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + margin-right: 5px; + font-style: bold; + color:#efefef; + text-align: center; +} + +#profile-listing-new-link-wrapper:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#profile-listing-new-link-wrapper:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#profile-listing-new-link-wrapper a { + color: #efefef; +} + +.profile-listing-name { + font-size: 1em; + font-variant: small-caps; +} +.profile-listing-name a { + color: #898989; +} + +.profile-listing-visible { + width: 90px; + margin-bottom:20px; + margin-top: 10px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + margin-right: 5px; + color:#efefef; + text-align: center; +} + +.profile-listing-visible:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +.profile-listing-visible:active { + background-color: #b20202; + position:relative; + top:1px; +} + +.profile-listing-visible a { + color: #efefef; +} + +.profile-listing-photo { + padding: 5px; + background-color: #efefef; + border: 2px dotted #eeeeee; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +#profile-edit-links li { + display: inline; + width: 150px; + margin-bottom:20px; + margin-top: 20px; + background-color: #a2a2a2; + color: #eeeeec; + padding: 5px 10px 5px 10px; + margin-right: 5px; + font-style: bold; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} + +#profile-edit-links li a { + color: #efefef; +} + +#profile-edit-links li:hover { + background-color: #b20202; +} + +#profile-edit-links li:active { + background-color: #b20202; +} + +#cropimage-wrapper { float:left; } +#crop-image-form { clear:both; } + +.profile-match-name a{ + color: #999; + font-variant: small-caps; + font-size: 1em; +} + +.profile-match-name a:hover { + color: #999; +} + +.profile-match-wrapper { + width: 300px; + padding: 5px; + margin-bottom:10px; + background-color: #f6f6f6; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +/* ========== */ +/* = Photos = */ +/* ========== */ + +#side-bar-photos-albums li { + font-size: 1.2em; +} + +#photo-top-links { + width: 130px; + margin-bottom:20px; + margin-top: 20px; + background-color: #a2a2a2; + color: #eeeeec; + padding: 5px 10px 5px 10px; + margin-right: 5px; + font-style: bold; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +#photo-top-links a { + color: #efefef; +} + +#photo-top-links:hover { + background-color: #b20202; +} + +#photo-top-links:active { + background-color: #b20202; +} + +.photo-album-image-wrapper, +.photo-top-image-wrapper { + float: left; + margin: 0px 10px 10px 0px; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 6px #959494; + -webkit-box-shadow: 3px 3px 6px #959494; + box-shadow: 3px 3px 6px #959494; + background-color: #efefef; + padding: 10px; + padding-bottom: 30px; + position:relative; +} + +#photo-photo { max-width: 100% } +#photo-photo img { max-width: 100% } + +.photo-top-image-wrapper a:hover, +#photo-photo a:hover, +.photo-album-image-wrapper a:hover { + border-bottom: 0px; +} + +.photo-top-photo, +.photo-album-photo {} + +.photo-top-album-name { + position: absolute; + bottom: 0px; + padding: 0px 5px; + font-weight: bold; + font-stretch:semi-expanded; + font-variant:small-caps; +} + +.photo-top-album-name a{ + text-align: center; + color: #6e6e6e; +} +.caption { + position: absolute; + bottom: 0px; + margin: 0px 5px; + text-align: center; + color: #6e6e6e; + font-size: 0.9em; + font-variant: small-caps; +} + +#photo-photo{ + position: relative; + float:left; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 6px #959494; + -webkit-box-shadow: 3px 3px 6px #959494; + box-shadow: 3px 3px 6px #959494; + background-color: #efefef; + padding: 10px; +} + +#photo-caption { + margin-top: 10px; + color: #6E6E6E; + font-variant:small-caps; + font-size: 1.1em; +} + +#photo-photo-end { clear: both; } +#photo-prev-link, +#photo-next-link{ + position: absolute; + width:10%; + height: 100%; + background-color: rgba(255,255,255,0.2); + opacity: 0; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + background-position: center center; + background-repeat: no-repeat; +} + +#photo-prev-link { left:0px; top:0px; background-image: url('prev.png'); } +#photo-next-link { right:0px; top:0px; background-image: url('next.png');} +#photo-prev-link a, +#photo-next-link a{ + display: block; width: 100%; height: 100%; + overflow: hidden; + text-indent: -900000px; +} + +#photo-prev-link:hover, +#photo-next-link:hover { + opacity: 1; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +#photo-next-link .icon, +#photo-prev-link .icon { display: none } + +#photos-upload-spacer, +#photos-upload-new-wrapper, +#photos-upload-exist-wrapper { margin-bottom: 1em; } +#photos-upload-existing-album-text, +#photos-upload-newalbum-div { + background-color: #fff; + color: #909090; + font-size: 1.2em; + padding: 3px 0px; + padding-left: 0px; + width: 300px; +} + +#photos-upload-album-select, +#photos-upload-newalbum { width: 400px; } + +#photos-upload-perms-menu { + width: 180px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 7px; + text-align: center; + font-size: 0.9em; + color: #efefef; +} + +#photos-upload-perms-menu:hover { + text-align: center; + font-size: 0.9em; + width: 180px; + padding: 7px; + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#photos-upload-perms-menu:active { + text-align: center; + font-size: 0.9em; + width: 180px; + padding: 7px; + background-color: #b20202; + position:relative; + top:1px; +} + +#photos-upload-perms-menu a { + color: #efefef; +} + +#photos-upload-perms-menu .icon { + display: none; +} + +select[size], select[multiple], select[size][multiple] { + -webkit-appearance: listbox; + border: 2px solid #b0b0b0; + padding: 2px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} + +select { + -webkit-appearance: menulist; + box-sizing: border-box; + -webkit-box-align: center; + cursor: default; + border: 2px solid #b0b0b0; + padding: 2px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} + +keygen, select { + -webkit-border-radius: ; +} + +input, textarea, keygen { + font-size: 0.9em; + letter-spacing: normal; + word-spacing: normal; + line-height: 1.2em; + text-transform: none; + text-indent: 0px; + text-shadow: none; + display: inline-block; + text-align: -webkit-auto; + border: 2px solid #b0b0b0; + padding: 2px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} + +.qq-upload-button { + background-color: none; + -moz-box-shadow:inset 0px 1px 0px 0px #a65151; + -webkit-box-shadow:inset 0px 1px 0px 0px #a65151; + box-shadow:inset 0px 1px 0px 0px #a65151; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) ); + background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202'); + background-color:#d60808; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + border:1px solid #fc5656; + display:inline-block; + color:#f0e7e7; + text-shadow:1px 1px 0px #b36f6f; + text-align: center; + font-size: 0.9em; + color: #efefef; + width: 91px; + padding: 7px; +} + +.qq-upload-button:hover { + text-align: center; + font-size: 0.9em; + color: #efefef; + width: 91px; + padding: 7px; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) )!important; + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% )!important; + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808')!important; + background-color:#b20202; +} + +.qq-upload-button:active { + text-align: center; + font-size: 0.9em; + color: #efefef; + background-color: #B20202; + width: 91px; + padding: 7px; + position:relative; + top:1px; +} + +#album-edit-link { + width: 70px; + margin-bottom:20px; + margin-top: 20px; + background-color: #a2a2a2; + color: #eeeeec; + padding: 5px 10px 5px 10px; + margin-right: 5px; + font-style: bold; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} + +#album-edit-link a { + color: #efefef; +} + +#album-edit-link:hover { + background-color: #b20202; +} + +#photo-edit-link-wrap { + margin-bottom: 10px; +} + +#photo_edit_form { + width: 500px; + margin-top:20px; + text-align: left; +} + +input#photo_edit_form { + display: block; + width: 100%; +} + +#photo-edit-perms-menu { + float: left; + display: inline; + margin-top: 10px; + margin-right: 10px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 4px; + color: #efefef; + text-align: center; + font-size: 0.9em; + width: 100px; +} + +#photo-edit-perms-menu:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#photo-edit-perms-menu:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#photo-edit-perms-menu a { + color: #efefef; +} + +#photo-edit-perms-menu .icon { + display: none; +} + +#photo-edit-delete-button { + float: left; + display: inline; + margin-left: 190px; +} + +#side-bar-photos-albums h3:before { + content: url("photography.png"); + padding-right: 10px; + vertical-align: middle; +} + +#side-bar-photos-albums li { + margin-bottom: 5px; +} + +#photo-album-edit-wrapper { + margin-bottom: 10px; +} + +/* ============ */ +/* = Messages = */ +/* ============ */ + +#prvmail-wrapper, .mail-conv-detail, .mail-list-detail { + position: relative; + width: 500px; + padding: 50px; + margin: 20px auto; + background-color: #fff; + -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); +} + +#prvmail-wrapper:before, #prvmail-wrapper:after, .mail-conv-detail:before, .mail-conv-detail:after, .mail-list-detail:before, .mail-list-detail:after { + position: absolute; + width: 40%; + height: 10px; + content: ' '; + left: 12px; + bottom: 12px; + background: transparent; + -webkit-transform: skew(-5deg) rotate(-5deg); + -moz-transform: skew(-5deg) rotate(-5deg); + -ms-transform: skew(-5deg) rotate(-5deg); + -o-transform: skew(-5deg) rotate(-5deg); + transform: skew(-5deg) rotate(-5deg); + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + z-index: -1; +} + +#prvmail-wrapper:after, .mail-conv-detail:after, .mail-list-detail:after { + left: auto; + right: 12px; + -webkit-transform: skew(5deg) rotate(5deg); + -moz-transform: skew(5deg) rotate(5deg); + -ms-transform: skew(5deg) rotate(5deg); + -o-transform: skew(5deg) rotate(5deg); + transform: skew(5deg) rotate(5deg); +} + +.prvmail-text { + width: 100%; +} + +#prvmail-form input + +#prvmail-subject { width: 490px;; padding-left: 10px; font-size: 1.1em; font-style: bold;} +#prvmail-subject .input{ + border: none !important ; +} + +#prvmail-subject-label { + font-variant:small-caps; +} + +#prvmail-to { + padding-left: 10px; +} +#prvmail-to-label { + font-variant:small-caps; +} + +#prvmail-message-label { + font-variant:small-caps; + font-size: 1em; +} + +#prvmail-submit-wrapper { margin-top: 10px; } +#prvmail-submit { + float: right; + margin-top: 0px; + margin-right: 90px; +} + +#prvmail-upload { +margin-left: 90px; +} + +#prvmail-submit-wrapper > div { + margin-right: 5px; + float: left; +} + +.mail-list-outside-wrapper { + margin-top: 20px; +} + +.mail-list-sender { + float: left; + padding: 5px; + background-color: #efefef; + border: 2px dotted #eeeeee; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.mail-list-detail { + margin-left: 100px; + width: 300px; + min-height: 70px; + padding: 20px; + padding-top:10px; + border: 1px solid #dddddd; + } + +.mail-list-sender-name { + font-size: 1.1em; + display: inline; + font-variant:small-caps; +} + +.mail-list-date { + float: right; + clear: block; + display: inline; + font-size: 0.8em; + padding-left: 10px; + font-stretch:ultra-condensed; + font-variant:small-caps; +} + +.mail-list-subject { + clear: block; + font-size: 1.5em; + padding-top: 20px; + padding-right: 50px; +} + +.mail-list-delete-wrapper { float: left; margin-right:550px; } +.mail-list-outside-wrapper-end { + clear: both; +} + +.mail-conv-sender {float: left; margin: 0px 5px 5px 0px; } +.mail-conv-sender-photo { + width: 64px; + height: 64px; + padding: 5px; + background-color: #efefef; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.mail-conv-sender-name { float: left; font-variant:small-caps; font-style: bold; } +.mail-conv-date { float: right; font-variant:small-caps; } +.mail-conv-subject { clear: right; font-weight: bold; font-size: 1.2em } +.mail-conv-body { + clear: both; +} + +.mail-conv-detail { + width: 500px; + padding: 30px; + margin-left: 20px; + vertical-align: middle; + margin: auto; + border: 1px solid #dddddd; +} +.mail-conv-break { display: none; border: none;} +.mail-conv-delete-wrapper { margin-top: 5px; width: 650px; text-align: right; } + +/* ================= */ +/* = Notifications = */ +/* ================= */ + +#notification-show-hide-wrapper { + width: 160px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + margin-right: 5px; + margin-top: 10px; + font-style: bold; + color: #efefef; + text-align: center; +} + +#notification-show-hide-wrapper:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#notification-show-hide-wrapper:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#notification-show-hide-wrapper a { + color: #efefef; +} + +/* ============ */ +/* = Contacts = */ +/* ============ */ + +#contacts-main { + margin-bottom: 10px; +} + +.view-contact-wrapper, +.contact-entry-wrapper { + float: left; + margin-right: 30px; + margin-bottom: 20px; + width: 88px; + height: 120px; + position: relative; +} + +.contact-entry-direction-wrapper {position: absolute; top: 20px;} +.contact-entry-edit-links { position: absolute; top: 60px; } +#contacts-show-hide-link { margin-bottom: 20px; margin-top: 10px; font-weight: bold;} +.contact-entry-photo { + padding: 3px; + background-color: #eeeeee; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.contact-entry-name { + width: 100px; + overflow: hidden; + font: #999; + font-size: 12px; + text-align:center; + font-variant:small-caps; + font-weight: bold; + margin-top:5px; +} + +.contact-entry-photo { + position: relative; +} + +.contact-entry-edit-links .icon { + border: 1px solid #babdb6; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background-color: #ffffff; +} + +#contact-edit-banner-name { font-size: 1.5em; margin-left: 30px; } +#contact-edit-photo-wrapper {position: relative; float: left; padding: 20px;} +#contact-edit-direction-icon { position: absolute; top: 60px; left:0px;} +#contact-edit-nav-wrapper { margin-left: 210px; } +#contact-edit-links { float: left; margin-top: 43px; } +#contact-drop-links {} +#contact-edit-nav-wrapper .icon { + border: 1px solid #babdb6; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#contact-edit-nettype { + font-size: 1em; + font-variant: small-caps; + margin-left: 30px; + margin-bottom: 0px; + padding-bottom: 0px; +} + +#contact-edit-poll-wrapper { margin-left: 50px; } +#contact-edit-last-update-text { margin-bottom: 15px; padding-top: 20px; font-size: 1em; } +#contact-edit-last-updated { font-weight: bold; } +#contact-edit-poll-text { display: inline; font-size: 1em; } +#contact-edit-end { clear: both; margin-bottom: 65px;} + +#contact-edit-update-now { + width: 80px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + margin-left: 10px; + margin-top: 10px; + font-style: bold; + color: #efefef; +} + +#contact-edit-update-now:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#contact-edit-update-now:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#contact-edit-update-now a { + color: #efefef; +} + + +#contact-edit-profile-select-text > p { + font-size: 1em; +} + +.contact-photo-menu-button { + position: absolute; + background-image: url("photo-menu.jpg"); + background-position: top left; + background-repeat: no-repeat; + margin: 0px; padding: 0px; + width: 16px; + height: 16px; + top: 64px; left:0px; + overflow: hidden; + text-indent: 40px; + display: none; +} + +#contact-edit-photo { + padding: 10px; + background-color: #f1f1f1; + border: 1px solid #dedede; + margin-bottom: 5px; + -moz-box-shadow: 5px 5px 8px #959494; + -webkit-box-shadow: 5px 5px 8px #959494; + box-shadow: 5px 5px 8px #959494; +} +.contact-photo-menu { + width: auto; + border: 1px solid #ddd; + background: #f1f1f1; + position: absolute; + left: 0px; top: 90px; + display: none; + z-index: 10000; + -moz-box-shadow: 3px 3px 5px #888; + -webkit-box-shadow: 3px 3px 5px #888; + box-shadow: 3px 3px 5px #888; +} + +.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none } +.contact-photo-menu li a { display: block; padding: 3px; color: #626262; font-size: 1em; } +.contact-photo-menu li a:hover { + color: #FFFFFF; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + text-decoration: none; +} + +.view-contact-photo { + padding: 5px; + background-color: #efefef; + border: 1px solid #dddddd; + -moz-box-shadow: 3px 3px 4px #959494; + -webkit-box-shadow: 3px 3px 4px #959494; + box-shadow: 3px 3px 4px #959494; +} + +.view-contact-name { + font-variant: small-caps; +} + +#div.side-link { + background-color: #efefef; + padding: 10px; + margin-top:20px; +} + +#follow-sidebar { + margin-bottom: 20px; +} + +#follow-sidebar h3:before { + content: url("user.png"); + padding-right: 10px; + vertical-align: middle; +} + +#follow-sidebar input[type="text"] { + margin-left: 30px; + margin-bottom: 10px; +} + +#side-match-link { + width: 180px; + padding: 10px; + margin: auto; + margin-bottom: 20px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + color: #efefef; + font-size: 1.2em; + text-align: center; +} + +#side-match-link:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#side-match-link:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#side-match-link a { + color: #efefef; +} + +#side-follow-wrapper{ + font-size: 1em; + font-weight: bold; + font-stretch:semi-expanded; + background-color: #f3f3f3; + border: 1px solid #cdcdcd; + padding: 10px; + margin-top: 20px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} + +#side-follow-wrapper label{ + font-size: 1.1em; + font-variant: normal; +} + +#contact-view-recent { + float: left; + width: 150px; + padding: 10px; + margin-bottom: 20px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + color: #efefef; + font-size: 1.2em; + text-align: center; +} + +#contact-view-recent:hover{ + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#contact-view-recent:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#contact-view-recent a { + color: #efefef; +} + +#contact-suggest { + float: left; + margin-left: 10px; + width: 120px; + padding: 10px; + margin-bottom: 20px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + color: #efefef; + font-size: 1.2em; + text-align: center; +} + +#contact-suggest:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#contact-suggest:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#contact-suggest a { + color: #efefef; +} + +#contact-edit-info-wrapper { + clear: both; +} + +/* ===================================== */ +/* = Register, Settings, Profile Forms = */ +/* ===================================== */ + +#id_openid_url, +.openid { + background: url(login-bg.gif) no-repeat; + background-position: 0 50%; + padding-left: 18px; + width: 385px; +} + +#profile-tabs-wrapper { + padding-top: 10px; +} + +#profile-tab-status-link { + padding: 5px 10px 5px 10px; + margin-right: 5px; + margin-top: 10px; + font-style: bold; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color: #efefef; +} + +#profile-tab-status-link:hover { + border: 0px; + padding: 5px 10px 5px 10px; + font-style: bold; + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#profile-tab-status-link:active { + border: 0px; + padding: 5px 10px 5px 10px; + font-style: bold; + background-color: #b20202; + position:relative; + top:1px; +} + +#profile-tab-status-link a { + color: #efefef; +} + +#uexport-link a { + color: #efefef; +} + +#profile-tab-profile-link { + margin-right: 5px; + margin-top: 10px; + padding: 5px 10px 5px 10px; + font-style: bold; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color: #efefef; +} + +#profile-tab-profile-link:hover { + border: 0px; + padding: 5px 10px 5px 10px; + font-style: bold; + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#profile-tab-profile-link:active { + border: 0px; + padding: 5px 10px 5px 10px; + font-style: bold; + background-color: #b20202; + position:relative; + top:1px; +} + +#profile-tab-profile-link a { + color: #efefef; +} + +#uexport-link { + width: 140px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) ); + background:-moz-linear-gradient( center top, #7c7d7b 5%, #555753 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7c7d7b', endColorstr='#555753'); + background-color:#7c7d7b; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + margin-bottom: 10px; +} + +#uexport-link:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #555753), color-stop(1, #7c7d7b) ); + background:-moz-linear-gradient( center top, #555753 5%, #7c7d7b 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555753', endColorstr='#7c7d7b'); + background-color:#555753; +} + +#uexport-link:active { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + position:relative; + top:1px; +} + +#settings-default-perms { + width: 160px; + text-align: center; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) ); + background:-moz-linear-gradient( center top, #7c7d7b 5%, #555753 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7c7d7b', endColorstr='#555753'); + background-color:#7c7d7b; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + padding: 5px 10px 5px 10px; + margin-bottom: 10px; +} + +#settings-default-perms .fakelink { + color: #efefef; +} + +#settings-default-perms:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #555753), color-stop(1, #7c7d7b) ); + background:-moz-linear-gradient( center top, #555753 5%, #7c7d7b 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555753', endColorstr='#7c7d7b'); + background-color:#555753; +} + +#settings-default-perms:active { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; + position:relative; + top:1px; +} + +#settings-nickname-desc { + width: 80%; + background-color: #efefef; + margin-bottom: 10px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + padding: 5px; +} + +#register-form div, +#profile-edit-form div { + clear: both; +} + +#register-form label, +#profile-edit-form label { + width: 300px; float: left; +} + +#register-form span, +#profile-edit-form span { + color: #555753; + display:block; + margin-bottom: 20px; +} + +.settings-submit-wrapper, +.profile-edit-submit-wrapper { margin: 30px 0px;} +.profile-listing { float: left; clear: both; margin: 20px 20px 0px 0px} + +#profile-edit-links ul { margin: 20px 0px; padding: 0px; list-style: none; } + + +#register-sitename { display: inline; font-weight: bold;} + +/* ===================== */ +/* = Contacts Selector = */ +/* ===================== */ + +#group-edit-wrapper { + margin-bottom: 10px; +} + +#group-edit-name-wrapper { + margin-bottom: 0px; + display: inline; +} +#group-edit-submit-wrapper { + margin-bottom: 0px; + display: inline; +} +#group-edit-desc { margin: 10px 0xp; } +#group-new-text {font-size: 1.1em;} +#group-members, +#prof-members { + width: 620px; + height: 200px; + overflow: auto; + border: none; + background-color: #fff; + color: #555753; +} + +#group-all-contacts, +#prof-all-contacts { + width: 620px; + height: 200px; + overflow: auto; + border: none; +} + +#group-members h3, +#group-all-contacts h3, +#prof-members h3, +#prof-all-contacts h3{ + color: #555753; + margin: 0px; + padding: 5px; +} + +#group-separator, +#prof-separator { display: none;} + +/* ========== */ +/* = Events = */ +/* ========== */ + +.clear { clear: both; } +.eventcal { + float: left; + font-size: 20px; + padding: 20px; +} + +.vevent { + position: relative; + width: 400px; + padding: 20px; + padding-top: 10px; + margin: 0 50px; + background-color: #fff; + -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); +} + +.vevent:before, .vevent:after { + position: absolute; + width: 40%; + height: 10px; + content: ' '; + left: 12px; + bottom: 12px; + background: transparent; + -webkit-transform: skew(-5deg) rotate(-5deg); + -moz-transform: skew(-5deg) rotate(-5deg); + -ms-transform: skew(-5deg) rotate(-5deg); + -o-transform: skew(-5deg) rotate(-5deg); + transform: skew(-5deg) rotate(-5deg); + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + z-index: -1; +} + +.vevent:after { + left: auto; + right: 12px; + -webkit-transform: skew(5deg) rotate(5deg); + -moz-transform: skew(5deg) rotate(5deg); + -ms-transform: skew(5deg) rotate(5deg); + -o-transform: skew(5deg) rotate(5deg); + transform: skew(5deg) rotate(5deg); +} + +.vevent .event-description { + margin-left: 10px; + margin-right: 10px; + text-align:center; + font-size: 1.2em; + font-weight:bolder; +} + + .vevent .event-location{ + margin-left: 10px; + margin-right: 10px; + font-size: 1em; + font-style: oblique; + text-align: center; + +} + +.vevent .event-start, .vevent .event-end { + margin-left: 20px; + margin-right: 20px; + margin-bottom: 2px; + margin-top: 2px; + font-size: 0.9em; + font-variant: small-caps; + text-align: left; +} + +#new-event-link{ + width: 130px; + padding: 7px; + margin: auto; + margin-bottom: 10px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color: #efefef; +} + +#new-event-link:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#new-event-link:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#new-event-link a { + color: #efefef; +} + +.edit-event-link, .plink-event-link { + float: left; + margin-top: 4px; + margin-right: 4px; + margin-bottom: 15px; +} + +.event-description:before { + content: url('calendar.png'); + margin-right: 15px; + vertical-align: middle; +} + +.event-start, .event-end { + margin-left: 10px; + width: 330px; +} + +.event-start .dtstart, .event-end .dtend { + float: right; +} + +.event-list-date { + margin-bottom: 10px; + font-variant:small-caps; + font-stretch:condensed; +} + +.prevcal, .nextcal { + float: left; + margin-left: 32px; + margin-right: 32px; + margin-top: 64px; +} + +.event-calendar-end { + clear: both; +} + +.calendar { + font-family: Helvetica, Arial, sans-serif; + padding: 10px; + background-color: #f1f1f1; + border: 1px solid #dedede; + margin-bottom: 10px; + -moz-box-shadow: 5px 5px 8px #959494; + -webkit-box-shadow: 5px 5px 8px #959494; + box-shadow: 5px 5px 8px #959494; +} + +.calendar caption{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) ); + background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202'); + background-color: #b20202; + width: 300px; + padding: 10px; + color: #ffffff; + font-weight: bold; + text-align:center; + font-variant:small-caps; + -moz-box-shadow: 5px 2px 8px #959494; + -webkit-box-shadow: 5px 2px 8px #959494; + box-shadow: 5px 2px 8px #959494; +} + +tr { + border: 1px solid #eeeeee; +} + +.calendar td { + font-size: 14px; + text-align: center; + padding: 3px 0px; +} + +.calendar td > a { + background-color: #cdcdcd; + padding: 2px; + color: #000; +} + +.calendar th { + font-size: 16px; +} + +.today { + font-weight: bold; + text-align: center; + background-color: #b20202; + color: #fff; +} + +#event-start-text, +#event-finish-text { + margin-top: 10px; + margin-bottom: 5px; +} + +#event-nofinish-checkbox, +#event-nofinish-text, +#event-adjust-checkbox, +#event-adjust-text, +#event-share-checkbox { + float: left; +} + +#event-datetime-break { + margin-bottom: 10px; +} + +#event-nofinish-break, +#event-adjust-break, +#event-share-break { + clear: both; +} + +#event-desc-text, +#event-location-text { + margin-top: 10px; + margin-bottom: 5px; +} + +#event-submit { + margin-top: 10px; +} + +/* ============= */ +/* = Directory = */ +/* ============= */ + +.directory-item { + float: left; + margin: 50px 50px 0px 0px; + padding: 10px; + background-color: #f1f1f1; + border: 1px solid #dedede; + margin-bottom: 5px; + -moz-box-shadow: 5px 5px 8px #959494; + -webkit-box-shadow: 5px 5px 8px #959494; + box-shadow: 5px 5px 8px #959494; +} + +.directory-details { + font-size: 0.9em; + font-variant: small-caps; + width: 160px; +} + +.directory-name { + font-size: 1em; + font-variant: small-caps; + width: 150px; +} + +/* ========= */ +/* = Admin = */ +/* ========= */ + +#adminpage { + width: 80%; +} + +#pending-update { + float:right; + color: #ffffff; + font-weight: bold; + background-color: #FF0000; + padding: 0em 0.3em; +} + +.admin.linklist { + border: 0px; padding: 0px; +} + +.admin.link { + list-style-position: inside; +} + +#adminpage dl { + clear: left; + margin-bottom: 2px; + padding-bottom: 2px; + border-bottom: 1px solid black; +} + +#adminpage dt { + width: 200px; + float: left; + font-weight: bold; +} + +#adminpage dd { + margin-left: 200px; +} +#adminpage h3 { + border-bottom: 1px solid #898989; + margin-bottom: 5px; + margin-top: 10px; +} + +#adminpage .submit { + clear:left; +} + +#adminpage #pluginslist { + margin: 0px; padding: 0px; +} + +#adminpage .plugin { + list-style: none; + display: block; + border: 1px solid #888888; + padding: 1em; + margin-bottom: 5px; + clear: left; +} + +#adminpage .toggleplugin { + float:left; + margin-right: 1em; +} + +#adminpage table {width:100%; border-bottom: 1p solid #000000; margin: 5px 0px;} +#adminpage table th { text-align: left;} +#adminpage td .icon { float: left;} +#adminpage table#users img { width: 16px; height: 16px; } +#adminpage table tr:hover { background-color: #eeeeee; } +#adminpage .selectall { text-align: right; } + +/* =============== */ +/* = Form Fields = */ +/* =============== */ + +.field { + margin-bottom: 5px; + padding-bottom: 10px; + overflow: auto; + width: 90%; +} + +.field label { + float: left; + width: 200px; +} + +.field input, +.field textarea { + width: 400px; +} +.field textarea { height: 100px; } +.field_help { + display: block; + margin-left: 200px; + color: #666666; +} + +.field .onoff { + float: left; + width: 80px; +} +.field .onoff a { + display: block; + border:1px solid #c1c1c1; + background-image:url("../../../images/onoff.jpg"); + background-repeat: no-repeat; + padding: 4px 2px 2px 2px; + height: 16px; + text-decoration: none; +} +.field .onoff .off { + border-color:#c1c1c1; + padding-left: 40px; + background-position: left center; + background-color: #cccccc; + color: #666666; + text-align: right; +} + +.field .onoff .on { + border-color:#c1c1c1; + padding-right: 40px; + background-position: right center; + background-color: #b20202; + color: #FFFFFF; + text-align: left; +} + +.hidden { display: none!important; } + +.field.radio .field_help { margin-left: 0px; } + +/* ========= */ +/* = Icons = */ +/* ========= */ + +.icon { + display: block; width: 20px; height: 20px; + background-image: url('icons.png'); +} +.starred { + background-image: url("star.png"); + repeat: no-repeat; +} +.unstarred { + background-image: url("premium.png"); + repeat: no-repeat; +} + + +.border { + border: 1px solid #c1c1c1; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.article { background-position: -50px 0px;} +.audio { background-position: -70px 0px;} +.block { background-position: -90px 0px;} +.drop { background-position: -110px 0px;} +.drophide { background-position: -130px 0px;} +.edit { background-position: -150px 0px;} +.camera { background-position: -170px 0px;} +.dislike { background-position: -190px 0px;} +.like { background-position: -210px 0px;} +.link { background-position: -230px 0px;} + +.globe { background-position: -50px -20px;} +.noglobe { background-position: -70px -20px;} +.no { background-position: -90px -20px;} +.pause { background-position: -110px -20px;} +.play { background-position: -130px -20px;} +.pencil { background-position: -150px -20px;} +.small-pencil { background-position: -170px -20px;} +.recycle { background-position: -190px -20px;} +.remote-link { background-position: -210px -20px;} +.share { background-position: -230px -20px;} + +.tools { background-position: -50px -40px;} +.lock { background-position: -70px -40px;} + +.unlock { + background-position: -90px -40px; + background-image: none; + width: 70px; + height: 20px; +} + +.video { background-position: -110px -40px;} +.youtube { background-position: -130px -40px;} + +.attach { background-position: -190px -40px;} +.language { background-position: -210px -40px;} + + +.on { background-position: -50px -60px;} +.off { background-position: -70px -60px;} +.prev { background-position: -90px -60px;} +.next { background-position: -110px -60px;} + +.icon.dim { opacity: 0.3;filter:alpha(opacity=30); } + +.attachtype { + display: block; width: 20px; height: 23px; + background-image: url('../../../images/content-types.png'); +} + +.type-video { background-position: 0px 0px; } +.type-image { background-position: -20px 0px; } +.type-audio { background-position: -40px 0px; } +.type-text { background-position: -60px 0px; } +.type-unkn { background-position: -80px 0px; } + +/* ========== */ +/* = Footer = */ +/* ========== */ + +.cc-license { margin-top: 100px; font-size: 0.7em; } +footer { display: block; margin: 50px 20%; clear: both; } + +#profile-jot-text { + height: 20px; + color:#cccccc; + border: 1px solid #cccccc; +} + +/* ======= */ +/* = ACL = */ +/* ======= */ + +#photo-edit-perms-select, +#photos-upload-permissions-wrapper, +#profile-jot-acl-wrapper{ + display:block!important; +} + +#acl-wrapper { + width: 690px; + float:left; +} +#acl-search { + float:right; + background: #ffffff url("../../../images/search_18.png") no-repeat right center; + padding-right:20px; +} +#acl-showall { + float: left; + display: block; + font-size: 1em; + font-style: bold; + text-align: center; + padding: 3px; + margin-bottom: 5px; + background-color: #cccccc; + background-position: 7px 7px; + background-repeat: no-repeat; + padding: 5px; + -webkit-border-radius: 5px ; + -moz-border-radius: 5px; + border-radius: 5px; + color: #999999; +} +#acl-showall.selected { + color: #fff; + background-color: #b20202; +} + +#acl-list { + height: 210px; + border: 1px solid #cccccc; + background-color: #efefef; + clear: both; + margin-top: 30px; + overflow: auto; +} + +#acl-list-content { + margin-left: 20px; +} + +.acl-list-item { + display: block; + width: 150px; + height: 40px; + border: 1px solid #cccccc; + background-color: #fff; + margin: 5px; + float: left; + -moz-box-shadow: 2px 2px 3px #c1c1c1; + -webkit-box-shadow: 2px 2px 3px #c1c1c1; + box-shadow: 2px 2px 3px #c1c1c1; +} +.acl-list-item img{ + width:30px; + height: 30px; + float: left; + margin: 5px; +} + +.acl-list-item p { + color: #999; + height: 12px; + font-size: 0.7em; + margin: 0px; + padding: 2px 0px 1px; + overflow: hidden; +} + +.acl-list-item a { + font-size: 10px; + display: block; + float: left; + color: #efefef; + background-color: #898989; + background-position: 3px 3px; + background-repeat: no-repeat; + margin-right: 5px; + -webkit-border-radius: 2px ; + -moz-border-radius: 2px; + border-radius: 2px; + padding: 3px; +} + +#acl-wrapper a:hover { + text-decoration: none; + background-color:#b20202; +} + +.acl-button-show.selected { + color: #efefef; + background-color: #b20202; +} + +.acl-button-hide.selected { + color: #efefef; + background-color: #a2a2a2; +} + +.acl-list-item.groupshow { border-color: #b20202; } +.acl-list-item.grouphide { border-color: #a2a2a2; } + +/* ========================= */ +/* = Global Directory Link = */ +/* ========================= */ + +#global-directory-link { + width: 130px; + padding: 7px; + margin-bottom: 10px; + margin-left: 0px; + -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf; + box-shadow:inset 0px 1px 0px 0px #cfcfcf; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) ); + background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2'); + background-color:#bdbdbd; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + color: #efefef; + text-align: center; +} + +#global-directory-link:hover { + color: #efefef; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) ); + background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); + background-color:#b20202; +} + +#global-directory-link:active { + background-color: #b20202; + position:relative; + top:1px; +} + +#global-directory-link a { + color: #efefef; +} + +#global-directory-link { + -webkit-padding-start: 0px; +} \ No newline at end of file diff --git a/view/theme/testbubble/user.png b/view/theme/testbubble/user.png new file mode 100644 index 0000000000000000000000000000000000000000..df899e7e08ad95deae68e481b798e50be1e22325 GIT binary patch literal 664 zcmV;J0%!e+P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!I!Q!9RCwB?Q%h?TQ4~IR?#$fDJd)-` zEtO1ys0%@KQBX8gr54;MiUozbaN)uSSo8<DP;sRzq3TYMx^Pw0MKK$HfmXqGQ7AR3 z_()Ai=9P&v<GHD+MJf$+hL1UOFXy}8`Odi{iXzy`L$*pFY_P^=XW!@c@7w!y`{2OW zZT;CwI-R_)C`{gnK>RluQMh~O_Jg+Xok%1M@LN9Ej(dXup}04(nSvBzs8U`U&1BM$ zMI=*w5I1xXMe$NE3X+IjhM`eajdd0zNrE5<!ErsM7Xk^P#SJ513geO?3L{K*0X^_~ zG0{g@$3{j!Q$c_ZM2adzFmt(Qn-Q=^qajXQzg9HO{NnJ@k%f37=_FI>M)B~G>0Cbl zp-?dI{cjF<eTDJybB`PKS}`6s+NaNqy*hC4(4yygR_V>m;Pa`e^WVPzP%X=zELWDV ztS8_;m`^4j-Ym_$zO3nb$2dXY;vxvc5PZK4mSsV0r3Te%6>Qr*zEJ*B>Y8XE_RP<{ zJKH~yg_x>hGX1L&6$W7dx)B4WP@r-EwV&ZF+*u>wt=mnhkWTbvfH4IKA<!Lh93a#Y zfv2gcjN)F1q`!vNw^2i6R818$O~-bv5<vHg@DRyxkg%KpS}hk`$6{lrhSe9-ZyoVZ zCnQu55q=!c;Q=A574R1c_%ClO_lGftF<mopCw@;ZSC)$NpFZxW*H%)^W>a_UX3Y0n y60ZbLZ_Bc5%QCAID$F6#qYD?WzU2JB1sDK>D#xq$6bx?w0000<MNUMnLSTYwaw@w3 literal 0 HcmV?d00001 diff --git a/view/theme/testbubble/wall_item.tpl b/view/theme/testbubble/wall_item.tpl new file mode 100644 index 0000000000..b8af3685fc --- /dev/null +++ b/view/theme/testbubble/wall_item.tpl @@ -0,0 +1,51 @@ +<!-- test --> +<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" > + <div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" > + <div class="wall-item-info" id="wall-item-info-$id"> + <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id" + onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')" + onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)"> + <a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id"> + <img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /> + </a> + <span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span> + <div class="wall-item-photo-menu" id="wall-item-photo-menu-$id"> + <ul> + $item_photo_menu + </ul> + </div> + </div> + <div class="wall-item-photo-end"></div> + <div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div> + </div> + <div class="wall-item-lock-wrapper">$lock</div> + <div class="wall-item-content" id="wall-item-content-$id" > + <div class="wall-item-title" id="wall-item-title-$id">$title</div> + <div class="wall-item-title-end"></div> + <div class="wall-item-body" id="wall-item-body-$id" >$body</div> + </div> + + <div class="wall-item-tools" id="wall-item-tools-$id"> + $vote + $plink + $edpost + $star + $drop + </div> + + <div class="wall-item-author"> + <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a> + <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div> + + </div> + </div> + <div class="wall-item-wrapper-end"></div> + <div class="wall-item-like" id="wall-item-like-$id">$like</div> + <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div> + <div class="wall-item-comment-wrapper" > + $comment + </div> +</div> + +<div class="wall-item-outside-wrapper-end$indent" ></div> + diff --git a/view/theme/testbubble/wallwall_item.tpl b/view/theme/testbubble/wallwall_item.tpl new file mode 100644 index 0000000000..4fe677ab4d --- /dev/null +++ b/view/theme/testbubble/wallwall_item.tpl @@ -0,0 +1,51 @@ +<div class="wall-item-outside-wrapper$indent wallwall" id="wall-item-outside-wrapper-$id" > + <div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" > + <div class="wall-item-info wallwall" id="wall-item-info-$id"> + <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$id" > + <a href="$owner_url" title="$olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$id"> + <img src="$owner_photo" class="wall-item-photo$osparkle" id="wall-item-ownerphoto-$id" style="height: 80px; width: 80px;" alt="$owner_name" /></a> + </div> + <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$wall" /></div> + <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$id" + onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')" + onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)"> + <a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id"> + <img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a> + <span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span> + <div class="wall-item-photo-menu" id="wall-item-photo-menu-$id"> + <ul> + $item_photo_menu + </ul> + </div> + + </div> + <div class="wall-item-photo-end"></div> + <div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div> + </div> + <div class="wall-item-lock-wrapper">$lock</div> + <div class="wall-item-tools" id="wall-item-tools-$id"> + $vote + $plink + $edpost + $drop + </div> + <div class="wall-item-content" id="wall-item-content-$id" > + <div class="wall-item-title" id="wall-item-title-$id">$title</div> + <div class="wall-item-title-end"></div> + <div class="wall-item-body" id="wall-item-body-$id" >$body</div> + </div> + <div class="wall-item-author"> + <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a> + <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div> + </div> + </div> + <div class="wall-item-wrapper-end"></div> + <div class="wall-item-like" id="wall-item-like-$id">$like</div> + <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div> + <div class="wall-item-comment-wrapper" > + $comment + </div> +</div> + +<div class="wall-item-outside-wrapper-end$indent" ></div> + From 4846d114a84b0c7da64501ea89a635d24e403a1d Mon Sep 17 00:00:00 2001 From: Friendika <info@friendika.com> Date: Sun, 25 Sep 2011 01:59:14 -0700 Subject: [PATCH 54/69] project fork --- LICENSE | 14 + README | 86 - addon/README | 186 --- addon/calc/calc.php | 363 ----- addon/convert/UnitConvertor.php | 283 ---- addon/convert/convert.php | 228 --- addon/facebook/README | 39 - addon/facebook/facebook.css | 13 - addon/facebook/facebook.php | 1059 ------------ addon/fortunate/fortunate.css | 7 - addon/fortunate/fortunate.php | 27 - addon/impressum/README | 27 - addon/impressum/admin.tpl | 6 - addon/impressum/impressum.php | 76 - addon/js_upload/file-uploader/client/demo.htm | 38 - .../file-uploader/client/do-nothing.htm | 1 - .../file-uploader/client/fileuploader.css | 31 - .../file-uploader/client/fileuploader.js | 1247 --------------- .../file-uploader/client/loading.gif | Bin 1688 -> 0 bytes addon/js_upload/file-uploader/gpl-2.0.txt | 339 ---- addon/js_upload/file-uploader/license.txt | 24 - addon/js_upload/file-uploader/readme.md | 152 -- .../server/OctetStreamReader.java | 125 -- .../server/coldfusion/coldfusion.cfc | 1 - .../file-uploader/server/coldfusion/demo.cfm | 1 - .../server/coldfusion/readme.txt | 9 - addon/js_upload/file-uploader/server/perl.cgi | 62 - addon/js_upload/file-uploader/server/php.php | 162 -- .../js_upload/file-uploader/server/readme.txt | 18 - .../file-uploader/server/uploads/.gitignore | 2 - .../file-uploader/tests/action-acceptance.php | 46 - .../tests/action-handler-queue-test.php | 31 - .../tests/action-handler-test.php | 31 - .../tests/action-slow-response.php | 2 - .../tests/browser-bugs/safari-bug1.htm | 9 - .../tests/browser-bugs/safari-bug2.htm | 19 - .../application-javascript.php | 1 - .../iframe-content-tests/application-json.php | 1 - .../tests/iframe-content-tests/header-404.php | 2 - .../tests/iframe-content-tests/somepage.php | 1 - .../iframe-content-tests/text-html-large.php | 6 - .../tests/iframe-content-tests/text-html.php | 7 - .../iframe-content-tests/text-javascript.php | 1 - .../tests/iframe-content-tests/text-plain.php | 2 - .../file-uploader/tests/jquery-1.4.2.min.js | 154 -- .../jquery-ui/jquery-ui-1.8.4.custom.min.js | 200 --- .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 260 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 251 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 104 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 125 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 4427 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 90 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 129 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_228ef1_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes .../ui-lightness/jquery-ui-1.8.4.custom.css | 334 ---- .../file-uploader/tests/qunit/package.json | 21 - .../file-uploader/tests/qunit/qunit/qunit.css | 119 -- .../file-uploader/tests/qunit/qunit/qunit.js | 1069 ------------- .../file-uploader/tests/qunit/test/index.html | 17 - .../file-uploader/tests/qunit/test/same.js | 1423 ----------------- .../file-uploader/tests/qunit/test/test.js | 171 -- .../1imagelonglonglonglonglonglongname.gif | Bin 1688 -> 0 bytes .../tests/sample-files/2larger.txt | 1 - .../tests/sample-files/3empty.txt | 0 .../tests/sample-files/4text.txt | 1 - .../tests/sample-files/5text.txt | 1 - .../tests/sample-files/6text.txt | 1 - .../tests/sample-files/7small.txt | 1 - .../tests/sample-files/8text.txt | 1 - .../tests/separate-file-list.htm | 24 - .../file-uploader/tests/test-acceptance.htm | 106 -- .../file-uploader/tests/test-drop-zone.htm | 48 - .../tests/test-handler-queue.htm | 81 - .../tests/test-upload-handlers.htm | 382 ----- addon/js_upload/js_upload.php | 339 ---- addon/ldapauth/README | 17 - addon/ldapauth/ldapauth.php | 130 -- addon/oembed/oembed.js | 6 - addon/oembed/oembed.php | 89 -- addon/oembed/oembed.png | Bin 417 -> 0 bytes addon/oembed/settings.tpl | 7 - addon/piwik/README | 43 - addon/piwik/admin.tpl | 4 - addon/piwik/piwik.css | 8 - addon/piwik/piwik.php | 95 -- addon/poormancron/poormancron.php | 64 - addon/randplace/randplace.css | 14 - addon/randplace/randplace.php | 180 --- addon/sniper/100x100.gif | Bin 6870 -> 0 bytes addon/sniper/100x100.jpg | Bin 30484 -> 0 bytes addon/sniper/100x75.jpg | Bin 12010 -> 0 bytes addon/sniper/100x80.jpg | Bin 12524 -> 0 bytes addon/sniper/120x90hotshotsniper.jpg | Bin 16122 -> 0 bytes addon/sniper/125x125.jpg | Bin 31696 -> 0 bytes addon/sniper/140x90.jpg | Bin 17690 -> 0 bytes addon/sniper/150x150.jpg | Bin 43762 -> 0 bytes addon/sniper/160x86.gif | Bin 9420 -> 0 bytes addon/sniper/180x135.jpg | Bin 10466 -> 0 bytes addon/sniper/250x180.jpg | Bin 39574 -> 0 bytes addon/sniper/300x200.jpg | Bin 16466 -> 0 bytes addon/sniper/300x300.jpg | Bin 19530 -> 0 bytes addon/sniper/32x32.jpg | Bin 13904 -> 0 bytes addon/sniper/335x185.jpg | Bin 15345 -> 0 bytes addon/sniper/60x60.jpg | Bin 19531 -> 0 bytes addon/sniper/64x64.gif | Bin 3663 -> 0 bytes addon/sniper/70x45.jpg | Bin 15510 -> 0 bytes addon/sniper/70x60.jpg | Bin 8167 -> 0 bytes addon/sniper/73x80.jpg | Bin 9456 -> 0 bytes addon/sniper/75x57.jpg | Bin 8298 -> 0 bytes addon/sniper/80x60.jpg | Bin 7889 -> 0 bytes addon/sniper/80x70.jpg | Bin 5218 -> 0 bytes addon/sniper/80x80hotshotsniper.jpg | Bin 23760 -> 0 bytes addon/sniper/81x67.jpg | Bin 9805 -> 0 bytes addon/sniper/description_etc.txt | 11 - addon/sniper/hotshotsniper.html | 15 - addon/sniper/hotshotsniper.swf | Bin 927817 -> 0 bytes addon/sniper/sniper.php | 43 - addon/statusnet/README | 75 - addon/statusnet/admin.tpl | 16 - addon/statusnet/signinwithstatusnet.png | Bin 5808 -> 0 bytes addon/statusnet/statusnet.css | 74 - addon/statusnet/statusnet.php | 480 ------ addon/tictac/tictac.php | 665 -------- addon/twitter/README | 77 - addon/twitter/admin.tpl | 3 - addon/twitter/lighter.png | Bin 2490 -> 0 bytes addon/twitter/twitter.css | 41 - addon/twitter/twitter.php | 285 ---- addon/widgets/settings.tpl | 19 - addon/widgets/widget_friends.php | 32 - addon/widgets/widget_like.php | 22 - addon/widgets/widgets.js | 64 - addon/widgets/widgets.php | 170 -- boot.php | 2 +- 140 files changed, 15 insertions(+), 12015 deletions(-) create mode 100644 LICENSE delete mode 100644 README delete mode 100644 addon/README delete mode 100644 addon/calc/calc.php delete mode 100644 addon/convert/UnitConvertor.php delete mode 100644 addon/convert/convert.php delete mode 100644 addon/facebook/README delete mode 100644 addon/facebook/facebook.css delete mode 100644 addon/facebook/facebook.php delete mode 100644 addon/fortunate/fortunate.css delete mode 100644 addon/fortunate/fortunate.php delete mode 100644 addon/impressum/README delete mode 100644 addon/impressum/admin.tpl delete mode 100644 addon/impressum/impressum.php delete mode 100644 addon/js_upload/file-uploader/client/demo.htm delete mode 100644 addon/js_upload/file-uploader/client/do-nothing.htm delete mode 100644 addon/js_upload/file-uploader/client/fileuploader.css delete mode 100644 addon/js_upload/file-uploader/client/fileuploader.js delete mode 100644 addon/js_upload/file-uploader/client/loading.gif delete mode 100644 addon/js_upload/file-uploader/gpl-2.0.txt delete mode 100644 addon/js_upload/file-uploader/license.txt delete mode 100644 addon/js_upload/file-uploader/readme.md delete mode 100644 addon/js_upload/file-uploader/server/OctetStreamReader.java delete mode 100644 addon/js_upload/file-uploader/server/coldfusion/coldfusion.cfc delete mode 100644 addon/js_upload/file-uploader/server/coldfusion/demo.cfm delete mode 100644 addon/js_upload/file-uploader/server/coldfusion/readme.txt delete mode 100644 addon/js_upload/file-uploader/server/perl.cgi delete mode 100644 addon/js_upload/file-uploader/server/php.php delete mode 100644 addon/js_upload/file-uploader/server/readme.txt delete mode 100644 addon/js_upload/file-uploader/server/uploads/.gitignore delete mode 100644 addon/js_upload/file-uploader/tests/action-acceptance.php delete mode 100644 addon/js_upload/file-uploader/tests/action-handler-queue-test.php delete mode 100644 addon/js_upload/file-uploader/tests/action-handler-test.php delete mode 100644 addon/js_upload/file-uploader/tests/action-slow-response.php delete mode 100644 addon/js_upload/file-uploader/tests/browser-bugs/safari-bug1.htm delete mode 100644 addon/js_upload/file-uploader/tests/browser-bugs/safari-bug2.htm delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/application-javascript.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/application-json.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/header-404.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/somepage.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/text-html-large.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/text-html.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/text-javascript.php delete mode 100644 addon/js_upload/file-uploader/tests/iframe-content-tests/text-plain.php delete mode 100644 addon/js_upload/file-uploader/tests/jquery-1.4.2.min.js delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/jquery-ui-1.8.4.custom.min.js delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_flat_10_000000_40x100.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_228ef1_256x240.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ef8c08_256x240.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffd27a_256x240.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffffff_256x240.png delete mode 100644 addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/jquery-ui-1.8.4.custom.css delete mode 100644 addon/js_upload/file-uploader/tests/qunit/package.json delete mode 100644 addon/js_upload/file-uploader/tests/qunit/qunit/qunit.css delete mode 100644 addon/js_upload/file-uploader/tests/qunit/qunit/qunit.js delete mode 100644 addon/js_upload/file-uploader/tests/qunit/test/index.html delete mode 100644 addon/js_upload/file-uploader/tests/qunit/test/same.js delete mode 100644 addon/js_upload/file-uploader/tests/qunit/test/test.js delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/1imagelonglonglonglonglonglongname.gif delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/2larger.txt delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/3empty.txt delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/4text.txt delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/5text.txt delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/6text.txt delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/7small.txt delete mode 100644 addon/js_upload/file-uploader/tests/sample-files/8text.txt delete mode 100644 addon/js_upload/file-uploader/tests/separate-file-list.htm delete mode 100644 addon/js_upload/file-uploader/tests/test-acceptance.htm delete mode 100644 addon/js_upload/file-uploader/tests/test-drop-zone.htm delete mode 100644 addon/js_upload/file-uploader/tests/test-handler-queue.htm delete mode 100644 addon/js_upload/file-uploader/tests/test-upload-handlers.htm delete mode 100644 addon/js_upload/js_upload.php delete mode 100644 addon/ldapauth/README delete mode 100644 addon/ldapauth/ldapauth.php delete mode 100644 addon/oembed/oembed.js delete mode 100644 addon/oembed/oembed.php delete mode 100644 addon/oembed/oembed.png delete mode 100644 addon/oembed/settings.tpl delete mode 100644 addon/piwik/README delete mode 100644 addon/piwik/admin.tpl delete mode 100644 addon/piwik/piwik.css delete mode 100644 addon/piwik/piwik.php delete mode 100644 addon/poormancron/poormancron.php delete mode 100644 addon/randplace/randplace.css delete mode 100644 addon/randplace/randplace.php delete mode 100644 addon/sniper/100x100.gif delete mode 100644 addon/sniper/100x100.jpg delete mode 100644 addon/sniper/100x75.jpg delete mode 100644 addon/sniper/100x80.jpg delete mode 100644 addon/sniper/120x90hotshotsniper.jpg delete mode 100644 addon/sniper/125x125.jpg delete mode 100644 addon/sniper/140x90.jpg delete mode 100644 addon/sniper/150x150.jpg delete mode 100644 addon/sniper/160x86.gif delete mode 100644 addon/sniper/180x135.jpg delete mode 100644 addon/sniper/250x180.jpg delete mode 100644 addon/sniper/300x200.jpg delete mode 100644 addon/sniper/300x300.jpg delete mode 100644 addon/sniper/32x32.jpg delete mode 100644 addon/sniper/335x185.jpg delete mode 100644 addon/sniper/60x60.jpg delete mode 100644 addon/sniper/64x64.gif delete mode 100644 addon/sniper/70x45.jpg delete mode 100644 addon/sniper/70x60.jpg delete mode 100644 addon/sniper/73x80.jpg delete mode 100644 addon/sniper/75x57.jpg delete mode 100644 addon/sniper/80x60.jpg delete mode 100644 addon/sniper/80x70.jpg delete mode 100644 addon/sniper/80x80hotshotsniper.jpg delete mode 100644 addon/sniper/81x67.jpg delete mode 100644 addon/sniper/description_etc.txt delete mode 100644 addon/sniper/hotshotsniper.html delete mode 100644 addon/sniper/hotshotsniper.swf delete mode 100644 addon/sniper/sniper.php delete mode 100644 addon/statusnet/README delete mode 100644 addon/statusnet/admin.tpl delete mode 100644 addon/statusnet/signinwithstatusnet.png delete mode 100644 addon/statusnet/statusnet.css delete mode 100644 addon/statusnet/statusnet.php delete mode 100644 addon/tictac/tictac.php delete mode 100644 addon/twitter/README delete mode 100644 addon/twitter/admin.tpl delete mode 100644 addon/twitter/lighter.png delete mode 100644 addon/twitter/twitter.css delete mode 100644 addon/twitter/twitter.php delete mode 100644 addon/widgets/settings.tpl delete mode 100644 addon/widgets/widget_friends.php delete mode 100644 addon/widgets/widget_like.php delete mode 100644 addon/widgets/widgets.js delete mode 100644 addon/widgets/widgets.php diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..488f2e6b79 --- /dev/null +++ b/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2010, 2011 the Friendika Project +All rights reserved. + +Redistribution and use in source and binary forms are permitted +provided that the above copyright notice and this paragraph are +duplicated in all such forms and that any documentation, +advertising materials, and other materials related to such +distribution and use acknowledge that the software was developed +by the Friendika Project. The name of the +University may not be used to endorse or promote products derived +from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/README b/README deleted file mode 100644 index 598b6d2921..0000000000 --- a/README +++ /dev/null @@ -1,86 +0,0 @@ - - ************* - * Friendika * - ************* - - Friendika Communications Server - - http://project.friendika.com - - - Friendika is a web application for managing social communications. Some -would call it a "social network" or "distributed social network". We think -both terms have been over-used, and don't adequately describe Friendika's -capabilities - though Friendika can also fill those roles. - - At its essence, Friendika is a web application which can monitor various -information and social activity streams, and which also lets you participate -in online conversations with friends and associates, using a variety of network -protocols. These are combined into an overview of your various communications -and activities - regardless of network origin. - - Friendika also manages your personal profiles and photo albums and lets -you securely present each of these to specific audiences. Your communications -can be either open and public, or closed and private. You can easily create -"groups" of contacts with which you can partition your conversations into -private social circles, and which cannot be seen outside the circle. - - Friendika is decentralised. Any account on any Friendika server can connect -with any account on any other Friendika server. You can also connect to and -interact directly with friends on Facebook, Status.Net, and other federated -social web services (e.g. identi.ca, GNU-Social, etc.). - - Outgoing communications can be directed to Friendika, existing accounts on -Facebook and Twitter, federated social web providers - or even delivered to -email contacts. - - Incoming data streams aren't limited to traditional social networks. -They may include most any service which provides a syndication feed (both RSS -and Atom). This allows you to view communications from friends in other -diverse social networks - such as Diaspora, Google Buzz, and millions of -blogs, news services, and other websites. You can also import -contacts from (and write to) anybody that is accessible from your email -INBOX and view them in your social stream. Over time we will try to -build two-way bridges to other services so that you can freely -interact in both directions with anybody on an accessible network that -allows it. - - Communications between Friendika servers are private and encrypted, -using military grade encryption - and require mutual identity provenance -before any data is exchanged. These same crypto mechanisms provide remote -password-less authentication; allowing you to post to profiles and view private -photo collections on other servers - without encountering any login and/or -authorisation dialogues when visiting these sites. - - Friendika has no boundaries and no central ownership of the data generated -within the network. Anybody with a commodity PHP/MySQL web server or hosting -account can provide a server, and each individual server can then support -up to several thousand participating members - each with their own unique -communication and privacy needs. This allows Friendika to scale to global -levels and mimics the decentralised architecture of the web itself. - - If you are creating a website which requires social interaction, Friendika -can also take the place of blog software, forum software and feed readers, and -also provide individualised communications and content management - or -simply be used as an alternative to traditional "monolithic" social networks. - - Friendika is also free - in every sense of the word. - - Choose freedom - join us. - - Find out more about the project at http://project.friendika.com - - ******************* - Friendika Demo Site - ******************* - - http://demo.friendika.com - - ******************* - Friendika Downloads - ******************* - - http://github.com/friendika/friendika/tarball/master - - - diff --git a/addon/README b/addon/README deleted file mode 100644 index fb1c6340a5..0000000000 --- a/addon/README +++ /dev/null @@ -1,186 +0,0 @@ -Friendika Addon/Plugin development - -This is an early specification and hook details may be subject to change. - -Please see the sample addon 'randplace' for a working example of using these features. - - -You must register plugins with the system in the .htconfig.php file. - -$a->config['system']['addon'] = 'plugin1name, plugin2name, another_name'; - -Plugin names cannot contain spaces and are used as filenames. - - -Register your plugin hooks during installation. - - register_hook($hookname, $file, $function); - - $hookname is a string and corresponds to a known Friendika hook - $file is a pathname relative to the top-level Friendika directory. - This *should* be 'addon/plugin_name/plugin_name.php' in most cases. - $function is a string and is the name of the function which will be executed - when the hook is called. - - -Your hook functions will be called with at least one and possibly two arguments - - function myhook_function(&$a, &$b) { - - - } - -If you wish to make changes to the calling data, you must declare them as -reference variables (with '&') during function declaration. - -$a is the Friendika 'App' class - which contains a wealth of information -about the current state of Friendika, such as which module has been called, -configuration info, the page contents at the point the hook was invoked, profile -and user information, etc. It is recommeded you call this '$a' to match its usage -elsewhere. - -$b can be called anything you like. This is information which is specific to the hook -currently being processed, and generally contains information that is being immediately -processed or acted on that you can use, display, or alter. Remember to declare it with -'&' if you wish to alter it. - - -Current hooks: - -'authenticate' - called when a user attempts to login. - $b is an array - 'username' => the supplied username - 'password' => the supplied password - 'authenticated' => set this to non-zero to authenticate the user. - 'user_record' => successful authentication must also return a valid user record from the database - - -'logged_in' - called after a user has successfully logged in. - $b contains the $a->user array - - -'display_item' - called when formatting a post for display. - $b is an array - 'item' => The item (array) details pulled from the database - 'output' => the (string) HTML representation of this item prior to adding it - to the page - -'post_local' - called when a status post or comment is entered on the local system - $b is the item array of the information to be stored in the database - {Please note: body contents are bbcode - not HTML) - -'post_local_end' - called when a local status post or comment has been stored on the local system - $b is the item array of the information which has just been stored in the database - {Please note: body contents are bbcode - not HTML) - - -'post_remote' - called when receiving a post from another source. This may also be used - to post local activity or system generated messages. - $b is the item array of information to be stored in the database and the item - body is bbcode. - -'settings_form' - called when generating the HTML for the user Settings page - $b is the (string) HTML of the settings page before the final '</form>' tag. - -'settings_post' - called when the Settings pages are submitted. - $b is the $_POST array - -'plugin_settings' - called when generating the HTML for the addon settings page - $b is the (string) HTML of the addon settings page before the final '</form>' tag. - -'plugin_settings_post' - called when the Addon Settings pages are submitted. - $b is the $_POST array - -'profile_post' - called when posting a profile page. - $b is the $_POST array - -'profile_edit' - called prior to output of profile edit page - $b is array - 'profile' => profile (array) record from the database - 'entry' => the (string) HTML of the generated entry - -'profile_advanced' - called when the HTML is generated for the 'Advanced profile', - corresponding to the 'Profile' tab within a person's profile page. - $b is the (string) HTML representation of the generated profile - -'directory_item' - called from the Directory page when formatting an item for display - $b is an array - 'contact' => contact (array) record for the person from the database - 'entry' => the (string) HTML of the generated entry - -'profile_sidebar_enter' - called prior to generating the sidebar "short" profile for a page - $b is (array) the person's profile array - -'profile_sidebar' - called when generating the sidebar "short" profile for a page - $b is an array - 'profile' => profile (array) record for the person from the database - 'entry' => the (string) HTML of the generated entry - -'contact_block_end' - called when formatting the block of contacts/friends on a - profile sidebar has completed - $b is an array - 'contacts' => contact array of entries - 'output' => the (string) generated HTML of the contact block - -'bbcode' - called during conversion of bbcode to html - $b is (string) converted text - -'html2bbcode' - called during conversion of html to bbcode (e.g. remote message posting) - $b is (string) converted text - - -'page_header' - called after building the page navigation section - $b is (string) HTML of nav region - - -'personal_xrd' - called prior to output of personal XRD file. - $b is an array - 'user' => the user record for the person - 'xml' => the complete XML to be output - - -'home_content' - called prior to output home page content, shown to unlogged users - $b is (string) HTML of section region - -'contact_edit' - called when editing contact details on an individual from the Contacts page - $b is (array) - 'contact' => contact record (array) of target contact - 'output' => the (string) generated HTML of the contact edit page - -'contact_edit_post' - called when posting the contact edit page - $b is the $_POST array - -'init_1' - called just after DB has been opened and before session start - $b is not used or passed - -'page_end' - called after HTML content functions have completed - $b is (string) HTML of content div - -'jot_plugin' - add tools to jot toolbar - $b is (string) HTML for tool icon - - -*** = subject to change - - - - - -Not yet documented: - -'atom_feed' *** - -'atom_feed_end' *** - -'parse_atom' *** - -'atom_author' *** - -'atom_entry' *** - -'parse_link' *** - - - - - diff --git a/addon/calc/calc.php b/addon/calc/calc.php deleted file mode 100644 index 8c079dc7a5..0000000000 --- a/addon/calc/calc.php +++ /dev/null @@ -1,363 +0,0 @@ -<?php -/** - * Name: Calculator App - * Description: Simple Calculator Application - * Version: 1.0 - * Author: Mike Macgirvin <http://macgirvin.com/profile/mike> - */ - - -function calc_install() { - register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu'); -} - -function calc_uninstall() { - unregister_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu'); - -} - -function calc_app_menu($a,&$b) { - $b['app_menu'] .= '<div class="app-title"><a href="calc">Calculator</a></div>'; -} - - -function calc_module() {} - - - - -function calc_init($a) { - -$x = <<< EOT - -<script language="JavaScript"> -/************************************** - * www.FemaleNerd.com * - **************************************/ - -// Declare global variables -var displayText = "" -var num1 -var num2 -var operatorType - -// Write to display -function addDisplay(n){ - id = document.getElementById("display"); -id.value = "" -displayText += n -id.value = displayText -} - -// Addition -function addNumbers() { -if (displayText == "") { - displayText = result - } -num1 = parseFloat(displayText) -operatorType = "add" -displayText = "" -} - -// Subtraction -function subtractNumbers() { -if (displayText == "") { - displayText = result - } -num1 = parseFloat(displayText) -operatorType = "subtract" -displayText = "" -} - -// Multiplication -function multiplyNumbers() { -if (displayText == "") { - displayText = result - } -num1 = parseFloat(displayText) -operatorType = "multiply" -displayText = "" -} - -// Division -function divideNumbers() { -if (displayText == "") { - displayText = result - } -num1 = parseFloat(displayText) -operatorType = "divide" -displayText = "" -} - -// Sine -function sin() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = Math.sin(num1) - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// Cosine -function cos() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = Math.cos(num1) - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// ArcSine -function arcSin() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = Math.asin(num1) - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// ArcCosine -function arcCos() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = Math.acos(num1) - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// Square root -function sqrt() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = Math.sqrt(num1) - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// Square number (number to the power of two) -function square() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = num1 * num1 - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// Convert degrees to radians -function degToRad() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = num1 * Math.PI / 180 - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// Convert radians to degrees -function radToDeg() { - id = document.getElementById("display"); -if (displayText == "") { - num1 = result - } -else { - num1 = parseFloat(displayText) - } -if (num1 != "") { - result = num1 * 180 / Math.PI - id.value = result - displayText = "" - } -else { - alert("Please write the number first") - } -} - -// Calculations -function calculate() { - id = document.getElementById("display"); - -if (displayText != "") { - num2 = parseFloat(displayText) -// Calc: Addition - if (operatorType == "add") { - result = num1 + num2 - id.value = result - } -// Calc: Subtraction - if (operatorType == "subtract") { - result = num1 - num2 - id.value = result - } -// Calc: Multiplication - if (operatorType == "multiply") { - result = num1 * num2 - id.value = result - } -// Calc: Division - if (operatorType == "divide") { - result = num1 / num2 - id.value = result - } - displayText = "" - } - else { - id.value = "Oops! Error!" - } -} - -// Clear the display -function clearDisplay() { - id = document.getElementById("display"); - -displayText = "" -id.value = "" -} -</script> - -EOT; -$a->page['htmlhead'] .= $x; -} - -function calc_content($app) { - -$o = ''; - -$o .= <<< EOT - -<h3>Calculator</h3> -<br /><br /> -<table> -<tbody><tr><td> -<table bgcolor="#af9999" border="1"> -<tbody><tr><td> -<table border="1" cellpadding="2" cellspacing="2"> -<form name="calc"> -<!-- -<TR><TD VALIGN=top colspan=6 ALIGN="center"> <H2>Calculator</H2> </TD> ---> -<tbody><tr> - <td colspan="5"><input size="22" id="display" name="display" type="text"></td> -</tr><tr align="left" valign="middle"> - <td><input name="one" value="  1   " onclick="addDisplay(1)" type="button"></td> - <td><input name="two" value="  2   " onclick="addDisplay(2)" type="button"></td> - <td><input name="three" value="  3   " onclick="addDisplay(3)" type="button"></td> - <td><input name="plus" value="  +   " onclick="addNumbers()" type="button"></td> -</tr><tr align="left" valign="middle"> - <td><input name="four" value="  4   " onclick="addDisplay(4)" type="button"></td> - <td><input name="five" value="  5   " onclick="addDisplay(5)" type="button"></td> - <td><input name="six" value="  6   " onclick="addDisplay(6)" type="button"></td> - <td><input name="minus" value="   -   " onclick="subtractNumbers()" type="button"></td> -</tr><tr align="left" valign="middle"> - <td><input name="seven" value="  7   " onclick="addDisplay(7)" type="button"></td> - <td><input name="eight" value="  8   " onclick="addDisplay(8)" type="button"></td> - <td><input name="nine" value="  9   " onclick="addDisplay(9)" type="button"></td> - <td><input name="multiplication" value="  *    " onclick="multiplyNumbers()" type="button"></td> -</tr><tr align="left" valign="middle"> - <td><input name="zero" value="  0   " onclick="addDisplay(0)" type="button"></td> - <td><input name="pi" value=" Pi  " onclick="addDisplay(Math.PI)" type="button"> </td> - <td><input name="dot" value="   .   " onclick='addDisplay(".")' type="button"></td> - <td><input name="division" value="   /   " onclick="divideNumbers()" type="button"></td> -</tr><tr align="left" valign="middle"> - <td><input name="sqareroot" value="sqrt" onclick="sqrt()" type="button"></td> - <td><input name="squarex" value=" x^2" onclick="square()" type="button"></td> - <td><input name="deg-rad" value="d2r " onclick="degToRad()" type="button"></td> - <td><input name="rad-deg" value="r2d " onclick="radToDeg()" type="button"></td> -</tr><tr align="left" valign="middle"> - <td><input name="sine" value=" sin " onclick="sin()" type="button"></td> - <td><input name="arcsine" value="asin" onclick="arcSin()" type="button"></td> - <td><input name="cosine" value="cos" onclick="cos()" type="button"></td> - <td><input name="arccosine" value="acs" onclick="arcCos()" type="button"></td> - -</tr><tr align="left" valign="middle"> - <td colspan="2"><input name="clear" value="  Clear  " onclick="clearDisplay()" type="button"></td> - <td colspan="3"><input name="enter" value="     =      " onclick="calculate()" type="button"></td> - -</tr></tbody></table> -</form> - - <!-- - <TD VALIGN=top> - <B>NOTE:</B> All sine and cosine calculations are - <br>done in radians. Remember to convert first - <br>if using degrees. - </TD> - --> - -</td></tr></tbody></table> - - -</td></tr></tbody></table> - -EOT; -return $o; - -} diff --git a/addon/convert/UnitConvertor.php b/addon/convert/UnitConvertor.php deleted file mode 100644 index d7933a8fb4..0000000000 --- a/addon/convert/UnitConvertor.php +++ /dev/null @@ -1,283 +0,0 @@ -<?php -// +----------------------------------------------------------------------+ -// | PHP version 4.0 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.0 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Stanislav Okhvat <stanis@ngs.ru> | -// | Co-authored by : CVH, Chris Hansel <chris@cpi-service.com> | -// +----------------------------------------------------------------------+ -// -// $Id: UnitConvertor.php,v 1.00 2002/02/20 11:40:00 stasokhvat Exp $ - -/** -* UnitConvertor is able to convert between different units and currencies. -* -* @author Stanislav Okhvat <stanis@sibfair.nsk.su, stanis@ngs.ru> -* @version $Id: UnitConvertor.php,v 1.00 2002/03/01 17:00:00 stasokhvat Exp $ -* @package UnitConvertor -* @access public -* @history 01.03.2002 Implemented the code for regular and offset-based -* conversions -* -* 13.12.2004 -* By Chris Hansel (CVH): changed getConvSpecs in order to have it look up -* intermediary conversions (also see comments in check_key). -* -* Intermediary conversions are useful when no conversion ratio is specified -* between two units when we calculate between the two. For example, we want -* to convert between Fahrenheit and Kelvin, and we have only -* specified how to convert Centigrade<->Fahrenheit and -* Centigrade<->Kelvin. While a direct (Fahrenheit->Kelvin) or -* reverse (Kelvin->Fahrenheit) lookups fail, looking for an intermediary -* unit linking the two (Centigrade) helps us do the conversion. -* -* 13.12.2004 -* Chris Hansel (CVH): $to_array argument of addConversion method can now -* contain units as 'unit1/unit2/unit3', when all units stand for the same -* thing. See examples in unitconv.php -*/ -class UnitConvertor -{ - /** - * Stores conversion ratios. - * - * @var array - * @access private - */ - var $conversion_table = array(); - - /** - * Decimal point character (default is "." - American - set in constructor). - * - * @var string - * @access private - */ - var $decimal_point; - - /** - * Thousands separator (default is "," - American - set in constructor). - * - * @var string - * @access private - */ - var $thousand_separator; - - /** - * For future use - * - * @var array - * @access private - */ - var $bases = array(); - - /** - * Constructor. Initializes the UnitConvertor object with the most important - * properties. - * - * @param string decimal point character - * @param string thousand separator character - * @return void - * @access public - */ - function UnitConvertor($dec_point = '.', $thousand_sep = ',') - { - $this->decimal_point = $dec_point; - $this->thousand_separator = $thousand_sep; - - } // end func UnitConvertor - - /** - * Adds a conversion ratio to the conversion table. - * - * @param string the name of unit from which to convert - * @param array array( - * "pound"=>array("ratio"=>'', "offset"=>'') - * ) - * "pound" - name of unit to set conversion ration to - * "ratio" - 'double' conversion ratio which, when - * multiplied by the number of $from_unit units produces - * the result - * "offset" - an offset from 0 which will be added to - * the result when converting (needed for temperature - * conversions and defaults to 0). - * @return boolean true if successful, false otherwise - * @access public - */ - function addConversion($from_unit, $to_array) - { - if (!isset($this->conversion_table[$from_unit])) { - while(list($key, $val) = each($to_array)) - { - if (strstr($key, '/')) - { - $to_units = explode('/', $key); - foreach ($to_units as $to_unit) - { - $this->bases[$from_unit][] = $to_unit; - - if (!is_array($val)) - { - $this->conversion_table[$from_unit."_".$to_unit] = array("ratio"=>$val, "offset"=>0); - } - else - { - $this->conversion_table[$from_unit."_".$to_unit] = - array( - "ratio"=>$val['ratio'], - "offset"=>(isset($val['offset']) ? $val['offset'] : 0) - ); - } - } - } - else - { - $this->bases[$from_unit][] = $key; - - if (!is_array($val)) - { - $this->conversion_table[$from_unit."_".$key] = array("ratio"=>$val, "offset"=>0); - } - else - { - $this->conversion_table[$from_unit."_".$key] = - array( - "ratio"=>$val['ratio'], - "offset"=>(isset($val['offset']) ? $val['offset'] : 0) - ); - } - } - } - return true; - } - return false; - - } // end func addConversion - - /** - * Converts from one unit to another using specified precision. - * - * @param double value to convert - * @param string name of the source unit from which to convert - * @param string name of the target unit to which we are converting - * @param integer double precision of the end result - * @return void - * @access public - */ - function convert($value, $from_unit, $to_unit, $precision) - { - if ($this->getConvSpecs($from_unit, $to_unit, $value, $converted )) - { - return number_format($converted , (int)$precision, $this->decimal_point, $this->thousand_separator); - } else { - return false; - } - } // end func - - /** - * CVH : changed this Function getConvSpecs in order to have it look up - * intermediary Conversions from the - * "base" unit being that one that has the highest hierarchical order in one - * "logical" Conversion_Array - * when taking $conv->addConversion('km', - * array('meter'=>1000, 'dmeter'=>10000, 'centimeter'=>100000, - * 'millimeter'=>1000000, 'mile'=>0.62137, 'naut.mile'=>0.53996, - * 'inch(es)/zoll'=>39370, 'ft/foot/feet'=>3280.8, 'yd/yard'=>1093.6)); - * "km" would be the logical base unit for all units of dinstance, thus, - * if the function fails to find a direct or reverse conversion in the table - * it is only logical to suspect that if there is a chance - * converting the value it only is via the "base" unit, and so - * there is not even a need for a recursive search keeping the perfomance - * acceptable and the ressource small... - * - * CVH check_key checks for a key in the Conversiontable and returns a value - */ - function check_key( $key) { - if ( array_key_exists ($key,$this->conversion_table)) { - if (! empty($this->conversion_table[$key])) { - return $this->conversion_table[$key]; - } - } - return false; - } - - /** - * Key function. Finds the conversion ratio and offset from one unit to another. - * - * @param string name of the source unit from which to convert - * @param string name of the target unit to which we are converting - * @param double conversion ratio found. Returned by reference. - * @param double offset which needs to be added (or subtracted, if negative) - * to the result to convert correctly. - * For temperature or some scientific conversions, - * i.e. Fahrenheit -> Celcius - * @return boolean true if ratio and offset are found for the supplied - * units, false otherwise - * @access private - */ - function getConvSpecs($from_unit, $to_unit, $value, &$converted) - { - $key = $from_unit."_".$to_unit; - $revkey = $to_unit."_".$from_unit; - $found = false; - if ($ct_arr = $this->check_key($key)) { - // Conversion Specs found directly - $ratio = (double)$ct_arr['ratio']; - $offset = $ct_arr['offset']; - $converted = (double)(($value * $ratio)+ $offset); - - return true; - } // not found in direct order, try reverse order - elseif ($ct_arr = $this->check_key($revkey)) { - $ratio = (double)(1/$ct_arr['ratio']); - $offset = -$ct_arr['offset']; - $converted = (double)(($value + $offset) * $ratio); - - return true; - } // not found test for intermediary conversion - else { - // return ratio = 1 if keyparts match - if ($key == $revkey) { - $ratio = 1; - $offset = 0; - $converted = $value; - return true; - } - // otherwise search intermediary - reset($this->conversion_table); - while (list($convk, $i1_value) = each($this->conversion_table)) { - // split the key into parts - $keyparts = preg_split("/_/",$convk); - // return ratio = 1 if keyparts match - - // Now test if either part matches the from or to unit - if ($keyparts[1] == $to_unit && ($i2_value = $this->check_key($keyparts[0]."_".$from_unit))) { - // an intermediary $keyparts[0] was found - // now let us put things together intermediary 1 and 2 - $converted = (double)(((($value - $i2_value['offset']) / $i2_value['ratio']) * $i1_value['ratio'])+ $i1_value['offset']); - - $found = true; - - } elseif ($keyparts[1] == $from_unit && ($i2_value = $this->check_key($keyparts[0]."_".$to_unit))) { - // an intermediary $keyparts[0] was found - // now let us put things together intermediary 2 and 1 - $converted = (double)(((($value - $i1_value['offset']) / $i1_value['ratio']) + $i2_value['offset']) * $i2_value['ratio']); - - $found = true; - } - } - return $found; - } - - } // end func getConvSpecs - -} // end class UnitConvertor -?> \ No newline at end of file diff --git a/addon/convert/convert.php b/addon/convert/convert.php deleted file mode 100644 index 7a4c90a530..0000000000 --- a/addon/convert/convert.php +++ /dev/null @@ -1,228 +0,0 @@ -<?php -/** - * Name: Converter App - * Description: Unit converter application - * Version: 1.0 - * Author: Mike Macgirvin <http://macgirvin.com/profile/mike> - */ - -function convert_install() { - register_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu'); -} - -function convert_uninstall() { - unregister_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu'); -} - -function convert_app_menu($a,&$b) { - $b['app_menu'] .= '<div class="app-title"><a href="convert">Units Conversion</a></div>'; -} - - -function convert_module() {} - - - - - - - -function convert_content($app) { - -include("UnitConvertor.php"); - - class TP_Converter extends UnitConvertor { - function TP_Converter($lang = "en") - { - if ($lang != 'en' ) { - $dec_point = '.'; $thousand_sep = "'"; - } else { - $dec_point = '.'; $thousand_sep = ","; - } - - $this->UnitConvertor($dec_point , $thousand_sep ); - - } // end func UnitConvertor - - function find_base_unit($from,$to) { - while (list($skey,$sval) = each($this->bases)) { - if ($skey == $from || $to == $skey || in_array($to,$sval) || in_array($from,$sval)) { - return $skey; - } - } - return false; - } - - function getTable($value, $from_unit, $to_unit, $precision) { - - if ($base_unit = $this->find_base_unit($from_unit,$to_unit)) { - - // A baseunit was found now lets convert from -> $base_unit - - $cell ['value'] = $this->convert($value, $from_unit, $base_unit, $precision)." ".$base_unit; - $cell ['class'] = ($base_unit == $from_unit || $base_unit == $to_unit) ? "framedred": ""; - $cells[] = $cell; - // We now have the base unit and value now lets produce the table; - while (list($key,$val) = each($this->bases[$base_unit])) { - $cell ['value'] = $this->convert($value, $from_unit, $val, $precision)." ".$val; - $cell ['class'] = ($val == $from_unit || $val == $to_unit) ? "framedred": ""; - $cells[] = $cell; - } - - $cc = count($cells); - $string = "<table class=\"framed grayish\" border=\"1\" cellpadding=\"5\" width=\"80%\" align=\"center\"><tr>"; - $string .= "<td rowspan=\"$cc\" align=\"center\">$value $from_unit</td>"; - $i=0; - foreach ($cells as $cell) { - if ($i==0) { - $string .= "<td class=\"".$cell['class']."\">".$cell['value']."</td>"; - $i++; - } else { - $string .= "</tr><tr><td class=\"".$cell['class']."\">".$cell['value']."</td>"; - } - } - $string .= "</tr></table>"; - return $string; - } - - } -} - - -$conv = new TP_Converter('en'); - - -$conversions = array( - 'Temperature'=>array('base' =>'Celsius', - 'conv'=>array( - 'Fahrenheit'=>array('ratio'=>1.8, 'offset'=>32), - 'Kelvin'=>array('ratio'=>1, 'offset'=>273), - 'Reaumur'=>0.8 - ) - ), - 'Weight' => array('base' =>'kg', - 'conv'=>array( - 'g'=>1000, - 'mg'=>1000000, - 't'=>0.001, - 'grain'=>15432, - 'oz'=>35.274, - 'lb'=>2.2046, - 'cwt(UK)' => 0.019684, - 'cwt(US)' => 0.022046, - 'ton (US)' => 0.0011023, - 'ton (UK)' => 0.0009842 - ) - ), - 'Distance' => array('base' =>'km', - 'conv'=>array( - 'm'=>1000, - 'dm'=>10000, - 'cm'=>100000, - 'mm'=>1000000, - 'mile'=>0.62137, - 'naut.mile'=>0.53996, - 'inch(es)'=>39370, - 'ft'=>3280.8, - 'yd'=>1093.6, - 'furlong'=>4.970969537898672, - 'fathom'=>546.8066491688539 - ) - ), - 'Area' => array('base' =>'km 2', - 'conv'=>array( - 'ha'=>100, - 'acre'=>247.105, - 'm 2'=>pow(1000,2), - 'dm 2'=>pow(10000,2), - 'cm 2'=>pow(100000,2), - 'mm 2'=>pow(1000000,2), - 'mile 2'=>pow(0.62137,2), - 'naut.miles 2'=>pow(0.53996,2), - 'in 2'=>pow(39370,2), - 'ft 2'=>pow(3280.8,2), - 'yd 2'=>pow(1093.6,2), - ) - ), - 'Volume' => array('base' =>'m 3', - 'conv'=>array( - 'in 3'=>61023.6, - 'ft 3'=>35.315, - 'cm 3'=>pow(10,6), - 'dm 3'=>1000, - 'litre'=>1000, - 'hl'=>10, - 'yd 3'=>1.30795, - 'gal(US)'=>264.172, - 'gal(UK)'=>219.969, - 'pint' => 2113.376, - 'quart' => 1056.688, - 'cup' => 4266.753, - 'fl oz' => 33814.02, - 'tablespoon' => 67628.04, - 'teaspoon' => 202884.1, - 'pt (UK)'=>1000/0.56826, - 'barrel petroleum'=>1000/158.99, - 'Register Tons'=>2.832, - 'Ocean Tons'=>1.1327 - ) - ), - 'Speed' =>array('base' =>'kmph', - 'conv'=>array( - 'mps'=>0.0001726031, - 'milesph'=>0.62137, - 'knots'=>0.53996, - 'mach STP'=>0.0008380431, - 'c (warp)'=>9.265669e-10 - ) - ) -); - - -while (list($key,$val) = each($conversions)) { - $conv->addConversion($val['base'], $val['conv']); - $list[$key][] = $val['base']; - while (list($ukey,$uval) = each($val['conv'])) { - $list[$key][] = $ukey; - } -} - - $o .= '<h3>Unit Conversions</h3>'; - - - if (isset($_POST['from_unit']) && isset($_POST['value'])) { - $_POST['value'] = $_POST['value'] + 0; - - - $o .= ($conv->getTable($_POST['value'], $_POST['from_unit'], $_POST['to_unit'], 5))."</p>"; - } else { - $o .= "<p>Select:</p>"; - } - - if(isset($_POST['value'])) - $value = $_POST['value']; - else - $value = ''; - - $o .= '<form action="convert" method="post" name="conversion">'; - $o .= '<input name="value" type="text" id="value" value="' . $value . '" size="10" maxlength="10" />'; - $o .= '<select name="from_unit" size="12">'; - - - - reset($list); - while(list($key,$val) = each($list)) { - $o .= "\n\t<optgroup label=\"$key\">"; - while(list($ukey,$uval) = each($val)) { - $selected = (($uval == $_POST['from_unit']) ? ' selected="selected" ' : ''); - $o .= "\n\t\t<option value=\"$uval\" $selected >$uval</option>"; - } - $o .= "\n\t</optgroup>"; - } - - $o .= '</select>'; - - $o .= '<input type="submit" name="Submit" value="Submit" /></form>'; - - return $o; -} diff --git a/addon/facebook/README b/addon/facebook/README deleted file mode 100644 index 325f18dd12..0000000000 --- a/addon/facebook/README +++ /dev/null @@ -1,39 +0,0 @@ -Installing the Friendika/Facebook connector - -1. register an API key for your site from developer.facebook.com - a. We'd be very happy if you include "Friendika" in the application name - to increase name recognition. The Friendika icons are also present - in the images directory and may be uploaded as a Facebook app icon. - Use images/friendika-16.jpg for the Icon and images/friendika-128.jpg for the Logo. - b. The url should be your site URL with a trailing slash. - You may use http://portal.friendika.com/privacy as the privacy policy - URL unless your site has different requirements, and - http://portal.friendika.com as the Terms of Service URL unless - you have different requirements. (Friendika is a software application - and does not require Terms of Service, though your installation of it might). - c. Set the following values in your .htconfig.php file - $a->config['facebook']['appid'] = 'xxxxxxxxxxx'; - $a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx'; - Replace with the settings Facebook gives you. - d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL - to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com. -2. Enable the facebook plugin by including it in .htconfig.php - e.g. - $a->config['system']['addon'] = 'plugin1,plugin2,facebook'; -3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page. - and click 'Install Facebook Connector'. -4. This will ask you to login to Facebook and grant permission to the - plugin to do its stuff. Allow it to do so. -5. You're done. To turn it off visit the Plugin Settings page again and - 'Remove Facebook posting'. - -Vidoes and embeds will not be posted if there is no other content. Links -and images will be converted to a format suitable for the Facebook API and -long posts truncated - with a link to view the full post. - -Facebook contacts will not be able to view private photos, as they are not able to -authenticate to your site to establish identity. We will address this -in a future release. - -Info: please make sure that you understand all aspects due to Friendika's -default licence which is: Creative Commons Attribution 3.0 (further info: -http://creativecommons.org/licenses/by/3.0/ ) diff --git a/addon/facebook/facebook.css b/addon/facebook/facebook.css deleted file mode 100644 index 0c164331e7..0000000000 --- a/addon/facebook/facebook.css +++ /dev/null @@ -1,13 +0,0 @@ - -#facebook-enable-wrapper { - margin-top: 20px; -} - -#facebook-disable-wrapper { - margin-top: 20px; -} - -#facebook-post-default-form input { - margin-top: 20px; - margin-right: 20px; -} \ No newline at end of file diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php deleted file mode 100644 index 7ffdaffac5..0000000000 --- a/addon/facebook/facebook.php +++ /dev/null @@ -1,1059 +0,0 @@ -<?php -/** - * Name: Facebook Connector - * Version: 1.0 - * Author: Mike Macgirvin <http://macgirvin.com/profile/mike> - */ - -/** - * Installing the Friendika/Facebook connector - * - * 1. register an API key for your site from developer.facebook.com - * a. We'd be very happy if you include "Friendika" in the application name - * to increase name recognition. The Friendika icons are also present - * in the images directory and may be uploaded as a Facebook app icon. - * Use images/friendika-16.jpg for the Icon and images/friendika-128.jpg for the Logo. - * b. The url should be your site URL with a trailing slash. - * You may use http://portal.friendika.com/privacy as the privacy policy - * URL unless your site has different requirements, and - * http://portal.friendika.com as the Terms of Service URL unless - * you have different requirements. (Friendika is a software application - * and does not require Terms of Service, though your installation of it might). - * c. Set the following values in your .htconfig.php file - * $a->config['facebook']['appid'] = 'xxxxxxxxxxx'; - * $a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx'; - * Replace with the settings Facebook gives you. - * d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set - * Site URL to yoursubdomain.yourdomain.com. Set Site Domain to your - * yourdomain.com. - * 2. Enable the facebook plugin by including it in .htconfig.php - e.g. - * $a->config['system']['addon'] = 'plugin1,plugin2,facebook'; - * 3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page. - * and click 'Install Facebook Connector'. - * 4. This will ask you to login to Facebook and grant permission to the - * plugin to do its stuff. Allow it to do so. - * 5. You're done. To turn it off visit the Plugin Settings page again and - * 'Remove Facebook posting'. - * - * Vidoes and embeds will not be posted if there is no other content. Links - * and images will be converted to a format suitable for the Facebook API and - * long posts truncated - with a link to view the full post. - * - * Facebook contacts will not be able to view private photos, as they are not able to - * authenticate to your site to establish identity. We will address this - * in a future release. - */ - -define('FACEBOOK_MAXPOSTLEN', 420); - - -function facebook_install() { - register_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook'); - register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets'); - register_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings'); - register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron'); - register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook'); -} - - -function facebook_uninstall() { - unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook'); - unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets'); - unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings'); - unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron'); - unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook'); -} - - -/* declare the facebook_module function so that /facebook url requests will land here */ - -function facebook_module() {} - - - -/* If a->argv[1] is a nickname, this is a callback from Facebook oauth requests. */ - -function facebook_init(&$a) { - - if($a->argc != 2) - return; - $nick = $a->argv[1]; - if(strlen($nick)) - $r = q("SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1", - dbesc($nick) - ); - if(! count($r)) - return; - - $uid = $r[0]['uid']; - $auth_code = (($_GET['code']) ? $_GET['code'] : ''); - $error = (($_GET['error_description']) ? $_GET['error_description'] : ''); - - - if($error) - logger('facebook_init: Error: ' . $error); - - if($auth_code && $uid) { - - $appid = get_config('facebook','appid'); - $appsecret = get_config('facebook', 'appsecret'); - - $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' - . $appid . '&client_secret=' . $appsecret . '&redirect_uri=' - . urlencode($a->get_baseurl() . '/facebook/' . $nick) - . '&code=' . $auth_code); - - logger('facebook_init: returned access token: ' . $x, LOGGER_DATA); - - if(strpos($x,'access_token=') !== false) { - $token = str_replace('access_token=', '', $x); - if(strpos($token,'&') !== false) - $token = substr($token,0,strpos($token,'&')); - set_pconfig($uid,'facebook','access_token',$token); - set_pconfig($uid,'facebook','post','1'); - if(get_pconfig($uid,'facebook','no_linking') === false) - set_pconfig($uid,'facebook','no_linking',1); - fb_get_self($uid); - fb_get_friends($uid); - fb_consume_all($uid); - - } - - } - -} - - -function fb_get_self($uid) { - $access_token = get_pconfig($uid,'facebook','access_token'); - if(! $access_token) - return; - $s = fetch_url('https://graph.facebook.com/me/?access_token=' . $access_token); - if($s) { - $j = json_decode($s); - set_pconfig($uid,'facebook','self_id',(string) $j->id); - } -} - - - -function fb_get_friends($uid) { - - $r = q("SELECT `id` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1", - intval($uid) - ); - if(! count($r)) - return; - - $access_token = get_pconfig($uid,'facebook','access_token'); - - $no_linking = get_pconfig($uid,'facebook','no_linking'); - if($no_linking) - return; - - if(! $access_token) - return; - $s = fetch_url('https://graph.facebook.com/me/friends?access_token=' . $access_token); - if($s) { - logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA); - $j = json_decode($s); - logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA); - if(! $j->data) - return; - foreach($j->data as $person) { - $s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token); - if($s) { - $jp = json_decode($s); - logger('fb_get_friends: info: ' . print_r($jp,true), LOGGER_DATA); - - // always use numeric link for consistency - - $jp->link = 'http://facebook.com/profile.php?id=' . $person->id; - - // check if we already have a contact - - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' LIMIT 1", - intval($uid), - dbesc($jp->link) - ); - - if(count($r)) { - - // check that we have all the photos, this has been known to fail on occasion - - if((! $r[0]['photo']) || (! $r[0]['thumb']) || (! $r[0]['micro'])) { - require_once("Photo.php"); - - $photos = import_profile_photo('https://graph.facebook.com/' . $jp->id . '/picture', $uid, $r[0]['id']); - - $r = q("UPDATE `contact` SET `photo` = '%s', - `thumb` = '%s', - `micro` = '%s', - `name-date` = '%s', - `uri-date` = '%s', - `avatar-date` = '%s' - WHERE `id` = %d LIMIT 1 - ", - dbesc($photos[0]), - dbesc($photos[1]), - dbesc($photos[2]), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($r[0]['id']) - ); - } - continue; - } - else { - - // create contact record - $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, - `name`, `nick`, `photo`, `network`, `rel`, `priority`, - `writable`, `blocked`, `readonly`, `pending` ) - VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", - intval($uid), - dbesc(datetime_convert()), - dbesc($jp->link), - dbesc(''), - dbesc(''), - dbesc($jp->id), - dbesc('facebook ' . $jp->id), - dbesc($jp->name), - dbesc(($jp->nickname) ? $jp->nickname : strtolower($jp->first_name)), - dbesc('https://graph.facebook.com/' . $jp->id . '/picture'), - dbesc(NETWORK_FACEBOOK), - intval(CONTACT_IS_FRIEND), - intval(1), - intval(1) - ); - } - - $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1", - dbesc($jp->link), - intval($uid) - ); - - if(! count($r)) { - continue; - } - - $contact = $r[0]; - $contact_id = $r[0]['id']; - - require_once("Photo.php"); - - $photos = import_profile_photo($r[0]['photo'],$uid,$contact_id); - - $r = q("UPDATE `contact` SET `photo` = '%s', - `thumb` = '%s', - `micro` = '%s', - `name-date` = '%s', - `uri-date` = '%s', - `avatar-date` = '%s' - WHERE `id` = %d LIMIT 1 - ", - dbesc($photos[0]), - dbesc($photos[1]), - dbesc($photos[2]), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($contact_id) - ); - - } - } - } -} - -// This is the POST method to the facebook settings page -// Content is posted to Facebook in the function facebook_post_hook() - -function facebook_post(&$a) { - - $uid = local_user(); - if($uid){ - - $value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0); - set_pconfig($uid,'facebook','post_by_default', $value); - - $no_linking = get_pconfig($uid,'facebook','no_linking'); - - $no_wall = ((x($_POST,'facebook_no_wall')) ? intval($_POST['facebook_no_wall']) : 0); - set_pconfig($uid,'facebook','no_wall',$no_wall); - - $private_wall = ((x($_POST,'facebook_private_wall')) ? intval($_POST['facebook_private_wall']) : 0); - set_pconfig($uid,'facebook','private_wall',$private_wall); - - - $linkvalue = ((x($_POST,'facebook_linking')) ? intval($_POST['facebook_linking']) : 0); - set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1)); - - // FB linkage was allowed but has just been turned off - remove all FB contacts and posts - - if((! intval($no_linking)) && (! intval($linkvalue))) { - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `network` = '%s' ", - intval($uid), - dbesc(NETWORK_FACEBOOK) - ); - if(count($r)) { - require_once('include/Contact.php'); - foreach($r as $rr) - contact_remove($rr['id']); - } - } - elseif(intval($no_linking) && intval($linkvalue)) { - // FB linkage is now allowed - import stuff. - fb_get_self($uid); - fb_get_friends($uid); - fb_consume_all($uid); - } - - info( t('Settings updated.') . EOL); - } - - return; -} - -// Facebook settings form - -function facebook_content(&$a) { - - if(! local_user()) { - notice( t('Permission denied.') . EOL); - return ''; - } - - if($a->argc > 1 && $a->argv[1] === 'remove') { - del_pconfig(local_user(),'facebook','post'); - info( t('Facebook disabled') . EOL); - } - - if($a->argc > 1 && $a->argv[1] === 'friends') { - fb_get_friends(local_user()); - info( t('Updating contacts') . EOL); - } - - - $fb_installed = get_pconfig(local_user(),'facebook','post'); - - $appid = get_config('facebook','appid'); - - if(! $appid) { - notice( t('Facebook API key is missing.') . EOL); - return ''; - } - - $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' - . $a->get_baseurl() . '/addon/facebook/facebook.css' . '" media="all" />' . "\r\n"; - - $o .= '<h3>' . t('Facebook Connect') . '</h3>'; - - if(! $fb_installed) { - $o .= '<div id="facebook-enable-wrapper">'; - - $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri=' - . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Install Facebook connector for this account.') . '</a>'; - $o .= '</div>'; - } - - if($fb_installed) { - $o .= '<div id="facebook-disable-wrapper">'; - - $o .= '<a href="' . $a->get_baseurl() . '/facebook/remove' . '">' . t('Remove Facebook connector') . '</a></div>'; - - $o .= '<div id="facebook-enable-wrapper">'; - - $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri=' - . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>'; - $o .= '</div>'; - - $o .= '<div id="facebook-post-default-form">'; - $o .= '<form action="facebook" method="post" >'; - $post_by_default = get_pconfig(local_user(),'facebook','post_by_default'); - $checked = (($post_by_default) ? ' checked="checked" ' : ''); - $o .= '<input type="checkbox" name="post_by_default" value="1"' . $checked . '/>' . ' ' . t('Post to Facebook by default') . EOL; - - $no_linking = get_pconfig(local_user(),'facebook','no_linking'); - $checked = (($no_linking) ? '' : ' checked="checked" '); - $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations on this website') . EOL ; - - $o .= '<p>' . t('Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>.'); - $o .= ' ' . t('On this website, your Facebook friend stream is only visible to you.'); - $o .= ' ' . t('The following settings determine the privacy of your Facebook profile wall on this website.') . '</p>'; - - $private_wall = get_pconfig(local_user(),'facebook','private_wall'); - $checked = (($private_wall) ? ' checked="checked" ' : ''); - $o .= '<input type="checkbox" name="facebook_private_wall" value="1"' . $checked . '/>' . ' ' . t('On this website your Facebook profile wall conversations will only be visible to you') . EOL ; - - - $no_wall = get_pconfig(local_user(),'facebook','no_wall'); - $checked = (($no_wall) ? ' checked="checked" ' : ''); - $o .= '<input type="checkbox" name="facebook_no_wall" value="1"' . $checked . '/>' . ' ' . t('Do not import your Facebook profile wall conversations') . EOL ; - - $o .= '<p>' . t('If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations.') . '</p>'; - - $o .= '<input type="submit" name="submit" value="' . t('Submit') . '" /></form></div>'; - } - - return $o; -} - - - -function facebook_cron($a,$b) { - - $last = get_config('facebook','last_poll'); - - $poll_interval = intval(get_config('facebook','poll_interval')); - if(! $poll_interval) - $poll_interval = 3600; - - if($last) { - $next = $last + $poll_interval; - if($next > time()) - return; - } - - logger('facebook_cron'); - - - // Find the FB users on this site and randomize in case one of them - // uses an obscene amount of memory. It may kill this queue run - // but hopefully we'll get a few others through on each run. - - $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ORDER BY RAND() "); - if(count($r)) { - foreach($r as $rr) { - if(get_pconfig($rr['uid'],'facebook','no_linking')) - continue; - // check for new friends once a day - $last_friend_check = get_pconfig($rr['uid'],'facebook','friend_check'); - if($last_friend_check) - $next_friend_check = $last_friend_check + 86400; - if($next_friend_check <= time()) { - fb_get_friends($rr['uid']); - set_pconfig($rr['uid'],'facebook','friend_check',time()); - } - fb_consume_all($rr['uid']); - } - } - - set_config('facebook','last_poll', time()); - -} - - - -function facebook_plugin_settings(&$a,&$b) { - - $b .= '<div class="settings-block">'; - $b .= '<h3>' . t('Facebook') . '</h3>'; - $b .= '<a href="facebook">' . t('Facebook Connector Settings') . '</a><br />'; - $b .= '</div>'; - -} - -function facebook_jot_nets(&$a,&$b) { - if(! local_user()) - return; - - $fb_post = get_pconfig(local_user(),'facebook','post'); - if(intval($fb_post) == 1) { - $fb_defpost = get_pconfig(local_user(),'facebook','post_by_default'); - $selected = ((intval($fb_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '<div class="profile-jot-net"><input type="checkbox" name="facebook_enable"' . $selected . ' value="1" /> ' - . t('Post to Facebook') . '</div>'; - } -} - - -function facebook_post_hook(&$a,&$b) { - - /** - * Post to Facebook stream - */ - - require_once('include/group.php'); - - logger('Facebook post'); - - $reply = false; - $likes = false; - - if((local_user()) && (local_user() == $b['uid'])) { - - // Facebook is not considered a private network - if($b['prvnets'] && $b['private']) - return; - - $linking = ((get_pconfig(local_user(),'facebook','no_linking')) ? 0 : 1); - - if(($b['parent']) && ($linking)) { - $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($b['parent']), - intval(local_user()) - ); - if(count($r) && substr($r[0]['uri'],0,4) === 'fb::') - $reply = substr($r[0]['uri'],4); - elseif(count($r) && substr($r[0]['extid'],0,4) === 'fb::') - $reply = substr($r[0]['extid'],4); - else - return; - logger('facebook reply id=' . $reply); - } - - if($b['private'] && $reply === false) { - $allow_people = expand_acl($b['allow_cid']); - $allow_groups = expand_groups(expand_acl($b['allow_gid'])); - $deny_people = expand_acl($b['deny_cid']); - $deny_groups = expand_groups(expand_acl($b['deny_gid'])); - - $recipients = array_unique(array_merge($allow_people,$allow_groups)); - $deny = array_unique(array_merge($deny_people,$deny_groups)); - - $allow_str = dbesc(implode(', ',$recipients)); - if($allow_str) { - $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $allow_str ) AND `network` = 'face'"); - $allow_arr = array(); - if(count($r)) - foreach($r as $rr) - $allow_arr[] = $rr['notify']; - } - - $deny_str = dbesc(implode(', ',$deny)); - if($deny_str) { - $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $deny_str ) AND `network` = 'face'"); - $deny_arr = array(); - if(count($r)) - foreach($r as $rr) - $deny_arr[] = $rr['notify']; - } - - if(count($deny_arr) && (! count($allow_arr))) { - - // One or more FB folks were denied access but nobody on FB was specifically allowed access. - // This might cause the post to be open to public on Facebook, but only to selected members - // on another network. Since this could potentially leak a post to somebody who was denied, - // we will skip posting it to Facebook with a slightly vague but relevant message that will - // hopefully lead somebody to this code comment for a better explanation of what went wrong. - - notice( t('Post to Facebook cancelled because of multi-network access permission conflict.') . EOL); - return; - } - - - // if it's a private message but no Facebook members are allowed or denied, skip Facebook post - - if((! count($allow_arr)) && (! count($deny_arr))) - return; - } - - if($b['verb'] == ACTIVITY_LIKE) - $likes = true; - - - $appid = get_config('facebook', 'appid' ); - $secret = get_config('facebook', 'appsecret' ); - - if($appid && $secret) { - - logger('facebook: have appid+secret'); - - $fb_post = intval(get_pconfig(local_user(),'facebook','post')); - $fb_enable = (($fb_post && x($_POST,'facebook_enable')) ? intval($_POST['facebook_enable']) : 0); - $fb_token = get_pconfig(local_user(),'facebook','access_token'); - - // if API is used, default to the chosen settings - if($_POST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default'))) - $fb_enable = 1; - - - - - logger('facebook: $fb_post: ' . $fb_post . ' $fb_enable: ' . $fb_enable . ' $fb_token: ' . $fb_token,LOGGER_DEBUG); - - // post to facebook if it's a public post and we've ticked the 'post to Facebook' box, - // or it's a private message with facebook participants - // or it's a reply or likes action to an existing facebook post - - if($fb_post && $fb_token && ($fb_enable || $b['private'] || $reply)) { - logger('facebook: able to post'); - require_once('library/facebook.php'); - require_once('include/bbcode.php'); - - $msg = $b['body']; - - logger('Facebook post: original msg=' . $msg, LOGGER_DATA); - - // make links readable before we strip the code - - // unless it's a dislike - just send the text as a comment - - if($b['verb'] == ACTIVITY_DISLIKE) - $msg = trim(strip_tags(bbcode($msg))); - - $search_str = $a->get_baseurl() . '/search'; - - if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) { - - // don't use hashtags for message link - - if(strpos($matches[2],$search_str) === false) { - $link = $matches[1]; - if(substr($matches[2],0,5) != '[img]') - $linkname = $matches[2]; - } - } - - $msg = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is",'$2 $1',$msg); - - if(preg_match("/\[img\](.*?)\[\/img\]/is",$msg,$matches)) - $image = $matches[1]; - - $msg = preg_replace("/\[img\](.*?)\[\/img\]/is", t('Image: ') . '$1', $msg); - - if((strpos($link,z_root()) !== false) && (! $image)) - $image = $a->get_baseurl() . '/images/friendika-64.jpg'; - - $msg = trim(strip_tags(bbcode($msg))); - $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8'); - - // add any attachments as text urls - - $arr = explode(',',$b['attach']); - - if(count($arr)) { - $msg .= "\n"; - foreach($arr as $r) { - $matches = false; - $cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches); - if($cnt) { - $msg .= $matches[1]; - } - } - } - - if (strlen($msg) > FACEBOOK_MAXPOSTLEN) { - $shortlink = ""; - require_once('library/slinky.php'); - - $display_url = $a->get_baseurl() . '/display/' . $a->user['nickname'] . '/' . $b['id']; - $slinky = new Slinky( $display_url ); - // setup a cascade of shortening services - // try to get a short link from these services - // in the order ur1.ca, trim, id.gd, tinyurl - $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - $shortlink = $slinky->short(); - // the new message will be shortened such that "... $shortlink" - // will fit into the character limit - $msg = substr($msg, 0, FACEBOOK_MAXPOSTLEN - strlen($shortlink) - 4); - $msg .= '... ' . $shortlink; - } - if(! strlen($msg)) - return; - - logger('Facebook post: msg=' . $msg, LOGGER_DATA); - - if($likes) { - $postvars = array('access_token' => $fb_token); - } - else { - $postvars = array( - 'access_token' => $fb_token, - 'message' => $msg - ); - if(isset($image)) - $postvars['picture'] = $image; - if(isset($link)) - $postvars['link'] = $link; - if(isset($linkname)) - $postvars['name'] = $linkname; - } - - if(($b['private']) && (! $b['parent'])) { - $postvars['privacy'] = '{"value": "CUSTOM", "friends": "SOME_FRIENDS"'; - if(count($allow_arr)) - $postvars['privacy'] .= ',"allow": "' . implode(',',$allow_arr) . '"'; - if(count($deny_arr)) - $postvars['privacy'] .= ',"deny": "' . implode(',',$deny_arr) . '"'; - $postvars['privacy'] .= '}'; - - } - - if($reply) { - $url = 'https://graph.facebook.com/' . $reply . '/' . (($likes) ? 'likes' : 'comments'); - } - else { - $url = 'https://graph.facebook.com/me/feed'; - if($b['plink']) - $postvars['actions'] = '{"name": "' . t('View on Friendika') . '", "link": "' . $b['plink'] . '"}'; - } - - logger('facebook: post to ' . $url); - logger('facebook: postvars: ' . print_r($postvars,true)); - - // "test_mode" prevents anything from actually being posted. - // Otherwise, let's do it. - - if(! get_config('facebook','test_mode')) { - $x = post_url($url, $postvars); - - $retj = json_decode($x); - if($retj->id) { - q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1", - dbesc('fb::' . $retj->id), - intval($b['id']) - ); - } - else { - if(! $likes) { - $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $postvars)); - q("INSERT INTO `queue` ( `network`, `cid`, `created`, `last`, `content`) - VALUES ( '%s', %d, '%s', '%s', '%s') ", - dbesc(NETWORK_FACEBOOK), - intval($a->contact), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($s) - ); - - notice( t('Facebook post failed. Queued for retry.') . EOL); - } - } - - logger('Facebook post returns: ' . $x, LOGGER_DEBUG); - } - } - } - } -} - - -function fb_queue_hook(&$a,&$b) { - - $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'", - dbesc(NETWORK_FACEBOOK) - ); - if(! count($qi)) - return; - - require_once('include/queue_fn.php'); - - foreach($qi as $x) { - if($x['network'] !== NETWORK_FACEBOOK) - continue; - - logger('facebook_queue: run'); - - $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid` - WHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1", - intval($x['cid']) - ); - if(! count($r)) - continue; - - $user = $r[0]; - - $appid = get_config('facebook', 'appid' ); - $secret = get_config('facebook', 'appsecret' ); - - if($appid && $secret) { - $fb_post = intval(get_pconfig($user['uid'],'facebook','post')); - $fb_token = get_pconfig($user['uid'],'facebook','access_token'); - - if($fb_post && $fb_token) { - logger('facebook_queue: able to post'); - require_once('library/facebook.php'); - - $z = unserialize($x['content']); - $item = $z['item']; - $j = post_url($z['url'],$z['post']); - - $retj = json_decode($j); - if($retj->id) { - q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1", - dbesc('fb::' . $retj->id), - intval($item) - ); - logger('facebook_queue: success: ' . $j); - remove_queue_item($x['id']); - } - else { - logger('facebook_queue: failed: ' . $j); - update_queue_time($x['id']); - } - } - } - } -} - -function fb_consume_all($uid) { - - require_once('include/items.php'); - - $access_token = get_pconfig($uid,'facebook','access_token'); - if(! $access_token) - return; - - if(! get_pconfig($uid,'facebook','no_wall')) { - $private_wall = intval(get_pconfig($uid,'facebook','private_wall')); - $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token); - if($s) { - $j = json_decode($s); - logger('fb_consume_stream: wall: ' . print_r($j,true), LOGGER_DATA); - fb_consume_stream($uid,$j,($private_wall) ? false : true); - } - } - $s = fetch_url('https://graph.facebook.com/me/home?access_token=' . $access_token); - if($s) { - $j = json_decode($s); - logger('fb_consume_stream: feed: ' . print_r($j,true), LOGGER_DATA); - fb_consume_stream($uid,$j,false); - } - -} - -function fb_consume_stream($uid,$j,$wall = false) { - - $a = get_app(); - - - $user = q("SELECT `nickname`, `blockwall` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1", - intval($uid) - ); - if(! count($user)) - return; - - $my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname']; - - $no_linking = get_pconfig($uid,'facebook','no_linking'); - if($no_linking) - return; - - $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1", - intval($uid) - ); - - - $self_id = get_pconfig($uid,'facebook','self_id'); - if(! count($j->data) || (! strlen($self_id))) - return; - - foreach($j->data as $entry) { - logger('fb_consume: entry: ' . print_r($entry,true), LOGGER_DATA); - $datarray = array(); - - $r = q("SELECT * FROM `item` WHERE ( `uri` = '%s' OR `extid` = '%s') AND `uid` = %d LIMIT 1", - dbesc('fb::' . $entry->id), - dbesc('fb::' . $entry->id), - intval($uid) - ); - if(count($r)) { - $post_exists = true; - $orig_post = $r[0]; - $top_item = $r[0]['id']; - } - else { - $post_exists = false; - $orig_post = null; - } - - if(! $orig_post) { - $datarray['gravity'] = 0; - $datarray['uid'] = $uid; - $datarray['wall'] = (($wall) ? 1 : 0); - $datarray['uri'] = $datarray['parent-uri'] = 'fb::' . $entry->id; - $from = $entry->from; - if($from->id == $self_id) - $datarray['contact-id'] = $self[0]['id']; - else { - $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1", - dbesc($from->id), - intval($uid) - ); - if(count($r)) - $datarray['contact-id'] = $r[0]['id']; - } - - // don't store post if we don't have a contact - - if(! x($datarray,'contact-id')) { - logger('no contact: post ignored'); - continue; - } - - $datarray['verb'] = ACTIVITY_POST; - if($wall) { - $datarray['owner-name'] = $self[0]['name']; - $datarray['owner-link'] = $self[0]['url']; - $datarray['owner-avatar'] = $self[0]['thumb']; - } - if(isset($entry->application) && isset($entry->application->name) && strlen($entry->application->name)) - $datarray['app'] = strip_tags($entry->application->name); - else - $datarray['app'] = 'facebook'; - $datarray['author-name'] = $from->name; - $datarray['author-link'] = 'http://facebook.com/profile.php?id=' . $from->id; - $datarray['author-avatar'] = 'https://graph.facebook.com/' . $from->id . '/picture'; - $datarray['plink'] = $datarray['author-link'] . '&v=wall&story_fbid=' . substr($entry->id,strpos($entry->id,'_') + 1); - - $datarray['body'] = $entry->message; - if($entry->picture) - $datarray['body'] .= "\n\n" . '[img]' . $entry->picture . '[/img]'; - if($entry->link) - $datarray['body'] .= "\n" . linkify($entry->link); - if($entry->name) - $datarray['body'] .= "\n" . $entry->name; - if($entry->caption) - $datarray['body'] .= "\n" . $entry->caption; - if($entry->description) - $datarray['body'] .= "\n" . $entry->description; - $datarray['created'] = datetime_convert('UTC','UTC',$entry->created_time); - $datarray['edited'] = datetime_convert('UTC','UTC',$entry->updated_time); - - // If the entry has a privacy policy, we cannot assume who can or cannot see it, - // as the identities are from a foreign system. Mark it as private to the owner. - - if($entry->privacy && $entry->privacy->value !== 'EVERYONE') { - $datarray['private'] = 1; - $datarray['allow_cid'] = '<' . $uid . '>'; - } - - $top_item = item_store($datarray); - $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($top_item), - intval($uid) - ); - if(count($r)) { - $orig_post = $r[0]; - logger('fb: new top level item posted'); - } - } - - if(isset($entry->likes) && isset($entry->likes->data)) - $likers = $entry->likes->data; - else - $likers = null; - - if(isset($entry->comments) && isset($entry->comments->data)) - $comments = $entry->comments->data; - else - $comments = null; - - if(is_array($likers)) { - foreach($likers as $likes) { - - if(! $orig_post) - continue; - - // If we posted the like locally, it will be found with our url, not the FB url. - - $second_url = (($likes->id == $self_id) ? $self[0]['url'] : 'http://facebook.com/profile.php?id=' . $likes->id); - - $r = q("SELECT * FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s' - AND ( `author-link` = '%s' OR `author-link` = '%s' ) LIMIT 1", - dbesc($orig_post['uri']), - intval($uid), - dbesc(ACTIVITY_LIKE), - dbesc('http://facebook.com/profile.php?id=' . $likes->id), - dbesc($second_url) - ); - - if(count($r)) - continue; - - $likedata = array(); - $likedata['parent'] = $top_item; - $likedata['verb'] = ACTIVITY_LIKE; - $likedata['gravity'] = 3; - $likedata['uid'] = $uid; - $likedata['wall'] = (($wall) ? 1 : 0); - $likedata['uri'] = item_new_uri($a->get_baseurl(), $uid); - $likedata['parent-uri'] = $orig_post['uri']; - if($likes->id == $self_id) - $likedata['contact-id'] = $self[0]['id']; - else { - $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1", - dbesc($likes->id), - intval($uid) - ); - if(count($r)) - $likedata['contact-id'] = $r[0]['id']; - } - if(! x($likedata,'contact-id')) - $likedata['contact-id'] = $orig_post['contact-id']; - - $likedata['app'] = 'facebook'; - $likedata['verb'] = ACTIVITY_LIKE; - $likedata['author-name'] = $likes->name; - $likedata['author-link'] = 'http://facebook.com/profile.php?id=' . $likes->id; - $likedata['author-avatar'] = 'https://graph.facebook.com/' . $likes->id . '/picture'; - - $author = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]'; - $objauthor = '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]'; - $post_type = t('status'); - $plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]'; - $likedata['object-type'] = ACTIVITY_OBJ_NOTE; - - $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink); - $likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' . - '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '' . $orig_post['body'] . ''; - - $item = item_store($likedata); - } - } - if(is_array($comments)) { - foreach($comments as $cmnt) { - - if(! $orig_post) - continue; - - $r = q("SELECT * FROM `item` WHERE `uid` = %d AND ( `uri` = '%s' OR `extid` = '%s' ) LIMIT 1", - intval($uid), - dbesc('fb::' . $cmnt->id), - dbesc('fb::' . $cmnt->id) - ); - if(count($r)) - continue; - - $cmntdata = array(); - $cmntdata['parent'] = $top_item; - $cmntdata['verb'] = ACTIVITY_POST; - $cmntdata['gravity'] = 6; - $cmntdata['uid'] = $uid; - $cmntdata['wall'] = (($wall) ? 1 : 0); - $cmntdata['uri'] = 'fb::' . $cmnt->id; - $cmntdata['parent-uri'] = $orig_post['uri']; - if($cmnt->from->id == $self_id) { - $cmntdata['contact-id'] = $self[0]['id']; - } - else { - $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d LIMIT 1", - dbesc($cmnt->from->id), - intval($uid) - ); - if(count($r)) { - $cmntdata['contact-id'] = $r[0]['id']; - if($r[0]['blocked'] || $r[0]['readonly']) - continue; - } - } - if(! x($cmntdata,'contact-id')) - $cmntdata['contact-id'] = $orig_post['contact-id']; - - $cmntdata['app'] = 'facebook'; - $cmntdata['created'] = datetime_convert('UTC','UTC',$cmnt->created_time); - $cmntdata['edited'] = datetime_convert('UTC','UTC',$cmnt->created_time); - $cmntdata['verb'] = ACTIVITY_POST; - $cmntdata['author-name'] = $cmnt->from->name; - $cmntdata['author-link'] = 'http://facebook.com/profile.php?id=' . $cmnt->from->id; - $cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture'; - $cmntdata['body'] = $cmnt->message; - $item = item_store($cmntdata); - } - } - } -} - diff --git a/addon/fortunate/fortunate.css b/addon/fortunate/fortunate.css deleted file mode 100644 index 61813b7d7e..0000000000 --- a/addon/fortunate/fortunate.css +++ /dev/null @@ -1,7 +0,0 @@ -.fortunate { - margin-top: 25px; - margin-left: 100px; - margin-bottom: 25px; - color: #000088; - font-size: 14px; -} \ No newline at end of file diff --git a/addon/fortunate/fortunate.php b/addon/fortunate/fortunate.php deleted file mode 100644 index 5a6302e58d..0000000000 --- a/addon/fortunate/fortunate.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - - -function fortunate_install() { - register_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch'); -} - -function fortunate_uninstall() { - unregister_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch'); -} - - -function fortunate_fetch($a,&$b) { - - $a->page['htmlhead'] .= '' . "\r\n"; - - $s = fetch_url('http://fortunemod.com/cookie.php?numlines=2&equal=1&rand=' . mt_rand()); - $b .= '
    ' . $s . '
    '; -} - diff --git a/addon/impressum/README b/addon/impressum/README deleted file mode 100644 index 8e4255bd11..0000000000 --- a/addon/impressum/README +++ /dev/null @@ -1,27 +0,0 @@ -Impressum Plugin for Friendika - -Author: Tobias Diekershoff - tobias.diekershoff@gmx.net - -License: 3-clause BSD license (same as Friendika) - -About - This plugin adds an Impressum block to the /friendika page with informations - about the page operator/owner and how to contact you in case of any questions. - - In the notes and postal fields you can use HTML tags for formatting. - -Configuration: - For configuration you can set the following variables in the .htconfig file - * $a->config['impressum']['owner'] this is the Name of the Operator - * $a->config['impressum']['ownerprofile'] this is an optional Friendika account - where the above owner name will link to - * $a->config['impressum']['email'] a contact email address (optional) - will be displayed slightly obfuscated - as name(at)example(dot)com - * $a->config['impressum']['postal'] should contain a postal address where - you can be reached at (optional) - * $a->config['impressum']['notes'] additional informations that should - be displayed in the Impressum block - - diff --git a/addon/impressum/admin.tpl b/addon/impressum/admin.tpl deleted file mode 100644 index cfba8df76d..0000000000 --- a/addon/impressum/admin.tpl +++ /dev/null @@ -1,6 +0,0 @@ -{{ inc field_input.tpl with $field=$owner }}{{ endinc }} -{{ inc field_input.tpl with $field=$ownerprofile }}{{ endinc }} -{{ inc field_input.tpl with $field=$postal }}{{ endinc }} -{{ inc field_input.tpl with $field=$notes }}{{ endinc }} -{{ inc field_input.tpl with $field=$email }}{{ endinc }} -
    diff --git a/addon/impressum/impressum.php b/addon/impressum/impressum.php deleted file mode 100644 index b760c7e0d9..0000000000 --- a/addon/impressum/impressum.php +++ /dev/null @@ -1,76 +0,0 @@ - - * License: 3-clause BSD license - */ - -function impressum_install() { - register_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show'); - logger("installed impressum plugin"); -} - -function impressum_uninstall() { - unregister_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show'); - logger("uninstalled impressum plugin"); -} -function obfuscate_email ($s) { - $s = str_replace('@','(at)',$s); - $s = str_replace('.','(dot)',$s); - return $s; -} -function impressum_show($a,&$b) { - $b .= '

    '.t('Impressum').'

    '; - $owner = get_config('impressum', 'owner'); - $owner_profile = get_config('impressum','ownerprofile'); - $postal = get_config('impressum', 'postal'); - $notes = get_config('impressum', 'notes'); - $email = obfuscate_email( get_config('impressum','email') ); - if (strlen($owner)) { - if (strlen($owner_profile)) { - $tmp = ''.$owner.''; - } else { - $tmp = $owner; - } - if (strlen($email)) { - $b .= '

    '.t('Site Owner').': '. $tmp .'
    '.t('Email Address').': '.$email.'

    '; - } else { - $b .= '

    '.t('Site Owner').': '. $tmp .'

    '; - } - if (strlen($postal)) { - $b .= '

    '.t('Postal Address').'
    '. $postal .'

    '; - } - if (strlen($notes)) { - $b .= '

    '.$notes.'

    '; - } - } else { - $b .= '

    '.t('The impressum addon needs to be configured!
    Please add at least the owner variable to your config file. For other variables please refer to the README file of the addon.').'

    '; - } -} - -function impressum_plugin_admin_post (&$a) { - $owner = ((x($_POST, 'owner')) ? notags(trim($_POST['owner'])) : ''); - $ownerprofile = ((x($_POST, 'ownerprofile')) ? notags(trim($_POST['ownerprofile'])) : ''); - $postal = ((x($_POST, 'postal')) ? (trim($_POST['postal'])) : ''); - $notes = ((x($_POST, 'notes')) ? (trim($_POST['notes'])) : ''); - $email = ((x($_POST, 'email')) ? notags(trim($_POST['email'])) : ''); - set_config('impressum','owner',$owner); - set_config('impressum','ownerprofile',$ownerprofile); - set_config('impressum','postal',$postal); - set_config('impressum','email',$email); - set_config('impressum','notes',$notes); - info( t('Settings updated.'). EOL ); -} -function impressum_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__). "/admin.tpl" ); - $o = replace_macros($t, array( - '$submit' => t('Submit'), - '$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), ''), - '$ownerprofile' => array('ownerprofile', t('Site Owners Profile'), get_config('impressum','ownerprofile'), ''), - '$postal' => array('postal', t('Postal Address'), get_config('impressum','postal'), ''), - '$notes' => array('notes', t('Notes'), get_config('impressum','notes'), ''), - '$email' => array('email', t('Email Address'), get_config('impressum','email'), ''), - )); -} diff --git a/addon/js_upload/file-uploader/client/demo.htm b/addon/js_upload/file-uploader/client/demo.htm deleted file mode 100644 index 2a0cd6d305..0000000000 --- a/addon/js_upload/file-uploader/client/demo.htm +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - -

    Back to project page

    - -

    To upload a file, click on the button below. Drag-and-drop is supported in FF, Chrome.

    -

    Progress-bar is supported in FF3.6+, Chrome6+, Safari4+

    - -
    - -
    - - - - - \ No newline at end of file diff --git a/addon/js_upload/file-uploader/client/do-nothing.htm b/addon/js_upload/file-uploader/client/do-nothing.htm deleted file mode 100644 index 0da19059da..0000000000 --- a/addon/js_upload/file-uploader/client/do-nothing.htm +++ /dev/null @@ -1 +0,0 @@ -{success:true} diff --git a/addon/js_upload/file-uploader/client/fileuploader.css b/addon/js_upload/file-uploader/client/fileuploader.css deleted file mode 100644 index 0e3f111a91..0000000000 --- a/addon/js_upload/file-uploader/client/fileuploader.css +++ /dev/null @@ -1,31 +0,0 @@ -.qq-uploader { position:relative; width: 100%;} - -.qq-upload-button { - display:block; /* or inline-block */ - width: 105px; padding: 7px 0; text-align:center; - background:#880000; border-bottom:1px solid #ddd;color:#fff; -} -.qq-upload-button-hover {background:#cc0000;} -.qq-upload-button-focus {outline:1px dotted black;} - -.qq-upload-drop-area { - position:absolute; top:0; left:0; width:100%; height:100%; min-height: 70px; z-index:2; - background:#FF9797; text-align:center; -} -.qq-upload-drop-area span { - display:block; position:absolute; top: 50%; width:100%; margin-top:-8px; font-size:16px; -} -.qq-upload-drop-area-active {background:#FF7171;} - -.qq-upload-list {margin:15px 35px; padding:0; list-style:disc;} -.qq-upload-list li { margin:0; padding:0; line-height:15px; font-size:12px;} -.qq-upload-file, .qq-upload-spinner, .qq-upload-size, .qq-upload-cancel, .qq-upload-failed-text { - margin-right: 7px; -} - -.qq-upload-file {} -.qq-upload-spinner {display:inline-block; background: url("loading.gif"); width:15px; height:15px; vertical-align:text-bottom;} -.qq-upload-size,.qq-upload-cancel {font-size:11px;} - -.qq-upload-failed-text {display:none;} -.qq-upload-fail .qq-upload-failed-text {display:inline;} \ No newline at end of file diff --git a/addon/js_upload/file-uploader/client/fileuploader.js b/addon/js_upload/file-uploader/client/fileuploader.js deleted file mode 100644 index 89c09ebf50..0000000000 --- a/addon/js_upload/file-uploader/client/fileuploader.js +++ /dev/null @@ -1,1247 +0,0 @@ -/** - * http://github.com/valums/file-uploader - * - * Multiple file upload component with progress-bar, drag-and-drop. - * © 2010 Andrew Valums ( andrew(at)valums.com ) - * - * Licensed under GNU GPL 2 or later, see license.txt. - */ - -// -// Helper functions -// - -var qq = qq || {}; - -/** - * Adds all missing properties from second obj to first obj - */ -qq.extend = function(first, second){ - for (var prop in second){ - first[prop] = second[prop]; - } -}; - -/** - * Searches for a given element in the array, returns -1 if it is not present. - * @param {Number} [from] The index at which to begin the search - */ -qq.indexOf = function(arr, elt, from){ - if (arr.indexOf) return arr.indexOf(elt, from); - - from = from || 0; - var len = arr.length; - - if (from < 0) from += len; - - for (; from < len; from++){ - if (from in arr && arr[from] === elt){ - return from; - } - } - return -1; -}; - -qq.getUniqueId = (function(){ - var id = 0; - return function(){ return id++; }; -})(); - -// -// Events - -qq.attach = function(element, type, fn){ - if (element.addEventListener){ - element.addEventListener(type, fn, false); - } else if (element.attachEvent){ - element.attachEvent('on' + type, fn); - } -}; -qq.detach = function(element, type, fn){ - if (element.removeEventListener){ - element.removeEventListener(type, fn, false); - } else if (element.attachEvent){ - element.detachEvent('on' + type, fn); - } -}; - -qq.preventDefault = function(e){ - if (e.preventDefault){ - e.preventDefault(); - } else{ - e.returnValue = false; - } -}; - -// -// Node manipulations - -/** - * Insert node a before node b. - */ -qq.insertBefore = function(a, b){ - b.parentNode.insertBefore(a, b); -}; -qq.remove = function(element){ - element.parentNode.removeChild(element); -}; - -qq.contains = function(parent, descendant){ - // compareposition returns false in this case - if (parent == descendant) return true; - - if (parent.contains){ - return parent.contains(descendant); - } else { - return !!(descendant.compareDocumentPosition(parent) & 8); - } -}; - -/** - * Creates and returns element from html string - * Uses innerHTML to create an element - */ -qq.toElement = (function(){ - var div = document.createElement('div'); - return function(html){ - div.innerHTML = html; - var element = div.firstChild; - div.removeChild(element); - return element; - }; -})(); - -// -// Node properties and attributes - -/** - * Sets styles for an element. - * Fixes opacity in IE6-8. - */ -qq.css = function(element, styles){ - if (styles.opacity != null){ - if (typeof element.style.opacity != 'string' && typeof(element.filters) != 'undefined'){ - styles.filter = 'alpha(opacity=' + Math.round(100 * styles.opacity) + ')'; - } - } - qq.extend(element.style, styles); -}; -qq.hasClass = function(element, name){ - var re = new RegExp('(^| )' + name + '( |$)'); - return re.test(element.className); -}; -qq.addClass = function(element, name){ - if (!qq.hasClass(element, name)){ - element.className += ' ' + name; - } -}; -qq.removeClass = function(element, name){ - var re = new RegExp('(^| )' + name + '( |$)'); - element.className = element.className.replace(re, ' ').replace(/^\s+|\s+$/g, ""); -}; -qq.setText = function(element, text){ - element.innerText = text; - element.textContent = text; -}; - -// -// Selecting elements - -qq.children = function(element){ - var children = [], - child = element.firstChild; - - while (child){ - if (child.nodeType == 1){ - children.push(child); - } - child = child.nextSibling; - } - - return children; -}; - -qq.getByClass = function(element, className){ - if (element.querySelectorAll){ - return element.querySelectorAll('.' + className); - } - - var result = []; - var candidates = element.getElementsByTagName("*"); - var len = candidates.length; - - for (var i = 0; i < len; i++){ - if (qq.hasClass(candidates[i], className)){ - result.push(candidates[i]); - } - } - return result; -}; - -/** - * obj2url() takes a json-object as argument and generates - * a querystring. pretty much like jQuery.param() - * - * how to use: - * - * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');` - * - * will result in: - * - * `http://any.url/upload?otherParam=value&a=b&c=d` - * - * @param Object JSON-Object - * @param String current querystring-part - * @return String encoded querystring - */ -qq.obj2url = function(obj, temp, prefixDone){ - var uristrings = [], - prefix = '&', - add = function(nextObj, i){ - var nextTemp = temp - ? (/\[\]$/.test(temp)) // prevent double-encoding - ? temp - : temp+'['+i+']' - : i; - if ((nextTemp != 'undefined') && (i != 'undefined')) { - uristrings.push( - (typeof nextObj === 'object') - ? qq.obj2url(nextObj, nextTemp, true) - : (Object.prototype.toString.call(nextObj) === '[object Function]') - ? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj()) - : encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj) - ); - } - }; - - if (!prefixDone && temp) { - prefix = (/\?/.test(temp)) ? (/\?$/.test(temp)) ? '' : '&' : '?'; - uristrings.push(temp); - uristrings.push(qq.obj2url(obj)); - } else if ((Object.prototype.toString.call(obj) === '[object Array]') && (typeof obj != 'undefined') ) { - // we wont use a for-in-loop on an array (performance) - for (var i = 0, len = obj.length; i < len; ++i){ - add(obj[i], i); - } - } else if ((typeof obj != 'undefined') && (obj !== null) && (typeof obj === "object")){ - // for anything else but a scalar, we will use for-in-loop - for (var i in obj){ - add(obj[i], i); - } - } else { - uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj)); - } - - return uristrings.join(prefix) - .replace(/^&/, '') - .replace(/%20/g, '+'); -}; - -// -// -// Uploader Classes -// -// - -var qq = qq || {}; - -/** - * Creates upload button, validates upload, but doesn't create file list or dd. - */ -qq.FileUploaderBasic = function(o){ - this._options = { - // set to true to see the server response - debug: false, - action: '/server/upload', - params: {}, - button: null, - multiple: true, - maxConnections: 3, - // validation - allowedExtensions: [], - sizeLimit: 0, - minSizeLimit: 0, - // events - // return false to cancel submit - onSubmit: function(id, fileName){}, - onProgress: function(id, fileName, loaded, total){}, - onComplete: function(id, fileName, responseJSON){}, - onCancel: function(id, fileName){}, - // messages - messages: { - typeError: "{file} has invalid extension. Only {extensions} are allowed.", - sizeError: "{file} is too large, maximum file size is {sizeLimit}.", - minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.", - emptyError: "{file} is empty, please select files again without it.", - onLeave: "The files are being uploaded, if you leave now the upload will be cancelled." - }, - showMessage: function(message){ - alert(message); - } - }; - qq.extend(this._options, o); - - // number of files being uploaded - this._filesInProgress = 0; - this._handler = this._createUploadHandler(); - - if (this._options.button){ - this._button = this._createUploadButton(this._options.button); - } - - this._preventLeaveInProgress(); -}; - -qq.FileUploaderBasic.prototype = { - setParams: function(params){ - this._options.params = params; - }, - getInProgress: function(){ - return this._filesInProgress; - }, - _createUploadButton: function(element){ - var self = this; - - return new qq.UploadButton({ - element: element, - multiple: this._options.multiple && qq.UploadHandlerXhr.isSupported(), - onChange: function(input){ - self._onInputChange(input); - } - }); - }, - _createUploadHandler: function(){ - var self = this, - handlerClass; - - if(qq.UploadHandlerXhr.isSupported()){ - handlerClass = 'UploadHandlerXhr'; - } else { - handlerClass = 'UploadHandlerForm'; - } - - var handler = new qq[handlerClass]({ - debug: this._options.debug, - action: this._options.action, - maxConnections: this._options.maxConnections, - onProgress: function(id, fileName, loaded, total){ - self._onProgress(id, fileName, loaded, total); - self._options.onProgress(id, fileName, loaded, total); - }, - onComplete: function(id, fileName, result){ - self._onComplete(id, fileName, result); - self._options.onComplete(id, fileName, result); - }, - onCancel: function(id, fileName){ - self._onCancel(id, fileName); - self._options.onCancel(id, fileName); - } - }); - - return handler; - }, - _preventLeaveInProgress: function(){ - var self = this; - - qq.attach(window, 'beforeunload', function(e){ - if (!self._filesInProgress){return;} - - var e = e || window.event; - // for ie, ff - e.returnValue = self._options.messages.onLeave; - // for webkit - return self._options.messages.onLeave; - }); - }, - _onSubmit: function(id, fileName){ - this._filesInProgress++; - }, - _onProgress: function(id, fileName, loaded, total){ - }, - _onComplete: function(id, fileName, result){ - this._filesInProgress--; - if (result.error){ - this._options.showMessage(result.error); - } - }, - _onCancel: function(id, fileName){ - this._filesInProgress--; - }, - _onInputChange: function(input){ - if (this._handler instanceof qq.UploadHandlerXhr){ - this._uploadFileList(input.files); - } else { - if (this._validateFile(input)){ - this._uploadFile(input); - } - } - this._button.reset(); - }, - _uploadFileList: function(files){ - for (var i=0; i this._options.sizeLimit){ - this._error('sizeError', name); - return false; - - } else if (size && size < this._options.minSizeLimit){ - this._error('minSizeError', name); - return false; - } - - return true; - }, - _error: function(code, fileName){ - var message = this._options.messages[code]; - function r(name, replacement){ message = message.replace(name, replacement); } - - r('{file}', this._formatFileName(fileName)); - r('{extensions}', this._options.allowedExtensions.join(', ')); - r('{sizeLimit}', this._formatSize(this._options.sizeLimit)); - r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit)); - - this._options.showMessage(message); - }, - _formatFileName: function(name){ - if (name.length > 33){ - name = name.slice(0, 19) + '...' + name.slice(-13); - } - return name; - }, - _isAllowedExtension: function(fileName){ - var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : ''; - var allowed = this._options.allowedExtensions; - - if (!allowed.length){return true;} - - for (var i=0; i 99); - - return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; - } -}; - - -/** - * Class that creates upload widget with drag-and-drop and file list - * @inherits qq.FileUploaderBasic - */ -qq.FileUploader = function(o){ - // call parent constructor - qq.FileUploaderBasic.apply(this, arguments); - - // additional options - qq.extend(this._options, { - element: null, - // if set, will be used instead of qq-upload-list in template - listElement: null, - - template: '
    ' + - '
    Drop files here to upload
    ' + - '
    Upload a file
    ' + - '
      ' + - '
      ', - - // template for one item in file list - fileTemplate: '
    • ' + - '' + - '' + - '' + - 'Cancel' + - 'Failed' + - '
    • ', - - classes: { - // used to get elements from templates - button: 'qq-upload-button', - drop: 'qq-upload-drop-area', - dropActive: 'qq-upload-drop-area-active', - list: 'qq-upload-list', - - file: 'qq-upload-file', - spinner: 'qq-upload-spinner', - size: 'qq-upload-size', - cancel: 'qq-upload-cancel', - - // added to list item when upload completes - // used in css to hide progress spinner - success: 'qq-upload-success', - fail: 'qq-upload-fail' - } - }); - // overwrite options with user supplied - qq.extend(this._options, o); - - this._element = this._options.element; - this._element.innerHTML = this._options.template; - this._listElement = this._options.listElement || this._find(this._element, 'list'); - - this._classes = this._options.classes; - - this._button = this._createUploadButton(this._find(this._element, 'button')); - - this._bindCancelEvent(); - this._setupDragDrop(); -}; - -// inherit from Basic Uploader -qq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype); - -qq.extend(qq.FileUploader.prototype, { - /** - * Gets one of the elements listed in this._options.classes - **/ - _find: function(parent, type){ - var element = qq.getByClass(parent, this._options.classes[type])[0]; - if (!element){ - throw new Error('element not found ' + type); - } - - return element; - }, - _setupDragDrop: function(){ - var self = this, - dropArea = this._find(this._element, 'drop'); - - var dz = new qq.UploadDropZone({ - element: dropArea, - onEnter: function(e){ - qq.addClass(dropArea, self._classes.dropActive); - e.stopPropagation(); - }, - onLeave: function(e){ - e.stopPropagation(); - }, - onLeaveNotDescendants: function(e){ - qq.removeClass(dropArea, self._classes.dropActive); - }, - onDrop: function(e){ - dropArea.style.display = 'none'; - qq.removeClass(dropArea, self._classes.dropActive); - self._uploadFileList(e.dataTransfer.files); - } - }); - - dropArea.style.display = 'none'; - - qq.attach(document, 'dragenter', function(e){ - if (!dz._isValidFileDrag(e)) return; - - dropArea.style.display = 'block'; - }); - qq.attach(document, 'dragleave', function(e){ - if (!dz._isValidFileDrag(e)) return; - - var relatedTarget = document.elementFromPoint(e.clientX, e.clientY); - // only fire when leaving document out - if ( ! relatedTarget || relatedTarget.nodeName == "HTML"){ - dropArea.style.display = 'none'; - } - }); - }, - _onSubmit: function(id, fileName){ - qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments); - this._addToList(id, fileName); - }, - _onProgress: function(id, fileName, loaded, total){ - qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments); - - var item = this._getItemByFileId(id); - var size = this._find(item, 'size'); - size.style.display = 'inline'; - - var text; - if (loaded != total){ - text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total); - } else { - text = this._formatSize(total); - } - - qq.setText(size, text); - }, - _onComplete: function(id, fileName, result){ - qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments); - - // mark completed - var item = this._getItemByFileId(id); - qq.remove(this._find(item, 'cancel')); - qq.remove(this._find(item, 'spinner')); - - if (result.success){ - qq.addClass(item, this._classes.success); - } else { - qq.addClass(item, this._classes.fail); - } - }, - _addToList: function(id, fileName){ - var item = qq.toElement(this._options.fileTemplate); - item.qqFileId = id; - - var fileElement = this._find(item, 'file'); - qq.setText(fileElement, this._formatFileName(fileName)); - this._find(item, 'size').style.display = 'none'; - - this._listElement.appendChild(item); - }, - _getItemByFileId: function(id){ - var item = this._listElement.firstChild; - - // there can't be txt nodes in dynamically created list - // and we can use nextSibling - while (item){ - if (item.qqFileId == id) return item; - item = item.nextSibling; - } - }, - /** - * delegate click event for cancel link - **/ - _bindCancelEvent: function(){ - var self = this, - list = this._listElement; - - qq.attach(list, 'click', function(e){ - e = e || window.event; - var target = e.target || e.srcElement; - - if (qq.hasClass(target, self._classes.cancel)){ - qq.preventDefault(e); - - var item = target.parentNode; - self._handler.cancel(item.qqFileId); - qq.remove(item); - } - }); - } -}); - -qq.UploadDropZone = function(o){ - this._options = { - element: null, - onEnter: function(e){}, - onLeave: function(e){}, - // is not fired when leaving element by hovering descendants - onLeaveNotDescendants: function(e){}, - onDrop: function(e){} - }; - qq.extend(this._options, o); - - this._element = this._options.element; - - this._disableDropOutside(); - this._attachEvents(); -}; - -qq.UploadDropZone.prototype = { - _disableDropOutside: function(e){ - // run only once for all instances - if (!qq.UploadDropZone.dropOutsideDisabled ){ - - qq.attach(document, 'dragover', function(e){ - if (e.dataTransfer){ - e.dataTransfer.dropEffect = 'none'; - e.preventDefault(); - } - }); - - qq.UploadDropZone.dropOutsideDisabled = true; - } - }, - _attachEvents: function(){ - var self = this; - - qq.attach(self._element, 'dragover', function(e){ - if (!self._isValidFileDrag(e)) return; - - var effect = e.dataTransfer.effectAllowed; - if (effect == 'move' || effect == 'linkMove'){ - e.dataTransfer.dropEffect = 'move'; // for FF (only move allowed) - } else { - e.dataTransfer.dropEffect = 'copy'; // for Chrome - } - - e.stopPropagation(); - e.preventDefault(); - }); - - qq.attach(self._element, 'dragenter', function(e){ - if (!self._isValidFileDrag(e)) return; - - self._options.onEnter(e); - }); - - qq.attach(self._element, 'dragleave', function(e){ - if (!self._isValidFileDrag(e)) return; - - self._options.onLeave(e); - - var relatedTarget = document.elementFromPoint(e.clientX, e.clientY); - // do not fire when moving a mouse over a descendant - if (qq.contains(this, relatedTarget)) return; - - self._options.onLeaveNotDescendants(e); - }); - - qq.attach(self._element, 'drop', function(e){ - if (!self._isValidFileDrag(e)) return; - - e.preventDefault(); - self._options.onDrop(e); - }); - }, - _isValidFileDrag: function(e){ - var dt = e.dataTransfer, - // do not check dt.types.contains in webkit, because it crashes safari 4 - isWebkit = navigator.userAgent.indexOf("AppleWebKit") > -1; - - // dt.effectAllowed is none in Safari 5 - // dt.types.contains check is for firefox - return dt && dt.effectAllowed != 'none' && - (dt.files || (!isWebkit && dt.types.contains && dt.types.contains('Files'))); - - } -}; - -qq.UploadButton = function(o){ - this._options = { - element: null, - // if set to true adds multiple attribute to file input - multiple: false, - // name attribute of file input - name: 'file', - onChange: function(input){}, - hoverClass: 'qq-upload-button-hover', - focusClass: 'qq-upload-button-focus' - }; - - qq.extend(this._options, o); - - this._element = this._options.element; - - // make button suitable container for input - qq.css(this._element, { - position: 'relative', - overflow: 'hidden', - // Make sure browse button is in the right side - // in Internet Explorer - direction: 'ltr' - }); - - this._input = this._createInput(); -}; - -qq.UploadButton.prototype = { - /* returns file input element */ - getInput: function(){ - return this._input; - }, - /* cleans/recreates the file input */ - reset: function(){ - if (this._input.parentNode){ - qq.remove(this._input); - } - - qq.removeClass(this._element, this._options.focusClass); - this._input = this._createInput(); - }, - _createInput: function(){ - var input = document.createElement("input"); - - if (this._options.multiple){ - input.setAttribute("multiple", "multiple"); - } - - input.setAttribute("type", "file"); - input.setAttribute("name", this._options.name); - - qq.css(input, { - position: 'absolute', - // in Opera only 'browse' button - // is clickable and it is located at - // the right side of the input - right: 0, - top: 0, - fontFamily: 'Arial', - // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118 - fontSize: '118px', - margin: 0, - padding: 0, - cursor: 'pointer', - opacity: 0 - }); - - this._element.appendChild(input); - - var self = this; - qq.attach(input, 'change', function(){ - self._options.onChange(input); - }); - - qq.attach(input, 'mouseover', function(){ - qq.addClass(self._element, self._options.hoverClass); - }); - qq.attach(input, 'mouseout', function(){ - qq.removeClass(self._element, self._options.hoverClass); - }); - qq.attach(input, 'focus', function(){ - qq.addClass(self._element, self._options.focusClass); - }); - qq.attach(input, 'blur', function(){ - qq.removeClass(self._element, self._options.focusClass); - }); - - // IE and Opera, unfortunately have 2 tab stops on file input - // which is unacceptable in our case, disable keyboard access - if (window.attachEvent){ - // it is IE or Opera - input.setAttribute('tabIndex', "-1"); - } - - return input; - } -}; - -/** - * Class for uploading files, uploading itself is handled by child classes - */ -qq.UploadHandlerAbstract = function(o){ - this._options = { - debug: false, - action: '/upload.php', - // maximum number of concurrent uploads - maxConnections: 999, - onProgress: function(id, fileName, loaded, total){}, - onComplete: function(id, fileName, response){}, - onCancel: function(id, fileName){} - }; - qq.extend(this._options, o); - - this._queue = []; - // params for files in queue - this._params = []; -}; -qq.UploadHandlerAbstract.prototype = { - log: function(str){ - if (this._options.debug && window.console) console.log('[uploader] ' + str); - }, - /** - * Adds file or file input to the queue - * @returns id - **/ - add: function(file){}, - /** - * Sends the file identified by id and additional query params to the server - */ - upload: function(id, params){ - var len = this._queue.push(id); - - var copy = {}; - qq.extend(copy, params); - this._params[id] = copy; - - // if too many active uploads, wait... - if (len <= this._options.maxConnections){ - this._upload(id, this._params[id]); - } - }, - /** - * Cancels file upload by id - */ - cancel: function(id){ - this._cancel(id); - this._dequeue(id); - }, - /** - * Cancells all uploads - */ - cancelAll: function(){ - for (var i=0; i= max){ - var nextId = this._queue[max-1]; - this._upload(nextId, this._params[nextId]); - } - } -}; - -/** - * Class for uploading files using form and iframe - * @inherits qq.UploadHandlerAbstract - */ -qq.UploadHandlerForm = function(o){ - qq.UploadHandlerAbstract.apply(this, arguments); - - this._inputs = {}; -}; -// @inherits qq.UploadHandlerAbstract -qq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype); - -qq.extend(qq.UploadHandlerForm.prototype, { - add: function(fileInput){ - fileInput.setAttribute('name', 'qqfile'); - var id = 'qq-upload-handler-iframe' + qq.getUniqueId(); - - this._inputs[id] = fileInput; - - // remove file input from DOM - if (fileInput.parentNode){ - qq.remove(fileInput); - } - - return id; - }, - getName: function(id){ - // get input value and remove path to normalize - return this._inputs[id].value.replace(/.*(\/|\\)/, ""); - }, - _cancel: function(id){ - this._options.onCancel(id, this.getName(id)); - - delete this._inputs[id]; - - var iframe = document.getElementById(id); - if (iframe){ - // to cancel request set src to something else - // we use src="javascript:false;" because it doesn't - // trigger ie6 prompt on https - iframe.setAttribute('src', 'javascript:false;'); - - qq.remove(iframe); - } - }, - _upload: function(id, params){ - var input = this._inputs[id]; - - if (!input){ - throw new Error('file with passed id was not added, or already uploaded or cancelled'); - } - - var fileName = this.getName(id); - - var iframe = this._createIframe(id); - var form = this._createForm(iframe, params); - form.appendChild(input); - - var self = this; - this._attachLoadEvent(iframe, function(){ - self.log('iframe loaded'); - - var response = self._getIframeContentJSON(iframe); - - self._options.onComplete(id, fileName, response); - self._dequeue(id); - - delete self._inputs[id]; - // timeout added to fix busy state in FF3.6 - setTimeout(function(){ - qq.remove(iframe); - }, 1); - }); - - form.submit(); - qq.remove(form); - - return id; - }, - _attachLoadEvent: function(iframe, callback){ - qq.attach(iframe, 'load', function(){ - // when we remove iframe from dom - // the request stops, but in IE load - // event fires - if (!iframe.parentNode){ - return; - } - - // fixing Opera 10.53 - if (iframe.contentDocument && - iframe.contentDocument.body && - iframe.contentDocument.body.innerHTML == "false"){ - // In Opera event is fired second time - // when body.innerHTML changed from false - // to server response approx. after 1 sec - // when we upload file with iframe - return; - } - - callback(); - }); - }, - /** - * Returns json object received by iframe from server. - */ - _getIframeContentJSON: function(iframe){ - // iframe.contentWindow.document - for IE<7 - var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document, - response; - - this.log("converting iframe's innerHTML to JSON"); - this.log("innerHTML = " + doc.body.innerHTML); - - try { - response = eval("(" + doc.body.innerHTML + ")"); - } catch(err){ - response = {}; - } - - return response; - }, - /** - * Creates iframe with unique name - */ - _createIframe: function(id){ - // We can't use following code as the name attribute - // won't be properly registered in IE6, and new window - // on form submit will open - // var iframe = document.createElement('iframe'); - // iframe.setAttribute('name', id); - - var iframe = qq.toElement('