function bodyInit(){
	gJs.bodyInit();
}

/*window.onload = function() {
	gJs.windowLoad();
};*/

/* variabile di appoggio utilizzata per inserire funzioni / variabili con ajax */
var gJs;
gJs = new Object();

gJs.bodyInit = function(){ };

gJs.windowLoad = function(){ };

if (document.__defineGetter__ && !HTMLElement.outerHTML) {
    HTMLElement.prototype.__defineGetter__("outerHTML", function(){
        var emptyTags = {
		   "img":   true,
		   "br":    true,
		   "input": true,
		   "meta":  true,
		   "link":  true,
		   "param": true,
		   "hr":    true
		};

		var attrs = this.attributes,
		tagName = this.tagName.toLowerCase(),
		str = "<" + tagName;
		for (var a = 0; a < attrs.length; a++)
		  str += " " + attrs[a].name + "=\"" + attrs[a].value + "\"";

		if (emptyTags[tagName])
		  return str + " />";
		
		return str + ">" + this.innerHTML + "</"+tagName+">";

    });
}else{
	//alert('Your browser doesn\' support __defineGetter__');
}

function isValueInArray(arr, val) {
  inArray = false;
  for (i = 0; i < arr.length; i++)
	  if (val == arr[i])
		  	inArray = true;
  return inArray;
}

function arrayHas(a,v,i){
	for (var j=0;j<a.length;j++){
		if (a[j]==v) return (!i ? true : j);
	}
	return false;
}

function setOnHoverOutShowHide(objHover,objShowHide,useInvisible){
	objHover = objHover || '';
	objShowHide = objShowHide || '';
	useInvisible = useInvisible || false;
	$(objHover).hover(
		function(){
			if (useInvisible){
				$(objShowHide).removeClass('invisible');
			}else{
				$(objShowHide).fadeIn('fast').show();
			}
		},
		function(){
			if (useInvisible){
				$(objShowHide).addClass('invisible');
			}else{
				$(objShowHide).fadeOut('slow').hide();
			}
		}
	);
}

function reloadPage(params, tim){
	params = params || "";
	tim = tim || 0;
	goTo('./'+params, tim);
}

function popUp(url) {
	newwindow = window.open(url,'','');
	if (window.focus){
		newwindow.focus();
	}
}

function msgInfo(sMex,sTitle,divIdToUse){
	sMex = sMex || "";
	sTitle = sTitle || "Avviso";
	divIdToUse = divIdToUse || "msgInfo";
	msgBox(sMex,sTitle,"close",null,null,null,'msgInfo',true);
}

function msgBox(sMex,sTitle,sType,fOnOkOrYes,fOnNo,fOnCancel,divIdToUse,fullScreen,width){
	divIdToUse = divIdToUse || 'dialog';
	
	if (!gJs.msgBoxCreated){
		window.setTimeout('msgBox(\'' + sMex + '\', \'' + sTitle + '\', \'' + sType + '\', ' + fOnOkOrYes + ', ' + fOnNo + ', ' + fOnCancel + ', ' + divIdToUse + ');', 100);
		return true;
	}
	
	sMex = sMex || "";
	sTitle = sTitle || "Avviso";
	var fClose = function() { closeMsgBox(divIdToUse); };
	fOnOkOrYes = fOnOkOrYes || function(){};
	fOnNo = fOnNo || function(){};
	fOnCancel = fOnCancel || function(){};
	fOnOkOrYes2 = function() { fOnOkOrYes(); fClose(); };
	fOnNo2 = function() { fOnNo(); fClose(); };
	fOnCancel2 = function() { fOnCancel(); fClose(); };
	fullScreen = fullScreen || false;
	width = width || false;
	$('#'+divIdToUse).dialog('option','title', sTitle);
	$('#'+divIdToUse).dialog('option','modal', true);
	$('#'+divIdToUse).html(sMex);
	sType = sType || "Ok";
	switch(sType){
		case "yesNo":
			$('#'+divIdToUse).dialog('option', 'buttons', { "Si": fOnOkOrYes2, "No": fOnNo2 });
			break;
		case "yesNoCancel":
			$('#'+divIdToUse).dialog('option', 'buttons', { "Si": fOnOkOrYes2, "No": fOnNo2, "Annulla": fOnCancel2 });
			break;
		case "close":
			$('#'+divIdToUse).dialog('option', 'buttons', { "Chiudi": fOnOkOrYes2 });
			break;
		case "ok": default:
			$('#'+divIdToUse).dialog('option', 'buttons', { "Ok": fOnOkOrYes2 });
			break;
	}
	if (fullScreen){
		$('#'+divIdToUse).dialog('option', 'width', parseInt($(window).width() - 50));
		$('#'+divIdToUse).dialog('option', 'height', parseInt($(window).height() - 50));
	}
	if (width!=false){
		var olW = $('#'+divIdToUse).dialog( "option", "width" );
		$('#'+divIdToUse).dialog( "option", "width", width );
	}
	$('#'+divIdToUse).dialog('open');
	if (width!=false){
		//$('#'+divIdToUse).dialog( "option", "width", olW );
	}
	return true;
}
function closeMsgBox(sWho){
	$('#'+sWho).dialog("close");
}

