

var g_report_feature = new Array();
g_report_feature['SPECIFY_START_DATE']			= "0";
g_report_feature['SPECIFY_START_TIME']			= "1";
g_report_feature['SPECIFY_END_DATE']			= "2";
g_report_feature['SPECIFY_END_TIME']			= "3";
g_report_feature['DAY']							= "4";
g_report_feature['WEEKEND']						= "5";
g_report_feature['WEEK']						= "6";
g_report_feature['MONTH']						= "7";
g_report_feature['YEAR']						= "8";

// Report based on...
g_report_feature['BY_VEHICLE']					= "9";
g_report_feature['BY_VEHICLE_COLLECTION']		= "10";
g_report_feature['BY_POI']						= "11";
g_report_feature['BY_POI_COLLECTION']			= "12";
g_report_feature['BY_DRIVER']					= "13";
g_report_feature['BY_DRIVER_COLLECTION']		= "14";
g_report_feature['BY_ASSET']					= "15";
g_report_feature['BY_ASSET_COLLECTION']			= "16";
g_report_feature['BY_GROUP']					= "18";

// Filtering options...
g_report_feature['MIN_SPEED_FILTER']			= "19";
g_report_feature['MIN_TOTAL_DISTANCE_FILTER']	= "20";
g_report_feature['POI_ID_FILTER']				= "21";
g_report_feature['POI_COLLECTION_ID_FILTER']	= "22";
g_report_feature['MIN_FUEL_FILTER']				= "23";
g_report_feature['MAX_FUEL_FILTER']				= "24";
g_report_feature['OUT_OF_HOURS_FILTER']			= "25";


g_report_feature['HTML_FORMAT']					= "100";
g_report_feature['DHTML_FORMAT']				= "101";
g_report_feature['CSV_FORMAT']					= "102";


var g_timescale = new Array();
g_timescale['TODAY']							= "0";
g_timescale['YESTERDAY']						= "1";
g_timescale['CURRENT_WEEK']						= "2";
g_timescale['PREVIOUS_WEEK']					= "3";
g_timescale['PREVIOUS_WEEKEND']					= "4";
g_timescale['CURRENT_MONTH']					= "5";
g_timescale['PREVIOUS_MONTH']					= "6";
g_timescale['CURRENT_YEAR']						= "7";
g_timescale['PREVIOUS_YEAR']					= "8";

var g_resource_type = new Array();
g_resource_type['VEHICLE']				= 0;
g_resource_type['VEHICLE_COLLECTION']	= 1;
g_resource_type['DRIVER']				= 2;
g_resource_type['DRIVER_COLLECTION']	= 3;
g_resource_type['ASSET']				= 4;


var printWindow = null;

var g_journey_summary_report_id			    = 38;						// dont like this - but swift has to know for last journey info
 
var g_language = new Array();
var g_session_id						= "";						// logged in session id
//var g_user								= null;						// user object;
var g_poigroup_array					= new Array();				// array of poi groups logged in user can see
var g_driver_array						= new Array();				// array of drivers
var g_sequence_id						= 0;						// used for sequencing of webservice calls, now this is in the report engine it may not be required
var g_report_offset						= 0;						// used for retrieving reports in chunks where possible (e.g. grouped reports)
var g_report_id							= -1;						// selected report id
var g_start_datetime					= "";
var g_end_datetime						= "";
var g_selected_timescale_id				= -1;
var g_selected_id						= "";						// selected id
var g_selected_type						= -1;						// selected type
var g_selected_name						= "";						// name selected

var g_backtovts_selected_id				= -1;						// selected id (driver_id,imei etc) for the report we drilled into
var g_backtovts_selected_type           = -1;						// selected resource type (driver/vehicle etc) for the report we drilled into
var g_backtovts_start_datetime          = "";						// startdatetime for the report we drilled into
var g_backtovts_end_datetime            = "";						// enddatetime for the report we drilled into
var g_backtovts_report_id               = -1;						// report id that we drilled into


var	g_start_date_calendar;
var	g_end_date_calendar;
var g_default_report_id					= "29";  


// current reprot wizard settings
var g_journey_count_limit               =   0;
var g_min_speed_limit_uom				=	0;
var g_min_speed_limit_ms  				=	0;
var g_min_distance_limit_uom			=	0;
var g_min_distance_limit_m				=	0;
var g_poi_group_id_filter			    =   0;

