﻿/// <reference path="~/Scripts/ByteStorm/_BSC_Interface.js" />
(function() {
    BSC.U = function() {
        /// <summary>Javascript data cache 1</summary>
        var FormatQueryString = function(s) {
            if (!s) return "";
            return "\"" + s.replace(/\"/g, "") + "\"";
        };
        var FormatQueryArray = function(s) {
            var regArrayValues = new RegExp("(\d|\w*)[,]?]*", "g");
            var sb = new BSC.U.StringBuffer();
            var r = BSC.R.QueryArray.exec(s);
            do {
                if (!r) break;
                var value = r[1];
                if (BSC.R.Integer.test(value))
                    sb.append(value);
                else
                    sb.append(FormatString(value));

                r = BSC.R.QueryArray.exec(s);
                if (r) sb.append(",");

            }
            while (r != null)
            return sb.toString();
        };

        var getRandomNum = function() {
            // between 0 - 1
            var rndNum = Math.random()
            // rndNum from 0 - 1000    
            rndNum = parseInt(rndNum * 1000);
            // rndNum from 33 - 127        
            rndNum = (rndNum % 94) + 33;
            return rndNum;
        }

        var checkPunc = function(num) {
            if ((num >= 33) && (num <= 47)) { return true; }
            if ((num >= 58) && (num <= 64)) { return true; }
            if ((num >= 91) && (num <= 96)) { return true; }
            if ((num >= 123) && (num <= 126)) { return true; }
            return false;
        }


        var generateRandomPassword = function(p1, p2, p3) {
            var length = (!p1) ? 6 : p1;
            var noPunction = (!p2) ? true : p2;
            var randomLength = (!p3) ? false : p3;
            var sPassword = "";


            if (randomLength) {
                length = Math.random();
                length = parseInt(length * 100);
                length = (length % 7) + 6
            }


            for (i = 0; i < length; i++) {
                numI = getRandomNum();
                if (noPunction) { while (checkPunc(numI)) { numI = getRandomNum(); } }
                sPassword = sPassword + String.fromCharCode(numI);
            }
            return sPassword;
        };

        return {
            GenerateRandomPassword: generateRandomPassword,
            CleanHtml: function(s) {
                return s;
            },
            CleanString: function(s) {
                return s;
            },
            ChopString: function(s, l) {
                currentlength = s.length;
                if (currentlength > l) {
                    s = s.slice(0, l);
                    s = s + "...";
                }
                return s;
            },
            FormatDate: function(d, f) {
                var day = d.getDay();
                var date = d.getDate();
                var month = d.getMonth();
                var year = "" + d.getFullYear();
                //var year = d.getYear();
                var hours = d.getHours();
                var minute = d.getMinutes();
                var seconds = d.getSeconds();

                date = (date < 10) ? "0" + date : date;
                month = (month < 10) ? "0" + month : month;
                hours = (hours < 10) ? "0" + hours : hours;
                minute = (minute < 10) ? "0" + minute : minute;
                seconds = (seconds < 10) ? "0" + seconds : seconds;
                year = year.substring(2);

                // f = yy.mo.dd at hh:mm:ss => 2008.04.12 at 		        
                var newd = f.replace(/yy/g, year);
                newd = newd.replace(/mo/g, month);
                newd = newd.replace(/dd/g, date);
                newd = newd.replace(/hh/g, hours);
                newd = newd.replace(/mm/g, minute);
                newd = (hours <= 12) ? newd + " am" : newd + " pm";
                return newd;
            },
            PI: function(i) {
                /// <summary>ParseInt</summary>
                /// <param name="i">Number to parse</param>
                /// <return>Integer</return>
                return parseInt(i);
            },
            NewGUID: function() {
                var g, i, j;
                g = '';
                for (j = 0; j < 32; j++) {
                    if (j == 8 || j == 12 || j == 16 || j == 20)
                        g = g + '-';
                    i = Math.floor(Math.random() * 16).toString(16).toLowerCase();
                    g = g + i;
                }
                return g;
            },
            CleanQuery: function(q) 
            {
                var newQuery = {};
                for (k in q)
                { 
                    if((k).indexOf("__") != 0)
                        newQuery[k] = q[k];    
                }
//                ]if (q.__guid) delete q.__guid;
//                if (q.__ticket) delete q.__ticket;
                return newQuery;
            },
            ValidateQuery: function(q) {
                var sb = new BSC.U.StringBuffer();
                var first = true;
                var reg = new RegExp("([^=&]+)=([^&]+)", "g");
                // (?[^=&]+)=(?[^&]+)
                // ([^=]*)=([^&]*)[&]?

                var r = reg.exec(q);
                do {
                    if (!r) break;
                    var id = r[1];
                    var value = r[2];
                    if (BSC.R.Integer.test(value))
                        sb.append("\"" + id + "\":" + value);
                    //                    else if(BSC.R.QueryArray.test(value))
                    //                        sb.append(id+"=["+FormatArray(value)+"]"); 
                    else
                        sb.append("\"" + id + "\":" + FormatQueryString(value));

                    r = reg.exec(q);
                    if (r) sb.append(",");

                }
                while (r != null);

                return "{" + sb.toString() + "}";
            },
            ParseQuery: function(q, schema) {
                q = BSC.U.ValidateQuery(q);
                var jQ = null;

                //				if (schema)
                //				{
                //					var validator = JSONValidator(schema, true);
                //					var isValid = null;
                //					try { isValid = validator(q); } catch (e) { /*alert("BSC.U.ParseQuery:\n"+e.message);*/ }
                //					if (!isValid) return null;
                //				}
                try { jQ = BSC.D.JSON.Parse(q); } catch (e) { /*alert(e.message);*/return null; }

                return jQ;
            },
            QueryToString: function(q) {
                var s = "";
                for (k in q) {
                    s = s + k + "=" + q[k] + "&";
                }
                if (s.length > 0) s = s.substring(0, s.length - 1);
                return s;
            },
            MergeObjects: function(o1, o2, p1) {
                if (!o2 && o1) return o1;
                if (!o1 && o2) return o1;

                var overWriteEntry = (p1) ? true : false;

                for (k in o2) {
                    o1[k] = o2[k];
                    //					if (o2[k]==null)
                    //						
                    //					else if (overWriteEntry)
                    //						o1[k] = o2[k];
                }
                return o1;
            },
            StringBuffer: function(s) {
                this.buffer = [];
                if (s) this.buffer.push(s);
                this.append = function(s) { this.buffer.push(s); }
                this.toString = function() { return this.buffer.join(""); }
            }
        };
    } ();
    window.PI = BSC.U.PI;
})();
    /*
     
    */

/// http://blog.stevenlevithan.com/archives/faster-trim-javascript
String.prototype.trim = function(str)
{
    var str = this.replace(/^\s\s*/, ""), ws = /\s/, i = str.length;
    while (ws.test(str.charAt(--i))) { };
    return str.slice(0, i + 1);
};
//function trim10 (str) {
//			var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
//			for (var i = 0; i < str.length; i++) {
//				if (whitespace.indexOf(str.charAt(i)) === -1) {
//					str = str.substring(i);
//					break;
//				}
//			}
//			for (i = str.length - 1; i >= 0; i--) {
//				if (whitespace.indexOf(str.charAt(i)) === -1) {
//					str = str.substring(0, i + 1);
//					break;
//				}
//			}
//			return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
//		}

    
/*
var isNumeric = function(x) {
   // returns true if x is numeric and false if it is not.
   var RegExp = /^(-)?(\d*)(\.?)(\d*)$/; 
   return String(x).match(RegExp);
}
var myArray = [1,'two',3,'four',5,'six',7,'eight',9,'ten'];
var oddArray=myArray.filter(isNumeric);

document.writeln(oddArray);   // outputs: 1,3,5,7,9
*/
//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
//http://www.hunlock.com/blogs/Mastering_Javascript_Arrays#quickIDX13
//http://www.hunlock.com/blogs/Mastering_Javascript_Arrays

if (!Array.prototype.filter)
{
    Array.prototype.filter = function(fun /*, thisp*/)
    {
        var len = this.length;
        if (typeof fun != "function")
        {
            throw new TypeError();
        }
        var res = new Array();
        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
            if (i in this)
            {
                var val = this[i]; // in case fun mutates this
                if (fun.call(thisp, val, i, this))
                    res.push(val);
            }
        }

        return res;
    };
}
// Now all arrays where we don't specifiy anything else 
// get sorted with ignoreCase on 
Array.prototype.sortIgnoreCase=true; 

