	// Widget container
	(function($) {
		
		// Widget container plugin
		$.fn.bijaContainer = function() {
			this.each(function() {
				// Vars
				var jbc = $(this);
				jbc.addClass('ui-widget');
				var bc = {
					// Add a bija to the container
					add : function () {
						var bija = {
							elements : function () {
								if (!this._elements) {
									this._elements = {};

									if (this.gui) {
										var obj = this;
										// select all valid inputs inside the form (no submit or reset buttons)
										$(':input', this.gui)
										.not(":submit, :reset, :image, [disabled]")
										.each(function() {
											var aReference = $(this).attr('ref');
											// select only the first element for each name, and only those with rules specified
											if (aReference) {
												obj._elements[aReference] = this;
											}

										});
									}
								}
								return this._elements;
							},
							children : new Array(),
							gui : null,
							parent : this,
							template : ''
						};
						this.children.push( bija );
						if (this.template) {
						    var aHtml = this.template;
							if (this.onCreateTemplate) {
								aHtml = this.onCreateTemplate();
							}
							bija.gui = $(aHtml),
							bija.gui
								.appendTo(this.gui)
								.bija(bija);
							jQuery.data(bija.gui[0] , 'bija', bija);
							if (this.onAdd) {
								this.onAdd(bija);
							}
													
						
						}
						return bija;
					},
					fire : function (bija) {						
						if (!bija.showingDialog) {
							if (bija.loadedScript) {
								$.geoKarma.show(bija.identifier)
							}	
							else { 
								bija.loadedScript = true;			
								if (bija.behaviour == "custom") {
									bija.behaviour == "normal";			
									var aUrl = bija.url.replace(/.ajax/g, ".script");
									$.ajax({   type: "GET",
											   url: aUrl,
											   data: bija.parameter,
											   dataType: "script",
											   complete: function(msg){ 
													$( bija.gui[0] ).dialog(bija.dialog);									   								   																			   
													$.geoKarma.show(bija.identifier);
											  } 
									});		
								}
								else {
									$( bija.gui[0] ).dialog(bija.dialog);									   								   								
									$.geoKarma.show(bija.identifier)
								}
							}	
						}
					},
					remove : function (bija) {
						if (this.onRemove) {
							this.onRemove(bija);
						}
					    this.children.splice(this.children.indexOf(bija), 1);
						$(bija.gui).remove();
					},
					
					children : new Array(),
					gui : this,
					parent : null,
					template : ''
				};
				var aBijaAttribute = jbc.attr('ref');
				if (!aBijaAttribute) {
					aBijaAttribute= 'default' 
				};
				bc.ref = aBijaAttribute;

				aBijaAttribute = jbc.attr('factory');
				if (!aBijaAttribute) {
					aBijaAttribute= 'default' 
				};
				bc.factory = aBijaAttribute;
				
				jQuery.data(this , 'bija', bc);
				// Set events
				jbc.find('.bijaAdd').click(function(e) { if (e) e.preventDefault(); bc.add() });
				var aRow = jbc.find('.bijaTemplate').get(0);
				if (aRow) {
					bc.template = $.geoKarma.outerHtml(aRow);
				}

			});
		}

		$.fn.bijaIdentificationFromUrl = function() {	
			this.each(function() {
				var jbija = $(this);
				var uri = jbija.attr('href');
				if (uri) {
					var url = uri.replace(/(.*)\?.*/, "$1");		   
					var parameters = uri.replace(/.*\?(.*)/, "$1");	
					var parameterTokens = parameters.split("&");
					parameters = '';
					var identifier = '';				
					var before = '?';
					for (var i = 0; i < parameterTokens.length; i++)	{
						var parameterName = parameterTokens[i].replace(/(.*)=.*/, "$1");
						var parameterValue = parameterTokens[i].replace(/.*=(.*)/, "$1");
						if  ( parameterName == 'identifier' ) { 
							identifier = parameterValue;	
						} 
						parameters =  parameters + before + parameterName +'=' + parameterValue;   
						before = '&';
					}				
					if (identifier == '') {
						identifier = 'bija' + $.geoKarma.identifier++;		   			   	
						parameters =  parameters + before + 'identifier' +'=' + identifier;   					
					}
					jbija.attr('href', url + parameters);
					jbija.click(function(){
						  $.geoKarma.fire(this, identifier );
						  return false;
					});		
				}	
			});
			return this;			
		}	
	
		$.fn.bijaStartUp = function() {
			this.each(function() {
				// Vars
				var jbc = $(this);
				var bija = jQuery.data(this , 'bija');				
				var aKarmaType = jbc.attr('karma');	
				
				var e = jQuery.Event("bijaStartUp"); 
				e.bija = bija;
				if (!bija.identifier) {
					bija.identifier = $(e.bija.gui).attr('id');
				}
				$($.geoKarma).trigger(e);

			
			});				
		
		}

		$.fn.calculateTotal = function(identifier) {
				return this.each(function() {
				  var aId = $(this).attr('id');
					var aSelector = "td[id^='" + aId + "_']";			
					var risultato = $(aSelector).calculateColumnTotal();

					if (isNaN(risultato)) {
							risultato = 0 ;					
							$(this).text('');							
					} else {
						$(this).text(Number(risultato.toFixed(2)).toLocaleString());
					}
					var bija = $.geoKarma.findBija(identifier); 
					if (bija) {
							bija.totals[aId] = risultato ;
					}
				});			

		};

		$.fn.calculateColumnTotal = function() {
				var total = 0;

				// loop through the value and total them
				this.each(function (){
					var rawVal = $(this).attr('rawVal');			
					total += Number(rawVal);
				});

				// return the values as a comma-delimited string
				return total;

		};
		

		$.fn.solveFormula = function() {
				return this.each(function() {
							var elem = $(this).attr('formula');
							var risultato = eval(elem);
							$(this).text(Number(risultato.toFixed(2)).toLocaleString());
							$(this).attr('rawVal', risultato.toString());
					});



		};



		// Bija
		(function() {
			// Bija plugin
			$.fn.bija = function(bija) {
				this.each(function() {
					// Vars
					var jb = $(this);
					// Set events
					jb.find('.bijaRemove').click(function(e) { if (e) e.preventDefault(); bija.parent.remove(bija) });
				});
			}
		})();
})(jQuery);


