// START OF MESSAGE SCRIPT //

var MSGTIMER = 20;
var MSGSPEED = 5;
var MSGOFFSET = 3;
var MSGHIDE = 3;

// build out the divs, set attributes and call the fade function //
function inlineMsg(target, string, autohide){
    var msg;
    var msgcontent;
    if (!document.getElementById('msg')) {
        msg = document.createElement('div');
        msg.id = 'msg';
        msgcontent = document.createElement('div');
        msgcontent.id = 'msgcontent';
        document.body.appendChild(msg);
        msg.appendChild(msgcontent);
        msg.style.filter = 'alpha(opacity=0)';
        msg.style.opacity = 0;
        msg.alpha = 0;
    }
    else {
        msg = document.getElementById('msg');
        msgcontent = document.getElementById('msgcontent');
    }
    msgcontent.innerHTML = string;
    msg.style.display = 'block';
    var msgheight = msg.offsetHeight;
    var targetdiv = document.getElementById(target);
    targetdiv.focus();
    var targetheight = targetdiv.offsetHeight;
    var targetwidth = targetdiv.offsetWidth;
    var topposition = topPosition(targetdiv) - ((msgheight - targetheight) / 2);
    var leftposition = leftPosition(targetdiv) + targetwidth + MSGOFFSET;
    msg.style.top = topposition + 'px';
    msg.style.left = leftposition + 'px';
    clearInterval(msg.timer);
    msg.timer = setInterval("fadeMsg(1)", MSGTIMER);
    if (!autohide) {
        autohide = MSGHIDE;
    }
    window.setTimeout("hideMsg()", (autohide * 1000));
}

// hide the form alert //
function hideMsg(msg){
    var msg = document.getElementById('msg');
    if (!msg.timer) {
        msg.timer = setInterval("fadeMsg(0)", MSGTIMER);
    }
}

// face the message box //
function fadeMsg(flag){
    if (flag == null) {
        flag = 1;
    }
    var msg = document.getElementById('msg');
    var value;
    if (flag == 1) {
        value = msg.alpha + MSGSPEED;
    }
    else {
        value = msg.alpha - MSGSPEED;
    }
    msg.alpha = value;
    msg.style.opacity = (value / 100);
    msg.style.filter = 'alpha(opacity=' + value + ')';
    if (value >= 99) {
        clearInterval(msg.timer);
        msg.timer = null;
    }
    else 
        if (value <= 1) {
            msg.style.display = "none";
            clearInterval(msg.timer);
        }
}

// calculate the position of the element in relation to the left of the browser //
function leftPosition(target){
    var left = 0;
    if (target.offsetParent) {
        while (1) {
            left += target.offsetLeft;
            if (!target.offsetParent) {
                break;
            }
            target = target.offsetParent;
        }
    }
    else 
        if (target.x) {
            left += target.x;
        }
    return left;
}

// calculate the position of the element in relation to the top of the browser window //
function topPosition(target){
    var top = 0;
    if (target.offsetParent) {
        while (1) {
            top += target.offsetTop;
            if (!target.offsetParent) {
                break;
            }
            target = target.offsetParent;
        }
    }
    else 
        if (target.y) {
            top += target.y;
        }
    return top;
}

// preload the arrow //
if (document.images) {
    arrow = new Image(7, 80);
    arrow.src = "images/msg_arrow.gif";
}


function Validator(frmname){
    this.formobj = document.forms[frmname];
    if (!this.formobj) {
        alert("Error: couldnot get Form object " + frmname);
        return;
    }
    if (this.formobj.onsubmit) {
        this.formobj.old_onsubmit = this.formobj.onsubmit;
        this.formobj.onsubmit = null;
    }
    else {
        this.formobj.old_onsubmit = null;
    }
    this.formobj._sfm_form_name = frmname;
    this.formobj.onsubmit = form_submit_handler;
    this.addValidation = add_validation;
    this.setAddnlValidationFunction = set_addnl_vfunction;
    this.clearAllValidations = clear_all_validations;
    this.disable_validations = false;//new
    document.error_disp_handler = new sfm_ErrorDisplayHandler();
    this.EnableOnPageErrorDisplay = validator_enable_OPED;
    this.EnableOnPageErrorDisplaySingleBox = validator_enable_OPED_SB;
    this.show_errors_together = true;
    this.EnableMsgsTogether = sfm_enable_show_msgs_together;
}

function set_addnl_vfunction(functionname){
    this.formobj.addnlvalidation = functionname;
}

function sfm_enable_show_msgs_together(){
    this.show_errors_together = true;
    this.formobj.show_errors_together = true;
}

