var gaAnalyze = {
	version: "1.3.0",                    // version
	settingFile: "/common/script/ga_config.csv", // CSV
	clickWaitTime: 100, // time
	multiSubDomainMode: -1,

	// Initialize
	init: function (obj) {
		if (!_gaq) return;

		// Load Setting File
		var reffer = [], download = [], internal = [], multiSubDomain = [], subDirectory = [], social = [], customVar = [], contents;
		if (obj) {
			if (obj.settingFile) {
				this.settingFile = obj.settingFile;
			}
			if (obj.clickWaitTime) {
				this.clickWaitTime = obj.clickWaitTime;
			}
		}
		var http = new JKL.ParseXML.CSV( this.settingFile );
		var csv = http.parse();
		for (var i = 0; i < csv.length; i++) {
			if (csv[i][0] === "ref_domain") {
				var j = j || 0;
				reffer[j]= {
					url: csv[i][1],
					slot: csv[i][2],
					name: csv[i][3],
					value: csv[i][4]
				};
				j++;
			} else if (csv[i][0] == "download") {
				var k = k || 0;
				download[k]= {
					mode: csv[i][1],
					url: csv[i][2],
					name: csv[i][3],
					action: csv[i][4]
				};
				k++;
			} else if (csv[i][0] === "internal_site") {
				var l = l || 0;
				internal[l]= {
					mode: csv[i][1],
					url: csv[i][2],
					name: csv[i][3]
				};
				l++;
			} else if (csv[i][0] === "multi_sub_domain") {
				var m = m || 0;
				if ((csv[i][1] == 1) || (csv[i][1] == 4)) {
					multiSubDomain[m]= {
						mode: csv[i][1],
						url: null,
						modeCheckUrl: csv[i][2]
					};
				} else {
					multiSubDomain[m]= {
						mode: csv[i][1],
						url: csv[i][2],
						urlSub: csv[i][3]
					};
				}
				m++;
			} else if (csv[i][0] === "sub_dir_list") {
				var n = n || 0;
				subDirectory[n]= {
					url: csv[i][1]
				};
				n++;
			} else if (csv[i][0] === "social_button") {
				var o = o || 0;
				social[o]= {
					mode: csv[i][1],
					url: csv[i][2],
					name: csv[i][3],
					snsName: csv[i][4],
					action: csv[i][5]
				};
				o++;
			} else if (csv[i][0] === "custom_var") {
				var p = p || 0;
				customVar[p]= {
					mode: csv[i][1],
					word: csv[i][2],
					slot: csv[i][3],
					name: csv[i][4],
					value: csv[i][5],
					scope: csv[i][6]
				};
				p++;
			}
		}

		// SubDirectory / SubDomain
		gaAnalyze.setSubDirDomain(subDirectory, multiSubDomain);
									
		// Refferer
		if (document.referrer != "") {
			var referrerCheck = 0;
			for (var i = 0; i < reffer.length; i++) {
				if (document.referrer.match(reffer[i].url)) {
					gaAnalyze.pushData('_setCustomVar', 1, reffer[i].name, reffer[i].value, 2);
					referrerCheck = 1;
					break;
				}
			}
			if (referrerCheck == 0) {
				gaAnalyze.pushData('_setCustomVar', 1, reffer[0].name, 'other', 2);
			}
		} else {
			gaAnalyze.pushData('_setCustomVar', 1, reffer[0].name, 'none', 2);
		}

		// Contents Group
		contents = location.pathname.split('/');
		if (contents[1] && (contents[1].indexOf('index') == -1) && (contents[1].indexOf('.') == -1)) {
			gaAnalyze.pushData('_setCustomVar', 2, 'contents', contents[1], 3);
		}

		// Custom Variant or Event Tracking
		for (var i = 0; i < customVar.length; i++) {
			if (document.location.href.match(customVar[i].word)) {
				if (customVar[i].mode == 0) {
					gaAnalyze.pushData('_setCustomVar', customVar[i].slot, customVar[i].name, customVar[i].value, customVar[i].scope);
				}else if(customVar[i].mode == 1){
					gaAnalyze.pushData('_trackEvent', customVar[i].slot, customVar[i].name, customVar[i].value, customVar[i].scope);
				}
			}
		}

		_gaq.push(['_trackPageview']);

		// onLoad
		gaAnalyze.addEvent(window, 'load', function(){
			gaAnalyze.ready();
		});
		return this.downloadList = download, this.internalSite = internal, this.socialSite = social, this.multiSubDomain = multiSubDomain;
	},

	// DownLoad
	download: function(mode, url, action){
		if(mode==0){
			gaAnalyze.pushData('_trackEvent', 'download', action, url);
		}else if(mode==1){
			gaAnalyze.pushData('_trackPageview', '/ga_download/' + action + '/' + url);
		}else{
			gaAnalyze.pushData('_trackEvent', 'download', action, url);
			gaAnalyze.pushData('_trackPageview', '/ga_download/' + action + '/' + url);
		}
	},

	// External
	external: function (mode, thisPage, nextPage){
		if(mode==0){
			gaAnalyze.pushData('_trackEvent', 'external', thisPage, nextPage);
		}else if(mode==1){							
			gaAnalyze.pushData('_trackPageview', '/ga_external/' + thisPage +'/' + nextPage);						
		}else{
			gaAnalyze.pushData('_trackEvent', 'external', thisPage, nextPage);
			gaAnalyze.pushData('_trackPageview', '/ga_external/' + thisPage +'/' + nextPage);
		}
	},

	// Social
	social: function (mode, name, snsName, action,thisPage, nextPage){
		if(mode==0){
			gaAnalyze.pushData('_trackEvent', name, thisPage, nextPage);
		}else if(mode==1){
			gaAnalyze.pushData('_trackSocial', snsName, action, thisPage, nextPage);
		}else{
			gaAnalyze.pushData('_trackEvent', name, thisPage, nextPage);
			gaAnalyze.pushData('_trackSocial', snsName, action, thisPage, nextPage);
		}
	},

	// SubDirectory / SubDomain
	setSubDirDomain: function (subDirectoryList, multiSubDomainList){

		// SubDomain
		for(var i = 0; i < multiSubDomainList.length; i++) {
			if(multiSubDomainList[i].mode == 1){
				gaAnalyze.pushData('_setDomainName', multiSubDomainList[i].modeCheckUrl);
			} else if(multiSubDomainList[i].mode == 2){
				gaAnalyze.multiSubDomainMode = 2;
			} else if(multiSubDomainList[i].mode == 3){
				gaAnalyze.multiSubDomainMode = 3;
				var matchStr = new RegExp(multiSubDomainList[i].urlSub,'gi');
				var matchStr2 = new RegExp(multiSubDomainList[i].url,'gi');
				if(location.host.match(matchStr)){
					var mode = 3.1;
					var subUrl = multiSubDomainList[i].urlSub;
				} else if(location.host.match(matchStr2)) {
					var mode = 3.2;
				}
			} else if(multiSubDomainList[i].mode == 4){
				gaAnalyze.pushData('_addIgnoredRef', multiSubDomainList[i].modeCheckUrl);
			}
		}

		if(gaAnalyze.multiSubDomainMode == 2) {
			gaAnalyze.pushData('_setDomainName', 'none');
			gaAnalyze.pushData('_setAllowLinker', true);
		} else if(gaAnalyze.multiSubDomainMode == 3) {
			if(mode == 3.1){
				gaAnalyze.pushData('_setDomainName', subUrl);
				gaAnalyze.pushData('_setAllowLinker', true);
				gaAnalyze.pushData('_setAllowHash', false);
			} else if(mode == 3.2) {
				gaAnalyze.pushData('_setDomainName', 'none');
				gaAnalyze.pushData('_setAllowLinker', true);
				gaAnalyze.pushData('_setAllowHash', false);
			}
		}

		// SubDirectory
		if ((subDirectoryList.length == 1) && (subDirectoryList[0].url != "")) {
			gaAnalyze.pushData('_setCookiePath', subDirectoryList[0].url);
		} else if (subDirectoryList.length > 1) {
			gaAnalyze.pushData('_setCookiePath', subDirectoryList[0].url);
			for (var i = 1; i < subDirectoryList.length; i++) {
				gaAnalyze.pushData('_cookiePathCopy', subDirectoryList[i].url);
			}
		}
	},

	// Push Data
	pushData: function (){
		var array = [];
		for (var i = 0; i < arguments.length; i++) {
			array.push(arguments[i]);
		}
		_gaq.push(array);
	},

	// Ready
	ready: function (){
		// A tag
		var aElement = document.getElementsByTagName('a');
		var isIE = (navigator.appVersion.toLowerCase().indexOf("msie") != -1) ? true : false;
		for (var i=0; i < aElement.length; i++) {
			// Multi SubDomain
			for (var j = 0; j < gaAnalyze.multiSubDomain.length; j++) {
				var matchStr = new RegExp(gaAnalyze.multiSubDomain[j].url,'gi');
				var thisHref = isIE ? aElement[i].getAttribute("href", 2) : aElement[i].getAttribute("href");
				if(!thisHref) break;
				if (thisHref.match(matchStr) && (thisHref.indexOf("mixi.jp/") != -1)){
					if (aElement[i].getAttribute('target')) {
						aElement[i].removeAttribute('target');
					}
				}
			}
			// onClick
			gaAnalyze.addEvent(aElement[i], 'click', function(evt){
				var _this = evt.target ? this : evt.srcElement;
				var thisLink = _this.href;
				var thisHref = isIE ? _this.getAttribute("href", 2) : _this.getAttribute("href");
				var matchCount = 0, socialCount = 0, wait = 0;
				if(!thisHref) return;
				// Social
				if((thisLink.indexOf("mixi.jp/") != -1) && thisLink.match(/\.(gif|jpg|png)$/)){
					thisLink = _this.parentNode.href;
					thisHref = _this.parentNode.getAttribute("href", 2);
				}
				for(var j = 0;  j < gaAnalyze.socialSite.length; j++){
					var matchStr = new RegExp(gaAnalyze.socialSite[j].url,'gi');
					if(thisLink.match(matchStr)){
						gaAnalyze.social(parseInt(gaAnalyze.socialSite[j].mode), gaAnalyze.socialSite[j].name, gaAnalyze.socialSite[j].snsName, gaAnalyze.socialSite[j].action, location.href, thisLink);
						socialCount++;
						break;
					}
				}
				// Download
				for(var j = 0; j < gaAnalyze.downloadList.length; j++){
					var matchStr = new RegExp(gaAnalyze.downloadList[j].url,'gi');
					if(thisLink.match(matchStr) != null){
						gaAnalyze.download(parseInt(gaAnalyze.downloadList[j].mode), thisLink, gaAnalyze.downloadList[j].action);
						wait = 1;
						break;
					}
				}
				// External
				if(thisHref.match(/^https?/) && socialCount == 0 && matchCount == 0){
					for(var j = 0;  j < gaAnalyze.internalSite.length; j++){
						var matchStr = new RegExp(gaAnalyze.internalSite[j].url,'gi');
						if(thisLink.match(matchStr)){
							matchCount++;
						}
						if(matchCount > 0){
							break;
						}
					}
					if(matchCount == 0){
						gaAnalyze.external(parseInt(gaAnalyze.internalSite[0].mode), location.href, thisLink);
						wait = 1;
					}
				}
				// Multi SubDomain
				if(gaAnalyze.multiSubDomainMode != -1) {
					for(var j = 0; j < gaAnalyze.multiSubDomain.length; j++){
						if(gaAnalyze.multiSubDomain[j].url != ""){
							var matchStr = new RegExp(gaAnalyze.multiSubDomain[j].url,'gi');
							if(thisLink.match(matchStr)){
								gaAnalyze.pushData('_link', thisLink);
								if(isIE) {
									event.returnValue = false;
								} else {
									evt.preventDefault();
								}
								return false;
							}
						}
					}
				}
				if (wait) {
					if (!_this.getAttribute('target') && !_this.getAttribute('onclick')) {
						var timerId = setTimeout(function () { document.location = thisLink; }, gaAnalyze.clickWaitTime);
						return false;
					}
				}
			});
		}
		// Form tag
		var formElement = document.getElementsByTagName('form');
		for (var i=0; i < formElement.length; i++){
			var thisAction = isIE ? formElement[i].getAttribute("action", 2) : formElement[i].getAttribute("action");
			for(var j = 0; j < gaAnalyze.downloadList.length; j++){
				var matchStr = new RegExp(gaAnalyze.downloadList[j].url,'gi');
				if(thisAction.match(matchStr) != null){
					gaAnalyze.addEvent(formElement[i], 'submit', function(evt){
						gaAnalyze.download(parseInt(gaAnalyze.downloadList[j].mode), thisAction, gaAnalyze.downloadList[j].action);
					});
				}
				break;
			}
		}
	},

	// addEvent
	addEvent: function (elm,listener,fn){
		if (elm.addEventListener) {
			elm.addEventListener(listener,fn,false);
		} else if(elm.attachEvent) {
			elm.attachEvent("on"+listener,fn);
		}
	}
};

