/* 
 * More info at: http://phpjs.org
 * 
 * This is version: 3.19
 * php.js is copyright 2010 Kevin van Zonneveld.
 * 
 * Portions copyright Brett Zamir (http://brett-zamir.me), Kevin van Zonneveld
 * (http://kevin.vanzonneveld.net), Onno Marsman, Theriault, Michael White
 * (http://getsprink.com), Waldo Malqui Silva, Paulo Freitas, Jack, Jonas
 * Raoni Soares Silva (http://www.jsfromhell.com), Philip Peterson, Legaev
 * Andrey, Ates Goral (http://magnetiq.com), Alex, Ratheous, Martijn Wieringa,
 * lmeyrick (https://sourceforge.net/projects/bcmath-js/), Nate, Philippe
 * Baumann, Enrique Gonzalez, Webtoolkit.info (http://www.webtoolkit.info/),
 * Ole Vrijenhoek, Ash Searle (http://hexmen.com/blog/), travc, Jani
 * Hartikainen, Carlos R. L. Rodrigues (http://www.jsfromhell.com), WebDevHobo
 * (http://webdevhobo.blogspot.com/), stag019, Rafał Kukawski
 * (http://blog.kukawski.pl), GeekFG (http://geekfg.blogspot.com), pilus,
 * Rafał Kukawski (http://blog.kukawski.pl/), T.Wild, Erkekjetter,
 * http://stackoverflow.com/questions/57803/how-to-convert-decimal-to-hex-in-javascript,
 * Johnny Mast (http://www.phpvrouwen.nl), Michael Grier, marrtins, Andrea
 * Giammarchi (http://webreflection.blogspot.com), d3x, AJ, Joris, Steven
 * Levithan (http://blog.stevenlevithan.com), Paul Smith, Arpad Ray
 * (mailto:arpad@php.net), Tim de Koning (http://www.kingsquare.nl),
 * gettimeofday, majak, mdsjack (http://www.mdsjack.bo.it), Felix
 * Geisendoerfer (http://www.debuggable.com/felix), Kevin van Zonneveld
 * (http://kevin.vanzonneveld.net/), Martin (http://www.erlenwiese.de/),
 * KELAN, Oleg Eremeev, Public Domain (http://www.json.org/json2.js), Karol
 * Kowalski, David, Imgen Tata (http://www.myipdf.com/), Robin, Michael White,
 * felix, Breaking Par Consulting Inc
 * (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CFB006C45F7),
 * Josh Fraser
 * (http://onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/),
 * Marc Palau, Chris, Mailfaker (http://www.weedem.fr/), Mirek Slugen, Lars
 * Fischer, Tyler Akins (http://rumkin.com), Alfonso Jimenez
 * (http://www.alfonsojimenez.com), Thunder.m, Caio Ariede
 * (http://caioariede.com), Pellentesque Malesuada, Kankrelune
 * (http://www.webfaktory.info/), saulius, Aman Gupta, Steve Hilder, Diplom@t
 * (http://difane.com/), gorthaur, Sakimori, Nick Kolosov (http://sammy.ru),
 * ger, marc andreu, Fox, nobbler, Frank Forte, duncan, djmix, Douglas
 * Crockford (http://javascript.crockford.com), mktime, john
 * (http://www.jd-tech.net), Linuxworld, Lincoln Ramsay, lmeyrick
 * (https://sourceforge.net/projects/bcmath-js/this.), Arno, jmweb, date, Adam
 * Wallner (http://web2.bitbaro.hu/), paulo kuong, Itsacon
 * (http://www.itsacon.net/), Billy, vlado houba, Jalal Berrami, Francois,
 * Scott Cariss, sankai, Denny Wardhana, Nathan, Bayron Guevara, Oskar Larsson
 * Högfeldt (http://oskar-lh.name/), Slawomir Kaniecki, ReverseSyntax,
 * Mateusz "loonquawl" Zalega, noname, madipta, XoraX (http://www.xorax.info),
 * Soren Hansen, Ozh, 0m3r, echo is bad, merabi, Eugene Bulkin
 * (http://doubleaw.com/), Der Simon (http://innerdom.sourceforge.net/),
 * nord_ua, Subhasis Deb, David Randall, Bryan Elliott, Tim Wiel, Thomas
 * Beaucourt (http://www.webapp.fr), JT, T0bsn, Peter-Paul Koch
 * (http://www.quirksmode.org/js/beat.html), MeEtc (http://yass.meetcweb.com),
 * josh, JB, LH, Steve Clay, Jon Hohle, T. Wild, Thiago Mata
 * (http://thiagomata.blog.com), David James, Marco, Brad Touesnard,
 * class_exists, Ole Vrijenhoek (http://www.nervous.nl/), Raphael (Ao RUDLER),
 * Marc Jansen, Francesco, Stoyan Kyosev (http://www.svest.org/), J A R,
 * Sanjoy Roy, Shingo, Pyerre, Gilbert, kenneth, FremyCompany, stensi, Devan
 * Penner-Woelk, Saulo Vallory, Kristof Coomans (SCK-CEN Belgian Nucleair
 * Research Centre), Pierre-Luc Paour, Kirk Strobeck, Martin Pool, Christoph,
 * Daniel Esteban, Artur Tchernychev, uestla, Wagner B. Soares, Valentina De
 * Rosa, strftime, Jason Wong (http://carrot.org/), Brant Messenger
 * (http://www.brantmessenger.com/), Rick Waldron, Bug?, Blues
 * (http://tech.bluesmoon.info/), Bjorn Roesbeke
 * (http://www.bjornroesbeke.be/), Anton Ongson, Gabriel Paderni, Simon
 * Willison (http://simonwillison.net), Luke Godfrey, Pul, rezna, Mick@el,
 * Tomasz Wesolowski, Eric Nagel, Bobby Drake, Evertjan Garretsen, Alan C,
 * Taras Bogach, Ulrich, Zahlii, Yves Sucaet, sowberry, Norman "zEh" Fuchs,
 * hitwork, johnrembo, Brian Tafoya (http://www.premasolutions.com/), Nick
 * Callen, Steven Levithan (stevenlevithan.com), ejsanders, Scott Baker,
 * Philippe Jausions (http://pear.php.net/user/jausions), Aidan Lister
 * (http://aidanlister.com/), Rob, e-mike, ChaosNo1, Alexander Ermolaev
 * (http://snippets.dzone.com/user/AlexanderErmolaev), HKM, metjay, jpfle,
 * strcasecmp, strcmp, DxGx, James (http://www.james-bell.co.uk/), kilops,
 * Orlando, dptr1988, Le Torbi, Pedro Tainha (http://www.pedrotainha.com),
 * James, Marco van Oort, Philipp Lenssen, jakes, 3D-GRAF, Yannoo, gabriel
 * paderni, baris ozdil, FGFEmperor, daniel airton wermann
 * (http://wermann.com.br), Atli Þór, Howard Yeend, Diogo Resende, Allan
 * Jensen (http://www.winternet.no), Benjamin Lupton, Maximusya, davook, Greg
 * Frazier, Tod Gentille, Manish, Matt Bradley, Cord, fearphage
 * (http://http/my.opera.com/fearphage/), Matteo, Victor, taith, Tim de
 * Koning, Alexander M Beedie, Ryan W Tenney (http://ryan.10e.us), Riddler
 * (http://www.frontierwebdev.com/), T.J. Leahy, Luis Salazar
 * (http://www.freaky-media.com/), Rafał Kukawski, Rival, Luke Smith
 * (http://lucassmith.name), Russell Walker (http://www.nbill.co.uk/), Jamie
 * Beck (http://www.terabit.ca/), Garagoth, Andrej Pavlovic, Dino, Le Torbi
 * (http://www.letorbi.de/), DtTvB
 * (http://dt.in.th/2008-09-16.string-length-in-bytes.html), Andreas, Arnout
 * Kazemier (http://www.3rd-Eden.com), penutbutterjelly, Michael, setcookie,
 * Blues at http://hacks.bluesmoon.info/strftime/strftime.js, YUI Library:
 * http://developer.yahoo.com/yui/docs/YAHOO.util.DateLocale.html, rem, Josep
 * Sanz (http://www.ws3.es/), Cagri Ekin, Dreamer, Amirouche, Amir Habibi
 * (http://www.residence-mixte.com/), Kheang Hok Chin
 * (http://www.distantia.ca/), Jay Klehr, booeyOH, Ben Bryan, meo, William,
 * Greenseed, Yen-Wei Liu, Leslie Hoare, mk.keck
 * 
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL KEVIN VAN ZONNEVELD BE LIABLE FOR ANY CLAIM, DAMAGES
 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */ 


