/*** Basic Helper Functions ***************************************************/

function addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be attached");
  }
}
function handleCSS(action, object, class1, class2)
{
    switch (action) {
        case "swap":
            object.className=!handleCSS("check",object,class1)?object.className.replace(class2,class1):
            object.className.replace(class1,class2);
            break;
        case "add":
            if(!handleCSS("check",object,class1)){object.className+=object.className?' '+class1:class1;}
            break;
        case "remove":
            var rep=object.className.match(" "+class1)?" "+class1:class1;
            object.className=object.className.replace(rep,"");
            break;
        case "check":
            return new RegExp("\\b"+class1+"\\b").test(object.className);
            break;
    }
}
function getTarget(e)
{
    if (e.srcElement) {
        return e.srcElement;
    } else {
        return e.target;
    }
}

function stopEvent(e)
{
    if (e && e.stopPropagation && e.preventDefault) {
        e.stopPropagation();
        e.preventDefault();
    }
    if (window.event) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
        return false;
    }
}

/*** VAT Handler **************************************************************/


function initializeVATHandler()
{
    var country = document.getElementById("country");
    if (!country || country.tagName.toLowerCase() != "select") return false;
    var vatID = document.getElementById("vatid");
    if (!country || vatID.type.toLowerCase() != "text") return false;

    // if both elements exist, initialize VATHandler
    var Handler = new VATHandler(country, vatID);
    Handler.handleVAT();
    addEvent(country, "change", function(){Handler.handleVAT()}, false);
}

function VATHandler(country, vatID)
{
    this.country = country;
    this.vatID   = vatID;

    function getSelectedCountry()
    {
        this.country = country;
        return this.country.options[this.country.selectedIndex]
    }
    this.handleVAT = function()
    {
        this.selectedCountry = getSelectedCountry();
        if (handleCSS("check", this.selectedCountry, "vatid")) {
            this.vatID.disabled = false;
            this.vatID.parentNode.style.display = "block";
        } else {
            this.vatID.disabled = true;
            this.vatID.parentNode.style.display = "none";
        }
    }
}

/*** Price Calculator *********************************************************/

function initializePriceCalculator()
{
    var source = document.getElementById("nousers");
    var target = document.getElementById("target");
    if ((!source || !target) || source.type.toLowerCase() != "text") return false;
    var container = document.getElementById("plans");
    var plans = container.getElementsByTagName("input")
    var Calc = new PriceCalculator(source, target, 39, "&euro;");

    addEvent(source, "keyup", function() {Calc.calculate()}, false);
    addEvent(source, "change", function() {Calc.calculate()}, false);
    for (var i = 0; i < plans.length; i++)
    {
        addEvent(plans[i], "change", function() {Calc.calculate()}, false);
    }
    Calc.calculate();
}

function PriceCalculator(source, target, price, currency) {
    this.source     = source;
    this.target     = target;
    this.price      = parseInt(price);
    this.currency   = currency;

    function getPlan()
    {
        var container = document.getElementById("plans");
        var plans = container.getElementsByTagName("input")
        if (!plans) return false;
        for (var i = 0; i < plans.length; i++)
        {
            if (plans[i].checked) var price = parseInt(plans[i].value);
        }
        switch(price)
        {
            case 12:
                return 39*12;
                break;
            case 6:
                return 42*6;
                break;
            case 1:
                return 45*1;
                break;
        }
    }
    function getNousers()
    {
        this.users = parseInt(source.value)
        if (isNaN(this.users)) this.users = 0;
        return this.users;
    }
    this.calculate = function()
    {
        this.nouser      = getNousers();
        this.price       = getPlan();
        if (isNaN(this.nouser)) this.source.value = 0;
        this.returnvalue = (this.price+(this.price*this.nouser)); //*12;
        this.returnvalue = this.currency+" "+this.returnvalue;
        this.target.innerHTML = this.returnvalue;
    }
}

/*** Form Validation **********************************************************/

function initializeForms()
{
    var forms = document.getElementsByTagName("form");
    for (var i = 0; i < forms.length; i++)
    {
        if (handleCSS("check", forms[i], "validateme")) {
            Form.initialize(forms[i]);
        }
    }
}

