//-----------------------------------------------------------------------------
// Vert Studios Function Library
// Date: December 22, 2010
// File: vertlib.min.js
// Author: Joseph McCullough , @Joe_Query, http://www.vertstudios.com
// Purpose: Contains all the small plugins/functions used throughout our
//          larger plugins.
// Feel free to use this library for commercial purposes!
// Check http://www.vertstudios.com/vertlib.js for un-minified version.
// WARNING: Do NOT obfuscate defined global variables
//-----------------------------------------------------------------------------

window.vertstudios=true;function isset(c){if((typeof c=='undefined')||(c===null)||(c==="")){return false;}else{return true;}}var Regex={};Regex.pattern=function(){return{int:"\\d+",float:"\\d*\\.\\d+",mailstrings:"(content\\-type|mime\\-version|multipart\\/mixed|Content\\-Transfer\\-Encoding|bcc|cc|to|headers):",email:"[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,4}",html:"<([a-zA-Z][a-zA-Z0-9]*)\\b[^>]*>.*?<\\/\\1>",url:"([-a-z0-9+.]*(:|:\\/\\/))?([\\w_-]+\\.)+[a-zA-Z]{2,}[-%\\$_.+!*'(),;\\/?:@=&\\w#]*",zip:"^((\\d{5}-\\d{4})|(\\d{5})|([A-Z]\\d[A-Z]\\s\\d[A-Z]\\d))",alpha:"[a-zA-Z]+",num:"\\d+",bbcode:"\\[([a-zA-Z][a-zA-Z0-9]*)\\b[^\\]]*\\].*?\\[\\/\\1\\]",usphone:"(1\\s*[-\\/\\.]?)?(\\((\\d{3})\\)|(\\d{3}))\\s*[-\\/\\.]?\\s*(\\d{3})\\s*[-\\/\\.]?\\s*(\\d{4})\\s*(([xX]|[eE][xX][tT])[-.:]?\\s*(\\d+))*",usaddress:"\\d+\\s[-\\w.,\\s#:]+",fullname:"[a-zA-Z]+\\s+([-a-zA-Z.'\\s]|[0-9](nd|rd|th))+",name:"[-a-zA-Z.'\\s]+",lastname:"([-a-zA-Z.'\\s]|[0-9](nd|rd|th))+"};};Regex.description=function(){return{int:"Integer",float:"Float",mailstrings:"Mail Strings",email:"Email",html:"HTML",url:"URL",zip:"Zip Code",alpha:"Alphabetic Character",num:"Number",bbcode:"BB Code",usphone:"Phone",usaddress:"Address",name:"Name",fullname:"Name",lastname:"Last Name",message:"Message"};};Regex.example=function(){return {name: "John Doe",usphone: "903-555-5555",email: "myemail@gmail.com",html: "<b>HTML</b>",url: "www.vertstudios.com",zip: "75701",alpha: "abcdefg",num: "99095",bbcode: "[B]BBCODE[/B]",usaddress: "1800 East Barbara Street",fullname: "John Doe",lastname: "Doe 2nd",int: "111",float: "111.50",mailstrings: "to:bcc:",message: "No HTML or BB Code."};};Regex.is=function(c,d){c=Regex.getType(c);pattern=Regex.pattern()[c];var e=new RegExp("\x5e"+pattern+"\x24");return e.test(d);};Regex.isNot=function(c,d){return!Regex.is(c,d);};Regex.has=function(c,d){c=Regex.getType(c);pattern=Regex.pattern()[c];var e=new RegExp(pattern);return e.test(d);};Regex.hasNot=function(c,d){return!Regex.has(c,d);};Regex.hasAny=function(c,d){c=Regex.getArray(c);var e=false;for(var i=0;i<c.length;i++){type=Regex.getType(c[i]);if(Regex.has(type,d)){e=true;}}return e;};Regex.hasNone=function(c,d){return!Regex.hasAny(c,d);};Regex.getDescription=function(c){c=Regex.getType(c);return Regex.description()[c];};Regex.getExample=function(c){c=Regex.getType(c);return Regex.example()[c];};Regex.getArray=function(c){c=c.replace("\x20","");return c.split("\x2c");};Regex.getType=function(c){return c.toLowerCase().replace(/[^a-z]+/,"");};var GetSet={};GetSet.override=function(c,d){var e=c;for(var i in d){if(!(e[i])){e[i]=d[i];}}};GetSet.getters=function(c){var d={prefix:"get",camel:true};GetSet.override(c,d);c.prefix=(c.prefix==="none")?"":c.prefix;var e;for(var i in c.obj){if(c.camel&&c.prefix!==""){e=i.charAt(0).toUpperCase()+i.substr(1);}else{e=i;}(function(i){c.scope[c.prefix+e]=function(){return c.obj[i];};})(i);}};GetSet.setters=function(c){var d={prefix:"set",camel:true};GetSet.override(c,d);c.prefix=(c.prefix==="none")?"":c.prefix;var e;for(var i in c.obj){if(c.camel&&c.prefix!==""){e=i.charAt(0).toUpperCase()+i.substr(1);}else{e=i;}(function(i){c.scope[c.prefix+e]=function(f){c.obj[i]=f;};})(i);}};function POST(c,d){var e="";this.set=function(f,g){var h=new RegExp(f+"=[a-zA-Z0-9%]*");var k=h.exec(e);if(k){e=e.replace(k,f+"\x3d"+g);}else{if((e.length>0)&&(e.substr(-1)!="\x26")){e+="\x26";}e+=(f+"\x3d"+g);}};this.callback=function(f){d=f;};this.serialize=function(f){e+=($(f).serialize());};this.getResponse=function(){if(isset(c)&&isset(e)&&isset(d)){jQuery.ajax({type:"POST",url:c,data:e,success:function(f){d(f);},error:function(f){d(f);}});}};}function Form(c,d){c=(typeof c==='undefined')?$("form"):c;var e=this;var f={id:$(c),URL:$(c).attr("action"),hasAny:null,hasNone:null,invalidClass:"invalid",requiredClass:"required",inputs:$(c).find('input[type="text"], textarea')};settings=jQuery.extend(f,d);GetSet.getters({obj:settings,scope:e,prefix:"none"});GetSet.setters({obj:settings,scope:e});var g=false;e.addAJAX=function(){g=true;};var h=false;this.forceInvalid=function(){h=true;};e.valid=function(m){var n=$(m).val();var name=$(m).attr('name');var o;var p=$(m).hasClass(settings.requiredClass);if(h){h=false;return false;}if(typeof m==='undefined'){var q=0;$(settings.inputs).each(function(){if(e.invalid($(this))){q++;}});return!q;}else{if(!n){if(p){return false;}else{return true;}}var r=false;if(isset(settings.hasAny)){for(var i=0;i<settings.hasAny.length;i++){if($(m).equalTo($(settings.hasAny[i].id))){r=settings.hasAny[i].types;}}}var s=false;if(isset(settings.hasNone)){for(var i=0;i<settings.hasNone.length;i++){if($(m).equalTo($(settings.hasNone[i].id))){s=settings.hasNone[i].types;}}}if(r){o=Regex.hasAny(r,n);}else if(s){o=Regex.hasNone(s,n);}else{o=Regex.is(name,n);}return o;}};e.validate=e.valid;e.invalid=function(m){if(typeof m==='undefined'){var n=$();$(settings.inputs).each(function(){if(e.invalid($(this))){n=$(n).add($(this));}});return n;}else{return!e.validate(m);}};e.clear=function(){jQuery(settings.id).find(':input').not(':button, :submit, :reset, :hidden').val('').removeAttr('checked').removeAttr('selected').removeClass(settings.invalidClass);jQuery(settings.id).find('textarea').val('');};var k={};k.successResponse="thanks";k.invalidResponse="invalid";k.errorResponse="error";GetSet.getters({obj:k,scope:e});GetSet.setters({obj:k,scope:e});var l={};l.success=function(){$("#confirmation").html("<h4>Your message was sent successfully.</h4>");e.clear();};l.serverInvalid=function(){$("#confirmation").html("<h4>Message not sent. Please verify your information.</h4>");};l.clientInvalid=function(m){$("#confirmation").html("<h4>Please verify your information.</h4>");$(m).addClass(settings.invalidClass);};l.error=function(m){$("#confirmation").html("<h4>Server Error. Please try again.</h4>");};l.send=function(){$("#confirmation").html("<h4>Sending...</h4>");};l.doCallback=function(m){if(m==k.successResponse){l.success();}else if(m==k.invalidResponse){l.serverInvalid();}else{l.error(m);}};GetSet.setters({obj:l,scope:e,prefix:"on"});e.mail=function(){var m=new POST(settings.URL,function(n){l.doCallback(n);});m.serialize(settings.id);if(g){m.set("AJAX","true");}m.getResponse();};e.quickform=function(){$(settings.inputs).focusout(function(){if(e.invalid($(this))||(!$(this).val()&&$(this).hasClass(settings.requiredClass))){$(this).addClass(settings.invalidClass);}else{$(this).removeClass(settings.invalidClass);}});$(settings.inputs).keyup(function(){if($(this).hasClass(settings.invalidClass)){if(e.valid($(this))){$(this).removeClass(settings.invalidClass);}}});$(settings.id).submit(function(){if(e.valid()){l.send();e.addAJAX();e.mail();}else{l.clientInvalid($(e.invalid()));}return false;});};}