var g_driver_id							=	0;			// TODO: this should use g_selected_id really????
var g_driver_name						=	"";

var g_asset_id							=	0;			// TODO: this should use g_selected_id really????
var g_asset_name						=	"";

var g_min_fuel_limit		            =   5;
var g_max_fuel_limit	                =   25;

var g_day_filter						=   0;
var g_day_start_time_filter				=   "00:00:00";
var g_day_end_time_filter				=	"23:59:59";
var g_within_day_filter					=	1;

// TODO: get these settings from the user request to enable users to configure when their weekend starts
var g_start_of_weekend_day				= 5;	
var g_end_of_weekend_day				= 1;		
var g_start_of_weekend_time				= " 20:00:00";	
var g_end_of_weekend_time				= " 04:00:00";
var g_start_of_day_time					= " 00:00:00";
var g_end_of_day_time					= " 23:59:59";

var g_yesterday_start_datetime			= "";
var g_yesterday_end_datetime			= "";

var g_today_start_datetime				= "";
var g_today_end_datetime				= "";

var g_current_week_start_datetime		= "";
var g_current_week_end_datetime			= "";

var g_previous_week_start_datetime		= "";
var g_previous_week_end_datetime		= "";

var g_current_month_start_datetime		= "";
var g_current_month_end_datetime		= "";

var g_previous_month_start_datetime		= "";
var g_previous_month_end_datetime		= "";

var g_previous_weekend_start_datetime	= "";
var g_previous_weekend_end_datetime		= "";

function _DBG(level,str)
{
	try
	{
		
		if(level==0) // exception
			debugHelper.Exception(":"+str);
		else if(level==1) // warn
			debugHelper.Warn(": "+str);
		else if(level==2) // message
			debugHelper.Message(":  "+str);		
		else if(level==3) // verbose
			debugHelper.Verbose(":   "+str);
	}
	catch(ex)
	{
		debugHelper.Exception("exception in debug call:"+ex.message);
	}

}

var Utf8 = {

    // public method for url encoding
    encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // public method for url decoding
    decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}

function translate_token(token)
{
	try
	{	
		var translated = g_language[token];
		if(typeof(translated) != "undefined") 
		{
			return translated;			
			//return Utf8.decode(translated);
			//return Utf8.encode(translated);
		}
		else return token;
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}	
}

// initialise the users reporting timeframes
function init_timeframes() 
{
	try
	{		
		_DBG(2,_FUNC(arguments.callee)+":"+"entered");

		// todays date
		var temp_date						= new Date()
		today_date							= temp_date.formatDate("Y-m-d H:i:s");
		g_today_start_datetime				= temp_date.formatDate("Y-m-d") + g_start_of_day_time;
		g_today_end_datetime				= temp_date.formatDate("Y-m-d") + g_end_of_day_time;		
		_DBG(2,"TODAY: "+g_today_start_datetime+" - "+g_today_end_datetime);
	
		// yesterday
		temp_date							= new Date()		
		temp_date.addDays(-1);
		g_yesterday_start_datetime			= temp_date.formatDate("Y-m-d") + g_start_of_day_time;
		g_yesterday_end_datetime			= temp_date.formatDate("Y-m-d") + g_end_of_day_time;
		_DBG(2,"YESTERDAY: "+g_yesterday_start_datetime+" - "+g_yesterday_end_datetime);


		// current week 
		temp_date= new Date()
		if(temp_date.getDay() != g_user.week_start_index)
			temp_date.moveToDayOfWeek(g_user.week_start_index,-1)
		
		g_current_week_start_datetime		=  temp_date.formatDate("Y-m-d") + g_start_of_day_time;
		temp_date.addDays(6);
		g_current_week_end_datetime			= temp_date.formatDate("Y-m-d") + g_end_of_day_time;
		_DBG(2,"CURRENT WEEK: "+g_current_week_start_datetime+" - "+g_current_week_end_datetime);

		// previous week (end first)
		temp_date.addDays(-7);		
		g_previous_week_end_datetime		= temp_date.formatDate("Y-m-d") + g_end_of_day_time;
		temp_date.addDays(-6);		
		g_previous_week_start_datetime		= temp_date.formatDate("Y-m-d") + g_start_of_day_time;
		_DBG(2,"PREVIOUS WEEK: "+g_previous_week_start_datetime+" - "+g_previous_week_end_datetime);

		// current month
		temp_date= new Date()		
		temp_date.setDate(1);
		g_current_month_start_datetime		= temp_date.formatDate("Y-m-d") + g_start_of_day_time;
		temp_date.addMonths(1);
		temp_date.addDays(-1);
		g_current_month_end_datetime		= temp_date.formatDate("Y-m-d") + g_end_of_day_time;
		_DBG(2,"CURRENT MONTH: "+g_current_month_start_datetime+" - "+g_current_month_end_datetime);
		
		// previous month
		temp_date= new Date()
		temp_date.addMonths(-1);
		temp_date.setDate(1);
		g_previous_month_start_datetime		= temp_date.formatDate("Y-m-d") + g_start_of_day_time;
		temp_date.addMonths(1);
		temp_date.addDays(-1);
		g_previous_month_end_datetime		= temp_date.formatDate("Y-m-d") + g_end_of_day_time;		
		_DBG(2,"PREVIOUS MONTH: "+g_previous_month_start_datetime+" - "+g_previous_month_end_datetime);

		// previous weekend start date
		temp_date= new Date()
		temp_date.moveToDayOfWeek(g_start_of_weekend_day,-1);
		g_previous_weekend_start_datetime	= temp_date.formatDate("Y-m-d") + g_start_of_weekend_time;
		temp_date.moveToDayOfWeek(g_end_of_weekend_day,1);
		g_previous_weekend_end_datetime		= temp_date.formatDate("Y-m-d") + g_end_of_weekend_time;
		_DBG(2,"PREVIOUS WEEKEND: "+g_previous_weekend_start_datetime+" - "+g_previous_weekend_end_datetime);
	}
	catch(ex)
	{
	
		_DBG(0,ex.message);
	}
}


