7 if (defined('YOURLS_DEBUG') && YOURLS_DEBUG == true) {
\r
8 error_reporting(E_ALL);
\r
10 error_reporting(E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);
\r
13 // function to convert an integer (1337) to a string (3jk). Input integer processed as a string to beat PHP's int max value
\r
14 function yourls_int2string( $id ) {
\r
15 $str = yourls_base2base(trim(strval($id)), 10, YOURLS_URL_CONVERT);
\r
16 if (YOURLS_URL_CONVERT <= 37)
\r
17 $str = strtolower($str);
\r
21 // function to convert a string (3jk) to an integer (1337)
\r
22 function yourls_string2int( $str ) {
\r
23 if (YOURLS_URL_CONVERT <= 37)
\r
24 $str = strtolower($str);
\r
25 return yourls_base2base(trim($str), YOURLS_URL_CONVERT, 10);
\r
28 // Make sure a link id (site.com/1fv) is valid.
\r
29 function yourls_sanitize_string($in) {
\r
30 if (YOURLS_URL_CONVERT <= 37)
\r
31 $in = strtolower($in);
\r
32 return substr(preg_replace('/[^a-zA-Z0-9]/', '', $in), 0, 12);
\r
35 // A few sanity checks on the URL
\r
36 function yourls_sanitize_url($url) {
\r
37 // make sure there's only one 'http://' at the beginning (prevents pasting a URL right after the default 'http://')
\r
38 $url = str_replace('http://http://', 'http://', $url);
\r
40 // make sure there's a protocol, add http:// if not
\r
41 if ( !preg_match('|[^:]+://|', $url ) )
\r
42 $url = 'http://'.$url;
\r
44 return htmlspecialchars($url);
\r
47 // Make sure an id link is a valid integer (PHP's intval() limits to too small numbers)
\r
48 function yourls_sanitize_int($in) {
\r
49 return ( substr(preg_replace('/[^0-9]/', '', strval($in) ), 0, 20) );
\r
52 // Make sure a integer is safe
\r
53 // Note: this is not checking for integers, since integers on 32bits system are way too limited
\r
54 // TODO: find a way to validate as integer
\r
55 function yourls_intval($in) {
\r
56 return mysql_real_escape_string($in);
\r
60 // Check to see if a given integer id is reserved (ie reserved URL or an existing page)
\r
62 function yourls_is_reserved_id($id) {
\r
63 global $yourls_reserved_URL;
\r
64 $keyword = yourls_int2string( yourls_intval($id) );
\r
65 if ( in_array( $keyword, $yourls_reserved_URL)
\r
66 or file_exists(dirname(dirname(__FILE__))."/pages/$keyword.php")
\r
67 or is_dir(dirname(dirname(__FILE__))."$keyword")
\r
74 // Function: Get IP Address
\r
75 function yourls_get_IP() {
\r
76 if(!empty($_SERVER['HTTP_CLIENT_IP'])) {
\r
77 $ip_address = $_SERVER['HTTP_CLIENT_IP'];
\r
78 } else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
\r
79 $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
\r
80 } else if(!empty($_SERVER['REMOTE_ADDR'])) {
\r
81 $ip_address = $_SERVER['REMOTE_ADDR'];
\r
85 if(strpos($ip_address, ',') !== false) {
\r
86 $ip_address = explode(',', $ip_address);
\r
87 $ip_address = $ip_address[0];
\r
92 // Add the "Edit" row
\r
93 function yourls_table_edit_row($id, $db) {
\r
94 $id = yourls_intval($id);
\r
95 $table = YOURLS_DB_TABLE_URL;
\r
96 $url = $db->get_row("SELECT `url` FROM `$table` WHERE `id` = '$id';");
\r
97 $safe_url = stripslashes($url->url);
\r
98 $keyword = yourls_int2string($id);
\r
100 $return = <<<RETURN
\r
101 <tr id="edit-$id" class="edit-row"><td colspan="6">Edit: <strong>original URL</strong>:<input type="text" id="edit-url-$id" name="edit-url-$id" value="$safe_url" class="text" size="100" /><strong>short URL</strong>:<input type="text" id="edit-id-$id" name="edit-id-$id" value="$keyword" class="text" size="10" /></td><td colspan="1"><input type="button" id="edit-submit-$id" name="edit-submit-$id" value="Save" title="Save new values" class="button" onclick="edit_save('$id');" /> <input type="button" id="edit-close-$id" name="edit-close-$id" value="X" title="Cancel editing" class="button" onclick="hide_edit('$id');" /></td></tr>
\r
104 $return = '<tr><td colspan="7">Invalid URL ID</td></tr>';
\r
111 function yourls_table_add_row( $id, $keyword, $url, $ip, $clicks, $timestamp ) {
\r
112 $date = date( 'M d, Y H:i', $timestamp+( YOURLS_HOURS_OFFSET * 3600) );
\r
113 $clicks = number_format($clicks);
\r
114 $www = YOURLS_SITE;
\r
117 <tr id="id-$id"><td id="keyword-$id">$keyword</td><td id="url-$id"><a href="$url" title="$url">$url</a></td><td id="shorturl-$id"><a href="$www/$keyword" title="$www/$keyword">$www/$keyword</a></td><td id="timestamp-$id">$date</td><td>$ip</td> <td>$clicks</td><td class="actions"><input type="button" id="edit-button-$id" name="edit-button" value="Edit" class="button" onclick="edit('$id');" /> <input type="button" id="delete-button-$id" name="delete-button" value="Del" class="button" onclick="remove('$id');" /></td></tr>
\r
121 // Get next id a new link will have if no custom keyword provided
\r
122 function yourls_get_next_decimal($db) {
\r
123 $table = YOURLS_DB_TABLE_NEXTDEC;
\r
124 return $db->get_var("SELECT `next_id` FROM `$table`");
\r
127 // Update id for next link with no custom keyword
\r
128 function yourls_update_next_decimal($int = '', $db) {
\r
129 $int = ( $int == '' ) ? 'next+1' : (int)$int ;
\r
130 $table = YOURLS_DB_TABLE_NEXTDEC;
\r
131 return $db->query("UPDATE `$table` set next_id=$int");
\r
134 // Delete a link in the DB
\r
135 function yourls_delete_link_by_id($id, $db) {
\r
136 $table = YOURLS_DB_TABLE_URL;
\r
137 $id = yourls_intval($id);
\r
138 return $db->query("DELETE FROM `$table` WHERE `id` = $id;");
\r
141 // SQL query to insert a new link in the DB. Needs sanitized data. Returns boolean for success or failure of the inserting
\r
142 function yourls_insert_link_in_db($url, $id, $db) {
\r
143 $table = YOURLS_DB_TABLE_URL;
\r
144 $timestamp = date('Y-m-d H:i:s');
\r
145 $ip = yourls_get_IP();
\r
146 return $db->query("INSERT INTO `$table` VALUES($id, '$url', '$timestamp', '$ip', 0);");
\r
149 // Add a new link in the DB, either with custom keyword, or find one
\r
150 function yourls_add_new_link($url, $keyword = '', $db) {
\r
151 if ( !$url || $url == 'http://' || $url == 'https://' ) {
\r
152 $return['status'] = 'fail';
\r
153 $return['code'] = 'error:nourl';
\r
154 $return['message'] = 'Missing URL input';
\r
158 $table = YOURLS_DB_TABLE_URL;
\r
159 $url = mysql_real_escape_string(yourls_sanitize_url($url));
\r
160 $strip_url = stripslashes($url);
\r
161 $url_exists = $db->get_row("SELECT id,url FROM `$table` WHERE `url` = '".$strip_url."';");
\r
162 $ip = yourls_get_IP();
\r
165 // New URL : store it
\r
166 if( !$url_exists ) {
\r
168 // Custom keyword provided
\r
170 $keyword = mysql_real_escape_string(yourls_sanitize_string($keyword));
\r
171 if (!yourls_keyword_is_free($keyword, $db)) {
\r
172 // This id either reserved or taken already
\r
173 $return['status'] = 'fail';
\r
174 $return['code'] = 'error:keyword';
\r
175 $return['message'] = 'URL id '.$keyword.' already exists in database or is reserved';
\r
177 // all clear, store !
\r
178 $id = yourls_string2int($keyword);
\r
179 yourls_insert_link_in_db($url, $id, $db);
\r
180 $return['url'] = array('id' => $id, 'keyword' => $keyword, 'url' => $strip_url, 'date' => date('Y-m-d H:i:s'), 'ip' => yourls_get_IP() );
\r
181 $return['status'] = 'success';
\r
182 $return['message'] = $strip_url.' added to database';
\r
183 $return['html'] = yourls_table_add_row( $id, $keyword, $url, yourls_get_IP(), 0, time() );
\r
184 $return['shorturl'] = YOURLS_SITE .'/'. $keyword;
\r
187 // Create random keyword
\r
189 $timestamp = date('Y-m-d H:i:s');
\r
190 $id = yourls_get_next_decimal($db);
\r
192 $add_url = @yourls_insert_link_in_db($url, $id, $db);
\r
193 $free = !yourls_is_reserved_id( $id );
\r
194 $ok = ($free && $add_url);
\r
195 if ( $ok === false && $add_url === 1 ) {
\r
196 // we stored something, but shouldn't have (ie reserved id)
\r
197 $delete = yourls_delete_link_by_id( $id, $db );
\r
198 $return['extra_info'] .= '(deleted '.$id.')';
\r
200 // everything ok, populate needed vars
\r
201 $keyword = yourls_int2string($id);
\r
202 $return['url'] = array('id' => $id, 'keyword' => $keyword, 'url' => $strip_url, 'date' => $timestamp, 'ip' => $ip);
\r
203 $return['status'] = 'success';
\r
204 $return['message'] = $strip_url.' added to database';
\r
205 $return['html'] = yourls_table_add_row( $id, $keyword, $url, $ip, 0, time() );
\r
206 $return['shorturl'] = YOURLS_SITE .'/'. $keyword;
\r
210 @yourls_update_next_decimal($id, $db);
\r
213 // URL was already stored
\r
214 $return['status'] = 'fail';
\r
215 $return['code'] = 'error:url';
\r
216 $return['message'] = $strip_url.' already exists in database';
\r
217 $return['shorturl'] = YOURLS_SITE .'/'. yourls_int2string( $url_exists->id );
\r
225 function yourls_edit_link($url, $id, $keyword='', $db) {
\r
226 $table = YOURLS_DB_TABLE_URL;
\r
227 $url = mysql_real_escape_string(yourls_sanitize_url($url));
\r
228 $id = yourls_intval($id);
\r
229 $strip_url = stripslashes($url);
\r
230 $old_url = $db->get_var("SELECT `url` FROM `$table` WHERE `id` = '".$id."';");
\r
233 // Check if new URL is not here already
\r
234 if ($old_url != $url) {
\r
235 $url_exists = intval($db->get_var("SELECT id FROM `$table` WHERE `url` = '".$strip_url."';"));
\r
237 $url_exists = false;
\r
240 // Check if the new keyword is not here already
\r
241 $newid = ( $keyword ? yourls_string2int($keyword) : $id );
\r
242 if ($newid != $id) {
\r
243 $id_exists = intval($db->get_var("SELECT id FROM `$table` WHERE `id` = '".$newid."';"));
\r
244 $id_free = yourls_keyword_is_free($keyword, $db);
\r
245 $id_is_ok = ($id_exists == 0) && $id_free;
\r
250 // All clear, update
\r
251 if($url_exists == 0 && $id_is_ok ) {
\r
252 $timestamp4screen = date( 'Y M d H:i', time()+( yourls_HOURS_OFFSET * 3600) );
\r
253 $timestamp4db = date('Y-m-d H:i:s', time()+( yourls_HOURS_OFFSET * 3600) );
\r
254 $update_url = $db->query("UPDATE `$table` SET `url` = '$url', `timestamp` = '$timestamp4db', `id` = '$newid' WHERE `id` = $id;");
\r
256 $return['url'] = array('id' => $newid, 'keyword' => $keyword, 'shorturl' => YOURLS_SITE.'/'.$keyword, 'url' => $strip_url, 'date' => $timestamp4screen);
\r
257 $return['status'] = 'success';
\r
258 $return['message'] = 'Link updated in database';
\r
260 $return['status'] = 'fail';
\r
261 $return['message'] = 'Error updating '.$strip_url.' (ID: '.$id.') to database';
\r
266 $return['status'] = 'fail';
\r
267 $return['message'] = 'URL or keyword already exists in database';
\r
274 // Check if keyword id is free (ie not already taken, and not reserved)
\r
275 function yourls_keyword_is_free($str, $db) {
\r
276 $table = YOURLS_DB_TABLE_URL;
\r
277 $id = yourls_string2int($str);
\r
278 if ( yourls_is_reserved_id($id) )
\r
281 $already_exists = intval($db->get_var("SELECT `id` FROM `$table` WHERE `id` = '".$id."';"));
\r
282 if ( $already_exists )
\r
290 function yourls_page($page) {
\r
291 $include = dirname(dirname(__FILE__))."/pages/$page.php";
\r
292 if (!file_exists($include)) {
\r
293 die("Page '$page' not found");
\r
300 function yourls_db_connect() {
\r
301 if (!defined('YOURLS_DB_USER')
\r
302 or !defined('YOURLS_DB_PASS')
\r
303 or !defined('YOURLS_DB_NAME')
\r
304 or !defined('YOURLS_DB_HOST')
\r
305 or !class_exists('ezSQL_mysql')
\r
306 ) die ('DB config/class missing');
\r
308 $db = new ezSQL_mysql(YOURLS_DB_USER, YOURLS_DB_PASS, YOURLS_DB_NAME, YOURLS_DB_HOST);
\r
309 if ( $db->last_error )
\r
310 die( $db->last_error );
\r
315 // Return JSON output. Compatible with PHP prior to 5.2
\r
316 function yourls_json_encode($array) {
\r
317 if (function_exists('json_encode')) {
\r
318 return json_encode($array);
\r
320 require_once(dirname(__FILE__).'/functions-json.php');
\r
321 return yourls_array_to_json($array);
\r
325 // Return XML output.
\r
326 function yourls_xml_encode($array) {
\r
327 require_once(dirname(__FILE__).'/functions-xml.php');
\r
328 $converter= new yourls_array2xml;
\r
329 return $converter->array2xml($array);
\r
332 // Return array for API stat requests
\r
333 function yourls_api_stats( $filter, $limit, $db ) {
\r
334 switch( $filter ) {
\r
336 $sort_by = 'clicks';
\r
337 $sort_order = 'asc';
\r
340 $sort_by = 'timestamp';
\r
341 $sort_order = 'desc';
\r
345 $sort_by = 'clicks';
\r
346 $sort_order = 'desc';
\r
350 $limit = intval( $limit );
\r
351 $table_url = YOURLS_DB_TABLE_URL;
\r
352 $results = $db->get_results("SELECT * FROM $table_url WHERE 1=1 ORDER BY $sort_by $sort_order LIMIT 0, $limit;");
\r
357 foreach ($results as $res) {
\r
358 $return['links']['link_'.$i++] = array(
\r
359 'shorturl' => YOURLS_SITE .'/'. yourls_int2string($res->id),
\r
360 'url' => $res->url,
\r
361 'timestamp' => $res->timestamp,
\r
363 'clicks' => $res->clicks
\r
367 $totals = $db->get_row("SELECT COUNT(id) as c, SUM(clicks) as s FROM $table_url WHERE 1=1");
\r
368 $return['stats'] = array( 'total_links' => $totals->c, 'total_clicks' => $totals->s );
\r
373 // Return API result. Dies after this
\r
374 function yourls_api_output( $mode, $return ) {
\r
377 header('Content-type: application/json');
\r
378 echo yourls_json_encode($return);
\r
382 header('Content-type: application/xml');
\r
383 echo yourls_xml_encode($return);
\r
388 echo $return['shorturl'];
\r
394 // Display HTML head and <body> tag
\r
395 function yourls_html_head( $context = 'index' ) {
\r
396 // Load components as needed
\r
397 switch ( $context ) {
\r
401 $tablesorter = true;
\r
407 $tablesorter = true;
\r
416 $tablesorter = false;
\r
421 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
\r
422 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
\r
424 <title>YOURLS » Your Own URL Shortener | <?php echo YOURLS_SITE; ?></title>
\r
425 <link rel="icon" type="image/gif" href="<?php echo YOURLS_SITE; ?>/images/favicon.gif" />
\r
426 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
\r
427 <meta name="copyright" content="Copyright © 2008-<?php echo date('Y'); ?> YOURS" />
\r
428 <meta name="author" content="Ozh Richard, Lester Chan" />
\r
429 <meta name="description" content="Insert URL « YOURLS » Your Own URL Shortener' | <?php echo YOURLS_SITE; ?>" />
\r
430 <script src="<?php echo YOURLS_SITE; ?>/js/jquery-1.3.2.min.js" type="text/javascript"></script>
\r
431 <link rel="stylesheet" href="<?php echo YOURLS_SITE; ?>/css/style.css" type="text/css" media="screen" />
\r
432 <?php if ($tablesorter) { ?>
\r
433 <link rel="stylesheet" href="<?php echo YOURLS_SITE; ?>/css/tablesorter.css" type="text/css" media="screen" />
\r
434 <script src="<?php echo YOURLS_SITE; ?>/js/jquery.tablesorter.min.js" type="text/javascript"></script>
\r
436 <?php if ($insert) { ?>
\r
437 <script src="<?php echo YOURLS_SITE; ?>/js/insert.js" type="text/javascript"></script>
\r
439 <?php if ($share) { ?>
\r
440 <script src="<?php echo YOURLS_SITE; ?>/js/share.js" type="text/javascript"></script>
\r
443 <body class="<?php echo $context; ?>">
\r
447 // Display HTML footer (including closing body & html tags)
\r
448 function yourls_html_footer() {
\r
450 <div id="footer"><p>Powered by <a href="http://yourls.org/" title="YOURLS">YOURLS</a> v<?php echo YOURLS_VERSION; ?></p></div>
\r
456 // Display "Add new URL" box
\r
457 function yourls_html_addnew( $url = '', $keyword = '' ) {
\r
458 $url = $url ? $url : 'http://';
\r
462 <form id="new_url_form" action="" method="get">
\r
463 <strong>Enter the URL</strong>:<input type="text" id="add-url" name="url" value="<?php echo $url; ?>" class="text" size="90" />
\r
464 Optional: <strong>Custom short URL</strong>:<input type="text" id="add-keyword" name="keyword" value="<?php echo $keyword; ?>" maxlength="12" class="text" size="8" />
\r
465 <input type="button" id="add-button" name="add-button" value="Shorten The URL" class="button" onclick="add();" />
\r
467 <div id="feedback" style="display:none"></div>
\r
473 // Display main table's footer
\r
474 function yourls_html_tfooter( $params = array() ) {
\r
475 extract( $params ); // extract $search_text, $page, $search_in_sql ...
\r
480 <th colspan="4" style="text-align: left;">
\r
481 <form action="" method="get">
\r
483 <div style="float:right;">
\r
484 <input type="submit" id="submit-sort" value="Filter" class="button primary" />
\r
486 <input type="button" id="submit-clear-filter" value="Clear Filter" class="button" onclick="window.parent.location.href = 'index.php'" />
\r
489 Search for
\r
490 <input type="text" name="s_search" class="text" size="20" value="<?php echo $search_text; ?>" />
\r
492 <select name="s_in" size="1">
\r
493 <!-- <option value="id"<?php if($search_in_sql == 'id') { echo ' selected="selected"'; } ?>>ID</option> -->
\r
494 <option value="url"<?php if($search_in_sql == 'url') { echo ' selected="selected"'; } ?>>URL</option>
\r
495 <option value="ip"<?php if($search_in_sql == 'ip') { echo ' selected="selected"'; } ?>>IP</option>
\r
497 – Order by
\r
498 <select name="s_by" size="1">
\r
499 <option value="id"<?php if($sort_by_sql == 'id') { echo ' selected="selected"'; } ?>>ID</option>
\r
500 <option value="url"<?php if($sort_by_sql == 'url') { echo ' selected="selected"'; } ?>>URL</option>
\r
501 <option value="timestamp"<?php if($sort_by_sql == 'timestamp') { echo ' selected="selected"'; } ?>>Date</option>
\r
502 <option value="ip"<?php if($sort_by_sql == 'ip') { echo ' selected="selected"'; } ?>>IP</option>
\r
503 <option value="clicks"<?php if($sort_by_sql == 'clicks') { echo ' selected="selected"'; } ?>>Clicks</option>
\r
505 <select name="s_order" size="1">
\r
506 <option value="asc"<?php if($sort_order_sql == 'asc') { echo ' selected="selected"'; } ?>>Ascending</option>
\r
507 <option value="desc"<?php if($sort_order_sql == 'desc') { echo ' selected="selected"'; } ?>>Descending</option>
\r
509 – Show
\r
510 <input type="text" name="perpage" class="text" size="2" value="<?php echo $perpage; ?>" /> rows<br/>
\r
513 <select name="link_filter" size="1">
\r
514 <option value="more"<?php if($link_filter === 'more') { echo ' selected="selected"'; } ?>>more</option>
\r
515 <option value="less"<?php if($link_filter === 'less') { echo ' selected="selected"'; } ?>>less</option>
\r
518 <input type="text" name="link_limit" class="text" size="4" value="<?php echo $link_limit; ?>" />clicks
\r
524 <th colspan="3" style="text-align: right;">
\r
525 Pages (<?php echo $total_pages; ?>):
\r
528 echo '<b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&s_order='.$sort_order_sql.$search_url.'&perpage='.$perpage.'&page=1'.'" title="Go to First Page">« First</a></b> ... ';
\r
531 echo ' <b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&s_order='.$sort_order_sql.$search_url.'&perpage='.$perpage.'&page='.($page-1).'" title="« Go to Page '.($page-1).'">«</a></b> ';
\r
533 for($i = $page - 2 ; $i <= $page +2; $i++) {
\r
534 if ($i >= 1 && $i <= $total_pages) {
\r
536 echo "<strong>[$i]</strong> ";
\r
538 echo '<a href="'.$base_page.'?s_by='.$sort_by_sql.'&s_order='.$sort_order_sql.$search_url.'&perpage='.$perpage.'&page='.($i).'" title="Page '.$i.'">'.$i.'</a> ';
\r
542 if($page < $total_pages) {
\r
543 echo ' <b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&s_order='.$sort_order_sql.$search_url.'&perpage='.$perpage.'&page='.($page+1).'" title="Go to Page '.($page+1).' »">»</a></b> ';
\r
545 if (($page+2) < $total_pages) {
\r
546 echo ' ... <b><a href="'.$base_page.'?s_by='.$sort_by_sql.'&s_order='.$sort_order_sql.$search_url.'&perpage='.$perpage.'&page='.($total_pages).'" title="Go to Last Page">Last »</a></b>';
\r
555 function yourls_share_box( $longurl, $shorturl, $title='', $text='' ) {
\r
556 $text = ( $text ? '"'.$text.'" ' : '' );
\r
557 $title = ( $title ? "$title " : '' );
\r
558 $share = $title.$text.$shorturl ;
\r
559 $_share = rawurlencode( $share );
\r
560 $_url = rawurlencode( $shorturl );
\r
561 $count = 140 - strlen( $share );
\r
564 <div id="shareboxes">
\r
566 <div id="copybox" class="share">
\r
567 <h2>Your short link</h2>
\r
568 <p><input id="copylink" class="text" size="40" value="<?php echo $shorturl; ?>" /></p>
\r
569 <p><small>Original link: <a href="<?php echo $longurl; ?>"><?php echo $longurl; ?></a></small></p>
\r
572 <div id="sharebox" class="share">
\r
573 <h2>Quick Share</h2>
\r
575 <span id="charcount"><?php echo $count; ?></span>
\r
576 <textarea id="tweet_body"><?php echo $share; ?></textarea>
\r
578 <p id="share_links">Share with
\r
579 <a id="share_tw" href="http://twitter.com/home?status=<?php echo $_share; ?>" title="Tweet this!" onclick="share('tw');return false">Twitter</a>
\r
580 <a id="share_fb" href="http://www.facebook.com/share.php?u=<?php echo $_url; ?>" title="Share on Facebook" onclick="share('fb');return false;">Facebook</a>
\r
581 <a id="share_ff" href="http://friendfeed.com/share/bookmarklet/frame#title=<?php echo $_share; ?>" title="Share on Friendfeed" onclick="javascript:share('ff');return false;">FriendFeed</a>
\r