/*  ONLOAD EVENT HANDLER  */

document.onloadStack = new Array();
function doOnloadStack() {
	for (var i=0; i< document.onloadStack.length; i++) {
		eval(document.onloadStack[i]);
	}
}
window.onload = doOnloadStack;



/*  BACKGROUND COLOR SHIFTER  */

r_start = r_cur = r_end = 255;
g_start = g_cur = g_end = 255;
b_start = b_cur = b_end = 255;

r_step = g_step = b_step = 1;

shift_background = function() {
  var fps = 10;
  var speed = 5; // time in seconds to make transition
  var object_name = "page_body";  // object whose background color will change

  if (Math.abs(r_end - r_cur) < Math.abs(r_step)) {
    r_start = r_cur;
    r_end = Math.floor(Math.random()*256);
    r_step = (r_end - r_start) / (speed * fps);
  } else {
    r_cur += r_step;
  }
  if (Math.abs(g_end - g_cur) < Math.abs(g_step)) {
    g_start = g_cur;
    g_end = Math.floor(Math.random()*256);
    g_step = (g_end - g_start) / (speed * fps);
 } else {
    g_cur += g_step;
  }
  if (Math.abs(b_end - b_cur) < Math.abs(b_step)) {
    b_start = b_cur;
    b_end = Math.floor(Math.random()*256);
    b_step = (b_end - b_start) / (speed * fps);
  } else {
    b_cur += b_step;
  }
  getElem(object_name).style.backgroundColor = "#" + int_to_hex(r_cur) + int_to_hex(g_cur) + int_to_hex(b_cur);
  setTimeout("shift_background()", 1000 / fps);
}

// convert ints to hex strings
int_to_hex = function(i) {
  i = parseInt(i);
  hex_ar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
  hex = "";
  while (i > 0) {
    hex = hex_ar[i % 16] + hex;
    i = Math.floor(i / 16);
  }
  // zero pad
  if (hex.length == 1) hex = "0" + hex;
  return hex;
}
    

/*  DROPDOWN MENUS  */

sfHover = function() {
	var sfEls = document.getElementById("nav").getElementsByTagName("LI");
	for (var i=0; i<sfEls.length; i++) {
		sfEls[i].onmouseover=function() {
			this.className+=" hover";
		}
		sfEls[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" hover\\b"), "");
		}
	}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);




/* POPUP MARKDOWN CHEAT SHEET  */

popup_markdown = function() {
  day = new Date();
  id = day.getTime();
  eval("page" + id + " = window.open('markdown.html', '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=450,height=400');");
}


/*  CHECK EMAIL ADDRESSES */

function checkEmail(emailStr){
	var checkTLD=0; // boolean to check TLD
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;  // This the list of known TLDs that an e-mail address must end with.
	var emailPat=/^(.+)@(.+)$/; // user@domain regexp
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";  // forbidden characters
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/; // joe@[123.124.233.4] is a legale-mail address. NOTE: The square brackets are required.
	var atom=validChars + '+'; // The following string represents an atom (basically a series of non-special characters.)
	var word="(" + atom + "|" + quotedUser + ")"; // The following string represents one word in the typical username. For example, in john.doe@somewhere.com, john and doe are words. Basically, a word is either an atom or quoted string.
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$"); // The following pattern describes the structure of the user
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$"); // The following pattern describes the structure of a normal symbolic domain, as opposed to ipDomainPat, shown above.

	var matchArray=emailStr.match(emailPat); // Begin with the coarse pattern to simply break up user@domain into different pieces that are easy to analyze.
	if (matchArray==null){ // Too many/few @'s or something; basically, this address doesn't even fit the general mould of a valid e-mail address.
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	for (i=0; i<user.length; i++) { // Start by checking that only basic ASCII characters are in the strings (0-127).
		if (user.charCodeAt(i)>127) {
			return false;
 		  }
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false;
	   }
	}
	if (user.match(userPat)==null) { // See if "user" is valid 
		return false;
	}
	var IPArray=domain.match(ipDomainPat); // See if ip address is valid 
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false;
		   }
		}
		return true;
	}
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			return false;
	   }
	}
	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return false;
	}
	if (len<2) {
		return false;
	}
	return true;
}
	
