// Turn off when publishing
var debug = false;

// Event references (mozilla and internet explorer)
var e_moz = 'target';
var e_ie = 'srcElement';

//Map
var map = null;
var geocoder = null;
var address = null;

// Element id references
var _WARNING_JAVASCRIPT 	= 'frmWarningJavascript';
var _FORM_CONTAINER			= 'frmCaseDetails';
var _ERROR_DEF				        = 'Error';
var _BUTTON_CONTAINER		= 'frmCaseSubmit';
var _BUTTON_SUBMIT			    = 'btnSubmit';
var _BUTTON_RESET                = 'btnReset';

// Location fields
var _BUTTON_VALIDATE           = 'btnValidate';
var _BUTTON_VIEW_ON_MAP   = 'btnViewOnMap';
var _INC_ADDRESS                  = 'frmAddressType';
var _INC_ADDRESS_FIELDS     = 'pnlAddress';
var _INC_INTERSECTION           = 'frmIntersectionType';
var _INC_INTERSECTION_FIELDS = 'pnlIntersection';
var _INC_OTHER                       = 'frmOtherType';
var _INC_OTHER_FIELDS          = 'pnlOther';
var _INC_UNKNOWN                 ='frmUnknownType';
var _INC_CITY_FIELDS              = 'pnlIncCity';
var _INC_HOUSE_NO                = 'frmIncHouseNo';
var _INC_STREET_NAME          = 'frmIncStreetName';
var _INC_UNIT                           = 'frmIncUnit';
var _INC_STREET1                    = 'frmIncStreet1';
var _INC_STREET2                    = 'frmIncStreet2';
var _INC_OTHER_LOCATION     = 'frmIncLocationDescription';
var _INC_LOCATION_ERROR     = 'frmIncLocationValidationError';

// Validity
var _VALID_COUNT			= '';

// Phone numbers being used
var _NUMBER_TYPES			= new Array('Telephone','Work','Fax','Mobile');
var _FORM_PREFIX			= 'frm';
var _AC_SUFFIX				= 'AreaCode';
var _NUM_SUFFIX				= 'Number';

//First Name, Last Name, Email
var _FIRST_NAME            = 'frmFirstName';
var _LAST_NAME             = 'frmLastName';
var _EMAIL                       = 'frmEmail';
var _ANONYMOUS_CHECK       = 'frmAnonymous';

/**********************/

/**
 * Page constructor
 *
 */
