var errors = new Array();
var changed = false;

function validEmail(val)
{
    exp = /^[a-z0-9_+-][a-z0-9\._+-]*@[a-z0-9][a-z0-9_-]*(\.[a-z0-9_-]+)*(\.[a-z]{2,63})$/i;
    return exp.test(val);
}

function trim(val) {
    return val.replace(/^\s+|\s+$/g, '');
}

function addError(error) {
    errors.push(error);
}

function showErrors() {
    var msg = "The following errors have occurred:        ";
    showLocalizedErrors(msg);
}

function myOnLoad() {
    if (typeof(pageOnLoad) == "function") {
        pageOnLoad();
    }
    showErrors();
    new xTooltipGroup("autotooltip", 'tipGrp4s', 'right', 4, 0);
    addHistoryListeners();
    addInboxListeners();
}

function addHistoryListeners() {
    var elems = xGetElementsByClassName("expand", xGetElementById("history"), "img")
    for (var i = 0; i < elems.length; i++) {
        var elem = elems[i];
        var expand = xGetElementById(elem.id + "_expand");
        var text = xInnerHtml(expand)
        if (!text) continue;
        elem.targetText = text;
        xAddEventListener(elem, 'click', onHistory);
    }
}

function onHistory(e) {
    var _envent = new xEvent(e);
    var source = _envent.target;
    var target = xGetElementById(source.id + "_detail");
    if (target.expanded && target.expanded == true) {
        xInnerHtml(target, "&nbsp;");
        target.expanded = false;
        target.className = "invisible";
        source.src = "../../gfx/arrow_right_turqoise.gif";
    } else {
        xInnerHtml(target, source.targetText);
        target.expanded = true;
        target.className = "";
        source.src = "../../gfx/arrow_down_turqoise.gif";
    }
}

function addInboxListeners() {
    var elems = xGetElementsByClassName("expand", xGetElementById("inbox"), "img")
    for (var i = 0; i < elems.length; i++) {
        var elem = elems[i];
        var details = xGetElementById(elem.id + "_details");
        var text = xInnerHtml(details)
        if (!text) continue;
        elem.targetText = text;
        xAddEventListener(elem, 'click', onInbox);
    }
}

function onInbox(e) {
    var _envent = new xEvent(e);
    var source = _envent.target;
    var target = xGetElementById(source.id + "_detail");
    if (target.expanded && target.expanded == true) {
        xInnerHtml(target, "&nbsp;");
        target.expanded = false;
        target.className = "invisible";
        source.src = "../../gfx/arrow_right_turqoise.gif";
    } else {
        xInnerHtml(target, source.targetText);
        target.expanded = true;
        target.className = "";
        source.src = "../../gfx/arrow_down_turqoise.gif";
    }
}



function addRecipientField(e, emptyOk) {
    hideRecipientWarning();

	var val = xGetElementById("recipientone").value + " " +  xGetElementById("recipientmany").value;
	val = val.replace(/[\n\r\t,;]/g, " ");
    val = trim(val);
	if(val == "") {
		if(emptyOk) {
			return true;
		}
        alert('You need to specify a valid recipient');
		return false;
	}
	var recipients = val.split(" ");
    var recipientCount = xGetElementsByAttribute('input','name','^recipient$').length;

	for(i=0; i<recipients.length; i++) {
		var valueToAdd = recipients[i];
    	valueToAdd = trim(valueToAdd);

		if(valueToAdd == "") {
			continue;
		}

    	if (!validEmail(valueToAdd)) {
        	alert('Invalid email, ' + valueToAdd);
			return false;
    	}

    	if (recipientCount >= currentuser.accountLevel.maxRecipients) {
        	showRecipientWarning();
			return false;
		}
		recipientCount++;
	}
	for(i=0; i<recipients.length; i++) {
		var valueToAdd = recipients[i];
    	valueToAdd = trim(valueToAdd);
		if(valueToAdd == "") {
			continue;
		}
        addRecipient(valueToAdd);
	}
    xGetElementById("recipientone").value = "";
    xGetElementById("recipientmany").value = "";

	return true;
}

