/
com/planet_ink/coffee_mud/Abilities/Common/
com/planet_ink/coffee_mud/Abilities/Diseases/
com/planet_ink/coffee_mud/Abilities/Druid/
com/planet_ink/coffee_mud/Abilities/Fighter/
com/planet_ink/coffee_mud/Abilities/Languages/
com/planet_ink/coffee_mud/Abilities/Misc/
com/planet_ink/coffee_mud/Abilities/Prayers/
com/planet_ink/coffee_mud/Abilities/Properties/
com/planet_ink/coffee_mud/Abilities/Skills/
com/planet_ink/coffee_mud/Abilities/Songs/
com/planet_ink/coffee_mud/Abilities/Spells/
com/planet_ink/coffee_mud/Abilities/Thief/
com/planet_ink/coffee_mud/Abilities/Traps/
com/planet_ink/coffee_mud/Behaviors/
com/planet_ink/coffee_mud/CharClasses/interfaces/
com/planet_ink/coffee_mud/Commands/
com/planet_ink/coffee_mud/Commands/interfaces/
com/planet_ink/coffee_mud/Common/
com/planet_ink/coffee_mud/Common/interfaces/
com/planet_ink/coffee_mud/Exits/interfaces/
com/planet_ink/coffee_mud/Items/Armor/
com/planet_ink/coffee_mud/Items/Basic/
com/planet_ink/coffee_mud/Items/CompTech/
com/planet_ink/coffee_mud/Items/MiscMagic/
com/planet_ink/coffee_mud/Items/Weapons/
com/planet_ink/coffee_mud/Items/interfaces/
com/planet_ink/coffee_mud/Libraries/
com/planet_ink/coffee_mud/Libraries/interfaces/
com/planet_ink/coffee_mud/Locales/
com/planet_ink/coffee_mud/MOBS/
com/planet_ink/coffee_mud/Races/
com/planet_ink/coffee_mud/Races/interfaces/
com/planet_ink/coffee_mud/WebMacros/
com/planet_ink/coffee_mud/WebMacros/interfaces/
com/planet_ink/coffee_mud/core/
com/planet_ink/coffee_mud/core/collections/
com/planet_ink/coffee_mud/core/interfaces/
com/planet_ink/coffee_mud/core/intermud/
com/planet_ink/coffee_mud/core/intermud/i3/
com/planet_ink/coffee_web/server/
com/planet_ink/siplet/applet/
lib/
resources/factions/
resources/fakedb/
resources/progs/autoplayer/
resources/quests/holidays/
web/
web/admin.templates/
web/admin/grinder/
web/admin/images/
web/clan.templates/
web/pub.templates/
web/pub/images/mxp/
web/pub/sounds/
web/pub/textedit/
package com.planet_ink.coffee_mud.WebMacros.grinder;

import com.planet_ink.coffee_web.interfaces.*;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.*;