function formConstr() {

    // Hide javascript warning
    //debug ? '' : ge(_WARNING_JAVASCRIPT).style.display = 'none'; // the <noscript> way is better

    forEachFormElement(function(objCurObj) {
        if (objCurObj.getAttribute('type') != 'file') {
            // Attach event handlers
            if (window.addEventListener) { //mozilla
                objCurObj.addEventListener('blur', fieldTooltipShow, false);
            } else {
                objCurObj.attachEvent('onblur', fieldTooltipShow);
            }
        }

        var objId;
        if (isIE) {
            objId = objCurObj['id'];
        } else {
            objId = objCurObj.getAttribute('id');
        }
        // hide elements according to setting of form-validation-definitions.js
        if (objCurObj && _VALID_DEF[objId] && ge('div_' + objId) && !(_VALID_DEF[objId]['showOnPage'])) {
            $('#div_' + objId).hide();
        }
        // hide mandatory mark according to setting of form-validation-definitions.js
        if (objCurObj && _VALID_DEF[objId] && ge('div_' + objId) && _VALID_DEF[objId]['optional']) {
            $('#' + objId + '_mandatory').hide();
        }
    }, true);


    // submit button event handler
    // reset button event handler
    var objBtnSubmit = ge(_BUTTON_SUBMIT);
    var objBtnReset = ge(_BUTTON_RESET);
    var objBtnValidate = ge(_BUTTON_VALIDATE);
    var objBtnViewOnMap = ge(_BUTTON_VIEW_ON_MAP);
    var objChkAnonymous = ge(_ANONYMOUS_CHECK);
    var objAddressTypeRadio = ge(_INC_ADDRESS);
    var objIntersectionTypeRadio = ge(_INC_INTERSECTION);
    var objOtherTypeRadio = ge(_INC_OTHER);
    var objUnknownTypeRadio = ge(_INC_UNKNOWN);
    var objAddressFields = ge(_INC_ADDRESS_FIELDS);
    var objIntersectionFields = ge(_INC_INTERSECTION_FIELDS);
    var objOtherFields = ge(_INC_OTHER_FIELDS);
    var objCity = ge(_INC_CITY_FIELDS);
    
    //Hide show the location fields
    hideshowLocationFields();

    if (window.addEventListener) {        
        objBtnSubmit.addEventListener('click', createIncident, false);
        objBtnReset.addEventListener('click', resetForm, false);
        objBtnValidate.addEventListener('click', validateLocation, false);
        objBtnViewOnMap.addEventListener('click', validateLocationForViewOnMap, false);
        objChkAnonymous.addEventListener('click', hideshowCallerDetails, false);
        objAddressTypeRadio.addEventListener('click', hideshowLocationFields,false);
        objIntersectionTypeRadio.addEventListener('click', hideshowLocFieldsOnRadioButtoClick,false);
        objOtherTypeRadio.addEventListener('click', hideshowLocFieldsOnRadioButtoClick, false);
        objUnknownTypeRadio.addEventListener('click', hideshowLocFieldsOnRadioButtoClick, false);        
    } else {       
        objBtnSubmit.attachEvent('onclick', createIncident);
        objBtnReset.attachEvent('onclick', resetForm);
        objBtnValidate.attachEvent('onclick', validateLocation);
        objBtnViewOnMap.attachEvent('onclick', validateLocationForViewOnMap);
        objChkAnonymous.attachEvent('onclick', hideshowCallerDetails);
        objAddressTypeRadio.attachEvent('onclick', hideshowLocFieldsOnRadioButtoClick);
        objIntersectionTypeRadio.attachEvent('onclick', hideshowLocFieldsOnRadioButtoClick);
        objOtherTypeRadio.attachEvent('onclick', hideshowLocFieldsOnRadioButtoClick);
        objUnknownTypeRadio.attachEvent('onclick', hideshowLocFieldsOnRadioButtoClick);       
    }

    // must attach event handlers before hiding
    //debug ? '' : toggleButtons(true);
    toggleButtons(false)
}

function toggleButtons(tf) {
	tf ? ge(_BUTTON_CONTAINER).style.display = 'none' : ge(_BUTTON_CONTAINER).style.display = '';
}

function resetForm(e) {
	location = 'create-case.aspx';
}

function hideshowCallerDetails(e) {
    var objChkAnonymous = ge(_ANONYMOUS_CHECK);

    if (objChkAnonymous.checked == true) {
        forEachFormElement(function(el) {
            var objId;
            if (isIE) {
                objId = el['id'];
            } else {
                objId = el.getAttribute('id');
            }
            if (el && _VALID_DEF[objId] && ge('div_' + objId) && _VALID_DEF[objId]['showOnPage'] && !(_VALID_DEF[objId]['anonymous'])) {
                $('#div_' + objId).hide();
            }
        }, true);
    } else {
        forEachFormElement(function(el) {
            var objId;
            if (isIE) {
                objId = el['id'];
            } else {
                objId = el.getAttribute('id');
            }
            if (el && _VALID_DEF[objId] && ge('div_' + objId) && _VALID_DEF[objId]['showOnPage'] && !(_VALID_DEF[objId]['anonymous'])) {
                $('#div_' + objId).show();
            }
        }, true);
    }
}

function hideshowLocFieldsOnRadioButtoClick(e) {
    hideshowLocationFields(e);
    
    //clear error message
    var objErrorMessage = ge(_INC_LOCATION_ERROR);
    objErrorMessage.innerHTML = '';
}

