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

var Revision;

//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';
        IA.add_event(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;
};



/**** Approval form ****/
var approval_form = {};

approval_form.changed      = false;
approval_form.save_changes = function(e)  {
    if (window.confirm(approval_form.save_msg)) {

        var form=$(approval_form.form_name);
        var url='ajax=1';
        var fields = form.elements;
        for (var i=0; i < fields.length; i++) {
            var field = fields[i];
            if (field.name && (field.checked
                                || (field.type!='radio'
                                    && field.type!='checkbox'))) {
                url=url+'&'+field.name+'='+field.value;
            }
        }
        url = form.action+'?'+url;
        AJAXer.get_blocking(url);
    }
    return true;
}

approval_form.set_changed = function() {
    if (! approval_form.changed) {
        approval_form.changed = true;

        var el = $('save_changes');
        el.style.visibility = 'visible';
        el.style.display    = 'block';

        var links = document.getElementsByTagName('a');
        for (var j = 0; j < links.length; j++) {
            var link = links[j];
            if (link.className!='deleteImg') {
                IA.add_event(link,'click',approval_form.save_changes);
            }
        }
        var forms = document.forms;
        for (var j = 0; j < forms.length; j++) {
            var form = forms[j];
            if (form.id != approval_form.form_name) {
                IA.add_event(form,'submit',approval_form.save_changes);
            }
        }

    }
}

/*** GIFT SELECTOR ***/
var available_gifts_url;
var give_a_gift_url;

function close_other_gifts() {
    $('show_other_gifts_link').style.visibility = '';
    $('other_gifts_container').style.display   = 'none';
    lightbox('off');
    return false;
}

function select_gift(gift) {
    $('gift_edit-image').value               = gift;
    $('chosen_gift').src                     = '/img/clipart' + gift + '?' + Revision;
    return close_other_gifts();
}

function show_all_gifts(link,gifts) {
    gifts = $('gifts');
    gifts.style.overflow  = 'visible';
    gifts.style.maxHeight = 'visible';
    gifts.style.height    = 'auto';
    link.style.display    = 'none';
    return false;
}

function show_other_gifts() {
    if (! $('gift_selector')) {
        $('other_gifts_container').style.display='block';
        var status = AJAXer.get(available_gifts_url,function(responseText) {
                                $('other_gifts_container').innerHTML = responseText;
                                show_other_gifts();
                                }, give_a_gift_url);
        if (! status) { return false }
    }
    var lightbox_el = lightbox('on',function(){close_other_gifts()});
    $('show_other_gifts_link').style.visibility = 'hidden';
    var other_gifts = $('other_gifts_container');
//    other_gifts.style.zIndex = lightbox_el.style.zIndex + 1;
//    alert(    other_gifts.style.zIndex + ' '+ lightbox_el.style.zIndex + 1);
    other_gifts.style.display    = 'block';

    return false;
}

function show_notice_share(el) {
    el = $(el);
    el.className = el.className == 'visible' ? 'hidden' : 'visible';
    return false;
}

/* FLASH MOVIES */
var has_flash;
var swfobject;
if (swfobject) {
    has_flash = swfobject.hasFlashPlayerVersion('9.0.0');
}
var greeting_selector = {};
var swf_express = '/scripts/swfobject/expressInstall.swf';

function get_flash_movie(movie_name) {
  if (window.document[movie_name]) {
    return window.document[movie_name];
  }
  if (navigator.appName.indexOf("Microsoft Internet")==-1) {
    if (document.embeds && document.embeds[movie_name]) {
        return document.embeds[movie_name];
    }
  }
  return document.getElementById(movie_name);
}

function add_movie(id,url,width,height,flash_vars,attr,params) {
    if (! attr) {
        attr = {};
    }
    attr.id   = id;
    attr.name = id;

    if (! flash_vars) {
        flash_vars = {};
    }

    if (! params) {
        params = {};
    }
    params.allowscriptaccess = 'sameDomain';

    swfobject.embedSWF(url, id, width, height, "9.0.0", swf_express, flash_vars, params,attr);

    IA.add_event(window,'unload', function(){ swfobject.removeSWF(id) });
}

function hide_flash_required(el_id) {
    if (has_flash) {
        var required_el = $(el_id + '_required');
        if (required_el && required_el.tagName == 'DIV') {
            required_el.style.display = 'none';
        }
        var content_el = $(el_id + '_content');
        if (content_el && content_el.tagName == 'DIV') {
            content_el.style.display = '';
        }
    }
    return;
}

