requirefuncs = new Object();

requirefuncs.require_text = function(element) {
    return element.value.length > 0;
}

requirefuncs.require_numeric = function(element) {
    val = parseInt(element.value);
    return element.value.length > 0 && !isNaN(val);
}
requirefuncs.require_email = function(element) {
    return element.value.match(/^[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~.]+@([-a-zA-Z0-9]+\.)+[a-zA-Z]{2,7}$/);
}

requirefuncs.require_zip = function(element) {
    field_ok = element.value.length == 4 ||  element.value.length == 5;
    zip = parseInt(element.value);
    field_ok = field_ok && !isNaN(zip);
    return field_ok;
}

requirefuncs.require_radio = function(element) {
    var elements = document.getElementsByName(element.name) ;
    var field_ok = false ; 
    collectionToArray(elements).forEach(function(elem) {
        if(elem.checked) field_ok = true ; 
    });
    return field_ok ; 
}

requirefuncs.require_pulldown = function(element) {
    return element.value != '0' ; 
}

requirefuncs.require_checkbox = function(element) {
    var elements = document.getElementsByName(element.name) ;
    var field_ok = false ; 
    collectionToArray(elements).forEach(function(elem) {
        if(elem.checked) field_ok = true ; 
    });
    return field_ok ; 
}

requirefuncs.require_password = function(element) {
    element_confirm = document.getElementById(element.id+'_confirm');
    return element_confirm && element_confirm.value == element.value;
}

function checkFormHandler(event) {
    var element;
    if(event != undefined) {
        element = event.target;
    } else {
        element = window.event.srcElement;
    }
    checkFormElement(element);
}

function checkFormElement(element, checkedForm) {
    if(!check) {
        return true;
    }
    var label;
    var searchedLabel = element.id + "Label";
    var label = document.getElementById(searchedLabel);
    var classes = element.className.split(" ");
    var i = 0;
    var field_ok;
    classes.forEach(function(myclass) {
        if(requirefuncs[myclass] != undefined) {
            var fieldclasses = element.className.replace(/checkerror/g, "");
            var labelclasses = label && label.className.replace(/checkerror/g, "");
            field_ok = requirefuncs[myclass](element);
            if(field_ok) {
                element.className = fieldclasses;
                if (label) label.className = labelclasses;
                
            } else {
                element.className = fieldclasses + " checkerror";
                if (label) label.className = labelclasses + " checkerror";
            }
            showErrorMessage(document.getElementById(element.id+'Error'), !field_ok);
        }
    });
    return field_ok;
}

function checkFormSubmit(checkedForm) {
    check = true;
    var formOK = true;
    checkedForm.onkeyup = checkFormHandler;
    checkedForm.onclick = checkFormHandler;
    checkedForm.onchange = checkFormHandler ;
    
    var inputElements = getElementsByClass(checkedForm, "require_[a-z]*","input");
    inputElements.forEach(function(elem) {
        if(!checkFormElement(elem, checkedForm)) {
            formOK = false;
        }
    });
    var textareaElements = getElementsByClass(checkedForm, "require_[a-z]*","textarea");
    textareaElements.forEach(function(elem) {
        if(!checkFormElement(elem, checkedForm)) {
            formOK = false;
        }
    });
    var selectElements = getElementsByClass(checkedForm, "require_[a-z]*","select");
    selectElements.forEach(function(elem) {
        if(!checkFormElement(elem, checkedForm)) {
            formOK = false;
        }
    });
    showErrorMessage(document.getElementById("errorMessage"), !formOK);
    return formOK;
}

function showErrorMessage(message, error) {
    if (message) {
        if (error) message.className = "errorVisible";
        else       message.className = "errorInvisible";
    }
}

function getElementsByClass(node,searchClass,tag) {
    var classElements = new Array();
    var elements = node.getElementsByTagName(tag);
    var pattern = new RegExp("(^| )"+searchClass+"( |$)");
    collectionToArray(elements).forEach(function(element) {
        if (pattern.test(element.className)) {
            classElements.push(element);
        }
    });
    return classElements;
}

// Convert HTMLCollection list to a common array
function collectionToArray(col) {
    a = new Array();
    for (i=0; i<col.length; i++) a[i] = col[i];
    return a;
}


/* Compatibility functions for necessary array operations below */

// http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:forEach
if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}





























var missingFields = 0;

// check a forms validity
function checkForm(doSubmit) {
	if ( !doSubmit && missingFields == 0 ) return;
	var i = 0;
	
    missingFields = 0;
	var requiredFields = document.mailForm.requiredFields.value.split(",");
	var requiredFieldsTypes = document.mailForm.requiredFieldsTypes.value.split(",");
	
	for ( i ; i < requiredFields.length; i++ )
	{
        var field = document.getElementById( requiredFields[i] );
        var label = document.getElementById( requiredFields[i] + "Label");
        var field_ok = true;
					
		switch (requiredFieldsTypes[i]) {
        case 'text':
            field_ok = field.value.length > 0;
            break;
        case 'email':
            field_ok = isEmailAddr(field.value);
            break;
		}
        if (field_ok) {
            field.className = "checkfield"
            label.className = "checklabel"
        } else {
            field.className = "checkfield checkerror"
            label.className = "checklabel checkerror"
            missingFields++
        }
	}
	
	if ( missingFields > 0 ) {
		var warningDiv	= document.getElementById("errorMessage");
		warningDiv.innerHTML = document.mailForm.errorMessage.value;
		return false;
	}
	else {
		var warningDiv	= document.getElementById("errorMessage");
		warningDiv.innerHTML = '';
		if ( doSubmit ) {
			return true;
		}
	}
		
}

function isEmailAddr(str) 
{
	return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
}

function email(name, domain,tld) {
	var link = "<a href='mailto:" + name + "@" + domain + "." + tld + "'>&gt; E-Mail</a>";
	document.write(link);
}

function clearField(field) {
	if ( field.value == field.defaultValue )
		field.value = "";
}

function MM_CheckFlashVersion(reqVerStr,msg){
  with(navigator){
	var isIE  = (appVersion.indexOf("MSIE") != -1 && userAgent.indexOf("Opera") == -1);
	var isWin = (appVersion.toLowerCase().indexOf("win") != -1);
	if (!isIE || !isWin){  
	  var flashVer = -1;
	  if (plugins && plugins.length > 0){
		var desc = plugins["Shockwave Flash"] ? plugins["Shockwave Flash"].description : "";
		desc = plugins["Shockwave Flash 2.0"] ? plugins["Shockwave Flash 2.0"].description : desc;
		if (desc == "") flashVer = -1;
		else{
		  var descArr = desc.split(" ");
		  var tempArrMajor = descArr[2].split(".");
		  var verMajor = tempArrMajor[0];
		  var tempArrMinor = (descArr[3] != "") ? descArr[3].split("r") : descArr[4].split("r");
		  var verMinor = (tempArrMinor[1] > 0) ? tempArrMinor[1] : 0;
		  flashVer =  parseFloat(verMajor + "." + verMinor);
		}
	  }
	  // WebTV has Flash Player 4 or lower -- too low for video
	  else if (userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 4.0;

	  var verArr = reqVerStr.split(",");
	  var reqVer = parseFloat(verArr[0] + "." + verArr[2]);
  
	  if (flashVer < reqVer){
		if (confirm(msg))
		  window.location = "http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash";
	  }
	}
  } 
}