function clear_all_validations(){
    for (var itr = 0; itr < this.formobj.elements.length; itr++) {
        this.formobj.elements[itr].validationset = null;
    }
}

function form_submit_handler(){
    var bRet = true;
    document.error_disp_handler.clear_msgs();
    for (var itr = 0; itr < this.elements.length; itr++) {
        if (this.elements[itr].validationset &&
        !this.elements[itr].validationset.validate()) {
            bRet = false;
        }
        if (!bRet && !this.show_errors_together) {
            break;
        }
    }
    if (!bRet) {
        document.error_disp_handler.FinalShowMsg();
        return false;
    }
    
    if (this.addnlvalidation) {
        str = " var ret = " + this.addnlvalidation + "()";
        eval(str);
        if (!ret) 
            return ret;
    }
    return true;
}

function add_validation(itemname, descriptor, errstr){
    var condition = null;
    if (arguments.length > 3) {
        condition = arguments[3];
    }
    if (!this.formobj) {
        alert("Error: The form object is not set properly");
        return;
    }//if
    var itemobj = this.formobj[itemname];
    if (itemobj.length && isNaN(itemobj.selectedIndex)) //for radio button; don't do for 'select' item
    {
        itemobj = itemobj[0];
    }
    if (!itemobj) {
        alert("Error: Couldnot get the input object named: " + itemname);
        return;
    }
    if (!itemobj.validationset) {
        itemobj.validationset = new ValidationSet(itemobj, this.show_errors_together);
    }
    itemobj.validationset.add(descriptor, errstr, condition);
    itemobj.validatorobj = this;
}

function validator_enable_OPED(){
    document.error_disp_handler.EnableOnPageDisplay(false);
}

function validator_enable_OPED_SB(){
    document.error_disp_handler.EnableOnPageDisplay(true);
}

function sfm_ErrorDisplayHandler(){
    this.msgdisplay = new AlertMsgDisplayer();
    this.EnableOnPageDisplay = edh_EnableOnPageDisplay;
    this.ShowMsg = edh_ShowMsg;
    this.FinalShowMsg = edh_FinalShowMsg;
    this.all_msgs = new Array();
    this.clear_msgs = edh_clear_msgs;
}

function edh_clear_msgs(){
    this.msgdisplay.clearmsg(this.all_msgs);
    this.all_msgs = new Array();
}

function edh_FinalShowMsg(){
    this.msgdisplay.showmsg(this.all_msgs);
}

function edh_EnableOnPageDisplay(single_box){
    if (true == single_box) {
        this.msgdisplay = new SingleBoxErrorDisplay();
    }
    else {
        this.msgdisplay = new DivMsgDisplayer();
    }
}

function edh_ShowMsg(msg, input_element){

    var objmsg = new Array();
    objmsg["input_element"] = input_element;
    objmsg["msg"] = msg;
    this.all_msgs.push(objmsg);
}

function AlertMsgDisplayer(){
    this.showmsg = alert_showmsg;
    this.clearmsg = alert_clearmsg;
}

function alert_clearmsg(msgs){

}

function alert_showmsg(msgs){
    var whole_msg = "";
    var first_elmnt = null;
    for (var m = 0; m < msgs.length; m++) {
        if (null == first_elmnt) {
            first_elmnt = msgs[m]["input_element"];
        }
        whole_msg = msgs[m]["msg"];
        inlineMsg(first_elmnt.name, whole_msg);
        break;
    }
    
    if (null != first_elmnt) {
        first_elmnt.focus();
    }
}

function sfm_show_error_msg(msg, input_elmt){
    document.error_disp_handler.ShowMsg(msg, input_elmt);
}

function SingleBoxErrorDisplay(){
    this.showmsg = sb_div_showmsg;
    this.clearmsg = sb_div_clearmsg;
}

function sb_div_clearmsg(msgs){
    var divname = form_error_div_name(msgs);
    show_div_msg(divname, "");
}

function sb_div_showmsg(msgs){
    var whole_msg = "<ul>\n";
    for (var m = 0; m < msgs.length; m++) {
        whole_msg += "<li>" + msgs[m]["msg"] + "</li>\n";
    }
    whole_msg += "</ul>";
    var divname = form_error_div_name(msgs);
    show_div_msg(divname, whole_msg);
}

function form_error_div_name(msgs){
    var input_element = null;
    
    for (var m in msgs) {
        input_element = msgs[m]["input_element"];
        if (input_element) {
            break;
        }
    }
    
    var divname = "";
    if (input_element) {
        divname = input_element.form._sfm_form_name + "_errorloc";
    }
    
    return divname;
}

