window.onload = init;

function init() {
    externalLinks_init();
}

function externalLinks_init() {
    if (!document.getElementsByTagName) {
        return;
    }

    var links = document.getElementsByTagName('a');

    for (var i=0; i<links.length; i++) {
        var link = links[i];

        if (link.getAttribute('href') && link.getAttributeNode('class') && (link.getAttributeNode('class').value.search(/external/) >= 0)) {
            link.onclick = externalLinks_open;
            link.onkeypress = externalLinks_open;
        }
    }
}

function externalLinks_open(a) {
    window.open(this.href);
    return false;
}


function definedkeys_only(e, keys)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case 8:
        case 9:
        case 13:
        case 37:
        case 38:
        case 39:
        case 40:
        case 46:
            return true;
            break;
    }

    var re = new RegExp(keys);

    return re.test(String.fromCharCode(k));
}

function nums_only(e)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case null:
        case 0:
        case 8:
        case 9:
        case 13:
        case 27:
            return true;
            break;
    }

  if (-1 != ("0123456789").indexOf(String.fromCharCode(k))) {
      return true;
  }

  return false;
}


function date_only(e)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case 8:
        case 9:
        case 13:
        case 46:
            return true;
            break;
    }

    dot = (k == 46);
    var r = ((k < 48 || k > 57) && !dot && (k < 35 || k > 40));

    return !r;
}

function time_only(e)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case 8:
        case 9:
        case 13:
        case 58:
            return true;
            break;
    }

    dot = (k == 58);
    var r = ((k < 48 || k > 57) && !dot && (k < 35 || k > 40));

    return !r;
}

function nums_dot(e, box)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case 8:
        case 9:
        case 13:
        case 46:
            return true;
            break;
    }

    var dot = (k == 46);

    if (dot && box && box.value && (-1 != box.value.indexOf('.'))) {
        dot = false;
    }

    var minus = (k == 45);

    if (minus) {
        // byl zmacknuty znak '-', pokud je na zacatku, povolim ho
        return true;
    }

    var r = ((k < 48 || k > 57) && !dot && (k < 35 || k > 40));

    return !r;
}

function hexanums_only(e)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case 8:
        case 9:
        case 13:
        case 46:
            return true;
            break;
    }

    var re = new RegExp('[0-9a-fA-F]');

    return re.test(String.fromCharCode(k));
}

function seokeys_only(e)
{
    var k = (e.which) ? e.which : e.keyCode;

    switch (k) {
        case 8:
        case 9:
        case 13:
        case 46:
            return true;
            break;
    }

    var re = new RegExp('[0-9a-zA-Z_\-]');

    return re.test(String.fromCharCode(k));
}

function getLabel(elemId)
{
    return getLabelFor(elemId, 'required')
}

function adaptLabel(label)
{
    if (label && label.length) {
        if (label.attr('title')) {
            return label.attr('title');
        }

        label = label.text();
        label = label.replace(/[\s\*:]*$/, '');

        return label;
    }

    return '';
}

function getLabelFor(elemId, classname)
{
    if (elemId) {
        classname = (classname) ? '.' + classname : '';

        return adaptLabel($('label' + classname + '[for="' + elemId + '"]'));
    }

    return '';
}

function getRadioLabel(name)
{
    return (name) ? adaptLabel($('label.radio-main-label.' + name)) : '';
}

function emailCheck(email)
{
    var ret = true;

    if (window.RegExp) {
        re = new RegExp("^[_a-zA-Z0-9\.\-]+@[_a-zA-Z0-9\.\-]+[\.][a-zA-Z]{2,4}$");
        ret = re.test(email);
    }

    return ret;
}

var __TRANSLATIONS__ = new Array();
__TRANSLATIONS__['yes']                = new Array();
__TRANSLATIONS__['no']                 = new Array();
__TRANSLATIONS__['check']              = new Array();
__TRANSLATIONS__['choose']             = new Array();
__TRANSLATIONS__['fill']               = new Array();
__TRANSLATIONS__['email']              = new Array();
__TRANSLATIONS__['date-invalid']       = new Array();

__TRANSLATIONS__['yes']['cs']                = "Ano";
__TRANSLATIONS__['no']['cs']                 = "Ne";
__TRANSLATIONS__['check']['cs']              = "Zaškrtněte prosím pole '%s'.";
__TRANSLATIONS__['choose']['cs']             = "Vyberte prosím jednu z možností v poli '%s'.";
__TRANSLATIONS__['fill']['cs']               = "Vyplňte prosím pole '%s'.";
__TRANSLATIONS__['email']['cs']              = "Emailová adresa v poli '%s' je neplatná, zadejte ji prosím znovu.";
__TRANSLATIONS__['date-invalid']['cs']       = "Datum v poli '%s' je chybné, prosím zadejte jej znovu.";

