var check = false;

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(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[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_checkbox = function(element) {
    return element.checked;
}

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 parentElement = element;
    //while(label == undefined || label.length == 0 && parentElement != checkedForm) {
    //    parentElement = parentElement.parentNode;
    //    var searchedLabel = element.name + "Label";
    //    var label = document.getElementsByName(searchedLabel)[0];
    //}
    var searchedLabel = element.id + "Label";
    var label = document.getElementById(searchedLabel);
    var classes = element.className.split(" ");
    var i = 0;
    var field_ok;
    classes.forEach(function(myieclass) {
        if(requirefuncs[myieclass] != undefined) {
            field_ok = requirefuncs[myieclass](element);
            if(field_ok) {
                element.className = element.className.replace(/checkerror/g, "");
                var inputSiblingsWithMissing = getElementsByClass(parentElement, "checkerror", "input");
                var selectSiblingsWithMissing = getElementsByClass(parentElement, "checkerror", "select");
                if(inputSiblingsWithMissing.length == 0 && selectSiblingsWithMissing.length == 0 ) {
                    label.className = label.className.replace(/checkerror/g, "");
                }
            } else {
                element.className = element.className + " checkerror";
                label.className = label.className + " checkerror";
            }
        }
    });
    return field_ok;
}

function checkFormSubmit(checkedForm) {
    check = true;
    var inputElements = getElementsByClass(checkedForm, "require_[a-z]*","input");
    var formOK = true;
    inputElements.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;
        }
    });
    if (!formOK) {
        var warningDiv  = document.getElementById("errorMessage");
        //warningDiv.innerHTML = document.mailForm.errorMessage.value;
        warningDiv.className = "errorVisible";
    } else {
        var warningDiv  = document.getElementById("errorMessage");
        //warningDiv.innerHTML = "";
        warningDiv.className = "errorInvisible";
    }
    return formOK;
}

function checkOrders() {
    var orderboxes = document.getElementsByName("orders[]");
    var one_order_checked = false;
    i = 0;
    for(i;i<orderboxes.length;i++) {
        if(orderboxes[i].checked == true) {
            one_order_checked = true;
        }
    }
    if (!one_order_checked) {
        var warningDiv  = document.getElementById("errorMessageOrders");
        //warningDiv.innerHTML = document.mailForm.errorMessageOrders.value;
        warningDiv.className = "errorVisible";
        return false;
    } else {
        var warningDiv  = document.getElementById("errorMessageOrders");
        //warningDiv.innerHTML = "";
        warningDiv.className = "errorInvisible";
        return true;
    }
}
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 'checkbox':
            field_ok = field.checked == true;
            break;
        case 'email':
            field_ok = isEmailAddr(field.value);
            break;
        case 'zip':
            field_ok = field.value.length == 4 ||  field.value.length == 5;
            plz = parseInt(field.value);
            field_ok = field_ok && !isNaN(plz);
            break;
		}
        if (field_ok) {
            if (requiredFieldsTypes[i] == 'checkbox') { 
            	field.className = "checkbox"
            	label.className = "checklabel"
        	}
        	else {
            	field.className = "checkfield"
            	label.className = "checklabel"
        	}
        } else {
            if (requiredFieldsTypes[i] == 'checkbox') { 
				field.className = "checkbox checkerror"
				label.className = "checklabel checkerror"
			}
			else {
				field.className = "checkfield checkerror"
				label.className = "checklabel checkerror"
			}
			missingFields++
        }
	}
	
    var warningDiv  = document.getElementById("errorMessage");
    
    var orderboxes = document.getElementsByName("orders[]");
    if (orderboxes.length) {
        var one_order_checked = false;
        i = 0;
        for(i;i<orderboxes.length;i++) {
            if(orderboxes[i].checked == true) {
                one_order_checked = true;
            }
        }
        if (one_order_checked == false) {
            if (document.mailForm.errorMessageOrders)
               warningDiv.innerHTML = document.mailForm.errorMessageOrders.value;
            return false;
        }
    }
    
    if ( missingFields > 0 ) {
        warningDiv.innerHTML = document.mailForm.errorMessage.value;
        return false;
    }
    else {
        warningDiv.innerHTML = '';
        if ( doSubmit ) {
            return true;
        }
    }
}

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

function email(n, d,tld) {
	//var link = "<a href='mailto:" + name + "@" + domain + "." + tld + "'>" + name + "@" + domain + "." + tld + "</a>";
	var link = "<a href='mailto:" + n + "@" + d + "." + 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";
	  }
	}
  } 
}


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);
    }
  };
}

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

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}

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

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

    return res;
  };
}

// homebrew (http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf)
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(thing) {
    for (var i = 0; i < this.length; i++) {
      if (thing === this[i]) return i;
    }
    return -1;
  };
}