function DivMsgDisplayer(){
    this.showmsg = div_showmsg;
    this.clearmsg = div_clearmsg;
}

function div_clearmsg(msgs){
    for (var m in msgs) {
        var divname = element_div_name(msgs[m]["input_element"]);
        show_div_msg(divname, "");
    }
}

function element_div_name(input_element){
    var divname = input_element.form._sfm_form_name + "_" +
    input_element.name +
    "_errorloc";
    
    divname = divname.replace(/[\[\]]/gi, "");
    
    return divname;
}

function div_showmsg(msgs){
    var whole_msg;
    var first_elmnt = null;
    for (var m in msgs) {
        if (null == first_elmnt) {
            first_elmnt = msgs[m]["input_element"];
        }
        var divname = element_div_name(msgs[m]["input_element"]);
        show_div_msg(divname, msgs[m]["msg"]);
    }
    if (null != first_elmnt) {
        first_elmnt.focus();
    }
}

function show_div_msg(divname, msgstring){
    if (divname.length <= 0) 
        return false;
    
    if (document.layers) {
        divlayer = document.layers[divname];
        if (!divlayer) {
            return;
        }
        divlayer.document.open();
        divlayer.document.write(msgstring);
        divlayer.document.close();
    }
    else 
        if (document.all) {
            divlayer = document.all[divname];
            if (!divlayer) {
                return;
            }
            divlayer.innerHTML = msgstring;
        }
        else 
            if (document.getElementById) {
                divlayer = document.getElementById(divname);
                if (!divlayer) {
                    return;
                }
                divlayer.innerHTML = msgstring;
            }
    divlayer.style.visibility = "visible";
    return false;
}

function ValidationDesc(inputitem, desc, error, condition){
    this.desc = desc;
    this.error = error;
    this.itemobj = inputitem;
    this.condition = condition;
    this.validate = vdesc_validate;
}

function vdesc_validate(){
    if (this.condition != null) {
        if (!eval(this.condition)) {
            return true;
        }
    }
    if (validateInput(this.desc, this.itemobj, this.error) == false || !validateInput(this.desc, this.itemobj, this.error)) {
        this.itemobj.validatorobj.disable_validations = true;
        this.itemobj.focus();
        return false;
    }
    return true;
}

function ValidationSet(inputitem, msgs_together){
    this.vSet = new Array();
    this.add = add_validationdesc;
    this.validate = vset_validate;
    this.itemobj = inputitem;
    this.msgs_together = msgs_together;
}

function add_validationdesc(desc, error, condition){
    this.vSet[this.vSet.length] = new ValidationDesc(this.itemobj, desc, error, condition);
}

function vset_validate(){
    var bRet = true;
    for (var itr = 0; itr < this.vSet.length; itr++) {
        bRet = bRet && this.vSet[itr].validate();
        if (!bRet && !this.msgs_together) {
            break;
        }
    }
    return bRet;
}

function validateEmail(email){
    var splitted = email.match("^(.+)@(.+)$");
    if (splitted == null) 
        return false;
    if (splitted[1] != null) {
        var regexp_user = /^\"?[\w-_\.]*\"?$/;
        if (splitted[1].match(regexp_user) == null) 
            return false;
    }
    if (splitted[2] != null) {
        var regexp_domain = /^[\w-\.]*\.[A-Za-z]{2,4}$/;
        if (splitted[2].match(regexp_domain) == null) {
            var regexp_ip = /^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
            if (splitted[2].match(regexp_ip) == null) 
                return false;
        }// if
        return true;
    }
    return false;
}

function IsCheckSelected(objValue, chkValue){
    var selected = false;
    var objcheck = objValue.form.elements[objValue.name];
    if (objcheck.length) {
        var idxchk = -1;
        for (var c = 0; c < objcheck.length; c++) {
            if (objcheck[c].value == chkValue) {
                idxchk = c;
                break;
            }//if
        }//for
        if (idxchk >= 0) {
            if (objcheck[idxchk].checked == "1") {
                selected = true;
            }
        }//if
    }
    else {
        if (objValue.checked == "1") {
            selected = true;
        }//if
    }//else	
    return selected;
}

function TestDontSelectChk(objValue, chkValue, strError){
    var pass = true;
    pass = IsCheckSelected(objValue, chkValue) ? false : true;
    
    if (pass == false) {
        if (!strError || strError.length == 0) {
            strError = "Can't Proceed as you selected " + objValue.name;
        }//if			  
        sfm_show_error_msg(strError, objValue);
        
    }
    return pass;
}

