

function Bug() {}

Bug.name = function( name)
{
	var s = ''
	
	var first = true;

	for( var i in arguments) { // workaround for safari
		if( i > 0) s += i + '\t' + arguments[i].toString() + "\n";
		first = false;
	}

	return Bug.alert( name, s)
}

Bug.dump = function()
{
	//v = arguments.join( "\n")
	var s = ''
	for( var i = 0; i < arguments.length; i++) { // workaround for safari
		s += i + '\t' + arguments[i] + "\n"
	}
	return Bug.alert( 'Debug', s)
}

Bug.arr = function( arr)
{
	//v = arguments.join( "\n")
	var s = ''
	for( var i = 0; i < arr.length; i++) {
		s += i + '\t';
		try {
			s += arr[i];
		} catch( e) {
			s += '(Exception: ' + e.message + ')';
		}
		s += "\n";
	}
	return Bug.alert( 'Array', s)
}

Bug.ping = function()
{
	return Bug.alert( 'Ping', '')
}

Bug.alert = function( name, v)
{
	alert( name.toUpperCase() + "\n" + v + '')
	return v
}



function clone( myObj)
{
	if( typeof( myObj) != 'object') {
		return myObj;
	}
	
	if( myObj == null) {
		return myObj;
	}

	var myNewObj = new Object();

	for(var i in myObj) {// for( var i = 0; i < myObj.length; i++)
		myNewObj[i] = clone(myObj[i]);
	}

	return myNewObj;
}



// Class
function OnLoadHandler() {};

// Static
OnLoadHandler.list = new Array();

// Static
OnLoadHandler.register = function( callback)
{
	OnLoadHandler.list.push( callback);
	
	window.onload = function() {
		for( var i = 0; i < OnLoadHandler.list.length; i++) {
			OnLoadHandler.list[i]();
		}
		OnLoadHandler.list = new Array();
	}
}



function Assoc() {};

Assoc.merge = function( first, second)
{
	var n = new Object();
	
	for( var j in first) {
		n[j] = first[j];
	}
	
	for( var j in second) {
		n[j] = second[j];
	}
	
	return n;
}

function stopEventBubbling( event)
{
	if( ! event) {
		event = window.event;
	}
	
	event.cancelBubble = true;
	
	if( event.stopPropagation) {
		event.stopPropagation();
	}
}

function Compat() {};

Compat.getAttribute = function( node, attribute)
{
	var className = node.getAttribute( attribute);
	
	if( attribute === 'class' && className === null) { // IE 
		className = node.getAttribute( 'className');
	}
	return className;
}



function targetToElement( target)
{
	if( typeof( target) === 'string') {
		target = document.getElementById( target);
	}
	return target;
}

/*
setInterval = function( code, offset, number)
{
	callback = function() {
		if( number != undefined && number <= 0) {
			window.clearInterval( interval);
		}
		number--;
	}
	
	var interval = window.setInterval( callback, offset);
}
*/

/*
// shorthand
byId( name)
{
	return document.getElementById( name);
}
*/

Framework = {};

Framework.changeUri = function( uri) 
{
	var elms = document.getElementById( 'Framework-tools');

	if( elms) {
		elms = elms.getElementsByTagName( 'a');

		uri = uri + ( uri.indexOf( '&') == -1 ? '?' : '&') + 'lang=';

		for( var i in elms) {
			if( elms[i].getAttribute && elms[i].getAttribute( 'lang')) {
				//alert( elms[i].getAttribute( 'href'));
				elms[i].setAttribute( 'href', uri + elms[i].getAttribute( 'lang'));
			}
		}
	}
}


function parseNumber( number) {
	if( typeof( number) !== Number) {
		number = ( new String( number)).replace( /[.,](.*?)/g, '|$1').replace( /[^-\d|]/g, '').replace( /\|/, '.');
		if( number === '') {
			number = NaN;
		}
		number = Number( number);
	}
	return number;
}


function isNumber( n) {
	//console.log( typeof( n), ! isNaN( n));
	return typeof( n) === 'number' && ! isNaN( n);
}

function isNumeric( n) {
	return isNumber( n) || ( parseNumber( n).toString() === n);
}



Number.prototype.toRounded = function( decimalPlaces) 
{
	if( ! decimalPlaces) {
		decimalPlaces = 0;
	}

	/*
	alert(
		this
		+ '\n' +
		this.toFixed( decimalPlaces)
		+ '\n' +
		this.toFixed( decimalPlaces).replace( /\.0+$|(\.\d*?)0+$/, '$1').replace( /^\./, '0.');
	);
	*/

	return this.toFixed( decimalPlaces).replace( /\.0+$|(\.\d*?)0+$/, '$1').replace( /^\./, '0.'); 
}



String.prototype.trim = function() 
{
	return this.replace(/^\s+|\s+$/g, ''); 
}

String.prototype.matchAll = function( expr) 
{
	if( expr.global === false) {
		throw 'matchAll: expr is not global';
	}
	
	var arr;
	var r = new Array();
	
	while(arr = expr.exec( this)) {
		r.push( arr);
	}
	
	return r;
}


