if(typeof(opsIsDebugOn) == 'undefined') {
    if(typeof(parent) != 'undefined' && typeof(parent.opsIsDebugOn) != 'undefined')
	opsIsDebugOn = parent.opsIsDebugOn;
    else
	opsIsDebugOn = false;
}

opsIntervals = new Array();
opsEvents = Array();

function opsEventAdd(elem, eventName, handler, isFirst) {
//    if(typeof(elem[eventName]) != 'undefined' && elem[eventName] != null && elem[eventName]) {
//	opsDebugDump("current elem."+eventName, elem[eventName], 1, false);
//    }

    if(elem.addEventListener) {
	var listenEventName = eventName.substr(2);
//	opsDebug("add event listener '"+listenEventName+"'");
/*

	elem.addEventListener(listenEventName, handler, false);
	if(elem[eventName]) {
	    var curHandler = elem[eventName];
	    elem[eventName] = '';
	    elem.addEventListener(listenEventName, curHandler, false);
	}
*/
	if(!isFirst)
	    elem.addEventListener(listenEventName, handler, false);
	else {
	    if(elem[eventName])
		var curHandler = elem[eventName];
	    elem[eventName] = handler;
	    if(curHandler)
		elem.addEventListener(listenEventName, curHandler, false);
	}

    } else if(elem.attachEvent) {
//	opsDebug("attach event '"+eventName+"'");
	if(!isFirst)
	    elem.attachEvent(eventName, handler);
	else {
	    if(elem[eventName])
		var curHandler = elem[eventName];
	    elem[eventName] = handler;
	    if(curHandler)
		elem.attachEvent(eventName, curHandler);
	}

/*
    } else if(typeof(elem[eventName]) == 'undefined' || elem[eventName] == null || !elem[eventName]) {
	opsDebug("set elem."+eventName);
	elem[eventName] = handler;
    } else {
	if(typeof(opsEvents[eventName]) == 'undefined') {
	    opsEvents[eventName] = new Array();
	}
	opsEvents[eventName].push(new Array(elem, handler));
	opsDebugDump("add event '"+eventName+"'", opsEvents, 2);
    }
*/
    } else {
	opsDebug("event add not supported");
    }
};

function opsEventFilterKey(ev) {
    var keyCode = ev.keyCode || ev.charCode;

    if(window.opsEventLastKey
    && window.opsEventLastKey == keyCode
    && window.opsEventLastEvent != ev.type
    ) {
	window.opsEventLastKey = '';
	return true;
    }

    window.opsEventLastKey = keyCode;
    window.opsEventLastEvent = ev.type;

    return false;
}

function opsEventStandardize(e) {
    var ev = e || window.event;

    if(!ev.target && ev.srcElement)
	ev.target = ev.srcElement;

    if(ev.target.nodeType == 3/*text node*/)
	ev.target = ev.target.parentNode;

    return ev;
}

function opsEventStopPropagation(e) {
    if(!e)
	window.event.cancelBubble = true;
    else if(e.stopPropagation)
	e.stopPropagation();
    else
	e.cancelBubble = true;
}

function opsElementGetCoords(elem, parentElem){
    if(!parentElem)
	var parentElem = document.body
    var currentElem = elem;
    //opsDebug('get posit for '+elem.id);
    var coordLeft=0;
    var coordTop=0;
    while(currentElem && currentElem != parentElem){
	coordLeft += currentElem.offsetLeft - currentElem.scrollLeft;
	coordTop += currentElem.offsetTop-currentElem.scrollTop;
	//opsDebug("offsetLeft="+currentElem.offsetLeft+" offsetTop="+currentElem.offsetTop);
	//opsDebug("coordLeft="+coordLeft+" coordTop="+coordTop);
	currentElem = currentElem.offsetParent;
    };

    if(parentElem == document.body) {
	//opsDebug("document offsetLeft="+document.body.offsetLeft+" offsetTop="+document.body.offsetTop);
	if(false && _isIE) {
	    if (document.documentElement.scrollTop)
		coordTop+=document.documentElement.scrollTop;
	    if (document.documentElement.scrollLeft)
		coordLeft+=document.documentElement.scrollLeft;
//	} else if(!_isFF) {
//	    coordLeft+=document.body.offsetLeft;
//	    coordTop+=document.body.offsetTop;
	}
    };
    opsDebug("final coordLeft="+coordLeft+" coordTop="+coordTop);
    return new Array(coordLeft, coordTop);
};