function goTo(href,tim){
	href = href || '';
	tim = tim || 0;
	if (href!=''){
		if (tim>0){
			setTimeout("goTo('"+href+"')",tim);
		}else{
			top.location.href = href;
		}
	}
}

function msgForm(sMex,sTitle,sTip,fOnOkOrYes,dontShowCancel,fOnCancel,fOnTryClose){
	sTip = sTip || "";
	var fClose = function() { closeMsgBox('msgForm'); };
	fOnOkOrYes = fOnOkOrYes || function(){};
	dontShowCancel = dontShowCancel || false;
	fOnCancel = fOnCancel || function(){};
	fOnTryClose = fOnTryClose || function(){ return true; };
	fOnOkOrYes2 = function() { fOnOkOrYes(); fClose(); };
	fOnCancel2 = function() { fOnCancel(); fClose(); };
	fOnTryClose2 = function() { if (fOnTryClose()){ fClose(); } };
	
	$('#msgForm').dialog('option','title', sTitle);
	$('#msgForm').dialog('option','modal', true);
	$('#msgForm').dialog('option','width', 870);
	//$('#msgForm').dialog('option','height', 400);
	$('#msgForm').dialog('option', 'closeOnEscape', false);
	$('#msgForm_content').html(sMex);
	$('#msgForm_tips').html(sTip);
	if (dontShowCancel){
		$('#msgForm').dialog('option', 'buttons', { "Ok": fOnOkOrYes2 });
	}else{
		$('#msgForm').dialog('option', 'buttons', { "Ok": fOnOkOrYes2, "Annulla": fOnCancel2 });
	}
	
	$('#msgForm').dialog('open');
}

function msgDialog (sMex, sTitle, aButtons, height, width) {
	height = height || parseInt($(window).height() - 50);
	width = height || parseInt($(window).width() - 50);
	
	$('#msgForm').dialog('option','title', sTitle);
	$('#msgForm').dialog('option','modal', true);
	$('#msgForm').dialog('option','width', '90%');
	$('#msgForm').dialog('option', 'width', width);
	$('#msgForm').dialog('option', 'height', height);
	$('#msgForm').dialog('option', 'closeOnEscape', true);
	$('#msgForm_content').html(sMex);
	$('#msgForm').dialog('option', 'buttons', aButtons );
	$('#msgForm').dialog('open');
}

function msgForm_updateTips(t) {
	var tips = $("#msgForm_tips");
	tips.text(t).effect("highlight",{},1500);
}

function msgForm_checkLength(o,n,min,max) {
	if ( o.val().length > max || o.val().length < min ) {
		o.addClass('ui-state-error');
		updateTips("Length of " + n + " must be between "+min+" and "+max+".");
		return false;
	} else {
		return true;
	}
}

function msgForm_checkRegexp(o,regexp,n) {
	if ( !( regexp.test( o.val() ) ) ) {
		o.addClass('ui-state-error');
		updateTips(n);
		return false;
	} else {
		return true;
	}
}