function hideshowLocationFields(e){

    var objAddressTypeRadio = ge(_INC_ADDRESS);
    var objIntersectionTypeRadio = ge(_INC_INTERSECTION);
    var objOtherTypeRadio = ge(_INC_OTHER);
    var objUnknownTypeRadio = ge(_INC_UNKNOWN);
    var objAddressFields = ge(_INC_ADDRESS_FIELDS);
    var objIntersectionFields = ge(_INC_INTERSECTION_FIELDS);
    var objOtherFields = ge(_INC_OTHER_FIELDS);
    var objCity = ge(_INC_CITY_FIELDS);
    var objBtnValidate = ge(_BUTTON_VALIDATE);
    var objBtnViewOnMap = ge(_BUTTON_VIEW_ON_MAP);

    var objStreet1 = ge(_INC_STREET1);
    var objStreet2 = ge(_INC_STREET2);
    var objOtherLocDes = ge(_INC_OTHER_LOCATION);
    var objHouseNo = ge(_INC_HOUSE_NO);
    var objStreetName = ge(_INC_STREET_NAME);

    if (objAddressTypeRadio.checked == true) {
        objAddressFields.style.display = 'inline';
        objIntersectionFields.style.display = 'none';
        objOtherFields.style.display = 'none';
        objCity.style.display = 'inline';
        objBtnValidate.style.display = 'inline';
        objBtnViewOnMap.style.display = 'inline';

        //Clear out the values for other location and intersection
        objOtherLocDes.value = '';
        objStreet1.value = '';
        objStreet2.value = '';
    }

    if (objIntersectionTypeRadio.checked == true) {
        objAddressFields.style.display = 'none';
        objIntersectionFields.style.display = 'inline';
        objOtherFields.style.display = 'none';
        objCity.style.display = 'inline';
        objBtnValidate.style.display = 'inline';
        objBtnViewOnMap.style.display = 'inline';

        //Clear out the values for other location and address
        objHouseNo.value = '';
        objStreetName.value = '';
        objOtherLocDes.value = '';
    }

    if (objOtherTypeRadio.checked == true) {
        objAddressFields.style.display = 'none';
        objIntersectionFields.style.display = 'none';
        objOtherFields.style.display = 'inline';
        objCity.style.display = 'none';
        objBtnValidate.style.display = 'none';
        objBtnViewOnMap.style.display = 'none';

        //Clear out the values for address and intersection
        objStreet1.value = '';
        objStreet2.value = '';
        objHouseNo.value = '';
        objStreetName.value = '';
    }

    if (objUnknownTypeRadio.checked == true) {
        objAddressFields.style.display = 'none';
        objIntersectionFields.style.display = 'none';
        objOtherFields.style.display = 'none';
        objCity.style.display = 'none';
        objBtnValidate.style.display = 'none';
        objBtnViewOnMap.style.display = 'none';

        //Clear out the values for address,intersection, and other location
        objStreet1.value = '';
        objStreet2.value = '';
        objHouseNo.value = '';
        objStreetName.value = '';
        objOtherLocDes.value = '';
    }
}

function validateLocationFields(e) {
    var objAddressTypeRadio = ge(_INC_ADDRESS);
    var objIntersectionTypeRadio = ge(_INC_INTERSECTION);
    var objOtherTypeRadio = ge(_INC_OTHER);
    var objUnknownTypeRadio = ge(_INC_UNKNOWN);
    var isIE = e[e_ie];
    var el;
    var result = true;

    if (objAddressTypeRadio.checked == true) {
        el = ge(_INC_HOUSE_NO);
        if (!validate(el, isIE)) {
            result = false;
        }

        el = ge(_INC_STREET_NAME);
        if (!validate(el, isIE)) {
            result = false;
        }

        el = ge(_INC_UNIT);
        if (!validate(el, isIE)) {
            result = false;
        }
    }

    if (objIntersectionTypeRadio.checked == true) {
        el = ge(_INC_STREET1);
        if (!validate(el, isIE)) {
            result = false;
        }

        el = ge(_INC_STREET2);
        if (!validate(el, isIE)) {
            result = false;
        }
    }
    return result;
}

function validateLocation(e) {
    var result = validateLocationFields(e);

    if (result) {
        $('#imgValidateLocation').show();
        try {
            $.get('create-case.aspx', CreateReq_ValidateLocation(), function(data) {
                var controlId = '#' + data.split('|')[0];
                $('#frmIncLocationValidationError').html($(controlId).val());
                $('#imgValidateLocation').hide();
            })
        } catch (error) { $('#imgValidateLocation').hide(); }
    }
}

