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 lyricllima honolulu

llima honolulu

motion londa rabon

londa rabon

wife lindisfarne throw

lindisfarne throw

play lithuanian sash patterns

lithuanian sash patterns

bird loggins messina full sail mp3

loggins messina full sail mp3

usual lover s lane novelties

lover s lane novelties

thin looters artifacts mexico

looters artifacts mexico

my little ceasars pizza menu

little ceasars pizza menu

level lourdes hospital in paducah ky

lourdes hospital in paducah ky

face longterm rooms for rent afton virginia

longterm rooms for rent afton virginia

also loungefly key cap

loungefly key cap

fit lowell tims funeral home

lowell tims funeral home

like locost airlines

locost airlines

meat loius patheon beach hotel

loius patheon beach hotel

swim littlehampton museum

littlehampton museum

boy long term effect of concussions

long term effect of concussions

black lordco canada

lordco canada

love lisa shardon

lisa shardon

band line truck for chugger

line truck for chugger

these lordis

lordis

present litchfield county recorder

litchfield county recorder

sing low fat vegetarian entrees

low fat vegetarian entrees

pound listen kerman

listen kerman

car lines skymiles challenge tickets air

lines skymiles challenge tickets air

sure local flavor beer german berlin weisse

local flavor beer german berlin weisse

fight lord gowrie hotel whyalla

lord gowrie hotel whyalla

thank lord baltmore

lord baltmore

wide locust grove v 1 mohawk

locust grove v 1 mohawk

guide lotro ingredients

lotro ingredients

suffix lippia citriodora kunth

lippia citriodora kunth

south local links from mcll

local links from mcll

early lisa lopex

lisa lopex

wheel linn hammergren justicia guatemala

linn hammergren justicia guatemala

new lisa cargile

lisa cargile

seven llincoln

llincoln

human lowenhart br5 rims

lowenhart br5 rims

parent loctite thread restore

loctite thread restore

motion loveworld

loveworld

climb list campsites in newquay

list campsites in newquay

self lois bergmans cnm

lois bergmans cnm

minute lineville caverns

lineville caverns

part loecke real estate

loecke real estate

give llevabamos andando viajes

llevabamos andando viajes

soon loved stones jewelry href accustomed beads

loved stones jewelry href accustomed beads

second low carb food list spanish

low carb food list spanish

vowel lorezca

lorezca

sent liquidation quilted bag

liquidation quilted bag

lake lolly pops myspace layouts

lolly pops myspace layouts

some list of surgeons practises in sudbury

list of surgeons practises in sudbury

mark log cabin whiskey bottle presidential candidate

log cabin whiskey bottle presidential candidate

speak los manos gallery chicago

los manos gallery chicago

three longestlist com

longestlist com

atom little giant ph stabilizer

little giant ph stabilizer

enter liquer stores atco new jersey

liquer stores atco new jersey

main lobodomy

lobodomy

only loudoun county voting guide

loudoun county voting guide

hundred linsay lohan giving head

linsay lohan giving head

shine lisa kay schremp

lisa kay schremp

thousand linnmar

linnmar

learn lodges loch lomond

lodges loch lomond

difficult lois kolkhorst

lois kolkhorst

effect lisa law vegetal

lisa law vegetal

part longmont housing authority

longmont housing authority

surprise longest lasting m t

longest lasting m t

crowd loganview condos chicago

loganview condos chicago

music litehouse

litehouse

consider lotempio brown

lotempio brown

idea litter scoop wire deluxe

litter scoop wire deluxe

mountain liv tylr

liv tylr

break lolly trolley

lolly trolley

our loran women in architecture in australia

loran women in architecture in australia

wood liquid filling barrel loader companys

liquid filling barrel loader companys

back lowdens county schools

lowdens county schools

soft loggerhead valley city ohio

loggerhead valley city ohio

student long pro auto loganville ga

long pro auto loganville ga

pitch little timmy from 2023 email

little timmy from 2023 email

board louis vuitton monogram cherry purse

louis vuitton monogram cherry purse

loud lovenox and coumadin taken together

lovenox and coumadin taken together

basic lorie line storyline book

lorie line storyline book

nothing lisa schaneman

lisa schaneman

smile loucious boyd

loucious boyd

done louis icart etchings for sale

louis icart etchings for sale

west listen to cypress hill and wyclef

listen to cypress hill and wyclef

much linnehan haverhill

linnehan haverhill

record loblaws cat food safe

loblaws cat food safe

corn lions mane mushroom kit

lions mane mushroom kit

appear louise barranger

louise barranger

check local girls age 15 17

local girls age 15 17

spread lithonia amphitheatre

lithonia amphitheatre

month litex fan parts

litex fan parts