var Form = {
    initialize: function(elem){
        var container = elem;
        validation_fields = Form.getValidationFields(container);
        // Form.setFocus(container);
        addEvent(container, "submit", function(e){Form.validate(e)}, false);
    },
    setFocus: function(elem)
    {
        var all_inputs = elem.getElementsByTagName("input");
        for (var i = 0; i < all_inputs.length; i++)
        {
            var current_input = all_inputs[i];
            if (current_input.type != "hidden")
            {
                current_input.focus();
                return;
            }
        }
    },
    getValidationFields: function(elem)
    {
        var formitems = elem.getElementsByTagName("p");
        var _validation_fields = new Array();
        for (var i = 0; i < formitems.length; i++)
        {
            var current_formitem = formitems[i];
            if (!handleCSS("check", current_formitem, "validate")) continue;

            var current_input = current_formitem.getElementsByTagName("input")[0];
            if (!current_input) current_input = current_formitem.getElementsByTagName("textarea")[0];
            if (!current_input) current_input = null;
            if (current_input)
            {
                _validation_fields.push(new Array(current_formitem, current_input));
            }
        }
        return _validation_fields;
    },
    validate: function(e)
    {
        var validationerrors = 0;
        for (var i = 0; i < validation_fields.length; i++)
        {
            var is_agree    = handleCSS("check", validation_fields[i][0], "agree");
            var is_required = handleCSS("check", validation_fields[i][0], "required");
            var is_email    = handleCSS("check", validation_fields[i][0], "email");
            var is_url      = handleCSS("check", validation_fields[i][0], "url");
            var is_fullname = handleCSS("check", validation_fields[i][0], "fullname");
            var input_value = validation_fields[i][1].value;

            if (is_required && (input_value == "" || input_value.length < 1))
            {
                Form.showErrorMessage(validation_fields[i]);
                validationerrors++;
            } else {
                Form.removeErrorMessage(validation_fields[i]);
            }
            if (is_url)
            {
                var filter = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
                if (input_value != "" && !filter.test(input_value)) {
                    Form.removeErrorMessage(validation_fields[i]);
                    Form.showErrorMessage(validation_fields[i], "is_url");
                    validationerrors++;
                } else {
                    Form.removeErrorMessage(validation_fields[i]);
                }
            }
            if (is_email && input_value != "")
            {
                var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
                if (!filter.test(input_value)) {
                    Form.removeErrorMessage(validation_fields[i]);
                    Form.showErrorMessage(validation_fields[i], "is_email");
                    validationerrors++;
                } else {
                    Form.removeErrorMessage(validation_fields[i]);
                }
            }
            if (is_fullname && input_value != "")
            {
                var filter = /([a-zA-Z0-9]+) ([a-zA-Z0-9]+)/;
                if (!filter.test(input_value)) {
                    Form.removeErrorMessage(validation_fields[i]);
                    Form.showErrorMessage(validation_fields[i], "is_fullname");
                    validationerrors++;
                } else {
                    Form.removeErrorMessage(validation_fields[i]);
                }
            }
            if (is_agree)
            {
                if (validation_fields[i][1].checked == false)
                {
                    Form.showErrorMessage(validation_fields[i], "is_agree");
                    validationerrors++;
                } else {
                    Form.removeErrorMessage(validation_fields[i]);
                }
            }

        }

        if(validationerrors != 0) stopEvent(e);
    },
    showErrorMessage: function(elem, param)
    {
        // check if error message already exists
        if (elem[0].getElementsByTagName("span")[0] && handleCSS("check", elem[0].getElementsByTagName("span")[0], "errormessage")) return false;
        var error_container = document.createElement("span");
        error_container.className = "errormessage";
        var language = new LanguageHandler().getLanguage();
        switch(param)
        {
            case "is_agree":
                var message = (language == "e") ? "You have to agree to continue" : "Sie m&uuml;ssen zustimmen um fortzufahren";
                break;
            case "is_email":
                var message = (language == "e") ? "Please enter a valid email address" : "Bitte geben Sie eine Email-Adresse ein";
                break;
            case "is_url":
                var message = (language == "e") ? "Please enter a valid website address" : "Bitte geben Sie eine Web-Adresse ein";
                break;
            default:
                var message = (language == "e") ? "This is a required field" : "Bitte f&uuml;llen Sie dieses Feld aus";
                break;
        }
        error_container.innerHTML = message;
        elem[0].appendChild(error_container);
    },
    removeErrorMessage: function(elem)
    {
        var item = elem[0];
        var message = item.getElementsByTagName("span")[0];
        if (message) {
            item.removeChild(message);
        }
    },
    getLanguage: function()
    {
        var uri = location.href;
        if (uri.indexOf("/d/") > -1) {
            return "d";
        } else {
            return "e";
        }
    }
}

/*** Language Handler ********************************************************/

function LanguageHandler()
{
    this.qs     = location;
    this.filter = /\/[d]{1}\//;
    this.getLanguage = function()
    {
        if (this.filter.test(this.qs)) {
            return "d";
        } else {
            return "e";
        }
    }
}

/*** Email Handler ************************************************************/

function initializeEmailHandler()
{
    var spans = document.getElementsByTagName("span");
    for (var i = 0; i < spans.length; i++)
    {
        if (handleCSS("check", spans[i], "email"))
        {
            new EmailHandler(spans[i]).convertToLink();
        }
    }
}

function EmailHandler(elem)
{
    this.elem  = elem;
    this.email = elem.innerHTML.toString().replace("||", "@");
    this.convertToLink = function()
    {
        var link = document.createElement("a");
        link.href = "mailto:"+this.email;
        link.innerHTML = this.email;
        this.elem.innerHTML = "";
        this.elem.appendChild(link);
    }
}

/*** Google Analytics *********************************************************/

function initializeGA()
{
    _uacct = "UA-495394-3";
    urchinTracker();
}

/*** Install Event Listeners **************************************************/

addEvent(window, "load", initializeForms, false);
addEvent(window, "load", initializeVATHandler, false);
addEvent(window, "load", initializePriceCalculator, false);
addEvent(window, "load", initializeEmailHandler, false);
addEvent(window, "load", initializeGA, false);