
	 /*#################################################################
	 #
	 # 	JS FACTORY
	 #
	 ##################################################################*/
	
		var js_factoryProt = js_factory.prototype;
			
		function js_factory()
		{	
		this.uniqueIndex = 0;	
		this.collection_index = 0;
		this.collection_objects = new Array();
		this.topZIndex = 0;		
		this.defaultWindow = null;
		this.currentWindow = null;
		this.tempFocus = null; //focus on dom
		this.mapToKeyActionDisabled = false;
		this.mapToKeyActionAllowedDuringDisabled = new Array();
		this.currentKeyPressed = null;
		
		//For link drag
		this.linkDragActivated = false;
		this.linkDropActivated = false;
		this.windowHandlerDefaultCatcherTempDisabled = false;
		this.catchLinkPositions = false;
		this.catchedLinkPositionTop = null;
		this.catchedLinkPositionLeft = null;
		this.mouseTempX = null;
		this.mouseTempY = null;
		this.evaluationPattern_reg_0_100 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{0,100}$/);				
		this.evaluationPattern_reg_1_100 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{1,100}$/);						
		this.evaluationPattern_reg_0_200 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{0,200}$/);		
		this.evaluationPattern_reg_1_200 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{1,200}$/);
		this.evaluationPattern_reg_0_300 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{0,300}$/);		
		this.evaluationPattern_reg_1_300 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{1,300}$/);
		this.evaluationPattern_reg_1_500 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{1,500}$/);
		this.evaluationPattern_reg_1_3000 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{1,3000}$/);
		this.evaluationPattern_reg_0_3000 = new RegExp(/^[a-ö|A-Ö| |0-9|+|%|/|(|)|@|,|.|!|?|:|\-|_|\r\n|\n]{0,3000}$/);
		}


	 /*#################################################################
	 # REGISTERS OBJECT IN FACTORY
	 ##################################################################*/
			
		js_factoryProt.register = function(obj)
		{
			//To create unique indexes if same timestamp occurs
			this.collection_index++;			
			
			//Adds object into collection_objects
			this.collection_objects.push(obj);
		
			//Creates unique index and returns to creating object	
			obj.id = g_main.getTimeStamp() + "_" + this.collection_index;	
			
			this.currentWindow = obj;
						
			//Prints all objects in factory
//			this.printRegistredObjectsToDiv();
			
		}
		
		
	 /*#################################################################
	 # UNREGISTERS AND REMOVES OBJECT FROM FACTORY
	 ##################################################################*/
	 		
		js_factoryProt.unRegister = function(obj)
		{
		
			var loopkill = false;
			
			for(var i in this.collection_objects)
			{
				if(obj == this.collection_objects[i])
				{				
				//alert('hittat object f�r unregister');
				//obj.id = null;
				loopkill = true;
				this.collection_objects.splice(i,1);
				break;
				}
			}
			
			if(loopkill == true)
			{
				for(var b in obj)
				{
					var o = obj[b];
					o = null;
				}
			}
		}
		
	 /*#################################################################
	 # UNREGISTERS AND REMOVES OBJECT FROM FACTORY
	 # ON ID
	 ##################################################################*/
	 		
		js_factoryProt.unRegisterOnId = function(id)
		{
			var obj = this.getObject(id);
			if(obj)
			{
			this.unRegister(obj);
			}
		}		
		
	 /*#################################################################
	 # GENERATES UNIQUE ID
	 ##################################################################*/
			
		js_factoryProt.generateUniqueDomId = function()
		{			
			
			//Creates unique dom id index 	
			return g_main.getTimeStamp() + "_" + this.uniqueIndex++;
			
		}		

		
	 /*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON ID
	 ##################################################################*/
			
		js_factoryProt.getObject = function(id)
		{	
			var collection = this.collection_objects;	
			
			for(var i in collection)
			{
				if(id == collection[i].id)
				{
				return collection[i];
				break;
				}
			}
			
			return null;			
		}

	 /*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON TYPE AND VIEW TYPE
	 ##################################################################*/
			
		js_factoryProt.getObjectOnTypeAndViewType = function(type, viewType)
		{	
			var collection = this.getRegistredCollection(type);	

			for(var i in collection)
			{
				if(viewType == collection[i].viewType)
				{
				return collection[i];
				break;
				}
			}
			
			return null;			
		}
				
	 /*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON TYPE AND NAME
	 ##################################################################*/
			
		js_factoryProt.getObjectOnTypeAndName = function(type, name)
		{	
			var collection = this.getRegistredCollection(type);	

			for(var i in collection)
			{
				if(name == collection[i].name)
				{
				return collection[i];
				}
			}
			
			return null;			
		}
		
	 /*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON TYPE AND NAME
	 ##################################################################*/
			
		js_factoryProt.getObjectOnTypeAndSecondName = function(type, name)
		{	
			var collection = this.getRegistredCollection(type);	

			for(var i in collection)
			{
				if(name == collection[i].secondName)
				{
				return collection[i];
				break;
				}
			}
			
			return null;			
		}
		
	/*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON NAME
	 ##################################################################*/
			
		js_factoryProt.getObjectOnNameOnly = function(name)
		{	

			var collection = this.collection_objects;
			
			for(var i in collection)
			{
				var curr = collection[i];
				if(curr.name == name)
				{
				return curr;
				}
			}
			
			return null;			
		}
		
	 /*#################################################################
	 # RETURNS COLLECTION OF OBJECTS FROM OBJECT COLLECTION ON TYPE AND NAME
	 ##################################################################*/
			
		js_factoryProt.getCollectionOnTypeAndName = function(type, name)
		{	
			var collection = this.getRegistredCollection(type);	
			var coll = [];

			for(var i in collection)
			{
				if(name == collection[i].name)
				{
				coll.push(collection[i]);
				}
			}
			
			return coll;			
		}		
		
	/*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON TYPE AND VARIABLE
	 ##################################################################*/
			
		js_factoryProt.getObjectOnTypeAndVariableValuePairs = function(type, valuePairs)
		{	

			var collection = this.getRegistredCollection(type);	
			var ret = new Array();

			for(var i in collection)
			{
			var addToList = false;
			var t = collection[i];			

				for(b = 0; b < valuePairs.length; b = b + 2)
				{								
				var object = eval("t." + valuePairs[b]);

					if(valuePairs[b+1] == object)
					{
					addToList = true;
					}
					else
					{
					addToList = false;
					break;
					}
				}
				
				if(addToList == true)
				{
				ret.push(t);
				}
				
			}
			
			if(ret.length == 0)
			{
			return null;
			}
			else
			{
			return ret;
			}
			

		}
		
		
	 /*#################################################################
	 # RETURNS OBJECT FROM OBJECT COLLECTION ON TYPE AND NAME
	 ##################################################################*/
			
		js_factoryProt.getObjectOnWindowContentsAreaDomId = function(domContentAreaId)
		{	
			var collection = this.getRegistredCollection('js_window');	

			for(var i in collection)
			{
				if(domContentAreaId == collection[i].domContentAreaId)
				{
				return collection[i];
				break;
				}
			}
			
			return null;			
		}				
		
	 /*#################################################################
	 # REMOVES OBJECT FROM COLLECTION ON ID
	 ##################################################################*/
			
		js_factoryProt.killObject = function(id)
		{	
			var collection = this.collection_objects;	
			
			for(var i in collection)
			{
				if(id == collection[i].id)
				{
				collection[i].id = null;
				collection.splice(i,1);
				return null;
				}
			}
			
						
		}		

	 /*#################################################################
	 # EXECUTES FUNCTION ON OBJECT FROM OBJECT COLLECTION ON ID
	 ##################################################################*/
			
		js_factoryProt.getObjectExecFunc = function(id,functionName,args)
		{
			var object = this.getObject(id)
			/*
			if(object)
			{
				if(g_main.valueExists(args))
				{
				return eval("object." + action + "('" + args + "')");
				}
				else
				{
				return eval("object." + action + "()");
				}
			}
			*/

			var result = null;

			if(object)
			{
				if(!g_main.valueExists(args))
				{
				result = eval("object." + functionName + "()");
				}
				else
				{
			
					if(typeof args == "object")
					{					
					result = eval("object." + functionName + "('" + args + "')");
					}
					else if(typeof args == "string")
					{					
					result = eval("object." + functionName + "('" + args + "')");
					}								
					else
					{
					result = eval("object." + functionName + "(" + args + ")");
					}
				}
			}
			
			return result;
			
		}
		
	 /*#################################################################
	 # EXECUTES FUNCTION ON OBJECT FROM OBJECT COLLECTION ON NAME
	 ##################################################################*/
			
		js_factoryProt.getObjectOnName = function(type, name)
		{

			var collection = this.getRegistredCollection(type);
			
			for(var i in collection)
			{
				if(g_main.isDefined(collection[i].name))
				{
					if(collection[i].name == name)
					{
					return collection[i];
					}
				}
			}
			
		}	
		
	 /*#################################################################
	 # EXECUTES FUNCTION ON OBJECT FROM OBJECT COLLECTION ON NAME
	 ##################################################################*/
			
		js_factoryProt.collectGarbage = function()
		{

			//var summary = [];
			var objectsToCollect = [];
			
			for(var i in this.collection_objects)
			{
				curr = this.collection_objects[i];
				
				if(g_main.isDefinedNOF(curr.garbageCollectingId))
				{
					if(g_main.isDefinedNOF(curr.garbageCollectingOverRideId))
					{
						if(!g_main.domExists(curr.garbageCollectingOverRideId) && curr.garbageCollectProtected != true)
						{
						objectsToCollect.push(curr);							
						}
					}
					else if(!g_main.domExists(curr.garbageCollectingId) && curr.garbageCollectProtected != true)
					{
					objectsToCollect.push(curr);							
					}
				}
				
				if(curr.type == 'js_form')
				{
					//alert(curr.components.length)
					for(var m in curr.components)
					{
					
						var _curr = curr.components[m];
						var conn = _curr.connectedComponent;
						if(g_main.isDefinedNOF(conn))
						{
							if(g_main.isDefinedNOF(conn.garbageCollectingId))
							{
								if(g_main.isDefinedNOF(conn.garbageCollectingOverRideId))
								{
									if(!g_main.domExists(conn.garbageCollectingOverRideId) && conn.garbageCollectProtected != true)
									{
									objectsToCollect.push(conn);							
									break;
									}
								
								}
								else if(!g_main.domExists(conn.garbageCollectingId) && conn.garbageCollectProtected != true)
								{
								objectsToCollect.push(curr);							
								break;
								}
							}
						}
					}
				}
				
				/*if(g_main.isDefined(summary[curr.type]))
				{
					summary[curr.type] = summary[curr.type]+1;
				}
				else
				{
					summary[curr.type] = 1;
				}
				*/
				
			}
			
		/*	var sb1 = new js_stringBuffer();
			for(var s in summary)
			{
			sb1.append(s + "//" + summary[s] + "<br />");	
			}*/
			
			//var sb = new js_stringBuffer();
			for(var b in objectsToCollect)
			{
			var item = objectsToCollect[b];
			//sb.append(item.type + '//' + item.name + '<br />');
			
				if(g_main.isDefinedNOF(item.garbageCollectingId))
				{
				g_main.killDom(item.garbageCollectingId);
				}
			
				for(var r in item)
				{
					var it = item[r];
					it = null;
				}
			
			this.unRegister(item);
			}

			//g_main.printToInnerHTML('testning',"Summering: <br />" + sb1.toString() + "<br />Antal totalt: " + this.collection_objects.length + "<br /><br />Antal att ta bort: " + objectsToCollect.length + '<br />' + sb.toString());
			
		}		
		
	/*#################################################################
	 # EXECUTES FUNCTION ON OBJECT FROM OBJECT COLLECTION ON NAME
	 ##################################################################*/
			
		js_factoryProt.getObjectOnNameExecFunc = function(type, name, functionName,args)
		{

			var object = this.getObjectOnTypeAndName(type,name);
		
			/*
			if(object)
			{
				if(g_main.valueExists(args))
				{
				return eval("object." + action + "('" + args + "')");
				}
				else
				{
				return eval("object." + action + "()");
				}
			}
			*/

			var result = null;

			if(object)
			{

				if(!g_main.valueExists(args))
				{
				result = eval("object." + functionName + "()");
				}
				else
				{
			
					if(typeof args == "object")
					{					
					result = eval("object." + functionName + "('" + args + "')");
					}
					else if(typeof args == "string")
					{					
					result = eval("object." + functionName + "('" + args + "')");
					}								
					else
					{
					result = eval("object." + functionName + "(" + args + ")");
					}
				}
			}
			
			return result;
			
		}		
		
	 /*#################################################################
	 # EXECUTES FUNCTION ON OBJECT FROM OBJECT COLLECTION ON ID
	 ##################################################################*/
			
		js_factoryProt.getObjectSetVar = function(id,varName,value)
		{
			var object = this.getObject(id)
			if(object)
			{
				if(typeof value == 'string')
				{
				eval("object." + varName + " = '" + value + "'");
				}
				else
				{
				eval("object." + varName + " = " + value);
				}
			}
		}		

	 /*#################################################################
	 # SETS CURRENT WINDOW PROPERTY
	 ##################################################################*/
			
		js_factoryProt.setCurrentWindow = function(obj)
		{
			this.currentWindow = obj;
		}

	 /*#################################################################
	 # RETURNS A COLLECTION OF ALL REGISTRED OBJECTS OF CERTAIN TYPE
	 ##################################################################*/
			
		js_factoryProt.getRegistredCollection = function(type)
		{			
			var collection = this.collection_objects;
			var temp = new Array();
			
			for(var i in collection)
			{
				if(collection[i].type == type)
				{
				temp.push(collection[i]);
				}
			}
			
			return temp;
		}

 	 /*#################################################################
	 # KILLS ALL OF A TYPE
	 ##################################################################*/
			
		js_factoryProt.killAllOfAType = function(type,killDom)
		{			

			var collection = g_fac.getRegistredCollection(type)
			var curr = null;
			for(var i in collection)
			{
				curr = collection[i];

					if(killDom == true)
					{

						var prohibited = g_main.isDefinedNOF(curr.closeProhibited);

						if(prohibited == false)
						{
						//alert('ska ta bort' + curr.domToBeRemovedOnObjectKill)
//						alert('före ska ta bort' + curr.domToBeRemovedOnObjectKill);
							g_main.killDom(curr.domToBeRemovedOnObjectKill);		
							
							/*if(!g_main.isDefinedNOF(curr.domToBeRemovedOnObjectKill.killObjOnDomKill))
							{
								for(var b in curr)
								{
									b = null;
								}
								
							//	var o = collection[i];
							//	o = null;
							}*/
//alert('efter kis');
						g_fac.killObject(curr.id);
						g_fac.killAllOfAType(type,killDom);
						}				
					}
				
			}
		}
		
 	 /*#################################################################
	 # KILLS ALL OF A TYPE
	 ##################################################################*/
			
		js_factoryProt.killAllOfATypeOnNoDomReference = function(type)
		{			
			var collection = this.collection_objects;
			var temp = new Array();

			var currObj = null;
			for(var i in collection)
			{
				if(collection[i].type == type)
				{		
				
					currObj = collection[i];
					for(var b in currObj)
					{
					currObj[b] = null;
					}
				
				collection[i].id = null;
				collection.splice(i,1);
				}
			}

		}		
		
	 /*#################################################################
	 # KILLS ALL OF A TYPE
	 ##################################################################*/
			
		js_factoryProt.killAllDomOfAType = function(type,killDom)
		{			

			var collection = this.collection_objects;
			var temp = new Array();
			
			for(var i in collection)
			{
				if(collection[i].type == type)
				{		
					if(killDom == true)
					{
					g_main.killDom(collection[i].domToBeRemovedOnObjectKill);		
					
						if(collection[i].fader)
						{
						collection[i].fader.opacity = 0;
						}
					}
				}
			}
		}		
		
								
	 /*#################################################################
	 # KILLS ALL OF A TYPE
	 ##################################################################*/
			
		js_factoryProt.cleanOnWindowScroll = function(type,killDom)
		{			

				
				var coll = g_fac.getRegistredCollection('js_menuFloat');
				for(var i in coll)
				{
					coll[i].killAllWindowMenus();
				}
				
				var coll = g_fac.getRegistredCollection('js_smartselect');
				for(var i in coll)
				{
					coll[i].killPresentItemList();
				}
				
				var coll = g_fac.getRegistredCollection('js_select');
				for(var i in coll)
				{
					coll[i].killPresentItemList();
				}

				var coll = g_fac.getRegistredCollection('js_right_click_link');

				for(var i in coll)
				{
					coll[i].killPresenter();					
				}
				
				var coll = g_fac.getRegistredCollection('js_tempPresenter');
				for(var i in coll)
				{
					coll[i].close();					
				}
				//g_fac.killAllOfAType('js_right_click_link',true)

		}											
		
	 /*#################################################################
	 # PRINTS REGISTERED OBJECTS TO DIV
	 ##################################################################*/
			
		js_factoryProt.printRegistredObjectsToDiv = function()
		{

			//INSTANTIATION
			var body = document.body;
			var toPrintToId = 'fac_printer';
			var toPrintTo = g_main.domExists(toPrintToId)
			var toPrint = "";
			var collection = this.collection_objects;
			
			//CONCATENATION
			for(var i in collection)
			{
			toPrint += collection[i].type + " - " + collection[i].id + "<br />";		
			}
			
			//PRINTING	
			if(!toPrintTo)
			{		
			toPrintTo = document.createElement("DIV");
			toPrintTo.id = toPrintToId;
			g_main.domObjProps(toPrintTo,'absolute',800,100,300,0);
			body.appendChild(toPrintTo);			
			}
						
			toPrintTo.innerHTML = toPrint;
			
		}	
				
		js_factoryProt.setCurrentKeyPressed = function(e)
		{	

			g_fac.currentKeyPressed = eval(g_bsp.browsersKeyCode);		
//alert(g_fac.currentKeyPressed)
			if(g_fac.mapToKeyActionDisabled == false || g_fac.keyAllowed() == true)
			{
			g_fac.mapToKeyAction(eval(g_bsp.browsersEvent).shiftKey, eval(g_bsp.browsersEvent).altKey);			
			}
		}
		
				
		js_factoryProt.setMapToKeyActionDisabled = function(arr)
		{	
			g_fac.mapToKeyActionDisabled = true;
			
			for(var i in arr)
			{
			g_fac.mapToKeyActionAllowedDuringDisabled.push(arr[i]);
			}
		}

		js_factoryProt.keyAllowed = function()
		{	
			for(var i in g_fac.mapToKeyActionAllowedDuringDisabled)
			{
				if(g_fac.mapToKeyActionAllowedDuringDisabled[i] == g_fac.currentKeyPressed)
				{
				return true;
				}
			}
			
			return false;

		}		
		
		
		js_factoryProt.setMapToKeyActionEnabled = function()
		{	
			g_fac.mapToKeyActionDisabled = false;
			g_fac.mapToKeyActionAllowedDuringDisabled = new Array();
			
		}
		
		js_factoryProt.catchKeyActionObject = function(keyCode)
		{	

			var arr = g_fac.getRegistredCollection('js_keyAction');
			for(var i in arr)	
			{
				var curr = arr[i];
				if(curr.key == keyCode)
				{
				return curr;
				break;
				}
			}	
		}	
		
		js_factoryProt.mapToKeyAction = function(shift, alt)
		{
			var arr = g_fac.getRegistredCollection('js_keyAction');
			for(var i in arr)	
			{
				var curr = arr[i];
				if(curr.key == g_fac.currentKeyPressed && curr.demandsShift == shift && curr.demandsAlt == alt && curr.isSleeping == false)
				{
				eval(curr.action);
				curr.restore();
				break;
				}
			}
		}
		
		js_factoryProt.clearCurrentKeyPressed = function(e)
		{		
			g_fac.currentKeyPressed = null;
		}	
		
		//LINK DRAG/DROP
		js_factoryProt.activateLinkDrag = function()
		{	
			this.linkDragActivated = true;
		}
		
		js_factoryProt.activateLinkDrop = function()
		{	
			if(this.linkDragActivated == true)
			{
			this.linkDropActivated = true;
			}
		}

		js_factoryProt.getMouseEventCoordinates = function(e, link)
		{	
		
			if(this.linkDragActivated == true && this.linkDropActivated == true)
			{
			var ret = g_main.getMouseEventCoordinates(e);
			this.catchLinkPositions = true;
			this.catchedLinkPositionTop = ret[1];
			this.catchedLinkPositionLeft = ret[0];
			eval(link.href);
			}
			
			this.restoreLinkDragDrop();

		}		

		js_factoryProt.restoreLinkDragDrop = function()
		{	
			this.linkDragActivated = false;
			this.linkDropActivated = false;
		}
		
		js_factoryProt.restoreCatchedLinkPositions = function()
		{	
			this.catchLinkPositions = false;
			this.catchedLinkPositionTop = null;
			this.catchedLinkPositionLeft = null;
		}
		

		js_factoryProt.activateSetMouseCoordinates = function()
		{
			try
			{
			eval(g_bsp.capEv).onmousemove = this.setMouseCoordinates;		
			}
			catch(err)
			{
			}
		}
		
		js_factoryProt.deActivateSetMouseCoordinates = function()
		{
			eval(g_bsp.capEv).onmousemove = new Function();
		}		
				
		js_factoryProt.setMouseCoordinates = function(e)
		{

			  if(g_bsp.userAgent == 'IE') 
			  {
			    tempX = event.clientX + g_bsp.getClientDimension_scrollLeft();
			    tempY = event.clientY + g_bsp.getClientDimension_scrollTop();
			  } 
			  else 
			  {
			    tempX = e.pageX
			    tempY = e.pageY
			  }  
		
			  if(tempX < 0)
			  {
			  tempX = 0
			  }
			  
			  if(tempY < 0)
			  {
			  tempY = 0
			  }  
			  
			  g_fac.mouseTempY = tempY;
			  g_fac.mouseTempX = tempX;

		}

		
