// JavaScript Document
/* ----------------------------------------------------------------------------
 * Copyright (c) 2010 Moblico Solutions, LLC. All Rights Reserved
 *
 * This software is the property of Moblico Solutions, LLC and contains HIGHLY 
 * CONFIDENTIAL and PROPRIETARY INFORMATION. Use, disclosure, reproduction, 
 * modification, distribution or other use of this software and information is 
 * permitted only in strict compliance with an express written agreement with 
 * Moblico Solutions, LLC.
 * ----------------------------------------------------------------------------
 */
// JavaScript Document
var Moblico = {};

Moblico.rootPath = "/";

Moblico.allowedSmsLength = 120;
Moblico.smsLengthUrl = "";

Moblico.offerCodeLength = 8;

Moblico.smsvars = [];
Moblico.smsvarsLength = [];
Moblico.smsvarsSample = [];

Moblico.currentTextfield = "";

Moblico.autoColumnSort = true;

Moblico.init = function() {
	
	Moblico.servletPath = moblicoServletPath;
	Moblico.servletUri = moblicoServletUri;
	Moblico.rootPath = moblicoServletPath + "/";
	
	if(typeof settingsBizMessageKeyword == "undefined") {
		settingsBizMessageKeyword = "KEYWORD";
	}
	
	if(typeof settingsBizAdDelimiter == "undefined") {
		settingsBizAdDelimiter = "-BYTB:";
	}
	
	var dateObj = new Date();
	var date = GabeUtil.padding((dateObj.getMonth() + 1), 2) + "/" + GabeUtil.padding(dateObj.getDate(), 2) + "/" + dateObj.getFullYear();	
	
	Moblico.smsvars = [	"%CI-DATE%", 
						"%CO-DATE%", 
						"%CUR-DATE%",
						"%REG-DATE%",
						"%URL%",
						"%FIRST-NAME%",
						"%LAST-NAME%",
						"%PHONE%",
						"%CONF-NUM%",
						"%OFFER-CODE%",
						"%KEYWORD%",
						"%COUPON-NAME%",
						"%COUPON-CODE%",
						"%PROMO-TEXT%",
						"%NICKNAME%",
						"%GIFTEE-NAME%",
						"%GIFT-CODE%",
						"%GIFT-NAME%",
						"%PER-MSG%"
						];
	
	Moblico.smsvarsLength = [ 	10,
								10,
								10,
								10,
								Moblico.smsLengthUrl,
								20,
								20,
								15,
								8,
								Moblico.offerCodeLength,
								9,
								20,
								Moblico.offerCodeLength,
								40,
								10,
								10,
								Moblico.offerCodeLength,
								20,
								20
								];
	
	Moblico.smsvarsSample = [ 	date,
								date,
								date,
								date,
								Moblico.smsLengthUrl,
								"FirstName",
								"LastName",
								"913-123-1234",
								"123ABCXZ",
								"12345",
								settingsBizMessageKeyword.toUpperCase(),
								"PromoName",
								"Code",
								"PromoTextWillGoHere",
								"Nickname",
								"GifteeName",
								"Code",
								"GiftName",
								"YourPersonalMessage"
								];
	
	$(document).ready(function(event) {
		
		$(".nextstepbtn").click(function(event) {
			Moblico.collapseToggleArrow($(this).closest(".formtogglearrowwrapper"));
			var nextWrapper = $(this).closest(".formtogglearrowwrapper").next(".formtogglearrowwrapper");
			if($(this).metadata().next) {
				nextWrapper = $($(this).metadata().next);
			}
			if($(nextWrapper).hasClass("displaynone")) {
				// hidden, so move on to the next
				nextWrapper = $(nextWrapper).next(".formtogglearrowwrapper");
			}
			Moblico.expandToggleArrow(nextWrapper);
		});
		
		$(".togglearrow").click(function(event) {
			$(this).toggleClass("expanded");
			event.preventDefault();
			$(this).next().toggle();								 
		});		
		
		jQuery.each($(".howtovideobtn"), function(i, val) {
			Moblico.regHowtoVideoBtn(val);
		});
		
		
		
		// sorting functions here
		
		$(".tablehead a.sortorderlink").click(function(event) {
			event.preventDefault();
			GabeUtil.toggleOrderByColumn(this);
		});
		
		// not in print mode, so do this...
		if(viewPrintMode || Moblico.autoColumnSort == false) {
			// don't auto sort
		} else {	
			var firstsorttable = $(".tablehead a.sortorderlink:first").closest("table");
			if(!$(firstsorttable).hasClass("dontautosort")) {
				GabeUtil.toggleOrderByColumn($(".tablehead a.sortorderlink:first"));
			}
		}
		
		if(document.getElementById('submenubar2')) {
			var submenubar2wrapper = $("#submenubar2").metadata().group;
			if(submenubar2wrapper) {
				$(submenubar2wrapper + ":gt(0)").hide();
			}
			$("#submenubar2 a").click(function(event) {
				event.preventDefault();
				Moblico.loadSubmenubar2Tab(this);
			});
		}

		// end sorting functions here
		
		$(".checkallbox").click(function(event) {
			var children = $(this).metadata().children;
			if($(this).is(":checked")) {
				$("input" + children).attr("checked", true);
			} else {
				$("input" + children).attr("checked", false);
			}
		});
		
		
		$(".reporttable:first").show();
		
		if(document.getElementById('cancelformbtn')) {
			$("#cancelformbtn").click(function(event) {
				event.preventDefault();
				var elem = this;
				if($(this).metadata().callback) {
					// if there is callback, call it
					eval($(this).metadata().callback);
				}
				var cancelurl = $(this).metadata().cancelurl;
				if(cancelurl) {
					window.location.href = cancelurl;
				} else {
					history.back();
				}
			});
		}
		
		if(document.getElementById('saveformbtn')) {
			$("#saveformbtn").click(function(event) {
				event.preventDefault();
				var formid = $(this).metadata().formid;
				if(!formid) {
					formid = "mainform";
				}
				$("#" + formid).submit();
			});
		}
		
		$(".datepickerfldicon").datepicker({
			dateFormat : 'mm/dd/yy',
			showOn : 'button',
			buttonImage : Moblico.rootPath + "image/icon/calendar.gif",
			onSelect : function(dateText, inst) {
				$(this).focus();
			},
			buttonImageOnly : true /*,
			constrainInput : false*/
		});
		
		$(".formtogglearrowwrapper .contentbody:first").show();
		$(".formtogglearrowwrapper .togglearrow:first").addClass("expanded");
	
		jQuery.validator.addMethod("validatenameformat", Moblico.validateNameFormat, "Only letters are allowed.");
		jQuery.validator.addMethod("validateurlformat", Moblico.validateUrl, "Please enter a URL.");
		jQuery.validator.addMethod("validatelaxnameformat", Moblico.validateLaxNameFormat, "Only A-Z, 0-9, -, . and spaces allowed.");
		jQuery.validator.addMethod("validatemessagenameformat", Moblico.validateMessageNameFormat, "Only alphanumeric and spaces allowed.");
		jQuery.validator.addMethod("validateemailsubjectformat", Moblico.validateEmailSubjectFormat, "Only alphanumeric, spaces and selected special characters allowed.");
		jQuery.validator.addMethod("validatestreetformat", Moblico.validateStreetFormat, "Please enter a valid street address.");
		jQuery.validator.addMethod("moblicophonenumber", Moblico.validatePhone, "Please enter a valid phone number.");
		jQuery.validator.addMethod("productprice", Moblico.validateProductPrice, "Please enter a valid price, max of 9999.99 . Ex. 30.00");
		jQuery.validator.addMethod("moblicozipcode", Moblico.validateZipcode, "Please enter a valid zipcode. Ex. 64015");
		jQuery.validator.addMethod("moblicodateformat", Moblico.validateDateFormat, "Please enter a valid date format. Ex: 01/31/2010");
		jQuery.validator.addMethod("startenddate", Moblico.validateStartEndDate, "Please enter an end date that's later than the start date.");
		jQuery.validator.addMethod("islaterdate", Moblico.validateLaterDate, "Please enter a date later than the current date.");
		jQuery.validator.addMethod("validateallowgroupreply", Moblico.validateAllowGroupReply, "You may Allow Group Reply OR select Group Send Leaders.  It can't be both.");
		jQuery.validator.addMethod("moblicosubkeyword", Moblico.validateSubkeywordFormat, "Alphanumeric characters only.");
		jQuery.validator.addMethod("validatelatlon", Moblico.validateLatlon, "Please enter a valid coordinate.");
		
		Moblico.markRequiredFields(".markrequired");
		
		$(".deleteallbtn").click(function(event) {
										  
			var message = $(this).metadata().message;
			var url = $(this).metadata().url;
			var type = $(this).metadata().type;
			var children = $(this).metadata().children;
			
			var total = $(children + ":checked").length;
			
			var msg = "Would you like to delete " + total + " " + type + "?";
			if(message) {
				msg = message.replace("{total}", total);
			}
			
			var conf = confirm(msg);
			if(!conf) {
				return false;	
			}
			window.location.href = url;
			
		});
		
		$("input[type='file']").keydown(function(ev) {
			ev.preventDefault();
			$(this).blur(); 
		});
		$("input[type='file']").keyup(function(ev) {
			ev.preventDefault();
			$(this).blur(); 
		});
		
		// moblico-hide-feature stuff here
		if(typeof toggleHideFeature == "string") {
			if(toggleHideFeature != "") {
				jQuery.each($("." + toggleHideFeature), function(i, val) {
					var before = $(val).prev();
					if(before) {
						if($(before).hasClass("tableactionbtn")) {
							$(before).css("margin-right", "0px");
						}
					}
				});
			}
		}

	});
	
}

