0 && ($i%$size)==0) { $j++; } $retval[$j][$i%$size] = (empty($array[$i])) ? $fill : $array[$i]; } } return $retval; } // }}} function authorized() { // {{{ global $config; $r=$u=$p=$a=false; $remember = ( linkex::get( 'remember', $_REQUEST, 0 ) == 1 ); if ( ( $u = linkex::get( 'username', $_POST, false ) ) && ( $p = linkex::get( 'password', $_POST, false ) ) ) { $r=true; } else if ( $a = linkex::get( '_authcookie', $_SESSION, false ) ) { $r=false; } else if ( $a = linkex::get( '_authcookie', $_COOKIE, false ) ) { $remember=true; $r=false; } $path = dirname( linkex::get( 'SCRIPT_NAME', $_SERVER, '/' ) ); if ( ( $u !== false && $p !== false ) || ( $a !== false ) ) { if ( md5( $u .'---'. $p ) == $config->password || $a == $config->password ) { $_SESSION['_authcookie'] = $config->password; if ( $remember ) { setcookie( '_authcookie', $config->password, time()+60*60*24*30, $path ); } if ( $r ) { linkex::redirect( $_SERVER['REQUEST_URI'] ); } return true; } else { setcookie( '_authcookie', '', time() - 3600, $path ); unset( $_SESSION['_authcookie'] ); return false; } } else { setcookie( '_authcookie', '', time() - 3600, $path ); unset( $_SESSION['_authcookie'] ); return false; } } // }}} function buildquery( $array ) { // {{{ $retval = array(); foreach( $array AS $k=>$v ) { $retval[] = urlencode( $k ).'='.urlencode( $v ); } return join( '&', $retval ); } // }}} function categories( $all = false, $checkslots=false ) { // {{{ $categories = array(); $cids = linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ); foreach( $cids AS $cid ) { $c = new category( $cid ); if ( ( $all || $c->public == 1 ) && ( !$checkslots || ( $checkslots && $c->slots > 0 && $c->links() < $c->slots ) ) ) { $categories{ $cid } = $c->name; } unset( $c ); } return $categories; } // }}} function compareIPs( $a, $b ) { // {{{ a can be 127., 127.0, 127.0.0, 127.0.0.1, or a hostname if ( !preg_match( '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/', $a ) ) { $a = linkex::gethostbyname( $a ); } if ( !preg_match( '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/', $b ) ) { $b = linkex::gethostbyname( $b ); } $a = explode( '.', $a ); $b = explode( '.', $b ); for( $i=0; $ilinkbotdisregardwww == 1 ) { $a = str_replace( 'www.', '', $a ); $b = str_replace( 'www.', '', $b ); } if ( $config->linkbotignoretrailingslash == 1 ) { $a = rtrim( $a, '/' ); $b = rtrim( $b, '/' ); } return strcmp( $a, $b ); } // }}} function checkbox( $val ) { // {{{ return ( intval( $val ) != 0 ) ? 'checked="checked"':''; } // }}} function du( $dir ) { // {{{ $s = @stat( $dir ); $space = linkex::get( 'size', $s, 0 ); if ( is_dir( $dir ) ) { $dh = opendir( $dir ); while ( ( $file = readdir( $dh ) ) !== false ) { if ( !in_array( $file, array( '.', '..' ) ) ) { $space += linkex::du( rtrim( $dir, '/' ) .'/'. $file ); } } closedir( $dh ); } return $space; } // }}} function elapsed( $seconds ) { // {{{ $retval = array( 'Y' => 0, 'm' => 0, 'd' => 0, 'H' => 0, 'i' => 0, 's' => 0, 'nice' => '' ); // Years ( 60*60*24*365 ) = 31536000 seconds if ( $seconds > 31536000 ) { $retval{'Y'} = floor( $seconds / 31536000 ); $seconds = $seconds - ( $retval{'Y'} * 31536000 ); $retval{'nice'} = $retval{'Y'} . ' year' . ( $retval{'Y'}>1?'s':'' ); } // Months ( 60*60*24*30 ) = 2592000 if ( $seconds > 2592000 ) { $retval{'m'} = floor( $seconds / 2592000 ); $seconds = $seconds - ( $retval{'m'} * 2592000 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'m'} . ' month' . ( $retval{'m'}>1?'s':'' ); } // Days ( 60*60*24 ) = 86400 if ( $seconds > 86400 ) { $retval{'d'} = floor( $seconds / 86400 ); $seconds = $seconds - ( $retval{'d'} * 86400 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'d'} . ' day' . ( $retval{'d'}>1?'s':'' ); } // Hours ( 60*60 ) = 3600 if ( $seconds > 3600 ) { $retval{'H'} = floor( $seconds / 3600 ); $seconds = $seconds - ( $retval{'H'} * 3600 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'H'} . ' hour' . ( $retval{'H'}>1?'s':'' ); } // Minutes ( 60 ) = 60 if ( $seconds > 60 ) { $retval{'i'} = floor( $seconds / 60 ); $seconds = $seconds - ( $retval{'i'} * 60 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'i'} . ' minute' . ( $retval{'i'} > 1 ? 's':'' ); } // Seconds 0 if ( $seconds >= 0 ) { $retval{'s'} = $seconds; $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'s'} . ' second' . ( $retval{'s'}>1?'s':'' ); } return $retval; } // }}} function expandlink( $link, $baseurl ) { // {{{ preg_match( "'^[^\?]+'", $baseurl.'/', $res ); $res = preg_replace( "|/[^\/\.]+\.[^\/\.]+$|", '', $res[0] ); $res = rtrim( $res, '/' ); if ( ( $root = @parse_url( $res ) ) ) { $root = $root['scheme'] .'://'. $root['host']; } else { // fixme // die( 'Unable to parse: '.$res ); $root = 'http://'; } $search = array( "|^(\/)|i", "|^(?!http://)(?!mailto:)|i", "|/\./|", "|/[^\/]+/\.\./|" ); $replace = array( $root .'/', $res . '/', '/', '/' ); return preg_replace( $search, $replace, $link ); } // }}} function fetch( $url, $params=array() ) { // {{{ global $config; if ( ( $host = @parse_url( $url ) ) && linkex::get( 'host', $host, false ) !== false ) { $po = linkex::get( 'port', $host, '80' ); $ho = linkex::get( 'host', $host, '' ); $pa = linkex::get( 'path', $host ); $pa = ( strlen( $pa ) == 0 ) ? '/':$pa; $qu = linkex::get( 'query', $host, '' ); $pa.= ( strlen( $qu ) == 0 ) ? '':'?'.$qu; $ua = linkex::get( 'agent', $params, $config->linkbotagent ); $h = array(); $h[]= linkex::get( 'method', $params, 'GET' ).' '.$pa.' HTTP/1.0'; $h[]= 'Host: '.$ho; $h[]= 'User-Agent: '.$ua; $h[]= 'Connection: close'; if ( linkex::get( 'method', $params, 'GET' ) == 'POST' && strlen( linkex::get( 'data', $params, '' ) ) > 0 ) { $h[]= 'Content-Length: '.strlen( linkex::get( 'data', $params, '' ) ); $h[] = 'Content-Type: application/x-www-form-urlencoded'; } $header = join( "\r\n", $h ) . "\r\n\r\n"; if ( ( $data = linkex::get( 'data', $params, false ) ) !== false ) { $header .= $data; } $buffer = ''; $fp = @fsockopen ( $ho, $po, $errno, $error, linkex::get( 'timeout', $params, 3 ) ); if ( !$fp ) { return array( 'URL' => $url, 'error' => 'Socket error: '.$error.' ['.$errno.']' ); } else { fputs( $fp, $header ); while( !feof( $fp ) ) { $buffer .= fgets( $fp, 1024 ); } fclose( $fp ); /// buffer holder nu hele resultatet, incl headers etc if ( preg_match( '/^HTTP\/(\d+\.\d+)\s+(\d{3})\s+(.*)/i', $buffer, $res ) === false ) { return array( 'URL' => $url, 'error' => 'Invalid HTTP response ('.substr( $buffer,0,30).')' ); } else { switch ( $res[2] ) { case 200: /// ok /// strip off the headers $res = explode( "\n\n", str_replace( chr( 13 ), '', $buffer ) ); if ( sizeof( $res ) >= 2 ) { $headers = array_shift( $res ); if ( function_exists( 'utf8_encode' ) ) { $contents = utf8_encode( join( "\n\n", $res ) ); } else { $contents = join( "\n\n", $res ); } return array( 'URL' => $url, 'headers' => $headers, 'contents' => $contents ); } else { return array( 'URL' => $url, 'contents' => utf8_encode( $buffer ) ); } break; case 301: case 302: /// maybe redirect? if ( !preg_match( '/location\:\s+(.*)/i', $buffer, $redir ) ) { return array( 'URL' => $url, 'error' => $res[2].' but no redirect' ); } else { $url = $redir[1]; if ( !preg_match( '"^http"i', $url ) ) { $url = 'http://'.$ho.'/'.ltrim( $url, '/' ); } if ( ( $h = @parse_url( $url ) ) === false ) { return array( 'URL' => $url, 'error' => $res[2].' but unparsable URL' ); } else { if ( str_replace( 'www.', '', strtolower( linkex::get( 'host', $h, '' ) ) ) != str_replace( 'www.','', strtolower( $ho ) ) ) { return array( 'URL' => $url, 'error' => $res[2].' but to external site ('.$h{'host'}.')' ); } else { return linkex::fetch( trim( $url ) ); } } } break; default: /// not good return array( 'URL' => $url, 'error' => $res[2].' '.trim( $res[3] ) ); break; } } } } else { return array( 'URL' => $url, 'error' => 'Unparsable URL' ); } } // }}} function fileget( $file, $default=null ) { // {{{ if ( file_exists( $file ) ) { if ( $fp = @fopen( $file, 'r' ) ) { $locked = ( @flock( $fp, LOCK_EX ) ) ? true:false; // $default = fread( $fp, filesize( $file ) ); $default = ''; while ( !feof( $fp ) ) { $default .= fread( $fp, 1024*1024 ); } if ( $locked ) { @flock( $fp, LOCK_UN ); } fclose( $fp ); } } return $default; } // }}} function fileput( $file, $con ) { // {{{ if ( $fp = @fopen( $file, 'w' ) ) { $locked = ( @flock( $fp, LOCK_EX ) ) ? true:false; $default = fwrite( $fp, $con ); //, strlen( $con ) ); if ( $locked ) { @flock( $fp, LOCK_UN ); } @fclose( $fp ); return ( intval( $default ) > 0 ); } else { return false; } } // }}} function flush() { // {{{ echo str_pad('',4096)."\n"; flush(); usleep( 500000 ); } // }}} function genID() { // {{{ $id = linkex::fileget( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR .'uid' ); $id++; linkex::fileput( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR .'uid', $id ) or die( "[Fatal Error: Unable to write to UID file]" ); return $id; } // }}} function get( $key, $array, $default=null ) { // {{{ if ( is_array( $array ) && in_array( $key, array_keys( $array ) ) ) { $default = $array{ $key }; } return $default; } // }}} function getDomain( $var ) { // {{{ $var = strtolower( $var ); if ( ( $pos = strpos( $var, '@' ) ) !== false ) { // Email $domain = substr( $var, $pos + 1 ); } else { // URL $domain = @parse_url( $var ); $domain = linkex::get( 'host', $domain, 'unparseable' ); } return $domain; } // }}} function gethostbyname( $dom, $force=false ) { // {{{ $dom = strtolower( trim( $dom ) ); $data = array(); if ( file_exists( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips' ) && ( $data = linkex::fileget( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips' ) ) && ( $data = linkex::unserialize( $data ) ) ) { if ( ( $force === false ) && ( $ipinfo = linkex::get( $dom, $data, false ) ) !== false && ( time() - linkex::get( 'date', $ipinfo, 0 ) ) < 604800 && ( $ip = linkex::get( 'ip', $ipinfo, false ) ) !== false ) { unset( $data ); return $ip; } } $ip = gethostbyname( $dom ); $data{ $dom } = array( 'date' => time(), 'ip' => $ip ); linkex::fileput( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips', trim( serialize( $data ) ) ); unset( $data ); return $ip; } // }}} function getLinks( $str, $baseurl ) { // {{{ $thisdom = linkex::getDomain( $baseurl ); preg_match_all( "'<\s*a.*>(.*)<\s*/\s*a\s*>'Umis", $str, $res ); $links = array(); for( $i=0; $i' ); } $retval = ''; for($i=$pos+$d;$i0 && $haystack{$i-1} == '\\' ) );$retval.=$haystack{$i}, $i++ ) {} foreach( $end AS $c ) { $retval = str_replace( '\\'.$c, $c, $retval ); } return $retval; } else { return $default; } } /// }}} function glob( $dir, $regex ) { // {{{ $files = array(); if ( $d = @opendir( $dir ) ) { while ( false !== ( $file = readdir( $d ) ) ) { if ( preg_match( '|' . $regex . '|i', $file ) ) { $files[] = $file; } } } return $files; } // }}} function installed() { // {{{ return ( is_dir( BASEDIR . DIRECTORY_SEPARATOR .'data' ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'blacklist' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'links' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'output' . DIRECTORY_SEPARATOR ) ); } // }}} function listfiles( $dir, $ext=array() ) { // {{{ $retval = array(); if ( is_dir( $dir ) ) { if ( $dh = opendir( $dir ) ) { while ( ( $file = readdir( $dh ) ) !== false ) { if ( filetype( rtrim( $dir, DIRECTORY_SEPARATOR ) .DIRECTORY_SEPARATOR. $file ) == 'file' ) { $retval[] = $file; } } } } return $retval; } // }}} function log( $level, $type, $str ) { // {{{ $file = 'linkex.log'; $log = sprintf( "[%s] [level=%d] [%s] %s\n", date( 'Y-m-d H:i:s' ), $level, $type, $str ); $fp = fopen( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . $file, 'a' ); flock( $fp, LOCK_EX ); fwrite( $fp, $log ); fclose( $fp ); } // }}} function map( $fun, $arr ) { // {{{ $retval = array(); foreach( $arr AS $k=>$v ) { $retval[ $k ] = $fun( $v ); } return $retval; } // }}} function mail( $to, $sub, $body ) { // {{{ global $config; $headers = array(); $headers[] = 'X-Mailer: LinkEX/20071229'; if ( strlen( $config->email ) > 0 ) { $headers[] = sprintf( 'From: LinkEX @ %s <%s>', linkex::get( 'HTTP_HOST', $_SERVER, linkex::getdomain( $config->url ) ), $config->email ); $headers[] = sprintf( 'Reply-To: %s', $config->email ); } return mail( $to, $sub, $body, join( "\r\n", $headers ) ); } // }}} function redirect( $url, $code=301 ) { // {{{ $resp = array( 301 => 'HTTP/1.1 301 Moved Permanently', 404 => 'HTTP/1.1 404 Not Found' ); if ( ( $resp = linkex::get( $code, $resp, false ) ) !== false ) { header( $resp ); } header( 'location: '.$url ); exit; } // }}} function selector( $name, $list, $selected=null, $multiple=true, $forcetype=null, $extra=null, $sep='
' ) { /// {{{ $type = ( $multiple ) ? 'checkbox':'radio'; $type = ( sizeof( $list ) > 5 ) ? 'select':$type; if ( $forcetype && in_array( $forcetype, array( 'checkbox', 'radio', 'select' ) ) ) { $type = $forcetype; } $extra['class'] = $type.' '.linkex::get( 'class', $extra, '' ); if ( $extra ) { $buffer=array(); foreach( $extra AS $k=>$v ) { $buffer[] = sprintf( '%s="%s"', $k, $v ); } $extra=' '.join( ' ', $buffer ); } else { $extra=''; } $formname = ( $multiple ) ? $name.'[]' : $name; $buffer = ''; if ( $type == 'select' ) { $buffer .= sprintf( ' %s%s', $formname, $id, ($ck)?' checked="checked"':'', $extra, $txt, $sep ); } elseif ( $type == 'radio' ) { $buffer .= sprintf( '%s', $formname, $id, ($ck)?' checked="checked"':'', $extra, $txt, $sep ); } } if ( $type == 'select' ) { $buffer .= ''; } return $buffer; } /// }}} function serialize( $val ) { // {{{ return serialize( $val ); } // }}} function sort( &$array, $field, $order='desc' ) { // {{{ if ( $field == 'random' ) { shuffle( $array ); } else { $GLOBALS['sortby'] = $field; usort( $array, array( 'linkex', 'usort' ) ); if ( $order == 'desc' ) { $array = array_reverse( $array ); } } } // }}} function stripcomments( $con ) { // {{{ $con = preg_replace( '||Umis', '', $con ); $con = preg_replace( '||Umis', '', $con ); $con = preg_replace( '||Umis', '', $con ); return $con; } // }}} function substr( $str, $len, $pad='..' ) { // {{{ if ( strlen( $str ) > $len ) { return substr( $str, 0, $len - strlen( $pad ) ) . $pad; } else { return $str; } } // }}} function truncate( $str, $len, $txt='..' ) { // {{{ if ( strlen( $str ) > ( $len-strlen( $txt ) ) ) { return substr( $str, 0, $len-strlen( $txt ) ).$txt; } else { return $str; } } // }}} function unserialize( $str ) { // {{{ $retval = @unserialize( $str ); if ( $retval !== false ) { return $retval; } else { // Attempt to fix it $str = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", trim( $str ) ); $retval = @unserialize( $str ); if ( $retval !== false ) { return $retval; } else { echo '[Fatal error in linkex::unserialize( "'. $str .'" )]'; } } } // }}} function usort( $a, $b ) { // {{{ if ( isset( $GLOBALS['sortby'] ) && strlen( $GLOBALS['sortby'] ) > 0 ) { $f = $GLOBALS['sortby']; if ( is_object( $a ) && isset( $a->$f ) ) { $aa = $a->$f; } else if ( is_array( $a ) && isset( $a[$f] ) ) { $aa = $a[$f]; } else { $aa = $a; } if ( is_object( $b ) && isset( $b->$f ) ) { $bb = $b->$f; } else if ( is_array( $b ) && isset( $b[$f] ) ) { $bb = $b[$f]; } else { $bb = $b; } switch( $f ) { case 'rdomip': $aa = sprintf( '%u', ip2long( $aa ) ); $bb = sprintf( '%u', ip2long( $bb ) ); break; case 'rdom': $aa = str_replace( 'www.', '', strtolower( $aa ) ); $bb = str_replace( 'www.', '', strtolower( $bb ) ); break; case 'anchor': $aa = strtolower( $aa ); $bb = strtolower( $bb ); break; } if ($aa == $bb) { return 0; } return ($aa < $bb) ? -1 : 1; } else { return 0; } } // }}} function verifybacklinks( $ids=array(), $callback=null ) { // {{{ global $config; $retval = array( 'starttime' => time(), 'links' => array(), 'categories' => array() ); foreach( $ids AS $id ) { $l = new link( $id ); $l->updateIPs(); $buffer = array( 'action' => 'link', 'id' => $l->id, 'rdom' => $l->rdom, 'rdomip' => $l->rdomip, 'rurl' => $l->rurl, 'skipcheck' => $l->skipcheck, 'skippagerank' => $l->skippagerank, 'minpagerank' => ( $l->minpagerank != -1 ) ? $l->minpagerank : $config->minpagerank, 'oldstatus' => $l->status, 'oldpagerank' => $l->pagerank ); if ( $l->skipcheck == 0 ) { $pr = $l->getPageRank(); $buffer{'res'} = $l->hasBacklink(); $buffer{'code'} = ( !is_string( linkex::get( 'reason', $buffer{'res'}, null ) ) ) ? '200 OK' : $l->laststatus; if ( $l->status != 4 ) { $l->status = ( ( $pr >= ( ( $l->minpagerank != -1 ) ? $l->minpagerank : $config->minpagerank ) ) && ( linkex::get( 'res', $buffer{'res'}, -1 ) == 0 ) ) ? 1:2; } $l->save( false ); } $buffer{'status'} = $l->status; $buffer{'pagerank'} = $l->pagerank; $retval{'links'}[] = $buffer; unset( $l ); if ( $callback != null && function_exists( $callback ) ) { call_user_func( $callback, $buffer ); } unset( $buffer ); } // Rebuild categories $categories = linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ); foreach( $categories AS $cid ) { $c = new category( $cid ); $c->generate(); $buffer = array( 'action' => 'category', 'id' => $cid, 'name' => $c->name ); $retval{'categories'}[] = $buffer; unset( $c ); if ( $callback != null && function_exists( $callback ) ) { call_user_func( $callback, $buffer ); } unset( $buffer ); } $retval{'endtime'} = time(); return $retval; } // }}} function sum( $array = array() ) { // {{{ $retval = 0; foreach( $array AS $a ) { $retval += $a; } return $retval; } // }}} function yesno( $val ) { // {{{ return ( $val ) ? 'Yes':'No'; } // }}} } class template { function about() { // {{{ global $config; if ( LOGGEDIN ) { $phpver = phpversion(); $zendver = zend_version(); $uname = php_uname( 's r' ); $du = round( linkex::du( BASEDIR . DIRECTORY_SEPARATOR . 'data' ) / 1024, 2 ).'KB'; $links = sizeof( linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'links' . DIRECTORY_SEPARATOR ) ); $installdate = date( $config->dateformat, $config->installdate ); if ( function_exists( 'gd_info' ) ) { $gd = gd_info(); $gd = sprintf( '%s - GIF Support: %s', $gd{'GD Version'}, ( ( $gd{'GIF Create Support'} ) ? 'enabled':'unsupported, using plain text for CAPTCHA if used' ) ); } else { $gd = 'Not installed, using plain text for CAPTCHA if used.'; } echo "
\n\t
\n\t\tServer info\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
PHP version:{$phpver}
Zend version:{$zendver}
GD Info:{$gd}
Server OS:{$uname}
\n\t
\n
\n\n
\n\t
\n\t\tLinkEX info\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
LinkEX version:20071229
Current version: (Force upgrade)
Database size:{$du}
Links:{$links}
Install date:{$installdate}
\n\t
\n
\n\n\n\n"; } else { echo "
\n\tPowered by LinkEX\n\t
\n\t\tThis site is powered by LinkEX, a free script that will take care of accepting link exchange requests, \n\t\tand, if needed, making sure a link back is present.
\n\t\t
\n\t\tIf you run a website, you can have this script also. Head over to linkex.dk, \n\t\tand get your free copy.
\n\t\t
\n\t\t
Features
\n\t\t
    \n\t\t\t
  • Free! This script is free. No hidden fees, no nothing.
  • \n\t\t\t
  • Easy to install - upload 1 (one) file, fill out the basic settings, and you are good to go.
  • \n\t\t\t
  • One click updates. Update the script, just by a single click. The script will fetch the latest release, install it, making sure you are up to date at all times.
  • \n\t\t\t
  • Advancend link robot. You choose what sites to check for backlinks, and the bot will make sure the link is present.
  • \n\t\t\t
  • Google PageRank™ check. The script will show you the PageRank™ of all your link partners.
  • \n\t\t\t
  • And much much more..
  • \n\t\t
