var ERROR_BASE                  = 1000;
var ERROR_DOM_NODE_NOT_FOUND    = ERROR_BASE + 1;

function Exception(code, message)
{
    this._message = message;
    this._code = code;

    this.toString = function()
    {
        return '[' + this._code + '] ' + this._message;
    }

    this.getCode = function()
    {
        return this._code;
    }
}

function _(id)
{
    var o = document.getElementById(id);
    if (!o) {
        throw new Exception(ERROR_DOM_NODE_NOT_FOUND, "'" + id + "'" + ' - this id does not exit in DOM');
    }
    return o;
}

function Dump(o) {
    var rs = '';
    for (var i in o) {
        //alert(i);
		rs += i + "-> " + o[i] + "\n";
    }
    return rs;
}

var msie = jQuery.browser.msie ? true : false;

function Dispatcher()
{
    var _this = this;
    this.listeners = {};

    this.addListener = function(listener, events)
    {
        for (i = 0; i < events.length; i++) {
            if (!this.listeners[events[i]]) {
                this.listeners[events[i]] = [listener];
            } else if (jQuery.inArray(listener, this.listeners[events[i]]) == -1) {
                this.listeners[events[i]].push(listener);
            }
        }
    }

    this.removeListener = function(listener, events)
    {
        for (i = 0; i < events.length; i++) {
            if (this.listeners[events[i]]) {                
                for (j = 0; j < this.listeners[events[i]].length; j++) {
                    if (this.listeners[events[i]][j] == listener) {
                        this.listeners[events[i]].splice(j, 1);
                    }
                }
            }
        }
    }

    var handlerEvent = function(e)    
    {
        return _this.handle(e);
    }

    this.handle = function(e)
    {
        var rs = true;
        if (this.listeners[e.type]) {
            for (i = 0; i < this.listeners[e.type].length; i++) {
                this.listeners[e.type][i].listenerEvent(e);
            }
        } 
    }

    this.showListeners = function()
    {
        var key;
        for (key in this.listeners)
          alert(key + '->' + this.listeners[key]);
    }    
    
    $(document).click(handlerEvent)
    		   .mouseup(handlerEvent)
			   .mousemove(handlerEvent); 
	$('body').select(handlerEvent);    	   		    
}

function openPopup(url, win_width, win_height)
{
	if (!win_width) {
		win_width = 800;
	}
	
	if (!win_height) {
		win_height = 700;
	}
		
	var win_left = window.screen.width/2 - win_width/2;
	var win_top  = window.screen.height/2 - win_height/2;

	win = window.open(url, 'win', "height=" + win_height + ",width=" + win_width + ", left=" + win_left + ", top=" + win_top + ", status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes");
	win.focus();     
}

$(document).ajaxError(function(e, request, settings, exception) {
    if (request.status == 403) {
        this.location.replace(this.location.href);
    }
});