function addRecipientToExistingJob(jobId, numberOfRecipients) {
    if(currentuser.accountLevel.maxRecipients <= numberOfRecipients) {
        alert("The recipient limit for this delivery has been reached.");
        return;
    }

    var email = prompt("Recipient's e-mail (message cannot be specified)","");
    if (email && email != "") {
        if (!validEmail(email)) {
            alert('You need to specify a valid recipient')
            return;
        }

        var f = xCreateElement("form");
        var i1 = xCreateElement("input");
        var i2 = xCreateElement("input");
        i1.type = "hidden";
        i2.type = "hidden";
        xAppendChild(xGetElementsByTagName("body")[0], f);
        xAppendChild(f, i1);
        xAppendChild(f, i2);

        i1.name = "job.id";
        i1.value = jobId;
        i2.name = "email";
        i2.value = email;
        f.method = 'GET';
        f.action = "addrecipienttoexistingjob.html";
        f.submit();
    }
}

function addRecipient(valueToAdd) {
    var newField = xCreateElement("input");
    var newDiv = xCreateElement("div");
    var deleteButton = xCreateElement("img");

    newField.type = "hidden";
    newField.name = "recipient";
    newField.value = valueToAdd;
    newDiv.innerHTML = valueToAdd + " ";
    deleteButton.src = "../../gfx/delete.gif";
    deleteButton.title = removeTranslated();
    deleteButton.alt = removeTranslated();
    deleteButton.onclick = deleteRecipient;
    deleteButton.targetDiv = newDiv;

    xAppendChild(newDiv, newField);
    xAppendChild(newDiv, deleteButton);
    xAppendChild(xGetElementById("recipientList"), newDiv);
}

function removeTranslated() {
    return 'Remove';
}

function deleteRecipient(e) {
    var _envent = new xEvent(e);
    var deleteDiv = _envent.target.targetDiv;
    xParent(deleteDiv, true).removeChild(deleteDiv);

    var recipientCount = document.getElementsByName("recipient").length;

    if(recipientCount <= currentuser.accountLevel.maxRecipients) {
        hideRecipientWarning();
    }
}


function showLocalizedErrors(msg) {
    if (errors.length == 0) return;

    for (i = 0; i < errors.length; i++) {
        msg += "\n- " + errors[i];
    }
    alert(msg);
}


function setChanged() {
    changed = true;
}

function isFormSubmitted(msg) {
    if (changed == true) {
        return confirm(msg);
    }
    return true;
}

function popUp(URL) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=1,scrollbars=0,location=0,statusbar=0,menubar=1,resizable=0,width=800,height=640,left= 0,top = 0');");
    return false;
}

/**
 * Checks if a form field as a value distinct from the empty string and "-1".
 * Returns true if the field is empty, false otherwise.
 * If the field is empty, an alert is shown, with the given message parameter
 *
 * @param id The id of the form field
 * @param message The alert message to be shown if the field is empty
 **/
function checkFormField(id, message) {
    var element = document.getElementById(id);
    debug("value: " + element.value);
    if (element.value == "-1" || element.value == "") {
        alert(message)
        return false;
    }
    return true;
}

/**
 * Creates an alert with the given message, if debug is on
 * @param string the string to be printed
 **/
function debug(string) {
    return;
    alert(string);
}


function setCheckbox(origin, targetId) {
    var value = origin.value;
    var target = document.getElementById(targetId);
    target.value = origin.checked;
}

function update_enabled(simple) {
    var f = getDateForm();
    f["timePeriodType"].disabled = !simple;
    f["timePeriod.begin.year"].disabled = simple;
    f["timePeriod.begin.month"].disabled = simple;
    f["timePeriod.begin.day"].disabled = simple;
    f["timePeriod.end.year"].disabled = simple;
    f["timePeriod.end.month"].disabled = simple;
    f["timePeriod.end.day"].disabled = simple;
}

