var isys = {
    m_capture: null,
    m_debugOutput: null,
    m_onload: [],
    showDebug: false
};

isys.namespace = function(ns) {
    var obj = isys;
    
    var parts = ns.split(".");
    for (var i = 0; i < parts.length; i++) {
        obj[parts[i]] = obj[parts[i]] || {};
        obj = obj[parts[i]];
    }
};

isys.onload = function(evnt) {
    isys.m_onload[isys.m_onload.length] = evnt;
};

isys.dispatchOnLoad = function() {
    for (var i = 0; i < isys.m_onload.length; i++)
        isys.m_onload[i]();
};

isys.textMetrics = function(Text, Source) {
    var retVal = [0,0];
    var obj = isys;
    var span = isys.createElement("span");
    span.style.cssText = Source.style.cssText;
    span.style.position = "absolute";
    span.style.top = "-1500px";
    span.innerHTML = Text;
    
    document.body.appendChild(span);
    retVal[0] = span.offsetWidth;
    retVal[1] = span.offsetHeight;
    document.body.removeChild(span);
    return retVal;
};
isys.controlMetrics = function(control) {
    var pos = isys.getPosition(control);
    return [pos[0], pos[1], control.offsetWidth, control.offsetHeight];
};
isys.screenToControl = function(x, y, control) {
    var pos = isys.getPosition(control);
    pos[0] = x - pos[0];
    pos[1] = y - pos[1];
    return pos;
};

isys.textWidth = function(Text, Source) {
    return isys.textMetrics(Text, Source)[0];
};

isys.createElement = function(typ, dest, className) {
    var retVal = document.createElement(typ);
	if (typeof(className) != "undefined")
	    retVal.className = className;
    if (dest)
        dest.appendChild(retVal);
    return retVal;
};

isys.getPosition = function(element, relativeTo) {
    var retVal = [0, 0];
    
    while (element && element != relativeTo) {
        retVal[0] += element.offsetLeft - element.scrollLeft;
        retVal[1] += element.offsetTop - (element.offsetTop!=element.scrollTop?element.scrollTop:0);
        element = element.offsetParent;
    }
    return retVal;
};
isys.getFramePosition = function(src) {
	var retVal = [0, 0];
	while (src) {
		var wnd = src.ownerDocument.defaultView || src.ownerDocument.parentWindow;
		var pos = isys.getPosition(wnd.frameElement);
		retVal[0] += pos[0];
		retVal[1] += pos[1];
		
		src = wnd.frameElement;
	}
	return retVal;
};
isys.getDimensions = function(element) {
    var p = isys.getPosition(element);
    return [p[0], p[1], element.offsetWidth, element.offsetHeight];
};
isys.getPos = function(element, relativeTo) {
    var p = isys.getPosition(element, relativeTo);

    var retVal = [];
    retVal.left = p[0];
    retVal.top = p[1];
    retVal.width = element.offsetWidth;
    retVal.height = element.offsetHeight;
    retVal.right = retVal.left + retVal.width;
    retVal.bottom = retVal.top + retVal.height;
    retVal.str = "x: " + retVal.left + "; y: " + retVal.top + "; width: " + retVal.width + "; height: " + retVal.height;
    return retVal;
};
isys.getViewportHeight = function() {
	if (window.innerHeight!=window.undefined) return window.innerHeight;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight; 
	return window.undefined; 
}
isys.getViewportWidth = function() {
	if (window.innerWidth!=window.undefined) return window.innerWidth;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth;
	if (document.body) return document.body.clientWidth; 
	return window.undefined; 
}


isys.setCapture = function(element) {
    document.onmousemove = function(e) {
        if (!e) e = window.event;
        if (typeof(element.onmousemove) != "undefined")
            element.onmousemove(e);
    };
    document.onmousedown = function(e) {
        if (!e) e = window.event;
        
        if (typeof(element.onmousedown) != "undefined")
            element.onmousedown(e);
    };
    document.onmouseup = function(e) {
        if (!e) e = window.event;
       
        if (typeof(element.onmouseup) != "undefined")
            element.onmouseup(e);
    };

    this.m_capture = element;
};

isys.releaseCapture = function(element) {
    if (this.m_capture == element || typeof(element) == "undefined") {
        document.onmousedown = null;
        document.onmousemove = null;
        this.m_capture = null;
    }
};

