// Creates an object that can be used later to easily open popup windows.
// Usage:
// var SpecialWindow = new PopupWindow( 'foobar', {width:100, height: 50} );
// <a href='blah.html' onclick='SpecialWindow.popup(this);return false;'>Pop me up</a>
var PopupWindow = Class.create();
PopupWindow.prototype = {
	initialize: function( target, options ) {
		this.target = target || '_blank';
		this.options = {
			location: 0,
			statusbar: 0,
			menubar: 0,
			width: 400,
			height: 300,
			resizable: 1,
			scrollbars: 1
		};
		Object.extend( this.options, options || {} );
	},
	
	getFeatures: function() {
		return $H(this.options).map( function(pair) {
			return pair.join('=');
		}).join(',');
	},
	
	popup: function( destination ) {
		if( destination )
		{
			var url = destination.href || destination;
			var childWindow = window.open( url, this.target, this.getFeatures() );
			if(childWindow)
				childWindow.focus();
			return childWindow;
		}
	}
};

var HelpWindow = new PopupWindow('help', { width: 300, height: 470 });
var PrintWindow = new PopupWindow('print', { width: 800, height: 640 });
var PptWindow = new PopupWindow('ppt', { width: 800, height: 640 });

// Creates an image that changes when the user mouses over it.
// new HoverImage("someImage", "http://example.org/someImageUrl.jpg");
var HoverImage = Class.create();
HoverImage.prototype = {
	initialize: function(imageTag, mouseOverImage) {
		this.image = $(imageTag);
		this.offSrc = this.image.src;
		this.onSrc = mouseOverImage.replace(/&amp;/g, '&');
		
		Event.observe(this.image, "mouseover", this.onMouseOver.bindAsEventListener(this));
		Event.observe(this.image, "mouseout", this.onMouseOut.bindAsEventListener(this));
	},
	
	onMouseOver: function(evt) {
		this.image.src = this.onSrc;
	},
	
	onMouseOut: function(evt) {
		this.image.src = this.offSrc;
	}
}

// Look through the document for images with an attribute "hover" and create a hover image object for each of them.
HoverImage.parseDocument = function()
{
	var imgTags = document.getElementsByTagName("img");
	var images = $A(imgTags);
	images.each(function(image) {
		var hover = image.getAttribute("hover");
		if(hover)
			new HoverImage(image, hover);
	});
}

Event.observe(window, "load", HoverImage.parseDocument);

// This is a class to create the "dual slider" control on the GNOME tab.
MultiSlider = Class.create({
	initialize: function(wrapper, options) {
		var wrapper = $(wrapper);
		
		var track = wrapper.select('.track')[0];
		var handles = track.select('.handle');
		var spanners = wrapper.select('.spanWrap div');
		
		this.valueSpans = wrapper.select('.valueWrap div span');
		this.hiddenInputs = wrapper.select('.spanWrap div input');
		this.sliderWarning = $('sliderWarning');
		
		options = options || {};
		options.restricted = true;
		if(spanners.length > 0) {
			options.startSpan = spanners[0];
			options.endSpan = spanners[spanners.length-1];
			options.spans = spanners.findAll(function(el, index) {
				return index > 0 && index < (spanners.length-1);
			});
			options.onChange = this.onChange.bind(this);
			options.onSlide = this.onChange.bind(this);
		}
						
		this.slider = new Control.Slider(handles, track, options);
		
		this.onChange(options.sliderValue || [], true);
	},
	
	onChange: function(values, initializing) {
		if(this.sliderWarning && initializing != true)
			this.sliderWarning.show();
	
		var deltas = [];
		var prevValue = this.slider.minimum;
		values.each(function(value) { 
			deltas.push(value - prevValue);
			prevValue = value;
		});
		deltas.push(this.slider.maximum - prevValue);
		
		deltas.each(function(delta, index) {
			this.valueSpans[index].innerHTML = delta;
			this.hiddenInputs[index].value = delta;
		}, this);
	}
});

// This function will disable all select boxes on the screen - useful to call right before doing a postback
// if you don't want the user to try changing multiple selections
// TODO: Actually call this method when the user selects something
function disableSelects()
{
	$A(document.getElementsByTagName("select")).each(function(s)
	{
		s.disabled = true;
	});
}

function alternateRowColor(id)
{ 
    if(document.getElementsByTagName)
    {  
        var checkBoxList = document.getElementById(id);
        var rows = checkBoxList.getElementsByTagName("tr");   
        for(i = 0; i < rows.length; i++)
        {           
            if(i % 2 == 0)
            { 
                rows[i].className = "checkboxlistEven"; 
            }
            else
            { 
                rows[i].className = "checkboxlistOdd"; 
            }       
        } 
    } 
}

function validateMaxDimensionsSelected(clientId, index, maxDimensions, errorMessage)
{
    var checkBoxes = document.getElementById(clientId).getElementsByTagName('input');
    var clickedCheckBox = checkBoxes[index];
    
    var numChecked = 0;
    for(i=0;i<checkBoxes.length;i++)
    {
        if(checkBoxes[i].checked)
        {
            numChecked++;
        }
    } 
    if(numChecked > maxDimensions)
    {
        clickedCheckBox.checked = false;
        alert(errorMessage);
    }
}

function validateUnavailableCheckBox(checkbox, message)
{
    checkbox.checked = false;
    alert(message);
}

function AtLeastOneCheckboxChecked()
{
    var list = document.getElementsByTagName("input");
    var result = true
    var btnIndex = -1;

    for(i=0;i<list.length;i++)
    {
        if (list[i].getAttribute('type') == 'checkbox')
        {
            if (list[i].checked)
            {
                result = false;
            }
        }
        
        if (list[i].getAttribute('type') == 'submit')
        {
            if (list[i].id.indexOf('downloadPPT') != -1)
            {
                btnIndex = i;
            }
        }
    }

    if (btnIndex != -1)
        list[btnIndex].disabled = result;


    if (result)
        alert('Please make at least one selection before downloading.');
    
}