function centre_popup(el) {
    el = $(el);
    var windowDim   = getWindowDim();
    var scrollXY    = getWindowScrollXY();
    var current_pos = getOffset(el);

    var window_x = scrollXY.left + Math.ceil(windowDim.width / 2);
    var window_y = scrollXY.top + Math.ceil(windowDim.height / 2);
    var centre_x = window_x - current_pos.left - Math.ceil(el.offsetWidth/2);
    var centre_y = window_y - current_pos.top - Math.ceil(el.offsetHeight/2);

    var parent_offset = getOffset(el.offsetParent);

    el.style.left = (window_x - parent_offset.left - Math.ceil(el.offsetWidth/2)) + 'px';
    el.style.top  = (window_y - parent_offset.top  - Math.ceil(el.offsetHeight/2)) + 'px';

}

/* SURVEY POPUP */
function move_popup(el,close_text) {
    /* IE6 has problems with z-index */
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
      var ua = navigator.userAgent;
      var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
      if (re.exec(ua) != null)
        rv = parseFloat( RegExp.$1 );
        if (rv < 7) { return };
    }

    el = $(el);

    var windowDim = getWindowDim();
    var scrollXY = getWindowScrollXY();
    var current_pos = getOffset(el);

    var window_x = scrollXY.left + Math.ceil(windowDim.width / 2);
    var window_y = scrollXY.top + Math.ceil(windowDim.height / 2);
    var centre_x = window_x - current_pos.left - Math.ceil(el.offsetWidth/2);
    var centre_y = window_y - current_pos.top - Math.ceil(el.offsetHeight/2);

    var bg_offset = getOffset(el.offsetParent);

    var timeout;

    /* Create a background to go behind the popup */
    var bg          = document.createElement('a');
    var border      = 30;
    var bgs         = bg.style;
    bgs.display     = 'none';
    bgs.position    = 'absolute';
    bgs.width       = (el.offsetWidth + border) + 'px';
    bgs.height      = border + 'px';
    bgs.left        = (window_x - bg_offset.left - Math.ceil(el.offsetWidth/2) - border) + 'px';
    bgs.top         = (window_y - bg_offset.top  - Math.ceil(el.offsetHeight/2) - border) + 'px';
    bgs.paddingTop  = (el.offsetHeight + border * 2) + 'px';
    bgs.paddingRight = border + 'px';
    bgs.border      = '3px solid silver';
    bgs.textAlign   = 'right';
    bgs.zIndex      = 999;
    bgs.background  = '#EEE';
    bg.innerHTML    = close_text;

    el.parentNode.insertBefore(bg,el);

    var s = el.style;
    var close_popup = function() {
        s.top = 0;
        s.left = 0;
        bg.style.display = 'none';
        if (timeout) { window.clearTimeout(timeout)}
    };

    IA.add_event(bg,'click',close_popup);

    var x_sign = centre_x > 0 ? 1 : -1;
    var y_sign = centre_y > 0 ? 1 : -1;

    centre_x = Math.abs(centre_x);
    centre_y = Math.abs(centre_y);

    var x_incr = 10;
    var y_incr = 10;
    if (centre_x > centre_y) {
        y_incr = Math.ceil(x_incr * centre_y / centre_x);
    }
    else {
        x_incr = Math.ceil(y_incr * centre_x / centre_y);
    }

    var do_move = function(curr_x,curr_y) {
        curr_x += x_incr;
        if (curr_x > centre_x) {
            curr_x = centre_x;
        }
        curr_y += y_incr;
        if (curr_y > centre_y) {
            curr_y = centre_y;
        }
        s.left = (x_sign * curr_x) + 'px';
        s.top  = (y_sign * curr_y) + 'px';

        if (curr_x != centre_x || curr_y != centre_y) {
            timeout = window.setTimeout(function(){do_move(curr_x,curr_y)},5);
        } else {
            bgs.display = 'block';
        }
    }

    do_move(0,0);
    s.zIndex        = 10000;

}

function getWindowDim() {
    var W = 0;
    var H = 0;
    if( typeof( window.innerWidth ) == 'number' ) {
        W = window.innerWidth;
        H = window.innerHeight;
    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        W = document.documentElement.clientWidth;
        H = document.documentElement.clientHeight;
    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        W = document.body.clientWidth;
        H = document.body.clientHeight;
    }
    return {width: W, height: H};
}

function getWindowScrollXY() {
    var X = 0;
    var Y = 0;
    if( typeof( window.pageYOffset ) == 'number' ) {
        X = window.pageXOffset;
        Y = window.pageYOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        X = document.body.scrollLeft;
        Y = document.body.scrollTop;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        X = document.documentElement.scrollLeft;
        Y = document.documentElement.scrollTop;
    }
    return {top: Y, left: X};
}

function getOffset( el ) {
    el = $(el);
    var X = 0;
    var Y = 0;
    while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
        X += el.offsetLeft - el.scrollLeft;
        Y += el.offsetTop - el.scrollTop;
        el = el.offsetParent;
    }
    return { top: Y, left: X };
}
