﻿/*
	document.lazy_writer
	BSD license.
*/

document.lazy_writer = (function(){
	function lazy_writer(url, callback, option){
		var session = {
			script_count  : 0,
			call_count    : 0,
			context       : [],
			stash         : {},
			timer         : null,
			delay         : 0,
			current_script: null
		};
		if(option){
			for(var key in option){
				session[key] = option[key];
			}
		}
		var f = function(script, str){
			session.call_count++;
			if(session.timer){
				clearTimeout(session.timer)
			}
			// run other script -> force write old script
			if(session.current_script && session.current_script != script){
				callback.call(session, session.context.join(""));
				session.context = [];
				session.current_script = script;
				session.script_count++;
			} else if(session.current_script != script){
				session.current_script = script;
				session.script_count++;
			}
			session.context.push(str);
			session.timer = setTimeout(function(){
				callback.call(session, session.context.join(""));
				session.context = [];
			}, session.delay);
		};
		lazy_writer.writers[url] = f;
	}
	lazy_writer.writers = {};
	lazy_writer.exists = function(url){
		return lazy_writer.writers.hasOwnProperty(url);
	};
	lazy_writer.fetch = function(url){
		return lazy_writer.writers[url];
	};
	var original_document_write = document.write;
	document._write = document.write;
	function getCurrentScript(){
		return (function (e) {
			if(e.nodeName.toLowerCase() == 'script') return e;
			return arguments.callee(e.lastChild)
		})(document);
	}
	document.write = function(){
		var current = getCurrentScript();
		if(lazy_writer.exists(current.src)){
			var args = Array.prototype.slice.call(arguments);
			var writer = lazy_writer.fetch(current.src);
			writer(current, args.join(""));
		} else {
			// doesn't work in IE ..
			try{
				original_document_write.apply(document, arguments);
			} catch(e){
				var args = Array.prototype.slice.call(arguments);
				try {
					// doesn't work in Safari ..
					original_document_write(args.join(""));
				} catch(e){
					document._write(args.join(""));
				}
			}
		}
	};
	return lazy_writer;
})();

