var loaders;
var active_loader;
var content;
var fade_time;
var browser = navigator.appName;
var isIE = (browser == "Microsoft Internet Explorer");

if (isIE) {
    document.createElement('header');
    document.createElement('section');
    document.createElement('footer');
    document.createElement('nav');
}

function rs_ajax_init ()
{
    loaders = new Array();
    content = new Array();
    active_loader = null;
    fade_time = 400;
    
    var fields = getElementsByClassName('autofield');
    if (fields) {
        var i,field;
        for (i = 0; i < fields.length; i++) {
            field = fields[i];
            field.onfocus = rs_FocusField;
            field.onblur = rs_BlurField;
        }
    }
}

function rs_loadcontent (path,query,element)
{
    var mhr;
    if (window.XMLHttpRequest) {
        mhr = new XMLHttpRequest();
    } if (window.ActiveXObject) {
        try {
            mhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
            alert('AJAX Error');
        }
    }
    
    var loader = new Array();
    loader[0] = mhr;
    loader[1] = element;
    loader[2] = query;
    
    if (mhr) {
        //opacity(loader[1].id,100,0,500);
        //loader[1].innerHTML = '<div style="background-color: #FFFFFF; text-align: center; padding: 5px;"><img src="/gfx/loader.gif" width="32" height="32" alt="" /></div>';
        loader[0].open('POST',path,true);
        loader[0].onreadystatechange = rs_loadcontent_complete;
        loader[0].setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        loader[0].setRequestHeader('Cache-Control','no-cache');
        rs_queueloader(loader);
    } else {
        loader[1].innerHTML = 'Sorry, your browser does not support AJAX';
    }
}

function rs_queueloader (loader)
{
    loaders.push(loader);
    if (active_loader == null) {
        rs_runnextloader();
    }
}

function rs_runnextloader()
{
    if (loaders.length > 0) {
        active_loader = loaders.shift();
        active_loader[0].send(active_loader[2]);
    }
}

function rs_loadcontent_complete ()
{
    var loader = active_loader;
    if (!loader) {
        return;
    }
    var mhr = loader[0];
    var element = loader[1];
    var response;
    var element_out = element.id + '_fadeout';
    var element_in = element.id + '_fadein';
    var content = '';
    var content_width = 600;
    if (mhr.readyState == 4) {
        if (mhr.status == 200) {
            response = eval("(" + mhr.responseText + ")");
            if (!response) {
                content = 'Sorry, there was a parsing error';
            } else {
                content = response.content;
                content_width = response.width;
            }
        } else if (mhr.status == 404) {
            content = 'Sorry, the content was not found';
        } else {
            content = 'Sorry, there was an error loading the CGI: ' + mhr.statusText;
        }
        
        // create content divs
        element.innerHTML = '<div id="' + element_in + '" style="visibility: hidden; position: absolute; min-width: ' + content_width + 'px; max-width: ' + content_width + 'px; width: ' + content_width + 'px; overflow: visible;"></div><div id="' + element_out + '" style="overflow: hidden;">' + element.innerHTML + '</div>';
        var element_fadein = document.getElementById(element_in);
        var element_fadeout = document.getElementById(element_out);
        
        if ((!element_fadein) || (!element_fadeout)) {
            return;
        }
        
        element_fadein.innerHTML = content;
        
        // get heights of current view and new view
        var current_height = element_fadeout.offsetHeight;
        var new_height = element_fadein.offsetHeight;
        
        element_fadein.style.display = "none";
        element_fadein.style.visibility = "visible";
        
        var resize_delay = 0;
        var switch_delay = 0;
        if (current_height == new_height) {
            resize_delay = 0;
            switch_delay = 0;
        } else if (new_height > current_height) {
            resize_delay = 0;
            switch_delay = fade_time;
        } else {
            resize_delay = fade_time;
            switch_delay = 0;
        }
        var total_time = resize_delay + switch_delay + fade_time;
        
        // set switch changes
        setTimeout("opacity('" + element_out + "',100,0," + fade_time + ")",switch_delay);
        setTimeout("opacity('" + element_in + "',0,100," + fade_time + ")",switch_delay);
        setTimeout("document.getElementById('" + element_in + "').style.display = 'block'",50 + switch_delay);
        
        // set resize changes
        if (current_height != new_height) {
            setTimeout("changeHeight('" + element_out + "'," + new_height + "," + fade_time + ")",resize_delay);
        }
        
        // run on_load action
        if (response) {
            if (response.on_load != "") {
                eval(response.on_load);
            }
        }
        
        // reset content
        setTimeout("document.getElementById('" + element.id + "').innerHTML = document.getElementById('" + element_in + "').innerHTML",total_time + 100);
        
        active_loader = null;
        rs_runnextloader();
    }
}

