﻿var js_Error_version = 1.0;
// JScript File
/// Error Handleing ////////// 
function js_Error() {
	        // fields
	this.req = null;

	        // methods
	this.errorToXML = errorToXML;
	this.log = log;
}

function buildVersionString() {
   // Add a version variable and an entry here for every .JS file you want to track
   var ver_string = '';
   if(typeof jse_version != 'undefined') {ver_string += 'JS_ERROR.JS VERSION: ' + jse_version + '\n';}
   if(typeof qo_metals_version != 'undefined') {ver_string += 'QO_METALS_VERSION.JS VERSION: ' + qo_metals_version + '\n';}
   if(typeof menus_version != 'undefined') {ver_string += 'MENUS.JS VERSION: ' + menus_version + '\n';}
   
   return ver_string;
}

function formObj2XML(obj) {
   //alert('got into formObj2XML');
   //alert(obj.name + ' ' + obj.type);
   var formObjXML = '<field '
   if (obj.name) {
      formObjXML += 'name="' + obj.name + '" ';
   }
   if (obj.id) {
      formObjXML += 'id="' + obj.id + '" ';
   }
   formObjXML += 'type="' + obj.type + '" ';
   switch (obj.type) {
      case "radio":
         if (obj.name) {
            obj = document.forms[0].elements[obj.name];
            var radioVal = 'value="none"';
            for (var i=0;i < obj.length; i++) {
               if (obj[i].checked) {
                  radioVal = 'value="true[' + i + ']"';
                  i = obj.length;
               }
            }
            formObjXML += radioVal;
          } else {
            formObjXML += 'value="' + obj.checked + '"';
          }
          break;
      case "checkbox":
        // alert('checkbox value = ' + obj.checked);         
         formObjXML += 'value="' + obj.checked + '"';
         break;
      case "select-one":
         formObjXML += 'value="' + obj.selectedIndex + '"';
         break;
      case "select-multiple":
         formObjXML += 'value="' + obj.selectedIndex + '"';
         break;
      case "text":
         formObjXML += 'value="' + escape(obj.value) + '"';
         break;
      case "textarea":
         formObjXML += 'value="' + escape(obj.value) + '"';
         break;
      case "hidden":
         formObjXML += 'value="' + escape(obj.value) + '"';
         break;
      default:
         formObjXML += '';
   } //end switch
   formObjXML += '/>\n';               
   return formObjXML;
}          
      
   
function getFormFields(form1) {
   
   var elemXML = '';
   //alert('got here');   
   //alert(elemXML);
   for (var i = 0; i < form1.elements.length; i++) {
      var elem, lastName = "";
      elem = form1.elements[i];
      //alert(elemXML);
      if (elem.name && (elem.name != lastName)) {
          elemXML += formObj2XML(form1.elements[i]);
          lastName = elem.name;
      }
   }   
   return elemXML;
}
   
function errorToXML(err) {
   var version_string = buildVersionString();  
   //alert('hi there');
   //SOURCE:\n-----------------\n' +
   //document.getElementsByTagName('html')[0].innerHTML +
	var xml = '<?xml version="1.0"?>\n' +
		'<error>\n' +
		'<name>' + err.name + '</name>\n' +
		'<message>' +
		'<![CDATA[' + 
		err.message + 
		'\n\n' +		      
      ']]>\n' +
		'</message>\n';	
	//alert('forms ' + document.forms.length);
	if (document.forms.length > 0) {
	   xml += '<fields>\n'
	   for (i=0;i < document.forms.length;i++) {	      	      
	      xml += getFormFields(document.forms[i]);	      
	   }
	   xml += '</fields>\n'
	}
	//alert('after form fields setting');
	if (err.location) xml += '<location>' + err.location +
		'</location>';
      xml += '<version>' + version_string + '</version>';   
	xml += '</error>';
	//alert('Got to end');
	return xml;
}

            // log method of Logger class
function log(err) {
	        // feature sniff
	if (window.XMLHttpRequest) this.req = new XMLHttpRequest();
	else if (window.ActiveXObject) this.req = new ActiveXObject("Microsoft.XMLHTTP");
	else return; // throw up our hands in despair
	
	        // set the method and URI
	this.req.open("POST", "/err/jserror.aspx");
	//alert('Got after post to page');
	        // set the request headers. REFERER will be the top-level
	        // URI which may differ from the location of the error if
	        // it occurs in an included .js file
	this.req.setRequestHeader('REFERER', location.href);
	this.req.setRequestHeader('content-type', 'text/xml');
	        // function to be called when the request is complete
	this.req.onreadystatechange = errorLogged;
	this.req.send(this.errorToXML(err));
	        // if the request doesn't complete in 10 seconds,
	        // something is up
	this.timeout = window.setTimeout("abortLog();", 10000);
}
 
            // we tried, but if there is a connection error, it is hopeless
function abortLog() {
	jse.req.abort();	
}

            // called when the state of the request changes
function errorLogged() {
	if (jse.req.readyState != 4) return;
	window.clearTimeout(jse.timeout);

   // request completed
   //	if (jse.req.status >= 400)		
   //    alert('Attempt to log error failed!');
}

/* Example of how explicitly call the error handler */
/*     
function foo() {
	try {
		riskyOperation();
	} catch (err) {
		    // add custom property
		err.location = location.href + ', function: foo()';
		jse.log(err);
		warnUser();
	}
}
*/

/* This is the actual error handler */
function trapError(msg, URI, ln) {
	// wrap our unknown error condition in an object
    try {
	    var error = new Error(msg);
	    //alert('error handleing');
	    //alert(msg);
	    error.location = URI + ', line: ' + ln; // add custom property
	    //alert(URI + ', line: ' + ln);
	    jse.log(error);
	    //alert('logged..');
	    return true;
	} catch (err) {
	    return false; // stop the yellow triangle
	}
}

/*************************************/
/* Start processing client code here */
var jse = new js_Error();   
window.onerror = trapError; 
/*************************************/

