/* helper functions, eg. hide/show blocks etc. */

var mixendo = {

    init: function() {

        if (!document.getElementsByClassName) {
            document.getElementsByClassName = mixendo.getElementsByClassName;
        }

        //scans for elements that require something
        var els = document.getElementsByClassName('hideable');

        el = document.createElement("div");
        el.className = "hideable_toggle";
        a_el = document.createElement("a");
        //href = document.createAttribute('href');
        //a_el.setAttribute(href,'#');
        a_el.setAttribute('href','#');
        a_el.setAttribute('onclick', 'toggle');
        a_el.innerHTML="Hide/Show";
        el.appendChild(a_el);
        /*
			hideplace=document.createElement("div");
			hideplace.style.display="none";
			hideplace.className="hideplace";
			classnames=document.createElement("div");
			classnames.style.display="none";
			classnames.className="hideplace_classnames";
         */
        for (var i=0;i<els.length;i++)
        {
            //els[i].setAttribute('title','Just click to Copy to clipboard');
            //els[i].onclick=onPREclick;
            //alert(els[i]);
            //if not ID, make for one
            if (!els[i].id) {
                var rand_no = Math.ceil(Math.random()* 1000);
                els[i].id='hideable_'+rand_no;
            }
            el.getElementsByTagName('a')[0].setAttribute('onclick', 'return mixendo.toggleHideableVisible("'+els[i].id+'")');
            els[i].insertBefore(el,els[i].firstChild);
        //els[i].appendChild(hideplace);
        //els[i].appendChild(classnames);
        }
    },

    toggleVisible: function(elId) {
        el = document.getElementById(elId);
        if (!el) return false;
        if  (el.style.display=="none") {
            el.style.display="block";
        }
        else {
            el.style.display="none";
        }
        return true;
    },

    toggleHideableVisible: function (elId) {
        el = document.getElementById(elId);
        if (!el) return false;
        if (el.className=="hideable hideable_hidden") {
            //el.style.display="block";
            //recovers what we have saved
            el.className=el.childNodes[2].innerHTML;
            el.innerHTML=el.childNodes[1].innerHTML;
        }
        else {
            // hide content and border
            var classNames=el.className;
            var innerHTML=el.innerHTML;
            var toggle="<div class='hideable_toggle'>"+el.firstChild.innerHTML+"</div>";

            hideplace=document.createElement("div");
            hideplace.style.display="none";
            hideplace.className="hideplace";
            hideplace.innerHTML=innerHTML;

            classnames=document.createElement("div");
            classnames.style.display="none";
            classnames.className="hideplace_classnames";
            classnames.innerHTML=classNames;

            //el.className="hideable hideable_hidden";
            el.innerHTML=toggle;
            el.appendChild(hideplace);
            el.appendChild(classnames);
            el.className="hideable hideable_hidden";

        /* hideable_hidden
		 hp=el.getElementsById('hideplace');
		 hpc=el.getElementsById('hideplace_classnames');
		 hpc.innerHTML=el.className;
		 hp.innerHTML=
		 el.style.width="0px";
		 el.style.overflow="hidden";
             */
        //el.className =
        }
        return false;
    },

    getElementsByClassName: function (searchClass,node,tag) {
        var classElements = new Array();
        if ( node == null )
            node = document;
        if ( tag == null )
            tag = '*';
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
        for (i = 0, j = 0; i < elsLen; i++) {
            if ( pattern.test(els[i].className) ) {
                classElements[j] = els[i];
                j++;
            }
        }
        return classElements;
    },

    /*
	 * @param text: string, it's the html code
	 * @param XHR_Request: string, it's the *name* of the javascript function that will call the xhr.

	    finds all links (A href or Form) in the text and replaces with the given XHR_Request function that accepts the following parameters:
		XHR_Request(mode, url) and will do everything necessary to display the result in the right place (eg. same frame where the 'text' is rendered)

     */
    parseForXHRBrowsing: function (text, XHR_Request) {
        function replacer(str, p1, offset, s)
        {
            //str: original string
            //p[i]: matched substring
            //offset
            var reAction= /action\s*=\s*([']([^']*)[']|["]([^"]*)["])/i;
            var reMethod= /method\s*=\s*([']([^']*)[']|["]([^"]*)["])/i;
            var reSubmit= /onsubmit\s*=\s*([']([^']*)[']|["]([^"]*)["])/i;
            var reId= /id\s*=\s*([']([^']*)[']|["]([^"]*)["])/i;

            var separator;
            var action = reAction.exec(str);
            if ((action) && (action.length==4)) {
                action=action[2]?action[2]:action[3];
                separator=action[2]?"\"":"'";
            } else {
                action = null
            }

            if (action != null) {
                var method = reMethod.exec(str);
                if ((method) && (method.length==4)) {
                    method=method[2]?method[2]:method[3];
                } else {
                    method = null
                }
                var submit = reSubmit.exec(str);
                if ((submit) && (submit.length==4)) {
                    submit=submit[2]?submit[2]:submit[3];
                    separator=action[2]?"\"":"'"; // hoping coeherency otherwise should make separate ones
                } else {
                    submit = null
                }
                var id = reId.exec(str);
                if ((id) && (id.length==4)) {
                    id=id[2]?id[2]:id[3];
                } else {
                    id = null
                }


                //alert(" a: "+action+" m: "+method+" s: "+submit);
                //alert(p1);
                //var xhrActionForm = 'javascript:parent.'+XHR_Request+'(\''+method+'\',\''+action+'\'); return false;';//should add a pre-execute action.
                var S=separator;

                //var result = "onsubmit = "+S+"javascript:parent."+XHR_Request+"("+S+method+S+","+S+action+S+"); return false;"+S;
                //result = "<form "+result+" method="+S+method+S+" action="+S+action+S+">";
                if (!id) id="form_id_"+Math.ceil(Math.random()* 1000);
                var result = "onsubmit = \"javascript:parent."+XHR_Request+"('"+method+"','"+action+"','"+id+"'); return false;\"";
                result = "<form id='"+id+"' "+result+" method="+S+method+S+" action="+S+action+S+">";
            }
            return(result);
        }


        var reForm  = /<form\s+([^>]*)>/gi;
        var reAHref = /(<a[^>]*href\s*=\s*['"])([^'"]*)(['"]+[^>]*)>/gi;
        //                                     $1                                                        $2                $3

        var xhrActionLink = 'javascript:parent.'+XHR_Request+'(\'GET\',\'$2\'); return false;';

        text = text.replace(reForm, replacer);
        result = text.replace(reAHref,  "$1#$3 onclick=\""+xhrActionLink+"\">");

        return result;

    },

    doXhr: function (url, onDone) {

        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){

            if(xhr.readyState==4)
            {
                if (xhr.status!=200)
                {
                    alert("We are sorry, there was an error processing your request: "+xhr.status+": "+xhr.statusText+". Please forgive us, and try realoading the page");
                }
                else				onDone(xhr.responseText);
            }
        }

        xhr.open('GET',url);
        xhr.send();
    },

    xhrRequest: function (mode, url, onDone) {

        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if(xhr.readyState==4)
            {
                if (xhr.status!=200)
                {
                    alert("We are sorry, there was an error processing your request: "+xhr.status+": "+xhr.statusText+". Please forgive us, and try realoading the page");
                }
                else
                    oneDone(xhr.responseText);
            }
        }
        xhr.open(mode,url);
        xhr.send();
    },

    getIFrameDocument: function (oIframe) {
        var oDoc = (oIframe.contentWindow || oIframe.contentDocument);
        if (oDoc.document) oDoc = oDoc.document;
        return oDoc;
    },

    getIFrameBody: function (oIframe) {
        var oDoc = (oIframe.contentWindow || oIframe.contentDocument);
        if (oDoc.document) oDoc = oDoc.document;
        return oDoc.body;
    },

    addScript: function (src) {
        var elScript = document.createElement("script");
        elScript.setAttribute("src", src);
        elScript.setAttribute("type", "text/javascript");
        document.getElementsByTagName("head")[0].appendChild(elScript);
    },
	
    addStyle: function (href) {
        var elstyle = document.createElement("style");
        elstyle.setAttribute("href", href);
        elstyle.setAttribute("rel","stylesheet");
        elstyle.setAttribute("type","text/css");
        elstyle.setAttribute("media","screen");
        document.getElementsByTagName("head")[0].appendChild(elstyle);
    },
	
    recreateSlice: function (sliceEl, sliceTag) {
        //delete & write inside the sliceEl;
        /*
        el=document.createElement("div");
        el.innerHTML=sliceTag;
        sliceEl.innerHTML="";
        sliceEl.appendChild(el);
             */
        alert('slice');
        re= /<mxd:slice/g;
        sliceTag= sliceTag.replace(re,'<div mxd:slice="mxd:slice"');
        sliceEl.innerHTML = sliceTag;
        SF.Prototype.Element.Methods.module.instantiate(sliceEl);
    //sliceEl.instantiate();
    },
	
    recreateScrap: function (scrapEl, scrapTag) {
        //delete & write inside the scrapEl;
        alert('scrap');
        re= /<mxd:scrap/g;
        scrapTag= scrapTag.replace(re,'<div mxd:scrap="mxd:scrap"');
        scrapEl.innerHTML = scrapTag;
        SF.Prototype.Element.Methods.module.instantiate(scrapEl);

    },

    escape: function (str) {
        re1= /</g;
        re2= />/g;
        return str.replace(re1,'&lt;').replace(re2,'&gt;');
    }

}

if (!Array.prototype.forEach)
{
    Array.prototype.forEach = function(fun /*, thisp*/)
    {
        var len = this.length >>> 0;
        if (typeof fun != "function")
            throw new TypeError();

        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
            if (i in this)
                fun.call(thisp, this[i], i, this);
        }
    }
}