window.onDomReady = function(init){
	var state = document.readyState;
	if (state && document.childNodes && !document.all && !navigator.taintEnabled){ //khtml
		if (state.test(/loaded|complete/)) return init();
		else return Window.onDomReady.pass(init).delay(100);
	} else if (state && window.ActiveXObject){ //ie
		var script = $('_ie_ready_');
		if (!script) document.write("<script id='_ie_ready_' defer='true' src='://'></script>");
		$('_ie_ready_').addEvent('readystatechange', function(){
			if (this.readyState == 'complete') init();
		});
		return;
	} else { //others
		var myInit = function() {
			if (arguments.callee.done) return;
			arguments.callee.done = true;
			init();
		};
		window.addEvent("load", myInit);
		document.addEvent("DOMContentLoaded", myInit);
	}
};

String.extend({
	isEmpty: function(){
		var s = this;
		return ! /^\s*(\S+(\s+\S+)*)\s*$/.test(s);
	},
	
	isEmail: function (){
		var s = this;
		return  /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(s);
	},
	format: function(){
		var s = this;
		for(var i=0;i<arguments.length;i++){
			var re = new RegExp('#\\{' + i + '\\}', 'g');
			s=s.replace(re,arguments[i]);
		}
		return s;
	},
	format2: function (pairs, keepXtras){
		var s = this;
		for(var name in pairs){
			var re = new RegExp('#\\{' + name + '\\}', 'g');
			s = s.replace(re, pairs[name]);
		}
		if(!keepXtras) 
			s = s.replace(/#{([^\}\s]+)}/g, ''); 
		return s;
	}
});

var Json={

toString: function(o) {	
	if(o == null) {
		return "null";
	}
	var v = [];
	var i;
	// Firefox bug when using different script tags
	var c = o.constructor;
	if(c == Number) {
			return isFinite(o) ? o.toString() : Json.toString(null);
	} else if(c == Boolean) {
			return o.toString();
	} else if(c == String) {
			for(i=0; i<o.length; i++) {
				var c = o.charAt(i);
				if(c >= " ") {
					if(c == "\\" || c == '"') {
						v.push("\\");
					}
					v.push(c);
				} else {
					switch(c) {
						case "\n": v.push("\\n"); break;
						case "\r": v.push("\\r"); break;
						case "\b": v.push("\\b"); break;
						case "\f": v.push("\\f"); break;
						case "\t": v.push("\\t"); break;
						default:
							v.push("\\u00");
							v.push(c.charCodeAt().toString(16));
					}
				}
			}
			return '"' + v.join('') + '"';
	} else if (c == Array) {
			for(i=0; i<o.length; i++) {
				v.push(Json.toString(o[i]));
			}
			return "[" + v.join(",") + "]";
	} else if (c == Date) {
			var d = {};
			d.__type = "System.DateTime";
			d.Year = o.getUTCFullYear();
			d.Month = o.getUTCMonth() +1;
			d.Day = o.getUTCDate();
			d.Hour = o.getUTCHours();
			d.Minute = o.getUTCMinutes();
			d.Second = o.getUTCSeconds();
			d.Millisecond = o.getUTCMilliseconds();
			return Json.toString(d);
	}
	if(typeof o.toJSON == "function") {
		return o.toJSON();
	}
	if(typeof o == "object") {
		for(var attr in o) {
			if(typeof o[attr] != "function") {
				v.push('"' + attr + '":' + Json.toString(o[attr]));
			}
		}
		if(v.length>0) {
			return "{" + v.join(",") + "}";
		}
		return "{}";		
	}
	return o.toString();
},
  
  evaluate: function(str){
		return eval('(' + str + ')');
	}
};

var util={
	validate: function (flds){
		var err=null;
		var isEmail=false;
		flds.each(function(txt){
			var el = $(txt);
			if(!el) return;
			var v = $F(el);
			el.removeClass('err');
			if(v.isEmpty()){
				el.addClass('err');
				err=err||el;
			}
			if(/email/i.test(txt) && !err && !v.isEmail()){
				el.addClass('err');
				err=err||el;
				isEmail = true;
			}
		});
		
		if(err){
			err.select();
			alert(err.title + (isEmail ? ' is invalid.' : ' is required.') );
		}
			
		return !err;
	},

	resetForm: function (){
		$$('input, textarea').each(function(e){
			if(e.type && e.type == 'checkbox') e.checked=false;
			else e.value='';
		});
	},
	
	makeInteractive: function(lnk){
		$$('input, textarea').each(function(e){
			var e = $(e);
			e.addEvent('focus', function(){this.addClass('focus');});
			e.addEvent('blur', function(){this.removeClass('focus');});
			e.addEvent('keypress', function(event){
				if(e.nodeName.toLowerCase()=='input' && (event.keyCode || event.charCode) == 13)
					if($(lnk).click)$(lnk).click();
			});
		});
	},
	
	escapeHtml:function(o){
		for(var i in o){
			o[i] = o[i].toString().replace(/</g,'&lt;').replace(/>/g,'&gt;');
		}
		return o;
	}
	
	
};

$F=function(el){
	return $(el).getValue();
}

window.onDomReady(function(){
	var ul = $$('#nav ul')[1];
	var i=0;
	$$('#nav ul li').each(function(li){
		if(li.parentNode == ul) return;
		if(i++ % 2) li.addClass('alt');
	});

})
