if (!SDNA) {
	var SDNA = {};
}
SDNA.utils = {};

SDNA.utils.json2String = function( json,delim, cap ){
   
   var delim 	= delim || ',',
   	 cap 		= (typeof cap != 'undefined' && cap.constructor == String? [cap,cap] : cap) ||  ['{','}'],
   	 a = [],
   	 i,
   	 o,
   	 wrap = ['','',''];
	
	for(i in json){
		o = json[i];
		if( o ){
			if( o.constructor == Number ){
				wrap = ['','',''];
			}else if( o.constructor == Array ){
				wrap = ['[','',']'];
			}else if( o.constructor == String ){
				wrap = ['"','','"'];
			}else if( o.constructor == Object ){
				wrap = ['{','','}'];
			}else if( o.constructor == Boolean ){
				wrap = ['','',''];
			}else if( o.constructor == Function ){
				wrap = ['(','',')'];
			}
			if( o.constructor != Object){
				wrap[1] = o.toString();
			}else{
				wrap[1] = SDNA.utils.json2String(o, delim, cap);
			}
			a.push( i + ':' + wrap.join('') ); 
		}
	}
    
    return cap[0] + a.join(delim) + cap[1];
}

SDNA.utils.get = function( url ){
	
	var url = url || window.location.href, hashIdx = -1, hash = null, vars = {};
	
	if( url.indexOf('?') < 0 ){
		key = url;
		url = window.location.href;
	}
	if( (hashIdx = url.indexOf('#')) > -1 ){
	  vars.hash = url.slice( hashIdx, url.length);  
	  url = url.slice(0,hashIdx);
	}	      
	var pairs = url.slice( url.indexOf('?') + 1 ).split('&'),
		val,
		i=0,
		key = key || null;
        
	for(i=0; val=pairs[i];++i){
	    var pair = val.split('=');
	    vars[pair[0]] = pair[1]; 
	}
	if( key != null ){
	    return vars[key];
	} else {
	    return vars;
	}
}

SDNA.utils.getTopZindex = function(){
	
	if( this.zIndex == undefined ){
		this.zIndex = Math.ceil(new Date().getTime()/100000000);
	}
	
	return ++this.zIndex;
}

/**
 * Simple timer class enabling setting a time length,
 * starting, stopping and checking if running
 * - optional callback can be passed to start()
 *   which will be fired when timer is finished
 * 
 * @param integer milliseconds
 * @author davidbjames
 */
SDNA.utils.Timer = function (milliseconds) {
    /**
     * Length of time in milliseconds
     */
    var _milliseconds = milliseconds;
    /**
     * Timer ID
     */
    var _timerId = null;
    /**
     * Instance of this object
     */
    var instance = this;
    /**
     * Current running status
     * @var boolean
     */
    this.running = false;
    
    /**
     * Start the timer
     * - optionally provide callback to be run when finished
     * 
     * @param function callback
     */
    this.start = function (callback) {
        if (instance.running) {
            instance.stop();
        }
        callback = callback || instance.stop;
        _timerId = window.setTimeout(callback, _milliseconds);
        instance.running = true;
    };
    
    /**
     * Stop the timer
     */
    this.stop = function () {
        window.clearTimeout(_timerId);
        instance.running = false;
    };
};