/*
   Copyright 2002-2016 Bo Zimmerman

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

	   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

public class GrinderAreas
{
	public static String getAreaList(Enumeration<Area> a, Area pickedA, MOB mob, boolean noInstances)
	{
		final StringBuffer AreaList=new StringBuffer("");
		final boolean anywhere=(CMSecurity.isAllowedAnywhere(mob,CMSecurity.SecFlag.CMDROOMS)||CMSecurity.isAllowedAnywhere(mob,CMSecurity.SecFlag.CMDAREAS));
		final boolean everywhere=(CMSecurity.isASysOp(mob)||CMSecurity.isAllowedEverywhere(mob,CMSecurity.SecFlag.CMDROOMS)||CMSecurity.isAllowedEverywhere(mob,CMSecurity.SecFlag.CMDAREAS));
		for(;a.hasMoreElements();)
		{
			final Area A=a.nextElement();
			if((everywhere||(A.amISubOp(mob.Name())&&anywhere))
			&&((!noInstances)||(!CMath.bset(A.flags(), Area.FLAG_INSTANCE_CHILD))))
			{
				if((pickedA!=null)&&(pickedA==A))
					AreaList.append("<OPTION SELECTED VALUE=\""+A.Name()+"\">"+A.name());
				else
					AreaList.append("<OPTION VALUE=\""+A.Name()+"\">"+A.name());
			}
		}
		return AreaList.toString();
	}

	public static String doBehavs(PhysicalAgent E, HTTPRequest httpReq, java.util.Map<String,String> parms)
	{
		E.delAllBehaviors();
		if(httpReq.isUrlParameter("BEHAV1"))
		{
			int num=1;
			String behav=httpReq.getUrlParameter("BEHAV"+num);
			String theparm=httpReq.getUrlParameter("BDATA"+num);
			while((behav!=null)&&(theparm!=null))
			{
				if(behav.length()>0)
				{
					final Behavior B=CMClass.getBehavior(behav);
					if(B==null)
						return "Unknown behavior '"+behav+"'.";
					B.setParms(theparm);
					E.addBehavior(B);
					B.startBehavior(E);
				}
				num++;
				behav=httpReq.getUrlParameter("BEHAV"+num);
				theparm=httpReq.getUrlParameter("BDATA"+num);
			}
		}
		return "";
	}

	public static String doAffects(Physical P, HTTPRequest httpReq, java.util.Map<String,String> parms)
	{
		P.delAllEffects(false);
		if(httpReq.isUrlParameter("AFFECT1"))
		{
			int num=1;
			String aff=httpReq.getUrlParameter("AFFECT"+num);
			String theparm=httpReq.getUrlParameter("ADATA"+num);
			while((aff!=null)&&(theparm!=null))
			{
				if(aff.length()>0)
				{
					final Ability B=CMClass.getAbility(aff);
					if(B==null)
						return "Unknown Effect '"+aff+"'.";
					B.setMiscText(theparm);
					P.addNonUninvokableEffect(B);
				}
				num++;
				aff=httpReq.getUrlParameter("AFFECT"+num);
				theparm=httpReq.getUrlParameter("ADATA"+num);
			}
		}
		return "";
	}

	public static String modifyArea(HTTPRequest httpReq, java.util.Map<String,String> parms)
	{
		final Vector<Area> areasNeedingUpdates=new Vector<Area>();
		final String last=httpReq.getUrlParameter("AREA");
		if((last==null)||(last.length()==0))
			return "Old area name not defined!";
		Area A=CMLib.map().getArea(last);
		if(A==null)
			return "Old Area not defined!";
		areasNeedingUpdates.addElement(A);

		boolean redoAllMyDamnRooms=false;
		Vector<Room> allMyDamnRooms=null;
		String oldName=null;

		// class!
		final String className=httpReq.getUrlParameter("CLASSES");
		if((className==null)||(className.length()==0))
			return "Please select a class type for this area.";
		if(!className.equalsIgnoreCase(CMClass.classID(A)))
		{
			allMyDamnRooms=new Vector<Room>();
			for(final Enumeration<Room> r=A.getProperMap();r.hasMoreElements();)
				allMyDamnRooms.addElement(r.nextElement());
			final Area oldA=A;
			A=CMClass.getAreaType(className);
			if(A==null)
				return "The class you chose does not exist.  Choose another.";
			CMLib.map().delArea(oldA);
			CMLib.map().addArea(A);
			A.setName(oldA.Name());
			redoAllMyDamnRooms=true;
			areasNeedingUpdates.remove(oldA);
			areasNeedingUpdates.addElement(A);
		}

		// name
		String name=httpReq.getUrlParameter("NAME");
		if((name==null)||(name.length()==0))
			return "Please enter a name for this area.";
		name=name.trim();
		if(!name.equals(A.Name().trim()))
		{
			if((CMLib.map().getArea(name)!=null)||(CMLib.map().getShip(name)!=null))
				return "The name you chose is already in use.  Please enter another.";
			allMyDamnRooms=new Vector<Room>();
			for(final Enumeration<Room> r=A.getCompleteMap();r.hasMoreElements();)
				allMyDamnRooms.addElement(r.nextElement());
			CMLib.map().delArea(A);
			oldName=A.Name();
			CMLib.database().DBDeleteArea(A);
			A=CMClass.getAreaType(A.ID());
			A.setName(name);
			CMLib.map().addArea(A);
			CMLib.database().DBCreateArea(A);
			redoAllMyDamnRooms=true;
			httpReq.addFakeUrlParameter("AREA",A.Name());
		}

		// climate
		if(httpReq.isUrlParameter("CLIMATE"))
		{
			int climate=CMath.s_int(httpReq.getUrlParameter("CLIMATE"));
			if(climate>=0)
			{
				for(int i=1;;i++)
					if(httpReq.isUrlParameter("CLIMATE"+(Integer.toString(i))))
					{
						final int newVal=CMath.s_int(httpReq.getUrlParameter("CLIMATE"+(Integer.toString(i))));
						if(newVal<0)
						{
							climate=-1;
							break;
						}
						climate=climate|newVal;
					}
					else
						break;
			}
			A.setClimateType(climate);
		}
		else
			A.setClimateType(-1);

		// atmosphere
		if(httpReq.isUrlParameter("ATMOSPHERE"))
			A.setAtmosphere(CMath.s_int(httpReq.getUrlParameter("ATMOSPHERE")));

		// tech level
		if(httpReq.isUrlParameter("THEME"))
			A.setTheme(CMath.s_int(httpReq.getUrlParameter("THEME")));

		// modify subop list
		for(final Enumeration<String> s=A.subOps();s.hasMoreElements();)
			A.delSubOp(s.nextElement());
		for(int i=1;;i++)
			if(httpReq.isUrlParameter("SUBOP"+(Integer.toString(i))))
				A.addSubOp(httpReq.getUrlParameter("SUBOP"+(Integer.toString(i))));
			else
				break;

		int num=1;
		if(httpReq.isUrlParameter("BLURBFLAG1"))
		{
			final Vector<String> prics=new Vector<String>();
			String DOUBLE=httpReq.getUrlParameter("BLURBFLAG"+num);
			String MASK=httpReq.getUrlParameter("BLURB"+num);
			while((DOUBLE!=null)&&(MASK!=null))
			{
				if(DOUBLE.trim().length()>0)
					prics.addElement((DOUBLE.toUpperCase().trim()+" "+MASK).trim());
				num++;
				DOUBLE=httpReq.getUrlParameter("BLURBFLAG"+num);
				MASK=httpReq.getUrlParameter("BLURB"+num);
			}
			for(final Enumeration<String> f=A.areaBlurbFlags();f.hasMoreElements();)
				A.delBlurbFlag(f.nextElement());
			for(int v=0;v<prics.size();v++)
				A.addBlurbFlag(prics.elementAt(v));
		}
		// description
		String desc=httpReq.getUrlParameter("DESCRIPTION");
		if(desc==null)
			desc="";
		A.setDescription(CMLib.coffeeFilter().safetyFilter(desc));

		// image
		String img=httpReq.getUrlParameter("IMAGE");
		if(img==null)
			img="";
		A.setImage(CMLib.coffeeFilter().safetyFilter(img));

		// gridy
		final String gridy=httpReq.getUrlParameter("GRIDY");
		if((gridy!=null)&&(A instanceof GridZones))
			((GridZones)A).setYGridSize(CMath.s_int(gridy));
		// gridx
		final String gridx=httpReq.getUrlParameter("GRIDX");
		if((gridx!=null)&&(A instanceof GridZones))
			((GridZones)A).setXGridSize(CMath.s_int(gridx));

		// author
		String author=httpReq.getUrlParameter("AUTHOR");
		if(author==null)
			author="";
		A.setAuthorID(CMLib.coffeeFilter().safetyFilter(author));

		// currency
		String currency=httpReq.getUrlParameter("CURRENCY");
		if(currency==null)
			currency="";
		A.setCurrency(CMLib.coffeeFilter().safetyFilter(currency));

		// SHOPPREJ
		String SHOPPREJ=httpReq.getUrlParameter("SHOPPREJ");
		if(SHOPPREJ==null)
			SHOPPREJ="";
		A.setPrejudiceFactors(CMLib.coffeeFilter().safetyFilter(SHOPPREJ));

		// BUDGET
		String BUDGET=httpReq.getUrlParameter("BUDGET");
		if(BUDGET==null)
			BUDGET="";
		A.setBudget(CMLib.coffeeFilter().safetyFilter(BUDGET));

		// DEVALRATE
		String DEVALRATE=httpReq.getUrlParameter("DEVALRATE");
		if(DEVALRATE==null)
			DEVALRATE="";
		A.setDevalueRate(CMLib.coffeeFilter().safetyFilter(DEVALRATE));

		// INVRESETRATE
		String INVRESETRATE=httpReq.getUrlParameter("INVRESETRATE");
		if(INVRESETRATE==null)
			INVRESETRATE="0";
		A.setInvResetRate(CMath.s_int(CMLib.coffeeFilter().safetyFilter(INVRESETRATE)));

		// IGNOREMASK
		String IGNOREMASK=httpReq.getUrlParameter("IGNOREMASK");
		if(IGNOREMASK==null)
			IGNOREMASK="";
		A.setIgnoreMask(CMLib.coffeeFilter().safetyFilter(IGNOREMASK));


		if(A instanceof AutoGenArea)
		{
			String AGXMLPATH=httpReq.getUrlParameter("AGXMLPATH");
			if(AGXMLPATH==null)
				AGXMLPATH="";
			((AutoGenArea) A).setGeneratorXmlPath(CMLib.coffeeFilter().safetyFilter(AGXMLPATH));

			String AGAUTOVAR=httpReq.getUrlParameter("AGAUTOVAR");
			if(AGAUTOVAR==null)
				AGAUTOVAR="";
			((AutoGenArea) A).setAutoGenVariables(CMLib.coffeeFilter().safetyFilter(AGAUTOVAR));
		}

		// PRICEFACTORS
		num=1;
		if(httpReq.isUrlParameter("IPRIC1"))
		{
			final Vector<String> prics=new Vector<String>();
			String DOUBLE=httpReq.getUrlParameter("IPRIC"+num);
			String MASK=httpReq.getUrlParameter("IPRICM"+num);
			while((DOUBLE!=null)&&(MASK!=null))
			{

				if(CMath.isNumber(DOUBLE))
					prics.addElement((DOUBLE+" "+MASK).trim());
				num++;
				DOUBLE=httpReq.getUrlParameter("IPRIC"+num);
				MASK=httpReq.getUrlParameter("IPRICM"+num);
			}
			((Economics)A).setItemPricingAdjustments(CMParms.toStringArray(prics));
		}

		// modify Parent Area list
		while(A.getParents().hasMoreElements())
			A.removeParent(A.getParents().nextElement());
		for(int i=1;;i++)
			if(httpReq.isUrlParameter("PARENT"+(Integer.toString(i))))
			{
				final Area parent=CMLib.map().getArea(httpReq.getUrlParameter("PARENT"+(Integer.toString(i))));
				if(parent!=null)
				{
					if(A.canParent(parent))
					{
						A.addParent(parent);
						parent.addChild(A);
						areasNeedingUpdates.addElement(parent);
					}
					else
						return "The area, '"+parent.Name()+"', cannot be added as a parent, as this would create a circular reference.";
				}
			}
			else
				break;

		// modify Child Area list
		while(A.getChildren().hasMoreElements())
			A.removeChild(A.getChildren().nextElement());
		for(int i=1;;i++)
		  if(httpReq.isUrlParameter("CHILDREN"+(Integer.toString(i))))
		  {
			  final Area child=CMLib.map().getArea(httpReq.getUrlParameter("CHILDREN"+(Integer.toString(i))));
			  if(child!=null)
			  {
				  if(A.canChild(child))
				  {
					  A.addChild(child);
					  child.addParent(A);
					  areasNeedingUpdates.addElement(child);
				  }
				  else
					  return "The area, '"+child.Name()+"', cannot be added as a child, as this would create a circular reference.";
			  }
			  else
				  break;
		}

		String error=GrinderAreas.doAffects(A,httpReq,parms);
		if(error.length()>0)
			return error;
		error=GrinderAreas.doBehavs(A,httpReq,parms);
		if(error.length()>0)
			return error;

		if((redoAllMyDamnRooms)&&(allMyDamnRooms!=null))
			CMLib.map().renameRooms(A,oldName,allMyDamnRooms);

		for(int i=0;i<areasNeedingUpdates.size();i++) // will always include A
		{
			final Area A2=areasNeedingUpdates.elementAt(i);
			if(CMLib.flags().isSavable(A2))
			{
				CMLib.database().DBUpdateArea(A2.Name(),A2);
				CMLib.coffeeMaker().addAutoPropsToAreaIfNecessary(A2);
			}
		}
		return "";
	}
}