function max () {
    // Return the highest value in an array or a series of arguments  
    // 
    // version: 1009.2513
    // discuss at: http://phpjs.org/functions/max
    // +   original by: Onno Marsman
    // +    revised by: Onno Marsman
    // +    tweaked by: Jack
    // %          note: Long code cause we're aiming for maximum PHP compatibility
    // *     example 1: max(1, 3, 5, 6, 7);
    // *     returns 1: 7
    // *     example 2: max([2, 4, 5]);
    // *     returns 2: 5
    // *     example 3: max(0, 'hello');
    // *     returns 3: 0
    // *     example 4: max('hello', 0);
    // *     returns 4: 'hello'
    // *     example 5: max(-1, 'hello');
    // *     returns 5: 'hello'
    // *     example 6: max([2, 4, 8], [2, 5, 7]);
    // *     returns 6: [2, 5, 7]
    var ar, retVal, i = 0, n = 0;
    var argv = arguments, argc = argv.length;

    var _obj2Array = function (obj) {
        if (obj instanceof Array) {
            return obj;
        } else {
            var ar = [];
            for (var i in obj) {
                ar.push(obj[i]);
            }
            return ar;
        }
    }; //function _obj2Array
    
    var _compare = function (current, next) {
        var i = 0, n = 0, tmp = 0;
        var nl = 0, cl = 0;
        
        if (current === next) {
            return 0;
        } else if (typeof current == 'object') {
            if (typeof next == 'object') {
               current = _obj2Array(current);
               next    = _obj2Array(next);
               cl      = current.length;
               nl      = next.length;
               if (nl > cl) {
                   return 1;
               } else if (nl < cl) {
                   return -1;
               } else {
                   for (i = 0, n = cl; i<n; ++i) {
                       tmp = _compare(current[i], next[i]);
                       if (tmp == 1) {
                           return 1;
                       } else if (tmp == -1) {
                           return -1;
                       }
                   }
                   return 0;
               }
            } else {
               return -1;
            }
        } else if (typeof next == 'object') {
            return 1;
        } else if (isNaN(next) && !isNaN(current)) {
            if (current == 0) {
               return 0;
            } else {
               return (current<0 ? 1 : -1);
            }
        } else if (isNaN(current) && !isNaN(next)) {
            if (next==0) {
               return 0;
            } else {
               return (next>0 ? 1 : -1);
            }
        } else {
            if (next==current) {
               return 0;
            } else {
               return (next>current ? 1 : -1);
            }
        }
    }; //function _compare
    
    if (argc === 0) {
        throw new Error('At least one value should be passed to max()');
    } else if (argc === 1) {
        if (typeof argv[0] === 'object') {
            ar = _obj2Array(argv[0]);
        } else {
            throw new Error('Wrong parameter count for max()');
        }
        if (ar.length === 0) {
            throw new Error('Array must contain at least one element for max()');
        }
    } else {
        ar = argv;
    }
    
    retVal = ar[0];
    for (i=1, n=ar.length; i<n; ++i) {
        if (_compare(retVal, ar[i])==1) {
            retVal = ar[i];
        }
    }
    
    return retVal;
}

