Welcome to TiddlyWiki created by Jeremy Ruston; Copyright © 2004-2007 Jeremy Ruston, Copyright © 2007-2011 UnaMesa Association
Ubiquitous computing has been a topic of research and discussion since the late 80’s when, in 1988, Mark Weiser was the first to use the term (<<popnote "Ubiquitous Computing" Wikipedia:UbiquitousComputing >>). Ubiquitous Computing is the seamless and “invisible” integration of technology into our daily lives such that its use is natural, almost invisible. Applications of ubiquitous computing result in the movement from active to passive use as information is delivered to or for the user with minimal, if any, action on his or her part. Communication becomes seamless, perhaps even unintentional, as information is gathered via embedded devices with processing power. Writes Adam Greenfield, “…there are powerful informatics underlying the apparent simplicity of the experience, but they never breach the surface of awareness” (<<popnote "Greenfield, 2006, para. 5" Everyware>>). Examples of this innovation include “smart” medicine bottles which alert users to take their medication and “smart” homes which can monitor the environment and adjust temperature, lights, and other setting automatically or by the homeowner (remotely).
This technology poses significant concerns beyond the technological development. As computer scientists push forward, academics from all fields have begun to discuss the social, philosophical, political, and other impacts this integration will have on our world. “There should be little doubt that its advent will profoundly shape both the world and our experience of it in the years ahead. As to whether we come to regard that advent as boon, burden or blunder, that is very much up to us, and the decisions we make now” (<<popnote "Greenfield, 2006, para. 26" Everyware>>). We will discuss some of these concerns in the [[Ethics|3A Ethics of Ubiquitous Computing]] and [[Implications|5A Implications of Ubiquitous Computing]] sections.
At first, personalization might seem like a questionable inclusion on our list. For example, variable data printing which produces direct mail pieces with our names incorporated throughout the text and the ability to change the fonts, colors and other aesthetics on a site or to configure a home page with exactly the apps and feeds we want seems pretty common, certainly not emerging. However, the technology of personalization that we'll be discussing goes far beyond being just "personal." In fact, the idea of personalization varies depending on the field.
For our purposes, we're looking at the personalization as defined by <<popnote "Fan and Poole," EthicalPracticeOnlinePsychotherapy>> “…a process that changes the functionality, interface, information access, and content , or distinctiveness of a system to increase its personal relevance to an individual or a category of individuals,” (2006, p. 183). To wit, personalization is more about making content relevant to an individual than about peppering it with personal information already provided; it's about taking that data and making conclusions about that person based on users with similar profiles.
Note that there is a difference between personalization and customization. The latter has to do with user-defined changes, such as altering the font size, background colors, and/or actively setting up preferences for how the site will look. Personalization, on the other hand, has to do with software that tracks activity and then creates content for a user based on that activity -- with the user taking no extra steps to help generate that content.
>To truly boil it down, we view personalization as passive on the part of the use while we view customization is an active endeavor.
Personalization technology can increase the draw of a person to a site as well as guide them to options they might not have previously considered but would be interested in.
>“Personalization is first and foremost a business strategy, and is an attempt to counter-balance the anonymity that typically characterizes interactions between consumers and large businesses, especially over the Internet” <<popnote "(BroadVision, 2004, p. 1)" PersonalizationTechniques>>
This can be used by many different companies for different reasons. For example, in retail, personalization shows up in the “Recommendations for you” feature on sites which are tracking both what you purchase as well as what you browse and cross reference that information with similar shoppers and comes up with product offerings while might be appealing, illustrated below.
''Personalization on Amazon.com''
<html><img src="http://farm8.staticflickr.com/7143/6461375993_2fcd545998.jpg" width="500" height="249" alt="Amazon_Example"></a></html>
Personalization can also be used in information settings, where articles can be cued up based on your browsing history or the creation of an increasingly relevant-to-you home page which serves up content based on which areas you visit the most.
All of these outlets aim to create a better, more fruitful experience for the user which in turn can create loyalty to the site, the company/organization, or the products.
If there is one technology on our list with which almost everyone has first-hand experience, it is likely social computing/social software. Social software is not just the creation of virtual environments on which to post content and “talk” to others. Social software allows for collaborative content creation and refinement, directed not by an over arching group but by the users themselves. Social software enables these interactions, but the activity itself is dictated by users. It is dynamic, decentralized, and interacted with via comments and tags by users ''<<popnote "Parameswaran & Whinston" SocialComputingOverview.>>'' While we discussed the passive nature of personalization and ubiquitous computing in other sections, social software is extremely active in nature. While there have been examples of groupware going back several decades, social software as we currently understand it can be seen as taking hold in 2002 when the first Social Software Summit was held (Allen, 2004). Since then, social software has become a common means of communication, used for both business and personal matters, marketing and reporting, education and entertainment (and "edutainment") on such sites as [[Facebook|http://www.www.facebook.com/]], [[LinkedIn|http://www.linkedin.com/]], [[Twitter|http://twitter.com/]], [[Blogger|https://accounts.google.com/ServiceLogin?service=blogger&passive=1209600&continue=http://www.blogger.com/home&followup=http://www.blogger.com/home<mpl=start#s01]], [[YouTube|http://www.youtube.com/]] and [[Wikipedia|http://www.wikipedia.org]].
Mobile Computing is the ability for users to connect with each other any time, anywhere, through a variety of hardware and software applications. It is powered by advancements in telecommunications which make the transfer of data faster, easier, and increasingly available. Mobile computing releases the internet from desktop computers and puts in laptops, smart phones, and tablets. These portable devices add to the ease of use: accessing the internet via a laptop can be inconvenient in many locations, where slipping out a phone or a tablet is quick and easy. As such, mobile computing has created unprecedented opportunities to communicate, collaborate, and express oneself any time, anywhere.
Mobile computing has created many opportunities for collaborative efforts. While remote collaboration used to be somewhat limited to conference calls, today there are a plethora of methods with which to interact real-time. From instant messaging/video/phone services such as [[Skype|http://www.skype.com/intl/en-us/home]], [[join.me|https://join.me/]], and instant messenger programs to software systems designed with “the meeting” in mind such as [[WebEx|http://www.webex.com/]], [[GoToMeeting|http://www.gotomeeting.com/fec/]], [[Acrobat.com|https://www.acrobat.com/welcome/en/home.html]], the ability to synchronously work together with colleagues from around the world is easier than ever. With mobile collaboration, project teams are not limited by location, enabling the “right” team to be formed, not just the proximate one.
The term, "the cloud" has been increasingly prevalent in technology discussions over the past few years, now making its way to mainstream media and marketing (e.g., [[Apple's iCloud|http://www.apple.com/icloud/). Many people might be initially confused about the term, wondering what cloud computing is and why it's important (and how it's different from the internet). The good news is that you've probably already started using the technology: if you have used Gmail, hotmail, or yahoo mail, you have used a cloud-based service. In those applications, you can access your account from any computer because your messages and associated files are all stored online ("in the cloud). However, cloud computing has progressed beyond the ability to access your data from any location. It offers viable business solutions that need to be considered.
<html><img src="http://farm8.staticflickr.com/7025/6488428123_9ce11be1ec.jpg" width="379" height="282" alt="Cloud_Computing"></a></html>
''Cloud Computing Diagram from <<popnote "TheTechLabs.com" TheSkyWasTheLimit>>''
Cloud computing, one of our emerging technologies, is a method of leveraging the power of the internet to deliver technology services. It can take the form of shared software, data storage, and/or shared services. <<popnote "Craggs," CloudComputingWithouttheHype>> lists five core characteristics of cloud computing, “a shared pool of IT resources, on-demand usage, elasticity, networked access, and user-based metering” (2009, p. 3). Cloud computing can offer businesses technology solutions that might otherwise be financially preclusive as well as the ability to use the services as needed, rather than purchasing them only to find they are rarely used and therefore not earning a high ROI.
Cloud computing breaks down into the following three categories:
''1.'' ~Software-as-a-Service (~SaaS)
''2.'' ~Platform-as-a-Service (~PaaS)
''3.'' ~Infrastructure-as-a-Service (~IaaS)
One of the most recognizable examples of cloud computing is [[Google Apps|http://www.google.com/apps/intl/en/business/index.html]], an example of PaaS. Google Apps allows users to create, share, and participate in live collaboration via the platform using software for content/file creation , email, chat, calendar, and storage functionality. Access is customizable and can be different for every document, group, or site. Controlling access is an important aspect of cloud computing. Using the cloud does not mean that information stored there is public. It can be as public or private as necessary, an important requirement for confidentiality needs. It can also be scaled to include whatever components are desired, as simple as a piece of software and as complex as fully-customized infrastructure. Additionally, because these systems are essentially “renting” the technology, users are often afforded greater amounts of storage space than traditional servers offer and are backed up by multiple data centers, loss of information is greatly decreased and down-time should be minimal.
In this section, we'll discuss specific applications for each emerging technology. These suggestions have been made with the psychological community in mind and as such represent very real opportunities for implementation.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html> <html><img src="http://farm7.static.flickr.com/6097/6282858737_9084eed20b_t.jpg" width="100" height="57" alt="PubPub"></a></html>
''Professional : Public'' | ''Public : Public''
As with any medical field, the prescription and monitoring of medication is an important aspect of some patient care. The use of medication in treating psychological disorders, such as bipolar disorder, schizophrenia, OCD, and depression, often results in improved quality of life. However, it is important that the medication be taken properly and consistently to ensure best results. Enter the “smart pill bottle.” Developed by [[Vitality|http://vitality.net/company.html]], this bottle has a cap which reminds patients when they have missed taking their medicine. Further, should the patient not respond, the technology in the cap can contact a third party to let him or her know (in this case, the solution also becomes a Public : Public solution because it can be used by patients to help themselves or each other independent of a professional). By helping patients remember to take their medicine on time, these caps increase the overall efficacy of treatment. Additionally, by delivering information to one's physician about when a dosage is taken, these pill bottles contribute to the trend of clinical integration, a movement in healthcare to start to gather data about patients from all of their healthcare providers in order to get a comprehensive view of their medical state for the purposes of improved (often proactive) care. For more information on the Vitality bottle, you can view a short video below. //Click [[here|<html><iframe src="http://player.vimeo.com/video/30858288?title=0&byline=0&portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p><a href="http://vimeo.com/30858288">GlowCaps introduction</a> from <a href="http://vimeo.com/drose">David Rose</a> on <a href="http://vimeo.com">Vimeo</a>.</p>]] to open the video in a new window.//
''Vitality ~GlowCap''
<html><iframe width="400" height="225" src="http://player.vimeo.com/video/30858288?title=0&byline=0&portrait=0" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></html>
Additionally, professionals can consider using [[Livscribe Pens|http://www.livescribe.com/en-us/smartpen/]]. This pen is a way for professionals to take notes during a session and record the session as well, thereby ensuring that they don't miss anything and can easily mark important points during the recording which might be revisited at a later time. Conversely, patients might also wish to use the pens for the very same reason, able to make notes about discussion points, suggestions, and/or advice shared with them. Obviously, this technology has many other applications (e.g., business meetings, classes, lectures, etc.), hence making it a low risk option to be adopted.
''Echo SmartPen by Livescribe''
<html><img src="http://farm8.staticflickr.com/7150/6461799935_0e3af9d003.jpg" width="451" height="500" alt="smartpen"></a></html>
Personalization technology can be used by members of the association as well as the association itself in a few ways that would benefit both psychological professionals as well as their direct patients and the public in general. Because personalization can foster loyalty and even help a person feel a relationship with provider, including personalization techniques in a field which focuses to heavily on relationship building is prudent.
At the practice, we think that personalization techniques can create a highly-useful website for patients. (See the [[Professionals : Public Personalization Practical Applications]] for more on this topic. In terms of the APA harnessing this power at an organizational level, we see similar tactics on their site which would foster better communication with both members and the public, discussing these in the [[Professionals : APA : Public Personalization Practical Applications]] topic.
Opportunities for in the field of psychology abound in social computing, from professional collaboration to patient treatment to self-help opportunities.
Perhaps the biggest opportunities for the APA are within the realm of mobile collaboration. This includes collaborative efforts between professionals (see [[Professional : Professional Mobile Computing Practical Applications]] section) as well as new ways of offering therapy (discussed in the [[Professional : Public Mobile Computing Practical Applications]] section.
Cloud computing presents both businesses and individuals with cost-effective opportunities to expand their technology options as well as making data more easily accessible (an aspect of cloud computing which has some consequences, as we discuss in the [[Ethics section|3E Ethics of Cloud Computing]]. Additionally, because of the recognized and respected companies currently offering solutions (e.g., Apple, Google, Amazon), it's easier than ever to find a solution that meets the need while feeling comfortable working with a new technology offered by an familiar (and proven) partner.
We see several practical applications for the psychological community, as outlined in the [[Professional : Professional|Professional : Professional Cloud Computing Applications]] and the [[Professionals : APA : Public|Professionals : APA : Public Could Computing Applications]] Cloud Computing Applications sections.
Any advancement must be considered in light of ethical implications. In this section, we present some of the ethical considerations that the APA will need to think through when considering which opportunities they would like to take advantage of. However, we strongly recommend that ethics continue to be considered as the technologies are developed and used in new ways. This continual assessment will ensure that technology is used prudently and professional standards and patient confidentiality are always a top consideration.
Lasar, M. (n.d.). Study shows why over 30 percent of USA never uses 'net. Retrieved from http://arstechnica.com/tech-policy/news/2010/02/almost-a-third-of-americans-still-dont-use-the-net.ars
''<<sbk "FULL TEXT" 20111210170856>>
Ubiquitous Computing presents us with computing power that is “invisible,” negating the need for user input. What is gained in convenience is lost in control. Here we must consider what is being transmitted/processed by the technology vs. what is lost by allowing a computer to do this for us. Some applications present relatively benign tradeoffs. Consider the simplicity of a room which senses when you have entered and turns on the lights and adjusts the temperature for you. It saves you the time of doing this yourself (and might also help control your energy bill by turning the lights off and the heat down when you leave), but perhaps you don't always want that response. In such cases, convenient becomes a bit inconvenient. From here, we can move to more invasive technologies which might measure and pass along intimate information and can lead to elimination of choice. Perhaps a steering wheel can read the amount of endorphins in your system and "decides" you are too charged to drive. While this might be motivated by safety concerns, consider that the reason why your endorphins are racing is because your wife just went into labor.
>Ubiquitous computing should not overly inhibit the ability to choose and any implementation should be done after serious consideration of the question, "Just be we can, does that mean that we //should.//"
The [[relevant examples cited|2A Practical Applications for Ubiquitous Computing]] for the APA include smart pill bottles which are able to not only remind the patient to take his/her medication, but can go so far as to alert a third-party of a dosage is missed. While that final step can help patients with diminished capacity, it’s difficult to draw that line and remove the individual’s choice to take or not to take prescribed medication. Furthermore, the third-party notification can serve to decrease personal responsibility on the part of the patient, unnecessarily relying upon others to keep them on track. Finally, such notification has privacy issues involved.
As with any passive configuration of web pages that relies upon past activity and/or the activity of similar users, the user is being followed. Often, this is occurring without the user’s consent (i.e., you have not created an account on a site but your movement is still being tracked and feeding configurations designed specifically for you). Due to the highly-personal nature of psychological issues, personalization and tracking of user activity on the APA site (as presented as an option in the [[Practical Applications|Professionals : APA : Public Personalization Practical Applications]] section) needs to be undertaken with these concerns in mind. Not only should the nature of the movement tracked be contemplated (e.g., tracking visits vs. activity) but what is done with that information. The issue is how to be responsibly proactive.
Some patients might welcome personalization on the site and/or receiving information based on their online activity, others would be horrified by it -- and such alienation could be devastating for certain psychological issues (consider the affect this would have on individuals suffering from paranoia). These same concerns exist in the office environment as well; extending personalized information beyond a private session with the therapist could be deeply upsetting and leave the patient with a feeling of exposure while others might appreciate follow-up information, activities, options delivered by a third-party and based on notes from his/her session and/or any paperwork that was filled out.
Reckless adoption of personalization techniques could result in user hesitation to use the site for fear that research on certain issues will be tracked and acted upon (e.g., sending emails with further information based on a search, configuring the page with such information) and the consequent exposure to outsiders and/or nuisance communication. Additionally, on the practice level, it could result in losing the patient to another provider or leaving therapy altogether.
In addition to some of the identity concerns listed in the [[Ethics in Mobile Computing|3D Ethics of Mobile Computing]] section, social computing presents some interesting philosophical issues.
First, there is the issue of social computing in the realm of therapy itself. As discussed in the [[Practical Applications|2C Practical Applications for Social Computing]] section, social computing presents some interesting opportunities for self-help, group therapy, and peer-to-peer assistance. However, it should be noted that the nature of social computing with its short responses and anonymity might not be conducive to responsibly addressing psychological needs. While it can create a community around an issue and offer support from a variety of perspectives (e.g., those suffering from the issue, those living with people suffering from the issue, professionals who have treated the issue, etc.), these communities might be a viable supplement to 1:1 therapy rather than a replacement.
While such sites as Facebook operate on the user approving and building their network by hand, able to grant access to only those they know, discussion groups, chat rooms, and other public sites do not offer those options. True, some may allow the user to block individuals, but this is a passive response and leaves the person exposed to strangers who may not have the same motivations and respect for one's privacy that "friends" would have. In anonymity, there exists the freedom to behave in manners one would not engage in otherwise. For the solutions offered in relation to social computing, balancing the need for confidentiality and anonymity with the desire for quality communication is essential.
Further, there have been discussions regarding how this medium can affect communication skills (e.g., patience, fidelity, honesty, tolerance, and perseverance). Social Computing can help some patients learn to engage however, for others, it might foster a tendency to keep a distance and remain “safe” behind a computer and keyboard, able to easily disengage and/or create a somewhat dishonest presence.
Finally, social computing issues always involve questions around privacy. While individuals can post anonymously, the information is still out there and can always be taken and shared outside of the site. Further, if individuals are posting as themselves, the risk of exposure increases either through inadequate privacy settings or members of the group who take the content and share it elsewhere.
While Mobile Computing presents many opportunities for previously unreachable patients to receive therapy as well as for professional collaboration among psychological professionals, there are serious ethical issues which need to be taken into consideration.
''Identity authentication'' is an issue for both patient and therapist. Unless video conferencing is being used, it can be difficult to ensure that the person on the other end of a post, email, chat, etc. is really the patient and/or the therapist. Further, online psychological professionals aren’t subject verification of their listed credentials so patients risk working with therapists of questionable status and ability (<<popnote "Ragusea, 2003" EthicalPracticeOnlinePsychotherapy>>).
''Privacy'' can also be an issue if patient data, including session notes and diagnosis information, are stored on mobile computers such as laptops and smart phones. These devices could be stolen and/or have information accessed if they are not properly secured (both physically as well as through password protection). Note that this becomes an opportunity to explore cloud computing to store information rather than on the device itself. See the discussion of pros and cons [[here|3E Ethics of Cloud Computing]].
''Compromised Diagnosis''
Loss of face-to-face treatment and the additional non-verbal clues that provide the therapist with more information than a patient’s answers alone can be lost. These clues are part of a therapist’s overall assessment of a patient’s state of mind and missing them can compromise the efficacy of a recommended course of treatment. Unless they are using a video conferencing system, these cues are lost when engaging in therapy/consultation over mobile devices or using mobile technologies.
Ethical issues surrounding cloud computing tend to focus on privacy and security issues, significant concerns for all businesses, but especially so in the medical fields. We also think that caution should be taken when using some of the software solutions, ensuring that the choice is the right choice as much as the economical one.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public''
''Patient Information Security''
Each step that confidential medical information takes away from the patient increases the risk of compromised confidentiality. For decades, records have been kept on site and in hard copy, however records are increasingly being digitalized and paper files are moving toward obsolescence. Cloud computing can offer an additional level of concern, moving this data away from a local server. While it is true that there are different levels of security that can be offered to protect information and restrict access, the risk is there. However information stored on the cloud puts it in a universal location rather than on individual hard drives which can fail, be stolen, or accidentally erased.
This concern is echoed in <<popnote " Pew's Future of the Internet Survey" FutureCloudComputing>>
>Some respondents observed that putting all or most of faith in remotely accessible tools and data puts a lot of trust in the humans and devices controlling the clouds and exercising gatekeeping functions over access to that data. They expressed concerns that cloud dominance by a small number of large firms may constrict the internet's openness and its capacity to inspire innovation - that people are giving up some degree of choice and control in exchange for streamlined simplicity (2010, para. 13).
In order to effectively use Cloud Computing to collaborate on and store patient information, users need to work with IT service providers to ensure that all appropriate security measures are taken to balance the benefits and opportunities this technology presents with the potential risks.
''Software Sharing''
Cloud computing can also involve shared software opportunities so as to alleviate some costs of software and/or purchasing robust versions which contain far more functionality than is necessary. Here again, financial prudence and convenience should not compromise the quality of the deliverables. For example, Google Docs offers software for word processing, spreadsheets, and presentations which share many characteristics with those for sale by Microsoft. While the word processing version might easily suit the needs of psychologists writing simple reports, letters, and other communications, the spreadsheet offering might not be the best solution for billing solutions or complicated data collection during research. As with any decision to adjust processes, hardware, software, etc., each must be considered from all angles and remembering the primary purpose of the endeavor. For psychologists, that should be the quality of patient care and all solutions should contribute to that.
By nature of being deemed "emerging technologies" the innovations we are discussing are still in the early stages of adoption and widespread diffusion. Some are being adopted by a huge number of people in specific applications (e.g., social computing for personal networking in forums such as Facebook) but are still only tentatively being embraced in other applications. Others are still gaining acceptance are in the earlier states of adoption. To understand how technology moves through the various stages of adoption, consider Rogers' Bell Curve depicting the innovation adoption lifecycle below.
<html><img src="http://farm8.staticflickr.com/7170/6477815781_03c5707669.jpg" width="500" height="279" alt="Innovation_of_Adoption"></a></html>
For each of the technologies, we discuss the adoption trends, including current statistical data gathered from such organizations as ''[[Pew Research|http://pewresearch.org/]]'', as well as projections for adoption generated by firms, including ''[[Gartner|http://www.gartner.com/technology/home.jsp]]'', ''[[Forrester|http://www.forrester.com/rb/research?gclid=CLSU7-zQgawCFQjc4AodHSNsKw]]'', and ''[[Technology Futures, Inc.|http://www.tfi.com/]]''. It should be noted that these statistics are general, describing behavior and activities of the general public, rather than the subset of those involved in psychology. Therefore, these results cannot be assumed to hold true for the smaller group.
In light of this, it is important to understand the technology behaviors of the psychological community lest assumptions be made about their level of technological savvy and interest in technological innovation. A 2003 report noted, bluntly, that, "Psychotherapists are not known for being technologically sophisticated," (<<popnote "Ragusea & ~VandeCreek, p. 95)." EthicalPracticeOnlinePsychotherapy>>), likely due on part to the nature of the face-to-face, conversational core of psychotherapy. In addition to the generally non-computerized nature of the practice, the implications in terms of liability when engaging in non-traditional forms of therapy such as virtual therapy, online help groups, and other technological opportunities discussed in this report, can serve to shy away psychologists, thus slowing down adoption rates. However, while psychologist may cling to more traditional methods, the industry must take into consideration that the public is moving forward anyway. Consider Roger Gould's comments on this when <<popnote "interviewed about online therapy options" Technology&Psychology>>:
>The therapy field is in chaos. If it's ever going to advance in knowledge - which it hasn't because it's been repeating the same old things in different languages for the past 40 years - you have to have some stake in the ground that says this is what psychotherapy is, rather than hundreds of varieties multiplied by thousands of people putting their spin on it (2001, para. 9).
As discussed in the [[applications section|2A Practical Applications for Ubiquitous Computing]] there are many examples of ubiquitous computing on the market (e.g., smart pill bottles, livescribe pens, smartboards, smart homes). These products are still in the early stages of adoption, likely due to somewhat recent releases and the corresponding high costs associated with purchasing the product, training, as well as any retrofitting needed to incorporate the devices (e.g. ''[[SMART board integration|http://downloads01.smarttech.com/media/research/whitepapers/tcowhitepaper.pdf]]'').
It should be noted that the smart pill bottle discussed in this report has had made some progress in adoption. These bottles sell for about $100, but there is increasing evidence that bottles foster taking medication as recommended, which means the medication is apt to be more effective. As such, there is interest from insurance companies to cover a portion of the cost as it may result in fewer medical bills long term as a result of not taking dosages as recommended.
Overall, research generated from such groups as Gartner predict the inevitability of "invisible" computing.
In 2004, a study conducted by Jupiter Research showed that 35% of the companies surveyed planned on implementing some sort of personalization techniques that year. By 2010, the number of companies creating personalized web content such as the type we discuss in the [[Practical Applications|2B Practical Applications for Personalization]] section was 6% (23% among Best-in-Class companies) <<popnote "(Michiels, p. 19)." OnlinePresence>>
Currently, personalization techniques are being leveraged by businesses, particularly in retail, seeking to gain a competitive advantage by offering:
* Greater Customer Loyalty
* Higher conversation rates
* Reduced costs
* Boosts in productivity
* Operational efficiency
* Profitability
<<popnote "(Broad Vision, 2004)" PersonalizationTechniques>>
Most of us are familiar with how retailers are harnessing the technology to generate sales. In these instances, items are recommended to returning customers based either on their history or the browsing history of like-minded (i.e., shoppers/browsers showing similar habits). However, personalization is starting to be leveraged by businesses outside the retail industry to increase client service and satisfaction as well as customizing virtual educational environments. Various levels of personalization are now seen on websites in a wide-range of industries as businesses and organizations have learned from early adopters how this technology can positively affect the customer experience and power unexpected (but relevant) product or information/content offerings.
As personalization becomes more prevalent, its presence will become expected by all three groups involved in the APA. Here, then, a failure to include these techniques prudently (see [[Ethics|3B Ethics of Personalization]] for important considerations) might results in missed opportunities to contribute to the APA's mission.
Social Computing is, without question, one of the most embraced technologies. Of those adults who engage in online activity, more than half are engaged in social computing, namely <<popnote "65% use social networking sites," AdultSocialNetworkingUse>> 71% use video-sharing sites. These statistics show a steady rise in adoption, hinting at a technology that is in the later stages of diffusion. As such, any solutions the APA chooses to develop using social computing are likely to be easily accepted by a public already familiar and engaged with these platforms. To wit, seeking information on health issues, is already on the rise: <<popnote "20% of users have sought out online other users with similar concerns" Peer2PeerHealthCare>>. To further underscore the evolving influence of social computing, consider the fundraising efforts in the 2008 election, "In February 2008 John McCain attended fund raising events for his presidential campaign and raised $11 million. In the same period Barack Obama attended no such events. Instead his campaign team used social networks to raise $55 million in 29 days" ''<<popnote "(Technology Convergence, 2010)." TechnologyConvergence>>
<html><img src="http://farm7.static.flickr.com/6097/6282858737_9084eed20b_t.jpg" width="100" height="57" alt="PubPub"></a></html>
Public : Public
''Online group therapy options are already presenting themselves. For members of the public who are not ready or not able to engage in live therapy, these offer a viable alternative. To ensure they select groups that are most apt to be reputable, users should investigate what, if any, professional affiliations the site/group has, including moderation by professionals. Additionally, looking at the quality of the content helps to screen for sites that are most relevant to the person's needs.''
As mobile devices such as cell phones, laptops, tablets and the like continue to be adopted by the public, mobile computing continues to rise and changes from a novelty to a simple aspect of everyday life, seamlessly facilitating communication and collaboration. At present, the statistics gathered by <<popnote "Pew Research" SmartphoneAdoption>> look like this in the United States:
<html><img src="http://farm7.static.flickr.com/6218/6279716963_f26204ca73.jpg" width="500" height="263" alt="2054-2a"></a></html>
When designing strategies to integrate this usage into ~APA-supported programs, the demographics of the users must be noted in order to ensure the right programs are targeted at the right people. The largest group of adopters are:
* Well-educated (at least a college degree)
* Upper middle-class (earning at least $75,000 per household)
* Under 45
* Urban or suburban dwellers
Note also that in addition to the hardware used to access the internet, mobile computing includes the wireless services used to get online. In 2007, the number of these plans purchased numbered in the billions and was growing <<popnote "(Campell & Park, 2008)." MobileTelephonyImplications>>
According to Pew Research's most recent <<popnote "Future of the Internet Survey," FutureCloudComputing>> cloud computing solutions will dominate the technology landscape in fewer than 10 years. By 2020, they predict that -the majority of users will have moved away from the personal-hard-drive-centric systems which are now prevalent (i.e., housing all software and applications on one's own machines), using technology that is hosted by third-party vendors. This shift is motivated in part by financial constraints which have resulted in IT budget cuts -- both in terms of staffing and hardware/software solutions. Cloud computing is being increasingly adopted to fill the gaps created by these changes. Additionally, the proliferation of mobile computing devices creates an increased demand for attaining information regardless of location.
In a report released in November of 2011, <<popnote "IBM reported" IBMTechTrendsReports>> on the growing adoption of cloud solutions, citing the following:
* Eighty-seven percent of respondents believe open source and open standard technologies will play a key role in the future of application development.
* During the next two years more than 75 percent of organizations will engage in cloud computing.
Jim Corgel, general manager ISV and Developer Relations, stated,
>The results are clear. Mobile computing, cloud computing, social business and business analytics have gone beyond niche status and are now part of any modern organization’s core IT focus (2011, para. 9)
However, in terms of cloud computing, the Pew research doesn't quite support the "now" aspect of that assertion. Note that the predictions of widespread use by 2020 do not equate widespread implementation today. Consider the following statistics found in a recent article on <<popnote "Datamation.com:" CloudComputingSlowAdoption>>
>Adoption of cloud computing in organizations is low and only a few have crossed the finish line.
>29 percent are paying for one or more cloud services. This is expected to increase to 39 percent in the next three years
>Only 11 to 19 percent have finished implementing various cloud solutions *including ~SaaS, ~PaaS, ~IaaS, and hybrids
As such, we see an opportunity for psychology professionals to be early adopters in this area, gaining experience and expertise in a technology that is predicted to become dominant before the decade is out.
Members of the APA will soon find themselves, if they haven't already, encountering the technologies discussed in this report. These encounters will be both direct and indirect, in both professional and personal atmospheres. In order to leverage the opportunities each technology presents, members must at least be ready to react to the emergence of these technologies and at best, harness their power proactively to best meet the needs of their profession, their individual work, and their patients. Given some of the ethical issues at play, incorporation of technology should be prudent, constantly measuring the benefits vs. ethical considerations and modifying solutions implementation accordingly. Most importantly, psychological professionals must accept that their industry is not immune to these technological advances and they will need to bring themselves up to speed, both in terms of the technologies discussed here but, as is necessary, the more basic computing skills needed to harness these technologies.
It is important to remember that implications change as technologies are adopted and then manipulated to the needs of the individual. As such, revisiting the state of each technologies (and scanning to see which others are arising) on a regular basis will ensure a more proactive approach to technology incorporation.
Although [[ubiquitous computing|1A Overview of Ubiquitous Computing]] will be increasingly sewn into our lives, the implications could mean decreased responsibility and/or increased privacy issues. Any time a device is sending information without the user intentionally doing so, we start to lose some control. Of course, we are surrounded by devices that do this all the time and it's often little cause for concern. However, as these technologies expand, we can expect to accept a somewhat shared responsibility for our lives, depending on these technologies to remind us to do things or simply take care of those things for us.
Additionally, movement in this direction can begin to create a significant divide between those whose lives are increasingly supported and enhanced by ubiquitous computing and those who are not. We are not necessarily looking at those who intentionally chose to live either partially or fully "off the grid" but those who have no access at all to the technological advancements which will fundamentally change our behaviors. This could cause difficulty in relating to one another, fostering a different cultures : those that are integrated technologically and those who are not, a divide that can increase significantly as technology radically changes communication and behavior.
While all of the technologies described in this paper face the same sort of concern, ubiquitous computing and its ability to act for us, often in a very personal way, changes behavior (including senses of self-responsibility) significantly. This is more than a modification/evolution of communication, it can begin to eat away at the things we do for ourselves, removing a set of things we "need to worry about" which might also create mental space to be concerned with other things. Consider how the incorporation of microwave ovens changed both the amount of time as well as the methods used to cook. Implications here have meant that many people now have far fewer cooking skills but also that they have more time to focus on other things. As such, the types of devices that the field of ubiquitous computing is turning out will result in more space to focus on other things.
[[Personalization|1B Overview of Personalization]] is finding its way into our lives in increasingly sophisticated manners, especially online. As more and more businesses discover the power of personalization and how it can affect sales and loyalty, it's safe to assume its presence will continue to grow. The more we encounter these tailored solutions, the more we are likely to expect them. Furthermore, because of the opportunities to create user loyalty, psychology-based sites that effectively employ personalization technology are more likely to have repeat visitors who may come to rely on the site for information. This is significant. Do members of the APA want such loyalty given to possibly irresponsible and/or non-professional site creators or would they prefer to have that loyalty given to member-generated sites and/or APA-sponsored sites?
[[Social Computing|1C Overview of Social Computing]] has already begun to change how we interact with each other. By offering virtual forums to easily share ideas, information, photos, etc., the social networking sites have opened the door to mass communication with friends, colleagues, and even the world. It has changed what we share and when (e.g., consider whether you would know as much about your facebook friends if each status update had to be conveyed to you in person). This can help to build relationships that might otherwise be difficult or impossible as well as opening the door to public (or semi-public) expression and feedback.
The photography which once lived only in the amateur photographer's photo album is now on flicker for the world to see. The snarky comment about someone's outfit is on facebook for your "friends" to see. In many cases, not only are we expressing more and more often, the filter is off -- facilitating communication (both positive and negative) that might not happen face-to-face. There arises a feeling of safety being able to hide behind a computer screen. These behavioral changes impact the psychological field not only in how they can expect to interact with each other and their patients, but it may also change the nature of the conversation in therapy sessions, with such issues as cyber bullying, privacy issues (hacking, shared content that was supposed to be private), and cyber stalking.
There are also implications for self-perception and identity. These applications allow users to create profiles, opening the door to choose how to define oneself rather than having oneself defined by others based on their behaviors, demonstrated interests, and demeanor. Online, we choose what we will say, with the ability to perfect a reaction or idea before posting, emailing, texting, or tweeting it. We can choose which photos to upload, likely those which we think are the most favorable to us, and who says we can't photoshop our profile picture to get rid of a few blemishes or wrinkles. The question then must be asked is how authentic our online selves are? And, taking it further, how authentic are our online relationships?
In addition to how social computing has and will continue to change our communication and relationship behaviors on a personal level, it has opened new ways to collaborate with each other in a professional manner. Users who are on facebook anyway could look there for psychological information as the number of professional and organizational facebook pages increases, designed to engage members of their target audience already on facebook. YouTube also increasingly offers videos that focus on serious issues, not simply amateur parodies and entertaining content. People can follow twitter feeds from their university (e.g., "Don't forget to register for the spring semester!") which might be more effective than sending the communication in other ways (i.e., email, e-newsletters, snail mail)
Essentially, social computing is profoundly impacting how we communicate which will therefore affect the conversations happening in therapy sessions: how those conversations happen as well as what they are about. Further, it can change where interactions are taking place. A research study might use YouTube to post videos on progress or create a discussion group for studied subjects to use for documenting their reactions to an experiment.
The implications of mobile computing are widespread and contribute to many of the emerging technologies discussed in this report. For example, consider how many people post to facebook via their cell phones or check their email on their iPads. Consider the productivity loss during business trips ten years ago when laptops were much rarer and connection to the internet was slow and often limited. Now, we can access our favorite sites, look at content we've stored in the cloud, send emails, chat (both text and video) virtually anywhere we can get a signal. Additionally, this ease of access is constantly increasing as both the hardware and wireless communication networks continue to evolve.
The hardware used has been (and likely will continue to be) seen as a status symbol and possibly an extension of one's personality. Because the type, color, accessories can all be chosen by the individual, each device can serve as an expression of their tastes; for some this can be as much a communication of personal style as clothing, shoes, and hairstyles. While interesting, the meaning for the psychological community lies in the fact that these devices can be another non-verbal clue about patients ideas about themselves. As the choices continue to multiply, this trend may become ever-more revealing as each person has increasing options to make these devices their "own."
Mobile devices are also giving rise to texting, another way professionals can expect to be communicating (though likely not for therapy or collaboration) and they should also be aware that that texting is a means by which many people are able to carry on multiple conversations at once, at any time (due to the ease with which one can discreetly send a text on these small devices, it's easy to communicate with others at remote locations during times when it would have been impossible or inconvenient before (e.g., during class, during a seminar, at a meeting, etc.). In short, we are expecting that we can have an audience anywhere, any time. And that expectation starts to change how much attention we are getting and as a result, perhaps how much we "need."
Finally, there is the "personalization of public space" as illustrated by carrying on phone conversations in public spaces, "carv[ing] out personal territories by erecting illusory perimeters that have been described as 'symbolic fences'" <<popnote "(Campell & Park, 2008, p. 378)." MobileTelephonyImplications>> Campell and Park see this as a major consequence of mobile computing, resulting in almost-forced eavesdropping due the proximity or volume of the person on the phone, embarrassment for the other/embarrassed by the situation, as well as "absent presence" on the part of the speaker who, while physically there, is mentally focused elsewhere.
This technology has resulted in a connected society (which, though there are [[massive adoption rates|4D Adoption of Mobile Computing]], is still a portion of both the American and Global communities). This fact can be easily forgotten which is also an implication of the widespread usage. Without realizing it, we can forget that not everyone is engaged in these activities and create assumptions and structure solutions that exclude them.
Implementation of cloud computing solutions will change how we communicate, store data, and purchase technology. We see some significant implications for professionals, outlined in the [[Professional : Professional Cloud Computing Implications]] section, as well as how adopting such technologies might impact solutions created by the association itself, discussed in the [[Professionals : APA : Public Cloud Computing Implications]] section.
Given the opportunities presented in this report, it is our hope that professionals will urge the APA to begin developing action plans to harness these technologies. While we have discussed the opportunities for specific audiences within the APA, the recommendations for Actions & Response Plans are targeted to the APA itself. However, it should be noted that these suggestions can be implemented by individuals as well, which might itself serve as a means to push the association to formal action. As the organizing body which therefore has the greatest reach to both the professionals and the public, action plans initiated here and delivered to the different sub-audiences will be most effective. Overall, the APA should be providing information on these technologies and recommendations for the specific applications it deems most significant for both professionals and the public.
In order to address the opportunities represented by Ubiquitous Computing, we have specific recommendations for both the [[APA|Professionals : APA : Public Ubiquitous Computing Action & Response Plans]] as well as [[Professionals|Professional : Public Ubiquitous Computing Acton & Response Plans]].
In this section, we'll present ideas on how members can prepare for and respond to the personalization trend.
>Personalization is not a project that is implemented once and is ‘done’. Personalization is an ongoing, iterative process, by which organizations plan how to influence site users to achieve measurable and profitable online behavior. <<popnote "(BroadVision, 2004)" PersonalizationTechniques>>
This means that our recommendations will only be successful if they are continually revisited, evaluated, and adjusted as more information is gathered on the users as well as the impact of the techniques are measured. Before any implementation can begin, it must be determined exactly what type of response is being sought after. In this case, that could include patient outreach, professional development, increased professional collaboration, etc. See the Action & Response Plans sections for the [[Professionals : APA : Public|Professionals : APA : Public Personalization Action & Response Plans]] and [[Professional : Public|Professional : Public Personalization Action & Response Plans]] audiences for specific recommendations.
We suggested [[several significant opportunities|2C Practical Applications for Social Computing]] using social computing to help with psychological issues. Here the APA plays a critical role in ensuring such usage is done ethically and responsibly. Because anyone has the ability to set up discussion groups, websites, recommendation systems, etc., the APA is positioned to be the most reliable source for these sites. Here, the association can embark on two different paths to developing and helping professionals and patients find reliable services. First, the APA can sponsor sites. In this case, they would be responsible for the site development and maintenance. However, it's likely that demand may exceed their ability to provide services so there are secondary opportunities.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professional : APA : Public''
The instances and quality of professional collaboration are significantly increased through implementation of new mobile computing tools and techniques. By minimizing obstacles through instant messaging, email, video calling, and free online calling professionals who might previously have avoided collaboration can now do so, resulting in new partnerships and research. To facilitate this, the APA should consider sponsoring a conference which highlights interesting new research which was carried out making heavy use of mobile computing. As such, the conference could provide attendees with psychological research results but is an opportunity for them to showcase successful instances of mobile collaboration. Part of the conference could also involve a session outlining the numerous technologies which can be used, information which can be provided via their website after the conference for continued access to these methods and best practices. The APA could also sponsor some such studies to foster their development.
For collaboration between the professionals and the public, the APA could sponsor workshops and research which teach professionals when and how to effectively use the technology. Additionally, providing information to the public about the opportunities here and how they could benefit them can be posted on the website. Of particular interest might be personal stories about patient experiences (these could be submitted to the APA and posted anonymously to protect privacy).
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional''
As outlined in the [[Practical Applications section|2E Practical Applications for Cloud Computing]], we see many opportunities that professionals should start taking advantage of now, opportunities that can pose cost savings for professionals in small practices as well as result in better collaboration.
Below, we outline a few ways to make this happen.
First, the APA could direct information on opportunities to office managers and/or IT professionals who oversee an office's or department's IT needs. This could take several forms, such as APA-sponsored reports, seminars, webinars, and/or discussion groups, to name a few. These offerings can be based on industry research, but also by reaching out to practices which are early adopters of cloud computing, which may yield further ideas on how cloud computing can benefit them. Educating office managers and IT professionals on the possibilities in terms of both costs savings as well as collaborative opportunities can result in case-by-case analysis of whether such solutions will work for them. We think that this is the best audience to target. While psychological professionals would use and benefit from these solutions, reaching out to them directly might not yield optimal results; they might consider this to be just an "IT" or "Finance" or "Office Manager" issue and thus not as central to their area of focus. Quite simply, it's possible they might not view it as a valuable use of their time. By getting buy-in from office or IT managers who can then present a specific solution and benefits for that practice, it's more likely that such solutions will be implemented or, at the very least, given fair consideration.
Second, professionals themselves could start using these technologies in measured amounts, testing out their ease-of-use, opportunities, and limitations in a small scale before considering a full implementation for their staff. This can be done as easily as using iCloud to start syncing information between their devices or using Google Docs for a presentation they are developing with a remote colleague. This is an easy way to use the technology and requires fairly little research or time-investment to start doing it.
In our recommendations for [[responding to advancements in personalization|6B Action & Response Plans for Personalization]], we discussed personalized web sites and pages and the requirement of moving from hard copies to electronic versions of certain records. Here the cloud comes in extremely handy. For example, many therapists use hard-copy appointment books which are housed at the office. By creating a virtual appointment book and hosting it in the cloud, therapists (and others, as necessary) are not only provided access to the information regardless of location (and possession of the book), but it enables this information to be loaded onto the sites discussed in the personalization section.
a reusable non-linear personal web notebook
With over 12 years of experience in the field of corporate training, graduate studies focusing specifically on emerging technologies in information design, and published work in the ''[[Journal of Behavioral Management|http://www.tandfonline.com/doi/abs/10.1080/01608061.2011.589721]]'' which focused on an assessment, recommendation, and implementation of desired change initiatives, CP Consulting CP Consulting is ideally situated to work with the APA on this special report. In short, we know the terrain and how to help you navigate it successfully.
Gretchen Kriesen, the principal at CP Consulting, holds a BA from Nazareth College, an MS from Rochester Institute of Technology, a master certificate in HR from Villanova University, and is pursuing an MS in Information Design and Technology from SUNYIT.
Pew Internet & American Life Project. (2011, August 26). 65% of Online Adults Use Social Networking Sites
Women maintain their foothold on SNS use and older Americans are still coming aboard. Retrieved from http://pewresearch.org/pubs/2088/social-networking-sites-myspace-facebook-linkedin
''<<sbk "FULL TEXT" 20111105161846>>''
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{
handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,
handler: function(event,src,title) {
this.handler_mptw_orig_closeUnsaved(event,src,title);
if (!story.isDirty(title) && !store.tiddlerExists(title) && !store.isShadowTiddler(title))
story.closeTiddler(title,true);
return false;
}
});
//}}}
Mitra, S. (2010, September 16). Strategy roundtable: 5 Cloud computing opportunities for entrepreneurs. Retrieved from http://www.readwriteweb.com/start/2010/09/strategy-roundtable-5-cloud-computing-opportunities-for-entrepreneurs.ph
''<<sbk "FULL TEXT" 20111105150212>>''
Kuttikrishnan, D. (2011, November 16). Cloud computing: Slow adoption rates, current obstacles. Retrieved from http://www.datamation.com/cloud-computing/cloud-computing-slow-adoption-rates-current-obstacles.html
''<<sbk "FULL TEXT" 20111210175812>>''
Craggs, S. (2009, November). Cloud computing without the hype; An executive guide. Retrieved from http://www.slideshare.net/LustratusREPAMA/cloud-computing-without-the-hype-an-executive-guide-100-slideshare?src=related_normal&rel=1593276
''<<sbk "FULL TEXT" 20111105150750>>''
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
Anderson, J. Q. & Rainie, L. (2010, June 11). The future of cloud computing. Retrieved from http://pewresearch.org/pubs/1623/future-cloud-computing-technology-experts
''<<sbk "FULL TEXT" 20111105163745>>''
Allen, C. (2004). Tracing the evolution of social software. Retrieved from http://www.lifewithalacrity.com/2004/10/tracing_the_evo.html
''<<sbk "FULL TEXT" 20111105150447>>''
American Psychological Association. (n.d.) What to consider when making the choice. Retrieved from http://www.apa.org/helpcenter/choose-therapist.aspx
''<<sbk "FULL TEXT" 20111105145619>>''
Broad Vision. (2004). Using Proven Personalization Techniques to Drive Measurable and Profitable Online Behavior.
''<<sbk "FULL TEXT" 20111205150404>>''
Campbell, S. W. & Park, Y. J. (2008). Social implications of mobile telephony: The rise of personal communication society. Retrieved from http://www.yongjinpark.com/resources/mobile.pdf
''<<sbk "FULL TEXT'' 20111211182630>>''
Castelnuovo, G., Gaggioli, A., Mantovani, F., & Riva, G. (2003). New and old tools in psychotherapy: The use of technology for the integration of the traditional clinical treatments. //Psychotherapy: Theory, Research, Practice, Training//, 40(1), 33-44. doi:10.1037/0033-3204.40.1-2.33
''<<sbk "FULL TEXT" 20111105152426>>''
Craggs, S. (2009, November). Cloud computing without the hype; An executive guide. Retrieved from http://www.slideshare.net/LustratusREPAMA/cloud-computing-without-the-hype-an-executive-guide-100-slideshare?src=related_normal&rel=1593276
''<<sbk "FULL TEXT" 20111105150750>>''
Fan, H. & Poole, M.S. (2006). What is personalization? Perspectives on the design and implementation of personalization in information systems. //Journal of Organizational Computing & Electronic Commerce//, 179-202.
''<<sbk "FULL TEXT" 20111105152908>>''
Greenfield, A. (2006, April 4). Everyware: The dawning age of ubiquitous computing. Retrieved from http://www.alistapart.com/articles/everyware/
''<<sbk "FULL TEXT" 20111105150337>>''
Kuttikrishnan, D. (2011, November 16). Cloud computing: Slow adoption rates, current obstacles. Retrieved from http://www.datamation.com/cloud-computing/cloud-computing-slow-adoption-rates-current-obstacles.html
''<<sbk "FULL TEXT" 20111210175812>>''
Lange, A., Rietdijk, D., Hudcovicova, M., van de Ven, J., Schrieken, B., & Emmelkamp, P. G. (2003). Interapy: A controlled randomized trial of the standardized treatment of posttraumatic stress through the internet. //Journal of Consulting and Clinical Psychology//, 71(5), 901-909. doi:10.1037/0022-006X.71.5.901
''<<sbk "FULL TEXT" 20111105152234>>''
Lasar, M. (n.d.). Study shows why over 30 percent of USA never uses 'net. Retrieved from http://arstechnica.com/tech-policy/news/2010/02/almost-a-third-of-americans-still-dont-use-the-net.ars
<<sbk "FULL TEXT" 20111210170856>>
Michiels, I. (2010). Your online presence in 2010. Retrieved from http://www.slideshare.net/Percussion/driving-business-results-with-your-online-presence-web-strategy-wcm
<<sbk ''FULL TEXT'' 20111211093354>>
Mitra, S. (2010, September 16). Strategy roundtable: 5 Cloud computing opportunities for entrepreneurs. Retrieved from http://www.readwriteweb.com/start/2010/09/strategy-roundtable-5-cloud-computing-opportunities-for-entrepreneurs.ph
''<<sbk "FULL TEXT" 20111105150212>>''
Niles, N. (n.d.). Cloud computing: The sky was the limit. Retrieved from http://www.thetechlabs.com/tech-news/cloud-computing/
''<<sbk "FULL TEXT" 20111210151918>>''
Parameswaran, M. & Whinston, A. B. (2007) "Social computing: An overview," //Communications of the Association for Information Systems//: Vol. 19, Article 37.
''<<sbk "FULL TEXT" 20111105161503>>''
Pew Internet & American Life Project. (2011, August 26). 65% of online adults use social networking sites. Retrieved from http://pewresearch.org/pubs/2088/social-networking-sites-myspace-facebook-linkedin
''<<sbk "FULL TEXT" 20111105161846>>''
Fox, S. (2011, February 28). Peer-to-Peer health care. Retrieved from http://pewresearch.org/pubs/1908/online-health-information-peer-to-peer-patients-caregivers-chronic-conditions
''<<sbk "FULL TEXT" 20111105162233>>''
Ragusea, A. S., & ~VandeCreek, L. (2003). Suggestions for the ethical practice of online psychotherapy. //Psychotherapy: Theory, Research, Practice, Training//, 40(1), 94-102. doi:10.1037/0033-3204.40.1-2.94
''<<sbk "FULL TEXT" 20111105153229>>''
Smith, Eric. (2011, July 11). Smartphone adoption and usage. Retrieved from http://www.pewinternet.org/Reports/2011/Smartphones/Summary.aspx
''<<sbk "FULL TEXT" 20111105163243>>''
Smith, S. (2001, July 1). Technology & psychology. Retrieved from http://www.psychologytoday.com/articles/200107/technology-psychology
''<<sbk "FULL TEXT" 20111105151057>>''
Ubiquitous computing. (n.d.) Retrieved from http://en.wikipedia.org/wiki/Ubiquitous_computing
''<<sbk "FULL TEXT" 20111105145440>>''
Vivek, V. (2010, August 17). Evolution of ubiquitous computing. Retrieved from http://www.wiziq.com/tutorial/84308-EVolution-of-Ubiquitous-Computing
''<<sbk "FULL TEXT" 20111105145223>>''
Even in a profession where emphasis is placed on face-to-face interactions, technology is advancing to facilitate results and meet the increasingly diverse needs of our global culture. From online therapy to pens able to record sessions while taking notes, there are many opportunities for psychological professionals to harness the power of emerging technology to enhance their delivery of services to the public as well as setting up opportunities for the public to help themselves. This paper outlined some of the most significant new technologies, including ideas for implementation and preparation for use.
CP Consulting recognizes that technology never stops refining itself. As such, this study merely represents the opportunities arising today. No doubt, there will be advancements tomorrow that psychological professionals will need to understand. We recommend that in addition to taking advantage of the opportunities outlined here, that psychological professionals urge the APA to engage in continuous scanning of emerging technologies and how they might impact the field. Seeing the trends and considering applications early will ensure that psychological professionals never get caught behind, missing out on ways to increase the efficacy of their work as well as ensuring the public has as many relevant and effective ways as possible to seek education and help for their needs. This is the heart of the APA's mission statement.
[[Summary of Final Work]] [[Introduction]]
Emerging Information Technologies
Ragusea, A. S., & VandeCreek, L. (2003). Suggestions for the ethical practice of online psychotherapy. //Psychotherapy: Theory, Research, Practice, Training//, 40(1), 94-102. doi:10.1037/0033-3204.40.1-2.94
''<<sbk "FULL TEXT" 20111105153229>>''
Greenfield, A. (2006, April 4). Everyware: The dawning age of ubiquitous computing. Retrieved from http://www.alistapart.com/articles/everyware/
''<<sbk "FULL TEXT" 20111105150337>>''
Allen, C. (2004). Tracing the evolution of social software. Retrieved from http://www.lifewithalacrity.com/2004/10/tracing_the_evo.html
''<<sbk "FULL TEXT" 20111105150447>>''
Vivek, V. (2010, August 17). Evolution of ubiquitous computing. Retrieved from http://www.wiziq.com/tutorial/84308-EVolution-of-Ubiquitous-Computing
''<<sbk "FULL TEXT" 20111105145223>>''
/***
|Name|ExportTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExportTiddlersPluginInfo|
|Version|2.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|interactively select/export tiddlers to a separate file|
!!!!!Documentation
>see [[ExportTiddlersPluginInfo]]
!!!!!Inline control panel (live):
><<exportTiddlers inline>>
!!!!!Revisions
<<<
2011.02.14 2.9.6 fix OSX error: use picker.file.path
2010.02.25 2.9.5 added merge checkbox option and improved 'merge' status message
|please see [[ExportTiddlersPluginInfo]] for additional revision details|
2005.10.09 0.0.0 development started
<<<
!!!!!Code
***/
//{{{
// version
version.extensions.ExportTiddlersPlugin= {major: 2, minor: 9, revision: 6, date: new Date(2011,2,14)};
// default shadow definition
config.shadowTiddlers.ExportTiddlers='<<exportTiddlers inline>>';
// add 'export' backstage task (following built-in import task)
if (config.tasks) { // TW2.2 or above
config.tasks.exportTask = {
text:'export',
tooltip:'Export selected tiddlers to another file',
content:'<<exportTiddlers inline>>'
}
config.backstageTasks.splice(config.backstageTasks.indexOf('importTask')+1,0,'exportTask');
}
config.macros.exportTiddlers = {
$: function(id) { return document.getElementById(id); }, // abbreviation
label: 'export tiddlers',
prompt: 'Copy selected tiddlers to an export document',
okmsg: '%0 tiddler%1 written to %2',
failmsg: 'An error occurred while creating %1',
overwriteprompt: '%0\ncontains %1 tiddler%2 that will be discarded or replaced',
mergestatus: '%0 tiddler%1 added, %2 tiddler%3 updated, %4 tiddler%5 unchanged',
statusmsg: '%0 tiddler%1 - %2 selected for export',
newdefault: 'export.html',
datetimefmt: '0MM/0DD/YYYY 0hh:0mm:0ss', // for 'filter date/time' edit fields
type_TW: "tw", type_PS: "ps", type_TX: "tx", type_CS: "cs", type_NF: "nf", // file type tokens
type_map: { // maps type param to token values
tiddlywiki:"tw", tw:"tw", wiki: "tw",
purestore: "ps", ps:"ps", store:"ps",
plaintext: "tx", tx:"tx", text: "tx",
comma: "cs", cs:"cs", csv: "cs",
newsfeed: "nf", nf:"nf", xml: "nf", rss:"nf"
},
handler: function(place,macroName,params) {
if (params[0]!='inline')
{ createTiddlyButton(place,this.label,this.prompt,this.togglePanel); return; }
var panel=this.createPanel(place);
panel.style.position='static';
panel.style.display='block';
},
createPanel: function(place) {
var panel=this.$('exportPanel');
if (panel) { panel.parentNode.removeChild(panel); }
setStylesheet(store.getTiddlerText('ExportTiddlersPlugin##css',''),'exportTiddlers');
panel=createTiddlyElement(place,'span','exportPanel',null,null)
panel.innerHTML=store.getTiddlerText('ExportTiddlersPlugin##html','');
this.initFilter();
this.refreshList(0);
var fn=this.$('exportFilename');
if (window.location.protocol=='file:' && !fn.value.length) {
// get new target path/filename
var newPath=getLocalPath(window.location.href);
var slashpos=newPath.lastIndexOf('/'); if (slashpos==-1) slashpos=newPath.lastIndexOf('\\');
if (slashpos!=-1) newPath=newPath.substr(0,slashpos+1); // trim filename
fn.value=newPath+this.newdefault;
}
return panel;
},
togglePanel: function(e) { var e=e||window.event;
var cme=config.macros.exportTiddlers; // abbrev
var parent=resolveTarget(e).parentNode;
var panel=cme.$('exportPanel');
if (panel==undefined || panel.parentNode!=parent)
panel=cme.createPanel(parent);
var isOpen=panel.style.display=='block';
if(config.options.chkAnimate)
anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,'none'));
else
panel.style.display=isOpen?'none':'block' ;
if (panel.style.display!='none') {
cme.refreshList(0);
cme.$('exportFilename').focus();
cme.$('exportFilename').select();
}
e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);
},
process: function(which) { // process panel control interactions
var theList=this.$('exportList'); if (!theList) return false;
var count = 0;
var total = store.getTiddlers('title').length;
switch (which.id) {
case 'exportFilter':
count=this.filterExportList();
var panel=this.$('exportFilterPanel');
if (count==-1) { panel.style.display='block'; break; }
this.$('exportStart').disabled=(count==0);
this.$('exportDelete').disabled=(count==0);
this.displayStatus(count,total);
if (count==0) { alert('No tiddlers were selected'); panel.style.display='block'; }
break;
case 'exportStart':
this.go();
break;
case 'exportDelete':
this.deleteTiddlers();
break;
case 'exportHideFilter':
case 'exportToggleFilter':
var panel=this.$('exportFilterPanel')
panel.style.display=(panel.style.display=='block')?'none':'block';
break;
case 'exportSelectChanges':
var lastmod=new Date(document.lastModified);
for (var t = 0; t < theList.options.length; t++) {
if (theList.options[t].value=='') continue;
var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;
theList.options[t].selected=(tiddler.modified>lastmod);
count += (tiddler.modified>lastmod)?1:0;
}
this.$('exportStart').disabled=(count==0);
this.$('exportDelete').disabled=(count==0);
this.displayStatus(count,total);
if (count==0) alert('There are no unsaved changes');
break;
case 'exportSelectAll':
for (var t = 0; t < theList.options.length; t++) {
if (theList.options[t].value=='') continue;
theList.options[t].selected=true;
count += 1;
}
this.$('exportStart').disabled=(count==0);
this.$('exportDelete').disabled=(count==0);
this.displayStatus(count,count);
break;
case 'exportSelectOpened':
for (var t=0; t<theList.options.length; t++) theList.options[t].selected=false;
var tiddlerDisplay=this.$('tiddlerDisplay');
for (var t=0; t<tiddlerDisplay.childNodes.length;t++) {
var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);
for (var i=0; i<theList.options.length; i++) {
if (theList.options[i].value!=tiddler) continue;
theList.options[i].selected=true; count++; break;
}
}
this.$('exportStart').disabled=(count==0);
this.$('exportDelete').disabled=(count==0);
this.displayStatus(count,total);
if (count==0) alert('There are no tiddlers currently opened');
break;
case 'exportSelectRelated':
// recursively build list of related tiddlers
function getRelatedTiddlers(tid,tids) {
var t=store.getTiddler(tid); if (!t || tids.contains(tid)) return tids;
tids.push(t.title);
if (!t.linksUpdated) t.changed();
for (var i=0; i<t.links.length; i++)
if (t.links[i]!=tid) tids=getRelatedTiddlers(t.links[i],tids);
return tids;
}
// for all currently selected tiddlers, gather up the related tiddlers (including self) and select them as well
var tids=[];
for (var i=0; i<theList.options.length; i++)
if (theList.options[i].selected) tids=getRelatedTiddlers(theList.options[i].value,tids);
// select related tiddlers (includes original selected tiddlers)
for (var i=0; i<theList.options.length; i++)
theList.options[i].selected=tids.contains(theList.options[i].value);
this.displayStatus(tids.length,total);
break;
case 'exportListSmaller': // decrease current listbox size
var min=5;
theList.size-=(theList.size>min)?1:0;
break;
case 'exportListLarger': // increase current listbox size
var max=(theList.options.length>25)?theList.options.length:25;
theList.size+=(theList.size<max)?1:0;
break;
case 'exportClose':
this.$('exportPanel').style.display='none';
break;
}
return false;
},
displayStatus: function(count,total) {
var txt=this.statusmsg.format([total,total!=1?'s':'',!count?'none':count==total?'all':count]);
clearMessage(); displayMessage(txt);
return txt;
},
refreshList: function(selectedIndex) {
var theList = this.$('exportList'); if (!theList) return;
// get the sort order
var sort;
if (!selectedIndex) selectedIndex=0;
if (selectedIndex==0) sort='modified';
if (selectedIndex==1) sort='title';
if (selectedIndex==2) sort='modified';
if (selectedIndex==3) sort='modifier';
if (selectedIndex==4) sort='tags';
// unselect headings and count number of tiddlers actually selected
var count=0;
for (var t=5; t < theList.options.length; t++) {
if (!theList.options[t].selected) continue;
if (theList.options[t].value!='')
count++;
else { // if heading is selected, deselect it, and then select and count all in section
theList.options[t].selected=false;
for ( t++; t<theList.options.length && theList.options[t].value!=''; t++) {
theList.options[t].selected=true;
count++;
}
}
}
// disable 'export' and 'delete' buttons if no tiddlers selected
this.$('exportStart').disabled=(count==0);
this.$('exportDelete').disabled=(count==0);
// show selection count
var tiddlers = store.getTiddlers('title');
if (theList.options.length) this.displayStatus(count,tiddlers.length);
// if a [command] item, reload list... otherwise, no further refresh needed
if (selectedIndex>4) return;
// clear current list contents
while (theList.length > 0) { theList.options[0] = null; }
// add heading and control items to list
var i=0;
var indent=String.fromCharCode(160)+String.fromCharCode(160);
theList.options[i++]=
new Option(tiddlers.length+' tiddlers in document', '',false,false);
theList.options[i++]=
new Option(((sort=='title' )?'>':indent)+' [by title]', '',false,false);
theList.options[i++]=
new Option(((sort=='modified')?'>':indent)+' [by date]', '',false,false);
theList.options[i++]=
new Option(((sort=='modifier')?'>':indent)+' [by author]', '',false,false);
theList.options[i++]=
new Option(((sort=='tags' )?'>':indent)+' [by tags]', '',false,false);
// output the tiddler list
switch(sort) {
case 'title':
for(var t = 0; t < tiddlers.length; t++)
theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);
break;
case 'modifier':
case 'modified':
var tiddlers = store.getTiddlers(sort);
// sort descending for newest date first
tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });
var lastSection = '';
for(var t = 0; t < tiddlers.length; t++) {
var tiddler = tiddlers[t];
var theSection = '';
if (sort=='modified') theSection=tiddler.modified.toLocaleDateString();
if (sort=='modifier') theSection=tiddler.modifier;
if (theSection != lastSection) {
theList.options[i++] = new Option(theSection,'',false,false);
lastSection = theSection;
}
theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);
}
break;
case 'tags':
var theTitles = {}; // all tiddler titles, hash indexed by tag value
var theTags = new Array();
for(var t=0; t<tiddlers.length; t++) {
var title=tiddlers[t].title;
var tags=tiddlers[t].tags;
if (!tags || !tags.length) {
if (theTitles['untagged']==undefined) { theTags.push('untagged'); theTitles['untagged']=new Array(); }
theTitles['untagged'].push(title);
}
else for(var s=0; s<tags.length; s++) {
if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }
theTitles[tags[s]].push(title);
}
}
theTags.sort();
for(var tagindex=0; tagindex<theTags.length; tagindex++) {
var theTag=theTags[tagindex];
theList.options[i++]=new Option(theTag,'',false,false);
for(var t=0; t<theTitles[theTag].length; t++)
theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);
}
break;
}
theList.selectedIndex=selectedIndex; // select current control item
this.$('exportStart').disabled=true;
this.$('exportDelete').disabled=true;
this.displayStatus(0,tiddlers.length);
},
askForFilename: function(here) {
var msg=here.title; // use tooltip as dialog box message
var path=getLocalPath(document.location.href);
var slashpos=path.lastIndexOf('/'); if (slashpos==-1) slashpos=path.lastIndexOf('\\');
if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash
var filetype=this.$('exportFormat').value.toLowerCase();
var defext='html';
if (filetype==this.type_TX) defext='txt';
if (filetype==this.type_CS) defext='csv';
if (filetype==this.type_NF) defext='xml';
var file=this.newdefault.replace(/html$/,defext);
var result='';
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension=defext;
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.path;
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XPSP2 IE only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|XML files|*.xml|';
s.FilterIndex=defext=='txt'?2:'html'?3:'xml'?4:1;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { // fallback
var result=prompt(msg,path+file);
}
}
return result;
},
initFilter: function() {
this.$('exportFilterStart').checked=false; this.$('exportStartDate').value='';
this.$('exportFilterEnd').checked=false; this.$('exportEndDate').value='';
this.$('exportFilterTags').checked=false; this.$('exportTags').value='';
this.$('exportFilterText').checked=false; this.$('exportText').value='';
this.showFilterFields();
},
showFilterFields: function(which) {
var show=this.$('exportFilterStart').checked;
this.$('exportFilterStartBy').style.display=show?'block':'none';
this.$('exportStartDate').style.display=show?'block':'none';
var val=this.$('exportFilterStartBy').value;
this.$('exportStartDate').value
=this.getFilterDate(val,'exportStartDate').formatString(this.datetimefmt);
if (which && (which.id=='exportFilterStartBy') && (val=='other'))
this.$('exportStartDate').focus();
var show=this.$('exportFilterEnd').checked;
this.$('exportFilterEndBy').style.display=show?'block':'none';
this.$('exportEndDate').style.display=show?'block':'none';
var val=this.$('exportFilterEndBy').value;
this.$('exportEndDate').value
=this.getFilterDate(val,'exportEndDate').formatString(this.datetimefmt);
if (which && (which.id=='exportFilterEndBy') && (val=='other'))
this.$('exportEndDate').focus();
var show=this.$('exportFilterTags').checked;
this.$('exportTags').style.display=show?'block':'none';
var show=this.$('exportFilterText').checked;
this.$('exportText').style.display=show?'block':'none';
},
getFilterDate: function(val,id) {
var result=0;
switch (val) {
case 'file':
result=new Date(document.lastModified);
break;
case 'other':
result=new Date(this.$(id).value);
break;
default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31
var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;
var oneday=86400000;
if (id=='exportStartDate')
result=new Date((Math.floor(now/oneday)-val)*oneday+tz);
else
result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);
break;
}
return result;
},
filterExportList: function() {
var theList = this.$('exportList'); if (!theList) return -1;
var filterStart=this.$('exportFilterStart').checked;
var val=this.$('exportFilterStartBy').value;
var startDate=config.macros.exportTiddlers.getFilterDate(val,'exportStartDate');
var filterEnd=this.$('exportFilterEnd').checked;
var val=this.$('exportFilterEndBy').value;
var endDate=config.macros.exportTiddlers.getFilterDate(val,'exportEndDate');
var filterTags=this.$('exportFilterTags').checked;
var tags=this.$('exportTags').value;
var filterText=this.$('exportFilterText').checked;
var text=this.$('exportText').value;
if (!(filterStart||filterEnd||filterTags||filterText)) {
alert('Please set the selection filter');
this.$('exportFilterPanel').style.display='block';
return -1;
}
if (filterStart&&filterEnd&&(startDate>endDate)) {
var msg='starting date/time:\n'
msg+=startDate.toLocaleString()+'\n';
msg+='is later than ending date/time:\n'
msg+=endDate.toLocaleString()
alert(msg);
return -1;
}
// if filter by tags, get list of matching tiddlers
// use getMatchingTiddlers() (if MatchTagsPlugin is installed) for full boolean expressions
// otherwise use getTaggedTiddlers() for simple tag matching
if (filterTags) {
var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
var t=fn.apply(store,[tags]);
var tagged=[];
for (var i=0; i<t.length; i++) tagged.push(t[i].title);
}
// scan list and select tiddlers that match all applicable criteria
var total=0;
var count=0;
for (var i=0; i<theList.options.length; i++) {
// get item, skip non-tiddler list items (section headings)
var opt=theList.options[i]; if (opt.value=='') continue;
// get tiddler, skip missing tiddlers (this should NOT happen)
var tiddler=store.getTiddler(opt.value); if (!tiddler) continue;
var sel=true;
if ( (filterStart && tiddler.modified<startDate)
|| (filterEnd && tiddler.modified>endDate)
|| (filterTags && !tagged.contains(tiddler.title))
|| (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))
sel=false;
opt.selected=sel;
count+=sel?1:0;
total++;
}
return count;
},
deleteTiddlers: function() {
var list=this.$('exportList'); if (!list) return;
var tids=[];
for (i=0;i<list.length;i++)
if (list.options[i].selected && list.options[i].value.length)
tids.push(list.options[i].value);
if (!confirm('Are you sure you want to delete these tiddlers:\n\n'+tids.join(', '))) return;
store.suspendNotifications();
for (t=0;t<tids.length;t++) {
var tid=store.getTiddler(tids[t]); if (!tid) continue;
var msg="'"+tid.title+"' is tagged with 'systemConfig'.\n\n";
msg+='Removing this tiddler may cause unexpected results. Are you sure?'
if (tid.tags.contains('systemConfig') && !confirm(msg)) continue;
store.removeTiddler(tid.title);
story.closeTiddler(tid.title);
}
store.resumeNotifications();
alert(tids.length+' tiddlers deleted');
this.refreshList(0); // reload listbox
store.notifyAll(); // update page display
},
go: function() {
if (window.location.protocol!='file:') // make sure we are local
{ displayMessage(config.messages.notFileUrlError); return; }
// get selected tidders, target filename, target type, and notes
var list=this.$('exportList'); if (!list) return;
var tids=[]; for (var i=0; i<list.options.length; i++) {
var opt=list.options[i]; if (!opt.selected||!opt.value.length) continue;
var tid=store.getTiddler(opt.value); if (!tid) continue;
tids.push(tid);
}
if (!tids.length) return; // no tiddlers selected
var target=this.$('exportFilename').value.trim();
if (!target.length) {
displayMessage('A local target path/filename is required',target);
return;
}
var merge=this.$('exportMerge').checked;
var filetype=this.$('exportFormat').value.toLowerCase();
var notes=this.$('exportNotes').value.replace(/\n/g,'<br>');
var total={val:0};
var out=this.assembleFile(target,filetype,tids,notes,total,merge);
if (!total.val) return; // cancelled file overwrite
var link='file:///'+target.replace(/\\/g,'/');
var samefile=link==decodeURIComponent(window.location.href);
var p=getLocalPath(document.location.href);
if (samefile) {
if (config.options.chkSaveBackups) { var t=loadOriginal(p);if(t)saveBackup(p,t); }
if (config.options.chkGenerateAnRssFeed && saveRss instanceof Function) saveRss(p);
}
var ok=saveFile(target,out);
displayMessage((ok?this.okmsg:this.failmsg).format([total.val,total.val!=1?'s':'',target]),link);
},
plainTextHeader:
'Source:\n\t%0\n'
+'Title:\n\t%1\n'
+'Subtitle:\n\t%2\n'
+'Created:\n\t%3 by %4\n'
+'Application:\n\tTiddlyWiki %5 / %6 %7\n\n',
plainTextTiddler:
'- - - - - - - - - - - - - - -\n'
+'| title: %0\n'
+'| created: %1\n'
+'| modified: %2\n'
+'| edited by: %3\n'
+'| tags: %4\n'
+'- - - - - - - - - - - - - - -\n'
+'%5\n',
plainTextFooter:
'',
newsFeedHeader:
'<'+'?xml version="1.0"?'+'>\n'
+'<rss version="2.0">\n'
+'<channel>\n'
+'<title>%1</title>\n'
+'<link>%0</link>\n'
+'<description>%2</description>\n'
+'<language>en-us</language>\n'
+'<copyright>Copyright '+(new Date().getFullYear())+' %4</copyright>\n'
+'<pubDate>%3</pubDate>\n'
+'<lastBuildDate>%3</lastBuildDate>\n'
+'<docs>http://blogs.law.harvard.edu/tech/rss</docs>\n'
+'<generator>TiddlyWiki %5 / %6 %7</generator>\n',
newsFeedTiddler:
'\n%0\n',
newsFeedFooter:
'</channel></rss>',
pureStoreHeader:
'<html><body>'
+'<style type="text/css">'
+' #storeArea {display:block;margin:1em;}'
+' #storeArea div {padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}'
+' #pureStoreHeading {width:100%;text-align:left;background-color:#eeeeee;padding:1em;}'
+'</style>'
+'<div id="pureStoreHeading">'
+' TiddlyWiki "PureStore" export file<br>'
+' Source'+': <b>%0</b><br>'
+' Title: <b>%1</b><br>'
+' Subtitle: <b>%2</b><br>'
+' Created: <b>%3</b> by <b>%4</b><br>'
+' TiddlyWiki %5 / %6 %7<br>'
+' Notes:<hr><pre>%8</pre>'
+'</div>'
+'<div id="storeArea">',
pureStoreTiddler:
'%0\n%1',
pureStoreFooter:
'</div><!--POST-BODY-START-->\n<!--POST-BODY-END--></body></html>',
assembleFile: function(target,filetype,tids,notes,total,merge) {
var revised='';
var now = new Date().toLocaleString();
var src=convertUnicodeToUTF8(document.location.href);
var title = convertUnicodeToUTF8(wikifyPlain('SiteTitle').htmlEncode());
var subtitle = convertUnicodeToUTF8(wikifyPlain('SiteSubtitle').htmlEncode());
var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
var twver = version.major+'.'+version.minor+'.'+version.revision;
var v=version.extensions.ExportTiddlersPlugin; var pver = v.major+'.'+v.minor+'.'+v.revision;
var headerargs=[src,title,subtitle,now,user,twver,'ExportTiddlersPlugin',pver,notes];
switch (filetype) {
case this.type_TX: // plain text
var header=this.plainTextHeader.format(headerargs);
var footer=this.plainTextFooter;
break;
case this.type_CS: // comma-separated
var fields={};
for (var i=0; i<tids.length; i++) for (var f in tids[i].fields) fields[f]=f;
var names=['title','created','modified','modifier','tags','text'];
for (var f in fields) names.push(f);
var header=names.join(',')+'\n';
var footer='';
break;
case this.type_NF: // news feed (XML)
headerargs[0]=store.getTiddlerText('SiteUrl','');
var header=this.newsFeedHeader.format(headerargs);
var footer=this.newsFeedFooter;
break;
case this.type_PS: // PureStore (no code)
var header=this.pureStoreHeader.format(headerargs);
var footer=this.pureStoreFooter;
break;
case this.type_TW: // full TiddlyWiki
default:
var currPath=getLocalPath(window.location.href);
var original=loadFile(currPath);
if (!original) { displayMessage(config.messages.cantSaveError); return; }
var posDiv = locateStoreArea(original);
if (!posDiv) { displayMessage(config.messages.invalidFileError.format([currPath])); return; }
var header = original.substr(0,posDiv[0]+startSaveArea.length)+'\n';
var footer = '\n'+original.substr(posDiv[1]);
break;
}
var out=this.getData(target,filetype,tids,fields,merge);
var revised = header+convertUnicodeToUTF8(out.join('\n'))+footer;
// if full TW, insert page title and language attr, and reset all MARKUP blocks...
if (filetype==this.type_TW) {
var newSiteTitle=convertUnicodeToUTF8(getPageTitle()).htmlEncode();
revised=revised.replaceChunk('<title'+'>','</title'+'>',' ' + newSiteTitle + ' ');
revised=updateLanguageAttribute(revised);
var titles=[]; for (var i=0; i<tids.length; i++) titles.push(tids[i].title);
revised=updateMarkupBlock(revised,'PRE-HEAD',
titles.contains('MarkupPreHead')? 'MarkupPreHead' :null);
revised=updateMarkupBlock(revised,'POST-HEAD',
titles.contains('MarkupPostHead')?'MarkupPostHead':null);
revised=updateMarkupBlock(revised,'PRE-BODY',
titles.contains('MarkupPreBody')? 'MarkupPreBody' :null);
revised=updateMarkupBlock(revised,'POST-SCRIPT',
titles.contains('MarkupPostBody')?'MarkupPostBody':null);
}
total.val=out.length;
return revised;
},
getData: function(target,filetype,tids,fields,merge) {
// output selected tiddlers and gather list of titles (for use with merge)
var out=[]; var titles=[];
var url=store.getTiddlerText('SiteUrl','');
for (var i=0; i<tids.length; i++) {
out.push(this.formatItem(store,filetype,tids[i],url,fields));
titles.push(tids[i].title);
}
// if TW or PureStore format, ask to merge with existing tiddlers (if any)
if (filetype==this.type_TW || filetype==this.type_PS) {
var txt=loadFile(target);
if (txt && txt.length) {
var remoteStore=new TiddlyWiki();
if (version.major+version.minor*.1+version.revision*.01<2.52) txt=convertUTF8ToUnicode(txt);
if (remoteStore.importTiddlyWiki(txt)) {
var existing=remoteStore.getTiddlers('title');
var msg=this.overwriteprompt.format([target,existing.length,existing.length!=1?'s':'']);
if (merge) {
var added=titles.length; var updated=0; var kept=0;
for (var i=0; i<existing.length; i++)
if (titles.contains(existing[i].title)) {
added--; updated++;
} else {
out.push(this.formatItem(remoteStore,filetype,existing[i],url));
kept++;
}
displayMessage(this.mergestatus.format(
[added,added!=1?'s':'',updated,updated!=1?'s':'',kept,kept!=1?'s':'',]));
}
else if (!confirm(msg)) out=[]; // empty the list = don't write file
}
}
}
return out;
},
formatItem: function(s,f,t,u,fields) {
if (f==this.type_TW)
var r=s.getSaver().externalizeTiddler(s,t);
if (f==this.type_PS)
var r=this.pureStoreTiddler.format([t.title,s.getSaver().externalizeTiddler(s,t)]);
if (f==this.type_NF)
var r=this.newsFeedTiddler.format([t.saveToRss(u)]);
if (f==this.type_TX)
var r=this.plainTextTiddler.format([t.title, t.created.toLocaleString(), t.modified.toLocaleString(),
t.modifier, String.encodeTiddlyLinkList(t.tags), t.text]);
if (f==this.type_CS) {
function toCSV(t) { return '"'+t.replace(/"/g,'""')+'"'; } // always encode CSV
var out=[ toCSV(t.title), toCSV(t.created.toLocaleString()), toCSV(t.modified.toLocaleString()),
toCSV(t.modifier), toCSV(String.encodeTiddlyLinkList(t.tags)), toCSV(t.text) ];
for (var f in fields) out.push(toCSV(t.fields[f]||''));
var r=out.join(',');
}
return r||"";
}
}
//}}}
/***
!!!Control panel CSS
//{{{
!css
#exportPanel {
display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;
background-color: #eee; color:#000; font-size: 8pt; line-height:110%;
border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;
padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em;
}
#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }
#exportPanel table {
width:100%; border:0px; padding:0px; margin:0px;
font-size:8pt; line-height:110%; background:transparent;
}
#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }
#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }
#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}
#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }
#exportPanel textarea { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }
#exportPanel .box {
border:1px solid black; padding:3px; margin-bottom:5px;
background:#f8f8f8; -moz-border-radius:5px;-webkit-border-radius:5px; }
#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }
#exportPanel .rad { width:auto;border:0 }
#exportPanel .chk { width:auto;border:0 }
#exportPanel .btn { width:auto; }
#exportPanel .btn1 { width:98%; }
#exportPanel .btn2 { width:48%; }
#exportPanel .btn3 { width:32%; }
#exportPanel .btn4 { width:24%; }
#exportPanel .btn5 { width:19%; }
!end
//}}}
!!!Control panel HTML
//{{{
!html
<!-- target path/file -->
<div>
<div style="float:right;padding-right:.5em">
<input type="checkbox" style="width:auto" id="exportMerge" CHECKED
title="combine selected tiddlers with existing tiddlers (if any) in export file"> merge
</div>
export to:<br>
<input type="text" id="exportFilename" size=40 style="width:93%"><input
type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%"
onclick="var fn=config.macros.exportTiddlers.askForFilename(this); if (fn.length) this.previousSibling.value=fn; ">
</div>
<!-- output format -->
<div>
format:
<select id="exportFormat" size=1>
<option value="TW">TiddlyWiki HTML document (includes core code)</option>
<option value="PS">TiddlyWiki "PureStore" HTML file (tiddler data only)</option>
<option value="TX">TiddlyWiki plain text TXT file (tiddler source listing)</option>
<option value="CS">Comma-Separated Value (CSV) data file</option>
<option value="NF">RSS NewsFeed XML file</option>
</select>
</div>
<!-- notes -->
<div>
notes:<br>
<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea>
</div>
<!-- list of tiddlers -->
<table><tr align="left"><td>
select:
<a href="JavaScript:;" id="exportSelectAll"
onclick="return config.macros.exportTiddlers.process(this)" title="select all tiddlers">
all </a>
<a href="JavaScript:;" id="exportSelectChanges"
onclick="return config.macros.exportTiddlers.process(this)" title="select tiddlers changed since last save">
changes </a>
<a href="JavaScript:;" id="exportSelectOpened"
onclick="return config.macros.exportTiddlers.process(this)" title="select tiddlers currently being displayed">
opened </a>
<a href="JavaScript:;" id="exportSelectRelated"
onclick="return config.macros.exportTiddlers.process(this)" title="select tiddlers related to the currently selected tiddlers">
related </a>
<a href="JavaScript:;" id="exportToggleFilter"
onclick="return config.macros.exportTiddlers.process(this)" title="show/hide selection filter">
filter </a>
</td><td align="right">
<a href="JavaScript:;" id="exportListSmaller"
onclick="return config.macros.exportTiddlers.process(this)" title="reduce list size">
– </a>
<a href="JavaScript:;" id="exportListLarger"
onclick="return config.macros.exportTiddlers.process(this)" title="increase list size">
+ </a>
</td></tr></table>
<select id="exportList" multiple size="10" style="margin-bottom:5px;"
onchange="config.macros.exportTiddlers.refreshList(this.selectedIndex)">
</select><br>
<!-- selection filter -->
<div id="exportFilterPanel" style="display:none">
<table><tr align="left"><td>
selection filter
</td><td align="right">
<a href="JavaScript:;" id="exportHideFilter"
onclick="return config.macros.exportTiddlers.process(this)" title="hide selection filter">hide</a>
</td></tr></table>
<div class="box">
<input type="checkbox" class="chk" id="exportFilterStart" value="1"
onclick="config.macros.exportTiddlers.showFilterFields(this)"> starting date/time<br>
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">
<select size=1 id="exportFilterStartBy"
onchange="config.macros.exportTiddlers.showFilterFields(this);">
<option value="0">today</option>
<option value="1">yesterday</option>
<option value="7">a week ago</option>
<option value="30">a month ago</option>
<option value="file">file date</option>
<option value="other">other (mm/dd/yyyy hh:mm)</option>
</select>
</td><td width="50%">
<input type="text" id="exportStartDate" onfocus="this.select()"
onchange="config.macros.exportTiddlers.$('exportFilterStartBy').value='other';">
</td></tr></table>
<input type="checkbox" class="chk" id="exportFilterEnd" value="1"
onclick="config.macros.exportTiddlers.showFilterFields(this)"> ending date/time<br>
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">
<select size=1 id="exportFilterEndBy"
onchange="config.macros.exportTiddlers.showFilterFields(this);">
<option value="0">today</option>
<option value="1">yesterday</option>
<option value="7">a week ago</option>
<option value="30">a month ago</option>
<option value="file">file date</option>
<option value="other">other (mm/dd/yyyy hh:mm)</option>
</select>
</td><td width="50%">
<input type="text" id="exportEndDate" onfocus="this.select()"
onchange="config.macros.exportTiddlers.$('exportFilterEndBy').value='other';">
</td></tr></table>
<input type="checkbox" class="chk" id=exportFilterTags value="1"
onclick="config.macros.exportTiddlers.showFilterFields(this)"> match tags<br>
<input type="text" id="exportTags" onfocus="this.select()">
<input type="checkbox" class="chk" id=exportFilterText value="1"
onclick="config.macros.exportTiddlers.showFilterFields(this)"> match titles/tiddler text<br>
<input type="text" id="exportText" onfocus="this.select()">
</div> <!--box-->
</div> <!--panel-->
<!-- action buttons -->
<div style="text-align:center">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
id="exportFilter" value="apply filter">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
id="exportStart" value="export tiddlers">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
id="exportDelete" value="delete tiddlers">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
id="exportClose" value="close">
</div><!--center-->
!end
//}}}
***/
/***
|Name|ExportTiddlersPluginInfo|
|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExportTiddlersPluginInfo|
|Version|2.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for ExportTiddlersPlugin|
interactively select and extract tiddlers from your ~TiddlyWiki document, and write them into another file, using one of several different file formats:
* ~TiddlyWiki - a complete, stand-alone, standard TiddlyWiki HTML document
* ~PureStore - a small HTML archive file containing tiddler data only (no core code)
* ~PlainText - a simple TXT text file with tiddler source listings
* Comma - a "Comma Separated Value" data/spreadsheet file
* ~NewsFeed - an XML-format file that can be published for RSS syndication.
!!!!!Usage
<<<
{{{
<<exportTiddlers>> (sidebar menu item)
<<exportTiddlers inline>> (embedded control panel)
}}}
Inline control panel (live):
<<exportTiddlers inline>>
Optional "special tiddlers" used by this plugin:
* SiteUrl<br>URL for official server-published version of document being viewed (used in XML export). Default: //none//
<<<
!!!!!Revisions
<<<
2010.02.25 2.9.5 added merge checkbox option and improved 'merge' status message
2009.09.12 2.9.4 fixed 'return false' to prevent IE page transitions
2009.07.06 2.9.3 moved HTML to section for size reduction
2009.07.03 2.9.2 TW252 fixup: don't call convertUTF8ToUnicode() for local loadFile() I/O
2009.04.30 2.9.1 custom fields in CSV output
2009.04.19 2.9.0 added CSV format
2009.02.26 2.8.5 use macro-specific definition of $() function abbreviation (avoids conflict with JQuery)
2008.09.29 2.8.4 in getData(), convert existing TW file from UTF8 to Unicode before merging to correct handling of international characters and symbols.
2008.09.26 2.8.3 in go(), if rewriting *current* file and chkSaveBackups and/or chkGenerateAnRssFeed is enabled, then write a backup file or RSS feed, respectively.
2008.09.24 2.8.2 in assembleFile(), make sure that markup block is updated if corresponding Markup* tiddler is exported.
2008.09.19 2.8.1 in formatItem(), removed unnecessary convertUnicodeToUTF8() (was causing double-conversion!)
2008.09.11 2.8.0 extensive code cleanup: moved all global functions inside macro object. Re-wrote file generator and I/O to support TiddlyWiki, PlainText, PureStore, and NewsFeed file formats. Replaced inline 'match tags' code with use of getMatchingTiddlers() from [[MatchTagsPlugin]] (if installed), with fallback to core getTaggedTiddlers() otherwise.
2008.05.27 2.7.0 added ability to 'merge' with existing export file. Also, revised 'matchTags' functionality to be more robust and more efficient
2008.05.12 2.6.1 automatically add 'export' task to backstage (moved from BackstageTweaks)
2008.03.10 2.6.0 added "delete tiddlers" button
2007.12.04 *.*.* update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.11.10 2.5.1 removed debugging alert messages from promptForExportFilename()
2007.10.31 2.5.0 code reduction: removed incomplete/unused interface and supporting functions for exporting directly to http, https or ftp servers. Plugin now supports exporting to local file only. Also, updated TW document output to generate TW2.2 compatible file format.
2007.10.30 2.4.2 added automatic shadow tiddler definition for [[ExportTiddlers]]
2007.07.16 2.4.1 in exportTWHeader(), reset HTML source 'markup' so installed markup is NOT copied to new file.
2007.06.30 2.4.0 added "select related tiddlers" feature. Recursively scans the tiddler links[] info to find all tiddlers referenced by any of the currently selected tiddler, and then selects them all (including the original tiddlers).
2007.04.19 2.3.0 in exportData(), pass SiteURL value as param to saveToRss(). Fixes 'undefined' appearing in tiddler link in XML output. Also, in refreshExportList(), added 'sort by tags'. Also, added 'group select'... selecting a heading (date,author,tag) auto-selects all tiddlers in that group.
2007.03.02 2.2.6 in onClickExportButton(), when selecting open tiddlers for TW2.2, look for "storyDisplay" with fallback to "tiddlerDisplay" for TW2.1 or earlier
2007.03.01 2.2.5 removed hijack of store.saveChanges()
2006.11.08 2.2.4 added promptForExportFilename() and replaced type="file" control with edit field + browse button ("...").
2006.10.12 2.2.3 in exportDIVFooter(), write POST-BODY-START/END markers for compatibility with TW2.1 core file format.
2006.05.11 2.2.2 in createExportPanel, removed call to addNotification() to reduce unneeded feedback messages and increase overall document performance.
2006.05.02 2.2.1 Use displayMessage() to show number of selected tiddlers instead of updating listbox 'header' item after each selection. Prevents awkward 'scroll-to-top' behavior that made multi-select via ctrl-click nearly impossible.
2006.04.29 2.2.0 New features: free-form "Notes" text inserted in the header of PureStore files.
2006.03.29 2.1.3 added calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.
2006.02.12 2.1.2 more FF1501 bug fixes.
2006.02.04 2.1.1 added var to unintended globals to avoids FireFox1501 crash bug
2006.02.02 2.1.0 Added support for output of complete TiddlyWiki documents
2006.01.21 2.0.1 Defer initial panel creation and only register a notification function when panel first is created
in saveChanges 'hijack', create panel as needed. Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.
2005.12.27 2.0.0 Update for TW2.0.
2005.12.24 0.9.5 Minor adjustments to CSS to force correct link colors regardless of TW stylesheet selection
2005.12.16 0.9.4 Dynamically create/remove exportPanel so only one instance exists at a time
2005.11.15 0.9.2 added non-Ajax post to bypass cross-domain security restrictions.
2005.11.08 0.9.1 moved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time.
2005.10.28 0.9.0 added 'select opened tiddlers' feature. Based on a suggestion by Geoff Slocock
2005.10.24 0.8.3 Corrected hijack of 'save changes' when using http:
2005.10.18 0.8.2 added AJAX functions
2005.10.18 0.8.1 Corrected timezone handling and error checking/reporting when filtering tiddlers. More style tweaks, minor text changes and some assorted layout cleanup.
2005.10.17 0.8.0 First pre-release.
2005.10.16 0.7.0 filter by tags
2005.10.15 0.6.0 filter by title/text
2005.10.14 0.5.0 export to local file (DIV or XML)
2005.10.14 0.4.0 filter by start/end date
2005.10.13 0.3.0 panel interaction
2005.10.11 0.2.0 panel layout
2005.10.10 0.1.0 code framework
2005.10.09 0.0.0 development started
<<<
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
window.onClickTag_mptw_orig.apply(this,arguments);
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
// Thanks Saq, you're a genius :)
var popup = Popup.stack[Popup.stack.length-1].popup;
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
return false;
}
//}}}
To download a PDF of this report, click ''<<sbk "here" 20111213101024>>''
Anderson, J. Q. & Rainie, L. (2010, June 11). The future of cloud computing. Retrieved from http://pewresearch.org/pubs/1623/future-cloud-computing-technology-experts
''<<sbk "FULL TEXT" 20111105163745>>''
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.2a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
Warning: the showWhen and hideWhen macros will blindly eval paramString.
This could be used to execute harmful javascript from a tiddler.
(TODO: Make some effort to sanitize paramString. Perhaps disallow the equals sign?)
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
window.hideWhenLastTest = test;
if (test) {
jQuery(place).empty()
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place );
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place );
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place );
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place );
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place );
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place );
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place );
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place );
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place );
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place );
}},
hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title == params[0], place );
}},
showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title != params[0], place );
}},
'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !window.hideWhenLastTest, place );
}}
});
//}}}
Weinberger, M. (2011, November 15). IBM Tech Trends Report: Yes, Cloud Adoption Is Growing. http://www.talkincloud.com/ibm-tech-trends-report-yes-cloud-adoption-is-growing/
<<sbk "FULL TEXT" 20111115152722>>
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 6, date: new Date(2010,12,15)};
config.formatters.push( {
name: "inlineJavascript",
match: "\\<script",
lookahead: "\\<script(?: type=\\\"[^\\\"]*\\\")?(?: src=\\\"([^\\\"]*)\\\")?(?: label=\\\"([^\\\"]*)\\\")?(?: title=\\\"([^\\\"]*)\\\")?(?: key=\\\"([^\\\"]*)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",
handler: function(w) {
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var src=lookaheadMatch[1];
var label=lookaheadMatch[2];
var tip=lookaheadMatch[3];
var key=lookaheadMatch[4];
var show=lookaheadMatch[5];
var code=lookaheadMatch[6];
if (src) { // external script library
var script = document.createElement("script"); script.src = src;
document.body.appendChild(script); document.body.removeChild(script);
}
if (code) { // inline code
if (show) // display source in tiddler
wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
if (label) { // create 'onclick' command link
var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
link.tiddler=w.tiddler;
link.onclick=function(){
this.bufferedHTML="";
try{ var r=eval(this.code);
if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
if(this.bufferedHTML.length)
s.innerHTML=this.bufferedHTML;
if((typeof(r)==="string")&&r.length) {
wikify(r,s,null,this.tiddler);
return false;
} else return r!==undefined?r:false;
} catch(e){alert(e.description||e.toString());return false;}
};
link.setAttribute("title",tip||"");
var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
link.setAttribute("href",URIcode);
link.style.cursor="pointer";
if (key) link.accessKey=key.substr(0,1); // single character only
}
else { // run script immediately
var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
try { var out=eval(c); }
catch(e) { out=e.description?e.description:e.toString(); }
if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
}
}
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
} )
//}}}
// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
if(limit > 0) text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
//}}}
// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{
config.InstantTimestamp = {
// adjust to suit
timeFormat: 'DD/0MM/YY 0hh:0mm',
dateFormat: 'DD/0MM/YY',
translations: [
[/^!ts?$/img, "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/^!ds?$/img, "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],
// thanks Adapted Cat
[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
],
excludeTags: [
"noAutoCorrect",
"noTimestamp",
"html",
"CSS",
"css",
"systemConfig",
"systemConfigDisabled",
"zsystemConfig",
"Plugins",
"Plugin",
"plugins",
"plugin",
"javascript",
"code",
"systemTheme",
"systemPalette"
],
excludeTiddlers: [
"StyleSheet",
"StyleSheetLayout",
"StyleSheetColors",
"StyleSheetPrint"
// more?
]
};
TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
tags = tags ? tags : []; // just in case tags is null
tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
var conf = config.InstantTimestamp;
if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {
var now = new Date();
var trans = conf.translations;
for (var i=0;i<trans.length;i++) {
newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
}
}
// TODO: use apply() instead of naming all args?
return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}
// you can override these in StyleSheet
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");
//}}}
Lange, A., Rietdijk, D., Hudcovicova, M., van de Ven, J., Schrieken, B., & Emmelkamp, P. G. (2003). Interapy: A controlled randomized trial of the standardized treatment of posttraumatic stress through the internet. //Journal of Consulting and Clinical Psychology//, 71(5), 901-909. doi:10.1037/0022-006X.71.5.901
''<<sbk "FULL TEXT" 20111105152234>>''
As advancements in information technology are introduced at what often seems like a dizzying pace, it can become difficult for those not embedded in the field to remain aware of, let alone delve deep enough into, which trends are most likely to be beneficial. Ignoring these innovations until a clear “winner” is declared, it’s a risky venture, especially for organizations. To delay (or even ignore) these advancements can mean losing out on methods which might facilitate and further missions and goals. Additionally, hesitation creates possibility of an organization becoming irrelevant due to communication techniques that are increasingly outdated or obsolete. It’s simply not a smart option.
CP Consulting has authored a special report for the ''[[American Psychological Association|http://apa.org/]]'' on the following currently-emerging information technologies:
* [[Ubiquitous Computing|A: Ubiquitous Computing]]
* [[Personalization|B: Personalization]]
* [[Social Computing|C: Social Computing]]
* [[Mobile Computing|D: Mobile Computing]]
* [[Cloud Computing|E: Cloud Computing]]
The discussion will focus on how these can contribute to the APA’s internal focus of developing psychological professionals (and thereby the profession in general), as well as its external focus on ensuring the public has easy access to relevant information and resources about psychotherapy and psychological issues. We view the technologies as bridges between the following:
* [[Professional : Professional]]
* [[Professional : Public]]
* [[Professionals : APA : Public]]
* [[Public : Public]]
Below is a diagram of these overlapping relationships which will be referenced throughout the report.
<html><img src="http://farm7.static.flickr.com/6053/6274702862_02ef2df715.jpg" width="500" height="375" alt="APARelationships"></a></html>
Included in the analysis are various practical applications, as well as a discussion of potential trouble spots and ethical issues when using these techniques in the highly-confidential, face-to-face world of psychotherapy. Ultimately, our report will offers the APA and individual professionals can use the available technology to deliver and exchange information as well as how professionals and the public will benefit from easy access to content generated by the APA. We believe that this solution must address how technology can facilitate both development/delivery of information as well as reception, addressing the opportunities and experiences for developers and receivers. Our report is specific to the APA’s needs and concerns with advice and ideas unique to the association.
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second. So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only. Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{
var MINS = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS = 24 * HOURS;
if (!config.lessBackups) {
config.lessBackups = {
// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
modes: [
["YYYY", 365*DAYS], // one per year for ever
["MMM", 31*DAYS], // one per month
["ddd", 7*DAYS], // one per weekday
//["d0DD", 1*DAYS], // one per day of month
["h0hh", 24*HOURS], // one per hour
["m0mm", 1*HOURS], // one per minute
["s0ss", 1*MINS], // one per second
["latest",0] // always keep last version. (leave this).
]
};
}
window.getSpecialBackupPath = function(backupPath) {
var now = new Date();
var modes = config.lessBackups.modes;
for (var i=0;i<modes.length;i++) {
// the filename we will try
var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')
// open the file
try {
if (config.browser.isIE) {
var fsobject = new ActiveXObject("Scripting.FileSystemObject")
var fileExists = fsobject.FileExists(specialBackupPath);
if (fileExists) {
var fileObject = fsobject.GetFile(specialBackupPath);
var modDate = new Date(fileObject.DateLastModified).valueOf();
}
}
else {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(specialBackupPath);
var fileExists = file.exists();
if (fileExists) {
var modDate = file.lastModifiedTime;
}
}
}
catch(e) {
// give up
return backupPath;
}
// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
// June file on disk that's more than an month old then it must be stale so overwrite
// note that "latest" should be always written because the expiration period is zero (see above)
var expiry = new Date(modDate + modes[i][1]);
if (!fileExists || now > expiry)
return specialBackupPath;
}
}
// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}
//}}}
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
major: 1, minor: 1, revision: 0,
date: new Date("mar 17, 2007"),
source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};
if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};
bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){
url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
}
return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
[[Introduction]] <<tag Topics>> <<tag Technologies>> <<tag Audiences>> [[Conclusion]] [[References]] [[About CP|About CP Consulting]] [[Full Report]]
Campbell, S. W. & Park, Y. J. (2008). Social implications of mobile telephony: The rise of personal communication society. Retrieved from http://www.yongjinpark.com/resources/mobile.pdf
<<sbk "FULL TEXT'' 20111211182630>>
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300
Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
//{{{
// Pretty sure this is incomplete and experimental
// TODO: Fix it or remove it.
(function($){
merge(config.macros,{
mptwCollapse: {
handler: function(place,macroName,params) {
createTiddlyButton(place, params[0] == '+' ? '\u25AD' : '\u25AC', 'collapse/uncollapse', function(){
$(story.findContainingTiddler(place)).toggleClass('collapsed');
});
}
}
});
/* this doesn't work unless you have a modified ViewTempate */
config.shadowTiddlers["MptwCollapsePluginStyles"] = ""
+".collapsed .uncollapsedView { display:none; }"
+".collapsedView { display:none; }"
+".collapsed .collapsedView { display:block; }"
+".tiddler.collapsed { padding-bottom:1em; }"
+".tiddler.collapsed .title { font-size:100%; }"
;
store.addNotification("MptwCollapsePluginStyles",refreshStyles);
})(jQuery);
//}}}
/***
|Name:|MptwConfigPlugin|
|Description:|Miscellaneous tweaks used by MPTW|
|Version:|1.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
***/
//{{{
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;
config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit
readOnly = false; // needed because the above doesn't work any more post 2.1 (??)
showBackstage = true; // show backstage for same reason
config.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist
config.views.editor.defaultText = ""; // don't need message when creating a new tiddler
config.options.chkSaveBackups = true; // do save backups
config.options.txtBackupFolder = 'twbackup'; // put backups in a backups folder
config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file
config.mptwVersion = "2.5.3";
config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};
if (config.options.txtTheme == '')
config.options.txtTheme = 'MptwTheme';
// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";
// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see \[\[AdvancedOptions\]\])/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");
// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';
//}}}
Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
|Name|MptwRounded|
|Description|Mptw Theme with some rounded corners (Firefox only)|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|PageTemplate|MptwTheme##PageTemplate|
|StyleSheet|##StyleSheet|
!StyleSheet
/*{{{*/
[[MptwTheme##StyleSheet]]
.tiddler,
.sliderPanel,
.button,
.tiddlyLink,
.tabContents
{ -moz-border-radius: 1em; }
.tab {
-moz-border-radius-topleft: 0.5em;
-moz-border-radius-topright: 0.5em;
}
#topMenu {
-moz-border-radius-bottomleft: 2em;
-moz-border-radius-bottomright: 2em;
}
/*}}}*/
Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
Trebuchet MS|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|
http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)
!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
!ViewTemplate
<!--{{{-->
<div class="uncollapsedView">
[[MptwTheme##ViewTemplateToolbar]]
<div class="tagglyTagged" macro="tags"></div>
<div class='titleContainer'>
<span class='title' macro='view title'></span>
<span macro="miniTag"></span>
</div>
<div class='subtitle'>
(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
by <span macro='view modifier link'></span>)
<!--
(<span macro='message views.wikified.createdPrompt'></span>
<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
-->
</div>
<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
<div class='viewer' macro='view text wikified'></div>
</div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
</div>
<div class="collapsedView">
<span class='toolbar'>
<span macro='toolbar closeTiddler'></span>
<span macro='mptwCollapse +'></span>
</span>
<span class='title' macro='view title'></span>
</div>
<!--}}}-->
!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>
<span macro="showWhenTagged systemConfig">
<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
</span>
<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
<span style="padding:1em;"></span>
<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
<!--span macro='mptwCollapse -'></span-->
</div>
<!--}}}-->
!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<!--}}}-->
!StyleSheet
/*{{{*/
/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
background: [[ColorPalette::TertiaryLight]];
}
/* sexy colours and font for the header */
.headerForeground {
color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
color: [[ColorPalette::PrimaryMid]];
}
/* separate the top menu parts */
.headerForeground, .headerShadow {
padding: 1em 1em 0;
}
.headerForeground, .headerShadow {
font-family: 'Trebuchet MS', sans-serif;
font-weight:bold;
}
.headerForeground .siteSubtitle {
color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
color: [[ColorPalette::PrimaryMid]];
}
/* make shadow go and down right instead of up and left */
.headerShadow {
left: 1px;
top: 1px;
}
/* prefer monospace for editing */
.editor textarea, .editor input {
font-family: 'Trebuchet MS', monospace;
background-color:[[ColorPalette::TertiaryPale]];
}
/* sexy tiddler titles */
.title {
font-size: 200%;
color: [[ColorPalette::PrimaryLight]];
font-family: 'Trebuchet MS', sans-serif;
}
/* more subtle tiddler subtitle */
.subtitle {
padding:0px;
margin:0px;
padding-left:1em;
font-size: 90%;
color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
color: [[ColorPalette::TertiaryMid]];
}
/* a little bit of extra whitespace */
.viewer {
padding-bottom:3px;
}
/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
background-color: transparent;
color: [[ColorPalette::Foreground]];
}
/* give tiddlers 3d style border and explicit background */
.tiddler {
font-size: 110%;
font-family: 'Trebuchet MS', sans-serif;
background: [[ColorPalette::Background]];
border-right: 2px [[ColorPalette::TertiaryMid]] solid;
border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
margin-bottom: 1em;
padding:1em 2em 2em 1.5em;
}
/* make options slider look nicer */
#sidebarOptions .sliderPanel {
border:solid 1px [[ColorPalette::PrimaryLight]];
}
/* the borders look wrong with the body background */
#sidebar .button {
border-style: none;
}
/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
display:inline;
}
/* horizontal main menu stuff */
#displayArea {
margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
display: none;
}
#topMenu {
background: [[ColorPalette::PrimaryMid]];
color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
margin-left: 0.5em;
margin-right: 0.5em;
padding-left: 3px;
padding-right: 3px;
color: [[ColorPalette::PrimaryPale]];
font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
background: [[ColorPalette::PrimaryDark]];
}
/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
visibility:hidden;
}
.selected .toolbar {
visibility:visible;
}
/* experimental. this is a little borked in IE7 with the button
* borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }
/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
display:inline;
}
/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
padding:0.5em;
display:block;
}
#sidebarOptions .sliderPanel .select br {
display:none;
}
/* make it print a little cleaner */
@media print {
#topMenu {
display: none ! important;
}
/* not sure if we need all the importants */
.tiddler {
border-style: none ! important;
margin:0px ! important;
padding:0px ! important;
padding-bottom:2em ! important;
}
.tagglyTagging .button, .tagglyTagging .hidebutton {
display: none ! important;
}
.headerShadow {
visibility: hidden ! important;
}
.tagglyTagged .quickopentag, .tagged .quickopentag {
border-style: none ! important;
}
.quickopentag a.button, .miniTag {
display: none ! important;
}
}
/* get user styles specified in StyleSheet */
[[StyleSheet]]
/*}}}*/
|Name|MptwTrim|
|Description|Mptw Theme with a reduced header to increase useful space|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|StyleSheet|MptwTheme##StyleSheet|
|PageTemplate|##PageTemplate|
!PageTemplate
<!--{{{-->
<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
</div>
<div id='sidebar'>
<div id='sidebarOptions'>
<div refresh='content' tiddler='SideBarOptions'></div>
<div style="margin-left:0.1em;"
macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
</div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
/***
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
***/
//{{{
// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';
// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';
// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';
// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;
//}}}
Castelnuovo, G., Gaggioli, A., Mantovani, F., & Riva, G. (2003). New and old tools in psychotherapy: The use of technology for the integration of the traditional clinical treatments. //Psychotherapy: Theory, Research, Practice, Training//, 40(1), 33-44. doi:10.1037/0033-3204.40.1-2.33
''<<sbk "FULL TEXT" 20111105152426>>''
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
newHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
},
newJournalHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
}
});
//}}}
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{
// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;
String.prototype.getNextFreeName = function() {
numberRegExp = / \(([0-9]+)\)$/;
var match = numberRegExp.exec(this);
if (match) {
var num = parseInt(match[1]) + 1;
return this.replace(numberRegExp," ("+num+")");
}
else {
return this + " (1)";
}
}
config.macros.newTiddler.checkForUnsaved = function(newName) {
var r = false;
story.forEachTiddler(function(title,element) {
if (title == newName)
r = true;
});
return r;
}
config.macros.newTiddler.getName = function(newName) {
while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
newName = newName.getNextFreeName();
return newName;
}
config.macros.newTiddler.onClickNewTiddler = function()
{
var title = this.getAttribute("newTitle");
if(this.getAttribute("isJournal") == "true") {
title = new Date().formatString(title.trim());
}
// ---- these three lines should be the only difference between this and the core onClickNewTiddler
if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
title = config.macros.newTiddler.getName(title);
var params = this.getAttribute("params");
var tags = params ? params.split("|") : [];
var focus = this.getAttribute("newFocus");
var template = this.getAttribute("newTemplate");
var customFields = this.getAttribute("customFields");
if(!customFields && !store.isShadowTiddler(title))
customFields = String.encodeHashMap(config.defaultCustomFields);
story.displayTiddler(null,title,template,false,null,null);
var tiddlerElem = story.getTiddler(title);
if(customFields)
story.addCustomFields(tiddlerElem,customFields);
var text = this.getAttribute("newText");
if(typeof text == "string")
story.getTiddlerField(title,"text").value = text.format([title]);
for(var t=0;t<tags.length;t++)
story.setTiddlerTag(title,tags[t],+1);
story.focusTiddler(title,focus);
return false;
};
//}}}
Michiels, I. (2010). Your online presence in 2010. Retrieved from http://www.slideshare.net/Percussion/driving-business-results-with-your-online-presence-web-strategy-wcm
<<sbk ''FULL TEXT'' 20111211093354>>
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
Fox, S. (2011, February 28). Peer-to-Peer Health Care. Retrieved from http://pewresearch.org/pubs/1908/online-health-information-peer-to-peer-patients-caregivers-chronic-conditions
''<<sbk "FULL TEXT" 20111105162233>>''
Broad Vision. (2004). Using Proven Personalization Techniques to Drive Measurable and Profitable Online Behavior.
''<<sbk "FULL TEXT" 20111205150404>>''
// //''Name:'' Popnote Plugin
// //''Author:'' Tiago Dionízio
// //''Modified:''Steve Schneider
// //''Source:'' http://mega.ist.utl.pt/~tngd/twiki/twiki.cgi/TWPlugins.html
// //''Syntax:''
// //{{{<<popnote 'Text to display' 'Tiddler name' [open]>>}}}
// //''Description:''
// // Create a direct link to a tiddler using a normal button and a button that expands the specified tiddler inside the current tiddler.
// // To display the included tiddler initially visible just pass ''open'' in the third parameter (not actually the only possible value but you can interpret it like that).
// // The expand button can also collapse the included tiddler, this will actually remove the included contents. If the included tiddler is changed you can simply expand it again.
// //''Modifications:''
// //
// //Name changed from Quote to Popnote
// //''Code section:''
// (you should not need to alter anything below here)//
{{{
version.extensions.popnote = { major: 1, minor: 0, revision: 0, date: new Date(2005, 07, 15)};
config.macros.popnote = {};
config.macros.popnote.onClick = function(e) {
if (!e) var e = window.event;
var container = this.nextSibling;
var isOpen = container.style.display == "block";
var tick;
this.removeChild(this.firstChild);
if (isOpen) {
container.style.display = "none";
tick = "+";
removeChildren(container);
}
else {
tick = "-";
var title = container.getAttribute("tiddlyLink");
var text = store.getTiddlerText(title);
removeChildren(container);
if(text)
wikify(text,container,null,null);
container.style.display = "block";
}
this.appendChild(document.createTextNode(tick));
}
config.macros.popnote.handler = function(place,macroName,params) {
// param 0: text button
// param 1: tiddler name to display
// param 2: initial display by default
var label = params[0];
var title = params[1];
var isOpen = params[2] != null;
var link = createTiddlyLink(place,title,false);
link.appendChild(document.createTextNode(label));
var btn = createTiddlyButton(place, isOpen ? "-" : "+", "expand tiddler " + title, this.onClick);
var container = createTiddlyElement(place, "blockquote");
container.setAttribute("tiddlyLink", title);
container.style.display = isOpen ? "block" : "none";
if (isOpen) {
var text = store.getTiddlerText(title);
if(text)
wikify(text,container,null,null);
}
}
}}}
Report is available [[here | https://docs.google.com/a/sunyit.edu/open?id=0B-M0EsGsFGVDYjljMDZmMzYtNjYyMy00ZWNkLWI4NzMtZmViNTczYzM2ZDI4]]
[[Link to Archived File|https://docs.google.com/a/sunyit.edu/leaf?id=0B-M0EsGsFGVDYjljMDZmMzYtNjYyMy00ZWNkLWI4NzMtZmViNTczYzM2ZDI4&hl=en_US]]
Summary of changes made to PR2:
*Content added to the [[implications|5.0 Implications]] section.
*Extensive rework on resource linking structure, including transition from hard links to the use of scrapbooked items as well as the incorporation of popnotes for any inline references.
* Development of an additional navigation track <<tag Audiences>> Note that this also addressed the large amount of content in [[4D Adoption of Mobile Computing]] tiddler.
* Addition of more tags and hypertexting
[[Link to Archived File|https://docs.google.com/a/sunyit.edu/open?id=0B-M0EsGsFGVDN2U3NTJiZmUtNWRmNC00NjI0LTk0YzktN2U2OWI5MmRhOGZm]]
Summary of changes made to Preliminary Report 3:
* Action section developed
* Audience tagging added to relevant sections (played with a few different ways to tag but settled on creating many smaller tiddlers rather than having all audience tagging within in each topic tiddler. This should make getting to granular information about audiences move more quickly thought it has resulted in many more tiddlers
* Professionals : APA : Public category developed and integrated
* Introductory text added to a few topics
* Reference list updated
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
var diff = (((new Date()).getTime() - this.getTime()) / 1000);
var day_diff = Math.floor(diff / 86400);
if (isNaN(day_diff)) return "";
else if (diff < 0) return "in the future";
else if (diff < 60) return "just now";
else if (diff < 120) return "1 minute ago";
else if (diff < 3600) return Math.floor(diff/60) + " minutes ago";
else if (diff < 7200) return "1 hour ago";
else if (diff < 86400) return Math.floor(diff/3600) + " hours ago";
else if (day_diff == 1) return "Yesterday";
else if (day_diff < 7) return day_diff + " days ago";
else if (day_diff < 14) return "a week ago";
else if (day_diff < 31) return Math.ceil(day_diff/7) + " weeks ago";
else if (day_diff < 62) return "a month ago";
else if (day_diff < 365) return "about " + Math.ceil(day_diff/31) + " months ago";
else if (day_diff < 730) return "a year ago";
else return Math.ceil(day_diff/365) + " years ago";
}
Date.prototype.formatString_orig_mptw = Date.prototype.formatString;
Date.prototype.formatString = function(template) {
return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}
// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)';
config.mptwDateFormat = 'pppp';
//}}}
Content here relates to interactions between psychological professionals.
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional''
''For the Practice''
Cloud computing offers both financial and collaborative benefits to psychological professionals. Through scalable solutions, cloud computing enables technology solutions that could otherwise be cost-prohibitive for small or individual practices. For example, the [[Google Apps|http://www.google.com/apps/intl/en/business/index.html]] could meet the needs of these often-small practices easily. Many of the recommendations that we make throughout this report involve websites, either the APA site, a site which represents several practices, or a site for an individual practice. Google Apps allows for relatively easy creation of a website. The additional services of file storage and content creation tools such as documents, spreadsheets, and presentations (Google Docs), calendars (Google Calendar), as well as Email and chat, voice, and video conferencing (Gmail) add up to a fairly complete solution. Additionally, the price is reasonable. As of the publication of this report, Google is offering the small business solution for [[$5/month for each person on the account|http://www.google.com/apps/intl/en/business/smbs.html]] Consider this cost against the costs to purchase individual licenses for each of these technologies as well as the IT support needed to get them running and sustained.
''For Professional Collaboration''
Using a cloud computing solution also facilitates online collaboration, another topic we visit frequently throughout this report. Consider that when using Google Docs, two or more people can be online and working together on the same document making changes live. The ability to use Gmail to communicate in a variety of manners (e.g., email, chat, video conferencing, audio conferencing), further enables collaborative efforts between professionals.
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional''
[[Cloud Computing|1E Overview of Cloud Computing]] options are beginning to flow out of the realm of IT professionals "in the know" and into mainstream. For example, current iPads, iPods, and iPhones offer iCloud software that makes use of the technology. As such, professionals will find themselves facing radical changes (and opportunities) in how they obtain, store, and use technology. The<<popnote " IBM Tech Trends Report" IBMTechTrendsReports>> discussed the results of a survey which spanned 93 counties. (See the [[Adoption section|4E Adoption of Cloud Computing]] for details). This means that professionals wishing to collaborate with international counterparts are likely to encounter cloud computing options -- this is not just an American trend. As such, professionals need to be prepared to work this way.
Moving away from a model that is personal-hardware-centralized, has implications for the type of computers professionals will use. For example, in a model where virtually all data is stored on servers hosted by third-party vendors, the storage space on the computing devices used in the practice will minimize.
Additionally, there arises a question of who owns or controls the information created/stored in the cloud. While we discussed the risks of local storage in the [[Ethics section|3E Ethics of Cloud Computing]], there exists a certain sense of ownership (and responsibility) when you have all of //your stuff// on //your computer//. Moving information does put that data under someone else's control. While security measures are part of all cloud computing solutions, the fact remains that a level of control has been removed. In matters of healthcare, this can create an uneasy feeling for patients who do not know where their information is going and who can look at it. Psychological issues can be matters of even greater concern. As such, moving sensitive psychological information from paper to pixels, from the PC to the cloud, needs to be seriously considered and possibly discussed with patients so they understand where their information is.
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional''
In order to leverage the collaborative opportunities, professionals can being to initiate this collaboration on a small scale in order to help them learn how to use the technology effectively before embarking on larger projects where inadequate knowledge might compromise results. Such limited engagements include consults or paper reviews with remote colleagues (especially those with whom one might wish to work with more intensely in the future).
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional.''
These demographics roughly match up with psychological professionals. As such, solutions aimed at the Professional : Professional and APA : Professional relationships would have an increased likelihood of success due to pre-existing technology adoption
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional.''
From a professional-to-professional viewpoint, these technologies offer improved opportunities for collaboration on studies, experiments, and cases. Being able to work together with previously un-reachable professionals opens the door to research and discovery previously unavailable due to the limitations of location. For example, laptops, smartphones, and tables such as the iPad or Samsung Galaxy enable professionals to collaborate anywhere they can get online, often using wireless services to do so (either through a plan they have purchased or taking advantage of the numerous locations which offer free wifi). This means professionals are still able to work together and keep up with their own projects when they are out of the office. This is ideal for those who travel frequently but need to maintain productivity while doing so.
Additionally, the improvements wireless services with connection speeds that are constantly getting faster means that viewing relevant videos is more effective, hence using video as a tool for collaborating on projects is a viable option regardless of the type of connection (plugged in or wifi) being used.
<html><img src="http://farm7.static.flickr.com/6052/6283377266_1689b1cfe3_t.jpg" width="100" height="57" alt="PP"></a></html>
''Professional : Professional''
On the professional level, personalization techniques can foster professional development by offering suggestions on relevant research, experiments, or therapeutic techniques which match up with the user's profile and activity. As such, this may change some methods of how professionals educate themselves on developments in the industry as well as seeking out assistance from similar colleagues.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public.''
Social software could be applied to specific cases of social anxiety or agoraphobia, allowing patients to practice engagement within the safety of their homes.
Content here relates to interactions between psychological professionals and the public, including both the general public as well as specific patient relationships.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public''
Remote therapy might not be right for all patients and situations. Therefore, professionals should make sure to evaluate implementation on a case-by-case basis, considering the nature of the issue, the reason that such therapy might be valuable and why it might be detrimental, and the patient's technological savvy. In the right situations, professionals can begin to implement slowly, starting with this practice as an enhancement to traditional therapy. From here, in the right cases, it can evolve into the sole method of therapy and any appropriate combination of traditional and e-therapy that best serves the patient's interests.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public'' relationships could employ mobile computing solutions, however the professionals would be wise to consider their particular patient sets to determine how the demographics match up with the current and rapidly emerging adopters.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public.''
From a professional-to-patient viewpoint, there are opportunities for more effective remote therapy (aka, “e-therapy,” <<popnote “Interapy” Interapy>>). While remote therapy is not new, increased access to mobile collaboration tools enable more people to access therapy when it is otherwise impossible due to such factors as location or physical limitation. Further, the improved technology allows for an experience that can approach face-to-face therapy via video chats. Compare this to other methods of therapy in which the therapist cannot see the patient (e.g., telephone, mail, email, etc.) and the dangers of missing important visual/non-verbal clues (<<popnote “Lange” Interapy>>, 2003).
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public''
We do think that offices should begin offering web sites with personalized pages for patients. Here, patient consent is needed and it more likely to be given considering the site's association with their known therapist. Development and maintenance of such a site can be costly, so we recommend that offices consider pooling resources. By working together, one site may cover several therapists (who may or may not have any official affiliation). Here the home page could direct patient's to their therapist's landing page which could offer a personal note from the therapist and any updates. There, patients may log in to get to their pages. In order to make this work effectively, some information will need to be moved to electronic versions which can be loaded into the system at regular intervals.
See [[Action & Response Plans for Cloud Computing|6E Action & Response Plans for Cloud Computing]] for more information regarding websites and digitization.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public.''
As the nature of psychological treatment is intended to be totally personalized, implications for the profession center on experiences and opportunities peripheral to the counseling experience. Here professionals would be well-served by anticipating an expectation of seamless, personalized online interactions, including sites which patients interact with to make payments, schedule/check appointments, and/or e-therapy opportunities.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public''
To better understand social computing and the opportunities it presents, professionals can involve themselves in online group therapy/discussion groups by serving as moderators for groups and/or starting groups they feel would be of value to their patients or one focused on their specialization. The former would be seeking out such sites and getting involved, a logical first step, while the latter would best fit those who already have a level of familiarity with such sites and possess the tech savvy to set one up.
Additionally, working together, professionals can help build out areas on the APA site which recommend high-quality online discussion groups, group therapy, or other social computing sites relevant to their field. They could also facilitate setting up a system where patients can offer feedback on professionals so as to help each other find the right person for their needs, possibly by encouraging their own patient to participate.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professional : Public''
While smart pens [[discussed here|2A Practical Applications for Ubiquitous Computing]] are a means to enhance the professional's ability to take notes during a session and effectively organize and reference them afterward, this technique really only touches the patient in terms of increased focus during a session (i.e., the psychologist can spend more time listening than making notes). However, smart bottles are a technology that professionals should investigate in order to ensure that any medication associated with treatment is taken regularly and therefore optimized to have the maximum impact the dosage is intended to give. These smart bottles could well be only the first signs of integrated technology and continuous scanning of the marketplace for other options to help increase the effectiveness of treatment should be considered.
Content here relates to interactions between the Association and both professionals and the public.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professionals : APA : Public''
Cloud computing also has implications for areas which may not have ready or reliable access to the internet. Consider the findings of <<popnote "Department of Commerce's National Telecommunications and Information Administration" 30Percent>>: 30% of Americans do not use the internet or are using slow connections which impede activity (Laser, n.d.). Widespread movement to cloud computing solutions would mean professionals who fall into this category would be essentially cut out of the information network and/or are not able to offer the solutions other practices are benefiting from. So, while cloud computing solutions offer many opportunities, it cannot be assumed that all professionals //can// take advantage of these solutions. Therefore, cloud solutions which are implemented to affect the entire community (either the professional community or the public) cut out this group. We see the greatest risk being those solutions sponsored by the APA due it the reach the association has.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professional : APA : Public''
We see several options for the APA to leverage the opportunities cloud computing offers. First and foremost, we see the organization being able to use online hosting to offer a library of resources online, benefiting both their professionals as well as the public. Cloud computing can enable data collected through various experiments to become more readily available to other researchers, thus fostering collaboration on research and experiments beyond the immediate team doing the work. This is how knowledge is built and progress is made in the field. Cloud computing can be a significant accelerant to that end.
Cloud computing applications can also enhance many of the other emerging technologies and opportunities discussed in this report. For example, cloud computing can further enhance the benefits of mobile collaboration, eliminating the need to be at one’s main computer to access relevant documents, software, email, etc. See the [[Practical Applications section|2D Practical Applications for Mobile Computing]] for more in that regard.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professionals : APA : Public''
We discussed [[personalization options for the APA website|2B Practical Applications for Personalization]], a way in which the site can reconfigured for each user, be it a professional or member of the public. To achieve this, the APA would likely employ the assistance of programmers who can update the site accordingly. In consideration of the [[ethical issues at play|3B Ethics of Personalization]], it would be prudent to start with limited personalization features, avoiding offering content about searched-out illnesses and focusing more on information that is freely provided by the users and therefore more likely to be "safe" to act upon.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professionals : APA : Public''
The APA already has a robust website, offering information under such categories as, “Psychology Topics,” “Publications,” “Psychology Help Center,” “Research,” “Education,” etc. By adding some personalization technology to the site, users can be offered additional content based on their activity. For example, users browsing the Publications section, users might be pointed to material related to their activity (or the activity of similar users). Searching within the education section might generate content suggesting certain programs which might be of interest. Additionally, the site could be configured to default to the page a user spends the most his/her time.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professionals : APA : Public''
In the immediate future, the APA can enlist the help of members to research existing sites which provide psychology-related social computing opportunities. This research will increase the organizational knowledge around social computing and allow the association to leverage the work of others by linking to it. It also gives members time to develop their own sites which can then be linked from the APA site.
* Recommend sites sponsored by other groups. These are sites the association has investigated and has determined meet the standards the APA upholds. These sites could be linked to from the APA's website as well as having some APA-recommendation on the site for those who reach it directly (this would also show up in searches).
* Provide psychological professionals with blueprints for setting up a site that would meet their standards, listing best practices as well as examples of sites which meet the standards.
* Encourage professionals to participate in monitoring and/or facilitating discussions on sites to further enhance the level of professionalism being offered as well as extending their own experience and comfort level with social computing and psychology.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professional : APA : Public''
There are two primary areas of particular relevance to the APA: therapist rating and feedback areas as well as virtual group therapy.
Given the importance of finding a therapist with whom a patient clicks is imperative to creating the open, trusting relationship needed for effective therapy. Therefore, it behooves the APA to offer as many tools as they can to help patients find the right match. Currently, there is a psychologist finder page on the site which could be developed to include patient ratings, feedback, and discussion so as to help each other better understand the psychologists. While there are several sites which offer similar opportunities, the APA is an intuitive and credible location for people to visit looking for this kind of information.
<html><img src="http://farm7.staticflickr.com/6233/6282860745_60f04d4ac5_t.jpg" width="100" height="42" alt="PPA"></a></html>
''Professionals : APA : Public''
As discussed in the [[Practical Applications section|2A Practical Applications for Ubiquitous Computing]], we see opportunities in smart pill bottles. The APA can lead implementation by providing information on the following:
* Real-world case studies of application in psychological settings. By gathering input from professionals who may have already used these bottle with patients, the association can open a dialogue among professionals about the effectiveness and/or risks they have experienced
* The costs associated with these bottles, including the reimbursement options offered through traditional health insurance as well as through the health savings plans which are being increasingly adopted in the United States. This is significant information that patients will want to know in order to make a well-informed decision.
<html><img src="http://farm7.static.flickr.com/6239/6282857919_cea2290870_t.jpg" width="100" height="59" alt="ProPub"></a></html>
''Professionals : Public''
There are also opportunities for personalization options at the office level. Here, more specific data can be gleaned from patient-provided information to create a password-accessible page which is configured specifically for that patient. Here, content could include appointment and medication refill reminders, best practices and techniques for coping with that person's specific conditions, as well as additional readings, links, and helpful information. This content could change as treatment progresses based on therapist notes and/or additional input via questionnaires from the patient. The value of such a site would be the ability to communicate with the patient outside of a session, including patients who have discontinued therapy but would still benefit from some of the features. It also allows for a continued relationship outside of the therapy session; the benefit here is that it could minimize any perceived barriers to making an appointment should his or her needs change.
Content here relates to interactions between non-professionals.
<html><img src="http://farm7.static.flickr.com/6097/6282858737_9084eed20b_t.jpg" width="100" height="57" alt="PubPub"></a></html>
''Public : Public'' solutions would need to take the lower-level of adoptions from rural adoption into consideration (note how this impacts solutions which employ methods of virtual or eTherapy designed to reach such groups).
<html><img src="http://farm7.static.flickr.com/6097/6282858737_9084eed20b_t.jpg" width="100" height="57" alt="PubPub"></a></html>
''Public : Public.''
Social computing enables individuals to leverage the experiences of others to help themselves. As such, other opportunities for social software include group therapy. This can take several forms, from synchronous sessions which mimic traditional therapy to online communities which offer help and support via discussion boards, blogs, commenting features, linking, videos, etc. Again, while several such sites have sprung up around the web, sites created under the APA umbrella would benefit from the reputation of the organization as well as possible moderation by psychology professionals who can intercede and post relevant articles and recommendations to the group.
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {
dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?
createTagButton: function(place,tag,excludeTiddler) {
// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
var splitTag = tag.split("|");
var pretty = tag;
if (splitTag.length == 2) {
tag = splitTag[1];
pretty = splitTag[0];
}
var sp = createTiddlyElement(place,"span",null,"quickopentag");
createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tag]),onClickTag);
theTag.setAttribute("tag",tag);
if (excludeTiddler)
theTag.setAttribute("tiddler",excludeTiddler);
return(theTag);
},
miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tagged = store.getTaggedTiddlers(tiddler.title);
if (tagged.length > 0) {
var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
theTag.setAttribute("tag",tiddler.title);
theTag.className = "miniTag";
}
},
allTagsHandler: function(place,macroName,params) {
var tags = store.getTags(params[0]);
var filter = params[1]; // new feature
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
for(var t=0; t<tags.length; t++) {
var title = tags[t][0];
if (!filter || (title.match(new RegExp('^'+filter)))) {
var info = getTiddlyLinkInfo(title);
var theListItem =createTiddlyElement(ul,"li");
var theLink = createTiddlyLink(theListItem,tags[t][0],true);
var theCount = " (" + tags[t][1] + ")";
theLink.appendChild(document.createTextNode(theCount));
var theDropDownBtn = createTiddlyButton(theListItem," " +
config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
theDropDownBtn.setAttribute("tag",tags[t][0]);
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
""].join("\n"),
init: function() {
// we fully replace these builtins. can't hijack them easily
window.createTagButton = this.createTagButton;
config.macros.allTags.handler = this.allTagsHandler;
config.macros.miniTag = { handler: this.miniTagHandler };
config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
store.addNotification("QuickOpenTagStyles",refreshStyles);
}
}
config.quickOpenTag.init();
//}}}
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {
prompts: {
rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
remove: "Remove the tag '%0' from %1 tidder%2?"
},
removeTag: function(tag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,tag);
}
store.resumeNotifications();
store.notifyAll();
},
renameTag: function(oldTag,newTag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new
}
store.resumeNotifications();
store.notifyAll();
},
storeMethods: {
saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,
saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator) {
if (title != newTitle) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0) {
// then we are renaming a tag
if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
config.renameTags.renameTag(title,newTitle,tagged);
if (!this.tiddlerExists(title) && newBody == "")
// dont create unwanted tiddler
return null;
}
}
return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator);
},
removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,
removeTiddler: function(title) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0)
if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
config.renameTags.removeTag(title,tagged);
return this.removeTiddler_orig_renameTags(title);
}
},
init: function() {
merge(TiddlyWiki.prototype,this.storeMethods);
}
}
config.renameTags.init();
//}}}
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these add them to the commands in ToolbarCommands under EditToolbar,
or in the MptwTheme tiddler under EditTemplate.
***/
//{{{
merge(config.commands,{
saveCloseTiddler: {
text: 'done/close',
tooltip: 'Save changes to this tiddler and close it',
handler: function(ev,src,title) {
var closeTitle = title;
var newTitle = story.saveTiddler(title,ev.shiftKey);
if (newTitle)
closeTitle = newTitle;
return config.commands.closeTiddler.handler(ev,src,closeTitle);
}
},
cancelCloseTiddler: {
text: 'cancel/close',
tooltip: 'Undo changes to this tiddler and close it',
handler: function(ev,src,title) {
// the same as closeTiddler now actually
return config.commands.closeTiddler.handler(ev,src,title);
}
}
});
//}}}
/***
|Name|SaveTiddlerToFilePlugin|
|Source|http://www.TiddlyTools.com/#SaveTiddlerToFilePlugin|
|Documentation|http://www.TiddlyTools.com/#SaveTiddlerToFilePlugin|
|Version|1.1.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|toolbar command to save tiddler source definition to an external text file|
!!!!!Usage/Example
<<<
Embedded as a macro in tiddler content:
{{{
<<saveTiddlerToFile label:text prompt:text filename:text path:text>>
}}}
or, as a tiddler toolbar command in [[ViewTemplate]]:
{{{
<span class='toolbar' macro='toolbar saveTiddlerToFile'></span>
}}}
where:
* ''label'' //(optional)//<br>specifies the text to display for the command
* ''prompt'' //(optional)//<br>specifies the mouseover 'tooltip' text for the command
* ''filename'' //(optional)//<br>specifies the default filename to create. You can use "*" within the filename as a 'substitution marker' that will be automatically replaced with the current tiddler's title. If ''file'' is omitted, a system-specific 'ask for filename' dialog box will be displayed, using 'tiddlername.tid' as the suggested default filename. //Note: if the tiddler is a plugin (tagged with <<tag systemConfig>>), then the suggested filename will use ".js" instead of ".tid"//
* ''path'' //(optional)//<br>specifies the default folder in which to create the output file. If the path begins with "./" (or ".\" for Windows) it is treated as a relative path, and the path containing the current document will be prepended to create a full path reference. Otherwise, the specified path must be a full path reference. You can use "*" within the path as a 'substitution marker' that will be automatically replaced with the current tiddler's title. If ''path'' is omitted, the path containing the current document will be used by default.
Examples:
>{{{<<saveTiddlerToFile>>}}}<br>Try it: <<saveTiddlerToFile>>
>{{{<<saveTiddlerToFile label:"save 'txt' file to current folder..." filename:*.txt>>}}}<br>Try it: <<saveTiddlerToFile label:"save 'txt' file to current folder..." filename:*.txt>>
>{{{<<saveTiddlerToFile label:"save 'txt' file to archive..." filename:*.txt path:./archive>>}}}<br>Try it: <<saveTiddlerToFile label:"save 'txt' file to archive..." filename:*.txt path:./archive>>
<<<
!!!!!Configuration
<<<
When {{{<span class='toolbar' macro='toolbar saveTiddlerToFile'></span>}}} is used to create a tiddler toolbar command, the default values for all parameters are applied (e.g., you will be prompted to select/enter a filename with a ".tid" or ".js" extension). You can override these defaults by writing the following into a tiddler tagged with <<tag systemConfig>>:
{{{
config.commands.saveTiddlerToFile.filename="...";
config.commands.saveTiddlerToFile.path="...";
}}}
<<<
!!!!!Revisions
<<<
2011.02.14 1.1.1 fix OSX error: use picker.file.path
2008.04.22 1.1.0 converted from inline script to tiddler toolbar command
2007.06.26 1.0.0 initial release as inline script
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveTiddlerToFilePlugin= {major: 1, minor: 1, revision: 1, date: new Date(2011,2,14)};
config.macros.saveTiddlerToFile = {
label: "save this tiddler to a file",
prompt: "save this tiddler's SOURCE text to a local file",
askmsg: "select an output filename for this tiddler",
okmsg: "Tiddler source written to %0",
failmsg: "An error occurred while creating %0",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
params = paramString.parseParams("anon",null,true,false,false);
var label=getParam(params,"label",this.label);
var prompt=getParam(params,"prompt",this.prompt);
var filename=getParam(params,"filename","");
var path=getParam(params,"path","");
var btn=createTiddlyButton(place,label,prompt,
function(event){config.macros.saveTiddlerToFile.go(this,event)});
btn.setAttribute("filename",filename);
btn.setAttribute("path",path);
},
go: function(src,event) {
var cms=config.macros.saveTiddlerToFile; // abbreviation
var here=story.findContainingTiddler(src); if (!here) return;
var tid=here.getAttribute('tiddler');
var filename=src.getAttribute("filename")||"";
filename=filename.replace(/\*/g,tid);
var path=src.getAttribute("path")||"";
path=path.replace(/\*/g,tid);
if (!path.length||path.substr(0,2)=="./"||path.substr(0,2)==".\\") {
var curr=getLocalPath(document.location.href);
var slashpos=curr.lastIndexOf("/"); if (slashpos==-1) slashpos=curr.lastIndexOf("\\");
if (slashpos!=-1) curr=curr.substr(0,slashpos+1); // remove filename, leave trailing slash
var trailingslash=curr.indexOf("\\")!=-1?"\\":"/"; // fixup for missing trailing slash
if (path.length && path.substr(path.length,1)!=trailingslash) path+=trailingslash;
path=!path.length?curr:curr+path.substr(2); // convert relative path to absolute path
}
var deffn=tid+(store.getTiddler(tid).isTagged("systemConfig")?".js":".tid");
var target=filename.length?path+filename:cms.askForFilename(cms.askmsg,path,deffn); // ask
if (!target||!target.length) return false; // cancelled by user
var msg=saveFile(target,store.getTiddlerText(tid))?cms.okmsg:cms.failmsg;
clearMessage(); displayMessage(msg.format([target]),"file:///"+target.replace(/\\/g,'/'));
},
askForFilename: function(msg,path,file) {
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='tid';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.path;
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XP/Vista only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|Text files|*.txt;*.tid;*.js|HTML files|*.htm;*.html|';
s.FilterIndex=2; // default to TEXT files;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
}
return result;
}
}
// // toolbar definition
config.commands.saveTiddlerToFile= {
text: "file",
tooltip: config.macros.saveTiddlerToFile.prompt,
filename: "",
path: "",
handler: function(event,src,title) {
var ccs=config.commands.saveTiddlerToFile;
if (ccs.filename.length) src.setAttribute("filename",ccs.filename);
if (ccs.path.length) src.setAttribute("path",ccs.path);
config.macros.saveTiddlerToFile.go(src,event);
return false;
}
};
//}}}
http://people.sunyit.edu/~krieseg/public_html/Scrapbook/data/
/***
|Name|ScrapbookPlugin|
|Created by|[[Steve Schneider|http://webarchivist.org]]|
|Version|1.0||
!!!Description
A TiddlyWikiMacro to easily create a link to a [[Scrapbooked|http://amb.vis.ne.jp/mozilla/scrapbook/]] page.
/***
Example:
Given this text in tiddler ScrapbookLocation - <<tiddler ScrapbookLocation>>
Typing this in a tiddler: {{{<<sbk "Today in History" 20100523110142>>}}}
will generate this link: <<sbk "Today in History" 20100523110142>>
(to see this example work, you need to create ScrapbookLocation, and edit this tiddler, replacing the two timestamps with one of your own)
Directions:
!
# Create tiddler ScrapbookLocation
# Open an entry in a scrapbook in browser, and copy URL into ScrapbookLocation
# remove timestamp and index.url from URL, leaving the slash after "data"
# If you move your scrapbook, or put it on the Web, change ScrapbookLocation accordingly.
!!!Code
***/
//{{{
config.macros.sbk = {};
config.macros.sbk.handler= function(place,macroName,params) {
var key1=params[1];
var key0=params[0];
var key3=wikifyPlain("ScrapbookLocation");
wikify("[["+key0+"|"+key3+key1+"/index.html]]",place)
}
//}}}
/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware.
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{
config.macros.selectTheme = {
label: {
selectTheme:"select theme",
selectPalette:"select palette"
},
prompt: {
selectTheme:"Select the current theme",
selectPalette:"Select the current palette"
},
tags: {
selectTheme:'systemTheme',
selectPalette:'systemPalette'
}
};
config.macros.selectTheme.handler = function(place,macroName)
{
var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
// want to handle palettes and themes with same code. use mode attribute to distinguish
btn.setAttribute('mode',macroName);
};
config.macros.selectTheme.onClick = function(ev)
{
var e = ev ? ev : window.event;
var popup = Popup.create(this);
var mode = this.getAttribute('mode');
var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
// for default
if (mode == "selectPalette") {
var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',"(default)");
btn.setAttribute('mode',mode);
}
for(var i=0; i<tiddlers.length; i++) {
var t = tiddlers[i].title;
var name = store.getTiddlerSlice(t,'Name');
var desc = store.getTiddlerSlice(t,'Description');
var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',t);
btn.setAttribute('mode',mode);
}
Popup.show();
return stopEvent(e);
};
config.macros.selectTheme.onClickTheme = function(ev)
{
var mode = this.getAttribute('mode');
var theme = this.getAttribute('theme');
if (mode == 'selectTheme')
story.switchTheme(theme);
else // selectPalette
config.macros.selectTheme.updatePalette(theme);
return false;
};
config.macros.selectTheme.updatePalette = function(title)
{
if (title != "") {
store.deleteTiddler("ColorPalette");
if (title != "(default)")
store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
config.options.txtUserName,undefined,"");
refreshAll();
if(config.options.chkAutoSave)
saveChanges(true);
}
};
config.macros.applyTheme = {
label: "apply",
prompt: "apply this theme or palette" // i'm lazy
};
config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var useTiddler = params[0] ? params[0] : tiddler.title;
var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',useTiddler);
btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}
config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;
config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};
//}}}
American Psychological Association. (n.d.) What to consider when making the choice. Retrieved from http://www.apa.org/helpcenter/choose-therapist.aspx
''<<sbk "FULL TEXT" 20111105145619>>''
A special report for the American Psychological Association
Emerging Information Technologies
Smith, Eric. (2011, July 11). Smartphone adoption and usage. Retrieved from http://www.pewinternet.org/Reports/2011/Smartphones/Summary.aspx
''<<sbk "FULL TEXT" 20111105163243>>''
Parameswaran, M. & Whinston, A. B. (2007) "Social computing: An overview," //Communications of the Association for Information Systems//: Vol. 19, Article 37.
''<<sbk "FULL TEXT" 20111105161503>>''
I wanted to draw your attention to some the types of changes that have been incorporated since the last review:
* Overall, content has been expanded to provide in depth discussion on each topic and technology
* Hyperlinking has been increased to include links to other sections of the report as would be convenient for the reader as well as links to 3rd party sites being referenced in the copy (e.g., YouTube, Twitter, WebEx, etc.)
* More images have been inserted to demonstrate points
* Citations have been consistently addressed through the use of popnotes
* Due to the many ways one could navigate through the file, the content has been written to encourage certain navigational choices (e.g., See the [[Ethics|3A Ethics of Ubiquitous Computing]] section for further discussion.)
* Changed the font to further customize the site (and figure out how to do it)
* Some pull quotes have been added to draw attention and/or add a bit of visual interest
* I made a decision about the Audiences navigation and tagging structure. When a topic impacts more than one audience with specific notes/recommendations/data, each audience gets its own tiddler. However, if it addresses just one audience, I incorporated that copy into the main tiddler to decrease some extra (and I think unnecessary) clicking around to reach content when following certain paths.
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.2a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
merge(String.prototype,{
parseTagExpr: function(debug) {
if (this.trim() == "")
return "(true)";
var anyLogicOp = /(!|&&|\|\||\(|\))/g;
var singleLogicOp = /^(!|&&|\|\||\(|\))$/;
var spaced = this.
// because square brackets in templates are no good
// this means you can use [(With Spaces)] instead of [[With Spaces]]
replace(/\[\(/g," [[").
replace(/\)\]/g,"]] ").
// space things out so we can use readBracketedList. tricky eh?
replace(anyLogicOp," $1 ");
var expr = "";
var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!
for (var i=0;i<tokens.length;i++)
if (tokens[i].match(singleLogicOp))
expr += tokens[i];
else
expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think
if (debug)
alert(expr);
return '('+expr+')';
}
});
merge(TiddlyWiki.prototype,{
getTiddlersByTagExpr: function(tagExpr,sortField) {
var result = [];
var expr = tagExpr.parseTagExpr();
store.forEachTiddler(function(title,tiddler) {
if (eval(expr))
result.push(tiddler);
});
if(!sortField)
sortField = "title";
result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return result;
}
});
config.taggly = {
// for translations
lingo: {
labels: {
asc: "\u2191", // down arrow
desc: "\u2193", // up arrow
title: "title",
modified: "modified",
created: "created",
show: "+",
hide: "-",
normal: "normal",
group: "group",
commas: "commas",
sitemap: "sitemap",
numCols: "cols\u00b1", // plus minus sign
label: "Tagged as '%0':",
exprLabel: "Matching tag expression '%0':",
excerpts: "excerpts",
descr: "descr",
slices: "slices",
contents: "contents",
sliders: "sliders",
noexcerpts: "title only",
noneFound: "(none)"
},
tooltips: {
title: "Click to sort by title",
modified: "Click to sort by modified date",
created: "Click to sort by created date",
show: "Click to show tagging list",
hide: "Click to hide tagging list",
normal: "Click to show a normal ungrouped list",
group: "Click to show list grouped by tag",
sitemap: "Click to show a sitemap style list",
commas: "Click to show a comma separated list",
numCols: "Click to change number of columns",
excerpts: "Click to show excerpts",
descr: "Click to show the description slice",
slices: "Click to show all slices",
contents: "Click to show entire tiddler contents",
sliders: "Click to show tiddler contents in sliders",
noexcerpts: "Click to show entire title only"
},
tooDeepMessage: "* //sitemap too deep...//"
},
config: {
showTaggingCounts: true,
listOpts: {
// the first one will be the default
sortBy: ["title","modified","created"],
sortOrder: ["asc","desc"],
hideState: ["show","hide"],
listMode: ["normal","group","sitemap","commas"],
numCols: ["1","2","3","4","5","6"],
excerpts: ["noexcerpts","excerpts","descr","slices","contents","sliders"]
},
valuePrefix: "taggly.",
excludeTags: ["excludeLists","excludeTagging"],
excerptSize: 50,
excerptMarker: "/%"+"%/",
siteMapDepthLimit: 25
},
getTagglyOpt: function(title,opt) {
var val = store.getValue(title,this.config.valuePrefix+opt);
return val ? val : this.config.listOpts[opt][0];
},
setTagglyOpt: function(title,opt,value) {
// create it silently if it doesn't exist
if (!store.tiddlerExists(title)) {
store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
// <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
// Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
// Because we don't want to hide real tags, check that they aren't actually tags before doing so
// Also tag them as tagglyExpression for manageability
// (contributed by RA)
if (!store.getTaggedTiddlers(title).length) {
store.setTiddlerTag(title,true,"excludeSearch");
store.setTiddlerTag(title,true,"excludeLists");
store.setTiddlerTag(title,true,"tagglyExpression");
}
}
// if value is default then remove it to save space
return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);
},
getNextValue: function(title,opt) {
var current = this.getTagglyOpt(title,opt);
var pos = this.config.listOpts[opt].indexOf(current);
// supposed to automagically don't let cols cycle up past the number of items
// currently broken in some situations, eg when using an expression
// lets fix it later when we rewrite for jquery
// the columns thing should be jquery table manipulation probably
var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
var newPos = (pos + 1) % limit;
return this.config.listOpts[opt][newPos];
},
toggleTagglyOpt: function(title,opt) {
var newVal = this.getNextValue(title,opt);
this.setTagglyOpt(title,opt,newVal);
},
createListControl: function(place,title,type) {
var lingo = config.taggly.lingo;
var label;
var tooltip;
var onclick;
if ((type == "title" || type == "modified" || type == "created")) {
// "special" controls. a little tricky. derived from sortOrder and sortBy
label = lingo.labels[type];
tooltip = lingo.tooltips[type];
if (this.getTagglyOpt(title,"sortBy") == type) {
label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
onclick = function() {
config.taggly.toggleTagglyOpt(title,"sortOrder");
return false;
}
}
else {
onclick = function() {
config.taggly.setTagglyOpt(title,"sortBy",type);
config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
return false;
}
}
}
else {
// "regular" controls, nice and simple
label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
onclick = function() {
config.taggly.toggleTagglyOpt(title,type);
return false;
}
}
// hide button because commas don't have columns
if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
},
makeColumns: function(orig,numCols) {
var listSize = orig.length;
var colSize = listSize/numCols;
var remainder = listSize % numCols;
var upperColsize = colSize;
var lowerColsize = colSize;
if (colSize != Math.floor(colSize)) {
// it's not an exact fit so..
upperColsize = Math.floor(colSize) + 1;
lowerColsize = Math.floor(colSize);
}
var output = [];
var c = 0;
for (var j=0;j<numCols;j++) {
var singleCol = [];
var thisSize = j < remainder ? upperColsize : lowerColsize;
for (var i=0;i<thisSize;i++)
singleCol.push(orig[c++]);
output.push(singleCol);
}
return output;
},
drawTable: function(place,columns,theClass) {
var newTable = createTiddlyElement(place,"table",null,theClass);
var newTbody = createTiddlyElement(newTable,"tbody");
var newTr = createTiddlyElement(newTbody,"tr");
for (var j=0;j<columns.length;j++) {
var colOutput = "";
for (var i=0;i<columns[j].length;i++)
colOutput += columns[j][i];
var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
wikify(colOutput,newTd);
}
return newTable;
},
createTagglyList: function(place,title,isTagExpr) {
switch(this.getTagglyOpt(title,"listMode")) {
case "group": return this.createTagglyListGrouped(place,title,isTagExpr); break;
case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
}
},
getTaggingCount: function(title,isTagExpr) {
// thanks to Doug Edmunds
if (this.config.showTaggingCounts) {
var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
if (tagCount > 0)
return " ("+tagCount+")";
}
return "";
},
getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
},
getExcerpt: function(inTiddlerTitle,title,indent) {
if (!indent)
indent = 1;
var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
var t = store.getTiddler(title);
if (t && displayMode == "excerpts") {
var text = t.text.replace(/\n/," ");
var marker = text.indexOf(this.config.excerptMarker);
if (marker != -1) {
return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
}
else if (text.length < this.config.excerptSize) {
return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
}
else {
return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
}
}
else if (t && displayMode == "contents") {
return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
}
else if (t && displayMode == "sliders") {
return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
}
else if (t && displayMode == "descr") {
var descr = store.getTiddlerSlice(title,'Description');
return descr ? " {{excerpt{" + descr + "}}}" : "";
}
else if (t && displayMode == "slices") {
var result = "";
var slices = store.calcAllSlices(title);
for (var s in slices)
result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
return result ? "\n{{excerpt excerptIndent{\n" + result + "}}}" : "";
}
return "";
},
notHidden: function(t,inTiddler) {
if (typeof t == "string")
t = store.getTiddler(t);
return (!t || !t.tags.containsAny(this.config.excludeTags) ||
(inTiddler && this.config.excludeTags.contains(inTiddler)));
},
// this is for normal and commas mode
createTagglyListNormal: function(place,title,useCommas,isTagExpr) {
var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);
if (this.getTagglyOpt(title,"sortOrder") == "desc")
list = list.reverse();
var output = [];
var first = true;
for (var i=0;i<list.length;i++) {
if (this.notHidden(list[i],title)) {
var countString = this.getTaggingCount(list[i].title);
var excerpt = this.getExcerpt(title,list[i].title);
if (useCommas)
output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
else
output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");
first = false;
}
}
return this.drawTable(place,
this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
useCommas ? "commas" : "normal");
},
// this is for the "grouped" mode
createTagglyListGrouped: function(place,title,isTagExpr) {
var sortBy = this.getTagglyOpt(title,"sortBy");
var sortOrder = this.getTagglyOpt(title,"sortOrder");
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list = list.reverse();
var leftOvers = []
for (var i=0;i<list.length;i++)
leftOvers.push(list[i].title);
var allTagsHolder = {};
for (var i=0;i<list.length;i++) {
for (var j=0;j<list[i].tags.length;j++) {
if (list[i].tags[j] != title) { // not this tiddler
if (this.notHidden(list[i].tags[j],title)) {
if (!allTagsHolder[list[i].tags[j]])
allTagsHolder[list[i].tags[j]] = "";
if (this.notHidden(list[i],title)) {
allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";
leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
}
}
}
}
}
var allTags = [];
for (var t in allTagsHolder)
allTags.push(t);
var sortHelper = function(a,b) {
if (a == b) return 0;
if (a < b) return -1;
return 1;
};
allTags.sort(function(a,b) {
var tidA = store.getTiddler(a);
var tidB = store.getTiddler(b);
if (sortBy == "title") return sortHelper(a,b);
else if (!tidA && !tidB) return 0;
else if (!tidA) return -1;
else if (!tidB) return +1;
else return sortHelper(tidA[sortBy],tidB[sortBy]);
});
var leftOverOutput = "";
for (var i=0;i<leftOvers.length;i++)
if (this.notHidden(leftOvers[i],title))
leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";
var output = [];
if (sortOrder == "desc")
allTags.reverse();
else if (leftOverOutput != "")
// leftovers first...
output.push(leftOverOutput);
for (var i=0;i<allTags.length;i++)
if (allTagsHolder[allTags[i]] != "")
output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);
if (sortOrder == "desc" && leftOverOutput != "")
// leftovers last...
output.push(leftOverOutput);
return this.drawTable(place,
this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
"grouped");
},
// used to build site map
treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list.reverse();
var indent = "";
for (var j=0;j<depth;j++)
indent += "*"
var childOutput = "";
if (depth > this.config.siteMapDepthLimit)
childOutput += indent + this.lingo.tooDeepMessage + "\n";
else
for (var i=0;i<list.length;i++)
if (list[i].title != title)
if (this.notHidden(list[i].title,this.config.inTiddler))
childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);
if (depth == 0)
return childOutput;
else
return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
},
// this if for the site map mode
createTagglyListSiteMap: function(place,title,isTagExpr) {
this.config.inTiddler = title; // nasty. should pass it in to traverse probably
var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
return this.drawTable(place,
this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
"sitemap"
);
},
macros: {
tagglyTagging: {
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var parsedParams = paramString.parseParams("tag",null,true);
var refreshContainer = createTiddlyElement(place,"div");
// do some refresh magic to make it keep the list fresh - thanks Saq
refreshContainer.setAttribute("refresh","macro");
refreshContainer.setAttribute("macroName",macroName);
var tag = getParam(parsedParams,"tag");
var expr = getParam(parsedParams,"expr");
if (expr) {
refreshContainer.setAttribute("isTagExpr","true");
refreshContainer.setAttribute("title",expr);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("isTagExpr","false");
if (tag) {
refreshContainer.setAttribute("title",tag);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("title",tiddler.title);
refreshContainer.setAttribute("showEmpty","false");
}
}
this.refresh(refreshContainer);
},
refresh: function(place) {
var title = place.getAttribute("title");
var isTagExpr = place.getAttribute("isTagExpr") == "true";
var showEmpty = place.getAttribute("showEmpty") == "true";
jQuery(place).empty()
addClass(place,"tagglyTagging");
var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
if (countFound > 0 || showEmpty) {
var lingo = config.taggly.lingo;
config.taggly.createListControl(place,title,"hideState");
if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
createTiddlyElement(place,"span",null,"tagglyLabel",
isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
config.taggly.createListControl(place,title,"title");
config.taggly.createListControl(place,title,"modified");
config.taggly.createListControl(place,title,"created");
config.taggly.createListControl(place,title,"listMode");
config.taggly.createListControl(place,title,"excerpts");
config.taggly.createListControl(place,title,"numCols");
config.taggly.createTagglyList(place,title,isTagExpr);
if (countFound == 0 && showEmpty)
createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
}
}
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
" margin-bottom:0.5em; }",
".tagglyTagging .indent1 { margin-left:3em; }",
".tagglyTagging .indent2 { margin-left:4em; }",
".tagglyTagging .indent3 { margin-left:5em; }",
".tagglyTagging .indent4 { margin-left:6em; }",
".tagglyTagging .indent5 { margin-left:7em; }",
".tagglyTagging .indent6 { margin-left:8em; }",
".tagglyTagging .indent7 { margin-left:9em; }",
".tagglyTagging .indent8 { margin-left:10em; }",
".tagglyTagging .indent9 { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
""].join("\n"),
init: function() {
merge(config.macros,this.macros);
config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
store.addNotification("TagglyTaggingStyles",refreshStyles);
}
};
config.taggly.init();
//}}}
/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin
// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed
***/
//{{{
config.formatters.unshift( {
name: "inlinesliders",
// match: "\\+\\+\\+\\+|\\<slider",
match: "\\<slider",
// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
handler: function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
wikify(lookaheadMatch[3],panel);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
onClickSlider : function(e) {
if(!e) var e = window.event;
var n = this.nextSibling;
n.style.display = (n.style.display=="none") ? "block" : "none";
return false;
}
});
//}}}
Smith, S. (2001, July 1). Technology & psychology. Retrieved from http://www.psychologytoday.com/articles/200107/technology-psychology
''<<sbk "FULL TEXT" 20111105151057>>''
Technology convergence - the statistics. (2010, March 23). http://loveoftechnology.wordpress.com/2010/03/24/technology-convergence-the-statistics/
<<sbk "FULL TEXT" 20111104132259>>
<<sbk "Google" 20111104113836>>
Niles, N. (n.d.). Cloud computing: The sky was the limit. Retrieved from http://www.thetechlabs.com/tech-news/cloud-computing/
''<<sbk "FULL TEXT" 20111210151918>>''
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{
if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;
merge(config.macros,{
toggleTag: {
createIfRequired: true,
shortLabel: "[[%0]]",
longLabel: "[[%0]] [[%1]]",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tiddlerTitle = tiddler ? tiddler.title : '';
var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
label = (label == '-' ? '' : label); // dash means no label
var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
if (!store.tiddlerExists(title)) {
if (config.macros.toggleTag.createIfRequired) {
var content = store.getTiddlerText(title); // just in case it's a shadow
store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
}
else
return false;
}
if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
theTiddler.modified = new Date();
store.setTiddlerTag(title,this.checked,tag);
return true;
});
}
}
});
//}}}
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = '585kriesen';
// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too
// disable autosave in d3
if (window.location.protocol != "file:")
config.options.chkGTDLazyAutoSave = false;
// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}
// create some shadow tiddler content
merge(config.shadowTiddlers,{
'TspotOptions':[
"tiddlyspot password:",
"<<option pasUploadPassword>>",
""
].join("\n"),
'TspotControls':[
"| tiddlyspot password:|<<option pasUploadPassword>>|",
"| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
"| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),
'WelcomeToTiddlyspot':[
"This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
"<<tiddler TspotControls>>",
"See also GettingStarted.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),
'TspotSidebar':[
"<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n")
});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 13/12/2011 09:54:02 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 09:56:29 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 10:04:30 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 10:06:23 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . |
| 13/12/2011 10:06:29 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok | ok |
| 13/12/2011 10:09:16 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 13:38:31 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 13:39:48 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 16:05:42 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
| 13/12/2011 16:10:11 | YourName | [[585kriesen.html|file:///C:/Users/Gretchen/Documents/Current_Projects/SUNY_585_EmergingTech/Sync/TiddlyWiki/585kriesen.html]] | [[store.cgi|http://585kriesen.tiddlyspot.com/store.cgi]] | . | [[index.html | http://585kriesen.tiddlyspot.com/index.html]] | . | ok |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 3,
date: new Date("Feb 24, 2008"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
if (!params) params = {};
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
options: [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine"
],
refreshOptions: function(listWrapper) {
var opts = [];
for(i=0; i<this.options.length; i++) {
var opt = {};
opts.push();
opt.option = "";
n = this.options[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
};
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
var rssString = generateRss();
// no UnicodeToUTF8 conversion needed when location is "file" !!!
if (document.location.toString().substr(0,4) != "file")
rssString = convertUnicodeToUTF8(rssString);
bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == 404)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
if (responseText.charAt(0) != '0')
status = null;
callback(status,params,responseText,url,xhr);
};
// do httpUpload
var boundary = "---------------------------"+"AaB03x";
var uploadFormName = "UploadPlugin";
// compose headers data
var sheader = "";
sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
sheader += uploadFormName +"\"\r\n\r\n";
sheader += "backupDir="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
sheader += "Content-Length: " + data.length + "\r\n\r\n";
// compose trailer data
var strailer = new String();
strailer = "\r\n--" + boundary + "--\r\n";
data = sheader + data + strailer;
if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
Fan, H. & Poole, M.S. (2006). What is personalization? Perspectives on the design and implementation of personalization in information systems. //Journal of Organizational Computing & Electronic Commerce//, 179-202.
''<<sbk "FULL TEXT"20111105152908>>''
AUTHOR (n.d.) Ubiquitous computing. Retrieved from http://en.wikipedia.org/wiki/Ubiquitous_computing
''<<sbk "FULL TEXT" 20111105145440>>''