Current File : /home/pacjaorg/public_html/km/administrator/components/com_djclassifieds/lib/djpayment.php
<?php
/**
 * @package DJ-Classifieds
 * @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 */

defined('_JEXEC') or die('Restricted access');

require_once JPATH_ROOT.'/components/com_djclassifieds/model.php';
require_once(JPATH_ROOT.'/administrator/components/com_djclassifieds/lib/djseo.php');
require_once(JPATH_ROOT.'/administrator/components/com_djclassifieds/lib/djnotify.php');

class DJClassifiedsPayment
{
	static $_payment_types = array(
		0 => '',
		1 => 'points',
		2 => 'prom_top',
		3 => 'plan',
		4 => 'order',
		5 => 'offer'
	);

	public static function getTypePrice($user_id, $type_id)
	{
		$db = JFactory::getDBO();	
		$query = "SELECT * FROM #__djcf_types WHERE published=1 AND id=".(int)$type_id." LIMIT 1";
		$db->setQuery($query); 
		$type = $db->loadObject();
		
		if($user_id && $type){
			$user = JFactory::getUser($user_id);
			if(count($user->groups)){
				$g_list = implode(',',$user->groups);
				$query = "SELECT gp.* FROM #__djcf_groups_prices gp "
						."WHERE  gp.type='type' AND gp.group_id in(".$g_list.") AND item_id= ".$type->id;
				$db->setQuery($query);
				$types_prices = $db->loadObjectList();
					
				if($types_prices){
					foreach($types_prices as $tp){						
						$type->price = $tp->price;
						$type->points = $tp->points;				
					}
				}
			}
		}
		
		return $type;
	}

	public static function getDirectPaymentAddress($user_id)
	{
		JPluginHelper::importPlugin('djclassifiedspayment');
		$app = JFactory::getApplication();
		$pay_address = '';

		if(JPluginHelper::isEnabled('djclassifiedspayment', 'djcfpaypal')){
			$pay_address = self::getUserPaypal($user_id);
		}elseif(JPluginHelper::isEnabled('djclassifiedspayment', 'djcfPaypal')){ // backward compatibility
			$pay_address = self::getUserPaypal($user_id);
		}

		$plugin_address = $app->triggerEvent('onDJClassifiedsGetDirectPaymentAddress', array($user_id));
		if(!empty($plugin_address[0])){
			$pay_address = $plugin_address[0];
		}

		return $pay_address;
	}
	
	public static function getUserPaypal($user_id){
 
		$db = JFactory::getDBO();
		$query = "SELECT v.value FROM #__djcf_fields_values_profile v, #__djcf_fields f "
				."WHERE f.name='paypal_email' AND f.source=2 AND v.field_id=f.id AND v.user_id=".$user_id." LIMIT 1";
		$db->setQuery($query);
		$paypay_user = $db->loadResult();
		
		return $paypay_user;
	}
	
