var submitCount = 0;

function submitForm(form, url) {
    submitCount++;
	if(typeof form == 'string') form = document.forms[form];    
    if(1 == submitCount) {
        if (url) {
            form.action = url;
        }
        form.submit();
    } else {
        alert("You have already submitted this form");
    }
}

function enableDisableAllChildFormElements(parent, enableFlag) {
    var children = parent.getElementsByTagName("input"); 
    enableDisableElements(children, enableFlag);
    children = parent.getElementsByTagName("select"); 
    enableDisableElements(children, enableFlag);
    children = parent.getElementsByTagName("textarea"); 
    enableDisableElements(children, enableFlag);
}

function enableDisableAllChildFormElementsByParentId(parentId, enableFlag) {
    var parent = document.getElementById(parentId);
    enableDisableAllChildFormElements(parent, enableFlag);
}

function enableDisableElements(elementsArr, enableFlag) {
    for (var i = 0; i < elementsArr.length; i++) {
        enableDisableElement(elementsArr[i], enableFlag);
    }
}

function enableDisableElementById(id, enableFlag) {
    enableDisableElement(document.getElementById(id), enableFlag);
}  

function enableDisableElement(element, enableFlag) {
    element.disabled = !enableFlag;
}  

function safeGetInputValue(id) {
    var element = document.getElementById(id);
    if (element) {
        return element.value;
    } else {
        return null;
    }
}

function safeSetInputValue(id, value) {
    var element = document.getElementById(id);
    if (element) {
        element.value = value;
    }
}

// http://parentnode.org/javascript/javascript-browser-detection-revisited/
function detectBrowser() { 
    var BO = new Object(); 
    BO["ie"]        = false /*@cc_on || true @*/; 
    BO["ns4"]       = !BO["ie"] &&  (document.layers != null) &&  (window.confirm != null) && (document.createElement == null); 
    BO["opera"]     = (self.opera != null); 
    BO["gecko"]     = (document.getBoxObjectFor != null); 
    BO["safari"]    = (document.childNodes) && (!document.all) && (!navigator.taintEnabled) && (!navigator.accentColorName); 
    return BO; 
}

var BO = new detectBrowser(); 

var focusTracker = {
	lastFocusedElement : null,
	trackFocus : function (event) {
		var target = event.target || event.srcElement;
		focusTracker.lastFocusedElement = target;
	}, 
	
	focus : function() {
	    if (focusTracker.lastFocusedElement) {
        	// ie requires the window to be focused before setting focus on child elements
            if (BO.ie) { window.focus(); }
	        focusTracker.lastFocusedElement.focus();
	    }
	}
};

/** EVENT HELPERS **/
/**
   Examples: 
   addEvent(document.getElementById('blah'), 'mouseover', myfunction, false);
   addEvent(window, 'load', myfunction, false);
**/
function addEvent(element, eventType, func, useCapture) {
    if (element.addEventListener) {
        element.addEventListener(eventType, func, useCapture);
    } else if (element.attachEvent) {
        element.attachEvent('on' + eventType, func);
    } else {
        element['on' + eventType] = func;
    }
}

function addOnloadHandler(newOnloadFunc) {
    var oldOnLoadFunc = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = newOnloadFunc;
    } else {
        window.onload = function() {
            oldOnLoadFunc();
            newOnloadFunc();
        }
    }
}

function addOnUnloadHandler(newOnUnloadFunc) {
    var oldOnUnLoadFunc = window.onunload;
    if (typeof window.onunload != 'function') {
        window.onunload = newOnUnloadFunc;
    } else {
        window.onunload = function() {
            oldOnUnLoadFunc();
            newOnUnloadFunc();
        }
    }
}

function clearFieldValues(elementsArray) {
    for (var i = 0; i < elementsArray.length; i++) {
        safeSetInputValue(elementsArray[i], '');
    }
}

function setFieldsThatNeedToBeClearedBetweenPageFlow(elementsArray) {
    addOnloadHandler(function() { clearFieldValues(elementsArray); });
    addOnUnloadHandler(function() { clearFieldValues(elementsArray); });
}

