// JavaScript Document
/*
required: {type: "required", re: /[^.*]/, msg: "This field is required."},
alpha: {type: "alpha", re: /^[a-z ._-]+$/i, msg: "This field accepts alphabetic characters only."},
alphanum: {type: "alphanum", re: /^[a-z0-9 ._-]+$/i, msg: "This field accepts alphanumeric characters only."},
integer: {type: "integer", re: /^[-+]?\d+$/, msg: "Please enter a valid integer."},
real: {type: "real", re: /^[-+]?\d*\.?\d+$/, msg: "Please enter a valid number."},
date: {type: "date", re: /^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$/, msg: "Please enter a valid date (mm/dd/yyyy)."},
email: {type: "email", re: /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i, msg: "Please enter a valid email."},
phone: {type: "phone", re: /^[\d\s ().-]+$/, msg: "Please enter a valid phone."},
url: {type: "url", re: /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i, msg: "Please enter a valid url."},
postode: /^(\d\d\d\d$)/;
*/
function jly_hide_all(vaArray){
	// pass array of element ids to hide them all
	vaArray.each(function(element, i){
		$(element).addClass('hidden');
	});
	
}

function jly_show_single(voSender,vaArray){
	jly_hide_all(vaArray);
	if($type(voSender) == "element")  {
		var lsHref = String(voSender.href);
		var lsElementId = lsHref.split("#")[1];
		voSender.addClass("on");
	} else {
		var lsElementId = voSender;
	}
	var loElement = $(lsElementId);
	
	loElement.removeClass('hidden');
}


function jly_toggle(voSender){
	if($type(voSender) == "element")  {
		var lsHref = String(voSender.href);
		var lsElementId = lsHref.split("#")[1];
	} else {
		var lsElementId = voSender;
	}
	var loElement = $(lsElementId);
	
	loElement.toggleClass('hidden');
}


function  jly_validate( vsString, vsType ) {
	var loRegExp;
	switch (vsType) {
		case "required" :
			loRegExp  = /[^.*]/;
			break;
		case "alpha" :
			loRegExp  = /^[a-z ._-]+$/i;
			break;
		case "seo" : //seo friendly urls
			loRegExp  = /^[a-z0-9-]+$/i;
			break;
		case "numeric" :
			loRegExp  = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
			break;
		case "email" :
			loRegExp  = /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i;
			break;
		case "postcode" :
			loRegExp  = /^(\d\d\d\d$)/;
			break;
		default :
			loRegExp  = /[^.*]/; // required
	}
	return loRegExp.test(vsString);
}

function  jly_validate_postcode( vsString ) {
	var loRegExp  =  /(\d\d\d\d$)/;
	return loRegExp.test(vsString);
}

function  jly_validate_numeric( vsString ) {
	var loRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
	return loRegExp.test(vsString);

}

function  jly_validate_email( vsString ) {
	var loRegExp  =  /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i;
	return loRegExp.test(vsString);
}

function jly_set_list(voElementId,voSender){
	var parent = $(voSender);
	var child = $(voElementId);
	child.empty();
	var option = new Element('option', {'value': ''}).set('text','Please wait...').inject(child);
	
	var group_id = parent.getProperty('value');
	if(child.hasClass('hide')){child.setStyle('display', group_id==''?'none':'inline'); }
	var url = '/_inc/modules/jellygnitecms/_optionlist.php?group_id='+group_id;
	var request = new Json.Remote(url, {
		onComplete: function(jsonObj) {
			jly_add_options(jsonObj.optionList, child);
		}
	}).send();
	if (child.onchange) child.onchange(); 
}

function jly_add_options(optionsvalues, voChild) {
	voChild.empty();
	optionsvalues.each(function(optionvalue) {
		var option = new Element('option', {'value': optionvalue.value}).setHTML(optionvalue.text).inject(voChild);
	});
}

function jly_get_human_field_name( vsName) {
	var lsReturnValue = String(vsName);
	lsReturnValue = lsReturnValue.replace(new RegExp('_id','gi'),''); // remove _id
	lsReturnValue = lsReturnValue.replace(new RegExp('_','gi'),' '); // replace underscore
	return (lsReturnValue.capitalize());
}