isys.fadeIn = function(element, steps) {
    if (typeof(steps) == "undefined")
        steps = 20;
    
    var timer;
    element.isysFadeIn = 50;
    element.isysFadeInSteps = steps;
    element.style.display = "none";
    proc = function() {
        element.isysFadeIn += (100 / steps);
        if (element.isysFadeIn >= 100)
            window.clearInterval(timer);

        if (element.isysFadeIn >= 100)
            opacity = "1.0";
        else
            opacity = "0." + element.isysFadeIn;          

        if (typeof(element.style.MozOpacity) != "undefined")
            element.style.MozOpacity = opacity;
            
        element.style.display = "";
    };
    
    if (steps == 1)
        proc();
    else
        timer = window.setInterval(proc, 25);
    return timer;
};
isys.ajaxLoading = function(element) {
    var div;
    var pos = isys.getDimensions(element);
    if (element.tagName == "IFRAME") {
        div = isys.createElement("div", document.body, "isysAjaxLoading");
        isys.place(div,  pos[0] + "px", pos[1] + "px", pos[2] + "px", pos[3] + "px");
    } else {
        div = isys.createElement("div", element, "isysAjaxLoading");
        isys.place(div,  "0px", "0px", pos[2] + "px", pos[3] + "px");
    }
    div.style.zIndex = 1000;
    return div;    
};
isys.toSize = function(v) {
    if (typeof(v) == "number")
        return v + "px";
    else
        return v;
};
isys.place = function(c, x, y, w, h) {
    c.style.position = "absolute";
    if (y) c.style.top = isys.toSize(y);
    if (x) c.style.left = isys.toSize(x);
    if (w) c.style.width = isys.toSize(w);
    if (h) c.style.height = isys.toSize(h);
};
isys.eventToPos = function(e) {
    var item = e.srcElement;
    var retVal = [e.offsetX, e.offsetY];
    while (item) {
        retVal[0] += item.offsetLeft;
        retVal[1] += item.offsetTop;
        item = item.offsetParent;
    };
    return retVal;
};
isys.addClass = function(item, cls) {
    if (typeof(cls.join) == "undefined") 
        item.className += " " + cls;
    else
        item.className += " " + cls.join(" ");
};
isys.removeClass = function(item, cls) {
    if (typeof(cls.join) == "undefined") {
        var classes = item.className.split(" ");
        var newClassName = "";
        for (var i = 0; i < classes.length; i++) {
            if (classes[i] != cls)
                newClassName += classes[i] + " ";
        };
        item.className = newClassName;
    } else
        for (var i = 0; i < cls.length; i++)
            isys.removeClass(item, cls[i]);
};
isys.hasClass = function(item, cls) {
    var classes = item.className.split(" ");
    var newClassName = "";
    for (var i = 0; i < classes.length; i++)
        if (classes[i] == cls)
			return true;
	return false;
};
isys.floatElement = function(item, value) {
    if (typeof(item.style.cssFloat) != "undefined")
        item.style.cssFloat = value;
    else
        item.style.styleFloat = value;
};
isys.disableSelect = function(item) {
    item.onselectstart = function(e) {
        return false;
    }
};
isys.htmlEncode = function(v) {
	var retVal = new String(v);
	retVal = retVal.replace("&", "&amp;");
	retVal = retVal.replace("<", "&lt;");
	retVal = retVal.replace(">", "&gt;");
	retVal = retVal.replace("\"", "&quot;");
	return retVal;
};

isys.namespace("controls");
isys.namespace("debug");
isys.namespace("key");

isys.debug.log = function(text) {
    if (isys.showDebug) {
        try {
			if (typeof(window.opera) != "undefined") 
				window.opera.postError(text);
			else if(typeof(window.console) != "undefined")
				window.console.log(text);
        } catch(e) {
        }
    }   
};

isys.debug.show = function() {
    isys.showDebug = true;
    isys.debug.log("");
};

function prepareRequest() {
    request = [];
    
    var nfo = new String(document.location.search).substring(1);
    var parts = nfo.split("&");
    for (var i = 0; i < parts.length; i++) {
        nfo = new String(parts[i]).split("=");
        if (nfo.length == 2) {
            if (typeof(request[nfo[0]]) == "undefined")
                request[nfo[0]] = nfo[1];
            else {
                request[nfo[0]] += ";" + nfo[1];
            }
        }
    };
};


isys.controls.getPosition = function(c) {

};

isys.controls.isChildOf = function(item, parent) {
	while (item) {
		if (item == parent)
			return true;
		item = item.parentNode;
	}
	return false;
};

isys.controls.findParentNode = function(item, nodeName) {
	while (item) {
		if (item.nodeName == nodeName)
			return item;
		item = item.parentNode;
	};
	return null;
};


isys.key.up = 38;
isys.key.down = 40;
isys.key.left = 37;
isys.key.right = 39;
isys.key.home = 36;
isys.key.end = 35;
isys.key.pageup = 33;
isys.key.pagedown = 34; 

window.onload = isys.dispatchOnLoad;

prepareRequest();


isys.namespace("events");

isys.events.eventMngr = [];
isys.events.eventDisp = [];