\n\t\tHead over to linkex.dk to read more\n\t
\n
\n"; } } // }}} function footer() { // {{{ return "\t\t\t\n\t\t\t
\n\t\t\t\tv.20071229 © linkex.dk 2006-2007\n\t\t\t
\n\t\t\n\t
Download Mp3/Mp3 MusicTop Chartsdownload R.E.M. music lyricdownload Leona Lewis music lyricdownload Portishead music lyricdownload Iron Maiden music lyricdownload Led Zeppelin music lyricdownload Beth Rowley music lyricdownload Mariah Carey music lyricdownload Bruce Springsteen music lyricdownload AC/DC music lyricdownload Linkin Park music lyricdownload OneRepublic music lyricdownload Bob Dylan music lyricdownload Metallica music lyricdownload The Who music lyricdownload Rihanna music lyricdownload Al Green music lyricdownload The Kooks music lyricdownload U2 music lyricdownload David Bowie music lyricdownload Prince music lyricdownload Alanis Morissette music lyricdownload Putumayo music lyricdownload Elvis Presley music lyricdownload Willie Nelson music lyricdownload Jon Bon Jovi music lyriclogysis

logysis

age loredo tonneau

loredo tonneau

could locksmith imperial beach ca

locksmith imperial beach ca

shall loes tree