function opsElementMoveRelative(elem, listPosition, relativeTo) {
    var pos = opsElementGetCoords(relativeTo);
    listPosition = listPosition.toLowerCase();

    if(listPosition.indexOf("left") != -1)
	elem.style.left = pos[0] - elem.offsetWidth + "px";
    else if(listPosition.indexOf("right") != -1)
	elem.style.left = pos[0] + relativeTo.offsetWidth + "px";
    else
	elem.style.left = pos[0] + "px";

    if(listPosition.indexOf("bottom") != -1)
	elem.style.top = pos[1] + relativeTo.offsetHeight + "px";
    else if(listPosition.indexOf("top") != -1)
	elem.style.top = pos[1] - elem.offsetHeight + "px";
    else
	elem.style.top = pos[1] + "px";
}

function opsElementGetByID(elementID, root) {
    var i,x;
    if(!root || root == "undefined")
	root = document;
    if(root.getElementById)
	return root.getElementById(elementID);

    if(!(x=root[elementID]) && root.all)
	x=root.all[elementID];
    for (i=0; !x && i<root.forms.length; i++)
	x=root.forms[i][elementID];
    for(i=0; !x&&root.layers && i<root.layers.length; i++)
	x=opsElementGetByID(elementID,root.layers[i].document);
    return x;
}

function opsRange(InputId, Start, End) {
    var Input = typeof(InputId)=='object' ? InputId : document.getElementById(InputId);
//    try{
	Input.focus()
//    } catch(e){
//    };

    var Length = Input.value.length;
    Start--;
    if (Start < 0 || Start > End || Start > Length)
	Start = 0;
    if (End > Length)
	End = Length;
    if (Input.setSelectionRange){
	Input.setSelectionRange(Start, End)
    } else if (Input.createTextRange){
	var range = Input.createTextRange();
	range.moveStart('character', Start);
	range.moveEnd('character', End-Length);
	range.select()
    }

};

function opsSetInterval(timeFunction, interval) {
    if(typeof(opsIntervals[interval]) != 'undefined') {
	opsIntervals[interval].push(timeFunction);
    } else {
	opsIntervals[interval] = new Array(timeFunction);
	window.setInterval("opsIntervalHandler("+interval+")", interval);
    }
};

function opsIntervalHandler(interval) {
    for(i = 0; i < opsIntervals[interval].length; i++) {
	opsDebugDump('handled interval:'+interval, opsIntervals[interval][i], 1, false);
	opsIntervals[interval][i]();
    }
};

function opsStringToBoolean(inputString) {
    if (typeof(inputString)=="string")
	inputString=inputString.toLowerCase();
    switch(inputString){
	case "1":
	case "true":
	case "yes":
	case "y":
	case 1:
	case true:
	    return true;
	    break;
	default:
	    return false;
    }
};

function opsHtmlentities(text) {
    var re=/[<>"&]/g; //"
    return text.replace(re, function(match){
	if (match=="<")
	    return "&lt;"
	else if (match==">")
	    return "&gt;"
	else if (match=="\"")
	    return "&quot;"
	else if (match=="'")
	    return "&#039;"
	else if (match=="&")
	    return "&amp;"
    })
}

function opsDisplayMailto(name, domain, text) {
    address = name+'@'+domain;
    if(!text)
	text = address;
    document.write('<a href="mailto:'+address+'">'+text+'</a>');
}

//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------

var _isFF=false;
var _isIE=false;
var _isOpera=false;
var _isKHTML=false;
var _isMacOS=false;
if (navigator.userAgent.indexOf('Macintosh')!= -1) _isMacOS=true;
if ((navigator.userAgent.indexOf('Safari')!= -1)||(navigator.userAgent.indexOf('Konqueror')!= -1)){
    var _KHTMLrv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7,5));
    if (_KHTMLrv > 525){
	_isFF=true;
	var _FFrv=1.9
    } else
	_isKHTML=true
} else if (navigator.userAgent.indexOf('Opera')!= -1){
    _isOpera=true;
    _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6,3))
} else if(navigator.appName.indexOf("Microsoft")!=-1) {
    _isIE=true;
} else {
    _isFF=true;
    var _FFrv=parseFloat(navigator.userAgent.split("rv:")[1])
};

