/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


/**
   File Name:          15.5.4.11-2.js
   ECMA Section:       15.5.4.11 String.prototype.toLowerCase()
   Description:

   Returns a string equal in length to the length of the result of converting
   this object to a string. The result is a string value, not a String object.

   Every character of the result is equal to the corresponding character of the
   string, unless that character has a Unicode 2.0 uppercase equivalent, in which
   case the uppercase equivalent is used instead. (The canonical Unicode 2.0 case
   mapping shall be used, which does not depend on implementation or locale.)

   Note that the toLowerCase function is intentionally generic; it does not require
   that its this value be a String object. Therefore it can be transferred to other
   kinds of objects for use as a method.

   Author:             christine@netscape.com
   Date:               12 november 1997
*/

var SECTION = "15.5.4.11-2";
var VERSION = "ECMA_1";
startTest();
var TITLE   = "String.prototype.toLowerCase()";

writeHeaderToLog( SECTION + " "+ TITLE);

// Hiragana (no upper / lower case)
// Range: U+3040 to U+309F

for ( var i = 0x3040; i <= 0x309F; i++ ) {
  var U = new Unicode( i );
/*
  new TestCase(   SECTION,
  "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()",
  String.fromCharCode(U.lower),
  eval("var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()") );
*/
  new TestCase(   SECTION,
		  "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase().charCodeAt(0)",
		  U.lower,
		  eval("var s = new String( String.fromCharCode(i) ); s.toLowerCase().charCodeAt(0)") );
}

test();

