//var ATVE_APPLET = "archaeopteryx_applets.jar";

var bubble;
var XHR = new XHRConnection();
var cursor_padding_x = 8;
var cursor_padding_y = 5;
var ie = document.all;
var chart_json_array = Array();

var tooltips = new Array();
tooltips['ipr'] = new Array();
tooltips['kegg'] = new Array();
tooltips['swiss'] = new Array();
tooltips['family'] = new Array();
tooltips['GO'] = new Array();
tooltips['pubmed'] = new Array();

if(!ie){
    document.captureEvents(Event.MOUSEMOVE);
}
document.onmousemove = bubble_get_mouse;

function GO_tooltip(go_code) {
    see_bubble( tooltips['GO'][go_code] );
}

function ipr_tooltip(ipr) {
    see_bubble( tooltips['ipr'][ipr] );
}

function kegg_tooltip(kegg) {
    see_bubble( tooltips['kegg'][kegg] );
}

function swiss_tooltip(swiss) {
    see_bubble( tooltips['swiss'][swiss] );
}

function family_tooltip(family_id) {
    see_bubble( tooltips['family'][family_id] );
}

function pubmed_tooltip(pubmed_id) {
    see_bubble( tooltips['pubmed'][pubmed_id] );
}

function make_all_tooltips() {
    var tooltip_types = [ "family", "ipr", "kegg", "swiss", "GO", "pubmed" ];
    tooltip_types.forEach(make_tooltips_for_type);
}

var close_tooltip = function() { kill_bubble() };

function make_tooltips_for_type( tooltip_type ) {
    var css = 'span.'+tooltip_type+'_tip';
    $$(css).each(function(s) {
        var open_tooltip_code = tooltip_type+"_tooltip('"+s.id+"')";
        var open_tooltip = function() { eval( open_tooltip_code ) };
        s.observe('mouseout', close_tooltip );
        s.observe('mouseover', open_tooltip );
    });
}

function bubble_get_mouse(e){
    if(ie){
        x = event.x + document.documentElement.scrollLeft;
        y = event.y + document.documentElement.scrollTop;
    }else{
        x = e.pageX;
        y = e.pageY;
    }
    bubble = document.getElementById("popup_desc");
    if(bubble) {
        bubble.style.left = x + cursor_padding_x + "px";
        bubble.style.top = y + cursor_padding_y + "px";
    }
}

function see_bubble (text) {
    if (text.length == 0) {
        return true;
    }
    bubble.innerHTML = text;
    bubble.style.visibility = "visible";
    bubble.style.display = "block";

    return 1;
}

function kill_bubble(){
    XHR.abort();
    bubble.style.visibility = "hidden";
    bubble.style.display = "none";
    bubble.innerHTML = "";

    return 1;
}


function show_loading(target) {
    return function() { $(target).innerHTML='<img src="'+java_url+'/ajax-loader.gif" /><br />Loading...'; }
};


function graph(url)
{
    $('graphi').innerHTML='<div style="min-width:50px;min-height:50px;background-repeat:no-repeat;background-image:url('+img_url+'/ajax-loader.gif);"><img alt="" title="" src="'+url+'" /></div>';
}



function OnClickInput(event)
{
   var element = null;
   var familyname    = document.getElementById('family_name');

    if (window.event) // IE
    {
        element = window.event.srcElement;
    }
    else // W3C
    {
        element = this;
        // check if event was fired by the window
        if (window == element)
        {
            element = event.target;
        }
    }
    familyname.value = element.value;
}

function Email(e) {
    this.emailAddr=e;
    this.message="";
    this.valid=false;
}

function validate() {
    if (this.emailAddr == null || this.emailAddr.length == 0 ||
    this.emailAddr.indexOf(".") == -1 ||
    this.emailAddr.indexOf("@") == -1 ||
    this.emailAddr.indexOf(" ") != -1){
    this.message="Make sure the email address does " +
    "not contain any spaces "+
    "and is otherwise valid (e.g., contains the 'commercial at' @ sign).";
        this.valid=false;
        return;
    }
    regex=/(^\w{2,}\.?\w{2,})@/;
    _match = regex.exec(this.emailAddr);
    if ( _match){
        user=RegExp.$1;
    } else {
       this.message="Make sure the user name is more than two characters, "+
            "does not begin or end with a period (.), or is not otherwise "+
            "invalid!";
        this.valid=false;
        return;
    }
    regex=/@(\[\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}\])$/;
    _match = regex.exec(this.emailAddr);
    if( _match){
        domain=RegExp.$1;
        this.valid=true;
    } else {
        regex=/@(\w{2,}\.(\w{2,}\.)?[a-zA-Z]{2,3})$/;
        _match = regex.exec(this.emailAddr);
        if( _match){
            domain=RegExp.$1;
        } else {
            this.message="The domain portion of the email had less than 2 chars "+
                         "or was otherwise invalid!";
            this.valid=false;
            return;
        }
    }
    this.valid=true;
}

