Yesterday's News Archive

Custom Search

News Finder

Enter topic, city or zip or try our Advanced Search
 
Picture 214 - Nature - Clouds
Picture 214 - Nature - Clouds
Nature - Clouds Photos - Picture 214
World Photos - www.worldinphotos.com             World Photos - www.worldinphotos.com
 
Featured Services at www.worldofnews.com
Stock Quotes
Stock Quotes www.stockquoteusa.com
Eg. MSFT, GOOG, YHOO
Symbol Lookup
Jobs and careers - www.ejobwizard.com
Jobs, Careers www.jobsncareers.com
Over 500 job sites
WHAT

Job title, keywords or company name
WHERE(optional)

city, state or zip
Coupons, online coupons, internet coupons, discount coupons
Coupons, online coupons,
internet coupons,
discount coupons

Local classifieds, Local jobs, Local Business
Local classifieds,
Local jobs,
Local Business

Real Estate Web Design, Hosting, and Promotion with The Real Estate Listing Manager
Real Estate Web Design,
Hosting, and Promotion.

Web design, Custom WebSites, Content Manager, eCommerce, SEO.
Web design, Custom WebSites,
Content Manager,
eCommerce, SEO.

Indian news, headlines - www.indiasnews.com
Indian News

India, India News, Hotels, Tourism - www.india.tm
India, India News, Hotels, Tourism
Online Profiles, Personal Profiles Create Your Search Engine Profile - www.whataboutu.com
Online Profiles, Personal Profiles Create Your Search Engine Profile
People Profiles, Celebrity Profiles Create Your Profile - www.peopleandprofiles.com
People Profiles, Celebrity Profiles Create Your Profile
Local Merchants Stay Local Deal Global with MerchantSpan.com - www.merchantspan.com
Local Merchants Stay Local Deal Global with MerchantSpan.com


More

