/* stac validation library */
/* stac_validator.js */
/*

	Script made by stac, based on prototype-jsvalidate
	this script much smaller and simpler.
	this script much smaller and simpler.

	usage:

		<form action="post.php" name="myform">
			<input type="text"  class="jsrequired jsvalidate_email" name="Email" />
			...
		</form>

		<script type="javascript">
			stacAttachValidation(document.forms['myform']);
		</script>
*/

function isset(v) {
	return((typeof(v)=='undefined' || v.length==0) ? false : true);
}

Array.prototype.inArray = function (value){
    var i;
    for (i=0; i < this.length; i++) {
        // Matches identical (===), not just similar (==).
        if (this[i] === value) {
            return true;
        }
    }
    return false;
};

Array.prototype.remove=function(s){
	for(i=0;i<this.length;i++){
		if(s==this[i]) this.splice(i, 1);
	}
};

function in_array(needle, haystack, strict) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true

    var found = false, key, strict = !!strict;

    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }

    return found;
}
function array_key_exists ( key, search ) {
    if( !search || (search.constructor !== Array && search.constructor !== Object) ){
        return false;
    }
    return key in search;
}
var digits = "0123456789";
var validWorldPhoneChars = "()-. +";
var minDigitsInIPhoneNumber = 7;

function isInteger(s){
	 var i;
    for (i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    for (i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function checkInternationalPhone(strPhone){
	s=stripCharsInBag(strPhone,validWorldPhoneChars);
	return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}

var STAC_ALLOWED_ELEMENTS = ['INPUT', 'TEXTAREA', 'SELECT'];
var STAC_TEST_REGEX = {
	'jsvalidate_email' : /^([a-zA-Z0-9_\.\-])+(\+[a-zA-Z0-9]+)*\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
	,'jsvalidate_ilphone' : /^0[0-9]{1,2}( )*(-){0,1}( )*[0-9]{6,7}$/
	,'jsvalidate_alphanum' : /^[0-9]+$/
};
var STAC_VALIDATORS = ['jsrequired','jsvalidate_non_first'];


function stacCleanClasses(c)
{
	var ref_c = [];
	var j=0;
	for(var i=0; i<c.length; i++) {

		if (in_array(c[i], STAC_VALIDATORS) || array_key_exists(c[i], STAC_TEST_REGEX)) {
			ref_c[j++] = c[i];
			//console.log(c[i]);
		}
	}

	return ref_c;
}

/* attach onsubmit event */
function stacAttachValidation(objForm, opt) {
	objForm.onsubmit = function(){return stacCheckForm(this, opt);};
}
var js_more_opts;
function stacCheckForm(objForm, opts)
{
	var blnValid = true;
	var blnValidOne = true;
	var e_elem; var e_value;
	var e_tag; var e_type; var e_classes;
	var e_error;
	var e_arr = {};
	js_more_opts = opts;
	js_more_opts.external = opts.err_pos=='external' ? true : false;
	js_more_opts.err_alert = opts.err_type=='alert' ? true : false;



	var formElemes = Form.getElements(objForm);

	for (var i=0; i<formElemes.length; i++)
	{
		e_elem = formElemes[i];

		e_tag = e_elem.tagName.toUpperCase();
		e_type = e_elem.type.toUpperCase();


		if ( !STAC_ALLOWED_ELEMENTS.inArray(e_tag) || (e_tag == 'INPUT' && (e_type=='HIDDEN' || e_type=='IMAGE')))
			continue;

		e_classes = e_elem.className.split(' ');
		e_classes  = stacCleanClasses(e_classes);
		if (e_classes.length > 0)
		{
			e_value = $F(e_elem).strip();
			e_error = isset(e_elem.alt) ? e_elem.alt : '';
			e_arr = {'elem': e_elem
					, 'tag': e_tag
					, 'type': e_type
					, 'value': e_value
					, 'error': e_error
					,'classes':e_classes
					, 'i': i};

			blnValidOne = stacValidateField(e_arr);
			blnValid = blnValid && blnValidOne;

			//console.log(blnValid +' - ' +blnValidOne+' :: '+ e_arr.elem.name + ', '+e_arr.value + ', '+e_arr.classes);
		}
	}

	return blnValid;
}

function stacValidateField(e)
{
	var blnValid=true;
	var fld_required = false;
	var ref_classes = [];
	ref_classes = e.classes;

	if (ref_classes.inArray('jsrequired')) {
		fld_required=true;
	}

	if (ref_classes.inArray('jsvalidate_non_first'))
	{
		if (e.tag == 'SELECT' && e.elem.selectedIndex == 0) {
			blnValid = false;
			//alert('jsvalidate_non_first '+e.elem.name);
		}
	}


	for (var j=0; j<ref_classes.length; j++)
	{
		switch(ref_classes[j])
		{
			case 'jsvalidate_ilphone':

				if (!e.value.empty()) {

					if( !checkInternationalPhone(e.value) ) {
						blnValid = false;
					//	alert('jsvalidate_ilphone '+e.elem.name);
					}

				} else {
					if(fld_required) {
						blnValid = false;
						//alert('required phone '+e.elem.name);
					}
				}
				break;

			case 'jsvalidate_email':

				if (!e.value.empty()) {
					if(!STAC_TEST_REGEX['jsvalidate_email'].test(e.value)) {
						blnValid = false;
						//alert('jsvalidate_email '+e.elem.name);
					}
				} else {
					if(fld_required) {
						blnValid = false;
						//alert('required email '+e.elem.name);
					}
				}
				break;
		}
	}

	vldbefore = blnValid;
	if (true === fld_required) {
		if (e.value.empty()) {
			blnValid = false;
			//alert('jsrequired '+e.elem.name);
		}
	}

	//alert(vldbefore +' ::' +blnValid);
	if (blnValid == false) {
		stacThrowErrorField(e);
	} else {
		stacResetErrorField(e);
	}


	return blnValid;
}


var ErrorAlerted = false;

function stacThrowErrorField(e) {
	e.elem.style.backgroundColor='#FFEFEF';
	e.elem.style.borderColor='red';
	e.elem.style.borderWidth='1px';
	e.elem.style.borderStyle='solid';

	if (e.error.empty()) return false;

	var id_idx = 's_err_'+e.elem.name+'_'+e.i;
	if (js_more_opts.external)
		e.elem = js_more_opts.div_id;

	//alert(s_error +  id_idx);
	if (js_more_opts.err_alert)
	{
		if( ErrorAlerted == false ){
            alert(e.error);
            ErrorAlerted = true;
        }
		return false;
	}

	if(null == $(id_idx)) {
		$(e.elem).insert({after: '<br /><span id="'+id_idx+'" style="opacity:0.0;display:none;" class="field_attention">'+e.error+'</span>'});
	}

	if ($(id_idx) && $(id_idx).style.display=='none') {
		Effect.Appear(id_idx, { duration: 1.8 });
	} else if ($(id_idx) && $(id_idx).style.display=='') {
		new Effect.Shake(id_idx, {duration:0.6, distance:10});
		//Effect.Pulsate(id_idx, { pulses: 4, duration: 1.0 });

		//new Effect.Opacity(id_idx, {from:1.0, to: 0.0, duration: .5 });
		//new Effect.Opacity(id_idx, {from:1.0, to: 1.0, duration: 1.5 });
		//Effect.Appear(id_idx, { duration: 1.0 });
	}
}

function stacResetErrorField(e) {
	e.elem.style.backgroundColor='#fff';
	e.elem.style.borderColor='black';
	e.elem.style.borderWidth='1px';
	e.elem.style.borderStyle='solid';

    //alert(s_error +  id_idx);
	if (js_more_opts.err_alert)
	{
        ErrorAlerted = false;
	//	alert(e.error);
		return false;
	}

	var id_idx = 's_err_'+e.elem.name+'_'+e.i;
	if (js_more_opts.external)
		e.elem = js_more_opts.div_id;

	if ($(id_idx) && $(id_idx).style.display=='') {

		Effect.Fade(id_idx, { duration: 1.8 });
	}
}


