/*
**  jquery.debug.js -- jQuery plugin for debugging
**  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 
**  Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
**
**  $LastChangedDate$
**  $LastChangedRevision$
**  
**  (c) 2007 modified by Oleg Savchuk for Mail.ua
*/

(function($) {
    /* jQuery class extension methods */
    $.extend({
        /* boolean status whether debugging is enabled */
        _debug$: null,
        _url$: null,
        /* method for getting and setting debug status */
        debug: function (onoff, url) {
            var old_value = ($._debug$ == true ? true : false);
            if( typeof( onoff ) != 'undefined' ){
                $._debug$ = (onoff ? true : false);
            }
            if ( url ) _url$ = url;  
            var myarray = [ old_value, _url$ ];
            return myarray;
        },

        /* method for logging an object or message */
        ajax_error: function( message ){
            
            if( _url$ ){
                
                var browser;
                var version = $.browser.version;
                if      ( $.browser.msie    == true ){ browser = 'Internet Explorer'; }
                else if ( $.browser.mozilla == true ){ browser = 'Mozilla Firefox';   } 
                else if ( $.browser.opera   == true ){ browser = 'Opera';             } 
                else if ( $.browser.safari  == true ){ browser = 'Safari';            } 
                else                                 { browser = navigator.appName;   }
                
                var OSName = "Unknown OS";
                if ( navigator.appVersion.indexOf("Win")    != -1 ) OSName = "Windows";
                if ( navigator.appVersion.indexOf("Mac")    != -1 ) OSName = "MacOS";
                if ( navigator.appVersion.indexOf("X11")    != -1 ) OSName = "UNIX";
                if ( navigator.appVersion.indexOf("Linux")  != -1 ) OSName = "Linux";
                jQuery.getJSON( _url$, { 
                    browser:    browser, 
                    version:    version, 
                    os:         OSName, 
                    message:    message, 
                    rand:       Math.random(),
                    win_width:  $(window).width(),
                    win_height: $(window).height() 
                }); 
            }
        },
        log: function () {
            if ($._debug$ == true){
		for (var i=0; i<arguments.length;i++){
		    console.debug(arguments[i]);
		}
            }
        },
        log_leak: function (){
            if ($._debug$ == true){
            	var total = 0;
            	var buf;
            	var ids = new Object;
            	var total_ev = 0;
            	var top_e = new Array;
            	var ev_list = {'onabort':0,'onblur':0, 'onchange':0, 
            			'onclick':0, 'ondblclick':0, 'onerror':0,
            			'onfocus':0, 'onkeydown':0,'onkeypress':0, 
            			'onkeyup':0, 'onload':0, 'onmousedown':0, 
            			'onmousemove':0 ,'onmouseout':0, 'onmouseover':0,
            			'onmouseup':0, 'onreset':0, 'onresize':0, 
            			'onselect':0, 'onsubmit':0, 'onunload':0}
            	$('*').each(function(){
	           		var count = 0;
            		total++;
					var attr = $(this).attr('id');
            		if (attr) {
	            		if (ids[attr]){ids[attr]++;}
	            		else {ids[attr] = 1;}
            		}
                    //get all jquery event bindings
                    var events = $.data(this, "events")
            		if (events){
						for (var i in events){
							for (var j in events[i]){ 
								buf = 'on' + i;
								ev_list['on' + i]++;
	            				count ++;					
	            			}
						}
            		}
            		
            		for (var i in ev_list){
	            		if ($(this).attr(i)){count++; ev_list[i]++;}
					}
					
					if (count){
						top_e.push({count: count, el:this});
					total_ev += count;
					}
            	});
            	total = "Total Objects:" + total;
            	total_ev = "Total Events:" + total_ev;
            	for (var a in ids){
            		if(ids[a] > 1){
            			buf = "There are " + ids[a] + " elements with id: " + a;
            			console.debug(buf);
            		}
            	}
                console.debug(total); 
                console.debug(total_ev);
                
                for(var i in ev_list){
                	if (ev_list[i]){
						buf = i + " = "+ev_list[i];
						console.debug(buf);
					}
                }
                //show top 10
                top_e.sort(function(a, b) {
				    var x = a.count;
				    var y = b.count;
				    return ((x > y) ? -1 : ((x < y) ? 1 : 0));
				});
                console.debug("Top 10 elements with maximum events:");
				for(m=0; m < (top_e.length < 10? top_e.length: 10); m++){
				 	console.debug(top_e[m]['el']);
					console.debug(top_e[m]['count']);
				}
                
            }
        }
    });

    /* jQuery object extension methods */
    $.fn.extend({
        /* method for logging all jQuery items */
        log: function (message) {
            if ($._debug$ == true) {
                return this.each(function () {
                    if (typeof message !== "undefined")
                        $.log(message);
                    $.log(this);
                });
            }
        }
    });
    /* determine default enable status */
    $(document).ready(function () {
        var req = $("html").attr("debug");
        if (req == "true" || req == "false")
            $.debug(req == "true" ? true : false);
    });

    /* minimum Firebug emulation (see http://getfirebug.com/firebug/firebugx.js) */
    $(document).ready(function () {
        if (typeof window.console === "undefined" || !$.isFunction(window.console.debug)) {
            /* minimum conversion of arbitrary object to text representation */
            function object2text (obj) {
                var text = null;
                if (typeof obj === "undefined")
                    text = "[undefined]";
                else if (typeof obj === "boolean")
                    text = (obj ? "true" : "false");
                else if (typeof obj === "number")
                    text = "" + obj;
                else if (typeof obj === "string"){
                    text = obj;
                    text = text.replace(/</,'&lt;');
                    text = text.replace(/>/,'&gt;');
                }
                else if (typeof obj === "function")
                    text = obj;
                else if (typeof obj === "object") {
                    if (typeof obj.nodeType !== "undefined") {
                        if (obj.nodeType == 1) { /* W3C DOM element node */
                            text = '&lt;';
                            text += obj.nodeName.toLowerCase();
                            for (var i = 0; i < obj.attributes.length; i++){
                                var val=obj.attributes[i].nodeValue;
                                if (val!=null && val!='inherit' && val.length>0)
                                    text += ' ' + obj.attributes[i].nodeName.toLowerCase() +
                                         '="' + val + '"';
                            }
                            text += '&gt;';
                        }
                        else if (obj.nodeType == 2) /* W3C DOM attribute node */
                            text = obj.nodeName + '="' + obj.nodeValue;
                        else if (obj.nodeType == 3) /* W3C DOM text node */
                            text = obj.nodeValue;
                    }
                    else if (typeof obj.toJSONString !== "undefined")
                        text = obj.toJSONString();
                    else if (typeof obj.toString !== "undefined")
                        text = obj.toString();
                }
                if (text == null)
                    text = "[unknown]";
                return text;
            };

            /* create the logging <div> node */
            $(document).ready(function () {
                $("body").append('<div id="jQueryDebug"></div>');
                $("#jQueryDebug").css({
                   display:'none',
                   position:'absolute',
                   zIndex:'1000000',
                   bottom:'5px',
                   right:'5px',
                   width:'370px',
                   height:'190px',
                   overflow:'auto',
                   fontFamily: 'monospace',
                   fontSize:'11px',
                   backgroundColor:'#FFFFCC',
                   color:'#000000',
                   padding:'5px',
                   border:'2px solid #666699'
                }).dblclick(function(){
                   $(this).html('');
                });

//                $("#jQueryDebug ol").css({
//                 margin:"0",
//                 padding:"0px"
//                });
            });

            /* attach a function to each of the Firebug methods */
            var names = [
                "log", "debug", "info", "warn", "error", "assert",
                "dir", "dirxml", "group", "groupEnd", "time", "timeEnd",
                "count", "trace", "profile", "profileEnd"
            ];
            window.console = {};
            for (var i = 0; i < names.length; i++) {
                clearTimeout(window.debugtimeout);
                window.console[names[i]] = function(msg) {
                    var d=new Date();
                    var t=d.getMinutes()+':'+d.getSeconds()+':'+d.getMilliseconds()+' ';

                    $('<div><b>' + t +'</b> '+ object2text(msg) + '</div>').appendTo( $('#jQueryDebug').css("display", $._debug$ == true ? "block" : "none") )
                    .css("borderBottom", "1px solid #cccccc");

//                        .css("padding-top", "3px");
                    window.debugtimeout=setTimeout( '$("#jQueryDebug")[0].scrollTop=10000000', 100);
                }
            }

            /* indicate that we are the one who is proving the Firebug interface */
            window.console["jQueryDebug"] = true;
        }
    });

})(jQuery);
