// formulate PLUGIN -JDILL
// @description:  configures a form for using validateForm
// @copyright Jeremy Dill - All Rights Reserved
// @granted: use permission granted to Pureology
// @expects: set autoLabels=true or put a <label></label> before or after the input element for validation to work on an element
// @notes: adding class of "nsoe" to an input element supresses the enter submit form event assignment for that input
// @notes: calling forumlate more than once will not create double bindings.  a treated element gets class of "x_fc" and will not be re-treated
// @ver .7
(function($) {
    $.fn.formulate = function(settings) {
        settings = jQuery.extend({
            submitBtnSelector: ".x_submit",
            callbacks: '', // functions to call after validate (csv) 	
            jcallOpts: $.panther.jcallOpts, // jcall loader object to use
            formid: $(this).attr('id'), // ID of form.
            scall: false, // whether or not to use the scall (secure sid appended call) vs lcall		
            vdFromClass: false, // instead of assuming _vd, convert classes starting with vd- to commands.
            labelErrClass: "lbl_err", // set nearest label to this class on error
            errLoc: "before", // loction of errors (and label).  Options are "before", "after" (or special: "a selector for a container". (see validateForm)
            createErrSpans: false, // automatically create vd_error spans (or you can do it yourself inside the label),
            autoLabelFor: false, // automatically add the label "for" attr.  Corresponds with errorloc, and assumes a <label></label> somewhere in the same block as the input (before or after)
            autoLabels: true, // create <labels></labels> for me since I don't have any reason to do it manually. (also forces createErrSpans & autoLabelFor = true)
            setFocusObj: $(this).find("[name]:first"),
            normalize: false // special utility to remove _vd to element name property (use as a second call of formulate on same form).				
        }, settings);
        // SETUP JCALL OPTS
        // create a clone		
        return this.each(function() {
            obj = $(this);
            if (settings.normalize) {
                obj.find("[name]").each(function() {
                    var nm = $(this).attr('name');
                    if (nm.indexOf('_vd') > 0) {
                        $(this).attr('name', nm.substring(0, nm.indexOf('_vd')));
                    }
                });
                return;
            }
            if (settings.vdFromClass) {
                obj.find("[name]").not(".x_fc").each(function() {
                    var nm = $(this).attr('name');
                    var list = $(this).attr('class').split(" ");
                    for (i = 0; i < list.length; i++) {
                        if (list[i].indexOf("vd-") >= 0) {
                            cl = list[i].substring(3, list[i].length);
                            if (nm.indexOf('_vd') < 0) {
                                $(this).attr('name', nm + "_vd-" + cl);
                            } else {
                                $(this).attr('name', nm + "-" + cl);
                            }
                            break;
                        }
                    }
                });
            }
            // AUTOCREATE LABELS
            if (settings.autoLabels) {
                if (settings.errLoc == "before") obj.find("[name*='_vd']").not(".x_fc").before("<label></label>");
                if (settings.errLoc == "after") obj.find("[name*='_vd']").not(".x_fc").after("<label></label>");
                settings.createErrSpans = true;
                settings.autoLabelFor = true;
            }
            if (settings.errLoc == "tablePop") {
                obj.find("[name*='_vd']").not(".x_fc").wrap("<div></div>");
            }
            // ADD ERROR FIELDS
            if (settings.createErrSpans || settings.autoLabelFor) lbl = obj.find("label").each(function() {
                if (settings.createErrSpans) if ($(this).find("span.vd_error").length < 1) $(this).append("<span class='vd_error'></span>");
                if (settings.autoLabelFor) {
                    // find relative 
                    if (settings.errLoc == "before") elem = $(this).nextAll("[name]:first");
                    if (settings.errLoc == "after") elem = $(this).prevAll("[name]:first");
                    if (!elem.hasClass('x_fc')) {
                        var forid = elem.attr("name");
                        elem.attr("id", forid);
                        $(this).attr('for', forid);
                    }
                }
            });
            obj.find(settings.submitBtnSelector).not(".x_fc").click(function() {
                if ($.panther.wait) return false;
                $("#" + settings.formid).find(".vd_error").html('');
                $("#" + settings.formid).find("." + settings.labelErrClass).removeClass(settings.labelErrClass);
                $("div[id^='" + settings.formid + "_']").not(".x_submit").remove();
                // call it up
                fdata = $("#" + settings.formid).serialize();
                $.panther.jcall('validateForm', [fdata, settings.callbacks, settings.formid, settings.errLoc, settings.labelErrClass], settings.jcallOpts);
                return false;
            }).addClass("x_fc")
				.focus(function() {
				    if (this.blur) this.blur();
				    return false;
				});
            // FOCUS FIRST
            settings.setFocusObj.focus();
            settings.setFocusObj.select();
            // BIND ENTER KEY
            obj.find("[name]").not(".nsoe,.x_fc")
				.keydown(function(e) {
				    if (e.keyCode == 13) {
				        $(this).parents("form:first").find(settings.submitBtnSelector).click();
				        return false;
				    }
				})
				.addClass("x_fc");
        });
    }
})(jQuery);
//SlidePop - JEREMY DILL - DEC 2007
//POPUP HANDLER
//CAN UTILIZE MY OTHER PLUGIN CALLED MOUSETRAP
// @copyright:  Jeremy Dill - All Rights Reserved
// @granted: use permission granted to Pureology
// V .05 BETA
(function($) {
    $.fn.slidePop = function(settings) {
        settings = $.extend({
            name: "myname",
            slideIt: true,
            effect: "down",
            startpos: "bottom-left", // INIT POSITION OF POP (PLACER "where" PARAM)
            debug: false,
            clickRefresh: false,
            popupClass: "small_pop",
            contentClass: "sub_msg",
            mouseTrap: true, // USE MY OTHER PLUGIN, MOUSETRAP TO MAKE THE BOX DISOLVE ON MOUSEOUT
            mousePad: 20, // AMOUNT OF PADDING TO PASS TO MOUSEMAP
            popHome: "body",
            transitionSpeed: 200,
            disolveSpeed: 800,
            offsetX: 0,
            offsetY: 0,
            shakeIfActive: false,
            initContent: "Loading",
            preActivate: function() { }, // WHAT TO DO BEFORE POP IS DISPLAYED/ANIMATED
            initOnlyOnce: true, // DON'T REBUILD CONTENTS OF POP ONCE ESTABLISHED.
            onActivate: function() { $('#' + settings.name + '_pop').find('input:first').focus(); return false; }, // WHAT TO DO WHEN ON LINK BASED ON POPEVENT.
            onDispose: function() { $('#' + settings.name + '_pop').css('visibility', 'hidden'); if (settings.debug) $.panther.console("disposed"); $(this).dequeue(); return false; }, // QUEUED FUCTION AFTER DISOLVE		 
            checkFunction: function() { return $.panther.wait; },  // USED TO PREVENT ACTION IF CHECK FUNCTION RETURNS FALSE
            formInside: true, // THERE IS A FORM INSIDE THE BOX.  SETS UP HOLDING WHEN A CONTAINED FORM ELEMENT IS IN FOCUS REGARDLESS OF MOUSE POSTITION.
            innerAnchor: false, // SOMETIMES YOU MIGHT RATHER THE ANCHOR WAS THE FIRST HYPERLINK INSIDE THE $(THIS).  SET TO TRUE FOR THAT PURPOSE.
            popEvent: "hover", // OPTIONS ARE "hover","click","instant" -  WHEN TO TRIGGER POPUP AND ACTIVATE
            restore: false
        }, settings);

        var restore = settings.restore;


        // CREATE POPUP
        if (!$('#' + settings.name + '_pop').hasClass(settings.popupClass)) {
            $(settings.popHome).append("<div id='" + settings.name + "_pop' class='" + settings.popupClass + "'><div id='" + settings.name + "' class=" + settings.contentClass + ">" + settings.initContent + "</div></div>");
        }

        return this.each(function() {
            if (settings.debug) $.panther.console("SPOP-Link = #" + $(this).attr('id') + " ." + $(this).attr('className') + "-" + $(this).index());
            var anchor = $(this);

            var pop = $('#' + settings.name + '_pop');

            // GET INNER
            var content = $('#' + settings.name);

            var operation = function() {
                if (restore) {
                    content.replaceWith(main_recover.clone(true));
                    return false;
                }
                if (settings.debug) $.panther.console("SPOP-anchorid:" + anchor.attr('id'));
                if (!settings.checkFunction()) {


                    // SET IT UP
                    restart();

                    // SLIDE IT IN
                    slideIt();

                    // MOUSE MAP IT		
                    if (settings.mouseTrap) {
                        mapit();
                        // ADD LINK TO MOUSTRAP
                        anchor.mouseMap(settings.name + "Trap", settings.name + "_lnk", { debug: settings.debug, pad: settings.mousePad });
                        $.mouseTrap.track(true, { debug: settings.debug });
                    }

                }
                return false;
            };

            // SLIDE FUNCTION
            var slideIt = function() {
                if (settings.debug) $.panther.console("SPOP-visibility check :" + pop.css("visibility") + " pop id:" + pop.attr('id'));

                if (pop.css("visibility") == "hidden") {

                    settings.preActivate(anchor);

                    if (settings.innerAnchor) placeanchor = anchor.find('a:first');
                    else placeanchor = anchor;

                    if (settings.debug) $.panther.console("SPOP-showing pop at id:" + $(placeanchor).attr("id") + " name:" + $(placeanchor).attr("name"));

                    // PLACE IT
                    pop.placer(placeanchor, { offsetX: settings.offsetX, offsetY: settings.offsetY, where: settings.startpos });

                    // SHOW IT
                    pop.css('visibility', 'visible').show();

                    // ANIMATE IT
                    if (settings.slideIt) {
                        switch (settings.effect) {
                            case "up":
                                content
							.animate({ marginTop: content.height() }, 10, "", remap_callback)
							.animate({ marginTop: '0px' }, settings.transitionSpeed, "", remap_callback);
                                break;
                            case "diag":
                                content.hide().show(settings.transitionSpeed, remap_callback);
                                break;
                            case "down":
                                content.hide().slideDown(settings.transitionSpeed, remap_callback);
                                break;
                        }

                    } else {
                        content.fadeIn(settings.transitionSpeed);
                        remap_callback();
                    }
                } else {
                    restart();
                    settings.onActivate(anchor);
                }
                return false;
            };

            // REMAP AFTER POPUP IS COMPLETED
            var remap_callback = function() {
                // REMOVE CLIP PROPERTY (TODO)
                //pop.css.removeAttr('style');

                // ACTIVATE
                settings.onActivate(anchor);

                // REMAP
                if (settings.mouseTrap) pop.mouseMap(settings.name + "Trap", settings.name + '_pop', { debug: settings.debug });
            };

            var restart = function() {

                if (settings.debug) $.panther.console("SPOP-restart pop id:" + pop.attr('id'));

                while (pop.is(":animated")) {
                    pop.queue("fx", []);
                    pop.stop();
                }

                if (settings.debug) $.panther.console("SPOP-make transparent pop id:" + pop.attr('id'));

                pop.fadeTo(1, 10);

                // FILL WITH INIT CONTENT.
                if (!settings.initOnlyOnce) content.html(settings.initContent);

                //.fadeTo(settings.transitionSpeed,1);			

                //CREATE THE OVERLFOW HIDDEN EFFECT
                //pop.css("clip","rect(0 "+pop.outerWidth()+"px "+ pop.outerHeight()+"px 0)");

                if (settings.debug) $.panther.console("SPOP-visibility set to hidden for pop id:" + pop.attr('id'));
                //HIDE FOR NOW
                //if(settings.popEvent!="instant")
                pop.css('visibility', 'hidden');

                //SET FOCUS EVENTS FOR FORM ELEMENTS
                if (settings.mouseTrap) {
                    if (settings.formInside) {
                        if (settings.debug) $.panther.console('formInside-' + settings.name);
                        pop.find('input')
				    .focus(function() { $.mouseTrap.hold(settings.name + "Trap"); if (settings.debug) $.panther.console('focusOn-' + settings.name) })
				    .blur(function() { $.mouseTrap.hold(settings.name + "Trap", "off"); if (settings.debug) $.panther.console('focusOff-' + settings.name) });
                    }
                }

            };

            if (!settings.popEvent != "instant") {
                // SET ACTIVATE LINK ACTION
                anchor.bind("click focus", function() {
                    if (pop.is(":visible")) {
                        if (settings.shakeIfActive) pop.shake();
                        if (settings.clickRefresh) content.replaceWith(main_recover.clone(true));
                    } else {
                        if (!settings.popEvent == "click") $(this).mouseover();
                    }
                    return false;
                });
            }

            //CREATE MOUSETRAP OBJECT
            if (settings.mouseTrap) {
                var mopts = {
                    action: function() { pop.fadeOut(settings.disolveSpeed).queue(settings.onDispose); }
                }
                var trap = $.mouseTrap.set(settings.name + "Trap", mopts);
            }

            // ADD POPUP AREA TO MOUSETRAP
            if (settings.mouseTrap) {
                var mapit = function() {
                    pop.mouseMap(settings.name + "Trap", settings.name + '_pop', { debug: settings.debug });
                    return false;
                };
            }
            // BIND POP EVENT
            switch (settings.popEvent) {
                case "click":
                    anchor.click(operation);
                    break;
                case "hover":
                    anchor.mouseover(operation);
                    break;
                case "instant":
                    operation();
                    break;
            }
            //SET SECONDARY CLICK ACTION
            //$('.'+settings.name+'_link').click(stagetwo);	


            //CLONE BOX FOR RECOVERY
            if (settings.clickRefresh) var main_recover = $('#' + settings.name).clone(true);


            if (settings.popEvent != "instant") restart();

        }); //close each


    };
})(jQuery);