/*
Moblico.regKeywordDropdown = function(elem) {
	var subkeyword = $($(elem).metadata().subkeyword).get(0);
	var origkeyword = $(elem).metadata().orig;
	var origsubkeyword = $(subkeyword).metadata().orig;
	$(subkeyword).blur(function(ev) {
		var keywordSubs = $(elem).find("option:selected").metadata().subkeywords;
		var enteredKeyword = $(this).val();
		if(enteredKeyword == "") {
			// keyword already taken
			if(keywordSubs == "") {
				alert("already taken!");
			}
		} else {
			if(keywordSubs.indexOf("|" + enteredKeyword + "|") >= 0 && enteredKeyword != origsubkeyword) {
				alert("already taken!");
			}
		}
	});
}
*/

Moblico.collapseToggleArrow = function(elem) {
	$(elem).find(".togglearrow").removeClass("expanded");
	$(elem).find(".contentbody:first").hide();
}

Moblico.expandToggleArrow = function(elem) {
	$(elem).find(".togglearrow").addClass("expanded");
	$(elem).find(".contentbody:first").show();
}

Moblico.loadSubmenubar2Tab = function(elem) {
	var submenubar2wrapper = $("#submenubar2").metadata().group;
	if(GabeUtil.loadingOrderByColumn == true) {
		return;	
	}
	
	if(submenubar2wrapper) {
		$(submenubar2wrapper).hide();
	}
	
	$("#submenubar2 a").removeClass("selected");
	$(elem).addClass("selected");
	
	var target = $(elem).attr("href");
	jQuery.each($("#submenubar2 a"), function(i, elem) {
		var thistarget = $(elem).attr("href");
		if(thistarget == target) {
			return;
		}
		$(thistarget).hide();
	});
	
	$(target).show();
	
	if(!$(target).hasClass("dontautosort")) {
		GabeUtil.toggleOrderByColumn($(".tablehead a.sortorderlink:first", $(target)));	
	}
	
	if($(elem).attr("href") == "#sysmessagestable") {
		$(".deleteallbtn").hide();
		$(".addmessagebtn").css("visibility", "hidden");
	} else {
		$(".deleteallbtn").show();
		$(".addmessagebtn").css("visibility", "visible");
	}
}

Moblico.markRequiredFields = function(selector) {
	jQuery.each($(selector), function(i, val) {
		// $("<em>*</em>").insertAfter(val);
		if($(val).find(".markrequiredmarker").length < 1) {
			$(val).append("<em class='markrequiredmarker'>*</em>");
		}
		if(!document.getElementById("formmarkrequiredinfo")) {
			if(document.getElementById("markrequiredinfowrapper")) {
				$("#markrequiredinfowrapper").append("<p id='formmarkrequiredinfo'>* Required fields.</p>");
			} else {
				$(val).closest("form").before("<p id='formmarkrequiredinfo'>* Required fields.</p>");
				if($("#formmarkrequiredinfo").closest(".contentbody").length == 0) {
					$("#formmarkrequiredinfo").addClass("contentbodymargin");
				}
			}
		}
	});
}

Moblico.unmarkRequiredFields = function(selector) {
	jQuery.each($(selector), function(i, val) {
		// $("<em>*</em>").insertAfter(val);
		$(val).find(".markrequiredmarker").remove();
	});
}

Moblico.regSendTimeButton = function(elem) {
	$(elem).click(function(event) {
		Moblico.toggleSendTimeInfo(elem);
	});
}

Moblico.regRecurRepeatSelect = function(sel) {
	Moblico.toggleRecurRepeat(sel);
	$(sel).change(function(event) {
		Moblico.toggleRecurRepeat(sel);
	});	
}

Moblico.toggleRecurRepeat = function(sel) {
	
	// disable all
	$(".recurtypeinfo").hide();
	$(".recurtypeinfo input, .recurtypeinfo select").attr("disabled", true);
	
	var opt = $("option:selected", $(sel));
	var infodiv = $(opt).metadata().infodiv;
	if(infodiv) {
		$(infodiv).show();
		$("input, select", $(infodiv)).attr("disabled", false);	 
	}
	
}

Moblico.toggleSendTimeInfo = function(elem) {
	
	jQuery.each($(".sendtimewrapper"), function(i, val) {
		$(".sendtimeinfo", $(val)).hide();
		$(".sendtimeinfo input, .sendtimeinfo select", $(val)).attr("disabled", true);
	});
	
	var wrapper = $(elem).closest(".sendtimewrapper");
	if($(elem).is(":checked")) {
		if($(".sendtimeinfo", $(wrapper)).html() != "") {
			$(".sendtimeinfo", $(wrapper)).show();
		}
		$(".sendtimeinfo input, .sendtimeinfo select", $(wrapper)).attr("disabled", false);
	} else {
		$(".sendtimeinfo", $(wrapper)).hide();
	}
	
}

Moblico.regPreviewMessageBtn = function(btn, opt) {
	if(!opt) {
		opt = {};	
	}
	var textarea = $(btn).metadata().textarea; 
	$(btn).colorbox({
		html : "<p align='center'>Loading Preview...</p>",
		width: "500px",
		height: "200px",
		onComplete : function() {
			var previewtext = Moblico.getSmsPreview(document.getElementById(textarea).value, opt);
			previewtext = Moblico.formatSmsPreview(previewtext);
			if(opt.preDisplay) {
				previewtext = opt.preDisplay(previewtext);	
			}
			$("#cboxLoadedContent").html("<h3 class='center'>Preview Message</h3><p align='center'>" + previewtext + "</p>");
			// $("#cboxLoadedContent").html("<p align='center'>" + Moblico.getSmsPreview(document.getElementById(textarea).value, opt) + "</p>");
		}
	});
}

Moblico.toggleStaticCodeFlag = function(elem) {
	if($(elem).attr("checked") == true) {
		$("#static_code").attr("disabled", true);
		$("#gift_max_use_per_code").attr("disabled", false);
	} else {
		$("#static_code").attr("disabled", false);
		$("#gift_max_use_per_code").attr("disabled", true);
	}
}

Moblico.regHowtoVideoBtn = function(btn) {
	var src = $(btn).metadata().src;
	$(btn).colorbox({
		html : "<div class='howtovideoiframewrapper'><iframe src='" + src + "' frameborder='0' style='width:650px;height:420px;' class='howtovideoiframe'></iframe></div>"
	});	
}

Moblico.regSelfRegFlag = function(elem) {
	$(elem).click(function(event) {
		Moblico.toggleSelfReg(elem);					   
	});
	Moblico.toggleSelfReg(elem);
}

Moblico.toggleSelfReg = function(elem) {
	$("select", $(".groupAssignment")).css("border", "#cccccc 1px solid");
	if(!$(elem).is(":checked")) {
		$(".groupAssignment").addClass("deactivated");
		$("select", $(".groupAssignment")).attr("disabled", true);
		$("select option:first", $(".groupAssignment")).attr("selected", true);
		$("select", $(".groupAssignment")).css("visibility", "hidden");
	} else {
		// $("select", $(".groupAssignment")).blur();
		$(".groupAssignment").removeClass("deactivated");
		$("select", $(".groupAssignment")).attr("disabled", false);
		$("select", $(".groupAssignment")).css("visibility", "visible");
	}
}

Moblico.getSmsLength = function(val) {
	var text = val.replace(/\n/, "");
	for(var i = 0; i < Moblico.smsvars.length; i++) {
		var regex = new RegExp(Moblico.smsvars[i], "ig");
		text = text.replace(regex, GabeUtil.padding("", Moblico.smsvarsLength[i]));
	}
	var length = text.length /*- 3 - settingsBizMessageKeyword.length*/;
	// alert(settingsBizMessageKeyword);
	return length;
}

Moblico.getSmsPreview = function(val, opt) {
	if(!opt) {
		opt = {};	
	}
	if(!opt.wrapper) {
		opt.wrapper = "{sample}";
	}
	var text = val;
	var sample = "";
	for(var i = 0; i < Moblico.smsvars.length; i++) {
		var regex = new RegExp(Moblico.smsvars[i], "ig");
		sample = opt.wrapper.replace("{sample}", Moblico.smsvarsSample[i]);
		text = text.replace(regex, sample);
	}
	return text;
}

Moblico.formatSmsPreview = function(txt, opt) {
	if(!opt) {
		opt = {};	
	}
	var pattern = /[a-zA-Z0-9\-_.,]{41,}/ig;
	var chunksize = 40;
	var matches = pattern.exec(txt);
	if(matches == null) {
		return txt;	
	}
	var newtxt = "";
	for(var i = 0; i < matches.length; i++) {
		var amatch = matches[i];
		var index = 0;
		var newtxti = "";
		var chunk = "";
		while(chunk = amatch.substring(index, index + chunksize)) {
			newtxti += chunk + '\n';
			index += chunksize;
		}
		newtxt = txt.replace(amatch, newtxti);
	}
	return newtxt;
}

