/*

  (c) 2006 TUFaT.com. All Rights Reserved

*/

/*
  IE HACK: IE doesn't has Node object :(
*/

if (! window["Node"]) {
  window.Node = new Object ();
  Node.ELEMENT_NODE = 1;
  Node.ATTRIBUTE_NODE = 2;
  Node.TEXT_NODE = 3;
  Node.CDATA_SECTION_NODE = 4;
  Node.ENTITY_REFERENCE_NODE = 5;
  Node.ENTITY_NODE = 6;
  Node.PROCESSING_INSTRUCTION_NODE = 7;
  Node.COMMENT_NODE = 8;
  Node.DOCUMENT_NODE = 9;
  Node.DOCUMENT_TYPE_NODE = 10;
  Node.DOCUMENT_FRAGMENT_NODE = 11;
  Node.NOTATION_NODE = 12;
}

String.prototype.trim = function () { return this.replace (/^\s+|\s+$/g, ""); };

function dec2hex (d) {
  var hD = "0123456789ABCDEF";
  var h = hD.substr (d & 15, 1);

  if (d <= 15)
    h = "0" + h;

  while (d > 15) {
    d >>= 4;
    h = hD.substr (d & 15, 1) + h;
  }

  return h;
}

function hex2dec (h) {
  return parseInt (h, 16);
}

function fixHexColorValue (hexValue) {
  while (hexValue.length < 6)
    hexValue = "0" + hexValue;

  return hexValue;
}

/* debug Window construction */
DEBUG = 0;
if (DEBUG == 1)
  dWin = window.open ("", null, "width = 640, height = 480, scrollbars = yes");
else
  dWin = null;

function writeDebug (message) {
  if (dWin != null) {
    var msg = message//.replace (/</g, "&lt;").replace (/>/g, "&gt;");
    dWin.document.writeln ("<div style='border: 1px solid red; margin: 4px;'>" + msg + "</div>");
  }
}

function ismaxlength(obj){
	var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : "";
	if (obj.getAttribute && obj.value.length>mlength)
		obj.value=obj.value.substring(0,mlength)
}

function browserISIE () {
  if (navigator.userAgent.match (/msie/i)) {
    return true;
  }
  else {
    return false;
  }
}

function browserISIE7 () {
  if (navigator.userAgent.match (/msie 7/i)) {
    return true;
  }
  else {
    return false;
  }
}

function getBrowser () {
  var UA = navigator.userAgent;
  var browserType = 0;

  if (UA.match (/khtml/i) != null)
    browserType = 1;
  else if (UA.match (/gecko/i) != null)
    browserType = 2;
  else if (UA.match (/opera/i) != null)
    browserType = 3;
  else if (UA.match (/msie/i) != null)
    browserType = 4;

 // alert ("browserType: " + browserType);
  return browserType;
}

function crossBrowserXMLDoc () {
/*

  (c) 2006 Claudiu Cismaru (claudiu AT cnixs DOT com)

  This function is released under GNU GPL v2 licence.

*/

  this.xmlDoc = null;
  this.hasLoadXML = false;

  if (window.ActiveXObject) {
    this.xmlDoc = new ActiveXObject ("Microsoft.XMLDOM");
    this.hasLoadXML = true;
  }
  else if (document.implementation && document.implementation.createDocument) {
    this.xmlDoc = document.implementation.createDocument ("", "", null);
    this.hasLoadXML = this.xmlDoc.loadXML ? true : false;
  }

  if (! this.hasLoadXML) {
    var xmlParser = new DOMParser ();
    if (xmlParser)
      this.xmlDoc = xmlParser;
    else
      this.xmlDoc = null;
  }
	
  this.parseXMLString = function (string) {
    if (! this.xmlDoc)
      return;
    if (this.hasLoadXML) {
      this.xmlDoc.loadXML (string);
      return this.xmlDoc;
    }
    else
      return this.xmlDoc.parseFromString (string, "text/xml");
  }
}

function unescapeHTML (string) {
  var newString = string.replace (/&gt;/g, ">");
  newString = newString.replace (/&lt;/g, "<");
  newString = newString.replace (/&amp;/g, "&");
  //newString = newString.replace (/\ /g, "&nbsp;");
  newString = newString.replace(/  /g,"&nbsp;&nbsp;");  
  return newString;
}

function escapeHTML (string) {
  var newString = string.replace (/&/g, "&amp;");
  newString = newString.replace (/>/g, "&gt;");
  newString = newString.replace (/</g, "&lt;");  
  return newString;
}


function stringSplit (token, inputStr) {

  var result = new Array ();
  var tokpos = -1;

  while ((tokpos = inputStr.indexOf (token)) >= 0) {
    result.push (inputStr.substr (0, tokpos));
    inputStr = inputStr.substr (tokpos + token.length)
  }

  if (inputStr.length > 0)
    result.push (inputStr);

  return (result);
}

