function myHtmlDinamicContent(op,name,p1,p2,p3,p4) {

/*
author ::

iim.vxk @t gmail.com

usage ::

helps to rotate content of some elements-group in many ways.

params ::

op			- string	- ...
name		- string	- name of the group of elements / content.
p1,p2,p3,p4	- mixed	- depends of "op" parameter.

features ::

cross-browser [ opera 9.02+, firefox 1.5.0.7+ and IE6 ]

operations, usage sample ::

	step1	- "insert_data_set"

	step2	- "start_automatic_change" { but also "continue_automatic_change" works }

	step3	- "pause_automatic_change"
			- "continue_automatic_change"

	OR 

	step4	- "stop_automatic_change"

	{ repeat from step2 }

	stepX	- "delete_data_set"

operations, usage sample [2] ::

	step1	- "insert_data_set"

	step2	- "switch_to"

	step3	- "delete_data_set"

operations, usage sample note ::

check function operations for params / returned-value info

practical sample usage ::

preparing data...

var elements=[], properties=[], content=[];

elements[0]=document.getElementById('span_element');
elements[1]=document.getElementById('link_element');

properties[0]='title';
properties[1]=['href','innerHTML','title'];

content[0]=[ 'title-a',['http://site-w.net','site-w.net','should-go!'] ];
content[1]=[ 'title-b',['http://site-x.net','site-x.net','definetively should-go!'] ];
content[2]=[ 'title-c',['http://site-z.net','site-z.net','why not should-go?'] ];

sample usage # 1 ::

myHtmlDinamicContent('insert_data_set','dinamic_info',elements,properties,content);
myHtmlDinamicContent('switch_to','dinamic_info',1);

results on...

span_element.title='title-b'
link_element.href='http://site-x.net'
link_element.innerHTML='site-x.net'
link_element.title='definetively should-go!'

sample usage # 2 ::

myHtmlDinamicContent('insert_data_set','dinamic_info',elements,properties,content,["forward",4000,null,-1,true,null]);
myHtmlDinamicContent('start_automatic_change','dinamic_info');

results on...

...you know, something similar but automatic

*/

	// initializiting function vars...

	if(typeof(myHtmlDinamicContentVars)!='object') {

		myHtmlDinamicContentVars=new Object();
		myHtmlDinamicContentVars.dataSets=[];

	}

	// basic xeck

	if(!op || !name)
	 return false;

	// ...

	if(op=='insert_data_set') {

		// usage ::
		//
		// declare data_set for future use.
		//
		// p1	- array	- 	data_set.elementsRef		- elements references
		// p2	- array	- 	data_set.elementsProperties	- elements properties
		// p3	- array	-	data_set.elementsContent		- elements content, each array-element should have the content of the properties, content can be of any type, including a callback function that return a value.
		// p4	- array	-							- optional, related info with the automatic-change feature { any of this are optional, a default value exists }
		//				- first element		- string		- data_set.auchDirection			- direction change, "forward" or "backward".
		//				- second element	- number		- data_set.auchDelay				- miliseconds delay between content change
		//				- third element		- callback		- data_set.auchCallbackFunction		- callback function between content change
		//				- fourth element	- number		- data_set.auchLoopsLeft			- loops need, use -1 for an infinite loop
		//				- fifth element		- bool		- data_set.auchLoopsLeftRewindAtZero			- rewind [ switch to relative-start content ] when all loops need done?
		//				- sixth element		- callback		- data_set.auchLoopsLeftCallbackFunctionAtZero	- callback function when all loops need done

		if(typeof(p1)!='object' || typeof(p2)!='object' || typeof(p3)!='object' || (p4 && typeof(p4)!="object"))
		 return false;

		myHtmlDinamicContentVars.dataSets[name]=new Object();
		myHtmlDinamicContentVars.dataSets[name].elementsRef=p1;
		myHtmlDinamicContentVars.dataSets[name].elementsProperties=p2;
		myHtmlDinamicContentVars.dataSets[name].elementsContent=p3;
		myHtmlDinamicContentVars.dataSets[name].elementsContentIndex=-1;
		/* auch = automatic_change */
		myHtmlDinamicContentVars.dataSets[name].auchIntervalId=null;
		myHtmlDinamicContentVars.dataSets[name].auchIntervalOps=function(op) {

			if(op==="set") {

				if(!this.elementsContent.length || (this.auchIntervalId!==null && !this.auchIntervalOps("unset")))
				 return false;

				this.auchIntervalId=eval(" setInterval(function() { myHtmlDinamicContent('switch_to','"+name+"','"+this.auchDirection+"'); },"+this.auchDelay+"); ");

				return true;

			}
			else if(op==="unset") {

				if(this.auchIntervalId===null)
				 return false;

				clearInterval(this.auchIntervalId);

				this.auchIntervalId=null;

				return true;

			}

		};
		myHtmlDinamicContentVars.dataSets[name].auchDirection=p4 ? p4[0] : "forward" ;
		myHtmlDinamicContentVars.dataSets[name].auchDelay=p4 ? p4[1] : 3000 ;
		myHtmlDinamicContentVars.dataSets[name].auchCallbackFunction=p4 ? p4[2] : null ;
		myHtmlDinamicContentVars.dataSets[name].auchLoopsLeft=p4 ? p4[3] : -1 ;
		myHtmlDinamicContentVars.dataSets[name].auchLoopsLeftDefault=p4 ? p4[3] : -1 ;
		myHtmlDinamicContentVars.dataSets[name].auchLoopsLeftRewindAtZero=p4 ? p4[4] : true ;
		myHtmlDinamicContentVars.dataSets[name].auchLoopsLeftCallbackFunctionAtZero=p4 ? p4[5] : null ;

		return true;

	}

	// NOTE :: in JS, when we try copy array object [ like ' x=y; ' ], really an reference of ' y ' is passed to ' x '.
	var data_set=myHtmlDinamicContentVars.dataSets[name];

	if(typeof(data_set)!='object')
	 return false;

	if(op=='delete_data_set') {

		// usage ::
		//
		// delete related data_set, additionally this kill the related automatic-change interval process [ if exist ].
		//
		// returns ::
		//
		// ever true.

		if(data_set.auchIntervalId!==null)
		 myHtmlDinamicContent('stop_automatic_change',name);

		data_set=null;

		return true;

	}
	else if(op=='get_data_set_property') {

		// usage ::
		//
		// help to get current value of any data_set property, check code of 'insert_data_set' operation for available properties
		//
		//
		// params ::
		//
		// p1	- string	- parameter name to get current value.
		//
		// returns ::
		//
		// param value

		return eval(" data_set."+p1+"; ");

	}
	else if(op=='set_data_set_property') {

		// usage ::
		//
		// help to set current value of any data_set property, check code of 'insert_data_set' operation for available properties.
		//
		// params ::
		//
		// p1	- string	- parameter name to set current value.
		// p2	- mixed	- new parameter value.
		//
		// returns ::
		//
		// true on success, false if fail { invalid param name }.

		return eval(" (typeof(data_set."+p1+")!='undefined' && (data_set."+p1+"=p2 || 1)) ? true : false ; ");

	}
	else if(op=="switch_to") {

		// usage ::
		//
		// switch to specified content by the index param.
		//
		// params ::
		//
		// p1	- mixed	-	can be a numeric index indicating contents position...
		//					or one of the next reserved-words ::
		//						- "start" { equivalent to 0 index position }
		//						- "previous" { || "backward", for internal use only }
		//						- "next" { || "forward", for internal use only }
		//						- "end"
		//
		// note ::
		//
		// when this op is call, the associated interval process { if exists } is set/updated { except for "backward" and "forward" reserved words }.
		//
		// returns ::
		//
		// true if success, false if fail.

		if(!data_set.elementsContent.length)
		 return false;

		// data_set.elementsContentIndex value check / conversion

		if(typeof(p1)=="string") {

			if(p1==="start")
			 data_set.elementsContentIndex=0;
			else if(p1==="previous" || p1==="backward")
			 data_set.elementsContentIndex--;
			else if(p1==="next" || p1==="forward")
			 data_set.elementsContentIndex++;
			else if(p1==="end")
			 data_set.elementsContentIndex=-1;
			else
			 return false;

		}
		else if(typeof(p1)=="number")
		 data_set.elementsContentIndex=p1;
		else
		 return false;

		// adjusting data_set.elementsContentIndex value

		var loop_done=false;

		if(data_set.elementsContentIndex<=-1) {

			loop_done=(data_set.auchDirection==="backward" && data_set.elementsContentIndex==-1) ? true : false ;
			data_set.elementsContentIndex=data_set.elementsContent.length-1;

		}
		else if(data_set.elementsContentIndex>=data_set.elementsContent.length) {

			loop_done=(data_set.auchDirection==="forward" && data_set.elementsContentIndex==data_set.elementsContent.length) ? true : false ;
			data_set.elementsContentIndex=0;

		}

		// loop done?, decrease loops left? { when no infinite loop }

		if(loop_done && data_set.auchLoopsLeft>0)
		 data_set.auchLoopsLeft--;

		// automatic change enabled?, finished cycle?

		if(data_set.auchIntervalId && !data_set.auchLoopsLeft) {

			myHtmlDinamicContent('stop_automatic_change',name);

			if(data_set.auchLoopsLeftRewindAtZero)
			 myHtmlDinamicContent('switch_to',name,data_set.auchDirection);

			if(typeof(data_set.auchLoopsLeftCallbackFunctionAtZero)=="function")
			 data_set.auchLoopsLeftCallbackFunctionAtZero();

			return true;

		}

		// content change...

		var i, k;

		for(i=0;i<data_set.elementsRef.length;i++) {

			var obj=data_set.elementsRef[i],
				obj_properties=data_set.elementsProperties[i],
				obj_html_content=data_set.elementsContent[data_set.elementsContentIndex][i];

				if(typeof(obj_properties)!='object')
				 obj_properties=[obj_properties];

				if(typeof(obj_html_content)!='object')
				 obj_html_content=[obj_html_content];

				for(k in obj_properties)
				 eval(" obj."+obj_properties[k]+"=obj_html_content[k]"+( typeof(obj_html_content[k])!='function' ? "" : "()" )+"; ");

		}

		// set/update interval process?

		var cond=(data_set.auchIntervalId && (p1!=="backward" && p1!=="forward")) ? data_set.auchIntervalOps("set") : true ;

		// callback on each content change?

		if(typeof(data_set.auchCallbackFunction)=="function")
		 data_set.auchCallbackFunction();

		return cond;

	}
	else if(op=='start_automatic_change') {

		// usage ::
		//
		// ...
		//
		// returns ::
		//
		// true if succes, false if fail.

		data_set.elementsContentIndex=-1;
		data_set.auchLoopsLeft=data_set.auchLoopsLeftDefault;

		if(data_set.auchIntervalOps("set"))
		 return myHtmlDinamicContent('switch_to',name,data_set.auchDirection);
		else
		 return false;

	}
	else if(op=='pause_automatic_change') {

		// usage ::
		//
		// ...
		//
		// difference between this op and "stop_automatic_change" is = nothing data_set properties would be reset
		//
		// returns ::
		//
		// true if "data_set.auchIntervalId" had an process-id and is killed the related-process, false if not.

		return data_set.auchIntervalOps("unset");

	}
	else if(op=='continue_automatic_change') {

		// usage ::
		//
		// to be used in conjunction with "pause_automatic_change" operation.
		//
		// returns ::
		//
		// true if succes, false if fail

		if(data_set.auchIntervalOps("set"))
		 return myHtmlDinamicContent('switch_to',name,data_set.auchDirection);
		else
		 return false;

	}
	else if(op=='stop_automatic_change') {

		// usage ::
		//
		// ...
		//
		// difference between this op and "pause_automatic_change" is = some data_set properties would be reset
		//
		// returns ::
		//
		// true if a interval_id exists and is killed the related-process, false if not.

		if(data_set.auchIntervalOps("unset")) {

			data_set.elementsContentIndex=-1;
			data_set.auchLoopsLeft=data_set.auchLoopsLeftDefault;

			return true;

		}
		else
		 return false;

	}
	else if(op=='enabled_automatic_change?') {

		// usage ::
		//
		// returns an boolean value indicating if automatic change has been enabled [ stay active ].
		//
		// returns ::
		//
		// true if enabled, false if not.

		return (data_set.auchIntervalId!==null) ? true : false ;

	}

}


