


if (!window.console) {
    if (!window.console || !console.firebug) {
        var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
        "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

        window.console = {};
        for (var i = 0; i < names.length; ++i) {
            window.console[names[i]] = function() {};
        }
    }
}

Ajax.Responders.register({
    onCreate: function() {
        if(Ajax.activeRequestCount > 0) {
            $$('a', '.icon', 'div').each(function(element){
                element.style.cursor = 'wait';
            });
        }
    },
    onComplete: function() {
        if(Ajax.activeRequestCount <= 0){
            $$('a', '.icon', 'div').each(function(element){
                element.style.cursor = '';
            });
        }
    }
});

var App = {};
App.redirect = function(location) {
    window.location = location;
};

App.getId = function (element, prefix) {
    return $(element).id.substring(prefix.length);
};

App.trim = function(s) {
    return s.replace(/^\s+|\s+$/, '');
};

App.setBookmark = function bookmark(url,title){
    if((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4)) {
        window.external.AddFavorite(url,title);
    }
    else if (navigator.appName == "Netscape") {
        window.sidebar.addPanel(title,url,"");
    }
    else {
        alert("Press CTRL-D (Netscape), CTRL-T (Opera) or CTRL-D (Safari) to bookmark this page.");
    }
};



App.Form = Class.create();
App.Form.prototype = {

    initialize: function(form_id, options) {
        
        this.form_id = form_id;
        this.form    = $(form_id);
        
        this.option = {
            linkSubmit:     false,
            normalSubmit:   true,
            validation:     false,
            type:           'normal'    // normal | inline
        };
        Object.extend(this.option, options || {});

        if(this.option.linkSubmit) {
            $(this.option.linkSubmit).href = 'javascript:void(0);';
            Event.observe(this.option.linkSubmit, "click", this.linkSubmit.bindAsEventListener(this));
        }
        else {
            Event.observe(this.form, "submit", this.onSubmit.bindAsEventListener(this));
        }
        
        if(this.option.validation == true) {
            this.Validation = new App.Validate(this, this.option);
        }
    },
    
    linkSubmit: function(event) {

        if(this.option.validation == true) {
            var Validation = new App.Validate(this, this.option);
            if(Validation.validate() == false) {
                return;
            }
        }
        
        if(this.option.normalSubmit == false)
            this.form.request({
                method: 'post',
                onSuccess:  function(response) {
                    var json = response.responseText.evalJSON();
                    for(var i in json) $(i).update(json[i]);
                }
            });
        else {
           this.form.submit();
        }
    },
    
    onSubmit: function(event) {
        if(this.option.validation == true) {
            var Validation = new App.Validate(this, this.option);
            if(Validation.validate() == false) {
                Event.stop(event);
                return;
            }
        }
        this.form.submit();
    }

};

