$(document).ready(function () {
	var digitalOptionController = (function () {
		var masterList = [], truncList = [];
		var isMaster = true;
		var sizeRx = /\s*(\d+(?:\.\d+)?)\s*[Xx]\s*(\d+(?:\.\d+)?)\s*/;
		var wordageRx = /\s*(\d+)\s-\s\w*\s*/;
		var maxDigitalWidth = 12;
		var maxDigitalHeight = 18.5;
		var listSwitcher = function (isDigital) {
			if (!isDigital) {
				if (isMaster) {
					quantitier.empty();
					for (var i = 0; i < truncList.length; i++) {
						quantitier.append(truncList[i]);
					}
					isMaster = false;
				}
			} else {
				if (!isMaster) {
					quantitier.empty();
					for (var i = 0; i < masterList.length; i++) {
						quantitier.append(masterList[i]);
					}
					isMaster = true;
				}				
			}
		};
		// controls the option that are enabled / disabled for digital printing
		var kraftPaper = "20pt_kraftboard";
		var offsetPapers = [kraftPaper];
		var paperer = $(":input[name=paper]");
		var proofer = $(":input[name=proof]");
		var sizer = $(":input[name=size]");
		var quantitier = $(":input[name=quantity]");
		quantitier.children().each(function (i) {
			var wordage = $(this).clone();
			var wordageTrunc = wordageRx.exec(wordage.html());
			if (wordageTrunc) {
				truncList.push(wordage.html(wordageTrunc[1]));
			}
			masterList.push(this);
		});		
		
		var offsetNoteOn = $("div#offsetNoteON");
		var offsetNoteOff = $("div#offsetNoteOFF");
		
		var digitalChecks = [];
		var runDigitalChecks = function () {
			var canShowDigital = true;
			for (var i = 0; i < digitalChecks.length; i++) {
				canShowDigital = canShowDigital && !digitalChecks[i]();
			}
			var oldVal = quantitier.val();
			listSwitcher(canShowDigital);
			quantitier.val(oldVal);
			if (offsetNoteOn && offsetNoteOff) {
				if (!canShowDigital) {
					offsetNoteOff.hide();
					offsetNoteOn.show();
				} else {
					offsetNoteOff.show();
					offsetNoteOn.hide();				
				}
			}
		};
		if (masterList.length > 0 && masterList.length === truncList.length) {
			if (sizer && (typeof sizer.val() != "undefined")) {
				var checkOffsetSize = function (sizeStr) {
					var m = sizeRx.exec(sizeStr);
					if (m) {
						var width = Math.min(m[1], m[2]);
						var height = Math.max(m[1], m[2]);
						return (width > maxDigitalWidth || height > maxDigitalHeight);
					}
					return false;
				};
				digitalChecks.push(function () {
					return checkOffsetSize(sizer.val());
				});
				sizer.change(runDigitalChecks);
			}
			if (paperer) {
				var checkOffsetPaper = function (paperVal) {
					var offsetPaper = false;
					for (var i = 0; i < offsetPapers.length; i++) {
						if (paperVal === offsetPapers[i]) {
							offsetPaper = true;
						}
					}
					return offsetPaper;
				};
				var hasOffsetPaper = false;
				paperer.children().each(function () {
					if (checkOffsetPaper(this.value)) {
						hasOffsetPaper = true;
					}
				});
				if (hasOffsetPaper) {
					digitalChecks.push(function () {
						return checkOffsetPaper(paperer.val());
					});
					paperer.change(runDigitalChecks);
				}
			}
		}
		// add extra check to ensure no hard proof can be chosen when the paper choice is now allowed
		if (paperer && proofer) {
			var hardProof = proofer.find("option[value='HardProof']");
			paperer.bind("change", function() {
				if (hardProof) {
					if (paperer.val() === kraftPaper) {
						hardProof.detach();
					} else {
						proofer.append(hardProof);
					}
				}
			}).trigger("change");
		}
		runDigitalChecks();
	})();
});

// changes color display of front/back to outside/inside based on folding
var ColorDisplayChangeBaseOnFold = function(formToExamine) {
	var formJQ = $(formToExamine);
	var foldJQ = formJQ.find(":input[name='fold']");
	var colorJQ = formJQ.find(":input[name='colors']");
	var colorJQOptions = colorJQ.find("option");
	if (foldJQ.length > 0 && colorJQOptions.length > 0) {
		var foldsThatChangesDisplay = ["HalfFold", "TriFold", "RollFold", "GateFold", "DoubleGateFold"];
		var replaceAOld, replaceANew, replaceBOld, replaceBNew;
		var replacementFunctor = function(colorKey, colorVal) {
			var oldText = colorVal.text;
			var newText = oldText.replace(replaceAOld, replaceANew).replace(replaceBOld, replaceBNew);
			if (oldText !== newText) {
				colorVal.text = newText;
			}
		};
		foldJQ.bind('change', function() {
			var foldHasInsideOutside = ~$.inArray(this.value, foldsThatChangesDisplay);
			if (foldHasInsideOutside) {
				replaceAOld = "Front";
				replaceANew = "Outside";
				replaceBOld = "Back";
				replaceBNew = "Inside";
			} else {
				replaceAOld = "Outside";
				replaceANew = "Front";
				replaceBOld = "Inside";
				replaceBNew = "Back";	
			}
			colorJQOptions.each(replacementFunctor);	
		});
		foldJQ.trigger('change');
	}
};
