/*
© 2000-2004 deviantART, Inc. All rights reserved.
*/

var undefined; /* IE5, you moron */

var KHTML=
	navigator.userAgent.indexOf("KHTML")>=0;
var Gecko=
	(!KHTML) &&
	navigator.product=="Gecko";
var IE=
	(!Gecko) &&
	navigator.cpuClass!=undefined &&
	navigator.appName=="Microsoft Internet Explorer";
var IE5=
	IE && (!Function.apply);
var Opera=
	(!(IE || Gecko || KHTML)) &&
	document.attachEvent!=undefined;

var Safe=
	document.getElementById!=undefined &&
		(document.addEventListener!=undefined ||
		document.attachEvent!=undefined);

function ShowCompat(){
	alert(
		"IE: "+IE+"\n"+
		"IE5: "+IE5+"\n"+
		"Gecko: "+Gecko+"\n"+
		"Opera: "+Opera+"\n\n"+
		"KHTML: "+KHTML+"\n\n"+
		"Safe: "+Safe
	);
}

function ForEachItem(Items,Call){
	var i=-1;
	while(Items[++i])if(Call(Items[i])==-1)return;
}

var Events=Array(),iEvent=0;
function CatchEvent(Node,sEvent,Call,PassEvent,Capture){
	if(Node.addEventListener){
		Node.addEventListener(sEvent,PassEvent==true?Call:function(e){var r=Call(Node);if(!r && e.cancelable)e.preventDefault();return r},Capture==true?true:false);
	}else if(Node.attachEvent){
		Node.attachEvent("on"+sEvent,PassEvent==true?Call:function(e){return Call(Node)});
	}
	/*if(IE || Gecko){
		if(!iEvent)window.onunload=function(){
			var i=0;
			while(Events[i++]){
				;
			}
		}
		Events[iEvent++]={Node:Node,Event:sEvent};
	}*/
}

function GetClientArea(){
	var w=0,h=0;

	if(window.innerWidth){
		w=window.innerWidth;
		h=window.innerHeight;
	}else if(document.body && document.body.clientWidth){
		w=document.body.clientWidth;
		h=document.body.clientHeight;
	}else{
		var CS=window.getComputedStyle(document.getElementsByTagName("html")[0],"");
		w=parseInt(CS.getPropertyValue("width"));
		h=parseInt(CS.getPropertyValue("height"));
	}
	return {width:w,height:h};
}

function GetLabelInput(Label){
	var sFor;
	if(
		sFor=
			Label.htmlFor
			?Label.htmlFor
			:Label.getAttribute("for")
	)
		return document.getElementById(sFor);
	else
		return Label.getElementsByTagName("input")[0];
}

// I should make this recursify somewhere..
function GetInputLabel(Input){
	var sTmp;

	if(Input.label!=undefined)return Input.label;
	var Label=Input.parentNode;

	while((sTmp = GetTag(Label)) != "label"){
		if(!Label.parentNode || sTmp=="form"){
			if(!Input.id)return 0;

			var Form;
			Form=
				(sTmp=="form")
				?Label
				:GetForm(Input);

			function MatchLabel(xLabel){
				if(
					(
						xLabel.htmlFor
						?xLabel.htmlFor
						:xLabel.getAttribute("for")
					)==Input.id
				){
					Label=xLabel;
					return -1;
				}
			}
			ForEachItem(Form.getElementsByTagName("label"),MatchLabel);

			return Label;
		}
		Label=Label.parentNode;
	}
	return Input;
}

function GetTag(Node){
	return String(Node.tagName).toLowerCase();
}
function HasClass(Node,sClass){
	if( typeof(Node) != 'string' )
		Node = Node.className;
	return (" "+Node+" ").indexOf(" "+sClass+" ")>=0;
}

function GetForm(Input){
	if(Input.form)return Input.form;
	while(Input.parentNode && GetTag(Input)!="form")Input=Input.parentNode;
	return Input; // May return doc root; this is alright
}

function SetCookie(sName,sSetting){
	var tStore=new Date();
	document.cookie = sName+"="+sSetting+"; expires=7 Aug, "+String(tStore.getFullYear()+1)+" 13:33:37 GMT; path=/";
	delete tStore;
}
function ReadCookie(sName,sDefault){
	if(!sDefault)sDefault="";
	return (document.cookie+"; "+sName+"="+sDefault+";").match(RegExp("\\b"+sName+"=(.*?);"))[1];
}

