var type_array=new Array("text","email","phone","number","zip","date","time","comments");
var type_name_array=new Array("Text","E-mail","Phone Number","Number","Zip","Date","Time","Comments");

function checkEmail(object)
{
    var emailStr=object.value;
        var emailPat=/^(.+)@(.+)$/;
        var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]\\!\\#\\$\\%";
        var validChars="\[^\\s" + specialChars + "\]";
        var quotedUser="(\"[^\"]*\")";
        var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
        var atom=validChars + '+';
        var word="(" + atom + "|" + quotedUser + ")";
        var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
        var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

        var matchArray=emailStr.match(emailPat);
        if (matchArray==null) 
        {
            alert("Invalid Email.");
            object.focus();
            return false;
        }
        var user=matchArray[1];
        var domain=matchArray[2];
        if (user.match(userPat)==null) 
        {
                alert("Invalid Email.");
        object.focus();
                return false;
        }
        var IPArray=domain.match(ipDomainPat);
        if (IPArray!=null) 
        {
                for (var i=1;i<=4;i++) 
                {
                        if (IPArray[i]>255) 
                        {
                            alert("Invalid Email.");
                            object.focus();
                            return false;
                        }
                }
                return true;
        }
        var domainArray=domain.match(domainPat);
        if (domainArray==null) 
        {
                alert("Invalid Email.");
        object.focus();
                return false;
        }
        var atomPat=new RegExp(atom,"g");
        var domArr=domain.match(atomPat);
        var len=domArr.length;
        if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>4)
        {
            alert("Invalid Email.");
            object.focus();
            return false;
        }
        if (len<2) 
        {
            alert("Invalid Email.");
            object.focus();
            return false;
        }
        return true;
}

function checkDigits(object,maxvalue)
{
    var strDigits=object.value;
    var valid="0123456789";
    var ok=1;
    var temp;
    if (strDigits.length==0)
    {
        alert("Invalid value. Maximum value is "+maxvalue);
        object.focus();
        return false;
    }
    for (var i=0;i<strDigits.length;i++)
    {
        temp=""+strDigits.substring(i,i+1);
        if (valid.indexOf(temp)=="-1")
        {
            ok=0;
            alert("Invalid value. Only digits allowed.");
            object.focus();
            return false;
        }
    }
    if (strDigits>maxvalue || strDigits<1)
    {
        alert("Invalid value. Maximum value is "+maxvalue);
        object.focus();
        return false;
    }
    return true;
}

function checkText(object)
{
    var strText=object.value;
    var invalid=".,;:/\'\"@#$&^%~|+=[]{}<>_*";
    var ok=1;
    var temp;
    if (strText.length==0)
    {
        alert("Invalid value.");
        object.focus();
        return false;
    }
    for (var i=0;i<strText.length;i++)
    {
        temp=""+strText.substring(i,i+1);
        if (invalid.indexOf(temp)>0)
        {
            ok=0;
            alert("Invalid value. Only alphanumeric symbols should be used.");
            object.focus();
            return false;
        }
    }
        return true;
}

function checkStep1(sform,maxfields)
{
    if (!checkEmail(sform.email))
    {
        return false;
    }
    if (!checkDigits(sform.fields,maxfields))
    {
        return false;
    }
    return true;
}

function checkStep2(sform,fieldnum,offset)
{
    for (var i=0;i<fieldnum;i++)
    {
        if (!checkDigits(sform.elements[i*4+offset],fieldnum))
        {
            return false;
        }
        if (!checkText(sform.elements[i*4+1+offset]))
        {
            return false;
        }
    }
    return true;
}