function CreateReq_ValidateLocation() {
    return { ReqType: 'ValidateLocation', frmLocationType: (getRadioBoxValue("frmLocationType")), frmIncCity: ($('#frmIncCity').val()), frmIncHouseNo: ($('#frmIncHouseNo').val()), frmIncStreetName: ($('#frmIncStreetName').val()), frmIncUnit: ($('#frmIncUnit').val()), frmIncStreet1: ($('#frmIncStreet1').val()), frmIncStreet2: ($('#frmIncStreet2').val()) };
}

function validateLocationForViewOnMap(e) {
    var result = validateLocationFields(e);
    if (result) {
      viewOnMap();
    }
}

function CheckLocationStatus() {
    
            var tempHTML = $.ajax({
                async: false,
                type: 'get',
                data: CreateReq_ValidateLocation(),
                dataType: 'json',
                url: 'create-case.aspx',
                beforeSend: function(XMLHttpRequest) { $('#imgValidateLocation').show(); $('#frmIncLocationValidationError').html(''); },
                success: function(data, textStatus) { },
                complete: function(XMLHttpRequest, textStatus) { $('#imgValidateLocation').hide();}          
            }).responseText;

            //alert(tempHTML.split('|')[0]);

            var controlId = '#' + tempHTML.split('|')[0];

            var errorMsg = $(controlId).val()
            
            if (errorMsg == $('#hidTran_LocationValid').val()) {
                return true;
            }
            else {
                $('#frmIncLocationValidationError').html(errorMsg);
                return false;
            }
}

function checkCaptchaStatus() {
    var input = $("#txtCaptchaInput").attr('value');
    var correct = $("#imgCaptchaOK").attr('style');
    
    if (input.length == 6 && !contains(correct, 'none', true)) return true;
    else {
        $("#lbCaptchaError").show();
        $("#imgCaptchaOK").hide();
        $("#lbCaptchaTipCaseSensitive").hide();
        return false; 
     }
}

function createIncident(e) {
    
    var validForm;

	if (e[e_ie]) {
		validForm = isFormValid(true);
	} else {
		validForm = isFormValid(false);
	}

	//if (!checkCaptchaStatus()) validForm = false;
	//if (!CheckLocationStatus()) validForm = false;
	
	
	if (validForm) {		
		// update phone numbers
		var objNumber;
		var numDigits;
		var index;
		
		for (var j=0; j<_NUMBER_TYPES.length; j++) {
			
			// check if valid
			objNumber = ge('frm'+_NUMBER_TYPES[j]);
			
			// only if there is a value
			if (objNumber.value.length > 0) {
				
				// remove non-numerics
				//numDigits = objNumber.value.replace(/\.|\-|\ /g,"");
				numDigits = objNumber.value.replace(/[^0-9]/g,"");   // remove anything that's not a digit
				index = numDigits.length - 7;
				
				// get last 7 digits
				ge(_FORM_PREFIX+_NUMBER_TYPES[j]+_NUM_SUFFIX).value = numDigits.substring(index, numDigits.length);
				
				// get area code
				index = index - 3;
				ge(_FORM_PREFIX+_NUMBER_TYPES[j]+_AC_SUFFIX).value = numDigits.substring(index, index+3);
			}
		}
		
		//Set organization flag to true if organization is specified
		if (ge('frmOrganization').value != '') {
		    ge('frmOrganizationFlag').value = 'True';		    
		} else {
		    ge('frmOrganizationFlag').value = 'False';
		}		
		
		var formContents = '';

		forEachFormElement(function (objCurObj) {
			if (objCurObj.value != '') {
				formContents += addValue(objCurObj.getAttribute('ID'), objCurObj.value);
			} else {
				formContents += addValue(objCurObj.getAttribute('ID'), objCurObj.innerHTML);
			}
		}, true);
		
		ge('frmSubmit').value = 'Submit';
		
		if (ge('frmAnonymous').checked == true) {
		    ge('frmAnonymousCase').value = 'True';
		} else {
		    ge('frmAnonymousCase').value = 'False';
		}
		
		if (ge('frmIncAttachment').value != '') {
		    LimitAttach(document.CreateCase,ge('frmIncAttachment').value);		
		} else {		
		    document.CreateCase.submit();
		}
		
	} else {
		ge('frmSubmit').value = '';
		//alert("Form is not completed yet.")
	}
}

