if(null == console){ 
var console = { 
        log: function(){
            //do nothing
        }
    };
}

var Grid = {
    
    tables: {},
    
    initialize: function() {
        Grid.tables = new Hash();
        $$('table.grid_table tbody').each(function(t) {
            Grid.add_table(t);
        });
    },
    
    add_table: function(t){
        Grid.tables.set(t.identify(), new Hash());
        var rows = t.select('tr');
        rows.each(function(r){
            Grid.add_row(t,r);
        });
        if(t.hasClassName('optrows')){
            //TableKit.Rows.stripe_visible(t);
        }
    },
    
    add_row: function(t,r){
        //console.log("Grid.add_row START");
        Element.extend(t); 
        Element.extend(r);
        Grid.tables.get(t.identify()).set(r.identify(), { 
            over: Grid.higlight_on.bindAsEventListener(Grid),
            out:  Grid.higlight_off.bindAsEventListener(Grid),
            click: null });
        if(r.hasClassName('datarow')){
            Event.observe(r, 'mouseover', Grid.tables.get(t.identify()).get(r.identify()).over);
            Event.observe(r, 'mouseout', Grid.tables.get(t.identify()).get(r.identify()).out);
        }
        var tp = t.up('table.grid_table');
        Element.extend(tp);
        if(tp.hasClassName('selectable')){
            Grid.tables.get(t.identify()).get(r.identify()).click = Grid.toggle_selected.bindAsEventListener(Grid);
            Event.observe(r, 'click', Grid.tables.get(t.identify()).get(r.identify()).click);
        }
        if(tp.hasClassName('optrows')){
            Grid.tables.get(t.identify()).get(r.identify()).click = Grid.toggle_row_options.bindAsEventListener(Grid);
            Event.observe(r, 'click', Grid.tables.get(t.identify()).get(r.identify()).click);
        }
        //console.log("Grid.add_row END");
    },
    
    refresh: function() {
        $$('table.grid_table tbody').each(function(t) {
            if(Grid.tables.get(t.identify()) == null){
                Grid.add_table(t);
            }
        });
    },
    
    toggle_higlight: function(e) {
        var row = Event.findElement(e, 'tr');
        if(row != null){
            Element.extend(row);
            row.toggleClassName('highlight');
        }
    },
    
    higlight_on: function(e) {
        var row = Event.findElement(e, 'tr');
        if(row != null){
            Element.extend(row);
            if(!row.hasClassName('highlight')){ row.addClassName('highlight'); }
        }
    },
    
    higlight_off: function(e) {
        var row = Event.findElement(e, 'tr');
        if(row != null){
            Element.extend(row);
            row.removeClassName('highlight');
        }
    },
    
    toggle_selected: function(e) {
        var row = Event.findElement(e, 'tr');
        Element.extend(row);
        row.toggleClassName('selected');
        //if(!row.hasClassName('selected')){ row.addClassName('selected'); }
        row.siblings().each(function(r){
            Element.extend(r);
            r.removeClassName('selected');
        });
        if(row.hasClassName('selected') && row.hasClassName('highlighted')){ row.removeClassName('highlighted'); }
        var grid_form = row.up('form');
        if(grid_form != null){
            Element.extend(grid_form);
            var selection = grid_form.down('input.selection');
            if(row.hasClassName('selected')){ selection.value = row.identify(); }
            else{ selection.value = ''; }
        }
    },
    
    toggle_row_options: function(e){
        var row = Event.findElement(e, 'tr');
        if(null == row || row.hasClassName('rowopts')){ return; }
        Element.extend(row);
        var optrow = row.next('tr.rowopts');
        if(null != optrow){ 
            if(!optrow.visible()){
                row.addClassName('open');
                optrow.show();
                optrow.adjacent('tr').each(function(r){
                    if(r.hasClassName('rowopts') && r.visible()){ r.hide();}
                    else if(r.hasClassName('open') && r != row){ r.removeClassName('open'); }
                });
            }
            else{ optrow.hide(); row.removeClassName('open'); }
        }
    },
    
    reset_sorts: function(){
        var ths = $$('table.grid_table th');
        if(ths != null){ 
            ths.each(function(th){ 
                if(th.hasClassName('sortfirstasc')){ th.removeClassName('sortasc'); }
                if(th.hasClassName('sortfirstdesc')){ th.removeClassName('sortdesc'); }
            });
        }
    }
    
};
if(window.FastInit) {
	FastInit.addOnLoad(Grid.initialize);
} else {
    Event.observe(window, 'load', Grid.initialize);
}

