

Dialog = function() {};

Dialog.ERROR = -1;
Dialog.WARNING = 1;
Dialog.NOTICE = 2;
Dialog.INFO = 4;

Dialog.show = function (message, type, timeout, modal, title) {
	$('#dialog').find('.message').html(message);
	
	$('#dialog').dialog({
		modal: true, 
		draggable: false,
		resizable: false
	});
	
	$('#dialog').dialog('open');
	
	
	// if there's a jqm already up, we want the dialog above it.
	$('#dialog')
		.parents().filter('.ui-dialog')
		.css('z-index', 5003);
	$('.ui-widget-overlay')
		.css('z-index', 5002);
	
	// ...then undo the z-index when dialog closes
	$('#dialog').bind('dialogclose', function (e){
		$('.ui-widget-overlay')
			.css('z-index', 1001);
		Webonyx.unblockScreen();
	});
	
	var button = $('#dialog').find('.buttons button.ok'); 
	button.bind('click', function (){$('#dialog').dialog('close');} );
	button.focus();
};

FeedbackForm = function () {};

FeedbackForm.show = function() {
	  $('#feedback-dialog').dialog({
	      modal: true, 
	      draggable: false,
	      resizable: false,
	      title: 'Submit Feedback',
	      width: 350
	  });

	  $("#feedback-dialog").dialog('open');

	  var form = $("#feedback-dialog").find('form');
	  // Unbind from normal validator submit event.
	  // We want to do this manually so we can close the window at the
	  // right time.
	  form.unbind();
	  form.bind("submit", function(e) {
		  e.preventDefault();
		  if(Webonyx.form.validate($(this))) {
				if( $(this).attr("feedback") == "blockScreen" ) {
					Webonyx.blockScreen(null, false, true);
				}
				var callback =  Webonyx.defaultCallback;
				$.post($(this).attr('action'), $(this).serialize(), callback, "json");
				
				$("#feedback-dialog").dialog('close');
		  }
	  });
};

/**
 * Auto attachments
 */
$(document).ready(function(){
	$("form").each(Webonyx.initForm);
	$("[enablerFor]").bind('change', Webonyx.toggleEnable);
	$("[toggle]").bind('click', Webonyx.expander);
	$("table[sortable=true]").each(Webonyx.sortable);
});

Webonyx = function() {};

//Essentially lets a checkbox enabled/disable another element
Webonyx.toggleEnable = function(e) {
	var check = $(this);
	var targetId = check.attr('enablerFor');
	var target = $('#'+targetId);
	
	target.attr('disabled', !check.attr('checked'));
	if (target.attr('disabled') && target.attr('type') == 'checkbox') {
		target.attr('checked', false);
	}
	if ($(target.parents('form')).attr('validate') == 'true' && target.attr('disabled')) {
		Webonyx.form.validateField(target);
	}
};

Webonyx.expander = function(e) {
	var el = $(this);
	var icon = el.find('div');
	var stat = icon.attr('class');
	var cont = $('#' + el.attr('toggle'));
	if(stat == 'expand') {
		icon.attr('class', 'collapse');
		Webonyx.cookie.create('xc-' + el.attr('toggle'), 'expanded', 365);
	} else {
		icon.attr('class', 'expand');
		Webonyx.cookie.create('xc-' + el.attr('toggle'), '', -1);
	}
	
	cont.toggle();
};

Webonyx.sortable = function(e) {
	$(this).tablesorter();
};

// Error dialog handling
Webonyx.ajax = {
	isError : function( r ) {
		if( r.status == -1 ) {
			Dialog.show(r.message, Dialog.ERROR);
			return true;
		} else {
			return false;
		}
	}
};

// Webonyx validators
Webonyx.form = function() {};

Webonyx.form.toggleErrorMessage = function( el, msg, on ) {
	$(el).next(".validate-error").remove();
	if (on) {
		$(el).after('<div class="validate-error">' + msg + '</div>');
	}
};