(function(c){c.fn.arrayShift=function(d,e,f){var g=c.makeArray(c(this));for(var i=0;i<arguments.length;i++){if(isNaN(arguments[i])){if(arguments[i]=="first"){arguments[i]=0;}else if(arguments[i]=="last"){arguments[i]=g.length-1;}}else{arguments[i]=parseInt(arguments[i],10);}}var h=g[d];if(d>e){for(i=d;i>e;i--){g[i]=g[i-1];}g[e]=h;}else if(d<e){for(i=d;i<e;i++){g[i]=g[i+1];}g[e]=h;}if(typeof f=='function'){f.call(this);}return c(g);};c.fn.getIndexOf=function(d){var e=false;var f=c(this);var i=0;c(d).each(function(){if(c(this).equalTo(c(f))){e=i;}i++;});return e;};c.fn.equalTo=function(d){isEqual=!c(this).not(c(d)).length;return isEqual;};c.fn.fakeFloat=function(d){var e={direction:"left",margin:0,offset:0,speed:0},f=c.extend(e,c.fn.fakeFloat.defaults,d);var i=0;var g=0;c(this).each(function(){g=c(this).width();if(f.direction=="left"){c(this).animate({"left":((f.margin)+g)*i+(f.offset)+'px'},f.speed);}else{c(this).animate({"right":((f.margin)+g)*i+(f.offset)+'px'},f.speed);}i++;});return this;};c.fn.frontpush=function(d){var e=c(this).length;var f=c.makeArray(c(this));for(var i=0;i<e;i++){d.push("");}for(i=(d.length),j=0;i>e;i--){j=i-1;d[j]=d[j-e];}for(i=0;i<e;i++){d[i]=f[i];}return c(d);};c.fn.swap=function(d,e){var f=c.makeArray(c(this));var g=f[d];f[d]=f[e];f[e]=g;return c(f);};})(jQuery);

