CommonLib = {};

CommonLib.getRequestObject = function() {
   if(window.XMLHttpRequest) {
      return new XMLHttpRequest();
   }
   if(window.ActiveXObject) {
      try {
         return new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try {
            return new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }
   return null;
}

CommonLib.parseElement = function(xml, tag) {
   var start_tag = '<'  + tag + '>';
   var end_tag   = '</' + tag + '>';
   var start_index;
   var end_index;
   var content;
   if((start_index = xml.indexOf(start_tag)) < 0) { return ''; }
   if((end_index = xml.indexOf(end_tag)) < 0) { return ''; }
   content = xml.substring(start_index, end_index + end_tag.length);
   content = content.replace(start_tag, '');
   content = content.replace(end_tag, '');
   content = content.replace(/^\s+|\s+$/g,"");
   return content;
}

CommonLib.parseElements = function(xml, tag) {
   var elements   = new Array();
   var start_tag  = '<'  + tag + '>';
   var end_tag    = '</' + tag + '>';
   var element;
   var start_index;
   var end_index;
   while((start_index = xml.indexOf(start_tag)) >= 0) {
      end_index = xml.indexOf(end_tag);
      if(end_index < 0) { break; }
      element = xml.substring(start_index, end_index + end_tag.length);
      xml = xml.substring(end_index + end_tag.length, xml.length);
      elements[elements.length] = element;
   }
   return elements;
}

CommonLib.createCookie = function(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=/';
}

CommonLib.readCookie = function(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;
}

CommonLib.eraseCookie = function(name) {
   CommonLib.createCookie(name,"",-1);
}

CommonLib.isValidEmail = function(email) {
   return email.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/) ? true : false;
}

CommonLib.isLeapYear = function(yr) {
   return new Date(yr,2-1,29).getDate()==29;
}

CommonLib.randomize = function(limit) {
   return Math.floor(Math.random()*limit);
}

CommonLib.hashcode = function(key, range) {
   key = new String(key);
   var sum = 0;
   for(var i=0; i<key.length; i++) {
       sum = 331 * sum + key.charCodeAt(i);
   }
   return Math.abs(sum % range);
}

CommonLib.hash256 = function(string) {
   return CommonLib.hashcode(string, 256);
}


CommonLib.hexdecode = function(string) {
   var temp = '';
   while(string.length) {
      var hex = string.substr(0, 2);
      string  = string.substr(2);
      var ord = parseInt(hex, 16);
      temp += String.fromCharCode(ord)
   }
   return temp;
}

CommonLib.hexencode = function(string) {
   var temp = '';
   for(i=0; i<string.length; i++) {
      temp += string.charCodeAt(i).toString(16).toUpperCase();
   }
   return temp;
}

CommonLib.comify = function(n) {
   n = new String(n);
   comified = '';
   while(n.length > 3) {
      comified = n.substring(n.length -3) + comified;
      n = n.substring(0, n.length-3);
      if(n.length) { comified = ',' + comified; }
   }
   if(n.length) { comified = n + comified; }
   return comified;
}

CommonLib.ucaseFirst = function(string) {
   if(!string.length) { return; }
   string = string.toLowerCase();
   if(string.length == 1) { return string.toUpperCase(); }
   return (string.substring(0, 1)).toUpperCase() + string.substring(1);
}

CommonLib.capitalize = function(string) {
   var words = string.split(/\s+/);
   string    = '';
   for(var i=0; i<words.length; i++) {
      string += ucaseFirst(words[i]);
      if(i < words.length -1) { string += ' '; }
   }
   return string;
}

CommonLib.forceASCII = function(instr) {
   outstr = "";
   for(var i=0; i<instr.length; i++) {
      var c = instr.charCodeAt(i);
      if(c == 10 || (c > 31 && c < 127)) {
         outstr += instr.charAt(i);
      }
   }
   return outstr;
}

CommonLib.uniqid = function(prefix, more_entropy) {
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: Kankrelune (http://www.webfaktory.info/)
    // %        note 1: Uses an internal counter (in php_js global) to avoid collision
    // *     example 1: uniqid();
    // *     returns 1: 'a30285b160c14'
    // *     example 2: uniqid('foo');
    // *     returns 2: 'fooa30285b1cd361'
    // *     example 3: uniqid('bar', true);
    // *     returns 3: 'bara20285b23dfd1.31879087'

    if (typeof prefix == 'undefined') {
        prefix = "";
    }

    var retId;
    var formatSeed = function (seed, reqWidth) {
        seed = parseInt(seed,10).toString(16); // to hex str
        if (reqWidth < seed.length) { // so long we split
            return seed.slice(seed.length - reqWidth);
        }
        if (reqWidth > seed.length) { // so short we pad
            return Array(1 + (reqWidth - seed.length)).join('0')+seed;
        }
        return seed;
    };

    // BEGIN REDUNDANT
    if (!this.php_js) {
        this.php_js = {};
    }
    // END REDUNDANT
    if (!this.php_js.uniqidSeed) { // init seed with big random int
        this.php_js.uniqidSeed = Math.floor(Math.random() * 0x75bcd15);
    }
    this.php_js.uniqidSeed++;

    retId  = prefix; // start with prefix, add current milliseconds hex string
    retId += formatSeed(parseInt(new Date().getTime()/1000,10),8);
    retId += formatSeed(this.php_js.uniqidSeed,5); // add seed hex string

    if (more_entropy) {
        // for more entropy we add a float lower to 10
        retId += (Math.random()*10).toFixed(8).toString();
    }

    return retId;
}


CommonLib.timeElapsed = function(time, verbose) {
   var days    = parseInt((time / (3600 * 24)));
   time        = time % (3600 * 24);
   var hours   = parseInt((time / 3600));
   time        = time % 3600;
   var minutes = parseInt((time / 60));
   var seconds = time % 60;
   var string  = '';
   if(days > 0)    { string += days     + " D, "; }
   if(hours > 0)   { string += hours    + " H, "; }
   if(minutes > 0) { string += minutes  + " M, "; }
   if(seconds > 0) { string += seconds + " S, "; }
   string = string.replace(/,\s+$/, '')
   if(!verbose) { return string; }
   if(days == 1)        { string = string.replace(/1\s+D/, '1 Day'); }
   else if(days > 1)    { string = string.replace(/[0-9]+\s+D/, days + " Days"); }
   if(hours == 1)       { string = string.replace(/1\s+H/, '1 Hour'); }
   else if(hours > 1)   { string = string.replace(/[0-9]+\s+H/, hours + " Hours"); }
   if(minutes == 1)     { string = string.replace(/1\s+M/, '1 Minute'); }
   else if(minutes > 1) { string = string.replace(/[0-9]+\s+M/, minutes + " Minutes"); }
   if(seconds == 1)     { string = string.replace(/1\s+S/, '1 Second'); }
   else if(seconds > 1) { string = string.replace(/[0-9]+\s+S/, seconds + " Seconds"); }
   return string
}

CommonLib.php_serialize = function(obj) {
    var string = '';

    if (typeof(obj) == 'object') {
        if (obj instanceof Array) {
            string = 'a:';
            tmpstring = '';
            count = 0;
            for (var key in obj) {
                tmpstring += CommonLib.php_serialize(key);
                tmpstring += CommonLib.php_serialize(obj[key]);
                count++;
            }
            string += count + ':{';
            string += tmpstring;
            string += '}';
        } else if (obj instanceof Object) {
            /*
            classname = obj.toString();
            if (classname == '[object Object]') {
                classname = 'StdClass';
            }
            string = 'O:' + classname.length + ':"' + classname + '":';
            */

            // Below added by Horan, 2010-01-16, to replace above.
            string = 'a:';

            tmpstring = '';
            count = 0;
            for (var key in obj) {
                tmpstring += CommonLib.php_serialize(key);
                if (obj[key]) {
                    tmpstring += CommonLib.php_serialize(obj[key]);
                } else {
                    tmpstring += CommonLib.php_serialize('');
                }
                count++;
            }
            string += count + ':{' + tmpstring + '}';
        }
    } else {
        switch (typeof(obj)) {
            case 'number':
                if (obj - Math.floor(obj) != 0) {
                    string += 'd:' + obj + ';';
                } else {
                    string += 'i:' + obj + ';';
                }
                break;
            case 'string':
                string += 's:' + obj.length + ':"' + obj + '";';
                break;
            case 'boolean':
                if (obj) {
                    string += 'b:1;';
                } else {
                    string += 'b:0;';
                }
                break;
        }
    }
    return string;
}

/**
 * Function : dump()
 * Arguments: The data - array,hash(associative array),object
 *    The level - OPTIONAL
 * Returns  : The textual representation of the array.
 * This function was inspired by the print_r function of PHP.
 * This will accept some data as the argument and return a
 * text that will be a more readable version of the
 * array/hash/object that is given.
 * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
 */
function dump(arr,level) {
        var dumped_text = "";
        if(!level) level = 0;

        //The padding given at the beginning of the line.
        var level_padding = "";
        for(var j=0;j<level+1;j++) level_padding += "    ";

        if(typeof(arr) == 'object') { //Array/Hashes/Objects
                for(var item in arr) {
                        var value = arr[item];

                        if(typeof(value) == 'object') { //If it is an array,
                                dumped_text += level_padding + "'" + item + "' ...\n";
                                dumped_text += dump(value,level+1);
                        } else {
                                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
                        }
                }
        } else { //Stings/Chars/Numbers etc.
                dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
        }
        return dumped_text;
}

/**
	 * Concatenates the values of a variable into an easily readable string
	 * by Matt Hackett [scriptnode.com]
	 * @param {Object} x The variable to debug
	 * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10]
	 * @param {String} sep The separator to use between [default: a single space ' ']
	 * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it's for the function's own use
*/ 

function var_dump(x, max, sep, l) { 
	 
	    l = l || 0; 
	    max = max || 10; 
	    sep = sep || '  '; 
	 
	    if (l > max) { 
	        return "[WARNING: Too much recursion]\n"; 
	    } 
	 
	    var 
	        i, 
	        r = '', 
	        t = typeof x, 
	        tab = ''; 
	 
	    if (x === null) { 
	        r += "(null)\n"; 
	    } else if (t == 'object') { 
	 
	        l++; 
	 
	        for (i = 0; i < l; i++) { 
	            tab += sep; 
	        } 
	 
	        if (x && x.length) { 
	            t = 'array'; 
	        } 
	 
	        r += '(' + t + ") :\n"; 
	 
	        for (i in x) { 
	            try { 
	                r += tab + '[' + i + '] : ' + var_dump(x[i], max, sep, (l + 1)); 
	            } catch(e) { 
	                return "[ERROR: " + e + "]\n"; 
	            } 
	        } 
	 
	    } else { 
	 
	        if (t == 'string') { 
	            if (x == '') { 
	                x = '(empty)'; 
	            } 
	        } 
	 
	        r += '(' + t + ') ' + x + "\n"; 
	 
	    } 
	 
	    return r; 
	 
	}; 

Settings = {};

Settings.parse = function(settings) {
   var pairs = settings.split(/\|/);
   settings  = {};
   for(var i=0; i<pairs.length; i++) {
      if(!pairs[i]) { continue; }
      pair = pairs[i].split(/=/);
      if(pair.length == 2) {
         settings[pair[0]] = pair[1]; 
      } else {
         settings[pair[0]] = '';
      }
   }
   return settings;
}

Settings.stringify = function(settings) {
   var string = '';
   for(var i in settings) {
      string += i + '=' + settings[i] + '|';
   }
   string = string.replace(/\|$/, '');
   return string;
}

Settings.set = function(name, value) {
   var settings = CommonLib.readCookie('settings');
   if(!settings) { settings = ''; }
   settings = Settings.parse(settings);
   settings[name] = value;
   settings = Settings.stringify(settings);
   CommonLib.createCookie('settings', settings, 0);
}

