
///////////////config
var 	_req_border_style 	= "thin solid #cc0000",
		_email_field_name 	= "",
		_passw_field_name	= "",
		_passw_check_name 	= "",
		_select_unnaceptable_value = "0",
		_validateWhileTyping = true,
		_bypassSelects = false,
		__imposeMessage = "<div style=\"font-size:9px;float:left; clear:left\" id=\"impose\" rel=\"impose\">Please complete at least the required fields.</div>"
		;
//////////////

var emailFilter 		=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,
	emailFieldFilter 	=/(\w*)e*mail(\w*)/i,
	passwFilter			=/\S{5,}/i,
	passwFieldFilter 	= /(\w*)pass[word|](\w*)/i,
	passwCheckFilter 	= /(\w*)pass[word|](\w*)[check|2](\w*)/i,
	_F = new Array(),
	_lastSubmit = null,
	_lastSubmitValue = '',
	_p = '',
	defaultBackground = ''
	;

function $(id){
	return document.getElementById(id);
}

function $tag(tag){
	return document.getElementsByTagName(tag);
}

function $submit(els){
	var count = els.length, i=0, _return= new Array();
    for (;i<count;i++){
		var oel = els[i];
		var relAttribute = String(oel.getAttribute('rel'));
		if (relAttribute.toLowerCase() == 'submit'){	
			return oel;
		}
	}
	return false;
}

function $$(tag, attr, val){
	var els = $tag(tag);  
	var count = els.length, i=0, _return= new Array();
    for (;i<count;i++){
		var oel = els[i];
		var relAttribute = String(oel.getAttribute(attr));
		if (relAttribute.toLowerCase().match(val)){	
			_return.push(oel);
		}
	}
	return _return;
}
function initStyles(elms){
	var count = elms.length, i=0;
    for (;i<count;i++){  
		elms[i].style.border = _req_border_style;	
	}
}
function setUpTypingListeners(aForm){
	var i = 0, fels = aForm.elements, count = fels.length;
	for(;i<count;i++){
		var fel = fels[i],
		nm = fel.getAttribute('name');
		if( ( isRequired(fel) )
		   ||
		   (  (isSelect(fel)&& !_bypassSelects))) {
				fel.onchange = fel.onblur = function(){	
					silentValidate(aForm);
					loudValidate(this);
				}
		}
	}
}


function vaildPass(pass){
	var vl = pass.value;
	if(passwFilter.test(vl)){
		if(_p == '') {
			_p = vl;
		} else if(vl!=_p) {
			return false;
		}
		return true;
	}
	return false;
}
function loudValidate(target){
	var val__ = doValidate(new Array(target),true);
	var	count = val__.length ;
	if(count == 1 ){
	//	alert("Sorry, you've entered invalid data in the "+val__[0]+"field");
		if(val__[0]){
			target.value = "";
			try{
				target.style.backgroundColor = "#FFFFCC";
			}
			catch(e){}
		}
	}
}
function validate_(form){
	var arr = doValidate(form.currentTarget.elements);
	if(arr.length){
		makeError(arr);
		return false;
	} else {
		return true;
	}
}
function silentValidate(form){
	if(doValidate(form.elements).length){
		
	} else {
		
		var su = $submit(form.elements);
		form.onsubmit = "";
		su.disabled = false;
		try{
			$("impose").outerHTML="";
		} catch (e){
			try{
				su.nextSibling.outerHTML="";
			} catch (e){
			}
		}
		try{
			if(window.navigator.userAgent.indexOf('Safari')!=-1){
				su.style.float = "none";
				su.style.clear = "none";
				var can = su.nextSibling.nextSibling;
				can.style.float = "none";
				can.style.marginTop = "0px";
				su.nextSibling.nextSibling.style.marginLeft = "0px";
			}else if(window.navigator.userAgent.indexOf('Opera') != -1){
				su.style.float = "none";
				su.style.clear = "none";
				su.nextSibling.nextSibling.style.position = "relative";
				su.nextSibling.nextSibling.style.top = "0px";
				su.nextSibling.nextSibling.style.marginLeft = "0px";
			}
			
		}catch(e){
		}
		try{
			su.setAttribute('type', 'submit');
		} catch(e){
			su.disabled=false;
			su.onclick = function(){
				form.submit();
			};
		}
		
	}
	
}
function isPass(fel){
	var nm = fel.getAttribute?fel.getAttribute('name'):null;
	if(nm){
		return ((nm==_passw_field_name ^ nm==_passw_check_name) || passwFieldFilter.test(nm) || fel.getAttribute('type')=='password');
	} else {
		return false;
	}
}
function isEmail(nm){
	return (nm==_email_field_name || emailFieldFilter.test(nm)  );
}
function isRequired(fel){
	return (fel.getAttribute('rel') == 'required' || (fel.getAttribute('class')!=null && fel.getAttribute('class').toLowerCase().indexOf('required')!= -1) );
}
function isCheckbox(fel){
	return (fel.getAttribute('type')!=null && fel.getAttribute('type')=="checkbox");
}
function isSelect(fel){
	return ( String(fel.outerHTML).toLowerCase().indexOf("<select")!= -1 ) ;
}
function isSubmit(fel){
	return (String(fel.outerHTML).toLowerCase().indexOf('<input')!=-1 && fel.getAttribute('type').toLowerCase()=='submit');
}
function verifySelect(fel){
	try{
		obj = fel[fel.selectedIndex].value;
		return obj==null || obj == undeinfed || obj =='' || obj == _select_unnaceptable_value;
	}catch (e){
		return false;
	}
}
function doValidate(fels,verbose){
	var i = 0,  count = fels.length, r = new Array();
	_p = '';
	for(;i<count;i++){
		var fel = fels[i],
		vl = fel.value,
		nm = fel.getAttribute('name');
		if( ( (isRequired(fel)) &&
						( ( isPass(fel) && !vaildPass(fel) ) ||
						( ( isEmail(nm) && !emailFilter.test(vl) ) ) ||
						( ( isCheckbox(fel) && !fel.checked) ) ||
						( vl == null || vl == "" || vl == undefined )  ) )
		   ||
		   (  (!_bypassSelects && isSelect(fel)) && (verifySelect(fel))  ))		   		   {
			if(verbose){
				var val__ =	isRequired(fel)?(isPass(nm)?"password ":(isEmail(nm)?("email "):(isSelect(fel)?("select "):("required ")))):("required ");
				r.push(val__);
			} else {
				r.push(nm);
			}
		}else if((!_validateWhileTyping) && isSubmit(fel)){
			_lastSubmitValue = vl;
			_lastSubmit = fel;
			fel.diabled = true;
			fel.value = 'working';
		}
	}	
	return r;
}