__TRANSLATIONS__['yes']['en']                = "Yes";
__TRANSLATIONS__['no']['en']                 = "No";
__TRANSLATIONS__['check']['en']              = "Please check field '%s'.";
__TRANSLATIONS__['choose']['en']             = "Please choose one posibility in field '%s'.";
__TRANSLATIONS__['fill']['en']               = "Please fill field '%s'.";
__TRANSLATIONS__['email']['en']              = "Email address in field '%s' is invalid, please enter it again.";
__TRANSLATIONS__['date-invalid']['en']       = "The date in field '%s' is invalid, please enter it again.";


var __TRANS_LANG__ = document.getElementsByTagName('html')[0].lang;

if (__TRANS_LANG__ != 'cs') {
    __TRANS_LANG__ = 'en';
}

function getTrans(key)
{
    if (!__TRANSLATIONS__[key]) {
        return 'unknown';
    }

    return __TRANSLATIONS__[key][__TRANS_LANG__];
}

function checkForm(form, errorToText)
{
    var inputs = $('#' + form.id + ' .required');

    if (!inputs.length) {
        return (errorToText) ? '' : true;
    }

    // skryte polozky nebudu pozadovat pro vyplneni
    var inputs_p = $('#' + form.id + ' input:hidden .required, #' + form.id + ' .required:hidden');

    var error = '';
    var radio = new Array();
    var radio_labels = new Array();
    for (var i = 0; i < inputs.length; i++) {
        el = inputs[i];

        if (!el.id) {
            continue;
        }

        var hidden = false;

        for (var j = 0; j < inputs_p.length; j++) {
            if (el == inputs_p[j]) {
                hidden = true;
                break;
            }
        }

        if (hidden) {
            continue;
        }

        label = getLabel(el.id).replace(/\*+$/g, '');

        if (!label) {
            continue;
        }

        // uprava hodnoty
        el_val = (el.value) ? $.trim(el.value) : null;

        if (
            !(el_val)
            || (('null' == el_val) && ('SELECT' == el.tagName) && (-1 == el.className.indexOf('nullable')))
            || (('checkbox' == el.type) && !el.checked)
        ) {
            switch (el.type) {
                case 'checkbox':
                    error += getTrans('check').replace('%s', label) + "\n";
                    break;

                case 'select-one':
                    error += getTrans('choose').replace('%s', label) + "\n";
                    break;

                default:
                    error += getTrans('fill').replace('%s', label) + "\n";
                    break;
            }

            continue;
        }

        if (('INPUT' == el.tagName) && ('radio' == el.type)) {
            if (!radio[el.name]) {
                radio[el.name] = false;
            }

            if (el.checked) {
                radio[el.name] = true;
            }

            radio_labels[el.name] = getRadioLabel(el.name);
        }

        if (-1 != el.id.indexOf('email')) {
            if (!emailCheck(el_val)) {
                error += getTrans('email').replace('%s', label) + "\n";
            }
        }
    }

    for (var rad in radio) {
        if (!radio[rad] && radio_labels[rad]) {
            error += getTrans('choose').replace('%s', radio_labels[rad]) + "\n";
        }
    }

    // zkontroluju datumy
    inputs = $('#' + form.id + ' input.date');

    for (var i = 0; i < inputs.length; i++) {
        if (!inputs[i].id || !inputs[i].value) {
            continue;
        }

        var label = getLabelFor(inputs[i].id);

        if (!label) {
            continue;
        }

        if (!checkDate(inputs[i].value)) {
            error += getTrans('date-invalid').replace('%s', label) + "\n";
        }
    }

    if (error) {
        if (errorToText) {
            return error;
        }

        alertMess(error);

        return false;
    }

    if (errorToText) {
        return '';
    }

    return true;
}

function checkDate(date)
{
    if (!date) {
        return false;
    }

    var tested = /^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})$/.exec(date);

    if (!tested) {
        return false;
    }

    tested[1] = tested[1].replace(/^0*/, '');
    tested[2] = tested[2].replace(/^0*/, '');
    tested[3] = tested[3].replace(/^0*/, '');

    if (!tested[1] || !tested[2] || !tested[3]) {
        return false
    }

    tested[1] = parseInt(tested[1]);
    tested[2] = parseInt(tested[2]);
    tested[3] = parseInt(tested[3]);

    if ((1 > tested[2]) || (12 < tested[2])) {
        return false;
    }

    var days = new Array();
    days[1] = days[3] = days[5] = days[7] = days[8] = days[10] = days[12] = 31;
    days[2] = ((tested[3]%4) > 0) ? 28 : 29;
    days[4] = days[6] = days[9] = days[11] = 30;

    if ((1 > tested[1]) || (days[tested[2]] < tested[1])) {
        return false;
    }

    if (tested[3] < 1850) {
        return false;
    }

    return true;
}

function invalidDate(label)
{
    return getTrans('date-invalid').replace('%s', label) + "\n";
}

function alertMess(mess)
{
    var prompted = false;

    try {
        if ($.prompt) {
            $.prompt(mess.replace(/\n/g, "<br />\n"), { opacity: 0.8 });
            prompted = true;
        }
    } catch(err) {
    }

    if (!prompted) {
        alert(mess);
    }
}

function setFocus(DOMdestination)
{
    setTimeout(DOMdestination, 400);
}
