/**
 * 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,
 
	// Custom referers
	referrers:     [],
 
	// Custom sources
	sources:       [],
 
	token:         null,
 
	error:         false,
 
	useInterval:   false,
	intervalTime:  500,
	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':
					case 'y_direct':
						this.setToken('YD');
						break;
					case 'GD':
					case 'GС':
					case 'google':
						this.setToken('GA');
						break;
					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;
	}
};

arrowtracker.useInterval = true;
arrowtracker.onload = function(token, translate) {
	if (this.ga_source == 'GCN' || this.ga_source == 'VK') {
		$("#arrowtracker_top").attr('src', 'http://www.deltaclinic.ru/tel/9894852.jpg');
		$("#arrowtracker_bottom").attr('src', 'http://www.deltaclinic.ru/tel/downtel_9894852.jpg');
		$(".arrowtracker, .arrowtrecker").html("989-48-52");
	}
	switch (token) {
		case 'YD':
			$("#arrowtracker_top").attr('src', 'http://www.deltaclinic.ru/tel/9882723.jpg');
			$("#arrowtracker_bottom").attr('src', 'http://www.deltaclinic.ru/tel/downtel_9882723.jpg');
			$(".arrowtracker, .arrowtrecker").html("988-27-23");
			break;
		case 'GA':
			$("#arrowtracker_top").attr('src', 'http://www.deltaclinic.ru/tel/9885748.jpg');
			$("#arrowtracker_bottom").attr('src', 'http://www.deltaclinic.ru/tel/downtel_9885748.jpg');
			$(".arrowtracker, .arrowtrecker").html("988-57-48");
			break;
		case 'GO':
		case 'YO':
		case 'RO':
		case 'MO':
		case 'OO':
			$("#arrowtracker_top").attr('src', 'http://www.deltaclinic.ru/tel/9897723.jpg');
			$("#arrowtracker_bottom").attr('src', 'http://www.deltaclinic.ru/tel/downtel_9897723.jpg');
			$(".arrowtracker, .arrowtrecker").html("989-77-23");
			break;
	}
};
arrowtracker.init();