function isValidTime(timeStr) {
	// Time validation function courtesty of 
	// Sandeep V. Tamhankar (stamhankar@hotmail.com) -->

	// Checks if time is in HH:MM:SS AM/PM format.
	// The seconds and AM/PM are optional.

	var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;

	var matchArray = timeStr.match(timePat);
	if (matchArray == null) {
	//alert("Time is not in a valid format.");
	return false;
	}
	hour = matchArray[1];
	minute = matchArray[2];
	second = matchArray[4];
	ampm = matchArray[6];

	if (second=="") { second = null; }
	if (ampm=="") { ampm = null }

	if (hour < 0  || hour > 23) {
	//alert("Ora: deve essere un valore compreso tra 1 e 12. (o 0 e 23)");
	return false;
	}
	if (hour <= 12 && ampm == null) {
	if (confirm("Indica il formato usato.  OK = Standard Time, CANCEL = Military Time")) {
	//alert("Specifica se AM o PM.");
	return false;
	   }
	}
	if  (hour > 12 && ampm != null) {
	//alert("You can't specify AM or PM for military time.");
	return false;
	}
	if (minute < 0 || minute > 59) {
	//alert ("Minuti: tra 0 e 59.");
	return false;
	}
	if (second != null && (second < 0 || second > 59)) {
	//alert ("Secondi: tra 0 e 59.");
	return false;
	}
	return true;
}


function getTimeDiff(s1,s2){
	date1 = new Date();
	date2 = new Date();
	diff  = new Date();

	s1 = s1 || "00:00";
	s2 = s2 || "00:00";
	
	date1temp = new Date("12/21/2012 " + s1);
	date2temp = new Date("12/21/2012 " + s2);
	
	date1.setTime(date1temp.getTime());
	date2.setTime(date2temp.getTime());

	diff.setTime(Math.abs(date1.getTime() - date2.getTime()));

	timediff = diff.getTime();

	hours = Math.floor(timediff / (1000 * 60 * 60)); 
	timediff -= hours * (1000 * 60 * 60);

	mins = Math.floor(timediff / (1000 * 60)); 
	timediff -= mins * (1000 * 60);

	secs = Math.floor(timediff / 1000); 
	timediff -= secs * 1000;

	aRet = [hours, mins, secs];
	
	return aRet; 
}

function timeMillisecToHMS(millisec){
	millisec = millisec || 0;
	
	hours = Math.floor(millisec / (1000 * 60 * 60)); 
	millisec -= hours * (1000 * 60 * 60);

	mins = Math.floor(millisec / (1000 * 60)); 
	millisec -= mins * (1000 * 60);

	secs = Math.floor(millisec / 1000); 
	millisec -= millisec * 1000;
	
	aRet = [hours, mins, secs];
	
	return aRet; 
}

function timeSubtract(s1,s2){
	date1 = new Date();
	date2 = new Date();
	diff  = new Date();
	
	s1 = s1 || "00:00:00";
	s2 = s2 || "00:00:00";
	
	date1temp = new Date("12/21/2012 " + s1);
	date2temp = new Date("12/21/2012 " + s2);
	
	diff.setTime(Math.abs(date1.getTime() - date2.getTime()));

	timediff = diff.getTime();
	
	return timediff;
}


gJs.getImgLoading = function(){
	return '<img src="main/imgs/circle-ajax-loader.gif" />';
}


//BrowserDetect.browser
//BrowserDetect.version
//BrowserDetect.OS
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function browserIsIe(){
	if (BrowserDetect.browser == "Explorer"){
		return true;
	}else{
		return false;
	}
}
function browserIsIe6(){
	if (BrowserDetect.browser == "Explorer" && BrowserDetect.version == "6"){
		return true;
	}else{
		return false;
	}
}


//----------------- BMESSAGES messagebox, YesNo, Yes ------------------- {

var glBMessages = new Object();
glBMessages.textMessage = "";
glBMessages.visible = false;
glBMessages.pressOk = function(){ };
glBMessages.pressCancel = function(){ };
glBMessages.hideMessage = function(){
	var obM = document.getElementById('bMessages');
	if (obM){
		$('#bMessages').hide();
		$('#bMessages_bCancel').hide();
		$('#bMessages_bOk').hide();
	}
	glBMessages.visible = false;
}
glBMessages.showMessage = function(){
	$('#bMessages').show();
	glBMessages.visible = true;
}
glBMessages.yesNo = function(){
	$('#bMessages_bCancel').show();
	$('#bMessages_bOk').show();
}
glBMessages.yesOnly = function(){
	$('#bMessages_bCancel').hide();
	$('#bMessages_bOk').show();
}
glBMessages.setMessage = function(sMex){
	glBMessages.textMessage = sMex;
	$('#bMessages_messageText').html(sMex);
}
glBMessages.resetOnPressCancel = function(){
	glBMessages.pressCancel = function(){
		glBMessages.hideMessage();
	}
}
glBMessages.resetOnPressOk = function(){
	glBMessages.pressOk = function(){
		glBMessages.hideMessage();
	}
}
glBMessages.resetOnPressCancel();
glBMessages.resetOnPressOk();

