
// ------------------------------------------------------
// declare the document class
// ------------------------------------------------------
function my_document()
{
  // a property (initialized to string)
  this.m_property="";
  this.write=function(string)
  {
     print(string);
  }
};

// ------------------------------------------------------
// dump() function, similar to PHP print_r()
// ------------------------------------------------------
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(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)+")";
	}
	return dumped_text;
}

// ------------------------------------------------------
// serialize ggpt database
// ------------------------------------------------------
function arr2seq(log_array)
{
log_seq = "";
for (tky in log_array)
  {
  entry = log_array[tky];
  seq_kws = new Array();
  i = 0;
  for (key in entry) 
    {
    seq_kws[i] = Array(key,entry[key]).join("=>");
    i++;
    }
  seq_entry = seq_kws.join("|");
  if (seq_entry.trim() != "")
    {
    if (log_seq != "") log_seq = log_seq + "||";
    log_seq = log_seq + seq_entry;
    }
  }
return log_seq;
}

// ------------------------------------------------------
// unserialize ggpt database
// ------------------------------------------------------
function seq2arr(log_seq)
{
log_array = new Array();
entries = log_seq.split("||");
for (seq_entry in entries)
  {
  keywords = entries[seq_entry].split("|");
  keyword_array = new Array();
  for (singlekeyword in keywords) 
    {
    kydata = keywords[singlekeyword].split("=>"); 
    key = kydata[0].trim();
    data = kydata[1].trim();
    if (key != null) {keyword_array[key] = data };  
    }
  if (keyword_array != null) 
    {
    dbkey = keyword_array['time'];
    log_array[dbkey] = keyword_array;
    }
  }
return log_array;
};

// ------------------------------------------------------
// ltrim, rtrim, trim (linke in PHP)
// ------------------------------------------------------
String.prototype.ltrim = function (clist) {
  if (clist) return this.replace (new RegExp ('^[' + clist + ']+'), '');
  return this.replace (/^\s+/, ''); }

String.prototype.rtrim = function (clist) {
  if (clist) return this.replace (new RegExp ('[' + clist + ']+$'), '');
  return this.replace (/\s+$/, ''); }

String.prototype.trim = function (clist) {
  if (clist) return this.ltrim (clist).rtrim (clist);
  return this.ltrim ().rtrim ();    };

// ------------------------------------------------------
// order a sparse array (object) by key (property)
// ------------------------------------------------------
function order(arr,updown)
{
function numsa(a,b) { return a - b; }  // numeric ascending
function numsd(a,b) { return b - a; }  // numeric descending
kys = new Array();
i = 0;
for (ky in arr) { kys[i] = ky; i++; }
if (updown == "a") kys.sort(numsa); // sort keys ascending
if (updown == "d") kys.sort(numsd); // sort keys descending
// if neither "a" nor "d" specified, the array is returned unchanged
ordered = new Array();
for (ky in kys) { ordered[kys[ky]] = arr[kys[ky]] }
return ordered
}

// ------------------------------------------------------
// find index for specified array element
// ------------------------------------------------------
function findX(elmnt,arr)
{
found = "";
for (k in arr) { if (arr[k] == elmnt) { found = k; } }
return found;
};

// ------------------------------------------------------
// if inArray(element,array);
// ------------------------------------------------------
function inArray(elmnt,arr)
{
found = false;
for (k in arr) { if (arr[k] == elmnt) { found = true; break;} }
return found;
};

// ------------------------------------------------------
// calculate arrival time for start_time, distance, speed
// ------------------------------------------------------
// assuming 8 hours daily driving (10:00 to 18:00). 

function arrival_time(start_time, kilometers, kmh)
{
// get and return same time format:  (10 digits or 13 digits)
// returns arrival time in Unix format 
if (start_time.toString().length > 10) time = start_time;
else time = start_time * 1000;

var clock = new Date();
var t2 = new Date();
var clock18 = new Date();
time_available_today = new Date();
actual_driving_today = new Date();
clock.setTime(time);           // start time and current time
hours = kilometers/kmh;        // total (residual) driving time

  while (hours>0)
  {
  clock18.setTime(clock); 
  clock18.setHours(18,00);                // same day, 18:00
  if (clock >= clock18)                   // if current clock  >= 18
    {
    clock.setDate(1+clock.getDate());     // day++
    clock.setHours(10,00);                // clock = 10:00
    }
  clock18.setTime(clock); 
  clock18.setHours(18,00);                // same day, 18:00
  time_available_today = clock18-clock;
  actual_driving_today = Math.min(hours*60*60*1000, time_available_today); 
  clock.setTime(clock.getTime() + actual_driving_today);
  hours = hours - actual_driving_today/(60*60*1000);
  }

if (start_time.toString().length > 10) return clock.getTime(); // js format
else return Math.floor(clock.getTime()/1000);  // unix format
}


// ------------------------------------------------------
// return last element of an array
// ------------------------------------------------------
function end ( array ) {
    var last_elm, key;
    if (array.constructor === Array){
        last_elm = array[(array.length-1)];
    } else {
        for (key in array){
            last_elm = array[key];
        }
    }
    return last_elm;
}

// ------------------------------------------------------
// urldecode
// ------------------------------------------------------
function urldecode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    
    var ret = str;
       
    ret = ret.replace(/\+/g, '%20');
    ret = decodeURIComponent(ret);
    ret = ret.toString();
 
    return ret;
}
