dojo.require("dojo.lang.*")
var agt = navigator.userAgent.toLowerCase();

function Panraven() {
  this.isIE = (!window.opera && agt.indexOf('msie') != -1);
  this.isIE7 = (agt.toLowerCase().indexOf('msie 7') != -1);
  this.isIE8 = (agt.toLowerCase().indexOf('msie 8') != -1);
  this.isIE6minus = (!window.opera && agt.indexOf('msie') != -1) && !this.isIE7 && !this.isIE8;
  this.isMac = agt.indexOf("mac")!=-1;
  this.isSafari = this.isMac && agt.indexOf("safari") != -1;
  this.isFireFox = agt.indexOf("firefox") != -1;
};

function isUndefined (v) {
    return (!v && v!=0);
}

var panraven = new Panraven();

panraven.event = {topics : new Array()};

panraven.event.getListeners = function(topic)
{
    if(!this.topics[topic]) this.topics[topic] = new Array();
    var listeners = this.topics[topic];
    return listeners;
}

panraven.event.subscribe = function(topic, obj, funcName)
{
    var listeners = this.getListeners(topic);
    for (var i = 0; i < listeners.length; i++) {
        var listener = listeners[i];
        if (listener["obj"] == obj && listener["funcName"] == funcName) {
            return;
        }
    }
    listeners[listeners.length] = {"obj" : obj, "funcName" : funcName};
}

panraven.event.isSubscribed = function(topic, obj, funcName) {
    var listeners = this.getListeners(topic);
    for (var i = 0; i < listeners.length; i ++) {
        var listener = listeners[i];
        if (listener["obj"] == obj && listener["funcName"] == funcName) return true;
    }
    return false;
}

panraven.event.createListener = function(obj, funcName)
{
    var funcObj;
    if(!funcName)
    {
        if(typeof obj == "function")
        {
            funcObj = obj;
            obj = window; //HACK need more complex logic for global scope
        }
        else
        {
            funcObj = window[obj];
            obj = window;
        }
    }
    else
    {
        funcObj = obj[funcName];
    }
    return {"object": obj, "method" : funcObj};
}

panraven.event.unsubscribe = function(topic, obj, funcName)
{
    var listeners = this.getListeners(topic);
    var length = listeners.length;
    for(var i = 0; i < length; i++)
    {
        var listener = listeners[i];
        if(listener["obj"] == obj && listener["funcName"] == funcName)
        {
            listeners.splice(i, 1);
            break;
        }
    }
}

panraven.event.publish = function(topic, args)
{
    var listeners = this.getListeners(topic);
    for(var i = 0; i < listeners.length; i++)
    {
        // TODO to Max: shouldn't we cache listener objects instead of recreating them on each publish? [TYR]
        var listener = this.createListener(listeners[i]["obj"], listeners[i]["funcName"]);
        var a = new Array();
        a[0] = args;
        if (listener["method"] && listener["object"]) {
            listener["method"].apply(listener["object"], a);
        }
    }
}

panraven.backgroundIframe = function(node) {
    if(panraven.isIE) {
        var html=
                 "<iframe "
                +"style='position: absolute; left: 0px; top: 0px; width: 100%; height: 100%;"
                +        "z-index: -1; filter:Alpha(Opacity=\"0\");' "
                +">";
        this.iframe = document.createElement(html);
    } else {
        this.iframe = document.createElement("iframe");
        this.iframe.style.position = "absolute";
        this.iframe.style.top = "0px";
        this.iframe.style.left = "0px";
        this.iframe.style.zIndex = "-1";
        this.iframe.style.width = "100%";
        this.iframe.style.height = "100%";
        this.iframe.style.filter = "Alpha";
        this.iframe.style.opacity = "0";
    }
    if(node){
        node.appendChild(this.iframe);
        this.domNode=node;
    }else{
        document.body.appendChild(this.iframe);
        this.iframe.style.display="none";
    }
}

