var cvOldOnload = window.onload;

window.onload = function()
{
    if (typeof cvOldOnload == 'function')
    {
         cvOldOnload();
    }

    window.cvInstance = new cv();
    cvInstance.init();
}

cv = function ()
{
    this.form = null;
}

cv.prototype.init = function()
{
    this.form = document.getElementById('cvForm');
    if (!this.form)
    {
        return;
    }

    this.initPosition();
    this.initCity();
    this.initWorkExperience();
    this.initBlockExtensionButtons();
    this.initLatvianLanguage();
    this.initLanguageSkills();

    this.initAttachment();


    var testClass = ' '.concat( this.form.className, ' ' );
    var isConfirmation = (testClass.indexOf(' confirmationForm ') != -1) ? true : false;

    if (!isConfirmation)
    {
        // update javascripton hidden field
        var body = document.getElementsByTagName('body')[0];
        var className = ' '.concat( body.className, ' ');
        var javascriptOn = (className.indexOf(' javascriptOn ') != -1) ? 1 : 0;
        document.getElementById('javascriptOn').value = javascriptOn;
    }

}

cv.prototype.initCity = function()
{
    var self = this;
    this.initSelectWithOther('city',
        function ()
        {
            self.updateCityDistricts();
        }

    );
}

cv.prototype.initPosition = function()
{
    this.initSelectWithOther('position');
}

cv.prototype.updateCityDistricts = function()
{
    var citySelect = document.getElementById('city');

    var districtsBox = document.getElementById('fieldBoxCityDistrict');
    if ((!citySelect) || (!districtsBox))
    {
        return;
    }


    var option = citySelect.options[citySelect.selectedIndex];
    var showCityDistricts = (option.className == 'hasDistricts');


    districtsBox.style.display = (showCityDistricts) ? 'block' : 'none';



}

cv.prototype.initSelectWithOther = function(key, postCall)
{
    var select = document.getElementById(key);
    var otherBox = document.getElementById(key + 'OtherBox');
    if ((!select) || (!otherBox) || (select.tagName.toLowerCase() != 'select'))
    {
        return;
    }

    var self = this;
    select.onchange = function()
    {

        self.updateSelectWithOther(this, otherBox);
        if (postCall)
        {
            postCall();
        }
    }
    select.onchange();
}

cv.prototype.updateSelectWithOther = function(select, otherBox)
{
    var showOther = (select.value === otherBox.className);
    otherBox.style.display = (showOther) ? 'inline' : 'none';
}


cv.prototype.initBlockExtensionButtons = function()
{
    var buttonIds = ['addEducationButton', 'addWorkExperienceButton'];
    var numberCheckPrefixes = ['educationalInstitution_', 'workExperiencePlace_'];
    var script = this;

    for (var i=0; i<buttonIds.length; i++)
    {

        var button = document.getElementById(buttonIds[i]);
        if (!button)
        {
            continue;
        }

        if (!this.locateTemplate(button))
        {
            continue;
        }

        button.numberCheckPrefix = numberCheckPrefixes[i];


        button.onclick = function ()
        {
            script.addNewBlock(this);
        }


        if (this.getNumberOfUsedBlocks( button ) == 0)
        {
            script.addNewBlock ( button );
        }

    }
}

cv.prototype.locateTemplate = function(button)
{
    // locate corresponding li element (template),
    // that will be copied when the button is clicked


    var fieldset = button.parentNode;
    var lists = fieldset.getElementsByTagName('ul');
    if (
        (!lists)
        ||
        (!lists[0])
    )
    {
        return false;
    }

    var items = lists[0].getElementsByTagName('li');
    if (
        (!items)
        ||
        (!items[0])
    )
    {
        return false;
    }



    // button.template = items[0];  //  throws NO_MODIFICATION_ALLOWED_ERR in OPERA

    button.getTemplate = function()
    {
        return items[0];
    }

    return true;

}

cv.prototype.getNumberOfUsedBlocks = function ( button )
{
    var currentId = this.getBlockNumber( button.getTemplate(), button.numberCheckPrefix );
    var newId = this.getFreeId( currentId, button.numberCheckPrefix );
    return newId - 1;
}


cv.prototype.addNewBlock = function( button )
{
    // copy existing template (add new block)
    // and change its number/id (numeric suffixes at the end of attribute values)

    var currentId = this.getBlockNumber( button.getTemplate(), button.numberCheckPrefix );
    if (currentId == null)
    {
        return false;
    }

    // get a free id in the page
    var newId = this.getFreeId( currentId, button.numberCheckPrefix );


    var newBlock = button.getTemplate().cloneNode( true );
    this.changeBlockId( newBlock, currentId, newId);

    newBlock.removeAttribute('class');
    newBlock.className = ''; /* IE */

    button.getTemplate().parentNode.appendChild( newBlock );

}



cv.prototype.getBlockNumber = function( block, numberCheckPrefix )
{
    var prefixLen = numberCheckPrefix.length;

    var elements = block.getElementsByTagName('input');
    for (var i=0; i < elements.length; i++)
    {
        if (
            (!elements[i].id)
            ||
            (elements[i].id.substr(0, prefixLen) != numberCheckPrefix)
        )
        {
            continue;
        }

        var idParts = elements[i].id.split('_');
        if (idParts.length != 2)
        {
            continue;
        }

        var number = idParts[1];
        return number;
    }
    return null;

}

cv.prototype.getFreeId = function ( startId, prefix )
{
    while (document.getElementById(prefix.concat(startId)))
    {
        startId++;
    }
    return startId;
}