function myTooltip(op,p1,p2,p3,p4,p5,p6,p7)
{
/*

author ::

iim.vxk @t gmail.com

usage ::

an advanced tooltip function highly useful / customizable.

params ::

op		-	string		- operation name
p1,...,p7	-	mixed		- depends of "op" parameter

features ::

cross-browser [ tested on Opera 9.22, Firefox 2, IE6 ]

returns ::

mixed

sample-usage ::

basic-mode :

myTooltip("show",null,document.getElementById("div1"),"visibleClass1",["50px","100px"],"innerHTML","this is a basic sample..."," alert('showing tooltip!'); ");

myTooltip("hide",null,document.getElementById("div1"),"invisibleClass1",null,null,null," alert('hidding tooltip!'); ");

advanced-mode, can declare data-tooltips for future use :

myTooltip("create_vars");

myTooltip("insert_tooltip_data","tooltipX",document.getElementById("div2"),["visibleClass1","invisibleClass1"],["50px","100px"],"getElementsByTagName('p')[2].innerHTML","this is an advanced sample...",[" alert('showing tooltip!'); "," alert('hidding tooltip!'); "]);

myTooltip("show","tooltipX");

myTooltip("hide","tooltipX");

myTooltip("delete_tooltip_data","tooltipX");

notes :

some parameteres can be optionals or a function that return a value, xeq details on...
- "show" op if u use "basic-mode" 
- "insert_tooltip_data" op if u use "advanced-mode".
- element tooltip should be have css property "position" with the value "absolute" or similar.

*/

if(op=="create_vars")
 {
  // usage ::
  //
  // call only 1 time, if u want to use the advanced-mode of this function.
  //
  // params ::
  //
  // ...
  //
  // returns ::
  //
  // ever true.

  if(typeof(my_tooltip_vars)=="undefined")
   my_tooltip_vars=[];

  my_tooltip_vars[0]=[]; // tooltips data

  return true;
 }
else if(op=="get_var")
 {
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	number	- index position of a declared var.
  //
  // returns ::
  //
  // mixed

  return my_tooltip_vars[p1];
 }
else if(op=="update_var")
 {
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	number	- index position of a declared var.
  // p2	-	mixed		- content
  //
  // returns ::
  //
  // true if success, false if error.

  if(typeof(my_tooltip_vars)=="undefined" || !my_tooltip_vars.length || p1>=my_tooltip_vars.length)
   return false;

  my_tooltip_vars[p1]=p2;

  return true;
 }
else if(op=="exist_tooltip_data?")
 {
  // usage ::
  //
  // ....
  //
  // params ::
  //
  // p1	-	string		- tooltip name
  //
  // returns ::
  //
  // index-position if match, false if not.

  var tooltips_data=myTooltip("get_var",0), i;

  for(i=0;i<tooltips_data.length;i++)
   if(p1==tooltips_data[i][0])
	break;

  return (i<tooltips_data.length) ? i : false ;
 }
else if(op=="get_tooltip_data")
 {
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	string		- tooltip name
  //
  // returns ::
  //
  // fill-array if success, empty-array if not exist.

  var k=myTooltip("exist_tooltip_data?",p1);

  if(k===false)
   return [];

  var tooltips_data=myTooltip("get_var",0);

  return tooltips_data[k];
 }
else if(op=="insert_tooltip_data")
 {
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	string		- tooltip name
  // p2	-	reference	- element tooltip
  // p3	-	array		- with 2 string-elements, indicates classNames of element tooltip when the same is showed / hidden.
  // p4	-	mixed		- [ optional ], indicates element tooltip left & top style positions...
  //					  - can be an array with 2 elements.
  //					  - can be a function that return an array with 2 elements.
  //					  notes :
  //					    - a valid value is  ["100px","200px"]  , but  ["100","200"]  not.
  //					    - can specify only one-element of the array if u want.
  // p5	-	string		- element tooltip "property" that display the text...
  //					  sample of valid-values :
  //					  - "innerHTML"
  //					  - "getElementsByTagName('span')[2].innerHTML"
  //					  - "childNodes[4].innerHTML"
  //					  - etc...
  // p6	-	string		- text to display.
  // p7	-	array		- [ optional ], with 2 string-elements, js-code to eval when the tooltip is showed / hidden.
  //
  // returns ::
  //
  // true if success, false if fail.

  if(!p1 || !p2 || !p3 || !p5)
   return false;

  var tooltips_data=myTooltip("get_var",0),
	  k=myTooltip("exist_tooltip_data?",p1);

  if(k===false)
   tooltips_data.push( [p1,p2,p3,p4,p5,p6,p7] );
  else
   tooltips_data[k]=[p1,p2,p3,p4,p5,p6,p7];

  return myTooltip("update_var",0,tooltips_data);
 }
else if(op=="update_tooltip_data")
 {
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // - xeq "insert_tooltip_data" op -
  //
  // returns ::
  //
  // true if success, false if fail.

  if(!p1 || !p2 || !p3 || !p5)
   return false;

  var k=myTooltip("exist_tooltip_data?",p1);

  if(k===false)
   return false;

  var tooltips_data=myTooltip("get_var",0);

  tooltips_data[k]=[p1,p2,p3,p4,p5,p6,p7];

  return myTooltip("update_var",0,tooltips_data);
 }
else if(op=="delete_tooltip_data")
 {
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	string		- tooltip name
  //
  // returns ::
  //
  // true if success, false if fail.

  if(!p1)
   return false;

  var k=myTooltip("exist_tooltip_data?",p1), k2;

  if(k===false)
   return false;

  var old_tooltips_data=myTooltip("get_var",0),
	  tooltips_data=[];

  for(k2 in old_tooltips_data)
   if(k!=k2)
	{ tooltips_data.push( old_tooltips_data[k2] ); }

  return myTooltip("update_var",0,tooltips_data);
 }
else if(op=="show" || op=="hide")
 {
  // basic-mode
  //
  // if(op=="show")
  //
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	...		- ...
  // p2	-	reference	- element tooltip
  // p3	-	string		- element tooltip className
  // p4	-	array		- [ optional ]. indicates element tooltip left & top style positions *.
  // p5	-	string		- element tooltip "property" that display the text *.
  // p6	-	string		- text to display.
  // p7	-	array		- [ optional ], js-code to eval when the tooltip is showed.
  //
  // * = xeq details on "insert_tooltip_data" operation, same parameter name.
  //
  // returns ::
  //
  // ever true.
  //
  //
  // if(op=="hide")
  //
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	...		- ...
  // p2	-	reference	- element tooltip
  // p3	-	string		- element tooltip className
  // p4	-	...		- 
  // p5	-	string		- element tooltip "property" that display the text *.
  // p6	-	...		- ...
  // p7	-	array		- [ optional ], js-code to eval when the tooltip is hidded.
  //
  // * = xeq details on "insert_tooltip_data" operation, same parameter name.
  //
  // returns ::
  //
  // ever true.
  
  
  // advanced-mode
  //
  // if(op=="show")
  //
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	...		- tooltip name
  //
  // returns ::
  //
  // true if success, false if fail.
  //
  //
  // if(op=="hide")
  //
  // usage ::
  //
  // ...
  //
  // params ::
  //
  // p1	-	...		- tooltip name
  //
  // returns ::
  //
  // true if success, false if fail.

  var cond=(op=="show") ? true : false ;
 
  if(!p1) // basic-mode
   {
	var element=p2,
		element_class=p3,
		element_positions=(cond) ? p4 : null,
		element_property=p5,
		element_property_content=(cond) ? p6 : '',
		element_eval_code=p7;
   }
  else // advanced-mode
   {
	var tooltip_data=myTooltip("get_tooltip_data",p1);

	if(!tooltip_data)
	 return false;

	var element=tooltip_data[1],
		element_class=(cond) ? tooltip_data[2][0] : tooltip_data[2][1],
		element_positions=(cond) ? tooltip_data[3] : null,
		element_property=tooltip_data[4],
		element_property_content=(cond) ? tooltip_data[5] : '',
		element_eval_code=(tooltip_data[6]) ? ( (cond) ? tooltip_data[6][0] : tooltip_data[6][1] ) : null ;
   }

  if(element_positions)
   {
	if(typeof(element_positions)=="function")
	 element_positions=element_positions();
	else if(typeof(element_positions)!="object")
	 element_positions=null;

	if(element_positions)
	 {
	  if(element_positions[0]) element.style.left=element_positions[0];
	  if(element_positions[1]) element.style.top=element_positions[1];
	 }
   }

  if(element_property)
   eval(" element."+element_property+"=element_property_content"+( typeof(element_property_content)!="function" ? "" : "()" )+"; ");

  element.className=element_class;

  if(element_eval_code)
   eval(element_eval_code);

  return true;
 }
}


