/**** Utility functions ****/

var Revision;

function $ (el) {
    if (typeof el == 'string') {
        el = document.getElementById(el);
    }
    return el;
}

function addEvent (el,eventName,action) {
    if (el.addEventListener) {
        el.addEventListener(eventName,action,false);
    }
    else {
        el.attachEvent('on'+eventName,action);
    }
}

function add_script(url) {
    var scriptEl = document.createElement('script');
    scriptEl.type = 'text/javascript';
    scriptEl.src  = url;
    document.body.appendChild(scriptEl);
}

//LIGHTBOX

function lightbox(state,close_func) {
    var el = $('lightbox');
    if (state == 'on') {
        var outer = $('outer');
        if (!el) {
            var parent_el = document.createElement('div');
            parent_el.style.position = 'relative';
            parent_el.style.zIndex   = 1;
            el = parent_el.appendChild(document.createElement('div'));
            el.id = 'lightbox';
            el.style.position = 'absolute';
            outer.insertBefore(parent_el,outer.firstChild);
        }
        el.style.height = (outer.offsetHeight + outer.offsetTop) + 'px';
        el.style.width  = document.body.offsetWidth + 'px';
        el.style.left   = '-' + outer.offsetLeft + 'px';
        el.style.top    = '-' + outer.offsetTop + 'px';
        addEvent(el,'click',close_func);
        el.style.display = 'block';
    }
    else if (el) {
        el.style.display = 'none';
    }
    return el;
}

/**** AJAX request ****/
var AJAXer = {};
AJAXer.request = false;

AJAXer.stateChange = function() {
    var request = AJAXer.request;
    if (request.readyState == 4) {
        AJAXer.request = false;
        if (request.status == 200) {
            AJAXer.success(request.responseText);
        }
        else if (AJAXer.fail_url) {
            document.location = AJAXer.fail_url;
        }
    }
};

AJAXer.get_request = function() {
    var request;
    try {
        request = new XMLHttpRequest();
    } catch (trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                request = false;
            }
        }
    }
    return request;
};


AJAXer.get = function (url,success,fail_url) {
    if (AJAXer.request) { return false; }

    AJAXer.request = AJAXer.get_request();
    if (!AJAXer.request) { return true; }

    AJAXer.fail_url = fail_url;
    AJAXer.success  = success;

    AJAXer.request.open("GET", url, true);
    AJAXer.request.onreadystatechange = AJAXer.stateChange;
    AJAXer.request.send(null);
    return false;
};

AJAXer.submit_form = function (form,dest) {
    form =  $(form);
    var request = AJAXer.post_form(form,form.action,{ajax:1});
    if (request.status == 200) {
        var response = request.responseText;
        var error_regex = /^\s*ERROR/;
        if (! error_regex.test(response)) {
            $(dest).innerHTML = response;
            return false;
        }
    }
    return true;
};

AJAXer.post_form = function (form,action,extra_args) {
    var request = AJAXer.get_request();
    if (!request) { return true; }

    if (!action) { action = form.action }
    request.open("POST", action, false);
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    request.send(AJAXer.post_body(form,extra_args));
    return request;
};

AJAXer.post_body = function (form,extra_args) {
    var values = [];
    if (extra_args) {
        for (var key in extra_args) {
            values.push(AJAXer.encode_value(key,extra_args[key]));
        }
    }

    var fields = form.elements;
    for (var i = 0; i < fields.length; i++) {
        var field = fields[i];
        var option;
        if (! field.name ) { continue }
        if (field.tagName == 'INPUT') {
            if ((field.type == 'radio' || field.type == 'checkbox') && ! field.checked) {
                continue;
            }
            values.push(AJAXer.encode_value(field.name,field.value));
        }
        else if (field.tagName == 'SELECT') {
            if (field.multiple) {
                var options = field.options;
                for (var j = 0; j < options.length; j++) {
                    option = options[j];
                    if (option.selected) {
                        values.push(AJAXer.encode_value(field.name,option.value));
                    }
                }
            }
            else if (field.selectedIndex >= 0) {
                option = field.options[field.selectedIndex];
                values.push(AJAXer.encode_value(field.name,option.value));
            }
        }
    }
    return values.join('&');
};