App.Validate = Class.create();
App.Validate.prototype = {

    initialize: function(self) {
        Object.extend(this, self);

        this.registerEvent();
    },
    
    getAdvice: function(element, content) {
        var msg = new Element('span', {'class' :'validation-advice'});
        
        if(element.id != undefined) {
            msg.id = 'advice_' + element.id.camelize();
        }
        else {
            element.identify();
            msg.id = 'advice_' + element.id.camelize();
        }
        msg.update(content);
        return msg;
    },
    
    remAdvice: function(element) {
        if($('advice_'+element.id.camelize())) {
            $('advice_'+element.id.camelize()).remove();
        }
        if(element.hasClassName('error')) {
            element.removeClassName('error');
        }
    },
    
    hasAdvice: function(element) {
        if($('advice_'+element.id.camelize())) {
            return true;
        }
        return false;
    },
    
    registerEvent: function() {
        
        this.form.getElements().each(function(element){
            element.observe('blur', this.onBlurHandler.bindAsEventListener(this));
        }.bind(this));

    },

    onBlurHandler: function(event) {
        this.validate(event);
    },
    
    validate: function(event) {

        this.check = false;

        if(event == undefined) {
            this.form.getElements().each(function(element){
    
                this.remAdvice(element);
                this._validate(element);
                
                
            }.bind(this));
        }
        else {
            this._validate(Event.element(event));
        }

        if($$('.validation-advice')[0] == undefined && this.check == false) {
            return true;
        }
        
        // set focus first error element
        if($$('.validation-advice')[0] != undefined)
            $($$('.validation-advice')[0].id.replace('advice_', '')).focus();
        
        return false;
    },
    
    _requiredValidation: function(element) {
        
        this.remAdvice(element);
        if(element.hasClassName('required') == true) {
            return true;
        }
        if(element.hasClassName('required') == false && App.trim($F(element)).length <= 0) {
            return false;
        }
        else {
            return true;
        }
    },
    
    _validate: function(element) {
        
        // check required
        if(element.hasClassName('required') == true) {
            if(App.trim($F(element)).length <= 0) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *required'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check login
        if(element.hasClassName('validate-login') == true && this._requiredValidation(element)) {
            if(App.trim($F(element)).length < 6) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *minlength 5 chars'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check uplinecode
        if(element.hasClassName('validate-uplinecode') == true && this._requiredValidation(element)) {
            if(App.trim($F(element)).length != 32 || /^[a-f0-9]+$/.test(App.trim($F(element))) == false) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *no valid code'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check verify
        if(element.hasClassName('validate-verify') == true && this._requiredValidation(element)) {
            var element_v = $(element.id.replace(/_verify/, ''));
            if(($F(element) != $F(element_v)) == true) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *verification failed'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check digits
        if(element.hasClassName('validate-digits') == true && this._requiredValidation(element)) {
            if(!/[^\d]/.test(App.trim($F(element))) == false) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *only digits'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check alpha
        if(element.hasClassName('validate-alpha') == true && this._requiredValidation(element)) {
            if(/^[a-zA-Z]+$/.test(App.trim($F(element))) == false) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *only alpha'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check alphanum
        if(element.hasClassName('validate-alphanum') == true && this._requiredValidation(element)) {
            if(/^[a-zA-Z0-9]+$/.test(App.trim($F(element))) == false) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *only alphanum'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
        
        // check date
        if(element.hasClassName('validate-date') == true && this._requiredValidation(element)) {
            var regex = /^(\d{2}).*(\d{2}).*(\d{4})$/;
            if(!regex.test(App.trim($F(element)))) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *no valid date'));
                else
                    element.addClassName('error');
                this.check = true;
            }
            else {
                var strDate = App.trim($F(element)).replace(regex, '$3, $2, $1');
                var d = new Date(strDate);

                if(( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
                    (parseInt(RegExp.$1, 10) == d.getDate()) &&
                    (parseInt(RegExp.$3, 10) == d.getFullYear() ) == false) {
                    if(this.option.type == 'normal')
                        new Insertion.After(element, this.getAdvice(element, ' *no valid date'));
                    else
                        element.addClassName('error');
                    this.check = true;
                }
            }
        }
        
        // check time
        if(element.hasClassName('validate-time') == true && this._requiredValidation(element)) {
            var regex = /^(\d{1,2}):(\d{2})(:(\d{2}))?$/;
            if(!regex.test(App.trim($F(element)))) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *no valid date'));
                else
                    element.addClassName('error');
                this.check = true;
            }
            else {
                var matchArray = $F(element).match(regex);
                if((matchArray[1] > 23 || matchArray[1] < 0) ||
                   (matchArray[2] > 59 || matchArray[2] < 0)) {
                    
                    if(this.option.type == 'normal')
                        new Insertion.After(element, this.getAdvice(element, ' *no valid date'));
                    else
                        element.addClassName('error');
                    this.check = true;
                }
            }
        }
        
        // check email
        if(element.hasClassName('validate-email') == true && this._requiredValidation(element)) {
            if(/^firstname\.surname/.test($F(element))) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *no valid email'));
                else
                    element.addClassName('error');
                this.check = true;
            }
            else if(/^[a-zA-Z0-9-_\.@]+$/.test($F(element)) == false) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *no valid email'));
                else
                    element.addClassName('error');
                this.check = true;
            }
            else if(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,4}))$/.test(App.trim($F(element))) == false) {
                if(this.option.type == 'normal')
                    new Insertion.After(element, this.getAdvice(element, ' *no valid email'));
                else
                    element.addClassName('error');
                this.check = true;
            }
        }
    
    }

};

App.PasswordFake = Class.create();
App.PasswordFake.prototype = {

    initialize: function(formid, options) {
    
        this.elements = new Hash();
    
        this.option = {
            text: 'Passwort',
            color: '#6F6F6F'
        };
        Object.extend(this.option, options || {});
        

        if($(formid).nodeName == 'FORM') {
            Form.getElements($(formid)).each(function(element){
                this.registerEvents(element);
            }.bind(this));
        }
        else {
            this.registerEvents($(formid));
        }

    },

    registerEvents: function(element) {
        
        if($(element) == '') {
            element.value = this.option.text;
        }

        $(element).identify();
        this.elements.set(element.id, element);
    
        Event.observe(element, 'blur',  this.onBlur.bindAsEventListener(this));
        Event.observe(element, 'focus', this.onFocus.bindAsEventListener(this));
    },

    onBlur: function(event) {
        element = Event.element(event);

        if (App.trim(element.value) === "") {
        
            if(element.id == 'login_password') {
                $('login_password').hide();
                $('login_password_fake').show();
            }
            
        }
    },

    onFocus: function(event) {
        element = Event.element(event);
        
        if(element.id == 'login_password_fake') {
            $('login_password_fake').hide();
            $('login_password').show();
            $('login_password').focus();
        }
        
        if (element.value != undefined
         && this.elements.get(element.id + '_previous') != undefined
         && App.trim(element.value) === App.trim(this.elements.get(element.id + '_previous'))) {
            element.value = "";
            element.style.color = '';
        }
    }
};

App.Layer = Class.create();
App.Layer.prototype = {

        initialize: function(layerID, p) {
            
            this.option = {};
            this.option.layerID = layerID;
            this.option.p = p;
            
            if($(this.option.layerID)) {
                return this;
            }
            this.load();
        },
        
        load: function() {
            
            new Ajax.Request('/layer', {
                parameters: {'load':this.option.layerID,'p':this.option.p},
                method: 'post',
                onSuccess: function(response) {
                    
                    var json = response.responseText.evalJSON();
                    this.option.layer = json.layer;

                    this.show();
                    
                }.bind(this)
            });
        },
        
        show: function() {
            
            try {
                
                this.remove();
                
                var shape = new Element('div', {'id':'shape','style':'position:absolute;top:0;left:0;height:101%;width:101%;background-color:#000;z-index:1000;'});
                
                $$('.homePage')[0].insert(shape);
                $$('.homePage')[0].insert(this.option.layer);
                
                var dimension = {};
                var dimension_body = $$('.homePage')[0].getDimensions();
                var dimension_lay  = $(this.option.layerID).getDimensions();
                
                dimension.height = dimension_body.height;
                if(dimension_lay.height > dimension_body.height) {
                    dimension.height = dimension_lay.height; 
                }
                
                if(window.innerHeight > dimension.height) {
                    dimension.height = window.innerHeight;
                }
                
                shape.style.height = dimension.height + 5 + 'px';
                shape.style.width = $$('.homePage')[0].getDimensions().width + 'px';
                shape.setOpacity(0.5);
                
            }catch(e) {
                console.error(e);
            }
            
        },
        
        remove: function() {
            
            if($(this.option.layerID)) {
                $(this.option.layerID).remove();
            }
            if($('shape')) {
                $('shape').remove();
            }
        }

    };


App.Preset = Class.create();
App.Preset.prototype = {

    initialize: function(formid, options) {
    
        this.elements = new Hash();
    
        this.option = {
            text: '...',
            color: '#6F6F6F'
        };
        Object.extend(this.option, options || {});
        

        if($(formid).nodeName == 'FORM') {
            Form.getElements($(formid)).each(function(element){
                this.registerEvents(element);
            }.bind(this));
        }
        else {
            this.registerEvents($(formid));
        }

    },

    registerEvents: function(element) {
        
        if($(element) == '') {
            element.value = this.option.text;
        }

        $(element).identify();
        this.elements.set(element.id, element);
        this.elements.set(element.id + '_previous', $F(element));
    
        Event.observe(element, 'blur',  this.onBlur.bindAsEventListener(this));
        Event.observe(element, 'focus', this.onFocus.bindAsEventListener(this));
    },

    onBlur: function(event) {
        element = Event.element(event);

        if (App.trim(element.value) === "") {
        
            if(element.id == 'login_password') {
                $('login_password').hide();
                $('login_password_fake').show();
            }
            
        
            element.value = this.elements.get(element.id + '_previous');
            element.style.color = this.option.color;
            if (element.type == "text") {
                element.addClassName('text_notice');
            }
        }
    },

    onFocus: function(event) {
        element = Event.element(event);
        
        if(element.id == 'login_password_fake') {
            $('login_password_fake').hide();
            $('login_password').show();
            $('login_password').focus();
        }
        
        if (element.value != undefined
         && this.elements.get(element.id + '_previous') != undefined
         && App.trim(element.value) === App.trim(this.elements.get(element.id + '_previous'))) {
            if (element.type == "text") {
                element.value = "";
                element.style.color = '#000000';
            }
        }
    }
};