function debugObject(objectRef) {
    var r = '';
    var count = 0;
    for (var propName in objectRef) {
        count ++;
        if (propName == "value") r += "\n HERE: \n";
        r += 'objectRef.' + propName + ': ' + objectRef[propName] + " ";
        if (count % 10 == 0) r += '\n';
    }
    alert(r);
}

function getCheckboxValue(form, radios) {
    for (var i = 0; i < form[radios].length; i++) {
        if (form[radios][i].checked) {
            var v = form[radios][i].value;
            return v;
        }
    }
    return "";
}

function submitForm(formId) {
    var f = getForm(formId);
    if (f) {
        f.submit();
    }
}

function getDateForm() {
    return getForm("dateForm");
}
function getDateFormXLS() {
    return getForm("dateFormXls");
}
function getForm(name) {
    var form = document.getElementById(name);
    if (!form) alert("Form " + name + " does not exist in this document");
    return form;
}

function popup(URL) {
    var day = new Date();
    var id = day.getTime();
    eval("var page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0,width=400,height=600,left = 340,top = 312');");
    return false;
}

function focus(name) {
    var elem = xGetElementById(name);
    if (elem) {
        elem.focus();
    }
}

function selectAllCheckboxes(id) {
    var parentEle = xGetElementById(id);
    if (!parentEle._checked) {
        parentEle._checked = false
    }

    parentEle._checked = !parentEle._checked;
    var inputs = xGetElementsByTagName("input", parentEle);
    if (!inputs) return;
    for (var i = 0; i < inputs.length; i++) {
        var input = inputs[i];
        if (input.type == "checkbox") {
            input.checked = parentEle._checked;
        }
    }

}

function focusOnLogin() {
    if (xGetElementById("j_username").value == "") {
        focus("j_username");
    } else {
        focus("j_password");
    }
}

function switchContent(id1, id2) {

    var msg1 = xInnerHtml(id1);
    var msg2 = xInnerHtml(id2);
    xInnerHtml(id1, msg2);
    xInnerHtml(id2, msg1);
}


var BrowserDetect = {
    init: function () {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
                || this.searchVersion(navigator.appVersion)
                || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i = 0; i < data.length; i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                    return data[i].identity;
            }
            else if (dataProp)
                return data[i].identity;
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    },
    dataBrowser: [
        {
            string: navigator.userAgent,
            subString: "OmniWeb",
            versionSearch: "OmniWeb/",
            identity: "OmniWeb"
        },
        {
            string: navigator.vendor,
            subString: "Apple",
            identity: "Safari"
        },
        {
            prop: window.opera,
            identity: "Opera"
        },
        {
            string: navigator.vendor,
            subString: "iCab",
            identity: "iCab"
        },
        {
            string: navigator.vendor,
            subString: "KDE",
            identity: "Konqueror"
        },
        {
            string: navigator.userAgent,
            subString: "Firefox",
            identity: "Firefox"
        },
        {
            string: navigator.vendor,
            subString: "Camino",
            identity: "Camino"
        },
        {
            // for newer Netscapes (6+)
            string: navigator.userAgent,
            subString: "Netscape",
            identity: "Netscape"
        },
        {
            string: navigator.userAgent,
            subString: "MSIE",
            identity: "Explorer",
            versionSearch: "MSIE"
        },
        {
            string: navigator.userAgent,
            subString: "Gecko",
            identity: "Mozilla",
            versionSearch: "rv"
        },
        {
            // for older Netscapes (4-)
            string: navigator.userAgent,
            subString: "Mozilla",
            identity: "Netscape",
            versionSearch: "Mozilla"
        }
    ],
    dataOS : [
        {
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
        },
        {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
        },
        {
            string: navigator.platform,
            subString: "Linux",
            identity: "Linux"
        }
    ]

};
BrowserDetect.init();

function isSafari() {
    return BrowserDetect.browser == "Safari";
}
