var U = {
	version:0.1, 
	branch:'devel',
	ENV : 'dev',
	loadJS : function(file) {
		document.write('<script type="text/javascript" src="'+file+'?v='+this.version+'"></script>');
		return this;
	},
	loadCSS : function(file) {
		document.write('<link rel="stylesheet" href="'+file+'?v='+this.version+'" />');
		return this;
	},
	init : function() {
		this.Error.init();
	},
	getRequestUrl : function(name) {
		//return "/do.php?method="+name;
	},
	constructActionUrl : function(data) {
		return "/" + data['module_url_string'] + "/" + data['action'] + data['params'];
	},
	setCookie : function(name,value,days) {
		if (days) {
			var date=new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires="; expires="+date.toGMTString();
		} 
		else expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	Error : {
		items : new Array(),
		log : function(message) {
			this.items.push(message);
			this._show();
		},
		_show : function() {
			this.items.each(function(item) {
				$log(item.replace("\t", " "));
			}, this);
		},
		getString : function(error) {
			var message = 'ERROR: ';
			for(var i in error) message+=i +' - '+error[i]+'\n';
			return message;
   		},
   		__onError : function(desc,page,line) {
			this.log('ERROR: \ndescription: \t'+desc+'\nPage address:\t'+page+'\nLine number:\t'+line);
			return true;
   		},
   		init : function() {
   			if (U.ENV != 'dev' || Browser.Engine.trident4) 
   			window.onerror = this.__onError.bind(this);
   		}
	},
	getCookie: function(name)
	{
		if (document.cookie.length>0)
		{
		  c_start=document.cookie.indexOf(name + "=");
		  if (c_start!=-1)
		  {
		    c_start=c_start + name.length+1;
		    c_end=document.cookie.indexOf(";",c_start);
		    if (c_end==-1) c_end=document.cookie.length;
		    return unescape(document.cookie.substring(c_start,c_end));
		  }
		}
		return "";
	},
	openClickedLink: function(element)
	{
		var url = element.innerHTML;
		//window.location = url;
		window.open(url);
		return false;
	},
	Pages : {}
}
U.init();

var $newid = function() { return 'elm-'+$newid.id++};
$newid.id = 1;
var $guid = function() {
	var result = '';
	for(var j=0; j<32; j++) {
		if( j == 8 || j == 12|| j == 16|| j == 20) result += '-';
		result += Math.floor(Math.random()*16).toString(16).toUpperCase();
	};
	return result;
}
Array.implement({
	__typeName : 'Array',
	add : function(item){this[this.length]=item;return this;},
	aggregate : function(seed,callback){var length=this.length;for(var index=0;index<length;index++){seed=callback(seed,this[index],index,this);} return seed;},
	contains : function(item){var index=this.indexOf(item);return(index>=0);},
	extract : function(index,count){if(!count){return this.slice(index);} return this.slice(index,index+count);},
	groupBy : function(callback){var length=this.length;var groups=[];var keys={};for(var index=0;index<length;index++){var key=callback(this[index],index);if(String.isNullOrEmpty(key)){continue;} var items=keys[key];if(!items){items=[];items.key=key;keys[key]=items;groups.add(items);} items.add(this[index]);} return groups;},
	index : function(callback){var length=this.length;var items={};for(var index=0;index<length;index++){var key=callback(this[index],index);if(String.isNullOrEmpty(key)){continue;} items[key]=this[index];} return items;},
	insert : function(index,item){this.splice(index,0,item);},
	remove : function(item){var index=this.indexOf(item);if(index>=0){this.splice(index,1);return true;} return false;},
	removeAt : function(index){return this.splice(index,1)[0];}
});
var $log = function(text) {if (window.console && window.console.log) window.console.log(text)}
$extend(String.prototype, {

    toLower : function() { return this.toLowerCase(); },
    toUpper : function() { return this.toUpperCase(); },
    mask : function(){return this.replace(/\S/g,'*')},
    trim : function(){ return this.replace(/^\s*([\s\S]*\S+)\s*$|^\s*$/,'$1'); },
	formatWith : function() {
		var s = this;
		$A(arguments).forEach(function(str,i) {s = s.replace(new RegExp("(\{)"+i+"(\})","g"), str)});
		return s;
	},
	getTagContent : function(name) {
		var text = this;	
		var regex = new RegExp('<'+name+'>((([^<]*)(<(?!/'+name+'))?)*)</'+name+'>');
		var regMatch = regex.exec(text);
		if (regMatch && regMatch.length > 1 && regMatch[1] != null) return regMatch[1];
		else return '';
	},
    isEmail : function() {
	    var re = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	    return re.test(this.trim());
    },
    isMoney : function() {
	    var re = /^\-?\d+(\.\d{2})$/;
	    return re.test(this.trim());
    },
    isDate : function() {
	    var re=/^((0?\d)|(1[0-2]))(\\|\/|-)((0?\d)|([1-2]\d)|(3[0-1]))(\\|\/|-)(\d{2}|\d{4})$/;
	    return re.test(this);
    },
	isZip : function() {
		return /^\d{5,6}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$/.test(this);
	},
	isEmail : function() {
		return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(this);
	},
    isTime : function() {
	    var re=/^(((0?[1-9]|1[0-2])(:|\.)[0-5]\d((:|\.)[0-5]\d)?( )?(([aA]|[pP])[mM]))|((0?\d|1\d|2[0-3])(:|\.)[0-5]\d((:|\.)[0-5]\d)?))$/;
	    return re.test(this);
    },
	isHtml : function() {
		//var re = new RegExp("</?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)/?>");
		return (/<\/?[^>]+>/gi).test(this);
	},
    isDateTime : function() {
	    var re=/^((0?\d)|(1[0-2]))(\\|\/|-)((0?\d)|([1-2]\d)|(3[0-1]))(\\|\/|-)(\d{2}|\d{4})( )(((0?[1-9]|1[0-2])(:|\.)[0-5]\d((:|\.)[0-5]\d)?( )?(([aA]|[pP])[mM]))|((0?\d|1\d|2[0-3])(:|\.)[0-5]\d((:|\.)[0-5]\d)?))$/;
    	
	    if (this.isDate()) return true;
	    if (this.isTime()) return true;
	    if (re.test(this)) return true;
	    return false;
    },
	isInt : function() {
		return new RegExp(/\d+/).test(this.trim());
	},
	containedIn : function(value, separator) {
		separator = $pick(separator, ',');
		var s = this, values = value.split(separator);
		for(var i=values.length;i>=0;i--) {
			if (values[i] == s) return true;
		}
		return false;
	},
	translate : function(){
		var s;
        if(typeof(U.Dictionary) == 'object' && (s=U.Dictionary[this]) ) {
			for (var i = 0, nL = arguments.length; i < nL; i++) {
				s = s.replace(new RegExp("(\{)"+i+"(\})","g"), arguments[i]);
			}  
			return s;
		}
        return this;
    },
	truncate: function(length, truncation) {
		length = $pick(length, 30);
		truncation = $pick(truncation, '...');
		return (this.length > length)?this.slice(0, length - truncation.length) + truncation : this;
	},
	strip: function() {
		return this.replace(/^\s+/, '').replace(/\s+$/, '');
	},
	matches : function(regexp) {
		return regexp.test(this);
	},
	zf : function(l) { return '0'.string(l - this.length) + this; },
	string : function(l) { var s = '', i = 0; while (i++ < l) { s += this; } return s; }
});
Number.prototype.zf = function(l) { return this.toString().zf(l); };
Number.prototype.to2digits = function(n) {return n < 10 ? "0" + n: n;};
var __globalSmoothScroll = null;
Element.implement({
	visible: function() {
    	return this.style.display != 'none';
  	},
	toggle: function() {
		if (this.visible())this.hide();
		else this.show();
		return this;
	},
	hide: function() {
		this.style.display = 'none';
		return this;
	},
	show: function() {
		this.style.display = '';
		return this;
	},
	smoothScrollTo: function(options){
		var options = $extend({},options||{elementOffset:0});
		try {
			var scrollY = (window.pageYOffset)?window.pageYOffset:document.documentElement.scrollTop;
			if ((!options.minPageOffset && !options.maxPageOffset) || 
			(options.minPageOffset && scrollY > options.minPageOffset) ||
			(options.maxPageOffset && scrollY < options.maxPageOffset))
			if (!__globalSmoothScroll) __globalSmoothScroll = new Fx.Scroll(window);
			__globalSmoothScroll.toElement(this);
			
		} catch(e) {Logger.log('smoothScrollTo: '+e.message);}
		return this;
	}
});
U.Element= new Class({
	initialize : function(element) {
		this.element = $(element);
	},
	show : function() {
		if (this.element) {
			this.element.show();
		}
		return this;
	},
	hide : function() {
		this.element.hide();
		return this;
	}
});
if(document.location.hash.toString() == '#debugmode' && (!("console" in window) || !("firebug" in console))) {
	U.loadJS("/js/firebug-lite.js")
}