/**
 * JQuery Toolbox class contains useful helpers
 */
LIB3m5.JQueryToolbox = (function($) {

    /** this pointer **/
    var base;

	/**
	 * @constructor
	 */
	var JQueryToolbox = function(){
        base = this;
		base.clazz = Toolbox;
		base.$ = $(this);
	};

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// STATIC METHODS
	JQueryToolbox.configure = function(params){
		LIB3m5.JQueryToolbox.jsonpURI = params.jsonpURI;
	};
	
	/**
	 * static function for get the class name of an object
	 * @param {Object} obj
	 * @return {String} the objects name
	 */
	JQueryToolbox.getObjectClass = function(obj){
		if (obj && obj.constructor && obj.constructor.toString) {
			var arr = obj.constructor.toString().match(/function\s*(\w+)/);
			
			if (arr && arr.length == 2) {
				return arr[1];
			}
		}
		
		return undefined;
	};
	
	/**
	 * @param {string} dateString
	 */
	JQueryToolbox.parseXMLDate = function(dateString) {
		try {
			var dateTimeParts = dateString.split("T");
			var dateParts = dateTimeParts[0].split("-");
			var timeParts = dateTimeParts[1].split(":");
//			$.log("parts", [dateTimeParts, dateParts, timeParts]);
			
			return new Date(dateParts[0], dateParts[1]-1, dateParts[2], timeParts[0], timeParts[1], timeParts[2]);
		}
		catch(e) {
		}
		return null;
	};
	
	JQueryToolbox.replaceMarkersInString = function(txt, replacementMap){
		
		if (txt && replacementMap) {
			try {
				for (var marker in replacementMap) {
					var regExp = new RegExp("\\$\{" + marker + "\}", "gi"); // regexp to replace all
					txt = txt.replace(regExp, replacementMap[marker]); // replace all
				}
			} 
			catch (e) {
				$.log("ERROR " + e, e);
			}
		}
		return txt;
	};
	
	JQueryToolbox.jsonp = function(url){
		var deferred = $.Deferred(function(dfd){
			$.jsonp({
				url: LIB3m5.JQueryToolbox.jsonpURI + url + "&callback=?",
				cache: true,
				success: function(json){
					dfd.resolve(json.data);
				},
				error: function(data){
					$.log("error: ", data);
					
					dfd.reject();
				}
			});
		});
		
		return deferred;
	};

    JQueryToolbox.html2rgba = function (hex, alpha) {
        var r, g, b;
        hex = ( hex.charAt(0) == "#" ? hex.substr(1) : hex );
        // check if 6 letters are provided
        if (hex.length == 6) {
          r = parseInt(hex.substring(0, 2), 16);
          g = parseInt(hex.substring(2, 4), 16);
          b = parseInt(hex.substring(4, 6), 16);
        }
        else if (hex.length == 3) {
          r = parseInt(hex.substring(0, 1) + hex.substring(0, 1), 16);
          g = parseInt(hex.substring(1, 2) + hex.substring(1, 2), 16);
          b = parseInt(hex.substring(2, 3) + hex.substring(2, 3), 16);
        }

        return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')';
    };

    JQueryToolbox.parseIntColor = function (col) {
        var colInt = parseInt(col);
        var colStr = colInt.toString(16);
        while(colStr.length < 6) {
            colStr = "0" + colStr;
        }
        return "#" + colStr;
    };

    JQueryToolbox.flashHtmlToBrowserHtml = function(flashHtml, targetElement, options) {
        // std parameter values
        if(options == undefined) options = {};

        var rawElement = $('<div></div>');
        rawElement.append($(flashHtml));

        rawElement.find(">p").each(function(idx, e) {
            var contentElement = $(this);

            var maxLineHeight = 0;
            contentElement.find("font").each(function(idx, e) {
                var size = parseInt($(this).attr("size"));
                if(size > maxLineHeight) {
                    maxLineHeight = size;
                }
                $(this).attr("style", "font-size: " + size + "px !important; line-height: " + Math.floor(size*1.2) + "px !important");
            });

            // Create an IMG element and attach it to the DIV.
            var line = document.createElement("div");
            if(options.paddingLeft) {
                line.style.paddingLeft = options.paddingLeft;
            }
            if(options.paddingRight) {
                line.style.paddingRight = options.paddingRight;
            }
            if(options.paddingTop) {
                line.style.paddingTop = options.paddingTop;
            }
            if(options.paddingBottom) {
                line.style.paddingBottom = options.paddingBottom;
            }

            var span = document.createElement("span");
//            span.style.whiteSpace = "nowrap";
            span.style.zIndex = "2";
            span.innerHTML = contentElement.html();
            line.appendChild(span);
            // use jQuery append
            targetElement.append(line);
        });
    };
	
	JQueryToolbox.getStackTrace = function(){
         re = /function\W+([\w-]+)/i;

         var f = arguments.callee;
         var s = "";
         while (f)
         {
          s += (re.exec(f))[1] + '(';

          for (i = 0; i < f.arguments.length - 1; i++)
          {
           s += "'" + f.arguments[i] + "', ";
          }

          if (arguments.length > 0)
          {
           s += "'" + f.arguments[i] + "'";
          }

          s += ")\n";

          f = f.arguments.callee.caller;
         }
		return s;
	};

    JQueryToolbox.isValidateEmail = function (email) {
        var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        return email.match(re);
    };

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	return JQueryToolbox;
	
})(jQuery);
