function getThisForm(el) {	
	while (el.parentNode && el.parentNode.tagName.toLowerCase() != "form"){
		el = el.parentNode;
	}
	return el.parentNode;
}

function initCommon() {
	isIE = (document.all)? true:false;
	isSafari = navigator.userAgent.toLowerCase().indexOf("safari") != -1;
	if (document.getElementById("AccordionItems")) {
		new Accordian('AccordionItems',3,'header_highlight');
	}
}

function getElementsByClassName(className, parentElement) {
    if (Prototype.BrowserFeatures.XPath) {
        var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
        return document._getElementsByXPath(q, parentElement);
    } else {
        var children = ($(parentElement) || document.body).getElementsByTagName('*');
        var elements = [], child;
        for (var i = 0, length = children.length; i < length; i++) {
            child = children[i];
            if (Element.hasClassName(child, className))
                elements.push(Element.extend(child));
        }
        return elements;
    }
};

//When called will put the cursor in the first editable field
function setFocusToFirstField() {
	if (document.forms[0]) {
		var i;
		var formName = document.forms[0].name;
		for (i = 0; i< document.forms[0].elements.length; i++) {
			var el = document.forms[0].elements[i];
			var visibility = getStyle(el,'visibility');
			var display = getStyle(el,'display');
			//alert(el.tagName + '\n' + el.nodeName + '\n' + el.outerHTML + '\n' + el.type);
			if (el.type != "hidden" && visibility != "hidden" && display != "none" && ((el.tagName == "INPUT" && el.type != "submit") || el.tagName == "SELECT" || el.type == "textarea"))            {
				if ((formName == "driver" && el.id == "driver_R1_Gender") || formName != "driver") {
					el.focus();
					break;
				}
			}
		}
	}
}

/* Function used by service forms for Driver and Vehicle page to set focus on first field in a table */
function setFocusToFirstFieldInTable(tableEl) {
    if (tableEl) {
        var i;
        var tdEls = tableEl.getElementsByTagName("td"); 
        for (i = 0; i < tdEls.length; i++) {
            var tdEl = tdEls[i];
            // Get input element if available
            var formEl = tdEl.getElementsByTagName("INPUT")[0];
            if (!formEl) {
                formEl = tdEl.getElementsByTagName("SELECT")[0];
            }

            if (formEl) {
                var visibility = getStyle(formEl, 'visibility');
                var display = getStyle(formEl, 'display');
                //alert(formEl.tagName + '\n' + formEl.nodeName + '\n' + formEl.outerHTML + '\n' + formEl.type);					
                if ((formEl.tagName == "INPUT" && formEl.type != "hidden" && visibility != "hidden" && display != "none" && formEl.type != "submit") || formEl.tagName == "SELECT" || formEl.type == "textarea") {
                    formEl.focus();
                    break;
                }
            }
        }
    }
}

function isValidDate(dateStr) {
	// Checks for the following valid date formats:
	// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
	// Also separates date into month, day, and year variables
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;
	// To require a 4 digit year entry, use this line instead:
	// var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;
	var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) {
		//alert("Date is not in a valid format.")
		return false;
	}
	month = matchArray[1]; // parse date into variables
	day = matchArray[3];
	year = matchArray[4];
	if (month < 1 || month > 12) { // check month range
		//alert("Month must be between 1 and 12.");
		return false;
	}
	if (day < 1 || day > 31) {
		//alert("Day must be between 1 and 31.");
		return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		//alert("Month "+month+" doesn't have 31 days!")
		return false
	}
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap)) {
			//alert("February " + year + " doesn't have " + day + " days!");
			return false;
		}
	}
	return true;  // date is valid
}

//parses out the URL parameters from the URL string
function getURLParameters()
{
	var params = new Array();
	var query = location.search.substring(1);
	var pairs = query.split("&");
	for(var i = 0; i < pairs.length; i++) {
		var pos = pairs[i].indexOf('=');
		if (pos == -1) continue;
		var name = pairs[i].substring(0,pos);
		var value = pairs[i].substring(pos+1);
		params[name] = unescape(value);
	}
	return params; 		
}

