if(typeof loginDialogReady == 'undefined') {
  loginDialogReady = function() {}
}
if(typeof onDialogReady == 'undefined') {
  onDialogReady = function() {}
}

/*===================

	PHPs isset equivalent
=====================*/
	var isset = function() 
	{  
		var a=arguments; var l=a.length; var i=0;

		if (l==0) { 
			throw new Error('Empty isset'); 
		}

		while (i!=l) {
			if (typeof(a[i])=='undefined' || a[i]===null) { 
				return false; 
			} else { 
				i++; 
			}
		}
		return true;
	}

  $.fn.ajaxSidebar = function(options) {
    var o = $.extend({
      'default': null,
      'active': null,
      'target': 'ajaxSidebarTarget',
      'areas': {}
    }, options);
    
    $('a', this).addClass('inTarget').addClass('ajaxable');

  	$('a.inTarget').live('click', function(e) {
  	  $('#ajaxSidebar li').removeClass('selected');
  	  $(this).parents('li:first').addClass('selected');
  	  var src = $(this).attr('href');
  		$.get(src, function(response) {
  		  var jsonResponse = {};
  			if(response.substr(0, 1) == '{') {
  				jsonResponse = eval('(' + response + ')');
  			}

  			if(jsonResponse.redirect != undefined) {
  				window.location=jsonResponse.redirect;
  			} else {
  				$('#'+o.target).data('src', src).html(response);
  				$('a.inTarget').addClass('ajaxable');
  			}
  			
  		});
  		e.preventDefault();
  	});
    
    if(typeof o.areas[o.active] != 'undefined') {
      $('#'+o.areas[o.active]).click();
    } else if(typeof o.areas['default'] != 'undefined') {
      $('#'+o.areas['default']).click();
    }
  }

/*  =========================================================
 *  =========================================================
 *
 *	AjaxFrom wrapper
 ********************/
  // (function($) {
  	$.fn.formation = function(settings) {
  		var $form = $(this);

  		var options = settings;
      
      if($form.attr('method') != 'get') {
        $form.append('<input name="data[__ajaxForm]" value="1" type="hidden">');
      }
      
      successCallback = options.success ? options.success : function(response) {return true;}
      errorCallback = options.error ? options.error : function(response) {return true;}

      options.success = onSuccess
      options.error = onError

  		if(window.tinyMCE) {
  			$form.bind('form-pre-serialize', function() {
  				tinyMCE.triggerSave();
  			});
  		}
      
  		if($.fn.inlineLabel) {
    	  $form.find('input.inline-label, textarea.inline-label').inlineLabel();
  		}

      $form.ajaxForm(options);
  		return $form;
      
  		function onSuccess(response) {
         var jsonResponse = {};
         if(response.substr(0, 1) == '{') {
           jsonResponse = eval('(' + response + ')');
         }
        
        if(jsonResponse.redirect != undefined) {
          // $(options.target).html('Please wait a moment...');
          $(options.target).html('<img src="/img/loading.gif" />');
           window.location=jsonResponse.redirect;
        } else {         
          successCallback(response);

          if(!options.no_flash) {
           // flashMessages(response.flash);
           // highlightFlashMessages();
          }

          if(!options.no_clear) {
           // $form.clear();
          }

          if(!options.no_reset_errors) {
           // $form.clearErrors();
          }
          // mainLoader();
        }
  		}

  		function onError(response) {
  		  errorCallback(response);

  		  if(!options.no_errors) {
  		    $form.errors(response);
  		  }
  		}
  	}
  // })(jQuery);