function makeForm(sform,fieldnum,offset)
{
    var str="";
    var required="";
    var required_type="";
    for (var i=0;i<fieldnum;i++)
    {
        order=sform.elements[i*4+offset].value-1;
        if (sform.elements[order*4+offset+3].checked)
        {
            required+="field"+i+",";
            required_type+="type"+i+",";
            required_sign=" *";
        }
        else
        {
            required_sign=" ";
        }
        if (type_array[sform.elements[order*4+offset+2].value]=="comments")
        {
            str+='<tr>\n<td class="body" valign="top">'+sform.elements[order*4+offset+1].value+':'+required_sign+'</td>\n<td>';
            str+='<textarea name="field'+i+'" cols="30" rows="5"></textarea><input type="hidden" name="caption'+i+'" value="'+sform.elements[order*4+offset+1].value+required_sign+'"><input type="hidden" name="type'+i+'" value="'+type_array[sform.elements[order*4+offset+2].value]+'">\n';
        }
        else
        {
            str+='<tr>\n<td class="body">'+sform.elements[order*4+offset+1].value+':'+required_sign+'</td>\n<td>';
            str+='<input type="text" name="field'+i+'" size="40" maxlength="127"><input type="hidden" name="caption'+i+'" value="'+sform.elements[order*4+offset+1].value+required_sign+'"><input type="hidden" name="type'+i+'" value="'+type_array[sform.elements[order*4+offset+2].value]+'">\n';
        }
        str+='</td>\n</tr>\n';
    }
    strHTML='<form name="contForm" action="send.php" method="post" onSubmit="return checkSend(\'document.contForm\',\''+required+'\',\''+required_type+'\',document.contForm.demo.value);">\n\n<table>\n'+str+'<tr>\n<td colspan="2"><input type="submit" name="submit" value="Send"><input type="hidden" name="email" value="'+sform.email.value+'"><input type="hidden" name="demo" value="0"></td>\n</tr>\n</table>\n</form>';
    document.all.contentDiv.innerHTML=strHTML;
    document.contForm.demo.value=1;
}

function checkSend(sform,required,required_type,demo)
{
    var required_array = required.split(",");
    var required_type_array = required_type.split(",");
    for (var i=0;i<required_array.length-1;i++)
    {
        type=eval(sform+"."+required_type_array[i]+".value");
        el=eval(sform+"."+required_array[i]);

        if (!checkMandatory(el))
        {
            return false;
        }

        if (type=="email")
        {
            if (!isEmail(el))
            {
                return false;
            }
        }
        else if (type=="phone")
        {
            if (!isPhone(el))
            {
                return false;
            }
        }
        else if (type=="number")
        {
            if (!isInteger(el))
            {
                return false;
            }
        }
        else if (type=="zip")
        {
            if (!isZip(el))
            {
                return false;
            }
        }
        else if (type=="date")
        {
            if (!isDate(el))
            {
                return false;
            }
        }
        else if (type=="time")
        {
            if (!isTime(el))
            {
                return false;
            }
        }
        else if (type=="comments")
        {
            if (!checkMandatory(el))
            {
                return false;
            }
        }
        else if (type=="other")
        {
            if (!checkMandatory(el))
            {
                return false;
            }
        }
    }
    if (demo==1)
    {
        return false;
    }
    return true;
}

function checkPhone(object)
{
    var strField=object.value;
    if (strField.length==0)
    {
        alert("Phone must be a valid numeric entry.");
        object.focus();
        return false;
    }
    for (var i=0;i<strField.length;i++)
    {
        sSimb=strField.charAt(i);
        if ((sSimb < '0' || sSimb > '9') && (sSimb != '-') && (sSimb != '.') && (sSimb != '+') && (sSimb != ' ') && (sSimb != '(') && (sSimb != ')'))
        {
            alert("Phone must be a valid numeric entry.");
            object.focus();
            return false;
        }
    }
    return true;
}

function checkZip(object)
{
    var strField=object.value;
    if (strField.length!=5 && strField.length!=9)
    {
        alert("Please, make sure ZIP Code is 5 or 9 digits.");
        object.focus();
        return false;
    }
    for (var i=0;i<strField.length;i++)
    {
        if (strField.charAt(i)<'0' || strField.charAt(i)>'9')
        {
            alert("ZipCode must be a valid numeric entry. Please do not use non-numeric symbols.");
            object.focus();
            return false;
        }
    }
    return true;
}