(function($) {

	$.geoKarma = {
		identifier : 0,
		findBija : function (identifier) {			
			var gui = $('#'+identifier).get(0);
			var bija = null;
			if (gui) { 
				bija = jQuery.data(gui, 'bija');
			}
			return bija;			
		},

		actionConfigure : function () {
			var classList = new Array();
			classList.push('headerItem');
			classList.push('contentItem');
			classList.push('footerItem');
			classList.push('leftItem');
			classList.push('rightItem');
			
			var actionFolder = $('#actionConfigureName').get(0).value;
			
			var actionName = actionFolder.replace(/(.*)_.*/, "$1");		   
			actionFolder = actionFolder.replace(/.*_(.*)/, "$1");	
			
			if (actionName == '') {
			 alert ('Compile action name');
			 return false;
			}
			var components = '';
			for (var y = 0, cl = classList.length; y < cl; y++) {
				var oggetti = $('.' + classList[y]);
				for ( var i = 0, ol = oggetti.length; i < ol; i++ )
				{	var obj = oggetti[i];
					var commandName = classList[y];
					commandName = commandName.substring(0, commandName.length - 4)
					var component =  '<component><division>' + commandName + '</division><id>' + obj.id + '</id></component>' + '\n';  
					components = components + '\n' + component;	
				}
			}	
			components = '<components>'  + '\n' + components + '\n' + '</components>';
			var componentHead =  '<name>' + actionName + '</name>' + '\n' + '<folder>' + actionFolder + '</folder>'+ '\n';  			
			components = '<ActionCustomize>'  + '\n' +  componentHead + components + '\n' + '</ActionCustomize>';			

			$('#actionConfigureXml').get(0).value =  components;
			
			/* window.location = 'actionCustomize.html?xml=' + encodeURIComponent(components);*/
			return true;
		},
		
		
		
		checkAndConvertDate : function (value) {
			var re_date = /(\d\d)\/(\d\d)\/(\d\d\d\d)/;			
			if (!re_date.exec(value))  {			
				return '';
				}
			var month = RegExp.$2;
			var day = RegExp.$1;
			if ((month > 12) || (month < 1)) {
				return '';
			}	
			if ((day > 31) || (day < 1)) {
				return '';
			}	
			return  RegExp.$3 + '-' + RegExp.$2 + '-' + RegExp.$1+ 'T00:00:00.000';
			 
		},
		
		checkEmail: function(value) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
			return  /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
		},
		

		debug : function () {
			var analysis = new Array();
			for (var i=0; i < arguments.length; i++ ) {
				analysis[analysis.length] = arguments[i];
			}
			return analysis;	
				
		},
		defaultOk : function (aDialog, bija) {
			var url = bija.parameter != '' ? '?' + bija.parameter : '';
			url = bija.url + url;
			if (bija.behaviour == "normal") {
				$(aDialog).dialog('close');			
			  	window.location = url ;
				return false;	  
			}
			if (bija.behaviour == "attended") {
				var aSelector = '#bija'+ bija.identifier;
		    	$.geoKarma.hideDialogButtons (bija);
				$( aSelector).load(url);
				bija.behaviour = 'reload';
				return false;	  
			}
			if (bija.behaviour == "reload") {
				document.location.reload()
				return false;	  
			}
			
			if (bija.behaviour == "redirect") {
				$(aDialog).dialog('close');						
				window.location.replace(url);
				return false;
			}			

		},
		defaultCancel : function(aDialog, eventIdentifier, identifier) {
				$(aDialog).dialog('close');			
		},
		
		deleteCookie : function(aDomain) {
				var aName = 'GeoUserData';
				var options = {};
				options.path = '/';
				$.cookie(aName, null, options);			
				
				var aName = 'GeoSessionID';
				var options = {};
				options.path = '/';
				$.cookie(aName, null, options);			
				options.path = '/';
				options.domain = aDomain;
				aName = 'GeoDomainSession';				
				$.cookie(aName, null, options);							
		},
		
		descriptionNormalize : function (aName) {
					return aName.replace(/&/g, "_")
										.replace(/à/g, "a")                        										
										.replace(/é/g, "e")                        
										.replace(/è/g, "e")                        
										.replace(/ì/g, "i")                        
										.replace(/ò/g, "o")                        
										.replace(/ù/g, "u")                        
										.replace(/°/g, " ")  										
										.replace(/'/g, " ")  
										.replace(/"/g, " ")  										
										.replace(/</g, "_")										
										.replace(/>/g, "_");
		
		},
		execute : function(aDialog, eventIdentifier, identifier) {
			var bija = $.geoKarma.findBija(identifier); 
			if ((eventIdentifier)&&(bija.steps[eventIdentifier])&&(bija.steps.active < bija.steps[eventIdentifier].length)) {
				var activeStep = bija.steps.active;
				bija.steps[eventIdentifier][activeStep](aDialog, bija);
			};
		},

		
		
		fileNameExtractExtension : function (fullPath) {
		  return  fullPath.replace(/.*\.(.*)$/, "$1")
		}, 


		fileNameExtract : function (fullPath) {
		  var lastSlash; // the position of the last slash in the path
		  var fileName = fullPath.replace(/\\/g, "/");  // the name of the file
		  lastSlash = fileName.lastIndexOf("/");
		  if (lastSlash!=-1) {	fileName = fileName.substring(lastSlash+1,fullPath.length)}
		  else {fileName = fullPath}
		  return fileName;
		}, 

		fileNameNormalize : function (aName) {
			return aName.replace(/&/g, "_")
								.replace(/</g, "_")
								.replace(/ /g, "_")                        

								.replace(/>/g, "_");

		},

		fillSpace: function(aSelector) {
			var textContent = $(aSelector).text();
			if (jQuery.trim(textContent)=='') {$(aSelector).text('.')};		
		},
				
		fire: function(gui, identifier) {
			var bija = $.geoKarma.findBija(identifier);		   	
			if (!bija) {
				var bija = $.geoKarma.container.add();
		        bija.uri = $(gui).attr('href');
		        bija.caption  = ($(gui).text() || $(gui).attr('title'));			
		        bija.link = gui;
				$.geoKarma.urlBija (bija);
			} 			
			bija.parent.fire(bija);	
		},
		
		
		hideDialogButtons : function (bija) {
		  				var aSelector =  '#bija'+ bija.identifier;
		  				var myDialog = $(aSelector).get(0);
						var myContainer = $(myDialog).parent().get(0);
						myContainer = $(myContainer).parent().get(0);
						$('.ui-dialog-buttonpane', myContainer).hide();
		
		},
		
		
		next : function (aIdentifier) {
			var bija = $.geoKarma.findBija(aIdentifier);
			if ((bija)&&(bija.steps.active < bija.steps['Ok'].length-1)) {
				bija.steps.active++;
			}	
		
		},
		outerHtml :  function (obj) {
			var parent = obj.parentNode;
			var el = document.createElement(parent.tagName);
			el.appendChild(obj);
			var shtml = el.innerHTML;
			/* parent.appendChild(obj); riclona l'orginale facendolo riapparire*/
			return shtml;
		},
		
		previous : function (aIdentifier) {
			var bija = $.geoKarma.findBija(aIdentifier);
			if ((bija)&&(bija.steps.active > 0)) {
				bija.steps.active = bija.steps.active-1;
			}	
		
		},
		
		roundTo : function (value, decimalpositions) {
			var i = value * Math.pow(10,decimalpositions);
			i = Math.round(i);
			return i / Math.pow(10,decimalpositions);
		},

		
		show : function (identifier) {
			var bija = $.geoKarma.findBija(identifier); 
			if (bija.uri.indexOf(".ajax") >= 0) { 			
				$( bija.gui[0] ).load(bija.uri).dialog('open');
			} else {
				$( bija.gui[0] ).dialog('open');			
			}
		
		},	

		setFCKeditorUrl : function (fileUrl) {
		
						window.top.opener.SetUrl( encodeURI( fileUrl ).replace( '#', '%23' ) ) ;
						window.top.close() ;
						window.top.opener.focus() ;

		},		
		

		startup: function() {
				var jContainer = $('<div id="karma" ref="karma"><div class="bijaTemplate"/></div>').get(0);
				$(jContainer).appendTo('body').css({width: 0, height: 0, overflow: 'hidden'}).bijaContainer();
				$($.geoKarma).trigger('createLibraryBijaContainer'); 					
				$('.bijaContainer').bijaContainer();
				$('.bijaContainer').bijaStartUp();
				this.container = jQuery.data(jContainer , 'bija');
				$("iframe").each(function(){
						this.src = $.geoKarma.uriClearDirtyCharacter(this.src);
						
				});
	
				$("a").each(function(){
						this.href = $.geoKarma.uriClearDirtyCharacter(this.href);
						if (this.href==document.URL) {
							jQuery(this).addClass("selected");
						}
						
				});
				$(".block:has(.selected)").addClass("navigationSelected");
				$("a.karma").bijaIdentificationFromUrl();
				$("a.openNewWindow").click(function(){
				  window.open(this.href);
				  return false;
				});		

		},	
		state : function(aDialog, eventIdentifier, identifier) {
			var bija = $.geoKarma.findBija(identifier); 		
			if (eventIdentifier == 'open') {bija.showingDialog = true}
			else {bija.showingDialog = false}

		},	
		string2xml : function(aString) {
      	  return aString.replace(/&/g, "&amp;")
                            .replace(/"/g, "&quot;");
		},
		xml2string : function(aString) {
      	  return aString.replace(/&amp;/g, "&")
                            .replace(/"/g, "&quot;");
		},			

		uriClearDirtyCharacter : function(uri) {
				var uriExplorer = uri;
				if (uriExplorer.indexOf('38;')!= -1 ) {	
					uriExplorer = uriExplorer.replace(/#38;/g, "");
					uriExplorer = uriExplorer.replace(/38;/g, "");
				}
				return uriExplorer;
		},						

		urlBija : function (bija) {
				bija.identifier = '';  
				bija.behaviour= 'normal'; 
				bija.showingDialog = false; 
				bija.loadedScript = false; 				
				bija.title = bija.caption; 
				bija.height = 200; 
				bija.width = 300; 
				bija.resizable = true; 
				bija.position = 'top';		
				bija.url = bija.uri.replace(/(.*)\?.*/, "$1");		   
				bija.parameter = bija.uri.replace(/.*\?(.*)/, "$1");	
				var parameterTokens = bija.parameter.split("&");
				if (bija.url == bija.parameter) {bija.parameter = ''}
				for (var i = 0; i < parameterTokens.length; i++)	{
					var parameterName = parameterTokens[i].replace(/(.*)=.*/, "$1");
					var parameterValue = parameterTokens[i].replace(/.*=(.*)/, "$1");
					if  ( parameterName == 'height' ) { bija.height =  Number(parameterValue) } 
					else if ( parameterName == 'resizable' ) { bija.resizable =  true }
					else if ( parameterName == 'position' ) { bija.position =  parameterValue }								
					else if ( parameterName == 'modal' ) { bija.modal =  true }													
					else if ( parameterName == 'width' ) { bija.width =  Number(parameterValue) }
					else if ( parameterName == 'behaviour' ) { bija.behaviour =  parameterValue }	
					else if ( parameterName == 'identifier' ) { bija.identifier =  parameterValue }						
					else if ( parameterName == 'caption' ) {  bija.caption =  parameterValue.replace(/%20/g, " ") }										
					// parameterList[parameterName] = parameterValue;
				}

				var bijaOk = new Function ("$.geoKarma.execute(this, 'Ok', '" + bija.identifier + "');");
				var bijaCancel = new Function ("$.geoKarma.execute(this, 'Cancel', '" + bija.identifier + "');");				
				var bijaOpen = new Function ("$.geoKarma.state(this, 'open', '" + bija.identifier + "');");
				var bijaClose = new Function ("$.geoKarma.state(this, 'close', '" + bija.identifier + "');");				
				
				bija.dialog = { close: bijaClose , open : bijaOpen, bgiframe: true, title : bija.caption, height : bija.height, width : bija.width, resizable : bija.resizable, position : bija.position,
							   buttons: { 'Ok': bijaOk,
							   			  
										  'Cancel': bijaCancel
								}
				};
				bija.steps = {  'active' : 0,
								'Ok': [$.geoKarma.defaultOk],
								'Cancel' : [$.geoKarma.defaultCancel ]};				


				$( bija.gui[0] ).attr('id', bija.identifier);
		
		},
		
		urlParametersFromArguments : function() {
				var aUrl = '';
				for (var i=0; i < arguments.length; i= i+2) {
					var aName = arguments[i];
					var aDescription = arguments[i+1];
					aUrl = aUrl + 'p' + i.toString() + '=' + aName + '&d' + i.toString() + '=' + aDescription + '&';	
					
				}
				return aUrl;	
		}		
	};
})(jQuery);




