/*
*	スクリプト配布元 : http://readalittle.net/
*/

function disableWarning(){
	return true;
}
window.onerror = disableWarning;

var PSG = {
	Config : {
		Cookie : {
			domain : "",
			path : "/"
		},
		StyleSheet : {
			targetElementID : "",
			targetElementName : "body",
			targetElementIndex : 1,
			text : "Theme ",
			isBefore : false,
			isOut : false,
			expdays : 30,
			enableNoStyle : true,
			noStyleName : "None"
		}
	},






	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 new Boolean(
				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 new Boolean( 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;
		}
	},



	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 );
		}
	},



	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;
		}
	},



	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);
			}
		}
	}
}
PSG.Event.addLoadEvent( PSG.StyleSheet.createController );
PSG.StyleSheet.init();