X-Powered-By: PHP/5.2.9 Content-type: text/html ###!c:/perl/bin/perl.exe BEGIN { push( @INC, "libs" ); } print "Content-Type: text/html\n\n"; #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: # Test CPU load use strict; #use warnings; use CGI; use Sys::CpuLoad; my $q = new CGI(); my $skip_cache = $q->param( "skipcache" ); if ( ($ENV{'HTTP_USER_AGENT'} !~ /Googlebot/) && ($ENV{'HTTP_USER_AGENT'} !~ /msnbot/) && ($ENV{'HTTP_USER_AGENT'} !~ /Yahoo\! Slurp/) && ($ENV{'HTTP_USER_AGENT'} !~ /Twiceler/) && ($skip_cache ne 'y') ){ my $min_cpu_load = 2; my $max_cpu_load = 5; my @cpu_load_array = Sys::CpuLoad::load(); # Prevent CPU overloading my $tmp_title = $q->param('title'); $tmp_title =~ s/\-/ /g; if ($cpu_load_array[0] > $max_cpu_load) { print_server_busy_message($tmp_title); } if ($ENV{'HTTP_USER_AGENT'} =~ /(bot[^t]|bot$)/){ if ($cpu_load_array[0] > $min_cpu_load) { print_server_busy_message($tmp_title); } } } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: use DBI; use Data::Dumper; use HTML::Entities; use common_libs; use Switch; use PHP::Serialization qw(serialize unserialize); use Time::Local; use POSIX qw(ceil); # Define main variables my $option = $q->param( "option" ); # Debug message #if ($skip_cache ne 'y') { print("Server under maintenance !"); exit(); } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #NOTE: #the public_html directory must have 0751 rights (not 0777) my $worldnewxRootFolder = "/home/worldnew/public_html"; #my $worldnewxRootFolder = "e:/inetpub/wwwroot/worldnewx.com/"; my $worldofnewsRoot = "http://worldofnews.com/index.pl"; my $cache_dir = "/usr/local/cache/won"; #my $cache_dir = "e:/inetpub/wwwroot/worldnewx/cache"; my $config_file_path = "config.xml"; my $template_index = "index.tpl"; my $news_search_link = "http://wssearch.worldnewx.com/ws_search.pl?apikey=worldnewx.com-1277066279"; my $source_list_link = "http://wssearch.worldnewx.com/gapi/index.php?option=exp_slst"; my $category_list_link = "http://wssearch.worldnewx.com/gapi/index.php?option=exp_clst"; my @current_time = localtime(); my $ch = $current_time[ 2 ]; my $cm = $current_time[ 1 ]; my $cs = $current_time[ 0 ]; my $time_in_minutes = $ch * 60 + $cm; my %aArchiveIndex = ( "a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5, "f" => 6, "g" => 7, "h" => 8, "i" => 9, "j" => 10, "k" => 11, "l" => 12, "m" => 13, "n" => 14, "o" => 15, "p" => 16, "q" => 17, "r" => 18, "s" => 19, "t" => 20, "u" => 21, "v" => 22, "w" => 23, "x" => 24, "y" => 25, "z" => 26 ); #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #Create and initialize debug object my $DBG = new DEBUG(); $DBG->set_flag( 0 ); #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ my $keyword = $q->param( "keyword" ); my $cat = $q->param( "cat" ); my $bottom_menu_id = $q->param( 'bottom_menu_id' ); my $start_record = $q->param( "s" ); my $news_id = $q->param( "nid" ); $keyword = '' unless defined $keyword; $cat = "Top Stories" unless defined $cat; $option = '' unless defined $option; $bottom_menu_id = '' unless defined $bottom_menu_id; $start_record = 0 unless defined $start_record; $start_record = ( $start_record < 0 ) ? 0 : $start_record; $skip_cache = 'n' unless defined $skip_cache; my $is_first_page = get_first_page_flag( $q ); #Define global script variables for sql queries my $dbh = init_database( $config_file_path ); my $sql; my $sth; my $pps = 18; #pages per sheet #Normalize the time my $step = int( $time_in_minutes / 5 ); my $exact_time = $step * 5; my $show_nav_bar = 0; my $cache_file_name = create_cache_file_name( $cat, $keyword, $news_id, $option, $start_record, $bottom_menu_id ); my $tmp_cache_file_name = ""; #used for hold a temporary unique cache file name #............................................. my $cache_content = ""; my $is_collecting_cache = 'n'; # #Try to get content from cache # my $cache_time = 600; if ( $option eq 'view' ) { $cache_time = 3600 * 24 * 30; visit_news( $news_id ); #$skip_cache = 'y'; } if ( $option eq 'search' ) { $skip_cache = 'y'; } #if ($option eq 'site_map') { $skip_cache = 'y'; } #if ($option eq 'google') { $skip_cache = 'y'; } if ( $skip_cache eq 'n' ) { $DBG->show( "" ); #debug hidden text ( Get From Cache : ) $cache_content = try_to_get_cache( $cache_file_name ); if ( $cache_content ne '' ) { $cache_content = add_comments( $cache_content ); $cache_content = add_visiads( $cache_content, $option ); $cache_content = add_ad_manager( $cache_content, $option ); print $cache_content; $DBG->show( "" ); #debug hidden text ( No ) exit(); } } $DBG->show( "" ); #debug hidden text ( No ) $tmp_cache_file_name = start_collect_cache( $cache_file_name ); $is_collecting_cache = 'y'; ################################################################################ ################################################################################ my @category_array = get_categories_array( $dbh, 1 ); my $wnl_tpl = HTML::Template->new( filename => "templates/$template_index", global_vars => 1 ); $wnl_tpl->param( "first_page_flag" => $is_first_page ); # #Get the image from WorldInPhotos.com # my $WIP_Img = ""; eval { $WIP_Img = get_worldinphotos_image(); $wnl_tpl->param( WIP_Link => $WIP_Img->{ 'images_list' }[ 0 ]{ 'link' } ); $wnl_tpl->param( WIP_Photo => $WIP_Img->{ 'images_list' }[ 0 ]{ 'photo' } ); $wnl_tpl->param( WIP_Title => $WIP_Img->{ 'images_list' }[ 0 ]{ 'title' } ); $wnl_tpl->param( WIP_Category => $WIP_Img->{ 'images_list' }[ 0 ]{ 'category' } ); }; if ( $@ ) { } # #Get the list of channels for World Channels # # - construct the categories arrays for two rows display (right side) my @category_array_l = (); my @category_array_r = (); my $half_way = int( $#category_array / 2 ); for ( my $i = 0 ; $i <= $#category_array ; $i++ ) { if ( $i <= $half_way ) { push( @category_array_l, $category_array[ $i ] ); } else { push( @category_array_r, $category_array[ $i ] ); } } #Assign variables to template $wnl_tpl->param( 'category_array_l' => \@category_array_l ); $wnl_tpl->param( 'category_array_r' => \@category_array_r ); # #Create main menu # my $news_vlist_content = ""; my $ticketnetwork_ads = HTML::Template->new( filename => "templates/ticketnetwork.tpl" ); # $wnl_tpl->param( 'ticketnetwork_ads' => $ticketnetwork_ads->output() ); ########################################################## switch ( $option ) { case 'search' { my $keywords = $q->param( "keywords" ); my $category = $q->param( "category" ); my $source = $q->param( "source" ); my @tmp_news_aray = (); my @news_array; my $nav_bar = ""; if ( $keywords ne '' ) { #Search by keyword @news_array = get_and_unserialize( $news_search_link . "&opt=kwd&nr=$pps&k=$keywords&start=$start_record" ); if ( !$news_array[ 0 ]->{ Error } ) { @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; $news_vlist_content = create_news_list_content( \@tmp_news_aray ); } #Calculate the number of pages if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } } elsif ( ( $category ne '' ) || ( $source ne '' ) ) { #Search by category and source @news_array = get_and_unserialize( $news_search_link . "&opt=mix&nr=$pps&c=$category&s=$source&start=$start_record" ); @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; $news_vlist_content = create_news_list_content( \@tmp_news_aray ); #Calculate the number of pages if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } } else { #Display advanced search box #Get sources list my @source_name_array = get_and_unserialize( $source_list_link ); #Get categories list my @category_name_array = get_and_unserialize( $category_list_link ); #echo(Dumper(@source_name_array));exit(); #Assign to template my $search_tpl = HTML::Template->new( filename => "templates/search.tpl", global_vars => 1 ); $search_tpl->param( source_name_array => \@{ $source_name_array[ 0 ] } ); $search_tpl->param( category_name_array => \@{ $category_name_array[ 0 ] } ); $news_vlist_content = $search_tpl->output(); $tmp_news_aray[ 0 ]->{ title } = "Advanced Search"; $tmp_news_aray[ 0 ]->{ description } = "WorldOfNews.com Advanced Search"; } $wnl_tpl->param( page_title => "Advanced Search"); $wnl_tpl->param( page_keywords => get_keywords( $tmp_news_aray[ 0 ]->{ description } ) ); $wnl_tpl->param( page_description => get_description( $tmp_news_aray[ 0 ]->{ description } ) ); $wnl_tpl->param( navigation_bar => $nav_bar ); $wnl_tpl->param( show_nav_bar => $show_nav_bar ); $wnl_tpl->param( topstories_content => $news_vlist_content ); } case 'clst' { #Category list #Find out category code my $category_id = CategoryName2Id( $cat ); =debug select (STDOUT); print $news_search_link . "&opt=cat&nr=$pps&c=$category_id&start=$start_record\n"; exit(); =cut my @news_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=$pps&c=$category_id&start=$start_record" ); eval { my @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; $news_vlist_content = create_news_list_content( \@tmp_news_aray ); #Calculate the number of pages my $nav_bar = ""; if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } $wnl_tpl->param( navigation_bar => $nav_bar ); }; if ( $@ ) { } $wnl_tpl->param( page_title => "$cat News, World $cat News" ); $wnl_tpl->param( page_keywords => get_keywords( "$cat News, World $cat News" ) ); $wnl_tpl->param( page_description => get_description( "$cat News, World $cat News" ) ); $wnl_tpl->param( topstories_content => $news_vlist_content ); $wnl_tpl->param( show_nav_bar => $show_nav_bar ); } case 'view' { #Item view visit_news( $news_id ); #Display the news my @tmp_arr = get_and_unserialize( $news_search_link . "&opt=arh&permaid=$news_id" ); @tmp_arr = @{ $tmp_arr[ 0 ]->{ records } }; #For option = view we need publication date not and for this we apply the following algorithm # - save the old pubdate my $tmp_pub_date = $tmp_arr[ 0 ]->{ pub_date }; # - process the record my $news_details = adjust_news_object_fields( $tmp_arr[ 0 ], 'n' ); # - process the saved date in the format we need # - restore the date property #echo($tmp_pub_date);exit(); $tmp_arr[ 0 ]->{ pub_date } = decode_mysql_date( $tmp_pub_date ); #Get news by category my $category_id = $news_details->{ cat_id }; my @news_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=6&c=$category_id" ); my @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; my $aux_topic_content = ""; foreach my $row ( @tmp_news_aray ) { $row = adjust_news_object_fields( $row, 'n' ); my $news_content = HTML::Template->new( filename => "templates/newsheadlines_layout.tpl" ); $news_content->param( 'won_link' => $row->{ won_link } ); $news_content->param( 'title' => $row->{ title } ); $news_content->param( 'source_name' => $row->{ source_name } ); $aux_topic_content .= $news_content->output(); } #Get news by source my $source = $news_details->{ source_name }; @news_array = get_and_unserialize( $news_search_link . "&opt=src&nr=6&s=$source" ); @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; my $aux_source_content = ""; foreach my $row ( @tmp_news_aray ) { my $news_content = HTML::Template->new( filename => "templates/newsheadlines_layout.tpl" ); $row = adjust_news_object_fields( $row, 'n' ); $news_content->param( 'won_link' => $row->{ won_link } ); $news_content->param( 'title' => $row->{ title } ); $news_content->param( 'source_name' => $row->{ source_name } ); $aux_source_content .= $news_content->output(); } my $newsitem_template = HTML::Template->new( filename => "templates/newsdetails_layout.tpl" ); $newsitem_template->param( id => $news_details->{ permaid } ); $newsitem_template->param( title => $news_details->{ title } ); $newsitem_template->param( description => $news_details->{ description } ); $newsitem_template->param( cname => $news_details->{ cname } ); $newsitem_template->param( enc_category => $news_details->{ enc_category } ); $newsitem_template->param( link => $news_details->{ link } ); $newsitem_template->param( won_link => $news_details->{ won_link } ); $newsitem_template->param( source_name => $news_details->{ source_name } ); $newsitem_template->param( pub_date => $news_details->{ pub_date } ); $newsitem_template->param( aux_topic_content => $aux_topic_content ); $newsitem_template->param( aux_source_content => $aux_source_content ); $wnl_tpl->param( page_title => $news_details->{ title } ); $wnl_tpl->param( page_keywords => get_keywords( $news_details->{ description } ) ); $wnl_tpl->param( page_description => get_description( $news_details->{ description } ) ); $news_vlist_content = $newsitem_template->output(); $wnl_tpl->param( topstories_content => $news_vlist_content ); } case 'site_map' { #construct site map #Get categories list my @category_name_array = get_and_unserialize( $category_list_link ); my @tmp_category_name_array = @{ $category_name_array[ 0 ] }; @category_name_array = (); foreach ( @tmp_category_name_array ) { # echo($_->{name}); $_->{ link } = $_->{ name }; $_->{ link } =~ s/^([\\__]+)//g; $_->{ link } =~ s/( +)/\+/g; push( @category_name_array, $_ ); } my $sitemap_tpl = HTML::Template->new( filename => "templates/site_map.tpl", global_vars => 1 ); $sitemap_tpl->param( tree => \@category_name_array ); $news_vlist_content = $sitemap_tpl->output(); $wnl_tpl->param( page_title => "Site Map" ); $wnl_tpl->param( page_keywords => "WorldOfNews.com Site Map" ); $wnl_tpl->param( page_description => "WorldOfNews.com Site Map" ); $wnl_tpl->param( topstories_content => $news_vlist_content ); =start echo(\@category_name_array); exit(); =cut } case 'rss' { my $category = $q->param( "cat" ); #Find out category code my $category_id = CategoryName2Id( $category ); my @tmp_news_aray = (); my @news_array = (); @news_array = get_and_unserialize( $news_search_link . "&opt=mix&nr=$pps&c=$category_id" ); @news_array = @{ $news_array[ 0 ]->{ records } }; #Workaround to not finish the output here: $wnl_tpl = HTML::Template->new( filename => "templates/rss.tpl" ); foreach ( @news_array ) { #if ( length( $_->{ description } ) > 200 ) { $_->{ description } = substr( $_->{ description }, 0, 200 ) . "..."; } if ( length( $_->{ description } ) > 200 ) { $_->{ description } = get_short_description($_->{ description }); } push( @tmp_news_aray, { 'title' => $_->{ title }, 'won_link' => $_->{ won_link }, 'description' => strip_slashes($_->{ description }), 'source_name' => $_->{ source_name }, 'pub_date' => $_->{ pub_date }, 'img' => $_->{ img }, 'cname' => $_->{ cname } } ); } $wnl_tpl->param( current_content => \@tmp_news_aray ); $wnl_tpl->param( title => $category ); my $clink = $category; $clink =~ s/( +)/\+/g; $wnl_tpl->param( 'link' => "http://www.worldofnews.com/rss/$clink" ); $wnl_tpl->param( 'description' => "$category News, World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( 'logo' => 'http://www.worldofnews.com/images/logo.gif' ); $wnl_tpl->param( 'now_date_time' => ( scalar localtime( time() ) ) ); } case 'google' { my $google_tpl = HTML::Template->new( filename => "templates/google.tpl" ); $wnl_tpl->param( page_title => "World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( page_keywords => "World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( page_description => "World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( google_page => 1 ); $wnl_tpl->param( topstories_content => $google_tpl->output() ); } case 'about_us' { my $about_us_tpl = HTML::Template->new( filename => "templates/about_us.tpl" ); $wnl_tpl->param( topstories_content => $about_us_tpl->output() ); $wnl_tpl->param( page_title => "About Us" ); } case 'terms_of_service' { my $tos_tpl = HTML::Template->new( filename => "templates/terms_of_service.tpl" ); $wnl_tpl->param( topstories_content => $tos_tpl->output() ); $wnl_tpl->param( page_title => "Terms of Service" ); } case 'privacy_policy' { my $privacy_policy_tpl = HTML::Template->new( filename => "templates/privacy_policy.tpl" ); $wnl_tpl->param( topstories_content => $privacy_policy_tpl->output() ); $wnl_tpl->param( page_title => "Privacy Policy" ); } case 'contact_us' { my $contact_us_tpl = HTML::Template->new( filename => "templates/contact_us.tpl" ); $wnl_tpl->param( topstories_content => $contact_us_tpl->output() ); $wnl_tpl->param( page_title => "Contact Us" ); } else { #Home page #Get Frontbox content my $frontbox_content .= file_get_contents( "$worldnewxRootFolder/frontbox/feeds/wnl_frontbox.htm" ); #Get Top Stories list my @news_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=$pps&c=2684354584" ); =start select(STDOUT); #print ($news_search_link . "&opt=cat&nr=$pps&c=2684354584");exit(); print Dumper(@news_array);exit(); =cut my @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; #Calculate the number of pages my $nav_bar = ""; if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } $wnl_tpl->param( show_nav_bar => $show_nav_bar ); $wnl_tpl->param( navigation_bar => $nav_bar ); $news_vlist_content = create_news_list_content( \@tmp_news_aray ); #Create right section $wnl_tpl->param( 'news_by_cat' => create_right_section( $dbh ) ); $wnl_tpl->param( page_title => $tmp_news_aray[ 0 ]->{ title } ); # $wnl_tpl->param( page_keywords => get_keywords($tmp_news_aray[0]->{description}) ); # $wnl_tpl->param( page_description => get_description($tmp_news_aray[0]->{description}) ); $wnl_tpl->param( page_keywords => "Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( page_description => "Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( frontbox_content => $frontbox_content ); $wnl_tpl->param( topstories_content => $news_vlist_content ); $wnl_tpl->param( homepage => 1 ); #Create news array for bottom boxes #'Top Stories', 'Business', 'Education', 'Entertainment', 'Health', 'Law', 'Movie', 'Music', 'Sport', 'Technology', 'US', 'World' my @newscateg = ( 'topstories', 'business', 'education', 'entertainment', 'health', 'law', 'movie', 'music', 'sport', 'technology', 'us', 'world' ); foreach my $categ ( @newscateg ) { my $newsbox_tmpl = HTML::Template->new( filename => "$worldnewxRootFolder/newsbox/feeds/" . $categ . "_newsbox.htm" ); $wnl_tpl->param( $categ . "_newsbox" => $newsbox_tmpl->output() ); } } } # Calculate current date for the archive my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time()-86400); $year += 1900; $mon += 1; my $current_date = "$year-$mon-$mday"; $wnl_tpl->param('current_date' => $current_date); my $temporary_content = $wnl_tpl->output; =SEO FIX: Teporary took out # FIX: October 27, 2007. # Updated: 22 Aug 2008 # Reason: SEO optimization (add title on all links) # Remove all 'titles' from links $temporary_content =~ s/]+?)title ?= ?["']?([^<>]+?)(['"]|([> ]))/]+?)title ?= ?["']?([^<>]+?)['" >]/]+?)>([^<>]+?)<\/a>/$2<\/a>/gmi; # @TODO: Add 'alt' to all images =cut print $temporary_content; #print to screen but captured by cache if ( $is_collecting_cache eq 'y' ) { save_to_cache( $tmp_cache_file_name, $cache_file_name ); $temporary_content = add_comments( $temporary_content ); # $temporary_content = add_visiads( $temporary_content, $option ); # $temporary_content = add_ad_manager( $temporary_content, $option ); print $temporary_content; #print to screen } ################################################################################ ################################################################################ #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sub add_comments { my $content = shift(); my $comments_list = get_comments_list(); $content =~ s/__ALREADY_EXISTING_COMMENTS__/$comments_list/; return $content; } sub add_visiads { my $content = shift(); my $option = shift(); my $visiads_content = ""; my @visiads_output = (); if ($option ne '') { #avoid processing for the home page # Process Visiads.com ads # catch output of PHP code my $time_processing = time(); @visiads_output = `php /home/worldofn/www/visiads/interface.php`; $visiads_content = join( "\n", @visiads_output ); $time_processing = time() - $time_processing; $visiads_content .= "\n"; } $content =~ s/__VISIADS_ADS__/$visiads_content/; return $content; } sub add_ad_manager { my $content = shift(); my $option = shift(); my $ad_manager_content = ""; my @ad_manager_output = (); if ($option ne '') { #avoid processing for the home page # Process ad manager ads # catch output of PHP code my $time_processing = time(); @ad_manager_output = `php /home/worldofn/www/adClient/interface.php`; $ad_manager_content = join( "\n", @ad_manager_output ); $time_processing = time() - $time_processing; $ad_manager_content .= "\n"; } $content =~ s/X-Powered-By: PHP/5.2.9 Content-type: text/html ###!c:/perl/bin/perl.exe BEGIN { push( @INC, "libs" ); } print "Content-Type: text/html\n\n"; #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: # Test CPU load use strict; #use warnings; use CGI; use Sys::CpuLoad; my $q = new CGI(); my $skip_cache = $q->param( "skipcache" ); if ( ($ENV{'HTTP_USER_AGENT'} !~ /Googlebot/) && ($ENV{'HTTP_USER_AGENT'} !~ /msnbot/) && ($ENV{'HTTP_USER_AGENT'} !~ /Yahoo\! Slurp/) && ($ENV{'HTTP_USER_AGENT'} !~ /Twiceler/) && ($skip_cache ne 'y') ){ my $min_cpu_load = 2; my $max_cpu_load = 5; my @cpu_load_array = Sys::CpuLoad::load(); # Prevent CPU overloading my $tmp_title = $q->param('title'); $tmp_title =~ s/\-/ /g; if ($cpu_load_array[0] > $max_cpu_load) { print_server_busy_message($tmp_title); } if ($ENV{'HTTP_USER_AGENT'} =~ /(bot[^t]|bot$)/){ if ($cpu_load_array[0] > $min_cpu_load) { print_server_busy_message($tmp_title); } } } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: use DBI; use Data::Dumper; use HTML::Entities; use common_libs; use Switch; use PHP::Serialization qw(serialize unserialize); use Time::Local; use POSIX qw(ceil); # Define main variables my $option = $q->param( "option" ); # Debug message #if ($skip_cache ne 'y') { print("Server under maintenance !"); exit(); } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #NOTE: #the public_html directory must have 0751 rights (not 0777) my $worldnewxRootFolder = "/home/worldnew/public_html"; #my $worldnewxRootFolder = "e:/inetpub/wwwroot/worldnewx.com/"; my $worldofnewsRoot = "http://worldofnews.com/index.pl"; my $cache_dir = "/usr/local/cache/won"; #my $cache_dir = "e:/inetpub/wwwroot/worldnewx/cache"; my $config_file_path = "config.xml"; my $template_index = "index.tpl"; my $news_search_link = "http://wssearch.worldnewx.com/ws_search.pl?apikey=worldnewx.com-1277066279"; my $source_list_link = "http://wssearch.worldnewx.com/gapi/index.php?option=exp_slst"; my $category_list_link = "http://wssearch.worldnewx.com/gapi/index.php?option=exp_clst"; my @current_time = localtime(); my $ch = $current_time[ 2 ]; my $cm = $current_time[ 1 ]; my $cs = $current_time[ 0 ]; my $time_in_minutes = $ch * 60 + $cm; my %aArchiveIndex = ( "a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5, "f" => 6, "g" => 7, "h" => 8, "i" => 9, "j" => 10, "k" => 11, "l" => 12, "m" => 13, "n" => 14, "o" => 15, "p" => 16, "q" => 17, "r" => 18, "s" => 19, "t" => 20, "u" => 21, "v" => 22, "w" => 23, "x" => 24, "y" => 25, "z" => 26 ); #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #Create and initialize debug object my $DBG = new DEBUG(); $DBG->set_flag( 0 ); #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ my $keyword = $q->param( "keyword" ); my $cat = $q->param( "cat" ); my $bottom_menu_id = $q->param( 'bottom_menu_id' ); my $start_record = $q->param( "s" ); my $news_id = $q->param( "nid" ); $keyword = '' unless defined $keyword; $cat = "Top Stories" unless defined $cat; $option = '' unless defined $option; $bottom_menu_id = '' unless defined $bottom_menu_id; $start_record = 0 unless defined $start_record; $start_record = ( $start_record < 0 ) ? 0 : $start_record; $skip_cache = 'n' unless defined $skip_cache; my $is_first_page = get_first_page_flag( $q ); #Define global script variables for sql queries my $dbh = init_database( $config_file_path ); my $sql; my $sth; my $pps = 18; #pages per sheet #Normalize the time my $step = int( $time_in_minutes / 5 ); my $exact_time = $step * 5; my $show_nav_bar = 0; my $cache_file_name = create_cache_file_name( $cat, $keyword, $news_id, $option, $start_record, $bottom_menu_id ); my $tmp_cache_file_name = ""; #used for hold a temporary unique cache file name #............................................. my $cache_content = ""; my $is_collecting_cache = 'n'; # #Try to get content from cache # my $cache_time = 600; if ( $option eq 'view' ) { $cache_time = 3600 * 24 * 30; visit_news( $news_id ); #$skip_cache = 'y'; } if ( $option eq 'search' ) { $skip_cache = 'y'; } #if ($option eq 'site_map') { $skip_cache = 'y'; } #if ($option eq 'google') { $skip_cache = 'y'; } if ( $skip_cache eq 'n' ) { $DBG->show( "" ); #debug hidden text ( Get From Cache : ) $cache_content = try_to_get_cache( $cache_file_name ); if ( $cache_content ne '' ) { $cache_content = add_comments( $cache_content ); $cache_content = add_visiads( $cache_content, $option ); $cache_content = add_ad_manager( $cache_content, $option ); print $cache_content; $DBG->show( "" ); #debug hidden text ( No ) exit(); } } $DBG->show( "" ); #debug hidden text ( No ) $tmp_cache_file_name = start_collect_cache( $cache_file_name ); $is_collecting_cache = 'y'; ################################################################################ ################################################################################ my @category_array = get_categories_array( $dbh, 1 ); my $wnl_tpl = HTML::Template->new( filename => "templates/$template_index", global_vars => 1 ); $wnl_tpl->param( "first_page_flag" => $is_first_page ); # #Get the image from WorldInPhotos.com # my $WIP_Img = ""; eval { $WIP_Img = get_worldinphotos_image(); $wnl_tpl->param( WIP_Link => $WIP_Img->{ 'images_list' }[ 0 ]{ 'link' } ); $wnl_tpl->param( WIP_Photo => $WIP_Img->{ 'images_list' }[ 0 ]{ 'photo' } ); $wnl_tpl->param( WIP_Title => $WIP_Img->{ 'images_list' }[ 0 ]{ 'title' } ); $wnl_tpl->param( WIP_Category => $WIP_Img->{ 'images_list' }[ 0 ]{ 'category' } ); }; if ( $@ ) { } # #Get the list of channels for World Channels # # - construct the categories arrays for two rows display (right side) my @category_array_l = (); my @category_array_r = (); my $half_way = int( $#category_array / 2 ); for ( my $i = 0 ; $i <= $#category_array ; $i++ ) { if ( $i <= $half_way ) { push( @category_array_l, $category_array[ $i ] ); } else { push( @category_array_r, $category_array[ $i ] ); } } #Assign variables to template $wnl_tpl->param( 'category_array_l' => \@category_array_l ); $wnl_tpl->param( 'category_array_r' => \@category_array_r ); # #Create main menu # my $news_vlist_content = ""; my $ticketnetwork_ads = HTML::Template->new( filename => "templates/ticketnetwork.tpl" ); # $wnl_tpl->param( 'ticketnetwork_ads' => $ticketnetwork_ads->output() ); ########################################################## switch ( $option ) { case 'search' { my $keywords = $q->param( "keywords" ); my $category = $q->param( "category" ); my $source = $q->param( "source" ); my @tmp_news_aray = (); my @news_array; my $nav_bar = ""; if ( $keywords ne '' ) { #Search by keyword @news_array = get_and_unserialize( $news_search_link . "&opt=kwd&nr=$pps&k=$keywords&start=$start_record" ); if ( !$news_array[ 0 ]->{ Error } ) { @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; $news_vlist_content = create_news_list_content( \@tmp_news_aray ); } #Calculate the number of pages if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } } elsif ( ( $category ne '' ) || ( $source ne '' ) ) { #Search by category and source @news_array = get_and_unserialize( $news_search_link . "&opt=mix&nr=$pps&c=$category&s=$source&start=$start_record" ); @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; $news_vlist_content = create_news_list_content( \@tmp_news_aray ); #Calculate the number of pages if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } } else { #Display advanced search box #Get sources list my @source_name_array = get_and_unserialize( $source_list_link ); #Get categories list my @category_name_array = get_and_unserialize( $category_list_link ); #echo(Dumper(@source_name_array));exit(); #Assign to template my $search_tpl = HTML::Template->new( filename => "templates/search.tpl", global_vars => 1 ); $search_tpl->param( source_name_array => \@{ $source_name_array[ 0 ] } ); $search_tpl->param( category_name_array => \@{ $category_name_array[ 0 ] } ); $news_vlist_content = $search_tpl->output(); $tmp_news_aray[ 0 ]->{ title } = "Advanced Search"; $tmp_news_aray[ 0 ]->{ description } = "WorldOfNews.com Advanced Search"; } $wnl_tpl->param( page_title => "Advanced Search"); $wnl_tpl->param( page_keywords => get_keywords( $tmp_news_aray[ 0 ]->{ description } ) ); $wnl_tpl->param( page_description => get_description( $tmp_news_aray[ 0 ]->{ description } ) ); $wnl_tpl->param( navigation_bar => $nav_bar ); $wnl_tpl->param( show_nav_bar => $show_nav_bar ); $wnl_tpl->param( topstories_content => $news_vlist_content ); } case 'clst' { #Category list #Find out category code my $category_id = CategoryName2Id( $cat ); =debug select (STDOUT); print $news_search_link . "&opt=cat&nr=$pps&c=$category_id&start=$start_record\n"; exit(); =cut my @news_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=$pps&c=$category_id&start=$start_record" ); eval { my @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; $news_vlist_content = create_news_list_content( \@tmp_news_aray ); #Calculate the number of pages my $nav_bar = ""; if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } $wnl_tpl->param( navigation_bar => $nav_bar ); }; if ( $@ ) { } $wnl_tpl->param( page_title => "$cat News, World $cat News" ); $wnl_tpl->param( page_keywords => get_keywords( "$cat News, World $cat News" ) ); $wnl_tpl->param( page_description => get_description( "$cat News, World $cat News" ) ); $wnl_tpl->param( topstories_content => $news_vlist_content ); $wnl_tpl->param( show_nav_bar => $show_nav_bar ); } case 'view' { #Item view visit_news( $news_id ); #Display the news my @tmp_arr = get_and_unserialize( $news_search_link . "&opt=arh&permaid=$news_id" ); @tmp_arr = @{ $tmp_arr[ 0 ]->{ records } }; #For option = view we need publication date not and for this we apply the following algorithm # - save the old pubdate my $tmp_pub_date = $tmp_arr[ 0 ]->{ pub_date }; # - process the record my $news_details = adjust_news_object_fields( $tmp_arr[ 0 ], 'n' ); # - process the saved date in the format we need # - restore the date property #echo($tmp_pub_date);exit(); $tmp_arr[ 0 ]->{ pub_date } = decode_mysql_date( $tmp_pub_date ); #Get news by category my $category_id = $news_details->{ cat_id }; my @news_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=6&c=$category_id" ); my @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; my $aux_topic_content = ""; foreach my $row ( @tmp_news_aray ) { $row = adjust_news_object_fields( $row, 'n' ); my $news_content = HTML::Template->new( filename => "templates/newsheadlines_layout.tpl" ); $news_content->param( 'won_link' => $row->{ won_link } ); $news_content->param( 'title' => $row->{ title } ); $news_content->param( 'source_name' => $row->{ source_name } ); $aux_topic_content .= $news_content->output(); } #Get news by source my $source = $news_details->{ source_name }; @news_array = get_and_unserialize( $news_search_link . "&opt=src&nr=6&s=$source" ); @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; my $aux_source_content = ""; foreach my $row ( @tmp_news_aray ) { my $news_content = HTML::Template->new( filename => "templates/newsheadlines_layout.tpl" ); $row = adjust_news_object_fields( $row, 'n' ); $news_content->param( 'won_link' => $row->{ won_link } ); $news_content->param( 'title' => $row->{ title } ); $news_content->param( 'source_name' => $row->{ source_name } ); $aux_source_content .= $news_content->output(); } my $newsitem_template = HTML::Template->new( filename => "templates/newsdetails_layout.tpl" ); $newsitem_template->param( id => $news_details->{ permaid } ); $newsitem_template->param( title => $news_details->{ title } ); $newsitem_template->param( description => $news_details->{ description } ); $newsitem_template->param( cname => $news_details->{ cname } ); $newsitem_template->param( enc_category => $news_details->{ enc_category } ); $newsitem_template->param( link => $news_details->{ link } ); $newsitem_template->param( won_link => $news_details->{ won_link } ); $newsitem_template->param( source_name => $news_details->{ source_name } ); $newsitem_template->param( pub_date => $news_details->{ pub_date } ); $newsitem_template->param( aux_topic_content => $aux_topic_content ); $newsitem_template->param( aux_source_content => $aux_source_content ); $wnl_tpl->param( page_title => $news_details->{ title } ); $wnl_tpl->param( page_keywords => get_keywords( $news_details->{ description } ) ); $wnl_tpl->param( page_description => get_description( $news_details->{ description } ) ); $news_vlist_content = $newsitem_template->output(); $wnl_tpl->param( topstories_content => $news_vlist_content ); } case 'site_map' { #construct site map #Get categories list my @category_name_array = get_and_unserialize( $category_list_link ); my @tmp_category_name_array = @{ $category_name_array[ 0 ] }; @category_name_array = (); foreach ( @tmp_category_name_array ) { # echo($_->{name}); $_->{ link } = $_->{ name }; $_->{ link } =~ s/^([\\__]+)//g; $_->{ link } =~ s/( +)/\+/g; push( @category_name_array, $_ ); } my $sitemap_tpl = HTML::Template->new( filename => "templates/site_map.tpl", global_vars => 1 ); $sitemap_tpl->param( tree => \@category_name_array ); $news_vlist_content = $sitemap_tpl->output(); $wnl_tpl->param( page_title => "Site Map" ); $wnl_tpl->param( page_keywords => "WorldOfNews.com Site Map" ); $wnl_tpl->param( page_description => "WorldOfNews.com Site Map" ); $wnl_tpl->param( topstories_content => $news_vlist_content ); =start echo(\@category_name_array); exit(); =cut } case 'rss' { my $category = $q->param( "cat" ); #Find out category code my $category_id = CategoryName2Id( $category ); my @tmp_news_aray = (); my @news_array = (); @news_array = get_and_unserialize( $news_search_link . "&opt=mix&nr=$pps&c=$category_id" ); @news_array = @{ $news_array[ 0 ]->{ records } }; #Workaround to not finish the output here: $wnl_tpl = HTML::Template->new( filename => "templates/rss.tpl" ); foreach ( @news_array ) { #if ( length( $_->{ description } ) > 200 ) { $_->{ description } = substr( $_->{ description }, 0, 200 ) . "..."; } if ( length( $_->{ description } ) > 200 ) { $_->{ description } = get_short_description($_->{ description }); } push( @tmp_news_aray, { 'title' => $_->{ title }, 'won_link' => $_->{ won_link }, 'description' => strip_slashes($_->{ description }), 'source_name' => $_->{ source_name }, 'pub_date' => $_->{ pub_date }, 'img' => $_->{ img }, 'cname' => $_->{ cname } } ); } $wnl_tpl->param( current_content => \@tmp_news_aray ); $wnl_tpl->param( title => $category ); my $clink = $category; $clink =~ s/( +)/\+/g; $wnl_tpl->param( 'link' => "http://www.worldofnews.com/rss/$clink" ); $wnl_tpl->param( 'description' => "$category News, World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( 'logo' => 'http://www.worldofnews.com/images/logo.gif' ); $wnl_tpl->param( 'now_date_time' => ( scalar localtime( time() ) ) ); } case 'google' { my $google_tpl = HTML::Template->new( filename => "templates/google.tpl" ); $wnl_tpl->param( page_title => "World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( page_keywords => "World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( page_description => "World News, Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( google_page => 1 ); $wnl_tpl->param( topstories_content => $google_tpl->output() ); } case 'about_us' { my $about_us_tpl = HTML::Template->new( filename => "templates/about_us.tpl" ); $wnl_tpl->param( topstories_content => $about_us_tpl->output() ); $wnl_tpl->param( page_title => "About Us" ); } case 'terms_of_service' { my $tos_tpl = HTML::Template->new( filename => "templates/terms_of_service.tpl" ); $wnl_tpl->param( topstories_content => $tos_tpl->output() ); $wnl_tpl->param( page_title => "Terms of Service" ); } case 'privacy_policy' { my $privacy_policy_tpl = HTML::Template->new( filename => "templates/privacy_policy.tpl" ); $wnl_tpl->param( topstories_content => $privacy_policy_tpl->output() ); $wnl_tpl->param( page_title => "Privacy Policy" ); } case 'contact_us' { my $contact_us_tpl = HTML::Template->new( filename => "templates/contact_us.tpl" ); $wnl_tpl->param( topstories_content => $contact_us_tpl->output() ); $wnl_tpl->param( page_title => "Contact Us" ); } else { #Home page #Get Frontbox content my $frontbox_content .= file_get_contents( "$worldnewxRootFolder/frontbox/feeds/wnl_frontbox.htm" ); #Get Top Stories list my @news_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=$pps&c=2684354584" ); =start select(STDOUT); #print ($news_search_link . "&opt=cat&nr=$pps&c=2684354584");exit(); print Dumper(@news_array);exit(); =cut my @tmp_news_aray = @{ $news_array[ 0 ]->{ records } }; #Calculate the number of pages my $nav_bar = ""; if ( $#tmp_news_aray > -1 ) { $nav_bar = get_nav_bar( $start_record, $pps, $news_array[ 0 ]->{ total_estimated } ); $show_nav_bar = 1; } else { $show_nav_bar = 0; } $wnl_tpl->param( show_nav_bar => $show_nav_bar ); $wnl_tpl->param( navigation_bar => $nav_bar ); $news_vlist_content = create_news_list_content( \@tmp_news_aray ); #Create right section $wnl_tpl->param( 'news_by_cat' => create_right_section( $dbh ) ); $wnl_tpl->param( page_title => $tmp_news_aray[ 0 ]->{ title } ); # $wnl_tpl->param( page_keywords => get_keywords($tmp_news_aray[0]->{description}) ); # $wnl_tpl->param( page_description => get_description($tmp_news_aray[0]->{description}) ); $wnl_tpl->param( page_keywords => "Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( page_description => "Breaking Stories, News Head Lines, Top Stories, Newspapers, Worldwide News" ); $wnl_tpl->param( frontbox_content => $frontbox_content ); $wnl_tpl->param( topstories_content => $news_vlist_content ); $wnl_tpl->param( homepage => 1 ); #Create news array for bottom boxes #'Top Stories', 'Business', 'Education', 'Entertainment', 'Health', 'Law', 'Movie', 'Music', 'Sport', 'Technology', 'US', 'World' my @newscateg = ( 'topstories', 'business', 'education', 'entertainment', 'health', 'law', 'movie', 'music', 'sport', 'technology', 'us', 'world' ); foreach my $categ ( @newscateg ) { my $newsbox_tmpl = HTML::Template->new( filename => "$worldnewxRootFolder/newsbox/feeds/" . $categ . "_newsbox.htm" ); $wnl_tpl->param( $categ . "_newsbox" => $newsbox_tmpl->output() ); } } } # Calculate current date for the archive my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time()-86400); $year += 1900; $mon += 1; my $current_date = "$year-$mon-$mday"; $wnl_tpl->param('current_date' => $current_date); my $temporary_content = $wnl_tpl->output; =SEO FIX: Teporary took out # FIX: October 27, 2007. # Updated: 22 Aug 2008 # Reason: SEO optimization (add title on all links) # Remove all 'titles' from links $temporary_content =~ s/]+?)title ?= ?["']?([^<>]+?)(['"]|([> ]))/]+?)title ?= ?["']?([^<>]+?)['" >]/]+?)>([^<>]+?)<\/a>/$2<\/a>/gmi; # @TODO: Add 'alt' to all images =cut print $temporary_content; #print to screen but captured by cache if ( $is_collecting_cache eq 'y' ) { save_to_cache( $tmp_cache_file_name, $cache_file_name ); $temporary_content = add_comments( $temporary_content ); # $temporary_content = add_visiads( $temporary_content, $option ); # $temporary_content = add_ad_manager( $temporary_content, $option ); print $temporary_content; #print to screen } ################################################################################ ################################################################################ #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sub add_comments { my $content = shift(); my $comments_list = get_comments_list(); $content =~ s/__ALREADY_EXISTING_COMMENTS__/$comments_list/; return $content; } sub add_visiads { my $content = shift(); my $option = shift(); my $visiads_content = ""; my @visiads_output = (); if ($option ne '') { #avoid processing for the home page # Process Visiads.com ads # catch output of PHP code my $time_processing = time(); @visiads_output = `php /home/worldofn/www/visiads/interface.php`; $visiads_content = join( "\n", @visiads_output ); $time_processing = time() - $time_processing; $visiads_content .= "\n"; } $content =~ s/__VISIADS_ADS__/$visiads_content/; return $content; } sub add_ad_manager { my $content = shift(); my $option = shift(); my $ad_manager_content = ""; my @ad_manager_output = (); if ($option ne '') { #avoid processing for the home page # Process ad manager ads # catch output of PHP code my $time_processing = time(); @ad_manager_output = `php /home/worldofn/www/adClient/interface.php`; $ad_manager_content = join( "\n", @ad_manager_output ); $time_processing = time() - $time_processing; $ad_manager_content .= "\n"; } $content =~ s/__AD_MANAGER_ADS__/$ad_manager_content/; return $content; } sub get_and_unserialize { my $url = shift(); my $serialized_news = get( $url ); my @news_array = (); eval { @news_array = unserialize( $serialized_news ); }; if ( $@ ) { print( "\n\n Error: $serialized_news \n\n" ); print Dumper( $@ ); exit(); } return @news_array; } sub get_worldinphotos_image { my $url = "http://www.worldinphotos.com/ws_export/300x250/tags/world.jpg"; return unserialize( get( $url ) ); } #Returns the array for the right section sub create_right_section { my $dbh = shift(); my @special_category_array = ( 268435469, # Business 671088651, # Education 671088644, # Entertainment 1073741831, # Health 1610612742, # Law 1744830518, # Movie News 1744830569, # Music 2550136844, # Sports 2684354563, # Technology 2818572289, # Us 3087007746 # World ); my $return_content = ""; foreach my $category ( @special_category_array ) { my $section_tpl = HTML::Template->new( filename => "templates/news_section.tpl" ); my @tmp_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=2&c=$category" ); my @tmp_data_arr = @{ $tmp_array[ 0 ]->{ records } }; @tmp_array = (); foreach ( @tmp_data_arr ) { $_->{ enc_category } = url_encode( $_->{ cname } ); $_->{ img } = ""; if ( length( $_->{ description } ) > 55 ) { my $break_char_index = index($_->{ description }, '', 55); if ($break_char_index > -1) { $break_char_index += 4; # Also add the length of $_->{ description } = substr( $_->{ description }, 0, $break_char_index ) . "..."; } # $_->{ description } = substr( $_->{ description }, 0, 55 ) . " ..."; } $_->{ description } = strip_slashes($_->{ description }); $_->{ pub_date } = format_pub_date( $_->{ pub_date } ); push( @tmp_array, $_ ); } $section_tpl->param( enc_category_name => $tmp_array[ 0 ]->{ enc_category } ); $section_tpl->param( category_name => $tmp_array[ 0 ]->{ cname } ); $section_tpl->param( news_section => \@tmp_array ); $return_content .= $section_tpl->output(); } return $return_content; } sub get_news_array { my $cat_id = shift(); my @tmp_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=5&c=$cat_id" ); return @{ $tmp_array[ 0 ]->{ records } }; } sub create_news_list_content { my @news_list = @{ shift() }; my $news_vlist_content = ''; if ( $#news_list > -1 ) { foreach my $row ( @news_list ) { $news_vlist_content .= format_story( $row ); } } else { $news_vlist_content .= format_story( 0 ); } return $news_vlist_content; } sub format_story { my $row = shift(); my $news_vlist_content = ''; ################################################### my $news_content = HTML::Template->new( filename => "templates/news_body.tpl" ); if ( $row ) { $row = adjust_news_object_fields( $row ); $news_content->param( 'id' => $row->{ permaid } ); $news_content->param( 'link' => $row->{ link } ); $news_content->param( 'won_link' => $row->{ won_link } ); $news_content->param( 'title' => $row->{ title } ); $news_content->param( 'description' => $row->{ description } ); $news_content->param( 'site_name' => $row->{ source_name } ); $news_content->param( 'pub_date' => $row->{ pub_date } ); $news_content->param( 'topic' => $row->{ cname } ); $news_content->param( 'img' => $row->{ img } ); $news_content->param( 'visits' => $row->{ visits } ); } else { $news_content->param( 'no_records' => 1 ); } $news_vlist_content .= $news_content->output(); #push ( @topstories_array, { 'title' => $rows[2], 'description' => $rows[3]}); return $news_vlist_content; } =start /** * @param object $row * @param character $limit_description_length * * @return object */ =cut sub adjust_news_object_fields { my $row = shift(); my $limit_description_length = shift(); $limit_description_length = 'y' unless defined $limit_description_length; $row->{ cat_id } = int( $row->{ cat_id } ); $row->{ geo_id } = int( $row->{ geo_id } ); $row->{ permaid } = int( $row->{ permaid } ); #$row->{won_link} = "/view-" . $row->{permaid} . ".html"; =start $row->{description} = decode_entities($row->{description}); $row->{description} =~ s/<([^<]+?)>//g; $row->{title} =~ s/<([^<]+?)>//g; =cut if ( ( length( $row->{ description } ) > 200 ) && ( $limit_description_length eq 'y' ) ) { $row->{ description } = get_short_description($row->{ description }); } $row->{ description } = strip_slashes($row->{ description }); if ( ( $row->{ source_name } eq 'aniin.com' ) || ( $row->{ source_name } eq 'IANS.in' ) ) { my $encoded_title = $row->{ title }; $encoded_title =~ s/[^a-zA-Z0-9]/-/g; $encoded_title =~ s/\-(\-+)/-/g; $encoded_title =~ s/^(\-+)//g; $encoded_title =~ s/(\-+)$//g; $row->{ won_link } = "http://www.indiasnews.com/News-" . $row->{ permaid } . "-$encoded_title.html"; $row->{ link } = $row->{ won_link }; } #Trick: if 0 views generate random between 0 and 10; if ( $row->{ votes } eq 0 ) { $row->{ votes } = int( rand( 10 ) ); } $row->{ pub_date } = format_pub_date( $row->{ pub_date } ); $row->{ enc_category } = encode_entities( $row->{ cname } ); return $row; } sub get_short_description{ my $description = shift(); $description = strip_slashes($description); my $break_char_index = index($description, '', 200); if ($break_char_index > -1) { $break_char_index += 4; # Also add the length of }else{ $break_char_index = index($description, ' ', 200); } $description = substr( $description, 0, $break_char_index ) . "..."; return $description; } sub format_pub_date { my $pub_date = shift(); #2008-04-13 21:12:38 => 1210702358 my @date_time = split / /, $pub_date; my ( $year, $month, $day ) = split /\-/, $date_time[ 0 ]; my ( $hour, $minute, $second ) = split /\:/, $date_time[ 1 ]; if ( $day == 0 ) { $day = 1; } =debug select (STDOUT); print "$pub_date \n"; print "$second, $minute, $hour, $day, $month, $year \n\n"; =cut $pub_date = time() - timelocal( $second, $minute, $hour, $day, $month - 1, $year ); my $tmp_time = $pub_date; my ( $s, $mi, $h, $d ); if ( $tmp_time > 60 ) { $mi = int( $tmp_time / 60 ); $s = $tmp_time % 60; if ( $mi > 60 ) { $h = int( $mi / 60 ); $mi = $mi % 60; if ( $h > 24 ) { $d = int( $h / 24 ); $h = $h % 24; } } } else { $mi = $tmp_time; } $pub_date = ''; if ( abs( "$d" ) > 0 ) { $pub_date = $d . " days ago"; } else { if ( $h > 0 ) { $pub_date .= $h . " hours and "; } $pub_date .= $mi . " minutes ago"; } return $pub_date; } sub decode_mysql_date { my $pub_date = shift(); #2008-04-13 21:12:38 my @date_time = split / /, $pub_date; my ( $year, $month, $day ) = split /\-/, $date_time[ 0 ]; my ( $hour, $minute, $second ) = split /\:/, $date_time[ 1 ]; my $ret_val = ""; if ( ( $year > 0 ) && ( $day > 0 ) ) { $pub_date = timelocal( $second, $minute, $hour, $day, $month - 1, $year ); $pub_date = scalar localtime( $pub_date ); $pub_date =~ s/( +)/ /g; my @date_array = split / /, $pub_date; my @time_array = split /:/, $date_array[ 3 ]; $ret_val = sprintf( "%s %s, %s %s:%s", $date_array[ 1 ], $date_array[ 2 ], $date_array[ 4 ], $time_array[ 0 ], $time_array[ 1 ] ); } else { $ret_val = $pub_date; } return $ret_val; } #Creates a database connection and returns databasehandler sub init_database { my $config_file_path = shift(); my $config_xml = XMLin( $config_file_path ); my $db_host = $config_xml->{ parserSettings }{ db_host }; my $db_name = $config_xml->{ parserSettings }{ db_name }; my $db_user = $config_xml->{ parserSettings }{ db_user }; my $db_password = $config_xml->{ parserSettings }{ db_password }; if ( $db_password eq "''" ) { $db_password = ''; } my $dbh = DBI->connect( "dbi:mysql:$db_name:$db_host", "$db_user", "$db_password" ) or die( "Cannot connect to the database" ); return $dbh; } sub create_cache_file_name { my ( $cat, $keyword, $news_id, $option, $start_record, $bottom_menu_id ) = @_; # #Create cache file name # my $cache_file_name = ''; if ( $cat ) { $cache_file_name = $cat; } if ( $keyword ) { $cache_file_name = $keyword; } $cache_file_name .= $news_id . $option . $start_record . $bottom_menu_id; $cache_file_name =~ s/[^a-z0-9A-Z]//g; # #Treate cache # #Split the cache in subdirectories in order to be retreived quickly #In this case will be implemented a three level cache mechanism for ( my $i = 0 ; $i < 3 ; $i++ ) { my $cache_dirLi = substr( $cache_file_name, $i, 1 ); $cache_dir = "$cache_dir/$cache_dirLi"; #$cache_dir is global if ( !( -e "$cache_dir" && -d "$cache_dir" ) ) { mkdir( "$cache_dir" ); chmod 0777, "$cache_dir"; } } $cache_file_name = $cache_dir . "/" . $cache_file_name; return $cache_file_name; } sub try_to_get_cache { my $cache_file_name = shift(); my @cache_stat = stat( "$cache_file_name.ch" ); my $cache_mtime = $cache_stat[ 9 ]; my $cache_size = $cache_stat[ 7 ]; my $current_time = time(); my $return_value = ""; if ( ( !$cache_mtime ) ) { $cache_mtime = 0; open CFH, "> $cache_file_name.ch"; close CFH; $DBG->show( "Closing CFH on checkTheCache function" ); } $DBG->show( "Cache Data \n CacheSize:$cache_size \n CacheModifiedTime:$cache_mtime \n CacheLife:" . ( $current_time - $cache_mtime ) . " \n Keyword:$keyword \n Option:$option " ); if ( ( $cache_size > 1000 ) && ( $cache_mtime > 0 ) && ( $current_time - $cache_mtime < $cache_time ) ) { $return_value = file_get_contents( "$cache_file_name.ch" ); $return_value .= "\n"; $return_value .= "\n"; } else { $return_value = ''; } return $return_value; } sub save_to_cache { my $tmp_cache_file_name = shift(); my $cache_file_name = shift(); if ( $tmp_cache_file_name ne "" ) { close( FH ); $DBG->show( "Closing FH on save_to_cache function" ); chmod 0777, "$tmp_cache_file_name.ch"; select( STDOUT ); my @cacheStat = stat( "$tmp_cache_file_name.ch" ); if ( $cacheStat[ 7 ] > 1000 ) { #stat[7] = filesize if ( unlink "$cache_file_name.ch" ) { $DBG->show( "File $cache_file_name.ch deleted ...\n" ); } else { $DBG->show( "File $cache_file_name.ch can not be deleted ...\n" ); } if ( rename "$tmp_cache_file_name.ch", "$cache_file_name.ch" ) { $DBG->show( "$tmp_cache_file_name.ch renamed to $cache_file_name.ch...\n" ); } else { $DBG->show( "$tmp_cache_file_name.ch can not be renamed to $cache_file_name.ch...\n" ); } } } } #Include a file sub include { my $fileName = shift(); open IFH, "<" . $fileName; while ( ) { print $_; } close( IFH ); $DBG->show( "Closing IFH on include function" ); } #Initiates tho collect the content to be saved into the cache sub start_collect_cache { my $cache_file_name = shift(); #Open cache file handler my $tmp_cache_file_name = $cache_file_name . time(); open FH, "> " . $tmp_cache_file_name . ".ch"; select( FH ); return $tmp_cache_file_name; } #Gets content from a file sub file_get_contents { my $file_name = shift(); my @content_lines = (); open( TMPFH, $file_name ); @content_lines = ; close TMPFH; return join( "\n", @content_lines ); } #Returh the is_homepage glag sub get_first_page_flag { my $q = shift(); my $ret_val = 0; if ( !$q->param( 'cat' ) && ( ( !$q->param( 'option' ) ) || ( $q->param( 'option' ) eq 'specops' ) ) && !$q->param( 'keyword' ) ) { $ret_val = 1; } return $ret_val; } #Visit a news sub visit_news { my $id = shift(); get( "http://wssearch.worldnewx.com/ws_status.pl?apikey=worldnewx.com-1277066279&opt=vis&permaid=$id" ); } #Vote for a news sub vote_news { my $id = shift(); get( "http://wssearch.worldnewx.com/ws_status.pl?apikey=worldnewx.com-1277066279&opt=vot&permaid=$id" ); } sub select_STDOUT { close( FH ); select( STDOUT ); $DBG->show( "Closing FH and selecting STDOUT on select_STDOUT function" ); } sub mysql_query { my $sql = shift(); my $dbh = shift(); my $sth = $dbh->prepare( $sql ); $sth->execute() or die( "Invalid query ($sql) !!!" ); $sth->finish(); } #Returns the categories array sub get_categories_array { my $dbh = shift(); my $clevel = shift(); my $sql = "SELECT * FROM `category`"; if ( $clevel > 0 ) { $sql .= " WHERE `clevel`=$clevel"; } $sql .= " ORDER BY `weight` DESC, `title` ASC"; my $sth = $dbh->prepare( $sql ); $sth->execute() || die( "Could not execute sql !!!" ); my @category_array = (); while ( my $cat_rows = $sth->fetchrow_hashref ) { push( @category_array, { 'id' => $cat_rows->{ 'id' }, 'title' => $cat_rows->{ 'title' }, 'link' => url_encode( $cat_rows->{ 'title' } ) } ); } $sth->finish(); return @category_array; } sub CategoryName2Id { my $category_name = shift(); my $sql = "SELECT `alias` FROM `category` WHERE `title`='$category_name'"; my $sth = $dbh->prepare( $sql ); $sth->execute() || die( "Could not execute sql !!!" ); my $cat_row = $sth->fetchrow_hashref; return ( ( $aArchiveIndex{ lc( substr( $category_name, 0, 1 ) ) } << 27 ) + $cat_row->{ alias } ); } sub url_encode { my ( $string ) = @_; $string =~ s/(\W)/"%" . unpack("H2", $1)/ge; #$string# =~ tr/.//; return $string; } sub url_decode { my ( $string ) = @_; $string =~ tr/+/ /; $string =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; return $string; } sub get_description { my $content = shift(); return strip_slashes(strip_tags($content)); } sub strip_tags{ my $content = shift(); $content =~ s/\<([^>]+?)\>/ /g; $content =~ s/ +/ /g; return $content; } sub strip_slashes{ my $content = shift(); $content =~ s/\\//g; return $content; } sub get_keywords { my $content = shift(); my $commonWordsArray = "able|about|after|again|all|almost|already|also|although|am|an|and|another|any|are|are|around|as|at|based|be|because|been|before|being|between|both|bring|but|by|came|can|com|come|comes|could|did|do|does|doing|done|each|eight|else|etc|even|every|five|for|four|from|get|gets|getting|go|going|got|had|has|have|he|he|her|here|him|himself|his|how|however|href|http|if|in|including|into|is|it|it|its|just|kb|know|like|looks|mailto|make|making|many|may|mb|me|means|might|more|more|most|move|mr|much|must|my|need|needs|never|nice|nine|no|not|now|of|often|oh|ok|on|on|one|only|or|org|other|our|out|over|own|piece|rather|re|really|said|same|say|says|see|seven|several|she|should|since|single|six|so|some|something|still|stuff|such|take|ten|than|that|the|their|them|them|then|there|there|these|they|they|thing|things|this|those|three|through|to|too|took|two|under|up|us|use|used|using|usual|ve|very|via|want|was|way|we|we|well|were|what|when|where|whether|which|while|whilst|who|why|will|with|within|would|yes|yet|you|your"; $content =~ s/\b($commonWordsArray)\b//g; $content =~ s/<([^>]+?)>//g; $content =~ s/(\s+)/,/g; $content =~ s/,(,+)/,/g; return $content; } =start /** * Creates the navigation bar * @param int $start_record, * @param int $pps, * @param int $total_estimated * *@return string */ =cut sub get_nav_bar { my ( $start_record, $pps, $no_of_records ) = @_; my $uri = $ENV{ REQUEST_URI }; #Get $uri like prefix-Title-s00?p1=v1&p2=v2 $uri =~ s/\-s(\d+?)\b//; #Format $uri like prefix-Title?p1=v1&p2=v2 my $request_uri = $uri; my $total_pages = ceil( $no_of_records / $pps ); my $current_page = ceil( $start_record / $pps ); my $navbar_tpl = HTML::Template->new( filename => "templates/nav_bar.tpl" ); #Construct PREV link my $prev_link = $uri; if ( $start_record > 0 ) { my $start = 0; if ( $start_record - $pps >= 0 ) { $start = $start_record - $pps; } $prev_link =~ s/(\?|$)/-s$start$1/; } my $show_prev = 0; if ( $start_record > 0 ) { $show_prev = 1; } $navbar_tpl->param( show_prev => $show_prev ); $navbar_tpl->param( link_prev => $prev_link ); #Construct NEXT link my $next_link = $uri; if ( $start_record < $no_of_records ) { my $start = $no_of_records; if ( $start_record + $pps <= $no_of_records ) { $start = $start_record + $pps; } $next_link =~ s/(\?|$)/-s$start$1/; } my $show_next = 0; if ( $start_record < $no_of_records ) { $show_next = 1; } $navbar_tpl->param( show_next => $show_next ); $navbar_tpl->param( link_next => $next_link ); #return ""; my $tmp_page; my @pages_array = (); my @progress = ( 1000, 100, 10, 5, 4, 3, 2, 1 ); if ( $request_uri eq '/index.pl?skipcache=y') { $request_uri = 'Top+Stories'; =start my $OLD_FH = select(); select (STDOUT); print ""; select ($OLD_FH); =cut } my $page_link = ""; my $page_nr; foreach $step ( @progress ) { $page_link = $request_uri; my $start = 0; if ( $start_record - $step * $pps >= 0 ) { $start = $start_record - $step * $pps; $page_nr = ceil( $start / $pps ) + 1; $page_link =~ s/(\?|$)/-s$start$1/; push( @pages_array, { 'link_number' => $page_link, 'number' => $page_nr, 'selected' => 0 } ); } } $page_nr = ceil( $start_record / $pps ) + 1; push( @pages_array, { 'link_number' => $request_uri, 'number' => $page_nr, 'selected' => 1 } ); @progress = reverse @progress; foreach $step ( @progress ) { $page_link = $request_uri; my $start = 0; if ( $start_record + $step * $pps <= $no_of_records ) { $start = $start_record + $step * $pps; $page_nr = ceil( $start / $pps ) + 1; $page_link =~ s/(\?|$)/-s$start$1/; push( @pages_array, { 'link_number' => $page_link, 'number' => $page_nr, 'selected' => 0 } ); } } $navbar_tpl->param( pages_array => \@pages_array ); return $navbar_tpl->output(); } sub echo { my $OLD_FH = select(); select( STDOUT ); print Dumper( \@_ ); select( $OLD_FH ); } sub get_comments_list { # Get the comments list my $comments_base_url = "http://wssearch.worldnewx.com/ws_comments.pl?apikey=worldofnews.com-1495998270"; my $comments_list_url = $comments_base_url . "&opt=get&id=0&docid=$news_id"; my @tmp_comments_array = get_and_unserialize( $comments_list_url ); @tmp_comments_array = @{ $tmp_comments_array[ 0 ][ 1 ] }; my @comments_array = (); my $iterator = 0; foreach ( @tmp_comments_array ) { if ( $_->{ pending_delete } eq 'n' ) { $_->{ pending_delete } = 0; } #pending delete $_->{ usermail } = ''; #Hide email $_->{ apikey } = ''; #Hide api key $_->{ bg_color } = ( $iterator % 2 == 0 ) ? '#FFFFFF' : '#FFFF99'; #Add background color push( @comments_array, $_ ); $iterator++; } my $comments_list = ""; if ( $#comments_array > -1 ) { my $tpl_comment_list = HTML::Template->new( filename => "templates/comment_body.tpl", global_vars => 1 ); $tpl_comment_list->param( 'comments_array' => \@comments_array ); $comments_list = $tpl_comment_list->output(); } return $comments_list; } sub print_server_busy_message{ my $message = shift(); print "