function MyObject( value ) {
  this.value = value;
  this.substring = String.prototype.substring;
  this.toString = new Function ( "return this.value+''" );
}
function Unicode( c ) {
  this.upper = c;
  this.lower = c;

  // upper case Basic Latin

  if ( c >= 0x0041 && c <= 0x005A) {
    this.upper = c;
    this.lower = c + 32;
    return this;
  }

  // lower case Basic Latin
  if ( c >= 0x0061 && c <= 0x007a ) {
    this.upper = c - 32;
    this.lower = c;
    return this;
  }

  // upper case Latin-1 Supplement
  if ( (c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE) ) {
    this.upper = c;
    this.lower = c + 32;
    return this;
  }

  // lower case Latin-1 Supplement
  if ( (c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE) ) {
    this.upper = c - 32;
    this.lower = c;
    return this;
  }
  if ( c == 0x00FF ) {
    this.upper = 0x0178;
    this.lower = c;
    return this;
  }
  // Latin Extended A
  if ( (c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178) ) {
    // special case for capital I
    if ( c == 0x0130 ) {
      this.upper = c;
      this.lower = 0x0069;
      return this;
    }
    if ( c == 0x0131 ) {
      this.upper = 0x0049;
      this.lower = c;
      return this;
    }

    if ( c % 2 == 0 ) {
      // if it's even, it's a capital and the lower case is c +1
      this.upper = c;
      this.lower = c+1;
    } else {
      // if it's odd, it's a lower case and upper case is c-1
      this.upper = c-1;
      this.lower = c;
    }
    return this;
  }
  if ( c == 0x0178 ) {
    this.upper = c;
    this.lower = 0x00FF;
    return this;
  }

  if ( (c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F) ) {
    if ( c % 2 == 1 ) {
      // if it's odd, it's a capital and the lower case is c +1
      this.upper = c;
      this.lower = c+1;
    } else {
      // if it's even, it's a lower case and upper case is c-1
      this.upper = c-1;
      this.lower = c;
    }
    return this;
  }
  if ( c == 0x017F ) {
    this.upper = 0x0053;
    this.lower = c;
  }

  // Latin Extended B
  // need to improve this set

  if ( c >= 0x0200 && c <= 0x0217 ) {
    if ( c % 2 == 0 ) {
      this.upper = c;
      this.lower = c+1;
    } else {
      this.upper = c-1;
      this.lower = c;
    }
    return this;
  }

  // Latin Extended Additional
  // Range: U+1E00 to U+1EFF
  // http://www.unicode.org/Unicode.charts/glyphless/U1E00.html

  // Spacing Modifier Leters
  // Range: U+02B0 to U+02FF

  // Combining Diacritical Marks
  // Range: U+0300 to U+036F

  // skip Greek for now
  // Greek
  // Range: U+0370 to U+03FF

  // Cyrillic
  // Range: U+0400 to U+04FF

  if ( (c >= 0x0401 && c <= 0x040C) || ( c>= 0x040E && c <= 0x040F ) ) {
    this.upper = c;
    this.lower = c + 80;
    return this;
  }


  if ( c >= 0x0410  && c <= 0x042F ) {
    this.upper = c;
    this.lower = c + 32;
    return this;
  }

  if ( c >= 0x0430 && c<= 0x044F ) {
    this.upper = c - 32;
    this.lower = c;
    return this;

  }
  if ( (c >= 0x0451 && c <= 0x045C) || (c >=0x045E && c<= 0x045F) ) {
    this.upper = c -80;
    this.lower = c;
    return this;
  }

  if ( c >= 0x0460 && c <= 0x047F ) {
    if ( c % 2 == 0 ) {
      this.upper = c;
      this.lower = c +1;
    } else {
      this.upper = c - 1;
      this.lower = c;
    }
    return this;
  }

  // Armenian
  // Range: U+0530 to U+058F
  if ( c >= 0x0531 && c <= 0x0556 ) {
    this.upper = c;
    this.lower = c + 48;
    return this;
  }
  if ( c >= 0x0561 && c < 0x0587 ) {
    this.upper = c - 48;
    this.lower = c;
    return this;
  }

  // Hebrew
  // Range: U+0590 to U+05FF


  // Arabic
  // Range: U+0600 to U+06FF

  // Devanagari
  // Range: U+0900 to U+097F


  // Bengali
  // Range: U+0980 to U+09FF


  // Gurmukhi
  // Range: U+0A00 to U+0A7F


  // Gujarati
  // Range: U+0A80 to U+0AFF


  // Oriya
  // Range: U+0B00 to U+0B7F
  // no capital / lower case


  // Tamil
  // Range: U+0B80 to U+0BFF
  // no capital / lower case


  // Telugu
  // Range: U+0C00 to U+0C7F
  // no capital / lower case


  // Kannada
  // Range: U+0C80 to U+0CFF
  // no capital / lower case


  // Malayalam
  // Range: U+0D00 to U+0D7F

  // Thai
  // Range: U+0E00 to U+0E7F


  // Lao
  // Range: U+0E80 to U+0EFF


  // Tibetan
  // Range: U+0F00 to U+0FBF

  // Georgian
  // Range: U+10A0 to U+10F0
  if ( c >= 0x10A0 && c <= 0x10C5 ) {
    this.upper = c;
    this.lower = c + 48;
    return this;
  }
  if ( c >= 0x10D0 && c <= 0x10F5 ) {
    this.upper = c;
    this.lower = c;
    return this;
  }

  // Hangul Jamo
  // Range: U+1100 to U+11FF

  // Greek Extended
  // Range: U+1F00 to U+1FFF
  // skip for now


  // General Punctuation
  // Range: U+2000 to U+206F

  // Superscripts and Subscripts
  // Range: U+2070 to U+209F

  // Currency Symbols
  // Range: U+20A0 to U+20CF


  // Combining Diacritical Marks for Symbols
  // Range: U+20D0 to U+20FF
  // skip for now


  // Number Forms
  // Range: U+2150 to U+218F
  // skip for now


  // Arrows
  // Range: U+2190 to U+21FF

  // Mathematical Operators
  // Range: U+2200 to U+22FF

  // Miscellaneous Technical
  // Range: U+2300 to U+23FF

  // Control Pictures
  // Range: U+2400 to U+243F

  // Optical Character Recognition
  // Range: U+2440 to U+245F

  // Enclosed Alphanumerics
  // Range: U+2460 to U+24FF

  // Box Drawing
  // Range: U+2500 to U+257F

  // Block Elements
  // Range: U+2580 to U+259F

  // Geometric Shapes
  // Range: U+25A0 to U+25FF

  // Miscellaneous Symbols
  // Range: U+2600 to U+26FF

  // Dingbats
  // Range: U+2700 to U+27BF

  // CJK Symbols and Punctuation
  // Range: U+3000 to U+303F

  // Hiragana
  // Range: U+3040 to U+309F

  // Katakana
  // Range: U+30A0 to U+30FF

  // Bopomofo
  // Range: U+3100 to U+312F

  // Hangul Compatibility Jamo
  // Range: U+3130 to U+318F

  // Kanbun
  // Range: U+3190 to U+319F


  // Enclosed CJK Letters and Months
  // Range: U+3200 to U+32FF

  // CJK Compatibility
  // Range: U+3300 to U+33FF

  // Hangul Syllables
  // Range: U+AC00 to U+D7A3

  // High Surrogates
  // Range: U+D800 to U+DB7F

  // Private Use High Surrogates
  // Range: U+DB80 to U+DBFF

  // Low Surrogates
  // Range: U+DC00 to U+DFFF

  // Private Use Area
  // Range: U+E000 to U+F8FF

  // CJK Compatibility Ideographs
  // Range: U+F900 to U+FAFF

  // Alphabetic Presentation Forms
  // Range: U+FB00 to U+FB4F

  // Arabic Presentation Forms-A
  // Range: U+FB50 to U+FDFF

  // Combining Half Marks
  // Range: U+FE20 to U+FE2F

  // CJK Compatibility Forms
  // Range: U+FE30 to U+FE4F

  // Small Form Variants
  // Range: U+FE50 to U+FE6F

  // Arabic Presentation Forms-B
  // Range: U+FE70 to U+FEFF

  // Halfwidth and Fullwidth Forms
  // Range: U+FF00 to U+FFEF

  if ( c >= 0xFF21 && c <= 0xFF3A ) {
    this.upper = c;
    this.lower = c + 32;
    return this;
  }

  if ( c >= 0xFF41 && c <= 0xFF5A ) {
    this.upper = c - 32;
    this.lower = c;
    return this;
  }

  // Specials
  // Range: U+FFF0 to U+FFFF

  return this;
}

function DecimalToHexString( n ) {
  n = Number( n );
  var h = "0x";

  for ( var i = 3; i >= 0; i-- ) {
    if ( n >= Math.pow(16, i) ){
      var t = Math.floor( n  / Math.pow(16, i));
      n -= t * Math.pow(16, i);
      if ( t >= 10 ) {
	if ( t == 10 ) {
	  h += "A";
	}
	if ( t == 11 ) {
	  h += "B";
	}
	if ( t == 12 ) {
	  h += "C";
	}
	if ( t == 13 ) {
	  h += "D";
	}
	if ( t == 14 ) {
	  h += "E";
	}
	if ( t == 15 ) {
	  h += "F";
	}
      } else {
	h += String( t );
      }
    } else {
      h += "0";
    }
  }

  return h;
}
