<!DOCTYPE html>
<html>

<head>
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap-theme.min.css">
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>

  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular-route.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>
  <script src="jsdeffered.js"></script>
  <script src="script.js"></script>
  <link rel="stylesheet" href="style.css">
  <style>
        
    </style>
  
</head>

<body ng-app="MultipleModelsApp" class="container">

  <div class="col-sm-6" ng-controller="NavCtrl">
    <div class="col-sm-6 nav" ng-repeat="view in views">
      <button type="button" class="btn btn-info" ng-click="setView(view.name)">{{view.name}}</button>
    </div>

  </div>
  <div class="col-sm-12 content" ng-view="">

  </div>



</body>

</html>
(function() {


      var AngularApp = angular.module("MultipleModelsApp", ['ngRoute']);

      AngularApp.factory('DataRequestPost', function($http, $q) {

        return {

          get: function(url, json) {
            var mydeffered = $q.defer();
            $http({
              url: url,
              method: "POST",
              data: json
            })
              .success(mydeffered.resolve).error(mydeffered.reject);
            return mydeffered.promise;
          }
        }
      });

      AngularApp.factory('DataRequestGet', function($http, $q) {
        return {
          get: function(url) {
            var def = $q.defer();
            $http.get(url).success(def.resolve).error(def.reject);
            return def.promise;
          }
        }

      });


      // Not applicable for Plunker
      AngularApp.factory('ViewService', function($http, $q, $rootScope) {
        var views = [{
          name: 'Funds',
          Title: "Fund History",
          url: '/vm/ExtractPortfolio',
          queurl: '/vm/FundByID',
          quenewurl: '/vn/NewFund',
          updateurl: '/vm/SubmitFund'
        }, {
          name: 'Holders',
          Title: "Account Holders",
          url: '/vm/ExtractHolders',
          queurl: '/vm/HolderById',
          quenewurl: '/vm/NewHolder',
          updateurl: '/vm/SubmitHolder'
        }];
        return {
          getViews: function() {
            return views;
          },
          getUrl: function(type) {
            var query = (type == 'query') ? "$.queurl" : (type == 'new') ? "$.quenewurl" : (type == 'update') ? "$.updateurl" : "$.url";
            var view = $rootScope.view;
            var url = Enumerable.From(views)
              .Where(function(x) {
                return x.name == view
              })
              .Select(query)
              .FirstOrDefault();
            return url;

          },
          getTitle: function() {
            var view = $rootScope.view;
            var title = Enumerable.From(views)
              .Where(function(x) {
                return x.name == view
              })
              .Select(function(x) {
                return x.Title
              })
              .FirstOrDefault();
            return title;
          }
        }
      });

      AngularApp.config(['$routeProvider',
        function($routeProvider) {
          $routeProvider
            .when('/', {
              templateUrl: 'list.html',
              controller: 'ListCtrl'
            })
            .when('/Modify/:id', {
              templateUrl: 'update.html',
              controller: 'ModifyCtrl'
            })
            .when('/New', {
              templateUrl: 'new.html',
              controller: 'NewCtrl'
            });

        }
      ]);

      AngularApp.controller("NavCtrl", function($scope, $rootScope, ViewService) {


        $scope.views = ViewService.getViews();
        $rootScope.views = ViewService.getViews();


        $scope.init = function() {
          $rootScope.view = "Funds";
        }
        $scope.init();

        $scope.setView = function(view) {
          if (view !== $rootScope.view) {
            $rootScope.view = view;
            $rootScope.$emit("App.ViewChange");
          }
        }

      });



      AngularApp.controller("ModifyCtrl", function($scope, DataRequestPost, $routeParams, $window, $rootScope, ViewService, DatRequestSimulator) {

        $scope.id = $routeParams.id;

        $scope.Loading = false;

        $scope.back = function() {
          $window.history.back();
        }
        
        // Implemented for Plunker
        var retrieve = function(){
          console.log("retrieve");
          DatRequestSimulator.getByID($scope.id).then(function(data){
           $scope.Model = resolvemodel(data[0]);
           $scope.Loading = false;
          });
        }

        // Implemented for a Real Server Side Request (Not used in Plunker)
        var retrieveModel = function() {
          var url = ViewService.getUrl('query');
          var params = {
            id: $scope.id
          };
          DataRequestPost.get(url, params).then(function(data) {
            var model = JSON.parse(data);
            $scope.Model = resolvemodel(model);
          });
        }

        var resolvemodel = function(model) {
          var fields = model.fields;
          var length = fields.length;
          for (var i = 0; i < length; i++) {

            if (model.fields[i].inputType === "date") {
              var day = new Date(model.fields[i].FieldValue);
              model.fields[i].FieldValue = new Date(day.getTime() + day.getTimezoneOffset() * 60000);
            };
          }
          return model;
        }

        var UpdateModel = function(model) {
          $scope.Loading = true;
          var url = ViewService.getUrl('update')
          var params = {
            model: JSON.stringify(model)
          };
          DataRequest.get(url, params).then(function(data) {
            $scope.Loading = false;

          });

        }

        $scope.Update = function(model) {
          alert("No Server Side Implementation")
          //UpdateModel(model);
        }

        $scope.init = function() {
          $scope.Loading = true;
          retrieve();
          //retrieveModel(); // for the actual server
        }
        $scope.init();

      });

      AngularApp.controller("NewCtrl", function($scope, DataRequestPost, $routeParams, $window, $rootScope, ViewService, DataRequestGet, DatRequestSimulator) {


        // Implemented for Plunker
        var retrieve = function(){
         DatRequestSimulator.getNew().then(function(data){
           console.log(data);
           $scope.Model = data[0];
         });
        }


        // Implemented for a Real Server Side Request
        var retrieveModel = function() {
          var url = ViewService.getUrl('new');
          console.log(url);
          DataRequestGet.get(url).then(function(data) {
            var model = JSON.parse(data);
            $scope.Model = model;
          });
        }

        var updateModel = function(model) {
          var url = ViewService.getUrl('update');
          var params = JSON.stringify(model);
          DataRequestPost.get(url, params).then(function(data) {
            console.log(data);
          });
        }

        $scope.back = function() {
          $window.history.back();
        }

        $scope.Update = function(model) {
          //updateModel();
          alert("No Server Side Implementation")
        }

        $scope.init = function() {
          retrieve();
          //retrieveModel(); // for real server
        }
        $scope.init();

      });

      AngularApp.controller("ListCtrl", function($scope, $location, $rootScope, DataRequestGet, ViewService, DatRequestSimulator) {

        $rootScope.$on("App.ViewChange", function() {
          $location.path("/");
          $scope.init();
        });

        var viewurl = "";
        var geturl = function() {
          var url = ViewService.getUrl('list');
          return url;

        }


        var setTitle = function() {
          $scope.Title = ViewService.getTitle();
        }

        // Impleted for Plunker
        var retrieve = function() {
          console.log("execute get simulator");
          DatRequestSimulator.getDta().then(function(data) {
           $scope.Model = data[0]; // [0] since it was push into an array
            $scope.List = $scope.Model[0];
            $scope.Loading = false;
          })
        }

        // Implemented for Real Server Side Request
        var retrievelist = function() {

          DataRequestGet.get(viewurl).then(function(data) {
            var serialize = JSON.parse(data);
            $scope.Model = serialize;
            $scope.List = serialize[0];
            console.log(JSON.stringify(serialize));

          });

        }
        $scope.GoTo = function(view, id) {
          console.log(view);
          console.log(id);
          $location.path("/Modify/" + id);

        }
        $scope.NewModel = function() {
          $location.path("/New");
        }
        $scope.Loading = false;

        $scope.init = function() {
          $scope.Loading = true;
          setTitle();
          retrieve();
          //retrievelist();
        }
        $scope.init();
      });


      AngularApp.factory('DatRequestSimulator', function($q, $rootScope) {
        var funds = [{
          "MapId": "af1d7bd8-5378-4b62-89ea-220c2dd22764",
          "fields": [{
            "Label": "Money Market Fund",
            "FieldName": "MoneyMarketFund",
            "FieldValue": 27000,
            "inputType": "number"
          }, {
            "Label": "Common Stocks",
            "FieldName": "CommonStocks",
            "FieldValue": 52000,
            "inputType": "number"
          }, {
            "Label": "Stock Mutual Fund",
            "FieldName": "StockMutualFund",
            "FieldValue": 128000,
            "inputType": "number"
          }, {
            "Label": "Bond Fund",
            "FieldName": "BondFund",
            "FieldValue": 53000,
            "inputType": "number"
          }, {
            "Label": "As of",
            "FieldName": "ValueDate",
            "FieldValue": "2006-12-10T00:00:00",
            "inputType": "date"
          }]
        }, {
          "MapId": "a18c2f35-4a40-49be-b44c-31f04c63e443",
          "fields": [{
            "Label": "Money Market Fund",
            "FieldName": "MoneyMarketFund",
            "FieldValue": 26205,
            "inputType": "number"
          }, {
            "Label": "Common Stocks",
            "FieldName": "CommonStocks",
            "FieldValue": 57044,
            "inputType": "number"
          }, {
            "Label": "Stock Mutual Fund",
            "FieldName": "StockMutualFund",
            "FieldValue": 138496,
            "inputType": "number"
          }, {
            "Label": "Bond Fund",
            "FieldName": "BondFund",
            "FieldValue": 54060,
            "inputType": "number"
          }, {
            "Label": "As of",
            "FieldName": "ValueDate",
            "FieldValue": "2007-03-31T00:00:00",
            "inputType": "date"
          }]
        }, {
          "MapId": "1cbe9699-9ec9-43f6-86fe-2f9be0eaf6d1",
          "fields": [{
            "Label": "Money Market Fund",
            "FieldName": "MoneyMarketFund",
            "FieldValue": 25398,
            "inputType": "number"
          }, {
            "Label": "Common Stocks",
            "FieldName": "CommonStocks",
            "FieldValue": 62235,
            "inputType": "number"
          }, {
            "Label": "Stock Mutual Fund",
            "FieldName": "StockMutualFund",
            "FieldValue": 197498,
            "inputType": "number"
          }, {
            "Label": "Bond Fund",
            "FieldName": "BondFund",
            "FieldValue": 55142,
            "inputType": "number"
          }, {
            "Label": "As of",
            "FieldName": "ValueDate",
            "FieldValue": "2008-09-30T00:00:00",
            "inputType": "date"
          }]
        }, {
          "MapId": "bc0842d6-cf01-4587-9c40-01f56fffb122",
          "fields": [{
            "Label": "Money Market Fund",
            "FieldName": "MoneyMarketFund",
            "FieldValue": 24579,
            "inputType": "number"
          }, {
            "Label": "Common Stocks",
            "FieldName": "CommonStocks",
            "FieldValue": 64911,
            "inputType": "number"
          }, {
            "Label": "Stock Mutual Fund",
            "FieldName": "StockMutualFund",
            "FieldValue": 201843,
            "inputType": "number"
          }, {
            "Label": "Bond Fund",
            "FieldName": "BondFund",
            "FieldValue": 56244,
            "inputType": "number"
          }, {
            "Label": "As of",
            "FieldName": "ValueDate",
            "FieldValue": "2009-05-10T00:00:00",
            "inputType": "date"
          }]
        }];
        var holders = [{
          "MapId": "16192b4a-ce4c-47ab-a008-9bd370a5ddd9",
          "fields": [{
            "Label": "Name",
            "FieldName": "FirstName",
            "FieldValue": "Charles",
            "inputType": "text"
          }, {
            "Label": "LastName",
            "FieldName": "LastName",
            "FieldValue": "Smith",
            "inputType": "text"
          }, {
            "Label": "Email",
            "FieldName": "Email",
            "FieldValue": "chalessmith@myemail.com",
            "inputType": "text"
          }, {
            "Label": "Address",
            "FieldName": "Address",
            "FieldValue": "110 York ST",
            "inputType": "text"
          }, {
            "Label": "ZipCode",
            "FieldName": "ZipCode",
            "FieldValue": 68106,
            "inputType": "number"
          }, {
            "Label": "Age",
            "FieldName": "Age",
            "FieldValue": 25,
            "inputType": "number"
          }]
        }, {
          "MapId": "3a2a97ee-3dfc-4b07-9d2f-b285726780e4",
          "fields": [{
            "Label": "Name",
            "FieldName": "FirstName",
            "FieldValue": "Luis",
            "inputType": "text"
          }, {
            "Label": "LastName",
            "FieldName": "LastName",
            "FieldValue": "Ortiz",
            "inputType": "text"
          }, {
            "Label": "Email",
            "FieldName": "Email",
            "FieldValue": "luisortiz@myemail.com",
            "inputType": "text"
          }, {
            "Label": "Address",
            "FieldName": "Address",
            "FieldValue": "220 North",
            "inputType": "text"
          }, {
            "Label": "ZipCode",
            "FieldName": "ZipCode",
            "FieldValue": 68144,
            "inputType": "number"
          }, {
            "Label": "Age",
            "FieldName": "Age",
            "FieldValue": 32,
            "inputType": "number"
          }]
        }, {
          "MapId": "6e32d5a6-b253-4205-903d-62f98c1ae359",
          "fields": [{
            "Label": "Name",
            "FieldName": "FirstName",
            "FieldValue": "Frank",
            "inputType": "text"
          }, {
            "Label": "LastName",
            "FieldName": "LastName",
            "FieldValue": "Olsen",
            "inputType": "text"
          }, {
            "Label": "Email",
            "FieldName": "Email",
            "FieldValue": "frankolsen@myemail.com",
            "inputType": "text"
          }, {
            "Label": "Address",
            "FieldName": "Address",
            "FieldValue": "112 South",
            "inputType": "text"
          }, {
            "Label": "ZipCode",
            "FieldName": "ZipCode",
            "FieldValue": 65132,
            "inputType": "number"
          }, {
            "Label": "Age",
            "FieldName": "Age",
            "FieldValue": 41,
            "inputType": "number"
          }]
        }];
        var newFund = {"MapId":"51da78ff-7a60-4daa-946f-f64c90211c70","fields":[{"Label":"Money Market Fund","FieldName":"MoneyMarketFund","FieldValue":0,"inputType":"number"},{"Label":"Common Stocks","FieldName":"CommonStocks","FieldValue":0,"inputType":"number"},{"Label":"Stock Mutual Fund","FieldName":"StockMutualFund","FieldValue":0,"inputType":"number"},{"Label":"Bond Fund","FieldName":"BondFund","FieldValue":0,"inputType":"number"},{"Label":"As of","FieldName":"ValueDate","FieldValue":"0001-01-01T00:00:00","inputType":"date"}]};
        var newHolder = {"MapId":"560fa842-4de9-4366-b537-a19f4fa2902d","fields":[{"Label":"Name","FieldName":"FirstName","FieldValue":null,"inputType":"text"},{"Label":"LastName","FieldName":"LastName","FieldValue":null,"inputType":"text"},{"Label":"Email","FieldName":"Email","FieldValue":null,"inputType":"text"},{"Label":"Address","FieldName":"Address","FieldValue":null,"inputType":"text"},{"Label":"ZipCode","FieldName":"ZipCode","FieldValue":0,"inputType":"number"},{"Label":"Age","FieldName":"Age","FieldValue":0,"inputType":"number"}]};
        
        var getData = function() {
          var deferred = $q.defer();
          var view = $rootScope.view;
          Deferred.define();
          var result = new Array;
          next(function() {
            var model = ('Funds' == view) ? funds : holders;
            result.push(model);
            return wait(2); // 2 Second to Simulate Server Request
          })
            .next(function() {
              deferred.resolve(result);
            });
          return deferred.promise;
        }
        var getId = function(id){
          var deferred = $q.defer();
          var view = $rootScope.view;
          //Deferred.define();
          var resultByID = new Array;
          next(function() {
            var model = ('Funds' == view) ? funds : holders;
            var singleModel = Enumerable.From(model)
                              .Where(function(x){ return x.MapId == id })
                              .Select(function(x){return x}).FirstOrDefault();
            console.log("query below")                  
            console.log(singleModel);                  
            resultByID.push(singleModel);                
            return wait(1); // 1 Second to Simulate Server Request
          })
            .next(function() {
              deferred.resolve(resultByID);
            });
          return deferred.promise;
        }
        var getnew = function(){
          var deferred = $q.defer();
          var view = $rootScope.view;
          Deferred.define();
          var result = new Array;
          next(function() {
            var model = ('Funds' == view) ? newFund : newHolder;
            console.log(model);
            result.push(model);
            return wait(1); // 2 Second to Simulate Server Request
          })
            .next(function() {
              deferred.resolve(result);
            });
          return deferred.promise;
        
        }

        return {
          get: function(modeltype) {
            var model = (modeltype == 'Funds') ? funds : holders;
            return model;
          },
          getDta: getData,
          getByID : function(id){ return  getId(id); },
          getNew : getnew
          
          



        }
      });









    }).call(this);