function addslashes(str) {
    str=str.replace(/\'/g,'\\\'');
    str=str.replace(/\"/g,'\\"');
    str=str.replace(/\\/g,'\\\\');
    str=str.replace(/\0/g,'\\0');
    return str;
}

function rs_relayform (destination,form,element)
{
    // works very similarly to rs_loadcontent - in fact, we'll use that function!
    // but rather than taking a raw query input, we take a form element and build
    // the query automatically
    
    var formElements = form.elements;
    var queries = Array();
    var ele;
    var i;
    var v;
    var regex = new RegExp("\\+","g");
    for (i = 0; i < form.length; i++) {
        ele = form.elements[i];
        if (ele.name != "") {
            ele.defaultValue = ele.value;
            v = escape(ele.value);
            v = v.replace(regex,"%2B");
            queries.push(ele.name + "=" + v);
        }
    }
    rs_loadcontent(destination,queries.join("&"),element);
}

function rs_showblock (id)
{
    var element = document.getElementById(id);
    if (!element) {
        alert('Cannot find element');
        return;
    }
    element.style.display = 'block';
}

function opacity(id, opacStart, opacEnd, millisec)
{ 
    // make sure the id element exists
    var element = document.getElementById(id);
    if (!element) {
        return;
    }
    
    //speed for each frame 
    var speed = Math.round(millisec / 100); 
    var timer = 0; 

    //determine the direction for the blending, if start and end are the same nothing happens 
    if(opacStart > opacEnd) { 
        for(i = opacStart; i >= opacEnd; i--) {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
            timer++; 
        } 
    } else if(opacStart < opacEnd) { 
        for(i = opacStart; i <= opacEnd; i++) { 
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
            timer++; 
        } 
    } 
}

function changeHeight (id,new_height,millisec)
{
    var millisecPerFrame = 4;
    var frames = Math.round(millisec / millisecPerFrame);
    
    var object = document.getElementById(id);
    if (!object) {
        return;
    }
    var start = object.offsetHeight;
    var diff = new_height - start;
    
    if (diff == 0) {
        return;
    }
    
    var i;
    var frameHeight = 0;
    for (i = 0; i < frames; i++) {
        //frameHeight = start + ((diff / frames) * i);
        frameHeight = getEaseValue(i * millisecPerFrame,start,diff,millisec);
        setTimeout("document.getElementById('" + id + "').style.height = '" + frameHeight + "px'",i * millisecPerFrame);
        setTimeout("document.getElementById('" + id + "').style.minheight = '" + frameHeight + "px'",i * millisecPerFrame);
        setTimeout("document.getElementById('" + id + "').style.maxheight = '" + frameHeight + "px'",i * millisecPerFrame);
    }
    setTimeout("document.getElementById('" + id + "').style.height = '" + new_height + "px'",millisec);
    setTimeout("document.getElementById('" + id + "').style.minheight = '" + new_height + "px'",millisec);
    setTimeout("document.getElementById('" + id + "').style.maxheight = '" + new_height + "px'",millisec);
}

function changePosition (id,start_value,end_value,attribute,millisec)
{
    if (start_value == end_value) {
        return;
    }
    
    var millisecPerFrame = 4;
    var frames = Math.round(millisec / millisecPerFrame);
    
    var object = document.getElementById(id);
    if (!object) {
        return;
    }
    var diff = end_value - start_value;
    var i;
    var frameValue = 0;
    for (i = 0; i < frames; i++) {
        frameValue = getEaseValue(i * millisecPerFrame,start_value,diff,millisec);
        //alert(id + ' frame value ' + frameValue);
        setTimeout("document.getElementById('" + id + "').style." + attribute + " = '" + frameValue + "px'",i * millisecPerFrame);
    }
    setTimeout("document.getElementById('" + id + "').style." + attribute + " = '" + end_value + "px'",millisec);
}

function getEaseValue (elapsed, startValue, changeInValue, duration)
{
    elapsed = (elapsed / duration) - 1;
    return (changeInValue * (((((elapsed)) * elapsed) * elapsed) + 1)) + startValue;
}
 
function changeOpac(opacity, id)
{
    var object = document.getElementById(id)
    if (!object) {
        return
    }
    object = object.style;
    object.opacity = (opacity / 100); 
    object.MozOpacity = (opacity / 100); 
    object.KhtmlOpacity = (opacity / 100); 
    object.filter = "alpha(opacity=" + opacity + ")"; 
}

function rs_switchelements (fadeout,fadein)
{
    var obj = document.getElementById(fadein);
    var outobj = document.getElementById(fadeout);
    if ((!obj) || (!outobj)) {
        return;
    }
    
    opacity(fadeout,100,0,fade_time);
    setTimeout("opacity('" + fadein + "',0,100," + fade_time + ")",fade_time);

    if (obj.nodeName == 'TBODY') {
        if (isIE) {
            setTimeout("document.getElementById('" + fadein + "').style.display = 'block'",fade_time);
        } else {
            setTimeout("document.getElementById('" + fadein + "').style.display = 'table-row-group'",fade_time);
        }
    } else {
        setTimeout("document.getElementById('" + fadein + "').style.display = 'block'",fade_time);
    }
    setTimeout("document.getElementById('" + fadeout + "').style.display = 'none'",fade_time);
}

function rs_dynamicenablebutton (field_id,button_id)
{
    var field = document.getElementById(field_id);
    var button = document.getElementById(button_id);
    if ((!field) || (!button)) {
        return;
    }
    button.disabled = (field.value == field.defaultValue);
}

function rs_showmodaldialog ()
{
    var dialog = document.getElementById('modal_dialog');
    dialog.style.display = 'block';
}

function rs_hidemodaldialog ()
{
    var dialog = document.getElementById('modal_dialog');
    dialog.style.display = 'none';
}

function rs_showmodaldialogwithcontent (content)
{
    var area = document.getElementById('modal_dialog_area');
    area.innerHTML = content;
    rs_showmodaldialog();
}

function rs_togglelanguagepicker ()
{
    var master = document.getElementById('worldwide');
    var header = document.getElementById('worldwide_header');
    var picker = document.getElementById('worldwide_picker');
    
    if ((!master) || (!header) || (!picker)) {
        return;
    }
    
    var masterHeight = master.offsetHeight;
    var headerHeight = header.offsetHeight;
    
    if (masterHeight == headerHeight) {
        master.style.height = headerHeight + 'px';
        picker.style.display = 'block';
        var pickerHeight = picker.offsetHeight;
    
        
        changeHeight('worldwide',headerHeight + pickerHeight,500);
        //reality_Animate('worldwide',headerHeight,headerHeight + pickerHeight,0.5,'reality_AnimateHeight');
    } else {
        changeHeight('worldwide',headerHeight,500);
        //reality_Animate('worldwide',masterHeight,headerHeight,0.5,'reality_AnimateHeight','reality_AnimationComplete');
    }
}

function videoError (video) {
    while (video.firstChild) {
        if (video.firstChild instanceof HTMLSourceElement) {
            video.removeChild(video.firstChild);
        } else {
            video.parentNode.insertBefore(video.firstChild, video);
        }
    }
    video.parentNode.removeChild(video);
}

function rs_FocusField ()
{
    if (this.value == this.defaultValue) {
        this.value = '';
    }
    this.style.color = '#000000';
}

function rs_BlurField ()
{
    if (this.value == '') {
        this.value = this.defaultValue;
        this.style.color = '#999999';
    } else {
        this.style.color = '#000000';
    }
}

/*
    Developed by Robert Nyman, http://www.robertnyman.com
    Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/  
var getElementsByClassName = function (className, tag, elm){
    if (document.getElementsByClassName) {
        getElementsByClassName = function (className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
                nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
                returnElements = [],
                current;
            for(var i=0, il=elements.length; i<il; i+=1){
                current = elements[i];
                if(!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate) {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = "",
                xhtmlNamespace = "http://www.w3.org/1999/xhtml",
                namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
                returnElements = [],
                elements,
                node;
            for(var j=0, jl=classes.length; j<jl; j+=1){
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    }
    else {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = [],
                elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
                current,
                returnElements = [],
                match;
            for(var k=0, kl=classes.length; k<kl; k+=1){
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for(var l=0, ll=elements.length; l<ll; l+=1){
                current = elements[l];
                match = false;
                for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
};