function jly_validator(voElement, vsMessage){
	this.element = voElement;
	this.message = vsMessage;
}

function jly_remove_validators() {
	//var divs = $$('div').filterByClass('validator');
	var divs = $$('div.validator','div.success');
	divs.each(function(element) {
		element.dispose();
	});
}


function jly_validate_form(vsForm, vbScroll){
	vbScroll = $defined(vbScroll) ? vbScroll : true;

	var lbReturnValue = true;
	var f = $(vsForm);
	var laValidateFields = [];
	jly_remove_validators();
	var fields = f.getElements('*[class^=val_]');
	fields.each(function(element) {
		element.removeClass('req');
		var lsElementName = jly_get_human_field_name(element.name);
		if((element.hasClass('val_checked'))){	
			if (element.checked != 1){
				laValidateFields.push(new jly_validator(element,'You must '+lsElementName+'.\n'));
				lbReturnValue = false;
			}
		} else {
			var lsElementValue = (element.getProperty('value')).trim();
		}
		if(element.hasClass('editor')){	
			//do this first - assign html content from tinymce
			element.value=tinyMCE.get(element.name).getContent(); 
			//tinymce v 2
			//tinyMCE.getContent(element.name);
			lsElementValue = element.value;
		}
		
		if((element.hasClass('val_required'))){	
			if(lsElementValue==''){
				laValidateFields.push(new jly_validator(element,lsElementName+' is required.\n'));
				lbReturnValue = false;
			}
		}  
		
		if((element.hasClass('val_numeric')) && (lsElementValue!='')){	
			if(jly_validate_numeric(lsElementValue)==false){
				laValidateFields.push(new jly_validator(element,lsElementName+' must be numeric.\n'));
				lbReturnValue = false;
			}
		}
		
		if((element.hasClass('val_seo')) && (lsElementValue!='')){	
			if(jly_validate(lsElementValue,'seo')==false){
				laValidateFields.push(new jly_validator(element,lsElementName+' must consist of alpha or numeric characters only. You may use a hyphen instead of a space.\n'));
				lbReturnValue = false;
			}
		}
		if((element.hasClass('val_email')) && (lsElementValue!='')){	
			if(jly_validate_email(lsElementValue)==false){
				laValidateFields.push(new jly_validator(element,lsElementName+' must be a valid email address.\n'));
				lbReturnValue = false;
			}
		}
		if(element.hasClass('val_length')){		
			var maxlength = 0;//element.getProperty('maxlength').toInt();
			var element_length = element.getProperty('value').length;
			if(element_length>maxlength) {
				//laValidateFields.push(element);
				laValidateFields.push(new jly_validator(element,lsElementName+' has a maximum length of ' + String(maxlength) + ' characters. You have entered '+ String(element_length)+' characters (including HTML).\n'));
				lbReturnValue = false;
			}
		}
		if((element.hasClass('val_confirm'))){	
			var en = String(element.name);
			var element_to_match = $(en.substr(0,en.indexOf("_confirm")));
			if(element.getProperty('value')!=element_to_match.getProperty('value')){
				laValidateFields.push(new jly_validator(element,lsElementName+' must match '+ jly_get_human_field_name(element_to_match.name)+'.\n'));
				lbReturnValue = false;
			}
		}


	});
	
	if(!lbReturnValue){
		var n = $('notification');
		laValidateFields.reverse().each(function(validator, index){		
			var msgContainer = new Element("div", {"id": validator.element.name + "_msg", "class": "validator"});
			msgContainer.set('html',validator.message);
			if($chk(n))	msgContainer.injectTop(n);
			validator.element.addClass('req');
			validator.element.addEvent('change', function(){jly_validate_form(this.getParent('form'),false);});
		//	msgContainer.clone().injectAfter(validator.element);
			if(vbScroll){
				window.scrollTo(0,0);
				if($('scroll')){
					$('scroll').scrollTo(0,0);
				}
			} else {
				msgContainer.clone().injectAfter(validator.element);
			}
		}); 
	}

	return lbReturnValue;
}