	public static function confirmUserPayment($item, $type, $price_total, $method, $coupon_code = '')
	{
		JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
		$app = JFactory::getApplication();	
		$user = JFactory::getUser();
		$row = JTable::getInstance('Payments', 'DJClassifiedsTable');
		
		$row->item_id = $item->id;
		$row->user_id = $user->id;
		$row->method = $method;
		$row->status = 'Completed';
		$row->ip_address = $app->input->server->getStr('REMOTE_ADDR');
		$row->price = 0;
		$row->coupon = $coupon_code;
		if($coupon_code){
			$row->coupon_discount = $price_total;
		}
	
		if($type=='plan'){
			$row->type = 3;
			if(!$row->store()){
				throw new Exception($row->getError());
			}
	
			self::activatePlan($item, $user->id);
	
			$message = JText::_('COM_DJCLASSIFIEDS_SUBSCRIPTION_PLAN_ACTIVATED');
			$redirect = DJClassifiedsSEO::getViewUri('userplans');
		}else if($type=='points'){
			$row->type = 1;
			if(!$row->store()){
				throw new Exception($row->getError());
			}
	
			self::activatePoints($item, $user->id);
			
			$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PACKAGES_ADDED');
			$redirect = DJClassifiedsSEO::getViewUri('userpoints');
		}else if($type=='prom_top'){
			$row->type = 2;
			if(!$row->store()){
				throw new Exception($row->getError());
			}
	
			self::activateMoveToTop($item->id);
			
			$message = JText::_('COM_DJCLASSIFIEDS_PROMOTION_MOVE_TO_TOP_ACTIVATED');
			$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_alias);
		}else{	
			$row->type = 0;
			if(!$row->store()){
				throw new Exception($row->getError());
			}
	
			$pub = self::activateItem($item);
	
			$message = JText::_('COM_DJCLASSIFIEDS_THANKS_FOR_PAYMENT');
			if($pub != null){
				if($pub){
					$message = JText::_('COM_DJCLASSIFIEDS_THANKS_FOR_PAYMENT_ADVERT_PUBLISHED');
				}else{
					$message = JText::_('COM_DJCLASSIFIEDS_THANKS_FOR_PAYMENT_WAIT_FOR_CONFIRMATION');
				}
			}
			
			$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_alias);
		}
	
		$app->enqueueMessage($message, 'success');
		$app->redirect(JRoute::_($redirect, false));
	}
	
	public static function processPayment($id, $type, $method)
	{
		JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
		$db 	= JFactory::getDBO();
		$app 	= JFactory::getApplication();		
		$par 	= JComponentHelper::getParams('com_djclassifieds');
		$user 	= JFactory::getUser();		
		$row 	= JTable::getInstance('Payments', 'DJClassifiedsTable');
		$djmodel = new DJClassifiedsModel();
		
		JPluginHelper::importPlugin('djclassifiedspayment');
	
		$app->triggerEvent('onInitProcessPayment', array(&$par, $id, $type, $method));
				
		$pdata = array();
	
		$row->date = JFactory::getDate()->toSQL();
		$row->item_id = $id;
		$row->user_id = $user->id;
		$row->method = $method;
		$row->status = 'Start';
		$row->ip_address = $app->input->server->getStr('REMOTE_ADDR');
		
		if($type == 'prom_top'){
			$item = $djmodel->getItemById($id);
			if(!$item){
				DJCLassifiedsSEO::redirectWrongItem();
			}

			$move_top_price_arr = DJClassifiedsPayment::getMoveTopPriceArr($par);
		
			$row->price = $move_top_price_arr['price'];
			$row->type = 2;
						
			$pdata['amount'] = $move_top_price_arr['price'];
			$pdata['itemname'] = $item->name;
			
			$plug_obj = $item;
			
		}else if($type == 'points'){
			$points = $djmodel->getPointsPackage($id);
			if(!$points){
				DJCLassifiedsSEO::redirectWrongItem(null, 'COM_DJCLASSIFIEDS_WRONG_POINTS_PACKAGE');
			}
	
			$row->price = $points->price;
			$row->type = 1;
		
			$pdata['amount'] = $points->price;
			$pdata['itemname'] = $points->name;
	
			$plug_obj = $points;
			
		}else if($type == 'plan'){
			$plan = $djmodel->getPlan($id);
			if(!$plan){
				DJCLassifiedsSEO::redirectWrongItem('index.php?option=com_djclassifieds&view=plans', 'COM_DJCLASSIFIEDS_WRONG_SUBSCRIPTION_PLAN');
			}
			 
			$row->price = $plan->price;
			$row->type = 3;
			
			$pdata['amount'] = $plan->price;
			$pdata['itemname'] = $plan->name;
	
			if($plan->recurring){
				$row->type_details = 'recurring_init';
				$pdata['recurring_init'] = 1;
			}
			
			$plug_obj = $plan;
			
		}else if($type == 'order'){
			$order = $djmodel->getOrder($id);
				
			$query = "SELECT * FROM #__djcf_orders_shipping WHERE order_id=".$id." LIMIT 1";
			$db->setQuery($query);
			$order_shipping = $db->loadObject();
			
			$item = $djmodel->getItemById($order->item_id);
			if(!$item){
				DJCLassifiedsSEO::redirectWrongItem();
			}
	
			$price_total = $order->price * $order->quantity;
			if($order_shipping){
				$price_total += $order_shipping->price;
			}
				
			$row->price = $price_total;
			$row->type = 4;
					
			$pdata['amount'] = $price_total;
			$pdata['itemname'] = $item->name;
			
			$plug_obj = $order;
			
		}else if($type == 'offer'){
			$offer = $djmodel->getOffer($id);
			$item = $djmodel->getItemById($offer->item_id);
			if(!$item){
				DJCLassifiedsSEO::redirectWrongItem();
			}
				
			$price_total = $offer->price;
				
			$row->price = $price_total;
			$row->type = 5;
			
			$pdata['amount'] = $price_total;
			$pdata['itemname'] = $item->name;
		
			$plug_obj = $offer;
			
		}elseif($type == ''){
			$item = $djmodel->getItemById($id);
			if(!$item){
				DJCLassifiedsSEO::redirectWrongItem();
			}
	
			DJClassifiedsPayment::deletePrevStartPayment($item->id); // deleting previous "trash" payment

			$price_det = self::getItemPriceDetails($item);
			$amount = $price_det['price_total'];

			$row->price = $amount;
			$row->type = 0;
			$row->type_details = $item->pay_type;
		
			$pdata['amount'] = $amount;
			$pdata['itemname'] = $item->name;
	
			$plug_obj = $item;
			
		}else{
			$item = new stdClass();
			$app->triggerEvent('onPrepareProcessOtherPayment', array (&$item, &$par, $type, &$row, &$pdata));
			$plug_obj = $item;
		}
	
		$app->triggerEvent('onPrepareProcessPayment', array (&$plug_obj, &$par, $type, &$row, &$pdata));
	
		if(!$row->store()){
			throw new Exception($row->getError());
		}
		$pdata['item_id'] = $row->id;
		$pdata['item_cid'] = ''; // backward compatibility
	
		$app->triggerEvent('onAfterPrepareProcessPayment', array (&$plug_obj, &$par, $type, &$row, &$pdata));
		
		return $pdata;
	}

	public static function completePayment($id, $price, $txn_id = '')
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$par = JComponentHelper::getParams('com_djclassifieds');
		$djmodel = new DJClassifiedsModel();
		
		$query = "SELECT * FROM #__djcf_payments WHERE id=".$id;
		$db->setQuery($query);
		$payment = $db->loadObject();
		
		if($payment){
			if(round($price, 2) != round($payment->price, 2)){
				return false;
			}

			$query = "SELECT id FROM #__djcf_payments WHERE id=".$id." AND status='Completed'";
			$db->setQuery($query);
			$p_completed = $db->loadResult();
			if($p_completed){
				return false;
			}
						
			if($payment->type == '5'){	// offer
				$query = "UPDATE #__djcf_offers SET paid=1 WHERE id=".$payment->item_id;
				$db->setQuery($query);
				$db->execute();

			}else if($payment->type == '4'){	// buy now
				$query = "SELECT * FROM #__djcf_orders WHERE id=".$payment->item_id;
				$db->setQuery($query);
				$order = $db->loadObject();

				$query = "SELECT * FROM #__djcf_items WHERE id=".$order->item_id;
				$db->setQuery($query);
				$item = $db->loadObject();

				self::reduceItemQuantity($item, $order->quantity);

				$query = "UPDATE #__djcf_orders SET status=1 WHERE id=".$order->id;
				$db->setQuery($query);
				$db->execute();

				$buyer = JFactory::getUser($order->user_id);
				DJClassifiedsNotify::notifyBuynowBuyer($item->id,$buyer,$order->quantity);
				DJClassifiedsNotify::notifyBuynowAuthor($item->id,$buyer,$order->quantity);

			}else if($payment->type == '3'){ // subscription plans
				$plan = $djmodel->getPlan($payment->item_id);
				if($plan){
					self::activatePlan($plan, $payment->user_id);
				}

			}else if($payment->type == '2'){ // move to top
				self::activateMoveToTop($payment->item_id);

			}else if($payment->type == '1'){ // points
				$query = "SELECT * FROM #__djcf_points WHERE id=".$payment->item_id;
				$db->setQuery($query);
				$points = $db->loadObject();

				self::activatePoints($points, $payment->user_id);

			}elseif($payment->type == '0'){ // advert
				$item = $djmodel->getItemById($payment->item_id);

				$pub = self::activateItem($item);

				if($pub != null){
					if($pub){
						if($par->get('notify_status_change','0') > 0){
							DJClassifiedsNotify::notifyUserPublication($payment->item_id, '1');
						}
					}
				}

			}else{
				$app->triggerEvent('onOtherPaymentCompletePayment', array($payment));
			}

			$query = "UPDATE #__djcf_payments SET status='Completed', transaction_id=".$db->q($txn_id)." WHERE id=".$payment->id;
			$db->setQuery($query);
			$db->execute();

			$payment->status = 'Completed';
			$app->triggerEvent('onAfterPaymentStatusChange', array($payment));

			if($par->get('notify_payment_complete', '0')){
				DJClassifiedsNotify::notifyUserPaymentCompleted($payment);
			}
				
			return true;	
		}

		return false;
	}

	static function pointsPayment($id, $type, $points_count)
	{
		JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$user = JFactory::getUser();
		$par = JComponentHelper::getParams('com_djclassifieds');
		$row = JTable::getInstance('Payments', 'DJClassifiedsTable');
		$djmodel = new DJClassifiedsModel();

		$row->date = JFactory::getDate()->toSQL();

		$p_amount = 0;
		$pay_success = false;
		$item_name = '';
		$desc_arr = array();
		$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED');
		$redirect = DJClassifiedsPayment::getRedirectPage($type, $id);
			
		if($type == 'plan'){
			$plan = $djmodel->getPlan($id);
			if(!$plan){
				DJClassifiedsSEO::redirectWrongItem(null, 'COM_DJCLASSIFIEDS_WRONG_SUBSCRIPTION_PLAN');
			}

			$p_amount = $plan->points;

			$app->triggerEvent('onDJClassifiedsPaymentPoints', array(&$plan, &$par, $type, &$points_count, &$p_amount));

			if($points_count >= $p_amount){
				self::activatePlan($plan, $user->id);
				
				$item_name = $plan->name;
				$desc_arr = array(
					'COM_DJCLASSIFIEDS_PAYMENT_FOR_SUBSCRIPTION_PLAN' => '',
					'COM_DJCLASSIFIEDS_PLAN' => $plan->name
				);

				$row->type = 3;
				
				$message = JText::_('COM_DJCLASSIFIEDS_SUBSCRIPTION_PLAN_ACTIVATED');
				$pay_success = true;
			}
			
		}else if($type == 'prom_top'){
			$item = $djmodel->getItemById($id);
			if(!$item){
				DJClassifiedsSEO::redirectWrongItem();
			}

			$move_top_price_arr = DJClassifiedsPayment::getMoveTopPriceArr($par);

			$p_amount = $move_top_price_arr['points'];
	
			$app->triggerEvent('onDJClassifiedsPaymentPoints', array(&$item, &$par, $type, &$points_count, &$p_amount));
	
			if($points_count >= $p_amount){
				self::activateMoveToTop($item->id);
	
				$item_name = $item->name;
				$desc_arr = array(
					'COM_DJCLASSIFIEDS_PAYMENT_FOR_PROMOTION_MOVE_TO_TOP' => '',
					'COM_DJCLASSIFIEDS_ADVERT_ID' => $item->id,
					'COM_DJCLASSIFIEDS_TITLE' => $item->name
				);
	
				$row->type = 2;
			
				$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED_PROMOTION_MOVE_TO_TOP_ACTIVATED');
				$pay_success = true;
			}
		}elseif($type == ''){
			$item = $djmodel->getItemById($id);
			if(!$item){
				DJClassifiedsSEO::redirectWrongItem();
			}

			$item_price_det = DJClassifiedsPayment::getItemPriceDetails($item);
			$p_amount = $item_price_det['points_total'];
			
			$app->triggerEvent('onDJClassifiedsPaymentPoints', array(&$item, &$par, $type, &$points_count, &$p_amount));
			
			if($points_count >= $p_amount){
				$pub = self::activateItem($item);
	
				$item_name = $item->name;
				$desc_arr = array(
					'COM_DJCLASSIFIEDS_PAYMENT_FOR_ADVERT' => '',
					'COM_DJCLASSIFIEDS_ADVERT_ID' => $item->id,
					'COM_DJCLASSIFIEDS_TITLE' => $item->name
				);
	
				$row->type = 0;
				$row->type_details = $item->pay_type;
				
				$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED');
				if($pub != null){
					if($pub){
						$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED_ADVERT_PUBLISHED');
					}else{
						$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED_ADVERT_WAITING_FOR_PUBLISH');
					}
				}
				$pay_success = true;
			}
		}else{
			// backward compatibility START
			$row->item_id = $id;
			$row->user_id = $user->id;
			$row->method = 'points';
			$row->status = 'Start';
			$row->ip_address = $app->input->server->getStr('REMOTE_ADDR');
			// backward compatibility END
	
			$app->triggerEvent('onOtherPaymentPoints', array(&$row, $points_count, $type, $id, &$p_amount, &$pay_success, &$item_name, &$desc_arr, &$message, &$redirect));
		}
	
		if($pay_success){
			$query = "INSERT INTO #__djcf_users_points (`user_id`,`points`,`description`,`desc_json`) "
					."VALUES (".$user->id.", -".$p_amount.", '', ".$db->q(json_encode($desc_arr)).")";
			$db->setQuery($query);
			$db->execute();
	
			$payment_info = array();
			$payment_info['itemname'] = $item_name;
			$payment_info['amount'] = $p_amount;
			$payment_info['info'] = DJClassifiedsTheme::decodeDescJson(json_encode($desc_arr));
			$payment_info['payment_id'] = 0;
	
			DJClassifiedsNotify::notifyAdminPaymentPoints($type, $payment_info);
	
			$row->item_id = $id;
			$row->user_id = $user->id;
			$row->method = 'points';
			$row->status = 'Completed';
			$row->ip_address = $_SERVER['REMOTE_ADDR'];
			$row->price = $p_amount;
			if(!$row->store()){
				throw new Exception($row->getError());
			}
	
			if($par->get('notify_payment_complete', '0') == '2'){
				DJClassifiedsNotify::notifyUserPaymentCompleted($row);
			}
		}else{
			DJClassifiedsSEO::redirectWrongItem(null, 'COM_DJCLASSIFIEDS_NOT_ENOUGHT_POINTS', 'warning');
		}

		$app->triggerEvent('onAfterPaymentStatusChange', array($row));

		return array(
			'payment_row' => $row,
			'payment_info' => $payment_info,
			'message' => $message,
			'redirect' => $redirect
		);
	}

	static function isPayTypePromsOnly($pay_type)
	{
		$pay_type_arr = array_filter(explode(',', $pay_type));

		JFactory::getApplication()->triggerEvent('onDJClassifiedsCheckIfPromsOnly', array(&$pay_type_arr));

		$only_proms = true;
		foreach($pay_type_arr as $pay_type){
			if(substr($pay_type, 0, 2) != 'p_'){
				$only_proms = false;
				break;
			}
		}

		return $only_proms;
	}

	static function activatePlan($plan, $user_id)
	{
		$db = JFactory::getDBO();
		$djmodel = new DJClassifiedsModel();
		$registry = new JRegistry();
		$registry->loadString($plan->params);
		$plan_params = $registry->toObject();
		$date_start = JFactory::getDate();
		$date_exp = $plan_params->days_limit ? JFactory::getDate('now +'.$plan_params->days_limit.'day') : null;

		$user_active_plans = $djmodel->getUserActivePlans($user_id);
		$same_plan_active = isset($user_active_plans[$plan->id]) ? $user_active_plans[$plan->id] : null;

		if($same_plan_active){ // 0 adverts plan renew
			$query = "UPDATE #__djcf_plans_subscr SET date_exp=".$db->q(JFactory::getDate()->toSQL()).", notify=1 WHERE id=".$same_plan_active->subscr_id;
			$db->setQuery($query);
			$db->execute();

			if($date_exp){
				$addup_interval = date_diff(JFactory::getDate(), JFactory::getDate($same_plan_active->date_exp));
				$date_exp->add($addup_interval);
			}
		}

		$query = "INSERT INTO #__djcf_plans_subscr (`user_id`,`plan_id`,`adverts_limit`,`adverts_available`,`date_start`,`date_exp`,`plan_params`,`recurring`) "
		."VALUES ('".$user_id."','".$plan->id."','".$plan_params->ad_limit."','".($plan_params->ad_limit == '-1' ? '9999999' : $plan_params->ad_limit)."','".$date_start->toSQL()."','".($date_exp ? $date_exp->toSQL() : '0000-00-00 00:00:00')."','".addslashes($plan->params)."',".$plan->recurring.")";
		$db->setQuery($query);
		$db->execute();

		if(!empty($plan->groups_assignment)){
			foreach(explode(',', $plan->groups_assignment) as $ug){
				JUserHelper::addUserToGroup($user_id, $ug);
			}
		}

		if(!empty($plan->groups_deassignment)){
			foreach(explode(',', $plan->groups_deassignment) as $ug){
				JUserHelper::removeUserFromGroup($user_id, $ug);
			}
		}
	}

	static function activatePoints($points, $user_id)
	{
		$db = JFactory::getDBO();
		
		$desc_arr = array(
			'COM_DJCLASSIFIEDS_POINTS_PACKAGE' => $points->name
		);
		$query = "INSERT INTO #__djcf_users_points (`user_id`,`points`,`description`,`desc_json`) "
				."VALUES (".$user_id.",".$points->points.",'',".$db->q(json_encode($desc_arr)).")";
		$db->setQuery($query);
		$db->execute();
	}

	static function activateItem($item)
	{
		$par = JComponentHelper::getParams('com_djclassifieds');

		JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
		$row = JTable::getInstance('Items', 'DJClassifiedsTable');
		$row->load($item->id);

		if($row->new){ // recalc exp_date for "new" (added or renewed) items
			if($row->new == 2){ // newly renewed
				$wait_interval = date_diff(JFactory::getDate($row->date_renew), JFactory::getDate());
			}else{ // newly added
				$wait_interval = date_diff(JFactory::getDate($row->date_start), JFactory::getDate());
			}
			
			$new_date_exp = JFactory::getDate($row->date_exp)->add($wait_interval);
			$row->date_exp = $new_date_exp->toSQL();

			$new_date_sort = JFactory::getDate($row->date_sort)->add($wait_interval);
			$row->date_sort = $new_date_sort->toSQL();
		}

		self::applyPromotions($row);

		$pub = null;

		if(!self::isPayTypePromsOnly($item->pay_type)){ // if NOT promotions only - set/change 'published' status
			DJClassifiedsAccess::overrideUserAutopublish($par);

			if($item->c_autopublish == '0'){
				if($par->get('autopublish','1') == '1' || $par->get('autopublish','1') == '2'){ // ignore 'edit only' on payments
					$pub = 1;
				}else{
					$pub = 0;
				}
			}elseif($item->c_autopublish == '1' || $item->c_autopublish == '3'){ // ignore 'edit only' on payments
				$pub = 1;
			}elseif($item->c_autopublish == '2'){
				$pub = 0;
			}

			$row->published = $pub;
		}

		$row->extra_images += $row->extra_images_to_pay; // increasing the number of paid images
		$row->extra_chars += $row->extra_chars_to_pay; // increasing the number of paid chars

		$row->pay_type = '';
		$row->extra_images_to_pay = 0;
		$row->extra_chars_to_pay = 0;
		$row->new = 0;

		if(!$row->store()){
			throw new Exception($row->getError());
		}

		return $pub;
	}
	
	static function activateMoveToTop($item_id)
	{
		$db = JFactory::getDBO();
		$date_sort = JFactory::getDate()->toSQL();
		$query = "UPDATE #__djcf_items SET date_sort=".$db->q($date_sort)." WHERE id=".$item_id;
		$db->setQuery($query);
		$db->execute();
	}

	static function reduceItemQuantity($item, $quantity)
	{
		$db = JFactory::getDBO();

		$new_quantity = $item->quantity - $quantity;

		$query = "UPDATE #__djcf_items SET quantity=".$new_quantity." WHERE id=".$item->id;
		$db->setQuery($query);
		$db->execute();
		
		if($new_quantity <= 0){
			$query = "UPDATE #__djcf_items SET published=0 WHERE id=".$item->id;
			$db->setQuery($query);
			$db->execute();

			$query = "UPDATE #__djcf_auctions SET closed=".$db->q(JFactory::getDate()->toSQL())." WHERE item_id=".$item->id." AND closed IS NULL";
			$db->setQuery($query);
			$db->execute();
		}
	}

	static function deletePrevStartPayment($item_id, $type = '0')
	{
		$db = JFactory::getDBO();
		$query = "SELECT * FROM #__djcf_payments WHERE status='Start' AND type=".$db->q($type)." AND item_id=".$item_id." ORDER BY id DESC LIMIT 1";
		$db->setQuery($query);
		$prev_payment = $db->loadObject();

		if($prev_payment){
			$query = "DELETE FROM #__djcf_payments WHERE id=".$prev_payment->id;
			$db->setQuery($query);
			$db->execute();
		}
	}
		
	public static function applyPromotions($row)
	{
		$db = JFactory::getDBO();

		$item_id = $row->id;
		
		$query = "SELECT * FROM #__djcf_items_promotions WHERE item_id = ".$item_id." ORDER BY id";
		$db->setQuery($query);
		$old_promotions = $db->loadObjectList('prom_id');
		
		$query = "SELECT * FROM #__djcf_items WHERE id = ".$item_id." LIMIT 1";
		$db->setQuery($query);
		$item = $db->loadObject();
		
		$query = "SELECT * FROM #__djcf_promotions";
		$db->setQuery($query);
		$promotions = $db->loadObjectList('id');
		
		if($item->pay_type){
			$ins_arr = array();
			$pay_type = explode(',', $item->pay_type);
			foreach($pay_type as $pay_t){
				if(strstr($pay_t, 'p_')){
					$pay_prom = explode('_', $pay_t);
					$prom_id = $pay_prom[2];
					$prom_days = $pay_prom[3];
					if($prom_id){
						$prom_exp_date = JFactory::getDate('now + '.$pay_prom[3].' day');
						if(isset($old_promotions[$prom_id])){
							if($old_promotions[$prom_id]->date_exp >= JFactory::getDate()->toSQL()){																																
								$time_left = date_diff(JFactory::getDate(), JFactory::getDate($old_promotions[$prom_id]->date_exp));
								$prom_exp_date->add($time_left);
							}
							$query_del = "DELETE FROM #__djcf_items_promotions WHERE item_id=".$item->id." AND prom_id=".$prom_id;
							$db->setQuery($query_del);
							$db->execute();
						}
						
						$ins_arr[] = "(".$item->id.",".$prom_id.",'".JFactory::getDate()->toSQL()."','".$prom_exp_date->toSQL()."',".$prom_days.")";
					}
				}
			}
			if($ins_arr){
				$query = "INSERT INTO #__djcf_items_promotions(`item_id`,`prom_id`,`date_start`,`date_exp`,`days`) VALUES "
						.implode(', ', $ins_arr);
				$db->setQuery($query);
				$db->execute();
			}
		}
		
		$date_now = JFactory::getDate()->toSQL(); 
		$query = "SELECT * FROM #__djcf_items_promotions WHERE item_id = ".$item_id." AND date_exp>'".$date_now."' ORDER BY id";
		$db->setQuery($query);
		$new_promotions = $db->loadObjectList('prom_id');
		
		$new_prom = '';
		foreach($new_promotions as $prom){
			$new_prom .= $promotions[$prom->prom_id]->name.',';
		}
		
		$row->promotions = $new_prom;
		$row->special = strstr($new_prom, 'p_first') ? 1 : 0;
		if(!$row->store()){
			throw new Exception($row->getError());
		}
		
		return $new_promotions;
	}
	
	public static function updatePromotions()
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$date_now = JFactory::getDate()->toSQL(); 
			
		$query = "SELECT item_id FROM #__djcf_items_promotions WHERE date_exp <= '".$date_now."' AND updated=0 GROUP BY item_id ";
		$db->setQuery($query);
		$items_ex = $db->loadObjectList();
					
		if($items_ex){
			$id_list = '';
			$items_list = array();
			foreach($items_ex as $item){
				if($id_list){
					$id_list .= ','.$item->item_id;
				}else{
					$id_list .= $item->item_id;
				}
				$items_list[$item->item_id] = '';
			}
			
			$query = "SELECT * FROM #__djcf_items_promotions WHERE date_exp > '".$date_now."' AND item_id IN (".$id_list.") ";
			$db->setQuery($query);
			$items_proms = $db->loadObjectList();
			
			$query = "SELECT * FROM #__djcf_promotions ";
			$db->setQuery($query);
			$promotions = $db->loadObjectList('id');
			
			foreach($items_proms as $item_prom){
				$items_list[$item_prom->item_id] .=  $promotions[$item_prom->prom_id]->name.',';
			}
			foreach($items_ex as $item){
				$i_prom = $items_list[$item->item_id];
				
				if(strstr($i_prom, 'p_first')){ $special = 1;
				}else{ $special = 0;}
				
				$query = "UPDATE #__djcf_items SET promotions = '".$i_prom."' , special = '".$special."' WHERE id = '".$item->item_id."' ";
				$db->setQuery($query);					
				$db->execute();
			}
			
			$query = "UPDATE #__djcf_items_promotions SET updated=1 WHERE date_exp <= '".$date_now."' AND updated=0  ";
			$db->setQuery($query);
			$db->execute();			
		}
	}

	// re-apply active promotions to items
	public static function updatePromotionsFix()
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$date_now = JFactory::getDate()->toSQL(); 
			
		$query = "SELECT * FROM #__djcf_items_promotions WHERE date_exp > '".$date_now."' AND updated=0 GROUP BY item_id ";
		$db->setQuery($query);
		$items_tofix = $db->loadObjectList();
					
		if(count($items_tofix)){
			$id_list= '';
			$items_list = array();
			foreach($items_tofix as $item){
				if($id_list){
					$id_list .= ','.$item->item_id;
				}else{
					$id_list .= $item->item_id;
				}
				$items_list[$item->item_id] = '';
			}
			
			$query = "SELECT * FROM #__djcf_items_promotions WHERE date_exp > '".$date_now."' AND item_id IN (".$id_list.") ";
			$db->setQuery($query);
			$items_proms = $db->loadObjectList();
			
			$query = "SELECT * FROM #__djcf_promotions ";
			$db->setQuery($query);
			$promotions = $db->loadObjectList('id');
			
			foreach($items_proms as $item_prom){
				$items_list[$item_prom->item_id] .=  $promotions[$item_prom->prom_id]->name.',';
			}
			foreach($items_tofix as $item){
				$i_prom = $items_list[$item->item_id];
				
				if(strstr($i_prom, 'p_first')){ $special = 1;
				}else{ $special = 0;}
				
				$query = "UPDATE #__djcf_items SET promotions = '".$i_prom."' , special = '".$special."' WHERE id = '".$item->item_id."' ";
				$db->setQuery($query);					
				$db->execute();
			}				
		}
	}

	public static function checkApplyPromotions(&$row, $old_row, $promotions, $par)
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$prom_to_pay = '';

		$query = "SELECT * FROM #__djcf_items_promotions WHERE item_id=".$row->id." ORDER BY id";
		$db->setQuery($query);
		$old_promotions = $db->loadObjectList('prom_id');

		foreach($promotions as $prom){
			$ins_prom = 0;
			$time_left = null;
			$days_left_default = 0;

			if(isset($old_promotions[$prom->id])){
				if($old_promotions[$prom->id]->date_exp >= JFactory::getDate()->toSQL()){
					$old_prom_to_pay = $prom->name.'_'.$prom->id.'_'.$old_promotions[$prom->id]->days.',';
					if($old_row && strstr($old_row->pay_type, $old_prom_to_pay)){
						$time_left = null;
					}else if($old_promotions[$prom->id]->date_exp > JFactory::getDate()->toSQL()){
						$time_left = date_diff(JFactory::getDate(), JFactory::getDate($old_promotions[$prom->id]->date_exp));
						$days_left_default = $old_promotions[$prom->id]->days;
					}
				}
			}
				
			if(!empty($time_left)){
				$row->promotions .= $prom->name.',';
			}
			
			$prom_v = $app->input->getInt($prom->name, 0);

			if($prom_v){
				if(isset($prom->prices[$prom_v])){
					$pp = $prom->prices[$prom_v];
					if(!DJClassifiedsPayment::isFree($pp->price, $pp->points, $par)){
						$new_prom = $prom->name.'_'.$prom->id.'_'.$pp->days.',';
						if(!strstr($row->pay_type, $new_prom)){
							$prom_to_pay .= $new_prom;
						}
						if($time_left){
							$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
							$ins_prom++;
						}
					}else{			
						if($time_left){
							$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();						
						}else{
							$row->promotions .= $prom->name.',';
							$prom_exp_date = JFactory::getDate('now + '.$pp->days.' day')->toSQL();
							$days_left_default = $pp->days;
						}
						$ins_prom++;
					}
				}else if($time_left){
					$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
					$ins_prom++;
				}
				
			}else{
				if($time_left){
					$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
					$ins_prom++;
				}						
			}

			if($ins_prom){
				$query_del = "DELETE FROM #__djcf_items_promotions WHERE item_id=".$row->id." AND prom_id=".$prom->id." AND date_exp>".$db->q(JFactory::getDate()->toSQL());
				$db->setQuery($query_del);
				$db->execute();
				
				$prom_query = "INSERT INTO #__djcf_items_promotions(`item_id`,`prom_id`,`date_start`,`date_exp`,`days`) VALUES "
				."(".$row->id.",".$prom->id.",".$db->q(JFactory::getDate()->toSQL()).",".$db->q($prom_exp_date).",".$days_left_default.")";
				$db->setQuery($prom_query);
				$db->execute();
			}
		}

		$row->special = strstr($row->promotions, 'p_first') ? 1 : 0;
		$row->pay_type .= $prom_to_pay;
	}

	public static function getAfterPaymentRedirectUrl($payment_id, $context)
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$menus = $app->getMenu('site');
		$djmodel = new DJClassifiedsModel();

		$query = "SELECT * FROM #__djcf_payments WHERE id=".$payment_id;
		$db->setQuery($query);
		$payment = $db->loadObject();

		if($payment->type == '0' || $payment->type == '1'){
			$item = $djmodel->getItemById($payment->item_id);
			$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_alias);
		}elseif($payment->type == '2'){
			$menu_userpoints_itemid = $menus->getItems('link', 'index.php?option=com_djclassifieds&view=userpoints', 1);
			$userpoints_link='index.php?option=com_djclassifieds&view=userpoints';
			if($menu_userpoints_itemid){
				$userpoints_link .= '&Itemid='.$menu_userpoints_itemid->id;
			}
			$redirect = $userpoints_link;
		}elseif($payment->type == '3'){
			$userplans_link = 'index.php?option=com_djclassifieds&view=userplans';
			$menu_userplans_itemid = $menus->getItems('link', $userplans_link, 1);
			if($menu_userplans_itemid){
				$userplans_link .= '&Itemid='.$menu_userplans_itemid->id;
			}
			$redirect = $userplans_link;
		}else{
			$redirect = DJClassifiedsSEO::getCategoryRoute('0:all');
		}

		$redirect = JRoute::_($redirect, false);
		return $redirect;
	}
	
	static function changePaymentReturnStatus($payment_id, $new_status)
	{
		if(!$payment_id){
			return;
		}

		$db = JFactory::getDBO();
		$query = "SELECT status FROM #__djcf_payments WHERE id=".$payment_id;
		$db->setQuery($query);
		$old_status = $db->loadResult();

		if($old_status == 'Start'){
			$query = "UPDATE #__djcf_payments SET status=".$db->q($new_status)." WHERE id=".$payment_id;
			$db->setQuery($query);
			$db->execute();
		}
	}

	static function getAdvertPaymentTypeDetails($type_details)
	{
		$a_pay_types = array(
			'cat' => JText::_('COM_DJCLASSIFIEDS_CATEGORY'),
			'mc' => JText::_('COM_DJCLASSIFIEDS_MULTICATEGORIES'),
			'type' => JText::_('COM_DJCLASSIFIEDS_TYPE'),
			'duration_renew' => JText::_('COM_DJCLASSIFIEDS_DURATION_RENEW'),
			'duration' => JText::_('COM_DJCLASSIFIEDS_DURATION'),
			'extra_img' => JText::_('COM_DJCLASSIFIEDS_EXTRA_IMAGES'),
			'extra_chars' => JText::_('COM_DJCLASSIFIEDS_EXTRA_CHARS'),
			'p_first' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_FIRST'),
			'p_bold' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_BOLD'),
			'p_border' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_BORDER'),
			'p_bg' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_BG'),
			'p_special' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_SPECIAL')
		);

		JFactory::getApplication()->triggerEvent('onDJClassifiedsGetAdvertPaymentTypeDetails', array(&$a_pay_types));

		$type_det = array_filter(explode(',', $type_details));
		$output_arr = array();
		foreach($type_det as $pay_type){
			foreach($a_pay_types as $a_type => $a_type_label){
				if(strpos($pay_type, $a_type) !== false){
					$output_arr[$a_type] = $a_type_label;
					break;
				}
			}
		}
		return $output_arr;
	}

	static function getItemPriceDetails($item)
	{
		$db = JFactory::getDBO();
		$par = JComponentHelper::getParams('com_djclassifieds');
		$djmodel = new DJClassifiedsModel();

		$price_det = array();
		$points_det = array();

		if($par->get('durations_list','1')){
			$duration = $djmodel->getDuration($item->exp_days, $item->cat_id, $item->user_id);
			if($duration){
				if(strstr($item->pay_type, 'duration_renew')){
					$price_det['duration_renew'] = $duration->price_renew;
					$points_det['duration_renew'] = $duration->points_renew;
				}else if(strstr($item->pay_type, 'duration')){
					$price_det['duration'] = $duration->price;
					$points_det['duration'] = $duration->points;
				}
			}
		}

		$promotions = $djmodel->getPromotionsPrices();
		foreach($promotions as $prom){
			$pay_type_a = explode(',', $item->pay_type);
			foreach($pay_type_a as $pay_type_e){
				if(strstr($pay_type_e, $prom->name)){
					$pay_type_ep = explode('_', $pay_type_e);
					if(isset($prom->prices[$pay_type_ep[3]])){
						$price_det[$pay_type_e] = $prom->prices[$pay_type_ep[3]]->price;
						$points_det[$pay_type_e] = $prom->prices[$pay_type_ep[3]]->points;
					}								
				}	
			}						
		}
		
		$query = "SELECT * FROM #__djcf_categories WHERE published=1";
		$db->setQuery($query);
		$categories = $db->loadObjectList('id');
		if(strstr($item->pay_type, 'cat')){
			$price_det['cat'] = $categories[$item->cat_id]->price / 100;
			$points_det['cat'] = $categories[$item->cat_id]->points;
		}							
		
		if(strstr($item->pay_type, 'mc')){
			$pay_elems = explode(',', $item->pay_type);
			foreach($pay_elems as $pay_el){
				if(strstr($pay_el, 'mc')){
					$mc_id = str_ireplace('mc', '', $pay_el);
					$mcat = $categories[$mc_id];
					$price_det[$pay_el] = $mcat->price / 100;
					$points_det[$pay_el] = $mcat->points;
				}
			}
		}
		
		if(strstr($item->pay_type, 'type')){
			$itype = DJClassifiedsPayment::getTypePrice($item->user_id, $item->type_id);
			$price_det['type'] = $itype->price;
			$points_det['type'] = $itype->points;
		}
		
		if(strstr($item->pay_type, 'extra_img')){
			$extraimg = $item->extra_images_to_pay;
			if(strstr($item->pay_type, 'extra_img_renew')){
				$img_price	= $par->get('img_price_renew','0');
				$img_points	= $par->get('img_price_renew_points','0');
				if(isset($duration->img_price_default)){
					if($duration->img_price_default==0){
						$img_price = $duration->img_price_renew;
						$img_points = $duration->img_points_renew;
					}
				}
				$price_det['extra_img_renew'] = $img_price*$extraimg;
				$points_det['extra_img_renew'] = $img_points*$extraimg;
			}else{
				$img_price	= $par->get('img_price','0');
				$img_points	= $par->get('img_price_points','0');
				if(isset($duration->img_price_default)){
					if($duration->img_price_default==0){
						$img_price = $duration->img_price;
						$img_points = $duration->img_points;
					}
				}
				$price_det['extra_img'] = $img_price*$extraimg;
				$points_det['extra_img'] = $img_points*$extraimg;
			}
		}
			
		if(strstr($item->pay_type, 'extra_chars')){
			$extrachar = $item->extra_chars_to_pay;
			if(strstr($item->pay_type, 'extra_chars_renew')){
				$char_price	= $par->get('desc_char_price_renew','0');
				$char_points = $par->get('desc_char_price_renew_points','0');
				if(isset($duration->char_price_default)){
					if($duration->char_price_default==0){
						$char_price = $duration->char_price_renew;
						$char_points = $duration->char_points_renew;
					}
				}
				$price_det['extra_chars_renew'] = $char_price*$extrachar;
				$points_det['extra_chars_renew'] = $char_points*$extrachar;
			}else{
				$char_price	= $par->get('desc_char_price','0');
				$char_points = $par->get('desc_char_price_points','0');
				if(isset($duration->char_price_default)){
					if($duration->char_price_default==0){
						$char_price = $duration->char_price;
						$char_points = $duration->char_points;
					}								
				}
				$price_det['extra_chars'] = $char_price*$extrachar;
				$points_det['extra_chars'] = $char_points*$extrachar;
			}
		}

		$price_total = 0;
		foreach($price_det as $price){
			$price_total += $price;
		}

		$points_total = 0;
		foreach($points_det as $points){
			$points_total += $points;
		}

		return array(
			'price_det' => $price_det, 
			'price_total' => $price_total, 
			'points_det' => $points_det, 
			'points_total' => $points_total
		);
	}

	static function getMoveTopPriceArr($par = null)
	{
		$user = JFactory::getUser();
		$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');

		$price = $par->get('promotion_move_top_price','0');
		$points = $par->get('promotion_move_top_points','0');

		$ug_prices = $par->get('promotion_move_top_ug_prices', array());
		if($ug_prices){
			$ug_arr = DJClassifiedsAccess::getUserGroups($user->id);

			foreach($ug_prices as $ug_price){
				foreach($ug_price->ug as $ug){
					if(in_array($ug, $ug_arr)){
						$price = $ug_price->price;
						$points = $ug_price->points;
					}
				}
			}
		}

		return array(
			'price' => $price, 
			'points' => $points
		);
	}

	static function getRidOfTheLegacyPlugin($pluginname)
	{
        $plugins_dir = JPATH_ROOT.'/plugins/djclassifiedspayment';
        if(JFolder::exists($plugins_dir)){
			try {
				$dir = opendir($plugins_dir);
				if(!empty($dir) && get_resource_type($dir) == 'stream'){
					while(($plugin = readdir($dir)) !== false){
						if($plugin === $pluginname){
							JFolder::delete($plugins_dir.'/'.$plugin);
							break;
						}
					}
					closedir($dir);
				}
			} catch (Exception $e) {
				return false;
			}
        }
	}

	static function getFreeWhere($free = true)
	{
		$par = JComponentHelper::getParams('com_djclassifieds');

		$where_arr = array();
		if($par->get('points','0') != '2'){
			$where_arr[] = 'price > 0';
		}
		if($par->get('points','0')){
			$where_arr[] = 'points > 0';
		}

		return ($free ? '!' : '').'('.implode(' OR ', $where_arr).')';
	}

	static function isFree($price, $points, $par)
	{
		return (($par->get('points','0') != '2' && $price > 0) || ($par->get('points','0') && $points > 0)) ? false : true;
	}

	static function getPriceText($price, $points, $par)
	{
		$prices = array();
		if($par->get('points','0') != '2' && $price > 0){
			$prices[] = DJClassifiedsTheme::priceFormat($price, $par->get('unit_price','EUR'));
		}
		if($par->get('points','0') && $points > 0){
			$prices[] = $points.'&nbsp;'.JText::_(($points == '1' && JText::_('COM_DJCLASSIFIEDS_POINT_SHORT') != 'COM_DJCLASSIFIEDS_POINT_SHORT') ? 'COM_DJCLASSIFIEDS_POINT_SHORT' : 'COM_DJCLASSIFIEDS_POINTS_SHORT');
		}

		if($prices){
			return implode(JText::_($par->get('point_price_separator', ' - ')), $prices);
		}
	}

	static function getRedirectPage($type, $item_id, $success = true)
	{
		$djmodel = new DJClassifiedsModel();
		$par = JComponentHelper::getParams('com_djclassifieds');
		$redirect = DJClassifiedsSEO::getCategoryRoute('0:all');

		if(is_numeric($type) && isset(self::$_payment_types[$type])){
			$type = self::$_payment_types[$type];
		}

		$use_default = false;
		$redirect_map = $par->get('payment_redirect_map', array());
		foreach($redirect_map as $r){
			if($r->payment_redirect_type == ($success ? 'ok' : 'cancel') && $r->payment_type == $type){
				if($r->payment_redirect){
					return 'index.php?Itemid='.$r->payment_redirect;
				}else{
					$use_default = true;
					break;
				}
			}
		}

		if($success){
			if($par->get('payment_ok_redirect') && !$use_default){
				$redirect = 'index.php?Itemid='.$par->get('payment_ok_redirect');
			}else{
				if($type == 'plan'){
					$redirect = DJClassifiedsSEO::getViewUri('userplans');
				}elseif($type == 'points'){
					$redirect = DJClassifiedsSEO::getViewUri('userpoints');
				}elseif($type == '' || $type == 'prom_top'){
					$item = $djmodel->getItemById($item_id);
					$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_name);
				}elseif($type == 'order'){
					$redirect = DJClassifiedsSEO::getViewUri('ordershistory');
				}elseif($type == 'offer'){
					$redirect = DJClassifiedsSEO::getViewUri('userofferssub');
				}
			}
		}else{
			if($par->get('payment_cancel_redirect') && !$use_default){
				$redirect = 'index.php?Itemid='.$par->get('payment_cancel_redirect');
			}else{
				if($type == 'plan'){
					$redirect = DJClassifiedsSEO::getViewUri('plans');
				}elseif($type == 'points'){
					$redirect = DJClassifiedsSEO::getViewUri('points');
				}elseif($type == '' || $type == 'prom_top'){
					$item = $djmodel->getItemById($item_id);
					$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_name);
				}elseif($type == 'order'){
					$order = $djmodel->getOrder($item_id);
					$item = $djmodel->getItemById($order->item_id);
					$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_name);
				}elseif($type == 'offer'){
					$redirect = DJClassifiedsSEO::getViewUri('userofferssub');
				}
			}
		}

		return $redirect;
	}
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!