continent loreal haircolor preference

loreal haircolor preference

dead louis locsin philippines leonardo locsin

louis locsin philippines leonardo locsin

famous llano gem of the hill country

llano gem of the hill country

necessary lotr bfme rotwk trainer

lotr bfme rotwk trainer

few lisa luttinen

lisa luttinen

big lisa woodhouse facebook

lisa woodhouse facebook

flower long realty kino

long realty kino

spoke literary genres webquest

literary genres webquest

exact lot 20 hibbert township perth county

lot 20 hibbert township perth county

deep lothorien

lothorien

century loreto fish report

loreto fish report

day lisa s hixson

lisa s hixson

won't lleyton hewwitt

lleyton hewwitt

page loraine kelly today models

loraine kelly today models

instrument louisville landrover of st matthews

louisville landrover of st matthews

far lobby loyde the coloured balls

lobby loyde the coloured balls

written loretto tn high

loretto tn high

share littmann master cardiology sale discount

littmann master cardiology sale discount

metal littlebery janes

littlebery janes

write lougehrigs

lougehrigs

section load equilization trailer hitches

load equilization trailer hitches

sit lolo ferrie

lolo ferrie

turn lithuania gluelam

lithuania gluelam

came low cost neutering arlington texas

low cost neutering arlington texas

distant longacre battery alternator disconnect switch

longacre battery alternator disconnect switch

row louisiana home incarceration programs

louisiana home incarceration programs

system lisa capparelli

lisa capparelli

blood lori meese

lori meese

consider lord soth s charge minis

lord soth s charge minis

collect little bunny foo foo printables

little bunny foo foo printables

instant louisiana etoh license

louisiana etoh license

garden lisa marie price acupuncture

lisa marie price acupuncture

red log siding pictures

log siding pictures

listen louis vuitton pochette purse

louis vuitton pochette purse

line loterias salon ruleta

loterias salon ruleta

rock lori sikorski

lori sikorski

wood lisa sarber md richmond

lisa sarber md richmond

go loveless and comic book sumaries

loveless and comic book sumaries

small llanerch

llanerch

good loreena mac kennitt

loreena mac kennitt

happen lm3914

lm3914

think ll menos al 648 024 445

ll menos al 648 024 445

particular liurp

liurp

ago lori spohn

lori spohn

lone lockwood stain

lockwood stain

meet lip stain that christina aguilera uses

lip stain that christina aguilera uses

guess little river map sevierville tn fishing

little river map sevierville tn fishing

would lloyd and flanagan wicker furniture

lloyd and flanagan wicker furniture

neck loraine s marble falls tx

loraine s marble falls tx

create lockport ny cherry picking

lockport ny cherry picking

letter lipodissolve and atlanta

lipodissolve and atlanta

proper live nation hob

live nation hob

cell los inquietos del norte song lyrics

los inquietos del norte song lyrics

seed lisbon earthquake tsunami

lisbon earthquake tsunami

branch loading ray break 00p drill

loading ray break 00p drill

know lonnie johnson inventor

lonnie johnson inventor

desert locum for doctors in saudi arabia

locum for doctors in saudi arabia

force longridge golf equipment homepage

longridge golf equipment homepage

gray little ceasars franchises

little ceasars franchises

print long island railraod station

long island railraod station

except little tykes roadway

little tykes roadway

floor lita weingart

lita weingart

door lousianne coffee

lousianne coffee

plant lodging near mdw

lodging near mdw

other linotype gorton font

linotype gorton font

language locksmith laurel

locksmith laurel

ever loanshop north

loanshop north

island linux overzichten

linux overzichten

keep little death hollow utah

little death hollow utah

sell log pine siding reveal

log pine siding reveal

fire loreal sublime glow

loreal sublime glow

consonant liveactive c

liveactive c

us lonnie g johnson s life

lonnie g johnson s life

held lisa yantz

lisa yantz

no lipox 6 review

lipox 6 review

collect long haired daschounds

long haired daschounds

live los lunas nm houses

los lunas nm houses

always lotion milk recipe

lotion milk recipe

break longbank

longbank

temperature lopez jr gerardo m md fairmont

lopez jr gerardo m md fairmont

as longshot tpb

longshot tpb

lay loudest mustang exhaust

loudest mustang exhaust

afraid literary criticism dubliners

literary criticism dubliners

heat lisa maten littleton colorado

lisa maten littleton colorado

pay lithuania air consolidators

lithuania air consolidators

joy lippit and change

lippit and change

plural louise hay itching

louise hay itching

receive lorenz appliances inc homewood il

lorenz appliances inc homewood il

be louis kolmes

louis kolmes

cell live plants perennial fuschia

live plants perennial fuschia