function myUploadFiles(op,p1,p2)
{
/*
 author ::

iim.vxk @t gmail.com

usage ::

helps in uploading-processes files,,, this is an well-programmed method for do that.

note ::

put function-working is soo simple, only ::

myUploadFiles('_initialize');							- initialize, one-time -
myUploadFiles("insert_data_set","user_pics",params);			- insert a data_set
myUploadFiles("data_set_qfc","user_pics","insert_file_box");	- inset some default file-boxes
myUploadFiles("data_set_qfc","user_pics","insert_file_box");
myUploadFiles("data_set_qfc","user_pics","insert_file_box");
												- gotcha!!

xtra-features ::

cross-browser, fully tested on opera 9.23, firefox 2.0.0.5 and IE6
*/

if(op=="_initialize")
 {
  // usage ::
  //
  // need to call this op only one-time if u want use the other ops.
  //
  // returns ::
  //
  // ever true.

  myUploadFilesVars=new Object();

  // upload method, true for a standard method, false for an "IE6" - any IE -  method, this refers to..
  //  - different method for upload.
  //  - not support correctly onload event on iframes.
  //  - forms elements created dinamically can't set encription-type with "enctype", need use "encoding".
  myUploadFilesVars.standardUploadMethod=(navigator.appName.toLowerCase().indexOf('internet explorer')==-1); 

  myUploadFilesVars.datasets=[];

  // dataset shared functions - in this way, save system resources -

  myUploadFilesVars.datasetsSharedFunctions=new Object();

  myUploadFilesVars.datasetsSharedFunctions.startUploadProcess=function(_this) {

	if(_this.disabled || _this.sequence || !_this._parentObj.fileBoxesContainer || !_this._parentObj.fileBoxesContainer.firstChild || !_this._parentObj.iframeUploader)
	 return false;

	_this.setSequence(1,true,true);
	_this.currentFileBox=_this._parentObj.fileBoxesContainer.firstChild;
	_this.stats.aborted=0;
	_this.stats.success=0;
	_this.stats.fail=0;

	return _this.kontinue();

		};

  myUploadFilesVars.datasetsSharedFunctions.kontinueUploadProcess=function(_this) {

	if(!_this.sequence)
	 return false;
	else if(_this.sequence==2 || !_this.currentFileBox)
	 { _this.setSequence(3,true,true);  return false; }

	if(_this.currentFileBox._uploadEnabled())
	 {
	  var standard_upload_method=myUploadFiles("get_var","standardUploadMethod"),
		  form, k;

	  if(standard_upload_method)
	   {
		_this._parentObj.iframeUploader.onload=function() { _this.kontinue2ndStep(); };
		form=document.createElement('form');
	   }
	  else
	   {
		_this._parentObj.iframeUploader.onreadystatechange=function() { if(this.readyState=="complete") _this.kontinue2ndStep(); };
		form=_this.currentFileBox;
	   }

	  // set form attribs

	  for(k in _this._parentObj.tmpFormAttribs)
	   form.setAttribute(_this._parentObj.tmpFormAttribs[k][0],_this._parentObj.tmpFormAttribs[k][1]);

	  if(standard_upload_method)
	   {
		form.appendChild( _this.currentFileBox.childNodes[1].cloneNode(true) );
		// FF bug?, to submit "form" element, need append to document.
		_this._parentObj.iframeUploader.appendChild(form);
	   }

	  form.submit();

	  _this.currentFileBox._setStatus(1);
	 }
	else
	 {
	  _this.currentFileBox=_this.currentFileBox.nextSibling;
	  _this.kontinue();
	 }

	return true;

		};

  myUploadFilesVars.datasetsSharedFunctions.kontinueUploadProcess2ndStep=function(_this) {

	var standard_upload_method=myUploadFiles("get_var","standardUploadMethod"),
		iframe_uploader_returned_value, cond;

	if(standard_upload_method)
	 _this._parentObj.iframeUploader.removeChild(_this._parentObj.iframeUploader.lastChild);
	else
	 {
	  // remove form attribs.

	  var k;

	  for(k in _this._parentObj.tmpFormAttribs)
	   _this.currentFileBox.removeAttribute(_this._parentObj.tmpFormAttribs[k][0]);
	 }

	if(_this._parentObj.iframeUploader.contentDocument) // DOM standard
	 iframe_uploader_returned_value=_this._parentObj.iframeUploader.contentDocument.body.innerHTML;
	else if(_this._parentObj.iframeUploader.contentWindow) // "IE standard"
	 iframe_uploader_returned_value=_this._parentObj.iframeUploader.contentWindow.document.body.innerHTML;
	else if(_this._parentObj.iframeUploader.document) // ?_?
	 iframe_uploader_returned_value=_this._parentObj.iframeUploader.document.body.innerHTML;

	cond=_this._parentObj.scriptUploadsProcessor.returnedValueProcessing(iframe_uploader_returned_value);

	if(cond===true)
	 {
	  _this.stats.success++;
	  _this.currentFileBox._setStatus(3,iframe_uploader_returned_value);
	 }
	else
	 {
	  _this.stats.fail++;
	  _this.currentFileBox._setStatus(4,iframe_uploader_returned_value,cond);
	 }

	_this.currentFileBox=_this.currentFileBox.nextSibling;

	_this.kontinue();

		};

  myUploadFilesVars.datasetsSharedFunctions.stopUploadProcess=function(_this) {

	// i can't cancell CURRENT upload FILE process, i try window.stop() but upload process continues in background.

	_this.setSequence(2,true,true);

	alert("proceso de carga de imágenes detenido, no obstante carga de archivo actual no se puede detener.");

	return true;

		};

  myUploadFilesVars.datasetsSharedFunctions.setUploadProcessDisabled=function(_this,value) {

	if(!value)
	 { _this.disabled=false; }
	else
	 { _this.disabled=true;  if(_this.sequence==1) _this.setSequence(2,false,true); }

	_this._parentObj.controls.check();

	return true;

		};

  myUploadFilesVars.datasetsSharedFunctions.setUploadProcessSequence=function(_this,sequence,check_main_controls,eval_code) {

	_this.sequence=sequence;

	if(check_main_controls)
	 _this._parentObj.controls.check();

	if(eval_code && _this.sequenceXCode && _this.sequenceXCode[_this.sequence])
	 _this.sequenceXCode[_this.sequence](_this._parentObj);

	if(_this.sequence==3)
	 _this.setSequence(0,true,true);

		};

  myUploadFilesVars.datasetsSharedFunctions.checkControls=function(_this) {

	var i, i2;

	if(_this._parentObj.uploadProcess.disabled)
	 { i=0;  i2=0; }
	else if(_this._parentObj.uploadProcess.sequence<3)
	 { i=(_this._parentObj.uploadProcess.sequence+1);  i2=1; }
	else
	 { i=null;  i2=1; }

	if(i!==null)
	 {
	  _this.process.ref.className=_this.process.classes[i];
	  _this.process.ref.title=_this.process.titles[i];
	  _this.process.ref.onclick=_this.process.functions[i];
	 }

	_this.addFileBox.ref.className=_this.addFileBox.classes[i2];
	_this.addFileBox.ref.title=_this.addFileBox.titles[i2];
	_this.addFileBox.ref.onclick=_this.addFileBox.functions[i2];

	return true;

		};

  myUploadFilesVars.datasetsSharedFunctions.insertFileBox=function(_this) {

	var standard_upload_method=myUploadFiles("get_var","standardUploadMethod"),
		element=document.createElement( (standard_upload_method ? 'div' : 'form') ),
		se1=document.createElement('input'),
		se2=document.createElement('input'),
		se3=document.createElement('a'),
		se4=document.createElement('div');

	element._dataSetRef=_this;

	element._setStatus=function(status,x_value,x_value2) {

		if( ((status==0 || status==1) && !(x_value="")) || status==3 || status==4)
		 this.setAttribute("_scriptUploadsProcessorReturnedValue",x_value);

		this.setAttribute("_status",status);

		this._setError( (status!=4 ? '' : x_value2) );

		this._dataSetRef.checkFileBoxControls(this);

		if(this._dataSetRef.uploadProcess.fileBoxStatusXCode[status])
		 this._dataSetRef.uploadProcess.fileBoxStatusXCode[status](this._dataSetRef);

			};

	element.setAttribute("_errorId","");
	element.setAttribute("_errorMsg","");

	element._setError=function(error_id) {

		if(error_id!==null)
		 {
		  var k, error_msgs=this._dataSetRef.scriptUploadsProcessor.errorMsgs, error_msg;

		  for(k in error_msgs)
		   {
			if(error_msgs[k][0]=='_UNKNOWN')
			 error_msg=error_msgs[k][1];
			else if(error_msgs[k][0]==error_id)
			 { error_msg=error_msgs[k][1];  break; }
		   }
		 }
		else
		 { error_id='';  var error_msg=''; }

		this.setAttribute('_errorId',error_id);
		this.setAttribute('_errorMsg',error_msg);

			};

	element._uploadEnabled=function() {

		return (this.childNodes[0].checked && this.childNodes[1].value) ? true : false ;

			};

	element._delete=function() {

		this.parentNode.removeChild(this);

		return true;

			};

	// PENDING :: attribs-value definition, should be allow customization.

	se1.setAttribute('type','checkbox');
	se1.className='checkbox';
	se1.setAttribute('name',_this.name+'_files_selection[]');
	se1.setAttribute('id',_this.name+'_files_selection[]');
	se1.setAttribute('checked',true);
	se1.setAttribute('defaultChecked',true);
	se1.onchange=function() { this.nextSibling.disabled=!this.checked; };

	se2.setAttribute('type','file');
	se2.setAttribute('name',_this.name+'_files[]');
	se2.setAttribute('id',_this.name+'_files[]');
	se2.onchange=function() { this.parentNode._setStatus(0);  this.previousSibling.checked=(this.value);  this.previousSibling.onchange(); };

	se3.setAttribute('href','javascript: void(0); ');
	se3.innerHTML='&nbsp;';
	se3.onclick=function() { this.parentNode._delete(); };

	element.appendChild(se1);
	element.appendChild(se2);
	element.appendChild(se3);
	element.appendChild(se4);

	_this.fileBoxesContainer.appendChild(element);

	element._setStatus(0);

	return true;

			};

  myUploadFilesVars.datasetsSharedFunctions.checkFileBoxControls=function(file_box) {

	var data_set=file_box._dataSetRef, file_box_status=file_box.getAttribute("_status"),
		file_box_control=null, file_box_control_attribs=null, i, i2;

	if(data_set.uploadProcess.fileBoxClasses)
	 file_box.className=data_set.uploadProcess.fileBoxClasses[file_box_status];

	for(i=0;i<data_set.uploadProcess.fileBoxControlsAttribs.length;i++)
	 {
	  if(!file_box.childNodes[i] || !data_set.uploadProcess.fileBoxControlsAttribs[i])
	   continue;

	  file_box_control=file_box.childNodes[i];
	  file_box_control_attribs=data_set.uploadProcess.fileBoxControlsAttribs[i];

	  file_box_control.className=file_box_control_attribs[0];

	  if(file_box_control_attribs[1]) 
	   file_box_control.title=(typeof(file_box_control_attribs[1][file_box_status])!="function") ? file_box_control_attribs[1][file_box_status] : file_box_control_attribs[1][file_box_status](data_set) ;
	 }

	if(file_box_status==0)
	 {}
	else if(file_box_status==1)
	 {
	  file_box.childNodes[0].disabled=true;
	  file_box.childNodes[1].disabled=true;

	  file_box.childNodes[2].setAttribute("onclicktmp",file_box.childNodes[2].onclick);
	  file_box.childNodes[2].onclick=null;
	 }
	else if(file_box_status==2 || file_box_status==3 || file_box_status==4)
	 {
	  file_box.childNodes[0].checked=false;
	  file_box.childNodes[0].disabled=false;

	  eval("file_box.childNodes[2].onclick="+file_box.childNodes[2].getAttribute("onclicktmp"));
	  file_box.childNodes[2].removeAttribute("onclicktmp");
	 }

	return true;

		};

  return true;
 }
else if(op=="get_var")
 {
  // usage ::
  //
  // get an var related with the function. - property of myUploadFilesVars object, check "_initialize" op fro details -
  //
  // params ::
  //
  // p1	-	string		- property name
  //
  // returns ::
  //
  // an value if success, or undefined if fail.

  if(!p1)
   return undefined;

  eval(" var value=myUploadFilesVars."+p1+"; ");

  return value;
 }
else if(op=="insert_data_set")
 {
  // usage ::
  //
  // insert an data_set for future use.
  //
  // params ::
  //
  // apparently are muchs attribs to set to use the function... but this allow you to get an very very high customization powser ; ),,, power ˇ!!
  //
  // - all the optional parameters should be defined with a null value.
  //
  // p1	-	string		- data_set name
  // p2	-	array		- data_set...
  // p2[0]	-	reference	- an container of file-boxes - an div element is suggested be used -, any element inside is eliminated automatically
  // p2[1]	-	reference	- an empty iframe used for the upload process, id attribute should be defined.
  // p2[2]	-	array		- script uploads processor data
  // p2[2][0]	-	string		- script url
  // p2[2][1]	-	function	- function-processing of the returned value of the script uploads processor, the returned value of the script uploads processor is passed as first parameter, after processing should return true - exact boolean value - if upload is successful, or an string/number value indicating the error id, the error id / msg is set to the file-box attributes "_errorId" and "_errorMsg!".
  // p2[2][2]	-	array		- [ optional ] errors related with the previuos param, each element is an array containing 2 elements, the first indicates the error-id [ can be a string or number ], and the second the error-msg.
  //						  - an special error-id "_UNKNOWN" can be used to cover any undefined error-id, if is not specified is automatically set with a default msg.
  // p2[3]		-	array		- [ optional ] an array containing 3 function-elements, each one is executed in accordance with the corresponding upload process sequence...
  //						  0 = inactive - ready -
  //						  1 = active
  //						  2 = stopping
  //						  3 = finished - his duration is only a few miliseconds, after that is set to 0 - inactive -  -
  //						  - the current data_set object is passed as first-parameter
  //						  - to skip one element use a null value.
  // p2[4]		-	array		- [ optional ] file-box classNames - 5 - each time file-box status changes...
  //						  - file-box status - 1 at time -...
  //						    - 0 = upload inactive
  //						    - 1 = upload active
  //						    - 2 = upload stopped - currently not work -
  //						    - 3 = upload success
  //						    - 4 = upload fail
  //						  - to skip one element use a null value.
  // p2[5]		-	array		- [ optional ] file-box controls attribs - classNames and titles -
  //						  - a file-box contains 4 controls..
  //						    - 0 = input type checkbox
  //						    - 1 = input type file
  //						    - 2 = area-element "a" - delete file-box control -
  //						    - 3 = div-element - used to show file-box upload result graphicaly/textualy -
  //						  - should declare 4 array-elements, each one is related with the corresponding file-box control, and each array-element can contain 1 or 2 elements...
  //						    - 0	-	string		= control className
  //						    - 1 -	array		= control titles
  //							 - can contain 1 to 5 string/function-elements, each one is related with the file-box status
  //						  - in this case, is recommended define the titles of the control-2 and control-3
  //						  - if u define a element as a function, the current data_set is passed as first-parameter
  //						  - to skip one element use a null value.
  // p2[6]		-	array		- [ optional ] if u want to do something each time that file-box status is changed, u can define 4 function-elements - in relation with the corresponding status -.
  //						  - the current data_set object is passed as first-parameter
  //						  - to skip one element use a null value.
  // p2[7]		-	array		- process-controls data
  // p2[7][0]	-	array		- main process control data
  // p2[7][0][0]	-	reference	- to an html-element, can be to an link-element
  // p2[7][0][1]	-	array		- class names, should be 4...
  //						 - 0 = upload process disabled
  //						 - 1 = start upload process
  //						 - 2 = stopping upload process
  //						 - 3 = finished upload process
  // p2[7][0][2]	-	array		- titles, should be 4...
  //						 - 0 = upload process disabled
  //						 - 1 = start upload process
  //						 - 2 = stop upload process
  //						 - 3 = stopping upload process
  // p2[7][1]	-	array		- add-file control data
  // p2[7][1][0]	-	reference	- to an html-element, can be to an link-element
  // p2[7][1][1]	-	array		- class names, should be 2...
  //						 - 0 = add-file disabled
  //						 - 1 = add-file enabled
  // p2[7][1][2]	-	array		- titles, should be 2...
  //						 - 0 = add-file disabled
  //						 - 1 = add-file enabled
  //
  // returns ::
  //
  // true if success, false if fail.

  // params validation

  if(typeof(p1)=="undefined" || typeof(p2)!="object")
   return false;

  // data_set validation, some strict... zero errors is da idea o.0 !!

  if(  (!p2[0] || typeof(p2[0])!="object")
		|| ( !p2[1] || typeof(p2[1])!="object" || !p2[1].id || (!p2[1].contentDocument && !p2[1].contentWindow && !p2[1].document) )
		|| ( typeof(p2[2])!="object" || (!p2[2][0] || typeof(p2[2][0])!="string") || (!p2[2][1] || typeof(p2[2][1])!="function") || (p2[2][2] && typeof(p2[2][2])!="object") )
		|| ( p2[3] && (typeof(p2[3])!="object" || (p2[3][0] && typeof(p2[3][0])!="function") || (p2[3][1] && typeof(p2[3][1])!="function") || (p2[3][2] && typeof(p2[3][2])!="function") || (p2[3][3] && typeof(p2[3][3])!="function")) )
		|| ( p2[4] && (typeof(p2[4])!="object" || (p2[4][0] && typeof(p2[4][0])!="string") || (p2[4][1] && typeof(p2[4][1])!="string") || (p2[4][2] && typeof(p2[4][2])!="string") || (p2[4][3] && typeof(p2[4][3])!="string") || (p2[4][4] && typeof(p2[4][4])!="string")) )
		|| ( p2[5] && (typeof(p2[5])!="object" || (p2[5][0] && typeof(p2[5][0])!="object") || (p2[5][1] && typeof(p2[5][1])!="object") || (p2[5][2] && typeof(p2[5][2])!="object") || (p2[5][3] && typeof(p2[5][3])!="object")) )
		|| ( p2[6] && (typeof(p2[6])!="object" || (p2[6][0] && typeof(p2[6][0])!="function") || (p2[6][1] && typeof(p2[6][1])!="function") || (p2[6][2] && typeof(p2[6][2])!="function") || (p2[6][3] && typeof(p2[6][3])!="function")) )
		|| ( p2[7] && (typeof(p2[7])!="object" || (typeof(p2[7][0])!="object" || typeof(p2[7][0][0])!="object" || typeof(p2[7][0][1])!="object" || typeof(p2[7][0][2])!="object") || (typeof(p2[7][1])!="object" || typeof(p2[7][1][0])!="object" || typeof(p2[7][1][1])!="object" || typeof(p2[7][1][2])!="object")) )  )
   return false;

  // data_set saving

  myUploadFilesVars.datasets[p1]=new Object()

  var standard_upload_method=myUploadFiles("get_var","standardUploadMethod"), data_set=myUploadFilesVars.datasets[p1];

  data_set.name=p1;
  data_set.fileBoxesContainer=p2[0];
  data_set.iframeUploader=p2[1];

  data_set.tmpFormAttribs=[
	["name",p1+"_upload_files_tmp"],
	["id",p1+"_upload_files_tmp"],
	["method","post"],
	["enctype","multipart/form-data"],
	["action",p2[2][0]],
	["target",data_set.iframeUploader.id]
		];

  if(!standard_upload_method)
   data_set.tmpFormAttribs.push( ["encoding","multipart/form-data"] );

  data_set.scriptUploadsProcessor=new Object();
  data_set.scriptUploadsProcessor.url=p2[2][0];
  data_set.scriptUploadsProcessor.returnedValueProcessing=p2[2][1];
  data_set.scriptUploadsProcessor.errorMsgs=p2[2][2];

  data_set.uploadProcess=new Object();
  data_set.uploadProcess._parentObj=data_set;
  data_set.uploadProcess.disabled=false;
  data_set.uploadProcess.setDisabled=function(value) { return myUploadFilesVars.datasetsSharedFunctions.setUploadProcessDisabled(this,value); };
  data_set.uploadProcess.sequence=null;
  data_set.uploadProcess.setSequence=function(sequence,check_main_controls,eval_code) { return myUploadFilesVars.datasetsSharedFunctions.setUploadProcessSequence(this,sequence,check_main_controls,eval_code); };
  data_set.uploadProcess.sequenceXCode=p2[3];
  data_set.uploadProcess.fileBoxClasses=p2[4];
  data_set.uploadProcess.fileBoxControlsAttribs=p2[5];
  data_set.uploadProcess.fileBoxStatusXCode=p2[6];
  data_set.uploadProcess.currentFileBox=null;
  data_set.uploadProcess.start=function() { return myUploadFilesVars.datasetsSharedFunctions.startUploadProcess(this); };
  data_set.uploadProcess.kontinue=function() { return myUploadFilesVars.datasetsSharedFunctions.kontinueUploadProcess(this); };
  data_set.uploadProcess.kontinue2ndStep=function() { myUploadFilesVars.datasetsSharedFunctions.kontinueUploadProcess2ndStep(this); };
  data_set.uploadProcess.stop=function() { return myUploadFilesVars.datasetsSharedFunctions.stopUploadProcess(this); };

  data_set.uploadProcess.stats=new Object();
  data_set.uploadProcess.stats.aborted=0;
  data_set.uploadProcess.stats.success=0;
  data_set.uploadProcess.stats.fail=0;

  data_set.controls=new Object();
  data_set.controls._parentObj=data_set;
  data_set.controls.process=new Object();
  data_set.controls.process.ref=p2[7][0][0];
  data_set.controls.process.classes=p2[7][0][1];
  data_set.controls.process.titles=p2[7][0][2];
  data_set.controls.process.functions=[];
  data_set.controls.process.functions[0]=null;
  eval(" data_set.controls.process.functions[1]=function() { myUploadFiles('data_set_qfc','"+data_set.name+"','start_upload_process'); }; ");
  eval(" data_set.controls.process.functions[2]=function() { myUploadFiles('data_set_qfc','"+data_set.name+"','stop_upload_process'); }; ");
  data_set.controls.process.functions[3]=null;

  data_set.controls.addFileBox=new Object();
  data_set.controls.addFileBox.ref=p2[7][1][0];
  data_set.controls.addFileBox.classes=p2[7][1][1];
  data_set.controls.addFileBox.titles=p2[7][1][2];
  data_set.controls.addFileBox.functions=[];
  data_set.controls.addFileBox.functions[0]=null;
  eval(" data_set.controls.addFileBox.functions[1]=function() { myUploadFiles('data_set_qfc','"+data_set.name+"','insert_file_box'); }; ");
  data_set.controls.check=function() { return myUploadFilesVars.datasetsSharedFunctions.checkControls(this); };

  data_set.insertFileBox=function() { return myUploadFilesVars.datasetsSharedFunctions.insertFileBox(this); };
  data_set.checkFileBoxControls=function(file_box) { myUploadFilesVars.datasetsSharedFunctions.checkFileBoxControls(file_box); };

  // data_set initialization processes

  // ... remove any element on file-boxes container element

  while(data_set.fileBoxesContainer.firstChild)
   data_set.fileBoxesContainer.removeChild(data_set.fileBoxesContainer.firstChild);

  // ... remove any element on iframe uploader

  while(data_set.iframeUploader.firstChild)
   data_set.iframeUploader.removeChild(data_set.iframeUploader.firstChild);

  // ... set default error id/msg - if apply and not defined -

  if(data_set.scriptUploadsProcessor.errorMsgs)
   {
	var k, cond=false;

	for(k in data_set.scriptUploadsProcessor.errorMsgs)
	 if(data_set.scriptUploadsProcessor.errorMsgs[k][0]=="_UNKNOWN")
	  { cond=true;  break; }

	if(!cond)
	 data_set.scriptUploadsProcessor.errorMsgs.push( ["_UNKNOWN","unespecified error"] );
   }

  // ... set default properties on main-controls

  data_set.controls.process.ref.href="javascript: void(0); ";
  data_set.controls.process.ref.innerHTML="&nbsp;";
  data_set.controls.addFileBox.ref.href="javascript: void(0); ";
  data_set.controls.addFileBox.ref.innerHTML="&nbsp;";

  // ... set upload process sequence

  data_set.uploadProcess.setSequence(0,true,true);

  // ...

  return true;
 }
else if(op=="get_data_set")
 {
  // usage ::
  //
  // help to get a data_set
  //
  // params ::
  //
  // p1	-	string		- data_set name
  //
  // returns ::
  //
  // a data_set reference if success, false if fail.

  return (typeof(p1)!="undefined" && myUploadFilesVars.datasets[p1]) ? myUploadFilesVars.datasets[p1] : false ;
 }
else if(op=="data_set_qfc")
 {
  // data_set_QuickFunctionCall
  //
  // usage ::
  //
  // a data_set had a lot of properties and functions, in this case this op helps to you to execute most common functions.
  //
  // params ::
  //
  // p1	-	string		- data_set name
  // p2	-	string		- data_set short function name
  //
  // returns ::
  //
  // depends of the function to execute, but if fail returns false.

  var data_set=myUploadFiles("get_data_set",p1);

  if(!data_set)
   return false;

  if(p2=="insert_file_box")
   return data_set.insertFileBox();
  else if(p2=="disable_upload_process")
   return data_set.uploadProcess.setDisabled(true);
  else if(p2=="enable_upload_process")
   return data_set.uploadProcess.setDisabled(false);
  else if(p2=="start_upload_process")
   return data_set.uploadProcess.start();
  else if(p2=="stop_upload_process")
   return data_set.uploadProcess.stop();
  else
   return false;
 }
}