function SetDisplay(Node,sValue){
	if(Node.style.display)Node.style.display=sValue;else Node.style["display"]=sValue;
}
function GetTarget(Node){
	var sTmp;
	sTmp=Node.getAttribute("href");
	if(!sTmp)sTmp=Node.getAttribute("for");
	if(sTmp){
		sTmp=sTmp.substr(sTmp.indexOf("#")+1);
		return document.getElementById(sTmp);
	}return 0;
}


function GetBkColor(node)
{
	if(!node)
		return '000000'; 

	if( node.currentStyle ){
		var x = node.currentStyle.backgroundColor;
		if( x != 'transparent' ){
			return x.substr(1,6).toUpperCase();
		}
	}	

	return GetBkColor(node.parentNode);

}

function IsShadowClass(sClass){
	sClass=" "+String(sClass)+" ";
	// return (sClass.indexOf(" shadow ")>=0 || sClass.indexOf(" shadow-")>=0);
	return (sClass.indexOf("shadow")>=0 && sClass.indexOf("shadow-holder")==-1);
}
function IsShadowed(Node){
	while(!IsShadowClass(Node.className))if(!(Node=Node.parentNode))return false;
	return true;
}
function GetBoxSize(Node){
	var w=0,h=0;
	if(Node.width){
		w=Node.width;
		h=Node.height;
	}
	else if(window.getComputedStyle){
		w=parseInt(window.getComputedStyle(Node,"").getPropertyValue("width"));
		h=parseInt(window.getComputedStyle(Node,"").getPropertyValue("height"));
	}
	else if(Node.offsetWidth){
		w=Node.offsetWidth;
		h=Node.offsetHeight;
	}
	return {width:w,height:h};
}
function GetShadowInfo(classes,size)
{
	var info={radius:"5.1",opacity:"0.6",shcolor:"000000",img:"/images/logo.png"};
	// logo.png is 90x60 .. don't go smaller for shadows
	if( size.width<90 || size.height<60 ){
		if( size.width >= 60 && size.height >= 40 ){
			info.img="small.png";
		}else{
			info.img="null.png";
		}
	}
	var i;
	for(i=0;i<classes.length;i++){
		var cname=classes[i];
		switch(cname){
		case "shadow-small":
			info.radius="1.6";
			break;
		case "shadow-big":
			info.radius="20";
			break;
		case "shadow-big-center":
			info.radius="20";
			break;
		case "shadow-glow":
			info.shcolor="FFFFD0";
			info.opacity="0.8";
			break;
		case "shadow-null":
			info.img="null.png";
			break;
		}
	}
	return info;
}
function AddShadow(Node) // If passed, for example, an img element, it'll climb the tree 'til it finds a class="shadow" element
{
	var sBg,sColour,sSize,Info,Pos,OrigNode;

	OrigNode=Node;
	while(!IsShadowClass(Node.className)){
		if(!(Node=Node.parentNode))return;
	}

	sColour=IE?GetBkColor(Node):"alpha";
	sSize=GetBoxSize(OrigNode);
	Info=GetShadowInfo(String(Node.className).split(" "),sSize);

	sBg="url(/shadow/"+sColour+"-"+Info.shcolor+"/"+Info.radius+"-"+Info.opacity+"/"+sSize.width+"x"+sSize.height+"/"+Info.img+")";

	if(Node.style.backgroundImage){
		/*if(IE)Node.onLoad=function(){window.alert("Fish")};*/
		if(Node.style.backgroundImage!=sBg)Node.style.backgroundImage=sBg;
	}else{
		if(Node.style["backgroundImage"]!=sBg)Node.style["backgroundImage"]=sBg;
	}
}
function AddShadows(sID,sElements) // Allows limiting of processing to the child elements of element with id sID
{
	var Root,Nodes,Node,Img,i,Elements,j;
	Root=document;
	if(sID!="")Root=document.getElementById(sID);
	if(!Root)return;
	if(sElements=="")sElements="span";
	Elements=String(sElements).split(" ");
	j=Elements.length;
	while(j--){
		Nodes=Root.getElementsByTagName(Elements[j]);
		i=Nodes.length;
		while(i--){
			Node=Nodes[i];
			if(!IsShadowClass(Node.className))continue;

			Img=Node.getElementsByTagName("img")[0];
			if((!Img) || (Img.width>0 && Img.height>0)){
				AddShadow(Img?Img:Nodes[i]);
			}
			if(Img && !Img.onload)Img.onload=function(){AddShadow(this);};
		}
	}
}

