/**
 * @author Olivier Monod
 */
clone = function(o) {
    if(!o || 'object' !== typeof o) {
        return o;
    }
    var c = 'function' === typeof o.pop ? [] : {};
    var p, v;
    for(p in o) {
        if(o.hasOwnProperty(p)) {
            v = o[p];
            if(v && 'object' === typeof v) {
                c[p] = clone(v);
            }
            else {
                c[p] = v;
            }
        }
    }
    return c;
};

getCookie = function(cookie_name) {
    var cookie_start, cookie_end;
    if (document.cookie.length > 0 && cookie_name !== "")
    {
        cookie_start = document.cookie.indexOf(cookie_name + "=");
        if (cookie_start !== -1)
        {
            cookie_start = cookie_start + cookie_name.length + 1;
            cookie_end = document.cookie.indexOf(";", cookie_start);
            if (cookie_end === -1) {
                cookie_end = document.cookie.length;
            }

            return unescape(document.cookie.substring(cookie_start, cookie_end));
        }
    }

    return "";
};

setCookie = function(name, value, expires, path, domain, secure){ //

	var defaultExpires = new Date(new Date().getTime()+(1000*60*60*24*365*2)); // 2 ans !
	expires = (typeof(expires)=="undefined"?defaultExpires.toGMTString():expires);	
	path = (typeof(path)=="undefined"?"/":path);	
	domain = (typeof(domain)=="undefined"?null:domain);	
	secure = (secure==null?false:secure);	
	
	document.cookie = name + "=" + escape(value) +
	((expires == null) ? "" : ("; expires=" + expires)) +
	((path == null) ? "" : ("; path=" + path)) +
	((domain == null) ? "" : ("; domain=" + domain)) +
	((secure == true) ? "; secure" : "");
};

function require_js(libraryName) {
	// inserting via DOM fails in Safari 2.0, so brute force approach
	document.getElementById("dynamic-loader").innerHTML += '<script type="text/javascript" src="'+libraryName+'"></script>\n\r';
};

function require_css(libraryName) {
	var cssNode = document.createElement('link');
	cssNode.type = 'text/css';
	cssNode.rel = 'stylesheet';
	cssNode.href = libraryName;
	cssNode.media = 'screen';
	cssNode.title = 'dynamicLoadedSheet';
	document.getElementsByTagName("head")[0].appendChild(cssNode);
};



function checkMail(str) {
	var verif = /^[a-zA-Z0-9\-\_]{1,}[a-zA-Z0-9\.\-\_]*[a-zA-Z0-9\-\_]{1,}@[a-zA-Z0-9]{1,}[a-zA-Z0-9\.\-\_]*[a-zA-Z0-9]{1,}[.][a-zA-Z]{2,4}$/;
	return (verif.test(str));
}

function is_numeric( mixed_var ) {
    // example 1: is_numeric(186.31);
    // returns 1: true
    // example 2: is_numeric('Olivier Monod');
    // returns 2: false
    // example 3: is_numeric('+186.31e2');
    // returns 3: true
 
    return !isNaN( mixed_var );
}

function checkdate( month, day, year ) {
    // example 1: checkdate(12, 31, 2000);
    // returns 1: true
    // example 2: checkdate(2, 29, 2001);
    // returns 2: false
    // example 3: checkdate(03, 31, 2008);
    // returns 3: true
    // example 4: checkdate(1, 390, 2000);
    // returns 4: false
 
    var myDate = new Date();
    myDate.setFullYear( year, (month - 1), day );
 
    return ((myDate.getMonth()+1) == month && day<32); 
}

function sleep(seconds) {
    // For study purposes. Current implementation could lock up the user's browser. 
    // Consider using setTimeout() instead.
    // example 1: sleep(1);
    // returns 1: 0
    
    seconds *= 1000;
    var start = new Date().getTime();
    while (new Date().getTime() < start + seconds);
    
    return 0;
}
