(function($) {

	$.geoKarma = {
		identifier : 0,
		dialogs: [],
		

		findBija : function (identifier) {			
			for(var i=0;i<$.geoKarma.dialogs.length;i++) {
				if 	($.geoKarma.dialogs[i].identifier == identifier) { return $.geoKarma.dialogs[i]}
			}
			return null;			
		},

		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);							
		},
		
		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);
			};
		},

		executeTask : 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.task = eventIdentifier;
				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, "_");

		},
		
		fireFromJson: function(handler, myJson) {
			var url = myJson['url'];
			var caption = myJson['caption'];			
		   	var newBija = $.geoKarma.newBija(caption, url);
			var bija = $.geoKarma.findBija(newBija.identifier);		   	
			if (!bija) {bija = newBija; $.geoKarma.dialogs[$.geoKarma.dialogs.length] = bija;} 			
			else {newBija = null}
			bija.handler = handler;
			bija.myJson = myJson;			
			if (!bija.active) {
				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){ 
									$.geoKarma.show(bija.identifier);
							  } 
						 });				    
				}
				else
					{$.geoKarma.show(bija.identifier)}
			}
			
		},
		fillSpace: function(aSelector) {
			var textContent = $(aSelector).text();
			if (jQuery.trim(textContent)=='') {$(aSelector).text('.')};		
		},
		
		fire: function(caption, url) {
		   	var newBija = $.geoKarma.newBija(caption, url);
			var bija = $.geoKarma.findBija(newBija.identifier);		   	
			if (!bija) {bija = newBija; $.geoKarma.dialogs[$.geoKarma.dialogs.length] = bija;} 			
			else {newBija = null}
			if (!bija.active) {
				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){ 
									$.geoKarma.show(bija.identifier);
							  } 
						 });				    
				}
				else
					{$.geoKarma.show(bija.identifier)}
			}
		},
		
		getTagsReference: function( onCompleteTagsCount, serviceName, folderName) {				
				var references = new Object();
				var referencesCount = 0;				
				$(".tagsElement").each(function(){
						var myTags = new Array();								
						myTags = jQuery(this).attr('tagsval').split(';');
						for (var j = 0 ; j < myTags.length; j++) {
							var aTag = 	myTags[j];						
							if (aTag != '') {
								referencesCount++;
								if (references.hasOwnProperty(aTag)) {references[aTag] = references[aTag] + 1} 
								else {references[aTag] = 1};
							}	
						}
				});
				if (referencesCount==0) {
					var aUrl = '/facets/count.script';
					var aParameter = 'service=' + serviceName + '&folder=' +folderName;					
					$.ajax({   type: "GET",
							   url: aUrl,
							   data: aParameter,
							   dataType: "script",
							   complete: function(msg){ 
							   		references = facetsRemoteCount();
							   		onCompleteTagsCount (references);

							  } 
						 });				    
				}
				else {onCompleteTagsCount (references);}
				

				
		},	
		
		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();
		
		},
		
		newBija : function (caption, url) {
				var bija =    {identifier : '',  behaviour: 'normal', active : false, title : caption, height : 200, width : 300, resizable : true, position : 'top'};
				bija.caption = caption;
				bija.identifier = '';				
				var uriExplorer = url.replace(/#38;/g, "");
				bija.uri = uriExplorer.replace(/38;/g, "");
				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 == 'caption' ) {  bija.caption =  parameterValue.replace(/%20/g, " ") }						
					else if ( parameterName == 'identifier' ) { bija.identifier =  parameterValue }						
					// parameterList[parameterName] = parameterValue;
				}
				if (bija.identifier == '') {
					bija.identifier = 'bija' + $.geoKarma.identifier++;		   			   	
				}
				

				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 ]};				
				return bija;
		
		},
		
		next : function (aIdentifier) {
			var bija = $.geoKarma.findBija(aIdentifier);
			if ((bija)&&(bija.steps.active < bija.steps['Ok'].length-1)) {
				bija.steps.active++;
			}	
		
		},
		previous : function (aIdentifier) {
			var bija = $.geoKarma.findBija(aIdentifier);
			if ((bija)&&(bija.steps.active > 0)) {
				bija.steps.active = bija.steps.active-1;
			}	
		
		},
		
		show : function (identifier) {
			var bija = $.geoKarma.findBija(identifier); 

			var selector =  '#bija' + bija.identifier;
			var n = $(selector).length;			

			
			if (n==0) {
				$( '#karma' ).append( '<div id="bija99999" class="flora bijaKarma"/>'  );
				$('#bija99999').attr('id', 'bija'+bija.identifier);			
				$( selector ).dialog(bija.dialog);							
			}
			if (bija.uri.indexOf(".ajax") >= 0) { 			
				$( selector).load(bija.uri).dialog('open');
			} else {
				$( selector ).dialog('open');			
			}
		
		},	

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

		},		
		startup: function() {
				$('body').append('<div id="karma"/>');
				$('#karma').css({width: 0, height: 0, overflow: 'hidden'});
				$("a").each(function(){
						var a = this.href;
						if (a.indexOf('#38;')!= -1 ) {	
							var uriExplorer = a.replace(/#38;/g, "");
							uriExplorer = uriExplorer.replace(/38;/g, "");
							this.href = uriExplorer;
						}
						if (this.href==document.URL) {
							jQuery(this).addClass("selected");
						}
						
				});
				$(".navigation:has(.selected)").addClass("navigationSelected");
				$("a.karma").click(function(){
				  var t = this.title || $(this).text() || this.href;
				  $.geoKarma.fire(t, this.href);
				  return false;
				});		
				$("a.openNewWindow").click(function(){
				  window.open(this.href);
				  return false;
				});		

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

		},	
		string2xml : function(aString) {
      	  return aString.replace(/&/g, "&amp;")
                            .replace(/"/g, "&quot;");
		},
		xml2string : function(aString) {
      	  return aString.replace(/&amp;/g, "&")
                            .replace(/"/g, "&quot;");
		},			
		
		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);





function findChildById(obj, id) {

	if (obj.nodeType == 1) {

		if (obj.id == id) {
			return obj;
		}
		var ret;
		var newObj = obj.firstChild;
		while(newObj != null) {
			ret = findChildById(newObj, id);
			if (ret != null) {
				return ret; 
			}
			newObj = newObj.nextSibling;
		}
	}
	return null;
}

function findChildByIdAndType(obj, aType, id) {
	var ret;
	if (obj == null) {
	   ret = 'Not Found';
	}
	if (obj.nodeType == 1) {

		if ((obj.nodeName == aType) && (obj.id == id)) {
			return obj;
		}
		var newObj = obj.firstChild;
		while(newObj != null) {
			ret = findChildByIdAndType(newObj, aType, id);
			if (ret != null)
				return ret;
			newObj = newObj.nextSibling;
		}
	}
	return null;

}


jQuery.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());
			});
		
		

};

jQuery.fn.calculateTotal = function() {
		return this.each(function() {
			var aSelector = "td[@id^='" + $(this).attr('id') + "_']";			
			var risultato = $(aSelector).calculateColumnTotal();
			$(this).text(Number(risultato.toFixed(2)).toLocaleString());
		});			

};

jQuery.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;

};
