
/*!
 * jQuery UI Widget-factory plugin boilerplate (for 1.8/9+)
 * Author: @addyosmani
 * Further changes: @peolanha
 * Licensed under the MIT license
 *http://jqueryui.com/demos/widget/
 TIMER
 http://bililite.com/blog/extending-jquery-ui-widgets/ GUTE ADDRESSE
 */
;(function ( $, window, document, undefined ) {



//########################################################## Dataelement2 ############################################################################################## 
/*  ! ... CE. Dataelement ........................................................................................ (Bookmark for Coda)  */    


function clone(obj) {
    // Handle the 3 simple types, and null or undefined
    if (null == obj || "object" != typeof obj) return obj;

    // Handle Date
    if (obj instanceof Date) {
        var copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
    }

    // Handle Array
    if (obj instanceof Array) {
        var copy = [];
        for (var i = 0; i < obj.length; ++i) {
            copy[i] = clone(obj[i]);
        }
        return copy;
    }

    // Handle Object
    if (obj instanceof Object) {
        var copy = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
        }
        return copy;
    }

    throw new Error("Unable to copy obj! Its type isn't supported.");
}

function encodeUmlaute(mystring)
{
	

	return mystring;
}

    
    
    $.widget( 'CE.DataElement' , {
        options: { //json array: JSON is a subset of the object literal notation of JavaScrip
              	DataMapping:[],
              	//Zuweisen DataMapping: [{DataTableName:'A',DataID: 'B', DataAttributes: ['Name_DataAttribute1','Name_MappedAttribute1','Name_DataAttribute2','Name_MappedAttribute2']},{DataTableName:'B',DataID: 'A', DataAttributes: ['Name_DataAttribute1','Name_MappedAttribute1','Name_DataAttribute2','Name_MappedAttribute2alsdjflkad']}],
              	//Nutzen o.DataMapping[0]['DataAttributes'][1]
                ArrayMonitoredAttributes:[], //zum effizienten Speichern
                DataConstraints:[], // Zusatzbedingungen zum getDataFromDatatable bezogen auf die Tabelle
                                
                DataMappingBetweenDataElements:[], //Zusatzbedingungen, zum Verlinken von Elementen mit Aktiven Attributen
                //DataMappingBetweenDataElements:[{UpdateAttribut:'data_DataID', MappedAttribute:'activeItem', sendData:true, getData:false, needForGettingData: false}];
                last_change_number:0,
                ObjName: '',
                isTableElement: false, // Tabellen Elemente beziehen sich statt auf das Row Element auf die TableElemente, zum Beispiel Tabellen,
                debug_it:false
        },
        _create: function () {},
        _init: function(){
			this._initDataElement();
        },
        _initDataElement: function()
        {
        	var w=this, e=w.element, o=w.options;
			
			o.DataMapping=clone(o.DataMapping);
			o.ArrayMonitoredAttributes=clone(o.ArrayMonitoredAttributes);
			o.DataConstraints=clone(o.DataConstraints);
			o.DataMappingBetweenDataElements=clone(o.DataMappingBetweenDataElements);
			
        	w._initArrayMonitoredAttributes();
        	
        	e.addClass('WidgetDatabaseElement');   
        	
        	e.bind('getDataFromDatatables', function(event)
        	{
        		w._getDataFromDatatables();
        		event.stopPropagation();

        	});
        	
        	e.bind('sendDataToDatatables', function(event, tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted)
        	{
        		w._sendDataToDatatables(tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted);
        		event.stopPropagation();
        	}); 
        	
        	e.bind('getDataFromOtherDataElements', function(event, param1, param2)
        	{
        		w._getDataFromOtherDataElements(param1, param2);
        		event.stopPropagation();
        	});
        	
        	e.bind('sendDataToOtherDataElements', function(event, param1, param2)
        	{
        		w._sendDataToOtherDataElements(param1, param2);
        		event.stopPropagation();
        	});
        	
        	
        	
        },
        _deleteElement: function() // for the first Element
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;   
        	debug(o.ObjName+': DELETE ITEM', false, o.debug_it);     	
        	//w._commitDataToDatatables('is_deleted', true, 0, 0, true, '', true); 
        	w._sendDataToDatatables(d[0]['DataTableName'], d[0]['DataID'],'is_deleted', true, 0, 0, true, '', true)
        	
        	 //key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted
        },
        _cloneElement: function() // for the first Element
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;   
        	var neItemID=$("#db_datatables").parent().Datatable("createNewElement", d[0]['DataTableName'], d[0]['DataID']);	
        	return neItemID;
        },
        _createNewElement: function(withMappedAttributes, withConstraints, withGlobalAttributes, setAttributesArray, cloneDataID) // for the first Element
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes, m=o.DataMappingBetweenDataElements, c=o.DataConstraints, sA=setAttributesArray;    
        	
        	if(cloneDataID!=undefined)
        	{	
        		var neItemID=$("#db_datatables").parent().Datatable("createNewElement", d[0]['DataTableName'], cloneDataID);
        		debug(o.ObjName+ 'createElement - Cloning ....('+cloneDataID+')', true, o.debug_it);	
        	}else
        	{
        		var neItemID=$("#db_datatables").parent().Datatable("createNewElement", d[0]['DataTableName']);
        		debug(o.ObjName+ 'createElement - Creating ....('+cloneDataID+')', true, o.debug_it);
        	}
        	
        	
        	if((withConstraints)&&(c!='' && c!=undefined && c.length>0))
        		{
        			debug(o.ObjName+ ' createElement ....withConstraints', true, o.debug_it);
        			
        			for(var i=0; i<c.length; i=i+2)
        			{
        				w._sendDataToDatatables(d[0]['DataTableName'],neItemID,c[i],c[i+1],1,0, false, false, false);    
        				debug(o.ObjName+ 'createElement Constrain ....('+c[i]+'->'+c[i+1]+')', true, o.debug_it) 		
        			}	
        		}
        	
        	
        	if(sA!='' && sA!=undefined && sA.length>0)
        		{
        			debug(o.ObjName+ ' createElement ....withSetAttributes', true, o.debug_it);
        		
        			for(var i=0; i<sA.length; i=i+2)
        			{
        				w._sendDataToDatatables(d[0]['DataTableName'],neItemID,sA[i],sA[i+1],1,0, false, false, false);    
        				
        				debug(o.ObjName+ ' createElement Attr....('+sA[i]+'->'+sA[i+1]+')', true, o.debug_it); 		
        			}	
        		}
        		
        	if(withGlobalAttributes && m!='' && m!=undefined && m.length>0 && !withMappedAttributes)
        		{
        			debug(o.ObjName+ ' createElement ....withGlobalAttributes ('+m.length+')'+m[1]['needForGettingData'], true, o.debug_it);
        		
        			for(var j=0; j<m.length; j++)
        			{
        				if(m[j]['needForGettingData'])
        				{
        					var MappedAttribut=m[j]['MappedAttribute'];
        					var MappedValue=o[MappedAttribut];
        					
        					debug(o.ObjName+ ' createElement ....withGlobalAttributes1 '+MappedAttribut+'>'+MappedValue+'>'+o.ActiveDataID, true, o.debug_it);
							
        					if(MappedValue!='' && MappedValue!=undefined)
        					{								
        						var MappingData=w._getMappingDataForAttribut(MappedAttribut);
        						
        						debug(o.ObjName+ ' createElement ....withGlobalAttributes2b '+MappedAttribut+'>'+MappedValue+'>'+MappingData[0][2], true, o.debug_it);

        						if(MappingData!=false && MappingData!=undefined)
        						{
        							for(var k=0; k<MappingData.length; k++)
        							{	
        								var related_Attribut=MappingData[k][2];
		
        								
        								w._sendDataToDatatables(d[0]['DataTableName'],neItemID,related_Attribut,MappedValue,1,0, false, false, false);    
        								debug(o.ObjName+ ' createElement3 ....('+related_Attribut+'->'+MappedValue+')', true, o.debug_it); 	
        							}
        						}
        					}
        			
        				}	      					
        			}	
        		}
        		
        	if(withMappedAttributes && d!='' && d.length>0)
        	{
        		debug(o.ObjName+ ' createElement1 ....withMappedAttributes ', true, o.debug_it);
        	
        		for(var j=0; j<d[i]['DataAttributes'].length; j=j+2)
        		{
        			var tmp_monitoredAttribut=d[i]['DataAttributes'][j+1];
        			var related_Attribut=d[i]['DataAttributes'][j];
        			var value_of_related_attribut=DataElement.attr(related_Attribut);
        							
        			//w.setOption(tmp_monitoredAttribut,value_of_related_attribut, true, false);
        			w._sendDataToDatatables(d[0]['DataTableName'],neItemID,related_Attribut,MappedValue,1,0, false, false, false);  
        			  
        			debug(o.ObjName+ ' createElement ....('+related_Attribut+'->'+MappedValue+')', true, o.debug_it); 	  
        		}
        	}	
      		 w._sendDataToDatatables(d[0]['DataTableName'],neItemID,'dada_DataID',neItemID,0,0, false, true, false);  
        	return neItemID;        	 
        },
         updateElement: function()
         {
         	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
         	w._getDataFromDatatables(true);
         }, //############################################################################################################################## 
        setDataID: function(DataID, ArrayIndex)
        {
        	var w=this, e=w.element, o=w.options;	
        	w._setDataID(DataID, ArrayIndex);
        },
        _setDataID: function(DataID, ArrayIndex)
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
        	debug(o.ObjName+' SET DATAID '+DataID+' alt:'+d[0]['DataID'], false, o.debug_it);
        	if(ArrayIndex!=undefined && ArrayIndex>=0)
        	{
        		d[ArrayIndex]['DataID']=DataID;
        	}else
        	{
        		for(var i=0; i<d.length; i++ )
        		{		
        			d[i]['DataID']=DataID;
        		} 
        	}
        	w._initArrayMonitoredAttributes();     
        },
        _setDataTableName: function(DataTableName, ArrayIndex)
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
        	debug(o.ObjName+' SET DataTableName '+DataTableName, false, o.debug_it);
        	if(ArrayIndex!=undefined && ArrayIndex>=0)
        	{
        		d[ArrayIndex]['DataID']=DataTableName;
        	}else
        	{
        		for(var i=0; i<d.length; i++ )
        		{		
        			d[i]['DataTableName']=DataTableName;
        		} 
        	}
        	w._initArrayMonitoredAttributes(); 
        },        
        _sendDataToDatatables: function(tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted)
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
        	
        	var last_change_number_global=$('#db_datatables').attr('last_change_number');
        	last_change_number_global++;
        	
        	w.setOption('last_change_number',last_change_number_global++, true, false);
        	
        	debug('<span class="debug_saving">'+o.ObjName+' - commitDataToDatatable('+tablename+' - '+dataid+') ('+key+' -> '+value+') - ('+CountToTrigger+','+TriggerTimeInMS+','+ IsImportantChange+')', true, o.debug_it);
        	
        	$("#db_datatables").parent().Datatable("commitDataChange", tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted); 
        
        },
         _inkrementChangeNumber: function()
         {
         	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
         	w.setOption('last_change_number',o.last_change_number+1);         
         },
          _getDataFromDatatables: function(without_looking_on_changenumbers)
         {	
         	
			var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
        		
        	var last_change_number_global=$('#db_datatables').attr('last_change_number');
        	var last_loadtime_global=$('#db_datatables').attr('last_load_time');
    	
        	var my_last_changenumber=Math.abs(o.last_change_number);
        	
        	var tmp_count_updates=0;
        	
        	
        	if(my_last_changenumber<last_change_number_global || without_looking_on_changenumbers)
        	{
        		for(var i=0; i<d.length; i++)
        		{
        			if(d[i]['DataTableName']!='' && d[i]['DataID']!='' && d[i]['DataAttributes'].length>0)
        			{
        				var DataElement=$('#db_datatables .data_table[DataTableName="'+d[i]['DataTableName']+'"] .data_row[data_DataID="'+d[i]['DataID']+'"]'+w._getConstrainString()).first();						
   						     				
        				if(DataElement.attr('last_change_number')>my_last_changenumber  || without_looking_on_changenumbers)
        				{
        					if(DataElement.attr('data_time_deleted')==last_loadtime_global || DataElement.attr('is_deleted')=='true')
        					{
        						//########################## TO DO ########################
        						//w.setOption('input_value','', true, false);
        						//w.setOption('DataID','', true, false);
        						debug(o.ObjName+' Item was deleted', false, o.debug_it);
        						w._trigger('DataElement_was_deleted');
        					}else
        					{
        						for(var j=0; j<d[i]['DataAttributes'].length; j=j+2)
        						{
        							var tmp_monitoredAttribut=d[i]['DataAttributes'][j+1];
        							var related_Attribut=d[i]['DataAttributes'][j];
        							var value_of_related_attribut=DataElement.attr(related_Attribut);
        							
        							w.setOption(tmp_monitoredAttribut,value_of_related_attribut, true, false);  
        							tmp_count_updates++;
        						}
        						
        						w._trigger('DataElement_was_updated');
        					}
        				}
        			}else
        			{
        				debug('Fehler: '+o.ObjName+' kann nicht updaten, weil keine Daten(A-'+d[0]['DataTableName']+' B-'+d[0]['DataID']+' C-'+d[0]['DataAttributes'].length+') vorhanden ist!!', false, o.debug_it);
        			}
        		}
				
        		if(tmp_count_updates>0)
        		{
        			var global_updates_elements_nr=$('#db_datatables').parent().Datatable('option','global_updates_elements');        			
        			$("#db_datatables").parent().Datatable('setOption','global_updates_elements', (global_updates_elements_nr+1));
        			debug('<span class="debug_jQ_Elements">'+o.ObjName+'(ID '+d[0]['DataID']+') - Use Data ('+tmp_count_updates+' mal)</span>',true, o.debug_it);
        		}else
        		{
        			debug('<span class="debug_jQ_Elements">'+o.ObjName+' - NOT Use Data!</span>',false, o.debug_it);
        		}
       		}else
       		{
       			debug('<span class="debug_jQ_Elements">'+o.ObjName+' - NOT Use Data, because of Changnummber ('+my_last_changenumber+'!<'+last_change_number_global+')</span>',false, o.debug_it);
       		}    		
        	w.setOption('last_change_number',last_change_number_global, true, false);  
        	w._afterGettingDataFromDatatables();	  
        },
        _afterGettingDataFromDatatables: function()
        {
        	//kann überschrieben werden
        
        },_getConstrainString: function() // NEXT To 
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes, m=o.DataMappingBetweenDataElements;
        	var res='';
        	//DataConstraints
        	if(o.DataConstraints!='' && o.DataConstraints!=undefined && o.DataConstraints.length>0)
        	{
        		for(var i=0; i<o.DataConstraints.length; i=i+2)
        		{
        			res=res+'['+o.DataConstraints[i]+'="'+o.DataConstraints[i+1]+'"]';
        		
        		}	
        	}
        	
        	for(var j=0; j<m.length; j++)
        	{
        		if(m[j]['needForGettingData'])
        		{
        			var MappedAttribut=m[j]['MappedAttribute'];
        			var MappedValue=o[MappedAttribut];

        			if(MappedValue!='' && MappedValue!=undefined)
        			{

        				var MappingData=w._getMappingDataForAttribut(MappedAttribut);

        				if(MappingData!=false && MappingData!=undefined)
        				{
        					for(var i=0; i<MappingData.length; i++)
        					{	
        						var related_Attribut=MappingData[i][2];
		
        						res=res+'['+related_Attribut+'="'+MappedValue+'"]';
        					}
        				}
        			
        			}else
        			{	
        				debug('<span class="debug_error">'+o.ObjName+' - NOT Use Constrain, because of missing MappedValue ('+MappedAttribut+':'+MappedValue+')</span>',true, o.debug_it);
        				return false;
        			}      		
        		}        	
        	}        	
        	
        	debug(o.ObjName+' Constrain '+res, true, o.debug_it);
        	
        	return res;
        },     
        _getDataFromOtherDataElements: function(UpdateAttribut,UpdateValue)
        {
        		var w=this, e=w.element, o=w.options;
			
				var MappingDataGlobal=w._getMappingDataForGlobalAttribute('',UpdateAttribut);
        	
        		if(MappingDataGlobal!=false && MappingDataGlobal!=undefined && UpdateValue!=undefined && UpdateAttribut!=undefined)
        		{
        			for(var i=0; i<MappingDataGlobal.length; i++)
        			{	
        				if(MappingDataGlobal[i][2]==true)
        				{
        					
        					
        					w.setOption(MappingDataGlobal[i][0],UpdateValue);
        					
        					if(MappingDataGlobal[i][3]==true)
        					{
        						debug(o.ObjName+ '-GETMappingDataGlobal('+UpdateAttribut+'-> '+MappingDataGlobal[i][0]+'='+UpdateValue+')', true, o.debug_it);
        						w._getDataFromDatatables(true);        					
        					}
        				}
        			}
        	   	}else
        		{
        			debug('<span class="debug_error">'+o.ObjName+' - Can NOT Map new setOption('+UpdateAttribut+'-> '+''+' -> '+UpdateValue+')</span>',false, o.debug_it);
        		}
        },
        _sendDataToOtherDataElements: function(UpdateAttribut,UpdateValue)
        {
        		var w=this, e=w.element, o=w.options;

        		debug(o.ObjName+ '-SendGlobalAttribute('+UpdateAttribut+','+UpdateValue+')', false, o.debug_it);
				$('.WidgetDatabaseElement').trigger('getDataFromOtherDataElements',[UpdateAttribut,UpdateValue]);
        		
        }, //############################################ SET OPTION ##################################################################################  
        destroy: function () { $.Widget.prototype.destroy.call(this); },        
        setOption: function ( key, value, animate, commitToDatabase ) 
        {
        	var w=this, e=w.element, o=w.options;
        	
        	debug(o.ObjName+' setOption('+key+','+o[key]+'->'+value+')', false, o.debug_it);
        	
        	if(key!=undefined && value!=undefined && o[key]!=value)
        	{
        		debug(o.ObjName+' setOption('+key+','+value+')', false, o.debug_it);
        		o.key=value;
        		
        		w._setOption(key, value);
        	}
        	
        	$.Widget.prototype._setOption.apply( this, arguments ); 
        	//http://bililite.com/blog/extending-jquery-ui-widgets/	
        },
        _initArrayMonitoredAttributes: function()
        {
        	// bsp o.DataMapping: [{DataTableName:'RatingSession',DataID: '', DataAttributes: ['data_SessionName','text','data_SessionGoal', 'content','data_DataID','id_text']}],
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
        	
        	o.ArrayMonitoredAttributes=[];
        	
        	for(var i=0; i<d.length; i++ )
        	{
        		
        		for(var j=0; j<d[i]['DataAttributes'].length; j=j+2)
        		{
        			var tmp_monitoredAttribut=d[i]['DataAttributes'][j+1];
        			var related_Attribut=d[i]['DataAttributes'][j];
        			var related_DataID=d[i]['DataID'];
        			var related_DataTableName=d[i]['DataTableName'];

        			o.ArrayMonitoredAttributes.push([tmp_monitoredAttribut,related_DataTableName,related_DataID, related_Attribut]);
        			debug(o.ObjName+ ' INIT+ArrayOfMonitoredAttributes('+o.ArrayMonitoredAttributes[0][0]+')', false, o.debug_it);
        		}
        	}      	  
        },
        _getMappingDataForAttribut: function(mappedAttribut)
        {
        	// BSP 
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes; 
        	var MappingData=[];
        	
        	debug('Mappingdata A.length('+a.length+')', false, o.debug_it);
        	
        	for(var i=0; i<a.length; i++)
        	{
        		//debug('Mappingdata Attribut('+a[i][0]+' == '+mappedAttribut+')', true);
        		if(a[i][0]==mappedAttribut)
        		{	
        			MappingData.push([a[i][1], a[i][2], a[i][3]]);
        		}
        	}
        	
        	if(MappingData.length>0)
        	{
        		return MappingData;
        	}else
        	{
        		return false;  
        	}	     
        },
        _getMappingDataForGlobalAttribute: function(mappedAttribut, updateAttribute)
        {
        	// BSP o.DataMappingBetweenDataElements:[{UpdateAttribut:'data_DataID', MappedAttribute:'activeItem', sendData:true, getData:false, needForGettingData: false}];
        	var w=this, e=w.element, o=w.options, m=o.DataMappingBetweenDataElements;
        	
        	var MappingData=[];
   	
        	for(var i=0; i<m.length; i++)
        	{
        		if(mappedAttribut!='' && m[i]['MappedAttribute']==mappedAttribut)
        		{		        			
        			MappingData.push([m[i]['UpdateAttribut'],m[i]['sendData'],m[i]['getData'],m[i]['needForGettingData']]);
        		}
        		else if(updateAttribute!='' && m[i]['UpdateAttribut']==updateAttribute)
        		{		        			
        			MappingData.push([m[i]['MappedAttribute'],m[i]['sendData'],m[i]['getData'],m[i]['needForGettingData']]);
        		}
        	}
        	
        	if(MappingData.length>0)
        	{
        		return MappingData;
        	}else
        	{
        		return false;  
        	}
        	
        
        },
        _setOption: function(key, value, isImportant)
        {
        	var w=this, e=w.element, o=w.options, d=o.DataMapping, a=o.ArrayMonitoredAttributes;  
        	var MappingData=w._getMappingDataForAttribut(key);

			debug(o.ObjName+'__setOption('+key+','+o[key]+'->'+value+')', false, o.debug_it);
			
        	if(MappingData!=false && MappingData!=undefined)// && o[key]!=value)
        	{
        		for(var i=0; i<MappingData.length; i++)
        		{	
        			var related_Attribut=MappingData[i][2];
        			var related_DataID=MappingData[i][1];
        			var related_DataTableName=MappingData[i][0];
		
        			debug(o.ObjName+' MappingData ('+key+'==>'+value+')'+MappingData[i][0]+'-'+MappingData[i][1]+'-'+MappingData[i][2], false, o.debug_it);
        			w._sendDataToDatatables(related_DataTableName, related_DataID, related_Attribut, value, 0, 0, (isImportant==true), false, false);
        		}
        	
        	}else
        	{
        		debug('<span class="debug_error">'+o.ObjName+' - Can NOT Map new setOption('+key+' -> '+value+') '+MappingData+'</span>',false, o.debug_it);
        	}
        	
        	
			var MappingDataGlobal=w._getMappingDataForGlobalAttribute(key,'');
        	
        	if(MappingDataGlobal!=false && MappingDataGlobal!=undefined && MappingDataGlobal.length>0)
        	{
        		for(var i=0; i<MappingDataGlobal.length; i++)
        		{	
					if(MappingDataGlobal[i][1]==true)
        			{
        				debug(o.ObjName+ '-SendMappingDataGlobal('+key+'-> '+MappingDataGlobal[i][0]+'='+value+')', false, o.debug_it);
        				w._sendDataToOtherDataElements(MappingDataGlobal[i][0],value);
        			}
        		}
        	
        	}else
        	{
        		debug('<span class="debug_error">'+o.ObjName+' - Can NOT GlobalMap new setOption('+key+' -> '+value+') '+MappingData+'</span>',false, o.debug_it);
        	}

        }      
    });



