/*
*	スクリプト配布元 - http://readalittle.net/
*/
function PSGDummyFunction(){
	return true;
}
window.onerror = PSGDummyFunction;

var PSG = {
	Config : {
		HTML : {
			useFixAbbr : true
		},
		Window : {
			enable : true
		},
		Frame : {
			enable : true,
			address : ""
		},
		Form : {
			enable : true
		},
		Cookie : {
			domain : "",
			path : ""
		},
		Link : {
			enable : true,
			activeClassName : "active"
		},
		LinkSwitcher : {
			enable : true,
			internalURL : "",
			targetElementID : "",
			targetElementName : "body",
			targetElementIndex : 1,
			text : "Open external links in new window",
			isBefore : false,
			isOut : false,
			expdays : 30
		},
		StyleSheet : {
			enable : true,
			targetElementID : "",
			targetElementName : "body",
			targetElementIndex : 1,
			text : "Theme ",
			isBefore : false,
			isOut : false,
			expdays : 30,
			enableNoStyle : true,
			noStyleName : "None"
		}
	},






	really : function(){
		return confirm("OK ?");
	},




	Window : {
		init : function(){
			window.defaultStatus = "[ " + self.location.href + " ] - " + document.title;
		}
	},
	
	
	
	Arrays : {
		hasValue : function( array, value ){
			for(var i in array){
				if(array[i] == value){
					return true;
				}
			}
			return false;
		}
	},



	DOM : {
		namespace : {
			xhtml1 : "http://www.w3.org/1999/xhtml",
			xhtml2 : "http://www.w3.org/2002/06/xhtml2"
		},
		
		getRootElement : function(){
			if(document.documentElement){
				return document.documentElement;
			} else if (document.getElementsByTagName){
				return document.getElementsByTagName("*")[0];
			} else {
				return null;
			}
		},
		
		canDOM : function(){
			var D = document;
			var E = PSG.DOM.getRootElement();
			if( E == null ) return false;
			return !!(
				D.getElementById &&
				D.getElementsByTagName &&
				D.createElement &&
				D.createTextNode &&
				E.getAttribute &&
				E.setAttribute &&
				E.removeAttribute &&
				E.appendChild &&
				E.removeChild &&
				E.insertBefore
			);
		},
		
		isXHTML : function(){
			if( PSG.DOM.canDOM() == false ) return false;
			
			var root = PSG.DOM.getRootElement();
			return !!( root.getAttribute("xmlns") || root.namespaceURI );
		},
		
		createElement : function( elementName ){
			elementName = elementName.toLowerCase();
			return PSG.DOM.isXHTML() && document.createElementNS ? document.createElementNS(PSG.DOM.namespace.xhtml1, elementName) : document.createElement(elementName);
		},
		
		addElementImpl : function( newNode, refNode ){
			if( PSG.DOM.canDOM() == false || !refNode ) return null;
			
			var regxp = new RegExp("^(HTML:)?(UL|OL|DL)$", "i");
			if( regxp.test(refNode.nodeName) ){
				var parentElement;
				if(refNode.nodeName.toUpperCase().indexOf("DL") != -1 ){
					parentElement = PSG.DOM.createElement("dd");
				} else {
					parentElement = PSG.DOM.createElement("li");
				}
				if( newNode.id ){
					parentElement.id = newNode.id + "_PARENT";
				}
				parentElement.appendChild(newNode);
				return parentElement;
			} else {
				return newNode;
			}
		},
		
		addElement : function( newElement, targetElement, isBefore, isOut ){
			if( PSG.DOM.canDOM() == false ) return null;
			
			if( isBefore ){
				if( isOut ){
					newElement = PSG.DOM.addElementImpl( newElement, targetElement.parentNode );
					targetElement.parentNode.insertBefore( newElement, targetElement );
				} else {
					newElement = PSG.DOM.addElementImpl( newElement, targetElement );
					targetElement.insertBefore( newElement, targetElement.firstChild );
				}
			} else {
				if( isOut ){
					newElement = PSG.DOM.addElementImpl( newElement, targetElement.parentNode );
					targetElement.parentNode.insertBefore( newElement, targetElement.nextSibling );;
				} else {
					newElement = PSG.DOM.addElementImpl( newElement, targetElement );
					targetElement.appendChild( newElement );
				}
			}
			return newElement;
		},
		
		regenerateAbbr : function(){
			if( PSG.DOM.canDOM() == false || document.getElementsByTagName("/abbr").length == 0 ){
				return;
			}
			
			var abbrs = document.getElementsByTagName("abbr");
			var attrs = [
				"style", "title",
				"lang", "dir",
				"onclick", "ondbclick", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup"
			];
			for(var i=abbrs.length-1; i>=0; i--){
				var oldAbbr = abbrs[i];
				var newAbbr = PSG.DOM.createElement("abbr");
				
				for(var j=oldAbbr.attributes.length-1; j>=0; j--){
					var oldAttr = oldAbbr.attributes[j];
					if(
					oldAttr.nodeName.toLowerCase() != "class" &&
					oldAttr.nodeName.toLowerCase() != "id" &&
					oldAttr.nodeValue &&
					(PSG.DOM.isXHTML() ||
					PSG.Arrays.hasValue(attrs, oldAttr.nodeName.toLowerCase())
					) ){
						newAbbr.setAttribute(oldAttr.nodeName.toLowerCase(), oldAttr.nodeValue);
					}
				}
				oldAbbr.parentNode.insertBefore(newAbbr, oldAbbr);
				while(oldAbbr.nextSibling.nodeName.toUpperCase() != "/ABBR") {
					newAbbr.appendChild(oldAbbr.nextSibling);
				}
				tempID = oldAbbr.id;
				tempClass = oldAbbr.className;
				
				oldAbbr.parentNode.removeChild(oldAbbr.nextSibling);
				oldAbbr.parentNode.removeChild(oldAbbr);
				
				if( tempID ){
					newAbbr.id = tempID;
				}
				if( tempClass ){
					newAbbr.className = tempClass;
				}
			}
		}
	},



	Event : {
		addEvent : function( object, event, listener, useCapture ){
			if(object.addEventListener){
				object.addEventListener( event, listener, useCapture ? true : false );
			} else if(object.attachEvent){
				object.attachEvent( "on"+event, listener );
			}
		},
		
		addLoadEvent : function( listener ){
			PSG.Event.addEvent( window, "load", listener, false );
		}
	},



	Frame : {
		breakFrame : function(){
			var selfDirURL = PSG.Config.Frame.address ? PSG.Config.Frame.address : self.location.protocol+"//"+self.location.hostname + "/";
			var topDir = top.location.pathname.substring(0,top.location.pathname.lastIndexOf("/")+1 );
			var topDirURL = top.location.protocol+"//"+top.location.hostname + topDir;
			selfDirURL = selfDirURL.toLowerCase();
			topDirURL = topDirURL.toLowerCase();
			if( topDirURL.indexOf(selfDirURL) == -1 ){
				if( confirm( "警告！\n'" + document.title + "'\nは他のサイトのフレーム内に入れられている可能性があります。\nフレームを破ってリロードしますか？") ){
					top.location.href = self.location.href;
				}
			}
		}
	},



	Link : {
		self : ( location.hash != "" ) ? location.href.substring( 0, location.href.lastIndexOf(location.hash) ) : location.href,
		
		removeLink : function(link){
			link.removeAttribute("href");
		},
		
		getLinksByURL : function(url){
			var links = document.links;
			var array = new Array();
			for(var i in links){
				if(links[i].href == url){
					array.push( links[i] );
				}
			}
			return array;
		},
		
		getLinks : function( isInternal, internalURL ){
			var links = document.links;
			var array = new Array();
			if( !internalURL ) internalURL = location.hostname;
			var regxp = new RegExp( internalURL, "i" );
			for(var i in links){
				if( regxp.test(links[i].href) == isInternal ){
					array.push( links[i] );
				}
			}
			return array;
		},
		
		getExternalLinks : function( internalURL ){
			return PSG.Link.getLinks( false, internalURL );
		},
		
		getInternalLinks : function( internalURL ){
			return PSG.Link.getLinks( true, internalURL );
		},
		
		setOpenTarget : function(link,target){
			link.onclick = new Function("window.open('"+link.href+"','"+target+"');return false;");
		},
		
		removeSelfLinks : function(){
			var links = PSG.Link.getLinksByURL(PSG.Link.self);
			for(var i in links){
				PSG.Link.removeLink( links[i] );
				if( PSG.Config.Link.activeClassName ){
					links[i].className += (" " + PSG.Config.Link.activeClassName);
				}
			}
		}
	},



	Cookie : {
		getCookie : function(name){
			var start, end;
			var c = document.cookie;
			
			if(c.indexOf(name + '=') != -1){
				start = c.indexOf(name + '=');
				end = c.indexOf( ';', start + name.length+1 );
				if(end == -1){
					end = c.length;
				}
				var value = c.substring( start + name.length+1, end );
				return decodeURIComponent ? decodeURIComponent(value) : unescape(value) ;
			}
			return null;
		},
	
		setCookie : function(name,value,expdays,domain,path){
			if( value == null ) throw "Invalid Value";
			if( !expdays ) expdays = 0;
			if( !domain ) domain = location.hostname;
			if( !path ) path = location.pathname.substring(0,location.pathname.lastIndexOf("/")+1 );
			
			value = encodeURIComponent ? encodeURIComponent(value) : escape(value) ;
			
			var c = name + "=" + value;
			c += "; domain=" + domain;
			c += "; path=" + path;
			if(expdays != 0){
				var expires = new Date();
				expires.setTime(expires.getTime() + 1000*60*60*24*expdays);
				c += "; expires=" + expires.toGMTString();
			}
			document.cookie = c;
		}
	},



	Form : {
		applySafemode : function( formElement ){
			formElement.onreset = PSG.really;
			formElement.onsubmit = PSG.really;
		},
		
		applySafemodeAll : function(){
			if( PSG.DOM.canDOM() == false ) return;
			
			var forms = document.getElementsByTagName("form");
			for(var i in forms){
				PSG.Form.applySafemode( forms[i] );
			}
		}
	},



	LinkSwitcher : {
		checkboxID : "PSGSWITCHBOX",
		formID : "PSGSWITCH",
		
		createController : function(){
			if( PSG.DOM.canDOM() == false ) return;
			
			var form = PSG.DOM.createElement("form");
			var div = PSG.DOM.createElement("div");
			var checkbox = PSG.DOM.createElement("input");
			var label = PSG.DOM.createElement("label");
			
			checkbox.setAttribute("type","checkbox");
			checkbox.setAttribute("value","on");
			checkbox.id = PSG.LinkSwitcher.checkboxID;
			PSG.Event.addEvent(checkbox, "change", new Function("PSG.LinkSwitcher.switchLink(document.getElementById(PSG.LinkSwitcher.checkboxID).checked)") );
			div.appendChild(checkbox);
			
			label.setAttribute("for",PSG.LinkSwitcher.checkboxID);
			label.appendChild( document.createTextNode(PSG.Config.LinkSwitcher.text) );
			div.appendChild(label);
			
			form.setAttribute("action", location.href );
			form.id = "PSGSWITCH";
			form.appendChild(div);
			try{
				var targetElement;
				if( PSG.Config.LinkSwitcher.targetElementID ){
					targetElement = document.getElementById(PSG.Config.LinkSwitcher.targetElementID);
				} else {
					targetElement = document.getElementsByTagName(PSG.Config.LinkSwitcher.targetElementName)[PSG.Config.LinkSwitcher.targetElementIndex-1];
				}
				PSG.DOM.addElement( form, targetElement, PSG.Config.LinkSwitcher.isBefore, PSG.Config.LinkSwitcher.isOut );
			}catch(err){}
			
			if( PSG.Cookie.getCookie("open") == "New" ){
				PSG.LinkSwitcher.switchLink(true);
				checkbox.checked = true;
			} else {
				form.className = "disable";
			}
		},
		
		switchLink : function(isNewWindow){
			if( PSG.DOM.canDOM() == false ) return;
			
			var external = PSG.Link.getExternalLinks( PSG.Config.LinkSwitcher.internalURL );
			for(var i in external){
				PSG.Link.setOpenTarget( external[i], isNewWindow ? "_blank" : "_self" );
			}
			document.getElementById(PSG.LinkSwitcher.formID).className = isNewWindow ? "enable" : "disable";
			PSG.Cookie.setCookie("open", isNewWindow ? "New" : "Same", PSG.Config.LinkSwitcher.expdays, PSG.Config.Cookie.domain, PSG.Config.Cookie.path );
		}
	},



	StyleSheet : {
		selectID   : "PSGSSSBOX",
		formID : "PSGSSS",
		
		getStyleSheets : function(){
			var i;
			var sheets = new Array();
			if( document.styleSheets ){
				var csses = document.styleSheets;
				for(i=csses.length-1; i>=0; i--){
					if( csses[i].title ){
						sheets.unshift(csses[i]);
					}
				}
			} else {
				if( PSG.DOM.canDOM() == false ) return new Array();
				
				var objLinks = document.getElementsByTagName("link");
				for(i=objLinks.length-1; i>=0; i--){
					if(
					objLinks[i].getAttribute("rel") &&
					objLinks[i].getAttribute("rel").toLowerCase().indexOf("stylesheet") != -1 &&
					objLinks[i].getAttribute("title") ){
						sheets.unshift(objLinks[i]);
					}
				}
			}
			return sheets;
		},
		
		changeStyleSheet : function(sheet){
			if( !sheet || PSG.DOM.canDOM() == false ) return;
			
			var sheets = PSG.StyleSheet.getStyleSheets();
			for(var i in sheets){
				sheets[i].disabled = true;
				var title = sheets[i].title;
				if( !title ) title = sheets[i].getAttribute("title");
				if(title == sheet){
					sheets[i].disabled = false;
				}
			}
			PSG.Cookie.setCookie("sheet", sheet, PSG.Config.StyleSheet.expdays, PSG.Config.Cookie.domain, PSG.Config.Cookie.path );
		},
		
		handleStyleSheet : function(){
			var selectElement = document.getElementById(PSG.StyleSheet.selectID);
			var sheet = selectElement.options[selectElement.selectedIndex].text;
			var options = selectElement.options;
			for(var i=options.length-1; i>=0; i--){
				options[i].className = (options[i].text == sheet) ? "enable" : "disable";
			}
			PSG.StyleSheet.changeStyleSheet(sheet);
		},
		
		
		createController : function(){
			if( PSG.DOM.canDOM() == false ) return;
			
			var selectForm = PSG.DOM.createElement("form");
			var div = PSG.DOM.createElement("div");
			var select = PSG.DOM.createElement("select");
			var sheet = PSG.Cookie.getCookie("sheet");
			var sheets = PSG.StyleSheet.getStyleSheets();
			
			selectForm.id = PSG.StyleSheet.formID;
			selectForm.setAttribute("action", location.href);
			select.id = PSG.StyleSheet.selectID;
			
			var titles = new Array();
			for(var i in sheets){
				var title = sheets[i].title;
				if( !title ) title = sheets[i].getAttribute("title");
				if( PSG.Arrays.hasValue(titles, title) == false ){
					titles.unshift(title);
					var opt = PSG.DOM.createElement("option");
					opt.appendChild( document.createTextNode(title) );
					select.appendChild(opt);
					if( title == sheet ){
						select.selectedIndex = i;
						opt.className = "enable";
					} else {
						opt.className = "disable";
					}
				}
			}
			
			if( PSG.Config.StyleSheet.enableNoStyle && PSG.Config.StyleSheet.noStyleName ){
				var nostyle = PSG.DOM.createElement("option");
				nostyle.appendChild( document.createTextNode(PSG.Config.StyleSheet.noStyleName) );
				select.appendChild(nostyle);
				if( sheet == PSG.Config.StyleSheet.noStyleName ){
					select.selectedIndex = titles.length;
					nostyle.className = "enable";
				} else {
					nostyle.className = "disable";
				}
			}
			
			if( PSG.Config.StyleSheet.text ){
				var label = PSG.DOM.createElement("label");
				label.setAttribute("for", PSG.StyleSheet.selectID );
				label.appendChild( document.createTextNode(PSG.Config.StyleSheet.text) );
				div.appendChild(label);
			}
			div.appendChild(select);
			selectForm.appendChild(div);
			
			PSG.Event.addEvent( select, "change", PSG.StyleSheet.handleStyleSheet );
			try{
				var targetElement;
				if( PSG.Config.StyleSheet.targetElementID ){
					targetElement = document.getElementById(PSG.Config.StyleSheet.targetElementID);
				} else {
					targetElement = document.getElementsByTagName(PSG.Config.StyleSheet.targetElementName)[PSG.Config.StyleSheet.targetElementIndex-1];
				}
				PSG.DOM.addElement( selectForm, targetElement, PSG.Config.StyleSheet.isBefore, PSG.Config.StyleSheet.isOut );
			}catch(err){}
		},
		
		init : function(){
			var sheet = PSG.Cookie.getCookie("sheet");
			if( sheet != null ){
				PSG.StyleSheet.changeStyleSheet(sheet);
			}
		}
	}
}

if( PSG.Config.HTML.useFixAbbr ){
	PSG.Event.addLoadEvent( PSG.DOM.regenerateAbbr );
}
if( PSG.Config.Frame.enable ){
	PSG.Event.addLoadEvent( PSG.Frame.breakFrame );
}
if( PSG.Config.Form.enable ){
	PSG.Event.addLoadEvent( PSG.Form.applySafemodeAll );
}
if( PSG.Config.Link.enable ){
	PSG.Event.addLoadEvent( PSG.Link.removeSelfLinks );
}
if( PSG.Config.LinkSwitcher.enable ){
	PSG.Event.addLoadEvent( PSG.LinkSwitcher.createController );
}
if( PSG.Config.Window.enable ){
	PSG.Event.addLoadEvent( PSG.Window.init );
}
if( PSG.Config.StyleSheet.enable ){
	PSG.Event.addLoadEvent( PSG.StyleSheet.createController );
	PSG.StyleSheet.init();
}

