/* PAGE INITIALIZATION FUNCTIONS */
var addEvent = function(obj, type, fn) { //http://www.ilfilosofo.com/blog/2008/04/14/addevent-preserving-this/
  if (obj.addEventListener) {
    obj.addEventListener(type, fn, false);
  } else if (obj.attachEvent) {
    obj.attachEvent('on' + type, function() { return fn.apply(obj, new Array(window.event));});
  }
}
addEvent(window, 'load', preProcessPage);

function preProcessPage() {
	if (!document.getElementsByTagName || (!document.getElementById || (!document.createElement || !document.createTextNode))) return false;
	processPage();
}

function processPage() {
  processDivs();
  processFormElements();
}

/* INDIVIDUAL ELEMENT INITIALIZATIONS */
function processDivs() {
  var allDivs = document.getElementsByTagName("div");
  var fixDiv = function(theElement) {
    if (hasClassHook(theElement)) {
      removeClass(theElement,"js_scriptShow");
      if (/js_neverShow/.test(theElement.className)) {
        theElement.style.display = "none";
        removeClass(theElement,"js_neverShow");
      }
      if (/js_scriptHide/.test(theElement.className)) {
        addClass(theElement,"no_show");
        removeClass(theElement,"js_scriptHide");
      }
    }
  }
  forEach(allDivs,fixDiv);
}

function processFormElements() {
  var allSelects = document.getElementsByTagName("select");
  var fixSelect = function(theElement) {
    if (hasClassHook(theElement)) {
      if (/js_setNum/.test(theElement.className)) {
        theElement.onchange = function() {
          checkMax(this,false);
        }
      }
    }
  }
  forEach(allSelects,fixSelect);
  if (document.getElementById("form_submit")) {
    var theElement = document.getElementById("form_submit");
    theElement.onclick = function() {
      var isValid = checkForm(this);
      var isMax = checkMax(this,true);
      return (isValid && isMax);
    }
  }
}

function checkForm(theElement) {
  var checkPassed = true;
  var parentForm = document.getElementById("flavor_selection");
  var allInputs = parentForm.getElementsByTagName('input');
  var checkInput = function(theElement) {
    if (hasClassHook(theElement)) {
      if (/js_formRequired/.test(theElement.className)) {
        if (theElement.checked) {
          if (theElement.checked == 'false') {
            checkPassed = false;
          }
        } else {
          checkPassed = false;
        }
      }
    }
  }
  forEach(allInputs,checkInput);
  if (!checkPassed) {
    alert('You must be 21 years of age or older to purchase Silver Moon.');
  }
  return checkPassed;
}

function checkMax(theElement,doReturn) {
  var checkPassed = true;
  if (theElement.className && (/js_setNum/.test(theElement.className))) {
    var parentForm = document.getElementById("flavor_selection");
    var currentValue = 0;
    var submissionTextArray = new Array();
    var currentMax = parseInt(getExtensionFromClass(theElement,"js_setNum_"));
    var allSelects = parentForm.getElementsByTagName("select");
    var processSelect = function(theSubElement) {
      if (theSubElement.className && (/js_setNum/.test(theSubElement.className))) {
        var subValue = parseInt(theSubElement.value);
        currentValue += subValue;
        if (subValue > 0) {
          submissionTextArray.push(theSubElement.name + " ("+theSubElement.value+")");
        }
      }
    }
    forEach(allSelects,processSelect);
    if (currentValue != currentMax) {
      var doAlert = false;
      checkPassed = false;
      if (currentValue > currentMax) {
        if (doReturn == false) {
          theElement.value = '0';
        }
        doAlert = true;
      } else {
        if (doReturn == true) {
          doAlert = true;
        }
      }
      if (doAlert == true) {
        alert("Please select a total of five pints");
      }
    } else {
      if (document.getElementById("order_submission_container")) {
        var formReceptor = document.getElementById("order_submission_container");
        if (currentValue == currentMax) {
          if (document.getElementById("os0")) {
            var submissionReceptor = document.getElementById("os0");
            submissionReceptor.value = submissionTextArray.join(", ");
          }
        }
      }
    }
  }
  if (doReturn == true) {
    return checkPassed;
  }
} 

/* UTILITY FUNCTIONS */
function forEach(array, action) {
  for (var i=0; i < array.length; i++) {
    action(array[i]);
  }
}

function removeChildNodes(theElement) {
  while (theElement.hasChildNodes()) {
    theElement.removeChild(theElement.firstChild);
  }
}

function getParentElement(theElement, targetNodeName) {
  var bodyNode = document.getElementsByTagName("body")[0];
  var currentParent = theElement;
  var targetNodeName = targetNodeName.toLowerCase();
  while ((currentParent.nodeName.toLowerCase() != targetNodeName) && (currentParent != bodyNode)) {
    currentParent = currentParent.parentNode;
  }
  return currentParent;
}

function stripWhitespace(theString) {
	return theString.replace(/^\s*|\s*$/g,'');
}

function addClass(theElement,theClass) {
	if (!theElement.className) {
		theElement.className = theClass;
	} else if (theElement.className.indexOf(theClass) == -1) {
		theElement.className += (" " + theClass);
	}
}

function removeClass(theElement,theClass) {
  if (theElement.className && theElement.className.indexOf(theClass) != -1) {
    theElement.className = stripWhitespace(theElement.className.replace(theClass,""))
  }
}

function hasClassHook(theElement) {
  return (theElement.className && /js_/.test(theElement.className));
}

function getExtensionFromClass(theElement,theKey) {
	var theExtension = false;
	if (theElement.className) {
    var findExtension = function(thisClass) {
      if (thisClass.indexOf(theKey) == 0) {
        var tempName = thisClass.substring(theKey.length);
        if (tempName.length > 0) {
          theExtension = tempName;
        }
      }
    }
    forEach(theElement.className.split(' '),findExtension);
  }
	return theExtension;
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
    do {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    } while (obj = obj.offsetParent);
  }
  return [curleft,curtop];
}