//MousePop - JEREMY DILL - AUG 2008
//POPUP HANDLER
// @requires: MY OTHER PLUGINS CALLED MOUSETRAP AND PLACER
// @copyright:  Jeremy Dill - All Rights Reserved
// @granted: use permission granted to ChronoTrack
// V .01 BETA
(function($) { 
	$.fn.mousePop = function(settings) {
	  settings = $.extend({
		 name : "myname",
		 restore : false
		 }, settings);

	return this.each(function(){

	}); //close each
};
})(jQuery);
		
//MOUSETRAP - JEREMY DILL - DEC 2007
//CREATE MOUSE MAP AREAS AND THEN USE CHECK TO SEE IF MOUSE IS IN THAT AREA.
//IF NOT, PERFORM SOME ACTION (PRESUMABLY FADE OUT)
// V .02 BETA 
jQuery.mouseTrap = {};
jQuery.mouseTrap.house = {};
jQuery.mouseTrap.track = function(m,settings){
	settings = jQuery.extend({
			 debug : false
		  }, settings); 	
	jQuery().unbind('mousemove');
	clearTimeout(jQuery.mouseTrap.egg);	
	if (m) {	   
	   jQuery().mousemove(function(e){
		  jQuery.mouseTrap.mouseX=e.pageX;
		  jQuery.mouseTrap.mouseY=e.pageY;
		  //console.log(e.pageY+"x"+e.pageX);
	 });
	jQuery.mouseTrap.egg=setTimeout("jQuery.mouseTrap.check({debug:"+settings.debug+"});",1000);
	};
};
jQuery.mouseTrap.hold = function(room,mode){
 if (mode=="off"){
	 jQuery.mouseTrap.house[room].hangon=false;
 	 return;
 } else {
  //ONLY ALLOW 1 MOUSETRAP TO BE HELD.
  for ( key in jQuery.mouseTrap.house ) {
	mt=jQuery.mouseTrap.house[key];	
  	//console.log(key+"="+room+".hangon="+mt.hangon);
	if(key==room) mt.hangon=true;
	  else mt.hangon=false;
   };
  };
  return;
};
jQuery.mouseTrap.set=function(room,settings){
	settings = jQuery.extend({
			 action : function(){alert('action not set for mousetrap!')},
			 hangon :false,
			 destroy:false
		  }, settings);
	if(settings.destroy){
		delete jQuery.mouseTrap.house[room];
	} else {
		jQuery.mouseTrap.house[room]= new Object();
		jQuery.mouseTrap.house[room].action = settings.action;
		jQuery.mouseTrap.house[room].hangon =settings.hangon;  
		jQuery.mouseTrap.house[room].map = new Object();
		return room;
	}
};
(function($){
  $.fn.mouseMap = function (room,area,settings) {
    if (typeof(room)=="undefined"||room=="") room="kitchen";
    if (typeof(area)=="undefined"||area=="") area=this.id;
	settings = $.extend({
			 debug : false,
			 release: false,
			 pad:20,
			 relativeContainer:null
		  }, settings);  
	$.mouseTrap.house[room].map[area] = new Array();
	return this.each(function(){		
	  if (settings.release) { 
		 delete $.mouseTrap.house[room].map[area];
	  	// return true;
	  }
		
	  var pos=$(this).offset();
	  pos.right=(pos.left+settings.pad)+$(this).width();
	  pos.bottom=(pos.top+settings.pad)+$(this).height();
	  pos.left-=settings.pad;
	  pos.top-=settings.pad;
	  $.mouseTrap.house[room].map[area] =pos;
	if (settings.debug) $.panther.console("Mapped as T:"+pos.top+" B:"+pos.bottom+" L:"+pos.left+" R:"+pos.right);
	});
};
})(jQuery);
// DO ACTION IF MOUSE IS NOT INSIDE MOUSETRAP MAP
jQuery.mouseTrap.check=function(settings){
	settings = jQuery.extend({
			debug : false,
			relativeContainer : null,
			checkInterval : 500			
		  }, settings);  	
  var keepTimer =false;
  var rt=jQuery.mouseTrap;
  for ( key in jQuery.mouseTrap.house ) {
	mt=jQuery.mouseTrap.house[key];	
	mt.inRange=false;
	if(settings.debug) console.log(key+".hangon="+mt.hangon);
	if (mt.hangon) {
		keepTimer=true;
		continue;
	}

	for ( key in mt.map ) {		
		if(settings.debug) jQuery.panther.console(key+"TEST (Y:"+rt.mouseY+"|X:"+rt.mouseX+") in t:"+mt.map[key].top+",b:"+mt.map[key].bottom+",l:"+parseInt(mt.map[key].left)+",r:"+parseInt(mt.map[key].right));
		if (rt.mouseY<mt.map[key].top||rt.mouseY>mt.map[key].bottom) {continue;}
		if (rt.mouseX<mt.map[key].left||rt.mouseX>mt.map[key].right) {continue;}
		if(settings.debug) console.log(key+'-Pointer in '+key);
		keepTimer=true;
		mt.inRange=true;
	}
	// NOT IN THIS TRAP
	// EXECUTE ACTION
	if(!mt.inRange) mt.action();
	continue;
  }
  if(settings.debug) {if(keepTimer)	 console.log('reset timer');}
  if(keepTimer)	 jQuery.mouseTrap.egg=setTimeout("jQuery.mouseTrap.check();",settings.checkInterval);	
};