function attachOnFocusEventToInputElements(parentElement, inputTypesArr, functionRef) {
    for (var i = 0; i < inputTypesArr.length; i++) {
        var children = parentElement.getElementsByTagName(inputTypesArr[i]);
        for (var j = 0; j < children.length; j++) {
            addEvent(children[j], 'focus', functionRef);
        }
    }
}
/** EVENT HELPERS **/



function showHideToggleById(id) {
    var obj = document.getElementById(id);
    if (obj && obj.style.display == 'none') {
        obj.style.display = '';
    } else {
        obj.style.display = 'none';
    }
}

function showHideElementById(id, showFlag) {
    var obj = document.getElementById(id);
    if (obj) {
        if (showFlag) {
            obj.style.display = '';
        } else {
            obj.style.display = 'none';
        }
    } 
}

function showElementById(id) {
    showHideElementById(id, true);
}

function hideElementById(id) {
    showHideElementById(id, false);
}

function showHideElementByIdAndEnableDisableFormElements(parentId, showFlag) {
    showHideElementById(parentId, showFlag);
    enableDisableAllChildFormElementsByParentId(parentId, showFlag);
}

/* FUNCTION LIKE JAVA MESSAGEFORMAT */
/* Usage: format("abc ${poolNumber}", [{pattern: "poolNumber", value: "112233"}]); */
function format(inputStr, substitutionValues) {
    for (var i = 0; i < substitutionValues.length; i++) {
        var pattern = new RegExp("[$]{" + substitutionValues[i].pattern + "}", "gi");
        inputStr = inputStr.replace(pattern, substitutionValues[i].value);
    }
    return inputStr;
}
/* FUNCTION LIKE JAVA MESSAGEFORMAT */

/* OPEN NEW WINDOWS */
var win = null;
function openWindow(mypage, myname, w, h, scroll) {
    if (win) {
        win.close();
    }
    var winl = (screen.width -w) / 2;
    var wint = (screen.height - h) / 2;
    var settings = 'height=' + h + ',';
    settings += 'width=' + w + ',';
    settings += 'top=' + wint + ',';
    settings += 'left=' + winl + ',';
    settings += 'scrollbars=' + scroll + ',';
    settings += 'resizable=yes';
    win = window.open(mypage,myname,settings);
    if(parseInt(navigator.appVersion) >= 4) {
        win.window.focus();
    }
}
/* OPEN NEW WINDOWS */

function confirmMessage(msg, url) {
	if (confirm(msg)) {
		document.location = url;
	}
}

//The function below will check the length of textarea.
//In your textarea just add onkeyup="checkLength(this, X)"
//where X is the length that the text field can be.
function checkLength(field, maxlimit) {      
    var val = field.value;
    // if too long...trim it! and prompt
    if (field.value.length > maxlimit) {
        commentTooLong(maxlimit);        
        field.value = field.value.substring(0, maxlimit);
        if(field.value.length > maxlimit && val.lastIndexOf("\n") == maxlimit ) {            
            field.value = field.value.substring(0, maxlimit-2);
        }
    }
}

//The function below will check the length of textarea before content is pasted from the clipboard.
//In your textarea just add onpaste="return checkLengthOnPaste(this, X)"
//where X is the length that the text field can be.
function checkLengthOnPaste(field, maxlimit) {      
    var cbData = window.clipboardData.getData('Text');
    var textRange = field.document.selection.createRange();
    textRange.text = cbData;
    // if too long...trim it! and prompt
    if (field.value.length > maxlimit) {
        commentTooLong(maxlimit);
        field.value = field.value.substring(0, maxlimit);
    }
    //Return false since we have modified the field.value here and paste should not happen
    return false;
}

function commentTooLong(maxlimit){
    alert("Comment cannot exceed " + maxlimit + " characters.");
}


/* UTIL */
function convertCollectionToMap(inputCollection, property) {
    var map = {};
    for (var i = 0; i < inputCollection.length; i++) {
        map[inputCollection[i][property]] = inputCollection[i];
    }
    return map;
}

function convertCollectionToReflexiveMap(inputCollection) {
    var map = {};
    for (var i = 0; i < inputCollection.length; i++) {
        map[inputCollection[i]] = inputCollection[i];
    }
    return map;
}
/* UTIL */