$message

\n
\n"; print "Server busy! Please try again in a few seconds !"; exit(); } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::: CLASS DEBUG ::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: package DEBUG; use Data::Dumper; my $flag = 0; #1 = debug activated my $__START_TIME__; sub new() { $__START_TIME__ = time(); bless {}, shift(); } #Gets the start time of the debug sub get_start_time { return $__START_TIME__; } #Show the debug message according with the flag sub show { my $this = shift(); my $message = shift(); if ( $flag == 1 ) { my $hash = shift(); my $OLD_FH = select(); select( STDOUT ); print Dumper( $message ); select( $OLD_FH ); } } #Sets a value for the flag sub set_flag { my $this = shift(); my $newVal = shift(); $flag = $newVal; } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1; /$ad_manager_content/; return $content; } sub get_and_unserialize { my $url = shift(); my $serialized_news = get( $url ); my @news_array = (); eval { @news_array = unserialize( $serialized_news ); }; if ( $@ ) { print( "\n\n Error: $serialized_news \n\n" ); print Dumper( $@ ); exit(); } return @news_array; } sub get_worldinphotos_image { my $url = "http://www.worldinphotos.com/ws_export/300x250/tags/world.jpg"; return unserialize( get( $url ) ); } #Returns the array for the right section sub create_right_section { my $dbh = shift(); my @special_category_array = ( 268435469, # Business 671088651, # Education 671088644, # Entertainment 1073741831, # Health 1610612742, # Law 1744830518, # Movie News 1744830569, # Music 2550136844, # Sports 2684354563, # Technology 2818572289, # Us 3087007746 # World ); my $return_content = ""; foreach my $category ( @special_category_array ) { my $section_tpl = HTML::Template->new( filename => "templates/news_section.tpl" ); my @tmp_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=2&c=$category" ); my @tmp_data_arr = @{ $tmp_array[ 0 ]->{ records } }; @tmp_array = (); foreach ( @tmp_data_arr ) { $_->{ enc_category } = url_encode( $_->{ cname } ); $_->{ img } = ""; if ( length( $_->{ description } ) > 55 ) { my $break_char_index = index($_->{ description }, '', 55); if ($break_char_index > -1) { $break_char_index += 4; # Also add the length of $_->{ description } = substr( $_->{ description }, 0, $break_char_index ) . "..."; } # $_->{ description } = substr( $_->{ description }, 0, 55 ) . " ..."; } $_->{ description } = strip_slashes($_->{ description }); $_->{ pub_date } = format_pub_date( $_->{ pub_date } ); push( @tmp_array, $_ ); } $section_tpl->param( enc_category_name => $tmp_array[ 0 ]->{ enc_category } ); $section_tpl->param( category_name => $tmp_array[ 0 ]->{ cname } ); $section_tpl->param( news_section => \@tmp_array ); $return_content .= $section_tpl->output(); } return $return_content; } sub get_news_array { my $cat_id = shift(); my @tmp_array = get_and_unserialize( $news_search_link . "&opt=cat&nr=5&c=$cat_id" ); return @{ $tmp_array[ 0 ]->{ records } }; } sub create_news_list_content { my @news_list = @{ shift() }; my $news_vlist_content = ''; if ( $#news_list > -1 ) { foreach my $row ( @news_list ) { $news_vlist_content .= format_story( $row ); } } else { $news_vlist_content .= format_story( 0 ); } return $news_vlist_content; } sub format_story { my $row = shift(); my $news_vlist_content = ''; ################################################### my $news_content = HTML::Template->new( filename => "templates/news_body.tpl" ); if ( $row ) { $row = adjust_news_object_fields( $row ); $news_content->param( 'id' => $row->{ permaid } ); $news_content->param( 'link' => $row->{ link } ); $news_content->param( 'won_link' => $row->{ won_link } ); $news_content->param( 'title' => $row->{ title } ); $news_content->param( 'description' => $row->{ description } ); $news_content->param( 'site_name' => $row->{ source_name } ); $news_content->param( 'pub_date' => $row->{ pub_date } ); $news_content->param( 'topic' => $row->{ cname } ); $news_content->param( 'img' => $row->{ img } ); $news_content->param( 'visits' => $row->{ visits } ); } else { $news_content->param( 'no_records' => 1 ); } $news_vlist_content .= $news_content->output(); #push ( @topstories_array, { 'title' => $rows[2], 'description' => $rows[3]}); return $news_vlist_content; } =start /** * @param object $row * @param character $limit_description_length * * @return object */ =cut sub adjust_news_object_fields { my $row = shift(); my $limit_description_length = shift(); $limit_description_length = 'y' unless defined $limit_description_length; $row->{ cat_id } = int( $row->{ cat_id } ); $row->{ geo_id } = int( $row->{ geo_id } ); $row->{ permaid } = int( $row->{ permaid } ); #$row->{won_link} = "/view-" . $row->{permaid} . ".html"; =start $row->{description} = decode_entities($row->{description}); $row->{description} =~ s/<([^<]+?)>//g; $row->{title} =~ s/<([^<]+?)>//g; =cut if ( ( length( $row->{ description } ) > 200 ) && ( $limit_description_length eq 'y' ) ) { $row->{ description } = get_short_description($row->{ description }); } $row->{ description } = strip_slashes($row->{ description }); if ( ( $row->{ source_name } eq 'aniin.com' ) || ( $row->{ source_name } eq 'IANS.in' ) ) { my $encoded_title = $row->{ title }; $encoded_title =~ s/[^a-zA-Z0-9]/-/g; $encoded_title =~ s/\-(\-+)/-/g; $encoded_title =~ s/^(\-+)//g; $encoded_title =~ s/(\-+)$//g; $row->{ won_link } = "http://www.indiasnews.com/News-" . $row->{ permaid } . "-$encoded_title.html"; $row->{ link } = $row->{ won_link }; } #Trick: if 0 views generate random between 0 and 10; if ( $row->{ votes } eq 0 ) { $row->{ votes } = int( rand( 10 ) ); } $row->{ pub_date } = format_pub_date( $row->{ pub_date } ); $row->{ enc_category } = encode_entities( $row->{ cname } ); return $row; } sub get_short_description{ my $description = shift(); $description = strip_slashes($description); my $break_char_index = index($description, '', 200); if ($break_char_index > -1) { $break_char_index += 4; # Also add the length of }else{ $break_char_index = index($description, ' ', 200); } $description = substr( $description, 0, $break_char_index ) . "..."; return $description; } sub format_pub_date { my $pub_date = shift(); #2008-04-13 21:12:38 => 1210702358 my @date_time = split / /, $pub_date; my ( $year, $month, $day ) = split /\-/, $date_time[ 0 ]; my ( $hour, $minute, $second ) = split /\:/, $date_time[ 1 ]; if ( $day == 0 ) { $day = 1; } =debug select (STDOUT); print "$pub_date \n"; print "$second, $minute, $hour, $day, $month, $year \n\n"; =cut $pub_date = time() - timelocal( $second, $minute, $hour, $day, $month - 1, $year ); my $tmp_time = $pub_date; my ( $s, $mi, $h, $d ); if ( $tmp_time > 60 ) { $mi = int( $tmp_time / 60 ); $s = $tmp_time % 60; if ( $mi > 60 ) { $h = int( $mi / 60 ); $mi = $mi % 60; if ( $h > 24 ) { $d = int( $h / 24 ); $h = $h % 24; } } } else { $mi = $tmp_time; } $pub_date = ''; if ( abs( "$d" ) > 0 ) { $pub_date = $d . " days ago"; } else { if ( $h > 0 ) { $pub_date .= $h . " hours and "; } $pub_date .= $mi . " minutes ago"; } return $pub_date; } sub decode_mysql_date { my $pub_date = shift(); #2008-04-13 21:12:38 my @date_time = split / /, $pub_date; my ( $year, $month, $day ) = split /\-/, $date_time[ 0 ]; my ( $hour, $minute, $second ) = split /\:/, $date_time[ 1 ]; my $ret_val = ""; if ( ( $year > 0 ) && ( $day > 0 ) ) { $pub_date = timelocal( $second, $minute, $hour, $day, $month - 1, $year ); $pub_date = scalar localtime( $pub_date ); $pub_date =~ s/( +)/ /g; my @date_array = split / /, $pub_date; my @time_array = split /:/, $date_array[ 3 ]; $ret_val = sprintf( "%s %s, %s %s:%s", $date_array[ 1 ], $date_array[ 2 ], $date_array[ 4 ], $time_array[ 0 ], $time_array[ 1 ] ); } else { $ret_val = $pub_date; } return $ret_val; } #Creates a database connection and returns databasehandler sub init_database { my $config_file_path = shift(); my $config_xml = XMLin( $config_file_path ); my $db_host = $config_xml->{ parserSettings }{ db_host }; my $db_name = $config_xml->{ parserSettings }{ db_name }; my $db_user = $config_xml->{ parserSettings }{ db_user }; my $db_password = $config_xml->{ parserSettings }{ db_password }; if ( $db_password eq "''" ) { $db_password = ''; } my $dbh = DBI->connect( "dbi:mysql:$db_name:$db_host", "$db_user", "$db_password" ) or die( "Cannot connect to the database" ); return $dbh; } sub create_cache_file_name { my ( $cat, $keyword, $news_id, $option, $start_record, $bottom_menu_id ) = @_; # #Create cache file name # my $cache_file_name = ''; if ( $cat ) { $cache_file_name = $cat; } if ( $keyword ) { $cache_file_name = $keyword; } $cache_file_name .= $news_id . $option . $start_record . $bottom_menu_id; $cache_file_name =~ s/[^a-z0-9A-Z]//g; # #Treate cache # #Split the cache in subdirectories in order to be retreived quickly #In this case will be implemented a three level cache mechanism for ( my $i = 0 ; $i < 3 ; $i++ ) { my $cache_dirLi = substr( $cache_file_name, $i, 1 ); $cache_dir = "$cache_dir/$cache_dirLi"; #$cache_dir is global if ( !( -e "$cache_dir" && -d "$cache_dir" ) ) { mkdir( "$cache_dir" ); chmod 0777, "$cache_dir"; } } $cache_file_name = $cache_dir . "/" . $cache_file_name; return $cache_file_name; } sub try_to_get_cache { my $cache_file_name = shift(); my @cache_stat = stat( "$cache_file_name.ch" ); my $cache_mtime = $cache_stat[ 9 ]; my $cache_size = $cache_stat[ 7 ]; my $current_time = time(); my $return_value = ""; if ( ( !$cache_mtime ) ) { $cache_mtime = 0; open CFH, "> $cache_file_name.ch"; close CFH; $DBG->show( "Closing CFH on checkTheCache function" ); } $DBG->show( "Cache Data \n CacheSize:$cache_size \n CacheModifiedTime:$cache_mtime \n CacheLife:" . ( $current_time - $cache_mtime ) . " \n Keyword:$keyword \n Option:$option " ); if ( ( $cache_size > 1000 ) && ( $cache_mtime > 0 ) && ( $current_time - $cache_mtime < $cache_time ) ) { $return_value = file_get_contents( "$cache_file_name.ch" ); $return_value .= "\n"; $return_value .= "\n"; } else { $return_value = ''; } return $return_value; } sub save_to_cache { my $tmp_cache_file_name = shift(); my $cache_file_name = shift(); if ( $tmp_cache_file_name ne "" ) { close( FH ); $DBG->show( "Closing FH on save_to_cache function" ); chmod 0777, "$tmp_cache_file_name.ch"; select( STDOUT ); my @cacheStat = stat( "$tmp_cache_file_name.ch" ); if ( $cacheStat[ 7 ] > 1000 ) { #stat[7] = filesize if ( unlink "$cache_file_name.ch" ) { $DBG->show( "File $cache_file_name.ch deleted ...\n" ); } else { $DBG->show( "File $cache_file_name.ch can not be deleted ...\n" ); } if ( rename "$tmp_cache_file_name.ch", "$cache_file_name.ch" ) { $DBG->show( "$tmp_cache_file_name.ch renamed to $cache_file_name.ch...\n" ); } else { $DBG->show( "$tmp_cache_file_name.ch can not be renamed to $cache_file_name.ch...\n" ); } } } } #Include a file sub include { my $fileName = shift(); open IFH, "<" . $fileName; while ( ) { print $_; } close( IFH ); $DBG->show( "Closing IFH on include function" ); } #Initiates tho collect the content to be saved into the cache sub start_collect_cache { my $cache_file_name = shift(); #Open cache file handler my $tmp_cache_file_name = $cache_file_name . time(); open FH, "> " . $tmp_cache_file_name . ".ch"; select( FH ); return $tmp_cache_file_name; } #Gets content from a file sub file_get_contents { my $file_name = shift(); my @content_lines = (); open( TMPFH, $file_name ); @content_lines = ; close TMPFH; return join( "\n", @content_lines ); } #Returh the is_homepage glag sub get_first_page_flag { my $q = shift(); my $ret_val = 0; if ( !$q->param( 'cat' ) && ( ( !$q->param( 'option' ) ) || ( $q->param( 'option' ) eq 'specops' ) ) && !$q->param( 'keyword' ) ) { $ret_val = 1; } return $ret_val; } #Visit a news sub visit_news { my $id = shift(); get( "http://wssearch.worldnewx.com/ws_status.pl?apikey=worldnewx.com-1277066279&opt=vis&permaid=$id" ); } #Vote for a news sub vote_news { my $id = shift(); get( "http://wssearch.worldnewx.com/ws_status.pl?apikey=worldnewx.com-1277066279&opt=vot&permaid=$id" ); } sub select_STDOUT { close( FH ); select( STDOUT ); $DBG->show( "Closing FH and selecting STDOUT on select_STDOUT function" ); } sub mysql_query { my $sql = shift(); my $dbh = shift(); my $sth = $dbh->prepare( $sql ); $sth->execute() or die( "Invalid query ($sql) !!!" ); $sth->finish(); } #Returns the categories array sub get_categories_array { my $dbh = shift(); my $clevel = shift(); my $sql = "SELECT * FROM `category`"; if ( $clevel > 0 ) { $sql .= " WHERE `clevel`=$clevel"; } $sql .= " ORDER BY `weight` DESC, `title` ASC"; my $sth = $dbh->prepare( $sql ); $sth->execute() || die( "Could not execute sql !!!" ); my @category_array = (); while ( my $cat_rows = $sth->fetchrow_hashref ) { push( @category_array, { 'id' => $cat_rows->{ 'id' }, 'title' => $cat_rows->{ 'title' }, 'link' => url_encode( $cat_rows->{ 'title' } ) } ); } $sth->finish(); return @category_array; } sub CategoryName2Id { my $category_name = shift(); my $sql = "SELECT `alias` FROM `category` WHERE `title`='$category_name'"; my $sth = $dbh->prepare( $sql ); $sth->execute() || die( "Could not execute sql !!!" ); my $cat_row = $sth->fetchrow_hashref; return ( ( $aArchiveIndex{ lc( substr( $category_name, 0, 1 ) ) } << 27 ) + $cat_row->{ alias } ); } sub url_encode { my ( $string ) = @_; $string =~ s/(\W)/"%" . unpack("H2", $1)/ge; #$string# =~ tr/.//; return $string; } sub url_decode { my ( $string ) = @_; $string =~ tr/+/ /; $string =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; return $string; } sub get_description { my $content = shift(); return strip_slashes(strip_tags($content)); } sub strip_tags{ my $content = shift(); $content =~ s/\<([^>]+?)\>/ /g; $content =~ s/ +/ /g; return $content; } sub strip_slashes{ my $content = shift(); $content =~ s/\\//g; return $content; } sub get_keywords { my $content = shift(); my $commonWordsArray = "able|about|after|again|all|almost|already|also|although|am|an|and|another|any|are|are|around|as|at|based|be|because|been|before|being|between|both|bring|but|by|came|can|com|come|comes|could|did|do|does|doing|done|each|eight|else|etc|even|every|five|for|four|from|get|gets|getting|go|going|got|had|has|have|he|he|her|here|him|himself|his|how|however|href|http|if|in|including|into|is|it|it|its|just|kb|know|like|looks|mailto|make|making|many|may|mb|me|means|might|more|more|most|move|mr|much|must|my|need|needs|never|nice|nine|no|not|now|of|often|oh|ok|on|on|one|only|or|org|other|our|out|over|own|piece|rather|re|really|said|same|say|says|see|seven|several|she|should|since|single|six|so|some|something|still|stuff|such|take|ten|than|that|the|their|them|them|then|there|there|these|they|they|thing|things|this|those|three|through|to|too|took|two|under|up|us|use|used|using|usual|ve|very|via|want|was|way|we|we|well|were|what|when|where|whether|which|while|whilst|who|why|will|with|within|would|yes|yet|you|your"; $content =~ s/\b($commonWordsArray)\b//g; $content =~ s/<([^>]+?)>//g; $content =~ s/(\s+)/,/g; $content =~ s/,(,+)/,/g; return $content; } =start /** * Creates the navigation bar * @param int $start_record, * @param int $pps, * @param int $total_estimated * *@return string */ =cut sub get_nav_bar { my ( $start_record, $pps, $no_of_records ) = @_; my $uri = $ENV{ REQUEST_URI }; #Get $uri like prefix-Title-s00?p1=v1&p2=v2 $uri =~ s/\-s(\d+?)\b//; #Format $uri like prefix-Title?p1=v1&p2=v2 my $request_uri = $uri; my $total_pages = ceil( $no_of_records / $pps ); my $current_page = ceil( $start_record / $pps ); my $navbar_tpl = HTML::Template->new( filename => "templates/nav_bar.tpl" ); #Construct PREV link my $prev_link = $uri; if ( $start_record > 0 ) { my $start = 0; if ( $start_record - $pps >= 0 ) { $start = $start_record - $pps; } $prev_link =~ s/(\?|$)/-s$start$1/; } my $show_prev = 0; if ( $start_record > 0 ) { $show_prev = 1; } $navbar_tpl->param( show_prev => $show_prev ); $navbar_tpl->param( link_prev => $prev_link ); #Construct NEXT link my $next_link = $uri; if ( $start_record < $no_of_records ) { my $start = $no_of_records; if ( $start_record + $pps <= $no_of_records ) { $start = $start_record + $pps; } $next_link =~ s/(\?|$)/-s$start$1/; } my $show_next = 0; if ( $start_record < $no_of_records ) { $show_next = 1; } $navbar_tpl->param( show_next => $show_next ); $navbar_tpl->param( link_next => $next_link ); #return ""; my $tmp_page; my @pages_array = (); my @progress = ( 1000, 100, 10, 5, 4, 3, 2, 1 ); if ( $request_uri eq '/index.pl?skipcache=y') { $request_uri = 'Top+Stories'; =start my $OLD_FH = select(); select (STDOUT); print ""; select ($OLD_FH); =cut } my $page_link = ""; my $page_nr; foreach $step ( @progress ) { $page_link = $request_uri; my $start = 0; if ( $start_record - $step * $pps >= 0 ) { $start = $start_record - $step * $pps; $page_nr = ceil( $start / $pps ) + 1; $page_link =~ s/(\?|$)/-s$start$1/; push( @pages_array, { 'link_number' => $page_link, 'number' => $page_nr, 'selected' => 0 } ); } } $page_nr = ceil( $start_record / $pps ) + 1; push( @pages_array, { 'link_number' => $request_uri, 'number' => $page_nr, 'selected' => 1 } ); @progress = reverse @progress; foreach $step ( @progress ) { $page_link = $request_uri; my $start = 0; if ( $start_record + $step * $pps <= $no_of_records ) { $start = $start_record + $step * $pps; $page_nr = ceil( $start / $pps ) + 1; $page_link =~ s/(\?|$)/-s$start$1/; push( @pages_array, { 'link_number' => $page_link, 'number' => $page_nr, 'selected' => 0 } ); } } $navbar_tpl->param( pages_array => \@pages_array ); return $navbar_tpl->output(); } sub echo { my $OLD_FH = select(); select( STDOUT ); print Dumper( \@_ ); select( $OLD_FH ); } sub get_comments_list { # Get the comments list my $comments_base_url = "http://wssearch.worldnewx.com/ws_comments.pl?apikey=worldofnews.com-1495998270"; my $comments_list_url = $comments_base_url . "&opt=get&id=0&docid=$news_id"; my @tmp_comments_array = get_and_unserialize( $comments_list_url ); @tmp_comments_array = @{ $tmp_comments_array[ 0 ][ 1 ] }; my @comments_array = (); my $iterator = 0; foreach ( @tmp_comments_array ) { if ( $_->{ pending_delete } eq 'n' ) { $_->{ pending_delete } = 0; } #pending delete $_->{ usermail } = ''; #Hide email $_->{ apikey } = ''; #Hide api key $_->{ bg_color } = ( $iterator % 2 == 0 ) ? '#FFFFFF' : '#FFFF99'; #Add background color push( @comments_array, $_ ); $iterator++; } my $comments_list = ""; if ( $#comments_array > -1 ) { my $tpl_comment_list = HTML::Template->new( filename => "templates/comment_body.tpl", global_vars => 1 ); $tpl_comment_list->param( 'comments_array' => \@comments_array ); $comments_list = $tpl_comment_list->output(); } return $comments_list; } sub print_server_busy_message{ my $message = shift(); print "

