﻿//how many lines before and after should be added to the snippet
var codeSnippetSize = 8;


var startupErrors = new Array();
function handleError(message,url,lineNumber) {
    var sourceCode = '';
    if(jsonServer!=null && jsonServer.RegisterJavascriptError!=null)
    {
        processError(message,url,lineNumber);
    }
    else
    {
        var errorObj = new Object();
        errorObj.message = message;
        errorObj.url = url;
        errorObj.lineNumber = lineNumber;
        startupErrors.push(errorObj);
    }
    
	return isDevelopmentServer;
}

function processError(message,url,lineNumber)
{
    var sourceCode = getFileContent(url);
    var splited = sourceCode.split('\n');
    var snippet = getErrorCodeSnippet(splited,lineNumber);
    if(isDevelopmentServer)
        renderJavascriptErrorMsg(message,url,lineNumber,snippet);
    try{
        jsonServer.RegisterJavascriptError(message,url,lineNumber,snippet,BrowserDetect.browser,BrowserDetect.version,BrowserDetect.OS,null);
    }catch(ex){
        alert('Unable to report javascript error:\n\n'+ex.message);
    }
}

function getFileContent(url){
    var http = newHTTP();
    var params = getPostedParams();
    if(url.indexOf('tt.aspx')>0){
        http.open('POST', url, false);
        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        http.setRequestHeader("Content-length", params.length);
        http.send(params);
    }else{
        http.open('GET', url, false);
        http.send('');
    }
    return http.responseText;
}
function newHTTP()
{
    if (typeof(window) != 'undefined' && window.XMLHttpRequest)
        return new XMLHttpRequest(); /* IE7, Safari 1.2, Mozilla 1.0/Firefox, and Netscape 7 */
    else
        return new ActiveXObject('Microsoft.XMLHTTP'); /* WSH and IE 5 to IE 6 */
}


var openedErrorDivsCount=0;
function renderJavascriptErrorMsg(message,url,lineNumber,_codeSnippet){
    var errorDiv = '<h3>Javascript error&nbsp;<font style="font-size:8px">(click to close)</font></h3><br/><br/>';
    errorDiv += "Error in file '"+url+"' in line "+lineNumber+"<br/><b>"+message+"</b>";
    errorDiv += '<div style="border:1px thin black;background:#888888;color:#FFFFFF;"><pre>'+newLine();
    errorDiv += '<u><b>Code:</b></u><br/><br/>';
    for(var i=0;i<_codeSnippet.length;i++){
        if(_codeSnippet[i].LineNumber==lineNumber)
            errorDiv += '<font style="color:#FF8888;font-weight:bold;font-decoration:underline;">';
        errorDiv += _codeSnippet[i].LineNumber+':'+encodeHTML(_codeSnippet[i].LineText);
        if(_codeSnippet[i].LineNumber==lineNumber)
            errorDiv += '</font>';
        errorDiv += newLine();
    }
    errorDiv += '</pre></div>';
    //alert(errorDiv);
    var div = document.createElement('div');
    div.style.position = 'absolute';
    var offset = (openedErrorDivsCount+1)*50;
    div.style.top = offset+'px';
    div.style.left = offset+'px';
    div.style.border = '1px solid black';
    div.style.backgroundColor = '#FF8888';
    div.style.cursor = 'pointer';
    div.onclick = onErrorDivClick;
    div.innerHTML = errorDiv;
    document.body.appendChild(div);
    openedErrorDivsCount++;
}

function onErrorDivClick(){
    this.style.display = 'none';
    openedErrorDivsCount--;
}

function getErrorCodeSnippet(splitedSource,lineNumber)
{
    var ret = new Array();
    var arrayCounter = 0;
    for(var i=lineNumber-codeSnippetSize;i<=lineNumber+codeSnippetSize;i++)
        if(i>=0 && i<splitedSource.length){
            ret.push({LineNumber:i+1,LineText:splitedSource[i]});
        }
    return ret;
}

function getPostedParams(){
   var ret = PostedFields.join('&');
   ret = ret.replace(/:/g,'=');
   ret += '&Target='+document.getElementById('PageName').value;
   return ret;
}

function encodeHTML(text) {
    if(text==null)
        return '';
    var textneu = text.replace(/&/g,"&amp;");
    textneu = textneu.replace(/</g,"&lt;");
    textneu = textneu.replace(/>/g,"&gt;");
    return(textneu);
}
function newLine()
{
    switch(BrowserDetect.browser){
        case 'Explorer':
            return '\r\n';
        case 'Firefox':
            return '\n';
        default:
            return '\n';
    }
}

window.onerror = handleError;