/*===================

	Address plugin
=====================*/
  $.fn.address = function(options) {
  	options = $.extend({
  		country: '.countries',
  		state: '.states',
  		zip: "#ZipInput",
  		empty: false
  	}, options);

  	var 
  		form = this,
  		usStates = {
  			AL: 'Alabama', 
  			AK: 'Alaska', 
  			AZ: 'Arizona',
  			AR: 'Arkansas',
  			CA: 'California',
  			CO: 'Colorado',
  			CT: 'Connecticut',
  			DE: 'Delaware',
  			DC: 'District Of Columbia',
  			FL: 'Florida',
  			GA: 'Georgia',
  			HI: 'Hawaii',
  			ID: 'Idaho',
  			IL: 'Illinois',
  			IN: 'Indiana',
  			IA: 'Iowa',
  			KS: 'Kansas',
  			KY: 'Kentucky',
  			LA: 'Louisiana',
  			ME: 'Maine',
  			MD: 'Maryland',
  			MA: 'Massachusetts',
  			MI: 'Michigan',
  			MN: 'Minnesota',
  			MS: 'Mississippi',
  			MO: 'Missouri',
  			MT: 'Montana',
  			NE: 'Nebraska',
  			NV: 'Nevada',
  			NH: 'New Hampshire',
  			NJ: 'New Jersey',
  			NM: 'New Mexico',
  			NY: 'New York',
  			NC: 'North Carolina',
  			ND: 'North Dakota',
  			OH: 'Ohio',
  			OK: 'Oklahoma',
  			OR: 'Oregon',
  			PA: 'Pennsylvania',
  			RI: 'Rhode Island',
  			SC: 'South Carolina',
  			SD: 'South Dakota',
  			TN: 'Tennessee',
  			TX: 'Texas',
  			UT: 'Utah',
  			VT: 'Vermont',
  			VA: 'Virginia',
  			WA: 'Washington',
  			WV: 'West Virginia',
  			WI: 'Wisconsin',
  			WY: 'Wyoming'
  		},
  		caStates = {
  			AB: 'Alberta',
  			BC: 'British Columbia',
  			MB: 'Manitoba',
  			NB: 'New Brunswick',
  			NL: 'Newfoundland And Labrador',
  			NS: 'Nova Scotia',
  			NT: 'Northwest Territories',
  			NU: 'Nunavut',
  			ON: 'Ontario',
  			PE: 'Prince Edward Island',
  			QC: 'Quebec',
  			SK: 'Saskatchewan', 
  			YT: 'Yukon'
  		},
  		usCode,
  		caCode,
  		selectedCountry,
  		stateInput = $(options.state, form),
  		stateField = stateInput.attr('name')
  	;

  	$('option', options.country).each(function() {
  		var 
  			name = $(this).text(),
  			code = $(this).attr('value')
  		;
  		if(name == 'United States') {
  			usCode = code;
  		} else if(name == 'Canada') {
  			caCode = code;
  		}
  	});

  	function main() {
  		selectedCountry = $(options.country, form).val();
  		if(selectedCountry == usCode) {
  			stateInput.replaceWith(buildSelect(usStates)); 
  			if(options.zip) {
  				$(options.zip).parents('div:first').addClass('required');
  			}
  		} else if(selectedCountry == caCode) {
  			stateInput.replaceWith(buildSelect(caStates)); 
  			if(options.zip) {
  				$(options.zip, form).parents('div:first').addClass('required');
  			}
  		} else {
  			stateInput.replaceWith(buildTextInput()); 
  			if(options.zip) {
  				$(options.zip, form).parents('div:first').removeClass('required');
  			}
  		}
  	}

  	function buildSelect(items) {
  		var currentVal = stateInput.val() ? stateInput.val() : '';
  		stateInput = $('<select>').attr('name', stateField);

  		if(options.empty) {
  			var empty = options.empty === true ? ' ' : options.empty;
  			$('<option value="">').text(empty).appendTo(stateInput);
  		} 

  		for(code in items) {
  			$('<option>')
  				.attr('value', code)
  				.attr('selected', (currentVal.toLowerCase() == code.toLowerCase()) ? 'selected' : '')
  				.text(items[code])
  				.appendTo(stateInput);
  		}
  		return stateInput;
  	}

  	function buildTextInput() {
  		var currentVal = (stateInput.attr('tagName') == 'INPUT') ? stateInput.val() : '';
  		stateInput = $('<input type="text" name="'+stateField+'" value="'+currentVal+'" />');
  		return stateInput;
  	}

  	$(options.country, form).change(main);
  	main();
  	return form
  	;
  }
// end address plugin


/*===================

	Add a label to a text input
=====================*/
//(function($) {
	$.fn.inlineLabel = function(labelText) {
		$(this).each(function() {
			var _this = this;

			if(!labelText) {
				_this.labelText = $(this).attr('title');
			} else {
				_this.labelText = labelText;
			}

			$(this).parents("form:first").submit(function() {
				if($(_this).val() == _this.labelText) {
					$(_this).val("");
				}
			})

			var type = $(_this).attr("type");

			if( (!type || type != "text") && !$(_this).is('textarea')) {
				return $;
			}

			var $input = $(_this);

			$input.focus(function() {
				$input.css("color", "#333");
				if($(_this).val() == _this.labelText) {
					$(_this).val("");
				}
			});

			$input.blur(function() {
				check(_this);
			});

			function check(el) {
				val = $(el).val();
				if(val == "" || val == _this.labelText) {
					$(el).css("color", "#ccc").val(_this.labelText);
				} else {
					$(el).css("color", "#333");
				}
			}

			check(_this);
			return $;
		})
		return $(this);
	}