/* Styles go here */

.container {
  margin-top: 70px;
}
.content {
  margin-top: 20px;
}
.nav {
 margin-top:10px;
}
* AngularJS Model From .NET MVC Application using Reflection Example
* select a record from list of views
<div class="row" >
            <div class="col-sm-12" >
               
                <h2>{{ Title }}</h2>
            <table class="table table-hover" ng-show="!Loading">
                <thead >
                    <th ng-repeat="field in List.fields"> {{ field.Label  }}</th>
                </thead>
                <tbody>
                    <tr ng-repeat="row in Model" ng-click="GoTo(ModelType, row.MapId)">
                        <td ng-repeat="item in row.fields" >
                            <span ng-show="item.inputType == 'date'">
                                {{ item.FieldValue | date: 'MM/dd/yyyy'}}
                            </span>
                            <span ng-show="item.inputType != 'date'">
                                {{ item.FieldValue }}
                            </span>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div class="col-sm-12">
        <div class="progress" ng-show="Loading">
          <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="45" style="width: 100%">
            <i>Loading {{ Title }}..</i>
            </div>
          </div>
        
        </div>
        
        <div class="row">
            <button type="button" class="btn btn-success" ng-click="NewModel()" >+ New</button>
        </div>
        
    </div>
// JSDeferred 0.4.0 Copyright (c) 2007 cho45 ( www.lowreal.net )
// See http://github.com/cho45/jsdeferred
function Deferred () { return (this instanceof Deferred) ? this.init() : new Deferred() }
Deferred.ok = function (x) { return x };
Deferred.ng = function (x) { throw  x };
Deferred.prototype = {
	
	_id : 0xe38286e381ae,

	
	init : function () {
		this._next    = null;
		this.callback = {
			ok: Deferred.ok,
			ng: Deferred.ng
		};
		return this;
	},

	
	next  : function (fun) { return this._post("ok", fun) },

	
	error : function (fun) { return this._post("ng", fun) },

	
	call  : function (val) { return this._fire("ok", val) },

	
	fail  : function (err) { return this._fire("ng", err) },

	
	cancel : function () {
		(this.canceller || function () {})();
		return this.init();
	},

	_post : function (okng, fun) {
		this._next =  new Deferred();
		this._next.callback[okng] = fun;
		return this._next;
	},

	_fire : function (okng, value) {
		var next = "ok";
		try {
			value = this.callback[okng].call(this, value);
		} catch (e) {
			next  = "ng";
			value = e;
			if (Deferred.onerror) Deferred.onerror(e);
		}
		if (Deferred.isDeferred(value)) {
			value._next = this._next;
		} else {
			if (this._next) this._next._fire(next, value);
		}
		return this;
	}
};
Deferred.isDeferred = function (obj) {
	return !!(obj && obj._id === Deferred.prototype._id);
};