Moblico.limitSmsLength = function(elem, option) {
	if(!option) {
		option = {};
	}
	var meta = $(elem).metadata();
	if(!meta.allowedSmsLength) {
		meta.allowedSmsLength = Moblico.allowedSmsLength;	
	}
	if(!option.callback) {
		option.callback = function(response) {};	
	}
	var val = $(elem).val();
	if(val != null) {
		var actuallen = val.length;
		var len = Moblico.getSmsLength(val);
		var diff = 0;
		if(len > actuallen) {
			diff = len - actuallen;	
		} else {
			diff = -1 * (actuallen - len);
		}
		if(len > meta.allowedSmsLength) {
			$(elem).val(val.substr(0, meta.allowedSmsLength - diff));
		}
		option.callback(elem);	
	}
	
};

Moblico.confirmedAdEnabledAnswer = null;
Moblico.confirmedAdEnabled = new Array();
Moblico.adEnabledMessages = new Array();
Moblico.adEnabledCheckboxInit = false;

Moblico.applyAdEnabledToMessage = function(elem, adbox, adlabel) {
	
	var meta = $(elem).metadata();
	
	if(!meta.allowedSmsLength) {
		meta.allowedSmsLength = Moblico.allowedSmsLength;	
	}
	
	var allowedSmsLengthWithAd = Moblico.allowedSmsLength;
	var allowedSmsLengthNoAd = meta.allowedSmsNoAdsLength;
	
	// it's a disable ad box!
	var disableAd = $(adbox).metadata().disableAd;
	
	var currentAllowedSmsLength = parseInt($(adlabel).html(), 10);
	var val = $(elem).val();
	var len = Moblico.getSmsLength(val);
	
	var allowedlength = allowedSmsLengthWithAd;
	
	var enabled = $(adbox).is(":checked");
	if(disableAd) {
		enabled = !enabled;	
	}
	
	// alert(allowedSmsLengthWithAd + " : " + allowedSmsLengthNoAd);
	
	if(enabled) {
		// cap this first since backend is not able to support 120+ characters yet
		allowedlength = allowedSmsLengthWithAd;
	} else {
		allowedlength = allowedSmsLengthNoAd;
	}
	
	if(len > allowedlength) {
		
		if(Moblico.confirmedAdEnabledAnswer === null) {
			// not yet answered, so ask
			
			Moblico.confirmedAdEnabledAnswer = confirm("Your message is currently longer than the max allowed length for your messages, based on your account settings.  Your message will need to be truncated.  Would you like to continue?");
			
			// alert("Your message is currently longer than the max allowed length for messages, based on your account settings.  Your message will need to be truncated.");
			/*
			// let's hide this since now we're going to ask them instead
			if(!document.getElementById("colorboxHiddenBtn")) {
				
				var colorboxHiddenBtn = document.createElement("input");
				colorboxHiddenBtn.type = "button";
				colorboxHiddenBtn.id = "colorboxHiddenBtn";
				colorboxHiddenBtn.style.display = "none";
				document.body.appendChild(colorboxHiddenBtn);
				
				$("#colorboxHiddenBtn").colorbox({
					open : true,
					width : 400,
					html : "<div id='messageTruncateDiv'><img src='" + moblicoServletPath + "/theme/kurt1/image/warningsign.jpg' class='marginright10' align='left' /><p>There have been system updates.  As a result, this message is now too long and will be truncated if not updated.</p><textarea style='display:block;margin:auto auto;width:90%;height:100px'>" + val + "</textarea></div>",
					onCleanup : function() {
						$(elem).val($("#messageTruncateDiv textarea:first").val());
						// alert($("#messageTruncateDiv textarea:first").val());
					}
				});
			}
			Moblico.confirmedAdEnabledAnswer = true;
			*/
			
			var checkOn = Moblico.confirmedAdEnabledAnswer;
			
			if(disableAd) {
				checkOn = !checkOn;	
			}
			
			if(!Moblico.adEnabledCheckboxChecked) {
				// didn't check, so revert to orig
				checkOn = $(adbox).attr("checked");
				Moblico.confirmedAdEnabledAnswer = null;
			}
				
			// record answer
			if(!checkOn) {
				// don't enable ads
				$(adbox).attr("checked", false);
				allowedlength = allowedSmsLengthNoAd;
			} else {
				// enable ads
				$(adbox).attr("checked", true);
				allowedlength = allowedSmsLengthWithAd;
			}
		}
	}
	
	Moblico.confirmedAdEnabled.push(elem);
	
	if(Moblico.confirmedAdEnabledAnswer !== null) {
		// already got an answer
		/*
		if(!Moblico.confirmedAdEnabledAnswer) {
			allowedlength = currentAllowedSmsLength;
		}
		*/
	}
	
	$(adlabel).html(allowedlength);
	return allowedlength;
	
}

Moblico.triggerEnabledAdLength = function() {
	// loop through the messages here
	for(var i = 0; i < Moblico.adEnabledMessages.length; i++) {
		$(Moblico.adEnabledMessages[i]).metadata().allowedSmsLength = Moblico.applyAdEnabledToMessage(Moblico.adEnabledMessages[i], $($(Moblico.adEnabledMessages[i]).metadata().adEnabledSelector), $($(Moblico.adEnabledMessages[i]).metadata().textLengthLabelSelector));
	}
	
	Moblico.confirmedAdEnabled = new Array();
	Moblico.confirmedAdEnabledAnswer = null;
}

Moblico.adEnabledCheckboxChecked = false;

Moblico.regLimitedTextfield = function(elem, option) {
	
	if(!option) {
		option = {};
	}
	
	var adEnabled = false;
	var textLengthLabel = null;
	var adEnabledCheckbox = null;
	
	var meta = {};
	meta = $(elem).metadata();
	if(!meta.allowedSmsLength) {
		meta.allowedSmsLength = Moblico.allowedSmsLength;	
	}
	
	
	// alert(allowedSmsLengthWithAd + " : " + allowedSmsLengthNoAd);
	
	if(meta.adEnabledSelector) {
		if($(meta.adEnabledSelector).length > 0) {
			adEnabledCheckbox = $(meta.adEnabledSelector);
			adEnabled = $(meta.adEnabledSelector).is(":checked");
		}
	}
	
	if(meta.textLengthLabelSelector) {
		
		if($(meta.textLengthLabelSelector).length > 0 && adEnabledCheckbox != null) {
			// add this element to messages tied to checkbox
			Moblico.adEnabledMessages.push(elem);
			textLengthLabel = $(meta.textLengthLabelSelector);
			if(!Moblico.adEnabledCheckboxInit) {
				// not yet initiated
				$(adEnabledCheckbox).click(function(ev) {
					// $(elem).metadata().allowedSmsLength = triggerEnabledAdLength(adEnabledCheckbox, textLengthLabel);	
					Moblico.adEnabledCheckboxChecked = true;
					Moblico.triggerEnabledAdLength();
				});
				Moblico.adEnabledCheckboxInit = true;
			}
			meta.allowedSmsLength = Moblico.applyAdEnabledToMessage(elem, adEnabledCheckbox, textLengthLabel);
		}
		
	}
	
	if(!option.callback) {
		option.callback = function(response) {};	
	}
	
	$(elem).metadata().allowedSmsLength = meta.allowedSmsLength;
	$(elem).keydown(function(event) {
		var code = event.keyCode || event.charCode;
		var val = $(elem).val();
		var len = Moblico.getSmsLength(val);
		var prevDefault = false;
		// alert(code);
		if(len >= parseInt(meta.allowedSmsLength) && code == 32) {
			prevDefault = true;
		}
		if(code > 40 && len >= parseInt(meta.allowedSmsLength)) {
			prevDefault = true;
		}
		// alert(code);
		if(event.ctrlKey && (code == 67 || code == 65)) {
			prevDefault = false;	
		}
		if(code == 46) {
			// delete keypress
			prevDefault	= false;
		}
		if(prevDefault) {
			event.preventDefault();	
		}
	});
	
	var onkeyup = function(event) {
		Moblico.limitSmsLength(elem, option); 
	};
	
	$(elem).click(function(event) {
		Moblico.currentTextfield = this.id;
	});
	$(elem).keyup(onkeyup);
	$(elem).change(onkeyup);
	setInterval(function() {
		Moblico.limitSmsLength(elem, option);
	}, 10);
	
}

Moblico.openPrintWindow = function(url) {
	var win = window.open(url, "printWindow", "width=1100,height=600,scrollbars=yes");
	win.focus();
	return win;
}

function loadSmsSyntax(elem, opt) {
	if(!opt) {
		opt = {};	
	}
	if(!opt.textarea) {
		opt.textarea = "message_text";
	}
	
	if(Moblico.currentTextfield) {
		opt.textarea = Moblico.currentTextfield;	
	}
	
	var txtmsg = document.getElementById(opt.textarea);
	if(!txtmsg) {
		return;
	}
	
	opt = $(txtmsg).metadata();
	opt.textarea = txtmsg.id;
	if(!opt.allowedSmsLength) {
		opt.allowedSmsLength = Moblico.allowedSmsLength;
	}
	opt.allowedSmsLength = parseInt(opt.allowedSmsLength);
	if(!opt.textarealength) {
		opt.textarealength = "message_text_length";
	}
	
	var syntax = $(elem).metadata().syntax;
	
	var delim = "";
	if(Moblico.getSmsLength(txtmsg.value + delim + syntax) > opt.allowedSmsLength) {
		alert("You have reached the number of maximum characters in your text message.");
		return;
	}
	
	if(document.selection) {
		txtmsg.focus();
		var curs = document.selection.createRange();
		curs.text = delim + syntax;
		txtmsg.focus();
	} else if(txtmsg.selectionStart || txtmsg.selectionStart == '0') {
		var ovalue = txtmsg.value;
		var startpos = txtmsg.selectionStart;
		var endpos = txtmsg.selectionEnd;
		txtmsg.value = ovalue.substring(0, startpos) + delim + syntax + ovalue.substring(endpos);
		var restart = (ovalue.substring(0, startpos) + delim + syntax).length;
		txtmsg.setSelectionRange(restart, restart);
		txtmsg.focus();
	} else {
		txtmsg.value = txtmsg.value + delim + syntax;
	}
	// txtmsg.value = txtmsg.value + delim + syntax;
	if(document.getElementById(opt.textarealength)) {
		$("#" + opt.textarealength).val(Moblico.getSmsLength(txtmsg.value));
	}
	
	/*
	if(Moblico.getSmsLength(txtmsg.value) >= ) {
		alert("You have reached the number of maximum characters in your text message.");
	}
	*/
	/*
	if((txtmsg.value.length + syntax.length + 1) > 154) {
		alert("You are only allowed upto 154 characters in your text message.");
	} else {
		txtmsg.value = txtmsg.value + " " + syntax;
		txtmsglen.value = parseInt(txtmsglen.value) + parseInt(syntax.length);
	}
	*/
}

