﻿var overlayLevel = 0;

function AjaxForm(form) {
   var url = $(form).attr('action');
   var div = 'body #' + $(form).attr('replaceElement');

   overlayLevel++;
   $('#ajaxOverlay').show();
   $('#ajaxOverlay').css('width', jQuery(window).width());
   $('#ajaxOverlay').css('height', jQuery(document).height());

   $(':input[type=checkbox]', form).each(function() {
       if (!$(this).attr("checked")) {
           $(this).attr("disabled", "true");
       }
   });

   $jf.toggleLoading();

   $.ajax({
       method: 'post', url: url, data: $(':input[type!=checkbox][type!=radio][type!=button][type!=submit],:input[type=checkbox]:checked,:input[type=radio]:checked', form),
       success: function(html) {

           if (html.substring(0, "#kyozouaxaj#".length) == "#kyozouajax#") {
               html = html.substring("#kyozouajax#".length, html.length);
               var elems = splitByTag(html, "AjaxElement");

               for (var i = 0; i < elems.length; i++) {
                   var elem = elems[i];
                   var elemName = splitByTag(elem, "AjaxElementName")[0];
                   var elemHtml = splitByTag(elem, "AjaxElementHtml")[0];
                   $('body #' + elemName).html(elemHtml);
               }
           }
           else {
               $(div).html(html);
           }
           overlayLevel--;
           if (overlayLevel == 0)
               $('#ajaxOverlay').hide();

           singOnForms();

           if (typeof ($(form).data("onLoadSuccess")) != "undefined")
               $(form).data("onLoadSuccess")();

       }    // close success

       ,

       error: function(xhr, status, error) {
           // alert(status);
           // alert(error);
           // alert(xhr.responseText);
           $('#ajaxErrorOverlay').show();
           $('#ajaxErrorOverlay').css('width', jQuery(window).width());
           $('#ajaxErrorOverlay').css('height', jQuery(document).height());
           $('#ajaxErrorOverlay').append(xhr.responseText);
       }

       ,

       complete: function() {
           $jf.toggleLoading();
       }
   });                    // close ajax
   return false;

}

function splitByTag(str, ename) {
    var reg = new RegExp("" + ename + "Start\\w+");

    var res = new Array();

    while (true) {
        var ss = "#" + ename + "Start#";
        var se = "#" + ename + "End#"
        var is = str.indexOf(ss);
        var ie = str.indexOf(se);
        if (is < 0 || ie < 0) break;
        var rstr = str.substring(is + ss.length, ie);
        var str = str.substring(ie + se.length, str.length);

        res.push(rstr);
    }

    return res;
}

$(document).ready(function() {
    singOnForms();
    addOverlays();
    jFace.init();
});

function singOnForms() {

    $('form[type=ajax][signedonajax!=true]').submit(function() { return AjaxForm(this); });
    $('form[type=ajax]').attr("signedonajax", "true");

}

function addOverlays() {
    $('body').append("<div id='ajaxOverlay' style='display:none;background:#666; filter:alpha(opacity: 30); opacity:0.3; z-index:1000; top:0; left:0; position:absolute; align:center;' />");
    $('body').append("<div id='ajaxErrorOverlay' style='display:none;background:#fff; z-index:1001; top:0; left:0; position:absolute; align:center;' />");
}

(function($){
	$.jFace = jFace = window.jFace = $jf = {
		init: function(settings) {
			$jf.settings 	= $.extend({}, $jf.defaults, settings);
			$jf.w 			= $(window);
			$jf.b 			= $('body');
			$jf.d 			= $(document);
			$jf.page 		= $jf.b;
			$jf.wrap		= $('<div id="jface"></div>'); 
			$jf.console		= null;
			
			$jf.bD 			= {};//body dimensions
			$jf.bS 			= {};//body scrolls
			$jf.mouse 		= {};//mouse positions
			
			//service stuff
			$jf.overlay 	= $('<div id="jface-overlay style="display:none;"></div>');
			
			$jf.loading 	= $('<div id="jface-loading"><div></div></div>');
				$jf.loading.frame = 1;
				$jf.loading.timer = null;
				
			$jf.wait	 	= null;
			$jf.preloads 	= [];
			
			if ( !$('#jface').length ) {
				$jf.page.append($jf.wrap);
				$jf.wrap.append($jf.overlay);
				$jf.overlay.shown = false;
				$jf.w.data('overlay', $jf.overlay);
				$jf.wrap.append($jf.loading);
				$jf.loading.shown = false;
			}
			
			$jf.startTrackScreen();
		},
		
	
		startTrackScreen: function(){
			$jf.bD = $.getBodyDimensions();
			$jf.bS = $.getScrolls();
			$jf.w.bind('resize', function(){
				$jf.bD = $.getBodyDimensions();
				if ($jf.loading.shown) {
					$jf.loading.centrify();
				}				
			}).bind('scroll', function(){
				$jf.bS = $.getScrolls();
				if ($jf.loading.shown) {
					$jf.loading.centrify();
				}
			});
		},
		
		toggleOverlay: function(opacity){
			if (!$jf.overlay.shown) {
				$jf.bD = $.getBodyDimensions();
				var styles = {'width': $jf.bD.wW, 'height': $jf.bD.bH, display:'block'};
				if (undefined!=opacity) styles.opacity = opacity;
				$jf.overlay.css(styles);
				$jf.overlay.shown = true;
			} else {
				$jf.overlay.hide();
				$jf.overlay.shown = false;
			}
		},
		
		toggleLoading: function(){
			clearInterval($jf.loading.timer);
			if (!$jf.loading.shown) {
				$jf.bS = $.getScrolls();
				//$jf.bD = $.getBodyDimensions();
				$jf.loading.centrify().show();
				$jf.loading.div = $jf.loading.find('div');
				$jf.loading.timer = setInterval($jf.animateLoading, 66);
				$jf.loading.shown = true;
				
			} else {
				$jf.loading.hide();
				$jf.loading.shown = false;
			}			
		},	
	
		animateLoading: function(){
			if (!$jf.loading.shown){
				clearInterval($jf.loading.timer);
				return;
			};
			$jf.loading.div.css('top', ($jf.loading.frame * -40) + 'px');
			$jf.loading.frame = ($jf.loading.frame + 1) % 12;
		}
	};//end jFace

//jQuery service extensions
	$.extend({
		getScrolls: function(){
			var xS, yS;
	
			if (self.pageYOffset) {
				yS = self.pageYOffset;
				xS = self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollTop) {
				yS = document.documentElement.scrollTop;
				xS = document.documentElement.scrollLeft;
			} else if (document.body) {
				yS = document.body.scrollTop;
				xS = document.body.scrollLeft;	
			}
	
			return {xScroll:xS, yScroll:yS};			
		},
		getBodyDimensions: function(){
			return {wW:$jf.w.width(), wH:$jf.w.height(), bW:$jf.b.width(), bH:$jf.b.height()};			
		}
		
	});
	
	$.fn.centrify = function(){
		$this = $(this);
		var h = $this.height();
		var w = $this.width();
		return $this.css({'left': (($jf.bD.wW - w) / 2 + $jf.bS.xScroll), 'top':(($jf.bD.wH - h) / 2 + $jf.bS.yScroll)});		
	};
})(jQuery);