Deferred.next_default = function (fun) {
	var d = new Deferred();
	var id = setTimeout(function () { d.call() }, 0);
	d.canceller = function () { clearTimeout(id) };
	if (fun) d.callback.ok = fun;
	return d;
};
Deferred.next_faster_way_readystatechange = ((typeof window === 'object') && (location.protocol == "http:") && !window.opera && /\bMSIE\b/.test(navigator.userAgent)) && function (fun) {
	var d = new Deferred();
	var t = new Date().getTime();
	if (t - arguments.callee._prev_timeout_called < 150) {
		var cancel = false;
		var script = document.createElement("script");
		script.type = "text/javascript";
		script.src  = "data:text/javascript,";
		script.onreadystatechange = function () {
			if (!cancel) {
				d.canceller();
				d.call();
			}
		};
		d.canceller = function () {
			if (!cancel) {
				cancel = true;
				script.onreadystatechange = null;
				document.body.removeChild(script);
			}
		};
		document.body.appendChild(script);
	} else {
		arguments.callee._prev_timeout_called = t;
		var id = setTimeout(function () { d.call() }, 0);
		d.canceller = function () { clearTimeout(id) };
	}
	if (fun) d.callback.ok = fun;
	return d;
};
Deferred.next_faster_way_Image = ((typeof window === 'object') && (typeof(Image) != "undefined") && !window.opera && document.addEventListener) && function (fun) {
	var d = new Deferred();
	var img = new Image();
	var handler = function () {
		d.canceller();
		d.call();
	};
	img.addEventListener("load", handler, false);
	img.addEventListener("error", handler, false);
	d.canceller = function () {
		img.removeEventListener("load", handler, false);
		img.removeEventListener("error", handler, false);
	};
	img.src = "data:image/png," + Math.random();
	if (fun) d.callback.ok = fun;
	return d;
};
Deferred.next_tick = (typeof process === 'object' && typeof process.nextTick === 'function') && function (fun) {
	var d = new Deferred();
	process.nextTick(function() { d.call() });
	if (fun) d.callback.ok = fun;
	return d;
};
Deferred.next = 
	Deferred.next_faster_way_readystatechange ||
	Deferred.next_faster_way_Image ||
	Deferred.next_tick ||
	Deferred.next_default;

Deferred.chain = function () {
	var chain = Deferred.next();
	for (var i = 0, len = arguments.length; i < len; i++) (function (obj) {
		switch (typeof obj) {
			case "function":
				var name = null;
				try {
					name = obj.toString().match(/^\s*function\s+([^\s()]+)/)[1];
				} catch (e) { }
				if (name != "error") {
					chain = chain.next(obj);
				} else {
					chain = chain.error(obj);
				}
				break;
			case "object":
				chain = chain.next(function() { return Deferred.parallel(obj) });
				break;
			default:
				throw "unknown type in process chains";
		}
	})(arguments[i]);
	return chain;
};

Deferred.wait = function (n) {
	var d = new Deferred(), t = new Date();
	var id = setTimeout(function () {
		d.call((new Date()).getTime() - t.getTime());
	}, n * 1000);
	d.canceller = function () { clearTimeout(id) };
	return d;
};

Deferred.call = function (fun) {
	var args = Array.prototype.slice.call(arguments, 1);
	return Deferred.next(function () {
		return fun.apply(this, args);
	});
};

Deferred.parallel = function (dl) {
	var isArray = false;
	if (arguments.length > 1) {
		dl = Array.prototype.slice.call(arguments);
		isArray = true;
	} else if (Array.isArray && Array.isArray(dl) || typeof dl.length == "number") {
		isArray = true;
	}
	var ret = new Deferred(), values = {}, num = 0;
	for (var i in dl) if (dl.hasOwnProperty(i)) (function (d, i) {
		if (typeof d == "function") dl[i] = d = Deferred.next(d);
		d.next(function (v) {
			values[i] = v;
			if (--num <= 0) {
				if (isArray) {
					values.length = dl.length;
					values = Array.prototype.slice.call(values, 0);
				}
				ret.call(values);
			}
		}).error(function (e) {
			ret.fail(e);
		});
		num++;
	})(dl[i], i);

	if (!num) Deferred.next(function () { ret.call() });
	ret.canceller = function () {
		for (var i in dl) if (dl.hasOwnProperty(i)) {
			dl[i].cancel();
		}
	};
	return ret;
};