dojo.lang.extend(panraven.backgroundIframe, {
	iframe: null,

	// TODO: this function shouldn't be necessary but setting width=height=100% doesn't work!
	onResized: function(){
		if(this.iframe && this.domNode && this.domNode.parentElement){ // No parentElement if onResized() timeout event occurs on a removed domnode
			var w = dojo.style.getOuterWidth(this.domNode);
			var h = dojo.style.getOuterHeight(this.domNode);
			if (w  == 0 || h == 0 ){
				dojo.lang.setTimeout(this, this.onResized, 50);
				return;
			}
			var s = this.iframe.style;
			s.width = w + "px";
			s.height = h + "px";
		}
	},

	// Call this function if the iframe is connected to document.body rather
	// than the node being shadowed (TODO: erase)
	size: function(node) {
		if(!this.iframe) { return; }

		var coords = dojo.style.toCoordinateArray(node, true);

		var s = this.iframe.style;
		s.width = coords.w + "px";
		s.height = coords.h + "px";
		s.left = coords.x + "px";
		s.top = coords.y + "px";
	},

	setZIndex: function(node /* or number */) {
		if(!this.iframe) { return; }

		if(dojo.dom.isNode(node)) {
			this.iframe.style.zIndex = dojo.html.getStyle(node, "z-index") - 1;
		} else if(!isNaN(node)) {
			this.iframe.style.zIndex = node;
		}
	},

	show: function() {
		if(!this.iframe) { return; }
		this.iframe.style.display = "block";
	},

	hide: function() {
		if(!this.ie) { return; }
		var s = this.iframe.style;
		s.display = "none";
	},

	remove: function() {
		dojo.dom.removeNode(this.iframe);
	}
});


panraven.mouse = {
    posX: 0,
    posY: 0,
    clientX: 0,
    clientY: 0,
    movedLeft: undefined,

    moveListener: function(ev) {
        var e = window.event ? window.event : ev;
        var prevPosX = this.posX;
        if (!dojo.lang.isUndefined(e.pageX) && !dojo.lang.isUndefined(e.pageY)) {
            this.posX = e.pageX;
            this.posY = e.pageY;
        } else {
            this.posX = e.clientX;
            this.posY = e.clientY;
            if (panraven.isIE) {
                this.posX += (document.documentElement && document.documentElement.scrollLeft) ?
                             document.documentElement.scrollLeft : document.body.scrollLeft;
                this.posY += (document.documentElement && document.documentElement.scrollTop) ?
                             document.documentElement.scrollTop : document.body.scrollTop;
            }
        }
        if (this.posX > prevPosX) {
            this.movedLeft = false;
        } else if (this.posX < prevPosX) {
            this.movedLeft = true;
        } else {
            this.movedLeft = undefined;
        }
        this.clientX = e.clientX;
        this.clientY = e.clientY;
    }
}

function stopEvent(event) {
    if (!event)
        event = window.event;
    try {
        event.cancelBubble = true;
    } catch (e) {
    }
    try {
        event.stopPropagation();
    } catch (e) {
    }
    try {
        if (dojo.event.browser.currentEvent)
            dojo.event.browser.stopPropagation()
    } catch (e) {
    }
}

function setSessionCookie(name, value) {
    value = escape(value);
    document.cookie = name + '=' + value + ';' + 'path=/';
}

function getSessionCookie(name) {
    var value = document.cookie;
    var begin = value.lastIndexOf(name+'=')
    if (begin == -1) {
        return null;
    }
    begin += name.length + 1;
    var end = value.indexOf(';', begin);
    if (end == -1) {
        end = value.length;
    }
    return unescape(value.substring(begin, end));
}

if (window.location != getSessionCookie('currPageURL')) {
    var wl = ""+window.location;
    if (wl.indexOf(";maximized") == -1 && wl.indexOf("_info.htm") == -1) {
        setSessionCookie('prevPageURL', getSessionCookie('currPageURL'))
        setSessionCookie('currPageURL', window.location);
    }
}
