<?php
/**
 * @version		$Id: controller.php 15095 2010-02-27 14:14:06Z ian $
 * @package		Joomla
 * @subpackage	Menus
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant to the
 * GNU General Public License, and as distributed it includes or is derivative
 * of works licensed under the GNU General Public License or other free or open
 * source software licenses. See COPYRIGHT.php for copyright notices and
 * details.
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );

jimport('joomla.application.component.controller');

/**
 * @package		Joomla
 * @subpackage	Menus
 */
class MenusController extends JController
{
	/**
	 * New menu item wizard
	 */

	function newItem()
	{
		JRequest::setVar( 'edit', false );
		$model	=& $this->getModel( 'Item' );
		$view =& $this->getView( 'Item' );
		$view->setModel( $model, true );

		// Set the layout and display
		$view->setLayout('type');
		$view->type();
	}
	/**
	 * Edit menu item wizard
	 */

	function type()
	{
		JRequest::setVar( 'edit', true );
		$model	=& $this->getModel( 'Item' );
		$view =& $this->getView( 'Item' );
		$view->setModel( $model, true );

		// Set the layout and display
		$view->setLayout('type');
		$view->type();
	}

	/**
	 * Edits a menu item
	 */
	function edit()
	{
		JRequest::setVar( 'edit', true );
		$model	=& $this->getModel( 'Item' );
		$model->checkout();

		$view =& $this->getView( 'Item' );
		$view->setModel( $model, true );
		// Set the layout and display
		$view->setLayout('form');
		$view->edit();
	}

	/**
	 * Saves a menu item
	 */
	function save()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$model	=& $this->getModel( 'Item' );
		$post	= JRequest::get('post');
		// allow name only to contain html
		$post['name'] = JRequest::getVar( 'name', '', 'post', 'string', JREQUEST_ALLOWHTML );
		$model->setState( 'request', $post );

		if ($model->store()) {
			$msg = JText::_( 'Menu item Saved' );
		} else {
			$msg = JText::_( 'Error Saving Menu item' );
		}