//Files Types that can be attached
AttachmentAllowFileTypes = new Array(".gif", ".jpg", ".png", ".doc", ".txt", ".bmp");

function LimitAttach(form, file) 
{
    allowSubmit = false;
    if (!file) return;
    while (file.indexOf("\\") != -1)
        file = file.slice(file.indexOf("\\") + 1);
        ext = file.slice(file.indexOf(".")).toLowerCase();
        for (var i = 0; i < AttachmentAllowFileTypes.length; i++) {
        if (AttachmentAllowFileTypes[i] == ext) { allowSubmit = true; break; }
    }
    if (allowSubmit) form.submit();
    else
        alert($("#hidTran_OnlyAllowedFiletype").attr("value")+ (AttachmentAllowFileTypes.join("  ")));         
}


// Goes through the entire form to check whether its content is ok to be submitted
// Note: checks the *visible* form elements only
function isFormValid(isIE) {
        
    var result = true;
    forEachFormElement(function(el) {
        var objId;
        if (isIE) {
            objId = el['id'];
        } else {
            objId = el.getAttribute('id');
        }
        if (el && _VALID_DEF[objId]) {
            if (!validate(el, isIE)) {
                result = false;
            }
        }
    }, false);
    result &= IsCaseTypeValid();
    //result &= IsCallerLoacationValid();

    
    return result;
}


// Executes the given function for each element in the form
// @param: fcn						A function with the form element as its argument
// @param: includingHiddenFields	If false, then this will iterate through only the *visible* form elements
function forEachFormElement(fcn, includingHiddenFields) {
	
	// Iterate through fields and text areas
	var objContainer = ge(_FORM_CONTAINER);
	var objContainerObjects = objContainer.getElementsByTagName('INPUT');
	var objContainerTextareas = objContainer.getElementsByTagName('TEXTAREA');
	
	var objCurObj;
	for (var i=0; i< objContainerObjects.length + objContainerTextareas.length; i++) {
		
		// whether text area or text field
		if (i >= objContainerObjects.length) {
			j = i - objContainerObjects.length;
			objCurObj = objContainerTextareas[j];
			fcn(objCurObj);  // run the function
		} else {
			objCurObj = objContainerObjects[i];
			if (objCurObj.getAttribute("type") === "hidden" && !includingHiddenFields) {
				// do nothing
			} else {
				fcn(objCurObj);  // run the function
			}
		}
	}
}

/**
 * Validate fields on the fly on blur of field elements
 *
 * @param	e		Element causing trigger
 *
 */
function fieldTooltipShow(e) {	
	if (e[e_moz]) {
		validate(e[e_moz], false);
	} else {
		validate(e[e_ie], true);	
	}
}

/**
 * Validates the value of a form element.  Will also show/hide error message.
 *
 * @param	formElement		The form element whose value you want to validate
 * @param	isIE			Specify whether the current browser is IE
 * @return  true/false		
 */
