/* http://www.codeplex.com/ensure * Omar AL Zabir * Ensure Version 1.0 * License: Common Development and Distribution License (CDDL)  */ (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})}}})();