function TestShouldSelectChk(objValue, chkValue, strError){
    var pass = true;
    
    pass = IsCheckSelected(objValue, chkValue) ? true : false;
    
    if (pass == false) {
        if (!strError || strError.length == 0) {
            strError = "You should select " + objValue.name;
        }//if			  
        sfm_show_error_msg(strError, objValue);
        
    }
    return pass;
}

function TestRequiredInput(objValue, strError){
    var ret = true;
    var val = objValue.value;
    val = val.replace(/^\s+|\s+$/g, "");//trim
    if (eval(val.length) == 0) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + " : Required Field";
        }//if 
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function BirTaneSecilmeli(objValue, strError){
    var objradio = objValue.form.elements[objValue.name];
    var one_selected = false;
    for (var r = 0; r < objradio.length; r++) {
        if (objradio[r].checked) {
            one_selected = true;
            break;
        }
    }
    if (!one_selected) {
        if (!strError || strError.length == 0) {
            strError = "You should select " + objValue.name;
        }//if			  
        sfm_show_error_msg(strError, objValue);
    }
    return one_selected;
}

function TestMaxLen(objValue, strMaxLen, strError){
    var ret = true;
    if (eval(objValue.value.length) > eval(strMaxLen)) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + " : " + strMaxLen + " characters maximum ";
        }//if 
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function TestMinLen(objValue, strMinLen, strError){
    var ret = true;
    if (eval(objValue.value.length) < eval(strMinLen)) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + " : " + strMinLen + " characters minimum  ";
        }//if               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function TestMinLenOrEmpty(objValue, strMinLen, strError){
    var ret = true;
    if (eval(objValue.value.length) < eval(strMinLen) && eval(objValue.value.length) > 0) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + " : " + strMinLen + " characters minimum  ";
        }//if               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function TestInputType(objValue, strRegExp, strError, strDefaultError){
    var ret = true;
    
    var charpos = objValue.value.search(strRegExp);
    if (objValue.value.length > 0 && charpos >= 0) {
        if (!strError || strError.length == 0) {
            strError = strDefaultError;
        }//if 
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function TestEmail(objValue, strError){
    var ret = true;
    if (objValue.value.length > 0 && !validateEmail(objValue.value)) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + ": Enter a valid Email address ";
        }//if                                               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function TestLessThan(objValue, strLessThan, strError){
    var ret = true;
    if (isNaN(objValue.value)) {
        sfm_show_error_msg(objValue.name + ": Should be a number ", objValue);
        ret = false;
    }//if 
    else 
        if (eval(objValue.value) >= eval(strLessThan)) {
            if (!strError || strError.length == 0) {
                strError = objValue.name + " : value should be less than " + strLessThan;
            }//if               
            sfm_show_error_msg(strError, objValue);
            ret = false;
        }//if   
    return ret;
}

function TestGreaterThan(objValue, strGreaterThan, strError){
    var ret = true;
    if (isNaN(objValue.value)) {
        sfm_show_error_msg(objValue.name + ": Should be a number ", objValue);
        ret = false;
    }//if 
    else 
        if (eval(objValue.value) <= eval(strGreaterThan)) {
            if (!strError || strError.length == 0) {
                strError = objValue.name + " : value should be greater than " + strGreaterThan;
            }//if               
            sfm_show_error_msg(strError, objValue);
            ret = false;
        }//if  
    return ret;
}

function TestRegExp(objValue, strRegExp, strError){
    var ret = true;
    if (objValue.value.length > 0 &&
    !objValue.value.match(strRegExp)) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + ": Invalid characters found ";
        }//if                                                               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }//if 
    return ret;
}