cv.prototype.changeBlockId = function (block, currentId, newId)
{
    var tags = ['label', 'input', 'select', 'textarea'];
    var attributes = ['name', 'id', 'for', 'htmlFor'];

    var suffix = '_'.concat(currentId);
    var suffixLen = suffix.length;

    for (var i=0; i<tags.length; i++)
    {
        var tag = tags[i];
        var elements = block.getElementsByTagName( tag );
        if (!elements)
        {
            continue;
        }
        for (var j=0; j<elements.length; j++)
        {
            var el = elements[j];
            for (var k=0; k<attributes.length; k++)
            {

                var attrName = attributes[k];

                var attr = el.getAttribute(attrName);
                if (
                    (!attr)
                    ||
                    (attr.substr( attr.length - suffixLen ) != suffix)
                )
                {
                    continue;
                }

                var attrParts = attr.split('_');
                var idPart = attrParts.length - 1;
                attrParts[idPart] = newId;

                var newAttr = attrParts.join('_');
                el.setAttribute( attrName, newAttr );
                el[attrName] = newAttr;
            }

        }
    }

    return true;
}

cv.prototype.initWorkExperience = function()
{
    var select = document.getElementById('workExperienceExists');
    if (!select)
    {
        return false;
    }

    var self = this;
    select.onchange = function()
    {
        self.updateWorkExperience();
    }
    self.updateWorkExperience();
}

cv.prototype.updateWorkExperience = function()
{
    var workExpExistsField = document.getElementById('workExperienceExists');
    var fieldset = document.getElementById('workExperienceFieldset');
    if ((!workExpExistsField) || (!fieldset))
    {
        return false;
    }

    if (workExpExistsField.tagName.toLowerCase() == 'select')
    {
        // editable form
        var option = workExpExistsField.options[workExpExistsField.selectedIndex];
        var showWorkFields = (option.className == "showWorkFields");
    }
    else
    {

        // hidden field in confirmation form
        var showWorkFields = (workExpExistsField.className == 'showWorkFields')
    }


    fieldset.className = (showWorkFields) ? 'workExperience' : 'workExperience noWorkExperience';

    return true;
}

cv.prototype.initLatvianLanguage = function()
{
    var field = document.getElementById('languageLatvian');
    if (!field)
    {
        return false;
    }

    var self = this;
    field.onchange = function()
    {
        self.ensureSingleNativeLanguage( this );
        self.updateLatvianLanguage();
    }
    self.updateLatvianLanguage();
}
cv.prototype.updateLatvianLanguage = function()
{
    var latvianLanguageField = document.getElementById('languageLatvian');
    var fieldset = document.getElementById('languageSkillsFieldset');
    if ((!latvianLanguageField) || (!fieldset))
    {
        return false;
    }

    if (latvianLanguageField.tagName.toLowerCase() == 'select')
    {
        // editable form
        var option = latvianLanguageField.options[latvianLanguageField.selectedIndex];
        var showDegrees = (option.className == "showLanguageDegrees");
    }
    else
    {

        // hidden field in confirmation form
        var showDegrees = (latvianLanguageField.className == 'showLanguageDegrees')
    }


    fieldset.className = (showDegrees) ? 'languageSkills' : 'languageSkills noLatvianLanguageDegrees';

    return true;
}

cv.prototype.ensureSingleNativeLanguage = function( mainSelect )
{
    var languageSelects = this.getOtherLanguageSelects();
    var latvianLanguageSelect = document.getElementById('languageLatvian');

    var nativeText = this.getNativeLanguageText();

    if (mainSelect.options[mainSelect.selectedIndex].text !== nativeText)
    {
        return;
    }

    // add latvian language select to other selects
    languageSelects[languageSelects.length] = latvianLanguageSelect;

    for (var i=0; i<languageSelects.length; i++)
    {
        // loop through language selects, reset all other native values
        var select = languageSelects[i];
        if (
            (select == mainSelect)
            ||
            (select.options[select.selectedIndex].text !== nativeText)
        )
        {
            continue;
        }
        select.selectedIndex = 0;
        if (select == latvianLanguageSelect)
        {
            this.updateLatvianLanguage();
        }
    }

}

cv.prototype.getNativeLanguageText = function()
{
    var latvianLanguageSelect = document.getElementById('languageLatvian');
    if (!latvianLanguageSelect)
    {
        return null;
    }
    var text = null;
    for (var i=0; i<latvianLanguageSelect.options.length; i++)
    {
        var option = latvianLanguageSelect.options[i];
        if (option.value != 'native')
        {
            continue;
        }
        text = option.text;
    }
    return text;
}

cv.prototype.getOtherLanguageSelects = function()
{
    var languageSelects = [];

    var selects = document.getElementsByTagName('select');

    for (var i=0; i<selects.length; i++)
    {
        if (selects[i].name.substr(0, 9) != 'language_')
        {
            continue;
        }
        languageSelects[languageSelects.length] = selects[i];
    }
    return languageSelects;
}



cv.prototype.initLanguageSkills = function()
{
    var languageSelects = this.getOtherLanguageSelects();
    var script = this;
    for (var i=0; i<languageSelects.length; i++)
    {
        var select = languageSelects[i];
        select.onchange = function()
        {
            script.ensureSingleNativeLanguage( this );
        }
    }


}

cv.prototype.initAttachment = function()
{
    var button = document.getElementById('removeAttachmentButton');
    var fieldset = document.getElementById('attachmentFieldset');
    var hiddenInput = document.getElementById('attachedFileTmpName');
    var nameNode = document.getElementById('originalFileName');

    var removeInput = document.getElementById('attachedFileRemoved');


    if ((button) && (fieldset) && (hiddenInput) && (nameNode))
    {
        button.onclick = function()
        {
            nameNode.parentNode.removeChild(nameNode);
            fieldset.className = 'attachment';
            removeInput.value = 1;
        }
    }

}
