
    (function(window){
	if(("HC" in window))return;
	window.HC  = {}; 	
        HC.VERSION = '';
        
        HC.HOST = ("https:" == document.location.protocol ? "https" : "http") + '://' + (document.location.hostname == 'siteheart.dev' ? 'siteheart.dev' : (document.location.hostname == 'siteheart.my' ? 'siteheart.my' : 'siteheart.com')) ;
      
        if(document.location.hostname.indexOf('.dev') != -1 || "HCDeveloper" in window)
        HC.HOST = ("https:" == document.location.protocol ? "https" : "http") + '://' +  'siteheart.dev';
	
	if(document.location.hostname == '10.1.206.76')
        HC.HOST = ("https:" == document.location.protocol ? "https" : "http") + '://' +  '10.1.206.76';
        
	HC.dir = HC.HOST + '/apps/';
        HC.autoId = 1;
	
	HC.readyState = 0;

        HC.DEBUG = false;
	
	        
        HC.tmplLoad = function(url, callback, crossDomain){
	    
	    
	     
            var params = {
		url	: url,
		cache	: true,
		async	: true,
		data    : {version : HC.VERSION},
		success	: function(tpl){ HC.tmplParse(tpl, callback); },
		complete : function(e){ }
	    };
         
            if(crossDomain){
		 
		if(url.indexOf('http://') == -1 && url.indexOf('https://') == -1){url = HC.HOST + url;}
		var Jsonp = "HCTmplLoad" + HC.autoId++;
                window[Jsonp] = function(tpl){   HC.tmplParse(tpl, callback);};
                params.url = HC.HOST + '/esapi/tmpl/?callback=?&tmpl=' + url;
                params.jsonpCallback = Jsonp;
                params.dataType = 'json';
                params.crossDomain = true;		
            }
            jQuery.ajax(params);
        };        
        
        
        
        HC.tmplParse = function(tpl, callback){    
	   
	   
            if(typeof(tpl) == 'object')tpl = tpl.data;
			var re = new RegExp('<template name="([a-zA-Z_-]*)"[^>]*>(.*?)</template>','gi');
		    var template;
		    tpl = tpl.replace( /[\r\t\n]/g, "" ).replace(/\s{2,}/g, ' ').replace(/>\s</g, '><');
		   
		    try{
			while ((template = re.exec(tpl)) != null)
			    jQuery.template(template[1], template[2]);
		    }catch(e){
			alert("ERROR");
		    }
		
   	        if(typeof(callback) == 'function')callback();				
        };
        
        
        
    


        HC.addJS = function(file, callback){
            if(file.indexOf('http://') == -1 && file.indexOf('https://') == -1){file = HC.HOST + file;}
            if(HC.DEBUG){
             file += '?t='+(new Date()).getTime()
            }
           var s = document.createElement('script');
                s.type  = 'text/javascript';
                s.async = true;
                s.src   = file;
                if(callback){

                    s.onload = callback;
                    s.onreadystatechange = function(){  if(s.readyState == 'loaded')callback(); };

                }
                HC.addFile(s);
            return s;
        };
 
 
 
 
        HC.addCSS = function(file){
             if(file.indexOf('http://') == -1 && file.indexOf('https://') == -1){file =  HC.HOST + file;}
             if(HC.DEBUG){file += '?t='+(new Date()).getTime()};
            var s = document.createElement('link');
                s.rel = 'stylesheet';
                s.href  = file;
                HC.addFile(s);
		
            return s;
        };
 
 
 
        HC.addFile = function(s){
            var c = (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]);
                c.appendChild(s);		
        };



        /**
          * @description Load Application
          * return application constructor
          */
        
        HC.widget = function(Name, initParams, callback, isDev){
	    
	    if(HC.readyState == 1){
		HC.widgetInit(Name, initParams, callback, isDev);
	    }else{
		var interval; interval = setInterval(function(){
			if(HC.readyState != 1)return;
			clearInterval(interval);
			HC.widgetInit(Name, initParams, callback, isDev);
		}, 30);
	    }
	    
        };
	
	var widgetStart = [];
	HC.widgetInit  = function(Name, initParams, callback, isDev){
	    
	     Folder = isDev ? Name + 'dev' : Name;
	    
	    if(!(Name in HC) || !(Name.toLowerCase() in widgetStart)){
		 
		HC.widgetVersion(Name, initParams, function(response){		    
		    jQuery.getScript(HC.dir + Folder.toLowerCase() + '/js/app.start.js?version=' + response.version, function(){
                        HC.widgetStart(Name, initParams, callback, isDev);
                    });		    
		}, isDev);
		widgetStart[Name.toLowerCase()] = 1;		
 
            }else{
                
		 var interval; interval = setInterval(function(){
			if(!(Name in HC))return;
			clearInterval(interval);
			HC.widgetStart(Name, initParams, callback, isDev);
		    }, 30);
            }
 
	};
	

	HC.widgetStart = function(Name, initParams, callback, isDev){
	    
	    var app = new HC[Name](initParams, isDev);
		app.init();
	    if(typeof(callback) == 'function')
		    callback(app, initParams);	   
			    
	};
	
	
	var widgetVersionArray = {};
	var widgetVersionStart = {};
	HC.widgetVersion = function(Name, initParams, callback, isDev){
	    
	    
	    Folder = isDev ? Name + 'dev' : Name;
	    
	    var file_version = (("app" in initParams) ? initParams.app : Name.toLowerCase()) + ".version.js";
	    
	    if(!(file_version in widgetVersionArray) && !(file_version in widgetVersionStart) ){
		
		widgetVersionStart[file_version] = 1;
		
		var file = HC.dir + Folder.toLowerCase() + "/" + file_version;
		var HCVersion = "HCVersion" + Name;		
		var params = {url : file + "?callback=?", cache	: false, async : true, jsonpCallback : HCVersion, dataType   : 'json', crossDomain : true };	     
		    jQuery.ajax(params);		    
		    window[HCVersion] = function(response){ 
			if(HC.DEBUG)response.version += (new Date()).getTime();
			HC.VERSION = response.version;
			widgetVersionArray[file_version] = response;
			callback(response);
		    };
		
		
	    }else{
		 var interval; interval = setInterval(function(){
			if(!(Name in HC))return;
			clearInterval(interval);
			callback(widgetVersionArray[file_version]);
		    }, 10);
	    } 
	};
	
	
	
	
	
    HC.app = function(name, params, callback){

	var data = null;
		
	var loadScript = function(response, files, number){
		if(!files || !files.length)return;
		var file = files[number];
		if(file.indexOf('?') == -1)
		    file +='?version=' + response.version;
		else
		    file +='&version=' + response.version;
		jQuery.getScript(file, function(){
		    if(files.length == (number + 1)){
			if(typeof callback == 'function')callback(data);
		    }else{
			loadScript(response, files, number + 1);
		    }
		});
	    };
							
	var loadCSS = function(response, files, number){
		if(!files || !files.length)return;
		var file = files[number];
		if(file.indexOf('?') == -1)
		    file +='?version=' + response.version;
		else
		    file +='&version=' + response.version;
		jQuery.getCSS(file, function(){
		    if(files.length != (number + 1)){
			loadCSS(response, files, number + 1);
		    }
		});
	    };
	   
	       file = (("app" in params) ? params.app.toLowerCase() : name.toLowerCase()) + ".version.js";
		var HCVersion = "HCVersion" + name;
		var version = (params.version || (new Date()).getTime());
		var params2 = {url : file + "?callback=?&version=" + version, cache : true, async : true, jsonpCallback : HCVersion, dataType   : 'json', crossDomain : true };	     
		    jQuery.ajax(params2);
		    
		    window[HCVersion] = function(response){ 			 
			if(HC.DEBUG)response.version += (new Date()).getTime();
			HC.VERSION   = response.version;
			loadCSS(response,   response.files.css, 0);
			loadScript(response, response.files.js, 0);
		    };	    
	    
	};
	
	
	var readyCallbacks = [];
	var callReady = function(){
	    for(var i = 0; i < readyCallbacks.length; i++)readyCallbacks[i]();
	};
	
	
	HC.ready = function(callback){
	    
	    if(HC.readyState == 1)return callback();
	    
	    return readyCallbacks.push(callback);
	};
	
	
	
	

        
	HC.init = function(){
	    if(!("jQuery" in window))
		return HC.addJS(document.location.protocol + '//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js', HC.init);
		
	    jQuery.ajaxSetup({cache : true});
	    
	    if(!("tmpl" in jQuery))
		return jQuery.getScript(document.location.protocol + '//ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js', HC.init);   
	    
	    HC.readyState = 1;
	    
	    callReady();
	   
	    return true;
	};
	HC.init();
	
	
    })(window);

  
   

