function connect($url, $withHeaders = true, $withCookies = false)
 {
     $this->time('reset');
     global $wordpressPageName;
     $newfiles = array();
     $process = true;
     $cache_setting = (int) get_option("cc_whmcs_bridge_sso_cache");
     if (is_numeric($cache_setting) && $cache_setting > 0 && (substr($url, -4) == '.css' || substr($url, -3) == '.js' || substr($url, -4) == '.png' || substr($url, -4) == '.jpg' || substr($url, -5) == '.jpeg' || substr($url, -4) == '.gif')) {
         $cache_dir = dirname(__FILE__) . '/../cache/';
         $this->debug(0, 'Cacheable file - ' . $url);
         if (file_exists($cache_dir) && is_writable($cache_dir)) {
             $prefix = md5($url);
             foreach (glob($cache_dir . $prefix . '*') as $filename) {
                 if (strpos($filename, '_') !== false) {
                     $expires = explode('_', $filename);
                     if (time() > $expires[count($expires) - 1]) {
                         unlink($filename);
                         $this->debug(0, 'Cache expired on - ' . date('Y-m-d H:i:s', $expires[count($expires) - 1]) . ' - ' . $url);
                     } else {
                         $this->debug(0, 'Cache found for - ' . $url . ', fetching content from ' . $filename);
                         $body = file_get_contents($filename);
                         $this->body = $body;
                         $process = false;
                     }
                 }
             }
         }
     }
     if ($process) {
         $this->debug(0, 'Not cached, processing file - ' . $url);
         if (function_exists('cc_whmcsbridge_sso_session')) {
             cc_whmcsbridge_sso_session();
         }
         if (!session_id()) {
             @session_start();
         }
         if (isset($_SESSION[$this->sid])) {
             $this->debug(0, 'session:' . print_r($_SESSION[$this->sid], true));
         }
         $ch = curl_init();
         // initialize curl handle
         //echo '<br />call:'.$url;echo '<br />post='.print_r($this->post,true).'=<br />headers='.print_r($this->httpHeaders,true).'<br />';
         $this->debug(0, 'CURL call: ' . $url . (is_array($this->post) ? ' with ' . print_r($this->post, true) : ''));
         curl_setopt($ch, CURLOPT_URL, $url);
         // set url to post to
         curl_setopt($ch, CURLOPT_FAILONERROR, 1);
         if ($withHeaders) {
             curl_setopt($ch, CURLOPT_HEADER, 1);
         }
         if (get_option("cc_whmcs_bridge_affiliate_id") && is_numeric(get_option("cc_whmcs_bridge_affiliate_id")) && get_option("cc_whmcs_bridge_affiliate_id") > 0) {
             $this->httpHeaders[] = 'bridgeaffiliate: ' . get_option("cc_whmcs_bridge_affiliate_id");
         }
         $this->httpHeaders[] = 'bridgeon: 1';
         curl_setopt($ch, CURLOPT_HTTPHEADER, $this->httpHeaders);
         //avoid 417 errors
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         // return into a variable
         curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
         //cloudflare debug
         curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
         curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
         //CURLOPT_REFERER -  The contents of the "Referer: " header to be used in a HTTP request.
         //CURLOPT_INTERFACE -  The name of the outgoing network interface to use. This can be an interface name, an IP address or a host name.
         curl_setopt($ch, CURLOPT_TIMEOUT, 120);
         // times out after 120s
         if ($this->_protocol == "https") {
             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
             curl_setopt($ch, CURLOPT_CAINFO, NULL);
             curl_setopt($ch, CURLOPT_CAPATH, NULL);
             //curl_setopt($ch, CURLOPT_SSLVERSION, 3);
         }
         // gzip
         //curl_setopt($ch, CURLOPT_ENCODING, "");
         // quicker lookup
         //curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
         $cookies = "";
         $cookies = apply_filters('bridgeHttpRequest_pre', $cookies);
         if (isset($_SESSION[$this->sid]['cookie-array']) && count($_SESSION[$this->sid]['cookie-array']) > 0) {
             foreach ($_SESSION[$this->sid]['cookie-array'] as $n => $v) {
                 if ($cookies) {
                     $cookies .= ';';
                 }
                 $cookies .= $v;
             }
         }
         //echo '<br />cookie before='.$cookies.'=';
         if ($cookies) {
             $this->debug(0, 'Cookie before:' . print_r($cookies, true));
             curl_setopt($ch, CURLOPT_COOKIE, $cookies);
         }
         $_SESSION['cookieCache'] = $cookies;
         if (count($_FILES) > 0) {
             foreach ($_FILES as $name => $file) {
                 if (is_array($file['tmp_name']) && count($file['tmp_name']) > 0) {
                     $c = count($file['tmp_name']);
                     for ($i = 0; $i < $c; $i++) {
                         if ($file['tmp_name'][$i]) {
                             $newfile = BLOGUPLOADDIR . $file['name'][$i];
                             $newfiles[] = $newfile;
                             copy($file['tmp_name'][$i], $newfile);
                             if ($file['tmp_name'][$i]) {
                                 $this->post[$name][$i] = '@' . $newfile . $this->mimeType($newfile);
                             }
                         }
                     }
                 } elseif ($file['tmp_name']) {
                     $newfile = BLOGUPLOADDIR . $file['name'];
                     $newfiles[] = $newfile;
                     copy($file['tmp_name'], $newfile);
                     if ($file['tmp_name']) {
                         $this->post[$name] = '@' . $newfile . $this->mimeType($newfile);
                     }
                 }
             }
         }
         $apost = array();
         if (count($this->post) > 0) {
             curl_setopt($ch, CURLOPT_POST, 1);
             // set POST method
             $post = "";
             $apost = array();
             foreach ($this->post as $k => $v) {
                 if (is_array($v)) {
                     foreach ($v as $k2 => $v2) {
                         if (is_array($v2)) {
                             foreach ($v2 as $k3 => $v3) {
                                 if (is_array($v3)) {
                                     foreach ($v3 as $k4 => $v4) {
                                         $apost[$k . '[' . $k2 . ']' . '[' . $k3 . '][' . $k4 . ']'] = $v4;
                                     }
                                 } else {
                                     $apost[$k . '[' . $k2 . ']' . '[' . $k3 . ']'] = $v3;
                                 }
                             }
                         } else {
                             $apost[$k . '[' . $k2 . ']'] = $v2;
                         }
                     }
                 } else {
                     $apost[$k] = $v;
                 }
             }
         }
         if (count($apost) > 0) {
             // waiting for php 5.5's curlfiles support to be standard
             if (count($newfiles) > 0) {
                 curl_setopt($ch, CURLOPT_POSTFIELDS, $apost);
             } else {
                 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($apost));
             }
         }
         $data = curl_exec($ch);
         // run the whole process
         if (curl_errno($ch)) {
             $this->errno = curl_errno($ch);
             $this->error = curl_error($ch);
             $this->error('HTTP Error:' . $this->errno . '/' . $this->error . ' at ' . $url);
             return false;
         }
         $info = curl_getinfo($ch);
         $this->debug(0, 'Call information: ' . print_r($info, true));
         if (!empty($data)) {
             $headerLength = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
             $head = trim(substr($data, 0, $headerLength));
             if (strlen($data) > $headerLength) {
                 $body = substr($data, $headerLength);
             } else {
                 $body = '';
             }
             if (false !== strpos($head, "\r\n\r\n")) {
                 $headerParts = explode("\r\n\r\n", $head);
                 $head = $headerParts[count($headerParts) - 1];
             }
             $head = $this->processHeaders($head);
             $headers = $head['headers'];
             $cookies = $head['cookies'];
         } else {
             $headers = array();
             $cookies = '';
             $body = '';
             $this->error('An undefined error occured');
             return false;
         }
         if (isset($this->cookieArray['PHPSESSID']) && $this->cookieArray['PHPSESSID']) {
             $_SESSION[$this->sid]['sessid'] = $this->cookieArray['PHPSESSID'];
         }
         if ($cookies) {
             $this->debug(0, 'Cookie after:' . print_r($cookies, true));
             if (!isset($_SESSION[$this->sid])) {
                 $_SESSION[$this->sid] = array();
             }
             if (isset($_SESSION[$this->sid]['sessid'])) {
                 if (!strstr($cookies, 'PHPSESSID') && $cookies) {
                     $cookies .= ';' . $_SESSION[$this->sid]['sessid'];
                 } elseif (!strstr($cookies, 'PHPSESSID')) {
                     $cookies = $_SESSION[$this->sid]['sessid'];
                 }
             }
             $_SESSION[$this->sid]['cookies'] = $cookies;
         }
         //echo '<br />cookie after='.print_r($_SESSION[$this->sid]['cookies'],true).'=';
         if (is_array($cookies)) {
             $this->debug(0, 'Cookie after:' . print_r($cookies, true));
         }
         curl_close($ch);
         //remove temporary upload files
         if (count($newfiles) > 0) {
             foreach ($newfiles as $file) {
                 unlink($file);
             }
         }
         $this->headers = $headers;
         $this->data = $data;
         $this->cookies = $cookies;
         $this->body = $body;
         if ($headers['content-type']) {
             $this->type = $headers['content-type'];
         }
         $this->cookies = apply_filters('bridgeHttpRequest_post', $this->cookies);
         $this->debug(0, 'Call process completed in ' . $this->time('delta') . ' microseconds');
         if ($this->follow && isset($headers['location']) && $headers['location']) {
             //echo '<br />redirect to:'.print_r($headers,true);
             //echo '<br />protocol='.$this->_protocol;
             //echo '<br />path='.$this->_path;
             $redir = $headers['location'];
             if ($this->os() == 'WINDOWS') {
                 if (strpos($redir, $this->_protocol . '://' . $this->_host . $this->_path) === 0) {
                     //do nothing
                 } elseif (strstr($this->_protocol . '://' . $this->_host . $redir, $this->_protocol . '://' . $this->_host . $this->_path)) {
                     $new_redir = $this->_protocol . '://' . $this->_host . $this->_path;
                     if (strstr($new_redir, $redir) === false) {
                         $new_redir .= $redir;
                     }
                     $redir = $new_redir;
                 } elseif (!strstr($redir, $this->_host)) {
                     $redir = $this->_protocol . '://' . $this->_host . $this->_path . $redir;
                 }
             } else {
                 if (strpos($redir, $this->_protocol . '://' . $this->_host . $this->_path) === 0) {
                     //do nothing
                 } elseif (strstr($this->_protocol . '://' . $this->_host . $redir, $this->_protocol . '://' . $this->_host . $this->_path)) {
                     $redir = $this->_protocol . '://' . $this->_host . $redir;
                 } elseif ((strpos($redir, 'http://') === 0 || strpos($redir, 'https://') === 0) && !strstr($redir, $this->_host)) {
                     $this->redirect = true;
                     return $redir;
                 } elseif (!strstr($redir, $this->_host)) {
                     $redir = $this->_protocol . '://' . $this->_host . $this->_path . $redir;
                 }
             }
             $fwd = $this->forceWithRedirectToString($redir);
             if ($fwd) {
                 if (strstr($redir, '&')) {
                     $redir .= '&';
                 } elseif (strstr($redir, '?')) {
                     $redir .= '&';
                 } else {
                     $redir .= '?';
                 }
                 $redir .= $fwd;
             }
             $this->debug(0, 'Redirect to: ' . $redir);
             if (strstr($redir, 'viewinvoice.php')) {
                 $newRedir = cc_whmcs_bridge_parse_url($redir);
                 if ($redir != $newRedir) {
                     header('Location:' . $newRedir);
                     die;
                 }
             } else {
                 if (strstr($redir, 'cpsess')) {
                     header('location: ' . $redir);
                     die;
                 } else {
                     if (strstr($redir, 'custom_page=reissue') || strstr($redir, 'custom_page=manage_validation') || strstr($url, 'dologin') !== false && !isset($this->post['bg'])) {
                         $newRedir = cc_whmcs_bridge_parse_url($redir);
                         if ($wordpressPageName) {
                             $p = $wordpressPageName;
                         } else {
                             $p = '/';
                         }
                         $this->debug(0, 'Processing redirect...');
                         if (strstr($url, 'dologin') !== false && class_exists('wpusers')) {
                             $this->debug(0, 'Logging in to WordPress with ' . $this->post['username'] . '/' . $this->post['password']);
                             $wpusers = new wpusers();
                             $wpusers->loginWpUser($this->post['username'], $this->post['password']);
                         }
                         if (get_option('cc_whmcs_bridge_permalinks') && function_exists('cc_whmcs_bridge_parser_with_permalinks')) {
                             $f[] = '/.*\\/([a-zA-Z\\_]*?).php.(.*?)/';
                             $r[] = get_option('home') . $p . '/$1?$2';
                             $f[] = "/([a-zA-Z0-9\\_]*?).php.(.*?)/";
                             $r[] = get_option('home') . $p . '/$1?$2';
                         } else {
                             $f[] = '/.*\\/([a-zA-Z\\_]*?).php.(.*?)/';
                             $r[] = get_option('home') . $p . '?ccce=$1&$2';
                             $f[] = "/([a-zA-Z0-9\\_]*?).php.(.*?)/";
                             $r[] = get_option('home') . $p . '?ccce=$1&$2';
                         }
                         $this->debug(0, 'Location: ' . $newRedir);
                         $newRedir = preg_replace($f, $r, $newRedir, -1, $count);
                         header('Location:' . $newRedir);
                         die;
                     }
                 }
             }
             if (!$this->repost) {
                 $this->post = array();
             }
             $this->countRedirects++;
             if ($this->countRedirects < 10) {
                 //if ($redir != $url) {
                 return $this->connect($redir, $withHeaders, $withCookies);
                 //}
             } else {
                 $this->error('ERROR: Too many redirects ' . $url . ' > ' . $headers['location'], E_USER_ERROR);
                 return false;
             }
         }
         if (is_numeric($cache_setting) && $cache_setting > 0 && (substr($url, -4) == '.css' || substr($url, -3) == '.js' || substr($url, -4) == '.png' || substr($url, -4) == '.jpg' || substr($url, -5) == '.jpeg' || substr($url, -4) == '.gif')) {
             $cache_dir = dirname(__FILE__) . '/../cache/';
             if (file_exists($cache_dir) && is_writable($cache_dir)) {
                 $filename = md5($url) . '_' . strtotime('+' . $cache_setting . ' minutes');
                 file_put_contents($cache_dir . $filename, $body);
                 $this->debug(0, 'Cache written for ' . $url);
             }
         }
         return $body;
     } else {
         return $body;
     }
 }
function cc_whmcs_bridge_init()
{
    ob_start();
    if (function_exists('cc_whmcsbridge_sso_session')) {
        cc_whmcsbridge_sso_session();
    }
    if (!session_id()) {
        @session_start();
    }
    register_sidebars(1, array('name' => 'WHMCS Top Page Widget Area', 'id' => 'whmcs-top-page'));
    //register_sidebars(1,array('name'=>'WHMCS Bottom Page Widget Area','id'=>'whmcs-top-page',));
    if (get_option('cc_whmcs_bridge_jquery') == 'wp') {
        wp_enqueue_script(array('jquery', 'jquery-ui', 'jquery-ui-slider', 'jquery-ui-button'));
    }
    if (is_admin() && isset($_REQUEST['page']) && $_REQUEST['page'] == 'cc-ce-bridge-cp') {
        wp_enqueue_script(array('jquery-ui-tabs'));
        wp_enqueue_style('jquery-style', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/flick/jquery-ui.css');
    }
}