function LinkToggle(Node){
	var sClass=" "+Node.className+" ";
	if(sClass.indexOf(" toggle ")>=0){
		SetDisplay(GetTarget(Node),"none");
		Node.className=sClass.replace(/ toggle /gi," toggle-off ");
	}else{
		SetDisplay(GetTarget(Node),"block");
		Node.className=sClass.replace(/ toggle\-off /gi," toggle ");
		if(/ one\-way /.test(sClass))SetDisplay(Node,"none");
	}
	return false;
}

function Fixes(){
	if(IE5)return;
	/*try{
		if(!String(window.parent.document.title).indexOf("deviantART")){
			var BodyWasCols,IsCompact=false;
			function OnWindowSize(){
				var Area,sClass,Body;

				Area=GetClientArea();

				if(Area.width<450){
					if(IsCompact)return;
				}else{
					if(!IsCompact)return;
				}
				Body=document.getElementsByTagName("body")[0]
				sClass=String(Body.className);

				if(BodyWasCols==undefined)BodyWasCols=sClass.indexOf("cols")>=0;

				sClass=sClass.replace(RegExp("(?:\\b(?:very\\s+)?compact\\b|\\bcols\\b)","g"),"");
				if(IsCompact=(Area.width<450))
					sClass+=" compact";
				else if(BodyWasCols)
					sClass+=" cols";

				Body.className=sClass;
			}
			CatchEvent(window,"resize",OnWindowSize);
			OnWindowSize();
		}
	}catch(e){}*/
	{
	function PopupClick(Node){
		var sRel,Pos,PosII,sTmp,RgPopup=0,Popup={name:"",width:400,height:300};
		sRel=Node.getAttribute("rel");

		if(Pos=sRel.search(RgPopup)>=0){

			RgPopup=new RegExp("(?=^| )popup(?=\\(| |$)","");
			RgNext=new RegExp("[,\\)]","");

			if(Node.innerText)Popup.name=Node.innerText;
				else Popup.name=Node.childNodes[0].nodeValue;
			sRel=sRel.substr(Pos);

			if(Pos=sRel.indexOf("(")){
				sRel=sRel.substr(Pos);
				while(sRel.length && sRel.charAt(0)!=")"){
					sRel=sRel.substr(1);
					Pos=sRel.search(RgNext);
					if((PosII=sRel.indexOf(":"))<0)break;
					sTmp=sRel.substring(PosII+1,Pos);
					switch(sRel.substring(0,PosII)){
						case "name":Popup.name=sTmp;break;
						case "width":Popup.width=parseInt(sTmp);break;
						case "height":Popup.height=parseInt(sTmp);
					}
					if(Pos<0)break;else sRel=sRel.substr(Pos);
				}
				delete RgPopup;
				delete RgNext;
				try{
					return !window.open(Node.getAttribute("href"),Popup.name,"toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width="+Popup.width+",height="+Popup.height);
				}catch(e){return true;}
			}
		}
		return true;
	}
	
	var sRel,sRef,sClass,RgPopup,RgToggle,RgOneWay;
	RgPopup=new RegExp("(?=^| )popup(?=\\(| |$)","");
	RgToggle=new RegExp("\\btoggle\\b","");
	ForEachItem(
		document.getElementsByTagName("a"),
		function(Link){
			if(sRel=Link.getAttribute("rel")){
				if(RgPopup.test(sRel))
					CatchEvent(Link,"click",PopupClick);
			}
			if(sClass=Link.className){
				if(RgToggle.test(sClass)){
					LinkToggle(Link);
					CatchEvent(Link,"click",LinkToggle);
				}
			}
		}
	);
	}

	if(HasClass(document.getElementsByTagName("body")[0],"window")){
		var Section;
		function Min(V1,V2){
			return V1>V2?V1:V2;
		}
		function WindowSectionSize(Node){
			var Height,Adjust;

			Adjust=HasClass(document.getElementsByTagName("body")[0],"fullscreen")?20:165;

			if(window.innerHeight)Height=window.innerHeight;
				else if(document.body && document.body.clientHeight)Height=document.body.clientHeight;
				else Height=parseInt(window.getComputedStyle(document.getElementsByTagName("html")[0],"").getPropertyValue("height"));

			if(IE){
				Section.style.height=Min(300,(Height-document.getElementById("head").offsetHeight)-Adjust)+"px";
			}else{
				Section.style["height"]=Min(300,Height-parseInt(window.getComputedStyle(document.getElementById("head"),"").getPropertyValue("height"))-Adjust)+"px";
			}
		}
		Section=document.getElementById("window");
		CatchEvent(window,"resize",WindowSectionSize);
		CatchEvent(window,"load",WindowSectionSize); // Opera
		WindowSectionSize(Section);
	}
	if(IE){
		function LabelCatch(Node){
			while(GetTag(Node)!="label")Node=Node.parentNode;
			Node.click();
			return false;
		}
		ForEachItem(
			document.getElementsByTagName("label"),
			function(Label){
				ForEachItem(
					Label.getElementsByTagName("img"),
					function(Sub){
						CatchEvent(Sub,"click",LabelCatch);
					}
				);
			}
		);
	}
	{
	function GetTopOptionLabel(Node){
		if(GetTag(Node)!="label" && HasClass(Node,"option"))return Node;

		while(Node.parentNode && GetTag(Node)!="label")Node=Node.parentNode;
		if(!HasClass(Node,"option"))return 0;
		while(HasClass(Node.parentNode,"option"))Node=Node.parentNode;
		return Node;
	}
	function OptionSelected(Node){
		var Label,Input,sClass,sInputName;
		Label=GetTopOptionLabel(Node);
		Input=(GetTag(Node)=="input")?Node:GetLabelInput(Label);
		sInputName=Input.getAttribute("name");
		if(Input.getAttribute("type")=="checkbox"){
			sClass=String(Label.className);
			sClass=sClass.replace(RegExp("\\boption\\-selected\\b","g"),"");
			// Interesting Gecko bug here- Input.checked==false needn't imply that 'checked' attribute!="checked"
			if(Input.checked==true || (Input.checked==undefined && Input.getAttribute("checked")=="checked"))
				sClass+=" option-selected";
			Label.className=sClass;
		}else{
			ForEachItem(
				GetForm(Input).getElementsByTagName("input"),
				function(xInput){
					var xLabel;
					if(
						xInput.getAttribute("type")!="radio" ||
						!(xLabel=GetTopOptionLabel(xInput))
					)return;
					if(HasClass(xLabel,"option")){
						if(xLabel==Label)
							xLabel.className+=" option-selected";
						else if(xInput.getAttribute("name")==sInputName)
							xLabel.className=String(xLabel.className).replace(/\boption\-selected\b/g,"");
					}
				}
			);
		}
		return true;
	}
	function OptionHover(Node){ Node.className+=" option-hover";return true; }
	function OptionHoverOut(Node){ Node.className=String(Node.className).replace(/option\-hover/g,"");return true; }

	function InputAdjust(Input){
		var Label,sModString;

		Label=GetInputLabel(Input);

		sModString="("+String(Label.childNodes[0].nodeValue).toLowerCase().replace(/:/,"")+")";

		if(sModString==Input.value){
			if(Input.inputHovers)Input.value="";
		}else if(!Input.inputHovers && Input.value==""){
			Input.value=sModString;
		}
		return true;
	}

	function InputHover(Input){
		if(++Input.inputHovers>2)Input.inputHovers=2;
		return InputAdjust(Input);
	}
	function InputHoverOut(Input){
		if(--Input.inputHovers<0)Input.inputHovers=0;
		return InputAdjust(Input);
	}

	ForEachItem(
		document.getElementsByTagName("input"),
		function(Input){
			var Label;
			if(!(Label=GetInputLabel(Input)))return;

			if(HasClass(Label,"inline")){
				SetDisplay(Label,"none");
				Input.label=Label;
				Input.inputHovers=0;
				InputAdjust(Input,0);
				CatchEvent(Input,"mouseover",InputHover);
				CatchEvent(Input,"mouseout",InputHoverOut);
				CatchEvent(Input,"focus",InputHover);
				CatchEvent(Input,"blur",InputHoverOut);
			}else{
				if(Label=GetTopOptionLabel(Label)){
					CatchEvent(Label,"mouseover",OptionHover);
					CatchEvent(Label,"mouseout",OptionHoverOut);
					/*if(GetTag(Label)!="label")
						CatchEvent(Label,"click",function(Node){Node=GetLabelInput(Node);if(Node.click)Node.click();return true;});*/
					if(IE || Opera)
						CatchEvent(Input,"click",OptionSelected);
					else
						CatchEvent(Input,"change",OptionSelected);
					if(Input.checked || Input.getAttribute("checked")=="checked")OptionSelected(Input);
				}
			}
		}
	);
	}
}

function popup(url, name, width, height) {
	width = width ? width : 500;
	height = height ? height : 600;
	window.open(url, 'name', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=' + width + ',height=' + height);
	return false;
}