Moblico.toggleReportFormatDateRange = function(elem) {
	var daterange = $(elem).metadata().daterange;
	if($(elem).val() == 'summary') {
		$("#areacodewrapper").show();
	} else {
		$("#areacodewrapper").hide();
	}
	if(document.getElementById(daterange + "_tmp")) {
		var tmpid = daterange + "_tmp";
		$("option", "#" + daterange).remove();
		jQuery.each($("option:eq(0), option.rangefor" + $(elem).val(), "#" + tmpid), function(i, val) {
			var oval = $(val).val();
			var otext = $(val).html();
			$("#" + daterange).append("<option value='" + oval + "'>" + otext + "</option>");
			$("option:eq(1)", "#" + daterange).attr("selected", true);
		});
	} else {
		$("option:gt(0)", "#" + daterange).hide();
		$("option.rangefor" + $(elem).val(), "#" + daterange).show();
		$("option.rangefor" + $(elem).val() + ":first", "#" + daterange).attr("selected", true);
	}
	Moblico.dateRangeChanged(document.getElementById(daterange));
}

Moblico.dateRangeChanged = function(elem) {
	// alert(elem);
	var disable = true;
	if (elem[elem.selectedIndex].value == 'specify_range') {
		disable = false;
		$(".ui-datepicker-trigger").css("visibility", "visible");
	} else {
		$(".ui-datepicker-trigger").css("visibility", "hidden");
	}
	$('#report_start_date').attr("disabled", disable);
	$('#report_end_date').attr("disabled", disable);
}

Moblico.toggleGroupReply = function(elem) {
	if($(elem).is(":checked") == true) {
		$("input[name='guest_phone_list']").attr("checked", true);
	} else {
		// $("input[name='guest_phone_list']").attr("checked", false);
	}
}

Moblico.toggleSubkeyword = function(kword) {
	var subkeywordsel = $(kword).metadata().subkeyword;
	if(!subkeywordsel) {
		return;
	}
	var keyword = $(kword).val();
	if(MoblicoUtil.trimSpaces(keyword) == "") {
		// empty, so deactivate subkeyword field
		$(subkeywordsel).addClass("disabled");
		$(subkeywordsel).attr("readonly", true);
		$(subkeywordsel).val("");
	} else {
		$(subkeywordsel).removeClass("disabled");
		$(subkeywordsel).attr("readonly", false);
	}
}

Moblico.regToggleSubkeyword = function(kword) {
	$(kword).keyup(function(ev) {
		Moblico.toggleSubkeyword(kword);						
	});
	Moblico.toggleSubkeyword(kword);
}

Moblico.toggleMoblicoNoKeyword = function(kword) {
	
	var subkeywordsel = $(kword).metadata().subkeyword;
	// the label to mark as required or unrequired
	var subkeywordlabelsel = $(kword).metadata().subkeywordlabel;
	
	if(!subkeywordsel || !subkeywordlabelsel) {
		return;
	}
	
	var keyword = $(kword).val();
	var subkeywordid = $(subkeywordsel).get(0).id;
	
	if(MoblicoUtil.trimSpaces(keyword).toLowerCase() == moblicoNoKeyword.toLowerCase()) {
		// empty, so deactivate subkeyword field
		$(subkeywordlabelsel).removeClass("markrequired");
		Moblico.unmarkRequiredFields(subkeywordlabelsel);
		$(subkeywordsel).addClass("disabled");
		$(subkeywordsel).attr("readonly", true);
		$(subkeywordsel).val("");
		$("label.errorField[for='" + subkeywordid + "']").remove();
		
	} else if(MoblicoUtil.trimSpaces(keyword).toLowerCase() == settingsBizMessageKeyword.toLowerCase()) {
		// require subkeyword
		$(subkeywordlabelsel).addClass("markrequired");
		Moblico.markRequiredFields(subkeywordlabelsel);
		$(subkeywordsel).removeClass("disabled");
		$(subkeywordsel).attr("readonly", false);
	} else {
		// subkeyword is optional
		$(subkeywordlabelsel).removeClass("markrequired");
		Moblico.unmarkRequiredFields(subkeywordlabelsel);
		$(subkeywordsel).removeClass("disabled");
		$(subkeywordsel).attr("readonly", false);
		$("label.errorField[for='" + subkeywordid + "']").remove();
	}
}

Moblico.regMoblicoNoKeyword = function(kword) {
	$(kword).change(function(ev) {
		Moblico.toggleMoblicoNoKeyword(kword);						
	});
	Moblico.toggleMoblicoNoKeyword(kword);
}

Moblico.joinFields = function(selector, delim) {
	if(!delim) {
		delim = ",";	
	}
	var arr = new Array();
	jQuery.each($(selector), function(i, val) {
		var myval = $(val).val();
		if(myval == "") {
			return;	
		}
		arr.push(myval);
	});
	return arr.join(",");
}

Moblico.regImageRels = function(elem) {
	
	var wrapper = $(elem).closest(".platformwrapper");
	var pfdropdown = $(".platformdropdown", wrapper);
	
	jQuery.each($(".title a", elem), function(i, val) {
		$(val).click(function(ev) {
			$(this).closest(".title").next().toggle();
			return false;
		});
	});
	
	if($(".title a", elem).length == 1) {
		$(".title a", elem).closest(".title").next().show();
		var firstimage = $(".title a:first", elem);
		// pre-select if only 1
		$(pfdropdown).metadata().defaultPlatformId = $(firstimage).metadata().platformId;
		$(pfdropdown).metadata().defaultImageTypeId = $(firstimage).metadata().imageTypeId;
		$(pfdropdown).metadata().defaultClickToUrl = $(firstimage).metadata().clickToUrl;
		$(pfdropdown).metadata().defaultClickToCall = $(firstimage).metadata().clickToCall;
	}
}

Moblico.selectCampaignImage = function(elem) {
}

Moblico.editImageTypeId = null;
Moblico.editPlatformId = null;
Moblico.editClickToUrl = null;
Moblico.editClickToCall = null;

Moblico.resetEditImageRel = function() {
	$(".editimagerel .deletebannerimage").attr("checked", false);
	Moblico.editImageTypeId = null;
	Moblico.editPlatformId = null;
	Moblico.editClickToUrl = null;
	Moblico.editClickToCall = null;
}

Moblico.toggleEditPlatformButtons = function() {
	if(Moblico.editClickToUrl) {
		$("input[name='campaign_click_to_url']").val(Moblico.editClickToUrl);
		$("input[name='banner_type'][value='click_to_url']").attr("checked", true);
		// alert();
	} else if(Moblico.editClickToCall) {
		$("input[name='campaign_click_to_call']").val(Moblico.editClickToCall);
		$("input[name='banner_type'][value='click_to_call']").attr("checked", true);
	} else {
		$("input[name='banner_type']:first").attr("checked", true);
	}
	jQuery.each($("input[name='banner_type']:first"), function(i, val) {
		Moblico.toggleDisableCheckbox(val, true);
	});
}

Moblico.toggleNewBanner = function(elem) {
	
	Moblico.resetEditImageRel();
		
	$(".manageimagerel").hide();
	$(".addimagerel").show();
	$(".platformwrapperadd").append($(".platformwrapper:first"));	
	
	var platformelem = $(".platformwrapper:first").get(0);
	var platformdd = $(platformelem).find(".platformdropdown:first");
	var imagetypes = $(platformelem).find(".imagetypedropdown:first");
	
	$(platformdd).val("");
	Moblico.togglePlatformDropdown(platformdd);
}