$message

\n
\n"; print "Server busy! Please try again in a few seconds !"; exit(); } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::: CLASS DEBUG ::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: package DEBUG; use Data::Dumper; my $flag = 0; #1 = debug activated my $__START_TIME__; sub new() { $__START_TIME__ = time(); bless {}, shift(); } #Gets the start time of the debug sub get_start_time { return $__START_TIME__; } #Show the debug message according with the flag sub show { my $this = shift(); my $message = shift(); if ( $flag == 1 ) { my $hash = shift(); my $OLD_FH = select(); select( STDOUT ); print Dumper( $message ); select( $OLD_FH ); } } #Sets a value for the flag sub set_flag { my $this = shift(); my $newVal = shift(); $flag = $newVal; } #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1;
__AD_MANAGER_ADS__

 
Sports

Labor Day Road Race - 5K overall results
Sep 3, 2008 18:14
5K OVERALL RESULTMore Labor Day Road Race results3 2/69 Stephen Bowers 17 M LOCUST GROVE GA 16:39.25 90100 8/39 Morreco Tharpe 26 M DANVILLE GA 21:46.70 1500101 3/44 Victoria Coppage 14 F MACON GA 21:47.52 173102 1/37 Sherri Hintz 53 F VILLA RICA GA 21:49.56 353103 9/72 Bruce Miles 49 M KATHLEEN GA 21:49.81 510104 4/54 Chrisann Wilkes 44 F NORCROSS GA 21:54.10 820105 3/42 Joseph Knoll 30 M MACON GA 21:54.27 431106 36/69 Carlyle Glance 17 M MACON GA 21:54.57 288107 10/72 Joel Hightower 48 M MACON GA 21:55.27 1448108 9/35 Brandt Orr 24 M MACON GA 21:55.67 572109 37/69 Max Boston 16 M MACON GA 21:56.93 88110 4/44 Maddie Anderskow 14 F MACON GA 21:57.44 1360111 38/69 Phillip Johnson 17 M MACON GA 22:00.27 389112 5/58 Jacob Burgamy 11 M TENNILLE GA 22:00.69 124113 6/58 Barret Ham 11 M MACON GA 22:01.42 315114 7/84 Tim Jordan 42 M WARNER ROBINS GA 22:02.32 399115 1/35 Emily Berndt 27 F WARNER ROBINS GA 22:02.78 68116 2/60 April Willingham 37 F FORSYTH GA 22:03.87 1311117 8/84 Eric Roddenberry 41 M MACON GA 22:05.55 631118 39/69 Evan Acres 17 M WARNER ROBINS GA 22:07.43 3119 9/39 Keith Carter 29 M MACON GA 22:08.34 1341120 11/72 F.M. Barron 45 M MACON GA 22:09.12 47121 9/84 Phillip Burnette 44 M WARNER ROBINS GA 22:10.91 128122 1/60 Kitty Robinson 32 F CULLODEN GA 22:12.41 1339123 8/51 Emily Kanniard 15 F LOCUST GROVE GE 22:15.87 408124 10/39 Jeffrey Hunter 26 M BYRON GA 22:16.00 366125 40/69 Ben Fuller 17 M MACON GA 22:21.49 1558126 10/84 Darryl Turner 44 M MUSELLA GA 22:24.35 922127 9/51 Stephanie Sawyer 17 F MACON GA 22:26.06 659128 3/55 Charlie Manson 50 M ELKO GA 22:27.39 465129 41/69 Stephen Thomas 16 M LIZELLA GA 22:27.45 743130 11/84 Scott Vinson 42 M MACON GA 22:27.77 780131 4/42 Andy Thompson 34 M JEFFERSONVILLE GA 22:27.88 750132 42/69 Kurt Dzwonkowski 19 M WARNER ROBINS GE 22:33.45 228133 12/84 Tommmy McCoy 44 M WARNER ROBINS GA 22:33.53 1468134 7/58 Joe Lyghtel 14 M MACON GA 22:34.00 459135 43/69 Austin Hall 18 M JULIETTE GA 22:34.01 314136 13/84 Kelly Dent 41 M MCDONOUGH GE 22:34.43 208137 3/60 Heather Neal 37 F MACON GA 22:34.65 1482138 44/69 Hayes Parker 16 M MACON GA 22:35.09 1413139 1/29 Katie Willett 23 F MACON GA 22:36.02 822140 8/58 Tom McBrearty 14 M MACON GA 22:40.12 1372141 4/55 Steve Perdue 50 M GRAY GA 22:42.00 588142 5/42 Brian Ross 33 M GRAY GA 22:45.07 643143 12/72 Chris Long 46 M LOGANVILLE GA 22:47.11 454144 13/72 Tom Anderskow 48 M MACON GA 22:47.47 15145 10/35 Tyler Cummings 20 M MACON GA 22:47.82 185146 9/52 Bryan Mitchell 35 M MACON GA 22:48.46 519147 11/35 Philip Garner 24 M PERRY GA 22:51.83 280148 11/39 Benjamin Dishmond 27 M MACON GA 22:52.29 1406149 10/51 Lee Schroder 17 F MACON GA 22:53.01 1252150 10/52 Shannon Back 39 M MACONN GA 22:54.20 29151 45/69 Kyle Stapleton 17 M MACON GA 22:58.21 1323152 46/69 Steven Boatright 16 M SANDERSVILLE GA 22:58.81 81153 2/14 Ray Brannen 64 M MACON GA 22:59.55 102154 4/36 Gary Hosmer 57 M MARIETTA GA 23:00.44 362155 14/72 Darrell Watson 45 M FORSYTH GE 23:01.26 794156 14/84 James McGhee 42 M ELKO GA 23:01.84 898157 12/39 Darin Crowley 27 M BONAIRE GA 23:05.37 181158 15/84 Mark Justice 40 M KENNESAW GA 23:06.40 404159 47/69 Jim Langstaff 16 M MACON GA 23:08.39 1324160 48/69 Daniel Bates 19 M LIZELLA GA 23:09.31 51161 2/37 Susan Jones 53 F ATLANTA GA 23:12.47 1418162 16/84 Steve Matheney 44 M MACON GA 23:13.94 1545163 3/37 Dianne Perry 50 F HADDOCK GA 23:16.09 591164 5/54 Laurie Meilinger 43 F WARNER ROBINS GA 23:18.12 503165 12/35 Walker Garrett 24 M MACON GA 23:19.04 281166 13/35 Adam Mauldin 20 M WARNER ROBINS GA 23:20.95 479167 9/58 Conner McCue 12 M MACON GA 23:22.11 1328168 5/55 Joe Misiewicz 51 M WARNER ROBINS GA 23:23.72 899169 10/58 Torin Melville 14 M GA 23:25.70 1593170 11/51 Meredith Burgamy 16 F SANDERSVILLE GE 23:26.08 122171 1/7 Cheryl Vail 63 F LAWRENCEVILLE GA 23:27.74 778172 49/69 Burgess Brown 16 M MACON GA 23:30.06 113173 50/69 Andrew Mines 15 M MACON GA 23:30.64 517174 2/60 Jessica Butler 30 F MACON GA 23:31.47 129175 2/38 Angela Senzig 45 F WARNER ROBINS GA 23:32.26 665176 14/35 Andrew Benbow 24 M MACON GA 23:32.43 60177 11/58 Jon Henry Beers 13 M MACON GA 23:32.53 59178 13/39 Patrick Wells 26 M MACON GA 23:33.04 807179 51/69 Kamron Johnson 16 M MACON GA 23:34.61 1586180 12/58 David Napier 13 M WILLIAMSON GA 23:34.70 554181 5/36 David Pettigrew 58 M MILLEDGEVILLE GA 23:34.81 592182 13/58 Tanner Johnston 13 M MACON GA 23:35.31 1504183 6/55 Dave Grimsley 50 M MACON GA 23:36.92 306184 11/52 Damon Lawson 35 M MACON GA 23:37.36 1492185 15/72 Norris Hall 46 M MACON GA 23:37.89 885186 2/35 Laura Perazzola 26 F BONAIRE GA 23:39.00 586187 12/51 Ashley Blann 15 F FORSYTH GA 23:39.57 1420188 12/52 William Baxley 35 M MACON GA 23:40.19 55189 6/54 Cindy Phillips 43 F MACON GA 23:44.87 593190 14/39 Michael Stone 25 M LIZELLA GA 23:45.04 1302191 2/16 Joe Waters 66 M COVINGTON GA 23:45.88 791192 3/14 George Southgate 62 M CALHOUN GA 23:47.71 703193 15/35 Patrick Hoye 24 M MACON GA 23:50.84 1477194 2/29 Paige Jones 23 F ATLANTA GA 23:52.86 1419195 13/51 Lauren Sanders 16 F MACON GA 23:53.95 657196 6/42 Chris Horne 30 M MACON GA 23:54.00 361197 3/29 Tracy Welch 22 F PEACHTREE CITY GA 23:54.06 1251198 14/58 Daniel Alligood 13 M DUBLIN GA 23:56.80 1439199 17/84 Philip Brown 40 M MACON GA 24:01.29 116200 18/84 Phillip Wilder 41 M WARNER ROBINS GE 24:01.73 818201 15/58 Ethan Hammock 12 M MACON GE 24:03.97 319202 4/29 Marilyn Stephenson 22 F MACON GA 24:04.81 715203 4/60 Kimberly McGinnis 39 F MACON GA 24:07.62 492204 7/55 Scott Tankard 53 M MACON GA 24:11.28 729205 52/69 Hunter Lyle 16 M GRAY GA 24:11.85 461206 13/52 Patrick Wade 35 M WARNER ROBINS GA 24:12.99 924207 16/58 Evan Bates 14 M LIZELLA GA 24:13.70 52208 7/42 Cesar Zavala 33 M MONTERREY NL 24:17.45 849209 17/58 Louis Truett 14 M MACON GE 24:17.57 768210 16/72 Charles Jackson 49 M MACON GE 24:18.95 370211 8/55 Chris Tillitski 53 M MACON GA 24:19.80 1573212 9/55 Mike Childs 51 M LIZELLA GA 24:19.82 148213 14/52 James West 37 M GRAY GA 24:20.17 812214 6/36 Ronnie Kittrell 55 M GRAY GA 24:20.77 430215 3/16 Jack Grimes 68 M MACON GA 24:25.19 305216 15/39 Jon Frurtiel 27 M NASHVILLE TN 24:25.31 1591217 53/69 Cole Faircloth 15 M MACON GA 24:26.26 255218 54/69 Jonathan Jones 15 M MACON GA 24:27.39 395219 17/72 Barry Hutchinson 46 M MACON GA 24:30.30 367220 18/58 Caleb Watson 13 M FORSYTH GE 24:31.11 797221 14/51 Kristin Banks 15 F FORSYTH GA 24:31.94 39222 16/35 Christopher Ennis 23 M FORSYTH GA 24:31.99 245223 15/51 Ivy Knight 16 F COCHRAN GA 24:32.15 1608224 18/72 Rick Kahley 47 M MACON GA 24:32.94 405225 3/35 Melissa Ross 29 F GRAY GA 24:34.16 642226 5/44 Katie-Rose Alligood 13 F DUBLIN GA 24:35.47 1441227 16/51 Kizzi Butzin 15 F WARNER ROBINS GA 24:35.86 131228 4/35 Nicole Swain 28 F BONAIRE GA 24:36.23 724229 17/51 Julia Conforti 17 F MACON GA 24:36.40 1450230 19/58 David Clark 14 M MACON GE 24:36.52 151231 17/35 Jason Stone 22 M GRAY GA 24:39.21 718232 55/69 Dylan Pyles 15 M WARNER ROBINS GA 24:40.34 614233 7/36 Joseph Brogdon 57 M MACON GA 24:40.50 1416234 5/29 Neely Williams 22 F CONYERS GA 24:40.76 826235 19/72 Martin Mickalonis 46 M BONAIRE GA 24:42.08 504236 18/51 Erica Buchhammer 17 F MACON GA 24:42.17 121237 3/38 Patricia Watson 45 F FORSYTH GE 24:42.52 796238 19/51 Camille Mickalonis 17 F BONAIRE GA 24:43.33 506239 20/51 Christine Boddy 16 F MACON GA 24:43.88 1317240 6/44 Emily Brown 14 F MACON GA 24:44.80 114241 18/35 Wesley Tanner 22 M MILLEDGEVILLE GA 24:46.00 731242 6/29 Heather Harlow 23 F MACON GA 24:48.58 325243 10/55 Cam Oetter 51 M MACON GA 24:49.93 1534244 4/16 Andrew Mathis 68 M FT VALLEY GA 24:51.31 476245 20/72 Doug Carter 46 M MACON GA 24:51.78 139246 15/52 Bradford Pearce 35 M MACON GA 24:54.88 518247 19/35 Wes Pope 23 M MACON GA 24:56.73 1478248 56/69 Cory Smith 17 M TENNILLE GA 24:56.80 690249 5/35 Amy Grimsley 27 F DANVILLE GA 24:57.79 308250 16/52 Jonathan Moore 35 M MACON GA 24:59.14 529251 8/36 Eddie Dailey 57 M MACON GA 24:59.21 1483252 5/60 Michele Cranford 36 F COCHRAN GA 25:01.30 178253 7/54 Beth Lane 40 F SWAINSBORO GE 25:01.39 438254 21/72 David Blosser 48 M MACON GA 25:05.62 78255 6/35 Kristy Andrews 28 F GRAY GA 25:06.50 19256 11/55 Vance Cooper 51 M WARNER ROBINS GA 25:08.84 169257 22/72 Michael McCurdy 48 M WARNER ROBINS GA 25:10.92 1535258 8/42 Beau Swain 30 M BONAIRE GA 25:11.72 725259 20/58 William Roddenberry 12 M MACON GA 25:12.47 632260 57/69 Doug Evans 15 M MACON GA 25:12.67 1357261 6/60 Beth Braddy 38 F MACON GA 25:15.00 95262 23/72 Glenn Smith 48 M MACON GA 25:17.09 685263 17/52 Lester Williams 36 M MACON GA 25:21.50 928264 24/72 Ed Waddell 45 M MILLEDGEVILLE GA 25:21.53 782265 4/37 Patti Patterson 53 F CONYERS GA 25:22.81 577266 7/29 Betsy Pittard 21 F MACON GA 25:22.89 598267 4/38 Miriam Carter 45 F WARNER ROBINS GA 25:24.77 140268 9/42 Charlie Grimsley 31 M DANVILLE GA 25:24.91 309269 1/1 Yukiko Ryan 99 F MACON GA 25:26.90 650270 16/39 John Michael Phillips 29 M MACON GA 25:27.85 1303271 12/55 Bob Moon 53 M MACON GA 25:28.16 525272 7/35 Jennifer Bennett 28 F DUBLIN GA 25:29.82 62273 13/55 Dennis McShurley 54 M PHENIX CITY AL 25:30.90 499274 25/72 Greg Kanniard 46 M LOCUST GROVE GE 25:31.30 407275 26/72 Robert Taylor 47 M JULIETTE GA 25:33.53 735276 8/29 Annie Geminder 22 F MACON GA 25:36.91 284277 27/72 David Smith 45 M HOCKESSIN DE 25:38.05 684278 9/36 Joe Gerrity 55 M FERNANDINA BEACH F 25:39.61 285279 9/29 Rachel Duddles 23 F WARNER ROBINS GA 25:40.22 218280 14/55 Jerre Pearson 53 M MACON GA 25:41.16 581281 17/39 Manish Vashi 29 M PERRY GA 25:44.09 1515282 15/55 Joe Moran 52 M MACON GA 25:45.51 533283 58/69 Jamie Tanner 18 M MILLEDGEVILLE GA 25:53.79 730284 16/55 Thomas Curtis 54 M LIZELLA GA 25:54.21 1607285 19/84 Stacy Davis 41 M PERRY GA 25:54.30 193286 3/60 Audrey Boyette 33 F WARNER ROBINS GA 25:54.75 93287 7/44 Katie O'Quinn 12 F LIZELLA GA 25:54.97 1273288 18/52 Roberto Julkes 35 M JEFFERSONVILLE GA 25:55.74 1284289 8/44 Corrie Peake 13 F MACON GA 25:57.95 580290 20/84 Billy Barnes 41 M GRAY GA 25:58.50 856291 21/51 Rebecca Hutchinson 16 F MACON GA 25:58.66 368292 21/84 Brad Pyles 40 M MACON GE 25:59.77 613293 10/42 Matthew Jennings 32 M MACON GA 26:04.35 385294 19/52 Ernie Fields 37 M BONAIRE GA 26:04.93 262295 18/39 Greg Purser 28 M MACON GA 26:09.72 1350296 11/42 John Brooks 31 M ATHENS GA 26:11.34 106297 7/60 Shannon Juedeman 35 F WARNER ROBINS GA 26:12.00 403298 8/54 Tanya Melville 44 F MACON GA 26:13.15 1595299 12/42 John Herring 31 M MACON GA 26:14.48 1574300 28/72 Tim Perdue 47 M GRAY GA 26:17.22 589301 19/39 Jason Peaster 29 M WARNER ROBINS GA 26:19.41 1516302 29/72 Allen Peake 47 M MACON GA 26:20.73 137303 20/52 Michael Smith 35 M MACON GA 26:22.51 694304 21/52 Mel Bass 38 M MACON GA 26:22.86 49305 22/52 Jae Epps 37 M MACON GA 26:23.68 246306 4/60 Carson Gleaton 32 F THOMASTON GA 26:23.75 290307 8/60 Dina Pon 37 F MACON GA 26:26.21 600308 30/72 Mark Morgan 47 M MACON GA 26:30.48 1346309 20/39 Dustin Miles 28 M MACON GA 26:30.97 511310 13/42 William Shockley 34 M MACON GA 26:33.25 1566311 31/72 Craig Bowers 48 M LOCUST GROVE GA 26:34.51 89312 17/55 Tony Bloodworth 50 M FORSYTH GA 26:36.90 77313 22/51 Laura Langstaff 15 F MACON GA 26:38.59 1319314 21/39 Dallas Malone 29 M GRAY GA 26:39.36 464315 5/60 Susan Williams 34 F CADWELL GA 26:39.45 825316 6/60 Michelle Deeson 33 F COCHRAN GA 26:39.51 202317 5/38 Lisa Conforti 48 F MACON GA 26:40.22 1449318 20/35 Jonathan Godfrey 23 M MACON GA 26:41.59 295319 22/84 Tim McGinn 44 M MACON GA 26:41.72 1366320 9/60 Laurie Anthony 37 F ALBANY GA 26:42.80 1582321 22/39 Matthew Smith 29 M MACON GE 26:43.60 695322 18/55 Jim Elliott 51 M WARNER ROBINS GE 26:44.77 235323 23/84 Robert De Mille 43 M MACON GA 26:45.41 199324 23/39 Steven Waters 26 M MACON GA 26:48.56 1553325 21/58 Stephen Bankson 14 M KATHLEEN GA 26:49.47 42326 32/72 Paul Bankson 45 M KATHLEEN GA 26:49.48 41327 19/55 George Peake 51 M HAWKINSVILLE GA 26:50.48 1592328 10/29 Briana Ragan 21 F FAYETTEVILLE GA 26:53.03 908329 24/84 Kevin Juedeman 44 M WARNER ROBINS GA 26:53.71 402330 25/84 Frank McGehee 40 M MACON GA 26:54.11 490331 8/35 Kimberly Eason 26 F MACON GA 26:54.76 230332 9/44 Rachel Davis 14 F MACON GA 26:55.08 197333 1/17 Jane Welch 56 F PEACHTREE CITY GA 26:55.83 579334 26/84 Mike Evans 42 M MACON GA 26:56.17 1356335 5/37 Patti Grimsley 53 F DANVILLE GA 26:57.32 310336 27/84 Ed Jesensky 44 M JULIETTE GA 26:57.96 386337 14/42 Nick Roberts 32 M MACON GA 26:58.29 628338 7/60 Jennifer Fruitticher 31 F MACON GA 26:59.33 276339 8/60 Sara Newberry 30 F MACON GA 26:59.46 559340 6/37 Glenda Byrd 52 F WARNER ROBINS GA 26:59.57 132341 23/52 Nat Braddy 39 M MACON GA 26:59.66 94342 28/84 James Deloach 42 M LIZELLA GA 27:00.77 207343 20/55 Steve Huff 51 M MACON GA 27:01.42 1285344 9/60 Michelle Street 33 F DUBLIN GA 27:04.21 1411345 24/39 Ryan Sheehan 26 M SAVANNAH GA 27:04.25 671346 23/51 Lindsay Wilson 17 F MACON GA 27:04.87 831347 15/42 Lee Dorman 30 M WATKINSVILLE GA 27:05.88 213348 10/60 Heather Dorman 30 F DUBLIN GA 27:07.63 212349 22/58 Bryan Horn 13 M MACON GA 27:09.64 359350 24/52 Robert Brown 39 M MACON GA 27:10.09 864351 10/60 Michelle Kahley 37 F MACON GA 27:10.81 406352 29/84 Melville Jamison 40 M MACON GA 27:10.89 1587353 11/60 Melody Sanfrey 36 F MACON GA 27:13.35 658354 7/37 Betty Williams 50 F GRAY GA 27:13.87 824355 8/37 Jennifer Pittard 52 F MACON GA 27:16.86 597356 11/60 Julie Alford 34 F HADDOCK GA 27:17.05 10357 11/29 Hawley Kunz 21 F MACON GA 27:17.26 434358 10/36 Richard Kunz 56 M MACON GA 27:17.40 433359 12/60 Katherine Miller 37 F MACON GA 27:18.82 515360 12/60 Kelley Jones 32 F MACON GA 27:19.63 393361 25/39 Tommy Hammond 25 M MACON GA 27:22.13 1490362 10/44 Sarah Smith 14 F TENNILLE GA 27:22.32 691363 26/39 Carl Perazzola 28 M BONAIRE GA 27:24.09 585364 1/5 Jacob Cooter 71 M GROVETOWN GA 27:24.49 171365 16/42 Jeffrey Orkus 33 M MACON GE 27:26.21 571366 9/54 Lauren Murray 40 F MACON GA 27:28.83 548367 21/55 Kenneth Cravey 52 M MUSELLA GA 27:29.31 873368 11/44 Harley Channell 13 F WARTHEN GA 27:30.54 147369 1/9 Sarah Eskew 9 F CENTERVILLE GA 27:36.85 251370 21/35 Trey Rogers 20 M MACON GE 27:37.34 641371 30/84 Rob Eskew 44 M CENTERVILLE GA 27:37.36 248372 9/37 Susan Pennington 52 F MILLEDGEVILLE GA 27:39.36 583373 27/39 Nayan Patel 27 M WARNER ROBINS GA 27:39.38 1272374 31/84 Scott Anglin 42 M SAUTEE GA 27:39.43 1532375 33/72 Errol Billingslea 49 M MACON GA 27:39.59 69376 22/35 Tyler Versteeg 24 M MACON GA 27:41.21 1459377 34/72 Andy Oxford 45 M MACON GA 27:41.74 1254378 13/60 Beth Wilson 33 F MACON GA 27:42.11 833379 28/39 Joseph Teal 25 M MACON GA 27:42.24 1446380 9/35 Anemone Beaulier 28 F MACON GA 27:42.36 58381 23/58 Griffin Versteeg 14 M MACON GA 27:43.99 1460382 12/44 Claire Carter 14 F MACON GA 27:44.01 136383 24/51 Hannah Watson 16 F FORSYTH GE 27:44.30 795384 13/60 Christine Epps 37 F MACON GA 27:44.79 247385 14/60 Nicole Fields 32 F MACON GA 27:44.90 261386 25/51 Andrea Blackburn 17 F MACON GA 27:45.01 72387 32/84 Grady Jones 42 M EATONTON GA 27:46.65 396388 35/72 David Hulsey 45 M MACON GA 27:46.92 1528389 33/84 Kurtis Anthony 43 M ALBANY GA 27:47.57 1581390 12/29 Allison Rogers 22 F MACON GE 27:47.99 640391 17/42 Tony Smith 32 M WARNER ROBINS GA 27:49.83 1498392 34/84 Jimmy Hicks 40 M JACKSONVILLE NC 27:51.35 346393 22/55 Terrell Murphy 54 M MACON GA 27:51.84 542394 35/84 Chuck Whitaker 42 M BYRON GA 27:54.05 1301395 10/35 Kathy Wilkins 29 F BYRON GA 27:54.40 821396 14/60 Kristi Hendley 37 F MACON GA 27:56.06 338397 36/72 Alan Bacon 47 M DULUTH GA 27:59.57 30398 11/36 Fred Gonzalez 55 M MACON GA 28:00.73 1563399 37/72 Kyle Beck 45 M GA 28:02.10 1561400 2/7 Rosalba Martinez 62 F BLAIRSVILLE GA 28:02.33 474401 15/60 Marie Toler 37 F BYRON GA 28:03.22 766402 6/38 Michelle Williams 49 F GORDON GA 28:04.52 1365403 25/52 Robert Andrews 39 M MACON GA 28:04.95 851404 36/84 Marc Boyd 43 M MACON GA 28:06.45 1551405 18/42 Rav Rampersaud 34 M MACON GA 28:08.19 617406 24/58 Hunter Stringer 13 M MACON GA 28:09.87 721407 25/58 Breck Dehart 13 M ATLANTA GA 28:11.80 204408 11/35 Lorraine Perazzola 25 F BONAIRE GA 28:11.88 587409 37/84 Jeff Dehart 44 M ATLANTA GA 28:12.06 205410 13/44 Ellyson Glance 14 F MACON GA 28:13.51 289411 26/52 Wade Eavenson 36 M LIZELLA GA 28:13.56 1287412 19/42 Russell Watson 34 M MACON GA 28:13.96 798413 23/55 John Waters 53 M BURTOM RD GA 28:17.19 792414 23/35 Arthur Parker 24 M MACON GA 28:18.31 1497415 10/37 Susan White 51 F BUENA VISTA GA 28:19.37 815416 27/52 Greg Goforth 36 M MACON GE 28:19.55 296417 38/84 Servando Saldivar 44 M LIZELLA GA 28:21.98 651418 24/35 Blake Collins 21 M MACON GA 28:22.29 167419 28/52 Marcus Lamb 39 M MACON GA 28:23.99 436420 16/60 Amy Elliott 35 F MACON GA 28:24.48 1609421 17/60 Jennifer Wilson 38 F LIZELLA GA 28:26.46 834422 26/51 Bailey Acres 15 F WARNER ROBINS GA 28:26.70 4423 20/42 Charles Ladson 33 M MACON GA 28:26.81 328424 15/60 Amanda Brown 33 F MACON GA 28:28.42 111425 29/52 Thomas Pollock 38 M MACON GA 28:28.60 599426 26/58 Mitchel King 14 M MACON GA 28:29.09 1557427 25/35 Kerry Ayres 23 M MACON GA 28:29.37 28428 14/44 Taylor Fullington 14 F WARNER ROBINS GA 28:29.49 279429 27/51 Abigail Bartow 15 F MACON GE 28:29.96 48430 4/14 M Corbitt Mizell 64 M MACON GA 28:30.39 1308431 30/52 Jon Taylor 35 M GRAY GA 28:31.70 734432 12/36 Tom Woodberry 56 M MACON GA 28:32.04 1348433 10/54 Jill Hardwick 41 F JULIETTE GA 28:32.30 1047434 39/84 Sonny Davis 41 M VALDOSTA GA 28:33.30 192435 24/55 Carl Perazzola 54 M BONAIRE GA 28:37.28 584436 15/44 Kim Caitlin Alderman 14 F MACON GA 28:37.45 1316437 31/52 Jeff Kelly 36 M THOMASTON GA 28:41.19 412438 29/39 Jake Quilliams 26 M MACON GA 28:41.25 615439 38/72 Ronnie Murphy 46 M MACON GA 28:42.20 911440 40/84 Thomas Hofmann 43 M BYRON GA 28:43.43 354441 2/17 Polly Sheehan 56 F MACON GA 28:45.15 670442 11/37 Pamela Thompson 53 F WARNER ROBINS GA 28:45.80 747443 12/35 Paula Rogers 26 F RHINE GA 28:46.06 639444 21/42 Jason Little 31 M BLACKSHEAR GA 28:46.47 453445 25/55 Jack Jenkins 53 M MACON GA 28:46.54 379446 22/42 Jason Rodgers 30 M LIZELLA GA 28:47.25 1570447 16/44 Sarah Oxford 12 F MACON GA 28:49.46 1387448 32/52 Corbitt Mizell 37 M MACON GA 28:51.01 1310449 16/60 Terri Duncan 31 F FORSYTH GA 28:51.47 226450 26/35 Mike Madison 24 M MACON GA 28:51.88 1347451 39/72 Joseph Easterling 46 M WARNER ROBINS GA 28:52.52 231452 13/36 Patrick Madison 59 M MACON GA 28:53.67 462453 7/38 Linda Smith 48 F HOCKESSIN DE 28:55.33 683454 13/35 Sarah Newton 28 F LEESBURG GA 28:57.55 561455 1/16 Christian Tinkey 8 M MACON, GA 28:57.55 762456 23/42 Ronnie Heslop 33 M WARNER ROBINS GA 28:57.79 1598457 40/72 Chris Murman 49 M PERRY GA 28:57.95 1584458 2/16 Henry Middlebrooks 9 M MACON GA 28:57.97 509459 59/69 Derek Musser 16 M MILLEDGEVILLE GA 29:01.00 549460 41/84 Wilton Collins 44 M MACON GA 29:01.00 159461 24/42 Kevin Wilson 33 M MACON GA 29:01.79 1274462 18/60 Nicole Sibilsky 37 F MILLEDGEVILLE GA 29:03.21 674463 11/54 Lori Southerland 41 F DALTON GA 29:04.80 701464 19/60 Karen Baxley 35 F MACON GA 29:08.39 54465 27/58 Garrett Scarborough 14 M FORSYTH GA 29:08.56 660466 25/42 Keith Anthony 30 M MACON GA 29:08.94 20467 26/42 Chad Keys 32 M BYRON GA 29:10.02 420468 60/69 Patrick Fingles 16 M MACON GA 29:11.10 264469 13/29 Brittany McCorkle 22 F MACON GA 29:12.47 486470 17/60 Joy Boland 33 F GRAY GA 29:18.02 83471 28/51 Helen Harris 17 F TENNILLE GA 29:20.63 331472 12/54 Jeanne Roddenberry 42 F MACON GA 29:21.03 636473 42/84 Jeff Sanders 41 M MACON GA 29:21.06 1415474 28/58 Hudson Brown 14 M MACON GA 29:21.85 115475 27/42 Daniel Brown 30 M MACON GA 29:23.80 112476 20/60 Gaylyn Cole 38 F FORSYTH GA 29:23.96 158477 18/60 Christi James 34 F FORSYTH GA 29:24.26 376478 61/69 Tyler Mims 15 M WARNER ROBINS GA 29:24.69 1280479 30/39 Jamie Stephenson 26 M MACON GA 29:25.87 714480 43/84 Karl Schultz 44 M WARNER ROBINS GA 29:26.51 916481 14/35 Ashley Dunwoody 26 F MACON GA 29:28.71 460482 29/58 Nathaniel Carter 12 M MACON GA 29:28.99 138483 15/35 Heather Carter 26 F ATLANTA GA 29:31.27 141484 19/60 Julie Kendall 33 F ATLANTA GA 29:32.44 416485 21/60 Alli Turley 35 F MACON GA 29:33.02 772486 30/58 Neal Tolbert 12 M MACON GA 29:33.10 1414487 14/29 Jaimie Nixon 21 F WARNER ROBINS GA 29:34.09 562488 44/84 Russ Southerland 41 M DALTON GA 29:35.14 702489 41/72 Steve Brown 49 M MACON GA 29:35.59 109490 8/38 Cynthia Glance 47 F MACON GA 29:35.74 287491 27/35 John Mauldin 23 M WARNER ROBINS GA 29:35.75 478492 45/84 Stephen Floyd 40 M MACON GA 29:37.76 268493 28/35 Adam Grant 24 M MACON GA 29:39.81 1306494 20/60 Kerri Woodard 32 F CADWELL GA 29:42.08 841495 42/72 Braxton Glover 48 M WARNER ROBINS GA 29:42.34 294496 22/60 Holly Gore 35 F JULIETTE GA 29:42.55 299497 14/36 Robert Collins 58 M MACON GA 29:44.53 161498 31/58 Austin Shaheen 14 M GRAY GA 29:49.00 667499 5/16 Billy O'Herron 65 M KATHLEEN GA 29:51.39 1380500 43/72 Nopporn Sritan 46 M WARNER ROBINS GA 29:51.53 1203501 15/36 Tommy Thompson 58 M MACON GA 29:54.51 1215502 29/35 Bryan Piano 23 M MACON GA 29:56.12 903503 21/60 Lori Marstin 32 F FORTSON GA 29:58.11 469504 46/84 Jeff Hunt 44 M PERRY GA 29:58.24 365505 15/29 Lauren Clayton 22 F MACON GA 30:00.64 152506 26/55 Jim Carroll 50 M MACON GA 30:03.40 1384507 23/60 Jamie Fitzpatrick 39 F MACON GA 30:03.78 265508 27/55 Joe Reott 53 M MACON GA 30:04.20 623509 44/72 Scott Purvis 48 M MACON GA 30:04.27 612510 47/84 Chris Faircloth 40 M MACON GA 30:06.71 254511 45/72 Dave Corlee 45 M BYRON GA 30:08.43 1546512 1/8 Barabara Fischer 66 F GA 30:10.96 1559513 24/60 Cathy Jones 39 F WARNER ROBINS GA 30:11.48 1501514 32/58 Harrison Dehart 13 M MACON GA 30:11.51 206515 2/8 Wanda Aldridge 66 F MILLEDGEVILLE GA 30:12.42 9516 22/60 Erin Bennett 31 F KATHLEEN GE 30:13.22 61517 16/36 Frank Kenney Jr. 57 M WARNER ROBINS GA 30:13.60 419518 23/60 Laura Weems 32 F THOMASTON GA 30:14.28 803519 17/44 Jennifer Burkhardt 12 F WARNER ROBINS GA 30:14.93 127520 30/35 Michael Vance 24 M MACON GA 30:18.56 779521 33/52 Will Jones 38 M WARNER ROBINS GA 30:19.40 1499522 33/58 Kaleb Fuller 13 M MACON GA 30:19.97 278523 13/54 Lori Fischer 42 F MACON GA 30:20.14 1560524 18/44 Lauren Harrell 13 F MACON GA 30:20.55 329525 9/38 Jean Glover 49 F WARNER ROBINS GA 30:21.64 293526 34/52 Scott Brown 37 M MACON GA 30:23.44 110527 19/44 Danielle Ferro 13 F MACON GA 30:24.04 260528 35/52 Damon Cape 39 M GRAY GA 30:24.79 1484529 34/58 Spencer Williams 11 M MACON GA 30:27.78 827530 14/54 Beth Ferro 40 F MACON GA 30:29.84 259531 29/51 Bethany Oxford 17 F MACON GA 30:30.02 1386532 35/58 Drew Daws 12 M MACON GA 30:31.20 198533 46/72 Terry Hillmon 47 M MACON GA 30:31.45 352534 28/55 George Cauble 53 M MACON GA 30:31.82 144535 62/69 Kory Bentley 16 M ROBERTA GA 30:33.32 67536 28/42 Brian Murray 32 M BONAIRE GA 30:33.55 546537 24/60 Melissa Hamlin 31 F MACON GA 30:34.58 318538 48/84 Dwayne Fuller 44 M MACON GA 30:37.45 277539 25/60 Rhonda Blackstock 38 F THOMASTON GA 30:39.61 73540 36/58 Sam Jenkins 11 M MACON GA 30:41.70 381541 31/39 Adam Hawk 27 M MACON GA 30:42.28 1540542 16/29 Katy Murray 24 F BONAIRE GA 30:47.16 547543 3/16 Will Anglin 8 M SAUTEE GA 30:47.52 1530544 47/72 Chris Causey 49 M MACON GA 30:49.30 145545 48/72 Elroy Tolbert 45 M MACON GA 30:49.63 1543546 49/72 Nathaniel Hall 48 M GRAY GA 30:50.06 1340547 5/14 Ted Robinson 64 M MACON GA 30:50.15 630548 29/55 Mike Johnson 51 M MACON GA 30:50.25 388549 17/36 Mickey Chapman 57 M MACON GA 30:54.89 1333550 29/42 Eric Burdette 32 M BARNESVILLE GA 30:55.73 1434551 30/51 Sara Rutland 17 F EASTMAN GA 30:57.25 649552 30/55 J Pope Langstaff 52 M MACON GA 31:00.10 1322553 31/51 Madison Ham 17 F MACON GA 31:01.26 316554 31/55 Garry Cummings 52 M MACON GA 31:02.27 184555 30/42 Mark McGlinchey 34 M WARNER ROBINS GA 31:02.52 1590556 18/36 Larry Adkins 57 M HAWKINSVILLE GA 31:03.07 5557 20/44 Breanna Bentley 14 F ROBERTA GA 31:03.53 66558 6/16 Zack Osborne 68 M WARNER ROBINS GA 31:03.70 1568559 32/51 Nakora MacKey 17 F MACON GA 31:04.01 1454560 19/36 Daniel Thompson 58 M MACON GA 31:05.88 1469561 25/60 Misty Simonelli 33 F MACON GA 31:06.59 675562 21/44 Emmie Culclasure 14 F MACON GA 31:07.83 183563 33/51 Danielle Rojas 17 F WARNER ROBINS GA 31:08.10 1616564 6/14 Tom Jarriel 63 M MACON GA 31:09.27 377565 15/54 Alison Napier 40 F WILLIAMSON GA 31:10.82 552566 7/16 Jack James 66 M PERRY GA 31:13.19 375567 17/29 Audrey James 23 F PERRY GA 31:13.21 373568 18/29 Cynthia James 23 F PERRY GA 31:13.22 374569 3/17 Patricia Hosmer 56 F MARIETTA GA 31:22.08 363570 10/38 Missy Jones 48 F MACON GA 31:23.19 1286571 12/37 Marilyn Murphy 54 F MACON GA 31:24.12 543572 26/60 Gena Morgan 38 F MACON GA 31:24.52 536573 63/69 Terrell Carter 16 M WARNER ROBINS GA 31:25.22 142574 31/42 Robert Harbin 33 M MONTICELLO GA 31:26.28 322575 27/60 Wendy Boston 36 F MACON GA 31:28.08 87576 16/54 Vangie Corlee 42 F BYRON GA 31:28.10 1547577 11/38 Teresa Culclasure 45 F MACON GA 31:32.29 182578 19/29 Jeannette Spraley 22 F MARIETTA GA 31:32.39 710579 2/9 Abby Napier 9 F WILLIAMSON GA 31:34.24 555580 20/29 Patricia Quinlan 24 F MACON GE 31:35.83 616581 32/42 Nikia McGhee 33 M MACON GA 31:37.32 491582 31/35 Ricky Barrion Jr. 23 M MACON GA 31:39.04 1320583 33/42 John Newton 34 M LEESBURG GA 31:39.60 560584 49/84 Amos Whitehead 43 M MONTEZUMA GA 31:42.03 927585 21/29 Rebecca Brost-Clark 22 F MACON GA 31:43.21 108586 20/36 Jack Bowers 55 M MACON GA 31:43.51 92587 50/72 Richard Barnes Jr. 48 M KATHLEEN GA 31:44.36 45588 50/84 Jamey Jones 43 M MACON GA 31:44.61 398589 26/60 April Strickland 34 F KATHLEEN GA 31:44.65 720590 4/17 Pat Carterette 57 F ATLANTA GA 31:44.85 143591 32/55 Glen Clements 51 M MACON GA 31:50.44 154592 64/69 Steven Turner 16 M GRAY GA 31:53.26 1363593 65/69 Mike Turner 17 M GRAY GA 31:53.75 1361594 37/58 Jack Gordon 11 M MACON GA 31:54.32 1351595 28/60 Sarah Gordon 39 F MACON GA 31:55.23 298596 33/55 Dennis Collins 53 M MACON GA 31:56.27 163597 32/35 Ray Ellis 20 M MACON GA 31:59.44 241598 51/72 Bobby Dabbs 49 M COCHRAN GA 32:01.05 188599 13/37 Maria Waters 53 F EATONTON GA 32:05.09 793600 38/58 Nolan Jackson 12 M JEFFERSONVILLE GA 32:06.74 1269601 34/51 Amelia Etheridge 16 F MACON GA 32:06.93 252602 35/51 Mary Margaret Murphy 16 F MACON GA 32:06.94 544603 27/60 Inna McGlinchey 34 F WARNER ROBINS GA 32:07.34 1589604 28/60 Jennifer Ramsey 32 F MACON GA 32:08.75 618605 4/16 Jackson Will 8 M KATHLEEN GA 32:12.05 1505606 36/52 Jeffrey Lord 37 M MACON GA 32:12.82 457607 29/60 Jessica Martin 31 F WARNER ROBINS GA 32:13.49 472608 51/84 William Lightner 40 M AMERICUS GA 32:16.11 451609 34/55 Donny Banks 50 M FORSYTH GA 32:18.93 38610 37/52 Mike Kittrell 37 M MACON GA 32:21.58 1373611 38/52 Jonathan Kendall 38 M WARNER ROBINS GA 32:23.43 415612 22/44 Rachel Pendley 12 F LIZELLA GA 32:25.84 1403613 33/35 Chris Maxey 24 M MCINTYRE GA 32:27.43 481614 66/69 Darrian Johnson 15 M MACON GA 32:29.99 391615 12/38 Kim Manuel 47 F GRAY GA 32:31.61 1442616 30/60 Shawnda Stafford 32 F MACON GA 32:31.72 712617 39/52 John Sink 39 M JULIETTE GA 32:37.93 676618 39/58 Klein Lipper 12 M MACON GA 32:41.45 1537619 52/72 Mike Lipper 48 M MACON GA 32:42.03 1538620 21/36 Charles Wells 55 M PERRY GA 32:42.61 809621 35/55 Henry Griffin 53 M WARNER ROBINS GA 32:45.58 302622 36/55 Thomas Rudd Jr 53 M CENTERVILLE GA 32:45.82 645623 16/35 Rachel Harvey 29 F LOCUST GROVE GA 32:45.93 333624 32/39 Luke Heim 27 M MACON GA 32:46.83 1275625 34/42 David Higdon 33 M MACON GA 32:47.35 347626 31/60 Traci Lee 33 F EATONTON GA 32:47.45 448627 29/60 Jan Harrington 36 F MILLEDGEVILLE GA 32:48.02 330628 23/44 Jordan Hawkins 12 F EATONTON GA 32:48.07 334629 30/60 Wendy Cohen 35 F WARNER ROBINS GA 32:48.91 157630 53/72 Montinez Harden 45 M GRIFFIN GA 32:50.62 324631 8/16 John Atkinson 66 M MACON GA 32:50.63 22632 52/84 Bo Drinkard 42 M MACON GA 32:50.88 215633 40/58 Matthew Warren 12 M KATHLEEN GA 32:51.74 1493634 54/72 David Warren 48 M KATHLEEN GA 32:51.76 1494635 35/42 Keith Collins 34 M MACON GA 32:51.82 162636 53/84 Eni Nwabueze 43 M MACON GA 32:53.04 567637 17/54 Traci Sirmons 44 F MACON GA 32:53.63 1392638 24/44 Brenley Martinez 11 F MACON GA 32:54.12 473639 54/84 Wendell Bell 44 M TOOMSBORO GA 32:54.43 858640 17/35 Kristy York 28 F HOSCHTON GA 32:57.31 847641 13/38 Carrie Allen 49 F YULEE FL 32:58.26 11642 5/17 Diana Williams 58 F MACON GA 32:58.76 1396643 25/44 Meredith Christianson 14 F MACON GA 32:59.41 868644 33/39 Kelly Edge 27 M FORSYTH GA 33:00.06 1332645 22/29 Kirby Williams 24 F MACON GA 33:00.11 1542646 41/58 Shep Spivey 13 M MACON GA 33:00.11 709647 55/84 Howard Bruce 41 M CENTERVILLE GA 33:00.42 866648 5/16 Charles Archer 8 M TENNILLE GA 33:03.44 21649 55/72 Martin Will 48 M KATHLEEN GA 33:03.89 1503650 42/58 Marty Will 11 M KATHLEEN GA 33:04.16 1506651 14/38 Lori Adrien 45 F MACON GA 33:04.54 8652 40/52 Brian King Sr. 37 M MACON GA 33:05.14 427653 26/44 Katie Norman 12 F WARNER ROBINS GA 33:05.80 1523654 43/58 Daniel Adrien 12 M MACON GA 33:05.84 7655 36/51 Lacey Pearce 17 F MACON GA 33:05.86 1455656 37/55 Jeffery Bones 50 M GRAY GA 33:06.75 862657 56/84 Toby Turner 41 M GRAY GA 33:07.37 1362658 34/39 Jason Fleming 29 M WARNER ROBINS GA 33:08.19 267659 31/60 Amy Kelly 35 F THOMASTON GA 33:08.77 413660 9/16 Jim Kendall 65 M MAPLETON IL 33:08.90 417661 32/60 Christin Davis 32 F THOMASTON GA 33:09.34 194662 18/54 Christy Grimsley 43 F DANVILLE GA 33:09.93 307663 57/84 Tom Adrien 42 M MACON GA 33:11.28 6664 14/37 Gail McUmber 54 F WARNER ROBINS GA 33:12.96 500665 23/29 Lauren Waller 24 F WARNER ROBINS GA 33:13.02 1407666 22/36 Dave Terrell 56 M MACON GA 33:16.64 737667 15/38 Ellen Terrell 47 F MACON GA 33:16.69 738668 56/72 Calvin Stephens 45 M JEFFERSONVILLE GA 33:17.05 1295669 27/44 Teresa Scherer 11 F MACON GA 33:20.65 663670 16/38 Diane Bloodworth 46 F FORSYTH GA 33:21.38 76671 32/60 Sachie Thorne 37 F BONAIRE GA 33:22.91 757672 33/60 Wendy White 38 F BYRON GA 33:23.86 926673 15/37 Cindy Rogers 52 F MACON GA 33:29.35 638674 10/16 Wilbur Whitfield 67 M MACON GE 33:30.16 816675 7/14 Larry King 64 M MACON GA 33:33.27 422676 37/51 Jessica Dallenbach 17 F BYRON GA 33:34.74 874677 34/60 Donna Payne 39 F MACON GA 33:37.11 578678 28/44 McCall Dufford 13 F MACON GA 33:37.29 221679 23/36 Mike Brainard 57 M WARNER ROBINS GE 33:40.25 98680 3/7 Kum Sun Brainard 60 F WARNER ROBINS GE 33:40.44 97681 29/44 Katherine Moglia 13 F WARNER ROBINS GA 33:40.99 1522682 44/58 Andrew Smith 13 M TENNILLE GA 33:43.67 692683 11/16 Mumbo Cornelius 68 M MACON GA 33:44.83 1390684 24/36 Romey Fluck 55 M MACON GA 33:45.03 269685 17/38 Melvina Palmer-Spencer 46 F MACON GA 33:46.85 1299686 57/72 Joel Herndon 48 M LIZELLA GA 33:49.39 340687 35/60 Amy Weber 36 F MACON GA 33:49.74 1613688 18/38 Rebecca Reynolds 49 F MACON GA 33:58.35 624689 30/44 Erin Eskew 11 F DACULA GA 34:00.23 250690 19/54 Cynthia Eskew 41 F DACULA GA 34:00.92 249691 18/35 Melanie Robinson 26 F MACON GA 34:02.86 913692 19/38 Kathleen O'Neal 47 F BYRON GA 34:07.34 570693 58/84 Kent Elliott 43 M MACON GA 34:07.72 236694 36/42 Richard Hodgin 33 M DRY BRANCH GA 34:15.14 1601695 38/55 Peter Jackson 51 M MACON GA 34:15.48 369696 58/72 Tommy Nesmith 45 M FORSYTH GA 34:18.75 558697 35/39 Joey Brumbelow 29 M PERRY GA 34:20.11 1513698 19/35 Ashton Thurmond 29 F ATLANTA GA 34:20.16 1517699 39/55 Richard Scherer 54 M MACON GA 34:20.73 662700 33/60 Jean Stroud 30 F MACON GA 34:20.92 722701 12/16 Larry Slaughter 66 M MONROE GA 34:22.01 680702 45/58 Joshua Thompson 11 M MACON GA 34:22.72 781703 31/44 Kaitlynn Jones 14 F MACON GA 34:26.39 1410704 41/52 Greg Rutland 37 M EASTMAN GA 34:29.64 648705 40/55 Steve Hamilin 54 M MACON GA 34:31.36 1371706 32/44 Carmen Foskey 12 F WARNER ROBINS GA 34:32.37 1304707 6/17 Leslie Lee 55 F MACON GA 34:38.20 446708 41/55 Neil Martin 54 M MACON GA 34:39.23 1343709 4/7 Elaine Mayo 61 F WARNER ROBINS GA 34:39.90 484710 33/44 Ashleigh Owens 12 F MACON GA 34:39.94 1437711 16/37 Debra Collins 51 F MACON GA 34:41.74 164712 20/38 Earnestine Bones 48 F GRAY GA 34:42.18 863&ltb