function init_language() 
{
	try
	{
		_DBG(2,_FUNC(arguments.callee)+":"+"entered");	
		_DBG(2,"loading language_id = "+g_user.language_id);
		
		var script		= document.createElement('script');
		script.type		= 'text/javascript'; 
		script.charset	= "utf-8";				
		script.src		= 'php/language.php?id='+g_user.language_id+'&js=1&rnd='+Math.random().toString();

		document.getElementsByTagName('head')[0].appendChild(script); 
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

// load the calendar
function load_calendar() 
{
	try
	{
		_DBG(2,_FUNC(arguments.callee)+":"+"entered");
		g_start_date_calendar	= new Epoch('g_start_date_calendar','popup',document.getElementById('reportselector_start_date'),false); 
		g_end_date_calendar		= new Epoch('g_end_date_calendar','popup',document.getElementById('reportselector_end_date'),false); 

	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}



function load_time_picker(e)
{
	try
	{
		_DBG(2,_FUNC(arguments.callee)+":"+"entered");
		if(e)
		{
	
			var x = translate_token("time_format");
			var d = new Date();	
			for(i = 0; i < (24*60*60); i+=(15*60)) // every minute
			{			
				var el   = document.createElement('option');				

				el.id		 = e.id+i;	// minute of the day
				d.setHours(0);
				d.setMinutes(0);
				d.setSeconds(i);

				el.innerHTML = d.formatDate(x);
				el.alt       = el.innerHTML;
				el.title     = el.innerHTML;
				e.appendChild(el); 
			}
			var i = 24*60*60-1;
			var el   = document.createElement('option');
			el.id		 = e.id+i;	// minute of the day
			d.setHours(0);
			d.setMinutes(0);
			d.setSeconds(i);
			el.innerHTML = d.formatDate(x);
			el.alt       = el.innerHTML;
			el.title     = el.innerHTML;
			e.appendChild(el); 
		
		}
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}

function encode_xml(string) 
{
	try
	{
		var LT = new RegExp("<", "g");   
        var GT = new RegExp(">", "g");   
        var AMP = new RegExp("&", "g");   
        var TAB = new RegExp("\t", "g");   
        var QUOT = new RegExp("\"", "g");   
        var APOS = new RegExp("\'", "g");
        
		return string.replace(AMP,'&amp;').replace(LT,'&lt;').replace(GT,'&gt;').replace(APOS,'&apos;').replace(QUOT,'&quot;').replace(TAB,' ');
	}
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function get_branding_img(img)
{
	try
	{
		return g_app_path+"/images/"+g_user.branding_name+"/"+img;
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function is_uom_metric()
{
	try
	{
		return ((g_user.uom == "1")  || (g_user.uom == "metric"))
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function get_uom_distance_units()
{
	try
	{
		if (is_uom_metric()) 
		{
			return translate_token("metric_distance");
		}
		else
		{
			return translate_token("imperial_distance");
		}
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function get_uom_speed_units()
{
	try
	{
		
		if (is_uom_metric())
		{
			return translate_token("metric_speed");
		}
		else
		{
			return translate_token("imperial_speed");
		}
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function is_visible(item)
{
	try
	{
		if(typeof(item) == "string") 
			return (document.getElementById(item).style.display == "block");
		else
			return (item.style.display == "block");
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}	
}

function get_array_item(item_array,item_index,item_index_keyname )
{
	try
	{
		for(var i = 0 ; i < item_array.length;i++)
		{	
			var item = item_array[i];
			if(item[item_index_keyname])
			{
				
				if(item[item_index_keyname] == item_index) 
				{
					return item;
				}
			}
		}
		
		return 0;
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function add_option(item,id,text)
{
	try
	{
		var el = document.createElement("option");
		el.value	 = id;
		el.innerHTML = text;
		document.getElementById(item).appendChild(el);
	}
	catch(e)
	{
		_DBG(0,e.message);
	}
}

function show_element(item,show)
{
	try
	{		
		if(typeof(item) == "string") 
			document.getElementById(item).style.display = (show ? 'block' : 'none');			
		else
			item.style.display = (show ? 'block' : 'none');
	}
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}


function is_feature_enabled(feature_array,feature_id)
{
	try
	{
		var feature = get_array_item(feature_array,feature_id,'id');
		if(typeof(feature.arg) != 'undefined') 
		{
			if(feature.arg == 1) return true;
		}
		return false;
	}	
	catch(ex)
	{
	    _DBG(0,ex.message);
	}
}

function is_user_uom_metric()
{
	try
	{
	    return ((g_user.uom == 'metric') || (g_user.uom == '1'));
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}

function convert_uom_speed_to_ms(speed) 
{
	try
	{
		_DBG(2,_FUNC(arguments.callee)+":"+"entered");

		if (speed > 0) 
		{
			if (!is_user_uom_metric()) 
			{
				var ms_speed = speed / 2.23693629;	   
			} 
			else 
			{
				var ms_speed = speed / 3.6;	  
			}
			return ms_speed;
		} 
		else 
		{
			return 0;
		}
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}



function convert_uom_distance_to_m(distance) 
{
	try
	{
		_DBG(2,_FUNC(arguments.callee)+":"+"entered");

		if (distance > 0) 
		{
			if (!is_user_uom_metric()) 
			{
				var m_distance = Math.floor( distance * 1609.344);	   
			} 
			else 
			{
				var m_distance = Math.floor( distance * 1000.0);	  
			}
			return m_distance;
		} 
		else 
		{
			return 0;
		}
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}



function get_time_from_select(time_select)
{
	try
	{
		var d = new Date();
		d.setHours(0);
		d.setMinutes(0);	
		d.setSeconds(time_select.options[time_select.selectedIndex].id.toString().substring(time_select.id.length));
		return d.formatDate("H:i:s");
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}		
}

function get_date_object(datetime_str)
{
	try
	{
		var datetime_split		= datetime_str.split(" ");
		var date_split			= datetime_split[0].split("-");
		var time_split			= datetime_split[1].split(":");
		var datetime			= new Date (date_split[0], date_split[1]-1, date_split[2], time_split[0], time_split[1], time_split[2]);		
		return datetime;
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}

function format_datetime(datetime_str,format)
{
	try
	{
		return get_date_object(datetime_str).formatDate(format);
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}
}

/**
 * COMMON DHTML FUNCTIONS
 * These are handy functions I use all the time.
 *
 * By Seth Banks (webmaster at subimage dot com)
 * http://www.subimage.com/
 *
 * Up to date code can be found at http://www.subimage.com/dhtml/
 *
 * This code is free for you to use anywhere, just keep this comment block.
 */
function add_event(obj, evType, fn)
{
	try
	{
		if (obj.addEventListener){
			obj.addEventListener(evType, fn, false);
			return true;
		} else if (obj.attachEvent){
			var r = obj.attachEvent("on"+evType, fn);
			return r;
		} else {
			return false;
		}
	}
	catch(ex)
	{
		_DBG(0,ex.message);
	}			
}