Moblico.toggleEditBanner = function(elem) {
	
	Moblico.resetEditImageRel();
	
	var platformelem = $(".platformwrapper:first").get(0);
	var parent = platformelem;
	var platformdd = $(platformelem).find(".platformdropdown:first");
	var buttons = $(platformdd).metadata().buttons;
	var imagetypes = $(platformelem).find(".imagetypedropdown:first");
	
	var imageurl = $(elem).find("img").attr("src");
	var imagerelname = $(elem).find(".imagerelname").html();
	var platformid = $(elem).metadata().platformId;
	var imagetypeid = $(elem).metadata().imageTypeId;
	
	Moblico.editPlatformId = platformid;
	Moblico.editImageTypeId = imagetypeid;
	Moblico.editClickToUrl = $(elem).metadata().clickToUrl;
	Moblico.editClickToCall = $(elem).metadata().clickToCall;
	
	// alert(Moblico.editClickToCall);
	
	$(platformdd).val(platformid);
	Moblico.togglePlatformDropdown(platformdd);
	$(imagetypes).val(imagetypeid);
	Moblico.toggleImageType(platformdd, imagetypes);
	
	// has the action buttons
	if(buttons) {
		Moblico.toggleEditPlatformButtons();
	}
	
	$(".manageimagerel").hide();
	$(".editimagerel").show();
	$(".platformwrapperedit").append($(".platformwrapper:first"));
	
	$(".editimagerel .imagerelpreview").html("<img src='" + imageurl + "' />");
	$(".editimagerel h3:first").html(imagerelname);
	
	$(".editimagerel .bannerimage").html("<img src='" + imageurl + "' />");
	
	var imagerelid = $(elem).metadata().imageRelId;
	$(".editimagerel .deletebannerimage").val(imagerelid);
	
}

Moblico.regEditBanner = function(selector) {
	jQuery.each($(selector), function(i, val) {
		$(val).click(function(ev) {
			Moblico.toggleEditBanner(val);
		});						  
	});
}

Moblico.toggleImageType = function(platformelem, imagetypes) {
	
	// alias
	var elem = platformelem;
	
	var parent = $(elem).closest(".platformwrapper");
	var buttons = $(platformelem).metadata().buttons;
	var file = $(platformelem).metadata().file;
	
	var infowrapper = $(imagetypes).metadata().infowrapper;
	var selected = $(imagetypes).find("option:selected");
	var selectedval = $(imagetypes).val();
	
	if($(imagetypes).find("option").length == 0) {
		
		// no image types found
		$(file).attr("disabled", true);
		$(buttons).attr("checked", false);	
		$(buttons).attr("disabled", true);
		
	} else {
		
		// with image types
		var selectedinfo = $(selected).metadata().info;
		var infowrapper = $(imagetypes).metadata().infowrapper;
		$(infowrapper).html(selectedinfo + " jpg");
		
		$(file).attr("disabled", false);
		$(buttons).attr("disabled", false);
		
		// check for deletion
		// $(".platformtype" + $(platformelem).val() + "-" + $(imgtdd).val() + " input[type='checkbox']").attr("checked", true);
	}
	
	if(buttons) {
		if($(imagetypes).val()) {
			if($(buttons + ":checked").length < 1) {
				$("input[name='banner_type']:first", parent).attr("checked", true);
			}
		}
		jQuery.each($(buttons), function(i, val) {
			Moblico.toggleDisableCheckbox(val, true);
		});
	}
	
	if($(imagetypes).find("option").length < 1) {
		$(imagetypes).prev().addClass("disabled");
		$(imagetypes).hide();
		$(infowrapper).hide();
	} else {
		$(imagetypes).prev().removeClass("disabled");
		$(imagetypes).show();
		$(infowrapper).show();
	}
	
	Moblico.toggleEditPlatformButtons();
	
}

Moblico.togglePlatformDropdown = function(dd) {
	
	var elem = dd;
	
	var imageTypeIds = "";
	jQuery.each($(".imagerelwrapper"), function(i, val) {
		imageTypeIds += "|" + $(val).metadata().imageTypeId + "|";
		// alert($(val).metadata().imageTypeId);
	});
	
	var parent = $(elem).closest(".platformwrapper");
	var platformelem = elem;
	var imgtdd = $(elem).metadata().imgtypedropdown;
	var imagetypes = $(imgtdd);
		
	var infowrapper = $(elem).metadata().infowrapper;
	var selected = $(elem).find("option:selected");
	var selectedval = $(elem).val();
	
	$("option", imagetypes).remove();
	jQuery.each($("#tmp_image_types option"), function(i, val) {
		if($(val).metadata().platformid == selectedval) {
			var optionval = $(val).val();
			if(imageTypeIds.indexOf("|" + optionval + "|") >= 0 && Moblico.editImageTypeId != optionval) {
				return;
			}
			$(imagetypes).append($(val).clone(false));
		}
	});
	
	Moblico.toggleImageType(platformelem, imagetypes);
	
}

Moblico.regPlatformDropdown = function(elem) {
	
	var parent = $(elem).closest(".platformwrapper");
	var platformelem = elem;
	var imgtdd = $(elem).metadata().imgtypedropdown;
	var imagetypes = $(imgtdd);
	
	var buttons = $(platformelem).metadata().buttons;
	var file = $(platformelem).metadata().file;
	
	$(elem).unbind("change");
	$(imagetypes).unbind("change");
	
	Moblico.togglePlatformDropdown(platformelem);
	
	// initialize, preload
	var defaultPlatformId = $(elem).metadata().defaultPlatformId;
	var defaultImageTypeId = $(elem).metadata().defaultImageTypeId;
	var defaultClickToUrl = $(elem).metadata().defaultClickToUrl;
	var defaultClickToCall = $(elem).metadata().defaultClickToCall;

	$(elem).val(defaultPlatformId);
	$(imagetypes).val(defaultImageTypeId);

	$(elem).change(function(ev) {
		Moblico.togglePlatformDropdown(platformelem);
	});
	
	$(imagetypes).change(function(ev) {
		Moblico.toggleImageType(platformelem, this);
	});
	
	Moblico.togglePlatformDropdown(platformelem);
	
	// clear delete checks
	$(".imagerelwrapper input[type='checkbox']").attr("checked", false);
	
}

Moblico.expandAllSteps = function(parent) {
	if(!parent) {
		parent = document.body;	
	}
	$(".formtogglearrowwrapper .togglearrow", parent).addClass("expanded");
	$(".formtogglearrowwrapper .contentbody", parent).show();
	// $(".formtogglearrowwrapper .togglearrow + div", parent).show();
	$(".nextstepbtn").hide();
	return parent;
}

Moblico.addByContentEntry = function(value) {
	if(!value) {
		value = "";	
	}
	$(".bycontentwrapper").append("<div class='bycontententry'><input type='text' name='content_name' value=\"" + value + "\" size='35' /><input type='button' class='deletecontentbtn' value='Remove' /></div>");
	$(".deletecontentbtn:last").click(function(ev) {
		$(this).closest("div").remove();										   
	});
}

Moblico.regRemoveNewPhone = function(elem) {
	var parent = $(elem).closest(".newphonewrapper");
	$(elem).click(function(event) {
		$(parent).remove();
	});	
}

Moblico.regRemoveNewEmail = function(elem) {
	var parent = $(elem).closest(".newemailwrapper");
	$(elem).click(function(event) {
		$(parent).remove();
	});	
}

Moblico.addPhoneField = function(elem, phone) {
	if(!phone) {
		phone = "";	
	}
	var target = $(elem).metadata().target;
	$(target).append("<div class='newphonewrapper'><input type='text' name='phonetmp' value='" + phone + "' class='input190 numericfield' id='phonetmp" + (Math.random() * 10) + "' /> <input type='button' value='Remove' class='removenewphonebtn' /></div>");
	jQuery(".numericfield:last").keyup(function(event) {
		this.value = this.value.replace(/[^0-9.]+/i, "");
	});
	$("input[name='phonetmp']:last").focus();
	Moblico.regRemoveNewPhone($(".removenewphonebtn:last"));
}

Moblico.addEmailField = function(elem, email) {
	if(!email) {
		email = "";	
	}
	var target = $(elem).metadata().target;
	$(target).append("<div class='newemailwrapper'><input type='text' name='email_address' value='" + email + "' class='input190' maxlength='64' id='email_address" + (Math.random() * 10) + "' /> <input type='button' value='Remove' class='removenewemailbtn' /></div>");
	$("input[name='email_address']:last").focus();
	Moblico.regRemoveNewEmail($(".removenewemailbtn:last"));
}

Moblico.getPhonesFromCsv = function(val) {
	if(!val) {
		return new Array();
	}
	var phones = val.split(",");
	var cleanphones = new Array();
	var pattern = /\s*([0-9\-]+)\s*/i;
	for(var i = 0; i < phones.length; i++) {
		// alert(phones[i]);
		var matches = phones[i].match(pattern);
		if(matches == null) {
			continue;
		}
		cleanphones.push(matches[1]);
	}
	return cleanphones;
}

Moblico.checkGroupLeaders = function(elem) {
	var val = $(elem).val();
	var children = $(elem).metadata().children;
	if(val == "") {
		return;	
	}
	var phones = Moblico.getPhonesFromCsv(val);
	for(var i = 0; i < phones.length; i++) {
		// alert(phones[i]);
		var aphone = phones[i];
		jQuery.each($(children), function(k, val) {
			var phone = $(".phone_number", $(val).closest("tr")).html();
			if(aphone == phone) {
				$(val).attr("checked", true);
			}
		});
	}
}