loes tree

wear lowe fs175

lowe fs175

joy loreal discontinued lipstick aerial

loreal discontinued lipstick aerial

common low velocity phasic flow

low velocity phasic flow

lie linno wagner

linno wagner

dress lovesick blues and patsy cline

lovesick blues and patsy cline

spoke long skirts italy shop online

long skirts italy shop online

floor louis pasteur the germ theory

louis pasteur the germ theory

better looking for arlene cline

looking for arlene cline

gas linway plaza cinema

linway plaza cinema

draw loft condos in milwaukee wi

loft condos in milwaukee wi

build lipizzan er

lipizzan er

grass low growing euonymus

low growing euonymus

spot louise moitra

louise moitra

begin literature ideas for boxcar children book

literature ideas for boxcar children book

seat lipodissolve smartlipo laser assisted body sculpting

lipodissolve smartlipo laser assisted body sculpting

strong lolia mpeg

lolia mpeg

row littlestown pa obituaries

littlestown pa obituaries

soon llm slide show fall

llm slide show fall

crease lindsay hudyma

lindsay hudyma

course loni postlethwaite

loni postlethwaite

school lowell obsevatory

lowell obsevatory

buy louie krogman horses

louie krogman horses

light lowes cad drawings

lowes cad drawings

count lipid emulsion purchase

