var Toolbox = new Class({
	
	selectRange : function(el) {
		
		//alert(el);
		
		if (document.selection) {
			
			var range = document.body.createTextRange();
		
			range.moveToElementText(el);
			range.select();
			
		} else {
			
			var range = document.createRange();
			
			range.setStartBefore(el);
			range.setEndAfter(el);
			
			window.getSelection().addRange(range);
			
		}

	},
	
	scrollTo : function(id) {
		
		if((id != 'top') && !$chk($(id))) {
			return;
		}
		
		var h = 0;
		if($chk($(id))) {
			//alert($(id).getPosition().y);
			var h = ($(id).getPosition().y - 56);
		}
		new Fx.Scroll($(document.body)).start(0, h);
	
	},
	
	getTimezoneOffset : function() {
		var oDate = new Date()
		var offset = -oDate.getTimezoneOffset();
		return offset;
	},
	
	replaceQuotes : function(str) {
		return str.replace(/"/g, '&quot;');
	},
	
	print_r: function(arr,level) {
		var dumped_text = "";
		if(!level) level = 0;
		
		//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') { //Array/Hashes/Objects 
			for(var item in arr) {
				var value = arr[item];
				
				if(typeof(value) == 'object') { //If it is an array,
					dumped_text += level_padding + "'" + item + "' ...\n";
					dumped_text += dump(value,level+1);
				} else {
					dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
				}
			}
		} else { //Stings/Chars/Numbers etc.
			dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
		}
		return dumped_text;
	},
	
	isInteger: function(s) {
	  return (s.toString().search(/^-?[0-9]+$/) == 0);
	},
	
	alert: function(str) {
		
		LightboxGuru.viewHtmlbox('Lightbox.alert.ajax.php', oLocalization.alert, {'str':str.clean()});
		
	},
	
	isPhoneNumber: function(s) {
		
		s = this.normalizePhoneNumber(s);

		if(s.length > 16) {
			return false;
		}

		return (s.toString().search(/^[\+]?(((\+\d{0,3})|(\(\+\d{0,3}\)))\s*)?((\d{0,6})|(\(\d{0,6}\)))\/?(([ -.]?)\d{1,5}){1,5}((\s*(#|x|(ext))\.?\s*)\d{1,5})?(?!:(\Z|\w|\b\s))$/) == 0);	
		
	},
	
	isPotentialPhoneNumber: function(s) {
		
		s = s.replace(/-/g, '');
		
		if(s.length > 16) {
			return false;
		}
		
		return (s.toString().search(/^(00|\+|011|0|[0-9]){1}[0-9]{0,14}$/) == 0);	
		
	},
	
	normalizePhoneNumber: function(s) {
		
		s = s.replace(/^011/, '+');
		s = s.replace(/^010/, '+');
		s = s.replace(/^00/, '+');
		s = s.replace(/^0/, Context.homeprefix);
		s = s.replace(/-/g, '');
		//s = s.replace(/ /g, '');

		/* if(s.length == 1 && s.substr(0,1) == '+') {
			s = Context.homeprefix;
		}
		
		if(s.length == 0) {
			s = '+' + Context.homeprefix;
		} */

		if(s.substr(0,1) != '+') {
			s = '+' + s;	
		}
		
		return s;
		
	},
	
	phoneNumberToDigits: function(s) {
		
		s = this.normalizePhoneNumber(s);
		return s.replace(/\+/,'');
		
	},
	
	numberToCountry: function(s) {
		
		//$('sender-id').set('value',s);
		
		var number = s
		var digits = s.length;
		var oCountry = null;
		
		while(digits > 0) {
			
			if(number.substr(0,digits) == '011' || number.substr(0,digits) == '010' || number.substr(0,digits) == '00') {
				return null;	
			}
			
			if(oPrefixes.has(this.phoneNumberToDigits(number.substr(0,digits)))) {
				var r = oPrefixes.get(this.phoneNumberToDigits(number.substr(0,digits)));
				
				var oCountry = new Hash();
				r = r.split(':::');
				oCountry.set('countrycode',r[0]);
				oCountry.set('name',r[1]);
				oCountry.set('prefix',this.phoneNumberToDigits(number.substr(0,digits)));
				if(r[2] == 'null') {
					oCountry.set('territory',null);
				} else {
					oCountry.set('territory',r[2]);
				}
				oCountry.set('nsn',r[3]);
				
				return oCountry;
			}
			
			digits = digits - 1;
			
		}
		
		return null;
		
	},
	
	aGsmChars : [64,163,36,165,232,233,249,236,242,199,10,216,248,13,197,229,916,95,934,915,923,937,928,936,931,920,926,12,94,123,125,92,91,126,93,124,164,8364,198,230,223,201,32,33,34,35,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,161,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,196,214,209,220,167,191,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,228,246,241,252,224], // contains DEC codes of GSM 3.38 standard
	
	eEscapeChars : [12,94,123,125,92,91,126,93,124,8364],
	
	isUnicode: function(s) {			
		if(s.clean().length == 0) {
			return false;
		}
		
		for(var i=0; i<s.length; i++) {
			if(!this.isGsmChar(s.charCodeAt(i))) {
				return true;
			} 
		}
		return false;
	},

	isGsmChar : function(charcode) {
		if(this.aGsmChars.contains(charcode)) {
			return true;
		} else {
			return false;
		}	
	},
	
	isEscapeChar: function(charcode) { 
		if(this.eEscapeChars.contains(charcode)) {
			return true;
		} else {
			return false;
		}
	},
	
	// bad implementation
	sleep : function(milliSeconds) {
		var startTime = new Date().getTime(); // get the current time
		while (new Date().getTime() < startTime + milliSeconds); // hog cpu
	}


	
	

});