Email.prototype.validate=validate;

function eMsg(msg,sColor,divid){
    var div = document.getElementById(divid);
    div.style.color=sColor;
    div.style.fontSize="0.9em";
    if(div.hasChildNodes(  )){
        div.removeChild(div.firstChild);
    }
    div.appendChild(document.createTextNode(msg));
}
function checkAddress(val){
    var eml = new Email(val);
    var url;
    eml.validate(  );
    if (! eml.valid) {eMsg(eml.message,"red","emailMessage")};
    if(eml.valid)
    {
      eMsg(eml.message,"red","emailMessage")
        url= $url_cgi + $url_ajax + ".state=Check & email=" + encodeURIComponent(val);
        httpRequest("GET",url,true,handleResponse);
    }
}

function handleResponse() {
    var usedTag, answer,xmlReturnVal;
    if(request.readyState == 4){
        if(request.status == 200){
            //implement Document object in DOM
            answer = request.responseText;
            if(answer==true){
                eMsg("This mail is not available. Kindly try again.","red","emailMessage");
            }
            else {
                eMsg(eml.message,"red","emailMessage");
            }
        } else {
            alert("A problem occurred with communicating between the XMLHttpRequest object and the server program.");
        }
    }
}

function checkField ( ) {
    var check = 0;
    var username = $("awadForm")['username'].value;
    if(!username){
        eMsg("field username is empty","red","usernameMessage");
        check=1;
    }
    else{
        eMsg("","red","usernameMessage");
    }
    var password = $("awadForm")['password'].value;
    if(!password){
        eMsg("field password is empty","red","passwordMessage");
        check=1;
    }
    else{
        eMsg("","red","passwordMessage");}
    if(document.getElementsByName('register')[0].style.display ==''){
        var mail = $("awadForm")['email'].value;
        if(!mail){
            eMsg("field mail is empty","red","emailMessage");
            check=1;
        }
        checkAddress(mail);
    }
    var toto = document.getElementById("emailMessage");
    if(toto.innerHTML.length !=0) { check=1; }
    //alert(check);
    if(check==1){return false;}
    else {return true;}
}

function display_sequence_table ( species, target, family_id ) {

    var info = $('sequence_table_source').childElements();

    var check_in = "";
    for ( var i=0 ; i<info.length ; i++ ) {
        if ( info[i].checked ) {
            check_in = check_in + info[i].value + "_";
        }
    }

    var only_filtered = $('only_filtered');
    if ( only_filtered ) only_filtered = only_filtered.value;

    var url = base_url+"/table.pl?fam="+family_id + "&species="+species + "&info="+check_in;
    if ( only_filtered ) url += "&only_filtered="+only_filtered;

    simple_ajax_get( target, url )

    return 1;
}

var exception_alert = function(req,exception) {
    dsException = "";
    dsException += " AJAX - EXCEPTION";
    dsException += "\n--------\n";
    dsException += "\n";
    dsException += "Request Information:";
    dsException += "\n--------\n";
    dsException += "req.transport.responseText: \n";
    dsException += req.transport.responseText.substr(0,50);
    dsException += "\n\n";
    dsException += "Exception Information:";
    dsException += "\n--------\n";
    dsException += "exception.name: ";
    dsException += exception.name
    dsException += "\n";
    dsException += "exception.number: ";
    dsException += exception.number;
    dsException += "\n";
    dsException += "exception.description: ";
    dsException += exception.description;
    alert(dsException);
}

function simple_ajax_get( target, url ) {
    new Ajax.Updater(
        $(target),
        url,
        {
            method: "get",
            evalScripts: true,
            onLoading: show_loading(target),
            onComplete: function() { stripe_tables(); make_all_tooltips(); sortables_init(); },
            onFailure: function (oXHR, oJson) { $(target).innerHTML = "An error occurred: "+oXHR.status; },
            onException: exception_alert
        }
    );
}