var Page = {
    
    listeners: {},
    forms: {},
    pes: {},
    
    initialize: function() {
        Event.observe(document, 'click', Page.dispatch.bindAsEventListener(Page));
        if($('main_login_form') != null) {
           Form.focusFirstElement($('main_login_form'));
        }
        Page.listeners = new Hash();
        Page.forms = new Hash();
        Page.pes = new Hash();
        var pforms = $$('form');
        for(var i=0; i< pforms.length; i++){
            Page.forms.set(pforms[i].identify(), new FormHandler(pforms[i], {}));
        }
        var pups = $$('select.project_updater');
        for(var j=0; j < pups.length; j++){
            Event.observe(pups[j], 'change', Page.update_projects.bindAsEventListener(Page));
        } 
        var sc = $('sldshw_cnt');
        if(sc != null){
            var slds = sc.select('div.sldshw');
            for(var i=1; i <= slds.size(); i++){
                Prototype.preloadImages('/images/slideshow/' + i + '.jpg');
            }
            Page.slide_start(5);
        }
        Prototype.preloadImages('/images/throbber.gif');
    },
    
    dispatch: function(e) {
        var link = Event.findElement(e, 'a');
        if(link != null && link.rel != null && link.rel != '') {
            if(link.hasClassName('disabled')){ Event.stop(e); return }
            Try.these ( 
                function() { eval('Page.' + link.rel + '(e); Event.stop(e);'); }
                //Page.ignore(e) 
            );
        }
    },
    
    ignore: function(e) {
        // do nothing
    },
    
    refresh_forms : function() {
        Page.clear_forms();
        var forms = $$('form');
        forms.each(function(f){
            if(Page.forms.get(f.identify()) == null){
                Page.forms.set(f.identify(), new FormHandler(f.identify(), {}));
            }
        });
        //Page._log();
    },
    
    clear_forms : function() {
        if(Page.forms){
            Page.forms.each(function(pair){
                Page.forms.unset(pair.key);
            });
            Page.forms = new Hash();
        }
    },
    
    add_form : function(f) {
        if(f == null){ return; }
        if(Page.forms.get(f.identify()) == null){Page.forms.set(f.identify(), new FormHandler(f.identify(), {}));}
    },
    
    ajax_link: function(e) {
        var a = Event.element(e);
        if(a != null){
            Page.show_loader();
            var result = new Ajax.Request(a.href, {asynchronous:true, evalScripts:true, onSuccess:function(request){eval(request.responseText); Page.hide_loader();}, onFailure:function(request){Page.hide_loader();}});
            return false;
        }
    },
    
    ajax_form: function(e) {
        var a = Page._a(e);
        if(a == null){ return false; }
        if(a.hasClassName('disabled')){ return false; }
        var f = a.up('form');
        if(f != null){
            Page.show_loader();
            var fh = Page.forms.get(f.identify());
            if(fh == null){ 
                Page.forms.set(f.identify(), new FormHandler(f, {})); 
                fh = Page.forms.get(f.identify()); 
            }
            if(fh != null){ return fh.ajax_submit(e,a); }
            else{ Page.hide_loader(); }
        }
    },
    
    ajax_inline_form: function(e){
       var a = Page._a(e);
       if(a == null){ return false; }
       if(a.hasClassName('disabled')){ return false; }
       var inputs;
       var d = a.up('div.frminline');
       if(d != null){ inputs = d.select('input'); }
       var params = '';
       if(inputs != null){
           for(var i=0; i < inputs.size(); i++){ params += inputs[i].name + '=' + inputs[i].value; }
       }
       new Ajax.Request(a.href, {asynchronous:true, evalScripts:true, onComplete:function(request){eval(request.responseText);}, parameters:params});
    },
    
    submit_form: function(e) {
        var a = Page._a(e);
        if(a == null){ return false; }
        if(a.hasClassName('disabled')){ return false; }
        var f = a.up('form');
        if(f != null){ 
            var fh = Page.forms.get(f.identify());
            if(fh == null){ 
                Page.forms.set(f.identify(), new FormHandler(f, {})); 
                fh = Page.forms.get(f.identify()); 
            }
            if(fh != null){ return fh.reg_submit(e,a); }
        }
    },
    
    reset_form: function(e) {
        var a = Page._a(e);
        if(a == null){ return false; }
        if(a.hasClassName('disabled')){ return false; }
        var f = a.up('form');
        if(f != null){ f.reset(); }
    },
    
    show_loader: function(){
        var l = $('dash_loader');
        if(l != null){
            if(l.hasClassName('invisible')){l.removeClassName('invisible');}
        }
        document.body.style.cursor = 'wait';
    },
    
    hide_loader: function(){
        var l = $('dash_loader');
        if(l != null){
            if(!l.hasClassName('invisible')){l.addClassName('invisible');}
        }
        document.body.style.cursor = 'auto';
    },
    
    dtoggle: function(e){
        var a = Page._a(e);
        if(a != null){
            var c = a.up('div.dcont.cboth');
            if (c != null){
                var b = c.down('div.dbody');
                if(b != null){ b.toggle(); }
            }
            if(!a.hasClassName('dicon')){
                var h = a.up('div.dhead');
                if(h != null){
                  var i = h.down('a.dicon');
                  if(i != null) {
                      i.toggleClassName("dclose");
                      i.toggleClassName("dopen");                  
                  }
                }
            } else {
                a.toggleClassName("dclose");
                a.toggleClassName("dopen");
            }
        }
    },
    
    toggle_inline: function(e) {
        var a = Page._a(e);
        if(a != null){
            var idiv = a.adjacent('div.frminline');
            if(idiv != null){
                var fi = a.up('div.frminline');
                if(fi != null){ idiv = [fi]; }
            }
            if(idiv != null && idiv.length > 0){
                if(!idiv.first().visible()){ 
                    var result = new Ajax.Request(a.href, {asynchronous:true, evalScripts:true, onComplete:function(request){ idiv.first().update(request.responseText); }});
                    idiv.first().show();
                }
                else {
                    idiv.first().hide();
                    idiv.first().update('');
                }
            }
        }
        return false;
    },
    
    toggle_user_list: function(e) {
        var list = $('user_list');
        if(list == null){ return; }
        var f = list.up('form');
        if(f == null){ return; }
        list.toggle();
        if(list.visible()){ TableKit.Sortable.init(list.down('table.sortable')); Grid.refresh(); }
        var checkboxes = f.getInputs('checkbox');
        for(var i=0; i < checkboxes.length; i++) {
            if(list.visible()){
                if(Page.listeners.get(f.identify()) == null){ Page.listeners.set(f.identify(), {}); }
                Page.listeners.get(f.identify())[i] = Page.ul_toggle_item.bindAsEventListener(Page);
                Event.observe(checkboxes[i], 'click', Page.listeners.get(f.identify())[i]);
            }
            else {
                Event.stopObserving(checkboxes[i], 'click', Page.listeners.get(f.identify())[i]);
            }
        }
    },
    
    ul_select_all: function(e){
        var a = Page._a(e);
        if(a == null){ return; }
        var f = a.up('form');
        if(f != null){
            var checkboxes = f.getInputs('checkbox');
              for(var i=0; i < checkboxes.length; i++) {
                  checkboxes[i].checked = true;
                  var target = f.down('input#ul_target');
                  if(target){
                      if(target.value != ''){ target.value += ','; }
                      target.value += checkboxes[i].value;
                  //if($('message_recipients').value != ''){ $('message_recipients').value += ','; }
                  //$('message_recipients').value += checkboxes[i].value;
                  }
              }
        }
    },
    
    ul_select_none: function(e){
        var a = Page._a(e);
        if(a == null){ return; }
        var f = a.up('form');
        if(f != null){
            var checkboxes = f.getInputs('checkbox');
              for(var i=0; i < checkboxes.length; i++) {
                  checkboxes[i].checked = false;
                  var target = f.down('input#ul_target');
                  if(target){ target.value = ''; }
                  //$('message_recipients').value = '';
              }
        }
    },

    ul_toggle_item: function(e){
        var c = Page._a(e);
        if(c == null){ return; }
        var f = c.up('form');
        if(f == null) { return; }
        var target = f.down('input#ul_target');
        if(target){
            if(c.checked){
                if(target.value != ''){ target.value += ','; }
                target.value += c.value;
            }
            else if(target.value.include(c.value)){ 
                target.value = target.value.sub(c.value + ",", '');
                target.value = target.value.sub(c.value, '');
                if(target.value.endsWith(',')){ target.value = target.value.substring(0,target.value.length - 1); }
            }
        }
    },
    
    update_projects: function(e) {
        var s = Page._a(e);
        if(s == null){ return false; }
        var f = s.up('form');
        if(f == null){ return false; }
        var t = f.down('select.updater_target');
        if(t == null){ return false; }
        new Ajax.Request('/manager/domain_projects/' + s.value, {asynchronous:true, evalScripts:true, onComplete:function(request){t.update(request.responseText); Page._highlight(t); }});
    },
    
    slide_start: function(delay){
        //console.log('slide_start');
        Page.pes.set('sldshw', new PeriodicalExecuter(Page.slide_next, delay));
    },
    
    slide: function(e) {
        var a = Page._a(e);
        if(a == null){ return false; }
        var s = Page._hash(a.hash);
        if(s == null){ return false; }
        Page.pes.get('sldshw').stop();
        Page.slide_show(s, false);
        Page.slide_start(8);
        Event.stop(e);
    },
    
    slide_next: function(){
        //console.log('slide_next');
        var sc = $('sldshw_cnt');
        if(sc){
            var slds = sc.select('div.sldshw');
            var vs = 0;
            slds.each(function(s){
                if(s.visible()){ vs = slds.indexOf(s); }
            });
            Page.slide_show(((vs+1) % slds.size()) + 1, true);
        }
    },
    
    slide_show: function(num,effect){
        //console.log('slide_show ',num,effect);
        if(effect == null){ effect = true; }
        var d = $('sldshw' + num);
        if(d == null || d.visible()){ return false; }
        d.siblings().each(function(o){
          if(o.visible()){ 
             //new Effect.Fade(o, {duration: 2.0});
             if(effect){ 
                 //new Effect.SwitchOff(o); 
                 new Effect.Fade(o, {duration: 2.5});
             }
             else{ o.hide(); }
            
          }
        });
        if(effect){ new Effect.Appear(d, {duration: 3.5}); }
        else{ d.show(); }
    },
    
    show_user_type: function(r){
        //console.log("Page.show_user_type START");
        if(null == r){ return false; }
        if(r.value == 'new'){ $('add_folder_user_new').show(); $('add_folder_user_existing').hide(); }
        if(r.value == 'existing'){ $('add_folder_user_existing').show(); $('add_folder_user_new').hide(); }
        //console.log("Page.show_user_type END");
    },
    
    _highlight: function(element) {
        if(element == null){ return; }  
        new Effect.Highlight(element, {startcolor:'#D5FFAA', endcolor:'#ffffff', duration: 3} );
    },
    
    _a: function(e){
        var a = Event.element(e);
        if(a != null){
            return Element.extend(a);
        }
        return null;
    },
    
    _hash: function(str){
        if(str == null || str.blank() || !str.include('#')){ return str; }
        var hash = str.substr(str.lastIndexOf('#') + 1);
        return hash;
    },
    
    _log : function(){
        //console.log("Forms: ", Page.forms.inspect(), "\nListeners: ", Page.listeners.inspect());
    }
};
if(window.FastInit) {
	FastInit.addOnLoad(Page.initialize);
} else {
    Event.observe(window, 'load', Page.initialize);
}

