/////////////// -- Begin of Editable Region -- ///////////////

/*************************************************************************
*
*  required Element Array
*  true == required
*
*  To find out indices of form elements set the showFormElementsActive
*  variable to true and call the signup.php. A popup with the correct
*  requiredElements array will appear.
*  Just copy and paste the whole array between the marked lines and set
*  required fileds to true
*
**************************************************************************/

var requiredElements = new Array();
//-- replace from below this line --//
requiredElements[0] =  true; // recipient
requiredElements[1] =  true; // first_name
requiredElements[2] =  true; // last_name
requiredElements[3] =  true; // email
requiredElements[4] =  true; // email_confirm
requiredElements[5] =  true; // comments
requiredElements[6] =  false; // submit
//-- replace to above this line --//

//color in which the required Labels should light up on alert
//set to named colour or hex code #rrggbb
//surround by double quotes e.g.: "FFFF00" or "#FF0" or "yellow"

// alert label color
var alertColour = "red";

// regular label color
var normalColour = "black";

// define id of alert message to appear when input is missing
var alertName = "alertmsg";

// define the name of the Form you want to check
var formName = "Signup_Form";

// limitation of characters in comments field
var maxComments = 255;


/////////////// -- End of Editable Region -- ///////////////


//define other global variables
var rlength = requiredElements.length;
var items;
var alertmsg;

if(!defaultValues){var defaultValues = new Array();}

//init funtion will be called on page load
window.onload = init;

function init() {
   alertmsg = (document.getElementById(alertName))?document.getElementById(alertName):'';
   //hide the alert message
   alertmsg.style.visibility = "hidden";
   alertmsg.style.color = alertColour;
   
   var thisform = document.forms[formName];

   items = thisform.elements;
	if (maxComments > 0) {
		limitComments(thisform);
	};

    //grab default values from input fields
    if (defaultValues.length<1) {
        thisform.reset();
        for (i=0; i<items.length; i++) {
            defaultValues[i] = ''; //items[i].value;
        }
    }
    for (i=0; i<rlength; i++) {
        if (items[i].name && document.getElementById(items[i].name))
            document.getElementById(items[i].name).style.color = normalColour;
    }

}

//function called from the Signup Form onsubmit="testForm(this)"
function testForm(thisform) {
    var wasmissing;
    //check for Required Elements
    if(wasmissing = checkRequired()){
        //check for valid E-Mail
        wasmissing = (checkMail(thisform))? wasmissing : false;
    }

   //return false if any of the checks failed
   return wasmissing
}


// Function to compare required elements against
// their default value or empty input field.
// Returns false if element hasn't been changed.
function checkRequired () {
    var missing = true;
    for(i=0; i<rlength; i++) {
        if (requiredElements[i]) {
			if (items[i].type == "radio") {
				var tmpmissing = false;
				var j = i;
				while (items[j].name == items[i].name) {
					if (items[j].checked) tmpmissing = true;
					j++
				};
				if (!tmpmissing)
					document.getElementById(items[i].name).style.color = alertColour;
				else
					document.getElementById(items[i].name).style.color = normalColour;
				wasmissing = tmpmissing;
				i = j;
				continue;
			}
            else if (items[i].value == "" && document.getElementById(items[i].name)){
                document.getElementById(items[i].name).style.color = alertColour;
                missing = false;
            } else if (items[i].name.indexOf("[") > -1) {
                var j = 0;
                var tempcheck = false;
                var tempname = items[i].name;
                do {
                    if(items[tempname].checked){
                        tempcheck = true;
                    }
                    tempname = tempname.slice(0,tempname.lastIndexOf("["));
                
                }while(items[++i].name == (tempname += "["+ ++j +"]"))
                --i; //reduce i by 1 to compensate for the added while loop - not elegant but works
                tempname = tempname.slice(0,tempname.lastIndexOf("["));
                if(!tempcheck){
                    document.getElementById(tempname).style.color = alertColour;
                    missing = false;
                } else {
                    document.getElementById(tempname).style.color = normalColour;
                }
            }
            else {
                if (document.getElementById(items[i].name))
                    document.getElementById(items[i].name).style.color = normalColour;
            }
        } else if (items[i].value != "") {
			var val = items[i].value;
			if (val.indexOf("href") > -1 || val.indexOf("<a href") > -1 || val.indexOf("http://") > -1) {
				document.getElementById(items[i].name).style.color = alertColour;
				missing = false;
				alert("Sorry, no html allowed in formfields.");
			}
		}
    }
   if (!missing)
      alertmsg.style.visibility = "visible";
   return missing;
}