function insert_applet ( applet_id, code, applet_file, codebase, url_of_tree_to_load, config_file, sequence, rel_type ) {
    var applet_div = $(applet_id);
    applet_div.innerHTML = '<applet archive="'+applet_file+'" code="'+code+'" codebase="'+codebase+'" width="700" height="600" alt="ArchaeopteryxE is not working on your system (requires at least Sun Java 1.5)!" ><param name="url_of_tree_to_load" value="'+url_of_tree_to_load+'"><param name="config_file" value="'+config_file+'"><param name="homology_type_analysis_query_sequence" value="'+sequence+'"><param name="homology_type_analysis_initial_relation_type" value="'+rel_type+'"></applet>';
}

function insert_atve_applet ( data_file, applet_id, sequence, rel_type ) {
    var applet_file = ATVE_APPLET;
    var config_file = "_aptx_configuration_file";
    var config_url     = java_url + "/" + config_file;
    var applet_code = 'org.forester.archaeopteryx.ArchaeopteryxE.class';

    insert_applet( applet_id, applet_code, applet_file, java_url, data_file, config_url, sequence, rel_type );
}

function insert_sequence_atve_applet ( output_file, target_id, sequence, input_file, rel_type  ) {
    if ( !input_file ) input_file = '';
    if ( !sequence ) sequence = '';
    if ( !rel_type ) rel_type = '';

    new Ajax.Request(
        base_url + "/sequence_atv_ajax.cgi?sequence="+sequence+"&input_file="+input_file+"&output_file="+output_file,
        {
            method: "get",
            evalScripts: true,
            onLoading: show_loading( target_id ),
            onSuccess: function( transport ) {
                if ( transport.responseText != 'success' ) {
                    $(target_id).innerHTML = "An error occurred.";
                }
                insert_atve_applet ( tree_url+'/'+output_file, target_id, sequence, rel_type );
            },
            onFailure: function (oXHR, oJson) { $(target_id).innerHTML = "An error occurred: "+oXHR.status+"<br />"+oXHR.responseText; },
            onException: exception_alert
        }
    );
}



function load_chart ( target, chart_id, height, width ) {
    swfobject.embedSWF (
        img_url+"/open-flash-chart.swf",
        target, height, width,
        "10.0.0", img_url+"/expressInstall.swf",
        {"get-data":"get_chart", "id":chart_id }
    );
}


function get_chart( chart_id ) {
    return chart_json_array[chart_id];
}

function load_family_chart ( chart_id ) {
    load_chart ( "div_"+chart_id, chart_id, "600", "400" );

    if ( chart_id == 'chart_absolute' ) return false;

    var div = $("div_"+chart_id+"_wrap");
    div.hide();

    return false;
}

function toggle_absolute_relative () {
    var elems = $( "div_chart_absolute_wrap", "div_chart_relative_wrap", "fam_comp_abs_title" );

    elems.invoke( 'toggle' );

    return false;
}

function load_go_chart ( chart_id, bar_count ) {
    var chart_width = 80 + ( 32 * bar_count );
    if ( chart_width < 300 ) chart_width = 300;

    load_chart ( "div_chart", chart_id, chart_width, "400" );
    setTimeout ( "window.location.hash = 'div_chart';", 200 );
}

