Compare commits
3 Commits
amo_l10n
...
tags/start
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8fc2f51240 | ||
|
|
5ddee5efc0 | ||
|
|
f46176d6f2 |
1244
atwork/burst_billing/bin/BB_billing.pl
Executable file
282
atwork/burst_billing/bin/BB_main.pl
Executable file
@@ -0,0 +1,282 @@
|
||||
#!/usr/bin/perl -w
|
||||
#############################################################################
|
||||
# $Id: BB_main.pl,v 1.1.1.1 2000-10-23 20:08:03 kevin%perldap.org Exp $
|
||||
#
|
||||
# BB_main.pl
|
||||
#
|
||||
# This is the main control program for the Burst Billing process
|
||||
# It:
|
||||
# 1) Checks the directory setup and permissions.
|
||||
# 2) Archives the log file for the current project.
|
||||
# 3) Launches the Burst Billing program
|
||||
# 4) Runs the monitor program.
|
||||
#
|
||||
# I broke the burst billing and monitor programs out into seperate programs.
|
||||
# This is to handle the event where the burst billing program die's, aborts,
|
||||
# crashes, or whatever - so the main program can run the monitor program afterwards.
|
||||
# Yeah yeah, the main program might crash too, but what can I do...
|
||||
#
|
||||
# History:
|
||||
# Kevin J. McCarthy [10/17/2000] Original Coding
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use strict;
|
||||
|
||||
BEGIN {require '../inc/BB_include.pl';}
|
||||
require "$INC_DIR/BB_lib.pl";
|
||||
|
||||
|
||||
##############
|
||||
# Begin Code #
|
||||
##############
|
||||
|
||||
&init_program();
|
||||
|
||||
&run_burst_billing();
|
||||
|
||||
&run_monitor();
|
||||
|
||||
&cleanup_program();
|
||||
|
||||
|
||||
|
||||
###################
|
||||
# Local Functions #
|
||||
###################
|
||||
|
||||
########################################
|
||||
# init_program
|
||||
#
|
||||
# Does program initializations, such as:
|
||||
# - Checking directory permissions
|
||||
# - Archiving the log file
|
||||
# - Opening the new log file
|
||||
########################################
|
||||
sub init_program
|
||||
{
|
||||
&check_if_running();
|
||||
|
||||
&check_directories();
|
||||
|
||||
&check_files();
|
||||
|
||||
&archive_log_file();
|
||||
|
||||
&open_log_file();
|
||||
|
||||
&write_log_file($START_STAMP, "BB_main.pl started");
|
||||
}
|
||||
|
||||
|
||||
##########################################################################
|
||||
# check_if_running
|
||||
#
|
||||
# Checks to see if another copy of the program is running. This is
|
||||
# indicated by the presence of the $IN_PROGRESS_FILE
|
||||
# If it is, the program aborts.
|
||||
#
|
||||
# If it isn't:
|
||||
# 1) The $IN_PROGRESS_FILE is created.
|
||||
# 2) An END routine which removes the $IN_PROGRESS_FILE is evaled. I need
|
||||
# to eval this AFTER the check for the file, otherwise I will remove
|
||||
# the $IN_PROGRESS_FILE for the other program!
|
||||
# Note that this function is not used for contention issues - I'm
|
||||
# fully of aware of the test-and-set race condition.
|
||||
##########################################################################
|
||||
sub check_if_running
|
||||
{
|
||||
my ($ip_fh);
|
||||
|
||||
if ( -f $IN_PROGRESS_FILE )
|
||||
{
|
||||
print STDERR "Another copy of BB_main.pl is currently running\n",
|
||||
"If this is not the case, please remove the ",
|
||||
"$IN_PROGRESS_FILE file and rerun the program.\n",
|
||||
"Aboring program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
|
||||
$ip_fh = new IO::File ">$IN_PROGRESS_FILE";
|
||||
$ip_fh->close();
|
||||
|
||||
eval 'END { &remove_running_file(); }';
|
||||
}
|
||||
|
||||
|
||||
################################################################
|
||||
# check_directories
|
||||
#
|
||||
# Basic sanity check, to make sure all the directories exist and
|
||||
# are writable by this process
|
||||
################################################################
|
||||
sub check_directories
|
||||
{
|
||||
my ($directory);
|
||||
|
||||
foreach $directory ( $BILLING_HOME, $REPORT_HOME, $LOG_DIR, $LOG_ARCHIVE_DIR,
|
||||
$RRD_DIR, $BIN_DIR, $INC_DIR )
|
||||
{
|
||||
if ( ! -d $directory )
|
||||
{
|
||||
print STDERR "ERROR: $directory is not a directory\n",
|
||||
"Aborting program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
}
|
||||
foreach $directory ( $BILLING_HOME, $REPORT_HOME, $LOG_DIR,
|
||||
$LOG_ARCHIVE_DIR )
|
||||
{
|
||||
if ( ! -w $directory )
|
||||
{
|
||||
print STDERR "ERROR: $directory is not writable\n",
|
||||
"Aborting program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
################################################################
|
||||
# check_files
|
||||
#
|
||||
# Basic sanity check, to make sure all the programs and files exist
|
||||
# before launching sub-process
|
||||
################################################################
|
||||
sub check_files
|
||||
{
|
||||
my ($file);
|
||||
|
||||
foreach $file ( $BURST_ACCOUNTS_FILE )
|
||||
{
|
||||
if ( ! -e $file )
|
||||
{
|
||||
print STDERR "ERROR: $file does not exist\n.",
|
||||
"Aborting program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
elsif ( ! -r $file )
|
||||
{
|
||||
print STDERR "ERROR: $file is not readable.\n",
|
||||
"Aborting program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
}
|
||||
|
||||
foreach $file ( $BILLING_MODULE, $MONITOR_MODULE )
|
||||
{
|
||||
if ( ! -e "$BIN_DIR/$file" )
|
||||
{
|
||||
print STDERR "ERROR: $BIN_DIR/$file does not exist.\n",
|
||||
"Aborting program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
if ( (! -r "$BIN_DIR/$file") || (! -x "$BIN_DIR/$file") )
|
||||
{
|
||||
print STDERR "ERROR: $BIN_DIR/$file is not runnable.\n",
|
||||
"Aborting program\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
##############################################################
|
||||
# archive_log_file
|
||||
#
|
||||
# This copies the previous log file into the archive directory
|
||||
# and then cleans up the archive directory.
|
||||
##############################################################
|
||||
sub archive_log_file
|
||||
{
|
||||
if ( &archive_file($LOG_DIR, $LOG_FILE, $LOG_ARCHIVE_DIR, $LOG_FILE, 0) != $OKAY )
|
||||
{
|
||||
print STDERR "Error archiving log file\n";
|
||||
}
|
||||
|
||||
&purge_old_archives($LOG_ARCHIVE_DIR, $MAX_LOG_ARCHIVE_FILES, $LOG_FILE);
|
||||
}
|
||||
|
||||
|
||||
#####################################################################
|
||||
# run_boss_loader
|
||||
#
|
||||
# This function executes the burst_billing program
|
||||
# programs, checks the return codes, and handles errors.
|
||||
#####################################################################
|
||||
sub run_burst_billing
|
||||
{
|
||||
my ($retcode);
|
||||
|
||||
&write_log_file($LOG_INFO, "BB_main.pl starting to run $BILLING_MODULE");
|
||||
&close_log_file();
|
||||
|
||||
$retcode = system("$BIN_DIR/$BILLING_MODULE");
|
||||
$retcode >>= 8;
|
||||
|
||||
&open_log_file();
|
||||
&write_log_file($LOG_INFO, "$BILLING_MODULE returned exit code $retcode");
|
||||
|
||||
if ( ($retcode != $OKAY) &&
|
||||
($retcode != $ERROR_WARNING) )
|
||||
{
|
||||
&write_log_file($LOG_ERROR, "$BILLING_MODULE had some sort of error");
|
||||
}
|
||||
|
||||
return($retcode);
|
||||
}
|
||||
|
||||
|
||||
#########################################################################
|
||||
# run_monitor
|
||||
#
|
||||
# Runs the monitor module.
|
||||
#########################################################################
|
||||
sub run_monitor
|
||||
{
|
||||
my ($retcode);
|
||||
|
||||
&write_log_file($LOG_INFO, "BB_main.pl starting to run $MONITOR_MODULE");
|
||||
&close_log_file();
|
||||
|
||||
$retcode = system("$BIN_DIR/$MONITOR_MODULE");
|
||||
$retcode >>= 8;
|
||||
|
||||
&open_log_file();
|
||||
&write_log_file($LOG_INFO, "$MONITOR_MODULE returned exit code $retcode");
|
||||
|
||||
if ( ($retcode != $OKAY) &&
|
||||
($retcode != $ERROR_WARNING) )
|
||||
{
|
||||
&write_log_file($LOG_ERROR, "$MONITOR_MODULE had some sort of error");
|
||||
}
|
||||
|
||||
return($retcode);
|
||||
}
|
||||
|
||||
|
||||
#####################################################
|
||||
# cleanup_program
|
||||
#
|
||||
# Perform final cleanup before the program terminates
|
||||
#####################################################
|
||||
sub cleanup_program
|
||||
{
|
||||
&write_log_file($END_STAMP, "BOSS_main.pl ended");
|
||||
|
||||
&close_log_file();
|
||||
}
|
||||
|
||||
|
||||
##########################################################################
|
||||
# remove_running_file
|
||||
#
|
||||
# Removes the $IN_PROGRESS_FILE, just before the program exits. Note that
|
||||
# this function is called by the END{} routine, which runs just as the
|
||||
# perl interpreter exits. In this way, I don't have to worry about
|
||||
# something die()ing and not cleaning up this file.
|
||||
##########################################################################
|
||||
sub remove_running_file
|
||||
{
|
||||
unlink $IN_PROGRESS_FILE;
|
||||
}
|
||||
161
atwork/burst_billing/bin/BB_monitor.pl
Executable file
@@ -0,0 +1,161 @@
|
||||
#!/usr/bin/perl
|
||||
#############################################################################
|
||||
# $Id: BB_monitor.pl,v 1.1.1.1 2000-10-23 20:08:03 kevin%perldap.org Exp $
|
||||
#
|
||||
# BB_monitor.pl
|
||||
#
|
||||
# History:
|
||||
# Kevin J. McCarthy [10/17/2000] Original Coding
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
#
|
||||
# Not using strict so I can play namespace games
|
||||
# Not using warnings because the Mail and Net modules suck.
|
||||
#
|
||||
|
||||
use IO::File;
|
||||
#
|
||||
# I'm not using Mail::Send becuase the current implementation has a bug
|
||||
# with multiple recipients - sent a patch to Graham.
|
||||
#
|
||||
use Mail::Mailer;
|
||||
#
|
||||
# Have to 'use' this here so I can overwrite the
|
||||
# $Net::SMTP::NetConfig{'smtp_hosts'} = [$MAIL_HOST];
|
||||
#
|
||||
use Net::SMTP;
|
||||
|
||||
BEGIN {require '../inc/BB_include.pl';}
|
||||
require "$INC_DIR/BB_lib.pl";
|
||||
|
||||
|
||||
###########
|
||||
# Globals #
|
||||
###########
|
||||
my $errors = 0;
|
||||
my $warnings = 0;
|
||||
|
||||
|
||||
##############
|
||||
# Begin Code #
|
||||
##############
|
||||
|
||||
&init_program();
|
||||
|
||||
&scan_log_file();
|
||||
|
||||
# if ( $errors || $warnings )
|
||||
&send_email();
|
||||
|
||||
exit($OKAY);
|
||||
|
||||
|
||||
###################
|
||||
# Local Functions #
|
||||
###################
|
||||
|
||||
|
||||
#####################################################################
|
||||
# init_program
|
||||
#
|
||||
# Sets the smtp server to use and the mail from address.
|
||||
# Closes STDOUT and STDERR to prevent junk messages from STMP modules
|
||||
#####################################################################
|
||||
sub init_program
|
||||
{
|
||||
#
|
||||
# Set the SMTP server to use.
|
||||
# This is cheating, but it works.
|
||||
#
|
||||
$Net::SMTP::NetConfig{'smtp_hosts'} = $MAIL_HOSTS;
|
||||
|
||||
#
|
||||
# Set the from address
|
||||
#
|
||||
$ENV{'MAILADDRESS'} = $MAIL_FROM;
|
||||
|
||||
#
|
||||
# Unfortunately, the SMTP modules are noisy in the case of errors.
|
||||
#
|
||||
close(STDOUT);
|
||||
close(STDERR);
|
||||
}
|
||||
|
||||
|
||||
###########################################################
|
||||
# scan_log_file
|
||||
#
|
||||
# Records the number of errors and warnings in the log file
|
||||
###########################################################
|
||||
sub scan_log_file
|
||||
{
|
||||
my ($log_fh, $log_line);
|
||||
|
||||
$log_fh = new IO::File "<$LOG_DIR/$LOG_FILE";
|
||||
return if ( ! $log_fh );
|
||||
|
||||
while ( defined($log_line = <$log_fh>) )
|
||||
{
|
||||
$errors++ if ( $log_line =~ /^\s*$LOG_ERROR/o );
|
||||
$warnings++ if ( $log_line =~ /^\s*$LOG_WARNING/o );
|
||||
}
|
||||
|
||||
$log_fh->close();
|
||||
}
|
||||
|
||||
|
||||
#############################
|
||||
# send_email
|
||||
#
|
||||
# Sends out the summary email
|
||||
#############################
|
||||
sub send_email
|
||||
{
|
||||
my ($mailer, $timestamp);
|
||||
my ($log_fh, $log_line);
|
||||
|
||||
$timestamp = &get_time_stamp();
|
||||
|
||||
$mailer = new Mail::Mailer('smtp');
|
||||
if ( ! $mailer )
|
||||
{
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
|
||||
eval {$mailer->open({
|
||||
'To' => $ERROR_MAIL_TO,
|
||||
'Subject' => "Burst Billing summary for $timestamp",
|
||||
});
|
||||
};
|
||||
if ( $@ )
|
||||
{
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
|
||||
print $mailer "Burst Billing summary for $timestamp\n\n";
|
||||
print $mailer "ERRORS: $errors\n";
|
||||
print $mailer "WARNINGS: $warnings\n";
|
||||
|
||||
print $mailer "Contents of log file:\n\n";
|
||||
|
||||
$log_fh = new IO::File "<$LOG_DIR/$LOG_FILE";
|
||||
if ( $log_fh )
|
||||
{
|
||||
while ( defined($log_line = <$log_fh>) )
|
||||
{
|
||||
if ( ($log_line =~ /^\s*$START_STAMP/o) ||
|
||||
($log_line =~ /^\s*$END_STAMP/o) ||
|
||||
($log_line =~ /^\s*$LOG_INFO/o) ||
|
||||
($log_line =~ /^\s*$LOG_WARNING/o) ||
|
||||
($log_line =~ /^\s*$LOG_ERROR/o) ||
|
||||
($log_line eq "\n") )
|
||||
{
|
||||
print $mailer $log_line;
|
||||
}
|
||||
}
|
||||
$log_fh->close();
|
||||
}
|
||||
|
||||
$mailer->close();
|
||||
}
|
||||
188
atwork/burst_billing/inc/BB_include.pl
Normal file
@@ -0,0 +1,188 @@
|
||||
#!/usr/bin/perl -w
|
||||
###########################################################################
|
||||
# $Id: BB_include.pl,v 1.1.1.1 2000-10-23 20:08:18 kevin%perldap.org Exp $
|
||||
#
|
||||
# BB_include.pl
|
||||
#
|
||||
# This include file contains global variables used across programs.
|
||||
#
|
||||
# History:
|
||||
# Kevin J. McCarthy [10/17/2000] Original Coding
|
||||
###########################################################################
|
||||
|
||||
use strict;
|
||||
|
||||
|
||||
######################################################################
|
||||
# Set this variable to 1 only if the failsafe triggers, to temporarily
|
||||
# override it.
|
||||
# TODO: command line switch to over-ride.
|
||||
######################################################################
|
||||
use vars qw{$FAILSAFE_OVERRIDE};
|
||||
$FAILSAFE_OVERRIDE = 0;
|
||||
# $FAILSAFE_OVERRIDE = 1;
|
||||
|
||||
#####################################################################
|
||||
# This controls the maximum number of days we will attempt to recover
|
||||
# data for.
|
||||
#####################################################################
|
||||
use vars qw($MAX_RECOVER_DAYS);
|
||||
$MAX_RECOVER_DAYS = 500;
|
||||
|
||||
|
||||
###############
|
||||
# Directories #
|
||||
###############
|
||||
use vars qw{$BILLING_HOME $RRD_DIR $REPORT_HOME $LOG_DIR $LOG_ARCHIVE_DIR
|
||||
$BIN_DIR $INC_DIR};
|
||||
|
||||
#$BILLING_HOME = "/usr/local/root/apache/cgi-bin/Burstable";
|
||||
$BILLING_HOME = "/home/kevinmc/excite/burst_billing/code";
|
||||
|
||||
$RRD_DIR = "/usr/local/nme/polling/www";
|
||||
|
||||
$REPORT_HOME = "$BILLING_HOME/data";
|
||||
|
||||
$LOG_DIR = "$BILLING_HOME/log";
|
||||
$LOG_ARCHIVE_DIR = "$LOG_DIR/archive";
|
||||
|
||||
$BIN_DIR = "$BILLING_HOME/bin";
|
||||
|
||||
$INC_DIR = "$BILLING_HOME/inc";
|
||||
|
||||
|
||||
##############
|
||||
# File Names #
|
||||
##############
|
||||
use vars qw{$BURST_ACCOUNTS_FILE $LOG_FILE $LAST_RUN_FILE $IN_DATA_FILE $OUT_DATA_FILE
|
||||
$CIRCUIT_HEADER_FILE $IN_PROGRESS_FILE $REPORT_FILE};
|
||||
$BURST_ACCOUNTS_FILE = "$INC_DIR/burst_accounts.txt";
|
||||
|
||||
$LOG_FILE = "log";
|
||||
|
||||
$LAST_RUN_FILE = "lastrun.txt";
|
||||
|
||||
#
|
||||
# Network data is dumped to these files
|
||||
#
|
||||
$IN_DATA_FILE = "in.log";
|
||||
$OUT_DATA_FILE = "out.log";
|
||||
|
||||
#
|
||||
# This contains information about the circuit
|
||||
#
|
||||
$CIRCUIT_HEADER_FILE = "header.txt";
|
||||
|
||||
#
|
||||
# This file is used to mark when this program is running. We don't
|
||||
# want to allow to loads to take place at the same time
|
||||
#
|
||||
$IN_PROGRESS_FILE = "$BILLING_HOME/.running";
|
||||
|
||||
#
|
||||
# The monthly 95/5 report
|
||||
#
|
||||
$REPORT_FILE = "95_5_report.xls";
|
||||
|
||||
|
||||
############
|
||||
# Programs #
|
||||
############
|
||||
use vars qw{$BILLING_MODULE $MONITOR_MODULE};
|
||||
$BILLING_MODULE = "BB_billing.pl";
|
||||
$MONITOR_MODULE = "BB_monitor.pl";
|
||||
|
||||
|
||||
##################
|
||||
# Log File Codes #
|
||||
##################
|
||||
use vars qw{$START_STAMP $END_STAMP $LOG_NOTE $LOG_INFO $LOG_WARNING
|
||||
$LOG_ERROR};
|
||||
$START_STAMP = "START_STAMP";
|
||||
$END_STAMP = "END_STAMP";
|
||||
$LOG_NOTE = "NOTE";
|
||||
#
|
||||
# Info error messages get included in the monitor email. Note messages don't
|
||||
#
|
||||
$LOG_INFO = "INFO";
|
||||
$LOG_WARNING = "WARNING";
|
||||
$LOG_ERROR = "ERROR";
|
||||
|
||||
|
||||
#################################################
|
||||
# Number of archives to keep for each directory #
|
||||
#################################################
|
||||
use vars qw{$MAX_LOG_ARCHIVE_FILES};
|
||||
$MAX_LOG_ARCHIVE_FILES = 10000;
|
||||
|
||||
|
||||
###############
|
||||
# Error Codes #
|
||||
###############
|
||||
use vars qw{$OKAY $ERROR_WARNING $ERROR_CRITICAL};
|
||||
$OKAY = 0;
|
||||
$ERROR_WARNING = 1;
|
||||
$ERROR_CRITICAL = 2;
|
||||
|
||||
|
||||
#################
|
||||
# Email Setting #
|
||||
#################
|
||||
use vars qw{$MAIL_HOSTS $MAIL_FROM $ERROR_MAIL_TO $REPORT_MAIL_TO};
|
||||
$MAIL_HOSTS = ['localhost',
|
||||
'mail.excitehome.net'];
|
||||
$MAIL_FROM = 'burstbilling@excitehome.net';
|
||||
$ERROR_MAIL_TO = ['mccarthy@excitehome.net',
|
||||
'tunacat@yahoo.com',
|
||||
# 'michael@excitehome.net',
|
||||
];
|
||||
|
||||
# $REPORT_MAIL_TO = 'burstbilling@excitehome.net';
|
||||
$REPORT_MAIL_TO = 'mccarthy@excitehome.net';
|
||||
|
||||
|
||||
#####################
|
||||
# Data Error Checking
|
||||
#####################
|
||||
use vars qw{$MAX_ZERO_DATA_PERCENT $MAX_NAN_DATA_PERCENT $MIN_RRD_STEP_SIZE};
|
||||
#
|
||||
# Maximum percentage of 0's to put up with in the data before I log an error
|
||||
# Use values from 0 - 100
|
||||
#
|
||||
$MAX_ZERO_DATA_PERCENT = 50;
|
||||
|
||||
#
|
||||
# Maximum percentage of NaN's to put up with in the data before I log an error
|
||||
# Use values from 0 - 100
|
||||
#
|
||||
$MAX_NAN_DATA_PERCENT = 0;
|
||||
|
||||
#
|
||||
# This is the smallest step size returned by the RRDs - equal to a 5 minute
|
||||
# granularity.
|
||||
#
|
||||
$MIN_RRD_STEP_SIZE = 300;
|
||||
|
||||
|
||||
###############################
|
||||
# Monitor Time List Hash Keys #
|
||||
###############################
|
||||
use vars qw{$MTL_START_EPOCH $MTL_END_EPOCH $MTL_FIRST_OF_MONTH
|
||||
$MTL_YEAR $MTL_MONTH $MTL_MDAY};
|
||||
$MTL_START_EPOCH = 'MTL_START_EPOCH';
|
||||
$MTL_END_EPOCH = 'MTL_END_EPOCH';
|
||||
$MTL_FIRST_OF_MONTH = 'MTL_FIRST_OF_MONTH';
|
||||
$MTL_YEAR = 'MTL_YEAR';
|
||||
$MTL_MONTH = 'MTL_MONTH';
|
||||
$MTL_MDAY = 'MTL_MDAY';
|
||||
|
||||
|
||||
###########################
|
||||
# Circuit Entry Hash Keys #
|
||||
###########################
|
||||
use vars qw{$CIRCUIT_COMPANY_NAME $CIRCUIT_IP_ADDRESS
|
||||
$CIRCUIT_PORT_NAME $CIRCUIT_ID};
|
||||
$CIRCUIT_COMPANY_NAME = 'CIRCUIT_COMPANY_NAME';
|
||||
$CIRCUIT_IP_ADDRESS = 'CIRCUIT_IP_ADDRESS';
|
||||
$CIRCUIT_PORT_NAME = 'CIRCUIT_PORT_NAME';
|
||||
$CIRCUIT_ID = 'CIRCUIT_ID';
|
||||
213
atwork/burst_billing/inc/BB_lib.pl
Normal file
@@ -0,0 +1,213 @@
|
||||
#!/usr/bin/perl -w
|
||||
#####################################################################
|
||||
# $Id: BB_lib.pl,v 1.1.1.1 2000-10-23 20:08:17 kevin%perldap.org Exp $
|
||||
#
|
||||
# BB_lib.pl
|
||||
#
|
||||
# This file contains functions shared amongst the programs
|
||||
#
|
||||
# History:
|
||||
# Kevin J. McCarthy [10/17/2000] Original Coding
|
||||
#####################################################################
|
||||
|
||||
use strict;
|
||||
|
||||
use DirHandle;
|
||||
use IO::File;
|
||||
use File::Copy;
|
||||
|
||||
BEGIN {require '../inc/BB_include.pl';}
|
||||
|
||||
|
||||
###########
|
||||
# Globals #
|
||||
###########
|
||||
my $LOG_FH;
|
||||
|
||||
|
||||
##################################################################
|
||||
# get_time_stamp
|
||||
#
|
||||
# This returns the current timestamp, in the logfile format.
|
||||
##################################################################
|
||||
sub get_time_stamp
|
||||
{
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
|
||||
|
||||
$mon += 1;
|
||||
$year += 1900;
|
||||
|
||||
$mon = "0" . $mon if ( $mon < 10 );
|
||||
$mday = "0" . $mday if ( $mday < 10 );
|
||||
$hour = "0" . $hour if ( $hour < 10 );
|
||||
$min = "0" . $min if ( $min < 10 );
|
||||
$sec = "0" . $sec if ( $sec < 10 );
|
||||
|
||||
return "$year$mon$mday-$hour$min$sec";
|
||||
}
|
||||
|
||||
|
||||
######################################################
|
||||
# get_file_timestamp
|
||||
#
|
||||
# This returns the 'modification' timestamp of a file,
|
||||
# used for file archving.
|
||||
######################################################
|
||||
sub get_file_timestamp
|
||||
{
|
||||
my ($filename) = @_;
|
||||
|
||||
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size);
|
||||
my ($atime, $mtime, $ctime, $blksize, $blocks);
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
|
||||
|
||||
($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
|
||||
$atime, $mtime, $ctime, $blksize, $blocks) = stat $filename;
|
||||
|
||||
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
|
||||
|
||||
$mon += 1;
|
||||
$year += 1900;
|
||||
|
||||
$mon = "0" . $mon if ( $mon < 10 );
|
||||
$mday = "0" . $mday if ( $mday < 10 );
|
||||
$hour = "0" . $hour if ( $hour < 10 );
|
||||
$min = "0" . $min if ( $min < 10 );
|
||||
$sec = "0" . $sec if ( $sec < 10 );
|
||||
|
||||
return "$year$mon$mday-$hour$min$sec";
|
||||
}
|
||||
|
||||
|
||||
###############################################################
|
||||
# archive_file
|
||||
#
|
||||
# This routine moves a file into a backup directory.
|
||||
#
|
||||
# Arguments:
|
||||
# $dir => source directory to archive from
|
||||
# $filename => file to archive
|
||||
# $archive_dir => destination directory to archive to
|
||||
# $archive_filename => destination filename (wihout datestamp -
|
||||
# that is appended automatically)
|
||||
# $copy => optional parameter. If == 1 then the files
|
||||
# are copied, not moved to $archive_dir.
|
||||
# Returns: $OKAY on success
|
||||
###############################################################
|
||||
sub archive_file
|
||||
{
|
||||
my ($dir, $filename, $archive_dir, $archive_filename, $copy) = @_;
|
||||
|
||||
my ($full_filename, $timestamp, $full_archive_filename);
|
||||
|
||||
|
||||
$full_filename = "$dir/$filename";
|
||||
## $timestamp = &get_time_stamp();
|
||||
$timestamp = &get_file_timestamp($full_filename);
|
||||
|
||||
$full_archive_filename = "$archive_dir/$archive_filename.$timestamp";
|
||||
|
||||
if ( -f $full_filename )
|
||||
{
|
||||
if ( defined($copy) && $copy )
|
||||
{
|
||||
if ( ! copy($full_filename, $full_archive_filename) )
|
||||
{
|
||||
return($ERROR_WARNING);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! move($full_filename, $full_archive_filename) )
|
||||
{
|
||||
return($ERROR_WARNING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return($OKAY);
|
||||
}
|
||||
|
||||
|
||||
###########################################################################
|
||||
# purge_old_archives
|
||||
#
|
||||
# This routine deletes old archive files - it sorts the files in the
|
||||
# directory and deletes the oldest files until there are at most $max_files
|
||||
# in the directory
|
||||
###########################################################################
|
||||
sub purge_old_archives
|
||||
{
|
||||
my ($archive_dir, $max_files, $prefix) = @_;
|
||||
|
||||
my ($dirhandle, @allfiles, @delfiles);
|
||||
local($_);
|
||||
|
||||
$dirhandle = new DirHandle $archive_dir;
|
||||
if ( ! $dirhandle )
|
||||
{
|
||||
return ($ERROR_WARNING);
|
||||
}
|
||||
|
||||
@allfiles = grep /^\Q$prefix\E/,
|
||||
reverse sort $dirhandle->read();
|
||||
$dirhandle->close();
|
||||
|
||||
@delfiles = splice @allfiles, $max_files;
|
||||
unlink map {"$archive_dir/$_"} @delfiles;
|
||||
}
|
||||
|
||||
|
||||
###############################
|
||||
# open_log_file
|
||||
#
|
||||
# Opens the log file for append
|
||||
###############################
|
||||
sub open_log_file
|
||||
{
|
||||
$LOG_FH = new IO::File ">>$LOG_DIR/$LOG_FILE";
|
||||
if ( ! $LOG_FH )
|
||||
{
|
||||
print STDERR "Error opening log file\n";
|
||||
exit($ERROR_CRITICAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
################
|
||||
# close_log_file
|
||||
################
|
||||
sub close_log_file
|
||||
{
|
||||
$LOG_FH->close();
|
||||
}
|
||||
|
||||
|
||||
##################################
|
||||
# write_log_file
|
||||
#
|
||||
# Writes a message to the log file
|
||||
##################################
|
||||
sub write_log_file
|
||||
{
|
||||
my ($code, $desc) = @_;
|
||||
|
||||
my ($timestamp);
|
||||
|
||||
$timestamp = &get_time_stamp();
|
||||
|
||||
if ( $code eq $START_STAMP )
|
||||
{
|
||||
print $LOG_FH "\n$code<$timestamp>: $desc\n";
|
||||
}
|
||||
elsif ( $code eq $END_STAMP )
|
||||
{
|
||||
print $LOG_FH "$code<$timestamp>: $desc\n\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print $LOG_FH "\t$code<$timestamp>: $desc\n";
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
71
atwork/burst_billing/inc/burst_accounts.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
Comcast_Online_Towson:209.19.8.1:r1.twsn1.md.home.net:45233
|
||||
Cox_AV:209.218.23.21:w4.rdc2.occa.home.net:44204
|
||||
Cox_AZ:10.252.40.193:w1.rdc1.az.home.net:43195
|
||||
Cox_NE:10.252.136.17:w1.rdc1.ne.home.net:45621
|
||||
Cox_SD:10.252.20.97:w2.rdc1.sdca.home.net:44118
|
||||
Cox_VA:10.252.60.5:w1.rdc1.va.home.net:43711
|
||||
Cox_Fibernet:10.252.64.5:w1.rdc1.ok.home.net:44119
|
||||
Befirst:216.217.177.69:w1.pop1.fl.home.net:46820
|
||||
Internap:216.217.218.129:wbb1.rdc1.wa.home.net:48891
|
||||
Merril_Lynch:10.252.172.1:w1.pop1.nj.home.net:47549
|
||||
Siebel:10.252.9.113:w4.rdc1.sfba.home.net:46653
|
||||
Vertex:10.252.140.1:w1.pop1.ca.home.net:44176
|
||||
COX_COMM:10.252.96.17:w1.pop1.la.home.net:42782
|
||||
FUSION_NETWORKS:10.252.148.53:w1.pop1.fl.home.net:40378
|
||||
ISP_ALLIANCE:10.252.168.17:w1.pop1.ga.home.net:42968
|
||||
Akamai:64.232.139.5:wbb1.pop1.va.home.net:44435
|
||||
MICROCAST:24.7.70.65:c1.cmbrma1.home.net:44698
|
||||
MICROCAST:24.7.70.81:c1.sttlwa1.home.net:44699
|
||||
MICROCAST:24.7.70.77:c1.snfcca1.home.net:44700
|
||||
MICROCAST:24.7.70.69:c2.chcgil1.home.net:44704
|
||||
MICROCAST:24.7.70.85:c2.washdc1.home.net:44702
|
||||
MICROCAST:24.7.70.73:c1.dllstx1.home.net:44703
|
||||
STREAMING_MEDIA:10.253.0.1:wbb1.pop1.va.home.net:45382
|
||||
INTELLISPACE_INTELLIGENT_INTERNET:10.252.156.33:w1.pop1.ny.home.net:44449
|
||||
Speedera:209.219.187.1:wbb1.pop2.ca.home.net:46034
|
||||
Speedera:64.232.139.1:wbb1.pop1.va.home.net:46035
|
||||
IBeam:10.253.64.49:wbb1.pop2.ca.home.net:43891
|
||||
COX_COMM:10.252.168.21:w1.pop1.ga.home.net:44619
|
||||
Apptus:10.253.0.33:wbb1.pop1.va.home.net:46080
|
||||
SADDLEBACK_COLLEGE:10.252.25.109:w1.rdc2.occa.home.net:37266
|
||||
Cox_VA:10.252.60.1:w1.rdc1.va.home.net:37085
|
||||
Cox_AV:209.218.23.21:wbb1.rdc2.occa.home.net:36842
|
||||
SEGASOFT:209.19.34.33:w4.rdc1.sfba.home.net:36658
|
||||
AT&T_NCS_ITS:10.252.1.25:w5.rdc1.nj.home.net:35004
|
||||
LUCENT_TECHNOLOGIES:10.252.0.117:w1.rdc1.nj.home.net:38002
|
||||
BROADCOM:10.252.24.9:w1.rdc2.occa.home.net:38442
|
||||
NETWORK_PLUS:10.252.49.73:w2.pop1.ma.home.net:38786
|
||||
GLOBAL_MUSIC_OUTLET:10.252.27.9:w2.rdc2.occa.home.net:34780
|
||||
SIMPLE_NETWORK_COMM:10.252.144.1:w1.sndgca1.home.net:35837
|
||||
TELEBEAM:209.125.212.9:w1.pop1.pa.home.net:34908
|
||||
INTERTAINER:10.252.24.209:w1.rdc2.occa.home.net:39622
|
||||
INTEL_CORP:10.252.160.9:w1.pop1.or.home.net:38387
|
||||
AT&T_MEDIA_SERVICES:10.252.84.161:w4.rdc1.sfba.home.net:39715
|
||||
NET_CARRIER:209.125.212.13:w1.pop1.pa.home.net:36901
|
||||
COMCAST_ONLINE:216.217.0.1:w3.rdc1.nj.home.net:40728
|
||||
REAL_NETWORKS:216.216.93.5:wbb1.rdc1.wa.home.net:40961
|
||||
INTEL_CORP:10.252.41.13:w2.pop1.az.home.net:38798
|
||||
IDEAL:10.252.56.5:wbb1.pop1.mi.home.net:40235
|
||||
IMALL:10.252.180.17:w1.pop2.ut.home.net:39762
|
||||
PRIME:10.252.25.189:w2.rdc2.occa.home.net:41036
|
||||
ETRACKS.COM:10.252.11.73:w4.rdc1.sfba.home.net:39479
|
||||
NEW_JERSEY_LINKED:10.252.172.5:w1.pop1.nj.home.net:40679
|
||||
AT&T_FIBER_WHOLESALE:10.252.84.245:w4.rdc1.sfba.home.net:39998
|
||||
NORTHPOINT_PVC_IRVINE:10.252.32.165:w3.rdc2.occa.home.net:43108
|
||||
NORTHPOINT_PVC_CHICAGO:10.252.14.149:w3.rdc1.il.home.net:43102
|
||||
NORTHPOINT_PVC_WASHINGTON:10.252.88.21:w1.pop1.dc.home.net:43103
|
||||
NORTHPOINT_PVC_ATLANTA:10.252.168.13:w1.pop1.ga.home.net:43097
|
||||
NORTHPOINT_PVC_NEW_JERSEY:10.252.80.125:w4.rdc1.nj.home.net:43105
|
||||
NORTHPOINT_PVC_FT_LAUD:10.252.148.33:w1.pop1.fl.home.net:43101
|
||||
AIRPOWER_COMM:216.216.30.213:wbb1.rdc2.occa.home.net:42072
|
||||
REAL_NETWORKS:10.252.116.53:w1.pop1.or.home.net:42946
|
||||
AKAMAI:10.253.112.33:wbb1.pop1.il.home.net:44426
|
||||
AKAMAI:10.253.132.33:wbb1.pop1.ny.home.net:44434
|
||||
AKAMAI:10.253.80.33:wbb1.pop2.wa.home.net:44427
|
||||
AKAMAI:10.253.96.33:wbb1.pop1.ca.home.net:44429
|
||||
AKAMAI:10.253.64.37:wbb1.pop2.ca.home.net:44423
|
||||
COX_COMM:10.252.168.9:w1.pop1.ga.home.net:41756
|
||||
STREAMING_MEDIA:10.253.64.33:wbb1.pop2.ca.home.net:45381
|
||||
INTUIT:216.216.48.141:w1.sndgca1.home.net:46576
|
||||
AT&T_UGN_KANSAS:10.252.152.33:w1.pop1.il.home.net:43861
|
||||
WEBUSENET:10.253.64.45:wbb1.pop2.ca.home.net:45791
|
||||
48
mozilla/mozilla.kdevprj
Normal file
@@ -0,0 +1,48 @@
|
||||
# KDE Config File
|
||||
[mozilla.lsm]
|
||||
install_location=
|
||||
dist=true
|
||||
install=false
|
||||
type=DATA
|
||||
[Config for BinMakefileAm]
|
||||
ldflags=
|
||||
cxxflags=-O0 -g3 -Wall
|
||||
bin_program=mozilla
|
||||
[po/Makefile.am]
|
||||
sub_dirs=
|
||||
type=po
|
||||
[LFV Groups]
|
||||
Dialogs=*.kdevdlg,
|
||||
Others=*,
|
||||
Translations=*.po,
|
||||
groups=Headers,Sources,Dialogs,Translations,Others,
|
||||
Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l,
|
||||
Headers=*.h,*.hh,*.hxx,*.hpp,*.H,
|
||||
[mozilla.kdevprj]
|
||||
install_location=
|
||||
dist=true
|
||||
install=false
|
||||
type=DATA
|
||||
[mozilla/docs/en/Makefile.am]
|
||||
sub_dirs=
|
||||
type=normal
|
||||
[mozilla/Makefile.am]
|
||||
sub_dirs=
|
||||
type=prog_main
|
||||
[General]
|
||||
makefiles=Makefile.am,mozilla/Makefile.am,mozilla/docs/Makefile.am,mozilla/docs/en/Makefile.am,po/Makefile.am,
|
||||
version_control=CVS
|
||||
author=Heikki Toivonen
|
||||
project_type=normal_empty
|
||||
sub_dir=mozilla/
|
||||
version=0.1
|
||||
project_name=Mozilla
|
||||
email=heikki@netscape.com
|
||||
kdevprj_version=1.2
|
||||
[Makefile.am]
|
||||
files=mozilla.kdevprj,mozilla.lsm,
|
||||
sub_dirs=mozilla,
|
||||
type=normal
|
||||
[mozilla/docs/Makefile.am]
|
||||
sub_dirs=
|
||||
type=normal
|
||||
14
mozilla/mozilla.lsm
Normal file
@@ -0,0 +1,14 @@
|
||||
Begin3
|
||||
Title: Mozilla
|
||||
Version: 0.1
|
||||
Entered-date:
|
||||
Description:
|
||||
Keywords:
|
||||
Author: Heikki Toivonen <heikki@netscape.com>
|
||||
Maintained-by: Heikki Toivonen <heikki@netscape.com>
|
||||
Primary-site:
|
||||
Home-page: http://
|
||||
Original-site:
|
||||
Platforms: Linux and other Unices
|
||||
Copying-policy: GNU Public License
|
||||
End
|
||||
20
mozilla/mozilla/templates/cpp_template
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
20
mozilla/mozilla/templates/header_template
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
@@ -1,91 +0,0 @@
|
||||
# a) Install me in public/htdocs/.htaccess, or
|
||||
# b) Create a <Directory> entry in your Apache conf
|
||||
|
||||
# You MUST define YOURPATH/inc as an include_path!
|
||||
php_value include_path /YOURPATH/v2/public/inc:.:/usr/share/pear:/YOURPATH/v2/shared/lib
|
||||
|
||||
# Init script to set up required libraries.
|
||||
php_value auto_prepend_file init.php
|
||||
|
||||
# Finish script that calls $tpl->display for global Smarty object.
|
||||
php_value auto_append_file finish.php
|
||||
|
||||
# Rewrite engine must be used to simplify URLs so they are human readable.
|
||||
RewriteEngine On
|
||||
RewriteBase /YOURPATH/public/htdocs
|
||||
|
||||
# Rewrites to be compatible with older versions of addons.
|
||||
RewriteRule ^update/VersionCheck.php(.*)$ update.php$1
|
||||
RewriteRule ^rss/index.php(.*)$ rss.php$1
|
||||
|
||||
# Compatibility for v1 extension and theme links.
|
||||
# Old example URLs:
|
||||
# /extensions/moreinfo.php?application=thunderbird&id=123
|
||||
# /extensions/moreinfo.php?id=123
|
||||
# /themes/moreinfo.php?id=321&application=seamonkey
|
||||
# /themes/moreinfo.php?id=321
|
||||
# New:
|
||||
# /thunderbird/123/
|
||||
# /firefox/123/
|
||||
# /seamonkey/321/
|
||||
# /firefox/321/
|
||||
RewriteCond %{QUERY_STRING} application=(\w+)&.*id=([0-9]+)
|
||||
RewriteRule ^(extensions|themes)/moreinfo.php$ %1/%2/? [R=301,L]
|
||||
RewriteCond %{QUERY_STRING} id=([0-9]+)&.*application=(\w+)
|
||||
RewriteRule ^(extensions|themes)/moreinfo.php$ %2/%1/? [R=301,L]
|
||||
RewriteCond %{QUERY_STRING} id=([0-9]+)
|
||||
RewriteRule ^(extensions|themes)/moreinfo.php$ firefox/%1/? [R=301,L]
|
||||
|
||||
# Compatibility for v1 of extensions. The hardcoded URL's in the old
|
||||
# browsers need this to get to the right pages: (the strings are the GUIDs)
|
||||
# Old example URL:
|
||||
# /extensions/?application={3550f703-e582-4d05-9a08-453d09bdfdc6}
|
||||
# New:
|
||||
# /extensions.php?app={3550f703-e582-4d05-9a08-453d09bdfdc6}
|
||||
RewriteCond %{QUERY_STRING} ^application=(.*)$
|
||||
RewriteRule ^extensions/$ extensions.php?app=%1 [R=301,L]
|
||||
|
||||
# Compatibility for v1 of extensions. The hardcoded URL's in the old
|
||||
# browsers need this to get to the right pages: (the strings are the GUIDs)
|
||||
# Old example URL:
|
||||
# /themes/?application={3550f703-e582-4d05-9a08-453d09bdfdc6}
|
||||
# New:
|
||||
# /themes.php?app={3550f703-e582-4d05-9a08-453d09bdfdc6}
|
||||
RewriteCond %{QUERY_STRING} ^application=(.*)$
|
||||
RewriteRule ^themes/$ themes.php?app=%1 [R=301,L]
|
||||
|
||||
# Send rss/* to rss.php.
|
||||
# Example:
|
||||
# /rss/firefox/extensions/popular/ -> rss.php?app=firefox&type=extensions&list=popular
|
||||
RewriteRule ^rss/(\w+)/(\w+)/(\w+)[/]{0,1}$ rss.php?app=$1&type=$2&list=$3
|
||||
|
||||
# Rewrite to addon.php if all we have is a numerical id after appname.
|
||||
# Example:
|
||||
# /firefox/220/ -> addon.php?app=firefox&id=220
|
||||
RewriteRule ^(\w+)/(\d+)[/]{0,1}$ addon.php?app=$1&id=$2
|
||||
|
||||
# Rewrite to an addon-specific page, passing app and id.
|
||||
# Example:
|
||||
# /firefox/220/previews/ -> previews.php?app=firefox&id=220
|
||||
RewriteRule ^(\w+)/(\d+)/(\w+)[/]{0,1}$ $3.php?app=$1&id=$2
|
||||
|
||||
# Rewrite to addon.php if there is a name given plus overview (special case for addon.php).
|
||||
# Example:
|
||||
# /firefox/flashgot/overview/ -> addon.php?app=firefox&name=flashgot
|
||||
RewriteRule ^(\w+)/(\w+)/overview[/]{0,1}$ addon.php?app=$1&name=$2
|
||||
|
||||
# Rewrite to addon-specific page, passing app and addon name.
|
||||
# Example:
|
||||
# /firefox/flashgot/previews/ -> previews.php?app=firefox&name=flashgot
|
||||
RewriteRule ^(\w+)/(\w+)/(\w+)[/]{0,1}$ $3.php?app=$1&name=$2
|
||||
|
||||
# Rewrite top-level pages.
|
||||
# Examples:
|
||||
# /firefox/extensions/ -> extensions.php?app=firefox
|
||||
# /firefox/themes/ -> themes.php?app=firefox
|
||||
RewriteRule ^(\w+)/([\w-]+)[/]{0,1}$ $2.php?app=$1
|
||||
|
||||
# Rewrite for main page & app.
|
||||
# Example:
|
||||
# /firefox/ -> /?app=firefox
|
||||
RewriteRule ^(\w+)[/]{0,1}$ index.php?app=$1
|
||||
@@ -1,130 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Add a comment to any Addon.
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*
|
||||
* Variables:
|
||||
* $_GET['aid'] = Addon ID (integer)
|
||||
*/
|
||||
|
||||
startProcessing('addcomment.tpl', null, null);
|
||||
require_once 'includes.php';
|
||||
|
||||
session_start();
|
||||
|
||||
if ((!array_key_exists('aid', $_GET)) || !is_numeric($_GET['aid'])) {
|
||||
triggerError('There was an error processing your request.');
|
||||
}
|
||||
|
||||
//This is a secure page, so we'll check the session
|
||||
if (!$_auth->validSession()) {
|
||||
//id is already verified to be numeric from above
|
||||
header('Location: '.WEB_PATH."/login.php?dest=comment&aid={$_GET['aid']}");
|
||||
exit;
|
||||
}
|
||||
|
||||
// If there are errors, this will be populated
|
||||
$_errors = array();
|
||||
|
||||
// This will be used in queries and the template
|
||||
$addon = new AddOn($_GET['aid']);
|
||||
|
||||
// If the comment is added successfully, this will toggle (used in the template)
|
||||
$added_comment = false;
|
||||
|
||||
// They're posting a comment
|
||||
if (isset($_POST['c_submit'])) {
|
||||
|
||||
if (! (array_key_exists('c_rating', $_POST)
|
||||
&& array_key_exists('c_title', $_POST)
|
||||
&& array_key_exists('c_comments', $_POST))) {
|
||||
//This should never happen, but hey...
|
||||
triggerError('There was an error processing your request.');
|
||||
}
|
||||
|
||||
// Check all our input to make sure something is there, and it is appropriate.
|
||||
// If it isn't, make $_bad_input=true which means we'll print the form back out
|
||||
// with an error message. (By using booleans here, we keep the error messages in
|
||||
// the .tpl)
|
||||
$_bad_input = false;
|
||||
if (!is_numeric($_POST['c_rating'])) {
|
||||
$_errors['c_rating'] = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
if (empty($_POST['c_title'])) {
|
||||
$_errors['c_title'] = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
if (empty($_POST['c_comments'])) {
|
||||
$_errors['c_comments'] = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
|
||||
// If bad_input is true, we'll skip the rest of the processing and dump them
|
||||
// back out to the from with an error.
|
||||
if ($_bad_input === false) {
|
||||
|
||||
// I got a little carried away with the escaping, but it's not gonna hurt anything.
|
||||
$_c_id = mysql_real_escape_string($addon->ID);
|
||||
$_c_user_id = mysql_real_escape_string($_auth->getId());
|
||||
$_c_rating = mysql_real_escape_string($_POST['c_rating']);
|
||||
$_c_title = mysql_real_escape_string(strip_tags($_POST['c_title']));
|
||||
$_c_comments = mysql_real_escape_string(strip_tags($_POST['c_comments']));
|
||||
$_c_commentip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
|
||||
|
||||
$_sql = "INSERT INTO `feedback`
|
||||
(
|
||||
`ID`,
|
||||
`UserId`,
|
||||
`CommentVote`,
|
||||
`CommentTitle`,
|
||||
`CommentNote`,
|
||||
`CommentDate`,
|
||||
`commentip`
|
||||
) VALUES (
|
||||
{$_c_id},
|
||||
{$_c_user_id},
|
||||
{$_c_rating},
|
||||
'{$_c_title}',
|
||||
'{$_c_comments}',
|
||||
NOW(),
|
||||
'{$_c_commentip}'
|
||||
)";
|
||||
|
||||
$db->query($_sql);
|
||||
|
||||
if (!DB::isError($db->record)) {
|
||||
// Calculate the lookup value in main for comment avg if our INSERT was successful.
|
||||
$_ratingSql = "UPDATE `main` SET `Rating` = ROUND((SELECT AVG(`CommentVote`) FROM `feedback` WHERE `ID` = {$_c_id}),2) WHERE `ID` = {$_c_id}";
|
||||
$db->query($_ratingSql);
|
||||
}
|
||||
|
||||
// For the template
|
||||
$added_comment = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Put values back into the form - if something went wrong this will populate the
|
||||
// form again
|
||||
$c_rating_value = array_key_exists('c_rating', $_POST) ? $_POST['c_rating'] : '';
|
||||
$c_title_value = array_key_exists('c_title', $_POST) ? $_POST['c_title'] : '';
|
||||
$c_comments_value = array_key_exists('c_comments', $_POST) ? $_POST['c_comments'] : '';
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'title' => 'Add Comment',
|
||||
'currentTab' => null,
|
||||
'rate_select_value' => array('','5','4','3','2','1','0'),
|
||||
'rate_select_name' => array('Rating:','5 stars', '4 stars', '3 stars', '2 stars', '1 star', '0 stars'),
|
||||
'addon' => $addon,
|
||||
'c_added_comment' => $added_comment,
|
||||
'c_errors' => $_errors,
|
||||
'c_rating_value' => $c_rating_value,
|
||||
'c_title_value' => $c_title_value,
|
||||
'c_comments_value' => $c_comments_value,
|
||||
'sidebar' => 'inc/addon-sidebar.tpl'
|
||||
)
|
||||
);
|
||||
?>
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Addon summary page. Displays a top-down view of all Addon properties.
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*/
|
||||
|
||||
// Get the int value of our addon ID.
|
||||
$clean['ID'] = intval($_GET['id']);
|
||||
$sql['ID'] =& $clean['ID'];
|
||||
|
||||
startProcessing('addon.tpl',$clean['ID'],$compileId);
|
||||
require_once('includes.php');
|
||||
|
||||
// Create our AddOn object using the ID.
|
||||
$addon = new AddOn($sql['ID']);
|
||||
|
||||
/* This is kind of a cheesy hack to determine how to display
|
||||
download links on the addon page. If only one link is shown,
|
||||
there will just be an "Install Now" link, otherwise there will
|
||||
be links for each version. */
|
||||
if (sizeof($addon->OsVersions) == 1) {
|
||||
$multiDownloadLinks = false;
|
||||
} else {
|
||||
$multiDownloadLinks = true;
|
||||
}
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'addon' => $addon,
|
||||
'multiDownloadLinks' => $multiDownloadLinks,
|
||||
'title' => $addon->Name,
|
||||
'content' => 'addon.tpl',
|
||||
'sidebar' => 'inc/addon-sidebar.tpl')
|
||||
);
|
||||
?>
|
||||
@@ -1,24 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Author information.
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*/
|
||||
|
||||
// Get our addon ID.
|
||||
$clean['UserID'] = intval($_GET['id']);
|
||||
$sql['UserID'] =& $clean['UserID'];
|
||||
|
||||
startProcessing('author.tpl',$clean['UserID'],$compileId);
|
||||
require_once('includes.php');
|
||||
|
||||
$user = new User($sql['UserID']);
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'user' => $user,
|
||||
'title' => $user->UserName,
|
||||
'content' => 'author.tpl',
|
||||
'sidebar' => 'inc/author-sidebar.tpl')
|
||||
);
|
||||
?>
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Comments listing for an addon.
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
* @TODO Disallow comments for addon authors (authors should not be allowed to comment on their own addon).
|
||||
* @TODO Throttle comment entry.
|
||||
*/
|
||||
|
||||
// Get our addon id.
|
||||
$clean['id'] = intval($_GET['id']);
|
||||
$sql['id'] =& $clean['id'];
|
||||
|
||||
// Sort.
|
||||
if (isset($_GET['sort'])&&ctype_alpha($_GET['sort'])) {
|
||||
$clean['sort'] = $_GET['sort'];
|
||||
}
|
||||
|
||||
// Starting point.
|
||||
$page['left'] = (isset($_GET['left'])) ? intval($_GET['left']) : 0;
|
||||
|
||||
// Ending point.
|
||||
$page['right'] = $page['left'] + 10;
|
||||
|
||||
// Order by.
|
||||
$page['orderby'] = (!empty($_GET['orderby'])&&ctype_alpha($_GET['orderby'])) ? $_GET['orderby'] : "";
|
||||
|
||||
startProcessing('comments.tpl',$clean['id'],$compileId);
|
||||
require_once('includes.php');
|
||||
|
||||
$addon = new AddOn($sql['id']);
|
||||
$addon->getComments($page['left'],10,$page['orderby']);
|
||||
|
||||
// Get our result count.
|
||||
$db->query("SELECT FOUND_ROWS()", SQL_INIT);
|
||||
$resultCount = !empty($db->record) ? $db->record[0] : $page['right'];
|
||||
if ($resultCount<$page['right']) {
|
||||
$page['right'] = $resultCount;
|
||||
}
|
||||
|
||||
// Do we even have a next or previous page?
|
||||
$page['previous'] = ($page['left'] >= 10) ? $page['left']-10 : null;
|
||||
$page['next'] = ($page['left']+10 < $resultCount) ? $page['left']+10 : null;
|
||||
$page['resultCount'] = $resultCount;
|
||||
$page['leftDisplay'] = $page['left']+1;
|
||||
|
||||
// Build the URL based on passed arguments.
|
||||
foreach ($clean as $key=>$val) {
|
||||
if (!empty($val)) {
|
||||
$buf[] = $key.'='.$val;
|
||||
}
|
||||
}
|
||||
$page['url'] = implode('&',$buf);
|
||||
unset($buf);
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'addon' => $addon,
|
||||
'title' => $addon->Name.' Comments',
|
||||
'content' => 'comments.tpl',
|
||||
'sidebar' => 'inc/addon-sidebar.tpl',
|
||||
'page' => $page)
|
||||
);
|
||||
?>
|
||||
@@ -1,132 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Create a new account
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*
|
||||
*/
|
||||
|
||||
startProcessing('createaccount.tpl', null, null, 'nonav');
|
||||
require_once 'includes.php';
|
||||
|
||||
// If there are problems, these will be set to true and used in the template. By
|
||||
// using null/booleans, error messages are kept in the template.
|
||||
$error_email_empty = null;
|
||||
$error_email_malformed = null;
|
||||
$error_emailconfirm_empty = null;
|
||||
$error_emailconfirm_nomatch = null;
|
||||
$error_email_duplicate = null;
|
||||
$error_name_empty = null;
|
||||
$error_password_empty = null;
|
||||
$error_passwordconfirm_empty = null;
|
||||
$error_passwordconfirm_nomatch = null;
|
||||
|
||||
$_bad_input = false; // think positive :)
|
||||
$account_created = false;
|
||||
|
||||
if (array_key_exists('submit', $_POST) && isset($_POST['submit'])) {
|
||||
/* Verify Input */
|
||||
// Check email - a little long and confusing. Basically, throw an error if
|
||||
// the following is not met (in order):
|
||||
// $email is set, $emailconfirm is set, $email=$emailconfirm, and $email is a valid address
|
||||
if (!array_key_exists('email', $_POST) || empty($_POST['email'])) {
|
||||
$error_email_empty = true;
|
||||
$_bad_input = true;
|
||||
} else {
|
||||
if (!array_key_exists('emailconfirm', $_POST) || empty($_POST['emailconfirm'])) {
|
||||
$error_emailconfirm_empty = true;
|
||||
$_bad_input = true;
|
||||
} else {
|
||||
// technically this would catch if emailconfirm was empty to, but
|
||||
// waiting until here could make php throw a warning.
|
||||
if ($_POST['email'] != $_POST['emailconfirm']) {
|
||||
$error_emailconfirm_nomatch = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
}
|
||||
// Regex from Gavin Sharp -- thanks Gavin.
|
||||
if (!preg_match('/^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/',$_POST['email'])) {
|
||||
$error_email_malformed = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
}
|
||||
// name is required
|
||||
if (!array_key_exists('name', $_POST) || empty($_POST['name'])) {
|
||||
$error_name_empty = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
// password is required and match
|
||||
if (!array_key_exists('password', $_POST) || empty($_POST['password'])) {
|
||||
$error_password_empty = true;
|
||||
$_bad_input = true;
|
||||
} else {
|
||||
if (!array_key_exists('passwordconfirm', $_POST) || empty($_POST['passwordconfirm'])) {
|
||||
$error_passwordconfirm_empty = true;
|
||||
$_bad_input = true;
|
||||
} else {
|
||||
if ($_POST['password'] != $_POST['passwordconfirm']) {
|
||||
$error_passwordconfirm_nomatch = true;
|
||||
$_bad_input = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// This is a little out of order because we're trying to save a query. If we
|
||||
// haven't had any bad input yet, do one last check to make sure the email
|
||||
// address isn't already in use.
|
||||
if ($_bad_input === false) {
|
||||
$_user_test = user::getUserByEmail($_POST['email']);
|
||||
|
||||
if (is_object($_user_test)) {
|
||||
$_bad_input = true;
|
||||
$error_email_duplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
// We're happy with the input, make a new account
|
||||
if ($_bad_input === false) {
|
||||
$_user_info = array();
|
||||
$_user_info['email'] = $_POST['email'];
|
||||
$_user_info['name'] = $_POST['name'];
|
||||
$_user_info['website'] = $_POST['website'];
|
||||
$_user_info['password'] = $_POST['password'];
|
||||
$user_id = user::addUser($_user_info);
|
||||
if ($user_id === false) {
|
||||
triggerError('There was an error processing your request.');
|
||||
}
|
||||
$user = new User($user_id[0]);
|
||||
// we're emailing them their plain text password
|
||||
$user->sendConfirmation($_user_info['password']);
|
||||
$account_created = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Pull values from POST to put back in the form
|
||||
$email_value = array_key_exists('email', $_POST) ? $_POST['email'] : '';
|
||||
$emailconfirm_value = array_key_exists('emailconfirm', $_POST) ? $_POST['emailconfirm'] : '';
|
||||
$name_value = array_key_exists('name', $_POST) ? $_POST['name'] : '';
|
||||
$website_value = array_key_exists('website', $_POST) ? $_POST['website'] : '';
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'title' => 'Create an Account',
|
||||
'currentTab' => null,
|
||||
'account_created' => $account_created,
|
||||
'bad_input' => $_bad_input,
|
||||
'error_email_empty' => $error_email_empty,
|
||||
'error_email_malformed' => $error_email_malformed,
|
||||
'error_emailconfirm_empty' => $error_emailconfirm_empty,
|
||||
'error_emailconfirm_nomatch' => $error_emailconfirm_nomatch,
|
||||
'error_email_duplicate' => $error_email_duplicate,
|
||||
'error_name_empty' => $error_name_empty,
|
||||
'error_password_empty' => $error_password_empty,
|
||||
'error_passwordconfirm_empty' => $error_passwordconfirm_empty,
|
||||
'error_passwordconfirm_nomatch' => $error_passwordconfirm_nomatch,
|
||||
'email_value' => $email_value,
|
||||
'emailconfirm_value' => $emailconfirm_value,
|
||||
'name_value' => $name_value,
|
||||
'website_value' => $website_value
|
||||
)
|
||||
);
|
||||
?>
|
||||
@@ -1,115 +0,0 @@
|
||||
body, td, th, h3, input { /* redundant rules for bad browsers */
|
||||
font-family: verdana, sans-serif;
|
||||
font-size: x-small;
|
||||
voice-family: "\"}\"";
|
||||
voice-family: inherit;
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
body {
|
||||
color: #333;
|
||||
line-height: 140%;
|
||||
}
|
||||
|
||||
a:link { color: #039; }
|
||||
a:visited { color: #609; }
|
||||
a:hover { color: #333; }
|
||||
a:active { color: #000; }
|
||||
|
||||
#header a:visited { color: #039; }
|
||||
#header a:hover { color: #333; }
|
||||
|
||||
#mBody li { padding-bottom: 0.5em; }
|
||||
|
||||
.sidebar_content > h1,.sidebar_content > h2,.sidebar_content > h3,.sidebar_content > h4,.sidebar_content > h5,.sidebar_content > h6,.sidebar > h1,.sidebar_general > h2,.sidebar_general > h3,.sidebar_general > h4,.sidebar_general > h5,.sidebar_general > h6 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.sidebar_right {
|
||||
margin-left: 65%;
|
||||
}
|
||||
|
||||
.sidebar_general ul {
|
||||
margin-left: 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.sidebar_general li {
|
||||
padding: 0.2em 0;
|
||||
}
|
||||
|
||||
img.imgright {
|
||||
float: right;
|
||||
margin: .3em .3em .3em 0;
|
||||
padding: .3em .3em .3em 0;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0 0 1em 1em;
|
||||
}
|
||||
|
||||
.skipLink {
|
||||
position: absolute;
|
||||
left: -1200px;
|
||||
width: 990px;
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
ul.compact {
|
||||
margin-left: 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
img.rss {
|
||||
float: right;
|
||||
margin: 0;
|
||||
padding: 4px 4px 0 0;
|
||||
}
|
||||
|
||||
.first { margin-top: 0.2em; }
|
||||
|
||||
.requires img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* Headers */
|
||||
|
||||
#mainContent > h1:first-child,
|
||||
#mainContent > h2:first-child,
|
||||
#mainContent > h3:first-child,
|
||||
#mainContent > h4:first-child,
|
||||
#mainContent > h5:first-child,
|
||||
#mainContent > h6:first-child,
|
||||
#side > h1:first-child,
|
||||
#side > h2:first-child,
|
||||
#side > h3:first-child,
|
||||
#side > h4:first-child,
|
||||
#side > h5:first-child,
|
||||
#side > h6:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.appversions {
|
||||
border: 1px solid #ccc;
|
||||
margin: .5em 0;
|
||||
}
|
||||
|
||||
.appversions th {
|
||||
background-color: #ccc;
|
||||
padding: .2em;
|
||||
}
|
||||
|
||||
.appversions .row1 {
|
||||
background-color: #eee;
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
body {
|
||||
min-width: 700px;
|
||||
margin: 0 0 2em 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 740px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#mBody {
|
||||
clear: both;
|
||||
padding: .2em 0;
|
||||
}
|
||||
|
||||
.sidebar_content {
|
||||
width: 60%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#footer {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
#side {
|
||||
float: left;
|
||||
width: 23%;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
#mainContent {
|
||||
margin-left: 25%;
|
||||
}
|
||||
.nomenu #mainContent {
|
||||
margin-left: 0;
|
||||
}
|
||||
.bodyleft {
|
||||
margin-left: 25% ! important
|
||||
}
|
||||
#mainContent.right {
|
||||
float: left;
|
||||
width: 62%;
|
||||
margin-bottom: 1em;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
#side.right {
|
||||
float: none;
|
||||
width: auto;
|
||||
margin-left: 65%;
|
||||
}
|
||||
|
||||
p.security-update {
|
||||
padding-left: 35px;
|
||||
background: url(../../images/security-update.png) no-repeat;
|
||||
margin-top: 0;
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
#nav:before {
|
||||
line-height: 0.1;
|
||||
font-size: 1px;
|
||||
background: transparent url("../../images/menu_tr.gif") no-repeat top right;
|
||||
margin: 0;
|
||||
height: 9px;
|
||||
display: block;
|
||||
border-bottom: 1px solid #ddd;
|
||||
content: url("../../images/key-point_tl.gif");
|
||||
}
|
||||
#nav {
|
||||
background: #E0E9E9 url("../../images/menu_back.gif") right repeat-y;
|
||||
}
|
||||
#nav:after {
|
||||
display: block;
|
||||
padding-top: 0;
|
||||
line-height: 0.1;
|
||||
font-size: 1px;
|
||||
content: url("../../images/key-point_bl.gif");
|
||||
margin: 0 0 0 0;
|
||||
height: 8px;
|
||||
background: transparent url("../../images/menu_br.gif") scroll no-repeat bottom right ;
|
||||
border-top: 1px solid #fff;
|
||||
}
|
||||
|
||||
#nav, #nav ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
#nav {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
#nav li {
|
||||
display: inline;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#nav li span { /* used for un-linked menu items */
|
||||
display: block;
|
||||
padding: 6px 10px;
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
#nav li span#configParent, #nav li span #configuration {
|
||||
display: inline;
|
||||
font-weight: normal;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#nav li a {
|
||||
display: block;
|
||||
padding: 6px 10px;
|
||||
text-decoration: none;
|
||||
background: #EDF2F2;
|
||||
border-bottom: 1px solid #ddd;
|
||||
border-top: 1px solid #fff;
|
||||
border-right: 1px solid #ddd;
|
||||
}
|
||||
|
||||
#nav li a:hover {
|
||||
background: #E0E9E9;
|
||||
}
|
||||
|
||||
#nav ul li span,#nav ul li a {
|
||||
padding: 4px 8px 4px 20px;
|
||||
}
|
||||
|
||||
.clear-both {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
@@ -1,454 +0,0 @@
|
||||
#mBody h2 {
|
||||
font: 140% arial,helvetica,verdana,sans-serif;
|
||||
border-bottom: 1px solid #ccc;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#mBody h2 a {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#mBody h3 {
|
||||
font: 120% arial,helvetica,verdana,sans-serif;
|
||||
border-bottom: 1px solid #ccc;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#mBody h1 {
|
||||
font: 180% arial,helvetica,sans-serif;
|
||||
border-bottom: 1px solid #ccc;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.key-point:before {
|
||||
line-height: 0.1;
|
||||
font-size: 1px;
|
||||
background: transparent url("../../images/key-point_tr.gif") no-repeat top right;
|
||||
margin: -15px -15px 0 -15px;
|
||||
height: 15px;
|
||||
display: block;
|
||||
border: none;
|
||||
content: url("../../images/key-point_tl.gif");
|
||||
}
|
||||
.key-point {
|
||||
background: #EFF8CE url("../../images/key-point_back.gif") right repeat-y;
|
||||
padding: 15px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
.key-point:after {
|
||||
display: block;
|
||||
padding-top: 15px;
|
||||
line-height: 0.1;
|
||||
font-size: 1px;
|
||||
content: url("../../images/key-point_bl.gif");
|
||||
margin: -15px;
|
||||
height: 8px;
|
||||
background: transparent url("../../images/key-point_br.gif") scroll no-repeat bottom right ;
|
||||
}
|
||||
|
||||
#header form #submit {
|
||||
font-size: 100%;
|
||||
padding: 1px;
|
||||
font-family: tahoma, arial, sans-serif;
|
||||
}
|
||||
|
||||
#header form #q {
|
||||
width: 10em;
|
||||
font-size: 100%;
|
||||
font-weight: normal;
|
||||
border: 1px solid #9097A2;
|
||||
padding: 2px;
|
||||
font-family: tahoma, arial, sans-serif;
|
||||
}
|
||||
|
||||
#sectionsearch {
|
||||
font-size: 100%;
|
||||
font-weight: normal;
|
||||
font-family: tahoma, arial, sans-serif;
|
||||
}
|
||||
|
||||
.popularlist {
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.popularlist span {
|
||||
color: #666;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.install a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.install a strong {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.install-box {
|
||||
width: 20em;
|
||||
}
|
||||
.key-point {
|
||||
background-color:#bee6a1;
|
||||
}
|
||||
|
||||
.install div {
|
||||
background: url(../../images/install.png) no-repeat;
|
||||
padding: 3px 0 8px 30px;
|
||||
|
||||
}
|
||||
|
||||
#opinions h4 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.opinions-info {
|
||||
font-size: 85%;
|
||||
margin: 0 0 0.5em 0;
|
||||
}
|
||||
|
||||
.opinions-info a {
|
||||
text-decoration: none;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.opinions-info a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.opinions-text {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.opinions-rating img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.rating {
|
||||
float: right;
|
||||
font-size: 85%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.rating img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.more-links {
|
||||
margin: 0.5em 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.more-links li {
|
||||
display: inline;
|
||||
margin: 0;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.screenshot {
|
||||
float: right;
|
||||
background: #fff;
|
||||
padding: 0 0 2em 2em;
|
||||
}
|
||||
|
||||
.screenshot a {
|
||||
text-align: center;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Remaining Original Update Styles */
|
||||
|
||||
.item {
|
||||
border: #D2D6D6 1px solid;
|
||||
padding-left: 5px;
|
||||
padding-right: 6px;
|
||||
MARGIN-bottom: 10px;
|
||||
-moz-border-radius: 10px;
|
||||
}
|
||||
|
||||
.item a {
|
||||
color: #00129c;
|
||||
text-decoration: none;
|
||||
}
|
||||
.item a:visited {
|
||||
color: #00129c;
|
||||
text-decoration: none;
|
||||
}
|
||||
.item a:hover {
|
||||
color: #fc5900;
|
||||
}
|
||||
|
||||
.item h2 {
|
||||
margin-top: 0.2em;
|
||||
}
|
||||
|
||||
.recommended {
|
||||
clear: both;
|
||||
padding: 1em 0;
|
||||
}
|
||||
|
||||
.recommended h2 {
|
||||
padding: 1em 0 0 215px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.recommended p {
|
||||
padding-left: 215px;
|
||||
}
|
||||
|
||||
.recommended-download h3 {
|
||||
font: small tahoma, verdana, sans-serif;
|
||||
margin: 0;
|
||||
background: url("../../images/download.gif") 0 100%;
|
||||
font-size: small;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.recommended-download h3 a {
|
||||
display: block;
|
||||
background: url("../../images/download.gif") 0 0;
|
||||
font-size: 65%;
|
||||
font-weight: bold;
|
||||
width: 165px;
|
||||
padding: 12px 25px 5px 10px;
|
||||
text-decoration: none;
|
||||
color: #5A9A3B;
|
||||
}
|
||||
|
||||
.recommended-download h3 a:hover {
|
||||
text-decoration: underline;
|
||||
color: #275113;
|
||||
}
|
||||
|
||||
.recommended-download {
|
||||
display: block;
|
||||
width: 200px;
|
||||
padding: 15px 0 0 215px;
|
||||
}
|
||||
|
||||
.recommended-img {
|
||||
border: 2px outset #eee;
|
||||
float: left;
|
||||
margin: 1em 1em 0 0;
|
||||
}
|
||||
|
||||
.iconbar {
|
||||
padding-right: 15px;
|
||||
float: left;
|
||||
width: auto;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.iconbar img {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.iconbar a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.selected a, .selected a:visited {
|
||||
color: #fc5900;
|
||||
}
|
||||
|
||||
.baseline {
|
||||
clear: right;
|
||||
margin-top: 5px;
|
||||
border-top: #ccc 1px solid;
|
||||
padding: 3px;
|
||||
padding-left: 10px;
|
||||
font-size: 8pt;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
#opinions {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#opinions li {
|
||||
border-top: 1px solid #eee;
|
||||
padding: 1em 0;
|
||||
}
|
||||
|
||||
#opinions h4 {
|
||||
clear: right;
|
||||
margin: 0;
|
||||
padding: .5em 0 0 0;
|
||||
}
|
||||
|
||||
.opinions-info {
|
||||
color: #666;
|
||||
margin: 0;
|
||||
padding: 0 0 .5em 0;
|
||||
|
||||
}
|
||||
|
||||
.opinions-info a {
|
||||
text-decoration: none;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.opinions-info a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.opinions-text {
|
||||
margin: .8em 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.opinions-vote {
|
||||
background-color: #cfc;
|
||||
border: 1px solid #000;
|
||||
float: left;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
font-size: x-large;
|
||||
padding: 5px;
|
||||
margin: 4px;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
|
||||
.opinions-caption {
|
||||
display: block;
|
||||
font-size: x-small;
|
||||
font-weight: normal;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
}
|
||||
|
||||
.opinions-rating {
|
||||
margin: 0;
|
||||
padding: .5em 0;
|
||||
}
|
||||
|
||||
.opinions-helpful {
|
||||
font-style: italic;
|
||||
border: 1px dashed #eee;
|
||||
padding: .2em;
|
||||
margin: .7em 0;
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
cursor: help;
|
||||
border-bottom: 1px dotted;
|
||||
}
|
||||
|
||||
.pages {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
height: 2em;
|
||||
}
|
||||
|
||||
.next {
|
||||
border-left: 1px solid #000;
|
||||
display: inline;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.prev {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.pages a {
|
||||
color: blue;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#comment-rate {
|
||||
margin: .5em;
|
||||
padding: .5em;
|
||||
background-color: #eee;
|
||||
border: 1px solid #999;
|
||||
}
|
||||
|
||||
#search-block:before {
|
||||
line-height: 0.1;
|
||||
font-size: 1px;
|
||||
background: transparent url("../../img/key-point_tr.gif") no-repeat top right;
|
||||
margin: -10px -10px 0 -10px;
|
||||
height: 10px;
|
||||
display: block;
|
||||
border: none;
|
||||
content: url("../../img/key-point_tl.gif");
|
||||
}
|
||||
|
||||
#search-block{
|
||||
background: #EFF8CE url("../../img/key-point_back.gif") right repeat-y;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#search-block label{
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#search-block select {
|
||||
width: 13em;
|
||||
}
|
||||
|
||||
#search-block input[type=text] {
|
||||
width: 9.2em;
|
||||
}
|
||||
|
||||
.right #search-block select {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
.right #search-block input[type=text] {
|
||||
width: 16.2em;
|
||||
}
|
||||
|
||||
#search-block:after {
|
||||
display: block;
|
||||
padding-top: 10px;
|
||||
line-height: 0.1;
|
||||
font-size: 1px;
|
||||
content: url("../../img/key-point_bl.gif");
|
||||
margin: -10px;
|
||||
height: 8px;
|
||||
background: transparent url("../../img/key-point_br.gif") scroll no-repeat bottom right ;
|
||||
}
|
||||
|
||||
#search-options {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#hide-search-options {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#show-search-options {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#comments-sort {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.disclaimer {
|
||||
text-align: center;
|
||||
color: #ccc;
|
||||
font-size: x-small;
|
||||
width: 600px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.install-thunderbird {
|
||||
background-color: #eee;
|
||||
border: 1px solid #ccc;
|
||||
margin: .5em 0;
|
||||
padding: .5em;
|
||||
}
|
||||
|
||||
.install-thunderbird p {
|
||||
font-weight: bold;
|
||||
color: blue;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
@@ -1,317 +0,0 @@
|
||||
body {
|
||||
background: #fff url("../../images/body_back.gif") repeat-x;
|
||||
}
|
||||
|
||||
#footer {
|
||||
background: url("../../images/footer.gif") 0 8px no-repeat;
|
||||
margin: 10px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#footer span,#footer a {
|
||||
white-space: nowrap;
|
||||
padding: 0 1em;
|
||||
color: #666;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
#footer p a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#footer .switch-fx,
|
||||
#footer .switch-tb,
|
||||
#footer .switch-suite {
|
||||
padding-left: 30px;
|
||||
font-size: 100%;
|
||||
background: #fff 9px 0 no-repeat;
|
||||
}
|
||||
|
||||
#footer .switch-tb {
|
||||
background-image: url("../../images/switch-tb.gif");
|
||||
}
|
||||
|
||||
#footer .switch-suite {
|
||||
background-image: url("../../images/switch-suite.gif");
|
||||
}
|
||||
|
||||
#footer .switch-fx {
|
||||
background-image: url("../../images/switch-fx.gif");
|
||||
}
|
||||
|
||||
/* Site Header */
|
||||
|
||||
#header {
|
||||
clear: both;
|
||||
padding-top: 40px;
|
||||
position: relative;
|
||||
} * html #header { padding-top: 20px; }
|
||||
|
||||
#header h1 {
|
||||
height: 46px;
|
||||
margin: 0;
|
||||
font-size: 2px;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -4px;
|
||||
border: none;
|
||||
z-index: 5000;
|
||||
}
|
||||
|
||||
#header form {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 9px;
|
||||
margin-left: 200px;
|
||||
font-family: tahoma, arial, sans-serif;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
#header div#auth {
|
||||
display:inline;
|
||||
position:absolute;
|
||||
top:11px;
|
||||
right:0px;
|
||||
margin-right: 200px;
|
||||
}
|
||||
|
||||
#key-menu {
|
||||
background: #B2C1C8 url("../../images/header-bottom.gif") 0 100% no-repeat;
|
||||
padding: 0 0 10px 0;
|
||||
overflow: auto;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
* html #key-menu {
|
||||
overflow: visible;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
#key-menu ul, #key-menu li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#key-menu ul {
|
||||
padding: 14px 12px 0 12px;
|
||||
background: url("../../images/header-top.gif") 0 0 no-repeat;
|
||||
}
|
||||
|
||||
#key-menu li {
|
||||
float: left;
|
||||
background: url("../../images/tabs.gif") 100% -50px;
|
||||
padding-right: 5px;
|
||||
margin-right: 2px;
|
||||
border-bottom: 1px solid #849CA4;
|
||||
margin-bottom: -10px;
|
||||
}
|
||||
|
||||
#key-menu li a, #key-menu li span {
|
||||
display: block;
|
||||
float: left;
|
||||
padding: 3px 15px 2px 20px;
|
||||
background: url("../../images/tabs.gif") 0 -50px;
|
||||
color: #5A7CBA;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#key-menu li:hover a {
|
||||
background-position: 0 -100px;
|
||||
}
|
||||
|
||||
#key-menu li:hover {
|
||||
background-position: 100% -100px;
|
||||
}
|
||||
|
||||
#key-menu li.current {
|
||||
background: url("../../images/tabs.gif") 100% 0;
|
||||
border-bottom-color: white;
|
||||
}
|
||||
|
||||
#key-menu li.current a, #key-menu li.current span {
|
||||
background: url("../../images/tabs.gif") 0 0;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
#mozilla-com a {
|
||||
float: right;
|
||||
display: block;
|
||||
text-indent: -5000em;
|
||||
width: 110px;
|
||||
height: 25px;
|
||||
text-decoration: none;
|
||||
background: url("../../images/mozilla-org.gif") no-repeat;
|
||||
}
|
||||
|
||||
/* End Site Header */
|
||||
|
||||
/* Front Feature */
|
||||
.split-feature {
|
||||
background: url("../../images/feature-back.png") 0 100% no-repeat;
|
||||
overflow: auto;
|
||||
padding-bottom: 10px;
|
||||
margin-right: -2px;
|
||||
} * html .split-feature { overflow: visible; height: 1px; }
|
||||
|
||||
.split-feature-one, .split-feature-two {
|
||||
padding: 15px 15px 0 15px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.split-feature-one {
|
||||
width: 485px;
|
||||
background: url("../../images/feature-back.png") 0 0 no-repeat;
|
||||
}
|
||||
|
||||
.split-feature-two {
|
||||
width: 185px;
|
||||
padding-left: 25px;
|
||||
background: url("../../images/feature-back.png") 100% 0 no-repeat;
|
||||
}
|
||||
|
||||
.split-feature h2 {
|
||||
margin: 0 0 0.2em 0;
|
||||
font-family: verdana, arial, sans-serif;
|
||||
font-size: 1.4em;
|
||||
}
|
||||
|
||||
.split-feature h2 a {
|
||||
text-decoration: none;
|
||||
font-size: medium;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.split-feature-one p {
|
||||
margin-left: 220px;
|
||||
}
|
||||
|
||||
.feature-download h3 {
|
||||
font: 85% tahoma, verdana, sans-serif;
|
||||
margin: 5px 0 0 0;
|
||||
background: url("../../images/download.gif") 0 100%;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.feature-download h3 a {
|
||||
display: block;
|
||||
background: url("../../images/download.gif") 0 0;
|
||||
font-weight: bold;
|
||||
width: 165px;
|
||||
padding: 12px 25px 5px 10px;
|
||||
text-decoration: none;
|
||||
color: #5A9A3B;
|
||||
}
|
||||
|
||||
.feature-download h3 a:hover {
|
||||
text-decoration: underline;
|
||||
color: #275113;
|
||||
}
|
||||
|
||||
.feature-download {
|
||||
float: left;
|
||||
width: 200px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
ol.top-10, ol.top-10 li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
ol.top-10 li a {
|
||||
display: block;
|
||||
text-align: right;
|
||||
padding: 1px 0 1px 20px;
|
||||
border-top: 1px solid #eee;
|
||||
text-decoration: none;
|
||||
width: 160px;
|
||||
background: url("../../images/top-10.gif") 0 0 no-repeat;
|
||||
cursor: pointer; /* for IE as it ignores floating <strong>s */
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
ol.top-10 li a:hover strong {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
ol.top-10 li.top-10-2 a { background-position: 0 -50px; }
|
||||
ol.top-10 li.top-10-3 a { background-position: 0 -100px; }
|
||||
ol.top-10 li.top-10-4 a { background-position: 0 -150px; }
|
||||
ol.top-10 li.top-10-5 a { background-position: 0 -200px; }
|
||||
ol.top-10 li.top-10-6 a { background-position: 0 -250px; }
|
||||
ol.top-10 li.top-10-7 a { background-position: 0 -300px; }
|
||||
ol.top-10 li.top-10-8 a { background-position: 0 -350px; }
|
||||
ol.top-10 li.top-10-9 a { background-position: 0 -400px; }
|
||||
ol.top-10 li.top-10-10 a { background-position: 0 -450px; }
|
||||
|
||||
ol.top-10 li strong {
|
||||
float: left;
|
||||
}
|
||||
|
||||
#front-search {
|
||||
text-align: center;
|
||||
margin: 1.5em 0 1em 0;
|
||||
}
|
||||
|
||||
.front-section-left, .front-section-right {
|
||||
width: 220px;
|
||||
float: left;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.front-section-left {
|
||||
padding: 5px 0 5px 190px;
|
||||
}
|
||||
|
||||
.front-section-right {
|
||||
padding: 5px 70px 5px 0;
|
||||
}
|
||||
|
||||
.front-section-left h2, .front-section-right h2{
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.front-section-left ul, .front-section-right ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.front-section-left li, .front-section-right li {
|
||||
padding: 0.2em 0;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.front-section {
|
||||
width: 220px;
|
||||
padding: 5px 0 5px 25px;
|
||||
float: left;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.front-section h2 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.front-section ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.front-section li {
|
||||
padding: 0.2em 0;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
a.top-feature {
|
||||
float: left;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
a.top-feature img {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
.amo-form div {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.amo-submit {
|
||||
background-color: #eee;
|
||||
border: 2px #999 outset;
|
||||
}
|
||||
|
||||
.amo-submit:hover {
|
||||
background-color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.amo-cancel {
|
||||
}
|
||||
|
||||
.amo-label-large, .amo-label-medium, .amo-label-small {
|
||||
border-bottom: 1px dashed #eee;
|
||||
float: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.amo-label-large {
|
||||
width: 14em;
|
||||
}
|
||||
|
||||
.amo-label-medium {
|
||||
width: 10em;
|
||||
}
|
||||
|
||||
.amo-label-small {
|
||||
width: 8em;
|
||||
}
|
||||
|
||||
.amo-label-xsmall {
|
||||
width: 6em;
|
||||
}
|
||||
|
||||
.amo-form-error {
|
||||
background-color: #eee;
|
||||
border: 1px dashed #c66;
|
||||
color: #c00;
|
||||
margin: 5px 0;
|
||||
padding: .5em;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:template match="/rss">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title><xsl:value-of select="channel/title"/></title>
|
||||
<meta name="keywords" content="mozilla update, mozilla extensions, mozilla plugins, thunderbird themes, thunderbird extensions, firefox extensions, firefox themes" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/print.css" media="print" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/base/content.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/cavendish/content.css" title="Cavendish" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/base/template.css" media="screen" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/cavendish/template.css" title="Cavendish" media="screen" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/forms.css" media="screen" />
|
||||
<link rel="home" title="Home" href="https://addons.mozilla.org/" />
|
||||
<link rel="alternate" type="application/rss+xml" href="{self}" title="{title}" />
|
||||
<link rel="shortcut icon" href="{channel/image/url}" />
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="container">
|
||||
<p class="skipLink"><a href="#firefox-feature" accesskey="2">Skip to main content</a></p>
|
||||
<div id="mozilla-com"><a href="http://www.mozilla.com/">Visit Mozilla.com</a></div>
|
||||
<div id="header">
|
||||
<div id="key-title">
|
||||
<h1>
|
||||
<a href="/firefox/" title="Return to home page" accesskey="1">
|
||||
<img src="/images/title-firefox.gif" width="276" height="54" alt="Firefox Add-ons Beta" />
|
||||
</a>
|
||||
</h1>
|
||||
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
addUsernameToHeader();
|
||||
//]]>
|
||||
</script>
|
||||
|
||||
<form id="search" method="get" action="/search.php" title="Search Mozilla Update">
|
||||
<div>
|
||||
<label for="q" title="Search Mozilla Update">search:</label>
|
||||
<input type="text" id="q" name="q" accesskey="s" size="10" />
|
||||
<input type="hidden" name="app" value="firefox" />
|
||||
<input type="submit" id="submit" value="Go" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="key-menu">
|
||||
<ul id="menu-firefox">
|
||||
<li><a href="/firefox/">Home</a></li>
|
||||
<li><a href="/firefox/extensions/">Extensions</a></li>
|
||||
<li><a href="/firefox/plugins/">Plugins</a></li>
|
||||
<li><a href="/firefox/search-engines/">Search Engines</a></li>
|
||||
<li><a href="/firefox/themes/">Themes</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end key-menu -->
|
||||
</div>
|
||||
<!-- end header -->
|
||||
<hr class="hide" />
|
||||
<div id="mBody">
|
||||
<h1><xsl:value-of select="channel/title"/></h1>
|
||||
<p>
|
||||
This is an RSS feed designed to be read by an RSS reader. Which you aren't.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>What's an RSS Feed?</strong><br />
|
||||
<acronym title="Really Simple Syndication">RSS</acronym> feeds
|
||||
allow you to take the latest content from our site and view it in other places
|
||||
such as a feed reader, your browser or your website. Feeds make it easy and
|
||||
convenient to stay on top of the latest from Mozilla Add-ons.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>How do I use this feed?</strong><br/>
|
||||
To add this feed as a live bookmark in Firefox, simply click on the orange icon
|
||||
(<img src="/images/rss.png" alt="RSS" />) in the address bar. Otherwise, take the
|
||||
URL of this feed and add it to your favorite RSS reader.
|
||||
</p>
|
||||
|
||||
<p>Preview of this feed:</p>
|
||||
<ul>
|
||||
<xsl:for-each select="channel/item">
|
||||
<li>
|
||||
<strong><a href="{link}"><xsl:value-of select="title"/></a></strong>
|
||||
</li>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<hr class="hide" />
|
||||
|
||||
<div id="footer">
|
||||
|
||||
<p><a href="/firefox/" class="switch-fx">Firefox Add-ons </a><a href="/thunderbird/" class="switch-tb">Thunderbird Add-ons </a><a href="/mozilla/" class="switch-suite">Mozilla Suite Add-ons </a></p>
|
||||
<p><a href="/faq.php">FAQ</a> <a href="/feeds.php">Feeds/RSS</a> <a href="/login.php">Log In</a> <a href="/logout.php">Logout</a> <a href="/createaccount.php">Register</a></p>
|
||||
<p><a href="http://www.mozilla.org/privacy-policy.html">Privacy Policy</a> <a href="http://www.mozilla.org/foundation/donate.html">Donate to Mozilla</a> <a href="http://mozilla.org/">The Mozilla Organization</a></p>
|
||||
|
||||
<p><span>Copyright © 2004-2006</span> <a href="http://www.xramp.com/">256-bit SSL Encryption provided by XRamp</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- close container -->
|
||||
|
||||
<div class="disclaimer">
|
||||
Mozilla is providing links to these applications as a courtesy, and makes no representations
|
||||
regarding the applications or any information related thereto. Any questions, complaints or
|
||||
claims regarding the applications must be directed to the appropriate software vendor. See
|
||||
our <a href="/support.php">Support Page</a> for support information and contacts.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
@@ -1,56 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Home page for extensions, switchable on application. Since v1 used GUIDs, the
|
||||
* flow on this page is a little confusing (we need to support both name and GUID.
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*/
|
||||
|
||||
$currentTab = 'extensions';
|
||||
|
||||
startProcessing('extensions.tpl', 'extensions', $compileId);
|
||||
require_once('includes.php');
|
||||
|
||||
$_app = array_key_exists('app', $_GET) ? $_GET['app'] : null;
|
||||
|
||||
// Determine our application.
|
||||
switch( $_app ) {
|
||||
case 'mozilla':
|
||||
$clean['app'] = 'Mozilla';
|
||||
break;
|
||||
case 'thunderbird':
|
||||
$clean['app'] = 'Thunderbird';
|
||||
break;
|
||||
case 'firefox':
|
||||
default:
|
||||
$clean['app'] = 'Firefox';
|
||||
break;
|
||||
}
|
||||
|
||||
$amo = new AMO_Object();
|
||||
|
||||
// Despite what $clean holds, GUIDs were used in v1 so we have to support them
|
||||
if (preg_match('/^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)$/i',$_app)) {
|
||||
$newestExtensions = $amo->getNewestAddonsByGuid($_app,'E',10);
|
||||
$popularExtensions = $amo->getPopularAddonsByGuid($_app,'E',10);
|
||||
/* This is a bit of a cheesy hack because of the way the templates are written.
|
||||
* It's looking for the name of the app in $_GET, so here we are...*/
|
||||
$_GET['app'] = strtolower($amo->getAppNameFromGuid($_app));
|
||||
} else {
|
||||
$newestExtensions = $amo->getNewestAddons($clean['app'],'E',10);
|
||||
$popularExtensions = $amo->getPopularAddons($clean['app'],'E',10);
|
||||
}
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'newestExtensions' => $newestExtensions,
|
||||
'popularExtensions' => $popularExtensions,
|
||||
'title' => 'Add-ons',
|
||||
'currentTab' => $currentTab,
|
||||
'content' => 'extensions.tpl',
|
||||
'sidebar' => 'inc/category-sidebar.tpl',
|
||||
'cats' => $amo->getCats('E'),
|
||||
'type' => 'E')
|
||||
);
|
||||
?>
|
||||
@@ -1,73 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* FAQ page.
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*
|
||||
* @todo FAQ search?
|
||||
*/
|
||||
|
||||
startProcessing('faq.tpl','faq',$compileId);
|
||||
require_once('includes.php');
|
||||
|
||||
$db->query("
|
||||
SELECT
|
||||
`title`,
|
||||
`text`
|
||||
FROM
|
||||
`faq`
|
||||
WHERE
|
||||
`active` = 'YES'
|
||||
ORDER BY
|
||||
`index` ASC,
|
||||
`title` ASC
|
||||
",SQL_ALL, SQL_ASSOC);
|
||||
|
||||
$faq = $db->record;
|
||||
|
||||
$sql = "
|
||||
SELECT
|
||||
`AppName`,
|
||||
`GUID`,
|
||||
`Version`
|
||||
FROM
|
||||
`applications`
|
||||
WHERE
|
||||
`public_ver`='YES'
|
||||
ORDER BY
|
||||
Appname, Version
|
||||
";
|
||||
|
||||
$db->query($sql,SQL_ALL,SQL_ASSOC);
|
||||
|
||||
if (is_array($db->record)) {
|
||||
foreach ($db->record as $row) {
|
||||
$appVersions[] = array(
|
||||
'displayVersion' => $row['Version'],
|
||||
'appName' => $row['AppName'],
|
||||
'guid' => $row['GUID']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$links = array(
|
||||
array( 'href' => './faq.php',
|
||||
'title' => 'Frequently Asked Questions',
|
||||
'text' => 'FAQ'),
|
||||
|
||||
array( 'href' => './policy.php',
|
||||
'title' => 'Addons Policies',
|
||||
'text' => 'Policy')
|
||||
);
|
||||
|
||||
// Send FAQ data to Smarty object.
|
||||
$tpl->assign(
|
||||
array( 'faq' => $faq,
|
||||
'links' => $links,
|
||||
'sidebar' => 'inc/nav.tpl',
|
||||
'content' => 'faq.tpl',
|
||||
'title' => 'Frequently Asked Questions',
|
||||
'appVersions' => $appVersions )
|
||||
);
|
||||
?>
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Home page for extensions, switchable on application.
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*/
|
||||
|
||||
startProcessing('feeds.tpl', null, $compileId,'nonav');
|
||||
require_once('includes.php');
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'title' => 'Feeds',
|
||||
'content' => 'feeds.tpl')
|
||||
);
|
||||
?>
|
||||
@@ -1,175 +0,0 @@
|
||||
<?php
|
||||
// ***** BEGIN LICENSE BLOCK *****
|
||||
// Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
//
|
||||
// The contents of this file are subject to the Mozilla Public License Version
|
||||
// 1.1 (the "License"); you may not use this file except in compliance with
|
||||
// the License. You may obtain a copy of the License at
|
||||
// http://www.mozilla.org/MPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS IS" basis,
|
||||
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
// for the specific language governing rights and limitations under the
|
||||
// License.
|
||||
//
|
||||
// The Original Code is Mozilla Update.
|
||||
//
|
||||
// The Initial Developer of the Original Code is
|
||||
// Chris "Wolf" Crews.
|
||||
// Portions created by the Initial Developer are Copyright (C) 2004
|
||||
// the Initial Developer. All Rights Reserved.
|
||||
//
|
||||
// Contributor(s):
|
||||
// Chris "Wolf" Crews <psychoticwolf@carolina.rr.com>
|
||||
//
|
||||
// Alternatively, the contents of this file may be used under the terms of
|
||||
// either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
// in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
// of those above. If you wish to allow use of your version of this file only
|
||||
// under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
// use your version of this file under the terms of the MPL, indicate your
|
||||
// decision by deleting the provisions above and replace them with the notice
|
||||
// and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
// the provisions above, a recipient may use your version of this file under
|
||||
// the terms of any one of the MPL, the GPL or the LGPL.
|
||||
//
|
||||
// ***** END LICENSE BLOCK *****
|
||||
|
||||
startProcessing('finalists.tpl',null,$compileId,'nonav');
|
||||
require_once('includes.php');
|
||||
|
||||
/**
|
||||
* Setting up variables.
|
||||
*/
|
||||
$guids = array(
|
||||
'{34274bf4-1d97-a289-e984-17e546307e4f}',
|
||||
'{097d3191-e6fa-4728-9826-b533d755359d}',
|
||||
'{B9DAB69C-460E-4085-AE6C-F95B0D858581}',
|
||||
'{DDC359D1-844A-42a7-9AA1-88A850A938A8}',
|
||||
'{89506680-e3f4-484c-a2c0-ed711d481eda}',
|
||||
'{3CE993BF-A3D9-4fd2-B3B6-768CBBC337F8}',
|
||||
'{268ad77e-cff8-42d7-b479-da60a7b93305}',
|
||||
'{77b819fa-95ad-4f2c-ac7c-486b356188a9}',
|
||||
'{bbc21d30-1cff-11da-8cd6-0800200c9a66}',
|
||||
'{37E4D8EA-8BDA-4831-8EA1-89053939A250}',
|
||||
'{a089fffd-e0cb-431b-8d3a-ebb8afb26dcf}',
|
||||
'Reveal@sourmilk.net',
|
||||
'{a6ca9b3b-5e52-4f47-85d8-cca35bb57596}',
|
||||
'{53A03D43-5363-4669-8190-99061B2DEBA5}',
|
||||
'separe@m4ng0.lilik.it',
|
||||
'xpose@viamatic.com',
|
||||
'{c45c406e-ab73-11d8-be73-000a95be3b12}',
|
||||
'{D5EDC062-A372-4936-B782-BD611DD18D86}'
|
||||
);
|
||||
|
||||
$guids_tmp = array();
|
||||
foreach ($guids as $guid) {
|
||||
$guids_tmp[] = "'".$guid."'";
|
||||
}
|
||||
$guids_imploded = implode(',',$guids_tmp);
|
||||
|
||||
$descriptions = array(
|
||||
'{34274bf4-1d97-a289-e984-17e546307e4f}'=>"Block ads including Flash ads from their source. Right click on an ad and select Adblock to block ads. Hit the status-element and see what has or hasn't been blocked.",
|
||||
'{097d3191-e6fa-4728-9826-b533d755359d}'=>"Manage Extensions, Themes, Downloads, and more including Web content via Firefox’s sidebar.",
|
||||
'{B9DAB69C-460E-4085-AE6C-F95B0D858581}'=>"Blog directly within Firefox to LiveJournal, WordPress or Blogger. Select Deepest Sender from the ‘Tools’ menu.",
|
||||
'{DDC359D1-844A-42a7-9AA1-88A850A938A8}'=>"DownThemAll lets you filter and download all the links contained in any web-page, and lets you pause and resume downloads from previous Firefox sessions.",
|
||||
'{89506680-e3f4-484c-a2c0-ed711d481eda}'=>"View open Tabs and Windows with Showcase. You can use it in two ways: global mode (F12) or local mode (Shift + F12). In global mode, a new window will be opened with thumbnails of the pages you've opened in all windows. In local mode, only content in tabs of your current window will be shown.
|
||||
|
||||
You can also right click in those thumbnails to perform the most usual operations on them. Mouse middle button can be used to zoom a thumbnail, although other actions can be assigned to it.",
|
||||
'{3CE993BF-A3D9-4fd2-B3B6-768CBBC337F8}'=>"Get international weather forecasts and display it in any toolbar or status bar.",
|
||||
'{268ad77e-cff8-42d7-b479-da60a7b93305}'=>"Select from several of your favorite toolbars including including Google, Yahoo, Ask Jeeves, Teoma, Amazon, Download.com and others with one toolbar. The entire toolbar reconfigures when you select a different engine and it includes many advanced features found in each engine.
|
||||
You can also easily repeat your search on all engines included in toolbar.",
|
||||
'{77b819fa-95ad-4f2c-ac7c-486b356188a9}'=>"View pages with in Internet Explorer with IE Tab. Select the Firefox icon on the bottom right of the browser to switch to using the Internet Explorer engine or Firefox to switch to IE.",
|
||||
'{bbc21d30-1cff-11da-8cd6-0800200c9a66}'=>"Allows sticky notes to be added to any web page, and viewed upon visiting the Web page again. You can also share sticky notes. Requires account.",
|
||||
'{37E4D8EA-8BDA-4831-8EA1-89053939A250}'=>"PDF Download Extension allows you to choose if you want to view a PDF file inside the browser (as PDF or HTML), if you want to view it outside Firefox with your default or custom PDF reader, or if you want to download it.",
|
||||
'{a089fffd-e0cb-431b-8d3a-ebb8afb26dcf}'=>"Platypus is a Firefox extension which lets you modify a Web page from your browser -- \"What You See Is What You Get\" -- and then save those changes as a GreaseMonkey script so that they'll be repeated the next time you visit the page.",
|
||||
'Reveal@sourmilk.net'=>"Reveal allows you to see thumbnails of pages in your history by mousing over the back and forward buttons. With many tabs open, quickly find the page you want, by pressing F2. Reveal also has a rectangular magnifying glass you can use to zoom in on areas of any web page. Comes with a quick tour of all the features. ",
|
||||
'{a6ca9b3b-5e52-4f47-85d8-cca35bb57596}'=>"A lightweight RSS and Atom feed aggregator. Alt+S to open Sage in the Sidebar to start reading feed content.",
|
||||
'{53A03D43-5363-4669-8190-99061B2DEBA5}'=>"Highlight text, create sticky notes, and more to Web pages and Web sites that are saved to your desktop. Scrapbook Includes full text search and quick filtering of saved pages.",
|
||||
'separe@m4ng0.lilik.it'=>"Manage tabs by creating a tab separator. Right click on a Tab to add a new Tab separator. Click on the Tab separator to view thumbnail images of web sites that are to the left and right of the Tab separator.",
|
||||
'xpose@viamatic.com'=>"Click on the icon in the status bar to view all Web pages in Tabbed windows as thumbnail images. Press F8 to activate foXpose.",
|
||||
'{c45c406e-ab73-11d8-be73-000a95be3b12}'=>"Web developer toolbar includes various development tools such as window resizing, form and image debugging, links to page validation and optimization tools and much more.",
|
||||
'{D5EDC062-A372-4936-B782-BD611DD18D86}'=>"RSS news reader with integrated with services such as Feedster and weather information. Includes online help documentation."
|
||||
);
|
||||
|
||||
$screenshots = array(
|
||||
'{34274bf4-1d97-a289-e984-17e546307e4f}'=>'adblock-mini.png',
|
||||
'{097d3191-e6fa-4728-9826-b533d755359d}'=>'all-in-one-mini.png',
|
||||
'{B9DAB69C-460E-4085-AE6C-F95B0D858581}'=>'deepest-sender-mini.png',
|
||||
'{DDC359D1-844A-42a7-9AA1-88A850A938A8}'=>'downthemall-small.png',
|
||||
'{89506680-e3f4-484c-a2c0-ed711d481eda}'=>'firefox-showcase.png',
|
||||
'{3CE993BF-A3D9-4fd2-B3B6-768CBBC337F8}'=>'forecastfoxenhanced-small.png',
|
||||
'{268ad77e-cff8-42d7-b479-da60a7b93305}'=>'groowe-small.png',
|
||||
'{77b819fa-95ad-4f2c-ac7c-486b356188a9}'=>'IE-Tab.png',
|
||||
'{bbc21d30-1cff-11da-8cd6-0800200c9a66}'=>'stickies-small.png',
|
||||
'{37E4D8EA-8BDA-4831-8EA1-89053939A250}'=>'pdf-download.png',
|
||||
'{a089fffd-e0cb-431b-8d3a-ebb8afb26dcf}'=>'platypus.png',
|
||||
'Reveal@sourmilk.net'=>'reveal.png',
|
||||
'{a6ca9b3b-5e52-4f47-85d8-cca35bb57596}'=>'sage.png',
|
||||
'{53A03D43-5363-4669-8190-99061B2DEBA5}'=>'scrapbook-final.png',
|
||||
'separe@m4ng0.lilik.it'=>'separe.png',
|
||||
'xpose@viamatic.com'=>'xpose-small.png',
|
||||
'{c45c406e-ab73-11d8-be73-000a95be3b12}'=>'web-developer-toolbar-small.png',
|
||||
'{D5EDC062-A372-4936-B782-BD611DD18D86}'=>'wizz-small.png'
|
||||
);
|
||||
|
||||
$authors = array(
|
||||
'{34274bf4-1d97-a289-e984-17e546307e4f}'=>'Ben Karel (and the Adblock Crew)',
|
||||
'{DDC359D1-844A-42a7-9AA1-88A850A938A8}'=>'Federico Parodi',
|
||||
'{a6ca9b3b-5e52-4f47-85d8-cca35bb57596}'=>'Peter Andrews (and the Sage Team)',
|
||||
'{53A03D43-5363-4669-8190-99061B2DEBA5}'=>'Taiga Gomibuchi',
|
||||
'separe@m4ng0.lilik.it'=>'Massimo Mangoni',
|
||||
'{77b819fa-95ad-4f2c-ac7c-486b356188a9}'=>'yuoo2k and Hong Jen Yee (PCMan)'
|
||||
);
|
||||
|
||||
$finalists = array();
|
||||
|
||||
// Get data for GUIDs.
|
||||
$finalists_sql = "
|
||||
SELECT
|
||||
m.guid,
|
||||
m.id,
|
||||
m.name,
|
||||
m.downloadcount,
|
||||
m.homepage,
|
||||
v.dateupdated,
|
||||
v.uri,
|
||||
v.size,
|
||||
v.version,
|
||||
(
|
||||
SELECT u.username
|
||||
FROM userprofiles u
|
||||
JOIN authorxref a ON u.userid = a.userid
|
||||
WHERE a.id = m.id
|
||||
ORDER BY u.userid DESC
|
||||
LIMIT 1
|
||||
) as username
|
||||
FROM
|
||||
main m
|
||||
JOIN version v ON m.id = v.id
|
||||
WHERE
|
||||
v.vid = (SELECT max(vid) FROM version WHERE id=m.id AND approved='YES') AND
|
||||
type = 'E' AND
|
||||
m.guid IN({$guids_imploded})
|
||||
ORDER BY
|
||||
LTRIM(m.name)
|
||||
";
|
||||
|
||||
$db->query($finalists_sql, SQL_ALL, SQL_ASSOC);
|
||||
|
||||
foreach ($db->record as $var => $val) {
|
||||
$val['author'] = !empty($authors[$val['guid']]) ? $authors[$val['guid']] : $val['username'];
|
||||
$finalists[] = $val;
|
||||
}
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array(
|
||||
'title' => 'Extend Firefox Contest Finalists',
|
||||
'screenshots' => $screenshots,
|
||||
'descriptions' => $descriptions,
|
||||
'finalists' => $finalists,
|
||||
'content' => 'finalists.tpl')
|
||||
);
|
||||
?>
|
||||
@@ -1,30 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Addon history page. Displays all the previous releases for a particular
|
||||
* addon or theme
|
||||
*
|
||||
* @package amo
|
||||
* @subpackage docs
|
||||
*
|
||||
* @todo break this into a simpler design, probably a smaller table with an abbreviated desc.
|
||||
* @todo do we still want to allow users access to old versions?
|
||||
*/
|
||||
|
||||
// Get our addon ID.
|
||||
$clean['ID'] = intval($_GET['id']);
|
||||
$sql['ID'] =& $clean['ID'];
|
||||
|
||||
startProcessing('history.tpl',$clean['ID'],$compileId);
|
||||
require_once('includes.php');
|
||||
|
||||
$addon = new AddOn($sql['ID']);
|
||||
$addon->getHistory();
|
||||
|
||||
// Assign template variables.
|
||||
$tpl->assign(
|
||||
array( 'addon' => $addon,
|
||||
'title' => $addon->Name.' Version History',
|
||||
'content' => 'history.tpl',
|
||||
'sidebar' => 'inc/addon-sidebar.tpl')
|
||||
);
|
||||
?>
|
||||
|
Before Width: | Height: | Size: 181 B |
|
Before Width: | Height: | Size: 526 B |
|
Before Width: | Height: | Size: 776 B |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 757 B |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 349 B |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 394 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 495 B |
|
Before Width: | Height: | Size: 103 B |
|
Before Width: | Height: | Size: 161 B |
|
Before Width: | Height: | Size: 86 B |
|
Before Width: | Height: | Size: 160 B |
|
Before Width: | Height: | Size: 386 B |
|
Before Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 384 B |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 94 B |
|
Before Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 384 B |
|
Before Width: | Height: | Size: 103 B |
|
Before Width: | Height: | Size: 107 B |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |