├── README.md ├── btcrpc.pm ├── config.pm.example ├── public_html ├── 2257.html ├── bitcoin.png ├── blank.gif ├── btc.cgi ├── cake.jpg ├── close_sm.png ├── contact.cgi ├── dmca.html ├── flowplayer.min.js ├── flowplayer.swf ├── headerbg2.png ├── images │ ├── .ui-icons_ffffff_256x240.png.F6IzJW │ ├── __all_the_ui_files_are_for_jquery_ui │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png │ ├── ui-bg_diagonals-thick_20_666666_40x40.png │ ├── ui-bg_flat_10_000000_40x100.png │ ├── ui-bg_glass_100_f6f6f6_1x400.png │ ├── ui-bg_glass_100_fdf5ce_1x400.png │ ├── ui-bg_glass_65_ffffff_1x400.png │ ├── ui-bg_gloss-wave_35_f6a828_500x100.png │ ├── ui-bg_highlight-soft_100_eeeeee_1x100.png │ ├── ui-bg_highlight-soft_75_ffe45c_1x100.png │ ├── ui-icons_222222_256x240.png │ ├── ui-icons_228ef1_256x240.png │ ├── ui-icons_ef8c08_256x240.png │ ├── ui-icons_ffd27a_256x240.png │ └── ui-icons_ffffff_256x240.png ├── index.cgi ├── index.html ├── jquery-ui.css ├── jquery-ui.html ├── jquery-ui.js ├── jquery-ui.min.css ├── jquery-ui.min.js ├── jquery-ui.structure.css ├── jquery-ui.structure.min.css ├── jquery-ui.theme.css ├── jquery-ui.theme.min.css ├── jquery.timer.js ├── jsplayer2.png ├── main.css ├── main.css.bak ├── payment.cgi ├── play.png ├── predict.cgi ├── rate.cgi ├── register.cgi ├── register.gif ├── rta.gif ├── skin │ ├── all-skins.css │ ├── functional.css │ ├── img │ │ ├── black.png │ │ ├── black@x2.png │ │ ├── black_rtl.png │ │ ├── black_rtl@x2.png │ │ ├── flowplayer.png │ │ ├── flowplayer@2x.png │ │ ├── play_black.png │ │ ├── play_black@x2.png │ │ ├── play_black_rtl.png │ │ ├── play_black_rtl@x2.png │ │ ├── play_white.png │ │ ├── play_white@x2.png │ │ ├── play_white_rtl.png │ │ ├── play_white_rtl@x2.png │ │ ├── playful_black.png │ │ ├── playful_black@x2.png │ │ ├── playful_black_rtl.png │ │ ├── playful_black_rtl@x2.png │ │ ├── playful_white.png │ │ ├── playful_white@x2.png │ │ ├── playful_white_rtl.png │ │ ├── playful_white_rtl@x2.png │ │ ├── white.png │ │ ├── white@x2.png │ │ ├── white_rtl.png │ │ └── white_rtl@x2.png │ ├── minimalist.css │ └── playful.css ├── spinner.gif ├── spinner.js ├── sprites-3.png ├── sprites-3.xcf ├── stream.cgi ├── submit.png ├── template.html ├── upload.cgi └── video.cgi ├── query.pm ├── template.pm ├── upload.pl └── words /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Porn Site in a Can 3 | 4 | Ready to deploy and configure adult video site. Or make a non-porn tube site out of it. 5 | 6 | No porn included -- this is only code (and certainly not good enough code to be considered code porn). 7 | 8 | Despite the name, these install instructions do require basic familiarity with editing code, 9 | MySQL, and Linux. 10 | 11 | ## Features 12 | 13 | * Automatic indexing, conversion, and thumbnailing of video files 14 | * Leech protection 15 | * Netflix style "users with similar taste also liked" recommendations 16 | * 100% ready to receive Bitcoin payments out of the box 17 | * Referal system with automatic, "instant" payouts 18 | * One-click account creation (really!) 19 | * Runs on cPanel powered shared hosts (except for referal payouts) 20 | 21 | ## Why? 22 | 23 | I like Bitcoin. The web has despretely needed a micropayment system that 24 | allows content creators and users an alternative to ads or credit card 25 | subscriptions, which pay poorly and are a poor value to both you and users. 26 | I think Bitcoin is going to revolutionize the Web. 27 | Starting with adult content sites seems logical. 28 | 29 | I want the consulting business. I will extend and customize this code for 30 | money (Bitcoin, of course). Why better to hire than the person who wrote it? 31 | Or I'll work on your own project. 32 | 33 | ## Todo 34 | 35 | * The upload script no longer works on shared hosts and needs to be reworked 36 | * Management interface 37 | * Better documentation/easier install 38 | * User upload of video feature 39 | * Twitter etc integration (post to Twitter when a new movie is uploaded) 40 | * Pull a real time price quote for BTC->USD 41 | * Make cookie length configurable 42 | * Add the Perl modules to the repo and distribute them with this 43 | * Downgrade gracefully if Math::Preference::SVD isn't available 44 | * Thumbnail size should be configuable 45 | * Better error messages in rare or not so rare case of fatal error 46 | 47 | ## Technical Details 48 | 49 | Currently requiers a VPS host, or a Mac or Linux client machine, to import videos. 50 | Implemented mostly in Perl for security and out-of-the-box support on shared 51 | hosts and VPS installs. 52 | MySQL database (commonly available on shared hosts). 53 | FlowPlayer (can easily be changed out). 54 | jQuery/jQuery-UI powered interface. 55 | Uses http://blockchain.info/api/receive to accept payments. 56 | Uses XML-RPC to interface with the Bitcoin Core standard Bitcoin server 57 | daemon for referal payouts. 58 | 59 | ## Shared Host Limitations 60 | 61 | Math::Preference::SVD won't work without great difficulty on a shared host. 62 | Rating logic would need to be adjusted to work without it. 63 | 64 | ## Installation 65 | 66 | These installation instructions have not been tested. 67 | 68 | The files in the root should not be shared on the Web. The files inside 69 | the `public_html` directory should be. 70 | 71 | The `.cgi` scripts assume that the private files are one directory up 72 | (`use lib '..';`). Change that line in each `.cgi` file if they are 73 | moved to somewhere else. 74 | 75 | If the `.cgi` scripts and `thumbs` directory are somewhere else, create 76 | a `public_html` symlink to them from the private directory (which contains `video` and the `.pm` files. 77 | For example: 78 | 79 | ln -s /path/to/pm/files/and/video/directory /path/to/web_root/public_html 80 | 81 | `upload.pl` currently needs this to find where to put the static thumbnails. 82 | 83 | Copy `config.pm.example` to `config.pm` and edit it for your domain 84 | name, directory locations, Bitcoin address for payments, MySQL 85 | connection information, and so on. 86 | 87 | Creating these files while running as the web user, or chown them to the web user: 88 | 89 | ``` 90 | touch debug.log 91 | touch predict.log 92 | mkdir video 93 | mkdir public_html/video 94 | ``` 95 | 96 | Configure MySQL, including creating a database (`create database `) 97 | and creating a user with a password to access it: 98 | http://dev.mysql.com/doc/refman/4.1/en/user-account-management.html, 99 | or use your host's control panel to configure MySQL. 100 | 101 | Create these tables in MySQL: 102 | 103 | ``` 104 | create table users ( 105 | id int auto_increment key, 106 | ip varchar(15), cookie varchar(200), bytes_purchased int, bytes_used int, time_created int, time_last_streamed int, debug varchar(1024), payment_status varchar(1024), referer varchar(36), 107 | index (ip), index(cookie) -- not 'unique' becaue multiple will be null 108 | ); 109 | 110 | create table movies ( 111 | id int auto_increment key, 112 | mp4 varchar(200), jpg varchar(200), views int, stars int, runtime varchar(10), md5 varchar(32), disabled varchar(100) 113 | ); 114 | 115 | create table ratings ( 116 | user_id int not null, movie_id int not null, rating int, 117 | index (user_id), index(movie_id), index(rating) 118 | ); 119 | 120 | create table predictions ( 121 | user_id int not null, movie_id int not null, rating int not null, 122 | index (user_id), index(movie_id), index(rating) 123 | ); 124 | 125 | create table purchases (user_id int, bytes_purchased int, btc float); 126 | ``` 127 | 128 | Perl modules: 129 | 130 | ``` 131 | LWP 132 | JSON 133 | DBD 134 | MD5 135 | DBI::mysql 136 | List::MoreUtils 137 | Math::Preference::SVD 138 | ``` 139 | 140 | Debian packages: 141 | 142 | ``` 143 | build-essential 144 | libmysqlclient-dev 145 | libmysqld-dev 146 | libssl-dev 147 | mysql-client 148 | mysql-server 149 | perl-doc 150 | netpbm 151 | ffmpeg 152 | libjpeg-progs 153 | pvrg-jpeg 154 | ``` 155 | 156 | ## Adding Movies 157 | 158 | Use `upload.pl` to import movies. 159 | ~~If you're using a shared host, try using `sshfs` to mount the remote machine as a directory on your local machine, and run `uplaod.pl` on your local machine (Mac or Linux).~~ Won't work with it trying to connect to the database. Needs to be extended. 160 | 161 | It requires `qtfaststart`: https://github.com/danielgtaylor/qtfaststart. 162 | 163 | It also requires ffmpeg, the Image::Info Perl module, the Movie::Info module, and ffmpegthumbnailer. 164 | 165 | ## Referal Commissions 166 | 167 | Make a partial copy of `config.pl` (with only the needed config values) and move that and `btcrpc.pm` to a private directory on the node running Bitcoin Core's `bitcoind`. 168 | This will be a VPS or dedicated server. 169 | Put `btc.cgi` in webroot and change the `use lib` line to reference whereever `config.pl` and `btcrpc.pm` are. 170 | Configure `config.pl` correctly for talking to `bitcoind` by setting the value for `$bitcoincorerpcpass` to whatever is in the 171 | `.bitcoin/bitcoin.conf` file in the home directory of the user running `bitcoind`. 172 | 173 | Change the `config.pm` on the shared host or machine hosting the site (could be the same machine but that's not recommended as it would add more exposure to the bitcoin wallet). 174 | 175 | Make sure that the value for `$hash2` in `config.pm` on the machine hosting the site matches the value specified in the `config.pm` on the Bitcoin Core fullnode. 176 | Also make sure that `$fullnodeip` on the web sever machine points to the fullnode. 177 | 178 | ## License 179 | 180 | GPL Free Software/Open Source: http://www.gnu.org/licenses/gpl-2.0.html 181 | 182 | BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 183 | 184 | Additionally, no warranty is made as to the security of any Bitcoin wallets used or accessible by this software. 185 | 186 | Contains jQuery, FlowPlayer, and other open source software. 187 | Please see their individual licenses referenced from the individual files. 188 | 189 | ## Contact 190 | 191 | Message me on Reddit: http://www.reddit.com/user/stolenboyvideos 192 | 193 | ## See Also 194 | 195 | * Announcement/Motivation/Discussion: http://www.reddit.com/r/Bitcoin/comments/2wr30a/nsfw_evil_gay_opposite_twin_of_the_been_accepting/ 196 | * Example: http://stolenboyvideos.com 197 | 198 | -------------------------------------------------------------------------------- /btcrpc.pm: -------------------------------------------------------------------------------- 1 | 2 | package btcrpc; 3 | 4 | use strict; 5 | use warnings; 6 | 7 | use lib '/home1/stolezzx/lib'; 8 | 9 | # TODO should take the txid of the payment to 16WTN for validation, and not allow the same txid to be used twice, and compute the pay-out from that record 10 | # TODO would it have made more sense to just do this one command instead? sendfrom "fromaccount" "tobitcoinaddress" amount ( minconf "comment" "comment-to" ) 11 | 12 | use JSON::RPC::Client; 13 | use Data::Dumper; 14 | use LWP; 15 | use LWP::UserAgent; 16 | use JSON::PP; 17 | 18 | use config; 19 | 20 | my $fee = 0.0001; 21 | my $address = $config::address; 22 | my $uri = 'http://127.0.0.1:8332/'; 23 | 24 | my $client = JSON::RPC::Client->new; 25 | 26 | sub warn { print "$_[0]
\n" } # XXX 27 | 28 | sub send { 29 | 30 | my $to = shift or die; 31 | my $amount = shift or die; 32 | 33 | $client->ua->credentials( 34 | "127.0.0.1:8332", 'jsonrpc', 'bitcoinrpc' => $config::bitcoincorerpcpass, 35 | ); 36 | 37 | my ($tx_hash, $tx_output_n, $output_value, $output_script) = listunspent($amount); 38 | 39 | my $raw_tx = createrawtransaction( $tx_hash, $tx_output_n, $output_value, $output_script, $to, $amount ); 40 | 41 | $raw_tx = signrawtransaction($raw_tx); 42 | 43 | my $txid = sendrawtransaction($raw_tx); 44 | 45 | warn "sent with TXID $txid"; 46 | 47 | return $txid; 48 | 49 | } 50 | 51 | # 52 | # 53 | # 54 | 55 | sub cmd { 56 | 57 | my $cmd = shift; 58 | 59 | #my $cmd = { 60 | # method => 'getinfo', 61 | # params => [], 62 | # }; 63 | 64 | my $res = $client->call( $uri, $cmd ); 65 | 66 | if ($res){ 67 | if ($res->is_error) { die "Error : ", $res->error_message; } 68 | else { 69 | print Dumper($res->result); # debug 70 | return $res->result; 71 | } 72 | } else { 73 | die $client->status_line; 74 | } 75 | } 76 | 77 | 78 | # https://bitcoin.org/en/developer-examples#simple-spending 79 | 80 | sub listunspent { 81 | # https://bitcoin.org/en/developer-reference#listunspent 82 | my $amount_to_spend = shift; 83 | my $cmd = { 84 | method => 'listunspent', 85 | params => [0], # no confirmations needed 86 | }; 87 | my $outputs = cmd($cmd); 88 | for my $output ( @$outputs ) { 89 | if( $output->{amount} >= $amount_to_spend ) { 90 | return ($output->{txid}, $output->{vout}, $output->{amount}, $output->{scriptPubKey}); 91 | } 92 | } 93 | die "no unspent output big enough or maybe at all"; 94 | 95 | } 96 | 97 | sub createrawtransaction { 98 | # https://bitcoin.org/en/developer-reference#createrawtransaction 99 | my ( $tx_hash, $tx_output_n, $output_value, $output_script, $to_address, $send_value) = @_; 100 | 101 | # values are floats. this is bad. 102 | 103 | my $change = $output_value - $send_value - $fee; 104 | warn "output value $output_value - send value $send_value - fee $fee"; 105 | $change = 0 if $change < 1e-10; # ffs, why are we using floats 106 | die "not enough money in that output" if $change < 0; 107 | 108 | my $cmd = { 109 | method => 'createrawtransaction', 110 | params => [ 111 | [ 112 | # inputs 113 | { 114 | txid => $tx_hash, 115 | vout => $tx_output_n, 116 | }, 117 | ], 118 | { 119 | # outputs 120 | $to_address => 0+$send_value, 121 | $address => 0+$change, 122 | }, 123 | ], 124 | }; 125 | 126 | if( $change == 0 ) { 127 | delete ${ $cmd->{params}->[1] }{$address}; # remove the change output if there is no change; unlikely that we'll exactly use an output but there it is 128 | } 129 | 130 | # warn "sending: " . Dumper $cmd; # huh. Dumper causes the string rep to be cached, and JSON picks up on this...? nope, coin values are still getting quoted 131 | warn "sending: " . encode_json($cmd); 132 | 133 | my $tx = cmd($cmd); 134 | 135 | warn Dumper $tx; # looks like: 136 | # $VAR1 = '0100000001b37251be9dfbb03de8acfcc02f10cf3feb758e7081c4847f71f0ca4a92235a490100000000ffffffff0170f30500000000001976a914e4cedd649068a5595c59cc0f847eafb179df284288ac00000000'; 137 | 138 | return $tx; 139 | 140 | } 141 | 142 | # signrawtransaction "hexstring" ( [{"txid":"id","vout":n,"scriptPubKey":"hex","redeemScript":"hex"},...] ["privatekey1",...] sighashtype ) 143 | # Sign inputs for raw transaction (serialized, hex-encoded). 144 | # The second optional argument (may be null) is an array of previous transaction outputs that 145 | # this transaction depends on but may not yet be in the block chain. 146 | # The third optional argument (may be null) is an array of base58-encoded private 147 | # keys that, if given, will be the only keys used to sign the transaction. 148 | 149 | sub signrawtransaction { 150 | my $tx = shift; 151 | 152 | my $cmd = { 153 | method => 'signrawtransaction', 154 | params => [ $tx, ], 155 | }; 156 | 157 | warn "sending: " . encode_json($cmd); 158 | 159 | my $signed_tx = cmd($cmd); 160 | 161 | warn "signed tx: " . Dumper $signed_tx; # what does this look like? 162 | die unless $signed_tx->{complete}; 163 | return $signed_tx->{hex}; 164 | } 165 | 166 | # sendrawtransaction "hexstring" ( allowhighfees ) 167 | # Submits raw transaction (serialized, hex-encoded) to local node and network. 168 | # Also see createrawtransaction and signrawtransaction calls. 169 | # Arguments: 170 | # 1. "hexstring" (string, required) The hex string of the raw transaction) 171 | # 2. allowhighfees (boolean, optional, default=false) Allow high fees 172 | # Result: 173 | # "hex" (string) The transaction hash in hex 174 | 175 | sub sendrawtransaction { 176 | my $tx = shift; 177 | 178 | my $cmd = { 179 | method => 'sendrawtransaction', 180 | params => [ $tx, ], 181 | }; 182 | 183 | warn "sending: " . encode_json($cmd); 184 | 185 | my $txid = cmd($cmd); 186 | 187 | warn Dumper $txid; # what does this look like? 188 | # $VAR1 = '36c397b1e3137c57c6fe0e314d337d0642893866428451244929d51d1d9e9172'; 189 | 190 | return $txid; 191 | } 192 | 193 | -------------------------------------------------------------------------------- /config.pm.example: -------------------------------------------------------------------------------- 1 | 2 | # modify the values in this file for your site 3 | # the values here are examples and must all be changed 4 | 5 | package config; 6 | 7 | use strict; 8 | 9 | our $url = 'http://stolenboyvideos.com'; 10 | 11 | our $sitepass = 'cdeF7XOIj6xhNlcbAz'; 12 | 13 | our $home = '/var/www'; # where ever the .pm files and .log files are kept that should not be visible to the public 14 | 15 | our $address = '16WTNrktpQqTmxoqQMDccwp5RSmbhM2zub'; # blockchain.info will be asked to forward payments it processes to this address; change this to your address 16 | 17 | # IP address of the Bitcoin Core server running btc.cgi and btcrpc.pm 18 | # those scripts and the Bitcoin Core installation handle paying out referals 19 | # maybe be 127.0.0.1 if the same host has the hot wallet 20 | # the value for "hash2" in the config there must match here if it is a different post 21 | # should be the domain name of the site if it is the same site (eg 'stolenboyvideos.com') 22 | 23 | our $fullnodeip = '127.0.0.1'; 24 | 25 | our $dbname = 'stolenboyvideos'; # mysql login info for this site 26 | our $dbuser = 'stolenboyvideos'; 27 | our $dbpass = 'sTXKUzU3vEJMAykV'; 28 | 29 | our $hash1 = '--0yUd91d0J4i9H8l7'; # secret value used to authenticate notifications of payment from blockchain.info back to here 30 | our $hash2 = '--f21c8WO9bz81eC2l'; # secret value used to authenticate referal payout requests to the server at $fullnodeip 31 | 32 | # $bitcoincorerpcpass is only only required on the server at $fullnodeip 33 | # that config file may be in a different copy of the config than the one on the primary host if logic (main site vs hot wallet) 34 | # are spread across two hosts 35 | # note that it is necessary to conceal both $hash2 and this password to protect the hot wallet 36 | 37 | our $bitcoincorerpcpass = 'dg1U4MdkcY1Q4vTVUjgh1mMGJWXPFKmuhDrXg1p9vTur'; 38 | 39 | 1; 40 | -------------------------------------------------------------------------------- /public_html/2257.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 2257 Disclosure Statement of ZeusClicks, Ltd. 6 | 7 | 17 | 18 | 19 |
20 |

2257 Disclosure Statement of ZeusClicks, Ltd.

21 | 22 |

Compliant Content: All models, actors, actresses and other persons that appear in any visual portrayal of actual or simulated sexually explicit conduct depicted on this Website are required to be over the age of eighteen (18) years at the time the visual image was produced. Records mandated for all depictions of actual or simulated sexually explicit conduct by Title 18 U.S.C. &§&§2257 & 2257A and 28 C.F.R. &§75, et seq., are on file with the appropriate Records Custodian and will be made available to authorized inspectors by the Records Custodian at the following address:

23 | 24 |

Level 2, Regional Business Centre
University Heights
Msida MSD 1751
Malta

25 | 26 |

Exempt Content: All other visual depictions displayed on this Website are exempt from the provision of 18 U.S.C. &§&§2257, 2257A and/or 28 C.F.R. &§75, because: 1) they do not portray conduct as specifically listed in 18 U.S.C &§2256 (2)(A) (i) through (iv); 2) they do not portray conduct as specifically listed in 18 U.S.C. &§2257A produced after March 19, 2009; 3) they do not portray conduct listed in 18 U.S.C. &§2256(2)(A)(v) produced after March 19, 2009; 4) the visual depictions were created prior to July 3, 1995; or, 5) the website operator does not act as a “producer” with respect to the dissemination of such exempt images as that term is defined in 28 C.F.R. &§75.1(c).

27 | 28 |

The title of this work is: stolenboyvideos.com

29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /public_html/bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/bitcoin.png -------------------------------------------------------------------------------- /public_html/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/blank.gif -------------------------------------------------------------------------------- /public_html/btc.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use CGI; 4 | use CGI::Carp 'fatalsToBrowser'; 5 | 6 | use MD5; 7 | 8 | use lib '..'; 9 | 10 | use btcrpc; 11 | use config; 12 | 13 | print "Content-type: text/plain\r\n\r\n"; 14 | 15 | sub hash2 { hash( $_[0], $config::hash2); } 16 | 17 | sub hash { 18 | my $user_id = shift; 19 | my $secret = shift; 20 | my $md5 = MD5->new; 21 | $md5->reset(); 22 | $md5->add( $user_id . $secret); 23 | return $md5->hexdigest(); 24 | } 25 | 26 | my $address = CGI::param('address'); 27 | my $amount = CGI::param('amount'); 28 | my $hash = CGI::param('hash'); 29 | 30 | $address =~ m/^[a-zA-Z0-9]+$/ or die "address should be a bitcoin address"; 31 | length($address) <= 35 or die "address should be a bitcoin address"; 32 | 33 | $amount =~ m/^[0-9]+\.[0-9]+$/ or die "amount should be a float"; 34 | 35 | die unless $hash eq hash2("$address-$amount"); 36 | 37 | my $tx = btcrpc::send( $address, 0 + $amount, ); 38 | 39 | print "$tx\n"; 40 | -------------------------------------------------------------------------------- /public_html/cake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/cake.jpg -------------------------------------------------------------------------------- /public_html/close_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/close_sm.png -------------------------------------------------------------------------------- /public_html/contact.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use CGI; 7 | use CGI::Carp 'fatalsToBrowser'; 8 | 9 | use lib '..'; 10 | use config; 11 | use template; 12 | use query; 13 | 14 | print "Content-type: text/html\r\n\r\n"; 15 | 16 | my $user = user(); 17 | 18 | my $comment_text = CGI::param('comment'); 19 | 20 | my $content; 21 | 22 | if( $comment_text ) { 23 | query( "insert into comments (user_id, timestamp, comment) values (?, ?, ?)", $user->id, scalar time, $comment_text, ); 24 | 25 | $content = '

Comment recorded. Thank you for taking time to write.

'; 26 | 27 | } else { 28 | 29 | $content = <<'EOF'; 30 | 31 |

32 | 33 | Problem reports, copyright violation notifications (with required details), and feedback are welcome, but we are not able to respond to all comments individually.

34 | 35 |
36 | 38 |

39 | 40 |
41 | 42 | EOF 43 | 44 | } 45 | 46 | my $movies = movies(); 47 | 48 | print template( undef, { 49 | content => $content, 50 | num_videos => $movies->num_rows, 51 | logged_in => ($user->cookie ? 1 : 0), 52 | } ); 53 | 54 | 55 | -------------------------------------------------------------------------------- /public_html/dmca.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | DMCA Notice & Takedown Policy and Procedures 6 | 7 | 25 | 26 | 27 |
28 |

DMCA Notice & Takedown Policy and Procedures

29 | 30 |

Although our website (“Site”) is not based in the United States, we respect the intellectual property rights of copyright holders, and thus have chosen to voluntarily comply with the Notice and Takedown provisions of the Digital Millennium Copyright Act (“DMCA”). This Site qualifies as a “Service Provider” within the meaning of 17 U.S.C. § 512(k)(1) of the DMCA. Accordingly, it is entitled to certain protections from claims of copyright infringement under the DMCA, commonly referred to as the “safe harbor” provisions. We respect the intellectual property of others, and we ask our users to do the same. Thus, we observe and comply with the DMCA, and have adopted the following Notice and Takedown Policy relating to claims of copyright infringement by our customers, subscribers or users.

31 | 32 |

Notice of Claimed Infringement

33 | 34 |

If you believe that your work has been copied in a way that constitutes copyright infringement, please provide Our Designated Copyright Agent (identified below) with the following information:

35 | 36 |

(a) an electronic or physical signature of the person authorized to act on behalf of the owner of the copyright or other intellectual property interest;

37 | 38 |

(b) description of the copyrighted work or other intellectual property that you claim has been infringed;

39 | 40 |

(c) a description of where the material that you claim is infringing is located on the Site (preferably including specific url’s associated with the material);

41 | 42 |

(d) your address, telephone number, and email address;

43 | 44 |

(e) a statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law; and,

45 | 46 |

(f) a statement by you, made under penalty of perjury, that the above information in your Notice is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner’s behalf.

47 | 48 |

You may send your Notice of Claimed Infringement to:

49 | 50 |

Lawrence G. Walters, Esq.
51 | Walters Law Group
52 | 195 W. Pine Ave.
53 | Longwood, FL 32750-4104
54 | Fax: (407) 774-6151
55 | Email: Notice [at] DMCANotice [dot] com

56 | 57 |

Please do not send other inquires or information to our Designated Agent. Absent prior express permission, our Designated Agent is not authorized to accept or waive service of formal legal process, and any agency relationship beyond that required to accept valid DMCA Notices is expressly disclaimed.

58 | 59 |

Further information regarding notification and takedown requirements can be found in the DMCA, here: http://www.law.cornell.edu/uscode/text/17/512

60 | 61 |

Abuse Notification: Abusing the DMCA Notice procedures set forth above, or misrepresenting facts in a DMCA Notice or Counter-notification, can result in legal liability for damages, court costs and attorneys fees under federal law. See; 17 U.S.C. § 512(f). These Notice and Takedown Procedures only apply to claims of copyright infringement by copyright holders and their agents – not to any other kind of abuse, infringement or legal claim. We will investigate and take action against anyone abusing the DMCA notification or counter-notification procedure. Please ensure that you meet all of the legal qualifications before submitting a DMCA Notice to our Designated Agent.

62 | 63 |

Take Down Procedure

64 | 65 |

The Site implements the following “notification and takedown” procedure upon receipt of any notification of claimed copyright infringement. The Site reserves the right at any time to disable access to, or remove any material or activity accessible on or from any Site or any materials claimed to be infringing or based on facts or circumstances from which infringing activity is apparent. It is the firm policy of the Site to terminate the account of repeat copyright infringers, when appropriate, and the Site will act expeditiously to remove access to all material that infringes on another’s copyright, according to the procedure set forth in 17 U.S.C. §512 of the DMCA. The Site’s DMCA Notice Procedures are set forth in the preceding paragraph. If the notice does not comply with §512 of the DMCA, but does comply with three requirements for identifying sites that are infringing according to §512 of the DMCA, the Site shall attempt to contact or take other reasonable steps to contact the complaining party to help that party comply with the notice requirements. When the Designated Agent receives a valid notice, the Site will expeditiously remove and/or disable access to the infringing material and shall notify the affected user. Then, the affected user may submit a counter-notification to the Designated Agent containing a statement made under penalty of perjury that the user has a good faith belief that the material was removed because of misidentification of the material. After the Designated Agent receives the counter-notification, it will replace the material at issue within 10-14 days after receipt of the counter-notification unless the Designated Agent receives notice that a court action has been filed by the complaining party seeking an injunction against the infringing activity.

66 | 67 |

DMCA Counter-Notification Procedure

68 | 69 |

If the Recipient of a Notice of Claimed Infringement ("Notice") believes that the Notice is erroneous or false, and/or that allegedly infringing material has been wrongly removed in accordance with the procedures outlined above, the Recipient is permitted to submit a counter-notification pursuant to Section 512(g)(2)&(3) of the DMCA. A counter-notification is the proper method for the Recipient to dispute the removal or disabling of material pursuant to a Notice. The information that a Recipient provides in a counter-notification must be accurate and truthful, and the Recipient will be liable for any misrepresentations which may cause any claims to be brought against the Site relating to the actions taken in response to the counter-notification.

70 | 71 |

To submit a counter-notification, please provide Our Designated Copyright agent the following information:

72 | 73 |

(a): a specific description of the material that was removed or disabled pursuant to the Notice;

74 | 75 |

(b) a description of where the material was located within the Site or the content (as defined within the Site’s Terms & Conditions or User Agreement) before such material was removed and/or disabled (preferably including specific url’s associated with the material);

76 | 77 |

(c) a statement reflecting the Recipient's belief that the removal or disabling of the material was done so erroneously. For convenience, the following format may be used:

78 | 79 |

“I swear, under penalty of perjury, that I have a good faith belief that the referenced material was removed or disabled by the service provider as a result of mistake or misidentification of the material to be removed or disabled.”

80 | 81 |

(d) the Recipient's physical address, telephone number, and email address; and,

82 | 83 |

(e) a statement that the Recipient consents to the jurisdiction of the Federal District Court in and for the judicial district where the Recipient is located, or if the Recipient is outside of the United States, for any judicial district in which the service provider may be found, and that the Recipient will accept service of process from the person who provided the Notice, or that person’s agent.

84 | 85 |

Written notification containing the above information must be signed and sent to:

86 | 87 |

Lawrence G. Walters
88 | Walters Law Group
89 | 195 W. Pine Ave.
90 | Longwood, FL 32750
91 | Notice [at] DMCANotice [dot] com

92 | 93 |

Please do not send other inquires or information to our Designated Agent. Absent prior express permission, our Designated Agent is not authorized to accept or waive service of formal legal process, and any agency relationship beyond that required to accept valid DMCA Notices is expressly disclaimed.

94 | 95 |

After receiving a DMCA-compliant counter-notification, Our Designated Copyright Agent will forward it to Us, and We will then provide the counter-notification to the claimant who first sent the original Notice identifying the allegedly infringing content.

96 | 97 |

Thereafter, within ten to fourteen (10-14) days of Our receipt of a counter-notification, We will replace or cease disabling access to the disputed material provided that We or Our Designated Copyright Agent have not received notice that the original claimant has filed an action seeking a court order to restrain the Recipient from engaging in infringing activity relating to the material on the Site’s system or network.

98 | 99 |

Service Provider Customers or Subscribers

100 | 101 |

In the event that the alleged infringer identified in an intended DMCA Notice is, itself, operating as a “Service Provider” within the meaning of 17 U.S.C. § 512(k)(1), the Site requests that any such DMCA Notices relating to alleged infringement by third party users, customers or subscribers of such service providers be submitted directly to the DMCA Agent designated by the service provider instead of the Site.

102 | 103 |

Modifications to Policy

104 | 105 |

The Site reserves the right to modify, alter or add to this policy, and all affected persons should regularly check back to stay current on any such changes.

106 | 107 |

Customer Service Requests

108 | 109 |

Please note that the DMCA Agent is not associated with the Site in any other capacity, but is an attorney with a private law firm. Customer service inquiries, payment questions, and cancellation requests will not receive a response. All such communications must be directed to the Site's customer service department.

110 | 111 |

This document prepared by Walters Law Group, www.FirstAmendment.com (© 2014).
112 | All rights reserved.

113 | 114 |
115 | 116 | 117 | -------------------------------------------------------------------------------- /public_html/flowplayer.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/flowplayer.swf -------------------------------------------------------------------------------- /public_html/headerbg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/headerbg2.png -------------------------------------------------------------------------------- /public_html/images/.ui-icons_ffffff_256x240.png.F6IzJW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/.ui-icons_ffffff_256x240.png.F6IzJW -------------------------------------------------------------------------------- /public_html/images/__all_the_ui_files_are_for_jquery_ui: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/__all_the_ui_files_are_for_jquery_ui -------------------------------------------------------------------------------- /public_html/images/ui-bg_diagonals-thick_18_b81900_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_diagonals-thick_18_b81900_40x40.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_diagonals-thick_20_666666_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_diagonals-thick_20_666666_40x40.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_flat_10_000000_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_flat_10_000000_40x100.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_glass_100_f6f6f6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_glass_100_f6f6f6_1x400.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_glass_100_fdf5ce_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_glass_100_fdf5ce_1x400.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_gloss-wave_35_f6a828_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_gloss-wave_35_f6a828_500x100.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_highlight-soft_100_eeeeee_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_highlight-soft_100_eeeeee_1x100.png -------------------------------------------------------------------------------- /public_html/images/ui-bg_highlight-soft_75_ffe45c_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-bg_highlight-soft_75_ffe45c_1x100.png -------------------------------------------------------------------------------- /public_html/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /public_html/images/ui-icons_228ef1_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-icons_228ef1_256x240.png -------------------------------------------------------------------------------- /public_html/images/ui-icons_ef8c08_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-icons_ef8c08_256x240.png -------------------------------------------------------------------------------- /public_html/images/ui-icons_ffd27a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-icons_ffd27a_256x240.png -------------------------------------------------------------------------------- /public_html/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /public_html/index.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use CGI; 7 | use CGI::Carp 'fatalsToBrowser'; 8 | 9 | use lib ".."; 10 | use config; 11 | use query; 12 | use template; 13 | 14 | print "Content-type: text/html\r\n\r\n"; 15 | 16 | my $user = user(); 17 | 18 | my $search = CGI::param('s'); 19 | my $page = CGI::param('p'); 20 | 21 | my $movies = movies(); 22 | 23 | (my $content, my $prevnext) = some_movies( $movies, $user, 138, $search, $page, ); 24 | 25 | print template( undef, { 26 | content => $content, 27 | prevnext => $prevnext, 28 | num_videos => $movies->num_rows, 29 | logged_in => ($user->cookie ? 1 : 0), 30 | } ); 31 | 32 | 33 | -------------------------------------------------------------------------------- /public_html/index.html: -------------------------------------------------------------------------------- 1 |

It works!

2 |

This is the default web page for this server.

3 |

The web server software is running but no content has been added, yet.