isys.events.attachEvent = function(control, eventType, fn) {
	if (typeof(control) == "string")
		control = document.getElementById(control);	
	
	if (typeof(control) == "object") {
		if (window.opera && control.addEventListener) {
			control.addEventListener(eventType, fn, false);
		} else if (control.addEventListener)
			control.addEventListener(eventType, fn, true);
		else if (control.attachEvent)
			control.attachEvent("on" + eventType, fn);
		else
			isys.debug.log("Failed to attach event");
			
		var evnt = isys.events.eventMngr.length;
		for (var i = 0; i < isys.events.eventMngr.length; i++)
			if (isys.events.eventMngr[i].length == 0) {
				evnt = i;
				break;
			}
		isys.events.eventMngr[evnt] = { control: control, eventType: eventType, fn: fn };
	}
};

isys.events.detachEvent = function(control, eventType, fn, shutdown) {
	if (typeof(control) == "string")
		control = document.getElementById(control);	
	
	if (typeof(control) == "object") {
		if (control.addEventListener)
			control.removeEventListener(eventType, fn, false);
		else if (control.attachEvent)
			control.detachEvent("on" + eventType, fn);
		else if (window.opera)
			window.opera.removeEventListener(eventType, fn, false);
			
		if (!shutdown)
			for (var i = 0; i < isys.events.eventMngr.length; i++) 
				if (isys.events.eventMngr[i].control == control
					&& isys.events.eventMngr[i].eventType == eventType
					&& isys.events.eventMngr[i].fn == fn) 
				{
					isys.events.eventMngr[i] = [];
				}
	}
};

isys.events.clearObject = function(e, walk) {
	var retVal = 0;
	if (e) {
		for (var i = 0; i < isys.events.eventMngr.length; i++) 
			if (isys.events.eventMngr[i].control == e)
			{
				isys.events.detachEvent(e,
					isys.events.eventMngr[i].eventType,
					isys.events.eventMngr[i].fn,
					true);
				isys.events.eventMngr[i] = [];
				retVal++;
			}
		
		if (walk) {
			var c = e.firstChild;
			while (c) {
				retVal += isys.events.clearObject(c, walk);
				c = c.nextSibling;
			}
		}
	}
	return retVal;
};

isys.events.handleUnload = function() {
	var x = 0;
	for (var i = isys.events.eventMngr.length-1; i >= 0; i--) 
	{
		isys.events.detachEvent( 
			isys.events.eventMngr[i].control,
			isys.events.eventMngr[i].eventType,
			isys.events.eventMngr[i].fn,
			true);
		x += isys.events.clearObject(isys.events.eventMngr[i].control, false);
		isys.events.eventMngr[i].control = null;
		isys.events.eventMngr[i] = [];
	}
	
	for (var i = 0; i < isys.events.eventDisp.length; i++) {
		isys.events.eventDisp[i].dispose();
		isys.events.eventDisp[i] = null;
	}
	isys.events.eventDisp = [];
	isys.events.eventMngr = [];
};

isys.events.register = function(e) {
	isys.events.eventDisp[isys.events.eventDisp.length] = e;
};

isys.events.disableSelect = function(target) {
	if (typeof target.onselectstart!="undefined") //IE route
		target.onselectstart=function(){return false}
	else if (typeof target.style.MozUserSelect!="undefined") //Firefox route
		target.style.MozUserSelect="none"
	else //All other route (ie: Opera)
		target.onmousedown=function(){return false}
	target.style.cursor = "default"
};

isys.events.attachEvent(window, "unload", isys.events.handleUnload);



isys.rect = function(left, top, right, bottom) {
	this.left = Math.min(left, right);
	this.top = Math.min(top, bottom);
	this.right = Math.max(left, right);
	this.bottom = Math.max(top, bottom);
	
	this.width = this.right - this.left;
	this.height = this.bottom - this.top;
};

isys.rect.prototype = {
	intersect: function(r) {
	
	},
	
	move: function(x, y) {
		this.left += x;
		this.right += x;
		this.top += y;
		this.bottom += y;
	},
	
	inflate: function(x, y) {
		this.left -= x;
		this.right += x;
		this.top -= y;
		this.bottom += y;
		this.width += x * 2;
		this.height += y * 2;
	},
	
	pointInRect: function(x, y) {
		return x >= this.left && x <= this.right && y >= this.top && y <= this.bottom;
	}
};

String.prototype.trim = function(chars) {
    return this.ltrim(chars).rtrim(chars);
}

String.prototype.ltrim = function(chars) {
    chars = chars || "\\s";
    return this.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

String.prototype.rtrim = function(chars) {
    chars = chars || "\\s";
    return this.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

isys.showDebug = false;