Sindbad~EG File Manager

Current Path : /home/sarayaglobal/sarayamystair.in/old/components/com_sh404sef/
Upload File :
Current File : /home/sarayaglobal/sarayamystair.in/old/components/com_sh404sef/sef_ext.php

<?php
/**
 * sh404SEF - SEO extension for Joomla!
 *
 * @author       Yannick Gaultier
 * @copyright    (c) Yannick Gaultier - Weeblr llc - 2020
 * @package      sh404SEF
 * @license      http://www.gnu.org/copyleft/gpl.html GNU/GPL
 * @version      4.21.1.4217
 * @date        2020-09-23
 */

// Security check to ensure this file is being included by a parent file.
defined( '_JEXEC' ) || die;

global $_SEF_SPACE, $lowercase;

class sef_component {

	function revert( &$url_array, $pos ) {

		global $_SEF_SPACE;

		$QUERY_STRING = '';
		$url_array    = array_filter( $url_array ); // V x : traling slash can cause empty array element
		$url_array    = array_values( $url_array );

		if ( ! empty( $url_array[1] ) && strcspn( $url_array[1], ',' ) == strlen( $url_array[1] ) ) {
			// This is a nocache url
			$x = 0;
			$c = count( $url_array );
			while ( $x < $c ) {
				if ( isset( $url_array[ $x ] ) && $url_array[ $x ] != '' && isset( $url_array[ $x + 1 ] ) && $url_array[ $x + 1 ] != '' ) {
					$QUERY_STRING .= '&' . $url_array[ $x ] . '=' . $url_array[ $x + 1 ];
				}
				$x += 2;
			}
		} else {
			//This is a default mambo SEF url for a component
			foreach ( $url_array as $value ) {
				$temp = explode( ",", $value );
				if ( isset( $temp[0] ) && $temp[0] != '' && isset( $temp[1] ) && $temp[1] != "" ) {
					$QUERY_STRING .= "&$temp[0]=$temp[1]";
				}
			}
		}

		//return str_replace("&option","option",$QUERY_STRING);
		return JString::ltrim( $QUERY_STRING, '&' );
	}
}

class sef_content {