// All available form validators
Webonyx.form.validators = {
	required : function( el ) {
		var result = false;
		
		if(el.val() != null) {
			if($.isArray(el.val())) {
				result = (el.val().length > 0);
			} else {
				result = (jQuery.trim(el.val()) != "");				
			}
		}
		
		if (el.attr('disabled')) {
			result = true;
		}
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	email : function( el ) {
		if (jQuery.trim( el.val() ) == '') {
			return true;
		}

		var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		var result = filter.test( el.val() );
		Webonyx.form.toggleErrorMessage( el, "Please provide a valid email address", !result );
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	date : function ( el ) {
		if (jQuery.trim( el.val() ) == '') {
			Webonyx.form.toggleErrorMessage( el, 'Please provide a valid date in form of mm/dd/yyyy', false);
			el.toggleClass('validate-error', false);
			return true;
		}
		
		var filter = /(^(((0[1-9])|(1[0-2]))|([1-9]))\x2F((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)/;
		var result = filter.test( el.val() );
		Webonyx.form.toggleErrorMessage( el, 'Please provide a valid date in form of mm/dd/yyyy', !result);
		el.toggleClass('validate-error', !result);
		return result;
	},
	
	dob : function( el ) {
		if (jQuery.trim( el.val() ) == '') {
			Webonyx.form.toggleErrorMessage( el, 'Please provide a valid date in form of mm/dd/yyyy', false);
			el.toggleClass('validate-error', false);
			return true;
		}
		
		var filter = /(^(((0[1-9])|(1[0-2]))|([1-9]))\x2F((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)/;
		var result = filter.test( el.val() );
		Webonyx.form.toggleErrorMessage( el, 'Please provide a valid date in form of mm/dd/yyyy', !result);
		el.toggleClass('validate-error', !result);
		return result;
	},
	
	phone : function ( el ) {
		var result = true;
		if (jQuery.trim( el.val() ) == '') {
			return result;
		}

		var filter = /^[0-9]{10,11}$/;
		var phone = el.val().replace(/[^0-9]/g, '');
		result = filter.test( phone );
		
		phone = phone.substring(phone.length - 10, phone.length);
		if(el.val().length > 9) {
			el.val("(" + phone.substring(0,3) + ") " + phone.substring(3, 6) + "-" + phone.substring(6,10));
		}
		Webonyx.form.toggleErrorMessage( el, "Please provide a valid phone number", !result );
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	match : function ( el ) {
		var matchers = [];
		var frm = $(el).parents('form:first');
		var elems = $(frm).find('[validator]');
		for (var i = 0; i < elems.length; i++) {
			var vld = $(elems[i]).attr("validator").split(";");
			for(var v in vld) {
				if (vld[v] == 'match') {
					matchers.push(elems[i]);
				}
			}
		
		}
		
		var valid = true;
		for (var m = 1; m < matchers.length; m++) {
			if (matchers[m].value != matchers[m-1].value) {
				valid = false;
				
			}
		}
		for (var m = 0; m < matchers.length; m++) {
			Webonyx.form.toggleErrorMessage( matchers[m], 'All confirm fields must match their partner.', !valid);
		}
		return valid;
	},
	
	ccdate : function( el ) {
		var result = true;
		if (jQuery.trim( el.val() ) == '') {
			return result;
		}

		var result = el.val().match(/^\d{2}\/\d{4}$/);
		
		Webonyx.form.toggleErrorMessage( el, "Please provide a valid date in form of mm/yyyy", !result );
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	requireOne : function( el ) {
		var result = false;
		var name = $(el).attr('name');
		var checks = $('[name="'+name+'"]');
		for (var i = 0; i < checks.length; i++) {
			if ($(checks[i]).attr('checked')) {
				result = true;
			}
		}
		
		Webonyx.form.toggleErrorMessage( checks[0], "At least one checkbox must be checked", !result );
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	numeric : function( el ) {
		if (jQuery.trim( el.val() ) == '') {
			return true;
		}

		var result = !isNaN( el.val() );
		Webonyx.form.toggleErrorMessage( el, "Please provide a numeric value", !result );
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	numericPositive : function( el ) {
		if (jQuery.trim( el.val() ) == '') {
			return true;
		}

		var result = !isNaN( el.val() ) && el.val() >= 0;
		
		Webonyx.form.toggleErrorMessage( el, "Please provide a numeric value that is greater than 0", !result );
	
		el.toggleClass("validate-error", !result);
		return result;
	},
	
	currency : function( el ) {
		if (jQuery.trim( el.val() ) == '') {
			el.val('$0.00');
		}
		
		var result = el.val().match(/([\d]+)(\.\d{2})?/);
		
		if(result && !result[2])
			result[2] = '.00';
		
		if(result) {
			el.val('$' + result[1] + result[2]);
		}
		
		Webonyx.form.toggleErrorMessage( el, "Please provide a valid dollar ammount", !result );
		el.toggleClass("validate-error", !result);
		
		return result;
	},
	
	username : function(el) {
		var val = el.val();
		var result = true;		
		
		if(val.match(/[^\w]/)) {
			result = false;
		}
		
		if (val.length < 8) {
			result = false;
		}
		Webonyx.form.toggleErrorMessage( el, "Your username can only contain alphanumeric characters and must be at least 8 characters long", !result );
		el.toggleClass("validate-error", !result);
		
		return result;
		
	}
	
};

// Validates an entire form
Webonyx.form.validate = function( frm, cb ) {

	var valid = true;
	if ($(frm).attr('validate') != "true") {
		return valid;
	}
	
	$(frm).find("*[validator]").each(function() {
		valid = Webonyx.form.validateField( $(this) ) ? valid : false;
	});
	
	if (Webonyx.form.fckEditor) {
		var text = Webonyx.util.trim(Webonyx.form.fckEditor.GetHTML());
		//Couldn't figure out where the startup value was config'd and it starts with a BR
		if (text == '' || text == '<br>' || text == '<br />') {
			$('#fckError').html('<strong>Body must have text</strong>');
			valid = false;
		}
	}
	return valid;
	
};

// Validates a form element
Webonyx.form.validateField = function( el ) {
	var valid = true;
	var vld = el.attr("validator").split(";");
	
	for(var v in vld) {
		// Added && valid at the end, otherwise the last validator wins the battle.
		// This makes it so all validators must eval to true to return true, not just the last one.
		eval("valid = (Webonyx.form.validators." + vld[v] + "( el ) && valid);");
	}
	
	return valid;
};

Webonyx.form.fckEditor = null;

// Prepares the Ajax call
Webonyx.initForm = function() {
	var frm = $(this);
	
	if(frm.attr("validate") == 'true') {
		
		//TODO: This should auto add a date picker image and the a popup calendar for date fields
		frm.find('[validator]').each(function() {
			var field = $(this);
			var vld = field.attr("validator").split(";");
			var required = false;
			var dateField = false;
			
			for(var v in vld) {
				if (vld[v] == 'date') {
					dateField = true;
				}
				if (vld[v] == 'required') {
					required = true;
				}
			}
			
			if (required) {
				var id = $(this).attr("id");
				var label = $(frm).find('[for="' + id + '"]');
				label.html(label.html() + " <span class=\"required\">*</span>");
			}

			if(dateField) {
				field.datepicker({
					clickInput:true,
					dateFormat:'mm/dd/yy',
					showAnim: 'slide'
				});
			}
			
			if ( field.attr('validateOn') != 'submitOnly') {
				field.bind("blur", function(e) {
					Webonyx.form.validateField( $(this) );
				});
			}
		});
		
		frm.find('input[redirect], button[redirect]').bind("click", function(e) {
			e.preventDefault();
			Webonyx.blockScreen(null, false, true);
			window.location.href = $(this).attr("redirect");
		});
		
		frm.find('input[back], button[back]').bind("click", function(e) {
			e.preventDefault();
			history.go(-1);
		});
		
		$(this).bind("submit", function(e) {

			if( $(this).attr("formType") == "ajax" ) {
				e.preventDefault();
				if ( Webonyx.form.validate($(this)) ) {
					if( $(this).attr("feedback") == "blockScreen" ) {
						Webonyx.blockScreen(null, false, true);
					}
					var callback =  ($(this).attr('callback')) ? eval($(this).attr('callback')) : Webonyx.defaultCallback;
					$.post($(this).attr('action'), $(this).serialize(), callback, "json");
				}
			} else {
				if (!Webonyx.form.validate($(this))) {
					e.preventDefault();
				}
				else 
				{
					if( $(this).attr("feedback") == "blockScreen" ) {
						Webonyx.blockScreen(null, false, true);
					}
				}
			}
		});
	}
};


Webonyx.blockScreen = function (message, fadeOut, fadeIn)
{
	if (!message) {
		message = 'Processing...';
	}

	if (!fadeOut) {
		fadeOut = 0;
	}
	else {
		fadeOut = 400;
	}
	
	if (!fadeIn) {
		fadeIn = 0;
	}
	else {
		fadeIn = 400;
	}
	
    $.blockUI({
    	css: { 
	        border: 'none', 
	        padding: '15px', 
	        backgroundColor: '#000', 
	        '-webkit-border-radius': '10px', 
	        '-moz-border-radius': '10px', 
	        opacity: .5, 
	        color: '#fff',
	        'font-size':'12pt',
	        'font-weight':'bold'
    	},
    	message: message,
    	fadeOut: fadeOut,
    	fadeIn: fadeIn
    });
    
};

Webonyx.unblockScreen = function () {
	$.unblockUI();
};

// If <form>.callback is not specified this will be called
Webonyx.defaultCallback = function(r) {
	if (Webonyx.ajax.isError(r)) {
		Dialog.show(r.message, Dialog.NOTICE);
	} else {
		if (r.message.length > 0) {
			Webonyx.blockScreen(r.message, true, false);	
		} else {
			Webonyx.blockScreen('Done', true, false);
		}
	}
	setTimeout(Webonyx.unblockScreen, 1000);
};

Webonyx.cookie = function () {};

Webonyx.cookie.create = function (name, value, days) {
	
	if (days) 
	{
	    var date = new Date();
	    date.setTime(date.getTime()+(days*24*60*60*1000));
	    var expires = "; expires="+date.toGMTString();
	}
	else 
	{
	    var expires = "";
	}
	document.cookie = name+"="+value+expires+"; path=/";
};

Webonyx.cookie.read = function () {
	        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
};

Webonyx.util = function(){};

Webonyx.util.trim = function (str){
	return str.replace(/^\s+|\s+$/g, '');
};

Webonyx.util.reload = function() {
	window.location.href = window.location.href;
};

Webonyx.util.redirect = function(href) {
	window.location.href = href;
};

Webonyx.util.toggleShowReplies = function(link) {
	link = $(link);
	var id = link.attr('childrenId');
	var elem = $('#children'+id);
	
	if (elem.is(":hidden")) {
		elem.slideDown("fast");
		link.html('Hide Replies');
	} else {
		elem.slideUp("fast");
		link.html('Show Replies');
	}
};

//2009-03-20
(function($){

$.fn.extend({

	/**
	 * Stores the original version of offset(), so that we don't lose it
	 */
	_offset : $.fn.offset,
	
	/**
	 * Set or get the specific left and top position of the matched
	 * elements, relative the the browser window by calling setXY
	 * @param {Object} newOffset
	 */
	offset : function(newOffset){
	    return !newOffset ? this._offset() : this.each(function(){
			var el = this;
			
			var hide = false;
			
			if($(el).css('display')=='none'){
				hide = true;
				$(el).show();
			};
			
			var style_pos = $(el).css('position');
			
			// default to relative
			if (style_pos == 'static') {
				$(el).css('position','relative');
				style_pos = 'relative';
			};
			
			var offset = $(el).offset();
			
			if (offset){
				var delta = {
					left : parseInt($(el).css('left'), 10),
					top: parseInt($(el).css('top'), 10)
				};
				
				// in case of 'auto'
				if (isNaN(delta.left)) 
					delta.left = (style_pos == 'relative') ? 0 : el.offsetLeft;
				if (isNaN(delta.top))
					delta.top = (style_pos == 'relative') ? 0 : el.offsetTop;
				
				if (newOffset.left || newOffset.left===0)
					$(el).css('left',newOffset.left - offset.left + delta.left + 'px');
			
				if (newOffset.top || newOffset.top===0)
					$(el).css('top',newOffset.top - offset.top + delta.top + 'px');
			};
			if(hide) $(el).hide();
		});
	}

});

})(jQuery);

$.fn.clearForm = function() {
  return this.each(function() {
    var type = this.type, tag = this.tagName.toLowerCase();
    if (tag == 'form')
      return $(':input',this).clearForm();
    if (type == 'text' || type == 'password' || tag == 'textarea')
      this.value = '';
    else if (type == 'checkbox' || type == 'radio')
      this.checked = false;
    else if (tag == 'select')
      this.selectedIndex = -1;
  });
};