lipid emulsion purchase

substance livejournal microbot

livejournal microbot

solve lord gainford picture

lord gainford picture

moment lollipop bouquet hand held

lollipop bouquet hand held

am loguestbook loita

loguestbook loita

buy loretta komora

loretta komora

seat lotion supplies balk raw shea butter

lotion supplies balk raw shea butter

middle loretta jean mullins oregon

loretta jean mullins oregon

single linnea lewis minnesota

linnea lewis minnesota

I lloyed alexander

lloyed alexander

pretty little april porm

little april porm

lady lisa champagne new bedford massachusetts

lisa champagne new bedford massachusetts

any liver specialist winnipeg

liver specialist winnipeg

usual lisa glarner

lisa glarner

hair lord sabaoth

lord sabaoth

made lindora protein day

lindora protein day

feel llewellen astrology databank

llewellen astrology databank

question longneck giraffe tribe burmese

longneck giraffe tribe burmese

round lotr rotwk patch

lotr rotwk patch

white lottery budy

lottery budy

value lorette genealogy

lorette genealogy

able lobelia medicinal properties

lobelia medicinal properties

success lombardos core drilling

lombardos core drilling

fire lord s 2732 12th street

lord s 2732 12th street

as loreal vive pro for men anti dandruff

loreal vive pro for men anti dandruff

hundred little tikes giant slide

little tikes giant slide

such lorelei s bedroom

lorelei s bedroom

hat lori musselman

lori musselman

life lisa cummuta

lisa cummuta

chair llive abroad

llive abroad

close lorain national bank online banking

lorain national bank online banking

rail low sugar gooey butter cake

low sugar gooey butter cake

