// orthoRuler class - builds on orthoLine and orthoLabel

// TO-DO
//
// clean up the messy variable names
// perhaps split into horizontal and vertial functions??
// - be able to pass an array of labels and have it use those
// - fix the label placement 
// - allow for logarithmic axes
// -- allow for vertical-up and vertical-down...

var orthoRuler = Class.create();
Object.extend(orthoRuler, {
	count: 0
});

orthoRuler.prototype = {

	orthoClass: 'orthoRuler',

	initialize: function(parent, left, top, rulertype, length) { 

		var options = arguments[5] || {};

		rulertype = rulertype.toLowerCase();
		
		if(options['major_tick_interval'] == undefined) {
			options['major_tick_interval'] = 10; // arbitrary default value
		}
		if(options['major_tick_height'] == undefined) {
			options['major_tick_height'] = 10; // arbitrary default value
		}
		if(options['major_tick_placement'] == undefined) {
			options['major_tick_placement'] = 'cross'; // arbitrary default value
		}

		var label_low      = options['major_label_low'];
		var label_interval = options['major_label_interval'];

		var major_tick_interval  = Math.round(options['major_tick_interval']);
		var major_tick_height    = Math.round(options['major_tick_height']);

		var minor_tick_interval  = Math.round(options['minor_tick_interval']);
		var minor_tick_height    = Math.round(options['minor_tick_height']);

		var major_tick_placement = options['major_tick_placement'];
		var minor_tick_placement = options['minor_tick_placement'];

	    var div = document.createElement('div');
		div = $(div);

		var name = this.orthoClass + rulertype.capitalize();
 		var id = name + orthoRuler.count++;
		div.id = id;
	    div.setAttribute('name', this.orthoClass);
		this.element = div;

		this.getParents(parent);
		this.setZIndex();
		this.setCssClasses(options, name);
		
	    div.setStyle({position: 'absolute',
						  	left: left + 'px',
						   	 top: top + 'px',
					  visibility: 'hidden' });

	    parent.element.appendChild(div);
	
        // Figure out the tick heights and placements - default is 'cross'
		var major_tick0 = -Math.round(major_tick_height/2);

	   	if(rulertype == 'horizontal') {
			if(major_tick_placement == 'above') {
			   major_tick0 = -major_tick_height;
			} else if(major_tick_placement == 'below') {
			   major_tick0 = 0;		
			}
		} else {
			if(major_tick_placement == 'left') {
			   major_tick0 = -major_tick_height;
			} else if(major_tick_placement == 'right') {
			   major_tick0 = 0;		
			}
	
		}

		
		if(minor_tick_placement) {
			var minor_tick0 = -Math.round(minor_tick_height/2);
			if(minor_tick_placement == 'above' ||
			   minor_tick_placement == 'left') {
			   minor_tick0 = -minor_tick_height;
			} else if(minor_tick_placement == 'below' ||
			          minor_tick_placement == 'right') {
			   minor_tick0 = 0;		
			}
	    }
		
		var major_tick_class = name + 'MajorTick';
		var minor_tick_class = name + 'MinorTick';
		var label_class      = name + 'Label';
		var ruler_class      = name + 'Line';
		
		// Create the ticks and labels
		var itick = 0;
		var line = null;
		var label = null;
		var width = 0;
		var height = 0;
		var labelTop = 0;
		var labelLeft = 0;
		
		for(majorx=0; majorx <= length; majorx += major_tick_interval) {

		    width     = (rulertype == 'horizontal') ? 0 : major_tick_height;
		    height    = (rulertype == 'horizontal') ? major_tick_height : 0;
			left      = (rulertype == 'horizontal') ? majorx : major_tick0;
			top       = (rulertype == 'horizontal') ? major_tick0 : majorx;
			labelLeft = (rulertype == 'horizontal') ? majorx : major_tick0 + major_tick_height + 1;
			labelTop  = (rulertype == 'horizontal') ? major_tick0 + major_tick_height + 1 : majorx;

  		    line = new orthoLine(this, left, top, width, height, {cssClass: major_tick_class});

			var labelVal = (label_low == undefined) ? majorx : label_low + (label_interval * itick);
		   	label = new orthoLabel(this, labelLeft, labelTop, labelVal.toString(), 'center',
								   {cssClass: label_class});
			var labelDims = label.element.getDimensions();

		   	if(rulertype == 'horizontal') {
			   labelLeft -= Math.round(labelDims.width/2);
			   if(major_tick_placement == 'above') {
			      labelTop = major_tick0 - labelDims.height - 1;
			   }
			} else {
			   labelTop -= Math.round(labelDims.height/2);
			   if(major_tick_placement != 'right') {
			      labelLeft = major_tick0 - labelDims.width - 1;
			   }
			}

			// Reset the label position based on the actual text
			label.element.setStyle({left: labelLeft + 'px',
									 top: labelTop + 'px'});

		   // Draw the minor ticks
		   if(minor_tick_placement) {

			  width  = (rulertype == 'horizontal') ? 0 : minor_tick_height;
			  height = (rulertype == 'horizontal') ? minor_tick_height : 0;
			  minorx_limit = (majorx + major_tick_interval > length) ? length : majorx + major_tick_interval;

			  for(minorx = majorx + minor_tick_interval; 
				  minorx < minorx_limit; minorx += minor_tick_interval) {
			      left = (rulertype == 'horizontal') ? minorx : minor_tick0;
			      top  = (rulertype == 'horizontal') ? minor_tick0 : minorx;
 		          line = new orthoLine(this, left, top, width, height, {cssClass: minor_tick_class});
             }
		   }
		   itick++;
		}

		length++;
		width  = (rulertype == 'horizontal') ? length : 0;
		height = (rulertype == 'horizontal') ? 0 : length;
		var ruler_line = new orthoLine(this, 0, 0, width, height, {cssClass: ruler_class});

		// Finally, make it visible
	    div.setStyle({visibility: 'visible' });
    }
}

Object.extend(orthoRuler.prototype, orthoBase);