/************************************************************/
// Class StickyScroller
// Purpose: Create a fixed scroller
/************************************************************/

function StickyScroller(f,g){if(typeof StickyScroller.counter==='undefined'){StickyScroller.counter=0;}else{StickyScroller.counter++;}var h=this;var i=$(f).css('top');var j=$(f).css('left');var k=$(f).css('right');var l=0;var m=0;var n={start:0,end:10000,interval:$(f).height(),margin:parseInt(i,10),range:$(f).height()},settings=jQuery.extend(n,g);f=$(f);settings.index=0;settings.oldIndex=0;GetSet.getters({scope:h,obj:settings});var o={};o.newIndex=function(){};o.limbo=function(){};o.scroll=function(){};GetSet.setters({scope:this,prefix:"on",obj:o});this.distanceFrom=function(a){var b=a*settings.interval+settings.start;var c=a*settings.interval+settings.range+settings.start;var d=Math.abs(l-b);var e=Math.abs(l-c);if(d<e){return d;}else{return e;}};this.closestIndex=function(){if(settings.index===0){return 1;}var a=this.distanceFrom(settings.index-1);var b=this.distanceFrom(settings.index+1);if(a<=b){return settings.index-1;}else{return settings.index+1;}};var p=function(){if(l>settings.start&&l<settings.end){tempIndex=Math.floor((l-settings.start)/settings.interval);if(tempIndex!==settings.index){settings.oldIndex=settings.index;settings.index=tempIndex;}}else if(l>=settings.end){settings.oldIndex=settings.index;settings.index=Math.floor((settings.end-settings.start)/settings.interval);}else{settings.oldIndex=settings.index;settings.index=0;}};this.firstIndex=function(){return 0;};this.lastIndex=function(){return Math.floor((settings.end-settings.start+settings.margin)/settings.interval);};this.inRange=function(){var a=settings.index*settings.interval+settings.start;var b=settings.index*settings.interval+settings.start+settings.range;var c=(l>=a)&&(l<=b);return c;};var q=$('<div id="scrollcontainer'+StickyScroller.counter+'">').css({width:f.width(),height:f.height(),position:"absolute",top:i,left:j,right:k});f.wrap(q);$(window).scroll(function(){l=$(window).scrollTop();p();if(l<settings.start){$(f).css({position:'absolute',top:0,left:0,right:0});$("#scrollcontainer"+StickyScroller.counter).css({position:'absolute',top:i,left:j,right:k});}else if(l>settings.end){$(f).css({position:'absolute',top:0,left:0,right:0});$("#scrollcontainer"+StickyScroller.counter).css({position:'absolute',top:settings.end+settings.margin,left:j,right:k});}else{$(f).css({position:'fixed',top:settings.margin,left:j,right:k});}if(settings.oldIndex!==settings.index){o.newIndex(settings.index);}if(!h.inRange()&&l>settings.start&&l<settings.end){o.limbo(settings.index);}o.scroll(settings.index);});}