// function to check for valid e-mail address
function checkMail (thisform) {
   var email = thisform.elements['email'].value;
   var emailConf = thisform.elements['email_confirm'].value;

   if (email.indexOf("@") < 2) {
      alert("Please enter a valid email address!")
      return false
   }
   if (email != emailConf) {
      alert("Email addresses don't match!")
      return false
   }
   return true
}


// function called from checkbox or radio button to show hidden text input fields
// usage: onClick="showElement(this, ['element'{,element}])" more elements possible comma separated
function showElement(trigger, target) {
      for (i=0; i<target.length; i++) {
         document.getElementById(target[i]).style.visibility = "visible";
      }
}


// function called from checkbox or radio button to hide hidden text input fields
function hideElement(trigger, target) {
   for (i=0; i<target.length; i++) {
         document.getElementById(target[i]).style.visibility = "hidden";
      }
}

function isOther(obj, targets) {
	for (var i=0; i < targets.length; i++) {
		obj.form[targets[i]].value = obj.value;
	};
	if (obj.options[obj.selectedIndex].value == 'Specify Other') {
			showElement(obj, targets);
	} else {
		hideElement(obj, targets);
	}
}

// function to limit characters in textarea(s)
function sliceComments(evt){
	var e = (!evt) ? window.event : evt;
	var elm = null;
	
	if (e.target) {
		elm = e.target;
	}
	else {
		elm = e.srcElement;
	}
	
    if(elm.value.length > maxComments){
        elm.value = elm.value.substring(0, maxComments);
    }
}

function limitComments(form) {
	var $byt = function(e, t) {
		return e.getElementsByTagName(t);
	}
	var comments = $byt(form, 'textarea');
	for (var i = comments.length - 1; i >= 0; i--){
		addEvent('keyup', sliceComments, comments[i]);
		addEvent('keydown', sliceComments, comments[i]);
		addEvent('blur', sliceComments, comments[i]);
	}
}

// general purpose functions
var addEvent = function(a) {
	/**
	 * @params: event, callback function
	 * @params: event, callback function, element
	 * @params: event, callback function, execute while Active
	 * @params: event, callback function, element, execute while Active
	 * @returns: void
	 * function can be called with different arguments.
	 * function automatically checks for browser and attaches
	 * the event appropriately
	 * events need to be passed by name without the "on" part
	 * example "onMouseOver" is passed as "mouseover"
	 */
	var evt; // the event
	var cb; // callback function
	var el; // element to receive the listener
	var wa; // execute while active?
	switch(arguments.length) {
		case 2:
			evt = arguments[0];
			cb = arguments[1];
			el = document;
			wa = true;
			break;
		case 3:
			evt = arguments[0];
			cb = arguments[1];
			if (typeof arguments[2] == "boolean") {
				el = document;
				wa = arguments[2];
			}
			else {
				el = arguments[2];
				wa = true;
			}
			break;
		case 4:
			evt = arguments[0];
			cb = arguments[1];
			el = arguments[2];
			wa = arguments[3];
			break;
		default:
			alert("addEvent\n\nNot enough arguments provided!")
	}
	
	var client = checkBrowser();
	if (client) {
		el.addEventListener(evt, cb, wa);
	}
	else if (!client) {
		el.attachEvent("on"+evt, cb);
	};
}

var removeEvent = function(evt, cb, el, uc) {
	var client = checkBrowser();
	if (client) {
		el.removeEventListener(evt, cb, uc);
	}
	else if (!client) {
		el.detachEvent("on"+evt, cb);
	};
}

var checkBrowser = function() {
	// check if browser is mozilla compliant
	if (document.getElementById && !document.all) {
		return true;
	} else if (document.all) {
		return false;
	}
	return false;
}
//eof