//########################################################## Datatable ############################################################################################## 
/*  ! ... CE. Datatable ........................................................................................ (Bookmark for Coda)  */





$.widget( "CE.Datatable" , {

        //Options to be used as defaults
        options: { 
                
               // TRIGGER zum SPEICHERN der DATEN               
                TRIGGER_SAVE_MAXCOUNT:0,                
                TRIGGER_SAVE_BY_INTERVALL_TIMER_inMS: 0,
                TRIGGER_SAVE_WITH_LEARNING_FUNCTION:true,  
                Trigger_SAVE_timer_is_activ:false, 
                Trigger_SAVE_count:0, 
                Trigger_SAVE_intervall_timer_start_new:false, 
                
                Last_Save_Time:0,
                Last_Save_ChangeNumber:0,
                
                // TRIGGER zum LADEN der DATEN    
                TRIGGER_LOAD_MAXCOUNT:30,                
                TRIGGER_LOAD_BY_INTERVALL_TIMER_inMS: 1000,
                TRIGGER_LOAD_WITH_LEARNING_FUNCTION:true,  
                Trigger_LOAD_timer_is_activ:false, 
                Trigger_LOAD_count:0, 
                Trigger_LOAD_intervall_timer_start_new:true,
               
                Last_Load_Time: 0,
                Last_Load_ChangeNumber:0,
                
                // TRIGGER zum NUTZEN der DATEN 
                TRIGGER_USE_MAXCOUNT:0,                
                TRIGGER_USE_BY_INTERVALL_TIMER_inMS: 0,
                TRIGGER_USE_WITH_LEARNING_FUNCTION:true,  
                Trigger_USE_timer_is_activ:false, 
                Trigger_USE_count:0, 
                Trigger_USE_intervall_timer_start_new:false,           

                SessionID:0,
                ParticipantID:0,
                DataTableID:1,
                last_change_number:0,
                global_updates_elements:0,
                ObjName:'Datatable'
        },
        _create: function () {
          	//Setup widget (eg. element creation, apply theming // , bind events etc.)
        	// wird nur einmal gefeuert     	
         },
        _init: function(){

        	//############# SHORTCUTs ###########
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	debug(o.ObjName+ '- INIT',true);
        	
        	//############# SetOPTIONS - Defaults ########### 
        	w.setOption('SessionID','1');
        	
        	w.setOption('DataTableID',w._getTableSessionID());
        	
        	w.setOption('global_updates_elements',0);
        	        	
        	//############# SetOPTIONS - fromDataElement ###########        	
			
        	//############# Add HTML-Elements ###########
			e.append('<div id="db_datatables"  Last_Change_Number=""></div>');
        	e.append('<div id="db_datatables_updates"></div>');
        	e.append('<div id="db_datatables_save"></div>');
        	e.append('<div id="db_datatables_TIMER_LOAD"></div>');
        	e.append('<div id="db_datatables_TIMER_SAVE"></div>');
        	e.append('<div id="db_datatables_TIMER_USE"></div>');
        	//############# Add EVENTS ###########  
        	
        	
        	e.bind('loadData', function(event)
        	{
        		w.TriggerloadDataFromDB(0,0,true);
        		event.stopPropagation();
        	});
        	
        	e.bind('useData', function(event)
        	{
        		w.TriggerUseDataInElements(0,0,true);
        		event.stopPropagation();
        	});
        	
        	
        	e.bind('loadDataFromDBAll', function(event)
        	{
        		w._loadDataFromDBAll();
        		event.stopPropagation();
        	});
        	
        	
        	
        	
        	e.bind('activateDataLoadTrigger', function(event)
        	{
        		o.Trigger_LOAD_timer_is_activ=true;
        		o.Trigger_LOAD_intervall_timer_start_new=true;
        		w.TriggerloadDataFromDB(0,0,true);
        		event.stopPropagation();
        	});
        	
        	
        	e.bind('deactivateDataLoadTrigger', function(event)
        	{
        		o.Trigger_LOAD_timer_is_activ=false;
        		event.stopPropagation();
        	});
        	
        	
        	//############# START FUNCTIONs EVENTS ###########  
        	w._loadDataFromDBFirstTime();            
        },


        destroy: function () {
            // Destroy an instantiated plugin and clean up
            // For UI 1.8, destroy must be invoked from the base widget
            $.Widget.prototype.destroy.call(this);
        },
 
        setOption: function ( key, value) {
         // Respond to any changes the user makes to the option method   
        	//############# SHORTCUTs ###########
        	var w=this;
        	var e=w.element;
        	var o=w.options;
   			
   			
             if(key!==null && key!==undefined)
            {
            	debug('<span>'+o.ObjName+'- setValue '+key+' = '+value,false);
            	switch (key) 
            	{	case '': 
            			break;
            		default:
               	 		o.key = value;
               	 		e.attr(key, value); 
                		break;
           		}
            }
           // For UI 1.8, _setOption must be manually invoked from the base widget
            $.Widget.prototype._setOption.apply( this, arguments );
            // For UI 1.9 the _super method can be used instead this._super( "_setOption", key, value );
        },
        _loadDataFromDBFirstTime: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	$('#db_datatables').load('db_load_datatables.php', function()
        	{
        		w.setOption('Last_Load_Time',getActuallyTime());
        		
        		debug('<span class="debug_loading">'+o.ObjName+' - Load Data from DB FIRST '+o.Last_Load_Time+'</span>', true);
        		
        		$('#db_datatables .data_row').attr('last_change_number','1');
        		
        		w._inkrementChangeNumber();
        		
        		w.setOption('Last_Load_ChangeNumber', o.last_change_number);
        		
        		
        		w.TriggerloadDataFromDB(0,0, true);  
        		w.TriggerUseDataInElements(0,0, true);        	
        	});       
        },
        _loadDataFromDB: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	$('#db_datatables_updates').load('db_load_datatables.php?LastLoadTime='+escape(o.Last_Load_Time)+'&SessionID='+escape(o.SessionID)+'&DataTableID='+escape(o.DataTableID), function()
        	{		
        		var tmp_size=$('#db_datatables_updates .data_row').size();
        		debug('<span class="debug_loading">'+o.ObjName+' - Load Data ('+tmp_size+') from DB '+o.Last_Load_Time+' ohne '+o.SessionID+'</span>', true);
        		        		
        		w.setOption('Last_Load_ChangeNumber', o.last_change_number); 
        		w.setOption('Last_Load_Time',getActuallyTime());
        		if(tmp_size>0) 
        		{
        			w._integrateChanges();  	      		
        		}	
        	});
        },_loadDataFromDBAll: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	$('#db_datatables_updates').load('db_load_datatables.php', function()
        	{		
        		var tmp_size=$('#db_datatables_updates .data_row').size();
        		        		
        		w.setOption('Last_Load_ChangeNumber', o.last_change_number); 
        		w.setOption('Last_Load_Time',getActuallyTime());
        		if(tmp_size>0) 
        		{
        			w._integrateChanges();  	      		
        		}	
        	});
        },
         _integrateChanges: function()
        {  	
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	var tmp_integrate_count=0;
        	w._inkrementChangeNumber();
        	
        	
        	// MUSS NOCH ALLGEMEIN GEMACHT WERDEN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        	$('#db_datatables_updates .data_row').each(function(index, Element)
			{	
				var new_rowitem=$(this);
				var old_rowitem=$('#db_datatables .data_table[DataTableName="'+new_rowitem.attr('DataTableName')+'"] .data_row[data_DataID='+new_rowitem.attr('data_DataID')+']');
				
				new_rowitem.attr('last_change_number', o.last_change_number);
				
				tmp_integrate_count++;	
				
				debug(old_rowitem.attr('data_DataID')+'  '+new_rowitem.attr('data_DataID'), false);
				
				if(old_rowitem.attr('data_DataID')!=undefined)
				{
					old_rowitem.replaceWith(new_rowitem);
				}
				else
				{
					//new_rowitem.attr('state', o.last_change_number);
					$('#db_datatables .data_table[DataTableName="'+new_rowitem.attr('DataTableName')+'"]').append(new_rowitem);
				}
				
			});
			
			debug('<span class="debug_loading">'+o.ObjName+' - Integrated Changes ('+tmp_integrate_count+')</span>', true);	
			
			if(tmp_integrate_count>0)
			{
				w.TriggerUseDataInElements(0,0, true);  
			} 

			
         },
        commitDataChange: function(tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted)
        {
         	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	var trigger_add_use=0;
        	var trigger_add_save=0;
        	var trigger_add_load=0;
        	
        	w._inkrementChangeNumber();
        	
         	debug('<span class="debug_saving">'+o.ObjName+' - DataChange ('+tablename+'.'+dataid+'.'+key+' -> '+value+')</span>', false);
			
			if(isNew || isDeleted)
			{
				trigger_add_use++;
			}
		
				
         	$('#db_datatables .data_table[DataTableName="'+tablename+'"] .data_row[data_DataID="'+dataid+'"]').each(function(index, Element)
			{
				$(this).attr(key, value);
				$(this).attr('last_change_number',o.last_change_number);
				$(this).attr('state', "changed");
				$(this).attr('is_new', isNew);
				$(this).attr('is_deleted', isDeleted);
			
			});
         	w.TriggerUseDataInElements(CountToTrigger+trigger_add_use, TriggerTimeInMS, IsImportantChange); 
         	w.TriggerSaveDataToDB(CountToTrigger+trigger_add_save, TriggerTimeInMS, IsImportantChange);
         	w.TriggerloadDataFromDB(CountToTrigger+trigger_add_load, TriggerTimeInMS, IsImportantChange);
         
         },
         createNewElement: function(tablename, elementid)
         {
         	var w=this;
        	var e=w.element;
        	var o=w.options;
        	
        	w._inkrementChangeNumber();
        	var newItemName='NewITEM'+o.last_change_number;
        	var cloneItemOriginal=$('#db_datatables .data_table[DataTableName="'+tablename+'"] .data_row[data_DataID="'+elementid+'"]');
        	
        	
         	$('#db_datatables .data_table[DataTableName="'+tablename+'"]').append('<div class="data_row" DataTableName="'+tablename+'" data_DataID="'+newItemName+'" is_new="true" state="changed"></div>');
         	var newItem=$('#db_datatables .data_table[DataTableName="'+tablename+'"] .data_row[data_DataID="'+newItemName+'"]');
         	
         	var Attribute_String= newItem.parent().attr('DataTableAttributes'); 
			var Attributes = Attribute_String.split( "," );

  					for ( var i = 1; i < Attributes.length-1; i++ )  //Attributes[0] ist data_DataID, und Attributes[n] ist leer
 					 {
    					newItem.attr(Attributes[i],'');
    					if(cloneItemOriginal!=undefined)
    					{
    						newItem.attr(Attributes[i],cloneItemOriginal.attr(Attributes[i]));
    					}else
    					{
    						newItem.attr(Attributes[i],'');
    					}
 					 }

			return newItemName;
         },
         _saveChangesToDB: function()
         {

        	var w=this;
        	var e=w.element;
        	var o=w.options;
			
			var tmp_count_saves=0;
			var tmp_count_changed_rows=$('#db_datatables .data_row[state="changed"]').size();
				
			w.setOption('Last_Save_Time', getActuallyTime());
			w.setOption('Last_Save_ChangeNumber', o.last_change_number);
				
						
			//################################ UPDATES und DELETES (data_time_deleted=wird gesetzt) ###################################################	
			$('#db_datatables .data_row[state="changed"]').each(function(index, Element)
			{	
				$(this).attr('data_time_updated',o.Last_Save_Time);
				$(this).attr('data_updated_table',o.DataTableID);

				var is_new_element=$(this).attr('is_new');
				if(is_new_element!='true') is_new_element=false;
				
				if($(this).attr('is_deleted')=='true') $(this).attr('data_time_deleted',o.Last_Save_Time);
				if($(this).attr('is_new')=='true') $(this).attr('data_time_created',o.Last_Save_Time);
				
				var SQLSTRING='UPDATE '+$(this).attr('DataTableName')+' SET ';
				if(is_new_element) SQLSTRING='INSERT INTO '+$(this).attr('DataTableName')+' SET DataID=##, ';

 
				var Attribute_String= $(this).parent().attr('DataTableAttributes'); 
				var Attributes = Attribute_String.split( "," );
				

  					for ( var i = 1; i < Attributes.length-1; i++ )  //Attributes[0] ist data_DataID, und Attributes[n] ist leer
 					 {
    					if(i>1) SQLSTRING=SQLSTRING+',';
    					SQLSTRING=SQLSTRING+Attributes[i]+'=#'+$(this).attr(Attributes[i])+'#';
    					
 					 }
				
				if(!is_new_element) SQLSTRING=SQLSTRING+' WHERE DataID=#'+$(this).attr('data_DataID')+'#;';

				SQLSTRING=SQLSTRING.replace('px','').replace('px','')
				var poststring='db_save_Changes.php?SQLQUERY='+escape(SQLSTRING);
				
				//poststring=encodeUmlaute(poststring);
				
				//debug(SQLSTRING);
				
				//alert(poststring);
				
					//tmp_string=encodeURI(tmp_string)
					//tmp_string=decodeURI(tmp_string)
				
				
				$('#db_datatables_save').load(poststring, function(response, status, xhr)
				{	
						debug('<span class="debug_saving">'+o.ObjName+' - SAVE CHANGE NR. - '+tmp_count_saves+'/'+tmp_count_changed_rows+' - TO DB </span>', true);	
						if(is_new_element) w.TriggerloadDataFromDB(0, 0, true);
				});
				
				$(this).attr('state', ''); 
				tmp_count_saves++;
				
			});	
			
			
				$('#db_datatables .data_row[is_new="true"]').remove();
			
				debug('<span class="debug_saving">'+o.ObjName+' - SAVE CHANGES - '+tmp_count_saves+'/'+tmp_count_changed_rows+' - TO DB </span>', false);
			
         },         
         TriggerUseDataInElements: function(CountToTrigger, TriggerTimeInMS, IsImportantChange) 
         {
         	var w=this;
        	var e=w.element;
        	var o=w.options;
        	var TRIGGER_IT=false;
			
			//####################### TRIGGER BY IMPORTANT CHANGE #######################
			if(IsImportantChange) TRIGGER_IT=true; 
       	
         	//####################### TRIGGER BY TIME #######################
        	
        	if(TriggerTimeInMS>0)
        	{
        		e.stopTime('TIMER_USE');
        		e.oneTime(TriggerTimeInMS, 'TIMER_USE', function()
        		{
        			w.TriggerUseDataInElements(0,0,true);
        		});	
        	}else if(TriggerTimeInMS==-1) //regelmäßigen Trigger anhalten
        	{
        		e.stopTime('TIMER_USE');
        		o.Trigger_USE_intervall_timer_start_new=false;        	
        	}else if(TriggerTimeInMS==-2) //regelmäßigen Trigger starten
        	{
        		o.Trigger_USE_intervall_timer_start_new=true;        	
        	}
        	
        	//####################### TRIGGER BY COUNT #######################        	       	
        	if(o.TRIGGER_USE_MAXCOUNT>o.Trigger_Use_count)
        	{
        		o.Trigger_Use_count++;
        	}else
        	{
        		if(!CountToTrigger>0) // Verzögert das Triggern
        		{
        			TRIGGER_IT=true;
        		}		
        	}        	
        	
        	if(CountToTrigger==-1)
        	{
        		o.Trigger_Use_count=0;
        	}
        	
        	if(TRIGGER_IT) // Führe Trigger Aktion durch
        	{ 		
        		
        		//####################### TRIGGER FUNCTION #######################  
        		debug('<span class="debug_jQ_Elements">'+o.ObjName+' - TRIGGER USE Data IN Elements('+CountToTrigger+','+TriggerTimeInMS+','+ IsImportantChange+')</span>', true);
        		
        		var triggered_elements=0;
        		
         		$('.WidgetDatabaseElement').each(function(index, Element)
    			{
    				$(this).trigger("getDataFromDatatables");
    				triggered_elements++;
       			});	 
       			
       			debug('<span class="debug_jQ_Elements">'+o.ObjName+' - USE Data IN Elements('+o.global_updates_elements+'/'+triggered_elements+') ('+CountToTrigger+','+TriggerTimeInMS+','+ IsImportantChange+')</span>', true);
       			
       			w.setOption('global_updates_elements',0);
       			
       			
       			
       			//####################### RESET TRIGGER FOR TIME and COUNT #######################
       			o.Trigger_Use_count=0; 
       			e.stopTime('TIMER_USE');
       			if(o.Trigger_USE_intervall_timer_start_new) 
       			{
       				e.oneTime(o.TRIGGER_USE_BY_INTERVALL_TIMER_inMS, 'TIMER_USE', function()
        			{
        				w.TriggerUseDataInElements(0,0,true);
        			});
       			}	    	
        	}
         }, 
         TriggerSaveDataToDB: function(CountToTrigger, TriggerTimeInMS, IsImportantChange)
         {
         	
         	var w=this;
        	var e=w.element;
        	var o=w.options;
        	var TRIGGER_IT=false;
			
			//####################### TRIGGER BY IMPORTANT CHANGE #######################
			if(IsImportantChange) TRIGGER_IT=true; 
       	
         	//####################### TRIGGER BY TIME #######################
        	
        	if(TriggerTimeInMS>0)
        	{
        		e.stopTime('TIMER_SAVE');
        		e.oneTime(TriggerTimeInMS, 'TIMER_SAVE', function()
        		{
        			w.TriggerSaveDataToDB(0,0,true);
        		});	
        	}else if(TriggerTimeInMS==-1) //regelmäßigen Trigger anhalten
        	{
        		e.stopTime('TIMER_SAVE');
        		o.Trigger_SAVE_intervall_timer_start_new=false;        	
        	}else if(TriggerTimeInMS==-2) //regelmäßigen Trigger starten
        	{
        		o.Trigger_SAVE_intervall_timer_start_new=true;        	
        	}
        	
        	//####################### TRIGGER BY COUNT #######################        	       	
        	if(o.TRIGGER_SAVE_MAXCOUNT>o.Trigger_SAVE_count)
        	{
        		o.Trigger_SAVE_count++;
        	}else
        	{
        		if(!CountToTrigger>0) // Verzögert das Triggern
        		{
        			TRIGGER_IT=true;
        		}		
        	}        	
        	
        	if(CountToTrigger==-1)
        	{
        		o.Trigger_SAVE_count=0;
        	}
        	
        	if(TRIGGER_IT) // Führe Trigger Aktion durch
        	{ 		
        		
        		//####################### TRIGGER FUNCTION #######################  
        		debug('<span class="debug_saving">'+o.ObjName+' - TRIGGER SAVE Data to DB('+CountToTrigger+','+TriggerTimeInMS+','+ IsImportantChange+') </span>', false);
        		w._saveChangesToDB(); 
       			
       			//####################### RESET TRIGGER FOR TIME and COUNT #######################
       			o.Trigger_SAVE_count=0; 
       			e.stopTime('TIMER_SAVE');
       			if(o.Trigger_SAVE_intervall_timer_start_new) 
       			{
       				e.oneTime(o.TRIGGER_SAVE_BY_INTERVALL_TIMER_inMS, 'TIMER_SAVE', function()
        			{
        				w.TriggerSaveDataToDB(0,0,true);
        			});
       			}	    	
        	}
	
                	
         },      
         TriggerloadDataFromDB: function(CountToTrigger, TriggerTimeInMS, IsImportantChange)
         {
         	
         	var w=this;
        	var e=w.element;
        	var o=w.options;
        	var TRIGGER_IT=false;
        	var t=e;
        	//var t=$('#db_datatables_TIMER_LOAD');
			
			//####################### TRIGGER BY IMPORTANT CHANGE #######################
			if(IsImportantChange) TRIGGER_IT=true; 
       	
         	//####################### TRIGGER BY TIME #######################
        	
        	if(TriggerTimeInMS>0)
        	{
        		t.stopTime('controlled');
        		t.oneTime(TriggerTimeInMS, 'controlled', function()
        		{
        			w.TriggerloadDataFromDB(0,0,true);
        		});	
        	}else if(TriggerTimeInMS==-1) //regelmäßigen Trigger anhalten
        	{
        		t.stopTime('TIMER_LOAD');
        		o.Trigger_LOAD_intervall_timer_start_new=false;        	
        	}else if(TriggerTimeInMS==-2) //regelmäßigen Trigger starten
        	{
        		o.Trigger_LOAD_intervall_timer_start_new=true;        	
        	}
        	
        	//####################### TRIGGER BY COUNT #######################        	       	
        	if(o.TRIGGER_LOAD_MAXCOUNT>o.Trigger_LOAD_count)
        	{
        		o.Trigger_LOAD_count++;
        	}else
        	{
        		if(!CountToTrigger>0) // Verzögert das Triggern
        		{
        			TRIGGER_IT=true;
        		}		
        	}        	
        	
        	if(CountToTrigger==-1)
        	{
        		o.Trigger_LOAD_count=0;
        	}
        	
        	if(TRIGGER_IT) // Führe Trigger Aktion durch
        	{ 		
        		
        		//####################### TRIGGER FUNCTION #######################  
        		debug('<span class="debug_loading">'+o.ObjName+' - TRIGGER Dataload from DB('+CountToTrigger+','+TriggerTimeInMS+','+ IsImportantChange+')</span>', false);
        		w._loadDataFromDB(); 
       			
       			//####################### RESET TRIGGER FOR TIME and COUNT #######################
       			o.Trigger_LOAD_count=0; 
       			t.stopTime('controlled');
       			if(o.Trigger_LOAD_intervall_timer_start_new) 
       			{
       				
        		
       				t.oneTime(o.TRIGGER_LOAD_BY_INTERVALL_TIMER_inMS, 'controlled', function()
        			{
        				w.TriggerloadDataFromDB(0,0,true);
        			});
       			}	    	
        	}       	
        	
         },
         _inkrementChangeNumber: function()
         {
         	var w=this;
        	var e=w.element;
        	var o=w.options;
         	w.setOption('last_change_number',o.last_change_number+1);  
         	$('#db_datatables').attr('last_change_number', o.last_change_number);       
         },
         _getTableSessionID: function()
         {
         	var w=this;
        	var e=w.element;
        	var o=w.options;
         	var RandomNumber=parseInt(Math.random()*1000000);
         	debug('<span class="">'+o.ObjName+' - TableSessionID: '+RandomNumber+'</span>', true);
         	return RandomNumber;
         } 
    });
    
    