// all valid inputs of form get submit on enter. 
(function($){
	$.fn.submitOnEnter = function (action) {
	return this.each(function(){
	    obj=$(this);
	    obj.keydown(function(e){
			if (e.keyCode == 13) {
				action();
			    return false;
			}
		})
	});
	};
})(jQuery);
//cloneObj - JEREMY DILL - DEC 2008
(function($){
	$.fn.cloneObj = function (newOpts) {
		var newObj=$.extend({},this[0]);				
		return $.extend(newObj,newOpts);
	};
})(jQuery);
// PLACE PLUGIN -JDILL
// RELATIVE PLACER
// @expects : sel should be a block element.
// @expects : there is a relative parent somewhere.
// V .03 BETA
(function($){
	$.fn.placer = function (sel,settings) {
		settings = $.extend({
			 offsetX : 0,
			 offsetY : 0,
			 relativeContainer : null,
			 where : "top-left",  // top-left, top-right, bottom-left, bottom-right, off-left, top-center, inside
			 debug : false
		  }, settings);			
		return this.each(function(){	
					 	
	    	box=$(this);
			anchor=$(sel);
		 	if(!anchor) alert("Could not select PlaceRel:sel="+sel);		
			if(!settings.relativeContainer) settings.relativeContainer=anchor.offsetParent();
			var loc=anchor.position();
			loc.zdex=parseInt(anchor.css('z-index'));
			if (settings.where=="inside") {
				box.appendTo(sel);
				t=settings.offsetY+'px';
				l=settings.offsetX+'px';		
			} else {	
				box.appendTo(settings.relativeContainer);
			}

			switch(settings.where){
				case "top-left":				
					t=loc.top+settings.offsetY+'px';
					l=loc.left+settings.offsetX+'px';
				break;
				case "top-right":
					t=loc.top+settings.offsetY+'px';
					l=loc.left+anchor.outerWidth()+settings.offsetX+'px';									
				break;
				case "bottom-left":
					t=loc.top+anchor.outerHeight()+settings.offsetY+'px';
					l=loc.left+settings.offsetX+'px';
				break;			
				case "bottom-right":
					t=loc.top+anchor.outerHeight()+settings.offsetY+'px';
					l=loc.left+anchor.outerWidth()+settings.offsetX+'px';	
				break;
				case "off-left":
					t=loc.top+settings.offsetY+'px';
					l=loc.left+settings.offsetX-box.outerWidth()+'px';
				break;			
				case "top-center":				
					t=loc.top+settings.offsetY+'px';
					l=loc.left+settings.offsetX+(anchor.outerWidth()/2)-(box.outerWidth()/2)+'px';
				break;								
			}
			if (!box.zdex) zdex=200;
			if(settings.debug) $.panther.console(l+":"+t+" in #"+$(settings.relativeContainer).attr("id")+":."+$(settings.relativeContainer).attr("className"));
			box.css({
			    position: 'absolute',
			    top: t,
			 	left: l,
				zIndex : zdex
			});
		});
	}
})(jQuery);
(function($){
	$.fn.fadeLater = function () {
	return this.each(function(){
		$(this).fadeIn(100);						 
     	$(this).fadeTo(3000,1);
		$(this).fadeOut();
	});
	};
})(jQuery);
// PULSE - JMDILL --BETA
(function(jQuery){
	jQuery.fn.pulse = function () {
		return this.each(function(){
			jQuery(this).stop(true);
			jQuery(this).animate( {opacity:0.1}, 150 );
			jQuery(this).animate( {opacity:1.0}, 150 );
			jQuery(this).animate( {opacity:0.1}, 150 );
			jQuery(this).animate( {opacity:1.0}, 150 );
		});
	};
})(jQuery);
//SHAKE - JDILL --BETA
(function(jQuery){
	jQuery.fn.shake = function (repeat) {
	return this.each(function(){
		jQuery(this).animate( { marginLeft:"10px"}, 50 );
		jQuery(this).animate( { marginLeft:"0px" } , 50 );
		jQuery(this).animate( { marginLeft:"5px"}, 80 );
		jQuery(this).animate( { marginLeft:"0px" } , 120 );
	});
	}
})(jQuery);
//rowClickToEdit - JEREMY DILL - SEPT 2008
// V .01 BETA
(function($){
		$.fn.rowClickToEdit = function (settings) {
			settings = $.extend({
			         func: "distMod",
					 cols : 8,
					 mode : "edit",
					 loader : $($.panther.jcallOpts).cloneObj({noloader:true})
				  }, settings);

		var clicker=function(){
			mode=settings.mode;			
			if($.panther.wait) return false;
			rowid=$(this).parents('tr:first').attr('id');
			$("#"+rowid).trHtml("<td colspan='"+settings.cols+"' align='center'><img src='/Images/_shared/ajax-loader-sm.gif' /> - Loading</td>");						
			//$.panther.console(settings.servUp);
			$.panther.jcall(settings.func,[settings.mode , rowid ],settings.loader);	
			return false;
		}
		return this.each(function(){
			$(this).click(clicker);
		});
};
})(jQuery);
//filtrate - JEREMY DILL - SEPT 2008
// V .01 BETA
(function($){
		$.fn.filtrate = function (name,settings) {
			settings = $.extend({
					clearFilterBtnSel: ".x_clear_filter",
					filterTableSel:".x_flist"
				  }, settings);

		var filters;
		var filterAction=function(){
			$(settings.filterTableSel).find("tr").not(".xf_ignore").show();
			filters.each($.panther.activateFilter);
		};		
		$.panther.store['filtername']=name;	
		return this.each(function(){
			$.panther.restoreFilters(this);	
			filters=$(this).find("input,select");		
			$(this).find("input").keyup(filterAction);
			$(this).find("select").bind("change keyup",filterAction).trigger('change');
			$(settings.clearFilterBtnSel).click(function(){filters.val("");filterAction();return false;})
				.mouseover(function(){$(this).next('span').not(':animated').fadeIn().fadeLater()});
		});
};
})(jQuery);