//})(jQuery);

/*===================

	Attach json error messages to cakephp form fields (deprecated)
=====================*/
	var attachErrorMessages = function(response, formSelector) 
	{
		var ids = [];
		$(response).each(function(i, field) {
			ids[i] = field.inputName;
			if(field.message) {
				// input = $(formSelector+" #"+field.id);
				input = $(formSelector+' :input[name="'+field.inputName+'"]');
				input.parents('div.input:first').addClass('error');
				if (input.siblings('.error-message').length > 0) {
					input.siblings('.error-message').html(field.message);
				} else {
					$('<div class="error-message">' + field.message + '</div>')
						.data('input.name', field.inputName)
						.insertAfter(input);
				}
			}
		});

		$("div.error-message").each(function(i, errorDiv){
			invalid = $.inArray($(errorDiv).data('input.name'), ids);
			if (invalid < 0) {
				$(errorDiv).parents('div.error:first').removeClass('error');
				$(errorDiv).fadeOut().remove();
			}
		});
	
		return ids.length;
	}


/*===================

	For delete links that submit forms
=====================*/
	var submitDelete = function(formId, itemId) 
	{
		$('#'+formId+'ItemId').val(itemId);
		$('#'+formId).submit();
		return false;
	}


/*===================

	Toggle an elements visibility (deprecated)
=====================*/
	var toggleView = function(selector) 
	{
		$(selector).toggle(selector);
		return false;
	}

/*===================

	PHP's function_exists() equiv
=====================*/
	var function_exists = function( function_name )
	{
		if (typeof function_name == 'string'){
			return (typeof window[function_name] == 'function');
		} else{
			return (function_name instanceof Function);
		}
	}

/*===================

	Jquery plugin to clear a form
=====================*/
	$.fn.clear = function() 
	{
	  return this.find(':input').each(function() {
		var type = this.type, tag = this.tagName.toLowerCase();
		if (tag == 'form')
		  return $(':input', this).clearForm();
		if (type == 'text' || type == 'password' || tag == 'textarea' || type == 'file')
		  this.value = '';
		else if (type == 'checkbox' || type == 'radio')
		  this.checked = false;
		else if (tag == 'select')
		  this.selectedIndex = 0;
	  });
	};


/*===================

	Loads a form in an area with an ajax call. Confirms first if the form has attr("dirty")
=====================*/
	var reloadForm = function(container, url) 
	{	
		var $container = $("#"+container);
		var $form = $('form', $container);

		if(isFormDirty($form)) {
			if(!confirm("You have made unsaved changes that will be lost. Continue anyway?")) {
				return false;
			}
		}

		$container.load(url, function() {
			$(":input", $container).data("dirty", false).change(function() {
				$("form", $container).data("dirty", true);
			});
		});
	
		return false;
	}

	function isFormDirty(form) {
		var mceDirty = false;

		if(isset('tinyMCE') && tinyMCE.activeEditor) {
			if(tinyMCE.activeEditor.isDirty()) {
				mceDirty = true;
			}
		}

		return ( $(form).data("dirty") || mceDirty );
	}

/*===================

	Called before submit on all ajax forms
=====================*/
	var formBeforeSubmit = function(data) {
		var token = { "name" : "data[__ajaxForm]", "value" : "1" };
		$('form').append('<input type="hidden" name="data[__ajaxForm]" value="1">');
	}

	
/*===================

	Called on form success on all ajax forms
=====================*/
	var formSuccess = function(response) {
		$("$('#flashMessage').hide().fadeIn('slow')");
		if($("#flashMessage").hasClass("success")) {
			setTimeout("$('#flashMessage').fadeOut('slow')", 5000);
		}
		$('form').find('input[name="data[__ajaxForm]"]').remove();
	}
	

/*===================

	Deprecated
=====================*/
	var hasError = function(text) 
	{
		return ( (text+"").indexOf( "flash-error") === -1) ? false : true;
	}


