//Add trim function in String object
String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

function getDispersedInch( from, to, increment ) {
    var arr = [];
    while( compareMeasurement( from, to ) <= 0 ) {
        arr.push( from );
        from = addInch( from, increment );
    }
    return arr;
}

function addInch( inch1, inch2 ) {
    var numberator, denominator;
    var component1 = decomposeInch( inch1 );
    var component2 = decomposeInch( inch2 );
    var inch = component1.inch + component2.inch;

    if ( component1.numberator == "" ) {
        numberator = component2.numberator;
        denominator = component2.denominator;
    }
    else if ( component2.numberator == "" ) {
        numberator = component1.numberator;
        denominator = component1.denominator;
    }
    else {
        numberator = component1.numberator * component2.denominator + component2.numberator * component1.denominator;
        denominator = component1.denominator * component2.denominator;
        if ( numberator >= denominator ) {
            inch += Math.floor( numberator / denominator );
            numberator = numberator % denominator;
        }
        if ( numberator == 0 ) {
            return inch + "\"";
        }
        else {
            var factor = gcd( numberator, denominator );
            numberator /= factor;
            denominator /= factor;
        }
    }
    return ( inch != 0 ? inch + " " : "") + numberator + "/" + denominator + "\"";
}

function compareMeasurement( m1, m2 ) {
    return convertInchToNumber( m1 ) - convertInchToNumber( m2 );
}

// convert to number of 1/16"
function convertInchToNumber( inch ) {
    var component = decomposeInch( inch );
    var num = component.inch * 16;
    if ( component.numberator != "" && component.denominator != "" ) {
        num += component.numberator * ( 16 / component.denominator );
    }
    return num;
}

function decomposeInch( inch ) {
    var component = new Object();
    var regExp = /(\d*)\s*(-?\s*(\d+)\/?(\d+))?\"/;
    var arr = regExp.exec( inch );
    if ( RegExp.$1 != "" ) {
        component.inch = eval( RegExp.$1 );
    }
    else {
        component.inch = 0;
    }
    if ( RegExp.$3 != "" ) {
        component.numberator = eval( RegExp.$3 );
    }
    else {
        component.numberator = 0;
    }
    if ( RegExp.$4 != "" ) {
        component.denominator = eval( RegExp.$4 );
    }
    else {
        component.denominator = 0;
    }
    if ( component.numberator == 0 || component.denominator == 0 ) {
        component.numberator = "";
        component.denominator = "";
    }
    return component;
}

function gcd( pmtA, pmtB ) {
    if ( pmtA == 0 || pmtB == 0 ) {
        if ( pmtA != 0 ) { 
            return pmtA;
        }
        else if ( pmtB != 0 ) {
            return pmtB;
        }
        else {
            return NaN; 
        }
    }
    var a = ( pmtA > 0 ? pmtA : pmtA * (-1) );
    var b = ( pmtB > 0 ? pmtB : pmtB * (-1) );
    while ( a != b ) {
        if ( a > b ) {
           a -= b;
        }
        else {
           b -= a;
        }
    }
    return a;
}

