/**
 * Arrowtracker
 * 
 * @copyright (c) 2010 ArrowMedia <arwm.ru>
 * @version   0.6 <06.10.2010>
 */
var arrowtracker = {
        gc:            null,
        ga_source:     null,
        ga_campaign:   null,
        ga_medium:     null,
        ga_term:       null,
        ga_content:    null,
        ga_gclid:      null,      
        referrers:     [],          // Custom referers
        sources:       [],        // Custom sources
        token:         null,
        error:         false,
        useInterval:   false,
        intervalTime:  100,
        intervalObj:   null,
        language:      'ru',
        onload:        null,
        translations: {
                ru: {
                        YD: 'Вы пришли к нам из Яндекс.Директа.',
                        YO: 'Вы пришли к нам с Яндекса.',
                        GA: 'Вы пришли к нам по объявлению в Google AdWords.',
                        GO: 'Вы пришли к нам с Гугла.',
                        MO: 'Вы пришли к нам с Mail.ru.',
                        RO: 'Вы пришли к нам с Рамблера.',
                        BG: 'Вы пришли к нам из контекстной сети Бегуна.',
                        BN: 'Вы пришли к нам из контекстной сети Бегуна.',
                        OO: 'Вы пришли к нам с поисковика.',
                        OT: 'Вы пришли к нам по ссылке с другого сайта.',
                        TI: 'Вы набрали адрес нашего сайта прямо в адресной строке браузера или пришли с закладок.'
                }
        },        
		/**
         * Initialization
         * 
         * @return void
         */
        init: function(){
                if (true == this.useInterval) {
                        /**
                         * @todo Replace object name
                         */
                        this.intervalObj = setInterval("arrowtracker.process()", this.intervalTime);
                        return;
                }                
				this.process();
        },        
		/**
         * Parse GA cookies
         * 
         * @return void
         */
        process: function() {
                if (null != this.intervalObj) {
                        clearInterval(this.intervalObj);
                }                
				var z = this._uGC(document.cookie, '__utmz=', ';');
				this.ga_gclid    = this._uGC(z, 'utmgclid=', '|');
                this.ga_source   = this._uGC(z, 'utmcsr=', '|');
                this.ga_campaign = this._uGC(z, 'utmccn=', '|');
                this.ga_medium   = this._uGC(z, 'utmcmd=', '|');
                this.ga_term     = this._uGC(z, 'utmctr=', '|');
                this.ga_content  = this._uGC(z, 'utmcct=', '|');                
				if (this.ga_gclid != "-") {
                        this.ga_source = 'google';
                        this.ga_medium = 'cpc';
                }                
				// Custom sources
                for(i=0;i<this.sources.length;++i) {
                        if (this.sources[i][0] == this.ga_source) {
                                this.setToken(this.sources[i][1]);
                                this.addTranslate(this.sources[i][1], 
								this.sources[i][2]);
                                this.log(this.getTranslate());
                                return;
                        }
                }                
				switch (this.ga_medium) {
                        case 'organic':
                                switch (this.ga_source) {
                                        case 'google':
                                        case 'google.ru':
                                        case 'google.com':
                                                this.setToken('GO');
                                                break;
                                        case 'yandex':
                                        case 'yandex.ru':
                                                this.setToken('YO');
                                                break;
                                        case 'rambler':
                                        case 'rambler.ru':
                                                this.setToken('RO');
                                                break;
                                        case 'mail':
                                        case 'mail.ru':
                                                this.setToken('MO');
                                                break;
                                        default:
                                                this.setToken('OO');
                                                break;
                                }
                                break;
                        case 'cpc':
                                switch (this.ga_source) {
                                        case 'YD':
                                                this.setToken('YD');
                                                break;
                                        case 'GA':
                                        case 'GD':
                                        case 'GС':
                                        case 'google':
                                                this.setToken('GA');
                                                break;
										case 'begun':
                                        case 'BG':
                                                this.setToken('BG');
                                        case 'BN':
                                                this.setToken('BN');
                                                break;
                                }
                                break;
                        case 'referral':
                                for(i=0;i<this.referrers.length;++i) {
                                        if (this.referrers[i][0] == this.ga_source) {
                                                this.setToken(this.referrers[i][1]);
                                                this.addTranslate(this.referrers[i][1], 
												this.referrers[i][2]);
                                        }
                                }                                
								if (!this.hasToken()) {
                                        this.setToken('OT');
                                }
                                break;
                        case '(not set)':
                                if ("-" != this.ga_gclid) {
                                        this.token = 'GA';
                                }
                                break;
                        case '(none)':
                                this.setToken('TI');
                                break;
                        default:
                                this.logError("ga_medium");
                                break;
                }                
				this.log(this.getTranslate());                
				if (this.onload)
                        this.onload(this.getToken(), this.getTranslate());
        },        
		/*
         * TOKEN
         */
        getToken: function() {
                return this.token;
        },        
		setToken: function(token) {
                this.token = token;
                return this;
        },        
		hasToken: function() {
                return (null == this.token) ? false : true;
        },        
		/*
         * LANGUAGE
         */
        getLanguage: function() {
                return this.language;
        },        
		setLanguage: function(lang) {
                this.language = lang;
                return this;
        },        
		/*
         * TRANSLATE
         */
        addTranslate: function(code, translate) {
                this.translations.ru[code] = translate;                
				return this;
        },        
		getTranslate: function() {
                if (this.hasToken() && !this.hasError()) {
                        return this.translations[this.language][this.getToken()];
                }                
				return null;
        },        
		/*
         * ERRORS & LOGS
         */
        log: function(string) {
                try{
                        console.log(string);
                }catch(e){}                
				return this;
        },        
		logError: function(string) {
                this.error = true;                
				return this.log(string);
        },        
		hasError: function() {
                return this.error;
        },        
		/*
         * PARSER
         */
        _uGC:function(l,n,s){
                if (!l || l=="" || !n || n=="" || !s || s=="") return "-";
                var i,i2,i3,c="-";
                i=l.indexOf(n);
                 i3=n.indexOf("=")+1;
                if (i > -1) {
                i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; }
                c=l.substring((i+i3),i2);
                }
                return c;
        }
};