Number.prototype.padNumber = function(minStringLength, val) {
	str = this.toString();
	val = val.toString();
	for (var i = str.length; i < minStringLength; i++) {
		str = val + str;
	}
	return str;
}


/*  FORMS */

show_or_submit = function(button) {
	if (button.id == "add_update_button") {
		if (Element.hasClassName("add_form_data", "hidden")) {
			Element.removeClassName("add_form_data","hidden");
			Element.removeClassName("add_button_cancel","hidden");
		} else {
			if (validate(document.forms['add_update']))
				document.forms['add_update'].submit();
		}
	}  
	if (button.id == "add_event_button") {
		if (Element.hasClassName("add_form_data", "hidden")) {
			Element.removeClassName("add_form_data","hidden");
			Element.removeClassName("add_button_cancel","hidden");
		} else {
			if (validate(document.forms['add_event']))
				document.forms['add_event'].submit();
		}
	}  
	if (button.id == "add_item_button") {
		if (Element.hasClassName("add_form_data", "hidden")) {
			Element.removeClassName("add_form_data","hidden");
			Element.removeClassName("add_button_cancel","hidden");
		} else {
			if (validate(document.forms['add_item']))
				document.forms['add_item'].submit();
		}
	}  
	if (button.id == "add_button_cancel") {
		Element.addClassName("add_form_data","hidden");
		Element.addClassName("add_button_cancel","hidden");
	}  
}

function radioValue(radioGroup) {
	var val = 0;
	for (i = 0; i < radioGroup.length; i++) {
		if (radioGroup[i].checked) {
 			val = radioGroup[i].value; 
		}
	}
	return val;
}


function clearField(field, defaultText) {
	if (field.value == defaultText) {
		field.value = '';
	}
}

function resetField(field, defaultText) {
	if (field.value == '') {
		field.value = defaultText;
	}
}

function nextField(formField) {
	if (formField.name == "phoneArea") {
		var limit = 3;
		var next = "phonePrefix";
	}
	if (formField.name == "phonePrefix") {
		var limit = 3;
		var next = "phoneSuffix";
	}
	if (formField.value.length >= limit) {
		document.getElementById(next).focus();
	}
}


/*  EVENTS SLIDESHOW  */

slideshow_delay = 5000;  // ms

slideshow_next = function() {
	var current_image = 'slideshow_image' + slideshow_current_image_number;
	var slideshow_new_image_number = (slideshow_current_image_number == slideshow_images - 1) ? 0 : slideshow_current_image_number + 1;
	var new_image ='slideshow_image' + slideshow_new_image_number;
	var fade_out = new Effect.Fade(current_image);
	var fade_in = new Effect.Appear(new_image);
	slideshow_current_image_number = slideshow_new_image_number;
	setTimeout('slideshow_next()', slideshow_delay);
}

//-- form date updater

function updateDay(datePrefix, offset, formName) {  // datePrefix is what goes before "month", "day",or "year" in the form field name; offset is how many fields precede the start of the date numbering (like if there's a "choose..." option at the top
	if (!datePrefix) {
    	var datePrefix = '';
	}
	if (!offset) {
    	var offset = 0;
	}
	if (!formName) {
    	var form = 'document.forms[0].';
	} else {
		var form = "document.forms['" + formName + "'].";
	}
	var monthDaysAr = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var d = (datePrefix.substr(-1, 1) != '_') ? 'D' : 'd';
	var m = (datePrefix.substr(-1, 1) != '_') ? 'M' : 'm';
	var y = (datePrefix.substr(-1, 1) != '_') ? 'Y' : 'y';

	var year = eval(form + datePrefix + y + 'ear');
	var selectedYear = year.selectedIndex;
	var month = eval(form + datePrefix + m + 'onth');
	var selectedMonth = month.selectedIndex;
	var day = eval(form + datePrefix + d + 'ay');
	var selectedDay = day.selectedIndex;
	
	if ((selectedYear >= offset) && (year.options[selectedYear].value % 4 == 0)) {
		monthDaysAr[1] = 29;
	} else {
		monthDaysAr[1] = 28;
	}
	
	if (selectedMonth >= offset) {
	 var days = monthDaysAr[selectedMonth - offset];
	} else {
	 var days = 31;
	}
	
	for (var i = day.options.length; i >= offset; i--){
		day.options[i] = null;
	}
	
	for (var i=offset; i < days + offset; i++) {
		var val = i+1-offset;
		val = val.padNumber(2, 0);
		day.options[i] = new Option(val, val);
	}
	if (selectedDay > day.options.length - 1) {
		selectedDay = day.options.length - 1;
	}
	day.selectedIndex = selectedDay;
}