Moblico.guestsInGroupLeaders = function(table, opt) {
	if(!opt) {
		opt = {};	
	}
	
	$("tr", $(table)).remove();
	$(table).append("<tr><td class='tablehead'><span><input type='checkbox' class=\"displaynone checkallbox {children:'.guestphonelistcheckbox'}\" id='groupleaderscheckallbox' /></span></td><td class='tablehead'><a href='#' class=\"sortorderlink sortguestphonelist  {orderby:'lastname'}\">Last Name</a></td><td class='tablehead'><a href='#' class=\"sortorderlink sortguestphonelist  {orderby:'firstname'}\">First Name</a></td><td class='tablehead'><a href='#' class=\"sortorderlink sortguestphonelist  {orderby:'phone'}\">Phone</a></tr>");
	
	var source = $(table).metadata().source;
	source = eval(source);
	
	// ex source: source:'input[name=\'guests_in_group\']'
	/*
	jQuery.each($(source), function(i, val) {
		var guestid = $(val).val();
		var fname = $(val).closest("tr").find(".firstname").html();
		var lname = $(val).closest("tr").find(".lastname").html();
		var phone = $(val).closest("tr").find(".phone").html();
		$(table).append("<tr><td><input type='checkbox' name='guest_phone_list' class='guestphonelistcheckbox' value='" + guestid + "' /></td><td>" + lname + "</td><td>" + fname + "</td><td class='phone_number'>" + phone + "</td></tr>");
	});
	*/
	
	$("#groupleaderscheckallbox").click(function(event) {
		var children = $(this).metadata().children;
		if($(this).is(":checked")) {
			$("input" + children).attr("checked", true);
		} else {
			$("input" + children).attr("checked", false);
		}
	});
	
	GabeUtil.toggleOrderByColumn($(".tablehead a.sortguestphonelist:eq(0)"));
	$(".tablehead a.sortguestphonelist").click(function(event) {
		event.preventDefault();
		GabeUtil.toggleOrderByColumn(this);
	});
}

Moblico.toggleDisableCheckbox = function(elem, autoclear) {
	
	var field = $(elem).metadata().field;
	var group = $(elem).metadata().group;
	
	// if there is a group set
	if(group) {
		// currently selected?
		var currvalue = $(group).find(":checked").val();
		jQuery.each($(group), function(i, val) {
			if($(val).is(":checked")) {
				return;
			}
			var afield = $(val).metadata().field;
			if(autoclear) {
				// clear it
				// alert(autoclear);
				$(afield).val("");
			}
			if(afield) {
				if($("label[for='" + (afield.replace("#", "")) + "']").length > 0) {
					$("label[for='" + (afield.replace("#", "")) + "']").hide();
				}
				$(afield).addClass("disabled");
				$(afield).attr("readonly", true);
			}
		});
	}
	
	var checked = $(elem).is(":checked");
	if(checked) {
		$(field).removeClass("disabled");
		$(field).attr("readonly", false);
	} else {
		// unchecked, so disable and maybe clear
		if(autoclear) {
			// clear it
			$(field).val("");	
		}
		if(field) {
			if($("label[for='" + (field.replace("#", "")) + "']").length > 0) {
				$("label[for='" + (field.replace("#", "")) + "']").hide();
			}
			$(field).addClass("disabled");
			$(field).attr("readonly", true);
		}
		
	}
}

Moblico.regDisableCheckbox = function(sel, autoclear) {
	if(!autoclear) {
		autoclear = false;	
	}
	$(sel).click(function(ev) {
		Moblico.toggleDisableCheckbox(this, autoclear);
	});
	jQuery.each($(sel), function(i, val) {
		Moblico.toggleDisableCheckbox(val, autoclear);
	});
}

Moblico.togglePreferenceDropdown = function(elem) {
	var val = $(elem).val();
	var label = $(elem).metadata().label;
	var field = $(elem).metadata().field;
	if(val.toLowerCase() == "yes") {
		$(label).addClass("markrequired");
		if(field) {
			$(field).attr("readonly", false);
			$(field).removeClass("disabled");
		}
	} else {
		$(label).removeClass("markrequired");
		$(label).find(".markrequiredmarker").remove();
		if(field) {
			$(field).attr("readonly", true);
			$(field).addClass("disabled");
			// don't empty it out
			// $(field).val("");
			var fieldid = field.replace("#", "");
			$("label[for='" + fieldid + "'].errorField").hide();
		}
	}
	Moblico.markRequiredFields(".markrequired");
}

Moblico.regPreferenceDropdown = function(elem) {
	$(elem).click(function(ev) {
		Moblico.togglePreferenceDropdown(elem);					   
	});
	Moblico.togglePreferenceDropdown(elem);
	
	// if this is blank, set preference to no
	var observefield = $(elem).metadata().observefield;
	
	if(observefield) {
		
		function handleChange(ev) {
			if($(elem).val() == "no") {
				// don't even let the user edit it
				return;
			}
			if(ev.keyCode == 9) {
				// tab hit so don't do anything
				return		
			}
			var thiselem = this;
			if(thiselem.value == "") {
				$(elem).val("no");
			} else {
				$(elem).val("yes");
			}
			Moblico.togglePreferenceDropdown(elem);
		}
		// $(observefield).keyup(handleChange);
		$(observefield).blur(handleChange);
		
	}
}

Moblico.saveDeleteCampaignImage = false;
Moblico.saveCampaignCallback = null;
Moblico.saveCampaignCallbackAfter = null;

Moblico.toggleCouponPlatformRelCheckbox = function(elem, autodeleteimage) {
	
	var val = $(elem).val();
	
	if(!autodeleteimage) {
		autodeleteimage = false;	
	}
	
	if($(elem).is(":checked")) {
		/*
		if($(".platformdropdown option[value='" + val + "']").length < 1) {
			var newOption = $("#tmp_platforms option[value='" + val + "']").clone(true);
			$(".platformdropdown").append(newOption);
			jQuery.each($(".imagerelwrapper"), function(i, img) {
				var pid = $(img).metadata().platformId;
				if(pid == val) {
					$(img).show();	
				}
			});
		}
		*/
		if($("#campaignimageswrapper .campaignimageplatform" + $(elem).val()).length < 1) {
			$(".imageplatformid[value='" + $(elem).val() + "']").closest("div").show();
		}
		$("#campaignimageswrapper .campaignimageplatform" + $(elem).val()).closest(".campaignimagewrapper").show();
		
		Moblico.triggerAddImageForm();
		
	} else {
		// unchecked
		
		$(".imageplatformid[value='" + $(elem).val() + "']").closest("div").hide();
		$("#campaignimageswrapper .campaignimageplatform" + $(elem).val()).closest(".campaignimagewrapper").hide();
		
		Moblico.triggerAddImageForm();
		
		/*
		// hide the current image if same platform id
		if($(".platformdropdown:first").val() == val) {
			$(".platformdropdown option:first").attr("selected", true);
			Moblico.toggleNewBanner(null);
		}
		
		$(".platformdropdown option[value='" + val + "']").remove();
		jQuery.each($(".imagerelwrapper"), function(i, img) {
			var pid = $(img).metadata().platformId;
			if(pid == val) {
				$(img).hide();
			}
		});
		*/
		
		function regAutoDeleteImage(elem) {
			
			var platformId = $(elem).metadata().platformId;
			var imageTypeId = $(elem).metadata().imageTypeId;
					
			Moblico.saveCampaignCallback = function() {
				
				// delete this image and submit the form
				Moblico.toggleEditBanner(elem);
				
				$("select.platformdropdown").attr("disabled", false);
				if($("select.platformdropdown option[val='" + platformId + "']").length < 1) {
					$("select.platformdropdown").append("<option value='" + platformId + "' class='tmpoption'></option>");
				}
				
				$("select.imagetypedropdown").attr("disabled", false);
				$("select.imagetypedropdown").show();
				
				if($("select.imagetypedropdown option[val='" + imageTypeId + "']").length < 1) {
					$("select.imagetypedropdown").append("<option value='" + imageTypeId + "' class='tmpoption'></option>");
				}
				
				$("select.platformdropdown").val(platformId);
				$("select.imagetypedropdown").val(imageTypeId);
				$(".deletebannerimage:last").attr("checked", true);
				
				document.getElementById("mainform").target = "tmpformiframe";
				Moblico.saveDeleteCampaignImage = true;
				
			} // Moblico.saveCampaignCallback
			
			Moblico.saveCampaignCallbackAfter = function() {
				$("select.platformdropdown, select.imagetypedropdown").find(".tmpoption").remove();
				$(elem).remove();
				
				Moblico.saveDeleteCampaignImage = false;
				Moblico.resetEditImageRel();
				Moblico.toggleNewBanner(null);
				Moblico.saveCampaignCallback = null;	
			}
			
			$("#mainform").submit();
			
			// this gets called after submit
			if(Moblico.saveDeleteCampaignImage == true) {
				$("select.platformdropdown, select.imagetypedropdown").find(".tmpoption").remove();
				$(elem).remove();
				
				Moblico.saveDeleteCampaignImage = false;
				Moblico.resetEditImageRel();
				Moblico.toggleNewBanner(null);
				Moblico.saveCampaignCallback = null;	
			} // Moblico.saveDeleteCampaignImage == true
			
		} // regAutoDeleteImage
		
		if(autodeleteimage == true) {
			jQuery.each($(".imagerelwrapper"), function(i, elem) {			
				var platformId = $(elem).metadata().platformId;
				if(platformId == val) {
					regAutoDeleteImage(elem);
				}
			});
		}
		
	}
}

Moblico.regCouponPlatformRelCheckbox = function(selec, autodeleteimage) {
	
	if(!autodeleteimage) {
		autodeleteimage = false;	
	}
	
	$(selec).unbind("click");
	
	$(selec).click(function(ev) {
		Moblico.toggleCouponPlatformRelCheckbox(this, autodeleteimage);
	});
	
	jQuery.each($(selec), function(i, val) {
		Moblico.toggleCouponPlatformRelCheckbox(val);
	});
	
}