/*===================

	Count the number of words in a string
=====================*/
	var countWords = function(text) 
	{
		var strip = text.replace(/(<([^>]+)>)/ig,"");
		strip = strip.replace(/\s+/ig, " ");
		strip = strip.replace(/^\s+|\s+$/g,"")
		var count = strip.split(" ").length;
	
		if(strip == "") {
			count = 0;
		}
		return count;
	}


/*===================

	PHP's is_numeric function
=====================*/
	var is_numeric = function( mixed_var ) 
	{
		if (mixed_var === '') {
		  return false;
		}

		return !isNaN(mixed_var * 1);
	}


/*===================

	Replace ajaxable links and buttons with ajax loading text on click
=====================*/
	var attachAjaxEvents = function() 
	{
	  
	  $(document).delegate('input', 'keydown', function(e) {
      if (e.keyCode == 13) {
        $(this).parents('form').submit();
        return false;
      }
	  });
	  
    $(document).delegate('a.ajaxable, a.icon', 'click', function(ev) {
		  var el = $(this);

			if(el.hasClass('icon')) {
				var loadingText = '<img src="/img/16pxLoader.gif">';
			} else {
				var loadingText =  el.attr('data-loadingText') ? el.attr('data-loadingText') : 'Loading...';
			}

			var originalText = el.html();
			el.html(loadingText);

			el.ajaxStop(function() {
			  if(originalText != loadingText) {
  				el.html(originalText); 
			  }
			});
      ev.preventDefault();
		});

    $(document).delegate('form:not(.staticSubmits)', 'submit.testing', function(ev) {
      $(":submit", this).each(function() {
        var button = $(this);
        var loadingText = 'Submitting...';
        var originalText = button.attr('value');
       
        button.attr('value', loadingText).attr('disabled', 'disabled');
       
        button.ajaxStop(function() {
          if(originalText != loadingText) {
            button.attr(originalText);
          }
          button.attr('disabled', '');
        });
        $(window).unload(function() {
          if(originalText != loadingText) {
            button.attr(originalText);
          }
          button.attr('disabled', '');
        });
      });
      return true;
    });
		
		$(document).delegate('a.inDialog', 'click', function(e) {
		  e.preventDefault();
		  $.get($(this).attr('href'), function(response) {
  		  $(this).parents('.ui-dialog-content:first').html(response);
		  });
		});
	}



/*===================

	Main startup function called on every page load
=====================*/
	var mainFunction = function() 
	{
	  
	  $('span.tip').each(function() {
	    if($(this).hasClass('leftTip')) {
	      var align = 'left'; 
	    } else {
	      var align = 'right';
	    }
	    $(this).tooltip({
  			position: 'center ' + align,
  			events: {
  			  def:     "focus mouseenter,blur mouseleave",    // default show/hide events for an element
  			  input:   "focus mouseenter,blur mouseleave",               // for all input elements
  			  widget:  "focus mouseenter,blur mouseleave",  // select, checkbox, radio, button
  			  tooltip: "mousein,mouseout"     // the tooltip element
  			}
  		});
		});
	  
	  $('form :input').change(function() {
	    $(this).parents('form:first').data('changed', true);
	  });
	  
		$("a.button2").addClass("ui-corner-all");
		$('input.datepick').datepicker();
	
		$('form .clearForm').live('click', function(e) {
		  e.preventDefault();
		  $(this).parents('form:first')
		    .clear().end()
		    .find(':input[title]')
		      .inlineLabel()
		  ;
		});
		
		$('ul.adminList').delegate('li', 'hover', function() {
		  $(this).toggleClass('hover');
		});
		
		$('dl.overviewList a').click(function(e) {
			triggerTab(this.title)
			e.preventDefault();
		});
	}