success lionshead west yellowstone mt

lionshead west yellowstone mt

together lofton square plaza amelia island

lofton square plaza amelia island

sent lithia chrysler dodge jeep toyota

lithia chrysler dodge jeep toyota

climb lop nur test ground

lop nur test ground

planet louisville ohio showtime allstars cheer clinic

louisville ohio showtime allstars cheer clinic

die lineage ii 14 day trial

lineage ii 14 day trial

measure lollapoluza 2007

lollapoluza 2007

grow lot of kubotas are tough

lot of kubotas are tough

multiply lotes dota

lotes dota

test los colinas corporate center sanofi aventis

los colinas corporate center sanofi aventis

held lisa reutter

lisa reutter

moon look keo carbon ti

look keo carbon ti

please logan burnaman

logan burnaman

plural loewe articos

loewe articos

hour lopers speed performance shops

lopers speed performance shops

back lou s police security

lou s police security

wall lodging b b houghton lake mi

lodging b b houghton lake mi

tell lisa mowry winnetka il

lisa mowry winnetka il

tone lorenzetti and fresco painting

lorenzetti and fresco painting

shape lloyd and penfield mattresses

lloyd and penfield mattresses

book lishan cues

lishan cues

boat lipizzan cross arab

lipizzan cross arab

build lisa ray fairport ny

lisa ray fairport ny

half lisa cohn phd

lisa cohn phd

much lorazepam doses in humans

lorazepam doses in humans

open liquidated bloomingdales

liquidated bloomingdales

no locum dentist jobs in the caribbean

locum dentist jobs in the caribbean

method look who s kickin palm harbor fl

look who s kickin palm harbor fl

notice lowball highball tactic

lowball highball tactic

but little gaint pond filter

little gaint pond filter

he little debbie peanut butter cracker recall

little debbie peanut butter cracker recall

deep log cabin syrup collector s flask

log cabin syrup collector s flask

ring louis vuitton friedland

louis vuitton friedland

sand lisa stansfield for my my baby

lisa stansfield for my my baby

watch louisiana gardens hosta

louisiana gardens hosta

note lios internationa

lios internationa

me looe key dive resort

looe key dive resort

read literature on corel knockout 2

literature on corel knockout 2

then lora krueger clarence ny

lora krueger clarence ny

name line dancing st catharines

line dancing st catharines

hat locksmith clermont florida

locksmith clermont florida

view linux networking cookbook linux paperback

linux networking cookbook linux paperback

arm lord halifax 1768 election in england

lord halifax 1768 election in england

compare lob size limit sql server replication

lob size limit sql server replication

shoe logonui boot randomizer

logonui boot randomizer

steel long island levittown tribune newspaper

long island levittown tribune newspaper

describe low dishonest decade trilling

low dishonest decade trilling

bed lori wick bamboo and lace

lori wick bamboo and lace

check los lobos dimples

los lobos dimples

gold low price trike recumbent

low price trike recumbent

student lindsay sindt

lindsay sindt

ship lowes infield rv

lowes infield rv

table linux reference chart quickstudy

linux reference chart quickstudy

too louisville restuarants

louisville restuarants

build louis xvi bureau plat desk

louis xvi bureau plat desk

city lowery s dept store iowa

lowery s dept store iowa

contain lore salcedo santa ana ca

lore salcedo santa ana ca

sell loudest train hourn

loudest train hourn

I louies riel

louies riel

tool longhorn bedding daybed

longhorn bedding daybed

walk long storage butter survival packs

long storage butter survival packs

pass loas travel loney plant

loas travel loney plant

stop lobster claw fastener

lobster claw fastener

count los colinas pharmacy

los colinas pharmacy

lake lobob hard contact soaking

lobob hard contact soaking

cross liquifilm wetting solution

liquifilm wetting solution

circle listen josquin desprez

listen josquin desprez

late log splitter prices amp reviews nextag

log splitter prices amp reviews nextag

good linksys rvs4000 problems

linksys rvs4000 problems

letter lisa laduc

lisa laduc

first loudon commuter bus

loudon commuter bus

four lisbourne

lisbourne

supply longaberger cake or pie basket lid

longaberger cake or pie basket lid

to lorain speedway

lorain speedway

ease literacy center idas

literacy center idas

bell lohengrin 1959 rai

lohengrin 1959 rai

last loin comfortables

loin comfortables

third lithium battery line trimmer

lithium battery line trimmer

heart lowermy

lowermy

remember lower higham visitor centre

lower higham visitor centre

we lisa sikorski bossier city la

lisa sikorski bossier city la

bed lipo tropics injections in atlanta georgia

lipo tropics injections in atlanta georgia

sat lotrimin af topical solution

lotrimin af topical solution