Moblico.regImagePlatformId = function(selector) {
	
	/*
	if more than 1 platform selected, find the common image types.
	otherwise, display image types of the 1 platform.
	*/
	
	$(selector).click(function(ev) {
			
		var platformid = $(this).val();
		
		// clear all image types from dropdown
		$("#imagetypeid option").remove();
		$("#imagetypeidinfo").html("");
		$("#imagetypeid").hide();
		
		if($(".imageplatformid:checked").length == 0) {
			$(".imageplatformid").attr("disabled", false);
			this.disabled = false;
			return;	
		} else {
			$(".imageplatformid").attr("disabled", true);
			this.disabled = false;
		}
		
		// alert(platformid);
		var mySpecs = {};
		// store selected platform's specs
		for(var wxh in imageSpecsMap[platformid]) {
			var idname = imageSpecsMap[platformid][wxh].split("__");
			mySpecs[wxh] = {id : idname[0], name : idname[1]};
			// alert(idname[1]);
		}
		
		var otherSpecs = new Array();
		
		// look for same from others
		for(var pid in imageSpecsMap) {
			if($(".imageplatformid[value='" + pid + "']").length == 0) {
				// checkbox for this, so skip it
				continue;
			} else if(pid == platformid) {
				// same as above, so skip it
				continue;
			}
			for(var wxh in imageSpecsMap[pid]) {
				var idname = imageSpecsMap[pid][wxh].split("__");
				if(wxh in mySpecs) {
					// same as the selected one
					// alert(pid + " : " + idname[1]);
					// is it visible?
					if($(".imageplatformid[value='" + pid + "']:last").closest(".imageplatformidwrapper").is(":visible")) {
						// check it and enable
						otherSpecs.push(wxh);
						$(".imageplatformid[value='" + pid + "']:last").attr("disabled", false);
					}
				}
			}
		}

		if($(".imageplatformid:checked").length == 1) {
			// 1 only so display all
			for(var wxh in mySpecs) {
				$("#imagetypeid").append("<option value='" + wxh + "'>" + mySpecs[wxh]["name"] + "</option>");
			}
		} else {
			// multiple selected, so only display common denoms
			for(var i = 0; i < otherSpecs.length; i++) {
				$("#imagetypeid").append("<option value='" + otherSpecs[i] + "'>" + mySpecs[otherSpecs[i]]["name"] + "</option>");
			}
		}
		
		$("#imagetypeidinfo").html($("#imagetypeid").val());
		// alert($("#imagetypeid").val());
		
		if($("#imagetypeid option").length > 1) {
			// if more than one option, display it
			$("#imagetypeid").show();
		}
		
	}); // $(".imageplatformid").click(function(ev) 
	$("#imagetypeid").hide();
	// end image setup stuff	
	
	$("#addimageform").ajaxForm({
		beforeSubmit : function(odata, oform, opt) {
			
			if($(".imageplatformid:checked").length == 0) {
				alert("Please select a platform for this image.");	
				return false;
			}
			
			if($(oform).find("input[name='campaign_id']").length > 0) {
				// is a campaign, so check the actions
				var formelem = $(oform).get(0);
				var clickToUrl = formelem.campaign_click_to_url;
				var clickToCall = formelem.campaign_click_to_call;
				
				if($(oform).find("input[name='banner_type']:checked").val() == 'click_to_url') {
					if(!Moblico.validateUrl(clickToUrl.value, clickToUrl, null) || clickToUrl.value == '') {
						alert("Please enter a valid website address.");
						return false;
					}
				} else if($(oform).find("input[name='banner_type']:checked").val() == 'click_to_call') {
					if(!Moblico.validatePhone(clickToCall.value, clickToCall, null) || clickToCall.value == '') {
						alert("Please enter a valid phone number.");
						return false;
					}
				} else {
						
				}
			} // check action values
			
			if(!MoblicoUtil.isFileImage($(oform).find("input[name='image']:first"))) {
				alert("Please upload a .jpg image.");
				return false;
			}
			if($("#imagetypeid option").length == 0) {
				alert("The platform you selected currently does not support images.");
				return false;
			}
			var platformIds = new Array();
			jQuery.each($(".imageplatformid:checked"), function(i, elem) {
				platformIds.push($(elem).val());
			});
			$("#image_platform_id_list").val(platformIds.join(","));
			return true;
		},
		success : function(response) {
			$("#campaignimageswrapper").html(response);
			$(".imageplatformid").attr("checked", false);
			var selectedPlatforms = $("#image_platform_id_list").val();
			selectedPlatforms = selectedPlatforms.split(",");
			// alert(selectedPlatforms);
			for(var i = 0; i < selectedPlatforms.length; i++) {
				if($("#campaignimageswrapper select[name='platform_id'] option[value='" + selectedPlatforms[i] + "']:selected").length > 0) {
					// it was added, so clear it!
					$(".imageplatformid[value='" + selectedPlatforms[i] + "']").attr("checked", false);
				} else {
					$(".imageplatformid[value='" + selectedPlatforms[i] + "']").attr("checked", true);
				}
			}
			$("#image_platform_id_list").val("");
			Moblico.registerCampaignImagesWrapper(response);
		}
	});
	
} // Moblico.regImagePlatformId

Moblico.registerCampaignImagesWrapper = function(response) {
	
	$(".deleteimage").click(function(ev) {
		var conf = confirm("Would you like to delete this image?");								 
		if(!conf) {
			return false;
		}
		var url = "";
		if($(this).metadata().campaign_id) {
			var campaignId = $(this).metadata().campaign_id;
			var campaignImageRelId = $(this).metadata().campaign_image_rel_id;
			url = Moblico.servletUri + "?action=deleteCampaignImage&campaign_id=" + campaignId + "&campaign_image_rel_id=" + campaignImageRelId;
		} else {
			var campaignId = $(this).metadata().gift_id;
			var campaignImageRelId = $(this).metadata().gift_image_rel_id;
			url = Moblico.servletUri + "?action=deleteGiftImage&gift_id=" + campaignId + "&gift_image_rel_id=" + campaignImageRelId;	
		}
		
		jQuery.get(url, {}, function(response) {
			$("#campaignimageswrapper").html(response);
			Moblico.registerCampaignImagesWrapper(response);						 
			$(".imageplatformid").attr("checked", false);
		});
	});
	
	$(".editimage").click(function(ev) {
		if($(this).metadata().campaign_id) {
			var campaignId = $(this).metadata().campaign_id;
			var campaignImageRelId = $(this).metadata().campaign_image_rel_id;
			$("#editimagewrapper" + campaignImageRelId).toggle();
			$("#imagetitle" + campaignImageRelId).toggleClass("expanded");
		} else {
			var campaignId = $(this).metadata().gift_id;
			var campaignImageRelId = $(this).metadata().gift_image_rel_id;
			$("#editimagewrapper" + campaignImageRelId).toggle();
			$("#imagetitle" + campaignImageRelId).toggleClass("expanded");
		}
	});
	
	$(".editimageform").ajaxForm({
		beforeSubmit : function(odata, oform, opt) {
			var filename = $(oform).find("input[name='image']:first").val();
			
			// right now, if module is set, it is a coupon
			if(!MoblicoUtil.isFileImage($(oform).find("input[name='image']:first")) && (filename || $(oform).metadata().module)) {
				// check if image is present
				// alert("Please upload a .jpg image.");
				// return false;
			}
			
			if($(oform).find("input[name='campaign_id']").length > 0) {
				// is a campaign, so check the actions
				var formelem = $(oform).get(0);
				var clickToUrl = formelem.campaign_click_to_url;
				var clickToCall = formelem.campaign_click_to_call;
				
				if($(oform).find("input[name='banner_type']:checked").val() == 'click_to_url') {
					if(!Moblico.validateUrl(clickToUrl.value, clickToUrl, null) || clickToUrl.value == '') {
						alert("Please enter a valid website address.");
						return false;
					}
				} else if($(oform).find("input[name='banner_type']:checked").val() == 'click_to_call') {
					if(!Moblico.validatePhone(clickToCall.value, clickToCall, null) || clickToCall.value == '') {
						alert("Please enter a valid phone number.");
						return false;
					}
				} else {
						
				}
			} // check action values
			
			return true;
		},
		dataType : "json",
		success : function(response) {
			var responseMessage = MoblicoUtil.htmlDecode(response.message);
			responseMessage = responseMessage.replace(/<br \/>/g, "\n");
			if(response.status != "OK") {
				alert(responseMessage);	
			} else {
				var itemId = response.payload;
				if(document.getElementById("campaign_id")) {
					jQuery.get(Moblico.servletUri + "?action=viewCampaignImages&campaign_id=" + itemId + "&systemMessage=" + responseMessage, {}, function(response) {
						$("#campaignimageswrapper").html(response);
						Moblico.registerCampaignImagesWrapper(response);																		 
					});
				} else {
					jQuery.get(Moblico.servletUri + "?action=viewGiftImages&gift_id=" + itemId + "&systemMessage=" + responseMessage, {}, function(response) {
						$("#campaignimageswrapper").html(response);
						Moblico.registerCampaignImagesWrapper(response);																					 
					});
				}
			}
			// $("#campaignimageswrapper").html(response);
			// 
		}
	});
	
	jQuery.each($("#campaignimageswrapper input[name='banner_type']"), function(i, val) {
		Moblico.regDisableCheckbox(val, true);
	});
	
	function displayPlatformSpecs(elem) {
		var specs = $(elem).find("option:selected").metadata().specs;
		$(elem).closest(".campaignimagewrapper").find(".platform_id_specs").html(specs);
	}
	
	jQuery.each($("#campaignimageswrapper select[name='platform_id']"), function(i, elem) {
		$(elem).change(function(ev) {
			displayPlatformSpecs(this);						
		});
		displayPlatformSpecs(elem);
	});
	
	MoblicoUtil.regNumericField("#campaignimageswrapper .numericfield");
	
	$(".imageplatformidwrapper").hide();
	
	Moblico.triggerAddImageForm();
	
	Moblico.regCouponPlatformRelCheckbox(".platformrelcheckbox");
	
}