// http://www.thomasfrank.se/sorting_things.html
/*
objSort v 1.1
copyright 2006 Thomas Frank

This program is free software under the terms of the 
GNU General Public License version 2 as published by the Free 
Software Foundation. It is distributed without any warranty.
*/

tfObjSort = {
	init: function()
	{
		Array.prototype.objSort = function()
		{
			tfObjSort.setThings(this);
			var a = arguments;
			var x = tfObjSort;
			x.a = [];
			x.d = [];
			for (var i = 0; i < a.length; i++)
			{
				if (typeof a[i] == "string")
				{
					x.a.push(a[i]); x.d.push(1);
				}
				if (a[i] === -1)
				{
					x.d[x.d.length - 1] = -1;
				}
			}
			return this.sort(tfObjSort.sorter);
		};
		Array.prototype.strSort = function()
		{
			tfObjSort.setThings(this);
			return this.sort(tfObjSort.charSorter);
		}
	},
	sorter: function(x, y)
	{
		var a = tfObjSort.a;
		var d = tfObjSort.d;
		var r = 0;
		for (var i = 0; i < a.length; i++)
		{
			if (typeof x + typeof y != "objectobject")
			{
				return typeof x == "object" ? -1 : 1;
			}
			var m = x[a[i]];
			var n = y[a[i]];
			var t = typeof m + typeof n;
			if (t == "booleanboolean")
			{
				m *= -1; n *= -1;
			}
			else if (t.split("string").join("").split("number").join("") != "")
			{
				continue
			}
			r = m - n;
			if (isNaN(r))
			{
				r = tfObjSort.charSorter(m, n);
			}
			if (r != 0)
			{
				return r * d[i];
			}
		}
		return r
	},
	charSorter: function(x, y)
	{
		if (tfObjSort.ignoreCase)
		{
			x = x.toLowerCase(); y = y.toLowerCase();
		}
		var s = tfObjSort.chars;
		if (!s)
		{
			return x > y ? 1 : x < y ? -1 : 0;
		}
		x = x.split("");
		y = y.split("");
		l = x.length > y.length ? y.length : x.length;
		var p = 0;
		for (i = 0; i < l; i++)
		{
			p = s.indexOf(x[i]) - s.indexOf(y[i]);
			if (p != 0)
				break;
		};
		if (p == 0) { p = x.length - y.length; };
		return p
	},
	setThings: function(x)
	{
		this.ignoreCase = x.sortIgnoreCase;
		var s = x.sortCharOrder;
		if (!s) { this.chars = false; return true; };
		if (!s.sort) { s = s.split(","); };
		var a = "";
		for (i = 1; i < 1024; i++) { a += String.fromCharCode(i); };
		for (i = 0; i < s.length; i++)
		{
			z = s[i].split("");
			var m = z[0]; var n = z[1]; var o = "";
			if (z[2] == "_") { o = n + m; } else { o = m + n; }
			a = a.split(m).join("").split(n).join(o);
		};
		this.chars = a;
	}
};
tfObjSort.init();

