var dj = new Object();
dj.modulecheck = {};

dj.require = function(libraryName) {
    if (dj.modulecheck[libraryName]) return 1;	
    // inserting via DOM fails in Safari 2.0, so brute force approach
    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
    dj.modulecheck[libraryName] = 1;
};

dj.cssrequire = function(libraryName) {
    if (dj.modulecheck[libraryName]) return 1;	
    // inserting via DOM fails in Safari 2.0, so brute force approach
    document.write('<link href="'+libraryName+'" rel="stylesheet" type="text/css"/>');
    dj.modulecheck[libraryName] = 1;
};

if (typeof(dj_require_base) == "undefined")
    dj_require_base = "";

dj.require(dj_require_base + '/includes/javascript/jquery/jquery-source.js');
dj.require(dj_require_base + '/includes/javascript/jquery/json.js');
dj.require(dj_require_base + '/includes/javascript/jquery/dimensions.js');


dj.element = function(tag,attribs,parent){
  //alert (tag);
  var jqobj = $(document.createElement(tag));
  if(attribs){
    jqobj.attr(attribs);
  }
  if(parent){
    jqobj.appendTo(parent);
  }
  return jqobj;
};


dj.formatCurrency = function(amount) {
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + s;
	return s;
};

dj.extractHostname = function(str) {
    if (!str.length) return '';
    var re = new RegExp('^(?:f|ht)tp(?:s)?\://([^/]+)', 'im');
    var match = str.match(re);
    if (match && match[1]){
        return match[1].toString();
    } else {
        return '';
    }
}



dj.ajax = function(params){
  var data = params.data;
  
  var myhost  = window.location.hostname;
  var reqhost = dj.extractHostname(params.url);

  if(params.ref){	
    if(data.length) data = data+'&';
    data = data + 'json=' + escape($.toJSON(params.ref)).replace( /[+]/g, '%2B' );  // yuck.
  }

  var error = function(){dj.error('An unspecified error occurred.')};

  var success = function(r){
	  



      if(r.BADSESSION){
	  if(dj.login){
	      dj.login({
		      	success: function(){ dj.ajax(params) } // Have another go
		      });
	  }else{
	      dj.showmessage('You must be logged in to do that.' ,'global_error_box');
	  }
	  return 1;
      }

      if(r.err_message){
	  dj.showmessage('The server returned an error message: <br>' + r.err_message ,'global_error_box');
      } else if (params.success){
	  params.success(r);
      }
  }

  if (myhost == reqhost || !reqhost){
      $.ajax({
	      type: "POST",
	      url: params.url,
	      data: data,
	      dataType: 'json',
	      success: success,
	      error : error
	  });
  } else {
      $.getJSON(params.url, data + '&jsoncallback=?',success);
  }

  
  
};


dj.error = function(message){
  var caller;
  if(dj.error.caller){
    caller = dj.error.caller.name;
  }else{
    caller = 'Root';
  }
  dj.showmessage('Error in function '+caller+': '+ message ,'global_error_box');
  return undefined;
};

dj.showmessage = function (message,classname,timeout){
    dj.clearmessage();
		
    var div = dj.messagewindow = dj.element('div',{},'body');
    if(!classname) classname = 'global_message_box';
    div.attr('class',classname);

    dj.element('span',{},div).html(message);
    dj.element('br',{},div);
    var button = dj.element('img',{src: '/includes/images/ok.png'},div).click(dj.clearmessage);
    button.css({'float': 'right'});

    dj.floatcenter(dj.messagewindow);

    if (!timeout) timeout = 10000;
    dj.messagetimer = setTimeout(dj.clearmessage,timeout);
};

dj.clearmessage = function(){
  if(dj.messagewindow){
    dj.messagewindow.remove();
    delete dj.messagewindow;
  }
  if(dj.messagetimer){
    clearTimeout(dj.messagetimer);
    delete dj.messagetimer;
  }
};



dj._emailregex = /^([A-Z0-9]+[._]?){1,}[A-Z0-9-]+\@(([A-Z0-9]+[-]?){1,}[A-Z0-9]+\.){1,}([A-Z]{2,4}|museum)$/i;

dj.checkemail = function (email){
    if (!email) return 0;
    return dj._emailregex.test(email);
};

dj.checkfields = function(params){
    if (!params.fields) return dj.error('no fields parameter specified');
    if (!params.errorclass) return dj.error('no errorclass parameter specified');

    var errcount = 0;
    $.each(params.fields,function(field,spec){
	       var obj = $(field,params.parent_obj);
	       var value = obj.val();

	       var okflag = 0;
	       if(spec == 'email'){
		   okflag = dj.checkemail(value);
	       }else{ // regex
		   var re = RegExp(spec);
		   if (re.test(value)) okflag = 1;
	       }

	       if(okflag){
		   obj.removeClass(params.errorclass);
	       }else{
		   obj.addClass(params.errorclass);
		   errcount++;
	       }
		
	   });

    if(errcount){
	if (params.errdiv) $(params.errdiv, params.parent_obj).show();
	return 0;
    }else{
	if (params.errdiv) $(params.errdiv, params.parent_obj).hide();
	return 1;
    }
}