/* 
 *   **************************************
 *  
 *	Admin Lists
 ****************************************/
	$.fn.liveList = function() 
	{
	  var $list = (this);
	  
		var getTarget = function(event) {
			var $target = $(event.target);

			if($target.is('span')) {
				$target = $target.parent();
			}
			if($target.is('a')) {
				return $target;
			}
			event.preventDefault();
		}
		
		$(this).delegate('.edit-link', 'click', function(event) {
		  event.preventDefault();
		  $target = getTarget(event);
			if(!$target) {
				return false;
			}

			var container = $target.attr('rel');
			reloadForm(container, $target.attr('href'));
		});
			
		$(this).delegate('.delete-link', 'click', function(event) {					
		  event.preventDefault();
			$target = getTarget(event);
		  if(!$target) {
				return false;
			}
			if(!confirm('Are you sure you want to delete the selected item?')) {
				return false;
			}

			var id = $target.attr('rel');
			var form = document.createElement("form");
			var updateUrl = $list.attr('rel');
			
			$(form)
				.attr({ action: $target.attr('href'), method: "post", style: "display:none" })
				.append('<input type="hidden" name="data[Item][id]" value="'+id+'">')
				.appendTo("body")
				.formation(function() {
					$list.parent().load(updateUrl);
				})
				.submit()
			;
		});
	}


/* 
 *   **************************************
 *  
 *	Make a link into a form
 ****************************************/
	$.fn.linkForm = function(options) {
		$(this).click(function(e) {
			var modelId = $(this).attr('rel');

			if(!options.url || !options.field || !modelId) {
				return false;
			}
			
			if(!options.formOptions) {
				options.formOptions = {}
			}

			var fieldParts = options.field.split('.');
			var modelAttr = 'data['+fieldParts[0]+']['+fieldParts[1]+']';

			$('<form style="display:none" method="post">')
				.attr('action', options.url)
				.append('<input name="' + modelAttr + '" value="' + modelId + '" type="hidden">')
				.appendTo('body')
				.formation(options.formOptions)
				.submit()
			;	
			return $
		})
	}


/*===================

	Dialogs
=====================*/
function dialogs(triggers) {
  for(var i = 0; i < triggers.length; i++) {

	  $(triggers[i]).live('click', function(ev) {  
			$('#flashMessage').remove();

			var title = $(this).attr('title');
			if(!title) {
			  title = $(this).text();
			}
      
      var width = $(this).attr('data-dialogWidth') * 1;
      if(!width) {
        width = 620;
      }
      
      $('#dialog').remove();
      var dialog = $('<div id="dialog" style="display:none"><img src="/img/loading.gif" /></div>')
        .appendTo('body')
        .dialog({
					draggable: true,
          width: width,
					title: title,
					modal: true,
					autoOpen: true
        })
      ;
      
			$.get($(this).attr('href'), function(data) {
        var jsonResponse = {};
        if(data.substr(0, 1) == '{') {
          jsonResponse = eval('(' + data + ')');
        }

        if(jsonResponse.redirect != undefined) {
          window.location=jsonResponse.redirect;
        } else {  
          dialog.html(data);
          onDialogReady();
        }
        
			});
			ev.preventDefault();
		});
  }
}


/*===================

	Library links
=====================*/
	var libraryLink = function(linkSelector) {
		if(typeof linkSelector == 'undefined') {
			linkSelector = '#libraryLink';
		}
		$('body').append('<div id="library" class="jqmWindow" style="display:none;width:950px;margin-left:-475px;"></div>');
		$('#library').jqm({
			modal: false,
			ajax: '/images/library/0',
			overlay: 80,
			trigger: linkSelector
		});
	}
	

	function formatDate(dateString) {
		var d = new Date(dateString);
		return d.getMonth() + "/" + d.getDay() + "/" + (d.getYear()+1900);
	}
	
	
	function checkJsonRedirect(data, target) {
	  var jsonResponse = {};
	  if(data.substr(0, 1) == '{') {
	    jsonResponse = eval('(' + data + ')');
	  }
    
		if(jsonResponse.redirect != undefined) {
		  if(typeof target != 'undefined') {
        // $(target).html('Please wait a moment...');
        $(target).html('<img src="/img/loading.gif">');
		  }
			window.location=jsonResponse.redirect;
			return true;
		}
		return false;
	}
	
/*===================

	OnReady()
=====================*/
	$(document).ready(function() {
	  attachAjaxEvents();
    dialogs(['a.dialog']);
		mainFunction();
		
		var loginDialog = $('#loginDialog').dialog({
			draggable: true,
      width: 600,
			title: 'PRSafe Login',
			modal: true,
			autoOpen: false,
			open: loginDialogReady
		});
	
		$('a.loginLink').live('click', function(e) {
			$('#loginDialog #flashMessage').remove();
			e.preventDefault();
			loginDialog.dialog('open');
		});
		
		$('body').ajaxComplete(function() {
      mainFunction();
		});
	});