﻿/*
  Knowmax Measurement Utility Unit for JavaScript

  Relies on prototype.js

  
  version 1.0 - january 2007
    - initial version
    
  (c) 2007 Knowmax
*/

var KMMeasurement = {  
  majorversion: function() {
    return 1;
  },
  
  minorversion: function() {
    return 0;
  },
  
  version: function() {
    return KMMeasurement.majorversion() + "." + KMMeasurement.minorversion();  
  },
  
  // Internally used to initalize this library.
  _initialize: function() {
    if ((typeof Prototype == 'undefined') ||
       (parseFloat(Prototype.Version.split(".")[0] + "." +
                   Prototype.Version.split(".")[1]) < 1.5)) {
       throw("KMMeasurement requires the Prototype JavaScript framework >= 1.5.0");     
    }
  },

  isDefined: function(element) {
    return (typeof element != 'undefined');
  },
  
  // Clones given rectangle object. 
  cloneRect: function(rect) {
    if (rect) {
      return {left: rect.left, top: rect.top, width: rect.width, height: rect.height};
    } else {
      return null;
    }  
  },
   
  // Get rectangle object for given element representing size and screen position.
  // Available properties of returned object: left, top, width, height.
  getRect: function(element) {    
    if (!KMMeasurement.isDefined(element)) {
      element = $(element);
    }

    var offset = Position.cumulativeOffset(element);
    var leftvalue = offset[0];
    var topvalue = offset[1];
    
    var dimensions = Element.getDimensions(element);
    var widthvalue = dimensions.width;
    var heightvalue = dimensions.height;    

    return {left: leftvalue, top: topvalue, width: widthvalue, height: heightvalue};
  },  
  
  // Set size and screen position for given element according given rectangle object values.
  setRect: function(element, rect) {
    if (!KMMeasurement.isDefined(element)) {
      element = $(element);
    }
    
    if (rect) {
      KMMeasurement.setLeft(element, rect.left);
      KMMeasurement.setTop(element, rect.top);
      KMMeasurement.setWidth(element, rect.width);
      KMMeasurement.setHeight(element, rect.height);
    }
  },
  
  // Return object with inner width and height values for given window element
  // Available properties of returned object: width, height, available
  getInnerRect: function(element) {   
    var widthvalue = 0;
    var heightvalue = 0;
    var availablevalue = false;

    if (element) {     
      if (element.innerHeight) {
        // all except Explorer
        widthvalue = element.innerWidth;
        heightvalue = element.innerHeight;
        availablevalue = true;
      } else if ((element.document) && (element.document.documentElement) && 
                 (element.document.documentElement.clientHeight)) {
        // Explorer 6 Strict Mode
        widthvalue = element.document.documentElement.clientWidth;
        heightvalue = element.document.documentElement.clientHeight;
        availablevalue = true;
      }
      else if ((element.document) && (element.document.body)) {
        // other Explorers
        widthvalue = element.document.body.clientWidth;
        heightvalue = element.document.body.clientHeight;
        availablevalue = true;
      }            
    } 
    
    return {width: widthvalue, height: heightvalue, available: availablevalue};
  },  
    
  // Determine size expression, dynamically adds "px" as unit in case not specified
  getSizeExpression: function(value) {
    if (!value) {
      return "0 px";
    } else if ((typeof value == "string") &&
              ((value.indexOf("%") != -1) || (value.indexOf("px") != -1))) {
      return value;
    } else {
      return value + "px"; // assumption
    }
  },
  
  setLeft: function(element, left) {
    if (!KMMeasurement.isDefined(element)) {
      element = $(element);
    }
    
    element.style.left = KMMeasurement.getSizeExpression(left);  
  },  
  
  setTop: function(element, top) {
    if (!KMMeasurement.isDefined(element)) {
      element = $(element);
    }
    
    element.style.top = KMMeasurement.getSizeExpression(top);  
  },  
  
  setWidth: function(element, width) {
    if (!KMMeasurement.isDefined(element)) {
      element = $(element);
    }
    
    element.style.width = KMMeasurement.getSizeExpression(width);  
  },

  setHeight: function(element, height) {
    if (!KMMeasurement.isDefined(element)) {
      element = $(element);
    }
    
    element.style.height = KMMeasurement.getSizeExpression(height);  
  },
  
  getLeft: function(element) {
    return KMMeasurement.getRect(element).left;       
  },  
  
  getTop: function(element) {
    return KMMeasurement.getRect(element).top; 
  },  
  
  getWidth: function(element) {
    return KMMeasurement.getRect(element).width; 
  },

  getHeight: function(element) {
    return KMMeasurement.getRect(element).height; 
  },  
  
  // Returns object with page dimensions of current page.
  // Available properties of returned object: pageWidth, pageHeight, windowWidth, windowHeight
  getPageSize: function() {
	  var xscroll, yscroll;	
	  if (window.innerHeight && window.scrollMaxY) {	
		  xscroll = document.body.scrollWidth;
		  yscroll = window.innerHeight + window.scrollMaxY;
	  } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		  xscroll = document.body.scrollWidth;
		  yscroll = document.body.scrollHeight;
	  } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		  xscroll = document.body.offsetWidth;
		  yscroll = document.body.offsetHeight;
	  }
	
	  var windowwidth, windowheight;
	  if (self.innerHeight) {	// all except Explorer
		  windowwidth = self.innerWidth;
		  windowheight = self.innerHeight;
	  } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		  windowwidth = document.documentElement.clientWidth;
		  windowheight = document.documentElement.clientHeight;
	  } else if (document.body) { // other Explorers
		  windowwidth = document.body.clientWidth;
		  windowheight = document.body.clientHeight;
	  }	
  	
	  // for small pages with total height less then height of the viewport
	  var pagewidth, pageheight;
	  if(yscroll < windowheight){
		  pageheight = windowheight;
	  } else { 
		  pageheight = yscroll;
	  }

	  // for small pages with total width less then width of the viewport
	  if(xscroll < windowwidth){	
		  pagewidth = windowwidth;
	  } else {
		  pagewidth = xscroll;
	  }

    return {pageWidth: pagewidth, pageHeight: pageheight, 
      windowWidth: windowwidth, windowHeight: windowheight};	  	  
  }      
}

// Short cut alias
var KMM = KMMeasurement;

// Initialize library
KMMeasurement._initialize();