//given an element and the display text, will return the value of the option
function getOptionValueFromText(element,text) {	
	//alert(text);
	for (var i = 0; i < element.options.length; i++) {
		if (element.options[i].text == text) {
			return element.options[i].value;
			break;
		}
	}
	return "";
}

//finds the x position based on browser
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

//finds the y position based on browser
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

//Returns the style depending on browser
function getStyle(el,styleProp)
{
	if (el.currentStyle)
		var y = el.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
	return y;
}

function view_quote_details(table_id,showHideDetailsID) {
	var quote_detail_table = document.getElementById(table_id)
	var showHideDetailsLink = document.getElementById(showHideDetailsID)
	if (quote_detail_table.style.display == '') {
		quote_detail_table.style.display = 'block';		
		showHideDetailsLink.innerText='Hide Details';
	}
	else {
		quote_detail_table.style.display = '';
		showHideDetailsLink.innerText='Show Details';
	}
}

function gotoQuoteTable(goto_page_number,this_page_number) {
	var goto_table = document.getElementById("quote_table_" + goto_page_number);
	var goto_nav = document.getElementById("pageNav_" + goto_page_number);
	var this_table = document.getElementById("quote_table_" + this_page_number);
	var this_nav = document.getElementById("pageNav_" + this_page_number)
	this_table.style.display = 'none';
	this_nav.style.display = 'none';
	goto_table.style.display = 'block';
	goto_nav.style.display = 'block';
}

function showCovLevel(level) {
	var els = document.getElementsByTagName('table');
	var elsLen = els.length;
	var searchClass = 'quoteResultsOuterTable';
	var clPattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	var searchID = level;
	var idPattern = new RegExp("(^|\\s)"+searchID+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( clPattern.test(els[i].className) && idPattern.test(els[i].id) ) {
			els[i].style.display = 'block';
		}
		else if (clPattern.test(els[i].className)) {
			els[i].style.display = 'none';
		}
	}
}

function makeDependantFieldsVisible() {
	var formId = document.forms[0].id;
	var currFieldName;
	var currFieldEl;
	var currFieldValue;
	var visibility;
	for (var f in deps) {
		parentFieldName = deps[f]['parent_field_name'];
		parentFieldId = formId+'_R1_'+parentFieldName;
		parentFieldEl = document.getElementById(parentFieldId);
		parentValues = String(deps[f]['parent_values']).split('|');
		thisFieldName = deps[f]['field_name'];
		thisFieldId = formId+'_R1_'+thisFieldName;
		thisFieldEl = document.getElementById(thisFieldId);
		thisContainerEl = document.getElementById('field_'+thisFieldId);
		if (parentFieldEl.options){
			parentElValue = parentFieldEl.options[parentFieldEl.selectedIndex].text;
		} else if (parentFieldEl.type == 'checkbox') {
			parentElValue = String(parentFieldEl.checked);
		} else {
			parentElValue = parentFieldEl.value;
		}
		//next we need to know when we come to a new field so we can clear it...
		if (currFieldName != thisFieldName){
			currFieldName = thisFieldName;
			currFieldEl = thisFieldEl;
			if (thisFieldEl.options){
				currFieldText = thisFieldEl.options[thisFieldEl.selectedIndex].text;
				clearField(thisFieldEl,false);
			}			
			visibility = 'hidden';
		}
		//alert(parentElValue+'\n'+parentDepValue);
		if (isValueInArray(parentValues,parentElValue) && otherParentsMatch(formId,thisFieldName,deps[f]['display'],deps[f]['valid_value'])){
			if (thisFieldEl.options && getOptionIndexFromText(thisFieldEl,deps[f]['display'])==""){
				disp = deps[f]['display'];
				val = deps[f]['valid_value'];
				thisFieldEl.options[thisFieldEl.options.length] = new Option(disp,val);	
			}
			visibility = 'visible';	
		}
		if (!deps[Number(f) + 1] || (deps[Number(f) + 1] && thisFieldName != deps[Number(f) + 1]['field_name']) || (deps[Number(f) + 1] && parentFieldName != deps[Number(f) + 1]['parent_field_name'])) {				
			//alert('! '+deps[Number(f) + 1]+' || ('+deps[Number(f) + 1]+' && '+depFieldName+' != '+deps[Number(f) + 1]['field_name']+')');
			setFieldVisibility(thisFieldId,visibility);
			if (thisFieldEl.options){
				thisFieldEl.selectedIndex = getOptionIndexFromText(thisFieldEl,currFieldText);
			}
		}
	}
	//alert('loop done')
}

