./waf now builds combined js
diff --git a/wscript b/wscript
index 0fcaa02..36530f2 100644
--- a/wscript
+++ b/wscript
@@ -1,2 +1,171 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+VERSION='0.1'
+APPNAME='ndnjs'
+
+YUICOMPRESSOR_URL="http://github.com/downloads/yui/yuicompressor/"
+YUICOMPRESSOR_NAME="yuicompressor-2.4.7"
+
+CLOSURE_COMPILER="http://closure-compiler.googlecode.com/files/compiler-20121212.zip"
+
+from waflib import Task, TaskGen, Utils, Logs
+import urllib, subprocess, os, shutil
+
+def options (opt):
+    opt.add_option('--js-path', action='store',dest='js_path',
+                   help='''Path to install combined and compressed .js files''')
+    opt.add_option('--yui',action='store_true',default=False,dest='yui',
+                   help='''Download and use yuicompressor-2.4.7 (http://yui.github.com/yuicompressor/)''')
+    opt.add_option('--compiler',action='store_true',default=False,dest='compiler',
+                   help='''Download and use closure-compiler-r2388 (https://code.google.com/p/closure-compiler/)''')
+
+def configure (conf):
+    if conf.options.yui:
+        conf.start_msg ("Checking for yuicompressor")
+        if os.path.exists('tools/yuicompressor.jar'):
+            conf.end_msg('tools/yuicompressor.jar')
+            conf.env.HAVE_YUI = 1
+        else:
+            conf.end_msg('not found','YELLOW')
+            url="%s%s.zip" % (YUICOMPRESSOR_URL, YUICOMPRESSOR_NAME)
+            Logs.info ("Downloading yuicompressor from %s..." % url)
+            urllib.urlretrieve (url, "build/yuicompressor.zip")
+
+            filename='%s/build/%s.jar' % (YUICOMPRESSOR_NAME,YUICOMPRESSOR_NAME)
+            subprocess.check_call (['unzip', '-qq', '-o', '-j', 'build/yuicompressor.zip',
+                                    filename, '-d', 'tools/'])
+            os.rename ("tools/%s.jar" % YUICOMPRESSOR_NAME, "tools/yuicompressor.jar")
+            conf.env.HAVE_YUI = 1
+
+    if conf.options.compiler:
+        conf.start_msg ("Checking for closure-compiler")
+        if os.path.exists('tools/compiler.jar'):
+            conf.end_msg('tools/compiler.jar')
+            conf.env.HAVE_COMPILER = 1
+        else:
+            conf.end_msg('not found','YELLOW')
+            Logs.info ("Downloading closure-compiler from %s..." % CLOSURE_COMPILER)
+            urllib.urlretrieve (CLOSURE_COMPILER, "build/closure-compiler.zip")
+
+            subprocess.check_call (['unzip', '-qq', '-o', '-j', 'build/closure-compiler.zip', 'compiler.jar', '-d', 'tools/'])
+            conf.env.HAVE_COMPILER = 1
+
+    if conf.options.js_path:
+        conf.env.JS_PATH = conf.options.js_path
+
 def build (bld):