Moblico.toggleAddImageForm = function() {
	var availPlatforms = 0;
	jQuery.each($(".imageplatformid"), function(i, elem) {
		
		var platformid = $(elem).val();
		if(!imageSpecsMap[platformid]) {
			// no image type, so disable this guy
			$(elem).closest("div").hide();
			$(elem).attr("disabled", true);
			return;
		}
		
		if($("#campaignimageswrapper .campaignimageplatform" + platformid).length == 0 && $(".platformrelcheckbox[value='" + $(elem).val() + "']:checked").length > 0) {
			// no image yet and supported platform, so show checkbox
			$(elem).attr("disabled", false);
			availPlatforms++;
		} else {
			$(elem).attr("disabled", true);
		}
	});
	
	jQuery.each($("#campaignimageswrapper select[name='platform_id'] option"), function(i, elem) {
		var pid = $(elem).val();
		if($(".platformrelcheckbox[value='" + pid + "']:checked").length == 0) {
			// not supported paltform, so disable
			$(elem).attr("disabled", true);
		} else {
			$(elem).attr("disabled", false);	
		}
	});
	
	$("#campaignimageswrapper select[name='platform_id']").unbind("click");
	
	$("#campaignimageswrapper select[name='platform_id']").click(function(ev) {
		var opid = $(this).metadata().platform_id;
		var pid = $(this).val();
		if($(".platformrelcheckbox[value='" + pid + "']:checked").length == 0) {
			// not supported
			alert("You currently don't have this as a selected platform.");
			$(this).val(opid);
		}
	});
	
	/*
	jQuery.each($(".platformrelcheckbox"), function(i, elem) {
		var checked = $(elem).is(":checked");
		var pid = $(elem).val();
		var name = $(elem).metadata().name;
		var desc = $(elem).metadata().description;
		if(!desc) {
			desc = name;	
		}
		if(checked) {
			// checked!
			jQuery.each($("#campaignimageswrapper select[name='platform_id']"), function(pi, pelem) {
				// if does not exist, add it!
				if($(pelem).find("option[value='" + pid + "']").length == 0 && imageSpecsMap[pid]) {
					$(pelem).append("<option value='" + pid + "'>" + desc + "</option>");
				}
			});
		} else {
			jQuery.each($("#campaignimageswrapper select[name='platform_id']"), function(pi, pelem) {
				$(pelem).find("option[value='" + pid + "']").remove();
			});
		}
	});
	*/
	
	if(availPlatforms < 1) {
		// hide file
		$("#addimageform").hide();
	} else {
		$("#addimageform").show();
	}
	
	// if no other platforms are selected, display imagenoplatforms
	if($(".platformrelcheckbox:checked").length == 0) {
		$("#imagenoplatforms").show();
	} else {
		$("#imagenoplatforms").hide();
	}
}

Moblico.triggerAddImageForm = Moblico.toggleAddImageForm;

Moblico.validateAge = function(val, elem, params) {
	val = parseInt(val, 10);
	if(val >= 12 && val <= 120) {
		return true;
	}
	return false;
}

Moblico.validateProductPrice = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var price = $(elem).val();
	price = price.replace(",", "");
	var pattern = /^[0-9]{1,4}(\.[0-9]{1,2})?$/i;
	var res = price.match(pattern);
	if(res) {
		$(elem).val(price);
	}
	return res;
}

Moblico.validateLatlon = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var price = $(elem).val();
	var pattern = /^-?[0-9]{1,6}(\.[0-9]{1,15})?$/i;
	var res = price.match(pattern);
	if(res) {
		$(elem).val(price);
	}
	return res;
}

Moblico.validateUrl = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var pattern = /^(https?|ftp):\/\/[a-zA-Z0-9\-.]+\.[a-zA-Z0-9]+.*/i;
	return val.match(pattern);
}

Moblico.validatePhone = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var pattern = /^[0-9]{10,15}$/i;
	return val.match(pattern);
}

Moblico.validateEmail = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var pattern = /^[a-zA-Z.\-_0-9]+@[a-zA-Z.\-_0-9]+\.[a-z]+$/i;
	return val.match(pattern);
}

Moblico.validateZipcode = function(val, elem, params) {
	if(val == "") {
		return true;	
	}
	var pattern = /^[0-9]{5}$/i;
	return val.match(pattern);
}

Moblico.validateDateFormat = function(val, elem, params) {
	pattern = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/i;
	var patternok = val.match(pattern);
	if(!patternok) {
		return false;	
	}
	if(val.indexOf("00/") >= 0) {
		return false;	
	}
	if(val.indexOf("/000") >= 0) {
		return false;	
	}
	if(patternok) {
		var parts = val.split("/");
		var month = parseInt(parts[0], 10);
		var day = parseInt(parts[1], 10);
		var year = parseInt(parts[2], 10);
		if(month > 12) {
			return false;
		}
		if(day > 31) {
			return false;
		}
	}
	
	// check for 28/29/30 days
	var dateo = new Date(year, month - 1, day, 1, 1, 1);
	if(dateo.getMonth() != (month - 1)) {
		return false;
	}
	return patternok;
}

Moblico.validateSubkeywordFormat = function(val, elem, params) {
	if(val == "") {
		return true;	
	}
	val = MoblicoUtil.trimSpaces(val);
	$(elem).val(val);
	pattern = /^[a-zA-Z0-9]{1,}$/i;
	return val.match(pattern);
}

Moblico.validateStartEndDate = function(val, elem, params) {
	var edate = val.split("/");
	var startdate = $(elem).metadata().startdate;
	var sdatefld = document.getElementById(startdate);
	var sdate = $(sdatefld).val().split("/");
	var txtedate = edate[2] + "" + edate[0] + "" + edate[1];
	var txtsdate = sdate[2] + "" + sdate[0] + "" + sdate[1];
	var res = txtedate >= txtsdate;
	return res;
}

Moblico.validateLaterDate = function(val, elem, params) {
	
	var hourfield = $(elem).metadata().hourfield;
	var minutefield = $(elem).metadata().minutefield;
	var ampmfield = $(elem).metadata().ampmfield;
	var date = $(elem).val();
	
	var hour = '23';
	var minute = '59';
	var ampm = 'PM';
	
	if(document.getElementById(hourfield)) {
		hour = document.getElementById(hourfield).value;
	}
	if(document.getElementById(minutefield)) {
		minute = document.getElementById(minutefield).value;
	}
	if(document.getElementById(ampmfield)) {
		ampm = document.getElementById(ampmfield).value;
	}
	
	return GabeUtil.isLaterDate(
			val,
			hour, 
			minute, 
			ampm);
}

Moblico.validateNotEmpty = function(val, elem, params) {
	if(!val || val == '') {
		val = 0;	
	}
	return parseInt(val) > 0;
}

Moblico.validateAllowGroupReply = function(val, elem, params) {
	// alert($("input[name='guest_phone_list']:checked").length);
	if($(elem).is(":checked") == true && $("input[name='guest_phone_list']:checked").length > 0) {
		return false;	
	}
	return true;
}

Moblico.validateNameFormat = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	val = MoblicoUtil.trimSpaces(val);
	$(elem).val(val);
	// don't allow numeric
	var numeric = /^[0-9 .\-']{1,}$/i;
	if(val.match(numeric)) {
		return false;
	}
	// check only alphanumeric
	var pattern = /^[a-zA-Z]+$/i;
	return val.match(pattern);
}

Moblico.validateLaxNameFormat = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var pattern = /^[a-zA-Z0-9]+[a-zA-Z0-9\-. ]+$/i;
	return val.match(pattern);
}

Moblico.validateMessageNameFormat = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var pattern = /^[a-zA-Z0-9\- ]+$/i;
	return val.match(pattern);
}

Moblico.validateEmailSubjectFormat = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	var pattern = /^[a-zA-Z0-9!@#\$%\^&*()_\-+'\?\:. ]+$/i;
	return val.match(pattern);
}

Moblico.validateStreetFormat = function(val, elem, params) {
	if(val == "") {
		return true;
	}
	// don't allow numeric
	var numeric = /^[0-9 .\-']{1,}$/i;
	if(val.match(numeric)) {
		return false;
	}
	// check only alphanumeric
	var pattern = /^.+[a-zA-Z0-9]+.?$/i;
	return val.match(pattern);
}

Moblico.errorPlacement = function(error, elem) {
	var ref = elem;
	if($(elem).next().get(0)) {
		// alert($(elem).next().get(0).tagName);
		if(	$(elem).next().get(0).tagName.toLowerCase() == 'input' || 
			$(elem).next().get(0).tagName.toLowerCase() == 'img'
			) {
			ref = $(elem).next();
		}
	}
	
	$(ref).after(error);
	$(error).css("clear", "left").css("display", "block");	
	if($(elem).prev().hasClass("narrow")) {
		$(error).addClass("nolabel narrow");
	}
	$(error).before("<div class='clearboth'></div>");
	$(error).after("<div class='clearboth'></div>");
	$(ref).closest(".contentbody").show();
	// alert($(elem).closest("div").html());
}