﻿(
/**
 * jQuery.linkManager
 * aタグのユーティリティメソッド
 * @param {jQuery} $ jQuery オブジェクト
 */
function($){
	
	/**
	 * (クラス)
	 * @param {jQuery} a jQuery オブジェクト
	 */
	$.linkManager = function (a) {
		this.a = a;
		this.option = {
			blankClassName:"Blank",
			targetIcon:"",
			files:{},
			off:"_off",
			on:"_on",
			current:"_current",
			currentClassName:"Current",
			localpath:""
		}
	}
	
	/**
	 * on,off,current に変更 (クラスメソッド)
	 */
	$.linkManager.replace = function (str,before,after) {
		var reg = new RegExp("^(.+)"+before+"(\.[a-z]+)$");
		var changed = str.replace(reg, "$1"+after+"$2");
		return changed;
	}
	
	/**
	 * サブメソッド(インスタンスメソッド)
	 */
	$.extend($.linkManager.prototype,{
		setOption:function(option){
			if(!option) return;
			$.extend(this.option, option);
		},
		/**
		 * aタグに target="_blank" をつけます。
		 */	
		addTarget:function () {
			if(!this.a.hasClass(this.option.blankClassName)) return;
			this.a.attr("target","_blank");
		},
		/**
		 * aタグの後に、応じたアイコンをつけます。
		 */
		addFileIcon:function () {
			var extension = this.a.attr("href").match(/\..+$/);
			extension = String(extension).substr(1);
			if(this.option.files[String(extension)]){
				this.a.after(this.option.files[String(extension)]);
			}else if(this.a.hasClass(this.option.blankClassName) && !this.a.find("img").eq(0).size() && this.option.targetIcon){
				this.a.after(this.option.targetIcon);
			}else {
				return;
			}
		},
		/**
		 * aタグ内の画像にロールオーバー機能をつけます。
		 * (ただし、src属性が this.option.off で終わる場合のみ)
		 */
		addRollOver:function () {
			var img = this.a.find("img").eq(0);
			if(!img.size()) return;
			// プリロード
			$("<img>").attr("src",$.linkManager.replace(img.attr("src"),this.option.off,this.option.on));
			var scope = this;
			img.bind("mouseover",function () {
				if(scope.isNotImgStr($(this),scope.option.off)) return;
				$(this).attr("src",$.linkManager.replace($(this).attr("src"),scope.option.off,scope.option.on));
			}).bind("mouseout",function(){
				if(scope.isNotImgStr($(this),scope.option.on)) return;
				$(this).attr("src",$.linkManager.replace($(this).attr("src"),scope.option.on,scope.option.off));
			});
		},
		/**
		 * aタグの href属性が現在の最上位ディレクトリと同じ(グローバルナビ)場合に、
		 * 中の画像の src属性の this.option.off を this.option.current に変更します。
		 * 画像がない場合は、aタグの class属性に this.option.currentClassName をつけます。
		 * ※ addRollOver より、こちらを優先します。
		 */
		setGlobalNavi:function () {
			// テスト URL
			//var url = "/hoge/huga/index.html";
			var url = location.pathname;
			var directorys = url.split("/", 2);
			
			// ホームかそうでないか
			if (directorys[1] == "index.html") {
				var topDirectory = "/index.html";
			} else if (directorys[1] == "") {
				topDirectory = "/"
			} else {
				topDirectory = "/" + directorys[1] + "/";
			}
			
			var href = this.a.attr("href");
			if(!(href == topDirectory || href == topDirectory + "index.html")) return;
			var img = this.a.find("img").eq(0);
			if(img.size() && !this.isNotImgStr(img,this.option.off)){
				img.attr("src",$.linkManager.replace(img.attr("src"),this.option.off,this.option.current));
			} else {				
				this.a.addClass(this.option.currentClassName);
			}
		},
		/**
		 * aタグの href属性が現在のディレクトリと同じ(ローカルナビ)場合に、
		 * 中の画像の src属性の this.option.off を this.option.current に変更します。
		 * 画像がない場合は、aタグの親要素の class属性に this.option.currentClassName をつけます。
		 * そして、aタグを削除します。
		 * ※ addRollOver より、こちらを優先します。
		 */
		setLocalNavi:function(){
			var url = location.pathname;
			var href = this.a.attr("href");
			
			// 完全一致しない場合はここで終了
			if(url != href && this.localpath != href) return;
			
			var img = this.a.find("img").eq(0);
			if(img.size() && !this.isNotImgStr(img,this.option.off)){
				img.attr("src",$.linkManager.replace(img.attr("src"),this.option.off,this.option.current));
			} else {				
				this.a.parent().addClass(this.option.currentClassName);
			}
			this.a.replaceWith(this.a.contents());
		},
		isNotImgStr:function (img,str) {
			return (img.attr("src").indexOf(str) == -1)
		}
	});
	
	/**
	 * 各セレクタでインスタンスを生成する。
	 */
	$.fn.linkManager = function(option){
		var fncs = arguments;
		
		return this.each(function(){
			var instance = new $.linkManager($(this));
			instance.setOption(option);
			for (var i=1; i<fncs.length; i++) {
				if(typeof instance[fncs[i]] != "function") continue;
				instance[fncs[i]]();
			};
		});
	}
}
)(jQuery);