// } ----------------- FINE BMESSAGES messagebox, YesNo, Yes --------------

//var jSonData = JSON.stringify(data);
gJs.params2json = function(d) {
     if (d.constructor != Array) {
         return d;
     }
     var data={};
     for(var i=0;i<d.length;i++) {
         if (typeof data[d[i].name] != 'undefined') {
             if (data[d[i].name].constructor!= Array) {
                 data[d[i].name]=[data[d[i].name],d[i].value];
             } else {
                 data[d[i].name].push(d[i].value);
             }
         } else {
             data[d[i].name]=d[i].value;
         }
     }
     return data;
 };

 // restituisce un array di elementi array [nome, valore] di un oggetto form
 // NB: impostare anche il nome, o passare TRUE come terzo parametro per non escludere i campi senza NAME impostato
 gJs.getFormValues = function(objForm,wich,dontEclude_ifNameEmpty){
	var data = {}; 
	wich = wich || '';
	dontEclude_ifNameEmpty = dontEclude_ifNameEmpty || false;
	objForm = objForm || false;
	if (objForm){
		for(i=0; i<objForm.elements.length; i++){
			if (!dontEclude_ifNameEmpty && (objForm.elements[i].name=='')){
				// excludo
			}else{
				if (wich){
					if (wich==objForm.elements[i].name){
						data = gJs.getFormElementNameAndValue(objForm.elements[i]); // solo quello specificato
					}
				}else{
					data[i] = gJs.getFormElementNameAndValue(objForm.elements[i]); // accoda
				}
			}
		}
	}
	return data;
 }

 gJs.getFormElementNameAndValue = function(formElement)
	{
	 	var type = undefined;
		if(formElement.length != null) if(formElement[0] != null) type = formElement[0].type;
		if((typeof(type) == 'undefined') || (type == 0)) type = formElement.type;

		var data = new Object();
		data.value = null;
		data.name = formElement.name;
		switch(type)
		{
			case 'undefined':
				data.name = "";
				break;

			case 'radio':
				for(var x=0; x < formElement.length; x++) 
					if(formElement[x].checked == true)
						data.value = formElement[x].value;
				break;

			case 'select-multiple':
				var myArray = new Array();
				for(var x=0; x < formElement.length; x++) 
					if(formElement[x].selected == true)
						myArray[myArray.length] = formElement[x].value;
				data.value = myArray;
				break;
				

			case 'checkbox':
				data.value = formElement.checked;
				break;
		
			default:
				data.value = formElement.value;
				break;
		}
		return data;
	}
 
 if (document.__defineGetter__ && !HTMLElement.outerHTML) {
	    HTMLElement.prototype.__defineGetter__("outerHTML", function(){
	        var emptyTags = {
			   "img":   true,
			   "br":    true,
			   "input": true,
			   "meta":  true,
			   "link":  true,
			   "param": true,
			   "hr":    true
			};

			var attrs = this.attributes,
			tagName = this.tagName.toLowerCase(),
			str = "<" + tagName;
			for (var a = 0; a < attrs.length; a++)
			  str += " " + attrs[a].name + "=\"" + attrs[a].value + "\"";

			if (emptyTags[tagName])
			  return str + " />";
			
			return str + ">" + this.innerHTML + "</"+tagName+">";

	    });
	}else{
		//alert('Your browser doesn\' support __defineGetter__');
	}
 
gJs.getElementValue = function(formElement)
{
	if(formElement.length != null) var type = formElement[0].type;
	if((typeof(type) == 'undefined') || (type == 0)) var type = formElement.type;

	switch(type)
	{
		case 'undefined': return false;

		case 'radio':
			for(var x=0; x < formElement.length; x++) 
				if(formElement[x].checked == true)
			return formElement[x].value;

		case 'select-multiple':
			var myArray = new Array();
			for(var x=0; x < formElement.length; x++) 
				if(formElement[x].selected == true)
					myArray[myArray.length] = formElement[x].value;
			return myArray;

		case 'checkbox': return formElement.checked;
	
		default: return formElement.value;
	}
}

