var Utils = {
	
	random: function(n,p) {
		return n + Math.round(Math.random() * (p-n));
	},
	
	replace_html: function(element, html) {
		element = $(element);
		element.innerHTML = html;
		return html.evalScripts();
	},
	
	replace_element: function(element, html) {
		element = $(element);
		new Insertion.Before(element,html);
		Element.remove(element);
		return html.evalScripts();
	},
	
	insertion_bottom: function(element, html) {
		element = $(element);
		new Insertion.Bottom(element,html);
		html.evalScripts();
	},
	
	insertion_top: function(element, html) {
		element = $(element);
		new Insertion.Top(element,html);
		html.evalScripts();
	},
	
	load_js: function(url) {
		var e = document.createElement("script");
		e.src = url;
		e.type="text/javascript";
		document.getElementsByTagName("head")[0].appendChild(e);
	},
	
	getPageSize: function() {
		var xScroll, yScroll;

		if (window.innerHeight && window.scrollMaxY) {  
			xScroll = document.body.scrollWidth;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}

		var windowWidth, windowHeight;
		if (self.innerHeight) { 
			var tmp = document.createElement("div");
			tmp.id = "tmp_page_size";
			tmp.style.position = "absolute";
			tmp.style.width = tmp.style.height = "100%";
			tmp.style.top = tmp.style.left = "0px";
			document.getElementsByTagName("body")[0].appendChild(tmp);
			windowWidth = Element.getWidth(tmp);
			windowHeight = Element.getHeight(tmp);
			Element.remove(tmp);
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}     
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else { 
			pageHeight = yScroll;
		}

		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){      
			pageWidth = windowWidth;
		} else {
			pageWidth = xScroll;
		}
		
		return {pageWidth: pageWidth ,pageHeight: pageHeight , windowWidth: windowWidth, windowHeight: windowHeight};
	},
	
	getWindowScroll : function() {
	    var w = window;
	      var T, L, W, H;
	      with (w.document) {
	        if (w.document.documentElement && documentElement.scrollTop) {
	          T = documentElement.scrollTop;
	          L = documentElement.scrollLeft;
	        } else if (w.document.body) {
	          T = body.scrollTop;
	          L = body.scrollLeft;
	        }
	        if (w.innerWidth) {
	          W = w.innerWidth;
	          H = w.innerHeight;
	        } else if (w.document.documentElement && documentElement.clientWidth) {
	          W = documentElement.clientWidth;
	          H = documentElement.clientHeight;
	        } else {
	          W = body.offsetWidth;
	          H = body.offsetHeight
	        }
	      }
	      return { top: T, left: L, width: W, height: H };

	  },
	
	iframe_count: 0,
	create_iframe: function(url) {
		this.iframe_count++;
		new Insertion.Bottom($$('body')[0],'<iframe style="position:absolute;top:-1000px;left:-1000px;" src="'+url+'" name="iframe_'+this.iframe_count+'" id="iframe_'+this.iframe_count+'"></iframe>');
	}
	
};

var KeyEvents = {
	
	shiftPressed: false,

	keyHandlerDown: function(event) { 
		if(event.shiftKey) this.shiftPressed = true; 
	},
	keyHandlerUp: function(event) {
	    var key = event.which || event.keyCode;
        this.shiftPressed = false;
	},
	
	is_shift: function(event) { Event.stop(event); return this.shiftPressed || event.shiftKey; },
	is_alt: function(event) { return event.altKey; },
	
	observe_enter: function(element,fun_before,fun_after) {
		Event.observe($(element), 'keydown', function(event,args) {
			if (event.keyCode == 13 && args.fun != null)
				args.fun();
		}, false, {fun:fun_before});
		
		Event.observe($(element), 'keyup', function(event,args) {
			if (event.keyCode == 13 && args.fun != null)
				args.fun();
		}, false, {fun:fun_after});
	}
	
};
Event.observe(window, 'keydown', KeyEvents.keyHandlerDown, false);
Event.observe(window, 'keyup', KeyEvents.keyHandlerUp, false);

var Integer = {
	
	int_to_s: function(val) {
		return val+"";
	}
	
}

Object.extend(String.prototype, {
	strpos: function(ch) {
  		for (var i=0; i < this.length; i++) {
  			if (this.substring(i,i+1) == ch)
				return i;
  		};
		return -1;
	},

	encode: function() {
		return encodeURIComponent(this);
	}

});