// remap jQuery to $
(function($){
	/**
	* UTILITY FUNCTION/OBJECTS
	*/
	$.Law360 = {
		setCookie: 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=/";
		},
		getCookie: function(name) {
		    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;
		},
		deleteCookie: function(name) {
		    $.Law360.setCookie(name,"",-1);
		},
		enterKeySubmit: function(obj,form){
			$(obj).keydown(function(e){
				var code = (e.keyCode ? e.keyCode : e.which);
			    if((code == 13)) {
					form.find('input[type=submit]').eq(0).click();
			    }
		  	});
		},
		statesObject: function(){
			var States = [
				{state:'- State -', label:"State",abbreviation:'0'},
				{state:"Alabama", label:"Alabama",abbreviation:"AL"},
				{state:"Alaska", label:"Alaska",abbreviation:"AK"},
				{state:"Arizona", label:"Arizona",abbreviation:"AZ"},
				{state:"Arkansas", label:"Arkansas",abbreviation:"AR"},
				{state:"California", label:"California",abbreviation:"CA"},
				{state:"Colorado", label:"Colorado",abbreviation:"CO"},
				{state:"Connecticut", label:"Connecticut",abbreviation:"CT"},
				{state:"Delaware", label:"Delaware",abbreviation:"DE"},
				{state:"District of Columbia", label:"District of Columbia",abbreviation:"DC"},
				{state:"Florida", label:"Florida",abbreviation:"FL"},
				{state:"Georgia", label:"Georgia",abbreviation:"GA"},
				{state:"Guam", label:"Guam",abbreviation:"GU"},
				{state:"Hawaii", label:"Hawaii",abbreviation:"HI"},
				{state:"Idaho", label:"Idaho",abbreviation:"ID"},
				{state:"Illinois", label:"Illinois",abbreviation:"IL"},
				{state:"Indiana", label:"Indiana",abbreviation:"IN"},
				{state:"Iowa", label:"Iowa",abbreviation:"IA"},
				{state:"Kansas", label:"Kansas",abbreviation:"KS"},
				{state:"Kentucky", label:"Kentucky",abbreviation:"KY"},
				{state:"Louisiana", label:"Louisiana",abbreviation:"LA"},
				{state:"Maine", label:"Maine",abbreviation:"ME"},
				{state:"Maryland", label:"Maryland",abbreviation:"MD"},
				{state:"Massachusetts", label:"Massachusetts",abbreviation:"MA"},
				{state:"Michigan", label:"Michigan",abbreviation:"MI"},
				{state:"Minnesota", label:"Minnesota",abbreviation:"MN"},
				{state:"Mississippi", label:"Mississippi",abbreviation:"MS"},
				{state:"Missouri", label:"Missouri",abbreviation:"MO"},
				{state:"Montana", label:"Montana",abbreviation:"MT"},
				{state:"Nebraska", label:"Nebraska",abbreviation:"NE"},
				{state:"Nevada", label:"Nevada",abbreviation:"NV"},
				{state:"New Hampshire", label:"New Hampshire",abbreviation:"NH"},
				{state:"New Jersey", label:"New Jersey",abbreviation:"NJ"},
				{state:"New Mexico", label:"New Mexico",abbreviation:"NM"},
				{state:"New York", label:"New York",abbreviation:"NY"},
				{state:"North Carolina", label:"North Carolina",abbreviation:"NC"},
				{state:"North Dakota", label:"North Dakota",abbreviation:"ND"},
				{state:"Ohio", label:"Ohio",abbreviation:"OH"},
				{state:"Oklahoma", label:"Oklahoma",abbreviation:"OK"},
				{state:"Oregon", label:"Oregon",abbreviation:"OR"},
				{state:"Pennsylvania", label:"Pennsylvania",abbreviation:"PA"},
				{state:"Puerto Rico", label:"Puerto Rico",abbreviation:"PR"},
				{state:"Rhode Island", label:"Rhode Island",abbreviation:"RI"},
				{state:"South Carolina", label:"South Carolina",abbreviation:"SC"},
				{state:"South Dakota", label:"South Dakota",abbreviation:"SD"},
				{state:"Tennessee", label:"Tennessee",abbreviation:"TN"},
				{state:"Texas", label:"Texas",abbreviation:"TX"},
				{state:"Utah", label:"Utah",abbreviation:"UT"},
				{state:"Vermont", label:"Vermont",abbreviation:"VT"},
				{state:"Virginia", label:"Virginia",abbreviation:"VA"},
				{state:"Washington", label:"Washington",abbreviation:"WA"},
				{state:"West Virginia", label:"West Virginia",abbreviation:"WV"},
				{state:"Wisconsin", label:"Wisconsin",abbreviation:"WI"},
				{state:"Wyoming", label:"Wyoming",abbreviation:"WY"}
			]
			return States;
		},
		findDuplicate: function(val, array){
			var match = 0;
			// Loop through array and check values against
			$.each(array, function(i,v){
				if(v === val){
					match++;
					// If found...add 1
				}
			});
			if(match > 0){
				return true;
			}
			else {
				return false;
			}
		},
		removeSurrounding: function(str){
			str.replace(/(^.*\[|\].*$)/g, '');
			return str;
		},
		reloadPage: function(){
			if(window.location.href.indexOf("#") !== -1){
				window.location.href = window.location.href.split("#")[0];
			} else {
				window.location.href = window.location.href;
			}
		},
		liveUpdate: function(bool,func,i){
			// Cycles every i minutes to check for updates to the page
			var refresh = setInterval(func, i);
			// Pass in false argument to shut off update check
			if(bool == false){
				clearInterval(refresh);
			}
		},
		testURLSubdomain: function(url){
			// Will return true or false
			var bool = /www\.[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-]+$/.test(url);
			return bool;
		},
		getURLSubdomain: function(url){
			if(url.indexOf("?") !== -1){	
				return url.split("?")[0].substring(url.lastIndexOf("/") + 1, url.length);
			}
			else if(url.indexOf("#") !== -1){
				return url.split("#")[0].substring(url.lastIndexOf("/") + 1, url.length);
			}
			else {
				return url.substring(url.lastIndexOf("/") + 1, url.length);
			}
		},
		getRange: function(el){	
			if (el === ""){
				return "*";
			}
			else{
				return el;
			}
	    },
	    toggle: function(elem, class1) {
	        elem.toggleClass(class1);
	        elem.next().toggle("fast");
	    },
	    openWindow: function(url, name, specifics) {
	        window.open(url, name, specifics);
	    },
	    DateRangeFormatter: function(d, max) {
	        this.dd = d.getDate();
	        this.mm = d.getMonth() + 1;
	        this.yyyy = d.getFullYear();
	        this.todaysDate = this.mm + "/" + this.dd + "/" + this.yyyy;
	        // Set Future Date
	        d.setDate(d.getDate() + max);
	        this.fm = d.getMonth() + 1;
	        this.fyyyy = d.getFullYear();
	        this.futureDate = this.fm + "/" + d.getDate() + "/" + this.fyyyy;
	    },
	    setDateFormat: function(value) {
	        var newVal = value.split("/");
	        var newDate = new Date();
	        newDate.setMonth(newVal[0] - 1);
	        newDate.setDate(newVal[1]);
	        newDate.setFullYear(newVal[2]);
	        return newDate;
	    },
	    compareDateRange: function(inputA, inputB) {
	        var date1 = $.Consults.setDateFormat(inputA);
	        var date2 = $.Consults.setDateFormat(inputB);
	        var total = Math.abs(Math.round((date1 - date2) / 86400000));
	        return total;
	    },
	    radioCheckAll: function(col) {
	        $(col).each(function() {
	            var radio = $(this).find("input");
	            if (radio.is(":checked")) {
	                radio.attr("checked", false);
	            }
	            else {
	                radio.attr("checked", true);
	            }
	        });
	    },
		checkAll: function(elem, row) {
	        $(row).each(function() {
	            var cb = $(this).find("input[type=checkbox]");
	            if (elem.is(":checked")) {
	                cb.attr("checked", true);
	            }
	            else {
	                cb.attr("checked", false);
	            }
	        });
	    },
		uncheckAll: function(){
			$("input[type=checkbox]").each(function(){
				$(this).attr("checked", false);
			});
		},
	    removeBrackets: function(string) {
	        return string.substring(1, string.length - 1);
	    },
		removeURLHash: function(string) {
			if(string.substring(string.length, string.length -1) === "#"){
				return string.substring(0, string.length - 1);
			}
			else {
				return string
			}
	    },
	    checkCheckbox: function(checkbox) {
	        checkbox.attr('checked', true);
	    },
	    uncheckCheckbox: function(checkbox) {
	        checkbox.attr('checked', false);
	    },
	    enableCheckbox: function(checkbox) {
	        checkbox.removeAttr("disabled");
	        checkbox.parent("span").removeAttr("disabled");
	    },
	    enableRadio: function(radio) {
	        radio.removeAttr("disabled");
	    },
	    disableInputSelect: function(input) {
	        // Checkbox or Radio
	        input.attr("disabled", "disabled");
	    },
	    clickCheckbox: function(checkbox) {
	        checkbox.click();
	    },
	    selectRadio: function(radio) {
	        radio.attr("checked", "checked");
	        radio.click();
	    },
	    disableDeselect: function(input) {
	        $.Consults.disableInputSelect(input);
	        $.Consults.uncheckCheckbox(input);
	    },
		stripHTML: function(s) {
	        var s1;
	        s1 = s.replace(/(<([^>]+)>)/ig, "").replace(/&nbsp;/ig, " ").replace(/&amp;/ig, "&").replace(/&quot;/ig, "'").replace(/&apos;/ig, "'").replace(/&lt;/ig, "<").replace(/&gt;/ig, ">");
	        return s1;
	    },
	    isInteger: function(s) {
	        if (s != '' && s.match(/^(\d*)$/)) {
	            return true;
	        }
	        else {
	            return false;
	        }
	    },
		isInputEmpty: function(s) {
	        if($.trim(s) === ""){
				return false;
			}
			else {
				return true;
			}
	    },
		isValidEmail: function(s){
			var filter  = /([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+>?$/;
			if(s.search(filter) == -1){
				return false;
			}
			else {
				return true;
			}
		},
		isValidPhoneNumber: function(s){
			var filter = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;
			if(s.search(filter) == -1){
			    return false;
			}
			else {
				return true;
			}
		},
		isBlockedDomain: function(email, array){
			var i = 0, j = 0, len = array.length;
			for (i; i < len; i++){
				if(email.toLowerCase().indexOf(array[i]) !== -1) {
					j++;
					break;
				}
			}
			if(j > 0){
				return true;
			}
			else {
				return false;
			}
		}
	};
	/**
	* PAGE MASK PLUGIN
	@ Requires Master.css
	*/
	$.fn.mask = function(options) {
	    var opts = $.extend({}, $.fn.mask.defaults, options);
	    return this.each(function() {
	        $this = $(this);
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
	        var iframe = $("<iframe class='layermask' frameborder='0'></iframe>");
	        var layer = $("<div id='disableLayer'></div>");
	        o.setDimensions(iframe, $this);
	        o.setDimensions(layer, $this);
	        $this.before(layer);
	        layer.after(iframe);

	    });
	};
	$.fn.mask.defaults = {
	    setDimensions: function(elem, page) {
	        var offset = page.offset();
	        elem.width(page.width()).height(page.height()).css({ "left": offset.left + "px", "top": offset.top + "px" }).animate({ opacity: 0.1 });
	    }
	};
	/**
	* POPUP WINDOW PLUGIN
	*/
	$.fn.openWindow = function(options) {
	    var opts = $.extend({}, $.fn.openWindow.defaults, options);
	    return this.click(function() {
	        $this = $(this);
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
	        var src = $this.attr('href');
	        var specifics = 'width=' + o.winWidth + ',height=' + o.winHeight + ',scrollbars=' + o.winScroll + ',resizable=' + o.winResize;
	        window.open(src, o.winName, specifics);
	        return false;
	    });
	};
	$.fn.openWindow.defaults = {
	    winName: 'new',
	    winWidth: '500',
	    winHeight: '500',
	    winScroll: 'yes',
	    winResize: 'no'
	};
	/**
	* CLEAR INNERTEXT PLUGIN
	*/
	$.fn.clearField = function(options) {
	    var opts = $.extend({}, $.fn.clearField.defaults, options);
	    return this.each(function() {
	        $this = $(this);
	        // Find necessary DOM elements
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			if(this.value === ''){
				this.value = this.getAttribute(o.valStorage);
			}	
	        $this.focus(function() {
	            if (this.value === this.getAttribute(o.valStorage)) {
	                this.value = '';
	                this.style.color = o.focusColor;
	            }
	        });

	        $this.blur(function() {
	            if (this.value === '') {
	                this.value = this.getAttribute(o.valStorage);
	                this.style.color = o.blurColor;
	            }
	        });

	    });
	};
	$.fn.clearField.defaults = {
	    valStorage: 'title',
	    focusColor: '#000000',
	    blurColor: '#999999'
	};

	/**
	* ADD ROW PLUGIN
	*/
	$.fn.AddDeleteRow = function(options) {
	    var opts = $.extend({}, $.fn.AddDeleteRow.defaults, options);
	    var $this = $(this);
	    // Find necessary DOM elements
	    var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
		// Store unaltered HTML for new row
		var original = $this.children(o.rowElement).first().html();
		// Add Click Event
		$this.delegate(o.addBtn, 'click', function(){
			var row = $this.children(o.rowElement).last().clone();
			$this.append(row.html(original));
			$(this).hide().next(o.delBtn).show();
			o.rowAddEvent.call(this); // Callback function for add row event
			return false;
		});

		// Delete Click Event
		$this.delegate(o.delBtn, 'click', function(){
			$(this).parent(o.rowElement).remove();
			o.rowDeleteEvent.call(this); // Callback function for delete row event
			return false;
		});
		return this;
	};
	$.fn.AddDeleteRow.defaults = {
	    rowElement: 'li',
		addBtn: '.row-add',
		delBtn: '.row-del',
		rowAddEvent: function(){},
		rowDeleteEvent: function(){}
	};

	/**
	* CHARACTER COUNTER PLUGIN
	*/
	$.fn.characterCounter = function(options) {
	    var opts = $.extend({}, $.fn.characterCounter.defaults, options);
	    return this.each(function() {        
			$this = $(this);
	        // Find necessary DOM elements
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			$this.after('<div class="'+ o.elClass +'">').next().html('characters: ' + $this.val().length);
			$this.bind('keyup', function(e){
				$this.next().html('characters: ' + e.target.value.length);
			});

	    });
	};
	$.fn.characterCounter.defaults = {
	    elClass: 'counter'
	};


	/**
	* STAR FLAGGED PLUGIN
	*/
	$.fn.starFlag = function(options) {
	    var opts = $.extend({}, $.fn.starFlag.defaults, options);
	    return this.each(function() {        
			$this = $(this);
	        // Find necessary DOM elements
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			$this.hover(
				function(){
					$(this).addClass(o.hoverClass);
				},
				function(){
					$(this).removeClass(o.hoverClass);
				}
			);
			$this.bind('click', function(e){
				e.preventDefault();
				var url_method,
				flagged,
				ID = $(e.target).attr('href')
				model_key = $(e.target).attr(o.custom_attr)
				if(!$(e.target).hasClass(o.fillClass)){
					url_method = o.flagMethod;
					flagged = false;
				}
				else {
					url_method = o.unflagMethod;
					flagged = true;
				}
				$.ajax({
		            type: "POST",
		            url: url_method + ID,
					data: o.data_param + model_key,
					dataType: "html",
		            success: function(data){
						if(!flagged){
							$(e.target).addClass(o.fillClass);
						}
						else {
							$(e.target).removeClass(o.fillClass);
						}
					},
					error: function(data){
						alert(o.errorMsg);
					}
				});
			});
	    });
	}	
	$.fn.starFlag.defaults = {
		fillClass: '',
		hoverClass: '',
		flagMethod: '',
		unflagMethod: '',
		data_param: '',
		errorMsg: '',
		custom_attr: ''
	};

	/**
	* ALPHABETICAL SEARCH LIST PLUGIN
	*/
	$.fn.alphaSearch = function(options) {
	    var opts = $.extend({}, $.fn.alphaSearch.defaults, options);
	    return this.each(function() {        
			var $this = $(this);
	        // Find necessary DOM elements
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			var ResultList = $this.next(o.resultlist);
			$this.find('a').live("click", function(e){
				e.preventDefault();
				var src = $(e.target).attr("href");
				var letter = $(e.target).attr("title");
				o.selectItem($(e.target));
				// Check to see if letter already loaded
				if(!$(this).data('loaded')){
					// if not make ajax call
					ResultList.html(o.loadImg);
					o.alphaLoad(src, o.pageType, ResultList, letter);
					$(this).data('loaded', true);
				}
				else {
					// If so load from memory
					var preloaded = $this.parent().find('.'+letter).html();
					ResultList.html(preloaded);
				}
			});

	    });
	};
	$.fn.alphaSearch.defaults = {
		resultlist: 'ul.results',
		pageType: '',
		loadImg: '',
	    selectItem: function(el) {
	        el.addClass("selected");
			el.parent("li").siblings().find("a").removeClass("selected");
	    },
		alphaLoad: function(src,val,container,letter) {
	        $.ajax({
	            type: "GET",
	            url: src,
	            dataType: "json",
				success: function(data){
					var listitems = '',
					entities = data.length
					for(var i = 0; i < entities; i++){
						listitems += "<li>";
						listitems += "<a href='/" + val + "/" + data[i][1] + "'>";
						listitems += data[i][0];
						listitems += "</a>";
						listitems += "</li>";
					}
					// Throw into results list
					container.html(listitems);
					// Create list on fly and back up loaded items for future load
					container.parent().append('<ul class="loaded-letter '+ letter +'">' + listitems + '</ul>');
				}
			});
	    }
	};
	/**
	* LARGE SUB MENU PLUGIN
	* Author: Daniel Chen
	* Version 1.0  (July 30, 2010)
	* REQUIRES:
		@ /www/css/master.css -> CSS (menu and iframe styles)
	    @ DIV that contains menu content with an ID that matches the HREF of the link
		@ /www/js/master.js -> JAVASCRIPT event handler to call plugin
	* CONFIGURABLE OPTIONS:
		@ menuClass: 'sub-menu' // CssClass of the the menu itself
		@ overClass: 'over' // CssClass on the link that identifies the open menu
		@ identifier: 'menu' // CssClass identifier on the link that determines if a menu should render or not
	*/
	$.fn.largemenu = function(options){
	    var opts = $.extend({}, $.fn.largemenu.defaults, options);
		function setDimensions(iframe,elem){
	        var offset = elem.offset();
	        iframe.width(elem.width()).height(elem.height()).css({"left":offset.left+"px"});
	    }
	    return this.each(function() {
	        $this = $(this);
	        // Find necessary DOM elements
	        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			var lis = $this.children();
	        var anchor = $this.find("a." + o.identifier);
			// Grab HTML content to inject into menu
			anchor.each(function(){
				$(this).after("<div>").next().addClass(o.menuClass).html($($(this).attr("href")).html());
			});

			anchor.click(function(e){
				e.preventDefault();
				var iframe = $("<iframe class='bg' frameborder='0' allowtransparency='true' style='background-color:none;'></iframe>");
				if(!$(this).hasClass(o.overClass)){
					lis.each(function(){
						$(this).find("." + o.overClass).removeClass(o.overClass);
					});	
					$(this).addClass(o.overClass).next("." + o.menuClass).slideDown().parent().append(iframe);
					setDimensions(iframe, $(this).next());
					lis.each(function(){
						if(!$(this).children().hasClass(o.overClass)){
							$(this).children().eq(0).next().hide();
							$(this).find("iframe").remove();
						}
					});
				}
				else {
					$(this).removeClass(o.overClass).next("." + o.menuClass).slideUp().parent().find("iframe").remove();
				}
			});
			$('body').bind('click', function(e) {
			    if($(e.target).closest('.' + o.overClass).length == 0) {
			        // click happened outside of menu, hide any visible menu items
					lis.each(function(){
						$(this).children().eq(0).removeClass(o.overClass);
						$(this).children().eq(0).next().hide();
						$(this).find("iframe").remove();
					});
			    }
			});

	    });
	};
	$.fn.largemenu.defaults = {
	   	menuClass: 'sub-menu',
	   	overClass: 'over',
		identifier: 'menu'
	};
})(this.jQuery);