4 | 5 | -------------------------------------------------------------------------------- /public_html/jquery-ui.structure.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.2 3 | * http://jqueryui.com 4 | * 5 | * Copyright 2014 jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | */ 11 | 12 | /* Layout helpers 13 | ----------------------------------*/ 14 | .ui-helper-hidden { 15 | display: none; 16 | } 17 | .ui-helper-hidden-accessible { 18 | border: 0; 19 | clip: rect(0 0 0 0); 20 | height: 1px; 21 | margin: -1px; 22 | overflow: hidden; 23 | padding: 0; 24 | position: absolute; 25 | width: 1px; 26 | } 27 | .ui-helper-reset { 28 | margin: 0; 29 | padding: 0; 30 | border: 0; 31 | outline: 0; 32 | line-height: 1.3; 33 | text-decoration: none; 34 | font-size: 100%; 35 | list-style: none; 36 | } 37 | .ui-helper-clearfix:before, 38 | .ui-helper-clearfix:after { 39 | content: ""; 40 | display: table; 41 | border-collapse: collapse; 42 | } 43 | .ui-helper-clearfix:after { 44 | clear: both; 45 | } 46 | .ui-helper-clearfix { 47 | min-height: 0; /* support: IE7 */ 48 | } 49 | .ui-helper-zfix { 50 | width: 100%; 51 | height: 100%; 52 | top: 0; 53 | left: 0; 54 | position: absolute; 55 | opacity: 0; 56 | filter:Alpha(Opacity=0); /* support: IE8 */ 57 | } 58 | 59 | .ui-front { 60 | z-index: 100; 61 | } 62 | 63 | 64 | /* Interaction Cues 65 | ----------------------------------*/ 66 | .ui-state-disabled { 67 | cursor: default !important; 68 | } 69 | 70 | 71 | /* Icons 72 | ----------------------------------*/ 73 | 74 | /* states and images */ 75 | .ui-icon { 76 | display: block; 77 | text-indent: -99999px; 78 | overflow: hidden; 79 | background-repeat: no-repeat; 80 | } 81 | 82 | 83 | /* Misc visuals 84 | ----------------------------------*/ 85 | 86 | /* Overlays */ 87 | .ui-widget-overlay { 88 | position: fixed; 89 | top: 0; 90 | left: 0; 91 | width: 100%; 92 | height: 100%; 93 | } 94 | .ui-accordion .ui-accordion-header { 95 | display: block; 96 | cursor: pointer; 97 | position: relative; 98 | margin: 2px 0 0 0; 99 | padding: .5em .5em .5em .7em; 100 | min-height: 0; /* support: IE7 */ 101 | font-size: 100%; 102 | } 103 | .ui-accordion .ui-accordion-icons { 104 | padding-left: 2.2em; 105 | } 106 | .ui-accordion .ui-accordion-icons .ui-accordion-icons { 107 | padding-left: 2.2em; 108 | } 109 | .ui-accordion .ui-accordion-header .ui-accordion-header-icon { 110 | position: absolute; 111 | left: .5em; 112 | top: 50%; 113 | margin-top: -8px; 114 | } 115 | .ui-accordion .ui-accordion-content { 116 | padding: 1em 2.2em; 117 | border-top: 0; 118 | overflow: auto; 119 | } 120 | .ui-autocomplete { 121 | position: absolute; 122 | top: 0; 123 | left: 0; 124 | cursor: default; 125 | } 126 | .ui-button { 127 | display: inline-block; 128 | position: relative; 129 | padding: 0; 130 | line-height: normal; 131 | margin-right: .1em; 132 | cursor: pointer; 133 | vertical-align: middle; 134 | text-align: center; 135 | overflow: visible; /* removes extra width in IE */ 136 | } 137 | .ui-button, 138 | .ui-button:link, 139 | .ui-button:visited, 140 | .ui-button:hover, 141 | .ui-button:active { 142 | text-decoration: none; 143 | } 144 | /* to make room for the icon, a width needs to be set here */ 145 | .ui-button-icon-only { 146 | width: 2.2em; 147 | } 148 | /* button elements seem to need a little more width */ 149 | button.ui-button-icon-only { 150 | width: 2.4em; 151 | } 152 | .ui-button-icons-only { 153 | width: 3.4em; 154 | } 155 | button.ui-button-icons-only { 156 | width: 3.7em; 157 | } 158 | 159 | /* button text element */ 160 | .ui-button .ui-button-text { 161 | display: block; 162 | line-height: normal; 163 | } 164 | .ui-button-text-only .ui-button-text { 165 | padding: .4em 1em; 166 | } 167 | .ui-button-icon-only .ui-button-text, 168 | .ui-button-icons-only .ui-button-text { 169 | padding: .4em; 170 | text-indent: -9999999px; 171 | } 172 | .ui-button-text-icon-primary .ui-button-text, 173 | .ui-button-text-icons .ui-button-text { 174 | padding: .4em 1em .4em 2.1em; 175 | } 176 | .ui-button-text-icon-secondary .ui-button-text, 177 | .ui-button-text-icons .ui-button-text { 178 | padding: .4em 2.1em .4em 1em; 179 | } 180 | .ui-button-text-icons .ui-button-text { 181 | padding-left: 2.1em; 182 | padding-right: 2.1em; 183 | } 184 | /* no icon support for input elements, provide padding by default */ 185 | input.ui-button { 186 | padding: .4em 1em; 187 | } 188 | 189 | /* button icon element(s) */ 190 | .ui-button-icon-only .ui-icon, 191 | .ui-button-text-icon-primary .ui-icon, 192 | .ui-button-text-icon-secondary .ui-icon, 193 | .ui-button-text-icons .ui-icon, 194 | .ui-button-icons-only .ui-icon { 195 | position: absolute; 196 | top: 50%; 197 | margin-top: -8px; 198 | } 199 | .ui-button-icon-only .ui-icon { 200 | left: 50%; 201 | margin-left: -8px; 202 | } 203 | .ui-button-text-icon-primary .ui-button-icon-primary, 204 | .ui-button-text-icons .ui-button-icon-primary, 205 | .ui-button-icons-only .ui-button-icon-primary { 206 | left: .5em; 207 | } 208 | .ui-button-text-icon-secondary .ui-button-icon-secondary, 209 | .ui-button-text-icons .ui-button-icon-secondary, 210 | .ui-button-icons-only .ui-button-icon-secondary { 211 | right: .5em; 212 | } 213 | 214 | /* button sets */ 215 | .ui-buttonset { 216 | margin-right: 7px; 217 | } 218 | .ui-buttonset .ui-button { 219 | margin-left: 0; 220 | margin-right: -.3em; 221 | } 222 | 223 | /* workarounds */ 224 | /* reset extra padding in Firefox, see h5bp.com/l */ 225 | input.ui-button::-moz-focus-inner, 226 | button.ui-button::-moz-focus-inner { 227 | border: 0; 228 | padding: 0; 229 | } 230 | .ui-datepicker { 231 | width: 17em; 232 | padding: .2em .2em 0; 233 | display: none; 234 | } 235 | .ui-datepicker .ui-datepicker-header { 236 | position: relative; 237 | padding: .2em 0; 238 | } 239 | .ui-datepicker .ui-datepicker-prev, 240 | .ui-datepicker .ui-datepicker-next { 241 | position: absolute; 242 | top: 2px; 243 | width: 1.8em; 244 | height: 1.8em; 245 | } 246 | .ui-datepicker .ui-datepicker-prev-hover, 247 | .ui-datepicker .ui-datepicker-next-hover { 248 | top: 1px; 249 | } 250 | .ui-datepicker .ui-datepicker-prev { 251 | left: 2px; 252 | } 253 | .ui-datepicker .ui-datepicker-next { 254 | right: 2px; 255 | } 256 | .ui-datepicker .ui-datepicker-prev-hover { 257 | left: 1px; 258 | } 259 | .ui-datepicker .ui-datepicker-next-hover { 260 | right: 1px; 261 | } 262 | .ui-datepicker .ui-datepicker-prev span, 263 | .ui-datepicker .ui-datepicker-next span { 264 | display: block; 265 | position: absolute; 266 | left: 50%; 267 | margin-left: -8px; 268 | top: 50%; 269 | margin-top: -8px; 270 | } 271 | .ui-datepicker .ui-datepicker-title { 272 | margin: 0 2.3em; 273 | line-height: 1.8em; 274 | text-align: center; 275 | } 276 | .ui-datepicker .ui-datepicker-title select { 277 | font-size: 1em; 278 | margin: 1px 0; 279 | } 280 | .ui-datepicker select.ui-datepicker-month, 281 | .ui-datepicker select.ui-datepicker-year { 282 | width: 45%; 283 | } 284 | .ui-datepicker table { 285 | width: 100%; 286 | font-size: .9em; 287 | border-collapse: collapse; 288 | margin: 0 0 .4em; 289 | } 290 | .ui-datepicker th { 291 | padding: .7em .3em; 292 | text-align: center; 293 | font-weight: bold; 294 | border: 0; 295 | } 296 | .ui-datepicker td { 297 | border: 0; 298 | padding: 1px; 299 | } 300 | .ui-datepicker td span, 301 | .ui-datepicker td a { 302 | display: block; 303 | padding: .2em; 304 | text-align: right; 305 | text-decoration: none; 306 | } 307 | .ui-datepicker .ui-datepicker-buttonpane { 308 | background-image: none; 309 | margin: .7em 0 0 0; 310 | padding: 0 .2em; 311 | border-left: 0; 312 | border-right: 0; 313 | border-bottom: 0; 314 | } 315 | .ui-datepicker .ui-datepicker-buttonpane button { 316 | float: right; 317 | margin: .5em .2em .4em; 318 | cursor: pointer; 319 | padding: .2em .6em .3em .6em; 320 | width: auto; 321 | overflow: visible; 322 | } 323 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { 324 | float: left; 325 | } 326 | 327 | /* with multiple calendars */ 328 | .ui-datepicker.ui-datepicker-multi { 329 | width: auto; 330 | } 331 | .ui-datepicker-multi .ui-datepicker-group { 332 | float: left; 333 | } 334 | .ui-datepicker-multi .ui-datepicker-group table { 335 | width: 95%; 336 | margin: 0 auto .4em; 337 | } 338 | .ui-datepicker-multi-2 .ui-datepicker-group { 339 | width: 50%; 340 | } 341 | .ui-datepicker-multi-3 .ui-datepicker-group { 342 | width: 33.3%; 343 | } 344 | .ui-datepicker-multi-4 .ui-datepicker-group { 345 | width: 25%; 346 | } 347 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, 348 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { 349 | border-left-width: 0; 350 | } 351 | .ui-datepicker-multi .ui-datepicker-buttonpane { 352 | clear: left; 353 | } 354 | .ui-datepicker-row-break { 355 | clear: both; 356 | width: 100%; 357 | font-size: 0; 358 | } 359 | 360 | /* RTL support */ 361 | .ui-datepicker-rtl { 362 | direction: rtl; 363 | } 364 | .ui-datepicker-rtl .ui-datepicker-prev { 365 | right: 2px; 366 | left: auto; 367 | } 368 | .ui-datepicker-rtl .ui-datepicker-next { 369 | left: 2px; 370 | right: auto; 371 | } 372 | .ui-datepicker-rtl .ui-datepicker-prev:hover { 373 | right: 1px; 374 | left: auto; 375 | } 376 | .ui-datepicker-rtl .ui-datepicker-next:hover { 377 | left: 1px; 378 | right: auto; 379 | } 380 | .ui-datepicker-rtl .ui-datepicker-buttonpane { 381 | clear: right; 382 | } 383 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { 384 | float: left; 385 | } 386 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, 387 | .ui-datepicker-rtl .ui-datepicker-group { 388 | float: right; 389 | } 390 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, 391 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { 392 | border-right-width: 0; 393 | border-left-width: 1px; 394 | } 395 | .ui-dialog { 396 | overflow: hidden; 397 | position: absolute; 398 | top: 0; 399 | left: 0; 400 | padding: .2em; 401 | outline: 0; 402 | } 403 | .ui-dialog .ui-dialog-titlebar { 404 | padding: .4em 1em; 405 | position: relative; 406 | } 407 | .ui-dialog .ui-dialog-title { 408 | float: left; 409 | margin: .1em 0; 410 | white-space: nowrap; 411 | width: 90%; 412 | overflow: hidden; 413 | text-overflow: ellipsis; 414 | } 415 | .ui-dialog .ui-dialog-titlebar-close { 416 | position: absolute; 417 | right: .3em; 418 | top: 50%; 419 | width: 20px; 420 | margin: -10px 0 0 0; 421 | padding: 1px; 422 | height: 20px; 423 | } 424 | .ui-dialog .ui-dialog-content { 425 | position: relative; 426 | border: 0; 427 | padding: .5em 1em; 428 | background: none; 429 | overflow: auto; 430 | } 431 | .ui-dialog .ui-dialog-buttonpane { 432 | text-align: left; 433 | border-width: 1px 0 0 0; 434 | background-image: none; 435 | margin-top: .5em; 436 | padding: .3em 1em .5em .4em; 437 | } 438 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { 439 | float: right; 440 | } 441 | .ui-dialog .ui-dialog-buttonpane button { 442 | margin: .5em .4em .5em 0; 443 | cursor: pointer; 444 | } 445 | .ui-dialog .ui-resizable-se { 446 | width: 12px; 447 | height: 12px; 448 | right: -5px; 449 | bottom: -5px; 450 | background-position: 16px 16px; 451 | } 452 | .ui-draggable .ui-dialog-titlebar { 453 | cursor: move; 454 | } 455 | .ui-draggable-handle { 456 | -ms-touch-action: none; 457 | touch-action: none; 458 | } 459 | .ui-menu { 460 | list-style: none; 461 | padding: 0; 462 | margin: 0; 463 | display: block; 464 | outline: none; 465 | } 466 | .ui-menu .ui-menu { 467 | position: absolute; 468 | } 469 | .ui-menu .ui-menu-item { 470 | position: relative; 471 | margin: 0; 472 | padding: 3px 1em 3px .4em; 473 | cursor: pointer; 474 | min-height: 0; /* support: IE7 */ 475 | /* support: IE10, see #8844 */ 476 | list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); 477 | } 478 | .ui-menu .ui-menu-divider { 479 | margin: 5px 0; 480 | height: 0; 481 | font-size: 0; 482 | line-height: 0; 483 | border-width: 1px 0 0 0; 484 | } 485 | .ui-menu .ui-state-focus, 486 | .ui-menu .ui-state-active { 487 | margin: -1px; 488 | } 489 | 490 | /* icon support */ 491 | .ui-menu-icons { 492 | position: relative; 493 | } 494 | .ui-menu-icons .ui-menu-item { 495 | padding-left: 2em; 496 | } 497 | 498 | /* left-aligned */ 499 | .ui-menu .ui-icon { 500 | position: absolute; 501 | top: 0; 502 | bottom: 0; 503 | left: .2em; 504 | margin: auto 0; 505 | } 506 | 507 | /* right-aligned */ 508 | .ui-menu .ui-menu-icon { 509 | left: auto; 510 | right: 0; 511 | } 512 | .ui-progressbar { 513 | height: 2em; 514 | text-align: left; 515 | overflow: hidden; 516 | } 517 | .ui-progressbar .ui-progressbar-value { 518 | margin: -1px; 519 | height: 100%; 520 | } 521 | .ui-progressbar .ui-progressbar-overlay { 522 | background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); 523 | height: 100%; 524 | filter: alpha(opacity=25); /* support: IE8 */ 525 | opacity: 0.25; 526 | } 527 | .ui-progressbar-indeterminate .ui-progressbar-value { 528 | background-image: none; 529 | } 530 | .ui-resizable { 531 | position: relative; 532 | } 533 | .ui-resizable-handle { 534 | position: absolute; 535 | font-size: 0.1px; 536 | display: block; 537 | -ms-touch-action: none; 538 | touch-action: none; 539 | } 540 | .ui-resizable-disabled .ui-resizable-handle, 541 | .ui-resizable-autohide .ui-resizable-handle { 542 | display: none; 543 | } 544 | .ui-resizable-n { 545 | cursor: n-resize; 546 | height: 7px; 547 | width: 100%; 548 | top: -5px; 549 | left: 0; 550 | } 551 | .ui-resizable-s { 552 | cursor: s-resize; 553 | height: 7px; 554 | width: 100%; 555 | bottom: -5px; 556 | left: 0; 557 | } 558 | .ui-resizable-e { 559 | cursor: e-resize; 560 | width: 7px; 561 | right: -5px; 562 | top: 0; 563 | height: 100%; 564 | } 565 | .ui-resizable-w { 566 | cursor: w-resize; 567 | width: 7px; 568 | left: -5px; 569 | top: 0; 570 | height: 100%; 571 | } 572 | .ui-resizable-se { 573 | cursor: se-resize; 574 | width: 12px; 575 | height: 12px; 576 | right: 1px; 577 | bottom: 1px; 578 | } 579 | .ui-resizable-sw { 580 | cursor: sw-resize; 581 | width: 9px; 582 | height: 9px; 583 | left: -5px; 584 | bottom: -5px; 585 | } 586 | .ui-resizable-nw { 587 | cursor: nw-resize; 588 | width: 9px; 589 | height: 9px; 590 | left: -5px; 591 | top: -5px; 592 | } 593 | .ui-resizable-ne { 594 | cursor: ne-resize; 595 | width: 9px; 596 | height: 9px; 597 | right: -5px; 598 | top: -5px; 599 | } 600 | .ui-selectable { 601 | -ms-touch-action: none; 602 | touch-action: none; 603 | } 604 | .ui-selectable-helper { 605 | position: absolute; 606 | z-index: 100; 607 | border: 1px dotted black; 608 | } 609 | .ui-selectmenu-menu { 610 | padding: 0; 611 | margin: 0; 612 | position: absolute; 613 | top: 0; 614 | left: 0; 615 | display: none; 616 | } 617 | .ui-selectmenu-menu .ui-menu { 618 | overflow: auto; 619 | /* Support: IE7 */ 620 | overflow-x: hidden; 621 | padding-bottom: 1px; 622 | } 623 | .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { 624 | font-size: 1em; 625 | font-weight: bold; 626 | line-height: 1.5; 627 | padding: 2px 0.4em; 628 | margin: 0.5em 0 0 0; 629 | height: auto; 630 | border: 0; 631 | } 632 | .ui-selectmenu-open { 633 | display: block; 634 | } 635 | .ui-selectmenu-button { 636 | display: inline-block; 637 | overflow: hidden; 638 | position: relative; 639 | text-decoration: none; 640 | cursor: pointer; 641 | } 642 | .ui-selectmenu-button span.ui-icon { 643 | right: 0.5em; 644 | left: auto; 645 | margin-top: -8px; 646 | position: absolute; 647 | top: 50%; 648 | } 649 | .ui-selectmenu-button span.ui-selectmenu-text { 650 | text-align: left; 651 | padding: 0.4em 2.1em 0.4em 1em; 652 | display: block; 653 | line-height: 1.4; 654 | overflow: hidden; 655 | text-overflow: ellipsis; 656 | white-space: nowrap; 657 | } 658 | .ui-slider { 659 | position: relative; 660 | text-align: left; 661 | } 662 | .ui-slider .ui-slider-handle { 663 | position: absolute; 664 | z-index: 2; 665 | width: 1.2em; 666 | height: 1.2em; 667 | cursor: default; 668 | -ms-touch-action: none; 669 | touch-action: none; 670 | } 671 | .ui-slider .ui-slider-range { 672 | position: absolute; 673 | z-index: 1; 674 | font-size: .7em; 675 | display: block; 676 | border: 0; 677 | background-position: 0 0; 678 | } 679 | 680 | /* support: IE8 - See #6727 */ 681 | .ui-slider.ui-state-disabled .ui-slider-handle, 682 | .ui-slider.ui-state-disabled .ui-slider-range { 683 | filter: inherit; 684 | } 685 | 686 | .ui-slider-horizontal { 687 | height: .8em; 688 | } 689 | .ui-slider-horizontal .ui-slider-handle { 690 | top: -.3em; 691 | margin-left: -.6em; 692 | } 693 | .ui-slider-horizontal .ui-slider-range { 694 | top: 0; 695 | height: 100%; 696 | } 697 | .ui-slider-horizontal .ui-slider-range-min { 698 | left: 0; 699 | } 700 | .ui-slider-horizontal .ui-slider-range-max { 701 | right: 0; 702 | } 703 | 704 | .ui-slider-vertical { 705 | width: .8em; 706 | height: 100px; 707 | } 708 | .ui-slider-vertical .ui-slider-handle { 709 | left: -.3em; 710 | margin-left: 0; 711 | margin-bottom: -.6em; 712 | } 713 | .ui-slider-vertical .ui-slider-range { 714 | left: 0; 715 | width: 100%; 716 | } 717 | .ui-slider-vertical .ui-slider-range-min { 718 | bottom: 0; 719 | } 720 | .ui-slider-vertical .ui-slider-range-max { 721 | top: 0; 722 | } 723 | .ui-sortable-handle { 724 | -ms-touch-action: none; 725 | touch-action: none; 726 | } 727 | .ui-spinner { 728 | position: relative; 729 | display: inline-block; 730 | overflow: hidden; 731 | padding: 0; 732 | vertical-align: middle; 733 | } 734 | .ui-spinner-input { 735 | border: none; 736 | background: none; 737 | color: inherit; 738 | padding: 0; 739 | margin: .2em 0; 740 | vertical-align: middle; 741 | margin-left: .4em; 742 | margin-right: 22px; 743 | } 744 | .ui-spinner-button { 745 | width: 16px; 746 | height: 50%; 747 | font-size: .5em; 748 | padding: 0; 749 | margin: 0; 750 | text-align: center; 751 | position: absolute; 752 | cursor: default; 753 | display: block; 754 | overflow: hidden; 755 | right: 0; 756 | } 757 | /* more specificity required here to override default borders */ 758 | .ui-spinner a.ui-spinner-button { 759 | border-top: none; 760 | border-bottom: none; 761 | border-right: none; 762 | } 763 | /* vertically center icon */ 764 | .ui-spinner .ui-icon { 765 | position: absolute; 766 | margin-top: -8px; 767 | top: 50%; 768 | left: 0; 769 | } 770 | .ui-spinner-up { 771 | top: 0; 772 | } 773 | .ui-spinner-down { 774 | bottom: 0; 775 | } 776 | 777 | /* TR overrides */ 778 | .ui-spinner .ui-icon-triangle-1-s { 779 | /* need to fix icons sprite */ 780 | background-position: -65px -16px; 781 | } 782 | .ui-tabs { 783 | position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 784 | padding: .2em; 785 | } 786 | .ui-tabs .ui-tabs-nav { 787 | margin: 0; 788 | padding: .2em .2em 0; 789 | } 790 | .ui-tabs .ui-tabs-nav li { 791 | list-style: none; 792 | float: left; 793 | position: relative; 794 | top: 0; 795 | margin: 1px .2em 0 0; 796 | border-bottom-width: 0; 797 | padding: 0; 798 | white-space: nowrap; 799 | } 800 | .ui-tabs .ui-tabs-nav .ui-tabs-anchor { 801 | float: left; 802 | padding: .5em 1em; 803 | text-decoration: none; 804 | } 805 | .ui-tabs .ui-tabs-nav li.ui-tabs-active { 806 | margin-bottom: -1px; 807 | padding-bottom: 1px; 808 | } 809 | .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, 810 | .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, 811 | .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { 812 | cursor: text; 813 | } 814 | .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { 815 | cursor: pointer; 816 | } 817 | .ui-tabs .ui-tabs-panel { 818 | display: block; 819 | border-width: 0; 820 | padding: 1em 1.4em; 821 | background: none; 822 | } 823 | .ui-tooltip { 824 | padding: 8px; 825 | position: absolute; 826 | z-index: 9999; 827 | max-width: 300px; 828 | -webkit-box-shadow: 0 0 5px #aaa; 829 | box-shadow: 0 0 5px #aaa; 830 | } 831 | body .ui-tooltip { 832 | border-width: 2px; 833 | } 834 | -------------------------------------------------------------------------------- /public_html/jquery-ui.structure.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.2 - 2014-10-16 2 | * http://jqueryui.com 3 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px} -------------------------------------------------------------------------------- /public_html/jquery-ui.theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.2 3 | * http://jqueryui.com 4 | * 5 | * Copyright 2014 jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | * 11 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px 12 | */ 13 | 14 | 15 | /* Component containers 16 | ----------------------------------*/ 17 | .ui-widget { 18 | font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 19 | font-size: 1.1em; 20 | } 21 | .ui-widget .ui-widget { 22 | font-size: 1em; 23 | } 24 | .ui-widget input, 25 | .ui-widget select, 26 | .ui-widget textarea, 27 | .ui-widget button { 28 | font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 29 | font-size: 1em; 30 | } 31 | .ui-widget-content { 32 | border: 1px solid #dddddd; 33 | background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x; 34 | color: #333333; 35 | } 36 | .ui-widget-content a { 37 | color: #333333; 38 | } 39 | .ui-widget-header { 40 | border: 1px solid #e78f08; 41 | background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x; 42 | color: #ffffff; 43 | font-weight: bold; 44 | } 45 | .ui-widget-header a { 46 | color: #ffffff; 47 | } 48 | 49 | /* Interaction states 50 | ----------------------------------*/ 51 | .ui-state-default, 52 | .ui-widget-content .ui-state-default, 53 | .ui-widget-header .ui-state-default { 54 | border: 1px solid #cccccc; 55 | background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x; 56 | font-weight: bold; 57 | color: #1c94c4; 58 | } 59 | .ui-state-default a, 60 | .ui-state-default a:link, 61 | .ui-state-default a:visited { 62 | color: #1c94c4; 63 | text-decoration: none; 64 | } 65 | .ui-state-hover, 66 | .ui-widget-content .ui-state-hover, 67 | .ui-widget-header .ui-state-hover, 68 | .ui-state-focus, 69 | .ui-widget-content .ui-state-focus, 70 | .ui-widget-header .ui-state-focus { 71 | border: 1px solid #fbcb09; 72 | background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x; 73 | font-weight: bold; 74 | color: #c77405; 75 | } 76 | .ui-state-hover a, 77 | .ui-state-hover a:hover, 78 | .ui-state-hover a:link, 79 | .ui-state-hover a:visited, 80 | .ui-state-focus a, 81 | .ui-state-focus a:hover, 82 | .ui-state-focus a:link, 83 | .ui-state-focus a:visited { 84 | color: #c77405; 85 | text-decoration: none; 86 | } 87 | .ui-state-active, 88 | .ui-widget-content .ui-state-active, 89 | .ui-widget-header .ui-state-active { 90 | border: 1px solid #fbd850; 91 | background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; 92 | font-weight: bold; 93 | color: #eb8f00; 94 | } 95 | .ui-state-active a, 96 | .ui-state-active a:link, 97 | .ui-state-active a:visited { 98 | color: #eb8f00; 99 | text-decoration: none; 100 | } 101 | 102 | /* Interaction Cues 103 | ----------------------------------*/ 104 | .ui-state-highlight, 105 | .ui-widget-content .ui-state-highlight, 106 | .ui-widget-header .ui-state-highlight { 107 | border: 1px solid #fed22f; 108 | background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x; 109 | color: #363636; 110 | } 111 | .ui-state-highlight a, 112 | .ui-widget-content .ui-state-highlight a, 113 | .ui-widget-header .ui-state-highlight a { 114 | color: #363636; 115 | } 116 | .ui-state-error, 117 | .ui-widget-content .ui-state-error, 118 | .ui-widget-header .ui-state-error { 119 | border: 1px solid #cd0a0a; 120 | background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat; 121 | color: #ffffff; 122 | } 123 | .ui-state-error a, 124 | .ui-widget-content .ui-state-error a, 125 | .ui-widget-header .ui-state-error a { 126 | color: #ffffff; 127 | } 128 | .ui-state-error-text, 129 | .ui-widget-content .ui-state-error-text, 130 | .ui-widget-header .ui-state-error-text { 131 | color: #ffffff; 132 | } 133 | .ui-priority-primary, 134 | .ui-widget-content .ui-priority-primary, 135 | .ui-widget-header .ui-priority-primary { 136 | font-weight: bold; 137 | } 138 | .ui-priority-secondary, 139 | .ui-widget-content .ui-priority-secondary, 140 | .ui-widget-header .ui-priority-secondary { 141 | opacity: .7; 142 | filter:Alpha(Opacity=70); /* support: IE8 */ 143 | font-weight: normal; 144 | } 145 | .ui-state-disabled, 146 | .ui-widget-content .ui-state-disabled, 147 | .ui-widget-header .ui-state-disabled { 148 | opacity: .35; 149 | filter:Alpha(Opacity=35); /* support: IE8 */ 150 | background-image: none; 151 | } 152 | .ui-state-disabled .ui-icon { 153 | filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ 154 | } 155 | 156 | /* Icons 157 | ----------------------------------*/ 158 | 159 | /* states and images */ 160 | .ui-icon { 161 | width: 16px; 162 | height: 16px; 163 | } 164 | .ui-icon, 165 | .ui-widget-content .ui-icon { 166 | background-image: url("images/ui-icons_222222_256x240.png"); 167 | } 168 | .ui-widget-header .ui-icon { 169 | background-image: url("images/ui-icons_ffffff_256x240.png"); 170 | } 171 | .ui-state-default .ui-icon { 172 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 173 | } 174 | .ui-state-hover .ui-icon, 175 | .ui-state-focus .ui-icon { 176 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 177 | } 178 | .ui-state-active .ui-icon { 179 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 180 | } 181 | .ui-state-highlight .ui-icon { 182 | background-image: url("images/ui-icons_228ef1_256x240.png"); 183 | } 184 | .ui-state-error .ui-icon, 185 | .ui-state-error-text .ui-icon { 186 | background-image: url("images/ui-icons_ffd27a_256x240.png"); 187 | } 188 | 189 | /* positioning */ 190 | .ui-icon-blank { background-position: 16px 16px; } 191 | .ui-icon-carat-1-n { background-position: 0 0; } 192 | .ui-icon-carat-1-ne { background-position: -16px 0; } 193 | .ui-icon-carat-1-e { background-position: -32px 0; } 194 | .ui-icon-carat-1-se { background-position: -48px 0; } 195 | .ui-icon-carat-1-s { background-position: -64px 0; } 196 | .ui-icon-carat-1-sw { background-position: -80px 0; } 197 | .ui-icon-carat-1-w { background-position: -96px 0; } 198 | .ui-icon-carat-1-nw { background-position: -112px 0; } 199 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 200 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 201 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 202 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 203 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 204 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 205 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 206 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 207 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 208 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 209 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 210 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 211 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 212 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 213 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 214 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 215 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 216 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 217 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 218 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 219 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 220 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 221 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 222 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 223 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 224 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 225 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 226 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 227 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 228 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 229 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 230 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 231 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 232 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 233 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 234 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 235 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 236 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 237 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 238 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 239 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 240 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 241 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 242 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 243 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 244 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 245 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 246 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 247 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 248 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 249 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 250 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 251 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 252 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 253 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 254 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 255 | .ui-icon-arrow-4 { background-position: 0 -80px; } 256 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 257 | .ui-icon-extlink { background-position: -32px -80px; } 258 | .ui-icon-newwin { background-position: -48px -80px; } 259 | .ui-icon-refresh { background-position: -64px -80px; } 260 | .ui-icon-shuffle { background-position: -80px -80px; } 261 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 262 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 263 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 264 | .ui-icon-folder-open { background-position: -16px -96px; } 265 | .ui-icon-document { background-position: -32px -96px; } 266 | .ui-icon-document-b { background-position: -48px -96px; } 267 | .ui-icon-note { background-position: -64px -96px; } 268 | .ui-icon-mail-closed { background-position: -80px -96px; } 269 | .ui-icon-mail-open { background-position: -96px -96px; } 270 | .ui-icon-suitcase { background-position: -112px -96px; } 271 | .ui-icon-comment { background-position: -128px -96px; } 272 | .ui-icon-person { background-position: -144px -96px; } 273 | .ui-icon-print { background-position: -160px -96px; } 274 | .ui-icon-trash { background-position: -176px -96px; } 275 | .ui-icon-locked { background-position: -192px -96px; } 276 | .ui-icon-unlocked { background-position: -208px -96px; } 277 | .ui-icon-bookmark { background-position: -224px -96px; } 278 | .ui-icon-tag { background-position: -240px -96px; } 279 | .ui-icon-home { background-position: 0 -112px; } 280 | .ui-icon-flag { background-position: -16px -112px; } 281 | .ui-icon-calendar { background-position: -32px -112px; } 282 | .ui-icon-cart { background-position: -48px -112px; } 283 | .ui-icon-pencil { background-position: -64px -112px; } 284 | .ui-icon-clock { background-position: -80px -112px; } 285 | .ui-icon-disk { background-position: -96px -112px; } 286 | .ui-icon-calculator { background-position: -112px -112px; } 287 | .ui-icon-zoomin { background-position: -128px -112px; } 288 | .ui-icon-zoomout { background-position: -144px -112px; } 289 | .ui-icon-search { background-position: -160px -112px; } 290 | .ui-icon-wrench { background-position: -176px -112px; } 291 | .ui-icon-gear { background-position: -192px -112px; } 292 | .ui-icon-heart { background-position: -208px -112px; } 293 | .ui-icon-star { background-position: -224px -112px; } 294 | .ui-icon-link { background-position: -240px -112px; } 295 | .ui-icon-cancel { background-position: 0 -128px; } 296 | .ui-icon-plus { background-position: -16px -128px; } 297 | .ui-icon-plusthick { background-position: -32px -128px; } 298 | .ui-icon-minus { background-position: -48px -128px; } 299 | .ui-icon-minusthick { background-position: -64px -128px; } 300 | .ui-icon-close { background-position: -80px -128px; } 301 | .ui-icon-closethick { background-position: -96px -128px; } 302 | .ui-icon-key { background-position: -112px -128px; } 303 | .ui-icon-lightbulb { background-position: -128px -128px; } 304 | .ui-icon-scissors { background-position: -144px -128px; } 305 | .ui-icon-clipboard { background-position: -160px -128px; } 306 | .ui-icon-copy { background-position: -176px -128px; } 307 | .ui-icon-contact { background-position: -192px -128px; } 308 | .ui-icon-image { background-position: -208px -128px; } 309 | .ui-icon-video { background-position: -224px -128px; } 310 | .ui-icon-script { background-position: -240px -128px; } 311 | .ui-icon-alert { background-position: 0 -144px; } 312 | .ui-icon-info { background-position: -16px -144px; } 313 | .ui-icon-notice { background-position: -32px -144px; } 314 | .ui-icon-help { background-position: -48px -144px; } 315 | .ui-icon-check { background-position: -64px -144px; } 316 | .ui-icon-bullet { background-position: -80px -144px; } 317 | .ui-icon-radio-on { background-position: -96px -144px; } 318 | .ui-icon-radio-off { background-position: -112px -144px; } 319 | .ui-icon-pin-w { background-position: -128px -144px; } 320 | .ui-icon-pin-s { background-position: -144px -144px; } 321 | .ui-icon-play { background-position: 0 -160px; } 322 | .ui-icon-pause { background-position: -16px -160px; } 323 | .ui-icon-seek-next { background-position: -32px -160px; } 324 | .ui-icon-seek-prev { background-position: -48px -160px; } 325 | .ui-icon-seek-end { background-position: -64px -160px; } 326 | .ui-icon-seek-start { background-position: -80px -160px; } 327 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 328 | .ui-icon-seek-first { background-position: -80px -160px; } 329 | .ui-icon-stop { background-position: -96px -160px; } 330 | .ui-icon-eject { background-position: -112px -160px; } 331 | .ui-icon-volume-off { background-position: -128px -160px; } 332 | .ui-icon-volume-on { background-position: -144px -160px; } 333 | .ui-icon-power { background-position: 0 -176px; } 334 | .ui-icon-signal-diag { background-position: -16px -176px; } 335 | .ui-icon-signal { background-position: -32px -176px; } 336 | .ui-icon-battery-0 { background-position: -48px -176px; } 337 | .ui-icon-battery-1 { background-position: -64px -176px; } 338 | .ui-icon-battery-2 { background-position: -80px -176px; } 339 | .ui-icon-battery-3 { background-position: -96px -176px; } 340 | .ui-icon-circle-plus { background-position: 0 -192px; } 341 | .ui-icon-circle-minus { background-position: -16px -192px; } 342 | .ui-icon-circle-close { background-position: -32px -192px; } 343 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 344 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 345 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 346 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 347 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 348 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 349 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 350 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 351 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 352 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 353 | .ui-icon-circle-check { background-position: -208px -192px; } 354 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 355 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 356 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 357 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 358 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 359 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 360 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 361 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 362 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 363 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 364 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 365 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 366 | 367 | 368 | /* Misc visuals 369 | ----------------------------------*/ 370 | 371 | /* Corner radius */ 372 | .ui-corner-all, 373 | .ui-corner-top, 374 | .ui-corner-left, 375 | .ui-corner-tl { 376 | border-top-left-radius: 4px; 377 | } 378 | .ui-corner-all, 379 | .ui-corner-top, 380 | .ui-corner-right, 381 | .ui-corner-tr { 382 | border-top-right-radius: 4px; 383 | } 384 | .ui-corner-all, 385 | .ui-corner-bottom, 386 | .ui-corner-left, 387 | .ui-corner-bl { 388 | border-bottom-left-radius: 4px; 389 | } 390 | .ui-corner-all, 391 | .ui-corner-bottom, 392 | .ui-corner-right, 393 | .ui-corner-br { 394 | border-bottom-right-radius: 4px; 395 | } 396 | 397 | /* Overlays */ 398 | .ui-widget-overlay { 399 | background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat; 400 | opacity: .5; 401 | filter: Alpha(Opacity=50); /* support: IE8 */ 402 | } 403 | .ui-widget-shadow { 404 | margin: -5px 0 0 -5px; 405 | padding: 5px; 406 | background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x; 407 | opacity: .2; 408 | filter: Alpha(Opacity=20); /* support: IE8 */ 409 | border-radius: 5px; 410 | } 411 | -------------------------------------------------------------------------------- /public_html/jquery-ui.theme.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.2 - 2014-10-16 2 | * http://jqueryui.com 3 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} -------------------------------------------------------------------------------- /public_html/jquery.timer.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jquery.timer.js 3 | * 4 | * Copyright (c) 2011 Jason Chavannes 5 | * 6 | * http://jchavannes.com/jquery-timer 7 | * 8 | * Permission is hereby granted, free of charge, to any person 9 | * obtaining a copy of this software and associated documentation 10 | * files (the "Software"), to deal in the Software without 11 | * restriction, including without limitation the rights to use, copy, 12 | * modify, merge, publish, distribute, sublicense, and/or sell copies 13 | * of the Software, and to permit persons to whom the Software is 14 | * furnished to do so, subject to the following conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 23 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 24 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 25 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | * SOFTWARE. 27 | */ 28 | 29 | ;(function($) { 30 | $.timer = function(func, time, autostart) { 31 | this.set = function(func, time, autostart) { 32 | this.init = true; 33 | if(typeof func == 'object') { 34 | var paramList = ['autostart', 'time']; 35 | for(var arg in paramList) {if(func[paramList[arg]] != undefined) {eval(paramList[arg] + " = func[paramList[arg]]");}}; 36 | func = func.action; 37 | } 38 | if(typeof func == 'function') {this.action = func;} 39 | if(!isNaN(time)) {this.intervalTime = time;} 40 | if(autostart && !this.active) { 41 | this.active = true; 42 | this.setTimer(); 43 | } 44 | return this; 45 | }; 46 | this.once = function(time) { 47 | var timer = this; 48 | if(isNaN(time)) {time = 0;} 49 | window.setTimeout(function() {timer.action();}, time); 50 | return this; 51 | }; 52 | this.play = function(reset) { 53 | if(!this.active) { 54 | if(reset) {this.setTimer();} 55 | else {this.setTimer(this.remaining);} 56 | this.active = true; 57 | } 58 | return this; 59 | }; 60 | this.pause = function() { 61 | if(this.active) { 62 | this.active = false; 63 | this.remaining -= new Date() - this.last; 64 | this.clearTimer(); 65 | } 66 | return this; 67 | }; 68 | this.stop = function() { 69 | this.active = false; 70 | this.remaining = this.intervalTime; 71 | this.clearTimer(); 72 | return this; 73 | }; 74 | this.toggle = function(reset) { 75 | if(this.active) {this.pause();} 76 | else if(reset) {this.play(true);} 77 | else {this.play();} 78 | return this; 79 | }; 80 | this.reset = function() { 81 | this.active = false; 82 | this.play(true); 83 | return this; 84 | }; 85 | this.clearTimer = function() { 86 | window.clearTimeout(this.timeoutObject); 87 | }; 88 | this.setTimer = function(time) { 89 | var timer = this; 90 | if(typeof this.action != 'function') {return;} 91 | if(isNaN(time)) {time = this.intervalTime;} 92 | this.remaining = time; 93 | this.last = new Date(); 94 | this.clearTimer(); 95 | this.timeoutObject = window.setTimeout(function() {timer.go();}, time); 96 | }; 97 | this.go = function() { 98 | if(this.active) { 99 | this.action(); 100 | this.setTimer(); 101 | } 102 | }; 103 | 104 | if(this.init) { 105 | return new $.timer(func, time, autostart); 106 | } else { 107 | this.set(func, time, autostart); 108 | return this; 109 | } 110 | }; 111 | })(jQuery); -------------------------------------------------------------------------------- /public_html/jsplayer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/jsplayer2.png -------------------------------------------------------------------------------- /public_html/main.css: -------------------------------------------------------------------------------- 1 | /* 2 | Reset 3 | */ 4 | 5 | html, body, div, span, object, iframe, 6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 7 | abbr, address, cite, code, 8 | del, dfn, em, img, ins, kbd, q, samp, 9 | small, strong, sub, sup, var, 10 | b, i, 11 | dl, dt, dd, ol, ul, li, 12 | fieldset, form, label, legend, 13 | table, caption, tbody, tfoot, thead, 14 | article, aside, canvas, details, figcaption, figure, 15 | footer, header, hgroup, menu, nav, section, summary, 16 | time, mark, audio, video { 17 | margin:0; 18 | padding:0; 19 | border:0; 20 | outline:0; 21 | vertical-align:baseline; 22 | background:transparent; 23 | } 24 | 25 | body { 26 | line-height:1; 27 | } 28 | 29 | article,aside,canvas,details,figcaption,figure, 30 | footer,header,hgroup,menu,nav,section,summary { 31 | display:block; 32 | } 33 | 34 | nav ul { 35 | list-style:none; 36 | } 37 | 38 | blockquote, q { 39 | quotes:none; 40 | } 41 | 42 | blockquote:before, blockquote:after, 43 | q:before, q:after { 44 | content:''; 45 | content:none; 46 | } 47 | 48 | a { 49 | margin:0; 50 | padding:0; 51 | font-size:100%; 52 | vertical-align:baseline; 53 | background:transparent; 54 | } 55 | 56 | a { 57 | margin:0; 58 | padding:0; 59 | font-size:100%; 60 | vertical-align:baseline; 61 | background:transparent; 62 | } 63 | 64 | ins { 65 | color:#000; 66 | text-decoration:none; 67 | } 68 | 69 | mark { 70 | background-color:#fff; 71 | color:#000; 72 | font-style:italic; 73 | font-weight:bold; 74 | } 75 | 76 | del { 77 | text-decoration: line-through; 78 | } 79 | 80 | abbr[title], dfn[title] { 81 | border-bottom:1px dotted #000; 82 | cursor:help; 83 | } 84 | 85 | table { 86 | border-collapse:collapse; 87 | border-spacing:0; 88 | } 89 | 90 | hr { 91 | display:block; 92 | height:1px; 93 | border:0; 94 | border-top:1px solid #cccccc; 95 | margin:1em 0; 96 | padding:0; 97 | } 98 | 99 | input, select { 100 | vertical-align:middle; 101 | } 102 | 103 | /* Main */ 104 | body { 105 | font-family: Arial, Verdana, Helvetica, sans-serif; 106 | background-color: #cee7ff; 107 | } 108 | 109 | 110 | /* Sprites */ 111 | 112 | #logo, 113 | #nav-upload, 114 | #nav-community, 115 | #nav-photos, 116 | #nav-toprated, 117 | #nav-longest, 118 | .search-input, 119 | .search-selected, 120 | .thumb-stars-1, 121 | .thumb-stars-5, 122 | .thumb-stars-4, 123 | .thumb-stars-3, 124 | .thumb-stars-2 { 125 | background: none; 126 | border: none; 127 | background-image: url("sprites-3.png"); 128 | background-repeat: no-repeat; 129 | } 130 | 131 | 132 | #header { 133 | height: 100px; 134 | background-color: #1e1e1e; 135 | border-bottom: 1px solid #494848; 136 | background-image:url("headerbg2.png"); 137 | } 138 | 139 | #header-container { 140 | margin: 0px 10px 0px 10px; 141 | min-width: 1000px; 142 | } 143 | 144 | #logo { 145 | float: left; 146 | background-position: 0px 0px; 147 | width: 425px; 148 | height: 78px; 149 | margin: 15px 0px 0px 0px; 150 | } 151 | 152 | #logo a img { 153 | width: 425px; 154 | height: 78px; 155 | } 156 | 157 | #header-links { 158 | position: relative; 159 | float: right; 160 | width: 526px; 161 | height: 100px; 162 | } 163 | 164 | #nav-upload { 165 | position: absolute; 166 | bottom: 0px; 167 | right: 0px; 168 | width: 105px; 169 | height: 42px; 170 | background-position: -421px -80px; 171 | } 172 | 173 | #nav-upload a img { 174 | width: 105px; 175 | height: 42px; 176 | } 177 | 178 | #nav-community { 179 | position: absolute; 180 | bottom: 0px; 181 | right: 105px; 182 | width: 105px; 183 | height: 42px; 184 | background-position: -316px -80px; 185 | } 186 | 187 | #nav-community a img { 188 | width: 105px; 189 | height: 42px; 190 | } 191 | 192 | #nav-photos { 193 | position: absolute; 194 | bottom: 0px; 195 | right: 210px; 196 | width: 105px; 197 | height: 42px; 198 | background-position: -211px -80px; 199 | } 200 | 201 | #nav-photos a img { 202 | width: 105px; 203 | height: 42px; 204 | } 205 | 206 | #nav-toprated { 207 | position: absolute; 208 | bottom: 0px; 209 | right: 315px; 210 | width: 105px; 211 | height: 42px; 212 | background-position: -106px -80px; 213 | } 214 | 215 | #nav-toprated a img { 216 | width: 105px; 217 | height: 42px; 218 | } 219 | 220 | #nav-longest { 221 | position: absolute; 222 | bottom: 0px; 223 | right: 420px; 224 | width: 106px; 225 | height: 42px; 226 | background-position: 0px -80px; 227 | } 228 | 229 | #nav-longest a img { 230 | width: 106px; 231 | height: 42px; 232 | } 233 | 234 | #search-button { 235 | position: absolute; 236 | bottom: 51px; 237 | right: 3px; 238 | width: 32px; 239 | height: 21px; 240 | } 241 | 242 | .search-input { 243 | position: absolute; 244 | bottom: 51px; 245 | right: 15px; 246 | width: 284px; 247 | height: 21px; 248 | background-position: 0px -123px; 249 | line-height: 21px; 250 | font-size: 7pt; 251 | color: #000; 252 | padding: 0px 10px 0px 10px; 253 | } 254 | 255 | #login { 256 | position: absolute; 257 | bottom: 49px; 258 | right: 310px; 259 | width: 120px; 260 | height: 18px; 261 | color: #999999; 262 | font-size: 9pt; 263 | } 264 | 265 | #login a { 266 | color:#f2f2f2; 267 | text-decoration: none; 268 | text-shadow: 0px 1px 1px #000; 269 | } 270 | 271 | #login a:hover { 272 | color:#f2f2f2; 273 | text-decoration:underline; 274 | } 275 | 276 | .search-types { 277 | color: #f2f2f2; 278 | font-size: 9pt; 279 | text-shadow: 0px 1px 1px #000; 280 | } 281 | 282 | #menu-videos { 283 | position: absolute; 284 | bottom: 78px; 285 | right: 260px; 286 | width: 50px; 287 | height: 15px; 288 | cursor: pointer; 289 | } 290 | 291 | #menu-pictures { 292 | position: absolute; 293 | bottom: 78px; 294 | right: 205px; 295 | width: 50px; 296 | height: 15px; 297 | cursor: pointer; 298 | } 299 | 300 | #menu-dvds { 301 | position: absolute; 302 | bottom: 78px; 303 | right: 152px; 304 | width: 40px; 305 | height: 15px; 306 | cursor: pointer; 307 | } 308 | 309 | #menu-members { 310 | position: absolute; 311 | bottom: 78px; 312 | right: 92px; 313 | width: 50px; 314 | height: 15px; 315 | cursor: pointer; 316 | } 317 | 318 | .search-selected { 319 | width: 9px; 320 | height: 4px; 321 | background-position: -289px -123px; 322 | } 323 | 324 | #menu-videos-s { 325 | position: absolute; 326 | bottom: 72px; 327 | right: 285px; 328 | width: 9px; 329 | height: 4px; 330 | } 331 | 332 | #menu-pictures-s { 333 | position: absolute; 334 | bottom: 72px; 335 | right: 230px; 336 | width: 9px; 337 | height: 4px; 338 | display: none; 339 | } 340 | 341 | #menu-dvds-s { 342 | position: absolute; 343 | bottom: 72px; 344 | right: 172px; 345 | width: 9px; 346 | height: 4px; 347 | display: none; 348 | } 349 | 350 | #menu-members-s { 351 | position: absolute; 352 | bottom: 72px; 353 | right: 112px; 354 | width: 9px; 355 | height: 4px; 356 | display: none; 357 | } 358 | 359 | #search-videos { 360 | } 361 | 362 | #search-pictures { 363 | display: none; 364 | } 365 | 366 | 367 | #search-dvds { 368 | display: none; 369 | } 370 | 371 | 372 | #search-members { 373 | display: none; 374 | } 375 | 376 | 377 | #details { 378 | margin: 0px 10px 0px 10px; 379 | min-width: 1000px; 380 | } 381 | 382 | #details-left { 383 | float: left; 384 | display: inline; 385 | width: 450px; 386 | height: 20px; 387 | line-height: 20px; 388 | color: #000; 389 | font-size: 9pt; 390 | margin: 10px 0px 0px 10px; 391 | } 392 | 393 | #details-right { 394 | float: right; 395 | display: inline; 396 | width: 470px; 397 | height: 20px; 398 | line-height: 20px; 399 | color: #000; 400 | text-align: right; 401 | font-size: 9pt; 402 | margin: 10px 0px 0px 10px; 403 | padding-right: 10px; 404 | } 405 | 406 | 407 | 408 | /* Video Thumbs */ 409 | 410 | #thumb-container { 411 | margin: 0px 10px 0px 10px; 412 | min-width: 1000px; 413 | } 414 | 415 | .thumb { 416 | position: relative; 417 | float: left; 418 | display: inline; 419 | width: 313px; 420 | height: 260px; 421 | margin: 0px 5px 6px 5px; 422 | font-size: 8pt; 423 | font-weight: bold; 424 | color: #FFF; 425 | padding: 5px; 426 | } 427 | 428 | .playicon { 429 | top: 6px; 430 | left: 6px; 431 | position: absolute; 432 | width: 310px; 433 | height: 235px; 434 | z-index: 2; 435 | } 436 | 437 | .playicon a img { 438 | border: 0px; 439 | width: 310px; 440 | height: 235px; 441 | } 442 | 443 | .thumb a img { 444 | border-style: thin; 445 | border-width: 1px; 446 | border-color: #646464; 447 | } 448 | 449 | .thumb-title { 450 | width: 305px; 451 | height: 10px; 452 | padding: 3px; 453 | color: #005f6d; 454 | text-align: center; 455 | font-size: 11pt; 456 | margin-bottom: 10px; 457 | } 458 | 459 | .thumb-title a { 460 | color:#005f6d; 461 | text-decoration:none; 462 | } 463 | 464 | .thumb-title a:hover{ 465 | color:#005f6d; 466 | text-decoration:underline; 467 | } 468 | 469 | .thumb-length { 470 | float: left; 471 | display: inline; 472 | height: 14px; 473 | width: 93px; 474 | color: #000; 475 | font-size: 11pt; 476 | } 477 | 478 | .thumb-views { 479 | float: left; 480 | display: inline; 481 | height: 14px; 482 | width: 113px; 483 | color: #000; 484 | font-size: 11pt; 485 | margin-left: 10px; 486 | } 487 | 488 | .thumb-stars-5 { 489 | float: left; 490 | display: inline; 491 | height: 14px; 492 | width: 85px; 493 | margin-left: 10px; 494 | background-position: 0px -146px; 495 | } 496 | 497 | .thumb-stars-4 { 498 | float: left; 499 | display: inline; 500 | height: 14px; 501 | width: 85px; 502 | margin-left: 10px; 503 | background-position: 0px -160px; 504 | } 505 | 506 | .thumb-stars-3 { 507 | float: left; 508 | display: inline; 509 | height: 14px; 510 | width: 85px; 511 | margin-left: 10px; 512 | background-position: 0px -174px; 513 | } 514 | 515 | .thumb-stars-2 { 516 | float: left; 517 | display: inline; 518 | height: 14px; 519 | width: 85px; 520 | margin-left: 10px; 521 | background-position: 0px -188px; 522 | } 523 | 524 | .thumb-stars-1 { 525 | float: left; 526 | display: inline; 527 | height: 14px; 528 | width: 85px; 529 | margin-left: 10px; 530 | background-position: 0px -202px; 531 | } 532 | 533 | 534 | /* Player Page */ 535 | 536 | #player-container { 537 | position: relative; 538 | margin: 10px 40px 30px 40px; 539 | min-width: 1000px; 540 | } 541 | 542 | #player-left { 543 | position: absolute; 544 | top: 0px; 545 | left: 0px; 546 | width: 640px; 547 | height: 570px; 548 | } 549 | 550 | #player-right { 551 | min-width: 330px; 552 | height: 515px; 553 | margin: 0px 0px 0px 650px; 554 | padding-top: 29px; 555 | overflow: hidden; 556 | } 557 | 558 | #video-title { 559 | font-size: 14pt; 560 | font-weight: bold; 561 | color: #005f6d; 562 | margin: 0px 0px 10px 0px; 563 | } 564 | 565 | #videoplayer { 566 | width: 640px; 567 | height: 518px; 568 | background-color: #000; 569 | } 570 | 571 | #description { 572 | width: 640px; 573 | color: #fff; 574 | font-size: 10pt; 575 | padding: 5px 0px 5px 0px; 576 | } 577 | 578 | .random_thumb a img { 579 | float: left; 580 | display: inline; 581 | width: 150px; 582 | height: 114px; 583 | margin: 0px 15px 15px 0px; 584 | } 585 | 586 | #register-iframe { 587 | margin: 0px auto 0px auto; 588 | text-align: left; 589 | width: 1000px; 590 | } 591 | 592 | .photo_thumbs { 593 | float: left; 594 | display: inline; 595 | width: 255px; 596 | height: 260px; 597 | margin: 10px 10px 10px 0px; 598 | } 599 | 600 | .photo { 601 | width: 250px; 602 | height: 200px; 603 | line-height: 200px; 604 | display: inline-block; 605 | text-align: center; 606 | } 607 | 608 | .photo a img { 609 | vertical-align: middle; 610 | } 611 | 612 | 613 | .photo-title { 614 | width: 250px; 615 | height: 10px; 616 | padding: 3px; 617 | color: #FFF; 618 | text-align: center; 619 | font-size: 11pt; 620 | margin-bottom: 10px; 621 | } 622 | 623 | .photo-title a { 624 | color:#FFF; 625 | text-decoration:none; 626 | } 627 | 628 | .photo-title a:hover{ 629 | color:#FFF; 630 | text-decoration:underline; 631 | } 632 | 633 | .photo-num { 634 | float: left; 635 | display: inline; 636 | height: 14px; 637 | color: #605f5f; 638 | font-size: 10pt; 639 | line-height: 14px; 640 | } 641 | 642 | .photo-views { 643 | float: left; 644 | display: inline; 645 | height: 14px; 646 | color: #605f5f; 647 | font-size: 10pt; 648 | margin-left: 9px; 649 | line-height: 14px; 650 | } 651 | #footer { 652 | margin: 10px; 653 | font-size: 8pt; 654 | text-align: center; 655 | } 656 | 657 | #footer a { 658 | color:#000; 659 | text-decoration:none; 660 | } 661 | 662 | #footer a:hover{ 663 | color:#ff00ba; 664 | text-decoration:underline; 665 | } 666 | 667 | 668 | /* New Player */ 669 | 670 | #js-player-bar, 671 | .js-playicon-a, 672 | .js-playicon-i, 673 | #js-small-thumb-play, 674 | #js-playicon-ie, 675 | #js-small-thumb-play-ie { 676 | background: none; 677 | border: none; 678 | background-image: url("jsplayer2.png"); 679 | background-repeat: no-repeat; 680 | } 681 | 682 | #js-preload { 683 | display: none; 684 | } 685 | 686 | #jsplayer { 687 | width: 640px; 688 | height: 518px; 689 | background-color: #000; 690 | } 691 | 692 | #js-player-thumb { 693 | position: relative; 694 | width: 640px; 695 | height: 480px; 696 | overflow: hidden; 697 | } 698 | 699 | #js-player-thumb img { 700 | width: 640px; 701 | height: 480px; 702 | margin: 0px; 703 | padding: 0px; 704 | outline: 0px; 705 | } 706 | 707 | #js-playicon { 708 | position: absolute; 709 | top: 195px; 710 | left: 270px; 711 | cursor: pointer; 712 | } 713 | 714 | .js-playicon-a { 715 | width: 110px; 716 | height: 111px; 717 | background-position: 0px -51px; 718 | } 719 | 720 | .js-playicon-i { 721 | width: 110px; 722 | height: 111px; 723 | background-position: -118px -51px; 724 | } 725 | 726 | #js-playicon-ie { 727 | position: absolute; 728 | top: 210px; 729 | left: 290px; 730 | cursor: pointer; 731 | width: 79px; 732 | height: 79px; 733 | background-position: 0px -216px; 734 | } 735 | 736 | #morevideos { 737 | display: none; 738 | position: fixed; /* keeps the lightbox window in the current viewport */ 739 | top: 0; 740 | left: 0; 741 | width: 90%; 742 | height: 90%; 743 | left: 50%; 744 | margin: 8% 0 0 -45%; 745 | /* background:url(overlay.png) repeat; */ 746 | background: rgba(3,0,0,0.7); 747 | text-align: center; 748 | z-index: 65535; 749 | 750 | border-radius: 5px 5px 5px 5px; 751 | -moz-border-radius: 5px 5px 5px 5px; 752 | -webkit-border-radius: 5px 5px 5px 5px; 753 | box-shadow:0 0 5px #ccc; 754 | -moz-box-shadow: 0 0 5px #ccc; 755 | -webkit-box-shadow: 0 0 5px #ccc; 756 | } 757 | 758 | /* registration page goo */ 759 | 760 | .accent1 { color:#28b7e8; } 761 | .accent2 { color:#28b7e8; } 762 | #container { width:1004px; margin:0 auto; } 763 | #box1 { width:976px; padding:12px; margin:0 0 10px 0; border:0px solid #FF2D5A; background-color:#ffffff; overflow:auto; } 764 | h1, h2 { margin:0; padding:0; } 765 | h1 { font-size:18px; font-weight:bold; text-align:center; color:#000000; padding:0 0 10px 0; } 766 | h2 { font-size:13px; font-weight:bold; text-align:center; color:#000000; } 767 | td.label { font-family:"lucida grande", tahoma, verdana, arial, sans-serif; width:80px; color:#000000; font-weight:normal; text-align:right; font-size:11px; } 768 | 769 | div.reginfo input { 770 | font-family:"lucida grande", tahoma, verdana, arial, sans-serif; 771 | width:220px; 772 | font-size:12px; 773 | text-align: left; 774 | } 775 | 776 | div.reginfo input:focus { 777 | background: none repeat scroll 0 0 #ffffff; 778 | border: 1px solid #FF2D5A; 779 | } 780 | div.reginfo input input[type=text] { font-size:20px; padding:0 0 0 5px; width:220px; border:1px solid #CCCCCC; background:#FFFFFF; } 781 | div.reginfo input input:focus { font-size:20px; padding:0 0 0 5px; width:220px; border:1px solid #FF2D5A; background:#ffffff; } 782 | div.reginfo form { margin:0 auto; } 783 | 784 | .bottom { 785 | font-size: 12px; 786 | } 787 | td.age { text-align:center; font-size:12px; color:#000000; padding:10px 0; } 788 | img.pic { 789 | padding: 0px; margin: 2px; 790 | } 791 | 792 | .rounded { 793 | 794 | background-color: #fff; 795 | 796 | margin: 0; 797 | 798 | border-radius: 5px 5px 5px 5px; 799 | -moz-border-radius: 5px 5px 5px 5px; 800 | -webkit-border-radius: 5px 5px 5px 5px; 801 | box-shadow:0 0 5px #ccc; 802 | -moz-box-shadow: 0 0 5px #ccc; 803 | -webkit-box-shadow: 0 0 5px #ccc; 804 | 805 | padding: 5px; 806 | } 807 | 808 | .reginfo { 809 | float: right; 810 | width: 950px; 811 | margin-bottom: 10px; 812 | } 813 | 814 | .hidden { 815 | display: none; 816 | } 817 | 818 | .clearfix:after { 819 | visibility: hidden; 820 | display: block; 821 | font-size: 0; 822 | content: " "; 823 | clear: both; 824 | height: 0; 825 | } 826 | -------------------------------------------------------------------------------- /public_html/main.css.bak: -------------------------------------------------------------------------------- 1 | /* 2 | Reset 3 | */ 4 | 5 | html, body, div, span, object, iframe, 6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 7 | abbr, address, cite, code, 8 | del, dfn, em, img, ins, kbd, q, samp, 9 | small, strong, sub, sup, var, 10 | b, i, 11 | dl, dt, dd, ol, ul, li, 12 | fieldset, form, label, legend, 13 | table, caption, tbody, tfoot, thead, 14 | article, aside, canvas, details, figcaption, figure, 15 | footer, header, hgroup, menu, nav, section, summary, 16 | time, mark, audio, video { 17 | margin:0; 18 | padding:0; 19 | border:0; 20 | outline:0; 21 | vertical-align:baseline; 22 | background:transparent; 23 | } 24 | 25 | body { 26 | line-height:1; 27 | } 28 | 29 | article,aside,canvas,details,figcaption,figure, 30 | footer,header,hgroup,menu,nav,section,summary { 31 | display:block; 32 | } 33 | 34 | nav ul { 35 | list-style:none; 36 | } 37 | 38 | blockquote, q { 39 | quotes:none; 40 | } 41 | 42 | blockquote:before, blockquote:after, 43 | q:before, q:after { 44 | content:''; 45 | content:none; 46 | } 47 | 48 | a { 49 | margin:0; 50 | padding:0; 51 | font-size:100%; 52 | vertical-align:baseline; 53 | background:transparent; 54 | } 55 | 56 | a { 57 | margin:0; 58 | padding:0; 59 | font-size:100%; 60 | vertical-align:baseline; 61 | background:transparent; 62 | } 63 | 64 | ins { 65 | color:#000; 66 | text-decoration:none; 67 | } 68 | 69 | mark { 70 | background-color:#fff; 71 | color:#000; 72 | font-style:italic; 73 | font-weight:bold; 74 | } 75 | 76 | del { 77 | text-decoration: line-through; 78 | } 79 | 80 | abbr[title], dfn[title] { 81 | border-bottom:1px dotted #000; 82 | cursor:help; 83 | } 84 | 85 | table { 86 | border-collapse:collapse; 87 | border-spacing:0; 88 | } 89 | 90 | hr { 91 | display:block; 92 | height:1px; 93 | border:0; 94 | border-top:1px solid #cccccc; 95 | margin:1em 0; 96 | padding:0; 97 | } 98 | 99 | input, select { 100 | vertical-align:middle; 101 | } 102 | 103 | /* Main */ 104 | body { 105 | font-family: Arial, Verdana, Helvetica, sans-serif; 106 | background-color: #cee7ff; 107 | } 108 | 109 | 110 | /* Sprites */ 111 | 112 | #logo, 113 | #nav-upload, 114 | #nav-community, 115 | #nav-photos, 116 | #nav-toprated, 117 | #nav-longest, 118 | .search-input, 119 | .search-selected, 120 | .thumb-stars-1, 121 | .thumb-stars-5, 122 | .thumb-stars-4, 123 | .thumb-stars-3, 124 | .thumb-stars-2 { 125 | background: none; 126 | border: none; 127 | background-image: url("sprites-3.png"); 128 | background-repeat: no-repeat; 129 | } 130 | 131 | 132 | #header { 133 | height: 100px; 134 | background-color: #1e1e1e; 135 | border-bottom: 1px solid #494848; 136 | background-image:url("headerbg2.png"); 137 | } 138 | 139 | #header-container { 140 | margin: 0px 10px 0px 10px; 141 | min-width: 1000px; 142 | } 143 | 144 | #logo { 145 | float: left; 146 | background-position: 0px 0px; 147 | width: 425px; 148 | height: 78px; 149 | margin: 15px 0px 0px 0px; 150 | } 151 | 152 | #logo a img { 153 | width: 425px; 154 | height: 78px; 155 | } 156 | 157 | #header-links { 158 | position: relative; 159 | float: right; 160 | width: 526px; 161 | height: 100px; 162 | } 163 | 164 | #nav-upload { 165 | position: absolute; 166 | bottom: 0px; 167 | right: 0px; 168 | width: 105px; 169 | height: 42px; 170 | background-position: -421px -80px; 171 | } 172 | 173 | #nav-upload a img { 174 | width: 105px; 175 | height: 42px; 176 | } 177 | 178 | #nav-community { 179 | position: absolute; 180 | bottom: 0px; 181 | right: 105px; 182 | width: 105px; 183 | height: 42px; 184 | background-position: -316px -80px; 185 | } 186 | 187 | #nav-community a img { 188 | width: 105px; 189 | height: 42px; 190 | } 191 | 192 | #nav-photos { 193 | position: absolute; 194 | bottom: 0px; 195 | right: 210px; 196 | width: 105px; 197 | height: 42px; 198 | background-position: -211px -80px; 199 | } 200 | 201 | #nav-photos a img { 202 | width: 105px; 203 | height: 42px; 204 | } 205 | 206 | #nav-toprated { 207 | position: absolute; 208 | bottom: 0px; 209 | right: 315px; 210 | width: 105px; 211 | height: 42px; 212 | background-position: -106px -80px; 213 | } 214 | 215 | #nav-toprated a img { 216 | width: 105px; 217 | height: 42px; 218 | } 219 | 220 | #nav-longest { 221 | position: absolute; 222 | bottom: 0px; 223 | right: 420px; 224 | width: 106px; 225 | height: 42px; 226 | background-position: 0px -80px; 227 | } 228 | 229 | #nav-longest a img { 230 | width: 106px; 231 | height: 42px; 232 | } 233 | 234 | #search-button { 235 | position: absolute; 236 | bottom: 51px; 237 | right: 3px; 238 | width: 32px; 239 | height: 21px; 240 | } 241 | 242 | .search-input { 243 | position: absolute; 244 | bottom: 51px; 245 | right: 15px; 246 | width: 284px; 247 | height: 21px; 248 | background-position: 0px -123px; 249 | line-height: 21px; 250 | font-size: 7pt; 251 | color: #000; 252 | padding: 0px 10px 0px 10px; 253 | } 254 | 255 | #login { 256 | position: absolute; 257 | bottom: 49px; 258 | right: 310px; 259 | width: 120px; 260 | height: 18px; 261 | color: #999999; 262 | font-size: 9pt; 263 | } 264 | 265 | #login a { 266 | color:#f2f2f2; 267 | text-decoration:none; 268 | } 269 | 270 | #login a:hover { 271 | color:#f2f2f2; 272 | text-decoration:underline; 273 | } 274 | 275 | .search-types { 276 | color: #f2f2f2; 277 | font-size: 9pt; 278 | text-shadow: 0px 1px 1px #000; 279 | } 280 | 281 | #menu-videos { 282 | position: absolute; 283 | bottom: 78px; 284 | right: 260px; 285 | width: 50px; 286 | height: 15px; 287 | cursor: pointer; 288 | } 289 | 290 | #menu-pictures { 291 | position: absolute; 292 | bottom: 78px; 293 | right: 205px; 294 | width: 50px; 295 | height: 15px; 296 | cursor: pointer; 297 | } 298 | 299 | #menu-dvds { 300 | position: absolute; 301 | bottom: 78px; 302 | right: 152px; 303 | width: 40px; 304 | height: 15px; 305 | cursor: pointer; 306 | } 307 | 308 | #menu-members { 309 | position: absolute; 310 | bottom: 78px; 311 | right: 92px; 312 | width: 50px; 313 | height: 15px; 314 | cursor: pointer; 315 | } 316 | 317 | .search-selected { 318 | width: 9px; 319 | height: 4px; 320 | background-position: -289px -123px; 321 | } 322 | 323 | #menu-videos-s { 324 | position: absolute; 325 | bottom: 72px; 326 | right: 285px; 327 | width: 9px; 328 | height: 4px; 329 | } 330 | 331 | #menu-pictures-s { 332 | position: absolute; 333 | bottom: 72px; 334 | right: 230px; 335 | width: 9px; 336 | height: 4px; 337 | display: none; 338 | } 339 | 340 | #menu-dvds-s { 341 | position: absolute; 342 | bottom: 72px; 343 | right: 172px; 344 | width: 9px; 345 | height: 4px; 346 | display: none; 347 | } 348 | 349 | #menu-members-s { 350 | position: absolute; 351 | bottom: 72px; 352 | right: 112px; 353 | width: 9px; 354 | height: 4px; 355 | display: none; 356 | } 357 | 358 | #search-videos { 359 | } 360 | 361 | #search-pictures { 362 | display: none; 363 | } 364 | 365 | 366 | #search-dvds { 367 | display: none; 368 | } 369 | 370 | 371 | #search-members { 372 | display: none; 373 | } 374 | 375 | 376 | #details { 377 | margin: 0px 10px 0px 10px; 378 | min-width: 1000px; 379 | } 380 | 381 | #details-left { 382 | float: left; 383 | display: inline; 384 | width: 450px; 385 | height: 20px; 386 | line-height: 20px; 387 | color: #000; 388 | font-size: 9pt; 389 | margin: 10px 0px 0px 10px; 390 | } 391 | 392 | #details-right { 393 | float: right; 394 | display: inline; 395 | width: 470px; 396 | height: 20px; 397 | line-height: 20px; 398 | color: #000; 399 | text-align: right; 400 | font-size: 9pt; 401 | margin: 10px 0px 0px 10px; 402 | padding-right: 10px; 403 | } 404 | 405 | 406 | 407 | /* Video Thumbs */ 408 | 409 | #thumb-container { 410 | margin: 0px 10px 0px 10px; 411 | min-width: 1000px; 412 | } 413 | 414 | .thumb { 415 | position: relative; 416 | float: left; 417 | display: inline; 418 | width: 313px; 419 | height: 260px; 420 | margin: 0px 5px 6px 5px; 421 | font-size: 8pt; 422 | font-weight: bold; 423 | color: #FFF; 424 | padding: 5px; 425 | } 426 | 427 | .playicon { 428 | top: 6px; 429 | left: 6px; 430 | position: absolute; 431 | width: 310px; 432 | height: 235px; 433 | z-index: 2; 434 | } 435 | 436 | .playicon a img { 437 | border: 0px; 438 | width: 310px; 439 | height: 235px; 440 | } 441 | 442 | .thumb a img { 443 | border-style: thin; 444 | border-width: 1px; 445 | border-color: #646464; 446 | } 447 | 448 | .thumb-title { 449 | width: 305px; 450 | height: 10px; 451 | padding: 3px; 452 | color: #005f6d; 453 | text-align: center; 454 | font-size: 11pt; 455 | margin-bottom: 10px; 456 | } 457 | 458 | .thumb-title a { 459 | color:#005f6d; 460 | text-decoration:none; 461 | } 462 | 463 | .thumb-title a:hover{ 464 | color:#005f6d; 465 | text-decoration:underline; 466 | } 467 | 468 | .thumb-length { 469 | float: left; 470 | display: inline; 471 | height: 14px; 472 | width: 93px; 473 | color: #000; 474 | font-size: 11pt; 475 | } 476 | 477 | .thumb-views { 478 | float: left; 479 | display: inline; 480 | height: 14px; 481 | width: 113px; 482 | color: #000; 483 | font-size: 11pt; 484 | margin-left: 10px; 485 | } 486 | 487 | .thumb-stars-5 { 488 | float: left; 489 | display: inline; 490 | height: 14px; 491 | width: 85px; 492 | margin-left: 10px; 493 | background-position: 0px -147px; 494 | } 495 | 496 | .thumb-stars-4 { 497 | float: left; 498 | display: inline; 499 | height: 14px; 500 | width: 85px; 501 | margin-left: 10px; 502 | background-position: 0px -161px; 503 | } 504 | 505 | .thumb-stars-3 { 506 | float: left; 507 | display: inline; 508 | height: 14px; 509 | width: 85px; 510 | margin-left: 10px; 511 | background-position: 0px -175px; 512 | } 513 | 514 | .thumb-stars-2 { 515 | float: left; 516 | display: inline; 517 | height: 14px; 518 | width: 85px; 519 | margin-left: 10px; 520 | background-position: 0px -189px; 521 | } 522 | 523 | /* Player Page */ 524 | 525 | #player-container { 526 | position: relative; 527 | margin: 10px 40px 30px 40px; 528 | min-width: 1000px; 529 | } 530 | 531 | #player-left { 532 | position: absolute; 533 | top: 0px; 534 | left: 0px; 535 | width: 640px; 536 | height: 570px; 537 | } 538 | 539 | #player-right { 540 | min-width: 330px; 541 | height: 515px; 542 | margin: 0px 0px 0px 650px; 543 | padding-top: 29px; 544 | overflow: hidden; 545 | } 546 | 547 | #video-title { 548 | font-size: 14pt; 549 | font-weight: bold; 550 | color: #005f6d; 551 | margin: 0px 0px 10px 0px; 552 | } 553 | 554 | #videoplayer { 555 | width: 640px; 556 | height: 518px; 557 | background-color: #000; 558 | } 559 | 560 | #description { 561 | width: 640px; 562 | color: #fff; 563 | font-size: 10pt; 564 | padding: 5px 0px 5px 0px; 565 | } 566 | 567 | .random_thumb a img { 568 | float: left; 569 | display: inline; 570 | width: 150px; 571 | height: 114px; 572 | margin: 0px 15px 15px 0px; 573 | } 574 | 575 | #register-iframe { 576 | margin: 0px auto 0px auto; 577 | text-align: left; 578 | width: 1000px; 579 | } 580 | 581 | .photo_thumbs { 582 | float: left; 583 | display: inline; 584 | width: 255px; 585 | height: 260px; 586 | margin: 10px 10px 10px 0px; 587 | } 588 | 589 | .photo { 590 | width: 250px; 591 | height: 200px; 592 | line-height: 200px; 593 | display: inline-block; 594 | text-align: center; 595 | } 596 | 597 | .photo a img { 598 | vertical-align: middle; 599 | } 600 | 601 | 602 | .photo-title { 603 | width: 250px; 604 | height: 10px; 605 | padding: 3px; 606 | color: #FFF; 607 | text-align: center; 608 | font-size: 11pt; 609 | margin-bottom: 10px; 610 | } 611 | 612 | .photo-title a { 613 | color:#FFF; 614 | text-decoration:none; 615 | } 616 | 617 | .photo-title a:hover{ 618 | color:#FFF; 619 | text-decoration:underline; 620 | } 621 | 622 | .photo-num { 623 | float: left; 624 | display: inline; 625 | height: 14px; 626 | color: #605f5f; 627 | font-size: 10pt; 628 | line-height: 14px; 629 | } 630 | 631 | .photo-views { 632 | float: left; 633 | display: inline; 634 | height: 14px; 635 | color: #605f5f; 636 | font-size: 10pt; 637 | margin-left: 9px; 638 | line-height: 14px; 639 | } 640 | #footer { 641 | margin: 10px; 642 | font-size: 8pt; 643 | text-align: center; 644 | } 645 | 646 | #footer a { 647 | color:#000; 648 | text-decoration:none; 649 | } 650 | 651 | #footer a:hover{ 652 | color:#ff00ba; 653 | text-decoration:underline; 654 | } 655 | 656 | 657 | /* New Player */ 658 | 659 | #js-player-bar, 660 | .js-playicon-a, 661 | .js-playicon-i, 662 | #js-small-thumb-play, 663 | #js-playicon-ie, 664 | #js-small-thumb-play-ie { 665 | background: none; 666 | border: none; 667 | background-image: url("jsplayer2.png"); 668 | background-repeat: no-repeat; 669 | } 670 | 671 | #js-preload { 672 | display: none; 673 | } 674 | 675 | #jsplayer { 676 | width: 640px; 677 | height: 518px; 678 | background-color: #000; 679 | } 680 | 681 | #js-player-thumb { 682 | position: relative; 683 | width: 640px; 684 | height: 480px; 685 | overflow: hidden; 686 | } 687 | 688 | #js-player-thumb img { 689 | width: 640px; 690 | height: 480px; 691 | margin: 0px; 692 | padding: 0px; 693 | outline: 0px; 694 | } 695 | 696 | #js-playicon { 697 | position: absolute; 698 | top: 195px; 699 | left: 270px; 700 | cursor: pointer; 701 | } 702 | 703 | .js-playicon-a { 704 | width: 110px; 705 | height: 111px; 706 | background-position: 0px -51px; 707 | } 708 | 709 | .js-playicon-i { 710 | width: 110px; 711 | height: 111px; 712 | background-position: -118px -51px; 713 | } 714 | 715 | #js-playicon-ie { 716 | position: absolute; 717 | top: 210px; 718 | left: 290px; 719 | cursor: pointer; 720 | width: 79px; 721 | height: 79px; 722 | background-position: 0px -216px; 723 | } 724 | 725 | #js-loading { 726 | position: absolute; 727 | top: 0px; 728 | left: 0px; 729 | width: 640px; 730 | height: 480px; 731 | background-color: #000; 732 | z-index: 4; 733 | display: none; 734 | } 735 | 736 | #js-loading img { 737 | width: 640px; 738 | height: 480px; 739 | } 740 | 741 | #js-reg { 742 | position: absolute; 743 | top: 50px; 744 | left: 50px; 745 | width: 540px; 746 | height: 380px; 747 | background-color: #000; 748 | z-index: 5; 749 | display: none; 750 | } 751 | 752 | #js-reg-container { 753 | position: relative; 754 | width: 540px; 755 | height: 380px; 756 | } 757 | 758 | #js-reg-header { 759 | position: absolute; 760 | top: 20px; 761 | left: 20px; 762 | font-family: arial,helvetica,clean,sans-serif; 763 | font-weight: bold; 764 | font-size: 24pt; 765 | color: #FFF; 766 | width: 500px; 767 | height: 40px; 768 | } 769 | 770 | #js-small-thumb { 771 | position: absolute; 772 | top: 85px; 773 | left: 20px; 774 | width: 240px; 775 | height: 182px; 776 | z-index: 6; 777 | cursor: pointer; 778 | } 779 | 780 | #js-small-thumb img { 781 | width: 240px; 782 | height: 182px; 783 | cursor: pointer; 784 | } 785 | 786 | #js-small-thumb-play { 787 | position: absolute; 788 | top: 160px; 789 | left: 115px; 790 | width: 41px; 791 | height: 41px; 792 | background-position: 0px -166px; 793 | z-index: 7; 794 | cursor: pointer; 795 | } 796 | 797 | #js-small-thumb-play-ie { 798 | position: absolute; 799 | top: 163px; 800 | left: 125px; 801 | width: 38px; 802 | height: 38px; 803 | background-position: 0px -300px; 804 | z-index: 7; 805 | cursor: pointer; 806 | } 807 | 808 | #js-reg-note { 809 | position: absolute; 810 | top: 85px; 811 | right: 35px; 812 | color: #fff; 813 | width: 220px; 814 | height: 90px; 815 | font-size: 16pt; 816 | font-family: arial,helvetica,clean,sans-serif; 817 | font-weight:bold; 818 | text-align: center; 819 | z-index: 6; 820 | } 821 | 822 | #js-reg-line { 823 | position: absolute; 824 | top: 180px; 825 | right: 35px; 826 | height: 2px; 827 | width: 220px; 828 | padding: 0px; 829 | background-color: #fff; 830 | z-index: 6; 831 | } 832 | 833 | #js-reg-free { 834 | position: absolute; 835 | top: 193px; 836 | right: 35px; 837 | color: #fff; 838 | width: 220px; 839 | height: 85px; 840 | font-size: 25pt; 841 | font-family: arial,helvetica,clean,sans-serif; 842 | font-weight:bold; 843 | text-align: center; 844 | z-index: 6; 845 | } 846 | 847 | #js-player-bar { 848 | position: relative; 849 | width: 640px; 850 | height: 38px; 851 | background-position: 0px 0px; 852 | margin: 0px; 853 | padding: 0px; 854 | outline: 0px; 855 | } 856 | 857 | #js-playbar { 858 | position: absolute; 859 | top: 0px; 860 | left: 0px; 861 | width: 54px; 862 | height: 38px; 863 | cursor: pointer; 864 | } 865 | 866 | #js-reddot { 867 | position: absolute; 868 | top: 9px; 869 | left: 60px; 870 | width: 19px; 871 | height: 19px; 872 | cursor: pointer; 873 | } 874 | 875 | #js-time { 876 | position: absolute; 877 | top: 12px; 878 | right: 60px; 879 | width: 80px; 880 | height: 18px; 881 | font-size: 8pt; 882 | color: #fff; 883 | font-family: arial,helvetica,clean,sans-serif; 884 | text-align: center; 885 | font-weight: bold; 886 | } 887 | 888 | #js-hd { 889 | position: absolute; 890 | top: 0px; 891 | right: 0px; 892 | width: 59px; 893 | height: 38px; 894 | cursor: pointer; 895 | } 896 | 897 | #js-reglink { 898 | position: absolute; 899 | bottom: 25px; 900 | left: 45px; 901 | font-size:30pt; 902 | outline:none; 903 | font-family: arial,helvetica,clean,sans-serif; 904 | font-weight:bold; 905 | line-height:1; 906 | text-shadow:0 -1px 1px rgba(0, 0, 0, 0.25); 907 | z-index: 6; 908 | cursor: pointer; 909 | } 910 | 911 | #js-reglink { 912 | -moz-border-radius:5px; 913 | -khtml-border-radius:5px; 914 | -webkit-border-radius:5px; 915 | border-radius:4px; 916 | -moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.5); 917 | -webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.5); 918 | border:0 none; 919 | color:#FFFFFF; 920 | cursor:pointer; 921 | display:inline-block; 922 | padding:5px 10px 5px 10px; 923 | text-decoration:none; 924 | text-shadow:0 -1px 1px rgba(0, 0, 0, 0.25); 925 | background-color: #fd34b9; 926 | cursor: pointer; 927 | } 928 | 929 | #js-reglink:hover { 930 | background-color:#f96cd6; 931 | cursor: pointer; 932 | } 933 | 934 | -------------------------------------------------------------------------------- /public_html/payment.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # request a one-time-use payment address from blockchain.info 4 | # handle notification from blockchain.info that payment was made to that address and add value to a users account 5 | 6 | # TODO would be better if we could COMET long poll on payment to that address, returning success when it happens or fail/retry after a timeout period, rather than polling 7 | 8 | use strict; 9 | use warnings; 10 | 11 | use CGI; 12 | use CGI::Carp 'fatalsToBrowser'; 13 | 14 | use MD5; 15 | use JSON::PP; 16 | use Data::Dumper; 17 | use LWP; 18 | use LWP::UserAgent; 19 | use IO::Handle; 20 | 21 | use lib '..'; 22 | use template; 23 | use query; 24 | use config; 25 | 26 | my $action = CGI::param('action') || 'view'; 27 | 28 | sub hash1 { hash( $_[0], $config::hash1); } 29 | sub hash2 { hash( $_[0], $config::hash2); } 30 | 31 | sub hash { 32 | my $user_id = shift; 33 | my $secret = shift; 34 | my $md5 = MD5->new; 35 | $md5->reset(); 36 | $md5->add( $user_id . $secret); 37 | return $md5->hexdigest(); 38 | } 39 | 40 | if( $action eq 'payment' ) { 41 | 42 | # process a payment notification callback from blockchain.info 43 | 44 | # from https://blockchain.info/api/api_receive: 45 | 46 | # value The value of the payment received in satoshi. Divide by 100000000 to get the value in BTC. 47 | # input_address The bitcoin address that received the transaction. 48 | # confirmations The number of confirmations of this transaction. 49 | # {Custom Parameters} Any parameters included in the callback URL will be passed back to the callback URL in the notification. 50 | # transaction_hash The transaction hash. 51 | # input_transaction_hash The original paying in hash before forwarding. 52 | # destination_address The destination bitcoin address. Check this matches your address. 53 | 54 | my $user_id = CGI::param('user_id'); 55 | my $hash = CGI::param('hash'); 56 | 57 | my ($user) = query("select * from users where id = ?", $user_id); 58 | 59 | exit if ! $user; # not just forged but completely bunk; TODO log this somewhere 60 | 61 | if( hash1( $user_id ) ne $hash ) { 62 | $user->debug = "hash wrong on callback from blockchain.info"; 63 | $user->write('users'); 64 | exit; 65 | } 66 | 67 | my $btc = CGI::param('value') / 100_000_000; # in satoshis; convert to BTC; right now, 0.0005, the smallest supported transaction, is about 15 cents. 68 | my $usd = $btc * 300; # approximately convert from BTC to USD 69 | my $bytes_purchased = $usd * 1 * 1024 * 1024 * 1024; # one gigabyte per dollar 70 | 71 | $user->bytes_purchased += $bytes_purchased; 72 | $user->debug = "purchased $btc BTC worth of data"; 73 | $user->payment_status = "Got payment"; 74 | $user->write; 75 | 76 | # generate some output so the proxy doesn't get impatiant and time out right away 77 | 78 | STDOUT->autoflush(1); 79 | print "Content-type: text/plain\r\n\r\n"; 80 | 81 | if($user->referer) { 82 | # if the user has a referer (address) marked, pay out half of the take to that 83 | my $tx = CGI::param('transaction_hash'); 84 | my $address = $user->referer; 85 | my $amount = $btc / 2; 86 | my $hash = hash2("$address-$amount"); 87 | my $res; 88 | eval { 89 | my $ua = LWP::UserAgent->new(); 90 | my $req = HTTP::Request->new( GET => "http://$config::fullnodeip/btc.cgi?txid=$tx&address=$address&amount=$amount&hash=$hash" ); 91 | $res = $ua->request($req); 92 | }; 93 | if( $@ ) { 94 | $user->payment_status = "Got payment; referal fee on $btc btc from txid $tx failed: eval error " . $@; 95 | } elsif( $res and $res->is_error ) { 96 | $user->payment_status = "Got payment; referal fee on $btc btc from txid $tx failed: HTTP code " . $res->code; 97 | } elsif( $res and $res->content =~ m/Software error/ ) { 98 | #