//-- / form date updater

//-- big chunky form validation

function validate(form) {

	// home.php - site update
	if ((form.name == "add_update") || (form.name.substring(0,11) == "edit_update")) {
		if (form.title.value.trim() == '') {
			alert("Please enter a name for this update.");
			form.title.focus();
			return false;
		}
		if (form.body.value.trim() == '') {
			alert("Please enter the update.");
			form.body.focus();
			return false;
		}
		return true;
	}

	// events.php - event
	if ((form.name == "add_event") || (form.name.substring(0,10) == "edit_event")) {
		if (form.starting_at_month.selectedIndex == 0) {
			alert("Please enter a month.");
			form.starting_at_month.focus();
			return false;
		}
		if (form.starting_at_day.selectedIndex == 0) {
			alert("Please enter a day of the month.");
			form.starting_at_day.focus();
			return false;
		}
		if (form.starting_at_year.selectedIndex == 0) {
			alert("Please enter a year.");
			form.starting_at_year.focus();
			return false;
		}
		if (form.starting_at_hour.selectedIndex == 0) {
			alert("Please enter an hour.");
			form.starting_at_hour.focus();
			return false;
		}
		if (form.starting_at_minute.selectedIndex == 0) {
			alert("Please enter a minute.");
			form.starting_at_minute.focus();
			return false;
		}
		if (form.starting_at_ampm.selectedIndex == 0) {
			alert("Please enter am or pm.");
			form.starting_at_ampm.focus();
			return false;
		}
		if (form.location.value.trim() == '') {
			alert("Please enter the location.");
			form.location.focus();
			return false;
		}
		if (form.title.value.trim() == '') {
			alert("Please enter the show title.");
			form.title.focus();
			return false;
		}
		if (form.description.value.trim() == '') {
			alert("Please enter a description.");
			form.description.focus();
			return false;
		}
		return true;
	}

	// sale.php - sale
	if ((form.name == "add_item") || (form.name.substr(0,9) == "edit_item")) {
		if (form.category_id.value.trim() == '') {
			alert("Please choose a category.");
			form.artist.focus();
			return false;
		}
		if (form.artist.value.trim() == '') {
			alert("Please enter the artist's name.");
			form.artist.focus();
			return false;
		}
		if (form.title.value.trim() == '') {
			alert("Please enter the title.");
			form.title.focus();
			return false;
		}
		if (form.price.value.trim() == '') {
			alert("Please enter the price.");
			form.price.focus();
			return false;
		}
		if (form.description.value.trim() == '') {
			alert("Please enter a description.");
			form.description.focus();
			return false;
		}
		return true;
	}

	// contact.php - sale
	if (form.name == "email_form") {
		if (form.email_name.value.trim() == '') {
			alert("Please enter your name.");
			form.email_name.focus();
			return false;
		}
		if (!checkEmail(form.address.value.trim())) {
			alert("Please a valid email address.");
			form.address.focus();
			return false;
		}
		if (form.subject.value.trim() == '') {
			alert("Please enter a subject.");
			form.subject.focus();
			return false;
		}
		if (form.message.value.trim() == '') {
			alert("Please enter a message to send.");
			form.message.focus();
			return false;
		}
		return true;
	}

	//default
	alert("invalid form: " + form.name);
	return false;
}


//-- / big chunky form validation


//-- update image on edit forms
update_image = function(select, edit_form_id) {
	Element.addClassName('file_field' + edit_form_id + '_0', 'hidden');
	Element.addClassName('file_field' + edit_form_id + '_1', 'hidden');
	Element.addClassName('file_field' + edit_form_id + '_2', 'hidden');
	Element.removeClassName('file_field' + edit_form_id + '_' + select.selectedIndex, 'hidden');
}