function checkDate(object)
{
    var strField=object.value;
    if (strField.length==0)
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    var i=0;
    var j=0;
    while ((strField.charAt(i)!= "/" && strField.charAt(i)!= "-") && i<strField.length)
    {
        i++;
    }
    if (i==strField.length || i>2)
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    var addOne=false;
    if (i==2)
    {
        addOne = true;
    }
    if (!isDateNumber(strField.substring(0,i),1))
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    j=i+1;
    i=0;
    while ((strField.charAt(i+j)!= "/" && strField.charAt(j+i)!="-") && (i+j)<strField.length)
    {
        i++;
    }
    if ((i+j)==strField.length || i>2)
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    if (!isDateNumber(strField.substring(j,i+j),2))
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    j = i+3;
    i = 0;
    if (addOne)
    {
        j++;
    }
    while ((i+j)<strField.length)
    {
        i++;
    }
    if (i!= 2 && i!=4)
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    if (!isDateNumber(strField.substring(j,i+j),3))
    {
        alert("Field value must be in MM/DD/YYYY format.");
        object.focus();
        return false;
    }
    return true;
}

function isDateNumber(str,method)
{
    var i=0;
    if (isNaN(parseInt(str)) || parseInt(str) < 0)
    {
        return false;
    }
    if (method == 2)
    {
        if (parseInt(str)>31)
        {
            return false;
        }
    }
    if (method==1)
    {
        if (parseInt(str)>12)
        {
            return false;
        }
    }
    for (i=0;i<str.length;i++)
    {
        if (str.charAt(i)<'0' || str.charAt(i)>'9')
        {
            return false;
        }
    }
    return true;
}

function checkTime(object)
{
    var s=object.value;
    sError="Please, enter time in format 'HH:MM'";
    if (s.length==0)
    {
        alert(sError);
        object.focus();
        return false;
    }
    var bFlag=false;
    var i=0;
    while ((s.charAt(i)!=":") && (i<s.length))
    {
        i++;
    }
    if ((s.charAt(i)!=':') || (s.length>5))
    {
        bFlag=true;
    }
    var iHour=parseInt(s.substr(0,i));
    if (isNaN(iHour) || (parseInt(iHour)>24) || (parseInt(iHour)<0))
    {
        bFlag=true;
    }
    var iMin=parseInt(s.substr(i+1,s.length-i));
    if (isNaN(iMin) || (parseInt(iMin)>60) || (parseInt(iMin)<0))
    {
        bFlag=true;
    }
    if (s=='24:00')
    {
        object.value='23:59';
    }
    if (bFlag)
    {
        alert(sError);
        object.focus();
        return false;
    }
    else
    {
        return true;
    }
}

function checkMandatory(object)
{
    if (object.value.length==0)
    {
        alert ("Please, fill field!");
        object.focus();
        return false;
    }
    return true;
}

function insertForm(sform,object)
{
    var container=window.opener.foo.document.contForm;
    if (container!=null)
    {
        sform.demo.value=0;
        container.outerHTML=object.innerHTML;
    }
    else
    {
        var sel = window.opener.foo.document.selection;
        if (sel!=null)
        {
            var rng = sel.createRange();
            if (rng!=null)
            {
                sform.demo.value=0;
                rng.pasteHTML(object.innerHTML);
            }
        }
    }
    window.opener.switchOnBorders();
    window.close();
    window.opener.foo.focus();
}

function makeStep2(fieldnum)
{
    var count;
    var str='<table width="80%" border="0" cellspacing="" cellpadding="1">\n<tr>\n<td class="bodybold" valign="middle">Order</td>\n<td class="bodybold" valign="middle">Field Caption</td>\n<td class="bodybold" valign="middle">Field Type</td>\n<td class="bodybold" valign="middle">Required</td>\n</tr>';
    for (var i=0;i<fieldnum;i++)
    {
        count=i+1;
        str+='<tr>\n<td valign="middle"><input type="name" name="order['+i+']" size="2" maxlength="2" value="'+count+'"></td>\n<td valign="middle"><input type="name" name="name['+i+']" size="35" maxlength="127"></td>\n<td valign="middle"><select name="type['+i+']">';
        for (var j=0;j<type_array.length;j++)
        {
            str+='<option value="'+j+'">'+type_name_array[j]+'</option>';
        }
        str+='</select></td>\n<td valign="middle"><input type=checkbox name="required['+i+']" value="1"></td>\n</tr>';
    }
    str+='</table>\n';
    document.all.step2Content.innerHTML=str;
}