function getUnixTimestamp () {
  var d = new Date ();
  return (Math.round (d.getTime () / 1000));
}

function findStrInArrayByKey (strToFind, array, arrayKey) {
  var foundKey = null;

  var quotedString = strToFind.match (/"(.*)"/);

  if (quotedString != null)
    var findString = quotedString[1];
  else
    var findString = strToFind;

  for (key in array) {
    if (array[key] == null)
      continue;

    if (array[key][arrayKey].toString ().toLowerCase () == findString.toLowerCase ())
      foundKey = key;
  }

  return (foundKey);
}

function printElement (node) {
  var str = "";
  for (i in node)
    str += i + ": " + node[i] + "<br />\n";

  writeDebug (str);
}

function createCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}

function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

function isArray(a) {
    return isObject(a) && a.constructor == Array;
}

function RGBColor(color_string)
{
    this.ok = false;

    // strip any leading #
    if (color_string.charAt(0) == '#') { // remove # if any
        color_string = color_string.substr(1,6);
    }

    color_string = color_string.replace(/ /g,'');
    color_string = color_string.toLowerCase();

    // before getting into regexps, try simple matches
    // and overwrite the input
    var simple_colors = {
        aliceblue: 'f0f8ff',
        antiquewhite: 'faebd7',
        aqua: '00ffff',
        aquamarine: '7fffd4',
        azure: 'f0ffff',
        beige: 'f5f5dc',
        bisque: 'ffe4c4',
        black: '000000',
        blanchedalmond: 'ffebcd',
        blue: '0000ff',
        blueviolet: '8a2be2',
        brown: 'a52a2a',
        burlywood: 'deb887',
        cadetblue: '5f9ea0',
        chartreuse: '7fff00',
        chocolate: 'd2691e',
        coral: 'ff7f50',
        cornflowerblue: '6495ed',
        cornsilk: 'fff8dc',
        crimson: 'dc143c',
        cyan: '00ffff',
        darkblue: '00008b',
        darkcyan: '008b8b',
        darkgoldenrod: 'b8860b',
        darkgray: 'a9a9a9',
        darkgreen: '006400',
        darkkhaki: 'bdb76b',
        darkmagenta: '8b008b',
        darkolivegreen: '556b2f',
        darkorange: 'ff8c00',
        darkorchid: '9932cc',
        darkred: '8b0000',
        darksalmon: 'e9967a',
        darkseagreen: '8fbc8f',
        darkslateblue: '483d8b',
        darkslategray: '2f4f4f',
        darkturquoise: '00ced1',
        darkviolet: '9400d3',
        deeppink: 'ff1493',
        deepskyblue: '00bfff',
        dimgray: '696969',
        dodgerblue: '1e90ff',
        feldspar: 'd19275',
        firebrick: 'b22222',
        floralwhite: 'fffaf0',
        forestgreen: '228b22',
        fuchsia: 'ff00ff',
        gainsboro: 'dcdcdc',
        ghostwhite: 'f8f8ff',
        gold: 'ffd700',
        goldenrod: 'daa520',
        gray: '808080',
        green: '008000',
        greenyellow: 'adff2f',
        honeydew: 'f0fff0',
        hotpink: 'ff69b4',
        indianred : 'cd5c5c',
        indigo : '4b0082',
        ivory: 'fffff0',
        khaki: 'f0e68c',
        lavender: 'e6e6fa',
        lavenderblush: 'fff0f5',
        lawngreen: '7cfc00',
        lemonchiffon: 'fffacd',
        lightblue: 'add8e6',
        lightcoral: 'f08080',
        lightcyan: 'e0ffff',
        lightgoldenrodyellow: 'fafad2',
        lightgrey: 'd3d3d3',
        lightgreen: '90ee90',
        lightpink: 'ffb6c1',
        lightsalmon: 'ffa07a',
        lightseagreen: '20b2aa',
        lightskyblue: '87cefa',
        lightslateblue: '8470ff',
        lightslategray: '778899',
        lightsteelblue: 'b0c4de',
        lightyellow: 'ffffe0',
        lime: '00ff00',
        limegreen: '32cd32',
        linen: 'faf0e6',
        magenta: 'ff00ff',
        maroon: '800000',
        mediumaquamarine: '66cdaa',
        mediumblue: '0000cd',
        mediumorchid: 'ba55d3',
        mediumpurple: '9370d8',
        mediumseagreen: '3cb371',
        mediumslateblue: '7b68ee',
        mediumspringgreen: '00fa9a',
        mediumturquoise: '48d1cc',
        mediumvioletred: 'c71585',
        midnightblue: '191970',
        mintcream: 'f5fffa',
        mistyrose: 'ffe4e1',
        moccasin: 'ffe4b5',
        navajowhite: 'ffdead',
        navy: '000080',
        oldlace: 'fdf5e6',
        olive: '808000',
        olivedrab: '6b8e23',
        orange: 'ffa500',
        orangered: 'ff4500',
        orchid: 'da70d6',
        palegoldenrod: 'eee8aa',
        palegreen: '98fb98',
        paleturquoise: 'afeeee',
        palevioletred: 'd87093',
        papayawhip: 'ffefd5',
        peachpuff: 'ffdab9',
        peru: 'cd853f',
        pink: 'ffc0cb',
        plum: 'dda0dd',
        powderblue: 'b0e0e6',
        purple: '800080',
        red: 'ff0000',
        rosybrown: 'bc8f8f',
        royalblue: '4169e1',
        saddlebrown: '8b4513',
        salmon: 'fa8072',
        sandybrown: 'f4a460',
        seagreen: '2e8b57',
        seashell: 'fff5ee',
        sienna: 'a0522d',
        silver: 'c0c0c0',
        skyblue: '87ceeb',
        slateblue: '6a5acd',
        slategray: '708090',
        snow: 'fffafa',
        springgreen: '00ff7f',
        steelblue: '4682b4',
        tan: 'd2b48c',
        teal: '008080',
        thistle: 'd8bfd8',
        tomato: 'ff6347',
        turquoise: '40e0d0',
        violet: 'ee82ee',
        violetred: 'd02090',
        wheat: 'f5deb3',
        white: 'ffffff',
        whitesmoke: 'f5f5f5',
        yellow: 'ffff00',
        yellowgreen: '9acd32'
    };
    for (var key in simple_colors) {
        if (color_string == key) {
            color_string = simple_colors[key];
        }
    }
    // emd of simple type-in colors

    // array of color definition objects
    var color_defs = [
        {
            re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
            process: function (bits){
                return [
                    parseInt(bits[1]),
                    parseInt(bits[2]),
                    parseInt(bits[3])
                ];
            }
        },
        {
            re: /^(\w{2})(\w{2})(\w{2})$/,
            example: ['#00ff00', '336699'],
            process: function (bits){
                return [
                    parseInt(bits[1], 16),
                    parseInt(bits[2], 16),
                    parseInt(bits[3], 16)
                ];
            }
        },
        {
            re: /^(\w{1})(\w{1})(\w{1})$/,
            example: ['#fb0', 'f0f'],
            process: function (bits){
                return [
                    parseInt(bits[1] + bits[1], 16),
                    parseInt(bits[2] + bits[2], 16),
                    parseInt(bits[3] + bits[3], 16)
                ];
            }
        }
    ];

    // search through the definitions to find a match
    for (var i = 0; i < color_defs.length; i++) {
        var re = color_defs[i].re;
        var processor = color_defs[i].process;
        var bits = re.exec(color_string);
        if (bits) {
            channels = processor(bits);
            this.r = channels[0];
            this.g = channels[1];
            this.b = channels[2];
            this.ok = true;
        }

    }

    // validate/cleanup values
    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);

    // some getters
    this.toRGB = function () {
        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
    }
    this.toHex = function () {
        var r = this.r.toString(16);
        var g = this.g.toString(16);
        var b = this.b.toString(16);
        if (r.length == 1) r = '0' + r;
        if (g.length == 1) g = '0' + g;
        if (b.length == 1) b = '0' + b;
        return '#' + r + g + b;
    }

    // help
    this.getHelpXML = function () {

        var examples = new Array();
        // add regexps
        for (var i = 0; i < color_defs.length; i++) {
            var example = color_defs[i].example;
            for (var j = 0; j < example.length; j++) {
                examples[examples.length] = example[j];
            }
        }
        // add type-in colors
        for (var sc in simple_colors) {
            examples[examples.length] = sc;
        }

        var xml = document.createElement('ul');
        xml.setAttribute('id', 'rgbcolor-examples');
        for (var i = 0; i < examples.length; i++) {
            try {
                var list_item = document.createElement('li');
                var list_color = new RGBColor(examples[i]);
                var example_div = document.createElement('div');
                example_div.style.cssText =
                        'margin: 3px; '
                        + 'border: 1px solid black; '
                        + 'background:' + list_color.toHex() + '; '
                        + 'color:' + list_color.toHex()
                ;
                example_div.appendChild(document.createTextNode('test'));
                var list_item_value = document.createTextNode(
                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
                );
                list_item.appendChild(example_div);
                list_item.appendChild(list_item_value);
                xml.appendChild(list_item);

            } catch(e){}
        }
        return xml;

    }

}