subtract littleton colorado new homes waterton canyon

littleton colorado new homes waterton canyon

raise longjon

longjon

yellow linens morracan tables

linens morracan tables

rail lititz pa rotary craft show

lititz pa rotary craft show

mountain lower cholestrol guacamole

lower cholestrol guacamole

else lotions to slow hair growth

lotions to slow hair growth

start london assembly seething lane gherkin

london assembly seething lane gherkin

check low tempature boneless rib roast

low tempature boneless rib roast

snow louisa franklyn

louisa franklyn

wrong litepanels 1x1 5600

litepanels 1x1 5600

unit lovenox teaching

lovenox teaching

child lindsey acor

lindsey acor

numeral lisa moye myspace

lisa moye myspace

was little augie rios

little augie rios

complete loincloths with built in thon

loincloths with built in thon

with lori fulkerson arizona

lori fulkerson arizona

kill linnon

linnon

perhaps lister hosptial uk

lister hosptial uk

condition longnecks bar in wilder ky

longnecks bar in wilder ky

hot louisiana technical college shooting

louisiana technical college shooting

learn lm311 voltage comparator circuit

lm311 voltage comparator circuit

wrong louisiana improted goods

louisiana improted goods

string lisa montag brotman

lisa montag brotman

build linn county oregon portal framing

linn county oregon portal framing

area lompat tinggi

lompat tinggi

string lovegames

lovegames

broad low cost 380 automatic pistol manufacturers

low cost 380 automatic pistol manufacturers

flower literary criticism on beth gutcheon

literary criticism on beth gutcheon

need liskeard grammar school

liskeard grammar school

grass llbean outlet seconds

llbean outlet seconds

make lovenox teaching

lovenox teaching

top lodge 5 qt chicken fryer

lodge 5 qt chicken fryer

heart longfellow s work sail union

longfellow s work sail union

whose lindsay milhoan

lindsay milhoan

fight lisa d angelo trenton

lisa d angelo trenton

busy lisa knode

lisa knode

time loudenville ohio bed and breakfast

loudenville ohio bed and breakfast

about lisa berente

lisa berente

wave logan nibert

logan nibert

room locking corset chastity belt

locking corset chastity belt

horse lorion pronounced

lorion pronounced

nothing loren paglia nevada

loren paglia nevada

short littlest pet shop punkiest

littlest pet shop punkiest

seed local procurement of food cornwall bbc

local procurement of food cornwall bbc

family looking for afrocentric schools

looking for afrocentric schools

own lisa albrecht minnesota

lisa albrecht minnesota

course liquid paper gillette

liquid paper gillette

dog listen to songs by xscape

listen to songs by xscape

joy linwood ambulance service

linwood ambulance service

size lodge orthopedic appointment phone number

lodge orthopedic appointment phone number

always lotr quis

lotr quis

began lolly bouquet

lolly bouquet

form louisiana dhh bed utilization

louisiana dhh bed utilization

wrong linux continual ping

linux continual ping

exercise littman master cardiology stethescope replacement tubing

littman master cardiology stethescope replacement tubing

event local cubscout overnighters

local cubscout overnighters

current loadbearing bulletproof vest

loadbearing bulletproof vest

had lockheed martin logistics cherry hill office

lockheed martin logistics cherry hill office

sea los humeros volcano height

los humeros volcano height

street little boomie wines

little boomie wines

pay louis allis tachometer

louis allis tachometer

horse littlewoods omaha hi lo

littlewoods omaha hi lo

two loan express san marcos texas

loan express san marcos texas

object lorie harden

lorie harden

since lord of illusions bald cultists scene

lord of illusions bald cultists scene

call little shop of horrors script rental

little shop of horrors script rental

hundred lined crocks shoes

lined crocks shoes

soft little darling preschool bellingham

little darling preschool bellingham

horse live web cam of kotzebue alaska

live web cam of kotzebue alaska

either lori loughlin recent

lori loughlin recent

except low qrs voltage pathophysiology

low qrs voltage pathophysiology

perhaps live tilapia for sale in ky

live tilapia for sale in ky

lot lopin slow

lopin slow

hunt lisa coryell hun school nj

lisa coryell hun school nj

power local 11 opeiu master plan document

local 11 opeiu master plan document

pass little anglis

little anglis

until lou yusi

lou yusi

eat locksets with 3 1 4 backset

locksets with 3 1 4 backset

went liver swollen stomach ache over 50

liver swollen stomach ache over 50

plant lisa banuelos wi

lisa banuelos wi

wish lot 21 section 3 whalehead club

lot 21 section 3 whalehead club

spoke live feeder mice online

live feeder mice online

leave log cabin kit logs for sale

log cabin kit logs for sale

this lorenz stereo cabinet

lorenz stereo cabinet

cloud load handler double bed mat

load handler double bed mat

word lingerie culotte l enfant

lingerie culotte l enfant

hit los fresnos and independent school district

los fresnos and independent school district

person loosing virginity videos

loosing virginity videos

back loreto grammar school altrincham

loreto grammar school altrincham

final loestrin24fe price

loestrin24fe price

long lititz art festival

lititz art festival

add loretta lynn motocross results

loretta lynn motocross results

after lori chalupy

lori chalupy

evening log cabin floor plans minnesota

log cabin floor plans minnesota

lay lister dodgeball

lister dodgeball

made lokey metals

lokey metals

half lithium polyphonic spree

lithium polyphonic spree

mass lord and lass restaurant berkeley marina

lord and lass restaurant berkeley marina

how lori davis bus

lori davis bus

once lopaka putter

lopaka putter

system literate perversions

literate perversions

think lori karpf

lori karpf

element lobsterman face whale lawsuit

lobsterman face whale lawsuit

fish little isidore and the inquisitors

little isidore and the inquisitors

sure liquor airbag

liquor airbag

level literature units and ramona the brave

literature units and ramona the brave

eye long realty prescott valley az

long realty prescott valley az

mass lindsey wagner odessa texas

lindsey wagner odessa texas

give lori harmon actress

lori harmon actress

round lowe s tilton nh

lowe s tilton nh

fine lonnie s creation

lonnie s creation

particular lorinda carol lee

lorinda carol lee

about lori ahrens

lori ahrens

several linux sneakernet install dependancies

linux sneakernet install dependancies

correct linea rail pull 13 inches

linea rail pull 13 inches

after logoff yahoo messenger delay

logoff yahoo messenger delay

with liquid generation mario amp luigi

liquid generation mario amp luigi

want lingam massage therapists

lingam massage therapists

soft longhorn livestock for sale

longhorn livestock for sale

never listing of 5013c groups

listing of 5013c groups

past lisa chan reflexology

lisa chan reflexology

charge lipstick shade jerico

lipstick shade jerico

west lindy rigging trout

lindy rigging trout

excite loft palm springs downtown

loft palm springs downtown

right lovey craig jones

lovey craig jones

ear lisa jackson naniamo bc

lisa jackson naniamo bc

