maison_alexandra/www/js/brs.console.js

312 lines
9.3 KiB
JavaScript

var BrsConsole;
(function() {
BrsConsole = (function() {
function BrsConsole(oCoreInst){
var _this = this;
_this.jsBase = oCoreInst;
_this.jqObj = $("#debug_console");
// Create class remover extension
$.fn.removeClassStartingWith = function (filter) {
$(this).removeClass(function (index, className) {
return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
});
return this;
};
if(_this.jqObj.length){
_this.jqLineCnt = _this.jqObj.find("ul#console-lines");
_this.jqLine = _this.jqObj.find("li.sample");
_this.jqInput = _this.jqObj.find("#cmd-input");
_this.jqScrollCnt = _this.jqObj.find(".scroll");
_this.iLineNr = _this.jqLineCnt.find(">li").length;
_this.initClass();
}
}
// Settings
BrsConsole.prototype = {
sUrl : "/ajax/ac:console",
jsBase : {},
jqObj : {},
jqInput : {},
jqLine :{},
jqLineCnt : {},
jqScrollCnt : {},
iLineNr : 0,
bEnabled : false,
vTypes : { C_TYPES_JS : "JS", C_TYPES_PHP : "PHP" },
vKeys : { C_TYPE : "t", C_FUNCTION : "f", C_LINE_DATA : "l", C_RESPONSE_DATA : "r" }
};
BrsConsole.prototype.initClass = function(){
var _this = this;
_this.bEnabled = true;
// Append all server side PR's
var jqLogerOutputs = $("pre.logger");
if(jqLogerOutputs.length){
jqLogerOutputs.each(function(){
_this.addNewLine(" ", "PR( )", false, $(this).detach().show());
});
}
_this.jqObj.append("<style style='text/css'>" +
"#debug_console.show{ height:"+($(window).height()*2/3)+"px;}" +
"#debug_console .scroll{ height:"+($(window).height()*2/3-35)+"px;}" +
"</style>");
var sc = _this.jqObj.find(".scroll");
// Scroll to bottom
sc.scrollTop(sc[0].scrollHeight);
// sc.click(function(){
// _this.jqObj.find("input").focus();
// });
// Add action marker
sc.find(".sql").closest("li").addClass("e");
sc.find(".sql").closest("li").dblclick(function(){
_this.handleSqlLineClick($(this));
});
sc.find("span.wpc").dblclick(function(){
_this.handleWrappedLineClick($(this));
});
if(_this.jqInput && _this.jqInput.length){
_this.jqInput.bind({
keyup : function(event){
var v = $(this).val();
if(event.which == _this.jsBase.iKeys.ENTER){
$(this).val("");
_this.handleCommand(v);
}else if(event.which == _this.jsBase.iKeys.ESC){
$(this).val("");
}
}
});
}
// Bind ESC button
$(document).bind('keydown', function(event){
if(event.which == _this.jsBase.iKeys.ESC){
if(_this.bEnabled){
if(_this.jqObj.hasClass("show")){
_this.jqObj.removeClass("show");
$("body").removeClass("oh");
}else if(event.ctrlKey || event.metaKey){
_this.jqObj.show().addClass("show");
$("body").addClass("oh");
_this.jqObj.find("input").focus();
}
}
}
});
};
BrsConsole.prototype.handleSqlLineClick = function(jqLi, bExpOnly, bCollOnly){
var _this = this;
var jqSql = jqLi.find(".sql");
bExpOnly = defaultVal(bExpOnly, false);
bCollOnly = defaultVal(bCollOnly, false);
if(jqSql.parent().is("pre")){
if(!bExpOnly){
jqSql.html(jqSql.unwrap().html());
jqLi.removeClassStartingWith("t");
}
}else{
if(!bCollOnly){
jqSql.html(jqSql.wrap("<pre></pre>").html().replace(/^\n+|\n+ *$/g, ''));
_this.jqObj.append("<style style='text/css'>" +
".t" + jqSql.height() + " p > span { height:" + jqSql.height() + "px;}" +
"</style>");
jqLi.addClass("t" + jqSql.height());
}
}
if(!bExpOnly && !bCollOnly) _this.moveScrollToBottom(jqLi);
};
BrsConsole.prototype.handleWrappedLineClick = function(jqSpan){
var _this = this;
var jqLi = jqSpan.closest("li");
jqSpan.toggleClass("auto-wrap");
if(jqSpan.hasClass("auto-wrap")){
jqSpan.find("pre").html(jqSpan.find("pre").html().replace(/^\n+|\n+ *$/g, ''));
_this.jqObj.append("<style style='text/css'>" +
".t" + jqSpan.height() + " p > span { height:" + jqSpan.height() + "px;}" +
"</style>");
jqLi.addClass("t" + jqSpan.height());
}else{
jqLi.removeClassStartingWith("t");
}
_this.moveScrollToBottom(jqLi);
};
BrsConsole.prototype.handleCommand = function(sCommand){
var _this = this;
if(sCommand.length){
var oData = {
action : "check_command",
data : sCommand
};
_this.jsBase.ajax(oData, _this.sUrl, function(d){
_this.handleServerResponse(d);
})
}
};
BrsConsole.prototype.addNewLine = function(sTime, sType, sText, jqObj){
var _this = this;
sTime = defaultVal(sTime, "&nbsp;");
sType = defaultVal(sType, "DEF");
sText = defaultVal(sText, "&nbsp;");
jqObj = defaultVal(jqObj, false);
var jqLi = _this.jqLine.clone(true, true).removeClass("sample");
var jqP = jqLi.find("p");
jqP.find(".nr").html(_this.iLineNr++ + ".");
var jqSpan = $('<span class="t"></span>');
jqP.append(jqSpan.clone().append(sTime));
jqP.append(jqSpan.clone().append(sType));
if(jqObj.length){
var c = jqSpan.clone().addClass("wpc");
pr(c);
jqP.append(c.append(jqObj));
}else
jqP.append(jqSpan.clone().html(sText));
_this.jqLineCnt.append(jqLi.show());
};
BrsConsole.prototype.moveScrollToBottom = function(jqElement){
var _this = this, iTop = 0;
jqElement = defaultVal(jqElement, false);
if(_this.jqScrollCnt.length){
iTop = _this.jqScrollCnt[0].scrollHeight;
if(jqElement.length) iTop = (jqElement.offset().top - _this.jqLineCnt.offset().top - 30)
_this.jqScrollCnt.stop().animate({scrollTop : iTop}, 500, 'swing');
}
};
BrsConsole.prototype.handleServerResponse = function(oResponse){
var _this = this;
if(oResponse && oResponse[_this.vKeys.C_TYPE]){
// Switch & handle actions
switch(oResponse[_this.vKeys.C_TYPE]){
case _this.vTypes.C_TYPES_JS:
// If callback function exists - exec
if(oResponse[_this.vKeys.C_FUNCTION]){
if(oResponse[_this.vKeys.C_FUNCTION] in _this){
var vData = (oResponse[_this.vKeys.C_RESPONSE_DATA] ? oResponse[_this.vKeys.C_RESPONSE_DATA] : false);
_this[oResponse[_this.vKeys.C_FUNCTION]](vData);
}
}
break;
case _this.vTypes.C_TYPES_PHP:
break;
}
// Add line data if line data passed
if(oResponse[_this.vKeys.C_LINE_DATA]){
var qjLines = $(oResponse[_this.vKeys.C_LINE_DATA]);
if(qjLines.length){
qjLines.find(".nr").each(function(){
$(this).html(_this.iLineNr++ + ".");
});
_this.jqLineCnt.append(qjLines);
_this.moveScrollToBottom();
}
}
}
};
BrsConsole.prototype.expandAllSqlQueries = function(vData, bExpandCollapse){
var _this = this;
var jqLi = _this.jqLineCnt.find(".sql").closest("li");
if(jqLi.length){
jqLi.each(function(){
_this.handleSqlLineClick($(this), true, false);
_this.moveScrollToBottom();
});
}
};
return BrsConsole;
})();
}).call(this);