we offer 2 programs

Gold and Platinum

build-footer

Gold Program

Get 10% offǂ your plan service home plan license when purchased directly from Design Basics – single- or unlimited-build (excludes plan alterations and design or drafting of custom home plans). Plus, 10% off product purchases.
(ǂExcludes home plans by W.L. Martin Home Designs #24000 to #24999.)

build-footer

Platinum Program

Get 15% offǂ your plan service home plan license when purchased directly from Design Basics – single- or unlimited-build (excludes plan alterations and design or drafting of custom home plans). Plus, 15% off product purchases.
(ǂExcludes home plans by W.L. Martin Home Designs - #24000 to #24999.)

program comparison

Program Benefit Summary

Choose between our GOLD or PLATINUM Programs and watch your savings multiply! Get study plan sets for a fraction of the cost – use them to estimate building costs and review design options with customers before you buy. Also, choose one FREE upgrade with every order, such as an alternate foundation or reverse plan set.

Builder Benefits

Gold

Platinum

Plan Service Home Plan License Purchase Discount (includes single- and unlimited-build licenses)

10%

15%

Product Purchase Discount

10%

15%

25% off Digital Home Plan Book

50% off your 1st New Trend Makeover

Concierge Service (We'll recommend plans for your next project)

Most Recent Home Plan Books FREE

$100 Study Plan Sets* for Estimating Purposes (up to five different plans per year)

One FREE Upgrade Per Plan License*† Purchased (from available upgrades; varies by plan)

Promotional License with Livability at a Glance™ Floor Plans (per plan licensed through program)

Program Cost

$249/yr

$349/yr

Contact us for more information.
*Applies to Design Basics, Scholz Design, Carmichael & Dame Designs and Plan Pros, Inc., plan licenses purchased directly from Design Basics. †Full construction prints only (PDF, sets, or CAD files).

Still looking for more?

Kickstart Your Neighborhood℠

Expand your portfolio without the risk: Choose 5 plans for estimating purposes and market the plans with color rendered artwork.
You’ll be enrolled in our Builder-Centric PLATINUM program and receive all the additional benefits offered.

What You Will Get

build-footer

Digital Home Plan Book

Customize your digital plan book when you:

  • Personalize your cover design
  • Add your logo and contact information
  • Choose the featured plans with full-color images

Your customized Digital Home Plan Book is delivered in a PDF format that you can add to your website, email to customers, or easily print on 8 1/2 x 11″ paper. Upgrade to a Digital Flip Book (see sample below) for an additional fee. *No additional discounts or offers apply.

build-footer

$100 Study Plan Sets*

Sometimes you need to price out a home in order to get the sale, but you need to have the plans in order to get accurate bids. As a Builder-Centric member you can order estimating Study Sets* for up to five (5) different home plans per year for just $100 per study set! (Starting with the 6th plan, Study Sets are $250 each.)

*NOT FOR CONSTRUCTION PURPOSES. Applies to Design Basics, Design Basics/HBN, Scholz Design, Carmichael & Dame Designs, and Plan Pros, Inc. home plans. Full construction prints only (PDF or CAD files). Excludes custom designs. Does not apply to prior plan license purchases. Cannot be combined with any other promotion or discount.

One FREE Upgrade* per Plan Licensed

build-footer
Alternate Foundation
build-footer
Materials Estimate

Alternate Exterior Wall Framing

build-footer
2" x 4"
build-footer
2" x 6"

Forward + Right Reading Reverse Plans

build-footer
build-footer

No-Step Entry Floor Plan

A No-Step Entry floor plan means there are no barriers to enter the home from the front door or the garage entry. This is helpful for occupants and guests with limited mobility.

*For each plan licensed, choose one available upgrade for that plan: Alternate foundation (basement, crawl, or slab); Alternate exterior wall framing (2x4" or 2x6"); Forward + Reverse plans; No-Step Entry floor plan; or a Materials list (not all upgrades available for all plans). Applies to Design Basics, LLC, Scholz Design, Carmichael & Dame Designs, and Plan Pros, Inc. home plans. Full construction prints only (PDF, sets, or CAD files). Excludes custom designs. Does not apply to prior plan license purchases. Cannot be combined with any other promotion or discount.

New Trend Makeover

Send it to us (CAD file, preferred), and we’ll update your plan with the latest design thought and must-have amenities! Increase marketability while staying with a home design you are familiar with – both in terms of construction and cost.

  • Open floorplan concept

  • Flex room, rather than formal dining

  • Rear foyer with discrete laundry and drop zone

  • Expansive entertaining kitchen with large island and walk-in pantry

  • Expandable dining area for large gatherings

  • Oversized spa shower with no door in owner’s bath

  • Linen storage in owner’s bath

  • Compartmented hall bath with natural light

  • More storage in bedroom 2; more light for bedroom 3

  • Note: The makeover is a design concept; no changes to the construction drawings.

    build-footer

    Example of new trend makeover

    Current Dir: /var/www/designbasics/wp-includes/
    
    [DIR]  ID3 [ delete | rename ]
    [DIR]  IXR [ delete | rename ]
    [DIR]  PHPMailer [ delete | rename ]
    [DIR]  Requests [ delete | rename ]
    [DIR]  SimplePie [ delete | rename ]
    [DIR]  Text [ delete | rename ]
    [FILE] admin-bar.php [ edit | delete | rename ]
    [DIR]  assets [ delete | rename ]
    [FILE] atomlib.php [ edit | delete | rename ]
    [FILE] author-template.php [ edit | delete | rename ]
    [DIR]  block-bindings [ delete | rename ]
    [FILE] block-bindings.php [ edit | delete | rename ]
    [FILE] block-editor.php [ edit | delete | rename ]
    [FILE] block-i18n.json [ edit | delete | rename ]
    [DIR]  block-patterns [ delete | rename ]
    [FILE] block-patterns.php [ edit | delete | rename ]
    [DIR]  block-supports [ delete | rename ]
    [FILE] block-template-utils.php [ edit | delete | rename ]
    [FILE] block-template.php [ edit | delete | rename ]
    [DIR]  blocks [ delete | rename ]
    [FILE] blocks.php [ edit | delete | rename ]
    [FILE] bookmark-template.php [ edit | delete | rename ]
    [FILE] bookmark.php [ edit | delete | rename ]
    [FILE] cache-compat.php [ edit | delete | rename ]
    [FILE] cache.php [ edit | delete | rename ]
    [FILE] canonical.php [ edit | delete | rename ]
    [FILE] capabilities.php [ edit | delete | rename ]
    [FILE] category-template.php [ edit | delete | rename ]
    [FILE] category.php [ edit | delete | rename ]
    [DIR]  certificates [ delete | rename ]
    [FILE] class-IXR.php [ edit | delete | rename ]
    [FILE] class-avif-info.php [ edit | delete | rename ]
    [FILE] class-feed.php [ edit | delete | rename ]
    [FILE] class-http.php [ edit | delete | rename ]
    [FILE] class-json.php [ edit | delete | rename ]
    [FILE] class-oembed.php [ edit | delete | rename ]
    [FILE] class-phpass.php [ edit | delete | rename ]
    [FILE] class-phpmailer.php [ edit | delete | rename ]
    [FILE] class-pop3.php [ edit | delete | rename ]
    [FILE] class-requests.php [ edit | delete | rename ]
    [FILE] class-simplepie.php [ edit | delete | rename ]
    [FILE] class-smtp.php [ edit | delete | rename ]
    [FILE] class-snoopy.php [ edit | delete | rename ]
    [FILE] class-walker-category-dropdown.php [ edit | delete | rename ]
    [FILE] class-walker-category.php [ edit | delete | rename ]
    [FILE] class-walker-comment.php [ edit | delete | rename ]
    [FILE] class-walker-nav-menu.php [ edit | delete | rename ]
    [FILE] class-walker-page-dropdown.php [ edit | delete | rename ]
    [FILE] class-walker-page.php [ edit | delete | rename ]
    [FILE] class-wp-admin-bar.php [ edit | delete | rename ]
    [FILE] class-wp-ajax-response.php [ edit | delete | rename ]
    [FILE] class-wp-application-passwords.php [ edit | delete | rename ]
    [FILE] class-wp-block-bindings-registry.php [ edit | delete | rename ]
    [FILE] class-wp-block-bindings-source.php [ edit | delete | rename ]
    [FILE] class-wp-block-editor-context.php [ edit | delete | rename ]
    [FILE] class-wp-block-list.php [ edit | delete | rename ]
    [FILE] class-wp-block-parser-block.php [ edit | delete | rename ]
    [FILE] class-wp-block-parser-frame.php [ edit | delete | rename ]
    [FILE] class-wp-block-parser.php [ edit | delete | rename ]
    [FILE] class-wp-block-pattern-categories-registry.php [ edit | delete | rename ]
    [FILE] class-wp-block-patterns-registry.php [ edit | delete | rename ]
    [FILE] class-wp-block-styles-registry.php [ edit | delete | rename ]
    [FILE] class-wp-block-supports.php [ edit | delete | rename ]
    [FILE] class-wp-block-template.php [ edit | delete | rename ]
    [FILE] class-wp-block-type-registry.php [ edit | delete | rename ]
    [FILE] class-wp-block-type.php [ edit | delete | rename ]
    [FILE] class-wp-block.php [ edit | delete | rename ]
    [FILE] class-wp-classic-to-block-menu-converter.php [ edit | delete | rename ]
    [FILE] class-wp-comment-query.php [ edit | delete | rename ]
    [FILE] class-wp-comment.php [ edit | delete | rename ]
    [FILE] class-wp-customize-control.php [ edit | delete | rename ]
    [FILE] class-wp-customize-manager.php [ edit | delete | rename ]
    [FILE] class-wp-customize-nav-menus.php [ edit | delete | rename ]
    [FILE] class-wp-customize-panel.php [ edit | delete | rename ]
    [FILE] class-wp-customize-section.php [ edit | delete | rename ]
    [FILE] class-wp-customize-setting.php [ edit | delete | rename ]
    [FILE] class-wp-customize-widgets.php [ edit | delete | rename ]
    [FILE] class-wp-date-query.php [ edit | delete | rename ]
    [FILE] class-wp-dependencies.php [ edit | delete | rename ]
    [FILE] class-wp-dependency.php [ edit | delete | rename ]
    [FILE] class-wp-duotone.php [ edit | delete | rename ]
    [FILE] class-wp-editor.php [ edit | delete | rename ]
    [FILE] class-wp-embed.php [ edit | delete | rename ]
    [FILE] class-wp-error.php [ edit | delete | rename ]
    [FILE] class-wp-fatal-error-handler.php [ edit | delete | rename ]
    [FILE] class-wp-feed-cache-transient.php [ edit | delete | rename ]
    [FILE] class-wp-feed-cache.php [ edit | delete | rename ]
    [FILE] class-wp-hook.php [ edit | delete | rename ]
    [FILE] class-wp-http-cookie.php [ edit | delete | rename ]
    [FILE] class-wp-http-curl.php [ edit | delete | rename ]
    [FILE] class-wp-http-encoding.php [ edit | delete | rename ]
    [FILE] class-wp-http-ixr-client.php [ edit | delete | rename ]
    [FILE] class-wp-http-proxy.php [ edit | delete | rename ]
    [FILE] class-wp-http-requests-hooks.php [ edit | delete | rename ]
    [FILE] class-wp-http-requests-response.php [ edit | delete | rename ]
    [FILE] class-wp-http-response.php [ edit | delete | rename ]
    [FILE] class-wp-http-streams.php [ edit | delete | rename ]
    [FILE] class-wp-http.php [ edit | delete | rename ]
    [FILE] class-wp-image-editor-gd.php [ edit | delete | rename ]
    [FILE] class-wp-image-editor-imagick.php [ edit | delete | rename ]
    [FILE] class-wp-image-editor.php [ edit | delete | rename ]
    [FILE] class-wp-list-util.php [ edit | delete | rename ]
    [FILE] class-wp-locale-switcher.php [ edit | delete | rename ]
    [FILE] class-wp-locale.php [ edit | delete | rename ]
    [FILE] class-wp-matchesmapregex.php [ edit | delete | rename ]
    [FILE] class-wp-meta-query.php [ edit | delete | rename ]
    [FILE] class-wp-metadata-lazyloader.php [ edit | delete | rename ]
    [FILE] class-wp-navigation-fallback.php [ edit | delete | rename ]
    [FILE] class-wp-network-query.php [ edit | delete | rename ]
    [FILE] class-wp-network.php [ edit | delete | rename ]
    [FILE] class-wp-object-cache.php [ edit | delete | rename ]
    [FILE] class-wp-oembed-controller.php [ edit | delete | rename ]
    [FILE] class-wp-oembed.php [ edit | delete | rename ]
    [FILE] class-wp-paused-extensions-storage.php [ edit | delete | rename ]
    [FILE] class-wp-plugin-dependencies.php [ edit | delete | rename ]
    [FILE] class-wp-post-type.php [ edit | delete | rename ]
    [FILE] class-wp-post.php [ edit | delete | rename ]
    [FILE] class-wp-query.php [ edit | delete | rename ]
    [FILE] class-wp-recovery-mode-cookie-service.php [ edit | delete | rename ]
    [FILE] class-wp-recovery-mode-email-service.php [ edit | delete | rename ]
    [FILE] class-wp-recovery-mode-key-service.php [ edit | delete | rename ]
    [FILE] class-wp-recovery-mode-link-service.php [ edit | delete | rename ]
    [FILE] class-wp-recovery-mode.php [ edit | delete | rename ]
    [FILE] class-wp-rewrite.php [ edit | delete | rename ]
    [FILE] class-wp-role.php [ edit | delete | rename ]
    [FILE] class-wp-roles.php [ edit | delete | rename ]
    [FILE] class-wp-script-modules.php [ edit | delete | rename ]
    [FILE] class-wp-scripts.php [ edit | delete | rename ]
    [FILE] class-wp-session-tokens.php [ edit | delete | rename ]
    [FILE] class-wp-simplepie-file.php [ edit | delete | rename ]
    [FILE] class-wp-simplepie-sanitize-kses.php [ edit | delete | rename ]
    [FILE] class-wp-site-query.php [ edit | delete | rename ]
    [FILE] class-wp-site.php [ edit | delete | rename ]
    [FILE] class-wp-styles.php [ edit | delete | rename ]
    [FILE] class-wp-tax-query.php [ edit | delete | rename ]
    [FILE] class-wp-taxonomy.php [ edit | delete | rename ]
    [FILE] class-wp-term-query.php [ edit | delete | rename ]
    [FILE] class-wp-term.php [ edit | delete | rename ]
    [FILE] class-wp-text-diff-renderer-inline.php [ edit | delete | rename ]
    [FILE] class-wp-text-diff-renderer-table.php [ edit | delete | rename ]
    [FILE] class-wp-textdomain-registry.php [ edit | delete | rename ]
    [FILE] class-wp-theme-json-data.php [ edit | delete | rename ]
    [FILE] class-wp-theme-json-resolver.php [ edit | delete | rename ]
    [FILE] class-wp-theme-json-schema.php [ edit | delete | rename ]
    [FILE] class-wp-theme-json.php [ edit | delete | rename ]
    [FILE] class-wp-theme.php [ edit | delete | rename ]
    [FILE] class-wp-token-map.php [ edit | delete | rename ]
    [FILE] class-wp-user-meta-session-tokens.php [ edit | delete | rename ]
    [FILE] class-wp-user-query.php [ edit | delete | rename ]
    [FILE] class-wp-user-request.php [ edit | delete | rename ]
    [FILE] class-wp-user.php [ edit | delete | rename ]
    [FILE] class-wp-walker.php [ edit | delete | rename ]
    [FILE] class-wp-widget-factory.php [ edit | delete | rename ]
    [FILE] class-wp-widget.php [ edit | delete | rename ]
    [FILE] class-wp-xmlrpc-server.php [ edit | delete | rename ]
    [FILE] class-wp.php [ edit | delete | rename ]
    [FILE] class-wpdb.php [ edit | delete | rename ]
    [FILE] class.wp-dependencies.php [ edit | delete | rename ]
    [FILE] class.wp-scripts.php [ edit | delete | rename ]
    [FILE] class.wp-styles.php [ edit | delete | rename ]
    [FILE] comment-template.php [ edit | delete | rename ]
    [FILE] comment.php [ edit | delete | rename ]
    [FILE] compat.php [ edit | delete | rename ]
    [FILE] cron.php [ edit | delete | rename ]
    [DIR]  css [ delete | rename ]
    [DIR]  customize [ delete | rename ]
    [FILE] date.php [ edit | delete | rename ]
    [FILE] default-constants.php [ edit | delete | rename ]
    [FILE] default-filters.php [ edit | delete | rename ]
    [FILE] default-widgets.php [ edit | delete | rename ]
    [FILE] deprecated.php [ edit | delete | rename ]
    [FILE] embed-template.php [ edit | delete | rename ]
    [FILE] embed.php [ edit | delete | rename ]
    [FILE] error-protection.php [ edit | delete | rename ]
    [FILE] feed-atom-comments.php [ edit | delete | rename ]
    [FILE] feed-atom.php [ edit | delete | rename ]
    [FILE] feed-rdf.php [ edit | delete | rename ]
    [FILE] feed-rss.php [ edit | delete | rename ]
    [FILE] feed-rss2-comments.php [ edit | delete | rename ]
    [FILE] feed-rss2.php [ edit | delete | rename ]
    [FILE] feed.php [ edit | delete | rename ]
    [DIR]  fonts [ delete | rename ]
    [FILE] fonts.php [ edit | delete | rename ]
    [FILE] formatting.php [ edit | delete | rename ]
    [FILE] functions.php [ edit | delete | rename ]
    [FILE] functions.wp-scripts.php [ edit | delete | rename ]
    [FILE] functions.wp-styles.php [ edit | delete | rename ]
    [FILE] general-template.php [ edit | delete | rename ]
    [FILE] global-styles-and-settings.php [ edit | delete | rename ]
    [DIR]  html-api [ delete | rename ]
    [FILE] http.php [ edit | delete | rename ]
    [FILE] https-detection.php [ edit | delete | rename ]
    [FILE] https-migration.php [ edit | delete | rename ]
    [DIR]  images [ delete | rename ]
    [DIR]  interactivity-api [ delete | rename ]
    [DIR]  js [ delete | rename ]
    [FILE] kses.php [ edit | delete | rename ]
    [DIR]  l10n [ delete | rename ]
    [FILE] l10n.php [ edit | delete | rename ]
    [FILE] link-template.php [ edit | delete | rename ]
    [FILE] load.php [ edit | delete | rename ]
    [FILE] locale.php [ edit | delete | rename ]
    [FILE] media-template.php [ edit | delete | rename ]
    [FILE] media.php [ edit | delete | rename ]
    [FILE] meta.php [ edit | delete | rename ]
    [FILE] ms-blogs.php [ edit | delete | rename ]
    [FILE] ms-default-constants.php [ edit | delete | rename ]
    [FILE] ms-default-filters.php [ edit | delete | rename ]
    [FILE] ms-deprecated.php [ edit | delete | rename ]
    [FILE] ms-files.php [ edit | delete | rename ]
    [FILE] ms-functions.php [ edit | delete | rename ]
    [FILE] ms-load.php [ edit | delete | rename ]
    [FILE] ms-network.php [ edit | delete | rename ]
    [FILE] ms-settings.php [ edit | delete | rename ]
    [FILE] ms-site.php [ edit | delete | rename ]
    [FILE] nav-menu-template.php [ edit | delete | rename ]
    [FILE] nav-menu.php [ edit | delete | rename ]
    [FILE] option.php [ edit | delete | rename ]
    [DIR]  php-compat [ delete | rename ]
    [FILE] pluggable-deprecated.php [ edit | delete | rename ]
    [FILE] pluggable.php [ edit | delete | rename ]
    [FILE] plugin.php [ edit | delete | rename ]
    [DIR]  pomo [ delete | rename ]
    [FILE] post-formats.php [ edit | delete | rename ]
    [FILE] post-template.php [ edit | delete | rename ]
    [FILE] post-thumbnail-template.php [ edit | delete | rename ]
    [FILE] post.php [ edit | delete | rename ]
    [FILE] query.php [ edit | delete | rename ]
    [FILE] registration-functions.php [ edit | delete | rename ]
    [FILE] registration.php [ edit | delete | rename ]
    [DIR]  rest-api [ delete | rename ]
    [FILE] rest-api.php [ edit | delete | rename ]
    [FILE] revision.php [ edit | delete | rename ]
    [FILE] rewrite.php [ edit | delete | rename ]
    [FILE] robots-template.php [ edit | delete | rename ]
    [FILE] rss-functions.php [ edit | delete | rename ]
    [FILE] rss.php [ edit | delete | rename ]
    [FILE] script-loader.php [ edit | delete | rename ]
    [FILE] script-modules.php [ edit | delete | rename ]
    [FILE] session.php [ edit | delete | rename ]
    [FILE] shortcodes.php [ edit | delete | rename ]
    [DIR]  sitemaps [ delete | rename ]
    [FILE] sitemaps.php [ edit | delete | rename ]
    [DIR]  sodium_compat [ delete | rename ]
    [FILE] spl-autoload-compat.php [ edit | delete | rename ]
    [DIR]  style-engine [ delete | rename ]
    [FILE] style-engine.php [ edit | delete | rename ]
    [FILE] taxonomy.php [ edit | delete | rename ]
    [FILE] template-canvas.php [ edit | delete | rename ]
    [FILE] template-loader.php [ edit | delete | rename ]
    [FILE] template.php [ edit | delete | rename ]
    [DIR]  theme-compat [ delete | rename ]
    [FILE] theme-i18n.json [ edit | delete | rename ]
    [FILE] theme-previews.php [ edit | delete | rename ]
    [FILE] theme-templates.php [ edit | delete | rename ]
    [FILE] theme.json [ edit | delete | rename ]
    [FILE] theme.php [ edit | delete | rename ]
    [FILE] update.php [ edit | delete | rename ]
    [FILE] user.php [ edit | delete | rename ]
    [FILE] vars.php [ edit | delete | rename ]
    [FILE] version.php [ edit | delete | rename ]
    [DIR]  widgets [ delete | rename ]
    [FILE] widgets.php [ edit | delete | rename ]
    [FILE] wp-db.php [ edit | delete | rename ]
    [FILE] wp-diff.php [ edit | delete | rename ]
    
    Viewing: /var/www/designbasics/wp-includes/class-snoopy.php
    
    <?php
    
    /**
     * Deprecated. Use WP_HTTP (http.php) instead.
     */
    _deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/http.php' );
    
    if ( ! class_exists( 'Snoopy', false ) ) :
    /*************************************************
    
    Snoopy - the PHP net client
    Author: Monte Ohrt <monte@ispi.net>
    Copyright (c): 1999-2008 New Digital Group, all rights reserved
    Version: 1.2.4
    
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     *
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public
     * License along with this library; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    
    You may contact the author of Snoopy by e-mail at:
    monte@ohrt.com
    
    The latest version of Snoopy can be obtained from:
    http://snoopy.sourceforge.net/
    
    *************************************************/
    
    class Snoopy
    {
    	/**** Public variables ****/
    
    	/* user definable vars */
    
    	var $host			=	"www.php.net";		// host name we are connecting to
    	var $port			=	80;					// port we are connecting to
    	var $proxy_host		=	"";					// proxy host to use
    	var $proxy_port		=	"";					// proxy port to use
    	var $proxy_user		=	"";					// proxy user to use
    	var $proxy_pass		=	"";					// proxy password to use
    
    	var $agent			=	"Snoopy v1.2.4";	// agent we masquerade as
    	var	$referer		=	"";					// referer info to pass
    	var $cookies		=	array();			// array of cookies to pass
    												// $cookies["username"]="joe";
    	var	$rawheaders		=	array();			// array of raw headers to send
    												// $rawheaders["Content-Type"]="text/html";
    
    	var $maxredirs		=	5;					// http redirection depth maximum. 0 = disallow
    	var $lastredirectaddr	=	"";				// contains address of last redirected address
    	var	$offsiteok		=	true;				// allows redirection off-site
    	var $maxframes		=	0;					// frame content depth maximum. 0 = disallow
    	var $expandlinks	=	true;				// expand links to fully qualified URLs.
    												// this only applies to fetchlinks()
    												// submitlinks(), and submittext()
    	var $passcookies	=	true;				// pass set cookies back through redirects
    												// NOTE: this currently does not respect
    												// dates, domains or paths.
    
    	var	$user			=	"";					// user for http authentication
    	var	$pass			=	"";					// password for http authentication
    
    	// http accept types
    	var $accept			=	"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
    
    	var $results		=	"";					// where the content is put
    
    	var $error			=	"";					// error messages sent here
    	var	$response_code	=	"";					// response code returned from server
    	var	$headers		=	array();			// headers returned from server sent here
    	var	$maxlength		=	500000;				// max return data length (body)
    	var $read_timeout	=	0;					// timeout on read operations, in seconds
    												// supported only since PHP 4 Beta 4
    												// set to 0 to disallow timeouts
    	var $timed_out		=	false;				// if a read operation timed out
    	var	$status			=	0;					// http request status
    
    	var $temp_dir		=	"/tmp";				// temporary directory that the webserver
    												// has permission to write to.
    												// under Windows, this should be C:\temp
    
    	var	$curl_path		=	"/usr/local/bin/curl";
    												// Snoopy will use cURL for fetching
    												// SSL content if a full system path to
    												// the cURL binary is supplied here.
    												// set to false if you do not have
    												// cURL installed. See http://curl.haxx.se
    												// for details on installing cURL.
    												// Snoopy does *not* use the cURL
    												// library functions built into php,
    												// as these functions are not stable
    												// as of this Snoopy release.
    
    	/**** Private variables ****/
    
    	var	$_maxlinelen	=	4096;				// max line length (headers)
    
    	var $_httpmethod	=	"GET";				// default http request method
    	var $_httpversion	=	"HTTP/1.0";			// default http request version
    	var $_submit_method	=	"POST";				// default submit method
    	var $_submit_type	=	"application/x-www-form-urlencoded";	// default submit type
    	var $_mime_boundary	=   "";					// MIME boundary for multipart/form-data submit type
    	var $_redirectaddr	=	false;				// will be set if page fetched is a redirect
    	var $_redirectdepth	=	0;					// increments on an http redirect
    	var $_frameurls		= 	array();			// frame src urls
    	var $_framedepth	=	0;					// increments on frame depth
    
    	var $_isproxy		=	false;				// set if using a proxy server
    	var $_fp_timeout	=	30;					// timeout for socket connection
    
    /*======================================================================*\
    	Function:	fetch
    	Purpose:	fetch the contents of a web page
    				(and possibly other protocols in the
    				future like ftp, nntp, gopher, etc.)
    	Input:		$URI	the location of the page to fetch
    	Output:		$this->results	the output text from the fetch
    \*======================================================================*/
    
    	function fetch($URI)
    	{
    
    		//preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS);
    		$URI_PARTS = parse_url($URI);
    		if (!empty($URI_PARTS["user"]))
    			$this->user = $URI_PARTS["user"];
    		if (!empty($URI_PARTS["pass"]))
    			$this->pass = $URI_PARTS["pass"];
    		if (empty($URI_PARTS["query"]))
    			$URI_PARTS["query"] = '';
    		if (empty($URI_PARTS["path"]))
    			$URI_PARTS["path"] = '';
    
    		switch(strtolower($URI_PARTS["scheme"]))
    		{
    			case "http":
    				$this->host = $URI_PARTS["host"];
    				if(!empty($URI_PARTS["port"]))
    					$this->port = $URI_PARTS["port"];
    				if($this->_connect($fp))
    				{
    					if($this->_isproxy)
    					{
    						// using proxy, send entire URI
    						$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);
    					}
    					else
    					{
    						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
    						// no proxy, send only the path
    						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);
    					}
    
    					$this->_disconnect($fp);
    
    					if($this->_redirectaddr)
    					{
    						/* url was redirected, check if we've hit the max depth */
    						if($this->maxredirs > $this->_redirectdepth)
    						{
    							// only follow redirect if it's on this site, or offsiteok is true
    							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
    							{
    								/* follow the redirect */
    								$this->_redirectdepth++;
    								$this->lastredirectaddr=$this->_redirectaddr;
    								$this->fetch($this->_redirectaddr);
    							}
    						}
    					}
    
    					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
    					{
    						$frameurls = $this->_frameurls;
    						$this->_frameurls = array();
    
    						foreach ( $frameurls as $frameurl )
    						{
    							if($this->_framedepth < $this->maxframes)
    							{
    								$this->fetch($frameurl);
    								$this->_framedepth++;
    							}
    							else
    								break;
    						}
    					}
    				}
    				else
    				{
    					return false;
    				}
    				return true;
    				break;
    			case "https":
    				if(!$this->curl_path)
    					return false;
    				if(function_exists("is_executable"))
    				    if (!is_executable($this->curl_path))
    				        return false;
    				$this->host = $URI_PARTS["host"];
    				if(!empty($URI_PARTS["port"]))
    					$this->port = $URI_PARTS["port"];
    				if($this->_isproxy)
    				{
    					// using proxy, send entire URI
    					$this->_httpsrequest($URI,$URI,$this->_httpmethod);
    				}
    				else
    				{
    					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
    					// no proxy, send only the path
    					$this->_httpsrequest($path, $URI, $this->_httpmethod);
    				}
    
    				if($this->_redirectaddr)
    				{
    					/* url was redirected, check if we've hit the max depth */
    					if($this->maxredirs > $this->_redirectdepth)
    					{
    						// only follow redirect if it's on this site, or offsiteok is true
    						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
    						{
    							/* follow the redirect */
    							$this->_redirectdepth++;
    							$this->lastredirectaddr=$this->_redirectaddr;
    							$this->fetch($this->_redirectaddr);
    						}
    					}
    				}
    
    				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
    				{
    					$frameurls = $this->_frameurls;
    					$this->_frameurls = array();
    
    					foreach ( $frameurls as $frameurl )
    					{
    						if($this->_framedepth < $this->maxframes)
    						{
    							$this->fetch($frameurl);
    							$this->_framedepth++;
    						}
    						else
    							break;
    					}
    				}
    				return true;
    				break;
    			default:
    				// not a valid protocol
    				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
    				return false;
    				break;
    		}
    		return true;
    	}
    
    /*======================================================================*\
    	Function:	submit
    	Purpose:	submit an http form
    	Input:		$URI	the location to post the data
    				$formvars	the formvars to use.
    					format: $formvars["var"] = "val";
    				$formfiles  an array of files to submit
    					format: $formfiles["var"] = "/dir/filename.ext";
    	Output:		$this->results	the text output from the post
    \*======================================================================*/
    
    	function submit($URI, $formvars="", $formfiles="")
    	{
    		unset($postdata);
    
    		$postdata = $this->_prepare_post_body($formvars, $formfiles);
    
    		$URI_PARTS = parse_url($URI);
    		if (!empty($URI_PARTS["user"]))
    			$this->user = $URI_PARTS["user"];
    		if (!empty($URI_PARTS["pass"]))
    			$this->pass = $URI_PARTS["pass"];
    		if (empty($URI_PARTS["query"]))
    			$URI_PARTS["query"] = '';
    		if (empty($URI_PARTS["path"]))
    			$URI_PARTS["path"] = '';
    
    		switch(strtolower($URI_PARTS["scheme"]))
    		{
    			case "http":
    				$this->host = $URI_PARTS["host"];
    				if(!empty($URI_PARTS["port"]))
    					$this->port = $URI_PARTS["port"];
    				if($this->_connect($fp))
    				{
    					if($this->_isproxy)
    					{
    						// using proxy, send entire URI
    						$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);
    					}
    					else
    					{
    						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
    						// no proxy, send only the path
    						$this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);
    					}
    
    					$this->_disconnect($fp);
    
    					if($this->_redirectaddr)
    					{
    						/* url was redirected, check if we've hit the max depth */
    						if($this->maxredirs > $this->_redirectdepth)
    						{
    							if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
    								$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);
    
    							// only follow redirect if it's on this site, or offsiteok is true
    							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
    							{
    								/* follow the redirect */
    								$this->_redirectdepth++;
    								$this->lastredirectaddr=$this->_redirectaddr;
    								if( strpos( $this->_redirectaddr, "?" ) > 0 )
    									$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get
    								else
    									$this->submit($this->_redirectaddr,$formvars, $formfiles);
    							}
    						}
    					}
    
    					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
    					{
    						$frameurls = $this->_frameurls;
    						$this->_frameurls = array();
    
    						foreach ( $frameurls as $frameurl )
    						{
    							if($this->_framedepth < $this->maxframes)
    							{
    								$this->fetch($frameurl);
    								$this->_framedepth++;
    							}
    							else
    								break;
    						}
    					}
    
    				}
    				else
    				{
    					return false;
    				}
    				return true;
    				break;
    			case "https":
    				if(!$this->curl_path)
    					return false;
    				if(function_exists("is_executable"))
    				    if (!is_executable($this->curl_path))
    				        return false;
    				$this->host = $URI_PARTS["host"];
    				if(!empty($URI_PARTS["port"]))
    					$this->port = $URI_PARTS["port"];
    				if($this->_isproxy)
    				{
    					// using proxy, send entire URI
    					$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);
    				}
    				else
    				{
    					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
    					// no proxy, send only the path
    					$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);
    				}
    
    				if($this->_redirectaddr)
    				{
    					/* url was redirected, check if we've hit the max depth */
    					if($this->maxredirs > $this->_redirectdepth)
    					{
    						if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
    							$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);
    
    						// only follow redirect if it's on this site, or offsiteok is true
    						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
    						{
    							/* follow the redirect */
    							$this->_redirectdepth++;
    							$this->lastredirectaddr=$this->_redirectaddr;
    							if( strpos( $this->_redirectaddr, "?" ) > 0 )
    								$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get
    							else
    								$this->submit($this->_redirectaddr,$formvars, $formfiles);
    						}
    					}
    				}
    
    				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
    				{
    					$frameurls = $this->_frameurls;
    					$this->_frameurls = array();
    
    					foreach ( $frameurls as $frameurl )
    					{
    						if($this->_framedepth < $this->maxframes)
    						{
    							$this->fetch($frameurl);
    							$this->_framedepth++;
    						}
    						else
    							break;
    					}
    				}
    				return true;
    				break;
    
    			default:
    				// not a valid protocol
    				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
    				return false;
    				break;
    		}
    		return true;
    	}
    
    /*======================================================================*\
    	Function:	fetchlinks
    	Purpose:	fetch the links from a web page
    	Input:		$URI	where you are fetching from
    	Output:		$this->results	an array of the URLs
    \*======================================================================*/
    
    	function fetchlinks($URI)
    	{
    		if ($this->fetch($URI))
    		{
    			if($this->lastredirectaddr)
    				$URI = $this->lastredirectaddr;
    			if(is_array($this->results))
    			{
    				for($x=0;$x<count($this->results);$x++)
    					$this->results[$x] = $this->_striplinks($this->results[$x]);
    			}
    			else
    				$this->results = $this->_striplinks($this->results);
    
    			if($this->expandlinks)
    				$this->results = $this->_expandlinks($this->results, $URI);
    			return true;
    		}
    		else
    			return false;
    	}
    
    /*======================================================================*\
    	Function:	fetchform
    	Purpose:	fetch the form elements from a web page
    	Input:		$URI	where you are fetching from
    	Output:		$this->results	the resulting html form
    \*======================================================================*/
    
    	function fetchform($URI)
    	{
    
    		if ($this->fetch($URI))
    		{
    
    			if(is_array($this->results))
    			{
    				for($x=0;$x<count($this->results);$x++)
    					$this->results[$x] = $this->_stripform($this->results[$x]);
    			}
    			else
    				$this->results = $this->_stripform($this->results);
    
    			return true;
    		}
    		else
    			return false;
    	}
    
    
    /*======================================================================*\
    	Function:	fetchtext
    	Purpose:	fetch the text from a web page, stripping the links
    	Input:		$URI	where you are fetching from
    	Output:		$this->results	the text from the web page
    \*======================================================================*/
    
    	function fetchtext($URI)
    	{
    		if($this->fetch($URI))
    		{
    			if(is_array($this->results))
    			{
    				for($x=0;$x<count($this->results);$x++)
    					$this->results[$x] = $this->_striptext($this->results[$x]);
    			}
    			else
    				$this->results = $this->_striptext($this->results);
    			return true;
    		}
    		else
    			return false;
    	}
    
    /*======================================================================*\
    	Function:	submitlinks
    	Purpose:	grab links from a form submission
    	Input:		$URI	where you are submitting from
    	Output:		$this->results	an array of the links from the post
    \*======================================================================*/
    
    	function submitlinks($URI, $formvars="", $formfiles="")
    	{
    		if($this->submit($URI,$formvars, $formfiles))
    		{
    			if($this->lastredirectaddr)
    				$URI = $this->lastredirectaddr;
    			if(is_array($this->results))
    			{
    				for($x=0;$x<count($this->results);$x++)
    				{
    					$this->results[$x] = $this->_striplinks($this->results[$x]);
    					if($this->expandlinks)
    						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
    				}
    			}
    			else
    			{
    				$this->results = $this->_striplinks($this->results);
    				if($this->expandlinks)
    					$this->results = $this->_expandlinks($this->results,$URI);
    			}
    			return true;
    		}
    		else
    			return false;
    	}
    
    /*======================================================================*\
    	Function:	submittext
    	Purpose:	grab text from a form submission
    	Input:		$URI	where you are submitting from
    	Output:		$this->results	the text from the web page
    \*======================================================================*/
    
    	function submittext($URI, $formvars = "", $formfiles = "")
    	{
    		if($this->submit($URI,$formvars, $formfiles))
    		{
    			if($this->lastredirectaddr)
    				$URI = $this->lastredirectaddr;
    			if(is_array($this->results))
    			{
    				for($x=0;$x<count($this->results);$x++)
    				{
    					$this->results[$x] = $this->_striptext($this->results[$x]);
    					if($this->expandlinks)
    						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
    				}
    			}
    			else
    			{
    				$this->results = $this->_striptext($this->results);
    				if($this->expandlinks)
    					$this->results = $this->_expandlinks($this->results,$URI);
    			}
    			return true;
    		}
    		else
    			return false;
    	}
    
    
    
    /*======================================================================*\
    	Function:	set_submit_multipart
    	Purpose:	Set the form submission content type to
    				multipart/form-data
    \*======================================================================*/
    	function set_submit_multipart()
    	{
    		$this->_submit_type = "multipart/form-data";
    	}
    
    
    /*======================================================================*\
    	Function:	set_submit_normal
    	Purpose:	Set the form submission content type to
    				application/x-www-form-urlencoded
    \*======================================================================*/
    	function set_submit_normal()
    	{
    		$this->_submit_type = "application/x-www-form-urlencoded";
    	}
    
    
    
    
    /*======================================================================*\
    	Private functions
    \*======================================================================*/
    
    
    /*======================================================================*\
    	Function:	_striplinks
    	Purpose:	strip the hyperlinks from an html document
    	Input:		$document	document to strip.
    	Output:		$match		an array of the links
    \*======================================================================*/
    
    	function _striplinks($document)
    	{
    		preg_match_all("'<\s*a\s.*?href\s*=\s*			# find <a href=
    						([\"\'])?					# find single or double quote
    						(?(1) (.*?)\\1 | ([^\s\>]+))		# if quote found, match up to next matching
    													# quote, otherwise match up to next space
    						'isx",$document,$links);
    
    
    		// catenate the non-empty matches from the conditional subpattern
    
    		foreach ( $links[2] as $key => $val )
    		{
    			if(!empty($val))
    				$match[] = $val;
    		}
    
    		foreach ( $links[3] as $key => $val )
    		{
    			if(!empty($val))
    				$match[] = $val;
    		}
    
    		// return the links
    		return $match;
    	}
    
    /*======================================================================*\
    	Function:	_stripform
    	Purpose:	strip the form elements from an html document
    	Input:		$document	document to strip.
    	Output:		$match		an array of the links
    \*======================================================================*/
    
    	function _stripform($document)
    	{
    		preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);
    
    		// catenate the matches
    		$match = implode("\r\n",$elements[0]);
    
    		// return the links
    		return $match;
    	}
    
    
    
    /*======================================================================*\
    	Function:	_striptext
    	Purpose:	strip the text from an html document
    	Input:		$document	document to strip.
    	Output:		$text		the resulting text
    \*======================================================================*/
    
    	function _striptext($document)
    	{
    
    		// I didn't use preg eval (//e) since that is only available in PHP 4.0.
    		// so, list your entities one by one here. I included some of the
    		// more common ones.
    
    		$search = array("'<script[^>]*?>.*?</script>'si",	// strip out javascript
    						"'<[\/\!]*?[^<>]*?>'si",			// strip out html tags
    						"'([\r\n])[\s]+'",					// strip out white space
    						"'&(quot|#34|#034|#x22);'i",		// replace html entities
    						"'&(amp|#38|#038|#x26);'i",			// added hexadecimal values
    						"'&(lt|#60|#060|#x3c);'i",
    						"'&(gt|#62|#062|#x3e);'i",
    						"'&(nbsp|#160|#xa0);'i",
    						"'&(iexcl|#161);'i",
    						"'&(cent|#162);'i",
    						"'&(pound|#163);'i",
    						"'&(copy|#169);'i",
    						"'&(reg|#174);'i",
    						"'&(deg|#176);'i",
    						"'&(#39|#039|#x27);'",
    						"'&(euro|#8364);'i",				// europe
    						"'&a(uml|UML);'",					// german
    						"'&o(uml|UML);'",
    						"'&u(uml|UML);'",
    						"'&A(uml|UML);'",
    						"'&O(uml|UML);'",
    						"'&U(uml|UML);'",
    						"'&szlig;'i",
    						);
    		$replace = array(	"",
    							"",
    							"\\1",
    							"\"",
    							"&",
    							"<",
    							">",
    							" ",
    							chr(161),
    							chr(162),
    							chr(163),
    							chr(169),
    							chr(174),
    							chr(176),
    							chr(39),
    							chr(128),
    							chr(0xE4), // ANSI &auml;
    							chr(0xF6), // ANSI &ouml;
    							chr(0xFC), // ANSI &uuml;
    							chr(0xC4), // ANSI &Auml;
    							chr(0xD6), // ANSI &Ouml;
    							chr(0xDC), // ANSI &Uuml;
    							chr(0xDF), // ANSI &szlig;
    						);
    
    		$text = preg_replace($search,$replace,$document);
    
    		return $text;
    	}
    
    /*======================================================================*\
    	Function:	_expandlinks
    	Purpose:	expand each link into a fully qualified URL
    	Input:		$links			the links to qualify
    				$URI			the full URI to get the base from
    	Output:		$expandedLinks	the expanded links
    \*======================================================================*/
    
    	function _expandlinks($links,$URI)
    	{
    
    		preg_match("/^[^\?]+/",$URI,$match);
    
    		$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
    		$match = preg_replace("|/$|","",$match);
    		$match_part = parse_url($match);
    		$match_root =
    		$match_part["scheme"]."://".$match_part["host"];
    
    		$search = array( 	"|^http://".preg_quote($this->host)."|i",
    							"|^(\/)|i",
    							"|^(?!http://)(?!mailto:)|i",
    							"|/\./|",
    							"|/[^\/]+/\.\./|"
    						);
    
    		$replace = array(	"",
    							$match_root."/",
    							$match."/",
    							"/",
    							"/"
    						);
    
    		$expandedLinks = preg_replace($search,$replace,$links);
    
    		return $expandedLinks;
    	}
    
    /*======================================================================*\
    	Function:	_httprequest
    	Purpose:	go get the http data from the server
    	Input:		$url		the url to fetch
    				$fp			the current open file pointer
    				$URI		the full URI
    				$body		body contents to send if any (POST)
    	Output:
    \*======================================================================*/
    
    	function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="")
    	{
    		$cookie_headers = '';
    		if($this->passcookies && $this->_redirectaddr)
    			$this->setcookies();
    
    		$URI_PARTS = parse_url($URI);
    		if(empty($url))
    			$url = "/";
    		$headers = $http_method." ".$url." ".$this->_httpversion."\r\n";
    		if(!empty($this->agent))
    			$headers .= "User-Agent: ".$this->agent."\r\n";
    		if(!empty($this->host) && !isset($this->rawheaders['Host'])) {
    			$headers .= "Host: ".$this->host;
    			if(!empty($this->port) && $this->port != 80)
    				$headers .= ":".$this->port;
    			$headers .= "\r\n";
    		}
    		if(!empty($this->accept))
    			$headers .= "Accept: ".$this->accept."\r\n";
    		if(!empty($this->referer))
    			$headers .= "Referer: ".$this->referer."\r\n";
    		if(!empty($this->cookies))
    		{
    			if(!is_array($this->cookies))
    				$this->cookies = (array)$this->cookies;
    
    			reset($this->cookies);
    			if ( count($this->cookies) > 0 ) {
    				$cookie_headers .= 'Cookie: ';
    				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
    				$cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; ";
    				}
    				$headers .= substr($cookie_headers,0,-2) . "\r\n";
    			}
    		}
    		if(!empty($this->rawheaders))
    		{
    			if(!is_array($this->rawheaders))
    				$this->rawheaders = (array)$this->rawheaders;
    			foreach ( $this->rawheaders as $headerKey => $headerVal )
    				$headers .= $headerKey.": ".$headerVal."\r\n";
    		}
    		if(!empty($content_type)) {
    			$headers .= "Content-Type: $content_type";
    			if ($content_type == "multipart/form-data")
    				$headers .= "; boundary=".$this->_mime_boundary;
    			$headers .= "\r\n";
    		}
    		if(!empty($body))
    			$headers .= "Content-Length: ".strlen($body)."\r\n";
    		if(!empty($this->user) || !empty($this->pass))
    			$headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n";
    
    		//add proxy auth headers
    		if(!empty($this->proxy_user))
    			$headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n";
    
    
    		$headers .= "\r\n";
    
    		// set the read timeout if needed
    		if ($this->read_timeout > 0)
    			socket_set_timeout($fp, $this->read_timeout);
    		$this->timed_out = false;
    
    		fwrite($fp,$headers.$body,strlen($headers.$body));
    
    		$this->_redirectaddr = false;
    		unset($this->headers);
    
    		while($currentHeader = fgets($fp,$this->_maxlinelen))
    		{
    			if ($this->read_timeout > 0 && $this->_check_timeout($fp))
    			{
    				$this->status=-100;
    				return false;
    			}
    
    			if($currentHeader == "\r\n")
    				break;
    
    			// if a header begins with Location: or URI:, set the redirect
    			if(preg_match("/^(Location:|URI:)/i",$currentHeader))
    			{
    				// get URL portion of the redirect
    				preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches);
    				// look for :// in the Location header to see if hostname is included
    				if(!preg_match("|\:\/\/|",$matches[2]))
    				{
    					// no host in the path, so prepend
    					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
    					// eliminate double slash
    					if(!preg_match("|^/|",$matches[2]))
    							$this->_redirectaddr .= "/".$matches[2];
    					else
    							$this->_redirectaddr .= $matches[2];
    				}
    				else
    					$this->_redirectaddr = $matches[2];
    			}
    
    			if(preg_match("|^HTTP/|",$currentHeader))
    			{
                    if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status))
    				{
    					$this->status= $status[1];
                    }
    				$this->response_code = $currentHeader;
    			}
    
    			$this->headers[] = $currentHeader;
    		}
    
    		$results = '';
    		do {
        		$_data = fread($fp, $this->maxlength);
        		if (strlen($_data) == 0) {
            		break;
        		}
        		$results .= $_data;
    		} while(true);
    
    		if ($this->read_timeout > 0 && $this->_check_timeout($fp))
    		{
    			$this->status=-100;
    			return false;
    		}
    
    		// check if there is a redirect meta tag
    
    		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
    
    		{
    			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);
    		}
    
    		// have we hit our frame depth and is there frame src to fetch?
    		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
    		{
    			$this->results[] = $results;
    			for($x=0; $x<count($match[1]); $x++)
    				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
    		}
    		// have we already fetched framed content?
    		elseif(is_array($this->results))
    			$this->results[] = $results;
    		// no framed content
    		else
    			$this->results = $results;
    
    		return true;
    	}
    
    /*======================================================================*\
    	Function:	_httpsrequest
    	Purpose:	go get the https data from the server using curl
    	Input:		$url		the url to fetch
    				$URI		the full URI
    				$body		body contents to send if any (POST)
    	Output:
    \*======================================================================*/
    
    	function _httpsrequest($url,$URI,$http_method,$content_type="",$body="")
    	{
    		if($this->passcookies && $this->_redirectaddr)
    			$this->setcookies();
    
    		$headers = array();
    
    		$URI_PARTS = parse_url($URI);
    		if(empty($url))
    			$url = "/";
    		// GET ... header not needed for curl
    		//$headers[] = $http_method." ".$url." ".$this->_httpversion;
    		if(!empty($this->agent))
    			$headers[] = "User-Agent: ".$this->agent;
    		if(!empty($this->host))
    			if(!empty($this->port))
    				$headers[] = "Host: ".$this->host.":".$this->port;
    			else
    				$headers[] = "Host: ".$this->host;
    		if(!empty($this->accept))
    			$headers[] = "Accept: ".$this->accept;
    		if(!empty($this->referer))
    			$headers[] = "Referer: ".$this->referer;
    		if(!empty($this->cookies))
    		{
    			if(!is_array($this->cookies))
    				$this->cookies = (array)$this->cookies;
    
    			reset($this->cookies);
    			if ( count($this->cookies) > 0 ) {
    				$cookie_str = 'Cookie: ';
    				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
    				$cookie_str .= $cookieKey."=".urlencode($cookieVal)."; ";
    				}
    				$headers[] = substr($cookie_str,0,-2);
    			}
    		}
    		if(!empty($this->rawheaders))
    		{
    			if(!is_array($this->rawheaders))
    				$this->rawheaders = (array)$this->rawheaders;
    			foreach ( $this->rawheaders as $headerKey => $headerVal )
    				$headers[] = $headerKey.": ".$headerVal;
    		}
    		if(!empty($content_type)) {
    			if ($content_type == "multipart/form-data")
    				$headers[] = "Content-Type: $content_type; boundary=".$this->_mime_boundary;
    			else
    				$headers[] = "Content-Type: $content_type";
    		}
    		if(!empty($body))
    			$headers[] = "Content-Length: ".strlen($body);
    		if(!empty($this->user) || !empty($this->pass))
    			$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
    
    		$headerfile = tempnam( $this->temp_dir, "sno" );
    		$cmdline_params = '-k -D ' . escapeshellarg( $headerfile );
    
    		foreach ( $headers as $header ) {
    			$cmdline_params .= ' -H ' . escapeshellarg( $header );
    		}
    
    		if ( ! empty( $body ) ) {
    			$cmdline_params .= ' -d ' . escapeshellarg( $body );
    		}
    
    		if ( $this->read_timeout > 0 ) {
    			$cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout );
    		}
    
    
    		exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return );
    
    		if($return)
    		{
    			$this->error = "Error: cURL could not retrieve the document, error $return.";
    			return false;
    		}
    
    
    		$results = implode("\r\n",$results);
    
    		$result_headers = file("$headerfile");
    
    		$this->_redirectaddr = false;
    		unset($this->headers);
    
    		for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++)
    		{
    
    			// if a header begins with Location: or URI:, set the redirect
    			if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))
    			{
    				// get URL portion of the redirect
    				preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches);
    				// look for :// in the Location header to see if hostname is included
    				if(!preg_match("|\:\/\/|",$matches[2]))
    				{
    					// no host in the path, so prepend
    					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
    					// eliminate double slash
    					if(!preg_match("|^/|",$matches[2]))
    							$this->_redirectaddr .= "/".$matches[2];
    					else
    							$this->_redirectaddr .= $matches[2];
    				}
    				else
    					$this->_redirectaddr = $matches[2];
    			}
    
    			if(preg_match("|^HTTP/|",$result_headers[$currentHeader]))
    				$this->response_code = $result_headers[$currentHeader];
    
    			$this->headers[] = $result_headers[$currentHeader];
    		}
    
    		// check if there is a redirect meta tag
    
    		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
    		{
    			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);
    		}
    
    		// have we hit our frame depth and is there frame src to fetch?
    		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
    		{
    			$this->results[] = $results;
    			for($x=0; $x<count($match[1]); $x++)
    				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
    		}
    		// have we already fetched framed content?
    		elseif(is_array($this->results))
    			$this->results[] = $results;
    		// no framed content
    		else
    			$this->results = $results;
    
    		unlink("$headerfile");
    
    		return true;
    	}
    
    /*======================================================================*\
    	Function:	setcookies()
    	Purpose:	set cookies for a redirection
    \*======================================================================*/
    
    	function setcookies()
    	{
    		for($x=0; $x<count($this->headers); $x++)
    		{
    		if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match))
    			$this->cookies[$match[1]] = urldecode($match[2]);
    		}
    	}
    
    
    /*======================================================================*\
    	Function:	_check_timeout
    	Purpose:	checks whether timeout has occurred
    	Input:		$fp	file pointer
    \*======================================================================*/
    
    	function _check_timeout($fp)
    	{
    		if ($this->read_timeout > 0) {
    			$fp_status = socket_get_status($fp);
    			if ($fp_status["timed_out"]) {
    				$this->timed_out = true;
    				return true;
    			}
    		}
    		return false;
    	}
    
    /*======================================================================*\
    	Function:	_connect
    	Purpose:	make a socket connection
    	Input:		$fp	file pointer
    \*======================================================================*/
    
    	function _connect(&$fp)
    	{
    		if(!empty($this->proxy_host) && !empty($this->proxy_port))
    			{
    				$this->_isproxy = true;
    
    				$host = $this->proxy_host;
    				$port = $this->proxy_port;
    			}
    		else
    		{
    			$host = $this->host;
    			$port = $this->port;
    		}
    
    		$this->status = 0;
    
    		if($fp = fsockopen(
    					$host,
    					$port,
    					$errno,
    					$errstr,
    					$this->_fp_timeout
    					))
    		{
    			// socket connection succeeded
    
    			return true;
    		}
    		else
    		{
    			// socket connection failed
    			$this->status = $errno;
    			switch($errno)
    			{
    				case -3:
    					$this->error="socket creation failed (-3)";
    				case -4:
    					$this->error="dns lookup failure (-4)";
    				case -5:
    					$this->error="connection refused or timed out (-5)";
    				default:
    					$this->error="connection failed (".$errno.")";
    			}
    			return false;
    		}
    	}
    /*======================================================================*\
    	Function:	_disconnect
    	Purpose:	disconnect a socket connection
    	Input:		$fp	file pointer
    \*======================================================================*/
    
    	function _disconnect($fp)
    	{
    		return(fclose($fp));
    	}
    
    
    /*======================================================================*\
    	Function:	_prepare_post_body
    	Purpose:	Prepare post body according to encoding type
    	Input:		$formvars  - form variables
    				$formfiles - form upload files
    	Output:		post body
    \*======================================================================*/
    
    	function _prepare_post_body($formvars, $formfiles)
    	{
    		settype($formvars, "array");
    		settype($formfiles, "array");
    		$postdata = '';
    
    		if (count($formvars) == 0 && count($formfiles) == 0)
    			return;
    
    		switch ($this->_submit_type) {
    			case "application/x-www-form-urlencoded":
    				reset($formvars);
    				foreach ( $formvars as $key => $val ) {
    					if (is_array($val) || is_object($val)) {
    						foreach ( $val as $cur_key => $cur_val ) {
    							$postdata .= urlencode($key)."[]=".urlencode($cur_val)."&";
    						}
    					} else
    						$postdata .= urlencode($key)."=".urlencode($val)."&";
    				}
    				break;
    
    			case "multipart/form-data":
    				$this->_mime_boundary = "Snoopy".md5(uniqid(microtime()));
    
    				reset($formvars);
    				foreach ( $formvars as $key => $val ) {
    					if (is_array($val) || is_object($val)) {
    						foreach ( $val as $cur_key => $cur_val ) {
    							$postdata .= "--".$this->_mime_boundary."\r\n";
    							$postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n";
    							$postdata .= "$cur_val\r\n";
    						}
    					} else {
    						$postdata .= "--".$this->_mime_boundary."\r\n";
    						$postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n";
    						$postdata .= "$val\r\n";
    					}
    				}
    
    				reset($formfiles);
    				foreach ( $formfiles as $field_name => $file_names ) {
    					settype($file_names, "array");
    					foreach ( $file_names as $file_name ) {
    						if (!is_readable($file_name)) continue;
    
    						$fp = fopen($file_name, "r");
    						$file_content = fread($fp, filesize($file_name));
    						fclose($fp);
    						$base_name = basename($file_name);
    
    						$postdata .= "--".$this->_mime_boundary."\r\n";
    						$postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n";
    						$postdata .= "$file_content\r\n";
    					}
    				}
    				$postdata .= "--".$this->_mime_boundary."--\r\n";
    				break;
    		}
    
    		return $postdata;
    	}
    }
    endif;
    ?>
    
    Upload File: