http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/6b1dba58/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/dhtmlHistory.js
----------------------------------------------------------------------
diff --git 
a/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/dhtmlHistory.js
 
b/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/dhtmlHistory.js
new file mode 100644
index 0000000..907e769
--- /dev/null
+++ 
b/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/dhtmlHistory.js
@@ -0,0 +1,925 @@
+/** 
+   Copyright (c) 2005, Brad Neuberg, [email protected]
+   http://codinginparadise.org
+   
+   Permission is hereby granted, free of charge, to any person obtaining 
+   a copy of this software and associated documentation files (the 
"Software"), 
+   to deal in the Software without restriction, including without limitation 
+   the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+   and/or sell copies of the Software, and to permit persons to whom the 
+   Software is furnished to do so, subject to the following conditions:
+   
+   The above copyright notice and this permission notice shall be 
+   included in all copies or substantial portions of the Software.
+   
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
+   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 
+   OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR 
+   THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+   
+   The JSON class near the end of this file is
+   Copyright 2005, JSON.org
+*/
+
+/** An object that provides DHTML history, history data, and bookmarking 
+    for AJAX applications. */
+window.dhtmlHistory = {
+   /** Initializes our DHTML history. You should
+       call this after the page is finished loading. */
+   /** public */ initialize: function() {
+      // only Internet Explorer needs to be explicitly initialized;
+      // other browsers don't have its particular behaviors.
+      // Basicly, IE doesn't autofill form data until the page
+      // is finished loading, which means historyStorage won't
+      // work until onload has been fired.
+      if (this.isInternetExplorer() == false) {
+         return;
+      }
+         
+      // if this is the first time this page has loaded...
+      if (historyStorage.hasKey("DhtmlHistory_pageLoaded") == false) {
+         this.fireOnNewListener = false;
+         this.firstLoad = true;
+         historyStorage.put("DhtmlHistory_pageLoaded", true);
+      }
+      // else if this is a fake onload event
+      else {
+         this.fireOnNewListener = true;
+         this.firstLoad = false;   
+      }
+   },
+             
+   /** Adds a history change listener. Note that
+       only one listener is supported at this
+       time. */
+   /** public */ addListener: function(callback) {
+      this.listener = callback;
+      
+      // if the page was just loaded and we
+      // should not ignore it, fire an event
+      // to our new listener now
+      if (this.fireOnNewListener == true) {
+         this.fireHistoryEvent(this.currentLocation);
+         this.fireOnNewListener = false;
+      }
+   },
+   
+   /** public */ add: function(newLocation, historyData) {
+      // most browsers require that we wait a certain amount of time before 
changing the
+      // location, such as 200 milliseconds; rather than forcing external 
callers to use
+      // window.setTimeout to account for this to prevent bugs, we internally 
handle this
+      // detail by using a 'currentWaitTime' variable and have requests wait 
in line
+      var self = this;
+      var addImpl = function() {
+         // indicate that the current wait time is now less
+         if (self.currentWaitTime > 0)
+            self.currentWaitTime = self.currentWaitTime - self.WAIT_TIME;
+            
+         // remove any leading hash symbols on newLocation
+         newLocation = self.removeHash(newLocation);
+         
+         // IE has a strange bug; if the newLocation
+         // is the same as _any_ preexisting id in the
+         // document, then the history action gets recorded
+         // twice; throw a programmer exception if there is
+         // an element with this ID
+         var idCheck = document.getElementById(newLocation);
+         if (idCheck != undefined || idCheck != null) {
+            var message = 
+               "Exception: History locations can not have "
+               + "the same value as _any_ id's "
+               + "that might be in the document, "
+               + "due to a bug in Internet "
+               + "Explorer; please ask the "
+               + "developer to choose a history "
+               + "location that does not match "
+               + "any HTML id's in this "
+               + "document. The following ID "
+               + "is already taken and can not "
+               + "be a location: " 
+               + newLocation;
+               
+            throw message; 
+         }
+         
+         // store the history data into history storage
+         historyStorage.put(newLocation, historyData);
+         
+         // indicate to the browser to ignore this upcomming 
+         // location change
+         self.ignoreLocationChange = true;
+ 
+         // indicate to IE that this is an atomic location change
+         // block
+         this.ieAtomicLocationChange = true;
+                 
+         // save this as our current location
+         self.currentLocation = newLocation;
+         
+         // change the browser location
+         window.location.hash = newLocation;
+         
+         // change the hidden iframe's location if on IE
+         if (self.isInternetExplorer())
+            self.iframe.src = "blank.html?" + newLocation;
+            
+         // end of atomic location change block
+         // for IE
+         this.ieAtomicLocationChange = false;
+      };
+
+      // now execute this add request after waiting a certain amount of time, 
so as to
+      // queue up requests
+      window.setTimeout(addImpl, this.currentWaitTime);
+   
+      // indicate that the next request will have to wait for awhile
+      this.currentWaitTime = this.currentWaitTime + this.WAIT_TIME;
+   },
+   
+   /** public */ isFirstLoad: function() {
+      if (this.firstLoad == true) {
+         return true;
+      }
+      else {
+         return false;
+      }
+   },
+   
+   /** public */ isInternational: function() {
+      return false;
+   },
+   
+   /** public */ getVersion: function() {
+      return "0.05";
+   },
+   
+   /** Gets the current hash value that is in the browser's
+       location bar, removing leading # symbols if they are present. */
+   /** public */ getCurrentLocation: function() {
+      var currentLocation = this.removeHash(window.location.hash);
+         
+      return currentLocation;
+   },
+   
+   
+   
+   
+   
+   /** Our current hash location, without the "#" symbol. */
+   /** private */ currentLocation: null,
+   
+   /** Our history change listener. */
+   /** private */ listener: null,
+   
+   /** A hidden IFrame we use in Internet Explorer to detect history
+       changes. */
+   /** private */ iframe: null,
+   
+   /** Indicates to the browser whether to ignore location changes. */
+   /** private */ ignoreLocationChange: null,
+ 
+   /** The amount of time in milliseconds that we should wait between add 
requests. 
+       Firefox is okay with 200 ms, but Internet Explorer needs 400. */
+   /** private */ WAIT_TIME: 200,
+
+   /** The amount of time in milliseconds an add request has to wait in line 
before being
+       run on a window.setTimeout. */
+   /** private */ currentWaitTime: 0,
+   
+   /** A flag that indicates that we should fire a history change event
+       when we are ready, i.e. after we are initialized and
+       we have a history change listener. This is needed due to 
+       an edge case in browsers other than Internet Explorer; if
+       you leave a page entirely then return, we must fire this
+       as a history change event. Unfortunately, we have lost
+       all references to listeners from earlier, because JavaScript
+       clears out. */
+   /** private */ fireOnNewListener: null,
+   
+   /** A variable that indicates whether this is the first time
+       this page has been loaded. If you go to a web page, leave
+       it for another one, and then return, the page's onload
+       listener fires again. We need a way to differentiate
+       between the first page load and subsequent ones.
+       This variable works hand in hand with the pageLoaded
+       variable we store into historyStorage.*/
+   /** private */ firstLoad: null,
+   
+   /** A variable to handle an important edge case in Internet
+       Explorer. In IE, if a user manually types an address into
+       their browser's location bar, we must intercept this by
+       continiously checking the location bar with an timer 
+       interval. However, if we manually change the location
+       bar ourselves programmatically, when using our hidden
+       iframe, we need to ignore these changes. Unfortunately,
+       these changes are not atomic, so we surround them with
+       the variable 'ieAtomicLocationChange', that if true,
+       means we are programmatically setting the location and
+       should ignore this atomic chunked change. */
+   /** private */ ieAtomicLocationChange: null,          
+   
+   /** Creates the DHTML history infrastructure. */
+   /** private */ create: function() {
+      // get our initial location
+      var initialHash = this.getCurrentLocation();
+      
+      // save this as our current location
+      this.currentLocation = initialHash;
+      
+      // write out a hidden iframe for IE and
+      // set the amount of time to wait between add() requests
+      if (this.isInternetExplorer()) {
+         document.write("<iframe style='border: 0px; width: 1px; "
+                               + "height: 1px; position: absolute; bottom: 
0px; "
+                               + "right: 0px; visibility: visible;' "
+                               + "name='DhtmlHistoryFrame' 
id='DhtmlHistoryFrame' "
+                               + "src='blank.html?" + initialHash + "'>"
+                               + "</iframe>");
+         // wait 400 milliseconds between history
+         // updates on IE, versus 200 on Firefox
+         this.WAIT_TIME = 400;
+      }
+      
+      // add an unload listener for the page; this is
+      // needed for Firefox 1.5+ because this browser caches all
+      // dynamic updates to the page, which can break some of our 
+      // logic related to testing whether this is the first instance
+      // a page has loaded or whether it is being pulled from the cache
+      var self = this;
+      window.onunload = function() {
+         self.firstLoad = null;
+      };
+      
+      // determine if this is our first page load;
+      // for Internet Explorer, we do this in 
+      // this.iframeLoaded(), which is fired on
+      // page load. We do it there because
+      // we have no historyStorage at this point
+      // in IE, which only exists after the page
+      // is finished loading for that browser
+      if (this.isInternetExplorer() == false) {
+         if (historyStorage.hasKey("DhtmlHistory_pageLoaded") == false) {
+            this.ignoreLocationChange = true;
+            this.firstLoad = true;
+            historyStorage.put("DhtmlHistory_pageLoaded", true);
+         }
+         else {
+            // indicate that we want to pay attention
+            // to this location change
+            this.ignoreLocationChange = false;
+            // For browser's other than IE, fire
+            // a history change event; on IE,
+            // the event will be thrown automatically
+            // when it's hidden iframe reloads
+            // on page load.
+            // Unfortunately, we don't have any 
+            // listeners yet; indicate that we want
+            // to fire an event when a listener
+            // is added.
+            this.fireOnNewListener = true;
+         }
+      }
+      else { // Internet Explorer
+         // the iframe will get loaded on page
+         // load, and we want to ignore this fact
+         this.ignoreLocationChange = true;
+      }
+      
+      if (this.isInternetExplorer()) {
+            this.iframe = document.getElementById("DhtmlHistoryFrame");
+      }                                                              
+
+      // other browsers can use a location handler that checks
+      // at regular intervals as their primary mechanism;
+      // we use it for Internet Explorer as well to handle
+      // an important edge case; see checkLocation() for
+      // details
+      var self = this;
+      var locationHandler = function() {
+         self.checkLocation();
+      };
+      setInterval(locationHandler, 100);
+   },
+   
+   /** Notify the listener of new history changes. */
+   /** private */ fireHistoryEvent: function(newHash) {
+      // extract the value from our history storage for
+      // this hash
+      var historyData = historyStorage.get(newHash);
+
+      // call our listener      
+      this.listener.call(null, newHash, historyData);
+   },
+   
+   /** Sees if the browsers has changed location.  This is the primary history 
mechanism
+       for Firefox. For Internet Explorer, we use this to handle an important 
edge case:
+       if a user manually types in a new hash value into their Internet 
Explorer location
+       bar and press enter, we want to intercept this and notify any history 
listener. */
+   /** private */ checkLocation: function() {
+      // ignore any location changes that we made ourselves
+      // for browsers other than Internet Explorer
+      if (this.isInternetExplorer() == false
+         && this.ignoreLocationChange == true) {
+         this.ignoreLocationChange = false;
+         return;
+      }
+      
+      // if we are dealing with Internet Explorer
+      // and we are in the middle of making a location
+      // change from an iframe, ignore it
+      if (this.isInternetExplorer() == false
+          && this.ieAtomicLocationChange == true) {
+         return;
+      }
+      
+      // get hash location
+      var hash = this.getCurrentLocation();
+      
+      // see if there has been a change
+      if (hash == this.currentLocation)
+         return;
+         
+      // on Internet Explorer, we need to intercept users manually
+      // entering locations into the browser; we do this by comparing
+      // the browsers location against the iframes location; if they
+      // differ, we are dealing with a manual event and need to
+      // place it inside our history, otherwise we can return
+      this.ieAtomicLocationChange = true;
+      
+      if (this.isInternetExplorer()
+          && this.getIFrameHash() != hash) {
+         this.iframe.src = "blank.html?" + hash;
+      }
+      else if (this.isInternetExplorer()) {
+         // the iframe is unchanged
+         return;
+      }
+         
+      // save this new location
+      this.currentLocation = hash;
+      
+      this.ieAtomicLocationChange = false;
+      
+      // notify listeners of the change
+      this.fireHistoryEvent(hash);
+   },  
+
+   /** Gets the current location of the hidden IFrames
+       that is stored as history. For Internet Explorer. */
+   /** private */ getIFrameHash: function() {
+      // get the new location
+      var historyFrame = document.getElementById("DhtmlHistoryFrame");
+      var doc = historyFrame.contentWindow.document;
+      var hash = new String(doc.location.search);
+
+      if (hash.length == 1 && hash.charAt(0) == "?")
+         hash = "";
+      else if (hash.length >= 2 && hash.charAt(0) == "?")
+         hash = hash.substring(1); 
+    
+    
+      return hash;
+   },          
+   
+   /** Removes any leading hash that might be on a location. */
+   /** private */ removeHash: function(hashValue) {
+      if (hashValue == null || hashValue == undefined)
+         return null;
+      else if (hashValue == "")
+         return "";
+      else if (hashValue.length == 1 && hashValue.charAt(0) == "#")
+         return "";
+      else if (hashValue.length > 1 && hashValue.charAt(0) == "#")
+         return hashValue.substring(1);
+      else
+         return hashValue;     
+   },          
+   
+   /** For IE, says when the hidden iframe has finished loading. */
+   /** private */ iframeLoaded: function(newLocation) {
+      // ignore any location changes that we made ourselves
+      if (this.ignoreLocationChange == true) {
+         this.ignoreLocationChange = false;
+         return;
+      }
+      
+      // get the new location
+      var hash = new String(newLocation.search);
+      if (hash.length == 1 && hash.charAt(0) == "?")
+         hash = "";
+      else if (hash.length >= 2 && hash.charAt(0) == "?")
+         hash = hash.substring(1);
+      
+      // move to this location in the browser location bar
+      // if we are not dealing with a page load event
+      if (this.pageLoadEvent != true) {
+         window.location.hash = hash;
+      }
+
+      // notify listeners of the change
+      this.fireHistoryEvent(hash);
+   },
+   
+   /** Determines if this is Internet Explorer. */
+   /** private */ isInternetExplorer: function() {
+      var userAgent = navigator.userAgent.toLowerCase();
+      if (document.all && userAgent.indexOf('msie')!=-1) {
+         return true;
+      }
+      else {
+         return false;
+      }
+   }
+};
+
+
+
+
+
+
+
+
+
+
+
+
+/** An object that uses a hidden form to store history state 
+    across page loads. The chief mechanism for doing so is using
+    the fact that browser's save the text in form data for the
+    life of the browser and cache, which means the text is still
+    there when the user navigates back to the page. See
+    
http://codinginparadise.org/weblog/2005/08/ajax-tutorial-saving-session-across.html
+    for full details. */
+window.historyStorage = {
+   /** If true, we are debugging and show the storage textfield. */
+   /** public */ debugging: false,
+   
+   /** Our hash of key name/values. */
+   /** private */ storageHash: new Object(),
+   
+   /** If true, we have loaded our hash table out of the storage form. */
+   /** private */ hashLoaded: false, 
+   
+   /** public */ put: function(key, value) {
+       this.assertValidKey(key);
+       
+       // if we already have a value for this,
+       // remove the value before adding the
+       // new one
+       if (this.hasKey(key)) {
+         this.remove(key);
+       }
+       
+       // store this new key
+       this.storageHash[key] = value;
+       
+       // save and serialize the hashtable into the form
+       this.saveHashTable(); 
+   },
+   
+   /** public */ get: function(key) {
+      this.assertValidKey(key);
+      
+      // make sure the hash table has been loaded
+      // from the form
+      this.loadHashTable();
+      
+      var value = this.storageHash[key];
+
+      if (value == undefined)
+         return null;
+      else
+         return value; 
+   },
+   
+   /** public */ remove: function(key) {
+      this.assertValidKey(key);
+      
+      // make sure the hash table has been loaded
+      // from the form
+      this.loadHashTable();
+      
+      // delete the value
+      delete this.storageHash[key];
+      
+      // serialize and save the hash table into the 
+      // form
+      this.saveHashTable();
+   },
+   
+   /** Clears out all saved data. */
+   /** public */ reset: function() {
+      this.storageField.value = "";
+      this.storageHash = new Object();
+   },
+   
+   /** public */ hasKey: function(key) {
+      this.assertValidKey(key);
+      
+      // make sure the hash table has been loaded
+      // from the form
+      this.loadHashTable();
+      
+      if (typeof this.storageHash[key] == "undefined")
+         return false;
+      else
+         return true;
+   },
+   
+   /** Determines whether the key given is valid;
+       keys can only have letters, numbers, the dash,
+       underscore, spaces, or one of the 
+       following characters:
+       !@#$%^&*()+=:;,./?|\~{}[] */
+   /** public */ isValidKey: function(key) {
+      // allow all strings, since we don't use XML serialization
+      // format anymore
+      return (typeof key == "string");
+      
+      /*
+      if (typeof key != "string")
+         key = key.toString();
+      
+      
+      var matcher = 
+         /^[a-zA-Z0-9_ \!\@\#\$\%\^\&\*\(\)\+\=\:\;\,\.\/\?\|\\\~\{\}\[\]]*$/;
+                     
+      return matcher.test(key);*/
+   },
+   
+   
+   
+   
+   /** A reference to our textarea field. */
+   /** private */ storageField: null,
+   
+   /** private */ init: function() {
+      // write a hidden form into the page
+      var styleValue = "position: absolute; top: -1000px; left: -1000px;";
+      if (this.debugging == true) {
+         styleValue = "width: 30em; height: 30em;";
+      }   
+      
+      var newContent =
+         "<form id='historyStorageForm' " 
+               + "method='GET' "
+               + "style='" + styleValue + "'>"
+            + "<textarea id='historyStorageField' "
+                      + "style='" + styleValue + "'"
+                              + "left: -1000px;' "
+                      + "name='historyStorageField'></textarea>"
+         + "</form>";
+      document.write(newContent);
+      
+      this.storageField = document.getElementById("historyStorageField");
+   },
+   
+   /** Asserts that a key is valid, throwing
+       an exception if it is not. */
+   /** private */ assertValidKey: function(key) {
+      if (this.isValidKey(key) == false) {
+         throw "Please provide a valid key for "
+               + "window.historyStorage, key= "
+               + key;
+       }
+   },
+   
+   /** Loads the hash table up from the form. */
+   /** private */ loadHashTable: function() {
+      if (this.hashLoaded == false) {
+         // get the hash table as a serialized
+         // string
+         var serializedHashTable = this.storageField.value;
+         
+         if (serializedHashTable != "" &&
+             serializedHashTable != null) {
+            // destringify the content back into a 
+            // real JavaScript object
+            this.storageHash = eval('(' + serializedHashTable + ')');  
+         }
+         
+         this.hashLoaded = true;
+      }
+   },
+   
+   /** Saves the hash table into the form. */
+   /** private */ saveHashTable: function() {
+      this.loadHashTable();
+      
+      // serialized the hash table
+      var serializedHashTable = JSON.stringify(this.storageHash);
+      
+      // save this value
+      this.storageField.value = serializedHashTable;
+   }   
+};
+
+
+
+
+
+
+
+
+
+
+/** The JSON class is copyright 2005 JSON.org. */
+Array.prototype.______array = '______array';
+
+var JSON = {
+    org: 'http://www.JSON.org',
+    copyright: '(c)2005 JSON.org',
+    license: 'http://www.crockford.com/JSON/license.html',
+
+    stringify: function (arg) {
+        var c, i, l, s = '', v;
+
+        switch (typeof arg) {
+        case 'object':
+            if (arg) {
+                if (arg.______array == '______array') {
+                    for (i = 0; i < arg.length; ++i) {
+                        v = this.stringify(arg[i]);
+                        if (s) {
+                            s += ',';
+                        }
+                        s += v;
+                    }
+                    return '[' + s + ']';
+                } else if (typeof arg.toString != 'undefined') {
+                    for (i in arg) {
+                        v = arg[i];
+                        if (typeof v != 'undefined' && typeof v != 'function') 
{
+                            v = this.stringify(v);
+                            if (s) {
+                                s += ',';
+                            }
+                            s += this.stringify(i) + ':' + v;
+                        }
+                    }
+                    return '{' + s + '}';
+                }
+            }
+            return 'null';
+        case 'number':
+            return isFinite(arg) ? String(arg) : 'null';
+        case 'string':
+            l = arg.length;
+            s = '"';
+            for (i = 0; i < l; i += 1) {
+                c = arg.charAt(i);
+                if (c >= ' ') {
+                    if (c == '\\' || c == '"') {
+                        s += '\\';
+                    }
+                    s += c;
+                } else {
+                    switch (c) {
+                        case '\b':
+                            s += '\\b';
+                            break;
+                        case '\f':
+                            s += '\\f';
+                            break;
+                        case '\n':
+                            s += '\\n';
+                            break;
+                        case '\r':
+                            s += '\\r';
+                            break;
+                        case '\t':
+                            s += '\\t';
+                            break;
+                        default:
+                            c = c.charCodeAt();
+                            s += '\\u00' + Math.floor(c / 16).toString(16) +
+                                (c % 16).toString(16);
+                    }
+                }
+            }
+            return s + '"';
+        case 'boolean':
+            return String(arg);
+        default:
+            return 'null';
+        }
+    },
+    parse: function (text) {
+        var at = 0;
+        var ch = ' ';
+
+        function error(m) {
+            throw {
+                name: 'JSONError',
+                message: m,
+                at: at - 1,
+                text: text
+            };
+        }
+
+        function next() {
+            ch = text.charAt(at);
+            at += 1;
+            return ch;
+        }
+
+        function white() {
+            while (ch != '' && ch <= ' ') {
+                next();
+            }
+        }
+
+        function str() {
+            var i, s = '', t, u;
+
+            if (ch == '"') {
+outer:          while (next()) {
+                    if (ch == '"') {
+                        next();
+                        return s;
+                    } else if (ch == '\\') {
+                        switch (next()) {
+                        case 'b':
+                            s += '\b';
+                            break;
+                        case 'f':
+                            s += '\f';
+                            break;
+                        case 'n':
+                            s += '\n';
+                            break;
+                        case 'r':
+                            s += '\r';
+                            break;
+                        case 't':
+                            s += '\t';
+                            break;
+                        case 'u':
+                            u = 0;
+                            for (i = 0; i < 4; i += 1) {
+                                t = parseInt(next(), 16);
+                                if (!isFinite(t)) {
+                                    break outer;
+                                }
+                                u = u * 16 + t;
+                            }
+                            s += String.fromCharCode(u);
+                            break;
+                        default:
+                            s += ch;
+                        }
+                    } else {
+                        s += ch;
+                    }
+                }
+            }
+            error("Bad string");
+        }
+
+        function arr() {
+            var a = [];
+
+            if (ch == '[') {
+                next();
+                white();
+                if (ch == ']') {
+                    next();
+                    return a;
+                }
+                while (ch) {
+                    a.push(val());
+                    white();
+                    if (ch == ']') {
+                        next();
+                        return a;
+                    } else if (ch != ',') {
+                        break;
+                    }
+                    next();
+                    white();
+                }
+            }
+            error("Bad array");
+        }
+
+        function obj() {
+            var k, o = {};
+
+            if (ch == '{') {
+                next();
+                white();
+                if (ch == '}') {
+                    next();
+                    return o;
+                }
+                while (ch) {
+                    k = str();
+                    white();
+                    if (ch != ':') {
+                        break;
+                    }
+                    next();
+                    o[k] = val();
+                    white();
+                    if (ch == '}') {
+                        next();
+                        return o;
+                    } else if (ch != ',') {
+                        break;
+                    }
+                    next();
+                    white();
+                }
+            }
+            error("Bad object");
+        }
+
+        function num() {
+            var n = '', v;
+            if (ch == '-') {
+                n = '-';
+                next();
+            }
+            while (ch >= '0' && ch <= '9') {
+                n += ch;
+                next();
+            }
+            if (ch == '.') {
+                n += '.';
+                while (next() && ch >= '0' && ch <= '9') {
+                    n += ch;
+                }
+            }
+            if (ch == 'e' || ch == 'E') {
+                n += 'e';
+                next();
+                if (ch == '-' || ch == '+') {
+                    n += ch;
+                    next();
+                }
+                while (ch >= '0' && ch <= '9') {
+                    n += ch;
+                    next();
+                }
+            }
+            v = +n;
+            if (!isFinite(v)) {
+                error("Bad number");
+            } else {
+                return v;
+            }
+        }
+
+        function word() {
+            switch (ch) {
+                case 't':
+                    if (next() == 'r' && next() == 'u' && next() == 'e') {
+                        next();
+                        return true;
+                    }
+                    break;
+                case 'f':
+                    if (next() == 'a' && next() == 'l' && next() == 's' &&
+                            next() == 'e') {
+                        next();
+                        return false;
+                    }
+                    break;
+                case 'n':
+                    if (next() == 'u' && next() == 'l' && next() == 'l') {
+                        next();
+                        return null;
+                    }
+                    break;
+            }
+            error("Syntax error");
+        }
+
+        function val() {
+            white();
+            switch (ch) {
+                case '{':
+                    return obj();
+                case '[':
+                    return arr();
+                case '"':
+                    return str();
+                case '-':
+                    return num();
+                default:
+                    return ch >= '0' && ch <= '9' ? num() : word();
+            }
+        }
+
+        return val();
+    }
+};
+
+
+
+/** Initialize all of our objects now. */
+window.historyStorage.init();
+window.dhtmlHistory.create();

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/6b1dba58/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/excanvas.js
----------------------------------------------------------------------
diff --git 
a/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/excanvas.js 
b/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/excanvas.js
new file mode 100644
index 0000000..12c74f7
--- /dev/null
+++ 
b/dependencies/org.wso2.carbon.ui/src/main/resources/web/admin/js/excanvas.js
@@ -0,0 +1 @@
+if(!document.createElement("canvas").getContext){(function(){var z=Math;var 
K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var 
F=D/2;function T(){return this.context_||(this.context_=new W(this))}var 
O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return 
function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return 
String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function 
r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var
 
Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var
 E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var 
i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatec
 hange",G(this.init_,this,i))}},init_:function(m){var 
j=m.getElementsByTagName("canvas");for(var 
Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var
 
Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return
 i}};function S(i){var 
Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function
 w(i){var 
Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px
 "}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var 
AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function 
V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var 
Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var 
AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function 
Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var
 
B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",
 
chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffo
 
n:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#
 
B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function
 g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var 
j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return
 j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return 
Math.min(Z,Math.max(j,i))}function c(AF){var 
j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var
 m=l<0.5?l*(1+s):l+s-l*s;var 
AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function
  A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return 
i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return 
i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var 
AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var 
m=g(Z);var AE="#",AF;for(var 
j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var
 m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var 
L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var
 f={};function X(Z){if(f[Z]){return f[Z]}var 
m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return 
f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function
 P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var 
AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof 
j.size=="number"){Z.size=j.size}else{if(
 
j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return
 Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px 
"+Z.family}function 
t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function
 
W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px
 
sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var
 
Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var
 M=W.pro
 
totype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var
 
j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var
 
j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var
 Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var 
m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function 
e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var
 AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var 
AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var
 m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE
 
.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var
 AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var 
Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var 
m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var 
AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var
 
p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var
 
p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var
 p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y
 1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new 
v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return
 AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var 
AI=AO.runtimeStyle.width;var 
AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var
 AG=AO.width;var 
AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw
 Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var 
m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' 
coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"p
 
x;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var
 
p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var
 AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var 
AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0
 ",K(AS.x/D),"px ",K(AS.y/D),"px 
0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", 
sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push('
 ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," 
height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' 
cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," 
/>","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var
 m=10;var AN=10;var AE=5000;var AG={x:
 null,y:null};var AL={x:null,y:null};for(var 
AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var 
AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' 
style="position:absolute;width:',m,"px;height:",AN,'px;"',' 
coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' 
path="');var AO=false;for(var 
AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push("
 m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var 
Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m 
",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l 
",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x 
");Z=null;break;case"bezierCurveTo":AK.push(" c 
",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push("
 ",Z.type," 
",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," 
",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," 
",K(Z.xStart),",",K(Z.yStart)
 ," 
",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push('
 
">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function
 R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var 
Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' 
opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' 
miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' 
weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var 
AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var 
m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var 
AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var 
AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var 
Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.a
 tan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var 
Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var
 Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var 
AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var 
AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var 
AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var 
Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" 
"+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" 
focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' 
colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' 
angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof 
u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' 
position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" 
/>')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var 
Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:f
 ill color="',AT,'" opacity="',Ad,'" 
/>')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var
 
Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var
 
Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function
 H(Z){return 
isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function
 y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var 
p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var
 
Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var
 m=U(i);var j=J(i);var 
Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var
 Z=[[j,0,0],[0,i,0],[0,0,1
 ]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var 
j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var
 
Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var
 AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var 
Z=P(X(this.font),this.element_);var j=AA(Z);var 
AR=this.element_.currentStyle;var 
p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case
 
null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var
 AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" 
to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' fill
 ed="',!AG,'" stroked="',!!AG,'" 
style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var
 
AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var
 AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' 
offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" 
/>','<g_vml_:textpath on="true" string="',AD(AK),'" 
style="v-text-align:',p,";font:",AD(j),'" 
/></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var
 Z='<span 
style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var
 i=this.element_.ownerDocument;this.textMea
 
sureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return
 new u(i,Z)};function 
v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function
 u(i,Z){q(i);switch(Z){case"repeat":case 
null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function
 n(Z){throw new o(Z)}function 
q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function
 o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var 
x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.D
 
OMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()};
\ No newline at end of file

Reply via email to