Deferred.earlier = function (dl) {
	var isArray = false;
	if (arguments.length > 1) {
		dl = Array.prototype.slice.call(arguments);
		isArray = true;
	} else if (Array.isArray && Array.isArray(dl) || typeof dl.length == "number") {
		isArray = true;
	}
	var ret = new Deferred(), values = {}, num = 0;
	for (var i in dl) if (dl.hasOwnProperty(i)) (function (d, i) {
		d.next(function (v) {
			values[i] = v;
			if (isArray) {
				values.length = dl.length;
				values = Array.prototype.slice.call(values, 0);
			}
			ret.call(values);
			ret.canceller();
		}).error(function (e) {
			ret.fail(e);
		});
		num++;
	})(dl[i], i);

	if (!num) Deferred.next(function () { ret.call() });
	ret.canceller = function () {
		for (var i in dl) if (dl.hasOwnProperty(i)) {
			dl[i].cancel();
		}
	};
	return ret;
};


Deferred.loop = function (n, fun) {
	var o = {
		begin : n.begin || 0,
		end   : (typeof n.end == "number") ? n.end : n - 1,
		step  : n.step  || 1,
		last  : false,
		prev  : null
	};
	var ret, step = o.step;
	return Deferred.next(function () {
		function _loop (i) {
			if (i <= o.end) {
				if ((i + step) > o.end) {
					o.last = true;
					o.step = o.end - i + 1;
				}
				o.prev = ret;
				ret = fun.call(this, i, o);
				if (Deferred.isDeferred(ret)) {
					return ret.next(function (r) {
						ret = r;
						return Deferred.call(_loop, i + step);
					});
				} else {
					return Deferred.call(_loop, i + step);
				}
			} else {
				return ret;
			}
		}
		return (o.begin <= o.end) ? Deferred.call(_loop, o.begin) : null;
	});
};


Deferred.repeat = function (n, fun) {
	var i = 0, end = {}, ret = null;
	return Deferred.next(function () {
		var t = (new Date()).getTime();
		do {
			if (i >= n) return null;
			ret = fun(i++);
		} while ((new Date()).getTime() - t < 20);
		return Deferred.call(arguments.callee);
	});
};

Deferred.register = function (name, fun) {
	this.prototype[name] = function () {
		var a = arguments;
		return this.next(function () {
			return fun.apply(this, a);
		});
	};
};

Deferred.register("loop", Deferred.loop);
Deferred.register("wait", Deferred.wait);

Deferred.connect = function (funo, options) {
	var target, func, obj;
	if (typeof arguments[1] == "string") {
		target = arguments[0];
		func   = target[arguments[1]];
		obj    = arguments[2] || {};
	} else {
		func   = arguments[0];
		obj    = arguments[1] || {};
		target = obj.target;
	}

	var partialArgs       = obj.args ? Array.prototype.slice.call(obj.args, 0) : [];
	var callbackArgIndex  = isFinite(obj.ok) ? obj.ok : obj.args ? obj.args.length : undefined;
	var errorbackArgIndex = obj.ng;

	return function () {
		var d = new Deferred().next(function (args) {
			var next = this._next.callback.ok;
			this._next.callback.ok = function () {
				return next.apply(this, args.args);
			};
		});

		var args = partialArgs.concat(Array.prototype.slice.call(arguments, 0));
		if (!(isFinite(callbackArgIndex) && callbackArgIndex !== null)) {
			callbackArgIndex = args.length;
		}
		var callback = function () { d.call(new Deferred.Arguments(arguments)) };
		args.splice(callbackArgIndex, 0, callback);
		if (isFinite(errorbackArgIndex) && errorbackArgIndex !== null) {
			var errorback = function () { d.fail(arguments) };
			args.splice(errorbackArgIndex, 0, errorback);
		}
		Deferred.next(function () { func.apply(target, args) });
		return d;
	};
};
Deferred.Arguments = function (args) { this.args = Array.prototype.slice.call(args, 0) };