function validate(formElement, isIE) {
	var objId;
	var isValid;
	var sObjType;

	// get the object's id to reference the form validation definitions
	if (isIE) {
	    objId = formElement['id'];
	    sObjType = formElement['type'];
	} else { // is Mozilla
	    objId = formElement.getAttribute('id');
	    sObjType = formElement['type'];
	}

	if (objId == 'frmCityTextValue') { return true; }
	//if (objId == 'frmEmail') { return true; }

	if ((objId == 'frmAnonymous') || (sObjType == 'radio') || (sObjType == 'button') || (objId == 'hidbtn_ChangeLanguage') || (objId == 'frmSpace')) {
	    isValid = true;
	} else {
	var objChkAnonymous = ge(_ANONYMOUS_CHECK);
	    
	    

	    if ((!_VALID_DEF[objId]['anonymous']) && (objChkAnonymous.checked)) {
	        isValid = true;
	        // clear error text (if any)
	        ge(objId + _ERROR_DEF).innerHTML = '';
	        ge(objId).value = '';
	    } else {
	        var bValidate = true;
	        if (((objId == _INC_HOUSE_NO) || (objId == _INC_STREET_NAME) || (objId == _INC_UNIT)) && (!ge(_INC_ADDRESS).checked)) {
	            bValidate = false;
	        }
	        if (((objId == _INC_STREET1) || (objId == _INC_STREET2)) && (!ge(_INC_INTERSECTION).checked)) {
	            bValidate = false;
	        }
	        if ((objId == _INC_OTHER_LOCATION) && (!ge(_INC_OTHER).checked)) {
	            bValidate = false;
	        }

	        if (bValidate) {
	            // if the field is valid
	            if (textValidator(formElement, _VALID_DEF[objId]['minLength'], _VALID_DEF[objId]['maxLength'], _VALID_DEF[objId]['alpha'], _VALID_DEF[objId]['numeric'], _VALID_DEF[objId]['other'], _VALID_DEF[objId]['optional'])) {
	                isValid = true;
	                // hide error message
	                ge(objId + _ERROR_DEF).style.display = 'none';
	            } else { // field is invalid
	                isValid = false;
	                // display error message
	                ge(objId + _ERROR_DEF).style.display = 'block';
	            }
	        } else {
	            isValid = true;
	        }
	    }
	}
	return isValid;
}


/**
 * Shortened version of document.getElementById
 *
 * @param	eid			Element ID
 * @return				Object reference
 */
function ge(id) {
	return document.getElementById(id);
}

/**
 * Valdiate object's value using specified parameters
 *
 * @param	obj			Object reference
 * @param	minlen		Minimum length allowed for object's value
 * @param	maxlen		Maximum length allowed for object's value
 * @param	alpha		Must be alpha characters only [a-zA-Z]
 * @param	numeric		Must be numeric characters only [0-9]
 * @param	other		    Custom regular expression
 * @param	optional		Whether the field text is optional or not
 * @return				    True or False if object is valid
 *
 */
function textValidator(obj, minlen, maxlen, alpha, numeric, other, optional) {
	var content = obj.value;
	
	if (content == '') {
		content = obj.innerHTML;
	}
	
	// if the length is out of bounds
	if (content.length < minlen || content.length > maxlen) {
		return false;
	}

	// optional fields allow lengths of zero
	if (content.length != 0) {

	    // check if alpha characters are allowed. if so:
	    if (alpha && !numeric && !testAlpha(content)) {
	        return false;
	    }

	    // check if numerics are allowed. if so:
	    if (numeric && !alpha && !testNumeric(content)) {
	        return false;
	    }

	    // check if alphanumeric is allowed
	    if (numeric && alpha && !testAlphaNumeric(content)) {
	        return false;
	    }
	    // regexp
	    if (other && !other.test(content)) {
	        return false;
	    }
	} else {
	    if (!optional) {
	        return false;
	    }
	}

	return true;
}

/**
 * Test string if it contains alphabetical characters and spaces
 * Note: considers "." to be valid character
 *
 * @param	word		String to be tested
 * @return				True or False if string is valid
 *
 */
function testAlpha(word) {
	var regexp = /^([a-zA-Z\s.])+$/;
	var blankexp = /^([\s])+$/;
	return ((regexp.test(word)) && (!blankexp.test(word)));
}

/**
 * Test string if it contains numerical characters
 *
 * @param	word		String to be tested
 * @return				True or False if string is valid
 *
 */
function testNumeric(word) {
	var regexp = /^([0-9])+$/;
	return regexp.test(word);
}

/**
 * Test string if it contains alphanumerical characters
 * Note: considers "." to be valid character
 *
 * @param	word		String to be tested
 * @return				True or False if string is valid
 *
 */
function testAlphaNumeric(word) {
	var regexp = /^([0-9a-zA-Z\s.])+$/;
	var blankexp = /^([\s])+$/;
	return ((regexp.test(word)) && (!blankexp.test(word)));
}



