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)
        Element.hide('chart-view');
        Element.show('chart-indicator');
    },
    onComplete: function() {
        if (Ajax.activeRequestCount == 0) 
        Element.hide('chart-indicator');
        Element.show('chart-view');
    }
});

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

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

App.onCheckAllClick = function(event) {
    var element = Event.element(event);
    var checked = true;
    if (element.tagName == 'A') {
        Event.stop(event);
         checked = true;
    } else {
        checked = element.checked;
    }
    $$('INPUT.checkall-target').each(function(e) { e.checked = checked; });
};

App.replaceUmlauts = function(string, direction){
    var replace = [
        ["Ö", "ö", "Ä", "ä", "Ü", "ü", "ß"],
        ["Oe", "oe", "Ae", "ae", "Ue", "ue", "ss"]
    ];
    for (var i=0; i < replace[direction].length; i++){
        myRegExp = new RegExp(replace[direction][i],"g");
        string = string.replace(myRegExp, replace[(direction === 0 ? 1 : 0)][i]);
    }
    return string;
};

App.preloadImage = function(src) {
    try {(new Image()).src = src;} catch (e) {}
};

App.getWindowHeight = function() {
    if (self.innerHeight) {
        x = self.innerWidth;
        y = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) {
        x = document.documentElement.clientWidth;
        y = document.documentElement.clientHeight;
    } else if ($(document.body)) {
        x = document.body.clientWidth;
        y = document.body.clientHeight;
    }
    return y;
};

App.getWindowWidth = function(){
    if (navigator.appVersion.indexOf('MSIE')>0) {
        return document.body.clientWidth;
    } else {
        return window.innerWidth;
    }  
};

var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire !== undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire + ';path=/;');
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled  == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === "1");
  },
  add: function(name, value) {
    var current = Cookie.get(name);
    Cookie.set(name, current+value);
    return Cookie.get(name);
  }
};


App.PresetText = Class.create();
App.PresetText.prototype = {
    initialize: function(element, options) {
        this.options = {
            text: 'Hier Text eingeben...',
            color: '#6F6F6F'
        };
        
        Object.extend(this.options, options || {});
        this.element = $(element);
        this.element.value =  this.options.text;
        this.element.style.color = this.options.color;
        this.registerEvents();
    },
    registerEvents: function() {
        Event.observe(this.element, 'blur',  this.onBlur.bindAsEventListener(this));
        Event.observe(this.element, 'focus', this.onFocus.bindAsEventListener(this));
    },
    onBlur: function(event) {
        if (this.element.value === "") {
            this.element.value = this.options.text;
            this.element.style.color = this.options.color;
        }
    },
    onFocus: function(event) {
        if (this.element.value === this.options.text) {
            this.element.value = "";
            this.element.style.color = '';
        }
    }
};

App.Form = Class.create(); 
App.Form.prototype = {
    initialize: function(form_id, options) {
        this.form_id = form_id;
        this.form    = $(form_id);
        this.options = {
            useServerValidation: true,
            disableOnSubmit: true,
            validation: {} /* options for the validation class*/
        };
        this.disabled = false;
        Object.extend(this.options, options || {});


        /* defaults for the validation class*/
        var defaults = {
            focusOnError: true,
            immediate : false,
            onSubmit : false,
            onFormValidate : this.onFormValidate.bind(this)
            
        };
        Object.extend(defaults, this.options.validation);
        this.validator = new Validation(this.form_id, defaults);

        Event.observe(this.form, "submit", this.onSubmit.bindAsEventListener(this));
    },
    onSubmit: function(event) {
        try {
            if (this.options.disableOnSubmit && this.disabled) {
                Event.stop(event);
                return;
            }
            Event.stop(event);
            this.validator.validate();
            return false;
        } catch (e) { throw e; }
    },
    onFormValidate: function(result, form) {
        if (result) {
            if (this.options.disableOnSubmit) {
                this.disabled = true;
            }
            if(this.options.normalSubmit) {
                this.form.submit();
            } else {
                this.submitForm();
            }
        } else {
            this.indicateStatus(false);
        }
    },
    submitForm: function() {
        this.form.request({
            method: 'post',
            onComplete: this.onSubmitFormComplete.bind(this), // Prototype.emptyFunction,
            onSuccess:  this.onSubmitFormSuccess.bind(this)    
        });
    },
    onSubmitFormComplete: function() {
        if (this.options.disableOnSubmit) {
            this.disabled = false;
        }
    },
    onSubmitFormSuccess: function(transport) {
        if (!this.options.useServerValidation) {
            if (this.options.onSubmitSuccess) {
                this.options.onSubmitSuccess(transport);
            }
            return;            
        }
        
        try {
            var response = transport.responseText.evalJSON();
            if (response.error) {
                //TODO: display some error message
                this.indicateStatus(false);
                if (this.options.onSubmitError) {
                    this.options.onSubmitError(response);
                }
                return;
            }
            if (response.messages && response.messages.length > 0) {
                // TODO: display some error message
                this.indicateStatus(false);
                if (this.options.onSubmitError) {
                    this.options.onSubmitError(response);
                }
                return;
            }
            
            if (response.data) {
                this.setValues(response.data);
            }
            this.indicateStatus(true);          
            if (this.options.onSubmitSuccess) {
                this.options.onSubmitSuccess(response);
            }
        } catch (e) {
            console.error(e);
        }
    },
    setValues: function(values) {
        $H(values).each(
            function(pair) {
                if ($(pair.key)) {
                    $(pair.key).value = pair.value;
                }
            }
        );
    },
    indicateStatus: function(valid) {
        var status_ok    = $(this.form_id + '-status-okay');
        var status_error = $(this.form_id + '-status-error');
        if (!status_ok || status_error) {
            return;
        }
        if (valid) {
            Element.show(status_ok);
            Element.hide(status_error);
        } else {
            Element.hide(status_ok);
            Element.show(status_error);
        }
    }
};

