﻿var FormName
var FormClientSide
var FormButtonsImagePath
var FormDirty = false
var FormDirtyMsg

function form_unload(action) {
    if(FormDirty) {
        if(confirm(FormDirtyMsg)) {
            eval(action?action:'form_ok()')
            // [TODO] sistemare il caso in cui non passa il form_onok()...
            // che se ne va lo stesso dalla pagina!
            // es: modifica di un obiettivo mettendo il campo vuoto!
            //       > da' il messaggio di errore ma poi cambia comunque pagina!
            // Provare con la riga seguente, che pero' ha altri effetti collaterali!
            // document.location = document.location
        }
    }
}
function form_init(name, clientside, imagepath, formdirtymsg) {
    FormName = name
    FormClientSide = clientside
    FormButtonsImagePath = imagepath
    FormDirtyMsg = formdirtymsg
}
function form_error(msg) {
    if(FormClientSide)
        alert(msg)
    else
        form_onerror(encodeURIComponent(FormName), encodeURIComponent(msg.replace(/\n/g, '<br>')))
}
function form_bad_field(field, msg) {
    if(self.form_onerror_found)
        form_onerror_found()
    if(field && field.type!='hidden')
        field.focus()
    form_error(msg)
}
function form_null_field(field) {
    field.value = field.value.replace(/\s*$/,"").replace(/^\s*/,"")
    return field.value==''
}
function form_number_field(field, nullable, isfloat, min, max) {
    var value
    return nullable && form_null_field(field) || 
           (!isfloat && field.value.search(/^\s*(\+|-)?\d+\s*$/)!=-1 && !isNaN(value=parseInt(field.value, 10)) ||
            isfloat && field.value.search(/^\s*(\+|-)?\d+(\.\d+)?\s*$/)!=-1 && !isNaN(value=parseFloat(field.value)))
           && (min==null || value>=min)
           && (max==null || value<=max)
}
function form_numericcode_field(field, nullable, numchars) {
    return nullable && form_null_field(field) || 
           eval('field.value.search(/^\\d' + (numchars!=null?'{' + numchars + '}':'+') + '$/)')!=-1
}
function form_upccode_field(field, nullable) {
    return form_numericcode_field(field, nullable, 10) || form_numericcode_field(field, nullable, 11) || form_numericcode_field(field, nullable, 12)
}
function form_datetime_field(field, nullable) {
    var day, month, year, hours, minutes, seconds, date
    return nullable && form_null_field(field) || 
           (field.value.search(/^\s*(\d{1,2})-(\d{1,2})-(\d{1,4})\s*$/)!=-1 && !isNaN(day=parseInt(RegExp['$2'], 10)) && day>=1 && day<=31 && !isNaN(month=parseInt(RegExp['$1'], 10)) && month>=1 && month<=12 && !isNaN(year=parseInt(RegExp['$3'], 10)) && year>=1900 && (date=new Date(year, month-1, day, 0, 0, 0, 0)).getDate()==day && date.getMonth()==month-1) ||
           (field.value.search(/^\s*(\d{1,2})-(\d{1,2})-(\d{1,4}) (\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/)!=-1 && !isNaN(day=parseInt(RegExp['$2'], 10)) && day>=1 && day<=31 && !isNaN(month=parseInt(RegExp['$1'], 10)) && month>=1 && month<=12 && !isNaN(year=parseInt(RegExp['$3'], 10)) && year>=1900 && (date=new Date(year, month-1, day, 0, 0, 0, 0)).getDate()==day && date.getMonth()==month-1 && !isNaN(hours=parseInt(RegExp['$4'], 10)) && hours<=23 && !isNaN(minutes=parseInt(RegExp['$5'], 10)) && minutes<=59 && !isNaN(seconds=parseInt(RegExp['$6'], 10)) && seconds<=59)
}
function form_valuedatetime_field(fieldvalue) {
    var day, month, year, hours, minutes, seconds, date
    return (fieldvalue.search(/^\s*(\d{1,2})-(\d{1,2})-(\d{1,4})\s*$/)!=-1 && !isNaN(day=parseInt(RegExp['$2'], 10)) && day>=1 && day<=31 && !isNaN(month=parseInt(RegExp['$1'], 10)) && month>=1 && month<=12 && !isNaN(year=parseInt(RegExp['$3'], 10)) && year>=1900 && (date=new Date(year, month-1, day, 0, 0, 0, 0)).getDate()==day && date.getMonth()==month-1) ||
           (fieldvalue.search(/^\s*(\d{1,2})-(\d{1,2})-(\d{1,4}) (\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/)!=-1 && !isNaN(day=parseInt(RegExp['$2'], 10)) && day>=1 && day<=31 && !isNaN(month=parseInt(RegExp['$1'], 10)) && month>=1 && month<=12 && !isNaN(year=parseInt(RegExp['$3'], 10)) && year>=1900 && (date=new Date(year, month-1, day, 0, 0, 0, 0)).getDate()==day && date.getMonth()==month-1 && !isNaN(hours=parseInt(RegExp['$4'], 10)) && hours<=23 && !isNaN(minutes=parseInt(RegExp['$5'], 10)) && minutes<=59 && !isNaN(seconds=parseInt(RegExp['$6'], 10)) && seconds<=59)
}
function form_comparedate_fields(fromdate, todate) {
    var fromday, frommonth, fromyear, today, tomonth, toyear, fdate, tdate
    fromdate.value.search(/^\s*(\d{1,2})-(\d{1,2})-(\d{1,4})\s*$/)
    fromday = parseInt(RegExp['$2'], 10)
    frommonth = parseInt(RegExp['$1'], 10)
    fromyear = parseInt(RegExp['$3'], 10)
    todate.value.search(/^\s*(\d{1,2})-(\d{1,2})-(\d{1,4})\s*$/)
    today = parseInt(RegExp['$2'], 10)
    tomonth = parseInt(RegExp['$1'], 10)
    toyear = parseInt(RegExp['$3'], 10)
    fdate=new Date(fromyear, frommonth-1, fromday, 0, 0, 0, 0)
    tdate=new Date(toyear, tomonth-1, today, 0, 0, 0, 0)
    return tdate<fdate?-1:(tdate>fdate?1:0)
}
function form_email_field(field) {
    return field.value+''=='' || (field.value+'').search(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]{2,}$/)==0
}
function form_zipcode_field(field) {
    return (field.value+'').search(/^[0-9A-Za-z ]{1,16}$/)==0
}
function form_phone_field(field, nullable) {
    return nullable && form_null_field(field) || (field.value+'').search(/^[0-9 \+\/\.\(\)\-]*$/)==0
}
function form_ok(actionvalue) {
    FormDirty = false
    if(form_oncheck() && form_onok()) {
        document.frmForm.Action.value = (actionvalue==null?'ok':actionvalue)
        document.frmForm.submit()
    }
}
function form_cancel() {
    if(self.opener!=null)
        self.close()
    else {
        form_enable()
        document.frmForm.reset()
    }
    if(self.form_oncancel)
        form_oncancel()
}
function form_select_change(name) {
    document.frmForm[name].value=document.frmForm['S'+name].options[document.frmForm['S'+name].selectedIndex].value
}
function form_change() {
    FormDirty = true
    form_enable()
}
function form_enable() {
    if(self.form_onchange)
        form_onchange()
}
function form_changeimage(name, src) {
    ImageChange(name, src)
}
function form_onbrowse(name, value, text, force) {
    if(force || document.frmForm[name].value!=value) {
        document.frmForm[name].value=value
        document.frmForm['text'+name].value=text
        if(document.frmForm['hidden'+name]!=null)
            document.frmForm['hidden'+name].value=text
        form_change()
    }
    return true
}
function form_onclear(name) {
    return form_onbrowse(name, '', '')
}
function offset_left(obj) {
    return obj ? obj.offsetLeft + offset_left(obj.offsetParent) : 0
}
function offset_top(obj) {
    return obj ? obj.offsetTop + offset_top(obj.offsetParent) : 0
}
function form_oninit() {
    if(self.form_custominit)
        form_custominit()
    form_enable()
}

String.prototype.rightTrim = function () {
    return this.replace(/\s*$/,"")
}

String.prototype.leftTrim = function () {
    return this.replace(/^\s*/,"")
}

String.prototype.trim = function () {
    return this.leftTrim().rightTrim()
}

function key_hex() {    // accetta solo caratteri esadecimali (0-9, a-f, A-F)
    if ((event.keyCode < 48) || (event.keyCode > 57) && (event.keyCode < 65) || (event.keyCode > 70) && (event.keyCode < 97) || (event.keyCode > 102)) {
        event.keyCode = null
        event.returnValue = false
    }
}

function key_hex2() {   // accetta solo caratteri esadecimali (0-9, a-f, A-F) e il trattino
    if ((event.keyCode < 45) || (event.keyCode > 45) && (event.keyCode < 48) || (event.keyCode > 57) && (event.keyCode < 65) || (event.keyCode > 70) && (event.keyCode < 97) || (event.keyCode > 102)) {
        event.keyCode = null
        event.returnValue = false
    }
}    