function getOptionIndexFromText(element,text) {	
	//alert(text);
	for (var i = 0; i < element.options.length; i++) {
		if (element.options[i].text == text) {
			return i;
			break;
		}
	}
	return "";
}

function manageDependantFields(el){
	//alert(el.id);
	var formId = el.form.id;
	var elementId = el.id;
	var depFieldName;
	var depFieldId;	
	var depFieldEl;
	var parentFieldName;
	var parentFieldId;
	var parentFieldEl;
	var parentValues;
	var parentValue;
	var currFieldName;
	var currFieldEl;
	var visibility;
	//we start by looping through the dependant fields values...they should be ordered by field_name then sort_order
	for (var f in deps) {
		parentFieldName = deps[f]['parent_field_name'];
		parentFieldId = formId+'_R1_'+parentFieldName;
		parentFieldEl = document.getElementById(parentFieldId);
		if (parentFieldEl.options && parentFieldEl.options.length > 0){
			parentValue = parentFieldEl.options[parentFieldEl.selectedIndex].text;
		} else if (parentFieldEl.type == 'checkbox') {
			parentValue = String(parentFieldEl.checked);
		} else {
			parentValue = parentFieldEl.value;
		}
		//alert(elementId+'\n'+parentFieldId);
		if (elementId == parentFieldId){
			depFieldName = deps[f]['field_name'];
			depFieldId = formId+'_R1_'+depFieldName;
			depFieldEl = document.getElementById(depFieldId);
			parentValues = String(deps[f]['parent_values']).split('|');
			
			//next we need to know when we come to a new field so we can clear it...
			if (currFieldName != depFieldName){
				currFieldName = depFieldName;
				currFieldEl = depFieldEl;
				clearField(depFieldEl,true);
				visibility = 'hidden';
			}
			
			if (isValueInArray(parentValues,parentValue) && otherParentsMatch(formId,depFieldName,deps[f]['display'],deps[f]['valid_value'])){
				if (depFieldEl.options){
					disp = deps[f]['display'];
					val = deps[f]['valid_value'];
					//alert(disp + '\n' + val);
					depFieldEl.options[depFieldEl.options.length] = new Option(disp,val);	
				}
				visibility = 'visible';
			}
			if (!deps[Number(f) + 1] || (deps[Number(f) + 1] && depFieldName != deps[Number(f) + 1]['field_name']) || (deps[Number(f) + 1] && parentFieldName != deps[Number(f) + 1]['parent_field_name'])) {				
				//alert('! '+deps[Number(f) + 1]+' || ('+deps[Number(f) + 1]+' && '+depFieldName+' != '+deps[Number(f) + 1]['field_name']+')');
				setFieldVisibility(depFieldId,visibility);
				manageDependantFields(depFieldEl);
			}
		}
	}
}
function otherParentsMatch(formId,depFieldName,depDisplay,depValue){
	var parentFieldName;
	var parentFieldId;
	var parentFieldEl;
	var parentValue;
	var parentValues;
	for (var f in deps){
		if (deps[f]['field_name'] == depFieldName && deps[f]['display'] == depDisplay && deps[f]['valid_value'] == depValue){
			parentFieldName = deps[f]['parent_field_name'];
			parentFieldId = formId+'_R1_'+parentFieldName;
			parentFieldEl = document.getElementById(parentFieldId);
			parentValues = String(deps[f]['parent_values']).split('|');
			if (parentFieldEl.options){
				parentValue = parentFieldEl.options[parentFieldEl.selectedIndex].text;
			} else if (parentFieldEl.type == 'checkbox') {
				parentValue = String(parentFieldEl.checked);
			} else {
				parentValue = parentFieldEl.value;
			}
			if (!isValueInArray(parentValues,parentValue)){
				return false;
			}			
		}		
	}
	return true;
}
function clearField(el,reset){
	alert(el.id+'\n'+el.value+'\n'+el.checked);
	if (el.options){
		var optMin
		//alert(el.id+'\n'+el.options.length+'\n'+el.value);
		if (el.options.length > 0 && el.options[0].value == ""){
			optMin = 1;
		}
		else {
			optMin = 0;
		}
		while (el.options.length > optMin){
			el.options[el.options.length -1 ] = null;
		}
		if (optMin == 0){
			el.options[0] = new Option('-- Select --','');	
		}
		if(reset){
			el.selectedIndex = 0;
		}
	} else if (el.type == 'checkbox') {		
		el.checked = false;
	} else {
		el.value = "";
	}
}
function resetFieldOrig(fieldId){
	//alert(el.id+'\n'+el.value);
	var el = document.getElementById(fieldId);
	if (el.type=='hidden') {
		el = document.getElementById(fieldId+'_Input');
	}
	var elORIG = document.getElementById(fieldId+'_ORIG');
	var elRO = document.getElementById(fieldId+'_RO');
	if (el.options){
		el.value=elORIG.value
	} else if (el.type == 'checkbox') {
		if (elORIG.value==1) {
			el.checked = true;
		} else {
			el.checked = false;
		}
	} else {
		el.value = elRO.innerHTML;
	}
}
function isValueInArray(a,v){
	for (i in a){
		if (a[i]==v){
			return true;
		}
	}
	return false;
}
function fieldEnableDisable(fid, v) {
    var el = document.getElementById(fid);
    if (v == 'enable') {
        el.disabled = false;
    } else {
        el.disabled = true;
    }
}

