var QRHandler = function (pricingCallback, actionLoad, actionNew) {
	return function () {						
		var selectJQ, editJQ, inputNameJQ;
		var triggerer; // the main function that triggered the call
		var handleQR = function (selectJQ, editJQ, inputNameJQ) {
			var lastSelected = selectJQ.val();
			editJQ.bind("click", function (e) {
				triggerer = selectJQ;
				launchQRDesign(qrObj);
				selectJQ.val(lastSelected);
				selectJQ.trigger("change");
			});
			var qrObj = {};
			if (inputNameJQ.length > 0) { // this input may be optional
				qrObj['name'] = inputNameJQ.val();
				inputNameJQ.bind("blur", function (e) {
					qrObj['name'] = this.value;
				});
			}
			qrObj['internalId'] = selectJQ.val();
			var hideCtrl = function () {
				if (selectJQ.val() === "no") {
					editJQ.hide();		
				} else {
					editJQ.show();
				}
			};
			var manageInternal = function () {
				var curSelected = selectJQ.val();
				if (curSelected === "new") {
					delete qrObj['internalId'];
					editJQ.click();										
				} else {
					if (curSelected === "no") {
						delete qrObj['internalId'];
					} else {
						qrObj['internalId'] = curSelected;
					}
					lastSelected = curSelected;
				}
			};
			selectJQ.bind("changeForReal", function (e) {
				lastSelected = this.value;
				selectJQ.trigger("change");
			});
			selectJQ.bind("change", function (e) {
				hideCtrl();
				manageInternal();
				pricingCallback();
			});
			hideCtrl();
		};
		var closeQRWinDels = []; // delegates to call when edit finishes
		var delF = function (savedName) {
			var lastSaved = this.val();
			var newContent = this.html() + "<option value='"+savedName+"'>"+savedName+"</option>";
			this.html(newContent);
			this.val(lastSaved);
		};
		window.onCloseQRWin = function (savedName) {
			for (var i = 0; i < closeQRWinDels.length; i++) {
				delF.call(closeQRWinDels[i], savedName);
			}
			if (triggerer) {
				triggerer.val(savedName);
				triggerer.trigger("changeForReal");									
			}
		};
		for (var j = 0; j < 8; j++) {
			selectJQ = $(":input[name=cardQR["+j+"]]");
			if (selectJQ.length > 0) {
				editJQ = $("a#editQR"+(j+1));
				inputNameJQ = $(":input[name=cardName"+(j+1)+"]");
				handleQR(selectJQ, editJQ, inputNameJQ);
				closeQRWinDels.push(selectJQ);
			}
		}	
		function launchQRDesign(defaultVals) {
			var defaultQuery = "?action=";
			if (typeof defaultVals['internalId'] !== "undefined") {
				defaultQuery += actionLoad;
			} else {
				defaultQuery += actionNew;					
			}
			for (var i in defaultVals) {
				if (defaultVals.hasOwnProperty(i)) {								
					defaultQuery += ("&" + i + "=" + defaultVals[i]);
				}
			}
			openQRWin(defaultQuery);
		}
		function openQRWin(defaultQuery) {
			uploadWin=window.open("/grp/qrcode.do"+defaultQuery, "qr_win", "width=660,height=450,toolbar=0,location=0,status=1,scrollbars=1,resizable=1");
		}
	};
};