App.Sidebar = Class.create();
App.Sidebar.prototype = {
    
    initialize: function() {
        this.registerEvents();
    },
    registerEvents: function() {
        Event.observe(window, "load", this.onRestoreCharts.bindAsEventListener(this));
        Event.observe($('add-chart'), "change", this.onAddCharts.bindAsEventListener(this));
        this.registerSortables();
    },
    onRestoreCharts: function(event) {
        var cookieSidebarIsin = Cookie.get("gs-yahoo-sidebar-isin");
        var cookieSidebarComm = Cookie.get("gs-yahoo-sidebar-commodity");
        if (!cookieSidebarIsin || !cookieSidebarComm) {
            return;
        }
        
        sidebarconfigisin = unescape(cookieSidebarIsin);
        var sidebarcontentisin = sidebarconfigisin.split(",");
        
        sidebarconfigcomm = unescape(cookieSidebarComm);
        var sidebarcontentcomm = sidebarconfigcomm.split(",");
        
        var chartcontainer = $('personal-chart-bar');
        chartcontainer.update();
        
        for(var i=0; i<sidebarcontentisin.length; i++) {
        
            var objTitle = 'chart-object-'+sidebarcontentisin[i];
            var objId = 'key_'+i;
            var gsLink = "http://www.goldman-sachs.de/isin/detail/"+sidebarcontentisin[i]+"/";
            var gsChartUrl = "/index/chart/isin/"+sidebarcontentisin[i]+"/size/supertiny/timespan/91";
            
            
            var chartObj = Builder.node('li',{className:'chart-entry', lang: 'chart-name-'+sidebarcontentcomm[i], title: 'chart-object-'+sidebarcontentisin[i],id: objId,  style: 'position:relative'},[
                        Builder.node('div',{className:'overview'},[
                              Builder.node('div',{className:'isin'},[
                                  Builder.node('div', {className: 'isin-link'}, [
                                    Builder.node('a',{href:gsLink, target:'_top'}, sidebarcontentcomm[i]) ]),
                                Builder.node('div', {className: 'chart-nav'}, [
                                    Builder.node('img', {src: '/images/ico_delete_chart.gif', alt: '', title: '', className: 'remove'}),
                                    //Builder.node('img', {src: '/images/ico_up_chart.gif', alt: '', title: ''}),
                                    //Builder.node('img', {src: '/images/ico_down_chart.gif', alt: '', title: ''}),
                                ]),
                            ]),
                            Builder.node('img', {src: gsChartUrl, width: '160px', height: '75px'}),
                         ]),
                         ]);
            if (sidebarcontentisin[i] != 'null') {
                    console.log("new object: "+chartObj);
                    console.log("old object: "+chartcontainer);
                    chartcontainer.insert(chartObj);
            }
            
        }
        this.registerRemoveChart();
        Sortable.create("personal-chart-bar", {
            onUpdate: this.onUpdateSortable.bind(this)
        });
        this.onUpdateSortable();
    },
    registerSortables: function() {
        Sortable.create("personal-chart-bar", {
            onUpdate: this.onUpdateSortable.bind(this)        
        });
    },
    onUpdateSortable: function() {
        var order = $$('.chart-entry').pluck('title').collect(function(val) {
            var prefix = 'chart-object-';
            var id = val.substring(prefix.length);
            return id;
        });
        var commodity = $$('.chart-entry').pluck('lang').collect(function(val) {
            var prefix = 'chart-name-';
            var id = val.substring(prefix.length);
            return id;
        });

       console.log("c", commodity);             
        
        if (order[0] != "" && commodity != "") {        
            var cookieSidebarIsin = Cookie.set("gs-yahoo-sidebar-isin", order.join(","), 365);
            var cookieSidebarComm = Cookie.set("gs-yahoo-sidebar-commodity", commodity.join(","), 365);
            console.log("Updated the cooookie.", order.join(","), commodity.join(","));
        }
        
        if (order.length == 0 || commodity.length == 0) {
            var cookieSidebarIsin = Cookie.set("gs-yahoo-sidebar-isin", '', 365);
            var cookieSidebarComm = Cookie.set("gs-yahoo-sidebar-commodity", '', 365);
            console.log("Cleared the cooookie.");        
        }
        
    },
    registerRemoveChart: function() {
        $$('img.remove').each(function(element){
        Event.observe(element, "click", function(event) {
            Event.stop(event);
            var element = Event.element(event).up(2);
            Effect.Fade(element, {duration:0.4, afterFinish: function() {
                console.log(document.cookie);             
                console.log("removed element");
                element.up().remove();
                this.onUpdateSortable();
                console.log(document.cookie);            
              }.bind(this)});
            
            
                
             //console.log(document.cookie);
            }.bindAsEventListener(this));
        }.bind(this));        
        
        
    },
    onAddCharts: function(event){
        console.log(event);
        Event.stop(event);
        var element = Event.element(event);
        var count = $('personal-chart-bar').getElementsByTagName('li').length;
        var labelchart = [];
        $F(element).scan(/[^|^]+/, function(match){ labelchart.push(match[0])});       

        var objTitle = 'chart-object-'+labelchart[0];
        var objName = 'chart-name-'+labelchart[1];
        var objId = 'key_'+count;
        var gsLink = "http://www.goldman-sachs.de/isin/detail/"+labelchart[0]+"/";
        var gsChartUrl = "/index/chart/isin/"+labelchart[0]+"/size/supertiny/timespan/91";
        
        var element = Builder.node('li',{className:'chart-entry', title: objTitle, lang:objName , id: objId, style: 'position:relative'},[
                    Builder.node('div',{className:'overview'},[
                          Builder.node('div',{className:'isin'},[
                              Builder.node('div', {className: 'isin-link'}, [
                                Builder.node('a',{href:gsLink, target:'top'}, labelchart[1]) ]),
                            Builder.node('div', {className: 'chart-nav'}, [
                                Builder.node('img', {src: '/images/ico_delete_chart.gif', alt: '', title: '', className: 'remove'}),
                                //Builder.node('img', {src: '/images/ico_up_chart.gif', alt: '', title: ''}),
                                //Builder.node('img', {src: '/images/ico_down_chart.gif', alt: '', title: ''}),
                            ]),
                        ]),
                        
                        Builder.node('img', {src: gsChartUrl, width: '160px', height: '75px'}),
                     ]),
                     ]);
            
            $('personal-chart-bar').insert(element, {position:top})
            this.registerRemoveChart();
            Sortable.create("personal-chart-bar", {
                onUpdate: this.onUpdateSortable.bind(this)
            });
        this.onUpdateSortable();
        Event.element(event).selectedIndex = 0;
    }
    
};