	function revert( &$url_array, $pos ) { // V 1.2.4.l  // updated based on includes/sef.php.
		$url_array = array_filter( $url_array ); // V x : traling slash can cause empty array element
		$url_array = array_values( $url_array );
		$uri       = explode( 'content/', $_SERVER['REQUEST_URI'] );
		$option    = 'com_content';
		$pos       = array_search( 'content', $url_array );

		// language hook for content
		$lang = '';
		foreach ( $url_array as $key => $value ) {
			if ( ! JString::strcasecmp( JString::substr( $value, 0, 5 ), 'lang,' ) ) {
				$temp = explode( ',', $value );
				if ( isset( $temp[0] ) && $temp[0] != '' && isset( $temp[1] ) && $temp[1] != '' ) {
					$lang = $temp[1];
				}
				unset( $url_array[ $key ] );
			}
		}

		if ( isset( $url_array[ $pos + 8 ] ) && $url_array[ $pos + 8 ] != '' && in_array( 'category', $url_array ) && ( strpos( $url_array[ $pos + 5 ], 'order,' ) !== false ) && ( strpos( $url_array[ $pos + 6 ], 'filter,' ) !== false ) ) {
			// $option/$task/$sectionid/$id/$Itemid/$order/$filter/$limit/$limitstart
			$task       = $url_array[ $pos + 1 ];
			$sectionid  = $url_array[ $pos + 2 ];
			$id         = $url_array[ $pos + 3 ];
			$Itemid     = $url_array[ $pos + 4 ];
			$order      = str_replace( 'order,', '', $url_array[ $pos + 5 ] );
			$filter     = str_replace( 'filter,', '', $url_array[ $pos + 6 ] );
			$limit      = $url_array[ $pos + 7 ];
			$limitstart = $url_array[ $pos + 8 ];

			$QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&filter=$filter&limit=$limit&limitstart=$limitstart";
		} else {
			if ( isset( $url_array[ $pos + 7 ] ) && $url_array[ $pos + 7 ] != '' && $url_array[ $pos + 5 ] > 1000 && ( in_array( 'archivecategory', $url_array ) || in_array( 'archivesection', $url_array ) ) ) {
				// $option/$task/$id/$limit/$limitstart/year/month/module
				$task       = $url_array[ $pos + 1 ];
				$id         = $url_array[ $pos + 2 ];
				$limit      = $url_array[ $pos + 3 ];
				$limitstart = $url_array[ $pos + 4 ];
				$year       = $url_array[ $pos + 5 ];
				$month      = $url_array[ $pos + 6 ];
				$module     = $url_array[ $pos + 7 ];

				$QUERY_STRING = "option=com_content&task=$task&id=$id&limit=$limit&limitstart=$limitstart&year=$year&month=$month&module=$module";
			} else {
				if ( isset( $url_array[ $pos + 7 ] ) && $url_array[ $pos + 7 ] != '' && $url_array[ $pos + 6 ] > 1000 && ( in_array( 'archivecategory', $url_array ) || in_array( 'archivesection', $url_array ) ) ) {
					// $option/$task/$id/$Itemid/$limit/$limitstart/year/month
					$task       = $url_array[ $pos + 1 ];
					$id         = $url_array[ $pos + 2 ];
					$Itemid     = $url_array[ $pos + 3 ];
					$limit      = $url_array[ $pos + 4 ];
					$limitstart = $url_array[ $pos + 5 ];
					$year       = $url_array[ $pos + 6 ];
					$month      = $url_array[ $pos + 7 ];

					$QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart&year=$year&month=$month";
				} else {
					if ( isset( $url_array[ $pos + 7 ] ) && $url_array[ $pos + 7 ] != '' && in_array( 'category', $url_array ) && ( strpos( $url_array[ $pos + 5 ], 'order,' ) !== false ) ) {
						// $option/$task/$sectionid/$id/$Itemid/$order/$limit/$limitstart
						$task       = $url_array[ $pos + 1 ];
						$sectionid  = $url_array[ $pos + 2 ];
						$id         = $url_array[ $pos + 3 ];
						$Itemid     = $url_array[ $pos + 4 ];
						$order      = str_replace( 'order,', '', $url_array[ $pos + 5 ] );
						$limit      = $url_array[ $pos + 6 ];
						$limitstart = $url_array[ $pos + 7 ];

						$QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&limit=$limit&limitstart=$limitstart";
					} else {
						if ( isset( $url_array[ $pos + 6 ] ) && $url_array[ $pos + 6 ] != '' ) {
							// $option/$task/$sectionid/$id/$Itemid/$limit/$limitstart
							$task       = $url_array[ $pos + 1 ];
							$sectionid  = $url_array[ $pos + 2 ];
							$id         = $url_array[ $pos + 3 ];
							$Itemid     = $url_array[ $pos + 4 ];
							$limit      = $url_array[ $pos + 5 ];
							$limitstart = $url_array[ $pos + 6 ];

							$QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
						} else {
							if ( isset( $url_array[ $pos + 5 ] ) && $url_array[ $pos + 5 ] != '' ) {
								// $option/$task/$id/$Itemid/$limit/$limitstart
								$task       = $url_array[ $pos + 1 ];
								$id         = $url_array[ $pos + 2 ];
								$Itemid     = $url_array[ $pos + 3 ];
								$limit      = $url_array[ $pos + 4 ];
								$limitstart = $url_array[ $pos + 5 ];

								$QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
							} else {
								if ( isset( $url_array[ $pos + 4 ] ) && $url_array[ $pos + 4 ] != '' && ( in_array( 'archivecategory', $url_array ) || in_array( 'archivesection', $url_array ) ) ) {
									// $option/$task/$year/$month/$module
									$task   = $url_array[ $pos + 1 ];
									$year   = $url_array[ $pos + 2 ];
									$month  = $url_array[ $pos + 3 ];
									$module = $url_array[ $pos + 4 ];

									$QUERY_STRING = "option=com_content&task=$task&year=$year&month=$month&module=$module";
								} else {
									if ( ! ( isset( $url_array[ $pos + 5 ] ) && $url_array[ $pos + 5 ] != '' ) && isset( $url_array[ $pos + 4 ] ) && $url_array[ $pos + 4 ] != '' ) {
										// $option/$task/$sectionid/$id/$Itemid
										$task      = $url_array[ $pos + 1 ];
										$sectionid = $url_array[ $pos + 2 ];
										$id        = $url_array[ $pos + 3 ];
										$Itemid    = $url_array[ $pos + 4 ];

										$QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid";
									} else {
										if ( ! ( isset( $url_array[ $pos + 4 ] ) && $url_array[ $pos + 4 ] != '' ) && ( isset( $url_array[ $pos + 3 ] ) && $url_array[ $pos + 3 ] != '' ) ) {
											// $option/$task/$id/$Itemid
											$task   = $url_array[ $pos + 1 ];
											$id     = $url_array[ $pos + 2 ];
											$Itemid = $url_array[ $pos + 3 ];

											$QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid";
										} else {
											if ( ! ( isset( $url_array[ $pos + 3 ] ) && $url_array[ $pos + 3 ] != '' ) && ( isset( $url_array[ $pos + 2 ] ) && $url_array[ $pos + 2 ] != '' ) ) {
												// $option/$task/$id
												$task = $url_array[ $pos + 1 ];
												$id   = $url_array[ $pos + 2 ];

												$QUERY_STRING = "option=com_content&task=$task&id=$id";
											} else {
												if ( ! ( isset( $url_array[ $pos + 2 ] ) && $url_array[ $pos + 2 ] != '' ) && ( isset( $url_array[ $pos + 1 ] ) && $url_array[ $pos + 1 ] != '' ) ) {
													// $option/$task
													$task         = $url_array[ $pos + 1 ];
													$QUERY_STRING = 'option=com_content&task=' . $task;
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}

		if ( $lang != '' ) {
			$QUERY_STRING .= '&amp;lang=' . $lang;
		}

		return $QUERY_STRING;
	}

}

class sef_404 {

	public function create( $string, &$vars, &$shAppendString, $shLanguage, $shSaveString = '', &$originalUri ) {

		// get our config objects
		$pageInfo  = Sh404sefFactory::getPageInfo();
		$sefConfig = Sh404sefFactory::getConfig();
		// get DB // backward compat, some plugins rely on having this object available in scope
		$database = ShlDbHelper::getDb();

		ShlSystem_Log::debug( 'sh404sef', 'Entering sef404 create function with ' . $string );

		// extract request vars to have them readily available
		ShlSystem_Log::debug( 'sh404sef', 'Extracting $vars:', print_r( $vars, true ) );
		extract( $vars );

		// maybe one of them interfere with the variable holding our result?
		if ( isset( $title ) ) {  // V 1.2.4.r : protect against components using 'title' as GET vars
			$sh404SEF_title = $title;  // means that $sh404SEF_title has to be used in plugins or extensions
		}
		$title = array();  // V 1.2.4.r

		// use custom method to find about correct plugin to use
		// can be overwritten by a user plugin
		$extPlugin = Sh404sefFactory::getExtensionPlugin( $option );

		// which plugin file are we supposed to use?
		$extPluginPath = $extPlugin->getSefPluginPath( $vars );
		$pluginType    = $extPlugin->getPluginType();

		// various ways to handle various SEF url plugins
		switch ( $pluginType ) {
			// use Joomla router.php file in extension dir
			case Sh404sefClassBaseextplugin::TYPE_JOOMLA_ROUTER:
				// Load the plug-in file.
				ShlSystem_Log::debug( 'sh404sef', 'Loading component own router.php file' );
				$originalVars = empty( $originalUri ) ? $vars : $originalUri->getQuery( $asArray = true );
				$title        = Sh404sefHelperUrl::buildUrlWithRouterphp( $originalVars, $option );
				$title        = sh404sefHelperUrl::encodeSegments( $title );
				// manage GET var lists ourselves, as Joomla router.php does not do it
				if ( ! empty( $vars ) ) {
					// there are some unused GET vars, we must transfer them to our mechanism, so
					// that they are eventually appended to the sef url
					foreach ( $vars as $k => $v ) {
						switch ( $k ) {
							case 'option':
							case 'Itemid':
							case 'lang':
								shRemoveFromGETVarsList( $k );
								break;
							default:
								// if variable has not been used in sef url, add it to list of variables to be
								// appended to the url as query string elements
								if ( array_key_exists( $k, $originalVars ) ) {
									shAddToGETVarsList( $k, $v );
								} else {
									shRemoveFromGETVarsList( $k );
								}
								break;
						}
					}
				}
				// special case for search component, as router.php encode the search word in the url
				// we can't do that, as we are storing each url in the db
				if ( ( isset( $originalVars['option'] ) && $originalVars['option'] == 'com_search' )
				     && ! empty( $vars['searchword'] )
				) {
					// router.php has encoded that in the url, we need to undo
					$title                      = array();
					$originalVars['searchword'] = $vars['searchword'];
					shAddToGETVarsList( 'searchword', $vars['searchword'] );
					if ( ! empty( $vars['view'] ) ) {
						$vars['view'] = $vars['view'];
						shAddToGETVarsList( 'view', $vars['view'] );
					}
				}

				// handle menu items, having only a single Itemid in the url
				// (router.php will return an empty array in that case, even if we have restored
				// the full non-sef url, as we already did)
				/*
				 * Build the application route
				*/
				$tmp                      = '';
				$prefix                   = shGetComponentPrefix( $option );
				$insertMenuIdForRouterPhp = in_array( str_replace( 'com_', '', $option ), $sefConfig->useJoomlaRouterPhpWithItemid );
				if ( ( $insertMenuIdForRouterPhp || empty( $title ) ) && isset( $originalVars['Itemid'] ) && ! empty( $originalVars['Itemid'] ) ) {
					$menu = JFactory::getApplication()->getMenu( 'site' );
					$item = $menu->getItem( $originalVars['Itemid'] );

					if ( is_object( $item ) && $originalVars['option'] == $item->component ) {
						array_unshift( $title, $item->route );
					}
				}

				if ( empty( $title ) && empty( $prefix ) ) {
					$title[] = substr( $originalVars['option'], 4 );
				}

				// add user defined prefix
				if ( ! empty( $prefix ) ) {
					array_unshift( $title, $prefix );
				}

				// now process the resulting title string
				$string = shFinalizePlugin(
					$string, $title, $shAppendString, '',
					( isset( $limit ) ? $limit : null ), ( isset( $limitstart ) ? $limitstart : null ),
					( isset( $shLangName ) ? $shLangName : null ), ( isset( $showall ) ? $showall : null ),
					$suppressPagination = true
				);
				break;

			// use sh404sef plugins, either in ext. dir or in sh404sef dir
			case Sh404sefClassBaseextplugin::TYPE_SH404SEF_ROUTER:
				ShlSystem_Log::debug( 'sh404sef', 'Loading sh404SEF plugin in ' . $extPluginPath );

				// get the current Itemid
				$activeMenu      = JFactory::getApplication()->getMenu( 'site' )->getActive();
				$shCurrentItemid = empty( $activeMenu ) ? '' : $activeMenu->id;

				// build the URL
				include $extPluginPath;

				break;

			// Joomsef plugins
			case Sh404sefClassBaseextplugin::TYPE_JOOMSEF_ROUTER:
				Sh404sefHelperExtplugins::loadJoomsefCompatLibs();
				include_once $extPluginPath;
				$className = 'SefExt_' . $option;
				$plugin    = new $className;
				if ( ! shIsHomepage( $string ) ) {
					// make sure the plugin does not try to calculate pagination
					$params = &SEFTools::GetExtParams( 'com_content' );
					$params->set( 'pagination', '1' );
					// ask plugin to build url
					$plugin->beforeCreate( $originalUri );
					$result = $plugin->create( $originalUri );
					$title  = empty( $result['title'] ) ? array() : $result['title'];
					$plugin->afterCreate( $originalUri );
					// make sure we have a url
					if ( empty( $title ) && isset( $vars['Itemid'] ) && ! empty( $vars['Itemid'] ) ) {
						$menu = JFactory::getApplication()->getMenu( 'site' );
						$item = $menu->getItem( $vars['Itemid'] );

						if ( is_object( $item ) && $vars['option'] == $item->component ) {
							$title[] = $item->route;
						}
					}
					$prefix = shGetComponentPrefix( $option );
					if ( ! empty( $prefix ) ) {
						array_unshift( $title, $prefix );
					}
					if ( empty( $title ) && ! shIsHomepage( $string ) ) {
						$title[] = substr( $vars['option'], 4 );
					}
					list( $usedVars, $ignore ) = $plugin->getNonSefVars( $result );
					if ( ! empty( $ignore ) ) {
						$usedVars = array_merge( $usedVars, $ignore );
					}
				} else {
					$string   = '';
					$title[]  = '/';
					$usedVars = array();
				}
				// post process result to adjust to our workflow

				if ( ! empty( $vars ) ) {
					foreach ( $vars as $key => $value ) {
						if ( ! array_key_exists( $key, $usedVars ) ) {
							shRemoveFromGETVarsList( $key );
						}
					}
				}

				// finalize url
				$string = shFinalizePlugin(
					$string, $title, $shAppendString = '', $shItemidString = '',
					( isset( $limit ) ? $limit : null ), ( isset( $limitstart ) ? $limitstart : null ),
					( isset( $shLangName ) ? $shLangName : null ), ( isset( $showall ) ? $showall : null )
				);
				break;

			// Acesef plugins
			case Sh404sefClassBaseextplugin::TYPE_ACESEF_ROUTER:
				Sh404sefHelperExtplugins::loadAcesefCompatLibs();
				include_once $extPluginPath;
				$className            = 'AceSEF_' . $option;
				$plugin               = new $className;
				$plugin->AcesefConfig = AcesefFactory::getConfig();  // some plugins appear to not call the constructor parent, and so AcesefConfig is not set
				$tmp                  = JPluginHelper::getPlugin( 'sh404sefextacesef', $option );
				$params               = new JRegistry();
				$params->loadString( $tmp->params );
				$plugin->setParams( $params );
				$segments        = array();
				$do_sef          = true;
				$metadata        = array();
				$item_limitstart = 0;
				$plugin->beforeBuild( $originalUri );
				$originalVars = empty( $originalUri ) ? $vars : $originalUri->getQuery( $asArray = true );
				$plugin->build( $originalVars, $title, $do_sef, $metadata, $item_limitstart );
				$plugin->afterBuild( $originalUri );
				$prefix = shGetComponentPrefix( $option );
				if ( empty( $title ) && isset( $vars['Itemid'] ) && ! empty( $vars['Itemid'] ) ) {
					$menu = JFactory::getApplication()->getMenu( 'site' );
					$item = $menu->getItem( $vars['Itemid'] );

					if ( is_object( $item ) && $vars['option'] == $item->component ) {
						$title[] = $item->route;
					}
				}
				if ( ! empty( $prefix ) ) {
					array_unshift( $title, $prefix );
				}
				if ( empty( $title ) && ! shIsHomepage( $string ) ) {
					$title[] = substr( $vars['option'], 4 );
				}

				// acesef plugin don't remove used vars from our GET var manager
				// we'll do it now. Vars used are those not present anymore in
				// $originalVars
				// they will be reappended to the SEF url by shFinalizePlugin
				$usedVars = array_diff( $vars, $originalVars );
				if ( ! empty( $usedVars ) ) {
					foreach ( $usedVars as $key => $value ) {
						shRemoveFromGETVarsList( $key );
					}
				}
				// remove Itemid and option, as these are not unset by plugin
				shRemoveFromGETVarsList( 'Itemid' );
				shRemoveFromGETVarsList( 'option' );
				// finalize url
				$string = shFinalizePlugin(
					$string, $title, $shAppendString = '', $shItemidString = '',
					( isset( $limit ) ? $limit : null ), ( isset( $limitstart ) ? $limitstart : null ),
					( isset( $shLangName ) ? $shLangName : null ), ( isset( $showall ) ? $showall : null )
				);

				break;

			default:
				ShlSystem_Log::debug( 'sh404sef', 'Falling back to sefGetLocation' );
				if ( empty( $sefConfig->defaultComponentStringList[ str_replace( 'com_', '', $option ) ] ) ) {
					$title[] = getMenuTitle( $option, ( isset( $task ) ? $task : null ), null, null, $shLanguage );
				} else {
					$title[] = $sefConfig->defaultComponentStringList[ str_replace( 'com_', '', $option ) ];
				}
				if ( $title[0] != '/' ) {
					$title[] = '/';  // V 1.2.4.q getMenuTitle can now return '/'
				}
				if ( count( $title ) > 0 ) {
					// V 1.2.4.q use $shLanguage insted of $lang  (lang name rather than lang code)
					$string = sef_404::sefGetLocation( $string, $title, ( isset( $task ) ? $task : null ), ( isset( $limit ) ? $limit : null ), ( isset( $limitstart ) ? $limitstart : null ), ( isset( $shLanguage ) ? $shLanguage : null ) );
				}
				break;
		}

		// hook
		/**
		 * Filter the SEF URL as built by the component-specific sh404SEF plugin.
		 *
		 * @api
		 * @package sh404SEF\filter\router
		 * @var sh404sef_after_plugin_build
		 * @since   4.9.2
		 *
		 * @param string $string The computed SEF URL.
		 * @param array  $vars Associate array of query vars used to build the SEF.
		 * @param int    $pluginType Plugin type: native sh404SEF, Joomsef, Acesef,...
		 * @param string $extPluginPath The full path to the plugin used to build the URL.
		 *
		 * @return string
		 */
		$string = ShlHook::filter( 'sh404sef_after_plugin_build', $string, $vars, $pluginType, $extPluginPath );

		return $string;
	}

	function revert( &$url_array, $pos ) {

		die( 'voluntary die in ' . __METHOD__ . ' of class ' . __CLASS__ );
	}

	public static function getContentTitles( $view, $id, $layout, $Itemid = 0, $shLang = null, $sefConfig = null ) {

		// if config is not injected, get default one
		if ( is_null( $sefConfig ) ) {
			$sefConfig = &Sh404sefFactory::getConfig();
		}
		$title = self::getContentSlugsArray( $view, $id, $layout, $Itemid, $shLang, $sefConfig );

		return $title;
	}

	public static function getContentSlugsArray( $view, $id, $layout, $Itemid = 0, $shLang = null, $sefConfig = null ) {

		$slugsArray  = array();
		$prefixArray = array();

		// if config is not injected, get default one
		if ( is_null( $sefConfig ) ) {
			$sefConfig = Sh404sefFactory::getConfig();
		}
		$id = empty( $id ) ? 0 : intval( $id );

		$requestedLanguage = empty( $shLang ) ? '*' : $shLang;

		try {
			$slugsModel        = Sh404sefModelSlugs::getInstance();
			$menuItemTitle     = getMenuTitle( null, $view, ( isset( $Itemid ) ? $Itemid : null ), '', $shLang );
			$uncategorizedPath = $sefConfig->slugForUncategorizedContent == shSEFConfig::COM_SH404SEF_UNCATEGORIZED_EMPTY ? '' : $menuItemTitle;
			switch ( $view ) {
				case 'category':
					if ( empty( $layout ) || $layout == 'default' ) {
						if ( ! empty( $Itemid ) ) {
							$menuItem = \Joomla\CMS\Factory::getApplication()->getMenu( 'site' )->getItem( $Itemid );
						}
						if ( ! empty( $menuItem )
						     && $menuItem->component == 'com_content'
						     && isset( $menuItem->query['view'], $menuItem->query['id'] )
						     && $menuItem->query['view'] == 'category'
						     && $menuItem->query['id'] == $id ) {
							if ( isset( $menuItem->query['layout'] ) ) {
								$layout = $menuItem->query['layout'];
							}
						}

						if ( empty( $layout ) ) {
							$categories = JCategories::getInstance( 'content', $options = array( 'access' => false, 'published' => 0 ) );
							$category   = $categories->get( $id );
							if ( empty( $category ) ) {
								$layout = 'default';
							} else {
								$cparams          = $category->getParams();
								$category->params = clone \Joomla\CMS\Factory::getApplication()->getParams();
								$category->params->merge( $cparams );
								$paramsLayout = $category->params->get( 'category_layout' );
								if ( wbContains( $paramsLayout, ':' ) ) {
									$temp   = explode( ':', $paramsLayout );
									$layout = $temp[1];
								} else {
									$layout = $paramsLayout;
								}
							}
						}
					}
					if ( $layout != 'blog' ) {
						if ( $sefConfig->shInsertContentTableName ) {
							$prefix = empty( $sefConfig->shContentTableName ) ? $menuItemTitle : $sefConfig->shContentTableName;
							if ( ! empty( $prefix ) ) {
								$prefixArray[] = $prefix;
							}
						}
						if ( ! empty( $id ) ) { // we have a category id
							$slugsArray = $slugsModel->getCategorySlugArray( 'com_content', $id, $sefConfig->includeContentCatCategories, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage );
						} else {  // no category id, use menu item title
							if ( ! $sefConfig->shInsertContentTableName || empty( $sefConfig->shContentTableName ) ) {
								if ( ! empty( $menuItemTitle ) ) {
									$slugsArray[] = $menuItemTitle;
								}
							}
						}
					}

					if ( $layout == 'blog' ) {  // blog category
						if ( $sefConfig->shInsertContentBlogName ) {
							$prefix = empty( $sefConfig->shContentBlogName ) ? $menuItemTitle : $sefConfig->shContentBlogName;
							if ( ! empty( $prefix ) ) {
								$prefixArray[] = $prefix;
							}
						}
						if ( ! empty( $id ) ) {
							$slugsArray = $slugsModel->getCategorySlugArray( 'com_content', $id, $sefConfig->includeContentCatCategories, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage );
						} else { // this should not happen, probably a malformed url
							if ( ! $sefConfig->shInsertContentBlogName || empty( $sefConfig->shContentBlogName ) ) {
								if ( ! empty( $menuItemTitle ) ) {
									$slugsArray[] = $menuItemTitle;
								}
							}
						}
					}

					if ( ! empty( $prefixArray ) ) {
						$slugsArray = array_merge( $prefixArray, $slugsArray );
					}

					$slugsArray[] = '/';
					break;
				case 'categories':
					// now get category(ies) path
					if ( ! empty( $id ) ) {
						$slugsArray = $slugsModel->getCategorySlugArray( 'com_content', $id, $sefConfig->includeContentCatCategories, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage );
						// insert a suffix to distinguish from normal category listing
						if ( ! empty( $sefConfig->contentCategoriesSuffix ) ) {
							$slugsArray[] = $sefConfig->contentCategoriesSuffix;
						}
						// end with a directory sign
						$slugsArray[] = '/';
					} else {
						if ( ! empty( $menuItemTitle ) ) {
							$slugsArray[] = $menuItemTitle;
						}
					}
					break;
				case 'featured' :
					if ( ! empty( $menuItemTitle ) ) {
						$slugsArray[] = $menuItemTitle;
					}
					break;
				case 'article':
					$article  = $slugsModel->getArticle( $id );
					$language = $requestedLanguage;
					if ( empty( $article[ $requestedLanguage ] ) ) {
						$language = '*';
					}
					// still no luck, use whatever is available
					if ( empty( $article[ $language ] ) ) {
						$languages = array_keys( $article );
						$language  = array_shift( $languages );
					}
					// get category(ies)
					// special case for the "uncategorised" category
					$unCat = Sh404sefHelperCategories::getUncategorizedCat( 'com_content' );
					if ( ! empty( $unCat ) && $article[ $language ]->catid == $unCat->id ) {
						$slugsArray = empty( $uncategorizedPath ) ? array() : array( $uncategorizedPath );
					} else {
						$slugsArray = $slugsModel->getCategorySlugArray( 'com_content', $article[ $language ]->catid, $sefConfig->includeContentCat, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage );
					}
					// get article slug, optionnally including article id inurl
					$insertIdCatList = $sefConfig->ContentTitleInsertArticleId ? $sefConfig->shInsertContentArticleIdCatList : array();
					$articleSlug     = $slugsModel->getArticleSlug( $id, $sefConfig->UseAlias, $sefConfig->ContentTitleInsertArticleId, $insertIdCatList, $requestedLanguage );
					$slugsArray[]    = $articleSlug;
					break;
				default :
					break;
			}
		}
		catch ( Exception $e ) {
			ShlSystem_Log::error( 'sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage() );
		}

		return $slugsArray;
	}

	/**
	 *
	 * @param string $url
	 * @param array  $title
	 * @param string $task
	 * @param int    $limit
	 * @param int    $limitstart
	 *
	 * @return sefurl
	 */
	public static function sefGetLocation(
		$nonSefUrl, &$title, $task = null, $limit = null
		, $limitstart = null, $langParam = null, $showall = null, $suppressPagination = false
	) {

		try {
			$pageInfo  = Sh404sefFactory::getPageInfo();
			$sefConfig = Sh404sefFactory::getConfig();

			$lang = empty( $langParam ) ? $pageInfo->currentLanguageTag : $langParam;

			// shumisha : try to avoid duplicate content on multilingual sites by always adding &lang=xx to url (stored in DB).
			// warning : must add &lang=xx only if it does not exists already
			if ( ! strpos( $nonSefUrl, 'lang=' ) ) {
				$shSepString = ( substr( $nonSefUrl, - 9 ) == 'index.php' ? '?' : '&' );
				$nonSefUrl   .= $shSepString . 'lang=' . Sh404sefHelperLanguage::getUrlCodeFromTag( $lang );
			}

			// make sure url is consistent
			$nonSefUrl = str_replace( '&amp;', '&', $nonSefUrl );

			// detect multipage homepage
			$shMultiPageHomePageFlag = shIsHomepage( $nonSefUrl );

			// get all the slugs ready for being urls bits
			$tempSefUrl = array();
			foreach ( $title as $titlestring ) {
				$decodedTitletring = urldecode( $titlestring );
				$tempSefUrl[]      = titleToLocation( $decodedTitletring );
			}

			// now build the URL
			$tempSefUrl = implode( "/", $tempSefUrl );

			// remove duplicate /
			$tempSefUrl = ShlSystem_Strings::pr( '/\/{2,}/u', '/', $tempSefUrl );

			// and truncate to max length, according to param
			$tempSefUrl = JString::substr( $tempSefUrl, 0, sh404SEF_MAX_SEF_URL_LENGTH ); // trim to max length V 1.2.4.t

			/**
			 * Filter the SEF URL just before any pagination info is added and URL stored to db.
			 *
			 * @api
			 * @package sh404SEF\filter\router
			 * @var sh404sef_url_before_store
			 * @since   4.21.1
			 *
			 * @param string $string The computed SEF URL.
			 * @param array  $vars Associate array of query vars used to build the SEF.
			 *
			 * @return string
			 */
			$tempSefUrl = ShlHook::filter(
				'sh404sef_url_before_store',
				$tempSefUrl,
				$nonSefUrl
			);

			// if URL is empty, and unless this is a paginated home page, or home page in non-default language, stop there
			if ( empty( $tempSefUrl ) ) {
				if ( ( empty( $pageInfo->isMultilingual ) || ( $pageInfo->isMultilingual && shIsDefaultlang( $lang ) ) ) && ! $sefConfig->addFile
				     && ! $shMultiPageHomePageFlag
				) //
				{
					return '';
				} // if location is empty, and not multilingual site, or multilingual, but this is default language, then there is nothing to add to url
			}

			// we have a valid SEF url, built with the data ($title) sent
			// by plugin. Now we want to check if it's already in the db
			// and add it if not

			// first, we search the memory cache for the non-sef url
			// as it is faster than looking up the db
			$finalSefUrl = '';
			$sefUrlType  = Sh404sefHelperCache::getSefUrlFromCache( $nonSefUrl, $finalSefUrl );

			// if non-sef was not found in cache - or found, but it was a 404 last time we saw it -
			// we should continue and try adding it
			if ( $sefUrlType == sh404SEF_URLTYPE_NONE || $sefUrlType == sh404SEF_URLTYPE_404 ) {
				$finalSefUrl = false;

				// non-sef was not found in cache, let's look up the database
				if ( $sefUrlType == sh404SEF_URLTYPE_NONE ) {
					$finalSefUrl = ShlDbHelper::selectResult( '#__sh404sef_urls', 'oldurl', array( 'newurl' => $nonSefUrl ) );
				}

				// we found the sef url in database, we're done
				if ( ! empty( $finalSefUrl ) ) {
					return $finalSefUrl;
				}

				// the non-sef url is not in memory cache, nor in database
				// that's a new one, we need to finalize its sef (add pagination and language information)
				// After finalizing it, we'll also check that sef is not in the db
				// as it can already be there, associated with another non-sef (ie: a duplicate)
				// Either way we'll add it in the db, but mark it as a duplicate if needed

				// add pagination information, unless we were instructed by extension plugin not to
				// find if we should separate pagination info from sef with a / or not
				if ( ! empty( $tempSefUrl ) ) {
					$shSeparator = ( JString::substr( $tempSefUrl, - 1 ) == '/' ) ? '' : '/';
				} else {
					$shSeparator = '';
				}

				$finalSefUrl = shAddPaginationInfo( $limit, $limitstart, $showall, 1, $nonSefUrl, $tempSefUrl, $shSeparator, $defaultListLimitValue = null, $suppressPagination );

				// if home page, we don't record anything, just return "home page"
				if ( $shMultiPageHomePageFlag && ( '/' . $finalSefUrl == $tempSefUrl )    // if homepage
				     && ( empty( $pageInfo->isMultilingual )       // and not multilingual
				          || ( $pageInfo->isMultilingual       // or multilingual
				               && shIsDefaultLang( $lang ) ) )  // but this is default language
				) {
					// this is start page of multipage homepage, return home or forced home
					if ( ! empty( $sefConfig->shForcedHomePage ) ) {
						return str_replace( $pageInfo->getDefaultFrontLiveSite() . '/', '', $sefConfig->shForcedHomePage );
					} else {
						return '';
					}
				}

				// add language information
				// first, remove languages in non-sef, to see if we're on homepage
				// as handling is sligthly different for homepage
				$v1 = shCleanUpLang( $nonSefUrl );
				$v2 = shCleanUpLang( $pageInfo->homeLink );
				if ( $v1 == $v2 || $v1 == 'index.php' ) {  // check if this is homepage
					if ( $pageInfo->isMultilingual && ! shIsDefaultLang( $lang ) ) {
						// if homepage in not-default-language, then add language code regardless of user settings
						// as we otherwise would not be able to switch language on the frontpage
						$finalSefUrl = Sh404sefHelperLanguage::getUrlCodeFromTag( $lang ) . '/';
					} else {
						$finalSefUrl = '';
					}
				} else {
					// not on homepage, insert lang code based on user setting
					$option = Sh404sefHelperUrl::getUrlVar( $nonSefUrl, 'option', '' );
					if ( shInsertIsoCodeInUrl( $option, $lang ) ) {  // insert language code based on param
						// pass URL lang info, as may not be current lang
						$finalSefUrl = Sh404sefHelperLanguage::getUrlCodeFromTag( $lang ) . '/' . $finalSefUrl;   //  must be forced lang, not default
					}
				}

				// after adding pagination part of SEF, and adding language code
				// the new SEF url is now complete and we can try adding to it cache and db
				if ( $finalSefUrl != '' ) {
					$dburl         = null;
					$dbUrlId       = null;
					$nonSefUrlType = sh404SEF_URLTYPE_NONE;

					// search the memory cache for this new sef
					if ( $sefConfig->shUseURLCache ) {
						$nonSefUrlType = Sh404sefHelperCache::getNonSefUrlFromCache( $finalSefUrl, $dburl );
					}
					$newMaxRank = 0;
					// if the new SEF was not found in memory cache, or if it was found but
					// we're set to record duplicates, we search for it in the database
					if ( $sefConfig->shRecordDuplicates || $nonSefUrlType == sh404SEF_URLTYPE_NONE ) {
						$dbUrlList = ShlDbHelper::selectObjectList(
							'#__sh404sef_urls', array( 'id', 'newurl', 'rank', 'dateadd' )
							, array( 'oldurl' => $finalSefUrl )
							, $aWhereData = array()
							, $orderBy = array( 'rank' )
						);

						if ( count( $dbUrlList ) > 0 ) {
							$dburl   = $dbUrlList[0]->newurl;
							$dbUrlId = $dbUrlList[0]->id;
							if ( empty( $dburl ) ) {  // V 1.2.4.t url was found in DB, but was a 404
								$nonSefUrlType = sh404SEF_URLTYPE_404;
							} else {
								$newMaxRank    = $dbUrlList[ count( $dbUrlList ) - 1 ]->rank + 1;
								$nonSefUrlType = $dbUrlList[0]->dateadd == '0000-00-00' ?
									sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM;
							}
						}
					}

					if ( $nonSefUrlType != sh404SEF_URLTYPE_NONE && $nonSefUrlType != sh404SEF_URLTYPE_404 ) {
						// we found the SEF, one or more times in the db, in records which do have a non-sef attached
						$isDuplicate = $dburl != $nonSefUrl;
						// This is a duplicate so we must indert it with incremented rank;
						if ( is_null( $dburl ) || ( $isDuplicate && $sefConfig->shRecordDuplicates ) ) {
							// shAddSefUrlToDBAndCache( $nonSefUrl, $finalSefUrl, ($isDuplicate ? $newMaxRank : 0), $nonSefUrlType);
							$dateAdd     = $nonSefUrlType == sh404SEF_URLTYPE_AUTO ? '0000-00-00' : date( "Y-m-d" );
							$rank        = $isDuplicate ? $newMaxRank : 0;
							$finalSefUrl = ShlHook::filter(
								'sh404sef_url_before_create',
								$finalSefUrl,
								$nonSefUrl,
								$rank,
								$dateAdd
							);
							ShlDbHelper::insert( '#__sh404sef_urls', array(
								'oldurl'  => $finalSefUrl,
								'newurl'  => $nonSefUrl,
								'rank'    => $rank,
								'dateadd' => $dateAdd
							) );

							// store new sef/non-sef pair in memory cache
							Sh404sefHelperCache::addSefUrlToCache( $nonSefUrl, $finalSefUrl, $nonSefUrlType );

							// store optional data
							Sh404sefHelperUrl::storeUrlSourceData( $nonSefUrl, $finalSefUrl, $rank );

							// create shURL : get a shURL model, and ask url creation
							$model = ShlMvcModel_Base::getInstance( 'pageids', 'Sh404sefModel' );
							$model->createPageId( $finalSefUrl, $nonSefUrl );
						}
					} else {
						// we haven't found the non-sef/sef pair, but maybe there is a record for
						// a 404 with that SEF. If so, we will "upgrade" the 404 record to a
						// normal non-sef/sef pair
						$dbUrlId = empty( $dbUrlId ) ? 0 : intval( $dbUrlId );

						if ( $sefConfig->shLog404Errors ) {
							if ( $nonSefUrlType == sh404SEF_URLTYPE_404 && ! empty( $dbUrlId ) ) {  // we already have seen that it is a 404
								$id = $dbUrlId;
							} elseif ( $nonSefUrlType == sh404SEF_URLTYPE_404 ) {
								$id = ShlDbHelper::selectResult( '#__sh404sef_urls', 'id', array( 'oldurl' => $finalSefUrl, 'newurl' => '' ) );
							} else {
								$id = null;
							}
						} else {
							$id = null;  // if we are not logging 404 errors, then no need to check for
						}              // previous hit of this page.

						if ( ! empty( $id ) ) {
							// we found a 404 record matching the SEF url just created. We'll update that record
							// instead of creating a new one
							// need to update dateadd to 0, as otherwise this sef/non-sef pair will be seen as custom
							// this makes all such 404 errors 'disappear' from the 404 log, but no other solution
							ShlDbHelper::updateIn(
								'#__sh404sef_urls', array( 'newurl' => $nonSefUrl, 'dateadd' => '0000-00-00', 'cpt' => 0 )
								, 'id', array( $id )
							);
							Sh404sefHelperCache::addSefUrlToCache( $nonSefUrl, $finalSefUrl, sh404SEF_URLTYPE_AUTO );

							// store optional data
							Sh404sefHelperUrl::storeUrlSourceData( $nonSefUrl, $finalSefUrl, $rank = 0 );
						} else {
							// standard case: creation of a totally new sef/non-sef pair
							/**
							 * Filter the SEF URL just before it's stored to the database.
							 *
							 * @api
							 * @package sh404SEF\filter\router
							 * @var sh404sef_url_before_create
							 * @since   4.9.2
							 *
							 * @param string $string The computed SEF URL.
							 * @param array  $vars Associate array of query vars used to build the SEF.
							 * @param int    $pluginType Plugin type: native sh404SEF, Joomsef, Acesef,...
							 * @param string $extPluginPath The full path to the plugin used to build the URL.
							 *
							 * @return string
							 */
							$finalSefUrl = ShlHook::filter(
								'sh404sef_url_before_create',
								$finalSefUrl,
								$nonSefUrl,
								0,
								'0000-00-00'
							);

							ShlDbHelper::insert( '#__sh404sef_urls', array(
								'oldurl'  => $finalSefUrl,
								'newurl'  => $nonSefUrl,
								'rank'    => 0,
								'dateadd' => '0000-00-00'
							) );

							// store new sef/non-sef pair in memory cache
							Sh404sefHelperCache::addSefUrlToCache( $nonSefUrl, $finalSefUrl, sh404SEF_URLTYPE_AUTO );

							// store optional data
							Sh404sefHelperUrl::storeUrlSourceData( $nonSefUrl, $finalSefUrl, 0 );

							// create shURL : get a shURL model, and ask url creation
							$model = ShlMvcModel_Base::getInstance( 'pageids', 'Sh404sefModel' );
							$model->createPageId( $finalSefUrl, $nonSefUrl );
						}
					}
				}
			}
		}
		catch ( Exception $e ) {
			$finalSefUrl = '';
			ShlSystem_Log::error( 'sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage() );
		}

		return $finalSefUrl;
	}

	public static function getcategories( $catid, $shLang = null, $section = '' ) {

		ShlSystem_Log::debug( 'sh404sef', 'Calling deprecated sef_404::getCategories() method. Use Sh404sefModelSlugs model instead.' );

		return '';
	}
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists