///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
var btn = {
    init : function() {
        if (!document.getElementById || !document.createElement || !document.appendChild) return false;
        as = btn.getElementsByClassName('btn(.*)');
        for (i=0; i<as.length; i++) {
            if ( as[i].tagName == "INPUT" && ( as[i].type.toLowerCase() == "submit" || as[i].type.toLowerCase() == "button" ) ) {
                var tt = document.createTextNode(as[i].value);
                var a1 = document.createElement("a");
                a1.className = as[i].className;
                a1.id = as[i].id;
                as[i] = as[i].parentNode.replaceChild(a1, as[i]);
                as[i] = a1;
                as[i].style.cursor = "pointer";
            }
            else if (as[i].tagName == "A") {
                var tt = as[i].firstChild;
            }
            else { return false };
            var i1 = document.createElement('i');
            var i2 = document.createElement('i');
            var s1 = document.createElement('span');
            var s2 = document.createElement('span');
            s1.appendChild(i1);
            s1.appendChild(s2);
            s1.appendChild(tt);
            as[i].appendChild(s1);
            as[i] = as[i].insertBefore(i2, s1);
        }
    },
    addEvent : function(obj, type, fn) {
        if (obj.addEventListener) {
            obj.addEventListener(type, fn, false);
        }
        else if (obj.attachEvent) {
            obj["e"+type+fn] = fn;
            obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
            obj.attachEvent("on"+type, obj[type+fn]);
        }
    },
    getElementsByClassName : function(className, tag, elm) {
        var testClass = new RegExp("(^|\s)" + className + "(\s|$)");
        var tag = tag || "*";
        var elm = elm || document;
        var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
        var returnElements = [];
        var current;
        var length = elements.length;
        for(var i=0; i<length; i++){
            current = elements[i];
            if(testClass.test(current.className)){
                returnElements.push(current);
            }
        }
        return returnElements;
    }
}

btn.addEvent(window,'load', function() { btn.init();} );


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function submitActionRequest(formName, actionValue) {
	// Avoids a useless call to the server.
	if (actionValue == 'close') {
		window.close();
	}
	
	// Submit the specified form with the given actionValue.
	var form = document.getElementById(formName);
	var action = document.createElement("input");
		action.setAttribute("type", "hidden");
		action.setAttribute("name", "action");
		action.setAttribute("id", "action");
		action.setAttribute("value", actionValue);
		
		form.appendChild(action);
		form.submit();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function submitActionEditRequest(formName, actionValue, editValue) {
	// Avoids a useless call to the server.
	if (actionValue == 'close') {
		window.close();
	}
	
	// Submit the specified form with the given actionValue and editValue.
	var form = document.getElementById(formName);
	var action = document.getElementById('action');
		action.setAttribute("value", actionValue);
	var edit = document.createElement("input");
		edit.setAttribute("type", "hidden");
		edit.setAttribute("name", "edit");
		edit.setAttribute("id", "edit");
		edit.setAttribute("value", editValue);
		
		form.appendChild(edit);
		form.submit();
}


///////////////////////////////////////////////////////////////////////////////
// APPLICATION MAIN
///////////////////////////////////////////////////////////////////////////////
function loadSelector() {
	var cursor = document.getElementById('cursor');
	var selector = document.getElementById('selector');

	if( selector != null && cursor != null ) {
		for( i = 0; i < selector.rows.length; i++ ) {
			row = selector.rows[ i ];
			for( j = 1; j < row.cells.length; j++ ) {
				cell = row.cells[ j ];
				cell.selector = selector;
				cell.x = j;
				cell.y = i;
				cell.selected = false;
				cell.cursorHeight = parseInt(cursor.value);

				cell.enable = function() {
					this.className = 'rollover';
				}

				cell.disable = function() {
					if( this.selected )
						this.className = 'selected';
					else
						this.className = 'rollout';
				}

				cell.select = function() {
					this.selected = true;
					this.className = 'rollover selected';
				}
				
				cell.deselect = function() {
					this.selected = false;
					this.className = 'rollout';
				}

				cell.available = function() {
					result = this.y + this.cursorHeight <= this.selector.rows.length;

					if( cell.cursorHeight > 1 && result ) {
						for( p = this.y; p < this.cursorHeight + this.y; p++ ) {
							if( this.selector.rows[p].cells[this.x].className == "notAvailable" ) {
								result = false;
								break;
							}
						}
					}

					return result;
				}

				if( cell.className != "notAvailable" ) {
					cell.onmouseover = function() {
						if( this.available() ) {
							for( p = this.y; p < this.cursorHeight + this.y; p++ ) {
								this.selector.rows[p].cells[this.x].enable();
							}
						}
					}
					cell.onmouseout = function() {
						if( this.available() ) {
							for( p = this.y; p < this.cursorHeight + this.y; p++ ) {
								this.selector.rows[p].cells[this.x].disable();
							}
						}
					}
					cell.onclick = function() {
						if( this.available() ) {
							if( !this.childNodes[3].value || !this.childNodes[1].value ) {
								document.getElementById('selectedTimeDisplay').innerHTML = this.childNodes[2].value;
								document.getElementById('selectedTimeField').value = this.childNodes[0].value;
							}
							else {						
								document.getElementById('selectedTimeDisplay').innerHTML = this.childNodes[3].value;
								document.getElementById('selectedTimeField').value = this.childNodes[1].value;
							}							

							selector = document.getElementById('selector');
							for( a = 0; a < selector.rows.length; a++ ) {
								row = selector.rows[ a ];
								for( b = 1; b < row.cells.length; b++ ) {
									if(row.cells[b].selected)
										row.cells[b].deselect();
								}
							}

							for( p = this.y; p < this.cursorHeight + this.y; p++ ) {
								this.selector.rows[p].cells[this.x].select();
							}
						}
					}
				}
			}
		}
	}
}


function addEvent(obj, type, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(type, fn, false);
    }
    else if (obj.attachEvent) {
        obj["e"+type+fn] = fn;
        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
        obj.attachEvent("on"+type, obj[type+fn]);
    }
}