/************************************************************/
//Class GetSet
//Purpose: Creates dynamic getters and setters
/************************************************************/

var GetSet = {};

//=========================================================//
//Public Method override
//Purpose: Override default values through iteration
//Parameters:
//  obj: The object whose default values will be overridden
//Postcondition: options Object is altered
//=========================================================//
GetSet.override = function(options, defaults)
{
    //Store this scope
    var $this = options;
    
    
    for (var i in defaults)
    {
        if(!($this[i]))
        {
            $this[i] = defaults[i];
        }        
    }
};

//=========================================================//
//Public getFunctions
//Purpose: Copies one objects functions to another
//Parameters:
//  template: The object whose method will be copied
//  recepient: The object receiving the template methods
//Postcondition: recepient object is altered
//=========================================================//
GetSet.getFunctions = function(template, recepient)
{    
    for (var i in template)
    {
        if(template[i].constructor == Function)
        {
            recepient[i] = template[i];
        }
    }
};


//=========================================================//
//Public Method gettters
//Purpose: Dynamically creates accessor methods(getters)
//Parameters: 
//  scope: The scope in which the accessor methods will be
//         applied
//  prefix: Goes before the property. i.e. (get)Name
//  camel: whether to induce camel case
//  obj: Accessors
//Postcondition: scope has been altered to include
//accessor methods
//=========================================================//
GetSet.getters = function(options)
{   
    //Over-ride default values
    var defaults =
    {
        prefix: "get",
        camel: true
    };
    
    //Override defaults values
    GetSet.override(options, defaults);
    
    //If prefix is set to 'none', force blank. A blank string as a parameter
    //evaluates to null for some reason.
    options.prefix = (options.prefix === "none") ? "" : options.prefix;
    
    //Iterate through the properties of the object
    var str;
    for ( var i in options.obj )
    {
        //If camel case is enabled and no blank prefix
        if(options.camel && options.prefix != "")
        {
            str = i.charAt(0).toUpperCase() + i.substr(1);
        }
        else
        {
            str = i;
        }
        (function(i)
        {
                // Dynamically create an accessor method
                options.scope[ options.prefix + str ] = function()
                {
                        return options.obj[i];
                };  
            })(i);
    }
};

//=========================================================//
//Public Method setters
//Purpose: Dynamically creates muator methods(setters)
//Parameters: 
//  scope: The scope in which the mutator methods will be
//         applied
//  prefix: Goes before the property. i.e. (set)Name
//  camel: whether to induce camel case
//  obj: The object that will have mutators
//Postcondition: scope has been altered to include mutator
//methods
//=========================================================//
GetSet.setters = function(options)
{
    //Over-ride default values
    var defaults =
    {
        prefix: "set",
        camel: true
    };
    
    //Override defaults values
    GetSet.override(options, defaults);
    
    //If prefix is set to 'none', force blank. A blank string as a parameter
    //evaluates to null for some reason.
    options.prefix = (options.prefix === "none") ? "" : options.prefix;    
    
    //Iterate through the properties of the object
    var str;
    for ( var i in options.obj )
    {
        //If camel case is enabled and no blank prefix
        if(options.camel && options.prefix != "")
        {
            str = i.charAt(0).toUpperCase() + i.substr(1);
        }
        else
        {
            str = i;
        }
        (function(i)
        {
                // Dynamically create an accessor method
                options.scope[ options.prefix + str ] = function(val)
                {
                       options.obj[i] = val;
                };  
            })(i);
    }
};
