
// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function(){
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  if(this.console) {
    arguments.callee = arguments.callee.caller;
    var newarr = [].slice.call(arguments);
    (typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr));
  }
};

// make it safe to use console.log always
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try
{console.log();return window.console;}catch(err){return window.console={};}})());
(function() {
	var BrowserDetect = {
		init: function () {
			this.browser = this.searchString(this.dataBrowser) || null;
			this.OS = this.searchString(this.dataOS) || null;
		},
		searchString: function (data) {
			for (var i=0;i<data.length;i++)	{
				var dataString = data[i].string;
				var dataProp = data[i].prop;
				if (dataString) {
					if (dataString.indexOf(data[i].subString) != -1)
						return data[i].identity;
				}
				else if (dataProp)
					return data[i].identity;
			}
		},
		dataBrowser: [
			{
				string: navigator.userAgent,
				subString: "Chrome",
				identity: "chrome"
			},
			{ 	string: navigator.userAgent,
				subString: "OmniWeb",
				identity: "omniweb"
			},
			{
				string: navigator.vendor,
				subString: "Apple",
				identity: "safari"
			},
			{
				prop: window.opera,
				identity: "opera"
			},
			{
				string: navigator.vendor,
				subString: "iCab",
				identity: "icab"
			},
			{
				string: navigator.vendor,
				subString: "KDE",
				identity: "konqueror"
			},
			{
				string: navigator.userAgent,
				subString: "Firefox",
				identity: "firefox"
			},
			{
				string: navigator.vendor,
				subString: "Camino",
				identity: "camino"
			},
			{
				string: navigator.userAgent,
				subString: "Netscape",
				identity: "netscape"
			},
			{
				string: navigator.userAgent,
				subString: "MSIE",
				identity: "explorer"
			},
			{
				string: navigator.userAgent,
				subString: "Gecko",
				identity: "mozilla"
			},
			{
				string: navigator.userAgent,
				subString: "Mozilla",
				identity: "netscape"
			}
		],
		dataOS : [
			{
				string: navigator.platform,
				subString: "Win",
				identity: "win"
			},
			{
				string: navigator.platform,
				subString: "Mac",
				identity: "mac"
			},
			{
				string: navigator.userAgent,
				subString: "iPhone",
				identity: "iphone"
		    },
			{
				string: navigator.platform,
				subString: "Linux",
				identity: "linux"
			}
		]

	};
	BrowserDetect.init();
	window.$.client = { os : BrowserDetect.OS, browser : BrowserDetect.browser};
})();

/* OVERLABEL */
(function( $ ) {
    $.fn.overlabel = function( options ) {
        var opts = $.extend({}, $.fn.overlabel.defaults, options );
        var selection = this.filter( 'label[for]' ).map( function() {
            var label = $( this );
            var id = label.attr( 'for' );
            var field = document.getElementById( id );
            if ( !field )
                return;
            var o = $.meta ? $.extend({}, opts, label.data() ) : opts;

            label.addClass( o.label_class );

            var hide_label = function() {
                label.css( o.hide_css )
            };
            var show_label = function() {
                this.value || label.css( o.show_css )
            };
            $( field )
            .parent().addClass( o.wrapper_class ).end()
            .focus( hide_label ).blur( show_label ).each( hide_label ).each( show_label );
            label.click(function(){field.focus()});
            return this;
        } );
        return opts.filter ? selection : selection.end();
    };
    $.fn.overlabel.defaults = {

        label_class:   'overlabel-apply',
        wrapper_class: 'overlabel-wrapper',
        hide_css: {
            'text-indent': '-10000px'
        },
        show_css: {
            'text-indent': '0px',
            'cursor': 'text'
        },
        filter:        false
    };
} )( jQuery );

/* STYLED SELECT BOXES */
(function($){
	$.fn.styleSelect = function() {
        $(this).each(function(){
          var $that = $(this);
          var labelOption = $that.find("option").first();
          var label = $("<label>", {
            "class":($that.hasClass("JM_errorInvalid")) ? "JM_styledSelectText JM_errorInvalid" : "JM_styledSelectText",
            "for":$that.attr("id"),
            text: labelOption.text()
          });

          if(!$that.is(':visible')){
            label.hide();
          }

          $that.before(label);
          $that.change(function(){
            label.html($(this).find("option:selected").text());
            if($(this).find("option:selected").val()!=='') {
              label.removeClass('JM_errorInvalid');
            }
          });
        });
    };
})(jQuery);

/* VALIDATE FORM */
(function(){
	$.fn.validateForm = function() {
        return this.each( function(i) {

            var $self = $(this);
            var $selectState = $('select[name="state"]');

            jQuery.validator.addMethod("defaultInvalid", function (value, element) {
                return value != element.defaultValue;
            }, "");
            jQuery.validator.messages.required = "";

            $("select[name='country']").change( function () {
            	$selectState.parent().find('.JM_styledSelectText').hide();
            	$selectState.hide();
            	$selectState.removeClass('required');
            });

            $self.validate({
                invalidHandler: function (e, validator) {
                    var errors = validator.numberOfInvalids();
                    if (errors) {
                       $(".newsletter_errorText").css({visibility: 'visible'});
                    }
                },
                errorPlacement: function (error, element) {
                    if (element[0].nodeName === 'SELECT') {
                        element.parent().find('label').addClass('JM_errorInvalid');
                    }
                },
                errorClass: "JM_error"
            });

        })
    };
})(jQuery);