//########################################################## Dataelement ############################################################################################## 
/*  ! ... CE. DataelementB ........................................................................................ (Bookmark for Coda)  */


$.widget( 'CE.DataElementB' , {
        options: { 
                DataTableName:'',
                DataID:'',
                last_change_number:0,
                ObjName: ''
        },
        _create: function () {},
        _init: function(){
			this._initDataElement();
        },
        _initDataElement: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;

        	var tmp_DataTableName=e.attr('DataTableName');
        	if(tmp_DataTableName!=undefined && tmp_DataTableName!='')
        	{
        		o.DataTableName=tmp_DataTableName;
        	}
        	var tmp_DataID=e.attr('DataID');
        	if(tmp_DataID!=undefined && tmp_DataID!='')
        	{
        		o.DataID=tmp_DataID;
        	}
        	
        	debug('init DataElement mit ('+o.DataTableName+' - '+o.DataID+')', false);
        	
        	e.addClass('WidgetDatabaseElement');   
        	e.bind('getDataFromDatatables', function(event)
        	{
        		w._getDataFromDatatables();
        		event.stopPropagation();
        	});
        },
        _getDataFromDatatables: function()
        {	
         	debug(this.options.ObjName+' die Funktion getDataFromDatatables muss überschrieben werden',true); 	  
        },
        _deleteElement: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;   
        	debug(o.ObjName+': DELETE ITEM', true);     	
        	w._commitDataToDatatables('is_deleted', true, 0, 0, true, '', true); 
        	 //key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted
        	
        },
        _cloneElement: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	var neItemID=$("#db_datatables").parent().Datatable("createNewElement", o.DataTableName, o.DataID);	
        	return neItemID;
        },
        _createNewElement: function()
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options;
        	var neItemID=$("#db_datatables").parent().Datatable("createNewElement", o.DataTableName);
        	return neItemID;
        	 
        },
        _commitDataToDatatableForAElement: function(tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted)
        {
        	$("#db_datatables").parent().Datatable("commitDataChange", tablename, dataid, key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange, isNew, isDeleted); 
        
        },
        _commitDataToDatatables: function(key, value, CountToTrigger, TriggerTimeInMS, IsImportantChange,isNew, isDeleted)
        {
        	var w=this;
        	var e=w.element;
        	var o=w.options; 	

        	var last_change_number_global=$('#db_datatables').attr('last_change_number');
        	last_change_number_global++;
        	w.setOption('last_change_number',last_change_number_global++, true, false);
        	
        	debug('<span class="debug_saving">'+o.ObjName+' - commitDataToDatatable('+o.DataTableName+' - '+o.DataID+') ('+key+' -> '+value+') - ('+CountToTrigger+','+TriggerTimeInMS+','+ IsImportantChange+')', true);
        	
        	w._commitDataToDatatableForAElement( o.DataTableName, o.DataID,key,value,CountToTrigger,TriggerTimeInMS, IsImportantChange, isNew, isDeleted);
   
        },
         _inkrementChangeNumber: function()
         {
         	var w=this;
        	var e=w.element;
        	var o=w.options;
         	w.setOption('last_change_number',o.last_change_number+1);         
         },
        destroy: function () { $.Widget.prototype.destroy.call(this); },        
        setOption: function ( key, value, animate, commitToDatabase ) {$.Widget.prototype._setOption.apply( this, arguments ); }
    });

    

})( jQuery, window, document );
