linccce

Paypal-to-paysera

May 18th, 2014
11,404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 15.01 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  
  5. * @version      1.0
  6.  
  7. * @package      DJ Classifieds
  8.  
  9. * @subpackage   DJ Classifieds Payment Plugin
  10.  
  11. * @copyright    Copyright (C) 2010 DJ-Extensions.com LTD, All rights reserved.
  12.  
  13. * @license      http://www.gnu.org/licenses GNU/GPL
  14.  
  15. * @autor url    http://design-joomla.eu
  16.  
  17. * @autor email  [email protected]
  18.  
  19. * @Developer    Lukasz Ciastek - [email protected]
  20.  
  21. *
  22.  
  23. *
  24.  
  25. * DJ Classifieds is free software: you can redistribute it and/or modify
  26.  
  27. * it under the terms of the GNU General Public License as published by
  28.  
  29. * the Free Software Foundation, either version 3 of the License, or
  30.  
  31. * (at your option) any later version.
  32.  
  33. *
  34.  
  35. * DJ Classifieds is distributed in the hope that it will be useful,
  36.  
  37. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  38.  
  39. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  40.  
  41. * GNU General Public License for more details.
  42.  
  43. *
  44.  
  45. * You should have received a copy of the GNU General Public License
  46.  
  47. * along with DJ Classifieds. If not, see <http://www.gnu.org/licenses/>.
  48.  
  49. *
  50.  
  51. */
  52.  
  53. defined('_JEXEC') or die('Restricted access');
  54.  
  55. jimport('joomla.event.plugin');
  56.  
  57. $lang = JFactory::getLanguage();
  58.  
  59. $lang->load('plg_djclassifiedspayment_djcfPaypal',JPATH_ADMINISTRATOR);
  60.  
  61. class plgdjclassifiedspaymentdjcfPaypal extends JPlugin
  62.  
  63. {
  64.  
  65.     function plgdjclassifiedspaymentdjcfPaypal( &$subject, $config)
  66.  
  67.     {
  68.  
  69.         parent::__construct($subject, $config);
  70.  
  71.         $this->loadLanguage('plg_djcfPaypal');
  72.  
  73.         $params["plugin_name"] = "djcfPaypal";
  74.  
  75.         $params["icon"] = "paypal_icon.png";
  76.  
  77.         $params["logo"] = "paypal_overview.png";
  78.  
  79.         $params["description"] = JText::_("PLG_DJCFPAYPAL_PAYMENT_METHOD_DESC");
  80.  
  81.         $params["payment_method"] = JText::_("PLG_DJCFPAYPAL_PAYMENT_METHOD_NAME");
  82.  
  83.         $params["testmode"] = $this->params->get("test");
  84.  
  85.         $params["currency_code"] = $this->params->get("currency_code");
  86.  
  87.         $params["email_id"] = $this->params->get("email_id");
  88.  
  89.         $this->params = $params;
  90.  
  91.  
  92.  
  93.     }
  94.  
  95.     function onProcessPayment()
  96.  
  97.     {
  98.  
  99.         $ptype = JRequest::getVar('ptype','');
  100.  
  101.         $id = JRequest::getInt('id','0');
  102.  
  103.         $html="";
  104.  
  105.  
  106.  
  107.            
  108.  
  109.         if($ptype == $this->params["plugin_name"])
  110.  
  111.         {
  112.  
  113.             $action = JRequest::getVar('pactiontype','');
  114.  
  115.             switch ($action)
  116.  
  117.             {
  118.  
  119.                 case "process" :
  120.  
  121.                 $html = $this->process($id);
  122.  
  123.                 break;
  124.  
  125.                 case "notify" :
  126.  
  127.                 $html = $this->_notify_url();
  128.  
  129.                 break;
  130.  
  131.                 case "paymentmessage" :
  132.  
  133.                 $html = $this->_paymentsuccess();
  134.  
  135.                 break;
  136.  
  137.                 default :
  138.  
  139.                 $html =  $this->process($id);
  140.  
  141.                 break;
  142.  
  143.             }
  144.  
  145.         }
  146.  
  147.         return $html;
  148.  
  149.     }
  150.  
  151.     function _notify_url()
  152.  
  153.     {
  154.  
  155.         $db = JFactory::getDBO();
  156.  
  157.         $par = &JComponentHelper::getParams( 'com_djclassifieds' );
  158.  
  159.         $account_type=$this->params["testmode"];
  160.  
  161.         $user   = JFactory::getUser();
  162.  
  163.         $id = JRequest::getInt('id','0');
  164.  
  165.         $paypal_info = $_POST;
  166.  
  167.        
  168.  
  169.         /*$fil = fopen('ppraport/pp_raport.txt', 'a');
  170.  
  171.         fwrite($fil, "\n\n--------------------post_first-----------------\n");
  172.  
  173.         $post = $_POST;
  174.  
  175.         foreach ($post as $key => $value) {
  176.  
  177.         fwrite($fil, $key.' - '.$value."\n");
  178.  
  179.         }
  180.  
  181.         fclose($fil);*/
  182.  
  183.  
  184.  
  185.         $paypal_ipn = new paypal_ipn($paypal_info);
  186.  
  187.         foreach ($paypal_ipn->paypal_post_vars as $key=>$value)
  188.  
  189.         {
  190.  
  191.             if (getType($key)=="string")
  192.  
  193.             {
  194.  
  195.                 eval("\$$key=\$value;");
  196.  
  197.             }
  198.  
  199.         }
  200.  
  201.         $paypal_ipn->send_response($account_type);
  202.  
  203.         if (!$paypal_ipn->is_verified())
  204.  
  205.         {
  206.  
  207.             die();
  208.  
  209.         }
  210.  
  211.         $paymentstatus=0;
  212.  
  213.  
  214.  
  215.             $status = $paypal_ipn->get_payment_status();
  216.  
  217.             $txn_id=$paypal_ipn->paypal_post_vars['txn_id'];
  218.  
  219.            
  220.  
  221.             if(($status=='Completed') || ($status=='Pending' && $account_type==1)){            
  222.  
  223.                
  224.  
  225.                 $query = "SELECT p.*  FROM #__djcf_payments p "
  226.  
  227.                         ."WHERE p.id='".$id."' ";                  
  228.  
  229.                 $db->setQuery($query);
  230.  
  231.                 $payment = $db->loadObject();
  232.  
  233.                
  234.  
  235.                 if($payment){                  
  236.  
  237.                     $query = "UPDATE #__djcf_payments SET status='Completed',transaction_id='".$txn_id."' "
  238.  
  239.                             ."WHERE id=".$id." AND method='djcfPaypal'";                   
  240.  
  241.                     $db->setQuery($query);
  242.  
  243.                     $db->query();
  244.  
  245.                    
  246.  
  247.                    
  248.  
  249.                     if($payment->type==2){                                     
  250.  
  251.                         $date_sort = date("Y-m-d H:i:s");
  252.  
  253.                         $query = "UPDATE #__djcf_items SET date_sort='".$date_sort."' "
  254.  
  255.                                 ."WHERE id=".$payment->item_id." ";
  256.  
  257.                         $db->setQuery($query);
  258.  
  259.                         $db->query();
  260.  
  261.                     }else if($payment->type==1){
  262.  
  263.                        
  264.  
  265.                         $query = "SELECT p.points  FROM #__djcf_points p WHERE p.id='".$payment->item_id."' ";                 
  266.  
  267.                         $db->setQuery($query);
  268.  
  269.                         $points = $db->loadResult();
  270.  
  271.                        
  272.  
  273.                         $query = "INSERT INTO #__djcf_users_points (`user_id`,`points`,`description`) "
  274.  
  275.                                 ."VALUES ('".$payment->user_id."','".$points."','".JText::_('COM_DJCLASSIFIEDS_POINTS_PACKAGE')." PayPal <br />".JText::_('COM_DJCLASSIFIEDS_PAYMENT_ID').' '.$payment->id."')";                   
  276.  
  277.                         $db->setQuery($query);
  278.  
  279.                         $db->query();                                                                      
  280.  
  281.                     }else{
  282.  
  283.                         $query = "SELECT c.*  FROM #__djcf_items i, #__djcf_categories c "
  284.  
  285.                                 ."WHERE i.cat_id=c.id AND i.id='".$payment->item_id."' ";                  
  286.  
  287.                         $db->setQuery($query);
  288.  
  289.                         $cat = $db->loadObject();
  290.  
  291.                        
  292.  
  293.                         $pub=0;
  294.  
  295.                         if(($cat->autopublish=='1') || ($cat->autopublish=='0' && $par->get('autopublish')=='1')){                     
  296.  
  297.                             $pub = 1;                                                  
  298.  
  299.                         }
  300.  
  301.                
  302.  
  303.                         $query = "UPDATE #__djcf_items SET payed=1, pay_type='', published='".$pub."' "
  304.  
  305.                                 ."WHERE id=".$payment->item_id." ";                
  306.  
  307.                         $db->setQuery($query);
  308.  
  309.                         $db->query();          
  310.  
  311.                     }                      
  312.  
  313.                 }                                  
  314.  
  315.             }else{
  316.  
  317.                 $query = "UPDATE #__djcf_payments SET status='".$status."',transaction_id='".$txn_id."' "
  318.  
  319.                         ."WHERE id=".$id." AND method='djcfPaypal'";                   
  320.  
  321.                 $db->setQuery($query);
  322.  
  323.                 $db->query();  
  324.  
  325.             }
  326.  
  327.                
  328.  
  329.        
  330.  
  331.        
  332.  
  333.        
  334.  
  335.     }
  336.  
  337.    
  338.  
  339.     function process($id)
  340.  
  341.     {
  342.  
  343.         JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');     
  344.  
  345.         jimport( 'joomla.database.table' );
  346.  
  347.         $db     = JFactory::getDBO();
  348.  
  349.         $app    = JFactory::getApplication();
  350.  
  351.         $Itemid = JRequest::getInt("Itemid",'0');
  352.  
  353.         $par    = JComponentHelper::getParams( 'com_djclassifieds' );
  354.  
  355.         $user   = JFactory::getUser();
  356.  
  357.         $ptype  = JRequest::getVar('ptype');
  358.  
  359.         $type   = JRequest::getVar('type','');
  360.  
  361.         $row    = JTable::getInstance('Payments', 'DJClassifiedsTable');   
  362.  
  363.  
  364.  
  365.          if($type=='prom_top'){                    
  366.  
  367.             $query ="SELECT i.* FROM #__djcf_items i "
  368.  
  369.                     ."WHERE i.id=".$id." LIMIT 1";
  370.  
  371.             $db->setQuery($query);
  372.  
  373.             $item = $db->loadObject();
  374.  
  375.             if(!isset($item)){
  376.  
  377.                 $message = JText::_('COM_DJCLASSIFIEDS_WRONG_AD');
  378.  
  379.                 $redirect="index.php?option=com_djclassifieds&view=items&cid=0";
  380.  
  381.             }                                
  382.  
  383.                              
  384.  
  385.             $row->item_id = $id;
  386.  
  387.             $row->user_id = $user->id;
  388.  
  389.             $row->method = $ptype;
  390.  
  391.             $row->status = 'Start';
  392.  
  393.             $row->ip_address = $_SERVER['REMOTE_ADDR'];
  394.  
  395.             $row->price = $par->get('promotion_move_top_price',0);
  396.  
  397.             $row->type=2;          
  398.  
  399.             $row->store();
  400.  
  401.  
  402.  
  403.             $amount = $par->get('promotion_move_top_price',0);
  404.  
  405.             $itemname = $item->name;
  406.  
  407.             $item_id = $row->id;
  408.  
  409.             $item_cid = '&cid='.$item->cat_id;          
  410.  
  411.         }else if($type=='points'){
  412.  
  413.             $query ="SELECT p.* FROM #__djcf_points p "                
  414.  
  415.                    ."WHERE p.id=".$id." LIMIT 1";
  416.  
  417.             $db->setQuery($query);
  418.  
  419.             $points = $db->loadObject();
  420.  
  421.             if(!isset($item)){
  422.  
  423.                 $message = JText::_('COM_DJCLASSIFIEDS_WRONG_POINTS_PACKAGE');
  424.  
  425.                 $redirect="index.php?option=com_djclassifieds&view=items&cid=0";
  426.  
  427.             }          
  428.  
  429.                 $row->item_id = $id;
  430.  
  431.                 $row->user_id = $user->id;
  432.  
  433.                 $row->method = $ptype;
  434.  
  435.                 $row->status = 'Start';
  436.  
  437.                 $row->ip_address = $_SERVER['REMOTE_ADDR'];
  438.  
  439.                 $row->price = $points->price;
  440.  
  441.                 $row->type=1;
  442.  
  443.                
  444.  
  445.                 $row->store();     
  446.  
  447.            
  448.  
  449.             $amount = $points->price;
  450.  
  451.             $itemname = $points->name;
  452.  
  453.             $item_id = $row->id;
  454.  
  455.             $item_cid = '';
  456.  
  457.         }else{
  458.  
  459.             $query ="SELECT i.*, c.price as c_price FROM #__djcf_items i "
  460.  
  461.                    ."LEFT JOIN #__djcf_categories c ON c.id=i.cat_id "
  462.  
  463.                    ."WHERE i.id=".$id." LIMIT 1";
  464.  
  465.             $db->setQuery($query);
  466.  
  467.             $item = $db->loadObject();
  468.  
  469.             if(!isset($item)){
  470.  
  471.                 $message = JText::_('COM_DJCLASSIFIEDS_WRONG_AD');
  472.  
  473.                 $redirect="index.php?option=com_djclassifieds&view=items&cid=0";
  474.  
  475.             }
  476.  
  477.            
  478.  
  479.                 $amount = 0;
  480.  
  481.                
  482.  
  483.                 if(strstr($item->pay_type, 'cat')){        
  484.  
  485.                     $amount += $item->c_price/100;
  486.  
  487.                 }
  488.  
  489.                 if(strstr($item->pay_type, 'duration_renew')){         
  490.  
  491.                     $query = "SELECT d.price_renew FROM #__djcf_days d "
  492.  
  493.                     ."WHERE d.days=".$item->exp_days;
  494.  
  495.                     $db->setQuery($query);
  496.  
  497.                     $amount += $db->loadResult();
  498.  
  499.                 }else if(strstr($item->pay_type, 'duration')){         
  500.  
  501.                     $query = "SELECT d.price FROM #__djcf_days d "
  502.  
  503.                     ."WHERE d.days=".$item->exp_days;
  504.  
  505.                     $db->setQuery($query);
  506.  
  507.                     $amount += $db->loadResult();
  508.  
  509.                 }
  510.  
  511.                
  512.  
  513.                 $query = "SELECT p.* FROM #__djcf_promotions p "
  514.  
  515.                     ."WHERE p.published=1 ORDER BY p.id ";
  516.  
  517.                 $db->setQuery($query);
  518.  
  519.                 $promotions=$db->loadObjectList();
  520.  
  521.                 foreach($promotions as $prom){
  522.  
  523.                     if(strstr($item->pay_type, $prom->name)){  
  524.  
  525.                         $amount += $prom->price;
  526.  
  527.                     }  
  528.  
  529.                 }
  530.  
  531.            
  532.  
  533.                 /*$query = 'DELETE FROM #__djcf_payments WHERE item_id= "'.$id.'" ';
  534.  
  535.                 $db->setQuery($query);
  536.  
  537.                 $db->query();
  538.  
  539.                
  540.  
  541.                
  542.  
  543.                 $query = 'INSERT INTO #__djcf_payments ( item_id,user_id,method,  status)' .
  544.  
  545.                         ' VALUES ( "'.$id.'" ,"'.$user->id.'","'.$ptype.'" ,"Start" )'
  546.  
  547.                         ;
  548.  
  549.                 $db->setQuery($query);
  550.  
  551.                 $db->query();*/
  552.  
  553.                
  554.  
  555.                     $row->item_id = $id;
  556.  
  557.                     $row->user_id = $user->id;
  558.  
  559.                     $row->method = $ptype;
  560.  
  561.                     $row->status = 'Start';
  562.  
  563.                     $row->ip_address = $_SERVER['REMOTE_ADDR'];
  564.  
  565.                     $row->price = $amount;
  566.  
  567.                     $row->type=0;
  568.  
  569.                
  570.  
  571.                 $row->store();                 
  572.  
  573.            
  574.  
  575.        
  576.  
  577.        
  578.  
  579.             $itemname = $item->name;
  580.  
  581.             $item_id = $row->id;
  582.  
  583.             $item_cid = '&cid='.$item->cat_id;
  584.  
  585.         }
  586.  
  587.  
  588.  
  589.         $urlpaypal="";
  590.  
  591.         if ($this->params["testmode"]=="1")
  592.  
  593.         {
  594.  
  595.             $urlpaypal="https://www.sandbox.paypal.com/cgi-bin/webscr";
  596.  
  597.         }
  598.  
  599.         elseif ($this->params["testmode"]=="0")
  600.  
  601.         {
  602.  
  603.             $urlpaypal="https://www.paypal.com/cgi-bin/webscr";
  604.  
  605.         }
  606.  
  607.         header("Content-type: text/html; charset=utf-8");
  608.  
  609.         echo JText::_('PLG_DJCFPAYPAL_REDIRECTING_PLEASE_WAIT');
  610.  
  611.         $form ='<form id="paypalform" action="'.$urlpaypal.'" method="post">';
  612.  
  613.         $form .='<input type="hidden" name="cmd" value="_xclick">';
  614.  
  615.         $form .='<input id="custom" type="hidden" name="custom" value="'.$item_id.'">';
  616.  
  617.         $form .='<input type="hidden" name="business" value="'.$this->params["email_id"].'">';
  618.  
  619.         $form .='<input type="hidden" name="currency_code" value="'.$this->params["currency_code"].'">';
  620.  
  621.         $form .='<input type="hidden" name="item_name" value="'.$itemname.'">';
  622.  
  623.         $form .='<input type="hidden" name="amount" value="'.$amount.'">';
  624.  
  625.         $form .='<input TYPE="hidden" name="charset" value="utf-8">';
  626.  
  627.         $form .='<input type="hidden" name="cancel_return" value="'.JRoute::_(JURI::root().'index.php?option=com_djclassifieds&task=paymentReturn&r=error&id='.$item_id.$item_cid.'&Itemid='.$Itemid).'">';
  628.  
  629.         $form .='<input type="hidden" name="notify_url" value="'.JRoute::_(JURI::root().'index.php?option=com_djclassifieds&task=processPayment&ptype='.$this->params["plugin_name"].'&pactiontype=notify&id='.$item_id.'&Itemid='.$Itemid).'">';
  630.  
  631.         $form .='<input type="hidden" name="return" value="'.JRoute::_(JURI::root().'index.php?option=com_djclassifieds&task=paymentReturn&r=ok&id='.$item_id.$item_cid.'&Itemid='.$Itemid).'">';
  632.  
  633.         $form .='</form>';
  634.  
  635.         echo $form;
  636.  
  637.     ?>
  638.  
  639.         <script type="text/javascript">
  640.  
  641.             callpayment()
  642.  
  643.             function callpayment(){
  644.  
  645.                 var id = document.getElementById('custom').value ;
  646.  
  647.                 if ( id > 0 && id != '' ) {
  648.  
  649.                     document.getElementById('paypalform').submit();
  650.  
  651.                 }
  652.  
  653.             }
  654.  
  655.         </script>
  656.  
  657.     <?php
  658.  
  659.     }
  660.  
  661.  
  662.  
  663.     function onPaymentMethodList($val)
  664.  
  665.     {
  666.  
  667.         $type='';
  668.  
  669.         if($val['type']){
  670.  
  671.             $type='&type='.$val['type'];   
  672.  
  673.         }      
  674.  
  675.         $html ='';
  676.  
  677.         if($this->params["email_id"]!=''){
  678.  
  679.             $paymentLogoPath = JURI::root()."plugins/djclassifiedspayment/".$this->params["plugin_name"]."/".$this->params["plugin_name"]."/images/".$this->params["logo"];
  680.  
  681.             $form_action = JRoute :: _("index.php?option=com_djclassifieds&task=processPayment&ptype=".$this->params["plugin_name"]."&pactiontype=process&id=".$val["id"].$type, false);
  682.  
  683.             $html ='<table cellpadding="5" cellspacing="0" width="100%" border="0">
  684.  
  685.                 <tr>';
  686.  
  687.                     if($this->params["logo"] != ""){
  688.  
  689.                 $html .='<td class="td1" width="160" align="center">
  690.  
  691.                         <img src="'.$paymentLogoPath.'" title="'. $this->params["payment_method"].'"/>
  692.  
  693.                     </td>';
  694.  
  695.                      }
  696.  
  697.                     $html .='<td class="td2">
  698.  
  699.                         <h2>PAYPAL</h2>
  700.  
  701.                         <p style="text-align:justify;">'.$this->params["description"].'</p>
  702.  
  703.                     </td>
  704.  
  705.                     <td class="td3" width="130" align="center">
  706.  
  707.                         <a class="button" style="text-decoration:none;" href="'.$form_action.'">'.JText::_('COM_DJCLASSIFIEDS_BUY_NOW').'</a>
  708.  
  709.                     </td>
  710.  
  711.                 </tr>
  712.  
  713.             </table>';
  714.  
  715.         }
  716.  
  717.         return $html;
  718.  
  719.     }
  720.  
  721. }
  722.  
  723. class paypal_ipn
  724.  
  725. {
  726.  
  727.     var $paypal_post_vars;
  728.  
  729.     var $paypal_response;
  730.  
  731.     var $timeout;
  732.  
  733.     var $error_email;
  734.  
  735.     function paypal_ipn($paypal_post_vars) {
  736.  
  737.         $this->paypal_post_vars = $paypal_post_vars;
  738.  
  739.         $this->timeout = 120;
  740.  
  741.     }
  742.  
  743.     function send_response($account_type)
  744.  
  745.     {
  746.  
  747.         $fp  = '';
  748.  
  749.         if($account_type == '1')
  750.  
  751.         {
  752.  
  753.             $fp = @fsockopen( "www.sandbox.paypal.com", 80, $errno, $errstr, 120 );
  754.  
  755.         }else if($account_type == '0')
  756.  
  757.         {
  758.  
  759.             $fp = @fsockopen( "www.paypal.com", 80, $errno, $errstr, 120 );
  760.  
  761.         }
  762.  
  763.         if (!$fp) {
  764.  
  765.             $this->error_out("PHP fsockopen() error: " . $errstr , "");
  766.  
  767.         } else {
  768.  
  769.             foreach($this->paypal_post_vars AS $key => $value) {
  770.  
  771.                 if (@get_magic_quotes_gpc()) {
  772.  
  773.                     $value = stripslashes($value);
  774.  
  775.                 }
  776.  
  777.                 $values[] = "$key" . "=" . urlencode($value);
  778.  
  779.             }
  780.  
  781.             $response = @implode("&", $values);
  782.  
  783.             $response .= "&cmd=_notify-validate";
  784.  
  785.             fputs( $fp, "POST /cgi-bin/webscr HTTP/1.0\r\n" );
  786.  
  787.             fputs( $fp, "Content-type: application/x-www-form-urlencoded\r\n" );
  788.  
  789.             fputs( $fp, "Content-length: " . strlen($response) . "\r\n\n" );
  790.  
  791.             fputs( $fp, "$response\n\r" );
  792.  
  793.             fputs( $fp, "\r\n" );
  794.  
  795.             $this->send_time = time();
  796.  
  797.             $this->paypal_response = "";
  798.  
  799.  
  800.  
  801.             while (!feof($fp)) {
  802.  
  803.                 $this->paypal_response .= fgets( $fp, 1024 );
  804.  
  805.  
  806.  
  807.                 if ($this->send_time < time() - $this->timeout) {
  808.  
  809.                     $this->error_out("Timed out waiting for a response from PayPal. ($this->timeout seconds)" , "");
  810.  
  811.                 }
  812.  
  813.             }
  814.  
  815.             fclose( $fp );
  816.  
  817.         }
  818.  
  819.     }
  820.  
  821.     function is_verified() {
  822.  
  823.         if( strstr($this->paypal_response,"VERIFIED") )
  824.  
  825.             return true;
  826.  
  827.         else
  828.  
  829.             return false;
  830.  
  831.     }
  832.  
  833.     function get_payment_status() {
  834.  
  835.         return $this->paypal_post_vars['payment_status'];
  836.  
  837.     }
  838.  
  839.     function error_out($message)
  840.  
  841.     {
  842.  
  843.  
  844.  
  845.     }
  846.  
  847. }
  848.  
  849. ?>
Advertisement
Add Comment
Please, Sign In to add comment