Software error:

99 | #
no unspent output big enough or maybe at all at /home/user//btcrpc.pm line 92.
100 |             # 
101 | ( my $error ) = $res->content =~ m{
.*?
}sg; 102 | $error ||= $res->content; 103 | $user->payment_status = "Got payment; referal fee on $btc btc from txid $tx failed: error message " . $error; 104 | } elsif( $res ) { 105 | ( my $success ) = $res->content =~ m{.*?}sg; 106 | $success ||= $res->content; 107 | $user->payment_status = "Got payment; referal fee on $btc btc on txid $tx paid: tx " . $success; 108 | } else { 109 | $user->payment_status = "Got payment; referal fee on $btc btc on txid $tx paid: status unknown"; 110 | } 111 | $user->write; 112 | if( $res and $res->content ) { 113 | open my $fh, '>>', $config::home . '/debug.log'; 114 | print $fh $res->content; 115 | close $fh; 116 | } 117 | } 118 | 119 | # record this purchase in the purchases table as well 120 | 121 | eval { 122 | query( "insert into purchases (user_id, bytes_purchased, btc) values (?, ?, ?)", $user_id, $bytes_purchased, $btc, ); 123 | }; 124 | 125 | print "*ok*\n"; 126 | 127 | } elsif( $action eq 'check') { 128 | 129 | my $user = user() or die "no user"; 130 | 131 | print "Content-type: application/json\r\n\r\n"; 132 | 133 | if( $user->payment_status =~ m/Got payment/ ) { 134 | print encode_json { paid => 1, }; 135 | } else { 136 | print encode_json { paid => 0, }; 137 | } 138 | 139 | } else { 140 | 141 | # request a one time use bitcoin address from blockchain.info for this user to send payment to 142 | 143 | print "Content-type: application/json\r\n\r\n"; 144 | 145 | my $user = user() or die "no user"; 146 | 147 | my $error = sub { 148 | my $message = shift; 149 | print encode_json { error => $message, }; 150 | $user->debug = $message; 151 | $user->write; 152 | exit; 153 | }; 154 | 155 | $user->cookie or $error->("Error: you can only add value to your account if you have an account and are logged in.\n"); 156 | 157 | # hash stuff to avoid spoofed requests 158 | 159 | my $user_id = $user->id; 160 | my $hash = hash1($user_id); 161 | 162 | # make a request to blockchain.info to create a payment address and request callback when funds arrive there 163 | 164 | my $ua = LWP::UserAgent->new(); 165 | 166 | my $callback_url = "$config::url/payment.cgi?action=payment&user_id=$user_id&hash=$hash"; 167 | 168 | my $req = HTTP::Request->new( GET => 'http://blockchain.info/api/receive?method=create&address=$config::address&callback=' . CGI::escape($callback_url) ); 169 | 170 | my $res = $ua->request($req); 171 | 172 | $res->is_error and $error->("Payment request error: " . $res->decoded_content); 173 | 174 | # print "response as_string: " . $res->as_string; 175 | # print "response: " . $res->decoded_content; 176 | # response looks like: {"input_address":"11VHvSHS9fnMPYSzzi72zkyqtaPWvG7mf","destination":"16WTNrktpQqTmxoqQMDccwp5RSmbhM2zub","fee_percent":0} 177 | 178 | my $payment_info = decode_json( $res->decoded_content ) or $error->("Error: no JSON data back from blockchain.info"); 179 | 180 | $payment_info->{input_address} or $error->("Error: no input_address field back from blockchain.info"); 181 | 182 | # re-use the same JSON message we got back from blockchain.info and return that to the webapp 183 | 184 | print $res->decoded_content; 185 | 186 | $user->payment_status = "Waiting for payment to " . $payment_info->{input_address} . " callback url " . $callback_url; 187 | $user->write; 188 | 189 | } 190 | -------------------------------------------------------------------------------- /public_html/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/play.png -------------------------------------------------------------------------------- /public_html/predict.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # generate a set of predicted movie ratings for users who have rated some movies 4 | 5 | use strict; 6 | use warnings; 7 | 8 | use lib '..'; 9 | use config; 10 | use template; 11 | use query; 12 | 13 | use CGI; 14 | use CGI::Carp 'fatalsToBrowser'; 15 | 16 | use JSON::PP; 17 | use Data::Dumper; 18 | 19 | my ($num_users) = query( "select count(*) as num from users", sub { $_[0]->num }, ); 20 | my ($num_movies) = query( "select count(*) as num from movies where disabled is null", sub { $_[0]->num }, ); 21 | 22 | # 23 | 24 | print "Content-type: text/plain\r\n\r\n"; 25 | 26 | *STDERR = *STDOUT; # debugging 27 | 28 | # use lib $config::home . '/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/'; # have to do something like this for shared hosting 29 | 30 | use Math::Preference::SVD; 31 | 32 | print "ok\n"; 33 | 34 | # build a list of users who we can build predictions for 35 | 36 | my $ratings = query( "select * from ratings" ); 37 | 38 | my %users_who_have_rated_something; 39 | for my $rating ( @$ratings ) { 40 | $users_who_have_rated_something{ $rating->{user_id} }++; # TODO could use this to restrict who gets ratings (eg three or more movies) 41 | } 42 | 43 | # convert our ratings to what M::P::SVD wants 44 | 45 | my @ratings = map [ $_->{user_id}, $_->{movie_id}, $_->{rating} ], @$ratings; 46 | 47 | my $svd = Math::Preference::SVD->new; 48 | 49 | $svd->set_ratings( \@ratings, ); 50 | 51 | # regenerate the predictions from scratch 52 | 53 | query( "delete from predictions" ); 54 | 55 | my $num_predictions = 0; 56 | 57 | for my $movie_id ( 0 .. $num_movies-1 ) { 58 | for my $user_id ( sort { $a <=> $b } keys %users_who_have_rated_something ) { 59 | # "predict_rating() takes movie_id then cust_id -- yes, this seems backward to me too" 60 | my $predicted_rating = int( 0.5 + $svd->predict_rating($movie_id, $user_id) ); # the 0.5 is supposed to round to the nearest star; without it, int() would just truncate 61 | $num_predictions++; 62 | query( "insert into predictions (rating, user_id, movie_id) values (?, ?, ?)", $predicted_rating, $user_id, $movie_id ); 63 | } 64 | } 65 | 66 | print "$num_predictions predictions made on $num_movies movies for @{[ scalar keys %users_who_have_rated_something ]} out of $num_users users\n"; 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /public_html/rate.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use CGI; 7 | use CGI::Carp 'fatalsToBrowser'; 8 | 9 | use JSON::PP; 10 | 11 | use lib '..'; 12 | use config; 13 | use template; 14 | use query; 15 | 16 | # 17 | # 18 | # 19 | 20 | print "Content-type: application/json\r\n\r\n"; 21 | 22 | sub error { 23 | my $message = shift; 24 | print encode_json { error => $message, }; 25 | exit; 26 | } 27 | 28 | # 29 | # get the user_id of the user 30 | # 31 | 32 | my $user = user() or error "Can't find a user"; 33 | my $user_id = $user->id or error "no user_id"; 34 | 35 | # 36 | # get the specified movie and number of stars 37 | # 38 | 39 | my $movie_id = CGI::param('movie_id'); 40 | defined $movie_id or error "No id of a movie passed"; 41 | my $movies = movie($movie_id) or error("can't find movie of that id"); 42 | 43 | my $stars = CGI::param('stars') or error "No value passed for stars"; 44 | grep $stars eq $_, 1, 2, 3, 4, 5 or error "Can only rate things 1, 2, 3, 4, or 5 stars"; 45 | 46 | # 47 | # record this ranking keyed by this user for this movie so they can't vote twice 48 | # 49 | 50 | my ($existing_movie_rating_by_this_user) = query( "select * from ratings where user_id = ? and movie_id = ? ", $user_id, $movie_id ); 51 | 52 | if( $existing_movie_rating_by_this_user ) { 53 | # update an existing rating 54 | query( "update ratings set rating = ? where user_id = ? and movie_id = ?", $stars, $user_id, $movie_id ); 55 | } else { 56 | # add a new rating 57 | query( "insert into ratings (rating, user_id, movie_id) values (?, ?, ?)", $stars, $user_id, $movie_id ); 58 | } 59 | 60 | # update the ranking of the movie 61 | # average all of the rankings; slow 62 | 63 | my ($movie_rating) = query( "select sum(rating) / count(*) as movie_rating from ratings where movie_id = ?", $movie_id, sub { $_->{movie_rating} + 0.5 }, ); # round to nearest number of stars 64 | $movie_rating = int $movie_rating; 65 | 66 | query( "update movies set stars = ? where id = ?", $movie_rating, $movie_id ); 67 | 68 | print encode_json { ok => 1, }; 69 | 70 | # 71 | # experimental: re-run predictions after every vote 72 | # 73 | 74 | close STDOUT; 75 | open STDOUT, '>>', $config::home . '/predict.log'; 76 | 77 | exec '/usr/bin/perl', 'predict.cgi'; 78 | -------------------------------------------------------------------------------- /public_html/register.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use CGI; 7 | use CGI::Carp 'fatalsToBrowser'; 8 | 9 | use lib '..'; 10 | use config; 11 | use template; 12 | 13 | use List::Util 'shuffle'; 14 | 15 | # 16 | # figure out if the user is out of data 17 | # 18 | 19 | my $user = user(); 20 | my $out_of_data = 0; 21 | 22 | # 23 | # need movies just to show the number of movies in the outer template 24 | # 25 | 26 | my $movies = movies(); 27 | 28 | # 29 | # 30 | # 31 | 32 | my $action = CGI::param('action') || 'view'; 33 | 34 | my $code = 'OK'; 35 | my $password = $user->cookie; 36 | my $old_user = $user; 37 | 38 | # 39 | # handle login attempts 40 | # 41 | 42 | if( $action eq 'login' ) { 43 | 44 | # log in to an existing account 45 | 46 | # this is run when the user types in their passphrase to the login box 47 | # the user never picks their passphrase. it's assigned to them and they can't change it. 48 | 49 | my $password = CGI::param('password'); 50 | if( ! $password or ! length($password) ) { 51 | print "Content-type: text/html\r\n\r\n"; 52 | $code = 'BADPASS'; 53 | } else { 54 | # the user gave a password of some sort 55 | # see if we can find a user in the database with that password 56 | # if so, replace the user object with that one for the purpose of rendering the rest of the page, and set a cookie too 57 | # note that users only credential is this password (passphrase, actually) 58 | # it's used as the contents of the cookie and it's what they enter to get their cookie back 59 | # also note that $password is not escaped, so we cannot use string inteporation to send it as SQL 60 | # sending it as a binary parameter should be fine 61 | ($user) = query( "select * from users where cookie = ? ", $password, ); # their password is in their cookie 62 | if( $user ) { 63 | # did find a user in the database with the specified passphrase 64 | my $cookie = CGI::cookie( -name => 'account', -value => $user->cookie, -expires => '+1y', ); 65 | $password = $user->cookie; # for display below 66 | print "Content-type: text/html\r\n"; 67 | print "Set-Cookie: " . $cookie . "\r\n"; 68 | print "\r\n"; 69 | $code = 'LOGGEDIN'; 70 | } else { 71 | # did not find a user in the database with the specified passphrase 72 | print "Content-type: text/html\r\n\r\n"; 73 | $code = 'NOTFOUND'; 74 | $user = $old_user; 75 | } 76 | } 77 | 78 | } elsif( $action eq 'register' ) { 79 | 80 | # create a new account 81 | 82 | if( $user->cookie ) { 83 | 84 | print "Content-type: text/plain\r\n\r\n"; 85 | print "Already registered.\n"; # shouldn't reach here 86 | exit; 87 | 88 | } 89 | 90 | # generate a random passphrase made out of lower case words of between 4 and 8 letters 91 | 92 | open my $fh, '<', $config::home . '/words' or die $!; 93 | my @words = shuffle( grep m/^[a-z]{4,8}$/, map { chomp; $_; } readline $fh ); 94 | $password = join ' ', @words[1..5]; 95 | 96 | # change this user record to match on their new cookie (cookie is the same as their password) instead of ip; 97 | # create a new user record for that IP address without a data allocation to avoid cookie deleting attacks 98 | # (if we simply didn't create a new user for that IP address, one would automatically be created for anyone coming from that IP without a cookie, and it would have a default data allocation) 99 | 100 | # each user record should have either a value in the ip field or a value in the cookie (password) field 101 | # anonymous users are looked up by ip for the sake of leech protection and metering their allocation of free data 102 | # registered users are looked up by cookie 103 | 104 | query( "insert into users (ip, debug, bytes_purchased, bytes_used) values (?, ?, ?, ?)", $user->ip, "Created when user " . $user->id . " registered", 0, 0 ); 105 | 106 | query( "update users set ip = '', cookie = ?, debug = ? where id = ?", $password, 'Registered at ' . time, $user->id, ); 107 | ($user) = query( "select * from users where id = ?", $user->id, ); # re-fetch the record 108 | 109 | my $cookie = CGI::cookie( -name => 'account', -value => $user->cookie, -expires => '+1y', ); 110 | print "Content-type: text/html\r\n"; 111 | print "Set-Cookie: " . $cookie . "\r\n"; 112 | print "Location: http://$ENV{SERVER_NAME}/register.cgi\r\n"; # get rid of the CGI parameter 113 | print "\r\n"; 114 | 115 | exit; 116 | 117 | 118 | } else { 119 | 120 | # no action; just viewing the page 121 | 122 | print "Content-type: text/html\r\n\r\n"; 123 | 124 | } 125 | 126 | my $bytes_used = $user->bytes_used; 127 | my $bytes_purchased = $user->bytes_purchased; 128 | 129 | if( $bytes_used > $bytes_purchased ) { 130 | $out_of_data = 1; 131 | } 132 | 133 | # 134 | # totally money raised by the site (ha) 135 | # 136 | 137 | my ($total_raised) = query( "select sum(btc) as total_raised from purchases", sub { $_[0]->total_raised }, ); 138 | $total_raised = sprintf "%.2f\n", $total_raised; 139 | 140 | # 141 | # show registratoin 142 | # 143 | 144 | my $clip = <<'EOF'; 145 | 146 | 147 | 148 |
149 | 150 | 166 | 167 |
168 | 169 |
170 |
171 | 172 |
173 | 174 | 175 | 176 |
177 | Account Status

178 |
179 | 180 | 181 | 182 |
Purchased Used
:gigs_purchased: GB :gigs_used: GB
183 |
184 |
185 | 186 | 187 | We're a better porn site, with no ads, no fake videos that don't exist, and no auto-renew.

188 | :total_raised: BTC from memberships help offset our annual 0.8877 BTC hosting costs.
189 |
190 |
191 | 192 | 195 | 196 | 199 | 200 | 203 | 204 | 212 | 213 | 222 | 223 | 228 | 229 | 231 | 232 | 238 | 239 | 243 | 244 | 245 | 246 |
247 | 248 | 249 | 343 | 344 | 345 | EOF 346 | 347 | # 348 | # 349 | # 350 | 351 | my $content = template( 352 | $clip, { 353 | logged_in => ($user->cookie ? 1 : 0), 354 | code => $code, 355 | gigs_used => sprintf( "%.2f", $bytes_used / 1024 / 1024 / 1024 ), 356 | gigs_purchased => sprintf( "%.2f", $bytes_purchased / 1024 / 1024 / 1024 ), 357 | out_of_data => $out_of_data, 358 | password => $password, 359 | total_raised => $total_raised, 360 | # promo_movies1 => some_movies( $movies, 2 ), # just using static images to avoid movie play clutter 361 | # promo_movies2 => some_movies( $movies, 2 ), 362 | }, 363 | ); 364 | 365 | print template( undef, { 366 | content => $content, 367 | num_videos => $movies->num_rows, 368 | logged_in => ($user->cookie ? 1 : 0), 369 | } ); 370 | 371 | 372 | -------------------------------------------------------------------------------- /public_html/register.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/register.gif -------------------------------------------------------------------------------- /public_html/rta.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/rta.gif -------------------------------------------------------------------------------- /public_html/skin/img/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/black.png -------------------------------------------------------------------------------- /public_html/skin/img/black@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/black@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/black_rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/black_rtl.png -------------------------------------------------------------------------------- /public_html/skin/img/black_rtl@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/black_rtl@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/flowplayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/flowplayer.png -------------------------------------------------------------------------------- /public_html/skin/img/flowplayer@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/flowplayer@2x.png -------------------------------------------------------------------------------- /public_html/skin/img/play_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_black.png -------------------------------------------------------------------------------- /public_html/skin/img/play_black@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_black@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/play_black_rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_black_rtl.png -------------------------------------------------------------------------------- /public_html/skin/img/play_black_rtl@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_black_rtl@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/play_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_white.png -------------------------------------------------------------------------------- /public_html/skin/img/play_white@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_white@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/play_white_rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_white_rtl.png -------------------------------------------------------------------------------- /public_html/skin/img/play_white_rtl@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/play_white_rtl@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_black.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_black@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_black@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_black_rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_black_rtl.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_black_rtl@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_black_rtl@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_white.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_white@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_white@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_white_rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_white_rtl.png -------------------------------------------------------------------------------- /public_html/skin/img/playful_white_rtl@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/playful_white_rtl@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/white.png -------------------------------------------------------------------------------- /public_html/skin/img/white@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/white@x2.png -------------------------------------------------------------------------------- /public_html/skin/img/white_rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/white_rtl.png -------------------------------------------------------------------------------- /public_html/skin/img/white_rtl@x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/skin/img/white_rtl@x2.png -------------------------------------------------------------------------------- /public_html/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/spinner.gif -------------------------------------------------------------------------------- /public_html/spinner.js: -------------------------------------------------------------------------------- 1 | var cSpeed=9; 2 | var cWidth=128; 3 | var cHeight=128; 4 | var cTotalFrames=12; 5 | var cFrameWidth=128; 6 | var cImageSrc='/spinner.gif'; 7 | 8 | var cImageTimeout=false; 9 | var cIndex=0; 10 | var cXpos=0; 11 | var cPreloaderTimeout=false; 12 | var SECONDS_BETWEEN_FRAMES=0; 13 | 14 | function startAnimation(){ 15 | 16 | document.getElementById('loaderImage').style.backgroundImage='url('+cImageSrc+')'; 17 | document.getElementById('loaderImage').style.width=cWidth+'px'; 18 | document.getElementById('loaderImage').style.height=cHeight+'px'; 19 | 20 | //FPS = Math.round(100/(maxSpeed+2-speed)); 21 | FPS = Math.round(100/cSpeed); 22 | SECONDS_BETWEEN_FRAMES = 1 / FPS; 23 | 24 | cPreloaderTimeout=setTimeout('continueAnimation()', SECONDS_BETWEEN_FRAMES/1000); 25 | 26 | } 27 | 28 | function continueAnimation(){ 29 | 30 | cXpos += cFrameWidth; 31 | //increase the index so we know which frame of our animation we are currently on 32 | cIndex += 1; 33 | 34 | //if our cIndex is higher than our total number of frames, we're at the end and should restart 35 | if (cIndex >= cTotalFrames) { 36 | cXpos =0; 37 | cIndex=0; 38 | } 39 | 40 | if(document.getElementById('loaderImage')) 41 | document.getElementById('loaderImage').style.backgroundPosition=(-cXpos)+'px 0'; 42 | 43 | cPreloaderTimeout=setTimeout('continueAnimation()', SECONDS_BETWEEN_FRAMES*1000); 44 | } 45 | 46 | function stopAnimation(){//stops animation 47 | clearTimeout(cPreloaderTimeout); 48 | cPreloaderTimeout=false; 49 | } 50 | 51 | function imageLoader(s, fun)//Pre-loads the sprites image 52 | { 53 | clearTimeout(cImageTimeout); 54 | cImageTimeout=0; 55 | genImage = new Image(); 56 | genImage.onload=function (){cImageTimeout=setTimeout(fun, 0)}; 57 | genImage.onerror=new Function('alert(\'Could not load the image\')'); 58 | genImage.src=s; 59 | } 60 | 61 | -------------------------------------------------------------------------------- /public_html/sprites-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/sprites-3.png -------------------------------------------------------------------------------- /public_html/sprites-3.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/sprites-3.xcf -------------------------------------------------------------------------------- /public_html/stream.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use lib '..'; 7 | use config; 8 | use query; 9 | use template; 10 | 11 | use CGI; 12 | use CGI::Carp 'fatalsToBrowser'; 13 | 14 | sub error { 15 | print "Content-type: text/plain\r\n\r\n$_[0]\n"; 16 | exit; 17 | } 18 | 19 | # params 20 | 21 | my $id = CGI::param('id'); 22 | 23 | if( ! defined $id or $id !~ m/^\d+$/ ) { 24 | error("please pass id param"); 25 | } 26 | 27 | my $user = user() or error("no user record"); 28 | my $movie = movie($id) or error("can't find movie of that id"); 29 | 30 | # movie details 31 | 32 | my $mp4 = $movie->mp4 or error("can't find mp4 file for that movie"); 33 | my $fn = $config::home . '/video/' . $mp4; 34 | my $s = -s $fn; 35 | 36 | # user details 37 | 38 | if( $user->bytes_used > $user->bytes_purchased ) { 39 | error("bytes used up"); 40 | } 41 | $user->bytes_used += $s; 42 | $user->time_last_streamed = scalar time; 43 | $user->write('users'); 44 | 45 | # stream 46 | 47 | print "Content-type: video/mp4\r\n"; 48 | print "Content-Length: $s\r\n"; 49 | print "\r\n"; 50 | 51 | exec( '/bin/cat', $fn ) or error("couldn't find cat or the file: $!"); 52 | 53 | -------------------------------------------------------------------------------- /public_html/submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stolenboyvideos/porn-site-in-a-can/4a58846f9c1b9d137500edbf312647208d96b3e0/public_html/submit.png -------------------------------------------------------------------------------- /public_html/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Stolen Boy Videos 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 30 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 81 | 82 | 83 | 84 | 85 |
86 |
87 | Last Update: Feb 21, 2015   Stolen Boy Videos: :num_videos: 88 |
89 |
90 |
91 |
92 |
93 | 94 | 95 | 96 |
97 | 98 | :prevnext: 99 | 100 | :content: 101 | 102 | :prevnext: 103 | 104 |
105 | 106 |
107 | 108 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /public_html/upload.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use CGI; 7 | use CGI::Carp 'fatalsToBrowser'; 8 | 9 | use lib '..'; 10 | use template; 11 | 12 | print "Content-type: text/html\r\n\r\n"; 13 | 14 | my $user = user(); 15 | 16 | my $movies = movies(); 17 | 18 | my $content = << 'EOF'; 19 | 20 | N'yet. 21 | 22 | EOF 23 | 24 | print template( undef, { 25 | content => $content, 26 | num_videos => $movies->num_rows, 27 | logged_in => ($user->cookie ? 1 : 0), 28 | } ); 29 | 30 | 31 | -------------------------------------------------------------------------------- /public_html/video.cgi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use lib '..'; 7 | use template; 8 | use query; 9 | 10 | use CGI; 11 | use CGI::Carp 'fatalsToBrowser'; 12 | 13 | # 14 | # read required video id 15 | # 16 | 17 | (my $id) = $ENV{PATH_INFO} =~ m{^/(\d+)/}; 18 | 19 | if( ! defined $id or $id !~ m/^\d+$/ ) { 20 | print "Location: http://$ENV{HTTP_HOST}\r\n\r\n"; 21 | exit; 22 | } 23 | 24 | # 25 | # figure out if the user is out of data 26 | # 27 | 28 | my $user = user(); 29 | my $user_id = $user->id; 30 | 31 | if( $user->bytes_used > $user->bytes_purchased ) { 32 | print "Location: http://$ENV{HTTP_HOST}/register.cgi\r\n\r\n"; 33 | exit; 34 | } 35 | 36 | # 37 | # get movie information to fetch the rating and bump the views count 38 | # 39 | 40 | my $movies = movies(); 41 | my($movie) = grep $_->id == $id, @$movies or die "can't find movie of that id"; 42 | $movie->views ++; 43 | $movie->write('movies'); 44 | 45 | # 46 | # show video 47 | # 48 | 49 | print "Content-type: text/html\r\n\r\n"; 50 | 51 | my $clip = <<'EOF'; 52 | 53 | 54 |
55 | 56 | 57 | 58 |
59 |
60 | 63 |
64 |
65 | 66 | 67 | 68 |
69 | Rate this video
70 |
71 |
72 |
73 | 74 | 75 | 76 |
77 |
78 | :more_movies_content: 79 |
80 | 81 | 128 | 129 | 130 | EOF 131 | 132 | # 133 | # get content to show for the 'moremovies' display and insert it 134 | # 135 | 136 | my $more_movies = some_movies( $movies, $user, 9 ); 137 | 138 | 139 | # 140 | # figure out how many stars this user rated this movie, and show them their own rating if they gave it one; otherwise, show the actual rating or default 141 | # 142 | 143 | (my $existing_movie_rating_by_this_user) = query("select rating from ratings where user_id = ? and movie_id = ?", $user_id, $id, sub { $_[0]->rating } ); 144 | my $stars = $existing_movie_rating_by_this_user ? $existing_movie_rating_by_this_user : $movie->stars || 3; 145 | 146 | # 147 | # template the 'view movie' content 148 | # 149 | 150 | my $content = template( 151 | $clip, { 152 | id => $id, # id of the movie to stream 153 | type => 'mp4', # type of the movie to stream; flowplayer also supports webm 154 | more_movies_content => $more_movies, # more movies to view if they pause or finish this one 155 | stars => $stars, 156 | jpg => $movie->jpg, 157 | }, 158 | ); 159 | 160 | # 161 | # insert that into the main page template 162 | # 163 | 164 | print template( undef, { 165 | content => $content, 166 | num_videos => $movies->num_rows, 167 | logged_in => ($user->cookie ? 1 : 0), 168 | } ); 169 | 170 | 171 | -------------------------------------------------------------------------------- /query.pm: -------------------------------------------------------------------------------- 1 | 2 | package query; 3 | 4 | use strict; 5 | use warnings; 6 | 7 | use Carp 'confess'; 8 | 9 | use config; 10 | 11 | use DBI; 12 | 13 | my $dbname; 14 | my $dbuser; 15 | my $dbpass; 16 | my $dbh; 17 | 18 | BEGIN { 19 | $dbname = $config::dbname; 20 | $dbuser = $config::dbuser; 21 | $dbpass = $config::dbpass; 22 | $dbh = DBI->connect( "DBI:mysql:database=$dbname", $dbuser, $dbpass) or die DBI->errstr; 23 | }; 24 | 25 | sub import { 26 | my $package = $_[0]; 27 | 28 | no strict 'refs'; 29 | *{caller() . '::query'} = sub { 30 | my $sql = shift or confess "no sql"; 31 | my $cb = pop if @_ and ref($_[-1]) eq 'CODE'; 32 | my @args = @_; 33 | 34 | $dbh or die; 35 | 36 | my $sth = $dbh->prepare($sql) or confess $dbh->errstr; 37 | 38 | $sth->execute(@args) or confess $sth->errstr; 39 | 40 | if( $sql =~ m{^ *insert} ) { 41 | 42 | return $dbh->{mysql_insertid}; 43 | 44 | } elsif( $sql =~ m{^ *select} ) { 45 | 46 | my @results; 47 | 48 | while(my $row = $sth->fetchrow_hashref) { 49 | push @results, $cb ? $cb->(bless $row, 'query::rec') : bless $row, 'query::rec'; 50 | } 51 | 52 | return wantarray ? @results : bless \@results, 'query::set'; 53 | 54 | } else { 55 | 56 | return $dbh; # maybe they can fish whatever they need out of there 57 | 58 | } 59 | 60 | }; 61 | } 62 | 63 | # 64 | 65 | package query::rec; 66 | 67 | sub AUTOLOAD :lvalue { 68 | my $self = shift; 69 | my $method = our $AUTOLOAD; 70 | $method =~ s/.*:://; 71 | return if $method eq 'DESTROY'; 72 | $self->{$method}; 73 | } 74 | 75 | sub write { 76 | my $self = shift; 77 | my $table = shift or die; 78 | $self->{id} or die; 79 | my @keys = sort { $a cmp $b } grep { $_ ne 'id' } keys %$self; 80 | my @cols = join ', ', map "$_ = ?", @keys; 81 | my @vals = map $self->{$_}, @keys; 82 | my $sth = $dbh->prepare( "update $table set @cols where id = ?" ) or die $dbh->errstr; 83 | $sth->execute( @vals, $self->{id} ) or die $dbh->errstr; 84 | 1; 85 | } 86 | 87 | # 88 | 89 | package query::set; 90 | 91 | sub num_rows { 92 | my $self = shift; 93 | return scalar @$self; 94 | } 95 | 96 | my %rows_cache; 97 | 98 | sub rows { 99 | my $self = shift; 100 | # API shim for what I had been doing 101 | # create an array indexed by the id of each item in the array 102 | # with mysql auto_increment, results start at 1 but the array is indexed starting at 0; correct for that 103 | # also, if some items weren't returned by the query, there needs to be an appropriate gap in the array 104 | return $rows_cache{ $self } if $rows_cache{ $self }; 105 | my $ret = []; 106 | for my $row ( @$self ) { 107 | $ret->[ $row->id ] = $row; 108 | } 109 | $rows_cache{ $self } = $ret; 110 | return $ret; 111 | } 112 | 113 | 1; 114 | -------------------------------------------------------------------------------- /template.pm: -------------------------------------------------------------------------------- 1 | 2 | use strict; 3 | use warnings; 4 | 5 | use List::Util 'shuffle'; 6 | use CGI; 7 | use Data::Dumper; 8 | 9 | use config; 10 | use query; 11 | 12 | use sort 'stable'; 13 | 14 | # 15 | # user 16 | # 17 | 18 | sub user { 19 | 20 | my $cookie = CGI::cookie('account'); 21 | my $ip = $ENV{'REMOTE_ADDR'}; 22 | 23 | my $user; 24 | 25 | ($user) = query("select * from users where cookie = ?", $cookie) if $cookie; 26 | ($user) = query("select * from users where ip = ?", $ip) if ! $user; 27 | 28 | if( ! $user ) { 29 | # create a new user if we have to 30 | my $bytes_purchased = 1 * 1024 * 1024 * 1024; # 1 free GB 31 | my $referer = CGI::param('referer') || CGI::param('referrer'); # BTC address to pay referral fees to 32 | $referer =~ m/^[a-zA-Z0-9]+$/ or die "referer should be a bitcoin address"; 33 | length($referer) <= 35 or die "referer should be a bitcoin address"; 34 | my $user_id = query( "insert into users (ip, time_created, bytes_purchased, bytes_used, referer) values (?, ?, ?, ?, ?)", $ip, scalar time, $bytes_purchased, 0, $referer ); 35 | ($user) = query("select * from users where id = ?", $user_id); 36 | } 37 | 38 | return $user; 39 | 40 | } 41 | 42 | # 43 | # movies 44 | # 45 | 46 | sub movie { 47 | my $id = shift or die; 48 | my ($movie) = query( "select * from movies where disabled is null and id = ?", $id ); 49 | return $movie; 50 | } 51 | 52 | sub movies { 53 | query( "select * from movies where disabled is null order by id desc" ); 54 | } 55 | 56 | sub some_movies { 57 | my $movies = shift; 58 | my $user = shift; 59 | my $n = shift() || 9; 60 | my $search = shift; 61 | my $page = shift; 62 | 63 | my $user_id = $user->id; 64 | my @movies = @$movies; 65 | 66 | my $predictions = []; 67 | query( "select rating, movie_id from predictions where user_id = ?", $user->id, sub { my $prediction = shift; $predictions->[ $prediction->movie_id ] = $prediction->rating; } ); 68 | 69 | my $compute_rating = sub { 70 | my $movie = shift; 71 | if( $predictions && exists $predictions->[ $movie->id ] ) { 72 | return $predictions->[ $movie->id ]; 73 | } else { 74 | return $movie->stars || 3; 75 | } 76 | }; 77 | 78 | if( $search and $search eq 'newest') { 79 | 80 | @movies = reverse @movies; 81 | 82 | } elsif( $search and $search eq 'toprated') { 83 | 84 | # @movies = sort { $b->{stars} <=> $a->{stars} } @movies; # this would be okay except it looks like they aren't sorted because the numbers of stars are all over the place 85 | @movies = sort { $compute_rating->($b) <=> $compute_rating->($a) } @movies; 86 | 87 | } elsif( $search and $search eq 'popular') { 88 | 89 | @movies = sort { $b->{views} <=> $a->{views} } @movies; 90 | 91 | } elsif( $search ) { 92 | 93 | # sort once for each keyword, starting with the last keyword, which we assume to be less important than the first. 94 | # if the word is persent in the filename, it gets sorted to the front. 95 | # this should result in movies with more of the searched for words being closer to the front. 96 | # -1 means they're in the proper order; 0 means they compare the same; 1 means they're backwards 97 | # TODO should remove items from the list that have none of the keywords 98 | my @keywords = split m/\W+/, $search; 99 | for my $keyword (reverse @keywords) { 100 | @movies = sort { 101 | my $a_found = index( $a->mp4, $keyword ) >= 0; 102 | my $b_found = index( $b->mp4, $keyword ) >= 0; 103 | ( $a_found == $b_found ) ? 0 : ( $a_found && ! $b_found ) ? -1 : 1; 104 | } @movies; 105 | } 106 | 107 | } else { 108 | 109 | # default is a random shuffle 110 | 111 | @movies = shuffle( @movies ); 112 | 113 | } 114 | 115 | my $num_results = @movies; 116 | 117 | if( $page and $page > 1 ) { 118 | if( $n * ($page-1) > @movies ) { 119 | return qq{
No more results.
\n}; 120 | } else { 121 | splice @movies, 0, $n * ($page-1), (); # eg, for page 2, get rid of 1 page worth of results off the front 122 | } 123 | } 124 | 125 | my $clip = < 128 |
129 | 130 |
131 | 132 |
133 | 134 | 135 | 136 |
137 | Time: :time:
138 | 139 |
140 | Views: :views:
141 | 142 |
143 |
144 | 145 |
146 | 147 |
148 | 149 | EOF 150 | 151 | my $content = ''; 152 | 153 | for my $movie_index ( 1 .. $n ) { 154 | # my $movie = pop @movies or last; 155 | my $movie = $movies[$movie_index] or last; 156 | 157 | my $partial_filename = $movie->mp4; 158 | $partial_filename =~ s{\.\w+$}{}; # remove any file extension 159 | $partial_filename =~ s{_\d{4,}\.}{}; # remove those wonky uniqe-ifying numbers 160 | 161 | my $rating = $compute_rating->( $movie ); 162 | 163 | $content .= template( 164 | $clip, { 165 | id => $movie->id, 166 | views => $movie->views || 0, 167 | stars => $rating, 168 | time => $movie->runtime, 169 | jpg => $movie->jpg, 170 | partial_filename => $partial_filename, 171 | }, 172 | ); 173 | } 174 | 175 | # next/prev page links 176 | 177 | my $prevnext = ''; 178 | 179 | if( $page > 1 or @movies > $n ) { 180 | 181 | my $s = CGI::escape($search||''); 182 | 183 | $prevnext .= qq{
\n}; 184 | 185 | $prevnext .= qq{}; 186 | 187 | $prevnext .= qq{}; 196 | 197 | $prevnext .= qq{}; 207 | 208 | $prevnext .= qq{}; 215 | 216 | $prevnext .= qq{
}; 188 | if( $page > 1 ) { 189 | $prevnext .= qq{ 190 | < < < Previous   191 | }; 192 | } else { 193 | $prevnext .= qq{< < < Previous  }; 194 | } 195 | $prevnext .= qq{}; 198 | my $m = int( $num_results / $n ); 199 | $m++ if $num_results % $n; # round up if there are results left after the last full page 200 | my $i = 0; 201 | while( $i < $m ) { 202 | $prevnext .= qq{ ˙ } if $i > 0; 203 | $prevnext .= qq{@{[ $i+1 ]}}; 204 | $i++; 205 | } 206 | $prevnext .= qq{}; 209 | if( @movies > $n ) { 210 | $prevnext .= qq{  Next > > >}; 211 | } else { 212 | $prevnext .= qq{  Next > > >}; 213 | } 214 | $prevnext .= qq{
}; 217 | 218 | $prevnext .= qq{
\n}; 219 | 220 | } 221 | 222 | return wantarray ? ( $content, $prevnext ) : $content; 223 | } 224 | 225 | # 226 | # template 227 | # 228 | 229 | sub template { 230 | 231 | my $page = shift; 232 | my $args = shift; 233 | 234 | if( ! $page ) { 235 | open my $fh, '<', 'template.html' or die $!; 236 | $page = join '', readline $fh; 237 | } 238 | 239 | # $page =~ s{.*}{}; 240 | 241 | $page =~ s{:(\w+):}{ $args->{$1} }ge; 242 | 243 | return $page; 244 | 245 | } 246 | 247 | 1; 248 | -------------------------------------------------------------------------------- /upload.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | use Getopt::Long; 7 | use Image::Info; 8 | use Movie::Info; 9 | 10 | use config; 11 | 12 | use template; 13 | use query; 14 | 15 | use Data::Dumper; 16 | use MD5; 17 | 18 | GetOptions( 19 | "movie=s" => \my $movie_fn, 20 | "thumb=s" => \my $thumb_fn, 21 | "runtime=s" => \my $runtime, 22 | "convert" => \my $convert, 23 | ); 24 | 25 | $movie_fn ||= $ARGV[0] if @ARGV == 1; 26 | 27 | die "specify --movie" if ! $movie_fn; 28 | 29 | die "movie file not found" if $movie_fn and ! -f $movie_fn; 30 | die "thumb file not found" if $thumb_fn and ! -f $thumb_fn; 31 | 32 | # 33 | # if flv, re-package the stream into a temporary file 34 | # 35 | 36 | my $file_info = `file "$movie_fn"`; 37 | if( ( $convert or $movie_fn =~ m{\.flv$} ) and $file_info !~ m/MPEG v4/ ) { 38 | 39 | # eg: /dir/dir/purple_singlet_dick_up_3727272_flv.mp4: ISO Media, MPEG v4 system, version 2 40 | 41 | (my $movie_base_fn = $movie_fn) =~ s{.*/}{}; # temp; file extension will change 42 | $movie_base_fn =~ s{\.flv}{\.mp4} or die; 43 | 44 | if( $convert ) { 45 | system qq{ ffmpeg -i "$movie_fn" -strict -2 "/tmp/$movie_base_fn" } and die; # have to do something like that if the encoding isn't compatible 46 | } else { 47 | system qq{ ffmpeg -i "$movie_fn" -vcodec copy -acodec copy "/tmp/$movie_base_fn" } and die; 48 | } 49 | 50 | $movie_fn = "/tmp/$movie_base_fn"; # moved to /tmp and extention changed 51 | } 52 | 53 | # 54 | # compute $movie_base_fn and $thumb_fn 55 | # 56 | 57 | (my $movie_base_fn = $movie_fn) =~ s{.*/}{}; 58 | if( ! $thumb_fn ) { 59 | $thumb_fn = $movie_fn; $thumb_fn =~ s{\.mp4$}{\.jpg} or die "couldn't change $movie_fn to end in .jpg"; 60 | } 61 | 62 | 63 | # 64 | # qtfaststart 65 | # 66 | 67 | system '/usr/local/bin/qtfaststart', $movie_fn; # XXX only for mp4 68 | 69 | # 70 | # checksum the movie for duplicate control and thumbnail naming 71 | # 72 | 73 | my $md5sum = do { 74 | my $md5 = MD5->new; 75 | $md5->reset(); 76 | open my $fh, '<', $movie_fn or die "$movie_fn: $!"; 77 | $md5->addfile($fh); 78 | $md5->hexdigest(); 79 | }; 80 | 81 | # 82 | # check for duplicates 83 | # 84 | 85 | my ($dup) = query( "select * from movies where md5 = ? ", $md5sum ); 86 | die 'this movie is a duplicate of: ' . $dup->mp4 if $dup; 87 | 88 | # 89 | # copy the file up 90 | # 91 | 92 | system 'cp', '-f', $movie_fn, $config::home . '/video/' and die $?; 93 | 94 | # 95 | # thumbnail 96 | # 97 | 98 | my $thumb_out_fn = $config::home . "/public_html/thumbs/$md5sum.jpg"; 99 | 100 | if( -f $thumb_fn ) { 101 | 102 | # copy the thumbnail directly if possible or scale it if needed 103 | 104 | my $image_inf = Image::Info::image_info( $thumb_fn ) or die; 105 | (my $w, my $h) = Image::Info::dim( $image_inf ); # should be 310, 235 106 | if( $w == 310 and $h == 235 ) { 107 | system 'cp', '-f', $thumb_fn, "/mnt/site/public_html/thumbs/$md5sum.jpg" and die $?; 108 | } else { 109 | # could use pnmcut instead 110 | system "djpeg '$thumb_fn' | pnmscale -xysize 310 235 | cjpeg > '$thumb_out_fn'" and die $?; 111 | } 112 | 113 | } else { 114 | 115 | # generate and rescale an image thumbnail 116 | 117 | # system "ffmpegthumbnailer -s 310 -i "$movie_fn" -o "/mnt/site/public_html/thumbs/$md5sum.jpg"' and die $?; # simple version with no rescaling 118 | 119 | # system "ffmpegthumbnailer -t '30%' -s 310 -i '$movie_fn' -o '/tmp/tmp.jpg'" and die $?; # rescale using a jpg as a temp file 120 | # system "djpeg '/tmp/tmp.jpg' | pnmscale -xysize 310 235 | cjpeg > '$thumb_out_fn' " and die $?; 121 | 122 | system "ffmpegthumbnailer -t '20%' -s 310 -i '$movie_fn' -o '/tmp/tmp.png'" and die $?; # rescale using a png as a temp file 123 | system "pngtopnm '/tmp/tmp.png' | pnmscale -xysize 310 235 | cjpeg > '$thumb_out_fn' " and die $?; 124 | warn "generated thumbnail $thumb_out_fn"; 125 | 126 | } 127 | 128 | # 129 | # runlength 130 | # 131 | 132 | if( ! $runtime ) { 133 | my $mi = Movie::Info->new; 134 | my %info = $mi->info($movie_fn) or die; 135 | $runtime = $info{length} or die; 136 | $runtime =~ s{\.\d\d$}{} or die "couldn't parse length $runtime"; 137 | my $minutes = int( $runtime / 60 ); 138 | my $seconds = $runtime % 60; 139 | $runtime = sprintf "%d:%02d", $minutes, $seconds; 140 | warn "computed runtime: $runtime"; 141 | } 142 | 143 | # 144 | # insert it 145 | # 146 | 147 | query( "insert into movies (mp4, jpg, runtime, md5) values (?, ?, ?, ?)", $movie_base_fn, "$md5sum.jpg", $runtime, $md5sum, ); 148 | 149 | 150 | 151 | --------------------------------------------------------------------------------