// plugin lnkListSwap - JEREMY DILL - OCT 2008
// @selector : input box with set of values in a csv. example: <input type="hidden" name="myitems" value="item1,item2,item3" />
// @expects: "item" strings in input lists must be unique and cannot have commas.
// @param selector swap : input box to swap with. example: <input type="hidden" name="itemlist" value="item4,item5,item6" /> 
// @param object settings : override default settings.
// @example: $("input[name='myitems']").lnkListSwap("input[name='itemlist']",{displ:".mydiv",swapDispl:".mydiv2"});
// @ver .1
(function($){
		$.fn.lnkListSwap = function (swap,settings) {
			settings = $.extend({
					displ : '.x_tlist', // DISPLAY CONTAINER SELECTOR FOR PRIMARY LIST
					swapDispl : '#addItem', // DISPLAY CONTAINER SELECTOR FOR SWAP LIST
					format: function(name){return "<a href='#' class='nodecor'>"+name+" <span class='color_4'> (x) </span>&nbsp;&nbsp;</a>";}, // MUST CONTAIN A LINK					
					swapFormat : function(name){ return "<p><a href='#'>"+name+"</a></p>";}, // MUST CONTAIN A LINK
 					onSwapAction : function(obj){return false;},
					allGone : "<span class='ital color_3'>None Added</span>", // MESSAGE TO DISPALY WHEN BOX IS EMPTY
					allGoneSwap : "<span class='ital color_3'>All have been added.</span>" // MESSAGE TO DISPALY WHEN SWAP BOX IS EMPTY
					}, settings);
		
		var job;
		var swapJob;
		
		String.prototype.cleanCommas = function() {
			var st=this.replace( /,+/g, ','); // replace multi commas with single comma
			return st.replace(/^,+|^\s+|,+$|\s+$/g,"") // remove preceding or trailing commmas and white spaces
		};
		
		// TEST FORMATS
		var test=$(settings.format("test"))[0];
		if (typeof(test)=="undefined" || !test.toString().indexOf("Object")) {
			alert("lnkListSwap Said:  Invalid 'format' function.  Result of format function must create a valid DOM object.  Try wrapping in a  span, li, or p, or make the entire result a hyperlink.  Your format produced:"+settings.format("test"));
			return false;
		};
		var test2=$(settings.swapFormat("test"))[0];	
		if (typeof(test2)=="undefined" || !test2.toString().indexOf("Object")) {
			alert("lnkListSwap Said:  Invalid 'swapFormat' function.  Result of swapFormat function must create a valid DOM object.  Try wrapping in a span, li, or p, or make the entire result a hyperlink.  Your swapFormat produced:"+settings.swapFormat("test"));
			return false;
		};
	
		var showIt=function(){
			var arr=[];
			var swapArr=[];
			// BREAK DOWN INTO ARRAYS
			var list=job.val();
			if (list.length>0) arr = list.cleanCommas().split(",");
			var swapList=swapJob.val();
			if (swapList.length>0) swapArr = swapList.cleanCommas().split(",");
			
			// CLEAR DISPLAYS
			$(settings.displ+","+settings.swapDispl).html("");

		
			// FORMAT AND POPULATE DISPLAY
			for(i = 0; i < arr.length; i++){
				$(settings.format(arr[i]))
					.appendTo(settings.displ)
					.find('a')
					.andSelf('a')
					.attr('href',arr[i])
					.click(swapIt);
		    };
			if(arr.length<1) $(settings.displ).html(settings.allGone);

			for(i = 0; i < swapArr.length; i++){
				$(settings.swapFormat(swapArr[i]))
					.appendTo(settings.swapDispl)
					.find('a')
					.attr('href',swapArr[i])
					.click(swapIt)
		    };
			if(swapArr.length<1) $(settings.swapDispl).html(settings.allGoneSwap);		
			return false;
		}
		
		var swapIt=function(lnk){
			var item=$(this).attr('href');
			// WHERE IS ITEM
			if (job.val().indexOf(item)<0) var inPrimary=false;
				else var inPrimary=true;
			if(inPrimary){
				 job.val(job.val().replace( item, '').cleanCommas());
				 swapJob.val((swapJob.val()+","+item).cleanCommas());	
			} else {
				 swapJob.val(swapJob.val().replace( item, '').cleanCommas());
				 job.val((job.val()+","+item).cleanCommas());
			}
			
			showIt();
			settings.onSwapAction(this);
			
			return false;
		}
		
		return this.each(function(){
			job=$(this);
			swapJob=$(swap);
			showIt();
		});
};
})(jQuery);
//hoverClass - JEREMY DILL - DEC 2008
// V .01
(function(jQuery){
		jQuery.fn.hoverClass = function (settings) {
			settings = jQuery.extend({
					 overclass : 'odd'
				  }, settings);
		return this.each(function(){		
				$(this).hover(
					function(){
						$(this).addClass(settings.overclass);
						return false;
					},
					function(){
						$(this).removeClass(settings.overclass);
						return false;
					}
				)
		});
};
})(jQuery);
//TRHTML - JEREMY DILL - AUG 2008
//CHANGE OUT CONTENTS OF TR (SAFE FOR IE)
// V .01 BETA
(function(jQuery){
		jQuery.fn.trHtml = function (strContent,settings) {
			settings = $.extend({
				  }, settings);
		return this.each(function(){		
				row=$(this);
				rowid=row.attr('id');
				rowindex=row.index();
				row.before("<tr id="+rowid+">"+strContent+"</tr>")
				row.remove();
		});
};
})(jQuery);