// form bulk checkbox toggler
var isChecked = false; 
function checkUncheck(form_name, range_start, range_end)
{
    aForm = $(form_name);
    if(null ===range_end){ last_index = aForm.elements.length - 1; }
    else{ last_index = aForm.elements.length - range_end - 1; }
    if (isChecked){ isChecked = false; }
    else{ isChecked = true; }
    for(var i=range_start; i<=last_index; i++){
        aForm.elements[i].checked = isChecked;
    }
}

var FormHandler = Class.create();

FormHandler.prototype = {
    
    initialize : function(form, options) {
        if(form == null){ return; }
        this.form = $(form);
        this.button = this.form.down('a.img_submit.default');
        this.listeners = new Hash({submit: [], click: [], keypress: []});
        this.hooks = new Hash({pre_submit: [], post_submit: []});
        var class_names = $w(this.form.className);
        for(var i=0; i<class_names.length; i++){
            var class_name = class_names[i];
            switch(class_name){
                case 'ffirst':
                    Form.focusFirstElement(this.form);
                    break;
                case 'vldtsbmt':
                    //console.log("add: vldtsbmt");
                    var j = this.listeners.get('submit').push(this.submit_validate.bindAsEventListener(this));
                    Event.observe(this.form,'submit',this.listeners.get('submit')[j-1]);
                    this.hooks.get('pre_submit').push(this.validate);
                    break;
                case 'vldtchng':
                    //console.log("add: vldtchng");
                    var j = this.listeners.get('keypress').push(this.change_validate.bindAsEventListener(this));
                    Event.observe(this.form,'keypress',this.listeners.get('keypress')[j-1]);
                    var k = this.listeners.get('click').push(this.change_validate.bindAsEventListener(this));
                    Event.observe(this.form,'click',this.listeners.get('click')[k-1]);
                    break;
                case 'retsbmt':
                    //console.log("add: retsbmt");
                    var j = this.listeners.get('keypress').push(this.ret_submit.bindAsEventListener(this));
                    Event.observe(this.form,'keypress',this.listeners.get('keypress')[j-1]);
                    break;
                case 'ajretsbmt':
                    //console.log("add: ajretsbmt");
                    var j = this.listeners.get('keypress').push(this.ret_ajsubmit.bindAsEventListener(this));
                    Event.observe(this.form,'keypress',this.listeners.get('keypress')[j-1]);
                    break;
                    
            }
        }
        var self = this;
        this.form.getInputs('checkbox', 'toggle').each(function(i){
            Event.observe(i,'click',self.check_uncheck);
        });
        //this._log();
    },
    
    check_uncheck : function(e){
        var form = e.element().up('form');
        var checkboxes = form.getInputs('checkbox');
        for(var i=0; i < checkboxes.length; i++) {
            if($(checkboxes[i]) == e.element() || $(checkboxes[i]).hasClassName('nocheck')) continue;
            checkboxes[i].checked = !checkboxes[i].checked;
        }
        return true;
    },
   
    is_key: function(e,key){
        if(!e){ return false; }
        var code;
        if(e.keyCode){ code = e.keyCode; }
        else{ code = e.which; }
        if(code == key){ return true; }
        return false;
    },
   
    ret_submit: function(e){
        if(this.is_key(e, 13)){
            var a = Page._a(e);
            var f = a.up('form');
            if(f != null){
                var tas = $$('textarea');
                for(var t = 0; t < tas.length; t++){
                    if(tas[t].identify() == a.identify())
                    {
                        Event.stop(e);
                        return false;
                    }
                }
            }
            this.do_submit(e);
        }
    },
    
    ret_ajsubmit : function(e){
        //console.log('ret_ajsubmit');
        if(this.is_key(e, 13)){
            var a = Page._a(e);
            var f = a.up('form');
            if(f != null){
                var tas = $$('textarea');
                for(var t = 0; t < tas.length; t++){
                    if(tas[t].identify() == a.identify())
                    {
                        Page.hide_loader();
                        return;
                    }
                }
            }
            Page.show_loader();
            for(var k=0; k<this.hooks.get('pre_submit').length; k++){
                var hook = this.hooks.get('pre_submit')[k];
                if(!hook.call(this,e)){
                    Event.stop(e);
                    Page.hide_loader();
                    return false;
                }
            }
            var params = this._params(this.form.down('a.img_submit.default'));
            Event.stop(e);
            return this.do_ajax_submit(params);
        }
    },
    
    ajax_submit : function(e,a){
        if(e == null && a == null){ return false; }
        if(a == null){ a = Page._a(e); }
        for(var k=0; k<this.hooks.get('pre_submit').length; k++){
            var hook = this.hooks.get('pre_submit')[k];
            if(!hook.call(this,e)){
                return false;
            }
        }
        var params = this._params(a);
        return this.do_ajax_submit(params);
    },
    
    reg_submit : function(e,a){
        this.do_submit(e);
    },
   
    do_submit : function(e){
        this.form.submit();
    },
   
    do_ajax_submit : function(params){
        if(params == null){ params = Form.serialize(this.form); }
        var result = new Ajax.Request(this.form.action, {asynchronous:true, evalScripts:true, onSuccess:function(request){eval(request.responseText); Page.hide_loader();}, onFailure:function(request){Page.hide_loader();}, parameters:params});
        return false;
    },
   
    submit_validate : function(e) {
        if(!this.validate()){ Event.stop(e); }
    },
   
    change_validate : function(e) {
        if(this.validate()){
            if(this.button.hasClassName('disabled')){
                this.button.removeClassName('disabled');
                //this.button.addClassName('validated');
                //this.form.down('img.valid').removeClassName('invisible');
                //if(this.form.hasClassName('ajax'))
                //    this.button.rel = 'ajax_form';
                //else
                //    this.button.rel = 'submit-form';
            }
        } else {
            if(!this.button.hasClassName('disabled')){
                //this.button.removeClassName('validated');
                this.button.addClassName('disabled');
                //this.form.down('img.valid').addClassName('invisible');
                //this.button.rel = '';
            }
        }
    },
   
    validate : function() {
       var elements = this.form.getElements();
       for(var i=0; i<elements.length; i++){
           if(elements[i].hasClassName("required")){
               if(elements[i].value == ''){ return false; }
               var classes = $w(elements[i].className);
               for(var c=0; c<classes.length; c++){
                   switch(classes[c]) {
                       case 'validate_email': if(!this.validate_email(elements[i])){ return false; } break;
                       case 'validate_checkbox': if(!this.validate_checkbox(elements[i])){ return false; } break;
                       //case 'validate_select': if(!this.validate_select(elements[i])){ return false; }
                   }
               }
           }
       }
       return true;
    },
   
    validate_email : function(email) {
        return /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(email.value);
    },
   
    validate_checkbox : function(checkbox) {
        return checkbox.checked;
    },
   
    validate_select : function(select) {
        return(select.selected.value == '');
    },
   
    _params : function(a){
        var params = Form.serialize(this.form);
        if(a != null){
            Element.extend(a);
            if(a.hasClassName('disabled')){ return false; }
            if(a.href.toString().include('?')){
                var qp = a.href.toString().toQueryParams();
                Object.keys(qp).each(function(k){
                    params += '&' + k + "=" + qp[k];
                });
            }
        }
        return params;
    },
    _log : function(){
        console.log("Form: ",this.form.identify(),"\nListeners: ",this.listeners.inspect(),"\nHooks:",this.hooks.inspect());
    }
};

function notifyAssetAdd(project_slug,callback_url) {
    console.log("notifyAssetAdd");
    console.log("project_slug: ", project_slug);
    console.log("callback_url: ", callback_url);
    exchange.view.view_pane.refresh_content(callback_url + '/' + project_slug);
	//alert('added asset, projectSlug : ' + projectSlug + ' domainSlug: ' + domainSlug);
}
	

Prototype.preloadImages = function(){
	
	for(var i=0, images=[]; src=arguments[i]; i++){
		images.push(new Image());
		images.last().src = src;
	}
};