gJs.getJqGridData = function(idJqGrid){
	var nR = jQuery("#"+idJqGrid).getGridParam('records');
	var aRows = new Array();
	for(i=0;i<nR;i++){
		aRows.push(jQuery("#"+idJqGrid).getRowData(i+1));
	}
	return JSON.stringify(aRows);
}


/* objectsArraysStrings.js */
/*
     Example File From "JavaScript and DHTML Cookbook"
     Published by O'Reilly & Associates
     Copyright 2003 Danny Goodman
*/

function object2String(obj) {
    var val, output = "";
    if (obj) {    
        output += "{";
        for (var i in obj) {
            val = obj[i];
            switch (typeof val) {
                case ("object"):
                    if (val[0]) {
                        output += i + ":" + array2String(val) + ",";
                    } else {
                        output += i + ":" + object2String(val) + ",";
                    }
                    break;
                case ("string"):
                    output += i + ":'" + escape(val) + "',";
                    break;
                default:
                    output += i + ":" + val + ",";
            }
        }
        output = output.substring(0, output.length-1) + "}";
    }
    return output;
}

function array2String(array,valueEnclosure,atStart,atEnd) {
    var output = "";
    valueEnclosure = valueEnclosure || "'";
    atStart = atStart || "[";
    atEnd = atEnd || "]";
    if (array) {
        output += atStart;
        for (var i in array) {
            val = array[i];
            switch (typeof val) {
                case ("object"):
                    if (val[0]) {
                        output += array2String(val) + ",";
                    } else {
                        output += object2String(val) + ",";
                    }
                    break;
                case ("string"):
                    output += valueEnclosure + escape(val) + valueEnclosure + ",";
                    break;
                default:
                    output += val + ",";
            }
        }
        output = output.substring(0, output.length-1) + atEnd;
    }
    return output;
}

function array2StringSimple(array,separator) {
    var output = "";
    var valueEnclosure = "";
    var atStart = "";
    var atEnd = "";
    separator = separator || ",";
    if (array) {
        output += atStart;
        for (var i in array) {
           val = array[i];
           output += val + separator;
        }
        output = output.substring(0, output.length-1) + atEnd;
    }
    return output;
}

function string2Object(string) {
    eval("var result = " + string);
    return result;
}

function string2Array(string) {
    eval("var result = " + string);
    return result;
}

function print_r(array,return_val){var output="",pad_char=" ",pad_val=4;var formatArray=function(obj,cur_depth,pad_val,pad_char){if(cur_depth>0){cur_depth++;}
var base_pad=repeat_char(pad_val*cur_depth,pad_char);var thick_pad=repeat_char(pad_val*(cur_depth+1),pad_char);var str="";if(obj instanceof Array||obj instanceof Object){str+="Array\n"+base_pad+"(\n";for(var key in obj){if(obj[key]instanceof Array){str+=thick_pad+"["+key+"] => "+formatArray(obj[key],cur_depth+1,pad_val,pad_char);}else{str+=thick_pad+"["+key+"] => "+obj[key]+"\n";}}
str+=base_pad+")\n";}else if(obj==null||obj==undefined){str='';}else{str=obj.toString();}
return str;};var repeat_char=function(len,pad_char){var str="";for(var i=0;i<len;i++){str+=pad_char;};return str;};output=formatArray(array,0,pad_val,pad_char);if(return_val!==true){document.write("<pre>"+output+"</pre>");return true;}else{return output;}}

function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";

	if (level<=5){
	
		if(typeof(arr) == 'object') { //Array/Hashes/Objects 
			for(var item in arr) {
				var value = arr[item];
				
				if(typeof(value) == 'object') { //If it is an array,
					dumped_text += level_padding + "'" + item + "' ...\n";
					dumped_text += dump(value,level+1);
				} else {
					dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
				}
			}
		} else { //Stings/Chars/Numbers etc.
			dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
		}

	}else{
		dumped_text = " !!! fermato a LIVELLO 5";
	}
	
	return dumped_text;
}	
