function fill(num,amt){s = String(num);while(s.length<amt)s = '0'+s;return s;}
Date.prototype.dateStamp = function(){return fill(this.getMonth()+1,2)+'/'+fill(this.getDate(),2)+'/'+this.getFullYear();}
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g,'');}
function validDate(obj){obj.value = obj.value.trim();if(obj.value=='')return;d = new Date(obj.value);if(isNaN(d)){alert('This is not a recognized date format.\nTry MM/DD/YYYY, e.g. 07/11/1969');obj.select();obj.focus();return;}obj.value = d.dateStamp();return;}
function prepFields(){
	var inps = document.getElementsByTagName('input');
	for(var i=0;i<inps.length;i++){
		if(inps[i].className.indexOf('integer')>-1){
			inps[i].onblur=function(){this.value = this.value.trim();if(this.value!=this.value.replace(/\D/g,'')){alert('This field can only accept whole number input');this.select();this.focus();};};
		}
		if(inps[i].className.indexOf('datefield')>-1){
			inps[i].title='Double-click to view calendar';
			inps[i].onblur=function(){this.value = this.value.trim();if(this.value=='')return;d = new Date(this.value);if(isNaN(d)){alert('This is not a recognized date format.\nTry MM/DD/YYYY, e.g. 07/11/1969');this.select();this.focus();return;}this.value = d.dateStamp();return;}
			inps[i].ondblclick=function(){var calDiv = document.createElement('div');calDiv.className='popcal';this.value=this.value.trim();var d= new Date(this.value);if(isNaN(d)){d = new Date();this.value=d.dateStamp();}calDiv.appendChild(new monthlyCalendar(calDiv,this,d));this.parentNode.appendChild(calDiv);calDiv.style.zIndex=1000;}
		}
	}
	for(var i=0;i<document.forms.length;i++)
  {
    var frm = document.forms[i];
    frm.validator = function()
    {
    	for (var i=0;i<frm.elements.length;i++){
    		if(frm.elements[i].className.indexOf('required')>-1){
    			if(frm.elements[i].value.trim()==''){
    				errText='You have skipped a required field';
    				fldLabel=frm.elements[i].parentNode.getElementsByTagName('label')[0];
    				if(fldLabel)
    					errText=fldLabel.innerHTML.trim()+' is a required field.'
    				frm.elements[i].focus();
    				alert(errText);
    				return false;
    			}
    		}
    	}
    	return true;
    }
    if(document.addEventListener)
      frm.addEventListener('submit',document.forms[i].validator,false);
    else if (document.attachEvent)
      frm.attachEvent('onsubmit', document.forms[i].validator);
	}
}