App.Profilnavigation = Class.create();
App.Profilnavigation.prototype = {
    initialize: function() {
        this.registerEvents();
    },
    registerEvents: function() {
        $$('.chartselection').each(this.registerChooseChart.bind(this));
        

    },
    registerChooseChart: function(element) {
        Event.observe(element, "click", this.onChooseChart.bindAsEventListener(this));
    },
    registerChooseProfileChart: function(element) {
        Event.observe(element, "click", this.onChooseProfileChart.bindAsEventListener(this));
    },
    registerChooseForwardChart: function(element) {
        Event.observe(element, "click", this.onChooseForwardChart.bindAsEventListener(this));
    },
    
    onChooseChart: function(event){
        Event.stop(event);
        var clickelement = Event.element(event);
        var actTabnav = Event.findElement(event, "LI");
        var histroyid = App.getId(clickelement, "history-");
        $$('.chartselection').each(function(element){
            element.removeClassName('current');
        });
        clickelement.addClassName('current');
        console.log(histroyid);
        $$('.chart').each(function(element){
            element.hide();
        });
        $(histroyid).show();
    }
}

App.Scroller = {
    speed:5,
    // returns the Y position of the div
    gy: function (d) {
        gy = d.offsetTop;
        if (d.offsetParent) {
            while (d = d.offsetParent) {
                gy = gy + d.offsetTop;
            }
        }
        return gy;
    },
    // returns the current scroll position
    scrollTop: function (){
        var  body = $(document.body);
        var d = document.documentElement;
        if (body && body.scrollTop) {
            return body.scrollTop;
        }
        if (d && d.scrollTop) {
            return d.scrollTop;
        }
        if (window.pageYOffset) {
            return window.pageYOffset;
        }
        return 0;
    },
    smoothScrollTo: function (element) {
        clearInterval(App.Scroller.interval);
        App.Scroller.interval = setInterval('App.Scroller.scroll('+App.Scroller.gy(element)+')', 10);
    },
    // move the scroll bar to the particular offset.
    scroll: function(d){
        var i =  window.innerHeight || document.documentElement.clientHeight;
        var h =  $(document.body).scrollHeight;
        var a  = App.Scroller.scrollTop();
        if(d > a) {
            if(h - d > i) {
                a = a + Math.ceil((d-a) / App.Scroller.speed);
            }
            else {
                a = a + Math.ceil((d-a-(h-d)) / App.Scroller.speed);
            }
        }
        else {
            a = a + (d-a) / App.Scroller.speed;
        }
        window.scrollTo(0,a);
        if(a == d || App.Scroller.offsetTop == a) {
            clearInterval(App.Scroller.interval);
        }
        App.Scroller.offsetTop = a;
    }
}
 