-    pass
\ No newline at end of file
+    securityLib = ["contrib/securityLib/sha256.js",
+                   "contrib/securityLib/base64.js",
+                   "contrib/securityLib/rsa.js",
+                   "contrib/securityLib/rsa2.js",
+                   "contrib/securityLib/rsapem-1.1.js",
+                   "contrib/securityLib/rsasign-1.2.js",
+                   "contrib/securityLib/asn1hex-1.1.js",
+                   "contrib/securityLib/x509-1.1.js",
+                   "contrib/securityLib/jsbn.js",
+                   "contrib/securityLib/jsbn2.js"]
+
+    ndnjs = ["js/Closure.js",
+             "js/WebSocketTransport.js",
+             "js/util/CCNProtocolDTags.js",
+             "js/util/CCNTime.js",
+             "js/util/ExponentialReExpressClosure.js",
+             "js/Name.js",
+             "js/ContentObject.js",
+             "js/encoding/DateFormat.js",
+             "js/Interest.js",
+             "js/Key.js",
+             "js/PublisherID.js",
+             "js/PublisherPublicKeyDigest.js",
+             "js/FaceInstance.js",
+             "js/ForwardingEntry.js",
+             "js/encoding/DynamicUint8Array.js",
+             "js/encoding/BinaryXMLEncoder.js",
+             "js/encoding/BinaryXMLDecoder.js",
+             "js/encoding/BinaryXMLStructureDecoder.js",
+             "js/encoding/DataUtils.js",
+             "js/encoding/EncodingUtils.js",
+             "js/security/KeyManager.js",
+             "js/security/Witness.js"] + securityLib + ["js/NDN.js"]
+
+    ndnjs = bld (features="combine",
+                 target="ndn",
+                 source=ndnjs)
+
+    if bld.env['HAVE_YUI']:
+        ndnjs.yui = True
+
+    if bld.env['HAVE_COMPILER']:
+        ndnjs.compiler = True
+
+    if bld.env['JS_PATH']:
+        ndnjs.install_path = bld.env['JS_PATH']
+
+
+@TaskGen.extension('.js')
+def js_hook(self, node):
+    node.sig=Utils.h_file (node.abspath())
+
+@TaskGen.feature('combine')
+@TaskGen.after_method('process_source')
+def apply_combine(self):
+    out = "%s.js" % self.target
+    tasks = []
+    task = self.create_task ('combine', self.source)
+    task.set_outputs (task.generator.path.find_or_declare (out))
+    tasks.append (task)
+
+    if getattr(self, 'yui', False):
+        out_yui = "%s.min.yui.js" % self.target
+        yui = self.create_task ('yuicompressor')
+        yui.combine = task
+        yui.set_outputs (yui.generator.path.find_or_declare (out_yui))
+        tasks.append (yui)
+
+    if getattr(self, 'compiler', False):
+        out_min = "%s.min.js" % self.target
+        compiler = self.create_task ('closure_compiler')
+        compiler.combine = task
+        compiler.set_outputs (yui.generator.path.find_or_declare (out_min))
+        tasks.append (compiler)
+
+    try:
+        for task in tasks:
+            self.bld.install_files (self.install_path, task.outputs[:], env=self.env)
+    except:
+        pass
+
+class combine (Task.Task):
+    def run(self):
+        outFile = self.outputs[0]
+        self.outputs[0].write ("", "w") # make file empty
+        for inFile in self.inputs:
+            self.outputs[0].write (inFile.read (), 'a')
+
+class yuicompressor (Task.Task):
+    after="combine"
+    color='PINK'
+    def __str__(self):
+        src_str=self.combine.outputs[0].nice_path()
+        tgt_str=self.outputs[0].nice_path()
+        return'%s: %s -> %s\n'%(self.__class__.__name__.replace('_task',''),src_str,tgt_str)
+
+    def run(self):
+        return self.exec_command(['java',
+                                  '-jar', '../tools/yuicompressor.jar',
+                                  '-o', self.outputs[0].abspath(),
+                                  self.combine.outputs[0].abspath()])
+
+class closure_compiler (Task.Task):
+    after="combine"
+    color='PINK'
+    def __str__(self):
+        src_str=self.combine.outputs[0].nice_path()
+        tgt_str=self.outputs[0].nice_path()
+        return'%s: %s -> %s\n'%(self.__class__.__name__.replace('_task',''),src_str,tgt_str)
+
+    def run(self):
+        return self.exec_command(['java',
+                                  '-jar', '../tools/compiler.jar',
+                                  '--js', self.combine.outputs[0].abspath(),
+                                  '--js_output_file', self.outputs[0].abspath()])