function myUserObjs(op,p1,p2,p3,p4)
{
 // author ::
 //
 // iim.vxk @t gmail.com
 //
 // usage ::
 //
 // an standard and easy methodology to manipulate - insert, sort, modify, deleting, etc - objects - html-elements - into a container. [ like gmail interface - at 2007 - ]
 //
 // to start using it you should read / understand all the ops of this function.
 //
 // an basic use need the next ops ::
 // - "_initialize"
 // - "insert_data_set"
 // - "create_obj"
 // - "insert_obj"

if(op=="_initialize")
 {
  // params ::
  //
  // ...
  //
  // returns ::
  //
  // ever true.
  //
  // notes ::
  //
  // - only call one-time

  myUserObjsVars=new Object();
  myUserObjsVars.dataSets=[];

  return true;
 }
else if(op=="insert_data_set")
 {
  // params ::
  //
  // p1	- string	- data_set name
  // p2	- array	- data_set data
  //
  // returns ::
  //
  // true if success, false if fail.

  if(myUserObjs("exist_data_set?",p1)!==false)
   return false;

  // strict validation = minor or null error probabilities

  if(
		(!p1 || typeof(p1)!="string")
		|| (typeof(p2)!="object" || !p2)
		|| (typeof(p2[0])!="object" || !p2[0])
		|| (typeof(p2[1])!="string" || !p2[1])
		|| (p2[2] && typeof(p2[2])!="string")
		|| (p2[3] && (typeof(p2[3])!="object" || (!p2[3][0] || typeof(p2[3][0])!="object") || (p2[3][1] && typeof(p2[3][1])!="object")))
		|| (p2[4] && (typeof(p2[4])!="object" || (!p2[4][0] || typeof(p2[4][0])!="object") || (!p2[4][1] || typeof(p2[4][1])!="string")))
		|| (p2[5] && (typeof(p2[5])!="object" || (!p2[5][0] || typeof(p2[5][0])!="object") || (!p2[5][1] || typeof(p2[5][1])!="string") || (p2[5][2]!="asc" && p2[5][2]!="desc")))
		|| (p2[6] && (typeof(p2[6])!="object" || (!p2[6][0] || typeof(p2[6][0])!="string")))
		|| (p2[7] && typeof(p2[7])!="function")
		|| (p2[8] && typeof(p2[8])!="function")
		|| (p2[9] && typeof(p2[9])!="object")
		|| (typeof(p2[10])!="undefined" && typeof(p2[10])!="boolean" && typeof(p2[10])!="object")
	)
   return false;

  // data_set setting

  // ...

  var data_set=new Object();
  myUserObjsVars.dataSets.push( [p1,data_set] );

  // ...

  data_set.objects=new Object();
  data_set.objects._parent=data_set;

  // data_set objects container
  // p2[0]		-	reference	- usually is to an "div" element.

  data_set.objects.container=p2[0];

  // data_set.objects.type
  // p2[1]		-	string		- usually is "div".

  data_set.objects.type=p2[1];

  // ...

  data_set.objects.refs=[];
  data_set.objects.refsHandler=function(op,obj) {

	if(op=="insert")
	 {
	  if(this.sort) {

		this.sort.criteria.soloApplication(obj);

		var refs_tmp=[], k, sk=null;

		eval("for(k=0;k<this.refs.length;k++) if(typeof(obj._sortCriteriaValue)=='undefined' || this.refs[k]._sortCriteriaValue"+( this.sort.type.value=="asc" ? "<=" : ">=" )+"obj._sortCriteriaValue) { refs_tmp.push(this.refs[k]); }  else { sk=k;  break; }");

		refs_tmp.push(obj);

		for(;k<this.refs.length;k++)
		 refs_tmp.push(this.refs[k]);

		this.refs=refs_tmp;

		if(sk!==null)
		 this.container.insertBefore(obj,this.refs[sk+1]);
		else
		 this.container.appendChild(obj);
	   }
	   else {

	    this.refs.push(obj);
		this.container.appendChild(obj);

	   }

	   obj._initialize(); /* important do after element is added to document */
	 }
	else if(op=="delete")
	 {
	  var k, refs_tmp=[];

	  for(k in this.refs)
	   { if(this.refs[k]!=obj) refs_tmp.push(this.refs[k]); }

	  if(this.refs.length==refs_tmp.length)
	   return false;

	  this.refs=refs_tmp;
	  this.container.removeChild(obj);

	  obj._deinitialize();
	 }
	else
	 return false;

	if(this._parent.msgData)
	 this._parent.msgData.check();

	return true;

  };

  // data_set.objects.basic class [ optional ]
  // p2[2]		-	string		- ...

  data_set.objects.basicClass=(p2[2]) ? p2[2] : "" ;

  // data_set.objects.status [ optional ]
  //
  // u can set a group of "status"[ like "loading", "normal", "modifying", "deleting", etc ] where each one is associated with a className
  //
  // p2[3][0]	-	array			- each element is an array with 2 elements, where the first indicates the status-name and the second the status-className.
  // p2[3][1]	-	array			- [ optional ] indicates one or more status-names for set as default status-classNames in each data_set object created.
  //
  // notes ::
  //
  // - all data_set objects had his own "_status" object attribute.
  // - check " myUserObjs('create_obj',...) " for the data_set object "_status.set()" function details.

  if(p2[3]) {

	data_set.objects.status=new Object();
	data_set.objects.status.data=p2[3][0];
	data_set.objects.status.d3fault=p2[3][1];
	data_set.objects.status.getClass=function(status) {

		for(k in this.data)
		 if(this.data[k][0]==status)
		  return this.data[k][1];

		return "";

	};

  }

  // data_set.objects.looks [ like visualizations ] [ optional ]
  //
  // u can set a group of "look" [ like "minimal", "light", "complete", etc ] where each one is associated with a className.
  //
  // p2[4][0]	-	array		- each element is an array with 2 elements, where the first indicates the look-name and the second the look-className.
  // p2[4][1]	-	string		- indicates the current look-name.
  //
  // notes ::
  //
  // - all data_set objects share the same "look".
  // - check " data_set.objects.looks.apply() " function for details.

  if(p2[4]) {

	data_set.objects.looks=new Object();
	data_set.objects.looks._parent=data_set.objects;
	data_set.objects.looks.data=p2[4][0];
	data_set.objects.looks.current=null;
	data_set.objects.looks.currentClass=null;
	data_set.objects.looks.apply=function(look) {

		// basic xeck

		if(!look)
		 return false;
		else if(this.current==look)
		 return true;

		// process

		var look_class=null;

		for(k in this.data)
		 if(this.data[k][0]==look)
		  { look_class=this.data[k][1];  break; }

		if(look_class===null)
		 return false;

		this.current=look;
		this.currentClass=look_class;

		var k;

		for(k in this._parent.refs)
		 this._parent.refs[k]._setClass();

		// ...

		return true;

	};

  }

  // data_set.objects.sort [ optional ]
  //
  // grant possibility to sort all the data_set objects depending of one of various defined criterious in "asc" or "desc" sort type.
  //
  // p2[5][0]	-	array		- criterious-data, each element is an array where element..
  //						  0 - criteria name
  //						  1 - criteria processing function, this should accept one parameter [ used to pass an data_set object ] and should be process some attribute of the data_set object and return an numeric value.
  // p2[5][1]	-	string		- default sort criteria name
  // p2[5][2]	-	string		- default sort type [ like "asc" or "desc" ]
  //
  // notes ::
  //
  // - you can change sort any time using the " data_set.objects.sort.apply() " function, check for details.

  if(p2[5]) {

	data_set.objects.sort=new Object();
	data_set.objects.sort._parent=data_set.objects;
	data_set.objects.sort.type=new Object();
	data_set.objects.sort.type._parent=data_set.objects.sort;
	data_set.objects.sort.type.value=null;
	data_set.objects.sort.type.apply=function(type) {

		// basic xeck

		if(type!="asc" && type!="desc")
		 return false;

		// ...

		this.value=type;

		// ...

		return true;

	};
	data_set.objects.sort.criteria=new Object();
	data_set.objects.sort.criteria._parent=data_set.objects.sort;
	data_set.objects.sort.criteria.data=p2[5][0];
	data_set.objects.sort.criteria.value=null;
	data_set.objects.sort.criteria.method=null;
	data_set.objects.sort.criteria.soloApplication=function(obj) {

		if(!this.value || !this.method)
		 return false;

		obj._sortCriteriaValue=this.method(obj);

		return true;

	};
	data_set.objects.sort.criteria.apply=function(criteria) {

		// basic xeck

		if(!criteria && !(criteria=this.value))
		 return false;

		// process...

		var k;

		for(k=0;k<this.data.length;k++)
		 if(this.data[k][0]==criteria && typeof(this.data[k][1])=="function")
		  { this.value=criteria;  this.method=this.data[k][1];  break; }

		if(k==this.data.length)
		 return false;

		var refs_tmp=[], sk, k2, refs_tmp2=[];

		// ... get new criteria sort value in all refs, and get an copy of refs.

		for(k in this._parent._parent.refs) {

			this.soloApplication(this._parent._parent.refs[k]);
			refs_tmp.push(this._parent._parent.refs[k]);

		};

		// ... order refs

		for(k in refs_tmp) {

			sk=null;

			eval(" for(k2 in refs_tmp) if(refs_tmp[k2]!=null && (sk===null || refs_tmp[k2]._sortCriteriaValue"+( this._parent.type.value=="asc" ? "<" : ">" )+"refs_tmp[sk]._sortCriteriaValue)) { sk=k2; } ");

			refs_tmp2.push(refs_tmp[sk]);
			refs_tmp[sk]=null;

		}

		// ... update data_set data

		if(refs_tmp2.length)
		 this._parent._parent.refs=refs_tmp2;

		// ... update document appearance

		for(k in refs_tmp2) {

			this._parent._parent.container.removeChild(refs_tmp2[k]);
			this._parent._parent.container.appendChild(refs_tmp2[k]);

		}

		// ...

		return true;

	};
	data_set.objects.sort.apply=function(criteria,type) {

		this.type.apply(type);

		this.criteria.apply(criteria);

	};

  }

  // data_set.msgData [ optional ]
  //
  // an message to display into data_set.objects.container when there are no data_set objects to display.
  //
  // p2[6][0]	-	string		- msg element container type, usually is "p".
  // p2[6][1]	-	string		- msg element container className.
  // p2[6][2]	-	string		- msg text.

  if(p2[6]) {

	data_set.msgData=new Object(); // optional
	data_set.msgData._parent=data_set;
	data_set.msgData.container=new Object();
	data_set.msgData.container.type=p2[6][0];
	data_set.msgData.container.id="myuserobjs_"+p1+"_msg_container";
	data_set.msgData.container.className=p2[6][1];
	data_set.msgData.text=p2[6][2];
	data_set.msgData.check=function() {

		var obj;

		if(!this._parent.objects.refs.length) {

			obj=document.createElement(this.container.type);
			obj.id=this.container.id;
			obj.className=this.container.className;
			obj.innerHTML=this.text;

			this._parent.objects.container.appendChild(obj);

		}
		else {

			if(obj=document.getElementById(this.elementId))
			 this._parent.objects.container.removeChild(obj);

		}

	};

  }

  // data_set.objects.basicalProcessing [ optional ]
  //
  // p2[7]		-	function	- should accept 1 parameter,,, this is called when a new object is created...
  //						  like " myUserObjs('create_obj','data_set_name',obj_data); ", passing data_set object as first parameter.

  if(p2[7])
   data_set.objects.basicalProcessing=p2[7];

  // data_set.objects.setDataProcessing [ optional ]
  //
  // p2[8]		-	function	- should accept 2 parameters,,, this is called when a new object is created
  //						- like " myUserObjs('create_obj','data_set_name',obj_data); ", passing data_set object as first parameter and "obj_data" as second parameter.
  //
  // notes ::
  //
  // - additionally can be used in future times to modify object data dinamically, any data_set object counts with the "._setData() " method, check doc [ op=="create_obj" ] for details.

  if(p2[8])
   data_set.objects.setDataProcessing=p2[8];

  // data_set.objects.echoFunctions [ optional ]
  //
  // when a data_set object is created - like " myUserObjs('create_obj', ...) " - the object is enriched with a lot of useful properties / functions, in these functions we can call one function at start / end of his execution,,, basically this is the essence of echoFunctons characteristic.
  //
  // p2[9][0]	-	array		- contains array-elements where element...
  //						  - 0 = echo-function association name
  //						  - 1 = [ optional, can use a null value ] echo-function at start
  //						  - 2 = [ optional, can use a null value ] echo-function at end
  //
  // notes ::
  //
  // - check ' myUserObjs("create_obj", ...) ' for available echo-function associations.

  if(p2[9]) {

  data_set.objects.echoFunctions=new Object();
  data_set.objects.echoFunctions.data=p2[9];
  data_set.objects.echoFunctions.handler=function(obj,association,mode) {

	if(!this.data)
	 return false;

	var k, data;

	for(k in this.data)
	 if(association==this.data[k][0])
	  { data=this.data[k];  break; }

	if(!data)
	 return false;

	var i=(mode=="start") ? 1 : 2 ;

	if(typeof(data[i])!="function")
	 return false;
	else
	 { data[i](obj);  return true; }

  };

  }

  if(p2[10]) {

  // data_set.specialSequenceProcesses
  //
  // a useful-methods-pack to allow to define / execute processes that can work with all / selected data_set objects one_at_time / all_at_time... with a lot of default useful characteristics !!
  //
  // a sample of this can be the gmail user-interface - @t 2007 - ::
  //		- you select some e-mails - checkbox -
  //		- you click a button
  //		- a process is realizated [ apply filter, mark as spam, deleting, etc ]
  //
  // to use this, you only can learn the "data_set.specialSequenceProcesses.insertion()" method.... yeah, only 1 fucken method !!		ˇˇ OMFL !!
  //
  //	params ::
  //
  // p2[10]	-	can be an boolean value, indicating if this feature is enabled in the data_set...
  //				OR
  //				can be an array, indicating the enabling of this feature in the data_set and the special-sequence-processes [ array-values ] to insert with " data_set.specialSequenceProcesses.insertion() "
  //
  // notes ::
  //
  // - one way to insert special-sequence-processes is calling to " data_set.specialSequenceProcesses.insertion() ",,, an short way to do this is using " myUserObjs('data_set_qfc','data_set_name','special_sequence_processes_insertion',...) " [ QuickFunctionCall ], check doc for details.

  data_set.specialSequenceProcesses=new Object();
  data_set.specialSequenceProcesses._parent=data_set;
  data_set.specialSequenceProcesses.status=0;
  // possible values...
  // 0 = inactive
  // 1 = active [ at least one process stay queued, confirmating, executing or aborting ]
  data_set.specialSequenceProcesses.execution=new Object();
  data_set.specialSequenceProcesses.execution._parent=data_set.specialSequenceProcesses;
  data_set.specialSequenceProcesses.execution.refs=[];
  data_set.specialSequenceProcesses.execution.existRef=function(process) {

	var i;

	for(i=0;i<this.refs.length;i++)
	 if(this.refs[i]==process)
	   { break; }

	return (i==this.refs.length) ? false : i ;

  };
  data_set.specialSequenceProcesses.execution.insertRef=function(process) {

	if(!process || this._parent.exist(process)===false || this.existRef(process)!==false)
	 return false;

	this.refs.push(process);

	this.check();

	return true;

  };
  data_set.specialSequenceProcesses.execution.deleteRef=function(process) {

	if(!process)
	 return false;

	var k, refs=[];

	for(k in this.refs)
	 if(this.refs[k]!=process)
	  { refs.push(this.refs[k]); }

	if(this.refs.length!=refs.length)
	 { this.refs=refs;  return true; }
	else
	 return false;

  };
  data_set.specialSequenceProcesses.execution.check=function() {

	var k, process_ready, process_inqueue, process_confirmating, process_executing, process_aborting;

	for(k in this.refs) {

	 if(!process_ready && this.refs[k].status==0)
	  process_ready=this.refs[k];
	 else if(!process_inqueue && this.refs[k].status==1)
	  process_inqueue=this.refs[k];
	 else if(!process_confirmating && this.refs[k].status==2)
	  process_confirmating=true;
	 else if(!process_executing && this.refs[k].status==3)
	  process_executing=true;
	 else if(!process_aborting && this.refs[k].status==4)
	  process_aborting=true;

	}

	if(process_inqueue && !process_confirmating && !process_executing && !process_aborting)
	 { var process=process_inqueue; }
	else if(process_ready)
	 { var process=process_ready; }
	else if(!process_confirmating && !process_executing && !process_aborting)
	 { this.finish();  return; }
	else
	 return;

	if(process.status==0 && process.canQueue && (process_confirmating || process_executing || process_aborting))
	 { process.setStatus(1);  return; }

	var refs_selected=process.refsCollector();

	if(  !refs_selected.length
		 || ( process.texts && process.texts[0] && process.setStatus(2) &&
				(!confirm(process.texts[0].replace("%objs_selected%",refs_selected.length)) || process.status==4) )  )
	 { process.setStatus(4);  process.finish();  return; }

	this._parent.status=1;

	process.setStatus(3);
	process.refs=refs_selected;
	process.errorMsgs=[];

	process.kontinue();

  };
  data_set.specialSequenceProcesses.execution.finish=function() {

	this.refs=[];
	this._parent.status=0;

  };
  data_set.specialSequenceProcesses.storage=[];
  data_set.specialSequenceProcesses.exist=function(process) {

	var i;

	for(i=0;i<this.storage.length;i++)
	 if(this.storage[i]==process)
	  { break; }

	return (i==this.storage.length) ? false : i ;

  };
  data_set.specialSequenceProcesses.insertion=function(data) {

	// note ::
	//
	// if u want a explanation about "dat_set.specialSequenceProcesses" is, go to object definition [ up ].
	//
	// params ::
	//
	// data - array -
	//
	// 0	-	string		- name
	// 1	-	bool		- queue enabled?
	//				  - useful only if at least 2 processes are defined.
	//				  - if true, the process is queued if exists processes stay currently on queue, confirmating, executing or aborting OR executed if not.
	//				  - if false, the process is executed at the moment.
	// 2	-	function	- refs-collector conditional
	//				  - sample :: 34 object-refs exists, this function be executed 34 times, each one passing as first parameter one object-ref, the function should return true or false depending if the object-ref should be get in count or not in the process execution.
	// 3	-	string		- refs-processing mode, when the process is executed, how the refs are passed ::
	//				  "one_at_time"	- the process-code [ param #6 ] is executed various-times passing as first parameter one object-reference until not exists more.
	//				  "all_at_time"	- the process-code [ param #6 ] is executed only one-time passing as first parameter one array containing all the objects-references.
	// 4	-	string		- execution mode ::
	//				  "synchronical"	- the process is handled "automatically"...
	//				  "asynchronical"	- the process is handled "some-manually"...
	//							  explanation ::
	//
	//								step-1	-	process.start()
	//								step-2*	-	process.kontinue()
	//								step-3*	-	process.kontinue2ndStep(returned_value)
	//								step-4	-	process.finish()
	//
	//								- step-2 and step-3 is a cycle, and is repeated depending of the refs-processing mode.
	//								- in "synchronical" mode, "process.kontinue()" execute process-code [ param #6 ] and with the returned value calls to "process.kontinue2ndStep()"
	//								- in "asynchronical" mode, "process.kontinue()" execute process-code [ param #6 ], but process-code is responsible to call to "process.kontinue2ndStep()" passing the returned_value as first-parameter.
	//									- to call "process.kontinue2ndStep()", first should get the process [ check "data_set_qfc" operation ].
	//									- a sample of "asynchronical" mode use is when your process-code do an asynchronous ajax-request.
	// 5	-	array		- abort options...
	//	0	-	bool		- on queue?
	//	1	-	bool		- on confirmation? - rarely used, but helps to block abort [ like a background process, if u make ] of an process when the same is waiting for the user confirmation -
	//	2	-	bool		- on execution?
	// 6	-	function	- process-code, this function is executed in 2 ways, depending of the value of refs-processing mode...
	//				  - refs-processing mode == "one_at_time" :: the function is executed various times, where each time a object-reference is passed as first-parameter, and this should return true if success or a string indicating the error msg.
	//				  - refs-processing mode =="all_at_time" :: the function is executed only one-time, where all object-references are passed as first-parameter, and this should return true if success or an array containing the error msgs.
	// 7	-	array		- texts [ optional, can use a null value if want to skip ]
	//	0	-	string		- confirmation to start process, sample :: "sure to delete %objs_selected% objects?"
	//					  - use a empty string if u dont need confirmation.
	//	1	-	string		- if errors occurs, sample :: "multiple objects deleting, errors ::\n\n%errors%"
	//					  - use a empty string if u dont need show errors.
	// 8	-	array		- control process-caller [ optional, can use a null value if want to skip ]
	//	0	-	reference	- to an html-element [ properties are dinamically changed, check next 2 params ]
	//	1	-	array		- class names.*
	//	2	-	array		- titles.*
	//
	//	* class names explanation :: define required elements depending of your process [ get in count specially "refs-processing mode", "queue enabled?" and "abort options" ] ::
	//		0	-	string		- process ready - to execute -
	//		1	-	string		- process queued
	//		2	-	string		- process confirmation [ required but optional ] - waiting for user "ok" or "cancel" decision -...
	//						  - can use a empty string if u want to use the previous className.
	//		3	-	string		- process executing
	//		4	-	string		- process aborting
	//
	//	* class names sample :: queue is enabled, and 3 abort options are true.
	//		0	-	"control controlReady"
	//		1	-	"control controlQueued"
	//		2	-	"control controlConfirmating" OR ""
	//		3	-	"control controlExecuting"
	//		4	-	"control controlAborting"
	//
	//	* titles explanation :: check "class names explanation", basically is the same... except in the element # 2, check sample of this...
	//
	//	* titles sample :: queue is enabled, and 3 abort options are true.
	//		0	-	" apply filter "
	//		1	-	" apply filter - process queued, click to abort - "
	//		2	-	" apply filter, waiting for user confirmation... "
	//				- is recommended use a empty string because the user can't appreciate this why the confirm() box dont allow.
	//		3	-	" applying filter... - click to abort - "
	//		4	-	" aborting application of filter... "

	// strict validation = minor or null error probabilities

	if( !data || typeof(data)!="object"
		|| (!data[0] || typeof(data[0])!="string")
		|| typeof(data[1])!="boolean"
		|| typeof(data[2])!="function"
		|| (data[3]!="one_at_time" && data[3]!="all_at_time")
		|| (data[4]!="synchronical" && data[4]!="asynchronical")
		|| (typeof(data[5])!="object" || typeof(data[5][0])!="boolean" || typeof(data[5][1])!="boolean" || typeof(data[5][2])!="boolean")
		|| typeof(data[6])!="function" 
		|| (data[7] && typeof(data[7])!="object")
		|| (data[8] && typeof(data[8])!="object")
		|| this.exist(data[0])!==false )
	 return false;

	// object creation

	var process=new Object();

	process.name=data[0];

	// ... available status
	// 0	-	ready
	// 1	-	queued
	// 2	-	confirmating
	// 3	-	executing
	// 4	-	aborting
	process.status=0;
	process.setStatus=function(status) {

		if(this.status!=status) {

		 this.status=status;

		 data_set.specialSequenceProcesses.checkControlTo(this,"dinamic");

		}

		return true;

	};

	process.canQueue=data[1];
	process.refsCollectorConditional=data[2];
	process.refsProcessingMode=data[3];
	process.refs=null;

	if(process.refsProcessingMode=="one_at_time")
	 process.refsIndex=-1;

	process.executionMode=data[4];
	process.canAbort=new Object();
	process.canAbort.onQueue=data[5][0];
	process.canAbort.onConfirmation=data[5][1];
	process.canAbort.onExecution=data[5][2];
	process.code=data[6];
	process.texts=data[7];
	process.errorMsgs=[];

	if(data[8]) {

	 process.control=new Object();
	 process.control.ref=data[8][0];
	 process.control.classes=data[8][1];
	 process.control.titles=data[8][2];
	 process.control.check=function(type) {

		return data_set.specialSequenceProcesses.checkControlTo(process,type);

	};

	}
	else
	 process.control=null;

	// next functions are a short-way to execute the "real process"

	process.start=function() {

		return data_set.specialSequenceProcesses.startTo(this);

	};
	process.kontinue=function() {

		return data_set.specialSequenceProcesses.kontinueTo(this);

	};
	process.kontinue2ndStep=function(returned_value) {

		return data_set.specialSequenceProcesses.kontinue2ndStepTo(this,returned_value);

	};
	process.abort=function() {

		return data_set.specialSequenceProcesses.abortTo(this);

	};
	process.finish=function() {

		return data_set.specialSequenceProcesses.finishTo(this);

	};
	process._delete=function() {

		return data_set.specialSequenceProcesses.deleteTo(this);

	};
	process.refsCollector=function() {

		return data_set.specialSequenceProcesses.refsCollectorOf(this);

	};
	process.displayErrorMsgs=function() {

		return data_set.specialSequenceProcesses.displayErrorMsgsOf(this);

	};

	// additional processes

	this.storage.push(process);

	if(data[8])
	 process.control.check("basic");

	// ...

	return true;

  };
  data_set.specialSequenceProcesses.getTo=function(property,value) {

	if(property==undefined || value==undefined)
	 return false;

	var i;

	eval(" for(i=0;i<this.storage.length;i++) if(this.storage[i]."+property+"==value) { break; } ");

	return (i!=this.storage.length) ? this.storage[i] : false ;

  };
  data_set.specialSequenceProcesses.startTo=function(process) {

	return this.execution.insertRef(process);

  };
  data_set.specialSequenceProcesses.kontinueTo=function(process) {

	if(!process)
	 { this.execution.check();  return false; }

	if(process.refsProcessingMode=="one_at_time")
	 {
	  process.refsIndex++;

	  var ref;

	  if( process.status==4 || !(ref=process.refs[process.refsIndex]) )
	   return process.finish();

	  var returned_value=process.code(ref);
	 }
	else
	 {
	  var returned_value=process.code(process.refs);
	 }

	if(process.executionMode=="synchronical")
	 return process.kontinue2ndStep(returned_value);
	else
	 return true;

  };
  data_set.specialSequenceProcesses.kontinue2ndStepTo=function(process,returned_value) {

	if(!process)
	 { this.execution.check();  return false; }

	if(process.refsProcessingMode=="one_at_time")
	 {
	  if(returned_value!==true)
	   process.errorMsgs.push( !returned_value ? "unknown" : returned_value );

	  return process.kontinue();
	 }
	else
	 {
	  if(returned_value!==true)
	   process.errorMsgs=returned_value;

	  return process.finish();
	 }

  };
  data_set.specialSequenceProcesses.abortTo=function(process) {

	if(!process || this.execution.existRef(process)===false)
	 return false;

	if(process.status==1)
	 return (process.canAbort.onQueue && process.setStatus(4) && process.finish()) ? true : false ;
	else if(process.status==2)
	 return (process.canAbort.onConfirmation && process.setStatus(4)) ? true : false ;
	else if(process.status==3)
	 return (process.canAbort.onExecution && process.setStatus(4)) ? true : false ;
	else if(process.status==4)
	 return true;
	else
	 return false;

  };
  data_set.specialSequenceProcesses.finishTo=function(process) {

	if(!process || this.execution.existRef(process)===false)
	 return false;

	process.displayErrorMsgs();

	this.execution.deleteRef(process);

	process.setStatus(0);
	process.refs=null;

	if(process.refsProcessingMode=="one_at_time")
	 process.refsIndex=-1;

	process.errorMsgs=[];

	this.execution.check();

	return true;

  };
  data_set.specialSequenceProcesses.deleteTo=function(process) {

	if(!process || this.execution.existRef(process)!==false)
	 return false;

	var k, storage=[];

	for(k in this.storage)
	 if(this.storage[k]!=process)
	  { storage.push(this.storage[k]); }

	if(this.storage.length!=storage.length)
	 { this.storage=storage;  return true; }
	else
	 return false;

  };
  data_set.specialSequenceProcesses.checkControlTo=function(process,type) {

	if(!process || !process.control)
	 return false;

	if(type=="basic") {

	 process.control.ref.href='javascript: void(0); ';
	 process.control.ref.innerHTML='&nbsp;';

	 return this.checkControlTo(process,"dinamic");

	}
	else if(type=="dinamic") {

	 if(process.status!=2 || process.control.classes[2]) {

		eval(' var i=process.status, code=function() { myUserObjs("data_set_qfc","'+p1+'","special_sequence_processes_get_to","name","'+process.name+'").'+( process.status==0 ? 'start()' : 'abort()' )+'; }; ');

		process.control.ref.className=process.control.classes[i];
		process.control.ref.title=process.control.titles[i];	
		process.control.ref.onclick=code;

	 }

	 return true;

	}
	else
	 return false;

  };
  data_set.specialSequenceProcesses.refsCollectorOf=function(process) {

	if(!process)
	 return [];

	var k, refs=this._parent.objects.refs, refs_selected=[];

	for(k in refs)
	 if(process.refsCollectorConditional(refs[k]))
	  { refs_selected.push(refs[k]); }

	return refs_selected;

  };
  data_set.specialSequenceProcesses.displayErrorMsgsOf=function(process) {

	if(!process)
	 return false;

	if(process.texts && process.texts[1] && process.errorMsgs.length)
	 alert(process.texts[1].replace("%errors%",process.errorMsgs.join("\n\n")));

	return true;

  };

  }

  // initialization processes

  if(data_set.objects.looks)
   data_set.objects.looks.apply(p2[4][1]);

  if(data_set.objects.sort)
   data_set.objects.sort.apply(p2[5][1],p2[5][2]);

  if(typeof(p2[10])=="object")
   { var k;  for(k in p2[10]) data_set.specialSequenceProcesses.insertion(p2[10][k]); }

  // use setTimeout() because in most of cases when a data_set is inserted, justly some miliseconds after, a data_set object is created and inserted

  if(data_set.msgData)
   setTimeout(" myUserObjs('get_data_set','"+p1+"').msgData.check() ",300);

  // ...

  return true;
 }
else if(op=="exist_data_set?")
 {
  // usage ::
  //
  // help to check if a data_set exists
  //
  // params ::
  //
  // p1	-	string		- data_set name
  //
  // returns ::
  //
  // a data_set index if success, false if fail.

  var k;

  for(k=0;k<myUserObjsVars.dataSets.length;k++)
   if(myUserObjsVars.dataSets[k][0]==p1)
    { break; }

  return (k!=myUserObjsVars.dataSets.length) ? k : false ;
 }
else if(op=="get_data_set")
 {
  // usage ::
  //
  // help to get a data_set
  //
  // params ::
  //
  // p1	-	string		- data_set name
  //
  // returns ::
  //
  // a data_set reference if success, false if fail.

  var k=myUserObjs("exist_data_set?",p1);

  return (k!==false) ? myUserObjsVars.dataSets[k][1] : false ;
 }
else if(op=="delete_data_set")
 {
  // usage ::
  //
  // help to delete a data_set
  //
  // params ::
  //
  // p1	-	string		- data_set name
  //
  // returns ::
  //
  // true if success, false if fail.

  var k, data_sets_tmp=[];

  for(k in myUserObjsVars.dataSets) {

   if(myUserObjsVars.dataSets[k][0]!=p1)
    data_sets_tmp.push(myUserObjsVars.dataSets[k]);
   else
    myUserObjsVars.dataSets[k]=null;

  }

  if(myUserObjsVars.dataSets.length!=data_sets_tmp.length)
   { myUserObjsVars.dataSets=data_sets_tmp;  return true; }
  else
   return false;
 }
else if(op=="data_set_qfc")
 {
  // data_set_QuickFunctionCall
  //
  // usage ::
  //
  // a data_set had a lot of properties and functions, in this case this op helps to you to execute most common functions.
  //
  // params ::
  //
  // p1	-	string		- data_set name
  // p2	-	string		- data_set short function name
  // p3	-	mixed		- [ optional ] 1st param of the function
  // p4	-	mixed		- [ optional ] 2nd param of the function
  //
  // returns ::
  //
  // depends of the function to execute, but if fail returns false.

  var data_set=myUserObjs("get_data_set",p1);

  if(!data_set)
   return false;

  if(p2=="objs_sort_apply" && data_set.objects.sort)
   return data_set.objects.sort.apply(p3,p4);
  else if(p2=="objs_look_apply" && data_set.objects.looks)
   return data_set.objects.looks.apply(p3);
  else if(p2=="special_sequence_processes_insertion")
   return (data_set.specialSequenceProcesses) ? data_set.specialSequenceProcesses.insertion(p3) : false ;
  else if(p2=="special_sequence_processes_get_to")
   return (data_set.specialSequenceProcesses) ? data_set.specialSequenceProcesses.getTo(p3,p4) : false ;
  else
   return false;
 }
else if(op=="create_obj")
 {
  // usage ::
  //
  // create an object of the specified data_set.
  //
  // params ::
  //
  // p1	-	string		- data_set name
  // p2	-	mixed		- [ optional ] to be passed as second parameter to "data_set.objects.setDataProcessing()" - if defined -, check doc for details.
  //
  // notes ::
  //
  // - a lot of additional object attributes/functions are lost if we try cloneNode using "obj.cloneNode()", because  attribs/functions are defined without using DOM "obj.setAttribute()" function, because is more practic and some other reasons.
  //
  //
  // returns ::
  //
  // a object-reference if success, false if fail.

  if(!p1 || typeof(p1)!="string")
   return false;

  var data_set=myUserObjs("get_data_set",p1);

  if(!data_set)
   return false;

  var obj=document.createElement(data_set.objects.type);

  obj._dataSetName=p1;
  obj._dataSetRef=data_set;

 if(data_set.objects.status) {

	obj._status=new Object();
	obj._status._parent=obj;
	obj._status.value=(data_set.objects.status.d3fault) ? data_set.objects.status.d3fault : [] ;

  }

  // echoFunctionsHandler?,,, check data_set doc about "echoFunctions" characteristic.

  obj._echoFunctionsHandler=function(association,mode) {

	return (this._dataSetRef.objects.echoFunctions) ? this._dataSetRef.objects.echoFunctions.handler(this,association,mode) : false ;

  };

  // additional-useful object functions,,, apply to "echoFunctions" data_set characteristic.

  obj._initialize=function() {

	this._echoFunctionsHandler("_initialize","start");

	this._setClass();

	this._echoFunctionsHandler("_initialize","end");

  };

  obj._deinitialize=function() {

	this._echoFunctionsHandler("_deinitialize","start");

	this._echoFunctionsHandler("_deinitialize","end");

  };

  obj._setClass=function() {

	this._echoFunctionsHandler("_setClass","start");

	var class_name=[];

	if(this._dataSetRef.objects.basicClass)
	 class_name.push( this._dataSetRef.objects.basicClass );

	if(this._dataSetRef.objects.status) {

		var k;

		for(k in this._status.value)
		 class_name.push( this._dataSetRef.objects.status.getClass(this._status.value[k]) );

	}

	if(this._dataSetRef.objects.looks)
	 class_name.push( this._dataSetRef.objects.looks.currentClass );

	if(class_name.length)
	 this.className=class_name.join(" ");

	this._echoFunctionsHandler("_setClass","end");

  };

  if(data_set.objects.status) {

	obj._status.had=function(status) {

		var k;

		for(k=0;k<this.value.length;k++)
		 if(this.value[k]==status)
		  { break; }

		return (k!=this.value.length) ? true : false ;

	};

	obj._status.set=function(status,impose) {

		if(typeof(impose)=="undefined")
		 return false;

		this._parent._echoFunctionsHandler("_status_set","start");

		if(!impose)
		 this.value.push(status);
		else
		 this.value=[status];

		this._parent._setClass();

		this._parent._echoFunctionsHandler("_status_set","end");

		return true;

	};

	obj._status.replace=function(status,status_new) {

		this._parent._echoFunctionsHandler("_status_replace","start");

		// same logic of " had() " method

		var k;

		for(k=0;k<this.value.length;k++)
		 if(this.value[k]==status)
		  { break; }

		// ...

		var cond=(k!=this.value.length) ? true : false ;

		if(cond) {

			this.value.splice(k,1,status_new);

			this._parent._setClass();

		}

		this._parent._echoFunctionsHandler("_status_replace","end");

		return cond;

	};

	obj._status.remove=function(status) {

		this._parent._echoFunctionsHandler("_status_remove","start");

		// same logic of " had() " method

		var k;

		for(k=0;k<this.value.length;k++)
		 if(this.value[k]==status)
		  { break; }

		// ...

		var cond=(k!=this.value.length) ? true : false ;

		if(cond)
		 this.value.splice(k,1);

		this._parent._setClass();

		this._parent._echoFunctionsHandler("_status_remove","end");

		return cond;

	};

  }

  if(data_set.objects.sort) {

	obj._sortCriteriaValueUpdate=function(reorder_all_objects) {

		this._echoFunctionsHandler("_sortCriteriaValueUpdate","start");

		if(reorder_all_objects)
		 this._dataSetRef.objects.sort.apply();

		this._echoFunctionsHandler("_sortCriteriaValueUpdate","end");

	};

  }

  if(data_set.objects.setDataProcessing) {

	obj._setData=function(data) {

		this._echoFunctionsHandler("_setData","start");

		this._dataSetRef.objects.setDataProcessing(this,data);

		this._echoFunctionsHandler("_setData","end");

	};

  }

  obj._delete=function(mode,_confirm) {

	this._echoFunctionsHandler("_delete","start");

	if(!this._dataSetRef.objects.refsHandler("delete",this))
	 return false;

	this._echoFunctionsHandler("_delete","end");

	return true;

  };

  // ...

  if(data_set.objects.basicalProcessing)
   data_set.objects.basicalProcessing(obj);

  if(obj._setData)
   obj._setData(p2);

  return obj;
 }
else if(op=="insert_obj")
 {
  // usage ::
  //
  // inserts an object in their data_set.refsContainer
  //
  // params ::
  //
  // p1	-	reference	- data_set object
  //
  // returns ::
  //
  // true if success, false if fail.

  return (p1 && typeof(p1)=="object" && p1._dataSetRef) ? p1._dataSetRef.objects.refsHandler("insert",p1) : false ;
 }
else if(op=="delete_obj")
 {
  // usage ::
  //
  // delete an object of their data_set.refsContainer
  //
  // params ::
  //
  // p1	-	reference	- data_set object
  //
  // returns ::
  //
  // true if success, false if fail.

  return (p1 && typeof(p1)=="object" && p1._dataSetRef) ? p1._dataSetRef.objects.refsHandler("delete",p1) : false ;
 }
}