function setFieldVisibility(fid,v){
	var pel = document.getElementById('field_'+fid);
	var el = document.getElementById(fid);
	if (v == 'visible'){
		if (el.options){
			var optMin
			if (el.options[0].value == ""){
				optMin = 2;
			}
			else {
				optMin = 1;
			}
			if (el.options.length <= optMin){
				pel.style.display = 'none';
				//pel.style.display = 'block';
				el.selectedIndex = Number(optMin) - 1;
            } else {
                // Need to figure out why selectedIndex is set here. Exception added as a temporary fix.
                if (fid != 'UpdVehicle_R1_garaging_state') {
                    el.selectedIndex = 0;
                }
				pel.style.display = 'block';
			}
			
		} else {
			pel.style.display = 'block';	
		}
	} else {
		pel.style.display = 'none';
		//pel.style.display = 'block';
	}	
}
function editReadOnly(fieldId) {
	var group=String(fieldId.match(/gp\d*/gi));
	var rohidden;
	if (group != 'null') {
		for (x in eval(group)) {
			rohidden=Boolean(eval(group)[x].match(/rohidden/gi));
			activateDeactivateField(eval(group)[x],rohidden);
		}
	} else {
		activateDeactivateField(fieldId,false);
	}	
}
function activateDeactivateField(fieldId,rohidden) {	
	var editField = document.getElementById(fieldId);
	var editFieldParent = document.getElementById('field_'+fieldId.replace(/\./gi,'_'));
	if (editField.type=='hidden') {
		editField = document.getElementById(fieldId+'_Input');
	}
	var roField = document.getElementById(fieldId+"_RO");
	var aField = document.getElementById(fieldId+"_A");
	if (editField.style.display=="none" || editField.style.display=="") {
		editField.style.display="inline";
		roField.style.display="none";
		if (aField) {
			aField.innerHTML="Cancel";
		}
		if (rohidden) {
			editFieldParent.style.display="block";
		}
	} else {
		//editField.value=roField.innerHTML;
		resetFieldOrig(fieldId);
		editField.style.display="none";
		roField.style.display="inline";
		if (aField) {
			aField.innerHTML="Edit";
		}
		if (rohidden) {
			editFieldParent.style.display="none";
		}
	}
}
function getBoolFieldValue(el) {
    if (el.type == 'checkbox' && el.checked) {
        return true;
    } else if (el.type == 'select-one' && el.value == 1) {
        return true;
    } else if (el.length > 0) {
        for (i = 0; i < el.length; i++) {
            if (el[i].type == 'select-one') {
                if (el[i].value == 1) {
                    return true;
                }
            } else if (el[i].checked) {
                if (el[i].value == 1) {
                    return true;
                }
            }
        }
    }
	return false;
}
function setBoolFieldValue(el,bValue) {
	if (el.type == 'checkbox') {
		el.checked = bValue;
	} else if (el.length > 1) {
		for (i=0;i<el.length;i++) {
			if (el[i].value == 1 && bValue) {					
				el[i].checked = true;
			} else if (el[i].value == 0 && !bValue) {
				el[i].checked = true;
			}
		}
	}
	return false;
}
function setLinkedFormVisibility(tableID,del,callerEl) {
	if (del == "") {
		del = false;
	}
	var menuActions;
	var hide = true;
	var table = document.getElementById(tableID);
	var rows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
	
	if (getBoolFieldValue(callerEl)) {
		hide = false;	
	} else {
		if (del) {
			hide = true;
		} else {
			hide = !elementHasData(table);
		}
	}

	menuActions = table.nextSibling;

    if (hide) {
        table.style.display = 'none';
        while (menuActions && menuActions.nodeType != 1) {
          menuActions = menuActions.nextSibling;
        }
        menuActions.style.display = 'none';
    } else {
	    table.style.display = 'block';
        while (menuActions && menuActions.nodeType != 1) {
          menuActions = menuActions.nextSibling;
        } 
        menuActions.style.display = 'block';
	    setBoolFieldValue(callerEl,true);
    }

	var rowInputs;
	if (del) {
		var emptyCnt = 0;
		for (var i = 0; rows[i] != null; i++) {
		    if (!containsToken(rows[i].className, 'hidden', ' ') && !containsToken(rows[i].className, 'deleted', ' ')) {
		        if (elementHasData(rows[i])) {
		            toggleRowDeleted(rows[i]);
		            rowInputs = rows[i].getElementsByTagName('input');
		            for (var j = 0; rowInputs[j] != null; j++) {
		                if (rowInputs[j].name.indexOf("__req") > -1) {
		                    rowInputs[j].checked = true;
		                }
		            }
		        } else {
		            emptyCnt++;
		        }
		    }
		}
		if (getBoolFieldValue(callerEl) & emptyCnt == 0) {
			unhideRow(table);
		}
		touchFields(tableID, hide);
	}
}

/* Function to handle child form validations */
function touchFields(tableID, hide) {
    /* Don't proceed unless the touch_field is present */
    if (!document.getElementById(tableID.substring(0, 9) + '_R1_touch_field')) {
        return;
    }

    var table = document.getElementById(tableID);
    var rows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');

    for (var i = 0; rows[i] != null; i++) {
        var touchFieldElId = tableID.substring(0, 9) + '_R' + (i + 1) + '_touch_field';
        var touchFieldEl = document.getElementById(touchFieldElId);
        if (touchFieldEl) {
            touchFieldEl.value = "";
            if (!containsToken(rows[i].className, 'hidden', ' ') && !containsToken(rows[i].className, 'deleted', ' ')) {
                if (!hide) {
                    touchFieldEl.value = "1";
                }
            }
        }
    }        
}

function elementHasData(el) {
	var selects = el.getElementsByTagName('select');
	//this loops through the select nodes in the element to see if there is any data that needs showing
	//might need to add other field types in there, the incident table that i am making this for has none
	for (var i = 0; selects[i] != null; i++) {
		if (selects[i].value != '') {				
			return true;
		}
	}
	return false;
}