dj.floatcenter = function(obj,speed){
    obj = $(obj);
    var docwidth = $(window).width();
    var docheight = $(window).height();

    obj.show();
    var width = obj.width();
    var height = obj.height();
    var cssparam;

    var top = (docheight/2 - height/2);
    var left = (docwidth/2 - width/2);

    if (jQuery.browser.msie && jQuery.browser.version >= 6.0 && jQuery.browser.version < 7.0){

	// Make scrolling work by hacking the document :-(
	/* $('html').css({'overflow-y': 'hidden'});
	$('body').css({ 'height': '100%', 'overflow-y': 'auto', 'padding': '0pt 1em 0pt 14em'});
	obj.css({ 'position': 'absolute' });
	*/

	var positionobj = function(){
	    document.title = dj.scrollY() + ' ' + obj.parent().get(0);
	    obj.css({'top': top + dj.scrollY(), 'left': left + dj.scrollX()});
	}

	$(window).scroll(positionobj);
	setTimeout(   function(){ $(window).unbind('scroll',positionobj) }   ,60000);

	cssparam = { 'top': top + dj.scrollY(), 'left': left + dj.scrollX() };

	obj.css({ 'position': 'absolute' });

    }else{
	cssparam = { 'top': top, 'left': left };
	obj.css({ 'position': 'fixed' });
    }
    if(speed == 'slow')   speed = 1500;
    if(speed == 'fast')   speed = 500;
    if(speed){
	obj.animate(cssparam, speed);
    }else{
	obj.css(cssparam);
    }

    return 1;
}

/*
dj.handlescan
Usage:
$('#something').keypress(  dj.handlescan({onscan: commandfunc})  );

function commandfunc(commandstring){}

*/
dj.handlescan = function (params){
    var keybuffer = '';
    var keytimer;

    if (!params) return dj.error('params hash is required');
    if (!params.onscan) return dj.error('onscan parameter is required');

    var status = false;
    if(params.noblock){
	status = true;
    }

    var timeoutfunc = function(){keybuffer = ''};

    var mainfunc = function (event) {
	if (event){
	    if(keytimer) clearTimeout(keytimer);
	    
	    if(event.keyCode == 13){
		params.onscan(keybuffer);
		keybuffer = '';
	    }else if(event.charCode){
		keytimer  = setTimeout(timeoutfunc,2000);
		keybuffer = keybuffer + String.fromCharCode(event.charCode)
	    }
	}
        
	return status;
    }
    
    return mainfunc;
}
    
dj.scrollX =  function() {
    var scrollX = 0;
    if( document.documentElement && document.documentElement.scrollLeft ) {
	scrollX = document.documentElement.scrollLeft;
    }else if( document.body && document.body.scrollLeft ) {
	scrollX = document.body.scrollLeft;
    }else if( window.pageXOffset ) {
	scrollX = window.pageXOffset;
    }else if( window.scrollX ) {
	scrollX = window.scrollX;
    }
    return scrollX;
},

dj.scrollY = function() {
    var scrollY = 0;
    if( document.documentElement && document.documentElement.scrollTop ) {
	scrollY = document.documentElement.scrollTop;
    }else if( document.body && document.body.scrollTop ) {
	scrollY = document.body.scrollTop;
    }else if( window.pageYOffset ) {
	scrollY = window.pageYOffset;
    }else if( window.scrollY ) {
	scrollY = window.scrollY;
    }
    return scrollY;
}

    dj._hooks = {};

dj.registerhook = function(eventname,callfunc){
    if (!eventname) return dj.error('no eventname specified');
    if (!callfunc)  return dj.error('no callfunc specified');

    dj._hooks[eventname] = callfunc;

    return 1;
}

dj.clearhook = function(eventname){
    dj._hooks[eventname] = '';
}

dj.callhook = function(eventname){
    if (!eventname) return dj.error('no eventname specified');
    
    var callfunc = dj._hooks[eventname];
    
    if (callfunc){
        callfunc();
    }
    
    return 1;
}
    
 dj.preloadImages = function(images) {
     $.each(images,function(r) { $(new Image()).attr('src',r); });
     return 1;
 }

dj.keys = function(hash) {

    var keys = [];
    $.each(hash,function(key,val) {
            
            keys.push(key);
        });
        return keys;
}