(function () {

    jQuery.fn.imajeryGA = function (method) {
    
        // Method calling logic
        if ( methods[method] ) {
          return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
          return methods.init.apply( this, arguments );
        } else {
          $.error( 'Method ' +  method + ' does not exist on jQuery.imajeryGA' );
        }
    
    };
    
    var methods = {
        track : function(options) {
            var options = jQuery.extend(jQuery.imajeryGA.defaultOptions.track, options);
            return this.each(function () {
                var element = jQuery(this);
                if (element.is('form')) {
                    var inputElement = element.find('input[name$="'+options.formInputName+'"]');
                    var goal = inputElement.val();
                    inputElement.remove();
                    element.submit(function() {
                        jQuery.imajeryGA._getGaq().push(['_trackPageview', options.goalBaseUrl+'/'+goal]);
                    });
                } else if (element.is('a')) {
                    var goal = element.attr('rel');
                    element.click(function() {
                        jQuery.imajeryGA._getGaq().push(['_trackPageview', options.goalBaseUrl+'/'+goal]);
                    });
                } else {
                    alert('element is not trackable');
                }
                
            });
        },
        link : function(options) {
            var options = jQuery.extend(jQuery.imajeryGA.defaultOptions.link, options);
            return this.each(function () {
                var element = jQuery(this);
                if (element.is('form')) {
                    element.submit(function() {
                        jQuery.imajeryGA._getGaq().push(['_linkByPost', this]);
                    });
                } else if (element.is('a')) {
                    element.click(function() {
                        jQuery.imajeryGA._getGaq().push(['_link', element.attr('href')]);
                    });
                } else {
                    alert('element is not linkable');
                }
                
            });
        }
    };
        
    jQuery.imajeryGA = {
        gaq : null,
        _getGaq : function () {
            if (!jQuery.imajeryGA.gaq) {
                jQuery.imajeryGA.gaq = _gaq;
            }
            return jQuery.imajeryGA.gaq;
        },
        defaultOptions : {
            track : {
                goalBaseUrl : '/goal',
                formInputName : 'imajeryGA-track'
            },
            link : {
            }
        }
    };
    

})();