insect loran c transmitter sites

loran c transmitter sites

north lingering christmas spirit

lingering christmas spirit

station lisha kill gardens

lisha kill gardens

add lingerie chest mahogany

lingerie chest mahogany

create louve art mona lisa

louve art mona lisa

spoke liquid lick tanks

liquid lick tanks

speech loris thumbs

loris thumbs

either lowboy rental

lowboy rental

bright list beep error codes photon

list beep error codes photon

please lombardo auto sales ohio

lombardo auto sales ohio

example lockheed martin frozen traditional pension plans

lockheed martin frozen traditional pension plans

find lindsay sotero

lindsay sotero

fill liska auctioneer

liska auctioneer

quart lisa fry beale afb california

lisa fry beale afb california

set lori puhala

lori puhala

beauty louisiana bar exam misconduct taking

louisiana bar exam misconduct taking

short londe pronounced

londe pronounced

apple lisa leco

lisa leco

mountain lluvia skin care

lluvia skin care

tire losur shirt

losur shirt

human lori casillas colorado

lori casillas colorado

second loto6 49

loto6 49

direct ling louis northfiled

ling louis northfiled

dictionary lodging in radcliff ky

lodging in radcliff ky

spend londesborough ontario

londesborough ontario

crop louis e mccomas said

louis e mccomas said

final lodge afghan and pillow

lodge afghan and pillow

music lloyd harlin polite

lloyd harlin polite

took lottie burley

lottie burley

lay lowes motocross

lowes motocross

together ll bean outlet store syracuse ny

ll bean outlet store syracuse ny

difficult listen to the flute d amour online

listen to the flute d amour online

on lopi travis wood stoves

lopi travis wood stoves

bring longitude swimwear company

longitude swimwear company

whole logest river

logest river

pattern litespeed demo bicycle sale

litespeed demo bicycle sale

grew local artists kodiak alaska

local artists kodiak alaska

moment listen to mryna summers songs

listen to mryna summers songs

well line 6 pedal board bag

line 6 pedal board bag

silver lindy krzyzewski

lindy krzyzewski

record listino tondo ferro

listino tondo ferro

look longwood csd

longwood csd

to low carb kefir

low carb kefir

need louis a wiltz said

louis a wiltz said

winter lirr diesels

lirr diesels

among linens and things north charleston sc

linens and things north charleston sc

read loiderman soltesz maryland

loiderman soltesz maryland

tall lowell thorson

lowell thorson

keep lotr captain pet upgrade

lotr captain pet upgrade

general lipton toyota scion of fortlauderdale florida

lipton toyota scion of fortlauderdale florida

light little sadie art of virtue

little sadie art of virtue

mountain longford homes albuquerque

longford homes albuquerque

tree ling loft condo in mexico beach

ling loft condo in mexico beach

these little wonder hedgeclippers maintenance oil

little wonder hedgeclippers maintenance oil

very liu derun

liu derun

surface lithia springs ga ged testing

lithia springs ga ged testing

steel live warmng

live warmng

settle little indian chief britches

little indian chief britches

wife loads for muzzle loader 54

loads for muzzle loader 54

unit lohn and angermunde

lohn and angermunde

element liveoak pronounced

liveoak pronounced

track linwood groves jeannette

linwood groves jeannette

end lombardi s cucina ballard

lombardi s cucina ballard

general little tykes store oklahoma city ok

little tykes store oklahoma city ok

section lorinzer wheels

lorinzer wheels

morning lonomea

lonomea

final lobster fest san perdo

lobster fest san perdo

atom lisa garrett danville

lisa garrett danville

them little witch fourm

little witch fourm

seven louise valerie rochfort

louise valerie rochfort

energy lisa ly myspace

lisa ly myspace

steam louis roederer crystal champagne london

louis roederer crystal champagne london

stone long term use of vitrix

long term use of vitrix

necessary loew cornell tote bag

loew cornell tote bag

protect lindsey elgin ok

lindsey elgin ok

choose lindt lindor ingredients

lindt lindor ingredients

history lorimer 1981

lorimer 1981

group louis vuitton replica multicolor

louis vuitton replica multicolor

noon lotocatalunya

lotocatalunya

view louvers 2500 cu ft min

louvers 2500 cu ft min

electric locksmith apprentice training

locksmith apprentice training

arrive lord oliver tax vat

lord oliver tax vat

gas lisa tamura hawaii

lisa tamura hawaii

card lisa rinna shag hairstyle

lisa rinna shag hairstyle

moon low intermediate advanced trivia questions

low intermediate advanced trivia questions

even lori leiter

lori leiter

certain livedo pattern

livedo pattern

particular live satellite pic of wyoming il

live satellite pic of wyoming il

skill live foal video satin

live foal video satin

word lonzo sharp

lonzo sharp

equate lista katynska

lista katynska

block lothar kreyssig poland

lothar kreyssig poland

stop longbottom coffee

longbottom coffee

when longaberger heisey

longaberger heisey

gas lokis trickster

lokis trickster

side lotto nsw tv

lotto nsw tv

scale linnell motel

linnell motel

equal liquor store locator new jersey

liquor store locator new jersey

column loanhead miners

loanhead miners

mile loflin buckets

loflin buckets

with lorann vanilla extract

lorann vanilla extract

reason litterati

litterati

problem live search club flexicon

live search club flexicon

clean longhorns restaurant in williston vt

longhorns restaurant in williston vt

whole louis poulsen ph artichoke pendant

louis poulsen ph artichoke pendant

scale long term effects of excedrin

long term effects of excedrin

verb loiselle hatfield

loiselle hatfield

speed lovergirl lyrics

lovergirl lyrics

word lombardo football field soil korea

lombardo football field soil korea

except litetouch service ct

litetouch service ct

head lisa todd cleavage

lisa todd cleavage

see louisiana police choudrant phone number

louisiana police choudrant phone number

winter lori boniface

lori boniface

sight linginfelter

linginfelter

govern lirtzman survey

lirtzman survey

way little phatty craigslist

little phatty craigslist

long los osos sewer website

los osos sewer website

surprise lisa berbig

lisa berbig

necessary littlest pet shop lps collectible tin

littlest pet shop lps collectible tin

land logo universidad de talca

logo universidad de talca

bought lisa cerasoli

lisa cerasoli

felt lladro harvester man

lladro harvester man

large lindsay lozan

lindsay lozan

at liquore noccioli nespole ricetta

liquore noccioli nespole ricetta

slip lockport wine and liquor outlet

lockport wine and liquor outlet

wave lower bruel sd

lower bruel sd

enter loran r buhler

loran r buhler

cause lindhaus vacuum parts

lindhaus vacuum parts

found liryc writing

liryc writing

hole locksmith binghamton

locksmith binghamton

where linear programming resumen

linear programming resumen

east lovenox lump

lovenox lump

crop lindy batte

lindy batte

range lobster pound trenton

lobster pound trenton

here lonnie johnson the invented

lonnie johnson the invented

though london gatwick to cork flights