function makeStep3(sform,fieldnum,offset)
{
    var count;
    var str='<table width="80%" border="0" cellspacing="0" cellpadding="1">\n<tr>\n<td class="bodybold" valign="middle">Order</td>\n<td class="bodybold" valign="middle">Field Caption</td>\n<td class="bodybold" valign="middle">Field Type</td>\n<td class="bodybold" valign="middle">Required</td>\n</tr>\n<tr>\n<td colspan="4">&nbsp;</td>\n</tr>\n';
    for (var i=0;i<fieldnum;i++)
    {
        count=i+1;
        order=sform.elements[i*4+offset].value-1;
        if (sform.elements[order*4+3+offset].checked)
        {
            checked="Yes";
        }
        else
        {
            checked="No";
        }
        str+='<tr>\n<td valign="middle" class="body">'+count+'</td>\n<td valign="middle" class="body">'+sform.elements[order*4+offset+1].value+'</td>\n<td valign="middle" class="body">'+type_name_array[sform.elements[order*4+offset+2].selectedIndex]+'</td>\n<td valign="middle" class="body">'+checked+'</td>\n</tr>\n';
    }
    str+='<tr>\n<td colspan="4">&nbsp;</td>\n</tr></table>\n';
    document.all.step3Content.innerHTML=str;
}

function goForward(sform,maxfields)
{
    if (document.all.step1.style.display=="inline")
    {
        if (checkStep1(sform,maxfields))
        {
            makeStep2(sform.fields.value);
            document.all.step1.style.display="none";
            document.all.step2.style.display="inline";
            document.all.step3.style.display="none";
        }
    }
    else if (document.all.step2.style.display=="inline")
    {
        if (checkStep2(sform,sform.fields.value,4))
        {
            makeStep3(sform,sform.fields.value,4);
            makeForm(sform,sform.fields.value,4);
            document.all.step1.style.display="none";
            document.all.step2.style.display="none";
            document.all.step3.style.display="inline";
        }
    }
}

function goBack()
{
    if (document.all.step2.style.display=="inline")
    {
        document.all.step1.style.display="inline";
        document.all.step2.style.display="none";
        document.all.step3.style.display="none";
    }
    else if (document.all.step3.style.display=="inline")
    {
        document.all.step1.style.display="none";
        document.all.step2.style.display="inline";
        document.all.step3.style.display="none";
    }
}

function getContent(sform,offset)
{
    var sourceFormName='window.opener.foo.document.contForm';
    var sourceForm=eval(sourceFormName);
    var caption;
    if (sourceForm)
    {
        var fields=(sourceForm.elements.length-3)/3;
        makeStep2(fields);
        for (var i=0;i<fields;i++)
        {
            caption=eval(sourceFormName+'.caption'+i+'.value');
            if (caption.indexOf("*")!=-1)
            {
                sform.elements[i*4+offset+1].value=caption.substr(0,caption.length-2);
                sform.elements[i*4+offset+3].checked=true;
            }
            else
            {
                sform.elements[i*4+offset+1].value=caption;
            }
            for (var j=0;j<type_array.length;j++)
            {
                if (eval(sourceFormName+'.type'+i+'.value')==type_array[j])
                {
                    sform.elements[i*4+offset+2].selectedIndex=j;
                    break;
                }
            }
        }
        document.all.prev.style.display="none";
        document.all.step1.style.display="none";
        document.all.step2.style.display="inline";
        document.all.step3.style.display="none";
    }
}