function TestDontSelect(objValue, dont_sel_index, strError){
    var ret = true;
    if (objValue.selectedIndex == null) {
        sfm_show_error_msg("ERROR: dontselect command for non-select Item");
        ret = false;
    }
    if (objValue.selectedIndex == eval(dont_sel_index)) {
        if (!strError || strError.length == 0) {
            strError = objValue.name + ": Please Select one option ";
        }//if                                                               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }
    return ret;
}

function TestSelectOneRadio(objValue, strError){
    var objradio = objValue.form.elements[objValue.name];
    var one_selected = false;
    for (var r = 0; r < objradio.length; r++) {
        if (objradio[r].checked == true) {
            one_selected = true;
            break;
        }
    }
    if (false == one_selected) {
        if (!strError || strError.length == 0) {
            strError = "Please select one option from " + objValue.name;
        }
        sfm_show_error_msg(strError, objValue);
    }
    return one_selected;
}


function EsitOlmali(objValue, cmdvalue, strError){
    var ret = true;
    if (objValue.value != objValue.form.elements[cmdvalue].value) {
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }
    return ret;
}


function EsitOlmamali(objValue, cmdvalue, strError){
    var ret = true;
    if (objValue.value == objValue.form.elements[cmdvalue].value) {
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }
    return ret;
}

function validateInput(strValidateStr, objValue, strError){
    var ret = true;
    var epos = strValidateStr.search("=");
    var command = "";
    var cmdvalue = "";
    if (epos >= 0) {
        command = strValidateStr.substring(0, epos);
        cmdvalue = strValidateStr.substr(epos + 1);
    }
    else {
        command = strValidateStr;
    }
    switch (command) {
        case "req":
        case "required":{
            ret = TestRequiredInput(objValue, strError)
            break;
        }//case required 
        case "maxlength":
        case "maxlen":{
            ret = TestMaxLen(objValue, cmdvalue, strError)
            break;
        }//case maxlen 
        case "minlength":
        case "minlen":{
            ret = TestMinLen(objValue, cmdvalue, strError)
            break;
        }//case minlen 
        case "minlengthe":
        case "minlene":{
            ret = TestMinLenOrEmpty(objValue, cmdvalue, strError)
            break;
        }//case minlen 
        case "alnum":
        case "alphanumeric":{
            ret = TestInputType(objValue, "[^A-Za-z0-9ÝÞÐÜÖÇ]", strError, objValue.name + ": Only alpha-numeric characters allowed ");
            break;
        }
        case "alnum_s":
        case "alphanumeric_space":{
            ret = TestInputType(objValue, "[^A-Za-z0-9ÝÞÐÜÖÇ\\s]", strError, objValue.name + ": Only alpha-numeric characters and space allowed ");
            break;
        }
        case "num":
        case "numeric":{
            ret = TestInputType(objValue, "[^0-9]", strError, objValue.name + ": Only digits allowed ");
            break;
        }
        case "dec":
        case "decimal":{
            ret = TestInputType(objValue, "[^0-9\.]", strError, objValue.name + ": Only numbers allowed ");
            break;
        }
        case "alphabetic":
        case "alpha":{
            ret = TestInputType(objValue, "[^A-Za-zýþðüöçÝÞÐÜÖÇ]", strError, objValue.name + ": Only alphabetic characters allowed ");
            break;
        }
        case "alphabetic_space":
        case "alpha_s":{
            ret = TestInputType(objValue, "[^A-Za-zýþðüöçÝÞÐÜÖÇ\\s]", strError, objValue.name + ": Only alphabetic characters and space allowed ");
            break;
        }
         case "alphabeticnontr_space":
        case "alphantr_s":{
            ret = TestInputType(objValue, "[^A-Za-z\\s]", strError, objValue.name + ": Only alphabetic characters and space allowed ");
            break;
        }
        case "email":{
            ret = TestEmail(objValue, strError);
            break;
        }
        case "lt":
        case "lessthan":{
            ret = TestLessThan(objValue, cmdvalue, strError);
            break;
        }
        case "gt":
        case "greaterthan":{
            ret = TestGreaterThan(objValue, cmdvalue, strError);
            break;
        }//case greaterthan 
        case "regexp":{
            ret = TestRegExp(objValue, cmdvalue, strError);
            break;
        }
        case "dontselect":{
            ret = TestDontSelect(objValue, cmdvalue, strError)
            break;
        }
        case "dontselectchk":{
            ret = TestDontSelectChk(objValue, cmdvalue, strError)
            break;
        }
        case "shouldselchk":{
            ret = TestShouldSelectChk(objValue, cmdvalue, strError)
            break;
        }
        case "selone_radio":{
            ret = TestSelectOneRadio(objValue, strError);
            break;
        }
        case "esit_olmali":{
            ret = EsitOlmali(objValue, cmdvalue, strError);
            break;
        }
        
        case "esit_olmamali":{
            ret = EsitOlmamali(objValue, cmdvalue, strError);
            break;
        }
        
        case "chkbirtanesecilmeli":{
            ret = BirTaneSecilmeli(objValue, strError);
            break;
        }
    }//switch 
    return ret;
}

function VWZ_IsListItemSelected(listname, value){
    for (var i = 0; i < listname.options.length; i++) {
        if (listname.options[i].selected == true &&
        listname.options[i].value == value) {
            return true;
        }
    }
    return false;
}

function VWZ_IsChecked(objcheck, value){
    if (objcheck.length) {
        for (var c = 0; c < objcheck.length; c++) {
            if (objcheck[c].checked == "1" &&
            objcheck[c].value == value) {
                return true;
            }
        }
    }
    else {
        if (objcheck.checked == "1") {
            return true;
        }
    }
    return false;
}