london gatwick to cork flights

done lowe tahiti 220

lowe tahiti 220

enemy listen to colt 45 afrman

listen to colt 45 afrman

block lolto

lolto

mix louise buhrmann md winter park fl

louise buhrmann md winter park fl

bird lisa a scales hamilton nj

lisa a scales hamilton nj

period liquid menstruum

liquid menstruum

door lisa jenkins miller winnemucca nevada

lisa jenkins miller winnemucca nevada

morning loraine county ohio recorder

loraine county ohio recorder

add longs drug pleasanton

longs drug pleasanton

one lorita white

lorita white

go lolp

lolp

never listing of k2 vintage skis

listing of k2 vintage skis

look loituma leva s polka basshunter remix dl

loituma leva s polka basshunter remix dl

control lisa black newcastle

lisa black newcastle

floor logic 3 i station traveller uk

logic 3 i station traveller uk

idea lorael

lorael

master lonnie lee palma ceia golf club

lonnie lee palma ceia golf club

verb liquore verme

liquore verme

pitch llednar

llednar

coat low cholesterol receipe

low cholesterol receipe

neighbor loganville ga pd

loganville ga pd

valley lippman goldman rugby

lippman goldman rugby

climb lloyd triestino america corp

lloyd triestino america corp

lie loma linda water intake

loma linda water intake

office lorain county savings trust

lorain county savings trust

join loliita

loliita

claim loula b watkins arkansas

loula b watkins arkansas

molecule linsey fabrics

linsey fabrics

high lorilyn adams

lorilyn adams

far lower valance for 66 mustang

lower valance for 66 mustang

yellow lissencephaly syndrome

lissencephaly syndrome

ask liquid frisket

liquid frisket

every lomanco electric motors

lomanco electric motors

ten liqourland

liqourland

left load logs on trailer ramps winch

load logs on trailer ramps winch

blue listen to blaster bates

listen to blaster bates

listen louisville tpx catcher gloves

louisville tpx catcher gloves

gentle long horn saloon san antonio

long horn saloon san antonio

him lipoma of the spermatic cord surgery

lipoma of the spermatic cord surgery

present loudon county virginia oncologists

loudon county virginia oncologists

main lobo ontario canada aerial map

lobo ontario canada aerial map

the local miltf

local miltf

new lise meithner

lise meithner

skill log home builder in barriere

log home builder in barriere

cry long range power multihull

long range power multihull

must lori portales msw

lori portales msw

teeth lisa plauche

lisa plauche

continue liquorice extract powder

liquorice extract powder

to linksys nslu2 reset factory default defaults

linksys nslu2 reset factory default defaults

and lonke

lonke

listen lisa bergin and robotics

lisa bergin and robotics

sail louise forsling

louise forsling

human lisa bedal

lisa bedal

hold loufah gourd

loufah gourd

air louisville adirondack furniture

louisville adirondack furniture

nothing local democratic party for mukilteo

local democratic party for mukilteo

repeat lodyne b 402

lodyne b 402

often listen to kendall payne

listen to kendall payne

press lorance iway 250 gps review

lorance iway 250 gps review

safe lindt lindor white chocolate

lindt lindor white chocolate

sudden lobero theatre santa barbara ca

lobero theatre santa barbara ca

stay literature review for capstone project

literature review for capstone project

summer lisa hughes wbz

lisa hughes wbz

leg low profile press fit hose clamp

low profile press fit hose clamp

question long valley u10 rage

long valley u10 rage

through lladro gemini

lladro gemini

picture lori j kalmbach

lori j kalmbach

degree lledo canada

lledo canada

next lite on semiconductor image business group lenovo

lite on semiconductor image business group lenovo

wire lower urubamba lodge

lower urubamba lodge

no lower abdominal excercise

lower abdominal excercise

quick lisa hoeft wisconsin

lisa hoeft wisconsin

poor low grade fever after total hysterectomy

low grade fever after total hysterectomy

slip lowcountry vw

lowcountry vw

fair lisa minelli somewere over the raimbow

lisa minelli somewere over the raimbow

test liquidation world yorkton

liquidation world yorkton

character littman cardio stethescope

littman cardio stethescope

true . longitude and latitude rabat morocco

longitude and latitude rabat morocco

imagine list exp lode

list exp lode

bring louisville 10k races

louisville 10k races

sudden lonnie scoggins

lonnie scoggins

double loosing a toenail

loosing a toenail