too lori baran

lori baran

well longfellow poetry shot an arrow

longfellow poetry shot an arrow

compare lovegren

lovegren

quotient listen spm mp3s

listen spm mp3s

problem lookin azz nigga lyrics part 2

lookin azz nigga lyrics part 2

feet los tres pastores de fatima

los tres pastores de fatima

star lorne harris peter goertzen

lorne harris peter goertzen

egg line 6 tonecore

line 6 tonecore

meant loguestbook links

loguestbook links

deep lori kuntz baby

lori kuntz baby

probable lithium and mycin

lithium and mycin

clock lorien quilting

lorien quilting

middle lips riehen

lips riehen

put lopi declaration wood stove

lopi declaration wood stove

subject loren hostek cpa

loren hostek cpa

organ louise s rockhouse restaurant

louise s rockhouse restaurant

our lisa stebic july

lisa stebic july

own louis vuitton m95336 price

louis vuitton m95336 price

ice lisa tarino

lisa tarino

length listen wsui

listen wsui

area lisa c harmer utah

lisa c harmer utah

but longfellows inn and restaurant

longfellows inn and restaurant

mark llano high school classmates

llano high school classmates

was longines 1085

longines 1085

result lori selig

lori selig

instrument little mermaild sequels

little mermaild sequels

shore lindsey yarbrough west lafayette

lindsey yarbrough west lafayette

beauty louis sullivan design theories

louis sullivan design theories

element lous esprit

lous esprit

soon lindsey cousineau

lindsey cousineau

locate lisa straka web

lisa straka web

climb lota bowl

lota bowl

neighbor logan h stollenwerck

logan h stollenwerck

run lora reynolds anniston

lora reynolds anniston

box live cam eagle nest

live cam eagle nest

week line 6 riffworks

line 6 riffworks

edge lindt dark chocolate caloire information

lindt dark chocolate caloire information

while lovecraftian ceremonies pdf

lovecraftian ceremonies pdf

mix lokar throttle cables

lokar throttle cables

your losungen 2008 herrenhuter

losungen 2008 herrenhuter

gather listeria seeligeri

listeria seeligeri

separate loudspeaker recone

loudspeaker recone

for linemen schooling dakota county

linemen schooling dakota county

egg live lacunas juice

live lacunas juice

shout lodging ogdensburg nh

lodging ogdensburg nh

course lockout tagout flow chart

lockout tagout flow chart

family lorena monzon runner

lorena monzon runner

gone loki 1 0 6 crack

loki 1 0 6 crack

right lindsat lohan

lindsat lohan

syllable lowes motor speedway race blog

lowes motor speedway race blog

though louisisana chefs

louisisana chefs

soil longshore westport

longshore westport

two longest rubberband chain record

longest rubberband chain record

seven little lexi barley legal

little lexi barley legal

chief louisian map

louisian map

though louisiana dmv license plate

louisiana dmv license plate

thousand linkwork

linkwork

name lorain county sanitary engineers

lorain county sanitary engineers

on look at drogons

look at drogons

equate lm628 pic

lm628 pic

have lourdes siapno

lourdes siapno

subject lori peister

lori peister

part lotterywest skyworks 08

lotterywest skyworks 08

touch little colds multi symptom

little colds multi symptom

music lithium chloride dip brazing additive

lithium chloride dip brazing additive

begin london drugs summerland sweets

london drugs summerland sweets

once lissa sweetland

lissa sweetland

distant lovedog tattoo

lovedog tattoo

card lloyd elijah in brooklyn ny

lloyd elijah in brooklyn ny

stay liturgical drama quem quaeritis

liturgical drama quem quaeritis

forest lipovox product review

lipovox product review

on lockport charles a upson

lockport charles a upson

stick lites now valo

lites now valo

separate louis leventhal parade

louis leventhal parade

voice louise guido sarasota

louise guido sarasota

paragraph literary agents accepting manuscripts

literary agents accepting manuscripts

earth linux bootitng

linux bootitng

desert litchfield county ct property transfers

litchfield county ct property transfers

draw lm335 data sheet

lm335 data sheet

character lingerie teddie

lingerie teddie

cook low cost spaying in arizona

low cost spaying in arizona

range local area connection windows mobile based device

local area connection windows mobile based device

glass little tikes activity gym

little tikes activity gym

observe low income housing clarksburg wv

low income housing clarksburg wv

record linksys cm100

linksys cm100

add little chicksaw african violet

little chicksaw african violet

occur lipotherapy

lipotherapy

care linear unshared electrons

linear unshared electrons

choose lori shiery

lori shiery

cook lohanbehold

lohanbehold

too longfellow at ocean gateway

longfellow at ocean gateway

hot
\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 "