function convertSafeString( str ) {
    str.replace( /'/g, "\\'" );
    str.replace( /"/g, '\\"' );
    return str;
}

// toggle color and cursor when mouse hoves an element
// function set start
function colorRow(elem, color) {
	if (document.layers) {
  	elem.oldcolor = elem.style.backgroundColor
  	elem.style.backgroundColor=color;
 	}
	else{
  	elem.oldcolor = elem.style.backgroundColor
  	elem.style.backgroundColor=color;
  }
}
function recoverRow(elem) {
	if (document.layers) 
		elem.style.backgroundColor = color; // this should be modified for NN4
	else{
    elem.style.backgroundColor=elem.oldcolor;
  }
}
function activeRow( elem, color ) {
    colorRow( elem, color );
    elem.style.cursor = "pointer";
}
function inactiveRow( elem ) {
    recoverRow( elem );
    elem.style.cursor = "default";
}
// function set end


function switchStyle( file1 ,file2){
  var cssfile = document.getElementsByTagName("link")[0];
  if (cssfile.getAttribute("href")==file1)
     cssfile.setAttribute("href",file2);
  else 
     cssfile.setAttribute("href",file1);
}

function MM_showHideLayers() { //v9.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) 
  with (document) if (getElementById && ((obj=getElementById(args[i]))!=null)) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

// FLOATING LAYERS
var cX = 0; var cY = 0; var rX = 0; var rY = 0;
function UpdateCursorPosition(e){ cX = e.pageX; cY = e.pageY;}
function UpdateCursorPositionDocAll(e){ cX = event.clientX; cY = event.clientY;}
if(document.all) { document.onmousemove = UpdateCursorPositionDocAll; }
else { document.onmousemove = UpdateCursorPosition; }
function AssignPosition(d) {
if(self.pageYOffset) {
	rX = self.pageXOffset;
	rY = self.pageYOffset;
	}
else if(document.documentElement && document.documentElement.scrollTop) {
	rX = document.documentElement.scrollLeft;
	rY = document.documentElement.scrollTop;
	}
else if(document.body) {
	rX = document.body.scrollLeft;
	rY = document.body.scrollTop;
	}
if(document.all) {
	cX += rX; 
	cY += rY;
	}
d.style.left = (cX+1) + "px";
d.style.top = (cY+1) + "px";
}
function HideContent(d) {
if(d.length < 1) { return; }
document.getElementById(d).style.display = "none";
}
function ShowContent(d,g) {
if(d.length < 1) { return; }
var dd = document.getElementById(d);
dd.innerHTML = '<img src="' + g + '" />';
AssignPosition(dd);
dd.style.display = "block";
}
function ReverseContentDisplay(d) {
if(d.length < 1) { return; }
var dd = document.getElementById(d);
AssignPosition(dd);
if(dd.style.display == "none") { dd.style.display = "block"; }
else { dd.style.display = "none"; }
}

function indexOf( arr, o ) {
    for ( var i = 0; i < arr.length; i++ ) {
        if ( arr[i] == o ) {
            return i;
        }
    }
    return -1;
}


function getCSSProp (element, prop) {
    if (element.style[prop]) {
        // inline style property
        return element.style[prop];
    } else if (element.currentStyle) {
        // external stylesheet for Explorer
        return element.currentStyle[prop];
    } else if (document.defaultView && document.defaultView.getComputedStyle) {
        // external stylesheet for Mozilla and Safari 1.3+
        return document.defaultView.getComputedStyle(element,null).getPropertyValue(prop);
    } else {
        // Safari 1.2
        return null;
    }
}

// Image proloader define - begin
function ImagePreloader(images, call_back) {
   // store the call_back
   this.call_back = call_back;

   // initialize internal state.
   this.nLoaded = 0;
   this.nProcessed = 0;
   this.aImages = new Array;

   // record the number of images.
   this.nImages = images.length;

   for ( var i = 0; i < images.length; i++ ) {
       this.preload(images[i]);
   } 
}
ImagePreloader.prototype = {
   preload: function(image) {
        // create new Image object and add to array
        var oImage = new Image;
        this.aImages.push(oImage);

        // set up event handlers for the Image object
        oImage.onload = ImagePreloader.prototype.onload;
        oImage.onerror = ImagePreloader.prototype.onerror;
        oImage.onabort = ImagePreloader.prototype.onabort;

        // assign pointer back to this.
        oImage.oImagePreloader = this;
        oImage.bLoaded = false;

        // assign the .src property of the Image object
        oImage.src = image;
   },
   onComplete: function() {
        this.nProcessed++;
        if ( this.nProcessed == this.nImages ) {
            this.call_back(this.aImages, this.nLoaded);
        }
   },
   onload: function() {
        this.bLoaded = true;
        this.oImagePreloader.nLoaded++;
        this.oImagePreloader.onComplete();
   },
   onerror: function() {
        this.bError = true;
        this.oImagePreloader.onComplete();
   },
   onabort: function() {
        this.bAbort = true;
        this.oImagePreloader.onComplete();
   }
}
// Image proloader define - end

var selectedLine;
function selectLine( elem, color ) {
    if ( selectedLine ) {
        if ( elem != selectedLine ) {
            recoverRow( selectedLine );
        }
    }
    elem.style.backgroundColor = color;
    selectedLine = elem;
}
function activeLine( elem, color ) {
    if ( elem != selectedLine ) {
        activeRow( elem, color );
    }
}
function inactiveLine( elem ) {
    if ( elem != selectedLine ) {
        inactiveRow( elem );
    }
}

function isEmptyString( s ) {
    if ( s == null ) return true;
    if ( s.trim().length == 0 ) return true;
    return false;
}