function min () {
    // Return the lowest value in an array or a series of arguments  
    // 
    // version: 1009.2513
    // discuss at: http://phpjs.org/functions/min
    // +   original by: Onno Marsman
    // +    revised by: Onno Marsman
    // +    tweaked by: Jack
    // %          note: Long code cause we're aiming for maximum PHP compatibility
    // *     example 1: min(1, 3, 5, 6, 7);
    // *     returns 1: 1
    // *     example 2: min([2, 4, 5]);
    // *     returns 2: 2
    // *     example 3: min(0, 'hello');
    // *     returns 3: 0
    // *     example 4: min('hello', 0);
    // *     returns 4: 'hello'
    // *     example 5: min(-1, 'hello');
    // *     returns 5: -1
    // *     example 6: min([2, 4, 8], [2, 5, 7]);
    // *     returns 6: [2, 4, 8]
    
    var ar, retVal, i = 0, n = 0;
    var argv = arguments, argc = argv.length;

    var _obj2Array = function (obj) {
        if (obj instanceof Array) {
            return obj;
        } else {
            var ar = [];
            for (var i in obj) {
                ar.push(obj[i]);
            }
            return ar;
        }
    }; //function _obj2Array
    
    var _compare = function (current, next) {
        var i = 0, n = 0, tmp = 0;
        var nl = 0, cl = 0;
        
        if (current === next) {
            return 0;
        } else if (typeof current == 'object') {
            if (typeof next == 'object') {
               current = _obj2Array(current);
               next    = _obj2Array(next);
               cl      = current.length;
               nl      = next.length;
               if (nl > cl) {
                   return 1;
               } else if (nl < cl) {
                   return -1;
               } else {
                   for (i = 0, n = cl; i<n; ++i) {
                       tmp = _compare(current[i], next[i]);
                       if (tmp == 1) {
                           return 1;
                       } else if (tmp == -1) {
                           return -1;
                       }
                   }
                   return 0;
               }
            } else {
               return -1;
            }
        } else if (typeof next == 'object') {
            return 1;
        } else if (isNaN(next) && !isNaN(current)) {
            if (current == 0) {
               return 0;
            } else {
               return (current<0 ? 1 : -1);
            }
        } else if (isNaN(current) && !isNaN(next)) {
            if (next==0) {
               return 0;
            } else {
               return (next>0 ? 1 : -1);
            }
        } else {
            if (next==current) {
               return 0;
            } else {
               return (next>current ? 1 : -1);
            }
        }
    }; //function _compare
    
    if (argc === 0) {
        throw new Error('At least one value should be passed to min()');
    } else if (argc === 1) {
        if (typeof argv[0] === 'object') {
            ar = _obj2Array(argv[0]);
        } else {
            throw new Error('Wrong parameter count for min()');
        }
        if (ar.length === 0) {
            throw new Error('Array must contain at least one element for min()');
        }
    } else {
        ar = argv;
    }
    
    retVal = ar[0];
    for (i=1, n=ar.length; i<n; ++i) {
        if (_compare(retVal, ar[i])==-1) {
            retVal = ar[i];
        }
    }
    
    return retVal;
}