var months=['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
var days=['SUN','MON','TUE','WED','THU','FRI','SAT'];
function monthlyCalendar(cd,tf,sd){
	var startDate=new Date(fill(sd.getMonth()+1,2)+'/1/'+sd.getFullYear());
	var endDate= new Date(fill(sd.getMonth()+2,2)+'/0/'+sd.getFullYear());
	var t = document.createElement('table');
	var th=document.createElement('thead');
	var r = document.createElement('tr');
	var lt = document.createElement('td');
	lt.calendar=t;
	lt.caldiv=cd;
	lt.targetField=tf;
	lt.newDate = new Date(fill(sd.getMonth(),2)+'/1/'+sd.getFullYear());
	lt.onclick=function(){
		this.caldiv.appendChild(new monthlyCalendar(this.caldiv,this.targetField,new Date(this.newDate)));
		this.caldiv.removeChild(this.calendar);
	}
	lt.onmouseover=function(){this.className='hovercal';}
	lt.onmouseout=function(){this.className='normalcal';}
	lt.innerHTML='&lt;';
	lt.style.fontWeight='900';
	r.appendChild(lt);
	var m = document.createElement('td');
	m.setAttribute('colSpan','5');
	m.innerHTML=months[sd.getMonth()]+' '+sd.getFullYear();
	m.className='inertcal';
	r.appendChild(m);
	var rt = document.createElement('td');
	rt.calendar=t;
	rt.caldiv=cd;
	rt.targetField=tf;
	rt.newDate = new Date(fill(sd.getMonth()+2,2)+'/1/'+sd.getFullYear());
	rt.onclick=function(){
		this.caldiv.appendChild(new monthlyCalendar(this.caldiv,this.targetField,new Date(this.newDate)));
		this.caldiv.removeChild(this.calendar);
	}
	rt.onmouseover=function(){this.className='hovercal';}
	rt.onmouseout=function(){this.className='normalcal';}
	rt.innerHTML='&gt;';
	rt.style.fontWeight='900';
	r.appendChild(rt);
	th.appendChild(r);
	var dr = document.createElement('tr');
	for(var i=0;i<days.length;i++){
		var dd=document.createElement('td');
		dd.className='inertcal mini';
		dd.innerHTML=days[i];
		dr.appendChild(dd);
	}
	th.appendChild(dr);
	t.appendChild(th);
	var i=0-startDate.getDay()+1;
	var mval=fill(startDate.getMonth()+1,2)+'/';
	var yval='/'+startDate.getFullYear();
	var ed=endDate.getDate();
	tb=document.createElement('tbody');
	while(i<ed){
		var nr = document.createElement('tr');
		for(var j=0;j<7;j++,i++){
			var nd = document.createElement('td');
			if(i<1||i>ed){
				nd.className='inertcal';
			}else{
				nd.innerHTML=i;
				nd.newDate=mval+i+yval;
				nd.caldiv=cd;
				nd.targetField=tf;
				nd.onmouseover=function(){this.className='hovercal';}
				nd.onmouseout=function(){this.className='normalcal';}
				nd.onclick=function(){
					this.targetField.value=this.newDate;
					this.caldiv.parentNode.removeChild(this.caldiv);
				}
				if(i==sd.getDate()){
					nd.style.border='1px inset';
				}
			}
			nr.appendChild(nd);
		}
		tb.appendChild(nr);
	}
	t.appendChild(tb);
	return t;
}
function flipflop(invisibleArray,visibleElement,newState){
	for(var i=0;i<invisibleArray.length;i++)
		if(document.getElementById(invisibleArray[i]))
			document.getElementById(invisibleArray[i]).style.display='none';
	if(document.getElementById(visibleElement))
		document.getElementById(visibleElement).style.display=newState;
}
function attachOnload(func)
{
  if(document.addEventListener)
  {
    document.addEventListener('DOMContentLoaded',func,false);
  }
  else if (document.attachEvent)
  {
    document.attachEvent('onreadystatechange', func);
  }
}

attachOnload(prepFields);
function completeImage(sourceText,widthText,heightText,classText,altText)
{
	var oImg = document.createElement('img');
	oImg.setAttribute('src',sourceText);
	oImg.setAttribute('width',widthText);
	oImg.setAttribute('height',heightText);
	oImg.className=classText;
	oImg.setAttribute('alt',altText);
	oImg.setAttribute('title',altText);
	return oImg;
}
function completeDiv(classText,contents)
{
	var oDiv = document.createElement('div');
	oDiv.className=classText;
	if(contents)
		oDiv.innerHTML = contents;
	return oDiv;
}
function completeLi(contents)
{
	var oLi = document.createElement('li');
	oLi.innerHTML=contents;
	return oLi;
}
function loadDesc(characterName,targetNode)
{
	if(!targetNode)
		targetNode='instructions';
	new Ajax.Request('json/'+characterName+'.js', {
  method: 'get',
  onSuccess: function(transport) {
    var character;
    eval(transport.responseText);
    if(character)
    {
    	tnode = $(targetNode);
    	while(tnode.childNodes.length>0)
    		tnode.removeChild(tnode.childNodes[0]);
    	if(character.image)
    		tnode.appendChild(completeImage(character.image,'150','150','animatedCharacter',character.alt));
    	var dDiv=completeDiv('offsetInstructions');
    	if(character.maru)
    		tnode.appendChild(completeImage(character.maru.src,'75','75','maru',character.maru.alt));
    	if(character.nigori)
    		tnode.appendChild(completeImage(character.nigori.src,'75','75','maru',character.nigori.alt));
    	if(character.intro)
    		dDiv.appendChild(completeDiv('',character.intro));
	    var steps = document.createElement('ul');
    	if(character.steps)
    	{
	    	for(var i=0;i<character.steps.length;i++)
	    		steps.appendChild(completeLi(character.steps[i]));
	    }
	    dDiv.appendChild(steps);
    	if(character.note)
    		dDiv.appendChild(completeDiv('',character.note));
    	tnode.appendChild(dDiv);
    }
    return false;
  }});

}