function makeError(r){
	var m = 'We\'re sorry, but we cannot process your request because you either left some required fields blank or they contain invalid data.\n';
		m+= r.length>1?'The fields in question are:\n':'The field in question is:\n';
		m+= r.join('\n')+'\n';
		m+= 'Please try again!';
	alert(m);
	if(_lastSubmit){
		_lastSubmit.value = _lastSubmitValue;
		_lastSubmit.disabled = false;
	}
}

function do_(){
	initStyles($$('input','rel','required'));
	var s =  $$('input', 'rel', 'submit');
	var i = 0, count = s.length;
	for(;i<count;i++){
		var su = s[i];
		su.id = '_submitButton__'+i;
		if(_validateWhileTyping){
			su.disabled = true;			
			try{
				if(window.navigator.userAgent.indexOf('Safari')!=-1){
					su.style.float = "left";
					su.style.clear = "right";
					var can = su.nextSibling.nextSibling;
					can.style.float = "left";
					can.style.marginTop = "-22px";
					can.style.marginLeft = "-62px";
				} else if(window.navigator.userAgent.indexOf('Opera') != -1){
					try{
						su.style.float = "left";
						su.style.clear = "right";
						var can = su.nextSibling.nextSibling;
						can.style.position = "relative";
						can.style.top = "-18px";
						can.style.marginLeft = "-61px";
						__imposeMessage = '<br />'+__imposeMessage;
					} catch (e) {
						throw(e);
					}
				}
				
			} catch(e){}
			su.outerHTML += __imposeMessage;
		}
		else
			su.setAttribute('type', 'submit');
	}
	_F = $tag('form');
	i = 0, count = _F.length;
	for(;i<count;i++){
		_F[i].onsubmit = _validateWhileTyping?function(){return false}:validate_;
		//_F[i].id = '_form__'+i;
		if(_validateWhileTyping){	
			setUpTypingListeners(_F[i]);
		}
	}
}

var _emptyTags = {
   "IMG":   true,
   "BR":    true,
   "INPUT": true,
   "META":  true,
   "LINK":  true,
   "PARAM": true,
   "HR":    true
};
	try{
	HTMLElement.prototype.__defineGetter__("outerHTML", function () {
	   var attrs = this.attributes;
	   var str = "<" + this.tagName;
	   for (var i = 0; i < attrs.length; i++)
		  str += " " + attrs[i].name + "=\"" + attrs[i].value + "\"";
	
	   if (_emptyTags[this.tagName])
		  return str + ">";
	
	   return str + ">" + this.innerHTML + "</" + this.tagName + ">";
	});
	HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
	   var r = this.ownerDocument.createRange();
	   r.setStartBefore(this);
	   var df = r.createContextualFragment(sHTML);
	   this.parentNode.replaceChild(df, this);
	});
	} catch(e){}

window.onload = do_;