//--  delete event
delete_event = function(id) {
	if (confirm("Are you sure you want to delete this event?")) {
		var deleteForm = document.createElement('FORM');
		deleteForm.setAttribute('id', 'deleteForm');
		deleteForm.setAttribute('name', 'deleteForm');
		deleteForm.setAttribute('method', 'post');
		deleteForm.setAttribute('action', 'events.php');

		var input1 = document.createElement('INPUT');
		input1.setAttribute('type', 'hidden');
		input1.setAttribute('name', 'act');
		input1.setAttribute('value', 'del');

		var input2 = document.createElement('INPUT');
		input2.setAttribute('type', 'hidden');
		input2.setAttribute('name', 'id');
		input2.setAttribute('value', id);

		deleteForm.appendChild(input1);
		deleteForm.appendChild(input2);
		
		document.getElementById('col2').appendChild(deleteForm);
		document.getElementById('deleteForm').submit();
	}
}
delete_item = function(id, r_used, r_search, r_format, r_artist, r_page) {
	if (confirm("Are you sure you want to delete this item?")) {
		var deleteForm = document.createElement('FORM');
		deleteForm.setAttribute('id', 'deleteForm');
		deleteForm.setAttribute('name', 'deleteForm');
		deleteForm.setAttribute('method', 'post');
		deleteForm.setAttribute('action', 'index.php');

		var input1 = document.createElement('INPUT');
		input1.setAttribute('type', 'hidden');
		input1.setAttribute('name', 'act');
		input1.setAttribute('value', 'del');

		var input2 = document.createElement('INPUT');
		input2.setAttribute('type', 'hidden');
		input2.setAttribute('name', 'id');
		input2.setAttribute('value', id);

		var input3 = document.createElement('INPUT');
		input3.setAttribute('type', 'hidden');
		input3.setAttribute('name', 'r_used');
		input3.setAttribute('value', r_used);

		var input4 = document.createElement('INPUT');
		input4.setAttribute('type', 'hidden');
		input4.setAttribute('name', 'r_search');
		input4.setAttribute('value', r_search);

		var input5 = document.createElement('INPUT');
		input5.setAttribute('type', 'hidden');
		input5.setAttribute('name', 'r_format');
		input5.setAttribute('value', r_format);

		var input6 = document.createElement('INPUT');
		input6.setAttribute('type', 'hidden');
		input6.setAttribute('name', 'r_artist');
		input6.setAttribute('value', r_artist);

		var input7 = document.createElement('INPUT');
		input7.setAttribute('type', 'hidden');
		input7.setAttribute('name', 'r_page');
		input7.setAttribute('value', r_page);

		deleteForm.appendChild(input1);
		deleteForm.appendChild(input2);
		deleteForm.appendChild(input3);
		deleteForm.appendChild(input4);
		deleteForm.appendChild(input5);
		deleteForm.appendChild(input6);
		deleteForm.appendChild(input7);
		
		document.getElementById('col2').appendChild(deleteForm);
		document.getElementById('deleteForm').submit();
	}
}
delete_update = function(id) {
	if (confirm("Are you sure you want to delete this update?")) {
		var deleteForm = document.createElement('FORM');
		deleteForm.setAttribute('id', 'deleteForm');
		deleteForm.setAttribute('name', 'deleteForm');
		deleteForm.setAttribute('method', 'post');
		deleteForm.setAttribute('action', 'home.php');

		var input1 = document.createElement('INPUT');
		input1.setAttribute('type', 'hidden');
		input1.setAttribute('name', 'act');
		input1.setAttribute('value', 'del');

		var input2 = document.createElement('INPUT');
		input2.setAttribute('type', 'hidden');
		input2.setAttribute('name', 'id');
		input2.setAttribute('value', id);

		deleteForm.appendChild(input1);
		deleteForm.appendChild(input2);
		
		document.getElementById('col2').appendChild(deleteForm);
		document.getElementById('deleteForm').submit();
	}
}

/*  / FORMS  */
