
var TMTW = Class.create( {
    initialize: function( config ) {
        this.page_type = config['type'];
        this.load_timeout = config.load_timeout === undefined ? 0 : config.load_timeout * 1000;
        this.lang_code = config.lang_code === undefined ? 'en' : config.lang_code;
        this.follow = config.follow === undefined ? 'Ticketmaster' : config.follow;
        this.tw_text = config.tw_text;
        this.loaded = false;
        this.load_failed = false;
        this.page_data = {};
        this.page_data.eid = config.eid === undefined ? 0 : config.eid;
        this.page_data.aid = config.aid === undefined ? 0 : config.aid;
        this.page_data.vid = config.vid === undefined ? 0 : config.vid;
        this.page_data.pid = config.pid === undefined ? 0 : config.pid;
        this.page_data.src = config.src === undefined ? 0 : config.src;

        this._after_load_failed_list = [];

        this.click_track = new ClickTrack( config.backend + '/clicktrack' );
        this.click_track.set_required_parameters({ twitter:1 });

        switch( this.page_type ) {
            case "artist":
                this.omn_pre = 'Artist';
                this.omn_q = 'TWArtist';
                break;
            case "confirmation":
                this.omn_pre = 'Purch';
                this.omn_q = 'TWConfirmation';
                break;
            case "event":
                this.omn_pre = 'Event';
                this.omn_q = 'TWEvent';
                break;
            case "venue":
                this.omn_pre = 'Venue';
                this.omn_q = 'TWVenue';
                break;
        }

        new OnWindowLoad( function () {
            if( this.load_timeout ) {
                this.load_timer = window.setTimeout( this._load_failed.bind(this), this.load_timeout );
            }
            var e = document.createElement('script');
            e.async = true;
            e.src = document.location.protocol + '//platform.twitter.com/widgets.js';
            jQuery('#tw-root').append(e);
            jQuery(e).load( this._init_finalize() );
        }.bind(this) );

    },

    _init_handlers: function() {
        if( typeof( twttr ) === 'object' ) {
            twttr.events.bind('click', this._handle_click.bind(this) );
            twttr.events.bind('tweet', this._handle_tweet.bind(this) );
            twttr.events.bind('follow', this._handle_follow.bind(this) );
        }
        else {
            var h_pe = new PeriodicalExecuter(
                function(pe) {
                    if( typeof( twttr ) === 'object' ) {
                        pe.stop();
                        this._init_handlers();
                    }
                }.bind(this), 0.25
            );
        }
    },

    _init_finalize: function () {
        this.loaded = true;
        if( this.load_timer ) {
            window.clearTimeout(this.load_timer);
            delete this.load_timer;
        }
        this._init_handlers();
    },

    _load_failed: function() {
        if( this.load_timer ) {
            window.clearTimeout(this.load_timer);
            delete this.load_timer;
        }
        this.load_failed = true;
        var next;
        while ( (next = this._after_load_failed_list.shift()) ) next();
    },

    build_tweet: function( url, tweet ) {
        var tw_omni = url.match(/\?/) ? '&' : '?' + 'SREF=' + this.omn_q;
        var tw_link = new Element('a', { 
        	'href':'https://twitter.com/share',
        	'className':'twitter-share-button',
        	'data-url':url + tw_omni,
            'data-text':tweet,
            'data-related':this.follow, 
            'data-lang':this.lang_code,
            'data-counturl':url
        }).update('Tweet');
        jQuery('#tw_bt').append(tw_link);
    },

    _handle_click: function( intent ) {
        if( intent.region == 'tweet' ) {
            omniTracking.navigation_link( this.omn_pre + '_Click_Tweet_Button', false );
        }
    },

    _handle_tweet: function( intent ) {
        omniTracking.navigation_link( this.omn_pre + '_Click_Tweet_Post', false );
        this._log_tweet();
    },

    _handle_follow: function( intent ) {
        omniTracking.navigation_link( this.omn_pre + '_Click_Tweet_Follow', false );
    },

    _log_tweet: function() {
        this.click_track.log_datapoint({
            eid : this.page_data.eid,
            aid : this.page_data.aid,
            vid : this.page_data.vid,
            pid : this.page_data.pid,
            src : this.page_data.src
        });
    }

} );