		$item =& $model->getItem();
		switch ( $this->_task ) {
			case 'apply':
				$this->setRedirect( 'index.php?option=com_menus&menutype='.$item->menutype.'&task=edit&cid[]='.$item->id.'' , $msg );
				break;

			case 'save':
			default:
				$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$item->menutype, $msg );
				break;
		}
	}

	/**
	* Cancels an edit operation
	*/
	function cancelItem()
	{
		global $mainframe;

		JRequest::checkToken() or jexit( 'Invalid Token' );

		$menutype = $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'string' );

		$model = $this->getModel('item');
		$model->checkin();

		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menutype);
	}

	/**
	* Cancels an edit operation
	*/
	function cancel()
	{
		$this->setRedirect( 'index.php?option=com_menus');
	}

	/**
	* Form for copying item(s) to a specific menu
	*/
	function copy()
	{
		$model	=& $this->getModel( 'List' );
		$view =& $this->getView( 'List' );
		$view->setModel( $model, true );
		$view->copyForm();
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function doCopy()
	{
		global $mainframe;

		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	 	= JRequest::getString( 'menu', '', 'post');
		$cid		= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		//Check to see of a menu was selected to copy the items too
		if (empty($menu))
		{
			$msg = JText::_('Please select a menu from the list');
			$mainframe->enqueueMessage($msg, 'message');
			return $this->execute('copy');
		}

		$model	=& $this->getModel( 'List' );

		if ($model->copy($cid, $menu)) {
			$msg = JText::sprintf( 'Menu Items Copied to', count( $cid ), $menu );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Form for moving item(s) to a specific menu
	*/
	function move()
	{
		$model	=& $this->getModel( 'List');
		$view =& $this->getView( 'List' );
		$view->setModel( $model, true );
		$view->moveForm();
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function doMove()
	{
		global $mainframe;

		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menu', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		//Check to see if a menu was selected to copy the items too
		if (empty($menu))
		{
			$msg = JText::_('Please select a menu from the list');
			$mainframe->enqueueMessage($msg, 'message');
			return $this->execute('move');
		}

		$model	=& $this->getModel( 'List' );

		if ($model->move($cid, $menu)) {
			$msg = JText::sprintf( 'Menu Items Moved to', count( $cid ), $menu );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function publish()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		$model =& $this->getModel( 'List' );
		if ($model->setItemState($cid, 1)) {
			$msg = JText::sprintf( 'Menu Items Published', count( $cid ) );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function unpublish()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		$model =& $this->getModel( 'List' );
		if ($model->setItemState($cid, 0)) {
			$msg = JText::sprintf( 'Menu Items Unpublished', count( $cid ) );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function orderup()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		if (isset($cid[0]) && $cid[0]) {
			$id = $cid[0];
		} else {
			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
			return false;
		}

		$model =& $this->getModel( 'List' );
		if ($model->orderItem($id, -1)) {
			$msg = JText::_( 'Menu Item Moved Up' );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function orderdown()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		if (isset($cid[0]) && $cid[0]) {
			$id = $cid[0];
		} else {
			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
			return false;
		}

		$model =& $this->getModel( 'List' );
		if ($model->orderItem($id, 1)) {
			$msg = JText::_( 'Menu Item Moved Down' );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function saveorder()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		$model =& $this->getModel( 'List' );
		if ($model->setOrder($cid, $menu)) {
			$msg = JText::_( 'New ordering saved' );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function accesspublic()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		$model =& $this->getModel( 'List' );
		if ($model->setAccess($cid, 0)) {
			$msg = JText::sprintf( 'Menu Items Set Public', count( $cid ) );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function accessregistered()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		$model =& $this->getModel( 'List' );
		if ($model->setAccess($cid, 1)) {
			$msg = JText::sprintf( 'Menu Items Set Registered', count( $cid ) );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function accessspecial()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		$model =& $this->getModel( 'List' );
		if ($model->setAccess($cid, 2)) {
			$msg = JText::sprintf( 'Menu Items Set Special', count( $cid ) );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function setdefault()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		if (isset($cid[0]) && $cid[0]) {
			$id = $cid[0];
		} else {
			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
			return false;
		}

		$item =& JTable::getInstance( 'menu' );
		$item->load($id);
		if(!$item->get('published')) {
			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('The Default Menu Item Must Be Published') );
			return false;
		}

		$model =& $this->getModel( 'List' );
		if ($model->setHome($id)) {
			$msg = JText::_( 'Default Menu Item Set' );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	function remove()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		// Get some variables from the request
		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
		JArrayHelper::toInteger($cid);

		if (!count($cid)) {
			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
			return false;
		}

		$model =& $this->getModel( 'List' );
		if ($n = $model->toTrash($cid)) {
			$msg = JText::sprintf( 'Item(s) sent to the Trash', $n );
		} else {
			$msg = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
	}

	/**
	* Save the item(s) to the menu selected
	*/
	function view()
	{
		$model	=& $this->getModel( 'List' );
		$view =& $this->getView( 'List' );
		$view->setModel( $model, true );
		$view->display();
	}


	/**
	 * Controller for view listing menu types and related statical info
	 * @param string The URL option
	 */
	function viewMenus()
	{

		$view =& $this->getView( 'Menus');
		$model	=& $this->getModel( 'Menutype' );
		$view->setModel( $model, true );
		$view->display();
	}


	/**
	 * Controller for view to edit a menu type
	 */
	function editMenu()
	{
		$view =& $this->getView( 'Menus' );
		$model	=& $this->getModel( 'Menutype' );
		$view->setModel( $model, true );
		$view->editForm(true,null);

	}

	/**
	 * Controller for view to create a menu type
	 */
	function addMenu()
	{
		$view =& $this->getView( 'Menus' );
		$model	=& $this->getModel( 'Menutype' );
		$view->setModel( $model, true );
		$view->editForm(false,null);
	}

	/**
	 * Controller for saving a menu type
	 */
	function saveMenu()
	{
		global $mainframe;

		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$db		=& JFactory::getDBO();
		$id		= JRequest::getVar( 'id', 0, 'post', 'int' );

		$oldType =& JTable::getInstance('menutypes' );
		$oldType->load( $id );

		$menuType =& JTable::getInstance('menutypes');
		$menuType->bind( JRequest::get( 'post' ) );

		$isNew		= ($menuType->id == 0);
		$isChanged	= ($oldType->menutype != $menuType->menutype);

		if (!$menuType->check()) {
			JError::raiseWarning( 500, $menuType->getError() );
			$this->setRedirect( 'index.php?option=com_menus&task=editMenu', 'Please check your menu settings' );
			return false;
		}

		if (!$menuType->store()) {
			JError::raiseWarning( 500, $menuType->getError() );
			$this->setRedirect( 'index.php?option=com_menus&task=editMenu', 'Please check your menu settings' );
			return false;
		}

		if ($isNew)
		{
			if ($title = JRequest::getVar( 'module_title', $menuType->menutype, 'post', 'string' ))
			{
				$module =& JTable::getInstance( 'module');
				$module->title 		= $title;
				$module->position 	= 'left';
				$module->module 	= 'mod_mainmenu';
				$module->published	= 0;
				$module->iscore 	= 0;
				$module->params		= 'menutype='. $menuType->menutype;

				// check then store data in db
				if (!$module->check()) {
					return JError::raiseWarning( 500, $module->getError() );
				}
				if (!$module->store()) {
					return JError::raiseWarning( 500, $module->getError() );
				}
				$module->checkin();
				$module->reorder( 'position='.$db->Quote($module->position) );

				// module assigned to show on All pages by default
				// Clean up possible garbage first
				$query = 'DELETE FROM #__modules_menu WHERE moduleid = '.(int) $module->id;
				$db->setQuery( $query );
				if (!$db->query()) {
					return JError::raiseWarning( 500, $db->getError() );
				}

				// ToDO: Changed to become a Joomla! db-object
				$query = 'INSERT INTO #__modules_menu VALUES ( '.(int) $module->id.', 0 )';
				$db->setQuery( $query );
				if (!$db->query()) {
					return JError::raiseWarning( 500, $db->getError() );
				}
			}

			$msg = JText::sprintf( 'New Menu created', $menuType->menutype );
		}
		else if ($isChanged)
		{
			$oldTerm = $oldType->menutype;
			$newTerm = $menuType->menutype;

			// change menutype being of all mod_mainmenu modules calling old menutype
			$query = 'SELECT id'
			. ' FROM #__modules'
			. ' WHERE module = "mod_mainmenu"'
			. ' AND params LIKE "%menutype='.$db->getEscaped($oldTerm).'%"'
			;
			$db->setQuery( $query );
			$modules = $db->loadResultArray();

			foreach ($modules as $id)
			{
				$row =& JTable::getInstance('module');
				$row->load( $id );

				$row->params = str_replace( $oldTerm, $newTerm, $row->params );

				// check then store data in db
				if ( !$row->check() ) {
					return JError::raiseWarning( 500, $db->getError() );
				}
				if ( !$row->store() ) {
					return JError::raiseWarning( 500, $db->getError() );
				}
				$row->checkin();
			}

			// change menutype of all menuitems using old menutype
			$query = 'UPDATE #__menu'
			. ' SET menutype = '.$db->Quote($newTerm)
			. ' WHERE menutype = '.$db->Quote($oldTerm)
			;
			$db->setQuery( $query );
			$db->query();

			$msg = JText::_( 'Menu Items & Modules updated' );
		}

		$this->setRedirect( 'index.php?option=com_menus', $msg );
	}

	/**
	 * Controller for a view to confirm the deletion of a menu type
	 */
	function deleteMenu()
	{
		$view =& $this->getView( 'Menus' );
		$model	=& $this->getModel( 'Menutype' );
		$view->setModel( $model, true );
		$view->deleteForm();
	}

	/**
	 * Delete a menu
	 */
	function doDeleteMenu()
	{
		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$id = JRequest::getVar( 'id', 0, '', 'int' );
		if ($id <= 0) {
			JError::raiseWarning( 500, JText::_( 'Invalid ID provided' ) );
			$this->setRedirect( 'index.php?option=com_menus' );
			return false;
		}

		$model =& $this->getModel( 'Menutype' );
		if (!$model->canDelete()) {
			JError::raiseWarning( 500, $model->getError() );
			$this->setRedirect( 'index.php?option=com_menus' );
			return false;
		}
		$err = null;
		if (!$model->delete()) {
			 $err = $model->getError();
		}
		$this->setRedirect( 'index.php?option=com_menus', $err );
	}

	/**
	* Compiles a list of the articles you have selected to Copy
	*/
	function copyMenu()
	{
		$view =& $this->getView( 'Menus' );
		$model	=& $this->getModel( 'Menutype' );
		$view->setModel( $model, true );
		$view->copyForm();
	}

	/**
	* Copies a complete menu, all its items and creates a new module, using the name speified
	*/
	function doCopyMenu()
	{
		global $mainframe;

		// Check for request forgeries
		JRequest::checkToken() or jexit( 'Invalid Token' );

		$db				=& JFactory::getDBO();
		$type			= JRequest::getVar( 'type', '', 'post', 'string' );
		$menu_name		= JRequest::getVar( 'menu_name', 'New Menu', 'post', 'string' );
		$module_name	= JRequest::getVar( 'module_name', 'New Module', 'post', 'string' );

		// check for unique menutype for new menu copy
		$query = 'SELECT params' .
				' FROM #__modules' .
				' WHERE module = "mod_mainmenu"';
		$db->setQuery( $query );
		$menus = $db->loadResultArray();

		foreach ( $menus as $menu )
		{
			$params = new JParameter( $menu );
			if ( $params->get('menutype') == $menu_name ) {
				JError::raiseWarning( 500, JText::_( 'ERRORMENUNAMEEXISTS' ) );
				$this->setRedirect( 'index.php?option=com_menus' );
				return;
			}
		}

		// copy the menu items
		$mids 		= JRequest::getVar( 'mids', array(), 'post', 'array' );
		JArrayHelper::toInteger($mids);
		$total 		= count( $mids );
		$copy 		=& JTable::getInstance('menu');
		$original 	=& JTable::getInstance('menu');
		sort( $mids );
		$a_ids 		= array();

		foreach( $mids as $mid )
		{
			$original->load( $mid );
			$parent = $original->parent;
			$id = $original->id;
			$copy 			= $original;
			$copy->id 		= NULL;
			$copy->parent 	= $a_ids[$parent];
			$copy->menutype = $menu_name;
			$copy->home 	= 0;

			if ( !$copy->check() ) {
				JError::raiseWarning( 500, $copy->getError() );
				$this->setRedirect( 'index.php?option=com_menus' );
				return;
			}
			if ( !$copy->store() ) {
				JError::raiseWarning( 500, $copy->getError() );
				$this->setRedirect( 'index.php?option=com_menus' );
				return;
			}
			$a_ids[$id] = $copy->id;
		}

		// create the module copy
		$row =& JTable::getInstance('module');
		$row->load( 0 );
		$row->title 	= $module_name;
		$row->iscore 	= 0;
		$row->published = 1;
		$row->position 	= 'left';
		$row->module 	= 'mod_mainmenu';
		$row->params 	= 'menutype='. $menu_name;

		if (!$row->check()) {
			JError::raiseWarning( 500, $db->getError() );
			$this->setRedirect( 'index.php?option=com_menus' );
			return;
		}
		if (!$row->store()) {
			JError::raiseWarning( 500, $db->getError() );
			$this->setRedirect( 'index.php?option=com_menus' );
			return;
		}
		$row->checkin();
		$row->reorder( 'position='.$db->Quote($row->position) );
		// module assigned to show on All pages by default
		// ToDO: Changed to become a Joomla! db-object
		$query = 'INSERT INTO #__modules_menu' .
				' VALUES ( '.(int) $row->id.', 0 )';
		$db->setQuery( $query );
		if ( !$db->query() ) {
			JError::raiseWarning( 500, $db->getErrorMsg(true) );
			$this->setRedirect( 'index.php?option=com_menus' );
			return;
			//echo "<script> alert('".$db->getErrorMsg(true)."'); window.history.go(-1); </script>\n";
			//$mainframe->close();
		}

		// Insert the menu type
		$query = 'INSERT INTO `#__menu_types`  ( `menutype` , `title` , `description` ) ' .
				' VALUES ( '.$db->Quote($menu_name).', '.$db->Quote($menu_name).', "")';
		$db->setQuery( $query );
		if ( !$db->query() ) {
			JError::raiseWarning( 500, $db->getErrorMsg(true) );
			$this->setRedirect( 'index.php?option=com_menus' );
			return;
			//echo "<script> alert('".$db->getErrorMsg(true)."'); window.history.go(-1); </script>\n";
			//$mainframe->close();
		}

		$msg = JText::sprintf( 'Copy of Menu created', $type, $total );
		$mainframe->redirect( 'index.php?option=com_menus', $msg );
	}
}