Deferred.retry = function (retryCount, funcDeferred, options) {
	if (!options) options = {};

	var wait = options.wait || 0;
	var d = new Deferred();
	var retry = function () {
		var m = funcDeferred(retryCount);
		m.
			next(function (mes) {
				d.call(mes);
			}).
			error(function (e) {
				if (--retryCount <= 0) {
					d.fail(['retry failed', e]);
				} else {
					setTimeout(retry, wait * 1000);
				}
			});
	};
	setTimeout(retry, 0);
	return d;
};

Deferred.methods = ["parallel", "wait", "next", "call", "loop", "repeat", "chain"];
Deferred.define = function (obj, list) {
	if (!list) list = Deferred.methods;
	if (!obj)  obj  = (function getGlobal () { return this })();
	for (var i = 0; i < list.length; i++) {
		var n = list[i];
		obj[n] = Deferred[n];
	}
	return Deferred;
};

this.Deferred = Deferred;

(function ($) {

	function wrap (obj) {
		obj.toJSDeferred = function () {
			return Deferred.absorb(this);
		};
		obj.next = function (fun) {
			return Deferred.absorb(this).next(fun);
		};
		obj.error = function (fun) {
			return Deferred.absorb(this).error(fun);
		};
		obj.done(function (v) {
			if (obj._next) obj._next._fire('ok', v);
		});
		obj.fail(function (v) {
			if (obj._next) obj._next._fire('ok', v);
		});

		var orig_promise = obj.promise;
		obj.promise = function () {
			return wrap(orig_promise.apply(this, arguments));
		};

		return obj;
	}
	
	Deferred.absorb = function (obj) {
		var ret = new Deferred();
		ret.progress = function () {};
		obj.done(function (v) {
			if (v.toJSDeferred) delete v.toJSDeferred;
			ret.call(v);
		});
		obj.fail(function (v) {
			if (v.toJSDeferred) delete v.toJSDeferred;
			ret.fail(v);
		});
		if (obj.progress) obj.progress(function (v) {
			ret.progress(v);
		});
		return ret;
	};

	var orig_Deferred = $.Deferred;
	$.Deferred = function (fun) {
		return wrap(orig_Deferred.apply(this, arguments));
	};

	var orig_ajax = $.ajax;
	$.ajax = function () {
		return orig_ajax.apply(this, arguments);
	};
	var orig_isDeferred = Deferred.isDeferred;
	Deferred.isDeferred = function (obj) {
		return orig_isDeferred(obj) || !!(obj && obj.toJSDeferred);
	};

	$.JSDeferred = Deferred;
})(jQuery);
<div class="col-sm-9" >
            <div class="row">

                 <button type="button" class="btn btn-danger" ng-click="back()">
                  << Back
                </button>

                <h1>{{ Title }}</h1>
                <form class="form-horizontal" role="form">
                      <div class="form-group"  ng-repeat="Field in Model.fields">
                          <div class="col-sm-3">
                            <label for="inputfield" >{{ Field.Label }}</label>
                           </div>
                          <div class="col-sm-9" >
                              <input  type="{{Field.inputType}}" class="form-control" id="inputfield" ng-model="Field.FieldValue" placeholder="{{ Field.Label }}" />
                         </div>
                      </div>
                      <div class="form-group">
                          <div class="col-sm-3"></div>
                        <div class="col-sm-9">
                          <div class="checkbox">
                            <label>
                               <button type="button"  class="btn btn-success" ng-click="Update(Model)" ng-show="!Loading">Update</button>
                            </label>
                          </div>
                        </div>
                      </div>  
                 </form>
            </div>
            
            <div class="col-sm-12">
        <div class="progress" ng-show="Loading">
          <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="45" style="width: 100%">
            <i>Loading record..</i>
            </div>
          </div>
        
        </div>
            
            
        </div>
<div class="col-sm-9" >
            <div class="row">

                 <button type="button" class="btn btn-danger" ng-click="back()">
                  << Back
                </button>

           
                <form class="form-horizontal" role="form">
                      <div class="form-group"  ng-repeat="Field in Model.fields">
                          <div class="col-sm-3">
                            <label for="inputfield" class="control-label">{{ Field.Label }}</label>
                           </div>
                          <div class="col-sm-9" >
                              <input  type="{{Field.inputType}}" class="form-control" id="inputfield" ng-model="Field.FieldValue" placeholder="{{ Field.Label }}" />
                         </div>
                      </div>
                      <div class="form-group">
                          <div class="col-sm-3"></div>
                        <div class="col-sm-9">
                          <div class="checkbox">
                            <label>
                               <button type="button"  class="btn btn-success" ng-click="Update(Model)" ng-show="!Loading">Update</button>
                            </label>
                          </div>
                        </div>
                      </div>  
                 </form>
            </div>
        </div>