
/**
 * 
 * @param arr
 * @param level
 * @return
 */
function dump(arr, maxlevel, level)
{
	var dumped_text = "";
	if(!level) level = 0;
	
	if(!maxlevel)maxlevel=8;
	if(level>=maxlevel)return;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	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,maxlevel,level+1);
			  } else {
				  dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			  }
		 }
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
} 

function dumpHTML(arr, maxlevel){
	return '<pre style="font-size:11px;color: #000000; text-align:left;">'+dump(arr,maxlevel)+'</pre>';
}

function sizeof ( mixed_var, mode ) {
 
    return this.count( mixed_var, mode );
}

/**
 * Visualizza un oggetto JSON,JS
 * @param obj L'oggetto da visualizzare a schermo in formato HTML.
 * @return
 */
function show(obj,maxlevel)
{
  alertHTML('<pre style="font-size:11px;color: #000000; text-align:left;">'+dump(obj,maxlevel)+'</pre>');
}

/**
 * Funzione che conta il numero di attributi di un oggetto o array
 */
function count(obj){
	var c=0;
	for(var i in obj)c++;
	return c;
}

/**
 * 
 * @param obj L'array su cui ricercare
 * @param value Il valore da ricercare
 * @return Restituisce l'indice in cui ha trovato l'elemento value oppure -1 se non trovato.
 */
function search(obj,value)
{
	for(var i in obj)
	{
		if(obj[i] == value)
			return i;
	}
	return -1;
}

/**
 * 
 * @param obj
 * @param index
 * @param howMany
 * @return
 */
function remove(obj,index,howMany)
{
	if(howMany==null)howMany=1;
	obj.splice(index,howMany);
}

/**
 * 
 * @param str
 * @return
 */
function ucfirst (str)
{
    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1);
}
/**
 * Funzione di utilit� che esegue l'ordinamento su un array.
 * @param array L'array su cui fare l'ordinamento.
 * @param order L'ordine in cui verr� fatto l'ordinamento,pu� essere asc,desc.
 * @return
 */
function sortArray(array,order){
	if(order == null) order = "asc";
	//Sort sull'array
	array.sort(function(a,b) {
			return order == "asc" ? (b-a) :(a - b);
		}
	);
}
/**
 * Ritorna il primo elemento di un oggetto
 * @param obj oggetto json / array
 * @return
 */
function first(obj){
	for(var i in obj)return obj[i];
}

/**
 * Esegue tracking diretto data la tabella e il valore corrispondente
 * @param tabella Il nome della tabella su cui fare riferimento 'ordini','lavorazioni',ecc
 * @param valore  Il valore da assegnare al campo d'inserimento.
 * @param msg La descrizione che verra inserita nella corrispondente tabella.
 * @return 
 */
function directTracking(tabella,valore,msg)
{
	var record = getRecord(valore);
	
	//Direct tracking
	var sql_data = date('mysql');
	var sql_ora = time();
	
	$.post(DIR_PHP+'tracking/tracking.php',
	{ 
		  func :'aggiungiTracking',
		  tabella : tabella,
		  record : valore,
		  id_utente : client.info.id,
		  descrizione: msg,
		  data_inserimento : sql_data,
		  ora_inserimento : sql_ora,
		  nome : client.info.nome + " " + client.info.cognome
	});
}

/**
 * Estende string.replace in ricorsivo
 * @param replaceMe
 * @param replaceWithMe
 * @return
 */
String.prototype.replaceR=function(replaceMe, replaceWithMe){
	var result = this;
	while( result.indexOf( replaceMe ) > -1 ){
		result = result.replace(replaceMe, replaceWithMe);
	}
	return result;
};

/**
 * Ritorna true se la stringa contiene la sottostringa passata
 * @param str
 * @return
 */
String.prototype.contains=function(str){
	if( this.indexOf( str ) > -1 )return true;
	return false;
};

/**
 * 
 */
jQuery.fn.insertRecord=function(json){
	var element = $(this);
	$.post(DIR_PHP+'actions/actions.php',{ func : 'newRecord', tabella : json.tabella },
				function(id){
					client.search.record(id);
				}
	);
};

/**
 * Plugin jQuery che limita la lunghezza di un oggetto nell'intervallo specificato
 */
jQuery.fn.limitLength=function(json) {
	if(json == null) json = {};
	
	if(json.maxLength == null) json.maxLength = 160;

	var length = $(this).val().length;
	if(length >= json.maxLength)
	{
		$(this).val($(this).val().substring(0,json.maxLength));
	}
};


/**
 * Clonare un oggetto
 * @param obj
 * @return
 */