two
\n\n"; } // }}} function header( $params = array() ) { // {{{ global $errors, $config; $params = array_merge( array( 'menu' => Template::menu(), 'title' => '', 'onload' => '' ), $params ); $error = ''; $cookieIds = "'".join( '\',\'', array_unique( explode( ',', linkex::get( 'fscookie', $_COOKIE, '' ) ) ) )."'"; $charset = isset( $config->charset ) ? $config->charset : 'utf8'; if ( linkex::get( 'noerrors', $params, true ) && sizeof( $errors ) > 0 ) { $error = join( '
', $errors ); $error = "
\n\t
\n\t\tError\n\t\t
\n\t\t\t{$error}\n\t\t
\n\t
\n
\n"; } return "\n\n\t\n\t\t\n\t\tLinkEX » {$params{'title'}}\n\t\t\n\t\t\n\t\n\t\n\t\t
\n\t\t\t
\n\t\t\t\t \n\t\t\t
\n\t\t\t
\n\t\t\t\t

LinkEX

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
    \n\t\t\t\t\t{$params{'menu'}}\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\n\t\t\t\t{$error}\n"; } // }}} function linkdetails() { // {{{ global $config; $url = $config->url; $anchor = $config->anchor; $anchor = $anchor[ mt_rand( 0, sizeof( $anchor )-1 ) ]; $description = $config->description; // {{{ Show the email if ( intval( $config->showemail ) == 1 ) { $email = "\t\t\t\n\t\t\t\tEmail:\n\t\t\t\t{$config->email}\n\t\t\t\t\n\t\t\t\n"; } else { $email = ''; } // }}} return "
\n\t
\n\t\tLinking Details\n\t\t\n{$email}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
URL:{$url}
Site title:{$anchor}
Site description:{$description}
HTML code:
<a href="{$url}" title="{$anchor}">{$anchor}</a>
\n\t
\n
\n"; } // }}} function linkform() { // {{{ global $config; $_POST['email'] = htmlentities( linkex::get( 'email', $_POST, ( (LOGGEDIN)?$config->email:'') ) ); $_POST['lurl'] = htmlentities( linkex::get( 'lurl', $_POST, '' ) ); $_POST['rurl'] = htmlentities( linkex::get( 'rurl', $_POST, '' ) ); $_POST['anchor'] = htmlentities( linkex::get( 'anchor', $_POST, '' ) ); $_POST['description'] = htmlentities( linkex::get( 'description', $_POST, '' ) ); // {{{ Show the recip field if public or loggedin if ( intval( $config->disablerecipfield ) == 0 || intval( $config->samedomain ) == 2 ) { $extra=''; switch( intval( $config->samedomain ) ) { case 1: $extra = 'Must be on the same domain as above'; break; case 2: $extra = 'Must be on a different domain as above'; break; } $recipfield = "\t\t\t\t\n\t\t\t\t\tReciprocal link URL:\n\t\t\t\t\t {$extra}\n\t\t\t\t\t\n\t\t\t\t\n\n"; } else { $recipfield = ''; } // }}} // {{{ Show the categories if loggedin or public if ( ( $cat = linkex::get( 'categories', $_REQUEST, false ) ) !== false ) { if ( !is_array( $cat ) ) { $cat = linkex::map( 'trim', explode( ',', $cat ) ); } } else { $cat = $config->defaultcategories; } if ( intval( $config->publiccategories ) == 1 || LOGGEDIN ) { $categories = linkex::categories( LOGGEDIN ); $cats = array(); foreach( $categories AS $cid=>$name ) { $cats[] = new Category( $cid ); } $categories = $cats; unset( $cats ); linkex::sort( $categories, 'name', 'asc' ); $cats = array(); foreach( $categories AS $c ) { $cats{ $c->id } = $c->name; } $categories = $cats; unset( $cats ); $categories = linkex::selector( 'categories', $categories, linkex::get( 'categories', $_POST, $cat ), LOGGEDIN, null, array( 'style' => 'width:auto;max-width:300px;' ) ); $categories = "\t\t\t\t\n\t\t\t\t\tCategory:\n\t\t\t\t\t{$categories}\n\t\t\t\t\t\n\t\t\t\t\n\n"; } else { $categories = ''; } // }}} // {{{ CAPTCHA html tag put into => $captcha (the class will know weathe to use img or html if ( intval( $config->usecaptcha ) == 1 ) { $c = new captcha; $captchatag = $c->html(); $captcha = "\t\t\t\t\n\t\t\t\t\tSpam check:\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
{$captchatag}
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n"; } else { $captcha = ''; } // }}} if ( LOGGEDIN ) { $skipbacklinkcheck = linkex::checkbox( linkex::get( 'skipbacklinkcheck', $_POST, 0 ) ); $skippagerank = linkex::checkbox( linkex::get( 'skippagerank', $_POST, 0 ) ); $skipblacklist = linkex::checkbox( linkex::get( 'skipblacklist', $_POST, 0 ) ); $skiplengths = linkex::checkbox( linkex::get( 'skiplengths', $_POST, 0 ) ); $skipdupes = linkex::checkbox( linkex::get( 'skipdupes', $_POST, 0 ) ); $adminoptions = "\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t
Since you are logged in, you have additional options:\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n"; } else { $adminoptions = ''; } // Lengths $titlelength = ( $config->titlelength > 0 ) ? ( 'max. '.$config->titlelength.' '.(( $config->titlelengthtype == 'w' )?'words':'characters' )) : ''; $descriptionlength = ( $config->descriptionlength > 0 ) ? ( 'max. '.$config->descriptionlength.' '.(( $config->descriptionlengthtype == 'w' )?'words':'characters' )) : ''; return "
\n\t
\n\t\tLinking Details\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n{$recipfield}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n{$captcha}\n{$categories}\n{$adminoptions}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
Site title: {$titlelength}
Your URL:
Your email:
Site description: {$descriptionlength}

\n\t\t
\n\t
\n
\n"; } // }}} function menu() { // {{{ if ( linkex::installed() ) { if ( defined( 'LOGGEDIN' ) && LOGGEDIN ) { $menu = "\t\t\t\t
  • » Add link
  • \n\t\t\t\t
  • » Home
  • \n\t\t\t\t
  • » Tools
  • \n\t\t\t\t
  • » Categories
  • \n\t\t\t\t
  • » Blacklist
  • \n\t\t\t\t
  • » Settings
  • \n\t\t\t\t
  • » Log out
  • \n\t\t\t\t
  • » About
  • \n"; } else { $menu = "\t\t\t\t
  • » Add link
  • \n\t\t\t\t
  • » Admin
  • \n\t\t\t\t
  • » About
  • \n\t\t\t\t\n"; } } else { $menu = ' '; } return $menu; } // }}} function navigation( $start, $pages, $uri ) { // {{{ $retval = ''; if ( $pages > 1 ) { if ( $start > 1 ) { $retval .= "« prev"; } else { $retval .= "« prev"; } for( $i=1; $i<=$pages; $i++ ) { $retval .= " "; if ( $i == $start ) { $retval .= ''. $i .''; } else { $retval .= "".$i.""; } } $retval .= " "; if ( $start < $pages ) { $retval .= "next »"; } else { $retval .= "next »"; } } return $retval; } // }}} function pagerank( $pr ) { // {{{ $pr = max( min( intval( $pr ), 10 ), 0 ); $perc = $pr * 10; return "\n\t\n\t\t\n\t\t\n\t\n
    \n\t\t\t
    \n\t\t\t\t
     
    \n\t\t\t
    \n\t\t
    {$pr}
    \n"; } // }}} function progress( $progress ) { // {{{ echo "\n"; linkex::flush(); } // }}} function report( $report ) { // {{{ $startdate = date( 'Y-m-d H:i:s', $report{'starttime'} ); $enddate = date( 'Y-m-d H:i:s', $report{'endtime'} ); $elapsed = linkex::elapsed( $report{'endtime'} - $report{'starttime'} ); $elapsed = $elapsed{'nice'}; $sp = "% 6s % -20s % -15s % 6s => % -10s % 10s => % -10s\n"; $links = sprintf( $sp, 'ID', 'Domain', 'IP', 'Old PR', 'New PR', 'Old Status', 'New status' ) . "==========================================================================================\n"; foreach( $report{'links'} AS $data ) { $links .= sprintf( $sp, $data{'id'}, linkex::truncate( $data{'rdom'}, 20 ), $data{'rdomip'}, $data{'oldpagerank'}, $data{'pagerank'}, link::statusOptions( $data{'oldstatus'} ), link::statusOptions( $data{'status'} ) ); } $sp = "% 6s % -20s % -10s\n"; $categories = sprintf( $sp, 'ID', 'Name', 'Status' ) . "==========================================================================================\n"; foreach( $report{'categories'} AS $data ) { $categories .= sprintf( $sp, $data{'id'}, linkex::truncate( $data{'name'}, 20 ), 'done' ); } return "LinkEX verification output.\n===========================\n\nverification started on: {$startdate}\nverification ended on: {$enddate}\nverification elapsed: {$elapsed}\n\n* Verifying backlinks..\n\n{$links}\n\n* Rebuilding categories..\n\n{$categories}\n\n\n"; } // }}} function rules() { // {{{ global $config; $linkback = ( intval( $config->linkbackrequired ) == 1 ) ? 'R'.'equired':'Not r'.'equired'; $minpagerank = template::pagerank( $config->minpagerank ); $rules = linkex::fileget( BASEDIR . DIRECTORY_SEPARA