function isIE(){
if(navigator.appName.indexOf("Microsoft")!=-1)
 if (navigator.userAgent.indexOf('Opera')== -1)
 return true;
return false
};

//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------

function opsDump(arr,maxlevel,dispfuncs,level) {
    var dumped_text = "";
    if(!level) level = 0;
    if(maxlevel && level >= maxlevel) return "";

    //The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++)
	level_padding += "    ";

    if(typeof(arr) != 'object') {
	//Stings/Chars/Numbers etc.
	dumped_text = "===>"+arr+"<===("+typeof(arr)+")";

    } else {
	//Array/Hashes/Objects
	if(!level) dumped_text += arr + " ...\n";
	for(var item in arr) {
	    var value = arr[item];

	    if(typeof(value) == 'object') { //If it is an array,
		//dumped_text += level_padding + "'" + item + "' " + value + "...\n";
		//try {
		    dumped_text += level_padding + "'" + item + "' (" + typeof(value) + ")\n" + opsDump(value,maxlevel,dispfuncs,level+1);
		//} catch(e) {
		//}
	    } else if(typeof(value) != 'function') {
		dumped_text += level_padding + "'" + item + "' => \"" + value + "\" (" + typeof(value) + ")\n";
	    }
	}
	for(var item in arr) {
	    var value = arr[item];
	    if(typeof(value) == 'function' && dispfuncs != 'undefined' && dispfuncs) {
		value = String(value);
		value = value.replace(/\n/, '');
		value = value.replace(/function /, '');
		dumped_text += level_padding + "function " + item + value.substr(0,value.indexOf(")")+1) + "\n";
	    }
	}
    }
    return dumped_text;
}

function opsDebug(text) {
    if(typeof(opsIsDebugOn) == 'undefined' || !opsIsDebugOn)
	return;

    var frames = top.frames;
    if(frames && frames != 'undefined') {
	for(var i = 0; i < frames.length; i++) {
	    var jsdebug = frames[i].document.getElementById('jsdebug');
	    if(jsdebug && jsdebug != 'undefined') {
		jsdebug.value += opsHtmlentities(text) + "\n";
	    } else if(frames[i].name == 'ticker') {
		if(!frames[i].opsDebugVisited || frames[i].opsDebugVisited == 'undefined') {
		    frames[i].document.write('<pre>');
		    frames[i].opsDebugVisited = true;
		}
		frames[i].document.writeln(opsHtmlentities(text));
		if(frames[i].scrollByPages)
		    frames[i].scrollByPages(100);
		return;
	    }
	}
    }

    if(typeof(opsIsDebugOn) != 'undefined' && opsIsDebugOn === 'alert')
	alert(text);
    else if(typeof(opsIsDebugOn) != 'undefined' && opsIsDebugOn)
	document.write('<pre>' + opsHtmlentities(text) + '</pre>');
}

function opsDebugDump(name, o, maxlevel, dispfuncs) {
    var text = name + '=' + opsDump(o, maxlevel, dispfuncs);
    text += "\n------------------------------------------------------";
    opsDebug(text);
}


function opsTableAddRow(table) {
    var rowCount = table.rows.length;
    var row = table.tBodies[0].insertRow(rowCount);
    return row;
}

function opsTableDeleteAllRows(table) {
    try {
	while(table.rows.length > 0) {
	    table.tBodies[0].deleteRow(0);
	}
    }catch(e) {
	alert(e);
    }
}