function clone(obj) {
    if (typeof obj !== 'object' || obj == null) {
        return obj;
    }
 
    var c = obj instanceof Array ? [] : {};
 
    for (var i in obj) {
        var prop = obj[i];
 
        if (typeof prop == 'object') {
           if (prop instanceof Array) {
               c[i] = [];
 
               for (var j = 0; j < prop.length; j++) {
                   if (typeof prop[j] != 'object') {
                       c[i].push(prop[j]);
                   } else {
                       c[i].push(clone(prop[j]));
                   }
               }
           } else {
               c[i] = clone(prop);
           }
        } else {
           c[i] = prop;
        }
    }
 
    return c;
}

//Controlla se la stringa inputata � un numero reale
function IsNumeric(strString){

   var strValidChars = "0123456789.-";
   var strChar;
   var blnResult = true;

   if (strString.length == 0) return false;

   //  test strString consists of valid characters listed above
   for (i = 0; i < strString.length && blnResult == true; i++)
      {
      strChar = strString.charAt(i);
      if (strValidChars.indexOf(strChar) == -1)
         {
         blnResult = false;
         }
      }
   return blnResult;
}


/**
 * serializza una form per avere il post
 */
$.fn.getPost = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function(){
        if (o[this.name]){
            if (!o[this.name].push){
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value);
        }
        else o[this.name] = this.value;
    });
    return o;
};

/**
 * processa un post e lo inserisce nel form
 */
jQuery.fn.loadForm = function(fn)
{
	var form_names = {};
	var form_names_index = 0;
    $(this).find('*[name]').each(function(fn) {
    	// Ottiene tutti i nomi delle componenti del form
    	form_names[form_names_index] = $(this).attr('name');
    	form_names_index++;
    });
    var obj = $(this);
    $.phpGet('account', form_names, function(data){
    	obj.find('*[name]').each(function() {
    		// Imposta tutti i contenuti del form con il valore trovato
    		var name = $(this).attr('name');
    		var type = $(this).attr('type');
    		if(name.lastIndexOf('_r') == name.length - 2) name = name.substring(0,name.lastIndexOf('_r'));
    		if(data[name]){
    			if((type == 'radio' || type == 'checkbox')){
    				if($(this).val() == data[name]){
						$(this).attr('checked','checked');
						$(this).data('corretto',true);
    				}
    			}else{
	    			$(this).val(data[name]);
	    			$(this).data('corretto',true);
    			}
    		}
    	});
    	if(fn!=null) fn();
	});
};

/**
 * serializza una form per avere il post
 */
$.fn.toObj = function(keys)
{
    var res = {};
    if(!keys)keys= new Array ('value');
    $(this).find('input[name], select[name],textarea[name]').each(
    		function(){
    			var name = $(this).attr('name');
    			res[name] = {};
    			for (var i in keys){
    				if(!$(this).attr('disabled') && $(this).attr(keys[i])) {
    					res[name][keys[i]] = $(this).attr(keys[i]);
    				}
    			}
    		}
    );
    return res;
};




/**
 * Disabilita  select/imput/textarea/option
 **/

jQuery.fn.disable = function(){
	
	$(this).each(function(){
		var isSelected = false;
		if($(this).attr('selected'))isSelected=true;
		$(this).removeAttr('selected').attr('disabled','disabled');
		
		if($(this).attr('tagName')=='OPTION'){
			if( $.browser.msie && (jQuery.browser.version==6.0))$(this).parent().after($(this).hide());
			if(isSelected)$(this).parent().children(':not(option[disabled])').filter(':eq(0)').attr('selected','selected');
		}
	});
};

/**
 * Disabilita  select/imput/textarea/option
 **/

jQuery.fn.enable = function(){
	
	$(this).each(function(){
		$(this).removeAttr('disabled');
		if( $.browser.msie && (jQuery.browser.version==6.0) && $(this).attr('tagName')=='OPTION'){
			$(this).prevAll('select:first').append($(this));
		};
	});
};


//Controlla se il rettangolo con dim1 è contenuto nel secondo rettangolo con dimensioni pari dim2  (formato bxh)con il secondo
function exceeds(base,altezza,DIM){
	var b = Math.max(base,altezza);
	var h = Math.min(base,altezza);
	
	var container = DIM.split('x');
	var B = Math.max(container[0],container[1]);
	var H = Math.min(container[0],container[1]);
	
	if( b > B || h > B || (h > H && b > H ) )return true;
	else return false;
	
}


/**
 * Numeric value
 */

jQuery.fn.nval=function(){
	if( $(this).val()=='' || isNaN($(this).val()) )return 0;
	return parseFloat($(this).val());
};

/**
 * Funzione che aggiorna la parte destra del sito
 */
jQuery.fn.updateRightColumn=function(id,url,post,fn){
	if($('#right-column').find('#'+id).attr('id')==null){
		var div = '<div id="'+id+'"></div>';
		$('#right-column').append(div);
	}
	$('#right-column').find('#'+id).load(url,post,fn);
};