AJAXer.encode_value = function (key,val) {
    return encodeURIComponent(key) + '=' + encodeURIComponent(val);
};

AJAXer.get_blocking = function (url) {
    if (AJAXer.request) { return false; }

    AJAXer.request = AJAXer.get_request();
    if (!AJAXer.request) { return true; }

    AJAXer.request.open("GET", url, false);
    AJAXer.request.send(null);
    return AJAXer.request.status == 200;
};




/*** FORM FIELDS ***/

function set_el_focus(state,el){
    if (state == 'focus') {
        el.old_class = el.className;
        el.className  = el.className ? el.className+ ' focussed' : 'focussed';
    }
    else {
        el.className = el.old_class ? el.old_class : '';
    }
    return true;
}

function field_focuser(state,el){
    return function() { set_el_focus(state,el)}
}

function init_form(form_id) {
    var form = $(form_id);
    if (! form || form.nodeName.toLowerCase() != 'form') { return false; }
    var fields = form.elements;
    for (var i = 0; i < fields.length; i++) {
        var field = fields[i];
        if (!(
            field.nodeName.toLowerCase()    == 'textarea'
            || field.nodeName.toLowerCase() == 'input'
            && field.type                   != 'hidden'
        )) { continue; }
        var parent = field.parentNode;
        addEvent(field,'focus',field_focuser('focus',parent));
        addEvent(field,'blur',field_focuser('blur',parent));
    }
    return true;
}

function set_hint(id,state) {
    var field = $(id);
    if (!field) { return false; }
    if (state=='focus' ) {
        if (field.value == field.alt) {
            field.value = '';
            if (field.old_class) {
                field.className = field.old_class;
            }
        }
    } else {
        if (field.value == '' || field.value == field.alt ) {
            field.value = field.alt;
            field.old_class = field.className;
            field.className = field.className + ' hint';
        }
        if (state == 'init') {
            addEvent(field,'focus',function(){set_hint(field,'focus')});
            addEvent(field,'blur',function(){set_hint(field,'blur')});
        }
    }
    return true;
}

function setup_hints(form_id,fields) {
    var form = $(form_id);
    if (!form) { return }
    for (var i = 0; i < fields.length; i++) {
        var field = $(fields[i]);
        if (!field) { continue; }
        set_hint(field,'init');
    }
    form.onsubmit=function(){
        for (var i = 0; i < fields.length; i++) {
            set_hint(fields[i],'focus');
        }
    };
}

function remove_file(buttonEl,field_id, field_name) {
    var new_input = document.createElement('input');
    new_input.type='file';
    new_input.size='28';
    new_input.className='file';
    new_input.name=field_name;
    buttonEl.parentNode.innerHTML='';
    var hidden=$(field_id);
    hidden.parentNode.replaceChild(new_input,hidden);
    new_input.id=field_id ;
    return false;
}

/* FILTER FIELDS */

function scroll_el (el,current,max,incr,interval) {
    current = current + incr;
    if (current > max) { current = max }

    el.style.height = current + 'px';
    if (current < max) {
        window.setTimeout(function(){scroll_el(el,current,max,incr,interval)},interval);
    }
    return false;
}

function show_filters(filter_el,desc_el) {
    desc_el = $(desc_el);
    desc_el.style.display = 'none';
    filter_el = $(filter_el);

    var filter_style            = filter_el.style;
    var max_height              = filter_el.offsetHeight;

    filter_style.paddingTop     = 0;
    var padding_top             = max_height - filter_el.clientHeight;
    filter_style.paddingBottom  = 0;
    var padding_bottom          = max_height - padding_top - filter_el.clientHeight;
    max_height                  = filter_el.clientHeight;

    filter_style.paddingTop     = padding_top+'px';
    filter_style.paddingBottom  = padding_bottom+'px';

    filter_style.height         = '0px';
    filter_style.position       = 'static';
    filter_style.display        = 'block';

    return scroll_el(filter_el,0,max_height,15,25);
}