addEvent(window, 'load', loadSelector);

function getInputProperties(inputElement) {
	var inputProperties = new Array();
	var nameValues = new Array();
	var i = new Number(0);
	if (inputElement.value) {
		nameValues = ["value", inputElement.value];
		inputProperties[i] = nameValues;
		i++;
	}
	if (inputElement.name) {
		nameValues = ["name", inputElement.name];
		inputProperties[i] = nameValues;
		i++;
	}
	if (inputElement.id) {
		nameValues = ["id", inputElement.id];
		inputProperties[i] = nameValues;
		i++;
	}
	if (inputElement.type) {
		nameValues = ["type", inputElement.type];
		inputProperties[i] = nameValues;
		i++;
	}
	if (inputElement.checked) {
		nameValues = ["checked", inputElement.checked];
		inputProperties[i] = nameValues;
		i++;
	}
	if (inputElement.size) {
		nameValues = ["size", inputElement.size];
		inputProperties[i] = nameValues;
		i++;
	}
	return inputProperties;
}

function deleteRow(tableid, rowName){
	var table = document.getElementById(tableid);
	//var tabRows = document.getElementById(tableid).rows;
	var tabRows = table.rows;
	for (var i = 0; i < tabRows.length; i++) { //
		if (tabRows[i].name == rowName) {
			table.deleteRow(i);
		}
	}
}


// Takes a given row indexed by rowNumber and creates a new row with the rowLabel appended 
// to the name of the re.  Also optionally sets the rowCountElemId which maintains how many rows
// have been added.
var tableRowIndex = new Number(0);
function duplicateRow(formid, tableid, rowNumber, rowLabel, rowCountElemId, actionValue){
	//Grab array of TDs (the row)
	var table =  document.getElementById(tableid);
	var rowCells = table.rows[rowNumber].cells;
    var tbody = document.getElementById(tableid).getElementsByTagName("TBODY")[0];
	var tdElements;
	var tdInputProperties;
    //New row variables
    var newRow = document.createElement("TR");
    if (rowCountElemId != null) {
    	// unary '+' operator is intended to convert form text to number
    	tableRowIndex = +document.getElementById(rowCountElemId).value++;
    }
    var newRowName = rowLabel+tableRowIndex;
   	tableRowIndex++;
    var newTD;
	var newInput;
	var newAnchor;
	//Traverse the row's cells
	newRow.setAttribute("name", "row"+newRowName);
	for (var i = 0; i <  rowCells.length; i++) {
		tdElements =  rowCells[i].childNodes;
		newTD = document.createElement("TD");
		newTD.className = rowCells[i].className;
		//Traverse each TD's elements
		for (var j = 0; j < tdElements.length; j++) {
			if (tdElements[j].nodeValue) {//If the element has a non-null value for nodeValue, then it must be a label
				//Add label to new TD element
				newTD.appendChild (tdElements[j].nodeValue);
			} else {
				if (tdElements[j].nodeName == "INPUT") {
					tdInputProperties = getInputProperties(tdElements[j]);
					newInput=document.createElement("input");
					for (var k = 0; k < tdInputProperties.length; k++) {
						if (tdInputProperties[k][0] == "value") {
							if (tdElements[j].type=="checkbox") {//Firefox needs a value to be set when checked (apparently no default for checkboxes)
								newInput[tdInputProperties[k][0]] = "on";
							} else {
								newInput[tdInputProperties[k][0]] = "";
							}
							newInput.setAttribute(tdInputProperties[k][0], "");
						} else if (tdInputProperties[k][0] == "name"){
							newInput[tdInputProperties[k][0]] = tdInputProperties[k][1]+newRowName;						
						} else {
							newInput[tdInputProperties[k][0]] = tdInputProperties[k][1];						
						}
					}
					newTD.appendChild (newInput);
				} else if (tdElements[j].nodeName == "A") {
					newAnchor = document.createElement("a");
					//newAnchor.href = "javascript:deleteRow('"+tableid+"', 'row"+newRowName+"')";
					newAnchor.href = "javascript:submitActionEditRequest('"+formid+"', '"+actionValue+"', '"+newRowName+"')";
					//newAnchor.id = "";
					//newAnchor.appendChild (document.createTextNode("more..."));
					newAnchor.appendChild (document.createTextNode(tdElements[j].firstChild.nodeValue));
					newTD.appendChild (newAnchor);
				}
			}
		}
	    newRow.appendChild(newTD);
	}
    tbody.appendChild(newRow);
}