function random_color () {
    var rint = Math.round(0xffffff * Math.random());
    return ('#0' + rint.toString(16)).replace(/^#0([0-9a-f]{6})$/i, '#$1');
}

function stripe_tables() {
    $$('table.stripe tbody > tr:nth-child(odd)').each(function(s) {
        s.addClassName('tr_1');
    });
    $$('table.stripe tbody > tr:nth-child(even)').each(function(s) {
        s.addClassName('tr_2');
    });

    $$('table.sortable tbody > tr:nth-child(odd)').each(function(s) {
        s.addClassName('tr_1');
    });
    $$('table.sortable tbody > tr:nth-child(even)').each(function(s) {
        s.addClassName('tr_2');
    });

    $$('table.null tbody > tr:nth-child(odd)').each(function(s) {
        s.removeClassName('tr_1');
    });
    $$('table.null tbody > tr:nth-child(even)').each(function(s) {
        s.removeClassName('tr_2');
    });
}



function register_search_autocomplete( id ) {
    var type = ( $(id).getValue().split(' ') )[0];
    new Autocomplete(
        'searchbox',
        {
            serviceUrl : base_url+'/autocomplete.cgi',
            queryType  : type,
            width      : '12em'
        }
    );
}

function register_ac_changer_for_search() {
    Event.observe( $('search_type'), 'change', function() { register_search_autocomplete('search_type') } );
}

function expand_text ( node, text ) {
    node.parentNode.innerHTML=text;
    return false;
}

function login_to_register_form_change () {
    var tr=$A(document.getElementsByName('register'));
    tr.each(Element.toggle);
    document.getElementById('registerButton').style.display = 'none';
    document.getElementById('registerBut').style.display = 'none';
    document.getElementById('registry').style.display = '';
    document.getElementById('log').style.display = 'none';
    document.getElementById('toto').style.display = 'none';
}

function is_form ( elem ) {
    return ( elem.tagName.toUpperCase() == "FORM" );
}

function get_form_object ( reference ) {
    if ( !reference ) return reference;

    reference = $(reference);

    var ancestor_list = reference.ancestors();
    ancestor_list.unshift(reference);

    var form_object = ancestor_list.find( is_form );

    return form_object;
}

function postform ( form, target ) {

    form = get_form_object( form );

    var target_container = $(target);

    var form_data = form.serialize(true);

    var url = form.action;

    new Ajax.Updater(
        target_container,
        url,
        {
            evalScripts: true,
            parameters: form_data,
            onLoading: show_loading(target),
            onComplete: function() { stripe_tables(); make_all_tooltips(); sortables_init(); },
            onFailure: function (oXHR, oJson) { $(target).innerHTML = "An error occurred: "+oXHR.status; },
            onException: exception_alert
        }
    );
}

function post_phylo_search ( form, target, dump ) {

    form = get_form_object( form );

    var species = form.species;
    species = $(species);

    var children = species.childElements();
    children.each( select_option );

    if( !target && dump ) {
        var dump_el = form.dump;
        dump_el.setValue( dump );
        form.submit();
        dump_el.setValue( '' );
    }
    else {
        postform ( form, target );
    }

    children.each( de_select_option );

    return;
}

function post_protein_coding ( form_base, url_cgi, family_id ) {

    var target = "prot_coding_seq_result";
    var sp= form_base.form.species;
    var check_sp="";
    for (var i=0; i<sp.length;i++) {
        if (sp[i].checked) {
            check_sp=check_sp+sp[i].value+"_";
        }
    }

    var info = form_base.form.info;
    var check_in="";
    for (var i=0; i<info.length;i++) {
        if (info[i].checked) {
            check_in=check_in+info[i].value+"_";
        }
    }

    var only_filtered = form_base.form.only_filtered.value;

    var url = url_cgi + "/table.pl?fam="+family_id + "&species="+check_sp + "&info="+check_in + "&only_filtered="+only_filtered;

    simple_ajax_get( target, url );

    return 1;
}

function select_option ( option ) {
    option.selected = true;
}

function de_select_option ( option ) {
    option.selected = false;
}

function disable_selected_species ( form ) {

    form = get_form_object( form );

    source = form.species;
    target = form.disabled_species;

    move_selected_children ( source, target );

    return;
}

function enable_selected_species ( form ) {

    form = get_form_object( form );

    source = form.disabled_species;
    target = form.species;

    move_selected_children ( source, target );

    return;
}

function move_selected_children ( element, target ) {
    var children = $(source).childElements();

    children.each(
        function ( element ) {
            if ( !element.selected ) return;
            $(target).appendChild( $(element) );
            element.selected = false;
        }
    );

    return;
}



function move_right() {
    $('scroll_clipper').scrollLeft += 50;
}

function move_left() {
    $('scroll_clipper').scrollLeft -= 50;
}

function move_right_limit() {
    $('scroll_clipper').scrollLeft += 999999;
}

function move_left_limit() {
    $('scroll_clipper').scrollLeft = 0;
}

function addtext ( one, two ) {
    var text = one + "\n" + two;
    $('blast_search_seq').value = text;
    return;
}

function display_gviewer_flash ( button, family_id, target ) {

    var sp = button.form.organism;
    if( typeof sp.length == "undefined" ) sp = new Array(sp);

    var check_sp = "";
    for (var i=0; i<sp.length;i++) {
        if ( !sp[i].checked ) continue;

        check_sp += sp[i].value+"_";
    }

    if ( !check_sp ) return alert("No species selected. At least one species must be selected.");

    var url = base_url+"/gviewer.pl?family="+family_id+"&species="+check_sp;

    simple_ajax_get( target, url )

    return 1;
}