News related by topic - Sports:
Lance Armstrong must learn to take Tour de France back seat - TimesOnline
Wimbledon live: Serena Williams beats Victoria Azarenka - TimesOnline
Wolves shatter transfer record to sign Kevin Doyle from Reading for 6.5 million - TimesOnline
Matthew Le Tissier pulls out of Southampton bid - TimesOnline
Roberto Di Matteo to succeed Tony Mowbray as West Bromwich Albion manager - TimesOnline
Burnley break transfer record to sign Steven Fletcher from Hibernian - TimesOnline


News related by source - Macon.com:
Number of Macon bowlers jumps - Macon.com
WR native Blanks set to make first PGA Tour appearance - Macon.com
Mercer to honor Mitchell on Friday - Macon.com
Local players earn Kia Championship Series points - Macon.com
Looking back at the 2004 recruiting class - Macon.com
Rout increases intrigue in A-Sun - Macon.com



 
casino
News, World News, News Headlines, Top Stories, Breaking News, Globals News at www.worldofnews.com
Indian News, News from India, India News, Indian News Headlines, Indian breaking news, News, World news at www.indiasnews.com
UK News, British News, English News, News from UK, UK headlines, UK top stores, England News, Britain news, world news at www.worldofnews.co.uk
Home | About Us | Get News Feeds | Advertise Here | Terms of Service | Privacy Policy | Contact Us | Site Map