﻿(function(){window.ensure=function(data,callback,scope){if(typeof jQuery=="undefined"&&typeof Sys=="undefined"&&typeof Prototype=="undefined"){return alert("jQuery, Microsoft ASP.NET AJAX or Prototype library not found. One must be present for ensure to work");}if(typeof data.test!="undefined"){var test=function(){return data.test;};if(typeof data.test=="string"){test=function(){return !(eval("typeof "+data.test)=="undefined"&&document.getElementById(data.test)==null);};}else{if(typeof data.test=="function"){test=data.test;}}if(test()===false||typeof test()=="undefined"||test()==null){new ensureExecutor(data,callback,scope);}else{callback();}}else{new ensureExecutor(data,callback,scope);}};window.ensureExecutor=function(data,callback,scope){this.data=this.clone(data);this.callback=(typeof scope=="undefined"||null==scope?callback:this.delegate(callback,scope));this.loadStack=[];if(data.js&&data.js.constructor!=Array){this.data.js=[data.js];}if(data.html&&data.html.constructor!=Array){this.data.html=[data.html];}if(data.css&&data.css.constructor!=Array){this.data.css=[data.css];}if(typeof data.js=="undefined"){this.data.js=[];}if(typeof data.html=="undefined"){this.data.html=[];}if(typeof data.css=="undefined"){this.data.css=[];}this.init();this.load();};window.ensureExecutor.prototype={init:function(){if(typeof jQuery!="undefined"){this.getJS=HttpLibrary.loadJavascript_jQuery;this.httpGet=HttpLibrary.httpGet_jQuery;}else{if(typeof Prototype!="undefined"){this.getJS=HttpLibrary.loadJavascript_Prototype;this.httpGet=HttpLibrary.httpGet_Prototype;}else{if(typeof Sys!="undefined"){this.getJS=HttpLibrary.loadJavascript_MSAJAX;this.httpGet=HttpLibrary.httpGet_MSAJAX;}else{throw"jQuery, Prototype or MS AJAX framework not found";}}}},getJS:function(data){},httpGet:function(url,callback){},load:function(){this.loadJavascripts(this.delegate(function(){this.loadCSS(this.delegate(function(){this.loadHtml(this.delegate(function(){this.callback();}));}));}));},loadJavascripts:function(complete){var scriptsToLoad=this.data.js.length;if(0===scriptsToLoad){return complete();}this.forEach(this.data.js,function(href){if(HttpLibrary.isUrlLoaded(href)||this.isTagLoaded("script","src",href)){scriptsToLoad--;}else{this.getJS({url:href,success:this.delegate(function(content){scriptsToLoad--;HttpLibrary.registerUrl(href);}),error:this.delegate(function(msg){scriptsToLoad--;if(typeof this.data.error=="function"){this.data.error(href,msg);}})});}});this.until({test:function(){return scriptsToLoad===0;},delay:50,callback:this.delegate(function(){complete();})});},loadCSS:function(complete){if(0===this.data.css.length){return complete();}var head=HttpLibrary.getHead();this.forEach(this.data.css,function(href){if(HttpLibrary.isUrlLoaded(href)||this.isTagLoaded("link","href",href)){}else{var self=this;try{(function(href,head){var link=document.createElement("link");link.setAttribute("href",href);link.setAttribute("rel","Stylesheet");link.setAttribute("type","text/css");head.appendChild(link);HttpLibrary.registerUrl(href);}).apply(window,[href,head]);}catch(e){if(typeof self.data.error=="function"){self.data.error(href,e.message);}}}});complete();},loadHtml:function(complete){var htmlToDownload=this.data.html.length;if(0===htmlToDownload){return complete();}this.forEach(this.data.html,function(href){if(HttpLibrary.isUrlLoaded(href)){htmlToDownload--;}else{this.httpGet({url:href,success:this.delegate(function(content){htmlToDownload--;HttpLibrary.registerUrl(href);var parent=(this.data.parent||document.body.appendChild(document.createElement("div")));if(typeof parent=="string"){parent=document.getElementById(parent);}parent.innerHTML=content;}),error:this.delegate(function(msg){htmlToDownload--;if(typeof this.data.error=="function"){this.data.error(href,msg);}})});}});this.until({test:function(){return htmlToDownload===0;},delay:50,callback:this.delegate(function(){complete();})});},clone:function(obj){var cloned={};for(var p in obj){var x=obj[p];if(typeof x=="object"){if(x.constructor==Array){var a=[];for(var i=0;i<x.length;i++){a.push(x[i]);}cloned[p]=a;}else{cloned[p]=this.clone(x);}}else{cloned[p]=x;}}return cloned;},forEach:function(arr,callback){var self=this;for(var i=0;i<arr.length;i++){callback.apply(self,[arr[i]]);}},delegate:function(func,obj){var context=obj||this;return function(){func.apply(context,arguments);};},until:function(o){if(o.test()===true){o.callback();}else{window.setTimeout(this.delegate(function(){this.until(o);}),o.delay||50);}},isTagLoaded:function(tagName,attName,value){var tag=document.createElement(tagName);tag[attName]=value;var tagFound=false;var tags=document.getElementsByTagName(tagName);this.forEach(tags,function(t){if(tag[attName]===t[attName]){tagFound=true;return false;}});return tagFound;}};var userAgent=navigator.userAgent.toLowerCase();var HttpLibrary={browser:{version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)},loadedUrls:{},isUrlLoaded:function(url){return HttpLibrary.loadedUrls[url]===true;},unregisterUrl:function(url){HttpLibrary.loadedUrls[url]=false;},registerUrl:function(url){HttpLibrary.loadedUrls[url]=true;},createScriptTag:function(url,success,error){var scriptTag=document.createElement("script");scriptTag.setAttribute("type","text/javascript");scriptTag.setAttribute("src",url);scriptTag.onload=scriptTag.onreadystatechange=function(){if((!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){success();}};scriptTag.onerror=function(){error(data.url+" failed to load");};var head=HttpLibrary.getHead();head.appendChild(scriptTag);},getHead:function(){return document.getElementsByTagName("head")[0]||document.documentElement;},globalEval:function(data){var script=document.createElement("script");script.type="text/javascript";if(HttpLibrary.browser.msie){script.text=data;}else{script.appendChild(document.createTextNode(data));}var head=HttpLibrary.getHead();head.appendChild(script);},loadJavascript_jQuery:function(data){if(HttpLibrary.browser.safari){return jQuery.ajax({type:"GET",url:data.url,data:null,success:function(content){HttpLibrary.globalEval(content);data.success();},error:function(xml,status,e){if(xml&&xml.responseText){data.error(xml.responseText);}else{data.error(url+"\n"+e.message);}},dataType:"html"});}else{HttpLibrary.createScriptTag(data.url,data.success,data.error);}},loadJavascript_MSAJAX:function(data){if(HttpLibrary.browser.safari){var params={url:data.url,success:function(content){HttpLibrary.globalEval(content);data.success(content);},error:data.error};HttpLibrary.httpGet_MSAJAX(params);}else{HttpLibrary.createScriptTag(data.url,data.success,data.error);}},loadJavascript_Prototype:function(data){if(HttpLibrary.browser.safari){var params={url:data.url,success:function(content){HttpLibrary.globalEval(content);data.success(content);},error:data.error};HttpLibrary.httpGet_Prototype(params);}else{HttpLibrary.createScriptTag(data.url,data.success,data.error);}},httpGet_jQuery:function(data){return jQuery.ajax({type:"GET",url:data.url,data:null,success:data.success,error:function(xml,status,e){if(xml&&xml.responseText){data.error(xml.responseText);}else{data.error("Error occured while loading: "+url+"\n"+e.message);}},dataType:data.type||"html"});},httpGet_MSAJAX:function(data){var _wRequest=new Sys.Net.WebRequest();_wRequest.set_url(data.url);_wRequest.set_httpVerb("GET");_wRequest.add_completed(function(result){var errorMsg="Failed to load:"+data.url;if(result.get_timedOut()){errorMsg="Timed out";}if(result.get_aborted()){errorMsg="Aborted";}if(result.get_responseAvailable()){data.success(result.get_responseData());}else{data.error(errorMsg);}});var executor=new Sys.Net.XMLHttpExecutor();_wRequest.set_executor(executor);executor.executeRequest();},httpGet_Prototype:function(data){new Ajax.Request(data.url,{method:"get",evalJS:false,onSuccess:function(transport,json){data.success(transport.responseText||"");},onFailure:data.error});}};})();