
// formats html as text
String.prototype.formatJavascriptText = function(){
  try{ 

		var _arr;
		var _exp;
		var matches;		
		var str = this;
		
		// spacing		
		str = str.replace(/;/g, ";\n");
		
		str = str.replace(/\{/g, "{\n");
		
		str = str.replace(/\}/g, "\n}\n");	

		return str;
		
  }catch(err){Log.Add("String.prototype.formatJavascriptText", err, LogType.Error);}
}



// formats text as html adding classes for javascript types
String.prototype.formatJavascriptHTML = function(){
  try{ 
	
		var _arr;
		var _exp;
		var matches;		
		var str = this;
		var token = "###replace###";		

		str = str.replace(/\$/g, "#dollar#");
				
		// escape html chars
		str = str.replace(/\>/g, "&gt;");
		str = str.replace(/\</g, "&lt;");

		
		// spacing		
		str = str.replace(/\{/g, "{<div class=#qt#script#qt#>");
		str = str.replace(/\}/g, "</div>}<br>");	

		str = str.replace(/;/g, ";<br>");
		str = str.replace(/&gt;\<br\>/g, "&gt;");
		str = str.replace(/&lt;\<br\>/g, "&lt;");
		str = str.replace(/\}\<br\>\);/g, "});");		
		
		
		// fix breaking in wrong spots
		_exp = /\([^\)]+\)/g;

		matches = GetUnique(str.match(_exp));
		
		for(var i = 0; i<matches.length; i++)
    {
		  var m = matches[i];
			while(str.indexOf(m)>-1)
			  str = str.replace(m, token);
			
			var newRe = new RegExp(token, "g");
			
			str = str.replace(newRe, m.replace(/\<[^\>]+\>/g, "") );
    }		
		

		// function names
		_exp = /function[^\(|\{]+[\(|\{]/g;

		matches = str.match(_exp);

    for(var j=0; j<matches.length; j++)
    {
      var m = matches[j].replace(/function\s?/g, "");
			
			m = m.substring(0, m.length-1);
			
		  _exp = new RegExp(m, "g");
			
      str = str.replace(_exp, "<span class=#qt#fnName#qt#>" + m + "</span>");
    }
		
		// mark CustomScript as a function
		str = str.replace(/CustomScript/g, "<span class=#qt#fnName#qt#>CustomScript</span>");

		
		// key words
		var keyWords = ["var", "function", "if", "else", "for", "return", "null", "try", "catch", "this", "while", "break", "switch", "case"];
			
		for(var i = 0; i<keyWords.length; i++){

		  var w = keyWords[i];
			
			_exp = new RegExp(w, "g");
			
			str = str.replace(_exp, "<span class=#qt#keyWord#qt#>" + w + "</span>");
		}

		

		// things within quotes
		_exp = new RegExp("'[^']{0,}'", "g");				
		var one = GetUnique(str.match(_exp));

		_exp = new RegExp("\"[^\"]{0,}\"", "g");				
		var two = GetUnique(str.match(_exp));		
		
		matches = $.merge(one, two);
		
		for(var i = 0; i<matches.length; i++)
    {
		  var m = matches[i];

			while(str.indexOf(m)>-1)
			  str = str.replace(m, token);
			
			var newRe = new RegExp(token, "g");
			
			str = str.replace(newRe, "<span class=#qt#quote#qt#>" + m.replace(/\<[^\>]+\>/g, "") + "</span>");
    }
		
		str = str.replace(/#qt#/g, "'");
		
		str = str.replace(/#dollar#/g, "$");					
		
		return str;

  }catch(err){Log.Add("String.prototype.formatJavascriptHTML", err, LogType.Error);}
}

/*
function EscapeRegex(str)
{
  var arr = ['\\', '>', '<', '(', ')', '{', '}', '&', '[', ']', '^', '?', '*', '|' ];
	
	for(var i = 0; i<arr.length; i++)
	{
	  var ex = new RegExp("\\" + arr[i], "g");
		str = str.replace(ex, "\\" + arr[i]);
	}

	return str;	
}
*/


// filters duplicates out of an array
function GetUnique(arr){
 var temp = new Array();
 
 if(arr == null)
   return temp;

 for(var i = 0; i<arr.length; i++)
 {
   var add = true;
	 
   for(var j = 0; j<temp.length; j++)
   {
     if(arr[i] == temp[j])
		   add = false;
   }
	 
	 if(add)
	   temp.push(arr[i]);
 }
 
 return temp;

}



/*
		_exp = /function\s+[^(]+[(]/g;
		_arr = str.match(_exp);
		for(var i = 0; i<_arr.length; i++)
		{
		  var n = _arr[i].replace("function", "").replace(" ", "").replace("(", "");
			str = FormatSpan(str, [n], "font-weight:bold;");
		}
		
		_exp = /{[^}]+[}]/g;
		_arr = _exp.exec(str);
		for(var i = 0; i<_arr.length; i++)
		{
		  var r = _arr[i].substring(1, _arr[i].length - 1);
		  str = FormatDiv(str, [r], "margin-left:10px;");
		}
		
		
		_exp = /\"[^\"]+[\"]/g;
		_arr = _exp.exec(str);
		str = FormatSpan(str, _arr, "color:#060; font-style: italic;");
			

	  var blue = ["function", "var"];
    str = FormatSpan(str, blue, "color:blue;");


function FormatSpan(str, exps, style){
  try{
		for(var i = 0; i<exps.length; i++)
		{
		  var exp = exps[i];
	  	str = str.replace(exp, "<span style='" + style + "'>" + exp + "</span>");
		}
		
		return str;
		
  }catch(err){Log.Add("FormatSpan", err, LogType.Error);}		
}


function FormatDiv(str, exps, style){
  try{
		for(var i = 0; i<exps.length; i++)
		{
		  var exp = exps[i];
			str = str.replace(exp, "<div style='" + style + "'>" + exp + "</div>");
		}
		
		return str;
		
  }catch(err){Log.Add("FormatDiv", err, LogType.Error);}		
}*/
